summaryrefslogtreecommitdiffstats
path: root/kcontrol
diff options
context:
space:
mode:
Diffstat (limited to 'kcontrol')
-rw-r--r--kcontrol/Makefile.am39
-rw-r--r--kcontrol/TODO168
-rw-r--r--kcontrol/access/Makefile.am30
-rw-r--r--kcontrol/access/configure.in.in7
-rw-r--r--kcontrol/access/eventsrc1072
-rw-r--r--kcontrol/access/kaccess.cpp896
-rw-r--r--kcontrol/access/kaccess.desktop78
-rw-r--r--kcontrol/access/kaccess.h114
-rw-r--r--kcontrol/access/kcmaccess.cpp805
-rw-r--r--kcontrol/access/kcmaccess.desktop240
-rw-r--r--kcontrol/access/kcmaccess.h111
-rw-r--r--kcontrol/access/main.cpp49
-rw-r--r--kcontrol/accessibility/Makefile.am15
-rw-r--r--kcontrol/accessibility/accessibility.cpp141
-rw-r--r--kcontrol/accessibility/accessibility.desktop239
-rw-r--r--kcontrol/accessibility/accessibility.h71
-rw-r--r--kcontrol/accessibility/accessibilityconfigwidget.ui1630
-rw-r--r--kcontrol/accessibility/accessibilityconfigwidget.ui.h22
-rw-r--r--kcontrol/accessibility/configure.in.in3
-rw-r--r--kcontrol/accessibility/kcm_accessibility.kcfg67
-rw-r--r--kcontrol/accessibility/settings.kcfgc5
-rw-r--r--kcontrol/arts/Makefile.am15
-rw-r--r--kcontrol/arts/arts.cpp730
-rw-r--r--kcontrol/arts/arts.desktop240
-rw-r--r--kcontrol/arts/arts.h135
-rw-r--r--kcontrol/arts/generaltab.ui330
-rw-r--r--kcontrol/arts/hardwaretab.ui358
-rw-r--r--kcontrol/arts/krichtextlabel.cpp115
-rw-r--r--kcontrol/arts/krichtextlabel.h65
-rw-r--r--kcontrol/background/Makefile.am27
-rw-r--r--kcontrol/background/background.desktop240
-rw-r--r--kcontrol/background/bgadvanced.cpp507
-rw-r--r--kcontrol/background/bgadvanced.h121
-rw-r--r--kcontrol/background/bgadvanced_ui.ui462
-rw-r--r--kcontrol/background/bgdefaults.h38
-rw-r--r--kcontrol/background/bgdialog.cpp1279
-rw-r--r--kcontrol/background/bgdialog.h109
-rw-r--r--kcontrol/background/bgdialog_ui.ui722
-rw-r--r--kcontrol/background/bghash.h22
-rw-r--r--kcontrol/background/bgmonitor.cpp220
-rw-r--r--kcontrol/background/bgmonitor.h111
-rw-r--r--kcontrol/background/bgrender.cpp1359
-rw-r--r--kcontrol/background/bgrender.h182
-rw-r--r--kcontrol/background/bgsettings.cpp1267
-rw-r--r--kcontrol/background/bgsettings.h372
-rw-r--r--kcontrol/background/bgwallpaper.cpp238
-rw-r--r--kcontrol/background/bgwallpaper.h66
-rw-r--r--kcontrol/background/bgwallpaper_ui.ui167
-rw-r--r--kcontrol/background/main.cpp123
-rw-r--r--kcontrol/background/main.h40
-rw-r--r--kcontrol/background/pics/Makefile.am5
-rw-r--r--kcontrol/background/pics/monitor.pngbin0 -> 7542 bytes
-rw-r--r--kcontrol/bell/Makefile.am15
-rw-r--r--kcontrol/bell/bell.cpp256
-rw-r--r--kcontrol/bell/bell.desktop251
-rw-r--r--kcontrol/bell/bell.h54
-rw-r--r--kcontrol/clock/Makefile.am15
-rw-r--r--kcontrol/clock/clock.desktop250
-rw-r--r--kcontrol/clock/dtime.cpp449
-rw-r--r--kcontrol/clock/dtime.h125
-rw-r--r--kcontrol/clock/main.cpp95
-rw-r--r--kcontrol/clock/main.h47
-rw-r--r--kcontrol/clock/tzone.cpp200
-rw-r--r--kcontrol/clock/tzone.h55
-rw-r--r--kcontrol/clock/xpm/kcmclock.xpm47
-rw-r--r--kcontrol/clock/xpm/world.xpm190
-rw-r--r--kcontrol/colors/Makefile.am15
-rw-r--r--kcontrol/colors/colors.desktop252
-rw-r--r--kcontrol/colors/colorscm.cpp980
-rw-r--r--kcontrol/colors/colorscm.h90
-rw-r--r--kcontrol/colors/stdclient_bitmaps.h128
-rw-r--r--kcontrol/colors/widgetcanvas.cpp596
-rw-r--r--kcontrol/colors/widgetcanvas.h121
-rw-r--r--kcontrol/componentchooser/EXAMPLE.desktop159
-rw-r--r--kcontrol/componentchooser/Makefile.am15
-rw-r--r--kcontrol/componentchooser/browserconfig_ui.ui174
-rw-r--r--kcontrol/componentchooser/componentchooser.cpp530
-rw-r--r--kcontrol/componentchooser/componentchooser.desktop237
-rw-r--r--kcontrol/componentchooser/componentchooser.h154
-rw-r--r--kcontrol/componentchooser/componentchooser_ui.ui133
-rw-r--r--kcontrol/componentchooser/componentconfig_ui.ui63
-rw-r--r--kcontrol/componentchooser/componentservices/Makefile.am3
-rw-r--r--kcontrol/componentchooser/componentservices/kcm_browser.desktop149
-rw-r--r--kcontrol/componentchooser/componentservices/kcm_kemail.desktop158
-rw-r--r--kcontrol/componentchooser/componentservices/kcm_terminal.desktop157
-rw-r--r--kcontrol/componentchooser/emailclientconfig_ui.ui236
-rw-r--r--kcontrol/componentchooser/kcm_componentchooser.cpp64
-rw-r--r--kcontrol/componentchooser/kcm_componentchooser.h39
-rw-r--r--kcontrol/componentchooser/terminalemulatorconfig_ui.ui194
-rw-r--r--kcontrol/crypto/Makefile.am19
-rw-r--r--kcontrol/crypto/README2
-rw-r--r--kcontrol/crypto/certexport.cpp148
-rw-r--r--kcontrol/crypto/certexport.h55
-rw-r--r--kcontrol/crypto/certgen.ui513
-rw-r--r--kcontrol/crypto/configure.in.in1
-rw-r--r--kcontrol/crypto/crypto.cpp2458
-rw-r--r--kcontrol/crypto/crypto.desktop229
-rw-r--r--kcontrol/crypto/crypto.h362
-rw-r--r--kcontrol/crypto/kdatetimedlg.cpp118
-rw-r--r--kcontrol/crypto/kdatetimedlg.h60
-rw-r--r--kcontrol/css/Makefile.am16
-rw-r--r--kcontrol/css/cssconfig.ui242
-rw-r--r--kcontrol/css/csscustom.ui554
-rw-r--r--kcontrol/css/kcmcss.cpp385
-rw-r--r--kcontrol/css/kcmcss.desktop233
-rw-r--r--kcontrol/css/kcmcss.h60
-rw-r--r--kcontrol/css/preview.ui95
-rw-r--r--kcontrol/css/template.cpp45
-rw-r--r--kcontrol/css/template.css77
-rw-r--r--kcontrol/css/template.h21
-rw-r--r--kcontrol/display/Makefile.am16
-rw-r--r--kcontrol/display/display.cpp110
-rw-r--r--kcontrol/display/display.desktop154
-rw-r--r--kcontrol/display/display.h48
-rw-r--r--kcontrol/dnssd/Makefile.am12
-rw-r--r--kcontrol/dnssd/configdialog.ui304
-rw-r--r--kcontrol/dnssd/kcm_kdnssd.desktop154
-rw-r--r--kcontrol/dnssd/kcmdnssd.cpp142
-rw-r--r--kcontrol/dnssd/kcmdnssd.h49
-rw-r--r--kcontrol/ebrowsing/Makefile.am21
-rw-r--r--kcontrol/ebrowsing/ebrowsing.desktop237
-rw-r--r--kcontrol/ebrowsing/filteropts.cpp62
-rw-r--r--kcontrol/ebrowsing/filteropts.h49
-rw-r--r--kcontrol/ebrowsing/main.cpp131
-rw-r--r--kcontrol/ebrowsing/main.h51
-rw-r--r--kcontrol/ebrowsing/plugins/Makefile.am3
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/Makefile.am31
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/ikwsopts.cpp492
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/ikwsopts.h73
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/ikwsopts_ui.ui258
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.cpp81
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.desktop70
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.h48
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.upd7
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/kuriikwsfiltereng.cpp540
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/kuriikwsfiltereng.h77
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/kurisearchfilter.cpp90
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/kurisearchfilter.desktop68
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/kurisearchfilter.h50
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchprovider.cpp78
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchprovider.desktop91
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchprovider.h55
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.cpp101
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.h46
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviderdlg_ui.ui137
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/Makefile.am91
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/acronym.desktop83
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/alexa.desktop14
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/alexa_url.desktop43
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/alltheweb.desktop45
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/altavista.desktop23
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/amg.desktop49
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/appsy.desktop84
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/austronaut.desktop18
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/backports.desktop66
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/bugft.desktop81
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/bugno.desktop82
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/call.desktop70
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/cia.desktop45
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/citeseer.desktop72
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/cpan.desktop53
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/ctan.desktop54
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/ctan_cat.desktop77
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/dbug.desktop67
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/de2en.desktop69
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/de2fr.desktop72
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/deb.desktop72
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/dmoz.desktop51
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/docbook.desktop72
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/doi.desktop63
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/en2de.desktop73
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/en2es.desktop76
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/en2fr.desktop76
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/en2it.desktop76
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/es2en.desktop76
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/excite.desktop22
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/feedster.desktop18
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/foldoc.desktop72
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/fr2de.desktop72
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/fr2en.desktop76
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/freedb.desktop15
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/freshmeat.desktop19
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/froogle.desktop17
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/fsd.desktop66
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/google.desktop31
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/google_advanced.desktop95
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/google_groups.desktop89
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/google_images.desktop94
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/google_lucky.desktop94
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/google_movie.desktop76
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/google_news.desktop85
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/gracenote.desktop17
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/grec.desktop65
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/hotbot.desktop18
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/hyperdictionary.desktop12
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/hyperdictionary_thesaurus.desktop65
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/imdb.desktop74
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/it2en.desktop75
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/jeeves.desktop30
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/katatudo.desktop15
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/kde.desktop80
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/kde_websvn.desktop32
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/leo.desktop49
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/lycos.desktop17
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/mamma.desktop76
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/metacrawler.desktop20
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/msdn.desktop74
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/netcraft.desktop17
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/nl-telephone.desktop71
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/nl-teletekst.desktop74
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/pgpkeys.desktop83
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/php.desktop81
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/python.desktop84
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/qt.desktop78
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/qt3.desktop71
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/rae.desktop77
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/rfc.desktop57
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/rpmfind.desktop44
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/ruby_application_archive.desktop76
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/seek.desktop11
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/sourceforge.desktop19
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/technorati.desktop14
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/technoratitags.desktop55
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/thesaurus.desktop63
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/tvtome.desktop24
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/uspto.desktop74
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/vivisimo.desktop14
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/voila.desktop17
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/webster.desktop73
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/whatis.desktop71
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/wikipedia.desktop94
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/wiktionary.desktop85
-rw-r--r--kcontrol/ebrowsing/plugins/ikws/searchproviders/wordref.desktop78
-rw-r--r--kcontrol/ebrowsing/plugins/localdomain/Makefile.am20
-rw-r--r--kcontrol/ebrowsing/plugins/localdomain/klocaldomainurifilterhelper.c60
-rw-r--r--kcontrol/ebrowsing/plugins/localdomain/localdomainurifilter.cpp117
-rw-r--r--kcontrol/ebrowsing/plugins/localdomain/localdomainurifilter.desktop48
-rw-r--r--kcontrol/ebrowsing/plugins/localdomain/localdomainurifilter.h65
-rw-r--r--kcontrol/ebrowsing/plugins/shorturi/Makefile.am18
-rw-r--r--kcontrol/ebrowsing/plugins/shorturi/kshorturifilter.cpp554
-rw-r--r--kcontrol/ebrowsing/plugins/shorturi/kshorturifilter.desktop54
-rw-r--r--kcontrol/ebrowsing/plugins/shorturi/kshorturifilter.h111
-rw-r--r--kcontrol/ebrowsing/plugins/shorturi/kshorturifilterrc7
-rw-r--r--kcontrol/energy/Makefile.am18
-rw-r--r--kcontrol/energy/configure.in.in1
-rw-r--r--kcontrol/energy/energy.cpp442
-rw-r--r--kcontrol/energy/energy.desktop242
-rw-r--r--kcontrol/energy/energy.h68
-rw-r--r--kcontrol/energy/pics/Makefile.am5
-rw-r--r--kcontrol/energy/pics/energybig.pngbin0 -> 24161 bytes
-rw-r--r--kcontrol/energy/pics/lo-energy.pngbin0 -> 1977 bytes
-rw-r--r--kcontrol/filetypes/Makefile.am29
-rw-r--r--kcontrol/filetypes/control.cpp11
-rw-r--r--kcontrol/filetypes/filegroupdetails.cpp65
-rw-r--r--kcontrol/filetypes/filegroupdetails.h50
-rw-r--r--kcontrol/filetypes/filetypedetails.cpp299
-rw-r--r--kcontrol/filetypes/filetypedetails.h64
-rw-r--r--kcontrol/filetypes/filetypes.desktop235
-rw-r--r--kcontrol/filetypes/filetypesview.cpp440
-rw-r--r--kcontrol/filetypes/filetypesview.h73
-rw-r--r--kcontrol/filetypes/keditfiletype.cpp182
-rw-r--r--kcontrol/filetypes/keditfiletype.h54
-rw-r--r--kcontrol/filetypes/kservicelistwidget.cpp444
-rw-r--r--kcontrol/filetypes/kservicelistwidget.h77
-rw-r--r--kcontrol/filetypes/kserviceselectdlg.cpp66
-rw-r--r--kcontrol/filetypes/kserviceselectdlg.h47
-rw-r--r--kcontrol/filetypes/newtypedlg.cpp57
-rw-r--r--kcontrol/filetypes/newtypedlg.h28
-rw-r--r--kcontrol/filetypes/typeslistitem.cpp579
-rw-r--r--kcontrol/filetypes/typeslistitem.h118
-rw-r--r--kcontrol/fonts/Makefile.am21
-rw-r--r--kcontrol/fonts/configure.in.in57
-rw-r--r--kcontrol/fonts/fonts.cpp802
-rw-r--r--kcontrol/fonts/fonts.desktop239
-rw-r--r--kcontrol/fonts/fonts.h124
-rw-r--r--kcontrol/fonts/kxftconfig.cpp1544
-rw-r--r--kcontrol/fonts/kxftconfig.h277
-rw-r--r--kcontrol/icons/Makefile.am25
-rw-r--r--kcontrol/icons/icons.cpp666
-rw-r--r--kcontrol/icons/icons.desktop249
-rw-r--r--kcontrol/icons/icons.h152
-rw-r--r--kcontrol/icons/iconthemes.cpp452
-rw-r--r--kcontrol/icons/iconthemes.h72
-rw-r--r--kcontrol/icons/main.cpp105
-rw-r--r--kcontrol/icons/main.h55
-rw-r--r--kcontrol/icons/testicons.cpp13
-rw-r--r--kcontrol/icons/uninstall.desktop2
-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
-rw-r--r--kcontrol/input/AUTHORS7
-rw-r--r--kcontrol/input/ChangeLog11
-rw-r--r--kcontrol/input/Makefile.am47
-rw-r--r--kcontrol/input/configure.in.bot5
-rw-r--r--kcontrol/input/configure.in.in26
-rwxr-xr-xkcontrol/input/consoleUserPerms42
-rw-r--r--kcontrol/input/core/Makefile.am7
-rw-r--r--kcontrol/input/core/bitmaps.h146
-rw-r--r--kcontrol/input/core/themepage.cpp212
-rw-r--r--kcontrol/input/core/themepage.h55
-rw-r--r--kcontrol/input/cursor_large.bdf4447
-rw-r--r--kcontrol/input/cursor_large_black.pcf.gzbin0 -> 3636 bytes
-rw-r--r--kcontrol/input/cursor_large_white.pcf.gzbin0 -> 3784 bytes
-rw-r--r--kcontrol/input/cursor_small_white.pcf.gzbin0 -> 3770 bytes
-rw-r--r--kcontrol/input/kapplymousetheme.cpp92
-rw-r--r--kcontrol/input/kmousedlg.ui378
-rw-r--r--kcontrol/input/logitechmouse.cpp417
-rw-r--r--kcontrol/input/logitechmouse.h102
-rw-r--r--kcontrol/input/logitechmouse.usermap35
-rw-r--r--kcontrol/input/logitechmouse_base.ui153
-rw-r--r--kcontrol/input/main.cpp96
-rw-r--r--kcontrol/input/mouse.cpp838
-rw-r--r--kcontrol/input/mouse.desktop242
-rw-r--r--kcontrol/input/mouse.h156
-rw-r--r--kcontrol/input/mouse_cursor_theme.upd5
-rw-r--r--kcontrol/input/pics/Makefile.am3
-rw-r--r--kcontrol/input/pics/mouse_lh.pngbin0 -> 12981 bytes
-rw-r--r--kcontrol/input/pics/mouse_lh.svgzbin0 -> 4814 bytes
-rw-r--r--kcontrol/input/pics/mouse_rh.pngbin0 -> 13053 bytes
-rw-r--r--kcontrol/input/pics/mouse_rh.svgzbin0 -> 4709 bytes
-rw-r--r--kcontrol/input/xcursor/Makefile.am7
-rw-r--r--kcontrol/input/xcursor/previewwidget.cpp353
-rw-r--r--kcontrol/input/xcursor/previewwidget.h47
-rw-r--r--kcontrol/input/xcursor/themepage.cpp637
-rw-r--r--kcontrol/input/xcursor/themepage.h76
-rw-r--r--kcontrol/ioslaveinfo/Makefile.am21
-rw-r--r--kcontrol/ioslaveinfo/ioslaveinfo.desktop237
-rw-r--r--kcontrol/ioslaveinfo/kcmioslaveinfo.cpp148
-rw-r--r--kcontrol/ioslaveinfo/kcmioslaveinfo.h61
-rw-r--r--kcontrol/ioslaveinfo/uninstall.desktop2
-rw-r--r--kcontrol/joystick/Makefile.am17
-rw-r--r--kcontrol/joystick/caldialog.cpp193
-rw-r--r--kcontrol/joystick/caldialog.h54
-rw-r--r--kcontrol/joystick/configure.in.in7
-rw-r--r--kcontrol/joystick/joydevice.cpp397
-rw-r--r--kcontrol/joystick/joydevice.h110
-rw-r--r--kcontrol/joystick/joystick.cpp123
-rw-r--r--kcontrol/joystick/joystick.desktop177
-rw-r--r--kcontrol/joystick/joystick.h42
-rw-r--r--kcontrol/joystick/joywidget.cpp379
-rw-r--r--kcontrol/joystick/joywidget.h79
-rw-r--r--kcontrol/joystick/poswidget.cpp138
-rw-r--r--kcontrol/joystick/poswidget.h55
-rw-r--r--kcontrol/kcontrol/KControl.desktop93
-rw-r--r--kcontrol/kcontrol/KControl_NoDisplay.desktop93
-rw-r--r--kcontrol/kcontrol/Makefile.am53
-rw-r--r--kcontrol/kcontrol/about/Makefile.am6
-rw-r--r--kcontrol/kcontrol/about/kcontrol.css54
-rw-r--r--kcontrol/kcontrol/about/main.html64
-rw-r--r--kcontrol/kcontrol/about/top-right-kcontrol.pngbin0 -> 13794 bytes
-rw-r--r--kcontrol/kcontrol/aboutwidget.cpp204
-rw-r--r--kcontrol/kcontrol/aboutwidget.h68
-rw-r--r--kcontrol/kcontrol/cr128-app-kcontrol.pngbin0 -> 12149 bytes
-rw-r--r--kcontrol/kcontrol/cr16-app-kcontrol.pngbin0 -> 887 bytes
-rw-r--r--kcontrol/kcontrol/cr32-app-kcontrol.pngbin0 -> 2375 bytes
-rw-r--r--kcontrol/kcontrol/cr48-app-kcontrol.pngbin0 -> 4134 bytes
-rw-r--r--kcontrol/kcontrol/cr64-app-kcontrol.pngbin0 -> 5941 bytes
-rw-r--r--kcontrol/kcontrol/dockcontainer.cpp257
-rw-r--r--kcontrol/kcontrol/dockcontainer.h86
-rw-r--r--kcontrol/kcontrol/global.cpp116
-rw-r--r--kcontrol/kcontrol/global.h76
-rw-r--r--kcontrol/kcontrol/helpwidget.cpp96
-rw-r--r--kcontrol/kcontrol/helpwidget.h43
-rw-r--r--kcontrol/kcontrol/indexwidget.cpp142
-rw-r--r--kcontrol/kcontrol/indexwidget.h64
-rw-r--r--kcontrol/kcontrol/kcontrolui.rc20
-rw-r--r--kcontrol/kcontrol/kcrootonly.cpp38
-rw-r--r--kcontrol/kcontrol/kcrootonly.h12
-rw-r--r--kcontrol/kcontrol/kinfocenter.desktop109
-rw-r--r--kcontrol/kcontrol/kinfocenterui.rc20
-rw-r--r--kcontrol/kcontrol/main.cpp153
-rw-r--r--kcontrol/kcontrol/main.h42
-rw-r--r--kcontrol/kcontrol/moduleIface.cpp58
-rw-r--r--kcontrol/kcontrol/moduleIface.h54
-rw-r--r--kcontrol/kcontrol/moduleiconview.cpp170
-rw-r--r--kcontrol/kcontrol/moduleiconview.h86
-rw-r--r--kcontrol/kcontrol/modulemenu.cpp105
-rw-r--r--kcontrol/kcontrol/modulemenu.h65
-rw-r--r--kcontrol/kcontrol/modules.cpp345
-rw-r--r--kcontrol/kcontrol/modules.h136
-rw-r--r--kcontrol/kcontrol/moduletreeview.cpp377
-rw-r--r--kcontrol/kcontrol/moduletreeview.h95
-rw-r--r--kcontrol/kcontrol/proxywidget.cpp323
-rw-r--r--kcontrol/kcontrol/proxywidget.h82
-rw-r--r--kcontrol/kcontrol/searchwidget.cpp205
-rw-r--r--kcontrol/kcontrol/searchwidget.h78
-rw-r--r--kcontrol/kcontrol/toplevel.cpp526
-rw-r--r--kcontrol/kcontrol/toplevel.h106
-rw-r--r--kcontrol/kcontrol/version.h2
-rw-r--r--kcontrol/kded/Makefile.am15
-rw-r--r--kcontrol/kded/kcmkded.cpp363
-rw-r--r--kcontrol/kded/kcmkded.desktop236
-rw-r--r--kcontrol/kded/kcmkded.h78
-rw-r--r--kcontrol/kdm/AUTHORS6
-rw-r--r--kcontrol/kdm/ChangeLog16
-rw-r--r--kcontrol/kdm/Makefile.am19
-rw-r--r--kcontrol/kdm/background.cpp111
-rw-r--r--kcontrol/kdm/background.h50
-rw-r--r--kcontrol/kdm/kbackedcombobox.cpp40
-rw-r--r--kcontrol/kdm/kbackedcombobox.h38
-rw-r--r--kcontrol/kdm/kdm-appear.cpp516
-rw-r--r--kcontrol/kdm/kdm-appear.h95
-rw-r--r--kcontrol/kdm/kdm-conv.cpp362
-rw-r--r--kcontrol/kdm/kdm-conv.h84
-rw-r--r--kcontrol/kdm/kdm-font.cpp134
-rw-r--r--kcontrol/kdm/kdm-font.h57
-rw-r--r--kcontrol/kdm/kdm-shut.cpp227
-rw-r--r--kcontrol/kdm/kdm-shut.h64
-rw-r--r--kcontrol/kdm/kdm-users.cpp500
-rw-r--r--kcontrol/kdm/kdm-users.h106
-rw-r--r--kcontrol/kdm/kdm.desktop243
-rw-r--r--kcontrol/kdm/main.cpp336
-rw-r--r--kcontrol/kdm/main.h83
-rw-r--r--kcontrol/keys/ChangeLog26
-rw-r--r--kcontrol/keys/Makefile.am22
-rw-r--r--kcontrol/keys/README7
-rw-r--r--kcontrol/keys/commandShortcuts.cpp243
-rw-r--r--kcontrol/keys/commandShortcuts.h75
-rwxr-xr-xkcontrol/keys/convertShortcuts.pl58
-rw-r--r--kcontrol/keys/kaccel.upd3
-rw-r--r--kcontrol/keys/kaccelaction.h205
-rw-r--r--kcontrol/keys/kde3.kksrc192
-rw-r--r--kcontrol/keys/kde4.kksrc192
-rw-r--r--kcontrol/keys/keyconfig.cpp545
-rw-r--r--kcontrol/keys/keyconfig.h90
-rw-r--r--kcontrol/keys/keys.desktop239
-rw-r--r--kcontrol/keys/khotkeys.cpp121
-rw-r--r--kcontrol/keys/khotkeys.h41
-rw-r--r--kcontrol/keys/mac4.kksrc197
-rw-r--r--kcontrol/keys/main.cpp203
-rw-r--r--kcontrol/keys/main.h57
-rw-r--r--kcontrol/keys/modifiers.cpp354
-rw-r--r--kcontrol/keys/modifiers.h49
-rw-r--r--kcontrol/keys/shortcuts.cpp435
-rw-r--r--kcontrol/keys/shortcuts.h77
-rw-r--r--kcontrol/keys/treeview.cpp282
-rw-r--r--kcontrol/keys/treeview.h84
-rw-r--r--kcontrol/keys/unix3.kksrc198
-rw-r--r--kcontrol/keys/win3.kksrc198
-rw-r--r--kcontrol/keys/win4.kksrc198
-rw-r--r--kcontrol/keys/wm3.kksrc188
-rw-r--r--kcontrol/kfontinst/AUTHORS1
-rw-r--r--kcontrol/kfontinst/ChangeLog490
-rw-r--r--kcontrol/kfontinst/Makefile.am14
-rw-r--r--kcontrol/kfontinst/TODO1
-rw-r--r--kcontrol/kfontinst/configure.in.bot12
-rw-r--r--kcontrol/kfontinst/configure.in.in155
-rw-r--r--kcontrol/kfontinst/installfont.desktop79
-rw-r--r--kcontrol/kfontinst/kcmfontinst/KCmFontInst.cpp647
-rw-r--r--kcontrol/kfontinst/kcmfontinst/KCmFontInst.h116
-rw-r--r--kcontrol/kfontinst/kcmfontinst/KFileFontIconView.cpp88
-rw-r--r--kcontrol/kfontinst/kcmfontinst/KFileFontIconView.h55
-rw-r--r--kcontrol/kfontinst/kcmfontinst/KFileFontView.cpp645
-rw-r--r--kcontrol/kfontinst/kcmfontinst/KFileFontView.h219
-rw-r--r--kcontrol/kfontinst/kcmfontinst/Makefile.am31
-rw-r--r--kcontrol/kfontinst/kcmfontinst/PrintDialog.cpp74
-rw-r--r--kcontrol/kfontinst/kcmfontinst/PrintDialog.h56
-rw-r--r--kcontrol/kfontinst/kcmfontinst/SettingsDialog.cpp99
-rw-r--r--kcontrol/kfontinst/kcmfontinst/SettingsDialog.h57
-rw-r--r--kcontrol/kfontinst/kcmfontinst/cr16-action-newfont.pngbin0 -> 613 bytes
-rw-r--r--kcontrol/kfontinst/kcmfontinst/cr22-action-newfont.pngbin0 -> 951 bytes
-rw-r--r--kcontrol/kfontinst/kcmfontinst/cr32-action-newfont.pngbin0 -> 1821 bytes
-rw-r--r--kcontrol/kfontinst/kcmfontinst/kcmfontinst.desktop235
-rw-r--r--kcontrol/kfontinst/kfile-plugin/KFileFont.cpp422
-rw-r--r--kcontrol/kfontinst/kfile-plugin/KFileFont.h58
-rw-r--r--kcontrol/kfontinst/kfile-plugin/Makefile.am13
-rw-r--r--kcontrol/kfontinst/kfile-plugin/kfile_font.desktop86
-rw-r--r--kcontrol/kfontinst/kfontinst/FontEngine.cpp376
-rw-r--r--kcontrol/kfontinst/kfontinst/FontEngine.h142
-rw-r--r--kcontrol/kfontinst/kfontinst/Fontmap.cpp596
-rw-r--r--kcontrol/kfontinst/kfontinst/Fontmap.h79
-rw-r--r--kcontrol/kfontinst/kfontinst/GetPid.c519
-rw-r--r--kcontrol/kfontinst/kfontinst/Main.cpp335
-rw-r--r--kcontrol/kfontinst/kfontinst/Makefile.am16
-rw-r--r--kcontrol/kfontinst/kfontinst/XConfig.cpp760
-rw-r--r--kcontrol/kfontinst/kfontinst/XConfig.h114
-rw-r--r--kcontrol/kfontinst/kio/KioFonts.cpp2534
-rw-r--r--kcontrol/kfontinst/kio/KioFonts.h161
-rw-r--r--kcontrol/kfontinst/kio/Makefile.am20
-rw-r--r--kcontrol/kfontinst/kio/folder.desktop80
-rw-r--r--kcontrol/kfontinst/kio/fonts.desktop85
-rw-r--r--kcontrol/kfontinst/kio/fonts.protocol18
-rw-r--r--kcontrol/kfontinst/kio/package.desktop74
-rw-r--r--kcontrol/kfontinst/kio/system-folder.desktop79
-rw-r--r--kcontrol/kfontinst/lib/FcEngine.cpp1179
-rw-r--r--kcontrol/kfontinst/lib/FcEngine.h118
-rw-r--r--kcontrol/kfontinst/lib/KfiConstants.h73
-rw-r--r--kcontrol/kfontinst/lib/Makefile.am14
-rw-r--r--kcontrol/kfontinst/lib/Misc.cpp238
-rw-r--r--kcontrol/kfontinst/lib/Misc.h76
-rw-r--r--kcontrol/kfontinst/thumbnail/FontThumbnail.cpp73
-rw-r--r--kcontrol/kfontinst/thumbnail/FontThumbnail.h55
-rw-r--r--kcontrol/kfontinst/thumbnail/Makefile.am14
-rw-r--r--kcontrol/kfontinst/thumbnail/fontthumbnail.desktop85
-rw-r--r--kcontrol/kfontinst/viewpart/FontPreview.cpp118
-rw-r--r--kcontrol/kfontinst/viewpart/FontPreview.h83
-rw-r--r--kcontrol/kfontinst/viewpart/FontViewPart.cpp282
-rw-r--r--kcontrol/kfontinst/viewpart/FontViewPart.h85
-rw-r--r--kcontrol/kfontinst/viewpart/FontViewPartFactory.cpp86
-rw-r--r--kcontrol/kfontinst/viewpart/FontViewPartFactory.h60
-rw-r--r--kcontrol/kfontinst/viewpart/FontViewerApp.cpp130
-rw-r--r--kcontrol/kfontinst/viewpart/FontViewerApp.h68
-rw-r--r--kcontrol/kfontinst/viewpart/KfiPrint.cpp193
-rw-r--r--kcontrol/kfontinst/viewpart/KfiPrint.h49
-rw-r--r--kcontrol/kfontinst/viewpart/Makefile.am30
-rw-r--r--kcontrol/kfontinst/viewpart/kfontview.desktop100
-rw-r--r--kcontrol/kfontinst/viewpart/kfontviewpart.desktop86
-rw-r--r--kcontrol/kfontinst/viewpart/kfontviewpart.rc9
-rw-r--r--kcontrol/kfontinst/viewpart/kfontviewui.rc4
-rw-r--r--kcontrol/kicker/Makefile.am40
-rw-r--r--kcontrol/kicker/advancedDialog.cpp163
-rw-r--r--kcontrol/kicker/advancedDialog.h44
-rw-r--r--kcontrol/kicker/advancedOptions.ui321
-rw-r--r--kcontrol/kicker/applettab.ui227
-rw-r--r--kcontrol/kicker/applettab_impl.cpp239
-rw-r--r--kcontrol/kicker/applettab_impl.h68
-rw-r--r--kcontrol/kicker/extensionInfo.cpp259
-rw-r--r--kcontrol/kicker/extensionInfo.h85
-rw-r--r--kcontrol/kicker/hidingconfig.cpp94
-rw-r--r--kcontrol/kicker/hidingconfig.h44
-rw-r--r--kcontrol/kicker/hidingtab.ui761
-rw-r--r--kcontrol/kicker/hidingtab_impl.cpp280
-rw-r--r--kcontrol/kicker/hidingtab_impl.h64
-rw-r--r--kcontrol/kicker/kicker_config.desktop223
-rw-r--r--kcontrol/kicker/kicker_config_appearance.desktop229
-rw-r--r--kcontrol/kicker/kicker_config_arrangement.desktop212
-rw-r--r--kcontrol/kicker/kicker_config_hiding.desktop202
-rw-r--r--kcontrol/kicker/kicker_config_menus.desktop199
-rw-r--r--kcontrol/kicker/lookandfeelconfig.cpp94
-rw-r--r--kcontrol/kicker/lookandfeelconfig.h44
-rw-r--r--kcontrol/kicker/lookandfeeltab.ui635
-rw-r--r--kcontrol/kicker/lookandfeeltab_impl.cpp384
-rw-r--r--kcontrol/kicker/lookandfeeltab_impl.h70
-rw-r--r--kcontrol/kicker/lookandfeeltab_kcm.cpp94
-rw-r--r--kcontrol/kicker/lookandfeeltab_kcm.h44
-rw-r--r--kcontrol/kicker/main.cpp398
-rw-r--r--kcontrol/kicker/main.h84
-rw-r--r--kcontrol/kicker/menuconfig.cpp94
-rw-r--r--kcontrol/kicker/menuconfig.h44
-rw-r--r--kcontrol/kicker/menutab.ui407
-rw-r--r--kcontrol/kicker/menutab_impl.cpp181
-rw-r--r--kcontrol/kicker/menutab_impl.h72
-rw-r--r--kcontrol/kicker/panel.desktop224
-rw-r--r--kcontrol/kicker/positionconfig.cpp94
-rw-r--r--kcontrol/kicker/positionconfig.h44
-rw-r--r--kcontrol/kicker/positiontab.ui1129
-rw-r--r--kcontrol/kicker/positiontab_impl.cpp742
-rw-r--r--kcontrol/kicker/positiontab_impl.h77
-rw-r--r--kcontrol/kicker/uninstall.desktop11
-rw-r--r--kcontrol/kio/Makefile.am39
-rw-r--r--kcontrol/kio/UA-DESKTOP-FILE-HOWTO135
-rw-r--r--kcontrol/kio/cache.cpp127
-rw-r--r--kcontrol/kio/cache.desktop220
-rw-r--r--kcontrol/kio/cache.h50
-rw-r--r--kcontrol/kio/cache_ui.ui187
-rw-r--r--kcontrol/kio/cookies.desktop215
-rw-r--r--kcontrol/kio/envvarproxy_ui.ui175
-rw-r--r--kcontrol/kio/fakeuaprovider.cpp176
-rw-r--r--kcontrol/kio/fakeuaprovider.h57
-rw-r--r--kcontrol/kio/kcookiesmain.cpp99
-rw-r--r--kcontrol/kio/kcookiesmain.h37
-rw-r--r--kcontrol/kio/kcookiesmanagement.cpp489
-rw-r--r--kcontrol/kio/kcookiesmanagement.h101
-rw-r--r--kcontrol/kio/kcookiesmanagementdlg_ui.ui323
-rw-r--r--kcontrol/kio/kcookiespolicies.cpp474
-rw-r--r--kcontrol/kio/kcookiespolicies.h81
-rw-r--r--kcontrol/kio/kcookiespoliciesdlg_ui.ui323
-rw-r--r--kcontrol/kio/kenvvarproxydlg.cpp303
-rw-r--r--kcontrol/kio/kenvvarproxydlg.h57
-rw-r--r--kcontrol/kio/kio_ftprc.kcfg22
-rw-r--r--kcontrol/kio/kio_ftprc.kcfgc5
-rw-r--r--kcontrol/kio/kioslave.kcfg44
-rw-r--r--kcontrol/kio/kioslave.kcfgc5
-rw-r--r--kcontrol/kio/kmanualproxydlg.cpp498
-rw-r--r--kcontrol/kio/kmanualproxydlg.h77
-rw-r--r--kcontrol/kio/kproxydlg.cpp375
-rw-r--r--kcontrol/kio/kproxydlg.h82
-rw-r--r--kcontrol/kio/kproxydlg_ui.ui441
-rw-r--r--kcontrol/kio/kproxydlgbase.cpp74
-rw-r--r--kcontrol/kio/kproxydlgbase.h68
-rw-r--r--kcontrol/kio/ksaveioconfig.cpp260
-rw-r--r--kcontrol/kio/ksaveioconfig.h96
-rw-r--r--kcontrol/kio/lanbrowser.desktop226
-rw-r--r--kcontrol/kio/main.cpp158
-rw-r--r--kcontrol/kio/main.h46
-rw-r--r--kcontrol/kio/manualproxy_ui.ui317
-rw-r--r--kcontrol/kio/netpref.cpp138
-rw-r--r--kcontrol/kio/netpref.desktop205
-rw-r--r--kcontrol/kio/netpref.h44
-rw-r--r--kcontrol/kio/policydlg.cpp107
-rw-r--r--kcontrol/kio/policydlg.h87
-rw-r--r--kcontrol/kio/policydlg_ui.ui106
-rw-r--r--kcontrol/kio/proxy.desktop209
-rw-r--r--kcontrol/kio/smb.desktop233
-rw-r--r--kcontrol/kio/smbrodlg.cpp191
-rw-r--r--kcontrol/kio/smbrodlg.h55
-rw-r--r--kcontrol/kio/socks.cpp279
-rw-r--r--kcontrol/kio/socks.h73
-rw-r--r--kcontrol/kio/socks.upd8
-rw-r--r--kcontrol/kio/socksbase.ui335
-rw-r--r--kcontrol/kio/uagentproviderdlg.cpp149
-rw-r--r--kcontrol/kio/uagentproviderdlg.h68
-rw-r--r--kcontrol/kio/uagentproviderdlg_ui.ui207
-rw-r--r--kcontrol/kio/uasprovider.desktop98
-rw-r--r--kcontrol/kio/uasproviders/Makefile.am14
-rw-r--r--kcontrol/kio/uasproviders/firefox10oncurrent.desktop70
-rw-r--r--kcontrol/kio/uasproviders/firefox15oncurrent.desktop58
-rw-r--r--kcontrol/kio/uasproviders/googlebot.desktop44
-rw-r--r--kcontrol/kio/uasproviders/ie401onwinnt4.desktop80
-rw-r--r--kcontrol/kio/uasproviders/ie45onwinnt5.desktop80
-rw-r--r--kcontrol/kio/uasproviders/ie501onwinnt5.desktop79
-rw-r--r--kcontrol/kio/uasproviders/ie50onppc.desktop79
-rw-r--r--kcontrol/kio/uasproviders/ie55onwin98.desktop79
-rw-r--r--kcontrol/kio/uasproviders/ie55onwinnt5.desktop79
-rw-r--r--kcontrol/kio/uasproviders/ie60oncurrent.desktop69
-rw-r--r--kcontrol/kio/uasproviders/ie60onwinnt51.desktop81
-rw-r--r--kcontrol/kio/uasproviders/lynxoncurrent.desktop51
-rw-r--r--kcontrol/kio/uasproviders/mozoncurrent.desktop70
-rw-r--r--kcontrol/kio/uasproviders/mozoncurrent12.desktop76
-rw-r--r--kcontrol/kio/uasproviders/mozoncurrent16.desktop75
-rw-r--r--kcontrol/kio/uasproviders/mozonwin2000.desktop73
-rw-r--r--kcontrol/kio/uasproviders/mozonwinxp.desktop74
-rw-r--r--kcontrol/kio/uasproviders/nn301oncurrent.desktop78
-rw-r--r--kcontrol/kio/uasproviders/nn475oncurrent.desktop78
-rw-r--r--kcontrol/kio/uasproviders/nn475onwin95.desktop81
-rw-r--r--kcontrol/kio/uasproviders/nn476onppc.desktop82
-rw-r--r--kcontrol/kio/uasproviders/ns71oncurrent.desktop72
-rw-r--r--kcontrol/kio/uasproviders/ns71onwinnt51.desktop74
-rw-r--r--kcontrol/kio/uasproviders/op403onwinnt4.desktop80
-rw-r--r--kcontrol/kio/uasproviders/op75oncurrent.desktop69
-rw-r--r--kcontrol/kio/uasproviders/safari12.desktop73
-rw-r--r--kcontrol/kio/uasproviders/safari20.desktop59
-rw-r--r--kcontrol/kio/uasproviders/w3moncurrent.desktop50
-rw-r--r--kcontrol/kio/uasproviders/wgetoncurrent.desktop50
-rw-r--r--kcontrol/kio/uninstall.desktop2
-rw-r--r--kcontrol/kio/useragent.desktop232
-rw-r--r--kcontrol/kio/useragentdlg.cpp403
-rw-r--r--kcontrol/kio/useragentdlg.h83
-rw-r--r--kcontrol/kio/useragentdlg_ui.ui355
-rw-r--r--kcontrol/knotify/CHANGES0
-rw-r--r--kcontrol/knotify/Makefile.am27
-rw-r--r--kcontrol/knotify/README2
-rw-r--r--kcontrol/knotify/kcmnotify.desktop243
-rw-r--r--kcontrol/knotify/knotify.cpp328
-rw-r--r--kcontrol/knotify/knotify.h96
-rw-r--r--kcontrol/knotify/play.pngbin0 -> 277 bytes
-rw-r--r--kcontrol/knotify/playersettings.ui330
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep.oggbin0 -> 4146 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Ahem.wavbin0 -> 11180 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Beep.wavbin0 -> 1078 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Bottles.wavbin0 -> 4972 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Car.oggbin0 -> 5829 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Classic.oggbin0 -> 5433 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_ClassicBeep.wavbin0 -> 2480 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_ClockChime.wavbin0 -> 4022 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Connect.oggbin0 -> 14392 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Connect.wavbin0 -> 12384 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Digital_1.oggbin0 -> 4569 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Digital_2.oggbin0 -> 5316 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Door.wavbin0 -> 7470 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Double.oggbin0 -> 4613 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Harsh.oggbin0 -> 4747 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Honk.wavbin0 -> 2802 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Lightning.wavbin0 -> 10220 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Phone_1.oggbin0 -> 5517 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Phone_2.oggbin0 -> 7067 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Pop.wavbin0 -> 414 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_RimShot.wavbin0 -> 13996 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_RingRing.wavbin0 -> 5932 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_ShortBeep.wavbin0 -> 2270 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Beep_Yo.wavbin0 -> 4538 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Bottles.oggbin0 -> 13853 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Chimes_1.oggbin0 -> 29944 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Chimes_2.oggbin0 -> 23635 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Chimes_3.oggbin0 -> 31716 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Click.wavbin0 -> 1824 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Click_1.oggbin0 -> 4715 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Click_2.oggbin0 -> 5316 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Click_3.oggbin0 -> 4032 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Close_Window.wavbin0 -> 26270 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Critical_Error.wavbin0 -> 183496 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop1.wavbin0 -> 4794 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop2.wavbin0 -> 5178 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop3.wavbin0 -> 5106 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop4.wavbin0 -> 4962 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop5.wavbin0 -> 5026 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop6.wavbin0 -> 5122 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop7.wavbin0 -> 5250 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop8.wavbin0 -> 5218 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop_1.oggbin0 -> 32355 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop_2.oggbin0 -> 37561 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop_3.oggbin0 -> 36602 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop_4.oggbin0 -> 37532 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop_5.oggbin0 -> 36807 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop_6.oggbin0 -> 36079 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop_7.oggbin0 -> 38732 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Desktop_8.oggbin0 -> 37169 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Dialog_Appear.oggbin0 -> 25042 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Dialog_Appear.wavbin0 -> 61084 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Dialog_Disappear.oggbin0 -> 26129 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Dialog_Disappear.wavbin0 -> 81506 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Door.oggbin0 -> 9694 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Drum_Break.oggbin0 -> 21007 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Error.wavbin0 -> 24970 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Error_1.oggbin0 -> 28249 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Error_2.oggbin0 -> 4933 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Error_3.oggbin0 -> 7124 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Event_1.oggbin0 -> 25813 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Event_2.oggbin0 -> 27085 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Event_3.oggbin0 -> 15743 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Event_4.oggbin0 -> 14400 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Event_5.oggbin0 -> 19325 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Glass_Break.oggbin0 -> 11005 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Keyboard_Key_1.oggbin0 -> 4672 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Logout.wavbin0 -> 132744 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Logout_1.oggbin0 -> 77261 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Logout_2.oggbin0 -> 43763 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Logout_3.oggbin0 -> 36215 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Notify.wavbin0 -> 90464 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Pop.oggbin0 -> 4305 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Star_Ship_1.oggbin0 -> 44075 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Startup.wavbin0 -> 365228 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Startup_1.oggbin0 -> 124445 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Startup_2.oggbin0 -> 141189 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Startup_3.oggbin0 -> 109393 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_TypeWriter_Bell.oggbin0 -> 9660 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_TypeWriter_End_Of_Line.oggbin0 -> 11187 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_TypeWriter_Key_1.oggbin0 -> 5701 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_TypeWriter_Key_2.oggbin0 -> 5428 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_TypeWriter_Reload.oggbin0 -> 11372 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_TypeWriter_Scroll.oggbin0 -> 6772 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Vox_Ahem.oggbin0 -> 13701 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Vox_Yo.oggbin0 -> 14071 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Warp.oggbin0 -> 3894 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Water_Drop.oggbin0 -> 8139 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Close.oggbin0 -> 9230 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Close.wavbin0 -> 202848 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_DeIconify.oggbin0 -> 13322 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_DeIconify.wavbin0 -> 26698 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Hide.oggbin0 -> 22658 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Iconify.oggbin0 -> 14211 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Iconify.wavbin0 -> 26134 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Maximize.wavbin0 -> 26402 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Open.oggbin0 -> 9481 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Open.wavbin0 -> 305432 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Shade_Down.oggbin0 -> 26114 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Shade_Down.wavbin0 -> 20522 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Shade_Up.oggbin0 -> 27328 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Shade_Up.wavbin0 -> 20578 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Sticky.oggbin0 -> 7594 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_Sticky.wavbin0 -> 17706 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_UnHide.oggbin0 -> 23615 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_UnMaximize.wavbin0 -> 42092 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_UnSticky.oggbin0 -> 12300 bytes
-rw-r--r--kcontrol/knotify/sounds/KDE_Window_UnSticky.wavbin0 -> 20522 bytes
-rw-r--r--kcontrol/knotify/sounds/Makefile.am113
-rw-r--r--kcontrol/konq/Makefile.am30
-rw-r--r--kcontrol/konq/README19
-rw-r--r--kcontrol/konq/behaviour.cpp285
-rw-r--r--kcontrol/konq/behaviour.h75
-rw-r--r--kcontrol/konq/browser.cpp109
-rw-r--r--kcontrol/konq/browser.h50
-rw-r--r--kcontrol/konq/desktop.cpp246
-rw-r--r--kcontrol/konq/desktop.desktop236
-rw-r--r--kcontrol/konq/desktop.h57
-rw-r--r--kcontrol/konq/desktopbehavior.desktop236
-rw-r--r--kcontrol/konq/desktopbehavior.ui426
-rw-r--r--kcontrol/konq/desktopbehavior_impl.cpp466
-rw-r--r--kcontrol/konq/desktopbehavior_impl.h79
-rw-r--r--kcontrol/konq/desktoppath.desktop226
-rw-r--r--kcontrol/konq/fileappearance.desktop234
-rw-r--r--kcontrol/konq/filebehavior.desktop225
-rw-r--r--kcontrol/konq/filebrowser.desktop239
-rw-r--r--kcontrol/konq/filepreviews.desktop220
-rw-r--r--kcontrol/konq/fontopts.cpp387
-rw-r--r--kcontrol/konq/fontopts.h112
-rw-r--r--kcontrol/konq/main.cpp98
-rw-r--r--kcontrol/konq/onlyone.pngbin0 -> 7540 bytes
-rw-r--r--kcontrol/konq/overlapping.pngbin0 -> 10965 bytes
-rw-r--r--kcontrol/konq/previews.cpp219
-rw-r--r--kcontrol/konq/previews.h65
-rw-r--r--kcontrol/konq/rootopts.cpp345
-rw-r--r--kcontrol/konq/rootopts.h64
-rw-r--r--kcontrol/konq/webappearance.desktop234
-rw-r--r--kcontrol/konq/webbehavior.desktop234
-rw-r--r--kcontrol/konqhtml/Makefile.am26
-rw-r--r--kcontrol/konqhtml/advancedTabDialog.cpp121
-rw-r--r--kcontrol/konqhtml/advancedTabDialog.h45
-rw-r--r--kcontrol/konqhtml/advancedTabOptions.ui155
-rw-r--r--kcontrol/konqhtml/appearance.cpp417
-rw-r--r--kcontrol/konqhtml/appearance.h70
-rw-r--r--kcontrol/konqhtml/domainlistview.cpp230
-rw-r--r--kcontrol/konqhtml/domainlistview.h209
-rw-r--r--kcontrol/konqhtml/filteropts.cpp327
-rw-r--r--kcontrol/konqhtml/filteropts.h74
-rw-r--r--kcontrol/konqhtml/htmlopts.cpp365
-rw-r--r--kcontrol/konqhtml/htmlopts.h68
-rw-r--r--kcontrol/konqhtml/javaopts.cpp337
-rw-r--r--kcontrol/konqhtml/javaopts.h126
-rw-r--r--kcontrol/konqhtml/jsopts.cpp231
-rw-r--r--kcontrol/konqhtml/jsopts.h90
-rw-r--r--kcontrol/konqhtml/jspolicies.cpp407
-rw-r--r--kcontrol/konqhtml/jspolicies.h270
-rw-r--r--kcontrol/konqhtml/khtml_behavior.desktop231
-rw-r--r--kcontrol/konqhtml/khtml_filter.desktop145
-rw-r--r--kcontrol/konqhtml/khtml_fonts.desktop230
-rw-r--r--kcontrol/konqhtml/khtml_java_js.desktop211
-rw-r--r--kcontrol/konqhtml/khttpoptdlg.cpp81
-rw-r--r--kcontrol/konqhtml/khttpoptdlg.h49
-rw-r--r--kcontrol/konqhtml/main.cpp171
-rw-r--r--kcontrol/konqhtml/main.h60
-rw-r--r--kcontrol/konqhtml/nsconfigwidget.ui273
-rw-r--r--kcontrol/konqhtml/pluginopts.cpp659
-rw-r--r--kcontrol/konqhtml/pluginopts.h163
-rw-r--r--kcontrol/konqhtml/policies.cpp74
-rw-r--r--kcontrol/konqhtml/policies.h134
-rw-r--r--kcontrol/konqhtml/policydlg.cpp128
-rw-r--r--kcontrol/konqhtml/policydlg.h130
-rw-r--r--kcontrol/konqhtml/uninstall.desktop2
-rw-r--r--kcontrol/konsole/AUTHORS2
-rw-r--r--kcontrol/konsole/Makefile.am18
-rw-r--r--kcontrol/konsole/kcmkonsole.cpp191
-rw-r--r--kcontrol/konsole/kcmkonsole.desktop185
-rw-r--r--kcontrol/konsole/kcmkonsole.h46
-rw-r--r--kcontrol/konsole/kcmkonsoledialog.ui390
-rw-r--r--kcontrol/konsole/schemadialog.ui631
-rw-r--r--kcontrol/konsole/schemaeditor.cpp708
-rw-r--r--kcontrol/konsole/schemaeditor.h84
-rw-r--r--kcontrol/konsole/sessiondialog.ui446
-rw-r--r--kcontrol/konsole/sessioneditor.cpp383
-rw-r--r--kcontrol/konsole/sessioneditor.h68
-rw-r--r--kcontrol/krdb/AUTHORS9
-rw-r--r--kcontrol/krdb/Makefile.am15
-rw-r--r--kcontrol/krdb/ad/AAAAAAGeneral.ad2
-rw-r--r--kcontrol/krdb/ad/AAAMotif.ad74
-rw-r--r--kcontrol/krdb/ad/AAATk.ad107
-rw-r--r--kcontrol/krdb/ad/AAAXaw.ad36
-rw-r--r--kcontrol/krdb/ad/AcroRead.ad8
-rw-r--r--kcontrol/krdb/ad/Editres.ad5
-rw-r--r--kcontrol/krdb/ad/Emacs.ad17
-rw-r--r--kcontrol/krdb/ad/GV.ad1
-rw-r--r--kcontrol/krdb/ad/ML.ad36
-rw-r--r--kcontrol/krdb/ad/Makefile.am13
-rw-r--r--kcontrol/krdb/ad/Nedit.ad2
-rw-r--r--kcontrol/krdb/ad/Netscape.ad25
-rw-r--r--kcontrol/krdb/ad/README63
-rw-r--r--kcontrol/krdb/ad/RVPlayer.ad40
-rw-r--r--kcontrol/krdb/ad/WPerfect.ad69
-rw-r--r--kcontrol/krdb/ad/XCalc.ad7
-rw-r--r--kcontrol/krdb/ad/XOsview.ad5
-rw-r--r--kcontrol/krdb/ad/XTerm.ad4
-rw-r--r--kcontrol/krdb/ad/XV.ad2
-rw-r--r--kcontrol/krdb/ad/Xawtv.ad10
-rw-r--r--kcontrol/krdb/ad/Xdvi.ad1
-rw-r--r--kcontrol/krdb/ad/Xpdf.ad3
-rwxr-xr-xkcontrol/krdb/ad/krdb4
-rw-r--r--kcontrol/krdb/kcmdisplayrc.upd7
-rw-r--r--kcontrol/krdb/kcs/AtlasGreen.kcsrc83
-rw-r--r--kcontrol/krdb/kcs/BeOS.kcsrc26
-rw-r--r--kcontrol/krdb/kcs/BlackOnWhite.kcsrc89
-rw-r--r--kcontrol/krdb/kcs/BlueSlate.kcsrc87
-rw-r--r--kcontrol/krdb/kcs/CDE.kcsrc26
-rw-r--r--kcontrol/krdb/kcs/DarkBlue.kcsrc98
-rw-r--r--kcontrol/krdb/kcs/DesertRed.kcsrc89
-rw-r--r--kcontrol/krdb/kcs/DigitalCDE.kcsrc69
-rw-r--r--kcontrol/krdb/kcs/EveX.kcsrc27
-rw-r--r--kcontrol/krdb/kcs/KDEOne.kcsrc30
-rw-r--r--kcontrol/krdb/kcs/KDETwo.kcsrc28
-rw-r--r--kcontrol/krdb/kcs/Keramik.kcsrc49
-rw-r--r--kcontrol/krdb/kcs/KeramikEmerald.kcsrc73
-rw-r--r--kcontrol/krdb/kcs/KeramikWhite.kcsrc91
-rw-r--r--kcontrol/krdb/kcs/Makefile.am12
-rw-r--r--kcontrol/krdb/kcs/MediaPeach.kcsrc60
-rw-r--r--kcontrol/krdb/kcs/Next.kcsrc53
-rw-r--r--kcontrol/krdb/kcs/PaleGray.kcsrc90
-rw-r--r--kcontrol/krdb/kcs/Plastik.kcsrc55
-rw-r--r--kcontrol/krdb/kcs/PointReyesGreen.kcsrc75
-rw-r--r--kcontrol/krdb/kcs/Pumpkin.kcsrc87
-rw-r--r--kcontrol/krdb/kcs/SolarisCDE.kcsrc38
-rw-r--r--kcontrol/krdb/kcs/Storm.kcsrc84
-rw-r--r--kcontrol/krdb/kcs/System.kcsrc99
-rw-r--r--kcontrol/krdb/kcs/WhiteOnBlack.kcsrc88
-rw-r--r--kcontrol/krdb/kcs/Windows2000.kcsrc36
-rw-r--r--kcontrol/krdb/kcs/Windows95.kcsrc33
-rw-r--r--kcontrol/krdb/kcs/WindowsXP.kcsrc36
-rw-r--r--kcontrol/krdb/kcs/YellowOnBlue.kcsrc89
-rw-r--r--kcontrol/krdb/krdb.cpp612
-rw-r--r--kcontrol/krdb/krdb.h33
-rw-r--r--kcontrol/krdb/pics/Makefile.am6
-rw-r--r--kcontrol/krdb/pics/lo-energy.pngbin0 -> 2253 bytes
-rw-r--r--kcontrol/krdb/pics/logo.pngbin0 -> 950 bytes
-rw-r--r--kcontrol/krdb/pics/mini-world.pngbin0 -> 1036 bytes
-rw-r--r--kcontrol/krdb/themes/HighContrastDark-big/HighContrastDark-big.preview.pngbin0 -> 8114 bytes
-rw-r--r--kcontrol/krdb/themes/HighContrastDark-big/HighContrastDark-big.xml158
-rw-r--r--kcontrol/krdb/themes/HighContrastDark-big/Makefile.am6
-rw-r--r--kcontrol/krdb/themes/HighContrastDark/HighContrastDark.preview.pngbin0 -> 6458 bytes
-rw-r--r--kcontrol/krdb/themes/HighContrastDark/HighContrastDark.xml158
-rw-r--r--kcontrol/krdb/themes/HighContrastDark/Makefile.am6
-rw-r--r--kcontrol/krdb/themes/HighContrastLight-big/HighContrastLight-big.preview.pngbin0 -> 50340 bytes
-rw-r--r--kcontrol/krdb/themes/HighContrastLight-big/HighContrastLight-big.xml158
-rw-r--r--kcontrol/krdb/themes/HighContrastLight-big/Makefile.am6
-rw-r--r--kcontrol/krdb/themes/HighContrastLight/HighContrastLight.preview.pngbin0 -> 48622 bytes
-rw-r--r--kcontrol/krdb/themes/HighContrastLight/HighContrastLight.xml158
-rw-r--r--kcontrol/krdb/themes/HighContrastLight/Makefile.am6
-rw-r--r--kcontrol/krdb/themes/KDE_Classic/KDE_Classic.preview.pngbin0 -> 41158 bytes
-rw-r--r--kcontrol/krdb/themes/KDE_Classic/KDE_Classic.xml124
-rw-r--r--kcontrol/krdb/themes/KDE_Classic/Makefile.am6
-rw-r--r--kcontrol/krdb/themes/Keramik/Keramik.preview.pngbin0 -> 44723 bytes
-rw-r--r--kcontrol/krdb/themes/Keramik/Keramik.xml124
-rw-r--r--kcontrol/krdb/themes/Keramik/Makefile.am6
-rw-r--r--kcontrol/krdb/themes/Makefile.am4
-rw-r--r--kcontrol/krdb/themes/Plastik/Makefile.am6
-rw-r--r--kcontrol/krdb/themes/Plastik/Plastik.preview.pngbin0 -> 40876 bytes
-rw-r--r--kcontrol/krdb/themes/Plastik/Plastik.xml124
-rw-r--r--kcontrol/krdb/themes/Platinum/Makefile.am6
-rw-r--r--kcontrol/krdb/themes/Platinum/Platinum.preview.pngbin0 -> 35500 bytes
-rw-r--r--kcontrol/krdb/themes/Platinum/Platinum.xml124
-rw-r--r--kcontrol/krdb/themes/Redmond/Makefile.am6
-rw-r--r--kcontrol/krdb/themes/Redmond/Redmond.preview.pngbin0 -> 34212 bytes
-rw-r--r--kcontrol/krdb/themes/Redmond/Redmond.xml124
-rw-r--r--kcontrol/krdb/themes/Sunshine/Makefile.am6
-rw-r--r--kcontrol/krdb/themes/Sunshine/Sunshine.preview.pngbin0 -> 32852 bytes
-rw-r--r--kcontrol/krdb/themes/Sunshine/Sunshine.xml124
-rw-r--r--kcontrol/krdb/themes/YellowOnBlue-big/Makefile.am6
-rw-r--r--kcontrol/krdb/themes/YellowOnBlue-big/YellowOnBlue-big.preview.pngbin0 -> 60912 bytes
-rw-r--r--kcontrol/krdb/themes/YellowOnBlue-big/YellowOnBlue-big.xml158
-rw-r--r--kcontrol/krdb/themes/YellowOnBlue/Makefile.am6
-rw-r--r--kcontrol/krdb/themes/YellowOnBlue/YellowOnBlue.preview.pngbin0 -> 58587 bytes
-rw-r--r--kcontrol/krdb/themes/YellowOnBlue/YellowOnBlue.xml158
-rw-r--r--kcontrol/kthememanager/Makefile.am21
-rw-r--r--kcontrol/kthememanager/NEWS26
-rw-r--r--kcontrol/kthememanager/README99
-rw-r--r--kcontrol/kthememanager/TODO9
-rw-r--r--kcontrol/kthememanager/installktheme.desktop78
-rwxr-xr-xkcontrol/kthememanager/kdeinstallktheme14
-rw-r--r--kcontrol/kthememanager/knewthemedlg.cpp96
-rw-r--r--kcontrol/kthememanager/knewthemedlg.h58
-rw-r--r--kcontrol/kthememanager/ktheme.cpp897
-rw-r--r--kcontrol/kthememanager/ktheme.h224
-rw-r--r--kcontrol/kthememanager/kthemedlg.ui518
-rw-r--r--kcontrol/kthememanager/kthemedlg.ui.h49
-rw-r--r--kcontrol/kthememanager/kthememanager.cpp425
-rw-r--r--kcontrol/kthememanager/kthememanager.desktop220
-rw-r--r--kcontrol/kthememanager/kthememanager.h157
-rw-r--r--kcontrol/kthememanager/newthemewidget.ui130
-rw-r--r--kcontrol/kthememanager/x-ktheme.desktop84
-rw-r--r--kcontrol/launch/Makefile.am13
-rw-r--r--kcontrol/launch/kcmlaunch.cpp275
-rw-r--r--kcontrol/launch/kcmlaunch.desktop225
-rw-r--r--kcontrol/launch/kcmlaunch.h72
-rw-r--r--kcontrol/locale/AUTHORS2
-rw-r--r--kcontrol/locale/Makefile.am32
-rw-r--r--kcontrol/locale/TIMEZONES392
-rw-r--r--kcontrol/locale/default/Makefile.am2
-rw-r--r--kcontrol/locale/default/entry.desktop72
-rw-r--r--kcontrol/locale/kcmlocale.cpp473
-rw-r--r--kcontrol/locale/kcmlocale.h95
-rw-r--r--kcontrol/locale/klocalesample.cpp132
-rw-r--r--kcontrol/locale/klocalesample.h58
-rw-r--r--kcontrol/locale/language.desktop236
-rw-r--r--kcontrol/locale/localemon.cpp330
-rw-r--r--kcontrol/locale/localemon.h93
-rw-r--r--kcontrol/locale/localenum.cpp194
-rw-r--r--kcontrol/locale/localenum.h82
-rw-r--r--kcontrol/locale/localeother.cpp142
-rw-r--r--kcontrol/locale/localeother.h70
-rw-r--r--kcontrol/locale/localetime.cpp556
-rw-r--r--kcontrol/locale/localetime.h102
-rw-r--r--kcontrol/locale/main.cpp38
-rw-r--r--kcontrol/locale/pics/Makefile.am2
-rw-r--r--kcontrol/locale/pics/background.pngbin0 -> 28823 bytes
-rw-r--r--kcontrol/locale/toplevel.cpp276
-rw-r--r--kcontrol/locale/toplevel.h87
-rw-r--r--kcontrol/nics/AUTHORS2
-rw-r--r--kcontrol/nics/Makefile.am15
-rw-r--r--kcontrol/nics/configure.in.in4
-rw-r--r--kcontrol/nics/nic.cpp323
-rw-r--r--kcontrol/nics/nic.desktop173
-rw-r--r--kcontrol/nics/nic.h45
-rw-r--r--kcontrol/performance/Makefile.am20
-rw-r--r--kcontrol/performance/kcmkonqyperformance.desktop207
-rw-r--r--kcontrol/performance/kcmperformance.cpp126
-rw-r--r--kcontrol/performance/kcmperformance.desktop215
-rw-r--r--kcontrol/performance/kcmperformance.h61
-rw-r--r--kcontrol/performance/konqueror.cpp147
-rw-r--r--kcontrol/performance/konqueror.h46
-rw-r--r--kcontrol/performance/konqueror_ui.ui155
-rw-r--r--kcontrol/performance/system.cpp80
-rw-r--r--kcontrol/performance/system.h44
-rw-r--r--kcontrol/performance/system_ui.ui69
-rw-r--r--kcontrol/pics/Makefile.am1
-rw-r--r--kcontrol/pics/cr128-app-access.pngbin0 -> 7576 bytes
-rw-r--r--kcontrol/pics/cr128-app-arts.pngbin0 -> 10542 bytes
-rw-r--r--kcontrol/pics/cr128-app-background.pngbin0 -> 10885 bytes
-rw-r--r--kcontrol/pics/cr128-app-bell.pngbin0 -> 7039 bytes
-rw-r--r--kcontrol/pics/cr128-app-cache.pngbin0 -> 9342 bytes
-rw-r--r--kcontrol/pics/cr128-app-clock.pngbin0 -> 17753 bytes
-rw-r--r--kcontrol/pics/cr128-app-colors.pngbin0 -> 14715 bytes
-rw-r--r--kcontrol/pics/cr128-app-date.pngbin0 -> 14176 bytes
-rw-r--r--kcontrol/pics/cr128-app-energy.pngbin0 -> 13774 bytes
-rw-r--r--kcontrol/pics/cr128-app-energy_star.pngbin0 -> 11541 bytes
-rw-r--r--kcontrol/pics/cr128-app-filetypes.pngbin0 -> 10583 bytes
-rw-r--r--kcontrol/pics/cr128-app-fonts.pngbin0 -> 4531 bytes
-rw-r--r--kcontrol/pics/cr128-app-help_index.pngbin0 -> 12683 bytes
-rw-r--r--kcontrol/pics/cr128-app-hwinfo.pngbin0 -> 8659 bytes
-rw-r--r--kcontrol/pics/cr128-app-kcmdevices.pngbin0 -> 10903 bytes
-rw-r--r--kcontrol/pics/cr128-app-kcmdf.pngbin0 -> 11838 bytes
-rw-r--r--kcontrol/pics/cr128-app-kcmkwm.pngbin0 -> 6787 bytes
-rw-r--r--kcontrol/pics/cr128-app-kcmmemory.pngbin0 -> 14318 bytes
-rw-r--r--kcontrol/pics/cr128-app-kcmpartitions.pngbin0 -> 16732 bytes
-rw-r--r--kcontrol/pics/cr128-app-kcmpci.pngbin0 -> 5796 bytes
-rw-r--r--kcontrol/pics/cr128-app-kdmconfig.pngbin0 -> 15977 bytes
-rw-r--r--kcontrol/pics/cr128-app-key_bindings.pngbin0 -> 6037 bytes
-rw-r--r--kcontrol/pics/cr128-app-kscreensaver.pngbin0 -> 7140 bytes
-rw-r--r--kcontrol/pics/cr128-app-kthememgr.pngbin0 -> 10328 bytes
-rw-r--r--kcontrol/pics/cr128-app-locale.pngbin0 -> 12910 bytes
-rw-r--r--kcontrol/pics/cr128-app-looknfeel.pngbin0 -> 12473 bytes
-rw-r--r--kcontrol/pics/cr128-app-multimedia.pngbin0 -> 12886 bytes
-rw-r--r--kcontrol/pics/cr128-app-personal.pngbin0 -> 13247 bytes
-rw-r--r--kcontrol/pics/cr128-app-proxy.pngbin0 -> 12824 bytes
-rw-r--r--kcontrol/pics/cr128-app-samba.pngbin0 -> 7617 bytes
-rw-r--r--kcontrol/pics/cr128-app-stylesheet.pngbin0 -> 6513 bytes
-rw-r--r--kcontrol/pics/cr128-device-laptop.pngbin0 -> 13375 bytes
-rw-r--r--kcontrol/pics/cr16-app-access.pngbin0 -> 1022 bytes
-rw-r--r--kcontrol/pics/cr16-app-agent.pngbin0 -> 828 bytes
-rw-r--r--kcontrol/pics/cr16-app-arts.pngbin0 -> 898 bytes
-rw-r--r--kcontrol/pics/cr16-app-background.pngbin0 -> 733 bytes
-rw-r--r--kcontrol/pics/cr16-app-bell.pngbin0 -> 639 bytes
-rw-r--r--kcontrol/pics/cr16-app-cache.pngbin0 -> 823 bytes
-rw-r--r--kcontrol/pics/cr16-app-clock.pngbin0 -> 875 bytes
-rw-r--r--kcontrol/pics/cr16-app-colors.pngbin0 -> 857 bytes
-rw-r--r--kcontrol/pics/cr16-app-cookie.pngbin0 -> 840 bytes
-rw-r--r--kcontrol/pics/cr16-app-date.pngbin0 -> 871 bytes
-rw-r--r--kcontrol/pics/cr16-app-energy.pngbin0 -> 869 bytes
-rw-r--r--kcontrol/pics/cr16-app-energy_star.pngbin0 -> 708 bytes
-rw-r--r--kcontrol/pics/cr16-app-enhanced_browsing.pngbin0 -> 726 bytes
-rw-r--r--kcontrol/pics/cr16-app-filetypes.pngbin0 -> 954 bytes
-rw-r--r--kcontrol/pics/cr16-app-fonts.pngbin0 -> 718 bytes
-rw-r--r--kcontrol/pics/cr16-app-help_index.pngbin0 -> 975 bytes
-rw-r--r--kcontrol/pics/cr16-app-hwinfo.pngbin0 -> 1092 bytes
-rw-r--r--kcontrol/pics/cr16-app-icons.pngbin0 -> 927 bytes
-rw-r--r--kcontrol/pics/cr16-app-iconthemes.pngbin0 -> 828 bytes
-rw-r--r--kcontrol/pics/cr16-app-ieee1394.pngbin0 -> 668 bytes
-rw-r--r--kcontrol/pics/cr16-app-input_devices_settings.pngbin0 -> 1035 bytes
-rw-r--r--kcontrol/pics/cr16-app-kcmdevices.pngbin0 -> 879 bytes
-rw-r--r--kcontrol/pics/cr16-app-kcmkicker.pngbin0 -> 805 bytes
-rw-r--r--kcontrol/pics/cr16-app-kcmkwm.pngbin0 -> 714 bytes
-rw-r--r--kcontrol/pics/cr16-app-kcmmemory.pngbin0 -> 931 bytes
-rw-r--r--kcontrol/pics/cr16-app-kcmmidi.pngbin0 -> 582 bytes
-rw-r--r--kcontrol/pics/cr16-app-kcmpartitions.pngbin0 -> 882 bytes
-rw-r--r--kcontrol/pics/cr16-app-kcmpci.pngbin0 -> 836 bytes
-rw-r--r--kcontrol/pics/cr16-app-kcmprocessor.pngbin0 -> 400 bytes
-rw-r--r--kcontrol/pics/cr16-app-kcmscsi.pngbin0 -> 976 bytes
-rw-r--r--kcontrol/pics/cr16-app-kcmsound.pngbin0 -> 988 bytes
-rw-r--r--kcontrol/pics/cr16-app-kcmsystem.pngbin0 -> 903 bytes
-rw-r--r--kcontrol/pics/cr16-app-kcmx.pngbin0 -> 790 bytes
-rw-r--r--kcontrol/pics/cr16-app-kdmconfig.pngbin0 -> 868 bytes
-rw-r--r--kcontrol/pics/cr16-app-key_bindings.pngbin0 -> 710 bytes
-rw-r--r--kcontrol/pics/cr16-app-keyboard.pngbin0 -> 661 bytes
-rw-r--r--kcontrol/pics/cr16-app-keyboard_layout.pngbin0 -> 871 bytes
-rw-r--r--kcontrol/pics/cr16-app-knotify.pngbin0 -> 657 bytes
-rw-r--r--kcontrol/pics/cr16-app-kscreensaver.pngbin0 -> 707 bytes
-rw-r--r--kcontrol/pics/cr16-app-kthememgr.pngbin0 -> 939 bytes
-rw-r--r--kcontrol/pics/cr16-app-locale.pngbin0 -> 811 bytes
-rw-r--r--kcontrol/pics/cr16-app-looknfeel.pngbin0 -> 842 bytes
-rw-r--r--kcontrol/pics/cr16-app-multimedia.pngbin0 -> 830 bytes
-rw-r--r--kcontrol/pics/cr16-app-panel_settings.pngbin0 -> 933 bytes
-rw-r--r--kcontrol/pics/cr16-app-personal.pngbin0 -> 753 bytes
-rw-r--r--kcontrol/pics/cr16-app-proxy.pngbin0 -> 866 bytes
-rw-r--r--kcontrol/pics/cr16-app-samba.pngbin0 -> 652 bytes
-rw-r--r--kcontrol/pics/cr16-app-style.pngbin0 -> 907 bytes
-rw-r--r--kcontrol/pics/cr16-app-stylesheet.pngbin0 -> 810 bytes
-rw-r--r--kcontrol/pics/cr16-app-usb.pngbin0 -> 695 bytes
-rw-r--r--kcontrol/pics/cr16-device-laptop.pngbin0 -> 883 bytes
-rw-r--r--kcontrol/pics/cr22-app-access.pngbin0 -> 1030 bytes
-rw-r--r--kcontrol/pics/cr22-app-agent.pngbin0 -> 1241 bytes
-rw-r--r--kcontrol/pics/cr22-app-arts.pngbin0 -> 1244 bytes
-rw-r--r--kcontrol/pics/cr22-app-background.pngbin0 -> 980 bytes
-rw-r--r--kcontrol/pics/cr22-app-bell.pngbin0 -> 824 bytes
-rw-r--r--kcontrol/pics/cr22-app-cache.pngbin0 -> 1192 bytes
-rw-r--r--kcontrol/pics/cr22-app-colors.pngbin0 -> 1304 bytes
-rw-r--r--kcontrol/pics/cr22-app-cookie.pngbin0 -> 1157 bytes
-rw-r--r--kcontrol/pics/cr22-app-date.pngbin0 -> 1385 bytes
-rw-r--r--kcontrol/pics/cr22-app-energy.pngbin0 -> 1316 bytes
-rw-r--r--kcontrol/pics/cr22-app-enhanced_browsing.pngbin0 -> 948 bytes
-rw-r--r--kcontrol/pics/cr22-app-filetypes.pngbin0 -> 1163 bytes
-rw-r--r--kcontrol/pics/cr22-app-fonts.pngbin0 -> 952 bytes
-rw-r--r--kcontrol/pics/cr22-app-hwinfo.pngbin0 -> 1288 bytes
-rw-r--r--kcontrol/pics/cr22-app-icons.pngbin0 -> 1459 bytes
-rw-r--r--kcontrol/pics/cr22-app-iconthemes.pngbin0 -> 1164 bytes
-rw-r--r--kcontrol/pics/cr22-app-ieee1394.pngbin0 -> 953 bytes
-rw-r--r--kcontrol/pics/cr22-app-kcmdevices.pngbin0 -> 1110 bytes
-rw-r--r--kcontrol/pics/cr22-app-kcmkicker.pngbin0 -> 1017 bytes
-rw-r--r--kcontrol/pics/cr22-app-kcmkwm.pngbin0 -> 969 bytes
-rw-r--r--kcontrol/pics/cr22-app-kcmx.pngbin0 -> 1096 bytes
-rw-r--r--kcontrol/pics/cr22-app-kdmconfig.pngbin0 -> 1363 bytes
-rw-r--r--kcontrol/pics/cr22-app-key_bindings.pngbin0 -> 978 bytes
-rw-r--r--kcontrol/pics/cr22-app-keyboard.pngbin0 -> 914 bytes
-rw-r--r--kcontrol/pics/cr22-app-kscreensaver.pngbin0 -> 1058 bytes
-rw-r--r--kcontrol/pics/cr22-app-kthememgr.pngbin0 -> 1104 bytes
-rw-r--r--kcontrol/pics/cr22-app-locale.pngbin0 -> 1319 bytes
-rw-r--r--kcontrol/pics/cr22-app-personal.pngbin0 -> 1238 bytes
-rw-r--r--kcontrol/pics/cr22-app-proxy.pngbin0 -> 1500 bytes
-rw-r--r--kcontrol/pics/cr22-app-samba.pngbin0 -> 928 bytes
-rw-r--r--kcontrol/pics/cr22-app-style.pngbin0 -> 1098 bytes
-rw-r--r--kcontrol/pics/cr22-app-stylesheet.pngbin0 -> 1059 bytes
-rw-r--r--kcontrol/pics/cr22-device-laptop.pngbin0 -> 1383 bytes
-rw-r--r--kcontrol/pics/cr32-app-access.pngbin0 -> 1619 bytes
-rw-r--r--kcontrol/pics/cr32-app-agent.pngbin0 -> 2606 bytes
-rw-r--r--kcontrol/pics/cr32-app-arts.pngbin0 -> 2164 bytes
-rw-r--r--kcontrol/pics/cr32-app-background.pngbin0 -> 1787 bytes
-rw-r--r--kcontrol/pics/cr32-app-bell.pngbin0 -> 1496 bytes
-rw-r--r--kcontrol/pics/cr32-app-cache.pngbin0 -> 2063 bytes
-rw-r--r--kcontrol/pics/cr32-app-clock.pngbin0 -> 2458 bytes
-rw-r--r--kcontrol/pics/cr32-app-colors.pngbin0 -> 2295 bytes
-rw-r--r--kcontrol/pics/cr32-app-cookie.pngbin0 -> 2524 bytes
-rw-r--r--kcontrol/pics/cr32-app-date.pngbin0 -> 2478 bytes
-rw-r--r--kcontrol/pics/cr32-app-energy.pngbin0 -> 2218 bytes
-rw-r--r--kcontrol/pics/cr32-app-energy_star.pngbin0 -> 1935 bytes
-rw-r--r--kcontrol/pics/cr32-app-enhanced_browsing.pngbin0 -> 1706 bytes
-rw-r--r--kcontrol/pics/cr32-app-filetypes.pngbin0 -> 2130 bytes
-rw-r--r--kcontrol/pics/cr32-app-fonts.pngbin0 -> 1336 bytes
-rw-r--r--kcontrol/pics/cr32-app-help_index.pngbin0 -> 2130 bytes
-rw-r--r--kcontrol/pics/cr32-app-hwinfo.pngbin0 -> 1838 bytes
-rw-r--r--kcontrol/pics/cr32-app-icons.pngbin0 -> 2853 bytes
-rw-r--r--kcontrol/pics/cr32-app-iconthemes.pngbin0 -> 2386 bytes
-rw-r--r--kcontrol/pics/cr32-app-ieee1394.pngbin0 -> 1414 bytes
-rw-r--r--kcontrol/pics/cr32-app-input_devices_settings.pngbin0 -> 2815 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmdevices.pngbin0 -> 1825 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmdrkonqi.pngbin0 -> 1834 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmkicker.pngbin0 -> 1921 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmkwm.pngbin0 -> 1405 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmmemory.pngbin0 -> 2205 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmmidi.pngbin0 -> 1160 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmpartitions.pngbin0 -> 2481 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmpci.pngbin0 -> 1319 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmprocessor.pngbin0 -> 636 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmscsi.pngbin0 -> 2538 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmsound.pngbin0 -> 2465 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmsystem.pngbin0 -> 2381 bytes
-rw-r--r--kcontrol/pics/cr32-app-kcmx.pngbin0 -> 2169 bytes
-rw-r--r--kcontrol/pics/cr32-app-kdmconfig.pngbin0 -> 2280 bytes
-rw-r--r--kcontrol/pics/cr32-app-key_bindings.pngbin0 -> 1605 bytes
-rw-r--r--kcontrol/pics/cr32-app-keyboard.pngbin0 -> 1372 bytes
-rw-r--r--kcontrol/pics/cr32-app-keyboard_layout.pngbin0 -> 2413 bytes
-rw-r--r--kcontrol/pics/cr32-app-knotify.pngbin0 -> 1488 bytes
-rw-r--r--kcontrol/pics/cr32-app-kscreensaver.pngbin0 -> 1663 bytes
-rw-r--r--kcontrol/pics/cr32-app-kthememgr.pngbin0 -> 1966 bytes
-rw-r--r--kcontrol/pics/cr32-app-locale.pngbin0 -> 2252 bytes
-rw-r--r--kcontrol/pics/cr32-app-looknfeel.pngbin0 -> 2135 bytes
-rw-r--r--kcontrol/pics/cr32-app-multimedia.pngbin0 -> 1988 bytes
-rw-r--r--kcontrol/pics/cr32-app-personal.pngbin0 -> 1914 bytes
-rw-r--r--kcontrol/pics/cr32-app-proxy.pngbin0 -> 2225 bytes
-rw-r--r--kcontrol/pics/cr32-app-samba.pngbin0 -> 1521 bytes
-rw-r--r--kcontrol/pics/cr32-app-style.pngbin0 -> 1883 bytes
-rw-r--r--kcontrol/pics/cr32-app-stylesheet.pngbin0 -> 1837 bytes
-rw-r--r--kcontrol/pics/cr32-app-usb.pngbin0 -> 1889 bytes
-rw-r--r--kcontrol/pics/cr32-device-laptop.pngbin0 -> 2473 bytes
-rw-r--r--kcontrol/pics/cr48-app-access.pngbin0 -> 2605 bytes
-rw-r--r--kcontrol/pics/cr48-app-agent.pngbin0 -> 4149 bytes
-rw-r--r--kcontrol/pics/cr48-app-arts.pngbin0 -> 3746 bytes
-rw-r--r--kcontrol/pics/cr48-app-background.pngbin0 -> 3242 bytes
-rw-r--r--kcontrol/pics/cr48-app-bell.pngbin0 -> 2287 bytes
-rw-r--r--kcontrol/pics/cr48-app-cache.pngbin0 -> 3350 bytes
-rw-r--r--kcontrol/pics/cr48-app-clock.pngbin0 -> 4736 bytes
-rw-r--r--kcontrol/pics/cr48-app-colors.pngbin0 -> 4226 bytes
-rw-r--r--kcontrol/pics/cr48-app-cookie.pngbin0 -> 4296 bytes
-rw-r--r--kcontrol/pics/cr48-app-date.pngbin0 -> 4593 bytes
-rw-r--r--kcontrol/pics/cr48-app-energy.pngbin0 -> 3913 bytes
-rw-r--r--kcontrol/pics/cr48-app-energy_star.pngbin0 -> 3573 bytes
-rw-r--r--kcontrol/pics/cr48-app-enhanced_browsing.pngbin0 -> 2844 bytes
-rw-r--r--kcontrol/pics/cr48-app-filetypes.pngbin0 -> 3368 bytes
-rw-r--r--kcontrol/pics/cr48-app-fonts.pngbin0 -> 1833 bytes
-rw-r--r--kcontrol/pics/cr48-app-help_index.pngbin0 -> 3812 bytes
-rw-r--r--kcontrol/pics/cr48-app-hwinfo.pngbin0 -> 2955 bytes
-rw-r--r--kcontrol/pics/cr48-app-icons.pngbin0 -> 4794 bytes
-rw-r--r--kcontrol/pics/cr48-app-iconthemes.pngbin0 -> 3371 bytes
-rw-r--r--kcontrol/pics/cr48-app-ieee1394.pngbin0 -> 2158 bytes
-rw-r--r--kcontrol/pics/cr48-app-input_devices_settings.pngbin0 -> 3451 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmdevices.pngbin0 -> 3452 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmdf.pngbin0 -> 3510 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmdrkonqi.pngbin0 -> 2647 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmkwm.pngbin0 -> 2253 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmmemory.pngbin0 -> 4100 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmmidi.pngbin0 -> 1639 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmopengl.pngbin0 -> 1129 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmpartitions.pngbin0 -> 4689 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmpci.pngbin0 -> 2140 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmprocessor.pngbin0 -> 966 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmscsi.pngbin0 -> 3977 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmsystem.pngbin0 -> 4135 bytes
-rw-r--r--kcontrol/pics/cr48-app-kcmx.pngbin0 -> 3747 bytes
-rw-r--r--kcontrol/pics/cr48-app-kdmconfig.pngbin0 -> 4151 bytes
-rw-r--r--kcontrol/pics/cr48-app-key_bindings.pngbin0 -> 2569 bytes
-rw-r--r--kcontrol/pics/cr48-app-keyboard.pngbin0 -> 2195 bytes
-rw-r--r--kcontrol/pics/cr48-app-keyboard_layout.pngbin0 -> 4266 bytes
-rw-r--r--kcontrol/pics/cr48-app-knotify.pngbin0 -> 2357 bytes
-rw-r--r--kcontrol/pics/cr48-app-kscreensaver.pngbin0 -> 2777 bytes
-rw-r--r--kcontrol/pics/cr48-app-kthememgr.pngbin0 -> 3115 bytes
-rw-r--r--kcontrol/pics/cr48-app-locale.pngbin0 -> 4018 bytes
-rw-r--r--kcontrol/pics/cr48-app-looknfeel.pngbin0 -> 3829 bytes
-rw-r--r--kcontrol/pics/cr48-app-multimedia.pngbin0 -> 3703 bytes
-rw-r--r--kcontrol/pics/cr48-app-personal.pngbin0 -> 3404 bytes
-rw-r--r--kcontrol/pics/cr48-app-proxy.pngbin0 -> 3921 bytes
-rw-r--r--kcontrol/pics/cr48-app-samba.pngbin0 -> 2401 bytes
-rw-r--r--kcontrol/pics/cr48-app-style.pngbin0 -> 3110 bytes
-rw-r--r--kcontrol/pics/cr48-app-stylesheet.pngbin0 -> 3179 bytes
-rw-r--r--kcontrol/pics/cr48-app-usb.pngbin0 -> 3134 bytes
-rw-r--r--kcontrol/pics/cr48-device-laptop.pngbin0 -> 4220 bytes
-rw-r--r--kcontrol/pics/cr64-app-access.pngbin0 -> 3637 bytes
-rw-r--r--kcontrol/pics/cr64-app-arts.pngbin0 -> 5198 bytes
-rw-r--r--kcontrol/pics/cr64-app-background.pngbin0 -> 4447 bytes
-rw-r--r--kcontrol/pics/cr64-app-bell.pngbin0 -> 3238 bytes
-rw-r--r--kcontrol/pics/cr64-app-cache.pngbin0 -> 4681 bytes
-rw-r--r--kcontrol/pics/cr64-app-clock.pngbin0 -> 7240 bytes
-rw-r--r--kcontrol/pics/cr64-app-colors.pngbin0 -> 5874 bytes
-rw-r--r--kcontrol/pics/cr64-app-cookie.pngbin0 -> 5950 bytes
-rw-r--r--kcontrol/pics/cr64-app-date.pngbin0 -> 6801 bytes
-rw-r--r--kcontrol/pics/cr64-app-energy.pngbin0 -> 5681 bytes
-rw-r--r--kcontrol/pics/cr64-app-energy_star.pngbin0 -> 5336 bytes
-rw-r--r--kcontrol/pics/cr64-app-enhanced_browsing.pngbin0 -> 4165 bytes
-rw-r--r--kcontrol/pics/cr64-app-filetypes.pngbin0 -> 4782 bytes
-rw-r--r--kcontrol/pics/cr64-app-fonts.pngbin0 -> 2896 bytes
-rw-r--r--kcontrol/pics/cr64-app-help_index.pngbin0 -> 5648 bytes
-rw-r--r--kcontrol/pics/cr64-app-hwinfo.pngbin0 -> 4142 bytes
-rw-r--r--kcontrol/pics/cr64-app-icons.pngbin0 -> 7051 bytes
-rw-r--r--kcontrol/pics/cr64-app-ieee1394.pngbin0 -> 2891 bytes
-rw-r--r--kcontrol/pics/cr64-app-kcmdevices.pngbin0 -> 4255 bytes
-rw-r--r--kcontrol/pics/cr64-app-kcmdf.pngbin0 -> 5185 bytes
-rw-r--r--kcontrol/pics/cr64-app-kcmkwm.pngbin0 -> 3091 bytes
-rw-r--r--kcontrol/pics/cr64-app-kcmmemory.pngbin0 -> 6001 bytes
-rw-r--r--kcontrol/pics/cr64-app-kcmpartitions.pngbin0 -> 6844 bytes
-rw-r--r--kcontrol/pics/cr64-app-kcmpci.pngbin0 -> 2743 bytes
-rw-r--r--kcontrol/pics/cr64-app-kcmx.pngbin0 -> 5495 bytes
-rw-r--r--kcontrol/pics/cr64-app-kdmconfig.pngbin0 -> 6154 bytes
-rw-r--r--kcontrol/pics/cr64-app-key_bindings.pngbin0 -> 3430 bytes
-rw-r--r--kcontrol/pics/cr64-app-knotify.pngbin0 -> 3285 bytes
-rw-r--r--kcontrol/pics/cr64-app-kscreensaver.pngbin0 -> 3703 bytes
-rw-r--r--kcontrol/pics/cr64-app-kthememgr.pngbin0 -> 4511 bytes
-rw-r--r--kcontrol/pics/cr64-app-locale.pngbin0 -> 5906 bytes
-rw-r--r--kcontrol/pics/cr64-app-looknfeel.pngbin0 -> 5513 bytes
-rw-r--r--kcontrol/pics/cr64-app-multimedia.pngbin0 -> 5049 bytes
-rw-r--r--kcontrol/pics/cr64-app-personal.pngbin0 -> 5046 bytes
-rw-r--r--kcontrol/pics/cr64-app-proxy.pngbin0 -> 5870 bytes
-rw-r--r--kcontrol/pics/cr64-app-samba.pngbin0 -> 3319 bytes
-rw-r--r--kcontrol/pics/cr64-app-style.pngbin0 -> 5292 bytes
-rw-r--r--kcontrol/pics/cr64-app-stylesheet.pngbin0 -> 4585 bytes
-rw-r--r--kcontrol/pics/cr64-device-laptop.pngbin0 -> 5504 bytes
-rw-r--r--kcontrol/pics/crsc-app-access.svgzbin0 -> 2559 bytes
-rw-r--r--kcontrol/pics/crsc-app-arts.svgzbin0 -> 2884 bytes
-rw-r--r--kcontrol/pics/crsc-app-background.svgzbin0 -> 9032 bytes
-rw-r--r--kcontrol/pics/crsc-app-bell.svgzbin0 -> 3516 bytes
-rw-r--r--kcontrol/pics/crsc-app-cache.svgzbin0 -> 2696 bytes
-rw-r--r--kcontrol/pics/crsc-app-colors.svgzbin0 -> 7567 bytes
-rw-r--r--kcontrol/pics/crsc-app-date.svgzbin0 -> 12432 bytes
-rw-r--r--kcontrol/pics/crsc-app-energy.svgzbin0 -> 9841 bytes
-rw-r--r--kcontrol/pics/crsc-app-filetypes.svgzbin0 -> 3124 bytes
-rw-r--r--kcontrol/pics/crsc-app-fonts.svgzbin0 -> 4054 bytes
-rw-r--r--kcontrol/pics/crsc-app-hwinfo.svgzbin0 -> 5097 bytes
-rw-r--r--kcontrol/pics/crsc-app-ieee1394.svgzbin0 -> 3273 bytes
-rw-r--r--kcontrol/pics/crsc-app-kcmdevices.svgzbin0 -> 3194 bytes
-rw-r--r--kcontrol/pics/crsc-app-kcmkwm.svgzbin0 -> 3078 bytes
-rw-r--r--kcontrol/pics/crsc-app-kcmx.svgzbin0 -> 2005 bytes
-rw-r--r--kcontrol/pics/crsc-app-locale.svgzbin0 -> 5561 bytes
-rw-r--r--kcontrol/pics/crsc-app-samba.svgzbin0 -> 4802 bytes
-rw-r--r--kcontrol/pics/crsc-app-stylesheet.svgzbin0 -> 3348 bytes
-rw-r--r--kcontrol/pics/crsc-device-laptop.svgzbin0 -> 4418 bytes
-rw-r--r--kcontrol/privacy/Makefile.am16
-rw-r--r--kcontrol/privacy/kcmprivacydialog.ui201
-rw-r--r--kcontrol/privacy/kprivacymanager.cpp169
-rw-r--r--kcontrol/privacy/kprivacymanager.h55
-rw-r--r--kcontrol/privacy/kprivacysettings.ui308
-rw-r--r--kcontrol/privacy/privacy.cpp319
-rw-r--r--kcontrol/privacy/privacy.desktop204
-rw-r--r--kcontrol/privacy/privacy.h74
-rw-r--r--kcontrol/randr/Makefile.am36
-rw-r--r--kcontrol/randr/TODO14
-rw-r--r--kcontrol/randr/configure.in.in18
-rw-r--r--kcontrol/randr/krandrapp.cpp40
-rw-r--r--kcontrol/randr/krandrapp.h39
-rw-r--r--kcontrol/randr/krandrinithack.cpp0
-rw-r--r--kcontrol/randr/krandrmodule.cpp364
-rw-r--r--kcontrol/randr/krandrmodule.h68
-rw-r--r--kcontrol/randr/krandrpassivepopup.cpp118
-rw-r--r--kcontrol/randr/krandrpassivepopup.h47
-rw-r--r--kcontrol/randr/krandrtray.cpp253
-rw-r--r--kcontrol/randr/krandrtray.desktop141
-rw-r--r--kcontrol/randr/krandrtray.h60
-rw-r--r--kcontrol/randr/ktimerdialog.cpp205
-rw-r--r--kcontrol/randr/ktimerdialog.h170
-rw-r--r--kcontrol/randr/main.cpp51
-rw-r--r--kcontrol/randr/randr.cpp703
-rw-r--r--kcontrol/randr/randr.desktop216
-rw-r--r--kcontrol/randr/randr.h235
-rw-r--r--kcontrol/samba/AUTHORS32
-rw-r--r--kcontrol/samba/Makefile.am15
-rw-r--r--kcontrol/samba/kcmsambaimports.cpp95
-rw-r--r--kcontrol/samba/kcmsambaimports.h47
-rw-r--r--kcontrol/samba/kcmsambalog.cpp253
-rw-r--r--kcontrol/samba/kcmsambalog.h86
-rw-r--r--kcontrol/samba/kcmsambastatistics.cpp289
-rw-r--r--kcontrol/samba/kcmsambastatistics.h106
-rw-r--r--kcontrol/samba/ksmbstatus.cpp225
-rw-r--r--kcontrol/samba/ksmbstatus.h65
-rw-r--r--kcontrol/samba/main.cpp119
-rw-r--r--kcontrol/samba/smbstatus.desktop241
-rw-r--r--kcontrol/screensaver/Makefile.am20
-rw-r--r--kcontrol/screensaver/advanceddialog.cpp174
-rw-r--r--kcontrol/screensaver/advanceddialog.h61
-rw-r--r--kcontrol/screensaver/advanceddialogimpl.ui397
-rw-r--r--kcontrol/screensaver/category_list16
-rw-r--r--kcontrol/screensaver/configure.in.in8
-rw-r--r--kcontrol/screensaver/kssmonitor.h15
-rw-r--r--kcontrol/screensaver/kswidget.cpp71
-rw-r--r--kcontrol/screensaver/kswidget.h17
-rw-r--r--kcontrol/screensaver/saverconfig.cpp38
-rw-r--r--kcontrol/screensaver/saverconfig.h29
-rw-r--r--kcontrol/screensaver/saverlist.cpp13
-rw-r--r--kcontrol/screensaver/saverlist.h14
-rw-r--r--kcontrol/screensaver/screensaver.desktop240
-rw-r--r--kcontrol/screensaver/scrnsave.cpp862
-rw-r--r--kcontrol/screensaver/scrnsave.h113
-rw-r--r--kcontrol/screensaver/testwin.cpp13
-rw-r--r--kcontrol/screensaver/testwin.h14
-rw-r--r--kcontrol/smartcard/Makefile.am17
-rw-r--r--kcontrol/smartcard/configure.in.in3
-rw-r--r--kcontrol/smartcard/nosmartcardbase.ui81
-rw-r--r--kcontrol/smartcard/smartcard.cpp400
-rw-r--r--kcontrol/smartcard/smartcard.desktop212
-rw-r--r--kcontrol/smartcard/smartcard.h89
-rw-r--r--kcontrol/smartcard/smartcardbase.ui310
-rw-r--r--kcontrol/smserver/Makefile.am17
-rw-r--r--kcontrol/smserver/kcmsmserver.cpp134
-rw-r--r--kcontrol/smserver/kcmsmserver.desktop236
-rw-r--r--kcontrol/smserver/kcmsmserver.h46
-rw-r--r--kcontrol/smserver/smserverconfigdlg.ui248
-rw-r--r--kcontrol/smserver/smserverconfigimpl.cpp31
-rw-r--r--kcontrol/smserver/smserverconfigimpl.h41
-rw-r--r--kcontrol/spellchecking/Makefile.am16
-rw-r--r--kcontrol/spellchecking/spellchecking.cpp74
-rw-r--r--kcontrol/spellchecking/spellchecking.desktop232
-rw-r--r--kcontrol/spellchecking/spellchecking.h41
-rw-r--r--kcontrol/structure21
-rw-r--r--kcontrol/style/Makefile.am18
-rw-r--r--kcontrol/style/kcmstyle.cpp1070
-rw-r--r--kcontrol/style/kcmstyle.h163
-rw-r--r--kcontrol/style/keramik/Makefile.am12
-rw-r--r--kcontrol/style/keramik/keramikconf.cpp103
-rw-r--r--kcontrol/style/keramik/keramikconf.h62
-rw-r--r--kcontrol/style/main.cpp16
-rw-r--r--kcontrol/style/menupreview.cpp166
-rw-r--r--kcontrol/style/menupreview.h61
-rw-r--r--kcontrol/style/style.desktop234
-rw-r--r--kcontrol/style/styleconfdialog.cpp46
-rw-r--r--kcontrol/style/styleconfdialog.h46
-rw-r--r--kcontrol/style/stylepreview.ui285
-rw-r--r--kcontrol/style/stylepreview.ui.h69
-rw-r--r--kcontrol/taskbar/Makefile.am21
-rw-r--r--kcontrol/taskbar/kcmtaskbar.cpp291
-rw-r--r--kcontrol/taskbar/kcmtaskbar.desktop229
-rw-r--r--kcontrol/taskbar/kcmtaskbar.h79
-rw-r--r--kcontrol/taskbar/kcmtaskbarui.ui482
-rw-r--r--kcontrol/taskbar/uninstall.desktop2
-rw-r--r--kcontrol/usbview/Makefile.am21
-rw-r--r--kcontrol/usbview/classes.i18n48
-rw-r--r--kcontrol/usbview/configure.in.in16
-rw-r--r--kcontrol/usbview/kcmusb.cpp192
-rw-r--r--kcontrol/usbview/kcmusb.desktop240
-rw-r--r--kcontrol/usbview/kcmusb.h47
-rw-r--r--kcontrol/usbview/usb.ids6430
-rw-r--r--kcontrol/usbview/usbdb.cpp150
-rw-r--r--kcontrol/usbview/usbdb.h39
-rw-r--r--kcontrol/usbview/usbdevices.cpp431
-rw-r--r--kcontrol/usbview/usbdevices.h75
-rw-r--r--kcontrol/view1394/Makefile.am19
-rw-r--r--kcontrol/view1394/README13
-rw-r--r--kcontrol/view1394/configure.in.in15
-rw-r--r--kcontrol/view1394/kcmview1394.desktop219
-rw-r--r--kcontrol/view1394/oui.db7965
-rw-r--r--kcontrol/view1394/view1394.cpp334
-rw-r--r--kcontrol/view1394/view1394.h67
-rw-r--r--kcontrol/view1394/view1394widget.ui186
-rw-r--r--kcontrol/xinerama/Makefile.am18
-rw-r--r--kcontrol/xinerama/kcmxinerama.cpp254
-rw-r--r--kcontrol/xinerama/kcmxinerama.h62
-rw-r--r--kcontrol/xinerama/xinerama.desktop202
-rw-r--r--kcontrol/xinerama/xineramawidget.ui326
-rw-r--r--kcontrol/xinerama/xineramawidget.ui.h14
1428 files changed, 174423 insertions, 0 deletions
diff --git a/kcontrol/Makefile.am b/kcontrol/Makefile.am
new file mode 100644
index 000000000..50e8242de
--- /dev/null
+++ b/kcontrol/Makefile.am
@@ -0,0 +1,39 @@
+
+if include_kcontrol_access
+ACCESS_SUBDIR=access
+endif
+
+if include_kcontrol_kfontinst
+FONTINST_SUBDIR=kfontinst
+endif
+
+if include_kcontrol_smartcard
+KSMCARD_SUBDIR=smartcard
+endif
+
+if include_kcontrol_usbview
+USBVIEW_SUBDIR=usbview
+endif
+
+if include_kcontrol_view1394
+VIEW1394_SUBDIR=view1394
+endif
+
+if include_kcontrol_randr
+RANDR_SUBDIR=randr
+endif
+
+if include_kcontrol_joystick
+JOYSTICK_SUBDIR=joystick
+endif
+
+# 'colors' and 'fonts' should come after 'krdb'
+SUBDIRS = bell background dnssd filetypes samba krdb input info ioslaveinfo kdm\
+ kicker locale launch keys kio konq style kded \
+ konqhtml ebrowsing arts kcontrol knotify\
+ clock pics $(ACCESS_SUBDIR) colors energy fonts css \
+ icons screensaver taskbar crypto privacy smserver \
+ konsole spellchecking $(USBVIEW_SUBDIR) \
+ $(KSMCARD_SUBDIR) nics $(FONTINST_SUBDIR) $(RANDR_SUBDIR) \
+ componentchooser performance xinerama $(VIEW1394_SUBDIR) display kthememanager \
+ $(JOYSTICK_SUBDIR)
diff --git a/kcontrol/TODO b/kcontrol/TODO
new file mode 100644
index 000000000..b3b8d2971
--- /dev/null
+++ b/kcontrol/TODO
@@ -0,0 +1,168 @@
+
+Welcome to the this-is-another-kcontrol-reorganization-attempt-but-this-time-it-will-be-good file!
+
+This file contain a list of various major changes for KControl(reorganization, broad technical changes etc.) planned for KDE4. I think it is a good idea if small changes in each KCM is not listed(if they not have a meaning in the bigger picture) otherwise this list will grow too big.
+Feel free to discuss the ideas on kde-usability.
+Of course, nothing in this file is set in stone, or is "correct" or "true" for that matter.
+
+ ---These are only ideas.---
+
+ ---These are only ideas!---
+
+---------- Renaming
+
+* Rename "Appearance & Themes" to "Appearance"
+
+* Rename "System Administration" to "System".
+
+* Rename "Display" to "Monitor", see the KCM guidelines
+
+* Rename "Peripherals" to "Hardware".
+ - remove settings-peripherals.directory
+ - Update kde-settings.menu and remove the Peripherals menu
+ - Convert any kcmmodules that haven't already to X-KDE-settings-hardware
+
+* Rename password & User Account - "User Account"
+
+* Rename "Component Chooser" to "Default Applications" Users want to set the default application handlers, not Choose a component (which they wouldn't have a clue what it was anyway)?
+
+---------- Reorganization/Moving
+
+* Move Background, Splash Screen, And Screen Saver to Desktop
+
+* Move Theme manger out of KControl as a standalone app (can still be a kcm modules code wise of course).
+
+* Move "Power Control/Laptop Battery" to "Hardware" (the only KCM left in that category). Note this is in kdeutils. It will also remove the top level Power Control so remove that in the settings.menu file
+
+* Move the laptop KCMs to "Hardware", from "System Administration". Note these are in kdeutils.
+
+* Move "User Account to System
+
+* Move Launch Feedback into Desktop/Behavior kcm as another tab.
+
+---------- Removing
+
+* "KDE Components/File Manager" - It's Konqueror specific.
+
+* "Internet & Network/Web Browser/" - It's Konqueror specific. Those apps(such as Quanta) which needs the configuration functionality can load the specific KCMs into their own configuration dialogs.
+
+* Security & Privacy/Crypto - It's Konqueror specific.
+
+* "KDE Performance" - It's Konqueror Performance.
+
+* Spelling - It is application specific and if they need it they will include the kcm in their configure dialog most (all?) already do.
+
+* Security & Privacy/Privacy - It should be a seperate utility in kdeutils. It does stuff, not configuring stuff
+
+---------- Combining Modules
+
+* Combine Desktop/Behavior and Desktop/Multiple
+
+* Move ability to configure Bell to Accessibility then remove "Sound & Multimedia/Bell" since it is a duplicate of the accessibility KCM. How on earth does such a thing slip through? :)
+
+* Move Window-Specific Settings into Window Behavior as another tab or Advanced?
+
+* Make a new "User Account" group with
+ - Session Manager
+ - System Administration/Paths
+ - Component Chooser (after renamed to "Default Applications")
+
+* The following container:
+KCMODULECONTAINER("kcmfontinst, fonts", fonts )
+The desktop file is called "kcm_fonts" with "Name=Fonts" and "Categories=X-KDE-settings-appearance"
+
+
+---------- Various other stuff
+
+* In a lot of cases there's an unnecessary use of "Manager" and "Configuration". We should not state the obvious and remove those parts.
+
+* Rename "KDE Wallet" to "Wallet"(people can't differentiate nor care about what is KDE and what's not. It is also irrelevant for the context).
+
+* Remove old categories, for example X-KDE-settings-peripherals.
+
+* Convert all options in "Internet & Network/Preferences" to KConfigXT and then remove the KCM.
+
+* Remove "KDE Components" and put the KCMs elsewhere, most of them in "System". Wake up: a non KDE hacker can't differentiate between KDE and other parts of the system.
+
+* We must stop differentiating between KDE and System/whatever. People *can't* tell the difference and it only clutters up the interface. KDE is THE computer/system.
+
+// Not sure where these next three are is this OLD and from KDE2 and has already been done?
+
+* Remove "Internet & Network/Email". It is replaced by the new kcm_useraccount
+
+* Remove "System Administration/User Info". It is replaced by the new kcm_useraccount
+
+* Remove "Privacy & Crypto/Passwords". It is replaced by the new kcm_useraccount. Probably. (awaiting comment from Aaron)
+
+* Tell Konqi to go burn the 11 tabs of keyboard options(5 KCMs). Because it is.. bizarre. Two KCMs with two tabs each is absolute maximum. One KCM with three tabs is quite ok too.
+
+* Put some common sense into phrases used here and there, Comments fields for example. Don't use "etc", paranteses, exlamation marks, smilies(haven't found any though). Don't phrase things like "Y configurates code part X"......
+
+* Split "Sound & Multimedia/Sound System" into two KCMs(it currently consists of two tabs) and combine those two with "System Notifications" with the KCMODULECONTAINER macro into one KCM called "Sound System". Lots of the options in Sound System can be turned into KConfEdit options, mesa thinks.
+
+
+---------Various technical, broad design shifts: --------------------
+
+* Move the various KCMs in kdebase/kcontrol/* out to their respective app, as per the KCM Guidelines.
+
+* Convert KCMs to use ui Designer files
+
+* Namespace the KCMs desktop files to "kcm_*.desktop", as per KCM Guidelines.
+
+* A lot, perhaps even the majority, violate the HIG by not displaying
+properly in 800x600 (is it 800x600 or 1024x768?). For a start, someone needs to iterate through all KCMs and file bug reports for each missbehaving. See the KDE UI Guidelines.
+
+* KCMs needs to be converted to KConfigXT and use the global kdeglobals KConfigXT object.
+
+* Tons of KCMs and applications have options for selecting binaries which they use(frontends etc.). We need to be a little consistent here and adopt a general policy in this issue.
+If a binary is not in $PATH it is the distributors fault and not KDE. The reason we have a GUI is so people don't have to know about this kinds of internals. The options doesn't mean anything because users use KDE, they're not in run level 3("WTF? cdparanoia? diff? What's that?"). PATH options("Where to search for X") should be removed - it is up to the distributor. Options for selecting what binary to use should be moved out to KConfEdit - they have a use but are very rarely used.
+
+* Rewrite kcmshell to the new KCModuleProxy and fix bugs. Move it to kdelibs.
+
+--------------------------------------------------------------------------
+
+Below is some old stuff, which was in this file.
+
+
+File Browsing -> Filemanager
+----------------------------
+Appearance (Rik was right here and I was wrong): Getting rid of "Standard Font" and "Normal Text Color" by putting "Filemanager Text" into "Look&Feel -> Colors -> Widget color"
+Other: This tab should be removed: "Show network operations in a single window" should go either in "Behaviour" or into "Network -> KDE protocols Information". Also "Terminal program" appears for Konqueror-Settings as well as in the Kicker-Settings. There should only be one place which specifies which terminal should be used for all applications.
+
+
+Help -> Index
+-------------
+This looks a bit crowdy. Adding a second Tab "Program Locations" which appears behind the "General tab" might be a good idea as the paths should be set automagically and user-interaction concerning this should only be necessary in case of failure.
+
+Look & Feel -> Desktop
+----------------------
+Desktop: Looks overcrowded:
+"Show Preview for:" should go into a tab "Previews" in File-Browsing -> File Associations. Malte is probably already working on this.
+Appearance (Rik was right here): Getting rid of "Standard Font" and "Normal Text Color" by putting "Desktop Text" into "Look&Feel -> Colors -> Widget color"
+
+Groupboxes named "Behaviour", "Clicks on the desktop" and "Paths" would look much more tidy here ("path" could be removed from each item then and would make the dialog look more tidy).
+
+Look & Feel -> System-Notifications
+-----------------------------------
+The current dialog resembles a very good "advanced"-tab. It would be nice for the newbie if there was a
+Tab for newbies in the first place which only shows the available Notification-themes ("Minimalistic", "Visually impaired", "Aureal impaired", "KDE-Standard").
+The current dialog should appear as an advanced tab behind the "Theme"-tab.
+
+Network -> Talk Configuration
+-----------------------------
+Answering Machine: A groupbox around "Address:, Subject:, First Line:" would be nice. That way one wouldn't need to mention "Mail" each time. The Groupbox could be named something like "Anwering Mail".
+That way one would have a much cleaner layout and it would be much easier to see at once what the dialog is about.
+Forward: Way too much text here. I see the point of having a direct explanation in the dialog. But this could look much friendlier using the following solution:
+There should be a Textbox below the "Forward method"-Combobox. This Textbox only contains the information for the Forward-method which is currently selected (So the text changes each time a different Forward-method is selected).
+
+Sound -> Sound Server
+---------------------
+As soon as more stuff is being added, a tab "Quality" might be a good idea.
+
+Web Browsing -> User Agent
+--------------------------
+The Dialog suffers from the cockpit-dilemma.
+All the new "Add"-checkboxes are only there for finetuning. Most of the time the useragent-strings should work
+w/o the need to tune them this way. Better Solution: Remove the Customize-Group-box and simply add a Button "Customize ..." below the Text: "Current User Agent String: Mozilla/5.0 (comp.; Konq.orwhateveritis)".
+After pressing the "Customize"-Button a dialog should pop up which contains all the nice
+"Add"-checkboxes which have been added recently.
diff --git a/kcontrol/access/Makefile.am b/kcontrol/access/Makefile.am
new file mode 100644
index 000000000..f57c865b3
--- /dev/null
+++ b/kcontrol/access/Makefile.am
@@ -0,0 +1,30 @@
+
+AM_CPPFLAGS= $(all_includes)
+METASOURCES = AUTO
+
+bin_PROGRAMS =
+lib_LTLIBRARIES =
+kde_module_LTLIBRARIES = kcm_access.la
+kdeinit_LTLIBRARIES = kaccess.la
+
+kaccess_la_SOURCES = kaccess.cpp main.cpp
+kaccess_la_LDFLAGS = $(all_libraries) -module -avoid-version
+kaccess_la_LIBADD = $(LIB_KDEUI)
+
+kcm_access_la_SOURCES = kcmaccess.cpp
+kcm_access_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_access_la_LIBADD = $(LIB_KIO)
+
+noinst_HEADERS = kcmaccess.h
+
+xdg_apps_DATA = kcmaccess.desktop
+
+services_DATA = kaccess.desktop
+servicesdir = $(kde_servicesdir)
+
+eventsrcdir = $(kde_datadir)/kaccess/
+eventsrc_DATA = eventsrc
+
+messages:
+ $(XGETTEXT) $(kaccess_la_SOURCES) -o $(podir)/kaccess.pot
+ $(XGETTEXT) $(kcm_access_la_SOURCES) -o $(podir)/kcmaccess.pot
diff --git a/kcontrol/access/configure.in.in b/kcontrol/access/configure.in.in
new file mode 100644
index 000000000..170fc8dea
--- /dev/null
+++ b/kcontrol/access/configure.in.in
@@ -0,0 +1,7 @@
+ACCESS_SUBDIR=
+KDE_CHECK_HEADER(X11/extensions/XKBstr.h, ACCESS_SUBDIR=access, ,
+[
+#include <X11/Xlib.h>
+])
+
+AM_CONDITIONAL(include_kcontrol_access, test -n "$ACCESS_SUBDIR")
diff --git a/kcontrol/access/eventsrc b/kcontrol/access/eventsrc
new file mode 100644
index 000000000..185460ec4
--- /dev/null
+++ b/kcontrol/access/eventsrc
@@ -0,0 +1,1072 @@
+[!Global!]
+IconName=kaccess
+Comment=KDE Accessibility Tool
+Comment[af]=KDE toeganklikheid program
+Comment[be]=Інструмент даступнасці KDE
+Comment[bg]=Равностоен достъп
+Comment[bn]=কে.ডি.ই. সহায়ক প্রযুক্তি টুল
+Comment[br]=Ostilh haezadusted KDE
+Comment[bs]=KDE alat za pristupačnost
+Comment[ca]=Eina d'accessibilitat KDE
+Comment[cs]=KDE nástroj pro zpřístupnění
+Comment[csb]=Nôrzãdze pòmòcë przistãpù KDE
+Comment[cy]=Erfyn Hygyrchedd KDE
+Comment[da]=KDE Tilgængelighedsværktøj
+Comment[de]=KDE-Dienstprogramm für Zugangshilfen
+Comment[el]=Εργαλείο προσβασιμότητας του KDE
+Comment[eo]=KDE-ilo por Alirebleco
+Comment[es]=Herramienta de accesibilidad de KDE
+Comment[et]=KDE hõlbustusvahend
+Comment[eu]=KDEren erabilerraztasun tresna
+Comment[fa]=ابزار دستیابی‌پذیری KDE
+Comment[fi]=KDE:n helppokäyttötoiminnot
+Comment[fr]=Outil d'accessibilité de KDE
+Comment[fy]=KDE Tagonklikens
+Comment[ga]=Uirlis Inrochtaineachta KDE
+Comment[gl]=Ferramenta de Acesibilidade de KDE
+Comment[he]=כלי הנגישות של KDE
+Comment[hr]=KDE alat pristupačnosti
+Comment[hu]=KDE kezelési segédeszköz
+Comment[is]=KDE aðgengistól
+Comment[it]=Strumento per l'accessibilità di KDE
+Comment[ja]=KDE アクセシビリティ支援ツール
+Comment[ka]=KDE დამხმარე საშუალებები
+Comment[kk]=KDE арнайы мүмкіндіктері
+Comment[km]=ឧបករណ៍​មធ្យោបាយ​ងាយស្រួល KDE
+Comment[ko]=KDE 접근성 도구
+Comment[mk]=Алатка за пристапливост во KDE
+Comment[ms]=Alatan Kebolehcapaian KDE
+Comment[nb]=Tilgjengelighetsverktøy for KDE
+Comment[nds]=KDE-Warktüüch för Behinnerte
+Comment[ne]=KDE पहुँचयोग्य उपकरण
+Comment[nl]=KDE Toegankelijkheid
+Comment[nn]=Tilgjengeverktøy for KDE
+Comment[pa]=KDE ਸਹੂਲਤ ਸੰਦ
+Comment[pl]=Narzędzie ułatwień dostępu KDE
+Comment[pt]=Ferramenta de Acessibilidade do KDE
+Comment[pt_BR]=Ferramenta de Acessibilidade do KDE
+Comment[ro]=Utilitar de accesibilitate pentru KDE
+Comment[ru]=Специальные возможности
+Comment[se]=KDE reaidu álkkibut geavaheami várás
+Comment[sk]=Nástroj na sprístupnenie KDE
+Comment[sl]=Orodje za dostopnost KDE
+Comment[sr]=KDE алатка за приступачност
+Comment[sr@Latn]=KDE alatka za pristupačnost
+Comment[sv]=Handikappverktyg för KDE
+Comment[tg]=Барномаи Тавонёбии KDE
+Comment[th]=เครื่องมือช่วยใช้งานโปรแกรม KDE
+Comment[tr]=KDE Erişilebilirlik Aracı
+Comment[uk]=Засіб доступності для KDE
+Comment[uz]=KDE qulaylik vositasi
+Comment[uz@cyrillic]=KDE қулайлик воситаси
+Comment[vi]=Công cụ hỗ trợ người tàn tật cho KDE
+Comment[wa]=Usteye d' accessibilité KDE
+Comment[zh_CN]=KDE 辅助工具
+Comment[zh_TW]=KDE 無障礙工具
+
+[modifierkey-latched]
+Name=A modifier key has become active
+Name[af]='n Verandering sleutel was geaktiveer
+Name[be]=Задзейнічаная клавіша мадыфікацыі
+Name[bg]=Клавиш модификатор е активен
+Name[bn]=একটি মডিফায়ার কী সক্রিয় হয়েছে
+Name[bs]=Modifikatorska tipka je postala aktivna
+Name[ca]=S'ha activat una tecla modificadora
+Name[cs]=Modifikační klávesa se stala aktivní
+Name[csb]=Klawisza zjinaczi ùstôła włączonô
+Name[da]=En ændringstast er blevet aktiv
+Name[de]=Eine Sondertaste ist aktiv
+Name[el]=Ενεργοποιήθηκε ένα πλήκτρο τροποποιητή
+Name[eo]=Modifigita klavo aktiviĝis
+Name[es]=Se ha activado una tecla modificadora
+Name[et]=Muuteklahv muutus aktiivseks
+Name[eu]=Tekla aldatzaile bat aktibatu da
+Name[fa]=کلید تغییردهنده فعال شده است
+Name[fi]=Muunnosnäppäin on aktivoitunut
+Name[fr]=Une touche de modification est devenue active
+Name[fy]=In modifkaasjetoets wurdt aktyf
+Name[gl]=Activou-se unha tecla modificadora
+Name[hr]=Tipka modifikatora je aktivirana
+Name[hu]=Egy módosító billentyű aktívvá vált
+Name[is]=Breytilykill er nú virkur
+Name[it]=Un tasto modificatore è diventato attivo
+Name[ja]=修飾キーがアクティブになりました
+Name[kk]=Түрлендіру пернесі белсендірілді
+Name[km]=គ្រាប់ចុច​កែប្រែ​មួយ​សកម្ម
+Name[ko]=수정자 키가 활성화됨
+Name[lt]=Modifikavimo klavišas tapo aktyvus
+Name[mk]=Некое копче за модификација стана активно
+Name[nb]=En valgtast er tatt i bruk
+Name[nds]=En Sünnertast is nu aktiv
+Name[ne]=परिमार्जक कुञ्जी सक्रिय बनेको छ
+Name[nl]=Een modificatietoets is geactiveerd
+Name[nn]=Ein valtast er teken i bruk
+Name[pa]=ਇੱਕ ਸਵਿੱਚ ਸੋਧਕ ਸਰਗਰਮ ਹੋ ਗਿਆ ਹA
+Name[pl]=Klawisz modyfikujący został włączony
+Name[pt]=Uma tecla modificadora ficou activa
+Name[pt_BR]=Uma tecla modificadora tornou-se ativa
+Name[ro]=Un modificator de taste a devenit activ
+Name[ru]=Нажата клавиша модификатора
+Name[se]=Válljenboallu lea aktiverejuvvon
+Name[sk]=Modifikačný kláves je aktivovaný.
+Name[sl]=Spremenilna tipka je omogočena
+Name[sr]=Модификаторски тастер је активиран
+Name[sr@Latn]=Modifikatorski taster je aktiviran
+Name[sv]=En väljartangent har aktiverats
+Name[tg]=Калиди ислоҳгар фаъол карда шуд
+Name[th]=ปุ่มสำหรับเปลี่ยนหน้าที่ถูกเปิดใช้งาน
+Name[uk]=Клавішу-модифікатор активовано
+Name[vi]=Một phím bổ trợ đã được kích hoạt
+Name[wa]=Ene tape di candjmint s' a rtrové en alaedje
+Name[zh_CN]=修饰键变为激活
+Name[zh_TW]=輔助按鍵值已變為作用中
+Comment=A modifier key (e.g. Shift or Ctrl) has changed its state and is now active
+Comment[af]='n Verandering sleutel (bv. Shift of Control) se toestand het verander en is nou aktief
+Comment[be]=Клавіша мадыфікацыі (напр. Shift ці Ctrl) змяніла свой стан і зрабілася актыўнай
+Comment[bg]=Клавиш модификатор (Shift или Ctrl) си промени състоянието и е активен сега
+Comment[bn]=একটি মডিফায়ার কী (e.g. Shift বা Ctrl) অবস্থা পরিবর্তন করে এখন সক্রিয় হয়েছে
+Comment[bs]=Modifikatorska tipka (npr. Shift ili Ctrl) je promijenila stanje i postala je aktivna
+Comment[ca]=Una tecla modificadora (p.ex. Majús o Ctrl) ha canviat d'estat i ara està activa
+Comment[cs]=Modifikační kláves (např. Shift nebo Control) změnila svůj stav a je nyní aktivní.
+Comment[csb]=Klawisza zjinaczi (n.p. Shift czë Control) zmieniła stón ë je terô aktiwnô
+Comment[da]=En ændringstast (f.eks., Shift eller Ctrl) har ændret sin tilstand og er nu aktiv
+Comment[de]=Eine Sondertaste (z. B. Umschalt oder Strg) hat ihren Status geändert und ist jetzt aktiv
+Comment[el]=Άλλαξε η κατάσταση ενός πλήκτρου τροποποιητή (π.χ. Shift ή Control) και τώρα είναι ενεργό
+Comment[eo]=Modifa klavo (ekz. majuskliga klavo aŭ stirklavo) ŝanĝis sian staton kaj nun estas aktiva
+Comment[es]=Una tecla modificadora (p.ej. Mayúsculas o Control) ha cambiado su estado y está activa ahora
+Comment[et]=Muuteklahv (nt. Shift või Ctrl) muutis oma olekut ning on nüüd aktiivne
+Comment[eu]=Tekla aldatzaile bat (hau da, Shift edo Kontrol) egoeraz aldatu da eta orain aktiboa da
+Comment[fa]=یک کلید تغییردهنده )مثلاًً، تبدیل یا مهار( وضعیت خود را تغییر داده و اکنون فعال می‌باشد
+Comment[fi]=Muunnosnäppäin (esim. Shift tai Ctrl) on vaihtanut tilaa ja on nyt aktiivinen
+Comment[fr]=L'état d'une touche de modification (ex : Maj ou Ctrl) est modifié et elle est maintenant active
+Comment[fy]=De tastân fan in modifikaasjetoets (sa as Shift of Control) is feroare en is no aktyf.
+Comment[gl]=Unha tecla modificadora (ex. Alt ou Control) mudou de estado e agora está activa
+Comment[hr]=Tipka modifikatora (npr. Shift ili Ctrl) promijenila je svoje stanje i sad je aktivna
+Comment[hu]=Egy módosító billentyű (pl. a Shift vagy a Ctrl) állapota aktívvá változott
+Comment[is]=Breytilykill (Shift eða Ctrl) hefur breytt um stöðu og er nú virkur
+Comment[it]=Un tasto modificatore (es. Shift o Ctrl) ha cambiato stato ed è diventato attivo
+Comment[ja]=修飾キー (Shift や Ctrl など) の状態が変更され、アクティブになりました
+Comment[kk]=Түрледіру пернесі (Shift я Control секілді) күйін өзгертіп, енді белсенді
+Comment[km]=គ្រាប់ចុច​កែប្រែ​មួយ (ឧ. ប្តូរ ឬ ពាក្យ​បញ្ជា) បាន​ផ្លាស់ប្តូរ​សភាព​របស់​វា ហើយឥឡូវ​នេះ​សកម្ម
+Comment[ko]=Shift나 Control 키 같은 수정자 키의 상태가 바뀌었고 현재 사용 가능함
+Comment[lt]=Klavišo - modifikatoriaus (pvz., Lyg2(Shift) arba Vald(Ctrl)) būsena pakito ir jis dabar – aktyvus
+Comment[mk]=Некое копче за модификација (пр. Shift или Ctrl) си ја смени состојбата и сега е активно
+Comment[nb]=En valgtast (f.eks. «Shift» eller «Control») har endret status og er i bruk.
+Comment[nds]=En Sünnertast (t.B. Ümschalt oder Strg) hett den Tostand ännert un is nu aktiv
+Comment[ne]= परिमार्जक कुञ्जीले (जस्तै: Shift वा Ctrl) यसको स्थीति परिवर्तन गरेको छ र अहिले सक्रिय छ
+Comment[nl]=De status van een modificatietoets (zoals Shift of Control) is gewijzigd en is nu actief
+Comment[nn]=Ein valtast (t.d. «Shift» eller «Control») har endra statusen og er no i bruk
+Comment[pl]=Klawisz modyfikujący (np. Shift lub Ctrl) zmienił stan i jest teraz włączony
+Comment[pt]=Uma tecla modificadora (p.ex., o Shift ou o Ctrl) mudou o seu estado e ficou activa
+Comment[pt_BR]=Uma tecla modificadora (p.ex. Shift ou Ctrl) mudou seu estado e agora está ativa
+Comment[ro]=Un modificator de taste (cum ar fi Shift sau Ctrl) și-a schimbat starea și este acum activ
+Comment[ru]=Нажата клавиша модификатора (например, Shift или Ctrl)
+Comment[sk]=Modifikačný kláves (napr. Shift alebo Ctrl) zmenil svoj stav a je teraz aktívny.
+Comment[sl]=Spremenilna tipka (npr. Shift ali Ctrl) je spremenila svoje stanje in je sedaj omogočena
+Comment[sr]=Модификаторски тастер (нпр. Shift или Control) је променио стање и сада је активан
+Comment[sr@Latn]=Modifikatorski taster (npr. Shift ili Control) je promenio stanje i sada je aktivan
+Comment[sv]=En väljartangent (t.ex. Skift eller Ctrl) har ändrat tillstånd och är nu aktiv
+Comment[tg]=Калиди ислоҳгар (мисоли, Shift ё Ctrl) вазъияти худ иваз кард ва ҳозир фаъол аст
+Comment[th]=มีการเปลี่ยนสถานะปุ่มสำหรับเปลี่ยนหน้าที่ (เช่น Shift หรือ Control) และขณะนี้ เปิดใช้งาน
+Comment[uk]=Клавіша-модифікатор (напр., Shift або Control) змінила свій стан і тепер активна
+Comment[vi]=Một phím bổ trợ (như Shift hay Ctrl) đã thay đổi trạng thái và được kích hoạt
+Comment[wa]=Ene tape di candjmint (metans SHIFT ou CTRL) a candjî si-estat et est asteure en alaedje
+Comment[zh_CN]=修饰键(即 Shift 或 Ctrl)更改了其状态,现已激活
+Comment[zh_TW]=輔助按鍵 (例, Shift 或 Control) 已改變其狀態且目前為作用中
+default_sound=KDE_Click.wav
+default_presentation=0
+nopresentation=236
+
+[modifierkey-unlatched]
+Name=A modifier key has become inactive
+Name[af]='n Verandering sleutel was gedeaktiveer
+Name[be]=Клавіша мадыфікацыі зрабілася неактыўнай
+Name[bg]=Клавиш модификатор е неактивен
+Name[bn]=একটি মডিফায়ার কী নিষ্ক্রীয় হয়েছে
+Name[bs]=Modifikatorska tipka je postala neaktivna
+Name[ca]=S'ha desactivat una tecla modificadora
+Name[cs]=Modifikační klávesa se stala neaktivní
+Name[csb]=Klawisza zjinaczi òstałą włączonô
+Name[da]=En ændringstast er blevet deaktiveret
+Name[de]=Eine Sondertaste ist nicht mehr aktiv
+Name[el]=Απενεργοποιήθηκε ένα πλήκτρο τροποποιητή
+Name[eo]=Modifa klavo malaktiviĝis
+Name[es]=Se ha desactivado una tecla modificadora
+Name[et]=Muuteklahv muutus mitteaktiivseks
+Name[eu]=Tekla aldatzaile bat desaktibatu da
+Name[fa]=کلید تغییردهنده غیرفعال شده است
+Name[fi]=Muunnosnäppäin ei ole enää aktiivinen
+Name[fr]=Une touche de modification est devenue inactive
+Name[fy]=In modifikaasjetoets wurdt ynaktief
+Name[gl]=Unha tecla modificadora foi desactivada
+Name[hr]=Tipka modifikatora je deaktivirana
+Name[hu]=Egy módosító billentyű inaktívvá vált
+Name[is]=Breytilykill er nú óvirkur
+Name[it]=Un tasto modificatore è diventato inattivo
+Name[ja]=修飾キーが非アクティブになりました
+Name[kk]=Түрлендіру пернесі белсендігін жоғалтты
+Name[km]=គ្រាប់ចុច​កែប្រែ​មួយ​អសកម្ម​ហើយ
+Name[ko]=수정자 키가 비활성화됨
+Name[lt]=Klavišas - modifikatorius tapo neaktyvus
+Name[mk]=Некое копче за модификација стана неактивно
+Name[nb]=En valgtast er blitt skrudd av
+Name[nds]=En Sünnertast is nich mehr aktiv
+Name[ne]=परिमार्जक कुञ्जी निस्क्रिय बनेको छ
+Name[nl]=Een modificatietoets is gedeactiveerd
+Name[nn]=Ein valtast er slått av
+Name[pl]=Klawisz modyfikujący został wyłączony
+Name[pt]=Uma tecla modificadora ficou inactiva
+Name[pt_BR]=Uma tecla modificadora tornou-se inativa
+Name[ro]=Un modificator de taste a devenit inactiv
+Name[ru]=Отжата клавиша модификатора
+Name[se]=Válljenboallu ii leat šat aktiivalaš
+Name[sk]=Modifikačný kláves je neaktívny.
+Name[sl]=Spremenilna tipka je onemogočena
+Name[sr]=Модификаторски тастер је деактивиран
+Name[sr@Latn]=Modifikatorski taster je deaktiviran
+Name[sv]=En väljartangent har inaktiverats
+Name[tg]=Калиди ислоҳгар ғайри фаъол карда шуд
+Name[th]=ปุ่มสำหรับเปลี่ยนหน้าที่ถูกปิดการใช้งาน
+Name[uk]=Клавішу-модифікатор деактивовано
+Name[vi]=Một phím bổ trợ đã bị tắt
+Name[wa]=Ene tape di candjmint s' a rtrové dismetowe
+Name[zh_CN]=修饰键变为非激活
+Name[zh_TW]=輔助按鍵已變為非作用中
+Comment=A modifier key (e.g. Shift or Ctrl) has changed its state and is now inactive
+Comment[af]='n Verandering sleutel (bv. Shift of Contorl) se toestand het verander en is nou onaktief
+Comment[be]=Клавіша мадыфікацыі (напр. Shift ці Ctrl) змяніла свой стан і зрабілася неактыўнай
+Comment[bg]=Клавиш модификатор (Shift или Ctrl) си промени състоянието и е неактивен сега
+Comment[bn]=একটি মডিফায়ার কী (e.g. Shift বা Ctrl) অবস্থা পরিবর্তন করে এখন নিষ্ক্রীয় হয়েছে
+Comment[bs]=Modifikatorska tipka (npr. Shift ili Ctrl) je promijenila stanje i sada je neaktivna
+Comment[ca]=Una tecla modificadora (p.ex. Majús o Ctrl) ha canviat d'estat i ara està inactiva
+Comment[cs]=Modifikační kláves (např. Shift nebo Control) změnila svůj stav a je nyní neaktivní.
+Comment[csb]=Klawisza zjinaczi (n.p. Shift czë Control) zmieniła stón ë je terô aktiwnô
+Comment[da]=En ændringstast (f.eks., Shift eller Ctrl) har ændret sin tilstand og er nu inaktiv
+Comment[de]=Eine Sondertaste (z. B. Umschalt oder Strg) hat ihren Status geändert und ist jetzt inaktiv
+Comment[el]=Άλλαξε η κατάσταση ενός πλήκτρου τροποποιητή (π.χ. Shift ή Control) και τώρα είναι ανενεργό
+Comment[eo]=Modifa klavo (ekz. majuskliga klavo aŭ stirklavo) ŝanĝis sian staton kaj nun estas malaktiva
+Comment[es]=Una tecla modificadora (p.ej. Mayúsculas o Control) ha cambiado su estado y ahora está inactiva
+Comment[et]=Muuteklahv (nt. Shift või Ctrl) muutis oma olekut ning on nüüd mitteaktiivne
+Comment[eu]=Tekla aldatzaile bat (hau da, Shift edo Kontrol) egoeraz aldatu da eta orain inaktiboa da
+Comment[fa]=یک کلید تغییردهنده )مثلاً، تبدیل یا مهار( وضعیت خود را تغییر داده و اکنون غیر‌فعال می‌باشد
+Comment[fi]=Muunnosnäppäin (esim. Shift tai Ctrl) on vaihtanut tilaa eikä ole enää aktiivinen
+Comment[fr]=L'état d'une touche de modification (ex : Maj ou Ctrl) est modifié et elle est maintenant inactive
+Comment[fy]=De tastân fan in modifikaasjetoets (sa as Shift of Control) is feroare en is no ynaktyf.
+Comment[gl]=Unha tecla modificadora (ex. Alt ou Control) mudou de estado e agora está inactiva
+Comment[hr]=Tipka modifikatora (npr. Shift ili Ctrl) promijenila je svoje stanje i sad nije aktivna
+Comment[hu]=Egy módosító billentyű (pl. a Shift vagy a Ctrl) állapota inaktívvá változott
+Comment[is]=Breytilykill (Shift eða Ctrl) hefur breytt um stöðu og er nú óvirkur
+Comment[it]=Un tasto modificatore (es. Shift o Ctrl) ha cambiato stato ed è diventato inattivo
+Comment[ja]=修飾キー (Shift や Ctrl など) の状態が変更され、非アクティブになりました
+Comment[kk]=Түрледіру пернесі (Shift я Control секілді) күйін өзгертіп, енді белсенді емес
+Comment[km]=គ្រាប់​ចុច​កែប្រែ (ឧ. ប្តូរ ឬ បញ្ជា) បាន​ផ្លាស់ប្តូរ​សភាព​របស់វា ហើយ ឥឡូវ​នេះ​អសកម្ម
+Comment[ko]=Shift나 Control 키 같은 수정자 키의 상태가 바뀌었고 현재 사용 불가능함
+Comment[lt]=Klavišo - modifikatoriaus (pvz., Lyg2(Shift) arba Vald(Ctrl)) būsena pakito ir jis dabar - neaktyvus
+Comment[mk]=Некое копче за модификација (пр. Shift или Ctrl) си ја смени состојбата и сега е неактивно
+Comment[nb]=En valgtast (f.eks. «Shift» eller «Ctrl») har endret status og er ikke mer i bruk
+Comment[nds]=En Sünnertast (t.B. Ümschalt oder Strg) hett den Tostand ännert un is nu inaktiv
+Comment[ne]=परिमार्जक कुञ्जीले (जस्तै: Shift वा Ctrl) यसको स्थिति परिवर्तन गरेको छ र अहिले निस्क्रिय छ
+Comment[nl]=De status van een modificatietoets (zoals Shift of Control) is gewijzigd en is nu inactief
+Comment[nn]=Ein valtast (t.d. «Shift» eller «Ctrl») har endra statusen og er ikkje i bruk lenger
+Comment[pl]=Klawisz modyfikujący (np. Shift lub Ctrl) zmienił stan i jest teraz wyłączony
+Comment[pt]=Uma tecla modificadora (p.ex., o Shift ou o Ctrl) mudou o seu estado e ficou inactiva
+Comment[pt_BR]=Uma tecla modificadora (p.ex. Shift ou Ctrl) mudou seu estado e agora está inativa
+Comment[ro]=Un modificator de taste (cum ar fi Shift sau Ctrl) și-a schimbat starea și este acum inactiv
+Comment[ru]=Деактивирована клавиша модификатора (например, Shift или Ctrl)
+Comment[sk]=Modifikačný kláves (napr. Shift alebo Ctrl) zmenil svoj stav a je teraz neaktívny.
+Comment[sl]=Spremenilna tipka (npr. Shift ali Ctrl) je spremenila svoje stanje in je sedaj oneomogočena
+Comment[sr]=Модификаторски тастер (нпр. Shift или Control) је променио стање и више није активан
+Comment[sr@Latn]=Modifikatorski taster (npr. Shift ili Control) je promenio stanje i više nije aktivan
+Comment[sv]=En väljartangent (t.ex. Skift eller Ctrl) har ändrat tillstånd och är nu inaktiv
+Comment[tg]=Калиди ислоҳгар (мисоли, Shift ё Ctrl) вазъияти худ иваз кард ва ҳозир ғайри фаъол аст
+Comment[th]=มีการเปลี่ยนสถานะปุ่มสำหรับเปลี่ยนหน้าที่ (เช่น Shift หรือ Control) และขณะนี้ ถูกปิดการใช้งาน
+Comment[uk]=Клавіша-модифікатор (напр., Shift або Control) змінила свій стан і тепер неактивна
+Comment[vi]=Một phím bổ trợ (như Shift hay Ctrl) đã thay đổi trạng thái và đã bị tắt
+Comment[wa]=Ene tape di candjmint (metans SHIFT ou CTRL) a candjî si-estat et n' est asteure pus en alaedje
+Comment[zh_CN]=修饰键(即 Shift 或 Ctrl)更改了其状态,现已非激活
+Comment[zh_TW]=輔助按鍵 (例, Shift 或 Control) 已改變其狀態且目前為非作用中
+default_sound=KDE_Click.wav
+default_presentation=0
+nopresentation=236
+
+[modifierkey-locked]
+Name=A modifier key has been locked
+Name[af]='n Verandering sleutel was gesluit
+Name[be]=Клавіша мадыфікацыі заблакаваная
+Name[bg]=Клавиш модификатор е заключен
+Name[bn]=একটি মডিফায়ার কী লক করা হয়েছে
+Name[bs]=Modifikatorska tipka je zaključana
+Name[ca]=S'ha bloquejat una tecla modificadora
+Name[cs]=Modifikační klávesa byla zamčena
+Name[csb]=Klawisza zjinaczi òstała zablokòwónô
+Name[da]=En ændringstast er blevet låst
+Name[de]=Eine Sondertaste wurde eingerastet
+Name[el]=Ένα πλήκτρο τροποποιητή κλειδώθηκε
+Name[eo]=Modifa klavo ŝlosiĝis
+Name[es]=Se ha bloqueado una tecla modificadora
+Name[et]=Muuteklahv on lukustatud
+Name[eu]=Tekla aldatzaile bat blokeatu da
+Name[fa]=کلید تغییردهنده قفل شده است
+Name[fi]=Muunnosnäppäin on lukittu
+Name[fr]=Une touche de modification a été verrouillée
+Name[fy]=In modifikaasjetoets is beskoattele
+Name[gl]=Unha tecla modificadora foi bloqueada
+Name[hr]=Tipka modifikatora je zaključana
+Name[hu]=Egy módosító billentyű zárolódott
+Name[is]=Breytilykli hefur verið læst
+Name[it]=Un tasto modificatore è stato bloccato
+Name[ja]=修飾キーがロックされました
+Name[kk]=Түрлендіру пернесі қосулы
+Name[km]=គ្រាប់ចុច​កែប្រែ​មួយ​ត្រូវ​បាន​ចាក់សោ
+Name[ko]=수정자 키가 잠김
+Name[lt]=Klavišas - modifikatorius buvo užrakintas
+Name[mk]=Некое копче за модификација е заклучено
+Name[nb]=En valgtast er blitt låst
+Name[nds]=En Sünnertast wöör fastsett
+Name[ne]=परिमार्जक कुञ्जीमा ताल्चा लागेको छ
+Name[nl]=Een modificatietoets is vergrendeld
+Name[nn]=Ein valtast er blitt låst
+Name[pl]=Klawisz modyfikujący został zablokowany
+Name[pt]=Uma tecla modificadora ficou bloqueada
+Name[pt_BR]=Uma tecla modificadora foi bloqueada
+Name[ro]=Un modificator de taste a fost blocat
+Name[ru]=Клавиша модификатора зафиксирована
+Name[se]=Válljenboallu lea lohkaduvvon
+Name[sk]=Modifikačný kláves je zamknutý
+Name[sl]=Spremenilna tipka je zaklenjena
+Name[sr]=Модификаторски тастер је закључан
+Name[sr@Latn]=Modifikatorski taster je zaključan
+Name[sv]=En väljartangent har låsts
+Name[tg]=Калиди ислоҳгар қулф карда шуд
+Name[th]=ปุ่มเปลี่ยนหน้าที่ค้างอยู่
+Name[uk]=Клавішу-модифікатор заблоковано
+Name[vi]=Một phím bổ trợ đã được khoá
+Name[wa]=Ene tape di candjmint a stî serêye
+Name[zh_CN]=修饰键现已锁定
+Name[zh_TW]=輔助按鍵已經鎖定
+Comment=A modifier key (e.g. Shift or Ctrl) has been locked and is now active for all of the following keypresses
+Comment[af]='n Verandering sleutel (bv. Shift of Control) is gesluit en is nou aktief vir al die volgende sleutel ponse
+Comment[be]=Клавіша мадыфікацыі (напр. Shift ці Ctrl) была заблакаваная і цяпер актыўная для ўсіх наступных націскаў іншых клавішаў
+Comment[bg]=Клавиш модификатор е заключен и е активен за всички последващи клавиши
+Comment[bn]=একটি মডিফায়ার কী (e.g. Shift বা Ctrl) লক করা হয়েছে এবং পরবর্তী সবকটি কী-র (key) জন্য সক্রিয় থাকবে
+Comment[bs]=Modifikatorska tipka (npr. Shift ili Ctrl) je zaključana i sada je aktivna za sve naredne tipke
+Comment[ca]=Una tecla modificadora (p.ex. Majús o Ctrl) s'ha bloquejat i ara està activa per a totes les pulsacions següents
+Comment[cs]=Modifikační klávesa (např. Shift nebo Control) byla zamčena a je nyní aktivní pro všechny následující stisky kláves
+Comment[csb]=Klawisz zjinaczi (np. Shift czë Control) òstôła zablokòwónô ë bãdze altiwòwónô przë nôslédnym wcësniãcô klawiszë
+Comment[da]=En ændringstast (f.eks., Shift eller Ctrl) er blevet låst og er nu aktiv for alle følgende tastetryk
+Comment[de]=Eine Sondertaste (z. B. Umschalt oder Strg) wurde eingerastet und bleibt für alle folgenden Tastendrücke aktiv
+Comment[el]=Ένα πλήκτρο τροποποιητή (π.χ. Shift ή Control) κλειδώθηκε και είναι τώρα ενεργό για τα επόμενα πατήματα πλήκτρων
+Comment[eo]=Modifa klavo (ekz. majuskliga klavo aŭ stirklavo) ŝlosiĝis kaj nun estas aktiva por sekvantaj klavpremoj
+Comment[es]=Se ha bloqueado una tecla modificadora (p. ej. Mayúsculas o Control) y ahora está activa para el resto de las operaciones con el teclado
+Comment[et]=Muuteklahv (nt. Shift või Ctrl) on lukustatud ja on nüüd aktiivne kõikide järgnevate klahvivajutuste jaoks
+Comment[eu]=Tekla aldatzaile bat (hau da, Shift edo Kontrol) blokeatu da eta orain aktiboa da hurrengo tekla zapaketa guztiendako
+Comment[fa]=یک کلید تغییردهنده )مثلاً، تبدیل یا مهار( قفل شده و اکنون برای همۀ فشارهای کلید زیر فعال می‌باشد
+Comment[fi]=Muunnosnäppäin (esim. Shift tai Ctrl) on lukittu ja on nyt aktiivinen kaikille seuraaville näppäinpainalluksille
+Comment[fr]=Une touche de modification (ex : Maj ou Ctrl) a été verrouillée et est maintenant active pour toutes les touches suivantes
+Comment[fy]=In modifikaasjetoets (sa as Shift of Control) is beskoattele en is no aktyf foar de neikommende toetsoanslaggen
+Comment[gl]=Unha tecla modificadora (ex. Alt ou Control) foi bloqueada e agora está activa para as seguintes combinacións
+Comment[hr]=Tipka modifikatora (npr. Shift ili Ctrl) zaključana je i sad je aktivna tijekom svih sljedećih pritisaka na tipke
+Comment[hu]=Egy módosító billentyű (pl. a Shift vagy a Ctrl) zárolódott, és ezután minden billentyűlenyomásnál aktív lesz
+Comment[is]=Breytilykli (Shift eða Ctrl) hefur verið læst og er nú virkur fyrir eftirfarandi lyklaborðsaðgerðir
+Comment[it]=Un tasto modificatore (es. Shift o Ctrl) è stato bloccato e adesso è attivo per le prossime immissioni
+Comment[ja]=修飾キー (Shift や Ctrl など) がロックされ、続くキー押下のすべてに対してアクティブになりました
+Comment[kk]=Түрлендіру пернесі (Shift я Control секілді) қосылып, енді келесі басылатын пернесінің әсерін түрлендіруге дайын
+Comment[km]= គ្រាប់ចុច​កែប្រែ​មួយ (ឧ. ប្តូរ ឬ បញ្ជា) ត្រូវ​បាន​ចាក់សោ ហើយ ឥឡូវ​វាសកម្ម​សម្រាប់​ការសង្កត់​គ្រាប់ចុច​ខាងក្រោម​ទាំងអស់​ ។
+Comment[ko]=Shift나 Control 키 같은 수정자 키의 상태가 바뀌었고 현재 모든 키 입력에 대해서 활성화됨
+Comment[lt]=Klavišas - modifikatorius (pvz., Lyg2(Shift) arba Vald(Ctrl)) buvo užrakintas ir dabar visiems būsimiems klavišų paspaudimams yra aktyvus
+Comment[mk]=Некое копче за модификација (пр. Shift или Ctrl) беше заклучено и сега е активно за сите наредни притиснати копчиња
+Comment[nb]=En valgtast (f.eks. «Shift» eller «Ctrl») er blitt låst og er nå tilgjengelig for alle de følgende tastetrykkene
+Comment[nds]=En Sünnertast (t.B. Ümschalt oder Strg) wöör fastsett un is nu aktiv för dat Drücken vun all nakamen Tasten
+Comment[ne]=परिमार्जक कुञ्जीमा (जस्तै: Shift वा Ctrl) ताल्चा लागेको छ र अहिले निम्न कुञ्जी थिच्नेहरू सबैका लागि सक्रिय छन्
+Comment[nl]=Een modificatietoets (zoals Shift of Control) is vergrendeld en is nu actief voor de volgende toetsaanslagen
+Comment[nn]=Ein valtast (t.d. «Shift» eller «Ctrl») er blitt låst og vert no bruka saman med alle følgjande tastetrykk
+Comment[pl]=Klawisz modyfikujący (np. Shift lub Ctrl) został zablokowany i będzie włączony przy następnych naciśnięciach klawiszy
+Comment[pt]=Uma tecla modificadora (p.ex., o Shift ou o Ctrl) ficou bloqueada e está agora activa para todas as sequências de teclas seguintes
+Comment[pt_BR]=Uma tecla modificadora (p.ex. Shift ou Ctrl) foi bloqueada e agora está ativa para todas as seqüências de teclas seguintes
+Comment[ro]=Un modificator de taste (cum ar fi Shift sau Ctrl) a fost blocat și este acum activ pentru următoarele apăsări de taste
+Comment[ru]=Клавиша модификатора (например, Shift или Ctrl) зафиксирована и активна при нажатии любых других клавиш
+Comment[sk]=Modifikačný kláves (napr. Shift alebo Ctrl) je zamknutý a je teraz aktívny pre všetky nasledujúce stlačenia kláves
+Comment[sl]=Spremenilna tipka (npr. Shift ali Ctrl) je zaklenjena in je sedaj omogočena za vse tipkanje v nadaljnje
+Comment[sr]=Модификаторски тастер (нпр. Shift или Control) је закључан и сада је активан за све наредне притиске тастера
+Comment[sr@Latn]=Modifikatorski taster (npr. Shift ili Control) je zaključan i sada je aktivan za sve naredne pritiske tastera
+Comment[sv]=En väljartangent (t.ex. Skift eller Ctrl) har låsts och är nu aktiv för alla följande tangentnertryckningar
+Comment[tg]=Калиди ислоҳгар (мисоли, Shift ё Ctrl) қулф карда буд лекин ҳозир ин фаъол аст барои ҳамаи пахшзаданиҳои оянда
+Comment[th]=ปุ่มสำหรับเปลี่ยนหน้าที่ (เช่น Shift หรือ Control) ค้างอยู่ และขณะนี้จะถูกใช้งาน สำหรับการกดคีย์อื่นๆ ต่อจากนี้ทั้งหมด
+Comment[uk]=Клавіша-модифікатор (напр., Shift або Control) була заблокована і тепер активна для всіх наступних натискань клавіш
+Comment[vi]=Một phím bổ trợ (như Shift hay Ctrl) đã được khoá và từ giờ bạn có thể dùng nó khi gõ bàn phím
+Comment[wa]=Ene tape di candjmint (metans SHIFT ou CTRL) a stî serêye et est asteure en alaedje po tos les tapes di tchôkeyes.
+Comment[zh_CN]=修饰键(即 Shift 或 Ctrl)已被锁定,现在将适用于后续按键
+Comment[zh_TW]=輔助按鍵 (例, Shift 或 Control) 已經鎖定且目前對所有下列按下按鍵的動作為作用中
+default_sound=KDE_Click.wav
+default_presentation=0
+nopresentation=236
+
+[lockkey-locked]
+Name=A lock key has been activated
+Name[af]='n Sluit sleutel was geaktiveer
+Name[be]=Клавіша блакіроўкі задзейнічаная
+Name[bg]=Заключващ клавиш бе активиран
+Name[bs]=Aktivirana je tipka za zaključavanje
+Name[ca]=S'ha activat una tecla de bloqueig
+Name[cs]=Klávesa zámku byla aktivována
+Name[csb]=Klawisza blokadë je aktiwòwónô
+Name[da]=En låsetast er blevet aktiveret
+Name[de]=Eine Feststelltaste wurde aktiviert
+Name[el]=Ένα πλήκτρο τροποποιητή ξεκλειδώθηκε
+Name[eo]=Ŝlosa klavo aktiviĝis
+Name[es]=Una tecla de bloqueo se ha activado
+Name[et]=Lukustusklahv on aktiveeritud
+Name[eu]=Tekla blokeaketa aktibatu da
+Name[fa]=یک کلید قفل فعال شده است
+Name[fi]=Lukitusnäppäin on aktivoitu
+Name[fr]=Une touche de verrouillage a été activée
+Name[fy]=In beskoatteltoets is aktivearre
+Name[gl]=Activou-se unha tecla de bloqueo
+Name[he]=מקש ננעל הופעל
+Name[hr]=Tipka zaključavanja je aktivirana
+Name[hu]=Egy zároló billentyű aktívvá vált
+Name[is]=Læsilykill hefur verið virkjaður
+Name[it]=Un tasto di blocco è stato attivato
+Name[ja]=ロックキーがアクティブになりました
+Name[ka]=დაბლოკვის ღილაკი გააქტივებულია
+Name[kk]=Қосқыш перне белсенді
+Name[km]=ការ​ចាក់សោ​គ្រាប់​ចុច​ត្រូវ​បាន​ធ្វើ​ឲ្យ​សកម្ម
+Name[ko]=잠금 키가 활성화됨
+Name[lt]=Užrakto klavišas buvo aktyvuotas
+Name[mk]=Некое копче за заклучување беше активирано
+Name[nb]=En valgtast er blitt skrudd på
+Name[nds]=En Faststelltast is nu aktiv
+Name[ne]=एउटा ताल्चा लगाएको कुञ्जी सक्रिय पारिएको छ
+Name[nl]=Een vergrendeltoets is geactiveerd
+Name[nn]=Ein låsetast er blitt slått på
+Name[pl]=Klawisz blokujący został włączony
+Name[pt]=Uma tecla de bloqueio ficou activa
+Name[pt_BR]=Uma tecla de bloqueio foi ativada
+Name[ro]=O tastă de blocare a fost activată
+Name[ru]=Активирована клавиша переключения режимов
+Name[se]=Lohkadanboallu lea aktiverejuvvon
+Name[sk]=Zamykací kláves je aktivny.
+Name[sl]=Zaklenilna tipka je omogočena
+Name[sr]=Тастер за закључавање је активиран
+Name[sr@Latn]=Taster za zaključavanje je aktiviran
+Name[sv]=En låstangent har aktiverats
+Name[tg]=Калиди қулф фаъол карда шуд
+Name[th]=ปุ่มล็อคเปิดใช้งาน
+Name[uk]=Клавішу блокування активовано
+Name[vi]=Một phím khoá đã được kích hoạt
+Name[wa]=Ene tape po serer a stî metowe en alaedje
+Name[zh_CN]=锁定键现已激活
+Name[zh_TW]=鎖定鍵已作用
+Comment=A lock key (e.g. Caps Lock or Num Lock) has changed its state and is now active
+Comment[af]='n Sluit sleutel (bv. Caps Lock of Num Lock) se toestand het verander en is nou aktief
+Comment[be]=Клавіша блакіроўкі (напр. Caps Lock ці Num Lock) змяніла свой стан і зрабілася актыўнай
+Comment[bg]=Заключващ клавиш (Caps Lock или Num Lock) си промени състоянието и е неактивен сега
+Comment[bs]=Tipka za zaključavanje (npr. Caps Lock ili Num Lock) je promijenila stanje i sada je aktivna
+Comment[ca]=Una tecla de bloqueig (p.ex. BloqMajús o BloqNum) ha canviat d'estat i ara està activa
+Comment[cs]=Klávesa zámku (např. Caps Lock nebo Num Lock) změnila svůj stav a je nyní aktivní
+Comment[csb]=Klawisza blokadë (np. Caps Lock czë Num Lock) zmieniłą stón ë nie je terô aktiwnô
+Comment[da]=En låsetast (f.eks., Caps Lock eller Num Lock) har ændret sin tilstand og er nu aktiv
+Comment[de]=Eine Feststelltaste (z. B. die Hochstelltaste oder Num-Lock) hat ihren Status geändert und ist nun aktiv
+Comment[el]=Ένα πλήκτρο κλειδώματος (π.χ. Caps Lock ή Num Lock) άλλαξε κατάσταση και είναι τώρα ανενεργό
+Comment[eo]=Ŝlosa klavo (ekz. majuskla baskulo aŭ Cifera baskulo) ŝanĝis sian staton kaj nun estas aktiva
+Comment[es]=Una tecla de bloqueo (p. ej., Bloq Mayús o Bloq Num) ha cambiado su estado y ahora está inactiva
+Comment[et]=Lukustusklahv (nt. Caps Lock või Num Lock) muutis oma seisundit ning on nüüd mitteaktiivne
+Comment[eu]=Tekla blokeatzaile bat (hau da, blok. maius. edo blok. zenb.) egoeraz aldatu da eta orain aktiboa da
+Comment[fa]=یک کلید قفل )مثلاً ، قفل تبدیل یا قفل اعداد( وضعیت خود را تغییر داده و اکنون غیرفعال می‌باشد
+Comment[fi]=Lukitusnäppäin (esim. CapsLock tai NumLock) on vaihtanut tilaansa ja on nyt aktiivinen
+Comment[fr]=L'état d'une touche de verrouillage (ex : Verr. Maj ou Verr. Num.) est modifié et elle est maintenant inactive
+Comment[fy]=De tastân fan in beskoatteltoets (sa as kaptaalskoattel of Nûm skoattel) is wizige en is no ynaktyf.
+Comment[gl]=Unha tecla de bloqueo (ex., Bloq Maius ou Bloq Num) mudou de estado e agora está activa
+Comment[he]=מקש ננעל (למשל Caps Lock או Num Lock) שינה את מצבו והוא כעת פעיל
+Comment[hr]=Tipka zaključavanja (npr. CapsLock ili NumLock) promijenila je svoje stanje i sad je aktivna
+Comment[hu]=Egy zároló billentyű (pl. a Caps Lock vagy a Num Lock) állapota aktívvá vált
+Comment[is]=Læsilykill (Caps Lock eða Num Lock) hefur breytt um stöðu og er nú virkur
+Comment[it]=Un tasto di blocco (es. Bloc Maiusc o Bloc Num) ha cambiato stato e adesso è inattivo
+Comment[ja]=ロックキー (Caps Lock や Num Lock など) の状態が変更され、アクティブになりました
+Comment[kk]=Қосқыш перне (Caps Lock я Num Lock) күйін өзгертіп, енді белсенді
+Comment[km]=គ្រាប់​ចុច​ចាក់សោ (ឧ. ប្តូរ​ជាប់ ឬ Num Lock) បាន​ផ្លាស់ប្តូរ​សភាព​របស់​វា ហើយ ឥឡូវ​នេះ​វាអសកម្ម
+Comment[ko]=Caps Lock이나 Num Lock 키 같은 잠금 키의 상태가 바뀌었고 현재 활성화됨
+Comment[lt]=Užrakto klavišo (pvz., Didž(Caps Lock) arba Sk(Num Lock)) būsena pakito ir jis dabar - aktyvus
+Comment[mk]=Некое копче за заклучување (пр. Caps Lock или Num Lock) си ја смени состојбата и сега е неактивно
+Comment[nb]=En låsetast (f.eks. «Caps Lock» eller «Num lock») har endret status og er nå skrudd på.
+Comment[nds]=En Faststelltast (t.B. Tallenrast oder Grootschrieventast) hett den Tostand ännert un is nu aktiv
+Comment[ne]=एउटा ताल्चा लगाउने कुञ्जीले (जस्तै: Caps Lock वा Num Lock) यसको स्थिति परिवर्तन गरेको छ र अहिले सक्रिय छ
+Comment[nl]=De status van een vergrendeltoets (zoals Caps Lock of Num Lock) is gewijzigd en is nu inactief
+Comment[nn]=Ein låsetast (t.d. «Caps Lock» eller «Num lock») har endra statusen og er no slått på
+Comment[pl]=Klawisz blokujący (np. Caps Lock lub Num Lock) zmienił stan i jest teraz wyłączony
+Comment[pt]=Uma tecla de bloqueio (p.ex., o Caps Lock ou o Num Lock) mudou o seu estado e ficou activa
+Comment[pt_BR]=Uma tecla de bloqueio (p.ex. Caps Lock ou Num Lock) mudou seu estado e agora está ativa
+Comment[ro]=O tastă de blocare (cur ar fi Caps Lock sau Num Lock) și-a schimbat starea și este acum activă
+Comment[ru]=Активирована клавиша переключения режимов (например, Caps Lock или Num Lock)
+Comment[sk]=Zamykací kláves (napr. Caps Lock alebo Num Lock) zmenil svoj stav a je teraz aktívny.
+Comment[sl]=Zaklenilna tipka (npr. Caps Lock ali Num Lock) je spremenila svoje stanje in je sedaj omogočena
+Comment[sr]=Тастер за закључавање (нпр. Caps Lock или Num Lock) је променио стање и сада је активан
+Comment[sr@Latn]=Taster za zaključavanje (npr. Caps Lock ili Num Lock) je promenio stanje i sada je aktivan
+Comment[sv]=En låstangent (t.ex. Caps Lock eller Num Lock) har ändrat tillstånd och är nu aktiv
+Comment[tg]=Калиди қулф (мисоли, Caps Lock ё Num Lock) вазъияти худ иваз кард ва ҳозир фаъол аст
+Comment[th]=มีการเปลี่ยนสถานะปุ่มล็อค (เช่น Caps Lock หรือ Num Lock) และขณะนี้เปิดการใช้งาน
+Comment[uk]=Клавіша блокування (напр., Caps Lock або Num Lock) змінила свій стан і тепер активна
+Comment[vi]=Một phím khoá (như Caps Lock hay Num Lock) đã thay đổi trạng thái và được kích hoạt
+Comment[wa]=Ene tape po serer (metans CAPS LOCK ou NUM LOCK) a candjî d' esta et est asteure en alaedje
+Comment[zh_CN]=锁定键(如 Caps Lock 或 Num Lock)更改了其状态,现已非激活
+Comment[zh_TW]=鎖定按鍵(例, 大寫鎖定或數字鎖定)已改變其狀態且目前為作用中
+default_sound=KDE_Click.wav
+default_presentation=0
+nopresentation=236
+
+[lockkey-unlocked]
+Name=A lock key has been deactivated
+Name[af]='n Sluit sleutel was gedeaktiveer
+Name[be]=Клавіша блакіроўкі зрабілася неактыўнай
+Name[bg]=Заключващ клавиш бе деактивиран
+Name[bs]=Tipka za zaključavanje je deaktivirana
+Name[ca]=S'ha desactivat una tecla de bloqueig
+Name[cs]=Klávesa zámku byla deaktivována
+Name[csb]=Klawisza blokadë nie je aktiwnô
+Name[da]=En låsetast er blevet deaktiveret
+Name[de]=Eine Feststelltaste wurde deaktiviert
+Name[el]=Ένα πλήκτρο κλειδώματος απενεργοποιήθηκε
+Name[eo]=Ŝlosa klavo malaktiviĝis
+Name[es]=Una tecla de bloqueo se ha desactivado
+Name[et]=Lukustusklahv on nüüd mitteaktiivne
+Name[eu]=Tekla blokeaketa desaktibatu da
+Name[fa]=کلید قفل غیرفعال شده است
+Name[fi]=Lukitusnäppäin on nyt deaktivoitu
+Name[fr]=Une touche de verrouillage a été désactivée
+Name[fy]=In beskoatteltoets is ûntaktivearre
+Name[gl]=Unha tecla de bloqueo foi desactivada
+Name[he]=מקש ננעל נכבה
+Name[hr]=Tipka zaključavanja je deaktivirana
+Name[hu]=Egy zároló billentyű inaktívvá vált
+Name[is]=Læsilykill hefur verið aftengdur
+Name[it]=Un tasto di blocco è stato disattivato
+Name[ja]=ロックキーが非アクティブになりました
+Name[ka]=დაბლოკვის ღილაკი ამორთულია
+Name[kk]=Қосқыш перне өшіруілі
+Name[km]=គ្រាប់ចុច​ចាក់សោ​ត្រូវ​បាន​ធ្វើ​ឲ្យ​អសកម្ម
+Name[ko]=잠금 키가 비활성화됨
+Name[lt]=Užrakto klavišas buvo išjungtas
+Name[mk]=Некое копче за заклучување беше активирано
+Name[nb]=En låsetast er blitt skrudd av
+Name[nds]=En Faststelltast is nu nich mehr aktiv
+Name[ne]=एउटा ताल्चा लगाउने कुञ्जी निस्क्रिय पारिएको छ
+Name[nl]=Een vergrendeltoets is gedeactiveerd
+Name[nn]=Ein låsetast er blitt slått av
+Name[pl]=Klawisz blokujący został wyłączony
+Name[pt]=Uma tecla de bloqueio ficou inactiva
+Name[pt_BR]=Uma tecla de bloqueio foi desativada
+Name[ro]=O tastă de blocare a fost deactivată
+Name[ru]=Деактивирована клавиша переключения режимов
+Name[se]=Lohkadanboallu ii leat šat aktiivalaš
+Name[sk]=Zamykací kláves je neaktívny.
+Name[sl]=Zaklenilna tipka je onemogočena
+Name[sr]=Тастер за закључавање је деактивиран
+Name[sr@Latn]=Taster za zaključavanje je deaktiviran
+Name[sv]=En låstangent har inaktiverats
+Name[tg]=Калиди қулф ғайри фаъол карда буд
+Name[th]=ปุ่มล็อคถูกปิด
+Name[uk]=Клавішу блокування деактивовано
+Name[vi]=Một phím khoá đã bị tắt
+Name[wa]=Ene tape po serer a stî dismetowe
+Name[zh_CN]=锁定键现已非激活
+Name[zh_TW]=鎖定鍵已取消作用
+Comment=A lock key (e.g. Caps Lock or Num Lock) has changed its state and is now inactive
+Comment[af]='n Sluit sleutel (bv. Caps Lock of Num Lock) se toestand het verander en is nou onaktief
+Comment[be]=Клавіша блакіроўкі (напр. Caps Lock ці Num Lock) змяніла свой стан і зрабілася неактыўнай
+Comment[bg]=Заключващ клавиш (Caps Lock или Num Lock) си промени състоянието и е неактивен сега
+Comment[bs]=Tipka za zaključavanje (npr. Caps Lock ili Num Lock) je promijenila stanje i sada je neaktivna
+Comment[ca]=Una tecla de bloqueig (p.ex. BloqMajús o BloqNum) ha canviat d'estat i ara està inactiva
+Comment[cs]=Klávesa zámku (např. Caps Lock nebo Num Lock) změnila svůj stav a je nyní aktivní
+Comment[csb]=Klawisza blokadë (np. Caps Lock czë Num Lock) zmieniła stón ë nie je terô aktiwnô
+Comment[da]=En låsetast (f.eks., Caps Lock eller Num Lock) har ændret sin tilstand og er nu inaktiv
+Comment[de]=Eine Feststelltaste (z. B. die Hochstelltaste oder Num-Lock) hat ihren Status geändert und ist nun inaktiv
+Comment[el]=Ένα πλήκτρο κλειδώματος (π.χ. Caps Lock ή Num Lock) άλλαξε κατάσταση και είναι τώρα ανενεργό
+Comment[eo]=baskula klavo (ekz. majuskla baskulo aŭ nombra baskulo) ŝanĝis staton, kaj jam ne estas aktiva
+Comment[es]=Una tecla de bloqueo (p. ej., Bloq Mayús o Bloq Num) ha cambiado su estado y ahora está inactiva
+Comment[et]=Lukustusklahv (nt. Caps Lock või Num Lock) muutis oma seisundit ning on nüüd mitteaktiivne
+Comment[eu]=Tekla blokeatzaile bat (hau da, blok. maius. edo blok. zenb.) egoeraz aldatu da eta orain ez da aktiboa
+Comment[fa]=یک کلید قفل )مثلاً، قفل تبدیل یا قفل اعداد( وضعیت خود را تغییر داده و اکنون غیرفعال می‌باشد
+Comment[fi]=Lukitusnäppäin (esim. CapsLock tai NumLock) on vaihtanut tilaansa ja ei ole enää aktiivinen
+Comment[fr]=L'état d'une touche de verrouillage (ex : Verr. Maj ou Verr. Num.) est modifié et elle est maintenant inactive
+Comment[fy]=De tastân fan in beskoatteltoets (sa as kaptaalskoattel of Nûm skoattel) is wizige en is no ynaktyf.
+Comment[gl]=Unha tecla de bloqueo (ex., Bloq Maius ou Bloq Num) mudou de estado e agora está inactiva
+Comment[he]=מקש ננעל (למשל Caps Lock או Num Lock) שינה את מצבו והוא כעת לא פעיל (כבוי)
+Comment[hr]=Tipka zaključavanja (npr. CapsLock ili NumLock) promijenila je svoje stanje i sad nije aktivna
+Comment[hu]=Egy zároló billentyű (pl. a Caps Lock vagy a Num Lock) állapota inaktívvá vált
+Comment[is]=Læsilykill (Caps Lock eða Num Lock) hefur breytt um stöðu og er nú óvirkur
+Comment[it]=Un tasto di blocco (es. Bloc Maiusc o Bloc Num) ha cambiato stato e adesso è inattivo
+Comment[ja]=ロックキー (Caps Lock や Num Lock など) の状態が変更され、非アクティブになりました
+Comment[kk]=Қосқыш перне (Caps Lock я Num Lock) күйін өзгертіп, енді белсенді емес
+Comment[km]=គ្រាប់​ចុច​ចាក់សោ (ឧ. ប្តូរ​ជាប់ ឬ Num Lock) បាន​ផ្លាស់ប្តូរ​សភាព​របស់​វា ហើយ ឥឡូវ​នេះ​វាអសកម្ម
+Comment[ko]=Caps Lock이나 Num Lock 키 같은 잠금 키의 상태가 바뀌었고 현재 비활성화됨
+Comment[lt]=Užrakto klavišo (pvz., Didž(Caps Lock) arba Sk(Num Lock)) būsena pakito ir jis dabar - neaktyvus
+Comment[mk]=Некое копче за заклучување (пр. Caps Lock или Num Lock) си ја смени состојбата и сега е неактивно
+Comment[nb]=En låsetast (f.eks. «Caps Lock» eller «Num lock») har endret status og er nå skrudd av.
+Comment[nds]=En Faststelltast (t.B. Tallenrast oder Grootschrieventast) hett den Tostand ännert un is nu inaktiv
+Comment[ne]=एउटा ताल्चा लगाउने कुञ्जीले (जस्तै: Caps Lock वा Num Lock) यसको स्थिति परिवर्तन गरेको छ र अहिले निस्क्रिय छ
+Comment[nl]=De status van een vergrendeltoets (zoals Caps Lock of Num Lock) is gewijzigd en is nu inactief
+Comment[nn]=Ein låsetast (t.d. «Caps Lock» eller «Num lock») har endra statusen og er no slått av
+Comment[pl]=Klawisz blokujący (np. Caps Lock lub Num Lock) zmienił stan i jest teraz wyłączony
+Comment[pt]=Uma tecla de bloqueio (p.ex., o Caps Lock ou o Num Lock) mudou o seu estado e ficou inactiva
+Comment[pt_BR]=Uma tecla de bloqueio (p.ex. Caps Lock ou Num Lock) mudou seu estado e agora está inativa
+Comment[ro]=O tastă de blocare (cur ar fi Caps Lock sau Num Lock) și-a schimbat starea și este acum inactivă
+Comment[ru]=Деактивирована клавиша переключения режимов (например, Caps Lock или Num Lock)
+Comment[sk]=Zamykací kláves (napr. Caps Lock alebo Num Lock) zmenil svoj stav a je teraz neaktívny
+Comment[sl]=Zaklenilna tipka (npr. Caps Lock ali Num Lock) je spremenila svoje stanje in je sedaj onemogočena
+Comment[sr]=Тастер за закључавање (нпр. Caps Lock или Num Lock) је променио стање и више није активан
+Comment[sr@Latn]=Taster za zaključavanje (npr. Caps Lock ili Num Lock) je promenio stanje i više nije aktivan
+Comment[sv]=En låstangent (t.ex. Caps Lock eller Num Lock) har ändrat tillstånd och är nu inaktiv
+Comment[tg]=Калиди қулф (мисоли, Caps Lock ё Num Lock) вазъияти худ иваз кард ва ҳозир ғайри фаъол аст
+Comment[th]=มีการเปลี่ยนสถานะปุ่มล็อค (เช่น Caps Lock หรือ Num Lock) และขณะนี้ปิดการใช้งาน
+Comment[uk]=Клавіша блокування (напр., Caps Lock або Num Lock) змінила свій стан і тепер неактивна
+Comment[vi]=Một phím khoá (như Caps Lock hay Num Lock) đã thay đổi trạng thái và đã bị tắt
+Comment[wa]=Ene tape po serer (metans CAPS LOCK ou NUM LOCK) a candjî d' esta et est asteure dismetowe
+Comment[zh_CN]=锁定键(如 Caps Lock 或 Num Lock)更改了其状态,现已非激活
+Comment[zh_TW]=鎖定按鍵(例, 大寫鎖定或數字鎖定)已改變其狀態且目前為非作用中
+default_sound=KDE_Click.wav
+default_presentation=0
+nopresentation=236
+
+[stickykeys]
+Name=Sticky keys has been enabled or disabled
+Name[af]=Sticky sleutels was geaktiveer of gedeaktiveer
+Name[be]=Ліпучыя клавішы былі ўключаны ці выключаны
+Name[bg]=Залепващите клавиши бяха включени или изключени
+Name[bs]=Ljepljive tipke su uključene ili isključene
+Name[ca]=S'han habilitat o deshabilitat les tecles apegaloses
+Name[cs]=Sticky klávesy byly povoleny nebo zakázány
+Name[csb]=Klawisze przëlepieniô òstałë włączoné abò wëłączoné
+Name[da]=Klæbrige taster er aktiveret eller deaktiveret
+Name[de]=Klebende Tasten wurden aktiviert oder deaktiviert
+Name[el]=Τα κολλημένα πλήκτρα ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Name[eo]=Fiksaj klavoj validiĝis aŭ malvalidiĝis
+Name[es]=Se han activado o desactivado las teclas pegajosas
+Name[et]=Kleepuvad klahvid on keelatud või lubatud
+Name[eu]=Tekla itsakorrak gaitu edo desgaitu dira
+Name[fa]=کلیدهای چسبناک، فعال یا غیرفعال شده‌اند
+Name[fi]=Tahmeat näppäimet on otettu käyttöön tai poistettu käytöstä
+Name[fr]=L'automaintien des touches a été activé ou désactivé
+Name[fy]=Plakkende toetsen binne aktivearre of deaktivearre
+Name[gl]=As teclas pegadias foron ou activadas ou desactivadas
+Name[he]=מקשים דביקים הופעלו או בוטלו
+Name[hr]=Ljepljive tipke su omogućene ili onemogućene
+Name[hu]=Ragadós billentyűk átkapcsolva
+Name[is]=Slökkt eða kveikt hefur verið á klístruðum lyklum
+Name[it]=La permanenza dei tasti è stata abilitata o disabilitata
+Name[ja]=スティッキーキーを有効または無効にしました
+Name[kk]=Жабысқақ пернелер рұксат етілген не етілмеген
+Name[km]=គ្រាប់ចុច​ស្អិត​ត្រូវ​បានអនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Name[ko]=끈적이 키가 활성화되거나 비활성화됨
+Name[lt]=Lipnūs klavišai buvo įgalinti arba išjungti
+Name[mk]=„Лепливи копчиња“ е овозможено или оневозможено
+Name[nb]=Faste valgtaster er blitt skrudd av eller på
+Name[nds]=De Metood "Backige Tasten" wöör an- oder utschalt
+Name[ne]=टाँसिने कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Name[nl]=Plakkende toetsen zijn geactiveerd of gedeactiveerd
+Name[nn]=Faste valtastar er blitt slått av eller på
+Name[pl]=Lepkie klawisze zostały włączone lub wyłączone
+Name[pt]=As teclas fixas ficaram activas ou inactivas
+Name[pt_BR]=Teclas de aderência foram habilitadas ou desabilitadas
+Name[ro]=Taste lipicioase (Sticky keys) au fost activate sau deactivate
+Name[ru]=Включены или отключены "залипающие" клавиши
+Name[sk]=Lepkavé klávesy zmenili svoj stav.
+Name[sl]=Lepljive tipke so spremenile stanje
+Name[sr]=Лепљиви тастери су укључени или искључени
+Name[sr@Latn]=Lepljivi tasteri su uključeni ili isključeni
+Name[sv]=Klistriga tangenter har aktiverats eller inaktiverats
+Name[tg]=Калидҳои часпак фаъол ё ғайрифаъол мебошад
+Name[th]=ปุ่มติดหนึบได้ถูกใช้งาน หรือ ถูกปิด
+Name[uk]=Липкі клавіші було увімкнено або вимкнено
+Name[vi]=Các phím dính đã được bật hoặc đã được tắt
+Name[wa]=Les aclapantès tapes ont stî metowes en alaedje ou dismetowes
+Name[zh_CN]=启用或禁用了粘滞键
+Name[zh_TW]=相黏鍵已啟用或停用
+Comment=Sticky keys has been enabled or disabled
+Comment[af]=Sticky sleutels was geaktiveer of gedeaktiveer
+Comment[be]=Ліпучыя клавішы былі ўключаны ці выключаны
+Comment[bg]=Залепващите клавиши бяха включени или изключени
+Comment[bs]=Ljepljive tipke su uključene ili isključene
+Comment[ca]=S'han habilitat o deshabilitat les tecles apegaloses
+Comment[cs]=Sticky klávesy byly povoleny nebo zakázány
+Comment[csb]=Klawisze przëlemieniô òstałë włączoné abò wëłączoné
+Comment[da]=Klæbrige taster er aktiveret eller deaktiveret
+Comment[de]=Die Funktion "Klebende Tasten" wurde aktiviert bzw. deaktiviert
+Comment[el]=Τα κολλημένα πλήκτρα ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Comment[eo]=Fiksaj klavoj estas aktivigitaj aŭ malaktivigitaj
+Comment[es]=Se han activado o desactivado las teclas pegajosas
+Comment[et]=Kleepuvad klahvid on keelatud või lubatud
+Comment[eu]=Tekla itsakorrak gaitu edo desgaitu dira
+Comment[fa]=کلیدهای چسبناک، فعال یا غیرفعال شده‌اند
+Comment[fi]=Tahmeat näppäimet on otettu käyttöön tai poistettu käytöstä
+Comment[fr]=L'automaintien des touches a été activé ou désactivé
+Comment[fy]=Plakkende toetsen binne aktivearre of deaktivearre
+Comment[gl]=As teclas pegadias foron ou activadas ou desactivadas
+Comment[he]=מקשים דביקים הופעלו או בוטלו
+Comment[hr]=Ljepljive tipke su omogućene ili onemogućene
+Comment[hu]=A ragadós billentyűk használatát ki- vagy bekapcsolták
+Comment[is]=Slökkt eða kveikt hefur verið á klístruðum lyklum
+Comment[it]=La permanenza dei tasti è stata abilitata o disabilitata
+Comment[ja]=スティッキーキーを有効または無効にしました
+Comment[kk]=Жабысқақ пернелер рұксат етілген не етілмеген
+Comment[km]=គ្រាប់ចុច​ស្អិត​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Comment[ko]=끈적이 키가 활성화되거나 비활성화됨
+Comment[lt]=Lipnūs klavišai buvo įjungti arba išjungti
+Comment[mk]=„Лепливи копчиња“ е овозможено или оневозможено
+Comment[nb]=Faste valgtaster er blitt skrudd av eller på
+Comment[nds]=De Metood "Backige Tasten" wöör an- oder utschalt
+Comment[ne]=टाँसिने कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Comment[nl]=Plakkende toetsen zijn geactiveerd of gedeactiveerd
+Comment[nn]=Faste valtaster er blitt slått av eller på
+Comment[pl]=Lepkie klawisze zostały włączone lub wyłączone
+Comment[pt]=As teclas fixas ficaram activas ou inactivas
+Comment[pt_BR]=Teclas de aderência foram habilitadas ou desabilitadas
+Comment[ro]=Taste lipicioase (Sticky keys) au fost activate sau deactivate
+Comment[ru]=Включены или отключены "залипающие" клавиши
+Comment[sk]=Lepkavé klávesy zmenili svoj stav.
+Comment[sl]=Lepljive tipke so spremenile stanje in so sedaj omogočene ali onemogočene
+Comment[sr]=Лепљиви тастери су укључени или искључени
+Comment[sr@Latn]=Lepljivi tasteri su uključeni ili isključeni
+Comment[sv]=Klistriga tangenter har aktiverats eller inaktiverats
+Comment[tg]=Калидҳои часпак фаъол ё ғайрифаъол мебошад
+Comment[th]=ปุ่มติดหนึบได้ถูกใช้งาน หรือ ถูกปิด
+Comment[uk]=Липкі клавіші було увімкнено або вимкнено
+Comment[vi]=Các phím dính đã được bật hoặc đã được tắt
+Comment[wa]=Les aclapantès tapes ont stî metowes en alaedje ou dismetowes
+Comment[zh_CN]=启用或禁用了粘滞键
+Comment[zh_TW]=相黏鍵已經被啟用或停用
+default_sound=KDE_Click.wav
+default_presentation=16
+nopresentation=236
+
+[slowkeys]
+Name=Slow keys has been enabled or disabled
+Name[af]=Stadige sleutels was geaktiveer of gedeaktiveer
+Name[be]=Марудныя клавішы былі ўключаны ці выключаны
+Name[bg]=Бавните клавиши бяха включени или изключени
+Name[bs]=Spore tipke su uključene ili isključene
+Name[ca]=S'han habilitat o deshabilitat les tecles lentes
+Name[cs]=Pomalé klávesy byly povoleny nebo zakázány
+Name[csb]=Pòwólné klawisze òstałë włączoné abò wëłączone
+Name[da]=Langsomme taster er aktiveret eller deaktiveret
+Name[de]=Langsame Tasten wurden aktiviert oder deaktiviert
+Name[el]=Τα αργά πλήκτρα ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Name[eo]=Malrapidklavoj validiĝis aŭ malvalidiĝis
+Name[es]=Se han activado o desactivado las teclas lentas
+Name[et]=Aeglased klahvid on keelatud või lubatud
+Name[eu]=Tekla motelak gaitu edo desgaitu dira
+Name[fa]=کلیدهای کند، فعال یا غیرفعال شده‌اند
+Name[fi]=Hitaat näppäimet on otettu käyttöön tai poistettu käytöstä
+Name[fr]=Les touches lentes ont été activées ou désactivées
+Name[fy]=Trage toetsen binne aktivearre of ûntaktivearre
+Name[gl]=As teclas lentas foron ou activadas ou desactivadas
+Name[he]=מקשים אטיים הופעלו או בוטלו
+Name[hr]=Spore tipke su omogućene ili onemogućene
+Name[hu]=A lassú billentyűk használata átkapcsolva
+Name[is]=Slökkt eða kveikt hefur verið á hægum lyklum
+Name[it]=Il rallentamento dei tasti è stato abilitato o disabilitato
+Name[ja]=スローキーを有効または無効にしました
+Name[kk]=Баяу пернелер рұксат етілген не етілмеген
+Name[km]=គ្រាប់ចុច​យឺត​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Name[ko]=느린 키가 활성화되거나 비활성화됨
+Name[lt]=Lėti klavišai buvo įgalinti arba išjungti
+Name[mk]=„Спори копчиња“ е овозможено или оневозможено
+Name[nb]=Trege taster er blitt skrudd av eller på
+Name[nds]=De Metood "Langsam Tasten" wöör an- oder utschalt
+Name[ne]=ढिलो कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Name[nl]=Langzame toetsten is geactiveerd of gedeactiveerd
+Name[nn]=Trege tastar er blitt slått av eller på
+Name[pl]=Powolne klawisze zostały włączone lub wyłączone
+Name[pt]=As teclas lentas ficaram activas ou inactivas
+Name[pt_BR]=Teclas lentas foram habilitadas ou desabilitadas
+Name[ro]=Taste lente (Slow keys) au fost activate sau deactivate
+Name[ru]=Включены или отключены замедленные клавиши
+Name[sk]=Pomalé klávesy zmenili svoj stav.
+Name[sl]=Počasne tipke so spremenile stanje
+Name[sr]=Спори тастери су укључени или искључени
+Name[sr@Latn]=Spori tasteri su uključeni ili isključeni
+Name[sv]=Långsamma tangenter har aktiverats eller inaktiverats
+Name[tg]=калиди сусткор фаъол ё ғайрифаъол мебошад
+Name[th]=ปุ่มชะลอได้ถูกใช้งาน หรือถูกปิด
+Name[uk]=Повільні клавіші було увімкнено або вимкнено
+Name[vi]=Các phím chậm đã được bật hoặc đã được tắt
+Name[wa]=Les londjinnès tapes ont stî metowes en alaedje ou dismetowes
+Name[zh_CN]=启用或禁用了筛选键
+Name[zh_TW]=延遲鍵已啟用或停用
+Comment=Slow keys has been enabled or disabled
+Comment[af]=Stadige sleutels was geaktiveer of gedeaktiveer
+Comment[be]=Марудныя клавішы былі ўключаны ці выключаны
+Comment[bg]=Бавните клавиши бяха включени или изключени
+Comment[bs]=Spore tipke su uključene ili isključene
+Comment[ca]=S'han habilitat o deshabilitat les tecles lentes
+Comment[cs]=Pomalé klávesy byly povoleny nebo zakázány
+Comment[csb]=Pòwólné klawisze òstałë włączoné abò wëłączone
+Comment[da]=Langsomme taster er aktiveret eller deaktiveret
+Comment[de]=Die Funktion "Langsame Tasten" wurde aktiviert bzw. deaktiviert
+Comment[el]=Τα αργά πλήκτρα ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Comment[eo]=Malrapidklavoj estas aktivigitaj aŭ malaktivigitaj
+Comment[es]=Se han activado o desactivado las teclas pegajosas
+Comment[et]=Aeglased klahvid on keelatud või lubatud
+Comment[eu]=Tekla motelak gaitu edo desgaitu dira
+Comment[fa]=کلیدهای چسبناک، فعال یا غیرفعال شده‌اند
+Comment[fi]=Hitaat näppäimet on otettu käyttöön tai poistettu käytöstä
+Comment[fr]=Les touches lentes ont été activées ou désactivées
+Comment[fy]=Trage toetsen binne aktivearre of ûntaktivearre
+Comment[gl]=As teclas lentas foron ou activadas ou desactivadas
+Comment[he]=מקשים אטיים הופעלו או בוטלו
+Comment[hr]=Spore tipke su omogućene ili onemogućene
+Comment[hu]=A lassú billentyűk használatát ki- vagy bekapcsolták
+Comment[is]=Slökkt eða kveikt hefur verið á hægum lyklum
+Comment[it]=Il rallentamento dei tasti è stato abilitato o disabilitato
+Comment[ja]=スローキーを有効または無効にしました
+Comment[kk]=Баяу пернелер рұксат етілген не етілмеген
+Comment[km]=គ្រាប់ចុច​យឺត​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Comment[ko]=느린 키가 활성화되거나 비활성화됨
+Comment[lt]=Lėti klavišai buvo įgalinti arba išjungti
+Comment[mk]=„Спори копчиња“ е овозможено или оневозможено
+Comment[nb]=Trege taster er blitt skrudd av eller på
+Comment[nds]=De Metood "Langsam Tasten" wöör an- oder utschalt
+Comment[ne]=ढिलो कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Comment[nl]=Langzame toetsten is geactiveerd of gedeactiveerd
+Comment[nn]=Trege tastar er blitt slått av eller på
+Comment[pl]=Powolne klawisze zostały włączone lub wyłączone
+Comment[pt]=As teclas lentas ficaram activas ou inactivas
+Comment[pt_BR]=Teclas lentas foram habilitadas ou desabilitadas
+Comment[ro]=Taste lente (Slow keys) au fost activate sau deactivate
+Comment[ru]=Включены или отключены замедленные клавиши
+Comment[sk]=Pomalé klávesy zmenili svoj stav.
+Comment[sl]=Počasne tipke so spremenile stanje in so sedaj omogočene ali onemogočene
+Comment[sr]=Спори тастери су укључени или искључени
+Comment[sr@Latn]=Spori tasteri su uključeni ili isključeni
+Comment[sv]=Långsamma tangenter har aktiverats eller inaktiverats
+Comment[tg]=Калиди сусткор фаъол ё ғайрифаъол мебошад
+Comment[th]=ปุ่มชะลอได้ถูกใช้งาน หรือ ถูกปิด
+Comment[uk]=Повільні клавіші було увімкнено або вимкнено
+Comment[vi]=Các phím chậm đã được bật hoặc đã được tắt
+Comment[wa]=Les londjinnès tapes ont stî metowes en alaedje ou dismetowes
+Comment[zh_CN]=启用或禁用了筛选键
+Comment[zh_TW]=延遲鍵已經被啟用或停用
+default_sound=KDE_Click.wav
+default_presentation=16
+nopresentation=236
+
+[bouncekeys]
+Name=Bounce keys has been enabled or disabled
+Name[be]="Рухомыя"клавішы ўключаны ці выключаны
+Name[bg]=Подскачащите клавиши бяха включени или изключени
+Name[bs]=Odbijanje tipki je uključeno ili isključeno
+Name[ca]=S'han habilitat o deshabilitat les tecles de repetició
+Name[cs]=Vícenásobné opakování kláves bylo povoleno nebo zakázáno
+Name[csb]=Òdbijające klawisze òstałë włączoné abò wëłączoné
+Name[da]=Elastiske taster er aktiveret eller deaktiveret
+Name[de]=Zurückschnellende Tasten wurden aktiviert oder deaktiviert
+Name[el]=Τα πλήκτρα αναπήδησης ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Name[eo]=Prokrastaj klavoj validiĝis aŭ malvalidiĝis
+Name[es]=Se han activado o desactivado las teclas de rebote
+Name[et]=Põrkavad klahvid on keelatud või lubatud
+Name[eu]=Errebotatze-teklak gaitu edo desgaitu dira
+Name[fa]=کلیدهای واگشت، فعال یا غیرفعال شده‌اند
+Name[fi]=Kimpoavat näppäimet on otettu käyttöön tai poistettu käytöstä
+Name[fr]=Les touches non répétées ont été activées ou désactivées
+Name[fy]=Stuiterjende toetsen binne aktivearre of ûntaktivearre
+Name[gl]=As teclas de rebote foron ou activadas ou desactivadas
+Name[he]=מקשים קפיציים הופעלו או בוטלו
+Name[hr]=Obijanje tipki je omogućeno ili onemogućeno
+Name[hu]=A visszaugró billentyűk átkapcsolva
+Name[is]=Slökkt eða kveikt hefur verið á skoppandi lyklum
+Name[it]=La pressione ravvicinata dei tasti è stata abilitata o disabilitata
+Name[ja]=バウンスキーを有効または無効にしました
+Name[kk]=Қалшылға қарсы пернелер рұксат етілген не етілмеген
+Name[km]=គ្រាប់ចុច​លោត​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Name[ko]=튕김 키가 활성화되거나 비활성화됨
+Name[lt]=Tamprūs klavišai buvo įgalinti arba išjungti
+Name[mk]=„Скокачки копчиња“ е овозможено или оневозможено
+Name[nb]=Filtertaster er blitt skrudd av eller på
+Name[nds]=De Metood "Springen Tasten" wöör an- oder utschalt
+Name[ne]=कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Name[nl]=Stuiterende toetsen is geactiveerd of gedeactiveerd
+Name[nn]=Filtertastar er blitt slått av eller på
+Name[pl]=Odbijające klawisze zostały włączone lub wyłączone
+Name[pt]=As teclas sonoras ficaram activas ou inactivas
+Name[pt_BR]=Teclas lentas foram habilitadas ou desabilitadas
+Name[ro]=Taste săltărețe (Bounce keys) au fost activate sau deactivate
+Name[ru]=Включены или отключены "прыгающие" клавиши
+Name[sk]=Bounce klávesy zmenili svoj stav.
+Name[sl]=Odskočne tipke so spremenile stanje
+Name[sr]=Одскачући тастери су укључени или искључени
+Name[sr@Latn]=Odskačući tasteri su uključeni ili isključeni
+Name[sv]=Studsande tangenter har aktiverats eller inaktiverats
+Name[tg]=Калидҳои бонус фаъол ё ғайрифаъол мебошанд
+Name[th]=ปุ่มสะท้อน ได้ถูกใช้งาน หรือถูกปิด
+Name[uk]=Пружні клавіші було увімкнено або вимкнено
+Name[vi]=Các phím nảy đã được bật hoặc đã được tắt
+Name[wa]=Les tapes di ridjiblaedje ont stî metowes en alaedje ou dismetowes
+Name[zh_CN]=启用或禁用了撞击键
+Name[zh_TW]=彈跳鍵已啟用或停用
+Comment=Bounce keys has been enabled or disabled
+Comment[af]=Hop sleutels was geaktiveer of gedeaktiveer
+Comment[be]="Рухомыя"клавішы ўключаны ці выключаны
+Comment[bg]=Подскачащите клавиши бяха включени или изключени
+Comment[bs]=Odbijanje tipki je uključeno ili isključeno
+Comment[ca]=S'han habilitat o deshabilitat les tecles de repetició
+Comment[cs]=Vícenásobné opakování kláves bylo povoleno nebo zakázáno
+Comment[csb]=Òdbijające klawisze òstałë wëłączoné abò włączoné
+Comment[da]=Elastiske taster er aktiveret eller deaktiveret
+Comment[de]=Zurückschnellende Tasten wurden aktiviert oder deaktiviert
+Comment[el]=Τα πλήκτρα αναπήδησης ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Comment[eo]=Prokrastaj klavoj estas aktivigitaj aŭ malaktivigitaj
+Comment[es]=Se han activado o desactivado las teclas de rebote
+Comment[et]=Põrkavad klahvid on keelatud või lubatud
+Comment[eu]=Errebotatze-teklak gaitu edo desgaitu dira
+Comment[fa]=کلیدهای واگشت، فعال یا غیرفعال شده‌اند
+Comment[fi]=Kimpoavat näppäimet on otettu käyttöön tai poistettu käytöstä
+Comment[fr]=Les touches non répétées ont été activées ou désactivées
+Comment[fy]=Stuiterjende toetsen binne aktivearre of ûntaktivearre
+Comment[gl]=As teclas de rebote foron ou activadas ou desactivadas
+Comment[he]=מקשים קפיציים הופעלו או בוטלו
+Comment[hr]=Obijanje tipki je omogućeno ili onemogućeno
+Comment[hu]=A visszaugró billentyűk használatát ki- vagy bekapcsolták
+Comment[is]=Slökkt eða kveikt hefur verið á skoppandi lyklum
+Comment[it]=La pressione ravvicinata dei tasti è stata abilitata o disabilitata
+Comment[ja]=バウンスキーを有効または無効にしました
+Comment[kk]=Қалшылға қарсы пернелер рұксат етілген не етілмеген
+Comment[km]=គ្រាប់ចុច​លោត​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Comment[ko]=튕김 키가 활성화되거나 비활성화됨
+Comment[lt]=Tamprūs klavišai buvo įgalinti arba išjungti
+Comment[mk]=„Скокачки копчиња“ е овозможено или оневозможено
+Comment[nb]=Filtertaster er blitt skrudd av eller på
+Comment[nds]=De Metood "Springen Tasten" wöör an- oder utschalt
+Comment[ne]=उफ्रिने कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Comment[nl]=Stuiterende toetsen is geactiveerd of gedeactiveerd
+Comment[nn]=Filtertastar er blitt slått av eller på
+Comment[pl]=Powolne klawisze zostały włączone lub wyłączone
+Comment[pt]=As teclas sonoras ficaram activas ou inactivas
+Comment[pt_BR]=Teclas lentas foram habilitadas ou desabilitadas
+Comment[ro]=Taste săltărețe (Bounce keys) au fost activate sau deactivate
+Comment[ru]=Включены или отключены "прыгающие" клавиши
+Comment[sk]=Bounce klávesy zmenili svoj stav.
+Comment[sl]=Odskočne tipke so spremenile stanje in so sedaj omogočene ali onemogočene
+Comment[sr]=Одскачући тастери су укључени или искључени
+Comment[sr@Latn]=Odskačući tasteri su uključeni ili isključeni
+Comment[sv]=Studsande tangenter har aktiverats eller inaktiverats
+Comment[tg]=Калидҳои бонус фаъол ё ғайрифаъоланд
+Comment[th]=ปุ่มสะท้อนได้ถูกใช้งาน หรือ ถูกปิด
+Comment[uk]=Пружні клавіші було увімкнено або вимкнено
+Comment[vi]=Các phím nảy đã được bật hoặc đã được tắt
+Comment[wa]=Les tapes di ridjiblaedje ont stî metowes en alaedje ou dismetowes
+Comment[zh_CN]=启用或禁用了撞击键
+Comment[zh_TW]=彈跳鍵已經被啟用或停用
+default_sound=KDE_Click.wav
+default_presentation=16
+nopresentation=236
+
+[mousekeys]
+Name=Mouse keys has been enabled or disabled
+Name[af]=Muis sleutels was geaktiveer of gedeaktiveer
+Name[be]=Кнопкі мышы былі ўключаны ці выключаны
+Name[bg]=Клавишите за мишката бяха включени или изключени
+Name[bs]=Tipke miša su uključene ili isključene
+Name[ca]=S'han habilitat o deshabilitat les tecles de ratolí
+Name[cs]=Klávesy myši byly povoleny nebo zakázány
+Name[csb]=Klawisze mëszë òstałë włączoné abò wëłączoné
+Name[da]=Musetaster er aktiveret eller deaktiveret
+Name[de]=Maustasten wurden aktiviert oder deaktiviert
+Name[el]=Τα πλήκτρα ποντικιού ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Name[eo]=Musklavoj validiĝis aŭ malvalidiĝis
+Name[es]=Se han activado o desactivado las teclas de ratón
+Name[et]=Hiire klahvid on keelatud või lubatud
+Name[eu]=Saguaren teklak gaitu edo desgaitu egin dira
+Name[fa]=کلیدهای موشی، فعال یا غیرفعال شده‌اند
+Name[fi]=Hiiren näppäimet on otettu käyttöön tai poistettu käytöstä
+Name[fr]=Les touches gérant la souris ont été activées ou désactivées
+Name[fy]=Mûstoetsen binne aktivearre of ûntaktivearre
+Name[gl]=As teclas de rato foron ou activadas ou desactivadas
+Name[he]=מקשי העכבר בוטלו או הופעלו
+Name[hr]=Mišolike tipke su omogućene ili onemogućene
+Name[hu]=Az egérmozgató billentyűk átkapcsolva
+Name[is]=Slökkt eða kveikt hefur verið á músarlyklum
+Name[it]=Il mouse da tastiera è stato abilitato o disabilitato
+Name[ja]=マウスキーを有効または無効にしました
+Name[kk]=Тышқанды жылжытатын пернелер рұксат етілген не етілмеген
+Name[km]=គ្រាប់​ចុច​កណ្តុរ​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Name[ko]=마우스 키가 활성화되거나 비활성화됨
+Name[lt]=Pelės klavišai buvo įgalinti arba išjungti
+Name[mk]=„Копчиња на глушецот“ е овозможено или оневозможено
+Name[nb]=Musetaster er blitt skrudd av eller på
+Name[nds]=De Metood "Muustasten" wöör an- oder utschalt
+Name[ne]=माउस कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Name[nl]=Muistoetsen is geactiveerd of gedeactiveerd
+Name[nn]=Musetastar er blitt slått av eller på
+Name[pa]=ਮਾਊਸ ਸਵਿੱਚਾਂ ਨੂੰ ਯੋਗ ਜਾਂ ਅਯੋਗ ਕੀਤਾ ਗਿਆ ਹੈ
+Name[pl]=Klawisze myszy zostały włączone lub wyłączone
+Name[pt]=O rato por teclado ficou activo ou inactivo
+Name[pt_BR]=Teclas do mouse foram habilitadas ou desabilitadas
+Name[ro]=Taste de maus au fost activate sau deactivate
+Name[ru]=Нажаты или отжаты клавиши мыши
+Name[sk]=Mouse klávesy zmenili svoj stav.
+Name[sl]=Miškine tipke so spremenile stanje
+Name[sr]=Тастери за миш су укључени или искључени
+Name[sr@Latn]=Tasteri za miš su uključeni ili isključeni
+Name[sv]=Mustangenter har aktiverats eller inaktiverats
+Name[tg]=Тугмачаҳои мушуак фаъол ё ғайрифаъол мебошанд
+Name[th]=ปุ่มแทนเมาส์ได้ถูกใช้งาน หรือ ถูกปิด
+Name[uk]=Клавіші мишки було увімкнено або вимкнено
+Name[vi]=Các phím chuột đã được bật hoặc đã được tắt
+Name[wa]=Les tapes di sori ont stî metowes en alaedje ou dismetowes
+Name[zh_CN]=启用或禁用了鼠标键
+Name[zh_TW]=滑鼠按鍵已啟用或停用
+Comment=Mouse keys has been enabled or disabled
+Comment[af]=Muis sleutels was geaktiveer of gedeaktiveer
+Comment[be]=Кнопкі мышы былі ўключаны ці выключаны
+Comment[bg]=Клавишите за мишката бяха включени или изключени
+Comment[bs]=Tipke miša su uključene ili isključene
+Comment[ca]=S'han habilitat o deshabilitat les tecles de ratolí
+Comment[cs]=Klávesy myši byly povoleny nebo zakázány
+Comment[csb]=Klawisze mëszë òstałë włączoné abò wëłączoné
+Comment[da]=Musetaster er aktiveret eller deaktiveret
+Comment[de]=Die Funktion "Maustasten" wurde aktiviert oder deaktiviert
+Comment[el]=Τα πλήκτρα ποντικιού ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Comment[eo]=Musklavoj validiĝis aŭ malvalidiĝis
+Comment[es]==Se han activado o desactivado las teclas de ratón
+Comment[et]=Hiire klahvid on keelatud või lubatud
+Comment[eu]=Saguaren teklak gaitu edo desgaitu egin dira
+Comment[fa]=کلیدهای موشی، فعال یا غیرفعال شده‌اند
+Comment[fi]=Hiiren näppäimet on otettu käyttöön tai poistettu käytöstä
+Comment[fr]=Les touches gérant la souris ont été activées ou désactivées
+Comment[fy]=Mûstoetsen binne aktivearre of ûntaktivearre
+Comment[gl]=As teclas de rato foron ou activadas ou desactivadas
+Comment[he]=מקשי העכבר בוטלו או הופעלו
+Comment[hr]=Mišolike tipke su omogućene ili onemogućene
+Comment[hu]=Az egérmozgató billentyűk használatát ki- vagy bekapcsolták
+Comment[is]=Slökkt eða kveikt hefur verið á músarlyklum
+Comment[it]=Il mouse da tastiera è stato abilitato o disabilitato
+Comment[ja]=マウスキーを有効または無効にしました
+Comment[kk]=Тышқанды жылжытатын пернелер рұксат етілген не етілмеген
+Comment[km]=គ្រាប់ចុច​កណ្តុរ​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Comment[ko]=마우스 키가 활성화되거나 비활성화됨
+Comment[lt]=Pelės mygtukai buvo įgalinti arba išjungti
+Comment[mk]=„Копчиња на глушецот“ е овозможено или оневозможено
+Comment[nb]=Musetaster er blitt skrudd av eller på
+Comment[nds]=De Metood "Muustasten" wöör an- oder utschalt
+Comment[ne]=माउस कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Comment[nl]=Muistoetsen is geactiveerd of gedeactiveerd
+Comment[nn]=Musetastar er blitt slått av eller på
+Comment[pl]=Klawisze myszy zostały włączone lub wyłączone
+Comment[pt]=O rato por teclado ficou activo ou inactivo
+Comment[pt_BR]=Teclas do mouse foram habilitadas ou desabilitadas
+Comment[ro]=Taste de maus au fost activate sau deactivate
+Comment[ru]=Нажаты или отжаты клавиши мыши
+Comment[sk]=Mouse klávesy zmenili svoj stav.
+Comment[sl]=Miškine tipke so spremenile stanje in so sedaj omogočene ali onemogočene
+Comment[sr]=Тастери за миш су укључени или искључени
+Comment[sr@Latn]=Tasteri za miš su uključeni ili isključeni
+Comment[sv]=Mustangenter har aktiverats eller inaktiverats
+Comment[tg]=Тугмачаҳои мушуак фаъол ё ғайрифаъол мебошанд
+Comment[th]=ปุ่มแทนเมาส์ได้ถูกใช้งาน หรือ ถูกปิด
+Comment[uk]=Клавіші мишки було увімкнено або вимкнено
+Comment[vi]=Các phím chuột đã được bật hoặc đã được tắt
+Comment[wa]=Les tapes di sori ont stî metowes en alaedje ou dismetowes
+Comment[zh_CN]=启用或禁用了鼠标键
+Comment[zh_TW]=滑鼠按鍵已經被啟用或停用
+default_sound=KDE_Click.wav
+default_presentation=16
+nopresentation=236
diff --git a/kcontrol/access/kaccess.cpp b/kcontrol/access/kaccess.cpp
new file mode 100644
index 000000000..5956697b9
--- /dev/null
+++ b/kcontrol/access/kaccess.cpp
@@ -0,0 +1,896 @@
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <qtimer.h>
+#include <qpainter.h>
+#include <qvbox.h>
+#include <qlayout.h>
+#include <qlabel.h>
+
+#include <kdialogbase.h>
+#include <kmessagebox.h>
+#include <kcombobox.h>
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <kaudioplayer.h>
+#include <knotifyclient.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <netwm.h>
+#include <kshortcut.h>
+#include <kkeynative.h>
+#include <kwin.h>
+
+#include <X11/XKBlib.h>
+#define XK_MISCELLANY
+#define XK_XKB_KEYS
+#include <X11/keysymdef.h>
+
+
+#include "kaccess.moc"
+
+struct ModifierKey {
+ const unsigned int mask;
+ const KeySym keysym;
+ const char *name;
+ const char *lockedText;
+ const char *latchedText;
+ const char *unlatchedText;
+};
+
+static ModifierKey modifierKeys[] = {
+ { ShiftMask, 0, "Shift",
+ I18N_NOOP("The Shift key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Shift key is now active."),
+ I18N_NOOP("The Shift key is now inactive.") },
+ { ControlMask, 0, "Control",
+ I18N_NOOP("The Ctrl key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Ctrl key is now active."),
+ I18N_NOOP("The Ctrl key is now inactive.") },
+ { 0, XK_Alt_L, "Alt",
+ I18N_NOOP("The Alt key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Alt key is now active."),
+ I18N_NOOP("The Alt key is now inactive.") },
+ { 0, 0, "Win",
+ I18N_NOOP("The Win key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Win key is now active."),
+ I18N_NOOP("The Win key is now inactive.") },
+ { 0, XK_Meta_L, "Meta",
+ I18N_NOOP("The Meta key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Meta key is now active."),
+ I18N_NOOP("The Meta key is now inactive.") },
+ { 0, XK_Super_L, "Super",
+ I18N_NOOP("The Super key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Super key is now active."),
+ I18N_NOOP("The Super key is now inactive.") },
+ { 0, XK_Hyper_L, "Hyper",
+ I18N_NOOP("The Hyper key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Hyper key is now active."),
+ I18N_NOOP("The Hyper key is now inactive.") },
+ { 0, 0, "Alt Graph",
+ I18N_NOOP("The Alt Gr key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Alt Gr key is now active."),
+ I18N_NOOP("The Alt Gr key is now inactive.") },
+ { 0, XK_Num_Lock, "Num Lock",
+ I18N_NOOP("The Num Lock key has been activated."),
+ "",
+ I18N_NOOP("The Num Lock key is now inactive.") },
+ { LockMask, 0, "Caps Lock",
+ I18N_NOOP("The Caps Lock key has been activated."),
+ "",
+ I18N_NOOP("The Caps Lock key is now inactive.") },
+ { 0, XK_Scroll_Lock, "Scroll Lock",
+ I18N_NOOP("The Scroll Lock key has been activated."),
+ "",
+ I18N_NOOP("The Scroll Lock key is now inactive.") },
+ { 0, 0, "", "", "", "" }
+};
+
+
+/********************************************************************/
+
+
+KAccessApp::KAccessApp(bool allowStyles, bool GUIenabled)
+ : KUniqueApplication(allowStyles, GUIenabled), _artsBellBlocked(false),
+ overlay(0), wm(0, KWinModule::INFO_DESKTOP)
+{
+ _activeWindow = wm.activeWindow();
+ connect(&wm, SIGNAL(activeWindowChanged(WId)), this, SLOT(activeWindowChanged(WId)));
+
+ artsBellTimer = new QTimer( this );
+ connect( artsBellTimer, SIGNAL( timeout() ), SLOT( slotArtsBellTimeout() ));
+
+ features = 0;
+ requestedFeatures = 0;
+ dialog = 0;
+
+ initMasks();
+ XkbStateRec state_return;
+ XkbGetState (qt_xdisplay(), XkbUseCoreKbd, &state_return);
+ unsigned char latched = XkbStateMods (&state_return);
+ unsigned char locked = XkbModLocks (&state_return);
+ state = ((int)locked)<<8 | latched;
+}
+
+int KAccessApp::newInstance()
+{
+ KGlobal::config()->reparseConfiguration();
+ readSettings();
+ return 0;
+}
+
+void KAccessApp::readSettings()
+{
+ KConfig *config = KGlobal::config();
+
+ // bell ---------------------------------------------------------------
+
+ config->setGroup("Bell");
+ _systemBell = config->readBoolEntry("SystemBell", true);
+ _artsBell = config->readBoolEntry("ArtsBell", false);
+ _artsBellFile = config->readPathEntry("ArtsBellFile");
+ _visibleBell = config->readBoolEntry("VisibleBell", false);
+ _visibleBellInvert = config->readBoolEntry("VisibleBellInvert", false);
+ QColor def(Qt::red);
+ _visibleBellColor = config->readColorEntry("VisibleBellColor", &def);
+ _visibleBellPause = config->readNumEntry("VisibleBellPause", 500);
+
+ // select bell events if we need them
+ int state = (_artsBell || _visibleBell) ? XkbBellNotifyMask : 0;
+ XkbSelectEvents(qt_xdisplay(), XkbUseCoreKbd, XkbBellNotifyMask, state);
+
+ // deactivate system bell if not needed
+ if (!_systemBell)
+ XkbChangeEnabledControls(qt_xdisplay(), XkbUseCoreKbd, XkbAudibleBellMask, 0);
+ else
+ XkbChangeEnabledControls(qt_xdisplay(), XkbUseCoreKbd, XkbAudibleBellMask, XkbAudibleBellMask);
+
+ // keyboard -------------------------------------------------------------
+
+ config->setGroup("Keyboard");
+
+ // get keyboard state
+ XkbDescPtr xkb = XkbGetMap(qt_xdisplay(), 0, XkbUseCoreKbd);
+ if (!xkb)
+ return;
+ if (XkbGetControls(qt_xdisplay(), XkbAllControlsMask, xkb) != Success)
+ return;
+
+ // sticky keys
+ if (config->readBoolEntry("StickyKeys", false))
+ {
+ if (config->readBoolEntry("StickyKeysLatch", true))
+ xkb->ctrls->ax_options |= XkbAX_LatchToLockMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_LatchToLockMask;
+ if (config->readBoolEntry("StickyKeysAutoOff", false))
+ xkb->ctrls->ax_options |= XkbAX_TwoKeysMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_TwoKeysMask;
+ if (config->readBoolEntry("StickyKeysBeep", false))
+ xkb->ctrls->ax_options |= XkbAX_StickyKeysFBMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_StickyKeysFBMask;
+ xkb->ctrls->enabled_ctrls |= XkbStickyKeysMask;
+ }
+ else
+ xkb->ctrls->enabled_ctrls &= ~XkbStickyKeysMask;
+
+ // toggle keys
+ if (config->readBoolEntry("ToggleKeysBeep", false))
+ xkb->ctrls->ax_options |= XkbAX_IndicatorFBMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_IndicatorFBMask;
+
+ // slow keys
+ if (config->readBoolEntry("SlowKeys", false)) {
+ if (config->readBoolEntry("SlowKeysPressBeep", false))
+ xkb->ctrls->ax_options |= XkbAX_SKPressFBMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_SKPressFBMask;
+ if (config->readBoolEntry("SlowKeysAcceptBeep", false))
+ xkb->ctrls->ax_options |= XkbAX_SKAcceptFBMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_SKAcceptFBMask;
+ if (config->readBoolEntry("SlowKeysRejectBeep", false))
+ xkb->ctrls->ax_options |= XkbAX_SKRejectFBMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_SKRejectFBMask;
+ xkb->ctrls->enabled_ctrls |= XkbSlowKeysMask;
+ }
+ else
+ xkb->ctrls->enabled_ctrls &= ~XkbSlowKeysMask;
+ xkb->ctrls->slow_keys_delay = config->readNumEntry("SlowKeysDelay", 500);
+
+ // bounce keys
+ if (config->readBoolEntry("BounceKeys", false)) {
+ if (config->readBoolEntry("BounceKeysRejectBeep", false))
+ xkb->ctrls->ax_options |= XkbAX_BKRejectFBMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_BKRejectFBMask;
+ xkb->ctrls->enabled_ctrls |= XkbBounceKeysMask;
+ }
+ else
+ xkb->ctrls->enabled_ctrls &= ~XkbBounceKeysMask;
+ xkb->ctrls->debounce_delay = config->readNumEntry("BounceKeysDelay", 500);
+
+ // gestures for enabling the other features
+ _gestures = config->readBoolEntry("Gestures", true);
+ if (_gestures)
+ xkb->ctrls->enabled_ctrls |= XkbAccessXKeysMask;
+ else
+ xkb->ctrls->enabled_ctrls &= ~XkbAccessXKeysMask;
+
+ // timeout
+ if (config->readBoolEntry("AccessXTimeout", false))
+ {
+ xkb->ctrls->ax_timeout = config->readNumEntry("AccessXTimeoutDelay", 30)*60;
+ xkb->ctrls->axt_opts_mask = 0;
+ xkb->ctrls->axt_opts_values = 0;
+ xkb->ctrls->axt_ctrls_mask = XkbStickyKeysMask | XkbSlowKeysMask;
+ xkb->ctrls->axt_ctrls_values = 0;
+ xkb->ctrls->enabled_ctrls |= XkbAccessXTimeoutMask;
+ }
+ else
+ xkb->ctrls->enabled_ctrls &= ~XkbAccessXTimeoutMask;
+
+ // gestures for enabling the other features
+ if (_gestures && config->readBoolEntry("AccessXBeep", true))
+ xkb->ctrls->ax_options |= XkbAX_FeatureFBMask | XkbAX_SlowWarnFBMask;
+ else
+ xkb->ctrls->ax_options &= ~(XkbAX_FeatureFBMask | XkbAX_SlowWarnFBMask);
+
+ _gestureConfirmation = config->readBoolEntry("GestureConfirmation", true);
+
+ _kNotifyModifiers = config->readBoolEntry("kNotifyModifiers", false);
+ _kNotifyAccessX = config->readBoolEntry("kNotifyAccessX", false);
+
+ // mouse-by-keyboard ----------------------------------------------
+
+ config->setGroup("Mouse");
+
+ if (config->readBoolEntry("MouseKeys", false))
+ {
+ xkb->ctrls->mk_delay = config->readNumEntry("MKDelay", 160);
+
+ // Default for initial velocity: 200 pixels/sec
+ int interval = config->readNumEntry("MKInterval", 5);
+ xkb->ctrls->mk_interval = interval;
+
+ // Default time to reach maximum speed: 5000 msec
+ xkb->ctrls->mk_time_to_max = config->readNumEntry("MKTimeToMax",
+ (5000+interval/2)/interval);
+
+ // Default maximum speed: 1000 pixels/sec
+ // (The old default maximum speed from KDE <= 3.4
+ // (100000 pixels/sec) was way too fast)
+ xkb->ctrls->mk_max_speed = config->readNumEntry("MKMaxSpeed", interval);
+
+ xkb->ctrls->mk_curve = config->readNumEntry("MKCurve", 0);
+ xkb->ctrls->mk_dflt_btn = config->readNumEntry("MKDefaultButton", 0);
+
+ xkb->ctrls->enabled_ctrls |= XkbMouseKeysMask;
+ }
+ else
+ xkb->ctrls->enabled_ctrls &= ~XkbMouseKeysMask;
+
+ features = xkb->ctrls->enabled_ctrls & (XkbSlowKeysMask | XkbBounceKeysMask | XkbStickyKeysMask | XkbMouseKeysMask);
+ if (dialog == 0)
+ requestedFeatures = features;
+ // set state
+ XkbSetControls(qt_xdisplay(), XkbControlsEnabledMask | XkbMouseKeysAccelMask | XkbStickyKeysMask | XkbSlowKeysMask | XkbBounceKeysMask | XkbAccessXKeysMask | XkbAccessXTimeoutMask, xkb);
+
+ // select AccessX events
+ XkbSelectEvents(qt_xdisplay(), XkbUseCoreKbd, XkbAllEventsMask, XkbAllEventsMask);
+
+ if (!_artsBell && !_visibleBell && !_gestureConfirmation
+ && !_kNotifyModifiers && !_kNotifyAccessX) {
+
+ // We will exit, but the features need to stay configured
+ uint ctrls = XkbStickyKeysMask | XkbSlowKeysMask | XkbBounceKeysMask | XkbMouseKeysMask | XkbAudibleBellMask | XkbControlsNotifyMask;
+ uint values = xkb->ctrls->enabled_ctrls & ctrls;
+ XkbSetAutoResetControls(qt_xdisplay(), ctrls, &ctrls, &values);
+ exit(0);
+ } else {
+ // reset them after program exit
+ uint ctrls = XkbStickyKeysMask | XkbSlowKeysMask | XkbBounceKeysMask | XkbMouseKeysMask | XkbAudibleBellMask | XkbControlsNotifyMask;
+ uint values = XkbAudibleBellMask;
+ XkbSetAutoResetControls(qt_xdisplay(), ctrls, &ctrls, &values);
+ }
+
+ delete overlay;
+ overlay = 0;
+}
+
+static int maskToBit (int mask) {
+ for (int i = 0; i < 8; i++)
+ if (mask & (1 << i))
+ return i;
+ return -1;
+}
+
+void KAccessApp::initMasks() {
+ for (int i = 0; i < 8; i++)
+ keys [i] = -1;
+ state = 0;
+
+ for (int i = 0; strcmp (modifierKeys[i].name, "") != 0; i++) {
+ int mask = modifierKeys[i].mask;
+ if (mask == 0)
+ if (modifierKeys[i].keysym != 0)
+ mask = XkbKeysymToModifiers (qt_xdisplay(), modifierKeys[i].keysym);
+ else if (!strcmp(modifierKeys[i].name, "Win"))
+ mask = KKeyNative::modX(KKey::WIN);
+ else
+ mask = XkbKeysymToModifiers (qt_xdisplay(), XK_Mode_switch)
+ | XkbKeysymToModifiers (qt_xdisplay(), XK_ISO_Level3_Shift)
+ | XkbKeysymToModifiers (qt_xdisplay(), XK_ISO_Level3_Latch)
+ | XkbKeysymToModifiers (qt_xdisplay(), XK_ISO_Level3_Lock);
+
+ int bit = maskToBit (mask);
+ if (bit != -1 && keys[bit] == -1)
+ keys[bit] = i;
+ }
+}
+
+
+bool KAccessApp::x11EventFilter(XEvent *event)
+{
+ // handle XKB events
+ if (event->type == xkb_opcode)
+ {
+ XkbAnyEvent *ev = (XkbAnyEvent*) event;
+
+ switch (ev->xkb_type) {
+ case XkbStateNotify:
+ xkbStateNotify();
+ break;
+ case XkbBellNotify:
+ xkbBellNotify((XkbBellNotifyEvent*)event);
+ break;
+ case XkbControlsNotify:
+ xkbControlsNotify((XkbControlsNotifyEvent*)event);
+ break;
+ }
+ return true;
+ }
+
+ // process other events as usual
+ return KApplication::x11EventFilter(event);
+}
+
+
+void VisualBell::paintEvent(QPaintEvent *event)
+{
+ QWidget::paintEvent(event);
+ QTimer::singleShot(_pause, this, SLOT(hide()));
+}
+
+
+void KAccessApp::activeWindowChanged(WId wid)
+{
+ _activeWindow = wid;
+}
+
+
+void KAccessApp::xkbStateNotify () {
+ XkbStateRec state_return;
+ XkbGetState (qt_xdisplay(), XkbUseCoreKbd, &state_return);
+ unsigned char latched = XkbStateMods (&state_return);
+ unsigned char locked = XkbModLocks (&state_return);
+ int mods = ((int)locked)<<8 | latched;
+
+ if (state != mods) {
+ if (_kNotifyModifiers)
+ for (int i = 0; i < 8; i++) {
+ if (keys[i] != -1) {
+ if ( (!*modifierKeys[keys[i]].latchedText)
+ && ( (((mods >> i) & 0x101) != 0) != (((state >> i) & 0x101) != 0) ))
+ {
+ if ((mods >> i) & 1) {
+ KNotifyClient::event (0, "lockkey-locked", i18n(modifierKeys[keys[i]].lockedText));
+ }
+ else {
+ KNotifyClient::event (0, "lockkey-unlocked", i18n(modifierKeys[keys[i]].unlatchedText));
+ }
+ }
+ else if ((*modifierKeys[keys[i]].latchedText)
+ && ( ((mods >> i) & 0x101) != ((state >> i) & 0x101) ))
+ {
+ if ((mods >> i) & 0x100) {
+ KNotifyClient::event (0, "modifierkey-locked", i18n(modifierKeys[keys[i]].lockedText));
+ }
+ else if ((mods >> i) & 1) {
+ KNotifyClient::event (0, "modifierkey-latched", i18n(modifierKeys[keys[i]].latchedText));
+ }
+ else {
+ KNotifyClient::event (0, "modifierkey-unlatched", i18n(modifierKeys[keys[i]].unlatchedText));
+ }
+ }
+ }
+ }
+ state = mods;
+ }
+}
+
+void KAccessApp::xkbBellNotify(XkbBellNotifyEvent *event)
+{
+ // bail out if we should not really ring
+ if (event->event_only)
+ return;
+
+ // flash the visible bell
+ if (_visibleBell)
+ {
+ // create overlay widget
+ if (!overlay)
+ overlay = new VisualBell(_visibleBellPause);
+
+ WId id = _activeWindow;
+
+ NETRect frame, window;
+ NETWinInfo net(qt_xdisplay(), id, desktop()->winId(), 0);
+
+ net.kdeGeometry(frame, window);
+
+ overlay->setGeometry(window.pos.x, window.pos.y, window.size.width, window.size.height);
+
+ if (_visibleBellInvert)
+ {
+ QPixmap screen = QPixmap::grabWindow(id, 0, 0, window.size.width, window.size.height);
+ QPixmap invert(window.size.width, window.size.height);
+ QPainter p(&invert);
+ p.setRasterOp(QPainter::NotCopyROP);
+ p.drawPixmap(0, 0, screen);
+ overlay->setBackgroundPixmap(invert);
+ }
+ else
+ overlay->setBackgroundColor(_visibleBellColor);
+
+ // flash the overlay widget
+ overlay->raise();
+ overlay->show();
+ flushX();
+ }
+
+ // ask artsd to ring a nice bell
+ if (_artsBell && !_artsBellBlocked ) {
+ KAudioPlayer::play(_artsBellFile);
+ _artsBellBlocked = true;
+ artsBellTimer->start( 300, true );
+ }
+}
+
+QString mouseKeysShortcut (Display *display) {
+ // Calculate the keycode
+ KeySym sym = XK_MouseKeys_Enable;
+ KeyCode code = XKeysymToKeycode(display, sym);
+ if (code == 0) {
+ sym = XK_Pointer_EnableKeys;
+ code = XKeysymToKeycode(display, sym);
+ if (code == 0)
+ return ""; // No shortcut available?
+ }
+
+ // Calculate the modifiers by searching the keysym in the X keyboard mapping
+ XkbDescPtr xkbdesc = XkbGetMap(display, XkbKeyTypesMask | XkbKeySymsMask, XkbUseCoreKbd);
+
+ if (!xkbdesc)
+ return ""; // Failed to obtain the mapping from server
+
+ bool found = false;
+ unsigned char modifiers = 0;
+ int groups = XkbKeyNumGroups(xkbdesc, code);
+ for (int grp = 0; grp < groups && !found; grp++)
+ {
+ int levels = XkbKeyGroupWidth(xkbdesc, code, grp);
+ for (int level = 0; level < levels && !found; level++)
+ {
+ if (sym == XkbKeySymEntry(xkbdesc, code, level, grp))
+ {
+ // keysym found => determine modifiers
+ int typeIdx = xkbdesc->map->key_sym_map[code].kt_index[grp];
+ XkbKeyTypePtr type = &(xkbdesc->map->types[typeIdx]);
+ for (int i = 0; i < type->map_count && !found; i++)
+ {
+ if (type->map[i].active && (type->map[i].level == level))
+ {
+ modifiers = type->map[i].mods.mask;
+ found = true;
+ }
+ }
+ }
+ }
+ }
+ XkbFreeClientMap (xkbdesc, 0, true);
+
+ if (!found)
+ return ""; // Somehow the keycode -> keysym mapping is flawed
+
+ XEvent ev;
+ ev.xkey.display = display;
+ ev.xkey.keycode = code;
+ ev.xkey.state = 0;
+ KKey key = KKey(KKeyNative(&ev));
+ QString keyname = key.toString();
+
+ unsigned int AltMask = KKeyNative::modX(KKey::ALT);
+ unsigned int WinMask = KKeyNative::modX(KKey::WIN);
+ unsigned int NumMask = KKeyNative::modXNumLock();
+ unsigned int ScrollMask= KKeyNative::modXScrollLock();
+
+ unsigned int MetaMask = XkbKeysymToModifiers (display, XK_Meta_L);
+ unsigned int SuperMask = XkbKeysymToModifiers (display, XK_Super_L);
+ unsigned int HyperMask = XkbKeysymToModifiers (display, XK_Hyper_L);
+ unsigned int AltGrMask = XkbKeysymToModifiers (display, XK_Mode_switch)
+ | XkbKeysymToModifiers (display, XK_ISO_Level3_Shift)
+ | XkbKeysymToModifiers (display, XK_ISO_Level3_Latch)
+ | XkbKeysymToModifiers (display, XK_ISO_Level3_Lock);
+
+ unsigned int mods = ShiftMask | ControlMask | AltMask | WinMask
+ | LockMask | NumMask | ScrollMask;
+
+ AltGrMask &= ~mods;
+ MetaMask &= ~(mods | AltGrMask);
+ SuperMask &= ~(mods | AltGrMask | MetaMask);
+ HyperMask &= ~(mods | AltGrMask | MetaMask | SuperMask);
+
+ if ((modifiers & AltGrMask) != 0)
+ keyname = i18n("AltGraph") + "+" + keyname;
+ if ((modifiers & HyperMask) != 0)
+ keyname = i18n("Hyper") + "+" + keyname;
+ if ((modifiers & SuperMask) != 0)
+ keyname = i18n("Super") + "+" + keyname;
+ if ((modifiers & WinMask) != 0)
+ keyname = i18n("Meta") + "+" + keyname;
+ if ((modifiers & WinMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::WIN) + "+" + keyname;
+ if ((modifiers & AltMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::ALT) + "+" + keyname;
+ if ((modifiers & ControlMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::CTRL) + "+" + keyname;
+ if ((modifiers & ShiftMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::SHIFT) + "+" + keyname;
+
+ return keyname;
+}
+
+void KAccessApp::createDialogContents() {
+ if (dialog == 0) {
+ dialog = new KDialogBase(
+ i18n("Warning"),
+ KDialogBase::Yes | KDialogBase::No,
+ KDialogBase::Yes, KDialogBase::Close,
+ 0, "AccessXWarning", true, true,
+ KStdGuiItem::cont(), KStdGuiItem::cancel());
+
+ QVBox *topcontents = new QVBox (dialog);
+ topcontents->setSpacing(KDialog::spacingHint()*2);
+ topcontents->setMargin(KDialog::marginHint());
+
+ QWidget *contents = new QWidget(topcontents);
+ QHBoxLayout * lay = new QHBoxLayout(contents);
+ lay->setSpacing(KDialog::spacingHint());
+
+ QLabel *label1 = new QLabel( contents);
+ QPixmap pixmap = KApplication::kApplication()->iconLoader()->loadIcon("messagebox_warning", KIcon::NoGroup, KIcon::SizeMedium, KIcon::DefaultState, 0, true);
+ if (pixmap.isNull())
+ pixmap = QMessageBox::standardIcon(QMessageBox::Warning);
+ label1->setPixmap(pixmap);
+
+ lay->addWidget( label1, 0, Qt::AlignCenter );
+ lay->addSpacing(KDialog::spacingHint());
+
+ QVBoxLayout * vlay = new QVBoxLayout(lay);
+
+ featuresLabel = new QLabel( "", contents );
+ featuresLabel->setAlignment( WordBreak|AlignVCenter );
+ vlay->addWidget( featuresLabel );
+ vlay->addStretch();
+
+ QHBoxLayout * hlay = new QHBoxLayout(vlay);
+
+ QLabel *showModeLabel = new QLabel( i18n("&When a gesture was used:"), contents );
+ hlay->addWidget( showModeLabel );
+
+ showModeCombobox = new KComboBox (contents);
+ hlay->addWidget( showModeCombobox );
+ showModeLabel->setBuddy(showModeCombobox);
+ showModeCombobox->insertItem ( i18n("Change Settings Without Asking"), 0);
+ showModeCombobox->insertItem ( i18n("Show This Confirmation Dialog"), 1);
+ showModeCombobox->insertItem ( i18n("Deactivate All AccessX Features & Gestures"), 2);
+ showModeCombobox->setCurrentItem (1);
+
+ dialog->setMainWidget(topcontents);
+ dialog->enableButtonSeparator(false);
+
+ connect (dialog, SIGNAL(yesClicked()), this, SLOT(yesClicked()));
+ connect (dialog, SIGNAL(noClicked()), this, SLOT(noClicked()));
+ connect (dialog, SIGNAL(closeClicked()), this, SLOT(dialogClosed()));
+ }
+}
+
+void KAccessApp::xkbControlsNotify(XkbControlsNotifyEvent *event)
+{
+ unsigned int newFeatures = event->enabled_ctrls & (XkbSlowKeysMask | XkbBounceKeysMask | XkbStickyKeysMask | XkbMouseKeysMask);
+
+ if (newFeatures != features) {
+ unsigned int enabled = newFeatures & ~features;
+ unsigned int disabled = features & ~newFeatures;
+
+ if (!_gestureConfirmation) {
+ requestedFeatures = enabled | (requestedFeatures & ~disabled);
+ notifyChanges();
+ features = newFeatures;
+ }
+ else {
+ // set the AccessX features back to what they were. We will
+ // apply the changes later if the user allows us to do that.
+ readSettings();
+
+ requestedFeatures = enabled | (requestedFeatures & ~disabled);
+
+ enabled = requestedFeatures & ~features;
+ disabled = features & ~requestedFeatures;
+
+ QStringList enabledFeatures;
+ QStringList disabledFeatures;
+
+ if (enabled & XkbStickyKeysMask)
+ enabledFeatures << i18n("Sticky keys");
+ else if (disabled & XkbStickyKeysMask)
+ disabledFeatures << i18n("Sticky keys");
+
+ if (enabled & XkbSlowKeysMask)
+ enabledFeatures << i18n("Slow keys");
+ else if (disabled & XkbSlowKeysMask)
+ disabledFeatures << i18n("Slow keys");
+
+ if (enabled & XkbBounceKeysMask)
+ enabledFeatures << i18n("Bounce keys");
+ else if (disabled & XkbBounceKeysMask)
+ disabledFeatures << i18n("Bounce keys");
+
+ if (enabled & XkbMouseKeysMask)
+ enabledFeatures << i18n("Mouse keys");
+ else if (disabled & XkbMouseKeysMask)
+ disabledFeatures << i18n("Mouse keys");
+
+ QString question;
+ switch (enabledFeatures.count()) {
+ case 0: switch (disabledFeatures.count()) {
+ case 1: question = i18n("Do you really want to deactivate \"%1\"?")
+ .arg(disabledFeatures[0]);
+ break;
+ case 2: question = i18n("Do you really want to deactivate \"%1\" and \"%2\"?")
+ .arg(disabledFeatures[0]).arg(disabledFeatures[1]);
+ break;
+ case 3: question = i18n("Do you really want to deactivate \"%1\", \"%2\" and \"%3\"?")
+ .arg(disabledFeatures[0]).arg(disabledFeatures[1])
+ .arg(disabledFeatures[2]);
+ break;
+ case 4: question = i18n("Do you really want to deactivate \"%1\", \"%2\", \"%3\" and \"%4\"?")
+ .arg(disabledFeatures[0]).arg(disabledFeatures[1])
+ .arg(disabledFeatures[2]).arg(disabledFeatures[3]);
+ break;
+ }
+ break;
+ case 1: switch (disabledFeatures.count()) {
+ case 0: question = i18n("Do you really want to activate \"%1\"?")
+ .arg(enabledFeatures[0]);
+ break;
+ case 1: question = i18n("Do you really want to activate \"%1\" and to deactivate \"%2\"?")
+ .arg(enabledFeatures[0]).arg(disabledFeatures[0]);
+ break;
+ case 2: question = i18n("Do you really want to activate \"%1\" and to deactivate \"%2\" and \"%3\"?")
+ .arg(enabledFeatures[0]).arg(disabledFeatures[0])
+ .arg(disabledFeatures[1]);
+ break;
+ case 3: question = i18n("Do you really want to activate \"%1\" and to deactivate \"%2\", \"%3\" and \"%4\"?")
+ .arg(enabledFeatures[0]).arg(disabledFeatures[0])
+ .arg(disabledFeatures[1]).arg(disabledFeatures[2]);
+ break;
+ }
+ break;
+ case 2: switch (disabledFeatures.count()) {
+ case 0: question = i18n("Do you really want to activate \"%1\" and \"%2\"?")
+ .arg(enabledFeatures[0]).arg(enabledFeatures[1]);
+ break;
+ case 1: question = i18n("Do you really want to activate \"%1\" and \"%2\" and to deactivate \"%3\"?")
+ .arg(enabledFeatures[0]).arg(enabledFeatures[1])
+ .arg(disabledFeatures[0]);
+ break;
+ case 2: question = i18n("Do you really want to activate \"%1\", and \"%2\" and to deactivate \"%3\" and \"%4\"?")
+ .arg(enabledFeatures[0]).arg(enabledFeatures[1])
+ .arg(enabledFeatures[0]).arg(disabledFeatures[1]);
+ break;
+ }
+ break;
+ case 3: switch (disabledFeatures.count()) {
+ case 0: question = i18n("Do you really want to activate \"%1\", \"%2\" and \"%3\"?")
+ .arg(enabledFeatures[0]).arg(enabledFeatures[1])
+ .arg(enabledFeatures[2]);
+ break;
+ case 1: question = i18n("Do you really want to activate \"%1\", \"%2\" and \"%3\" and to deactivate \"%4\"?")
+ .arg(enabledFeatures[0]).arg(enabledFeatures[1])
+ .arg(enabledFeatures[2]).arg(disabledFeatures[0]);
+ break;
+ }
+ break;
+ case 4: question = i18n("Do you really want to activate \"%1\", \"%2\", \"%3\" and \"%4\"?")
+ .arg(enabledFeatures[0]).arg(enabledFeatures[1])
+ .arg(enabledFeatures[2]).arg(enabledFeatures[3]);
+ break;
+ }
+ QString explanation;
+ if (enabledFeatures.count()+disabledFeatures.count() == 1) {
+ explanation = i18n("An application has requested to change this setting.");
+
+ if (_gestures) {
+ if ((enabled | disabled) == XkbSlowKeysMask)
+ explanation = i18n("You held down the Shift key for 8 seconds or an application has requested to change this setting.");
+ else if ((enabled | disabled) == XkbStickyKeysMask)
+ explanation = i18n("You pressed the Shift key 5 consecutive times or an application has requested to change this setting.");
+ else if ((enabled | disabled) == XkbMouseKeysMask) {
+ QString shortcut = mouseKeysShortcut(qt_xdisplay());
+ if (!shortcut.isEmpty() && !shortcut.isNull())
+ explanation = i18n("You pressed %1 or an application has requested to change this setting.").arg(shortcut);
+ }
+ }
+ }
+ else {
+ if (_gestures)
+ explanation = i18n("An application has requested to change these settings, or you used a combination of several keyboard gestures.");
+ else
+ explanation = i18n("An application has requested to change these settings.");
+ }
+
+ createDialogContents();
+ featuresLabel->setText ( question+"\n\n"+explanation
+ +" "+i18n("These AccessX settings are needed for some users with motion impairments and can be configured in the KDE Control Center. You can also turn them on and off with standardized keyboard gestures.\n\nIf you do not need them, you can select \"Deactivate all AccessX features and gestures\".") );
+
+ KWin::setState( dialog->winId(), NET::KeepAbove );
+ kapp->updateUserTimestamp();
+ dialog->show();
+ }
+ }
+}
+
+void KAccessApp::notifyChanges() {
+ if (!_kNotifyAccessX)
+ return;
+
+ unsigned int enabled = requestedFeatures & ~features;
+ unsigned int disabled = features & ~requestedFeatures;
+
+ if (enabled & XkbSlowKeysMask)
+ KNotifyClient::event (0, "slowkeys", i18n("Slow keys has been enabled. From now on, you need to press each key for a certain length of time before it is accepted."));
+ else if (disabled & XkbSlowKeysMask)
+ KNotifyClient::event (0, "slowkeys", i18n("Slow keys has been disabled."));
+
+ if (enabled & XkbBounceKeysMask)
+ KNotifyClient::event (0, "bouncekeys", i18n("Bounce keys has been enabled. From now on, each key will be blocked for a certain length of time after it is used."));
+ else if (disabled & XkbBounceKeysMask)
+ KNotifyClient::event (0, "bouncekeys", i18n("Bounce keys has been disabled."));
+
+ if (enabled & XkbStickyKeysMask)
+ KNotifyClient::event (0, "stickykeys", i18n("Sticky keys has been enabled. From now on, modifier keys will stay latched after you have released them."));
+ else if (disabled & XkbStickyKeysMask)
+ KNotifyClient::event (0, "stickykeys", i18n("Sticky keys has been disabled."));
+
+ if (enabled & XkbMouseKeysMask)
+ KNotifyClient::event (0, "mousekeys", i18n("Mouse keys has been enabled. From now on, you can use the number pad of your keyboard in order to control the mouse."));
+ else if (disabled & XkbMouseKeysMask)
+ KNotifyClient::event (0, "mousekeys", i18n("Mouse keys has been disabled."));
+}
+
+void KAccessApp::applyChanges() {
+ notifyChanges();
+ unsigned int enabled = requestedFeatures & ~features;
+ unsigned int disabled = features & ~requestedFeatures;
+
+ KConfig *config = KGlobal::config();
+ config->setGroup("Keyboard");
+
+ if (enabled & XkbSlowKeysMask)
+ config->writeEntry("SlowKeys", true);
+ else if (disabled & XkbSlowKeysMask)
+ config->writeEntry("SlowKeys", false);
+
+ if (enabled & XkbBounceKeysMask)
+ config->writeEntry("BounceKeys", true);
+ else if (disabled & XkbBounceKeysMask)
+ config->writeEntry("BounceKeys", false);
+
+ if (enabled & XkbStickyKeysMask)
+ config->writeEntry("StickyKeys", true);
+ else if (disabled & XkbStickyKeysMask)
+ config->writeEntry("StickyKeys", false);
+
+ config->setGroup("Mouse");
+
+ if (enabled & XkbMouseKeysMask)
+ config->writeEntry("MouseKeys", true);
+ else if (disabled & XkbMouseKeysMask)
+ config->writeEntry("MouseKeys", false);
+
+ config->sync();
+}
+
+void KAccessApp::yesClicked() {
+ if (dialog != 0)
+ dialog->deleteLater();
+ dialog = 0;
+
+ KConfig *config = KGlobal::config();
+ config->setGroup("Keyboard");
+ switch (showModeCombobox->currentItem()) {
+ case 0:
+ config->writeEntry("Gestures", true);
+ config->writeEntry("GestureConfirmation", false);
+ break;
+ default:
+ config->writeEntry("Gestures", true);
+ config->writeEntry("GestureConfirmation", true);
+ break;
+ case 2:
+ requestedFeatures = 0;
+ config->writeEntry("Gestures", false);
+ config->writeEntry("GestureConfirmation", false);
+ }
+ config->sync();
+
+ if (features != requestedFeatures) {
+ notifyChanges();
+ applyChanges();
+ }
+ readSettings();
+}
+
+void KAccessApp::noClicked() {
+ if (dialog != 0)
+ dialog->deleteLater();
+ dialog = 0;
+ requestedFeatures = features;
+
+ KConfig *config = KGlobal::config();
+ config->setGroup("Keyboard");
+ switch (showModeCombobox->currentItem()) {
+ case 0:
+ config->writeEntry("Gestures", true);
+ config->writeEntry("GestureConfirmation", false);
+ break;
+ default:
+ config->writeEntry("Gestures", true);
+ config->writeEntry("GestureConfirmation", true);
+ break;
+ case 2:
+ requestedFeatures = 0;
+ config->writeEntry("Gestures", false);
+ config->writeEntry("GestureConfirmation", true);
+ }
+ config->sync();
+
+ if (features != requestedFeatures)
+ applyChanges();
+ readSettings();
+}
+
+void KAccessApp::dialogClosed() {
+ if (dialog != 0)
+ dialog->deleteLater();
+ dialog = 0;
+
+ requestedFeatures = features;
+}
+
+void KAccessApp::slotArtsBellTimeout()
+{
+ _artsBellBlocked = false;
+}
+
+void KAccessApp::setXkbOpcode(int opcode)
+{
+ xkb_opcode = opcode;
+}
diff --git a/kcontrol/access/kaccess.desktop b/kcontrol/access/kaccess.desktop
new file mode 100644
index 000000000..6fbd7f668
--- /dev/null
+++ b/kcontrol/access/kaccess.desktop
@@ -0,0 +1,78 @@
+[Desktop Entry]
+Type=Service
+Name=KDE Accessibility Tool
+Name[af]=KDE toeganklikheid program
+Name[ar]=أداة KDE لتسهيل الوصول
+Name[az]=KDE Yetişmə Qabiliyyəti Vasitəsi
+Name[be]=Інструмент даступнасці KDE
+Name[bg]=Равностоен достъп
+Name[bn]=কে.ডি.ই. সহায়ক প্রযুক্তি টুল
+Name[br]=Ostilh haezadusted KDE
+Name[bs]=KDE alat za pristupačnost
+Name[ca]=Eina d'accessibilitat KDE
+Name[cs]=Nástroj pro zpřístupnění prostředí KDE
+Name[csb]=Pòmòce przistãpù KDE
+Name[cy]=Erfyn Hygyrchedd KDE
+Name[da]=KDE Tilgængelighedsværktøj
+Name[de]=KDE-Zugangshilfe
+Name[el]=Εργαλείο προσιτότητας του KDE
+Name[eo]=KDE-ilo por Alirebleco
+Name[es]=Herramienta de accesibilidad de KDE
+Name[et]=KDE hõlbustusvahend
+Name[eu]=KDEren erabilerraztasun tresna
+Name[fa]=ابزار دستیابی‌پذیری KDE
+Name[fi]=KDE:n helppokäyttötoiminnot
+Name[fr]=Outil d'accessibilité de KDE
+Name[fy]=KDE Tagonklikens
+Name[ga]=Uirlis Inrochtaineachta KDE
+Name[gl]=Ferramenta de Acesibilidade de KDE
+Name[he]=כלי הנגישות של KDE
+Name[hi]=केडीई एक्सेसिबिलिटी औजार
+Name[hr]=KDE pristupačnost
+Name[hu]=KDE kezelési segédeszköz
+Name[is]=KDE aðgengistól
+Name[it]=Strumento per l'accessibilità di KDE
+Name[ja]=KDE アクセシビリティ支援ツール
+Name[ka]=KDE-ს სპეცეციალური შესაძლებლობების ხელსაწყოები
+Name[kk]=KDE арнайы мүмкіндіктер құралы
+Name[km]=ឧបករណ៍​មធ្យោបាយងាយស្រួល KDE
+Name[ko]=KDE 접근성 도구
+Name[lt]=KDE prieinamumo įrankis
+Name[lv]=KDE pieejamības rīks
+Name[mk]=Алатка за пристапливост во KDE
+Name[ms]=Alat Keaksesan KDE
+Name[mt]=Għodda KDE għall-aċċessibbiltà
+Name[nb]=Tilgjengelighetsverktøy for KDE
+Name[nds]=KDE-Warktüüch för Behinnerte
+Name[ne]=KDE पहुँचयोग्य उपकरण
+Name[nl]=KDE Toegankelijkheid
+Name[nn]=Tilgjengeverktøy for KDE
+Name[pa]=KDE ਸਹਾਇਕ ਸੰਦ
+Name[pl]=Ułatwienia dostępu KDE
+Name[pt]=Ferramenta de Acessibilidade do KDE
+Name[pt_BR]=Ferramenta de Acessibilidade do KDE
+Name[ro]=Utilitar de accesibilitate pentru KDE
+Name[ru]=Специальные возможности
+Name[rw]=Igikoresho cy'Ukugerwaho cya KDE
+Name[se]=KDE reaidu álkkibut geavaheami várás
+Name[sk]=KDE sprístupnenie
+Name[sl]=Orodje za dostopnost KDE
+Name[sr]=KDE алатка за приступачност
+Name[sr@Latn]=KDE alatka za pristupačnost
+Name[sv]=Handikappverktyg för KDE
+Name[ta]=KDE அணுகும் கருவி
+Name[tg]=Барномаи Тавонёбии KDE
+Name[th]=เครื่องมือปรับแต่งการช่วยใารใช้ของงาน KDE
+Name[tr]=KDE Erişilebilirlik Aracı
+Name[tt]=KDE'neñ Qulaylıq Qoralı
+Name[uk]=Утиліта керування доступності KDE
+Name[uz]=KDE qulaylik vositasi
+Name[uz@cyrillic]=KDE қулайлик воситаси
+Name[vi]=Công cụ hỗ trợ người tàn tật cho KDE
+Name[wa]=Usteye d' accessibilité KDE
+Name[zh_CN]=KDE 辅助工具
+Name[zh_TW]=KDE 無障礙工具
+Exec=kaccess
+X-DCOP-ServiceType=None
+X-KDE-ParentApp=kcontrol
+DocPath=kcontrol/kcmaccess/index.html
diff --git a/kcontrol/access/kaccess.h b/kcontrol/access/kaccess.h
new file mode 100644
index 000000000..d75d0bdb6
--- /dev/null
+++ b/kcontrol/access/kaccess.h
@@ -0,0 +1,114 @@
+#ifndef __K_ACCESS_H__
+#define __K_ACCESS_H__
+
+
+#include <qwidget.h>
+#include <qcolor.h>
+
+
+#include <kuniqueapplication.h>
+#include <kwinmodule.h>
+
+
+#include <X11/Xlib.h>
+#define explicit int_explicit // avoid compiler name clash in XKBlib.h
+#include <X11/XKBlib.h>
+#undef explicit
+
+class KDialogBase;
+class QLabel;
+class KComboBox;
+
+class KAccessApp : public KUniqueApplication
+{
+ Q_OBJECT
+
+public:
+
+ KAccessApp(bool allowStyles=true, bool GUIenabled=true);
+
+ bool x11EventFilter(XEvent *event);
+
+ int newInstance();
+
+ void setXkbOpcode(int opcode);
+
+protected:
+
+ void readSettings();
+
+ void xkbStateNotify();
+ void xkbBellNotify(XkbBellNotifyEvent *event);
+ void xkbControlsNotify(XkbControlsNotifyEvent *event);
+
+
+private slots:
+
+ void activeWindowChanged(WId wid);
+ void slotArtsBellTimeout();
+ void notifyChanges();
+ void applyChanges();
+ void yesClicked();
+ void noClicked();
+ void dialogClosed();
+
+private:
+ void createDialogContents();
+ void initMasks();
+
+ int xkb_opcode;
+ unsigned int features;
+ unsigned int requestedFeatures;
+
+ bool _systemBell, _artsBell, _visibleBell, _visibleBellInvert;
+ bool _artsBellBlocked;
+ QString _artsBellFile;
+ QColor _visibleBellColor;
+ int _visibleBellPause;
+
+ bool _gestures, _gestureConfirmation;
+ bool _kNotifyModifiers, _kNotifyAccessX;
+
+ QWidget *overlay;
+
+ QTimer *artsBellTimer;
+
+ KWinModule wm;
+
+ WId _activeWindow;
+
+ KDialogBase *dialog;
+ QLabel *featuresLabel;
+ KComboBox *showModeCombobox;
+
+ int keys[8];
+ int state;
+};
+
+
+class VisualBell : public QWidget
+{
+ Q_OBJECT
+
+public:
+
+ VisualBell(int pause)
+ : QWidget(0, 0, WX11BypassWM), _pause(pause)
+ {};
+
+
+protected:
+
+ void paintEvent(QPaintEvent *);
+
+
+private:
+
+ int _pause;
+
+};
+
+
+
+
+#endif
diff --git a/kcontrol/access/kcmaccess.cpp b/kcontrol/access/kcmaccess.cpp
new file mode 100644
index 000000000..661748e1d
--- /dev/null
+++ b/kcontrol/access/kcmaccess.cpp
@@ -0,0 +1,805 @@
+/**
+ * kcmaccess.cpp
+ *
+ * Copyright (c) 2000 Matthias H�zer-Klpfel
+ *
+ */
+
+
+#include <stdlib.h>
+#include <math.h>
+
+#include <dcopref.h>
+
+#include <qtabwidget.h>
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qlineedit.h>
+#include <qradiobutton.h>
+#include <qwhatsthis.h>
+#include <qslider.h>
+#include <qspinbox.h>
+
+
+#include <kcombobox.h>
+#include <kstandarddirs.h>
+#include <kcolorbutton.h>
+#include <kfiledialog.h>
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kshortcut.h>
+#include <kkeynative.h>
+#include <knotifydialog.h>
+
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+#define XK_MISCELLANY
+#define XK_XKB_KEYS
+#include <X11/keysymdef.h>
+
+#include "kcmaccess.moc"
+
+
+ExtendedIntNumInput::ExtendedIntNumInput
+ (QWidget* parent, const char* name)
+ : KIntNumInput(parent, name)
+{
+}
+
+ExtendedIntNumInput::~ExtendedIntNumInput () {
+}
+
+void ExtendedIntNumInput::setRange(int min, int max, int step, bool slider) {
+ KIntNumInput::setRange (min,max,step, slider);
+
+ if (slider) {
+ disconnect(m_slider, SIGNAL(valueChanged(int)),
+ m_spin, SLOT(setValue(int)));
+ disconnect(m_spin, SIGNAL(valueChanged(int)),
+ this, SLOT(spinValueChanged(int)));
+
+ this->min = min;
+ this->max = max;
+ sliderMax = (int)floor (0.5
+ + 2*(log(max)-log(min)) / (log(max)-log(max-1)));
+ m_slider->setRange(0, sliderMax);
+ m_slider->setSteps(step, sliderMax/10);
+ m_slider->setTickInterval(sliderMax/10);
+
+ double alpha = sliderMax / (log(max) - log(min));
+ double logVal = alpha * (log(value())-log(min));
+ m_slider->setValue ((int)floor (0.5 + logVal));
+
+ connect(m_slider, SIGNAL(valueChanged(int)),
+ this, SLOT(slotSliderValueChanged(int)));
+ connect(m_spin, SIGNAL(valueChanged(int)),
+ this, SLOT(slotSpinValueChanged(int)));
+ }
+}
+
+// Basically the slider values are logarithmic whereas
+// spinbox values are linear.
+
+void ExtendedIntNumInput::slotSpinValueChanged(int val)
+{
+
+ if(m_slider) {
+ double alpha = sliderMax / (log(max) - log(min));
+ double logVal = alpha * (log(val)-log(min));
+ m_slider->setValue ((int)floor (0.5 + logVal));
+ }
+
+ emit valueChanged(val);
+}
+
+void ExtendedIntNumInput::slotSliderValueChanged(int val)
+{
+ double alpha = sliderMax / (log(max) - log(min));
+ double linearVal = exp (val/alpha + log(min));
+ m_spin->setValue ((int)floor(0.5 + linearVal));
+}
+
+static bool needToRunKAccessDaemon( KConfig *config )
+{
+ // We always start the KAccess Daemon, if it is not needed,
+ // it will terminate itself after configuring the AccessX
+ // features.
+ return true;
+}
+
+QString mouseKeysShortcut (Display *display) {
+ // Calculate the keycode
+ KeySym sym = XK_MouseKeys_Enable;
+ KeyCode code = XKeysymToKeycode(display, sym);
+ if (code == 0) {
+ sym = XK_Pointer_EnableKeys;
+ code = XKeysymToKeycode(display, sym);
+ if (code == 0)
+ return ""; // No shortcut available?
+ }
+
+ // Calculate the modifiers by searching the keysym in the X keyboard mapping
+ XkbDescPtr xkbdesc = XkbGetMap(display, XkbKeyTypesMask | XkbKeySymsMask, XkbUseCoreKbd);
+ if (!xkbdesc)
+ return ""; // Failed to obtain the mapping from server
+
+ bool found = false;
+ unsigned char modifiers = 0;
+ int groups = XkbKeyNumGroups(xkbdesc, code);
+ for (int grp = 0; grp < groups && !found; grp++)
+ {
+ int levels = XkbKeyGroupWidth(xkbdesc, code, grp);
+ for (int level = 0; level < levels && !found; level++)
+ {
+ if (sym == XkbKeySymEntry(xkbdesc, code, level, grp))
+ {
+ // keysym found => determine modifiers
+ int typeIdx = xkbdesc->map->key_sym_map[code].kt_index[grp];
+ XkbKeyTypePtr type = &(xkbdesc->map->types[typeIdx]);
+ for (int i = 0; i < type->map_count && !found; i++)
+ {
+ if (type->map[i].active && (type->map[i].level == level))
+ {
+ modifiers = type->map[i].mods.mask;
+ found = true;
+ }
+ }
+ }
+ }
+ }
+ XkbFreeClientMap (xkbdesc, 0, true);
+
+ if (!found)
+ return ""; // Somehow the keycode -> keysym mapping is flawed
+
+ XEvent ev;
+ ev.xkey.display = display;
+ ev.xkey.keycode = code;
+ ev.xkey.state = 0;
+ KKey key = KKey(KKeyNative(&ev));
+ QString keyname = key.toString();
+
+ unsigned int AltMask = KKeyNative::modX(KKey::ALT);
+ unsigned int WinMask = KKeyNative::modX(KKey::WIN);
+ unsigned int NumMask = KKeyNative::modXNumLock();
+ unsigned int ScrollMask= KKeyNative::modXScrollLock();
+
+ unsigned int MetaMask = XkbKeysymToModifiers (display, XK_Meta_L);
+ unsigned int SuperMask = XkbKeysymToModifiers (display, XK_Super_L);
+ unsigned int HyperMask = XkbKeysymToModifiers (display, XK_Hyper_L);
+ unsigned int AltGrMask = XkbKeysymToModifiers (display, XK_Mode_switch)
+ | XkbKeysymToModifiers (display, XK_ISO_Level3_Shift)
+ | XkbKeysymToModifiers (display, XK_ISO_Level3_Latch)
+ | XkbKeysymToModifiers (display, XK_ISO_Level3_Lock);
+
+ unsigned int mods = ShiftMask | ControlMask | AltMask | WinMask
+ | LockMask | NumMask | ScrollMask;
+
+ AltGrMask &= ~mods;
+ MetaMask &= ~(mods | AltGrMask);
+ SuperMask &= ~(mods | AltGrMask | MetaMask);
+ HyperMask &= ~(mods | AltGrMask | MetaMask | SuperMask);
+
+ if ((modifiers & AltGrMask) != 0)
+ keyname = i18n("AltGraph") + "+" + keyname;
+ if ((modifiers & HyperMask) != 0)
+ keyname = i18n("Hyper") + "+" + keyname;
+ if ((modifiers & SuperMask) != 0)
+ keyname = i18n("Super") + "+" + keyname;
+ if ((modifiers & WinMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::WIN) + "+" + keyname;
+ if ((modifiers & AltMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::ALT) + "+" + keyname;
+ if ((modifiers & ControlMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::CTRL) + "+" + keyname;
+ if ((modifiers & ShiftMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::SHIFT) + "+" + keyname;
+
+ QString result;
+ if ((modifiers & ScrollMask) != 0)
+ if ((modifiers & LockMask) != 0)
+ if ((modifiers & NumMask) != 0)
+ result = i18n("Press %1 while NumLock, CapsLock and ScrollLock are active");
+ else
+ result = i18n("Press %1 while CapsLock and ScrollLock are active");
+ else if ((modifiers & NumMask) != 0)
+ result = i18n("Press %1 while NumLock and ScrollLock are active");
+ else
+ result = i18n("Press %1 while ScrollLock is active");
+ else if ((modifiers & LockMask) != 0)
+ if ((modifiers & NumMask) != 0)
+ result = i18n("Press %1 while NumLock and CapsLock are active");
+ else
+ result = i18n("Press %1 while CapsLock is active");
+ else if ((modifiers & NumMask) != 0)
+ result = i18n("Press %1 while NumLock is active");
+ else
+ result = i18n("Press %1");
+
+ return result.arg(keyname);
+}
+
+KAccessConfig::KAccessConfig(QWidget *parent, const char *)
+ : KCModule(parent, "kcmaccess")
+{
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kaccess"), I18N_NOOP("KDE Accessibility Tool"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2000, Matthias Hoelzer-Kluepfel"));
+
+ about->addAuthor("Matthias Hoelzer-Kluepfel", I18N_NOOP("Author") , "hoelzer@kde.org");
+
+ setAboutData( about );
+
+ QVBoxLayout *main = new QVBoxLayout(this, 0, KDialogBase::spacingHint());
+ QTabWidget *tab = new QTabWidget(this);
+ main->addWidget(tab);
+
+ // bell settings ---------------------------------------
+ QWidget *bell = new QWidget(this);
+
+ QVBoxLayout *vbox = new QVBoxLayout(bell, KDialogBase::marginHint(),
+ KDialogBase::spacingHint());
+
+ QGroupBox *grp = new QGroupBox(i18n("Audible Bell"), bell);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ QVBoxLayout *vvbox = new QVBoxLayout(grp->layout(),
+ KDialogBase::spacingHint());
+
+ systemBell = new QCheckBox(i18n("Use &system bell"), grp);
+ vvbox->addWidget(systemBell);
+ customBell = new QCheckBox(i18n("Us&e customized bell"), grp);
+ vvbox->addWidget(customBell);
+ QWhatsThis::add( systemBell, i18n("If this option is checked, the default system bell will be used. See the"
+ " \"System Bell\" control module for how to customize the system bell."
+ " Normally, this is just a \"beep\".") );
+ QWhatsThis::add( customBell, i18n("Check this option if you want to use a customized bell, playing"
+ " a sound file. If you do this, you will probably want to turn off the system bell.<p> Please note"
+ " that on slow machines this may cause a \"lag\" between the event causing the bell and the sound being played.") );
+
+ QHBoxLayout *hbox = new QHBoxLayout(vvbox, KDialogBase::spacingHint());
+ hbox->addSpacing(24);
+ soundEdit = new QLineEdit(grp);
+ soundLabel = new QLabel(soundEdit, i18n("Sound &to play:"), grp);
+ hbox->addWidget(soundLabel);
+ hbox->addWidget(soundEdit);
+ soundButton = new QPushButton(i18n("Browse..."), grp);
+ hbox->addWidget(soundButton);
+ QString wtstr = i18n("If the option \"Use customized bell\" is enabled, you can choose a sound file here."
+ " Click \"Browse...\" to choose a sound file using the file dialog.");
+ QWhatsThis::add( soundEdit, wtstr );
+ QWhatsThis::add( soundLabel, wtstr );
+ QWhatsThis::add( soundButton, wtstr );
+
+ connect(soundButton, SIGNAL(clicked()), this, SLOT(selectSound()));
+
+ connect(customBell, SIGNAL(clicked()), this, SLOT(checkAccess()));
+
+ connect(systemBell, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(customBell, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(soundEdit, SIGNAL(textChanged(const QString&)), this, SLOT(configChanged()));
+
+ // -----------------------------------------------------
+
+ // visible bell ----------------------------------------
+ grp = new QGroupBox(i18n("Visible Bell"), bell);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ visibleBell = new QCheckBox(i18n("&Use visible bell"), grp);
+ vvbox->addWidget(visibleBell);
+ QWhatsThis::add( visibleBell, i18n("This option will turn on the \"visible bell\", i.e. a visible"
+ " notification shown every time that normally just a bell would occur. This is especially useful"
+ " for deaf people.") );
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ invertScreen = new QRadioButton(i18n("I&nvert screen"), grp);
+ hbox->addWidget(invertScreen);
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ QWhatsThis::add( invertScreen, i18n("All screen colors will be inverted for the amount of time specified below.") );
+ hbox->addSpacing(24);
+ flashScreen = new QRadioButton(i18n("F&lash screen"), grp);
+ hbox->addWidget(flashScreen);
+ QWhatsThis::add( flashScreen, i18n("The screen will turn to a custom color for the amount of time specified below.") );
+ hbox->addSpacing(12);
+ colorButton = new KColorButton(grp);
+ colorButton->setFixedWidth(colorButton->sizeHint().height()*2);
+ hbox->addWidget(colorButton);
+ hbox->addStretch();
+ QWhatsThis::add( colorButton, i18n("Click here to choose the color used for the \"flash screen\" visible bell.") );
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+
+ durationSlider = new ExtendedIntNumInput(grp);
+ durationSlider->setRange(100, 2000, 100);
+ durationSlider->setLabel(i18n("Duration:"));
+ durationSlider->setSuffix(i18n(" msec"));
+ hbox->addWidget(durationSlider);
+ QWhatsThis::add( durationSlider, i18n("Here you can customize the duration of the \"visible bell\" effect being shown.") );
+
+ connect(invertScreen, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(flashScreen, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(visibleBell, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(visibleBell, SIGNAL(clicked()), this, SLOT(checkAccess()));
+ connect(colorButton, SIGNAL(clicked()), this, SLOT(changeFlashScreenColor()));
+
+ connect(invertScreen, SIGNAL(clicked()), this, SLOT(invertClicked()));
+ connect(flashScreen, SIGNAL(clicked()), this, SLOT(flashClicked()));
+
+ connect(durationSlider, SIGNAL(valueChanged(int)), this, SLOT(configChanged()));
+
+ vbox->addStretch();
+
+ // -----------------------------------------------------
+
+ tab->addTab(bell, i18n("&Bell"));
+
+
+ // modifier key settings -------------------------------
+ QWidget *modifiers = new QWidget(this);
+
+ vbox = new QVBoxLayout(modifiers, KDialog::marginHint(), KDialog::spacingHint());
+
+ grp = new QGroupBox(i18n("S&ticky Keys"), modifiers);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ stickyKeys = new QCheckBox(i18n("Use &sticky keys"), grp);
+ vvbox->addWidget(stickyKeys);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ stickyKeysLock = new QCheckBox(i18n("&Lock sticky keys"), grp);
+ hbox->addWidget(stickyKeysLock);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ stickyKeysAutoOff = new QCheckBox(i18n("Turn sticky keys off when two keys are pressed simultaneously"), grp);
+ hbox->addWidget(stickyKeysAutoOff);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ stickyKeysBeep = new QCheckBox(i18n("Use system bell whenever a modifier gets latched, locked or unlocked"), grp);
+ hbox->addWidget(stickyKeysBeep);
+
+ grp = new QGroupBox(i18n("Locking Keys"), modifiers);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ toggleKeysBeep = new QCheckBox(i18n("Use system bell whenever a locking key gets activated or deactivated"), grp);
+ vvbox->addWidget(toggleKeysBeep);
+
+ kNotifyModifiers = new QCheckBox(i18n("Use KDE's system notification mechanism whenever a modifier or locking key changes its state"), grp);
+ vvbox->addWidget(kNotifyModifiers);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addStretch(1);
+ kNotifyModifiersButton = new QPushButton(i18n("Configure System Notification..."), grp);
+ kNotifyModifiersButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ hbox->addWidget(kNotifyModifiersButton);
+
+ connect(stickyKeys, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(stickyKeysLock, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(stickyKeysAutoOff, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(stickyKeys, SIGNAL(clicked()), this, SLOT(checkAccess()));
+
+ connect(stickyKeysBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(toggleKeysBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(kNotifyModifiers, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(kNotifyModifiers, SIGNAL(clicked()), this, SLOT(checkAccess()));
+ connect(kNotifyModifiersButton, SIGNAL(clicked()), this, SLOT(configureKNotify()));
+
+ vbox->addStretch();
+
+ tab->addTab(modifiers, i18n("&Modifier Keys"));
+
+ // key filter settings ---------------------------------
+ QWidget *filters = new QWidget(this);
+
+ vbox = new QVBoxLayout(filters, KDialog::marginHint(), KDialog::spacingHint());
+
+ grp = new QGroupBox(i18n("Slo&w Keys"), filters);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ slowKeys = new QCheckBox(i18n("&Use slow keys"), grp);
+ vvbox->addWidget(slowKeys);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ slowKeysDelay = new ExtendedIntNumInput(grp);
+ slowKeysDelay->setSuffix(i18n(" msec"));
+ slowKeysDelay->setRange(50, 10000, 100);
+ slowKeysDelay->setLabel(i18n("Acceptance dela&y:"));
+ hbox->addWidget(slowKeysDelay);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ slowKeysPressBeep = new QCheckBox(i18n("&Use system bell whenever a key is pressed"), grp);
+ hbox->addWidget(slowKeysPressBeep);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ slowKeysAcceptBeep = new QCheckBox(i18n("&Use system bell whenever a key is accepted"), grp);
+ hbox->addWidget(slowKeysAcceptBeep);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ slowKeysRejectBeep = new QCheckBox(i18n("&Use system bell whenever a key is rejected"), grp);
+ hbox->addWidget(slowKeysRejectBeep);
+
+ grp = new QGroupBox(i18n("Bounce Keys"), filters);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ bounceKeys = new QCheckBox(i18n("Use bou&nce keys"), grp);
+ vvbox->addWidget(bounceKeys);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ bounceKeysDelay = new ExtendedIntNumInput(grp);
+ bounceKeysDelay->setSuffix(i18n(" msec"));
+ bounceKeysDelay->setRange(100, 5000, 100);
+ bounceKeysDelay->setLabel(i18n("D&ebounce time:"));
+ hbox->addWidget(bounceKeysDelay);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ bounceKeysRejectBeep = new QCheckBox(i18n("Use the system bell whenever a key is rejected"), grp);
+ hbox->addWidget(bounceKeysRejectBeep);
+
+ connect(slowKeysDelay, SIGNAL(valueChanged(int)), this, SLOT(configChanged()));
+ connect(slowKeys, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(slowKeys, SIGNAL(clicked()), this, SLOT(checkAccess()));
+
+ connect(slowKeysPressBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(slowKeysAcceptBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(slowKeysRejectBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+
+ connect(bounceKeysDelay, SIGNAL(valueChanged(int)), this, SLOT(configChanged()));
+ connect(bounceKeys, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(bounceKeysRejectBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(bounceKeys, SIGNAL(clicked()), this, SLOT(checkAccess()));
+
+ vbox->addStretch();
+
+ tab->addTab(filters, i18n("&Keyboard Filters"));
+
+ // gestures --------------------------------------------
+ QWidget *features = new QWidget(this);
+
+ vbox = new QVBoxLayout(features, KDialog::marginHint(), KDialog::spacingHint());
+
+ grp = new QGroupBox(i18n("Activation Gestures"), features);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ gestures = new QCheckBox(i18n("Use gestures for activating sticky keys and slow keys"), grp);
+ vvbox->addWidget(gestures);
+ QString shortcut = mouseKeysShortcut(this->x11Display());
+ if (shortcut.isEmpty())
+ QWhatsThis::add (gestures, i18n("Here you can activate keyboard gestures that turn on the following features: \n"
+ "Sticky keys: Press Shift key 5 consecutive times\n"
+ "Slow keys: Hold down Shift for 8 seconds"));
+ else
+ QWhatsThis::add (gestures, i18n("Here you can activate keyboard gestures that turn on the following features: \n"
+ "Mouse Keys: %1\n"
+ "Sticky keys: Press Shift key 5 consecutive times\n"
+ "Slow keys: Hold down Shift for 8 seconds").arg(shortcut));
+
+ timeout = new QCheckBox(i18n("Turn sticky keys and slow keys off after a certain period of inactivity"), grp);
+ vvbox->addWidget(timeout);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ timeoutDelay = new KIntNumInput(grp);
+ timeoutDelay->setSuffix(i18n(" min"));
+ timeoutDelay->setRange(1, 30, 4);
+ timeoutDelay->setLabel(i18n("Timeout:"));
+ hbox->addWidget(timeoutDelay);
+
+ grp = new QGroupBox(i18n("Notification"), features);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ accessxBeep = new QCheckBox(i18n("Use the system bell whenever a gesture is used to turn an accessibility feature on or off"), grp);
+ vvbox->addWidget(accessxBeep);
+
+ gestureConfirmation = new QCheckBox(i18n("Show a confirmation dialog whenever a keyboard accessibility feature is turned on or off"), grp);
+ vvbox->addWidget(gestureConfirmation);
+ QWhatsThis::add (gestureConfirmation, i18n("If this option is checked, KDE will show a confirmation dialog whenever a keyboard accessibility feature is turned on or off.\nBe sure you know what you are doing if you uncheck it, as the keyboard accessibility settings will then always be applied without confirmation.") );
+
+ kNotifyAccessX = new QCheckBox(i18n("Use KDE's system notification mechanism whenever a keyboard accessibility feature is turned on or off"), grp);
+ vvbox->addWidget(kNotifyAccessX);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addStretch(1);
+ kNotifyAccessXButton = new QPushButton(i18n("Configure System Notification..."), grp);
+ kNotifyAccessXButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ hbox->addWidget(kNotifyAccessXButton);
+
+ connect(gestures, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(timeout, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(timeout, SIGNAL(clicked()), this, SLOT(checkAccess()));
+ connect(timeoutDelay, SIGNAL(valueChanged(int)), this, SLOT(configChanged()));
+ connect(accessxBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(gestureConfirmation, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(kNotifyAccessX, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(kNotifyAccessX, SIGNAL(clicked()), this, SLOT(checkAccess()));
+ connect(kNotifyAccessXButton, SIGNAL(clicked()), this, SLOT(configureKNotify()));
+
+ vbox->addStretch();
+
+ tab->addTab(features, i18n("Activation Gestures"));
+
+ load();
+}
+
+
+KAccessConfig::~KAccessConfig()
+{
+}
+
+void KAccessConfig::configureKNotify()
+{
+ KAboutData about(I18N_NOOP("kaccess"),
+ I18N_NOOP("KDE Accessibility Tool"),
+ 0);
+ KNotifyDialog::configure (this, 0, &about);
+}
+
+void KAccessConfig::changeFlashScreenColor()
+{
+ invertScreen->setChecked(false);
+ flashScreen->setChecked(true);
+ configChanged();
+}
+
+void KAccessConfig::selectSound()
+{
+ QStringList list = KGlobal::dirs()->findDirs("sound", "");
+ QString start;
+ if (list.count()>0)
+ start = list[0];
+ // TODO: Why only wav's? How can I find out what artsd supports?
+ QString fname = KFileDialog::getOpenFileName(start, i18n("*.wav|WAV Files"));
+ if (!fname.isEmpty())
+ soundEdit->setText(fname);
+}
+
+
+void KAccessConfig::configChanged()
+{
+ emit changed(true);
+}
+
+
+void KAccessConfig::load()
+{
+ load( false );
+}
+
+void KAccessConfig::load( bool useDefaults )
+{
+ KConfig *config = new KConfig("kaccessrc", true, false);
+
+ config->setGroup("Bell");
+ config->setReadDefaults( useDefaults );
+
+ systemBell->setChecked(config->readBoolEntry("SystemBell", true));
+ customBell->setChecked(config->readBoolEntry("ArtsBell", false));
+ soundEdit->setText(config->readPathEntry("ArtsBellFile"));
+
+ visibleBell->setChecked(config->readBoolEntry("VisibleBell", false));
+ invertScreen->setChecked(config->readBoolEntry("VisibleBellInvert", true));
+ flashScreen->setChecked(!invertScreen->isChecked());
+ QColor def(Qt::red);
+ colorButton->setColor(config->readColorEntry("VisibleBellColor", &def));
+
+ durationSlider->setValue(config->readNumEntry("VisibleBellPause", 500));
+
+
+ config->setGroup("Keyboard");
+
+ stickyKeys->setChecked(config->readBoolEntry("StickyKeys", false));
+ stickyKeysLock->setChecked(config->readBoolEntry("StickyKeysLatch", true));
+ stickyKeysAutoOff->setChecked(config->readBoolEntry("StickyKeysAutoOff", false));
+ stickyKeysBeep->setChecked(config->readBoolEntry("StickyKeysBeep", true));
+ toggleKeysBeep->setChecked(config->readBoolEntry("ToggleKeysBeep", false));
+ kNotifyModifiers->setChecked(config->readBoolEntry("kNotifyModifiers", false));
+
+ slowKeys->setChecked(config->readBoolEntry("SlowKeys", false));
+ slowKeysDelay->setValue(config->readNumEntry("SlowKeysDelay", 500));
+ slowKeysPressBeep->setChecked(config->readBoolEntry("SlowKeysPressBeep", true));
+ slowKeysAcceptBeep->setChecked(config->readBoolEntry("SlowKeysAcceptBeep", true));
+ slowKeysRejectBeep->setChecked(config->readBoolEntry("SlowKeysRejectBeep", true));
+
+ bounceKeys->setChecked(config->readBoolEntry("BounceKeys", false));
+ bounceKeysDelay->setValue(config->readNumEntry("BounceKeysDelay", 500));
+ bounceKeysRejectBeep->setChecked(config->readBoolEntry("BounceKeysRejectBeep", true));
+
+ gestures->setChecked(config->readBoolEntry("Gestures", true));
+ timeout->setChecked(config->readBoolEntry("AccessXTimeout", false));
+ timeoutDelay->setValue(config->readNumEntry("AccessXTimeoutDelay", 30));
+
+ accessxBeep->setChecked(config->readBoolEntry("AccessXBeep", true));
+ gestureConfirmation->setChecked(config->readBoolEntry("GestureConfirmation", false));
+ kNotifyAccessX->setChecked(config->readBoolEntry("kNotifyAccessX", false));
+
+ delete config;
+
+ checkAccess();
+
+ emit changed(useDefaults);
+}
+
+
+void KAccessConfig::save()
+{
+ KConfig *config= new KConfig("kaccessrc", false);
+
+ config->setGroup("Bell");
+
+ config->writeEntry("SystemBell", systemBell->isChecked());
+ config->writeEntry("ArtsBell", customBell->isChecked());
+ config->writePathEntry("ArtsBellFile", soundEdit->text());
+
+ config->writeEntry("VisibleBell", visibleBell->isChecked());
+ config->writeEntry("VisibleBellInvert", invertScreen->isChecked());
+ config->writeEntry("VisibleBellColor", colorButton->color());
+
+ config->writeEntry("VisibleBellPause", durationSlider->value());
+
+
+ config->setGroup("Keyboard");
+
+ config->writeEntry("StickyKeys", stickyKeys->isChecked());
+ config->writeEntry("StickyKeysLatch", stickyKeysLock->isChecked());
+ config->writeEntry("StickyKeysAutoOff", stickyKeysAutoOff->isChecked());
+ config->writeEntry("StickyKeysBeep", stickyKeysBeep->isChecked());
+ config->writeEntry("ToggleKeysBeep", toggleKeysBeep->isChecked());
+ config->writeEntry("kNotifyModifiers", kNotifyModifiers->isChecked());
+
+ config->writeEntry("SlowKeys", slowKeys->isChecked());
+ config->writeEntry("SlowKeysDelay", slowKeysDelay->value());
+ config->writeEntry("SlowKeysPressBeep", slowKeysPressBeep->isChecked());
+ config->writeEntry("SlowKeysAcceptBeep", slowKeysAcceptBeep->isChecked());
+ config->writeEntry("SlowKeysRejectBeep", slowKeysRejectBeep->isChecked());
+
+
+ config->writeEntry("BounceKeys", bounceKeys->isChecked());
+ config->writeEntry("BounceKeysDelay", bounceKeysDelay->value());
+ config->writeEntry("BounceKeysRejectBeep", bounceKeysRejectBeep->isChecked());
+
+ config->writeEntry("Gestures", gestures->isChecked());
+ config->writeEntry("AccessXTimeout", timeout->isChecked());
+ config->writeEntry("AccessXTimeoutDelay", timeoutDelay->value());
+
+ config->writeEntry("AccessXBeep", accessxBeep->isChecked());
+ config->writeEntry("GestureConfirmation", gestureConfirmation->isChecked());
+ config->writeEntry("kNotifyAccessX", kNotifyAccessX->isChecked());
+
+
+ config->sync();
+
+ if (systemBell->isChecked() ||
+ customBell->isChecked() ||
+ visibleBell->isChecked())
+ {
+ KConfig cfg("kdeglobals", false, false);
+ cfg.setGroup("General");
+ cfg.writeEntry("UseSystemBell", true);
+ cfg.sync();
+ }
+
+ // make kaccess reread the configuration
+ // When turning things off, it needs to be done by kaccess,
+ // so don't actually kill it *shrug*.
+ if ( true /*needToRunKAccessDaemon( config )*/ )
+ kapp->startServiceByDesktopName("kaccess");
+
+ else // don't need it -> kill it
+ {
+ DCOPRef kaccess( "kaccess", "qt/kaccess" );
+ kaccess.send( "quit" );
+ }
+
+ delete config;
+
+ emit changed(false);
+}
+
+
+void KAccessConfig::defaults()
+{
+ load( true );
+}
+
+
+void KAccessConfig::invertClicked()
+{
+ flashScreen->setChecked(false);
+}
+
+
+void KAccessConfig::flashClicked()
+{
+ invertScreen->setChecked(false);
+}
+
+
+void KAccessConfig::checkAccess()
+{
+ bool custom = customBell->isChecked();
+ soundEdit->setEnabled(custom);
+ soundButton->setEnabled(custom);
+ soundLabel->setEnabled(custom);
+
+ bool visible = visibleBell->isChecked();
+ invertScreen->setEnabled(visible);
+ flashScreen->setEnabled(visible);
+ colorButton->setEnabled(visible);
+ durationSlider->setEnabled(visible);
+
+ bool sticky = stickyKeys->isChecked();
+ stickyKeysLock->setEnabled(sticky);
+ stickyKeysAutoOff->setEnabled(sticky);
+ stickyKeysBeep->setEnabled(sticky);
+
+ bool slow = slowKeys->isChecked();
+ slowKeysDelay->setEnabled(slow);
+ slowKeysPressBeep->setEnabled(slow);
+ slowKeysAcceptBeep->setEnabled(slow);
+ slowKeysRejectBeep->setEnabled(slow);
+
+ bool bounce = bounceKeys->isChecked();
+ bounceKeysDelay->setEnabled(bounce);
+ bounceKeysRejectBeep->setEnabled(bounce);
+
+ bool useTimeout = timeout->isChecked();
+ timeoutDelay->setEnabled(useTimeout);
+}
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_access(QWidget *parent, const char *name)
+ {
+ return new KAccessConfig(parent, name);
+ }
+
+ /* This one gets called by kcminit
+
+ */
+ KDE_EXPORT void init_access()
+ {
+ KConfig *config = new KConfig("kaccessrc", true, false);
+ bool run = needToRunKAccessDaemon( config );
+
+ delete config;
+ if (run)
+ kapp->startServiceByDesktopName("kaccess");
+ }
+}
+
+
diff --git a/kcontrol/access/kcmaccess.desktop b/kcontrol/access/kcmaccess.desktop
new file mode 100644
index 000000000..7980cadec
--- /dev/null
+++ b/kcontrol/access/kcmaccess.desktop
@@ -0,0 +1,240 @@
+[Desktop Entry]
+Icon=access
+Type=Application
+Exec=kcmshell kcmaccess
+DocPath=kcontrol/kcmaccess/index.html
+
+
+X-KDE-Library=access
+X-KDE-Init=access
+X-KDE-ParentApp=kcontrol
+
+Name=Accessibility
+Name[af]=Toeganklikheid
+Name[ar]=تسهيل الوصول
+Name[az]=Yetişmə Qabiliyyəti
+Name[be]=Даступнасць
+Name[bg]=Равностоен достъп
+Name[bn]=সহায়ক প্রযুক্তি
+Name[br]=Haezadusted
+Name[bs]=Pristupačnost
+Name[ca]=Accessibilitat
+Name[cs]=Zpřístupnění
+Name[csb]=Pòmòce przistãpù
+Name[cy]=Hygyrchedd
+Name[da]=Tilgængelighed
+Name[de]=Zugangshilfen
+Name[el]=Προσιτότητα
+Name[eo]=Alirebleco
+Name[es]=Accesibilidad
+Name[et]=Hõlbustus
+Name[eu]=Erabilerraztasuna
+Name[fa]=دستیابی‌پذیری
+Name[fi]=Helppokäyttötoiminnot
+Name[fr]=Accessibilité
+Name[fy]=Tagonklikens
+Name[ga]=Inrochtaineacht
+Name[gl]=Accesibilidade
+Name[he]=נגישות
+Name[hi]=पहुँच
+Name[hr]=Pristupačnost
+Name[hu]=Kezelési segítség
+Name[id]=Aksesibiliti
+Name[is]=Aðgengi
+Name[it]=Accessibilità
+Name[ja]=アクセシビリティ
+Name[ka]=სპეციალური შესაძლბლობები
+Name[kk]=Арнайы мүмкіндіктер
+Name[km]=ភាព​អាច​ចូល​ដំណើរការ​បាន
+Name[ko]=내게 필요한 설정
+Name[lo]=ຄວາມສາມາດໃນການໃຊ້ງານ
+Name[lt]=Prieinamumas
+Name[lv]=Pieejamība
+Name[mk]=Пристапливост
+Name[mn]=Хэрэглэх тохь
+Name[ms]=Kebolehcapaian
+Name[mt]=Aċċessibiltà
+Name[nb]=Tilgjengelighet
+Name[nds]=Behinnertenhülp
+Name[ne]=पहुँचता
+Name[nl]=Toegankelijkheid
+Name[nn]=Tilgjenge
+Name[nso]=Botsenelo
+Name[oc]=Accessibilitat
+Name[pa]=ਸਹੂਲਤਾਂ
+Name[pl]=Dostępność
+Name[pt]=Acessibilidade
+Name[pt_BR]=Acessibilidade
+Name[ro]=Accesibilitate
+Name[ru]=Специальные возможности
+Name[rw]=Ukugerwaho
+Name[se]=Álkkibut geavaheapmi
+Name[sk]=Prístupnosť
+Name[sl]=Dostopnost
+Name[sr]=Приступачност
+Name[sr@Latn]=Pristupačnost
+Name[ss]=Kutfolakala kalula
+Name[sv]=Handikappstöd
+Name[ta]=அணுகல்
+Name[te]=అందుబాటు
+Name[tg]=Имконпазирӣ
+Name[th]=ตัวช่วยในการใช้งาน
+Name[tr]=Erişilebilirlik
+Name[tt]=Qulaylıq
+Name[uk]=Доступність
+Name[uz]=Qulayliklar
+Name[uz@cyrillic]=Қулайликлар
+Name[ven]=Dzheneaho
+Name[vi]=Hỗ trợ người tàn tật
+Name[wa]=Accessibilité
+Name[xh]=Unikezelo
+Name[zh_CN]=辅助
+Name[zh_TW]=無障礙輔助
+Name[zu]=Ukungena
+
+Comment=Improve accessibility for disabled persons
+Comment[af]=Verbeter toeganklikheid vir gestremde persone
+Comment[ar]=تسهيل الاستخدام لذوي الاحتياجات الخاصة
+Comment[az]=Yetişmə qabiliyyəti zəyif olanların həyatını asanlaşdırar
+Comment[be]=Павялічвае даступнасць для людзей з фізічнымі адхіленнямі
+Comment[bg]=Настройване на достъпа за хора с увреждания
+Comment[bn]=অসমর্থ ব্যবহারকারীদের সহায়তা করার প্রযুক্তি
+Comment[bs]=Bolja pristupačnost za osobe sa nedostacima
+Comment[ca]=Accessibilitat millorada per a persones discapacitades
+Comment[cs]=Zlepšení přístupnosti pro osoby s postižením
+Comment[csb]=Pòprôwionô przistãpnosc dlô niefùlsprôwnëch lëdzi
+Comment[cy]=Gwella hygyrchedd i bobl anabl
+Comment[da]=Forbedr tilgængelighed for handicappede personer
+Comment[de]=Verbesserte Benutzbarkeit für behinderte Menschen
+Comment[el]=Βελτίωση της προσιτότητας για άτομα με ειδικές ανάγκες
+Comment[eo]=Plibonigita alirebleco por handikapitoj
+Comment[es]=Mejorar accesibilidad para discapacitados
+Comment[et]=Puuetega inimestele mõeldud seaded
+Comment[eu]=Erabilerraztasuna hobetzen du pertsona elbarrientzat
+Comment[fa]=بهبود دستیابی‌پذیری برای اشخاص ناتوان
+Comment[fi]=Käyttöä helpottavia asetuksia
+Comment[fr]=Accessibilité améliorée pour les personnes handicapées
+Comment[fy]=Ferbeterde tagonklikens foar brûkers mei in handikap
+Comment[ga]=Feabhsaigh an inrochtaineacht do dhaoine míchumasaithe
+Comment[gl]=Acesibilidade mellorada para persoas con discapacidades
+Comment[he]=שיפור הנגישות עבור אנשים עם מגבלות
+Comment[hi]=विकलांग व्यक्तियों के लिए पहुँच बेहतर बनाए
+Comment[hr]=Unaprijedite pristupačnost osobama s invaliditetom
+Comment[hu]=A számítógép kezelését segítő eszközök fogyatékosoknak
+Comment[is]=Endurbætt aðgengi fyrir þá sem þurfa
+Comment[it]=Accessibilità migliorata per le persone disabili
+Comment[ja]=障害のある方達のためのアクセス改善
+Comment[ka]=ფიზიკური ნაკლოვანებბის მქონი ხალხისთვის სპეციალური შესაძლბლობები
+Comment[kk]=Мүмкіншіліктері шектеулі адамдарға көмек
+Comment[km]=បង្កើន​មធ្យោបាយ​ងាយស្រួល​សម្រាប់​មនុស្ស​ពិការ
+Comment[ko]=장애인들을 위하여 접근성을 향상시킵니다
+Comment[lo]=ປັບຄ່າຄວາມສາມາດໃນການໃຊ້ງານສຳຫລັບຜູ້ທີ່ມີຄວາມສາມາດ
+Comment[lt]=Pagerintas prieinamumas neįgaliems asmenims
+Comment[lv]=Uzlabo pieejamību cilvekiem ar īpašām vajadzībām
+Comment[mk]=Ја подобрува пристапливоста за хендикепирани лица
+Comment[mn]=Гэмтэлтэй хүнд зориулан сайжруулсан хэрэглээ
+Comment[ms]=Tingkatkan keaksesan bagi orang kurang upaya
+Comment[mt]=Aċċessibbiltà aħjar għal persuni b'diżabilità
+Comment[nb]=Forbedret tilgjengelighet for funksjonshemmede
+Comment[nds]=Verbetert den Togang för Behinnerte
+Comment[ne]=अक्षम व्यक्तिका लागि पहुँच क्षमता सुधार गर्नुहोस्
+Comment[nl]=Verbeterde toegankelijkheid voor gebruikers met een handicap
+Comment[nn]=Forbetra tilgjenge for funksjonshemma personar
+Comment[nso]=Kaonafatsa botsenelo bja batho bao basa kgonego go itirela
+Comment[pa]=ਅਪੰਗ ਵਿਅਕਤੀ ਲਈ ਸੁਧਾਰੀ ਸਹਾਇਤਾ
+Comment[pl]=Poprawiona dostępność dla osób niepełnosprawnych
+Comment[pt]=Acessibilidade melhorada para pessoas com necessidades especiais
+Comment[pt_BR]=Melhora a acessibilidade para pessoas com deficiência
+Comment[ro]=Îmbunătățește accesibilitate KDE pentru persoanele cu handicap
+Comment[ru]=Специальные возможности для людей с физическими недостатками
+Comment[rw]=Kongera ukugerwaho kw'abantu bahagaritswe
+Comment[se]=Álkkibut geavaheapmi doaimmahehttejuvvon olbmuide
+Comment[sk]=Zlepšenie prístupnosti pre postihnutých používateľov
+Comment[sl]=Izboljšana dostopnost za prizadete osebe
+Comment[sr]=Унапређује приступачност за хендикепиране особе
+Comment[sr@Latn]=Unapređuje pristupačnost za hendikepirane osobe
+Comment[ss]=Phucula kufinyelela kwebantfu labachwalile
+Comment[sv]=Förbättrad tillgänglighet för handikappade personer
+Comment[ta]=பார்க்க முடியாதவர்களுக்கு அணுகலை அதிகப்படுத்தவும்
+Comment[tg]=Имкониятҳои махсус барои одамони нуқсони ҷисмонӣ
+Comment[th]=ทำให้ความสามารถในการใช้งาน สำหรับผู้พิการดีขึ้น
+Comment[tr]=Görme sorunu olanlar için erişilebilirlik seçenekleri
+Comment[tt]=Ğäriplär öçen uñaylıqlar
+Comment[uk]=Підвищення зручності для інвалідів
+Comment[uz]=Nogiron kishilar uchun qulayliklar
+Comment[uz@cyrillic]=Ногирон кишилар учун қулайликлар
+Comment[ven]=Khwinifhadzani madzhenele uitela vhathu vha zwihole
+Comment[vi]=Hỗ trợ người tàn tật
+Comment[wa]=Amidrêye l' accessibilité po les mesplotchès djins
+Comment[xh]=Phucula unikekezeleko lwabantu abakhubazekileyo
+Comment[zh_CN]=方便残疾人使用的辅助功能
+Comment[zh_TW]=方便傷殘人士使用
+Comment[zu]=Ukwenza ukungena kwabantu abakhubazekile kube lula
+
+Keywords=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[af]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num bordjie
+Keywords[az]=yetişmə,yetişmə qabiliyyəti,kar,əlil,çən,eşidilə bilən çən,görünür çən,Klaviatura,düymələr,yapışqan düymələr,hoppanan düymələr,yavaş düymələr,siçan yönləndirməsi,num pad
+Keywords[be]=доступ,даступнасць,званок,гукавы сігнал,бачны сігнал,клавіятура,клавішы,"ліпучыя" клавішы,"рухомыя" клавішы,марудныя клавішы,навігацыя мышшу,лічбавая клавіятура,access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[bg]=достъп, увреждания, равностоен, равноправен, зрителни, зрителен, без зрение, access, accessibility, deaf, impaired, bell, audible bell, visible bell, Keyboard, keys, sticky keys, bounce keys, slow keys, mouse navigation, num pad
+Keywords[ca]=accés,accessibilitat,sord,disminuït,timbre,timbre audible,timbre visible,Teclat,tecles,tecles apegaloses,tecles de repetició,tecles lentes,navegació del ratolí,teclat numèric
+Keywords[cs]=Zpřístupnění,Hluchý,Slepý,Postižený,Zvonek,Slyšitelný zvonek,Viditelný zvonek,Klávesnice,Pomalé klávesy,Navigace myši,Num pad
+Keywords[csb]=przistãp,przistãpnosc,głëchy,zwónk,słëszalny zwónk widzalny zwónk,klawiatura,klawisze,przëklejone klawisze,odbijanié klawiszów,pòwólné klawisze,nawigacëjô mëszą,numericznô klawiatura
+Keywords[cy]=mynediad,hygyrchedd,byddar,cloch,cloch clywadwy,cloch gweladwy,bysellfwrdd,allweddell,bysell,bysell gludog,bysell sponcio,bysell araf,llywio llygoden,pad rhif
+Keywords[da]=adgang,tilgængelighed,døv,handicappet,klokke,hørbar klokke,synlig klokke,Tastatur,taster,klæbrige taster,bounce-taster,langsomme taster,musenavigering,numerisk tastatur
+Keywords[de]=Behinderung,Maussteuerung,Signale,Tastatur,Tasten,Taubheit,Verlangsamte Tasten,Zahlenblock,Zugang,Zugangshilfen
+Keywords[el]=πρόσβαση,προσιτότητα,κωφός,impaired,κουδούνι,ακουστή ειδοποίηση,ορατή ειδοποίηση,Πληκτρολόγιο,πλήκτρα,κολλημένα πλήκτρα,πλήκτρα αναπήδησης,αργά πλήκτρα,πλοήγηση ποντικιού,αριθμητικό πληκτρολόγιο
+Keywords[eo]=aliro,handikapito,malhelpito,pepo,videbla pepo,klavaro,klavoj,klavfikso, musnavigado,nombroklavaro
+Keywords[es]=acceso,accesibilidad,sordo,disminuido,timbre,timbre audible,timbre visible,Teclado,teclas,teclas pegajosas,teclas de golpe,teclas lentas,navegación del ratón,teclado numérico
+Keywords[et]=juurdepääs,kurt,puue,puudega,signaal,kuuldav signaal,visuaalne signaal,klaviatuur,klahvid,kleepuvad klahvid,põrkavad klahvid,aeglased klahvid,hiire liigutamine,numbriklaviatuur
+Keywords[eu]=sarrera,erabilerraztasuna,gorra,elbarria,ezkila,ezkila entzungarria, ezkila ikusgarria,Teklatua,teklak,tekla itsaskorrak, bounce teklak,tekla geldoak,sagu bidezko arakaketa,tekla numerikoak
+Keywords[fa]=دستیابی، دستیابی‌پذیری، ناشنوا، معلول، زنگ، زنگ شنیدنی، زنگ مرئی، صفحه کلید، کلیدها، کلیدهای چسبناک، کلیدهای واگشت، کلیدهای کند، ناوش موشی، صفحه اعداد
+Keywords[fi]=käytettävyys,esteettömyys,kuuro,vammautunut,virheilmoitus,virheääni,näkyvä virheilmoitus,näppäimistö,näppäimet,alas jäävät näppäimet,toistavat näppäimet,hitaat näppäimet,hiirinavigointi,numeronäppäimistö
+Keywords[fr]=accès,accessibilité,surdité,sourd,cloche,son,cloche visuelle,cloche sonore,clavier,touches,souris,touches lentes,touches rémanentes,cloche auditive,touches répétées,répétition des touches,auto-maintien des touches,maintien des touches,navigation à la souris,pointeur de souris,émulation du clavier,clavier numérique
+Keywords[fy]=tagong,tagonklikens,dôf,handikap,beheind,bel,sinjalearing,sichtbermeldingen,Kaaiboerd,kaaien,kleef kaaien,kaaioanslag,Mûsnavigaasje,num pad,numeryske klavier
+Keywords[ga]=rochtain,inrochtaineacht,bodhar,clog,clog inchloiste,clog infheicthe,Méarchlár,eochracha,eochracha greamaitheacha,eochracha preabtha,eochracha go mall,nascleanúint luiche,eochaircheap uimhriúil
+Keywords[gl]=aceso,acesibilidade,impar,campá,badalada audíbel,badalada visíbel,teclado,teclas,teclas pegadias,teclas de repetición,teclas lentas,navegación do rato,teclado numérico
+Keywords[he]=גישה,נגישות,חירשים,לקויים,פעמון,פעמון נשמע,פעמון חזותי,לוח,מקשים ,מקלדת ,מקשים,מקשים דביקים,מקשים מוקפצים,מקשים אטיים,ניווט עכבר,מקשי מספרים, access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[hi]=एक्सेस, पहुँच,बघिर,दुर्बल,घंटी,सुनने योग्य घंटी,दिखने योग्य घंटी,कुंजीपट,कुंजियाँ, चिपकी (स्टिकी) कुंजी,बाउंस कुंजी,धीमी कुंजी,माउस नेविगेशन,न्यूम पैड
+Keywords[hr]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,pristup,pristupačnost,gluh,gluhoća,oštećenje,zvono,zvuk zvona,vidljivo zvono,tipkovnica,tipke,odbijanje tipki,spore tipke,navigacija mišem,numeričke tipke
+Keywords[hu]=hozzáférés,segédeszközök,süket,fogyatékos,csengő,hallható csengetés,látható csengetés,billentyűzet,billentyűk,ragadós billentyűk,visszaugró billentyűk,lassú billentyűk,egérkezelés,numerikus billentyűzet
+Keywords[is]=aðgangur,aðgengi,heyrnarlaus,fatlaður,píp,bjalla,sjáanleg bjalla,lyklaborð,takkar,músarnotkun,talnaborð
+Keywords[it]=accesso,accessibilità,non udenti,portatori di handicap,campanella,campanella udibile,campanella visibile,tastiera,tasti,permanenza dei tasti,pressione ravvicinata dei tasti,rallentamento dei tasti,navigazione mouse,tastierino numerico
+Keywords[ja]=アクセス,アクセシビリティ,聾唖,障害,ベル,音声ベル,視覚ベル,キーボート,キー,スティッキーキー,バウンスキー,スローキー,マウス補助,数字パッド
+Keywords[km]=ចូល​ដំណើរការ,មធ្យោបាយ​ងាយស្រួល,ថ្លង់,ពិការ,កណ្ដឹង,កណ្ដឹង​ឭ,កណ្ដឹង​មើល​ឃើញ,ក្ដារចុច,គ្រាប់ចុច,គ្រាប់ចុច​ស្អិត,គ្រាប់ចុច​លោត,គ្រាប់ចុច​យឺត,ការ​រុករក​កណ្ដុរ,បន្ទះ​លេខ
+Keywords[lt]=prieinamumas,kurčias,kurčnebylys,neįgalus,skambutis,girdimas,matomas skambutis,klaviatūra,mygtukai,prisegti mygtukai,lėti mygtukai,navigacija su pele
+Keywords[lv]=pieeja,pieejamība,kurls,vājināts,zvans,dzirdams zvans,redzams zvans,Tastatūra,taustiņi,salīmētie taustiņi,elastīgie taustiņi,lēnie taustiņi,peles navigācija,num pads
+Keywords[mk]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,пристап,пристапност,глув,хендикепиран,ѕвонче,звучно ѕвонче,визуелно ѕвонче,Тастатура,копчиња,лепливи копчиња,отскочни копчиња,бавни копчиња,навигација со глушецот,тастатура со бројки
+Keywords[mn]=Гар,Гэмтэл,Дүлий,Сигнал,Товчилуур,Тооны хэсэг,Хандалт,Хулганы жолоодлого,Хэрэглэх тохь, Удаашруулсан товчилуур
+Keywords[mt]=access,accessibility,aċċessibbiltà,deaf,trux,truxa,torox,impaired,ħadikappat,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[nb]=tilgang,tilgjengelighet,døv,handikappet,lyd,signal,bjelle,synlig signal,tastatur,taster,faste valgtaster,trege taster,filtertaster,musnavigering,numerisk tastatur
+Keywords[nds]=Togang,accessibility,doof,Behinnerte,Pingel,höörbore Pingel,Ogenpingel,Tastatuur,Tasten,backige Tasten,springen Tasten,langsam Tasten,Muusnavigatschoon,Tallenblock
+Keywords[ne]=पहुँच, पहुँचयोग्यता, डिफ, बिग्रेको, बेल, सुन्न सकिने बेल, हेर्न सकिने बेल, कुञ्जीपाटी, कुञ्जीहरू, टाँसिने कुञ्जीहरू, उफ्रिने कुञ्जीहरू, ढिलो कुञ्जीहरू, माउस नेभिगेसन, नम प्याड
+Keywords[nl]=toegang,toegankelijkheid,doof,handicap,gehandicapt,bel,signalering,zichtbare meldingen,Keyboard,toetsenbord,keys,toetsen,vastgeplakte toetsen,toetsenaanslag,muisnavigatie,num pad,numerieke klavier
+Keywords[nn]=tilgang,tilgjenge,døv,handikappa,lyd,signal,bjelle,synleg signal,tastatur,tastar,faste modifikasjonstastar,trege tastar,filtertastar,musnavigering,numerisk tastatur
+Keywords[nso]=tsenelo,botsenelo,sefofu,kelekantswe,bell,bell yeo e kwagalago, bell yeo e bonagalago,Keyboard,ditobetswa,ditobetswa tseo di tiilego,ditobetswa tsago pampa,ditobetswa tsago nanya,navigation ya legotlo,num pad
+Keywords[pa]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,ਕੀ-ਬੋਰਡ,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[pl]=dostęp,dostępność,głuchy,upośledzony,dzwonek,słyszalny dzwonek widzialny dzwonek,klawiatura,klawisze,klejące klawisze,odbijanie klawiszy,powolne klawisze,nawigacja myszą,klawiatura numeryczna
+Keywords[pt]=acesso,acessibilidade,surdo,deficiente,campainha,campainha audível,campainha visível,teclado,teclas,teclas 'sticky',teclas 'bounce',teclas lentas,navegação com o rato,num pad
+Keywords[pt_BR]=acesso,acessibilidade,surdo,deficiente,campainha,audível,campainha visível, teclado,teclas,teclas persistentes,teclas repetidas,teclas lentas,navegação do mouse,teclado numérico
+Keywords[ro]=acces,accesibilitate,surd,handicap,difuzor,audibil,sunet vizibil,tastatură,taste,taste comutator,taste fără repetiție,taste lente,navigare mouse,tastatura numerică
+Keywords[ru]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,залипающие клавиши,специальные возможности,клавиши
+Keywords[rw]=kugera,ukugerwaho,ikitumva,cyononekaye,inzogera,inzogera yumvikana,inzogera igaragara,mwandikisho,buto,buto zifashe,buto zidunda,iyega ry'imbeba,agacemibare
+Keywords[se]=álkkibut,bealljeheapmi,doaimmahehttejuvvon,jietna,signála,oaidnus signála,boallobeavdi,boalut,giddes boalut,sáhpannavigašuvdna,numerálaš boallobeavdi
+Keywords[sk]=prístup,prístupnosť,hluchý,postihnutý,zvonček,hlasný zvonček,viditeľný zvonček, klávesnica,klávesy,lepivé klávesy,odrážané klávesy,pomalé klávesy,navigácia myšou,číslice
+Keywords[sl]=dostop,dostopnost,gluh,gluhota,prizadetost,zvonec,vidni zvonec,zvonček,tipkovnica,tipke,lepljive tipke,počasne tipke,navigacija miške,numerična tipkovnica,invalidnost,invalid
+Keywords[sr]=приступ,приступачност,глув,хендикепиран,звоно,звучно звоно,визуелно звоно,тастатура,тастери,лепљиви тастери,спори тастери,померање миша,нумеричка тастатура
+Keywords[sr@Latn]=pristup,pristupačnost,gluv,hendikepiran,zvono,zvučno zvono,vizuelno zvono,tastatura,tasteri,lepljivi tasteri,spori tasteri,pomeranje miša,numerička tastatura
+Keywords[sv]=tillgång,tillgänglighet,döv,handikappad,signal,ljudsignal,visuell signal,Tangentbord,tangenter,klistriga tangenter,studsande tangenter,långsamma tangenter,musnavigering,numeriskt tangentbord
+Keywords[ta]=அணுகல்,அணுகும் முறை,காது கேளாத,ஆற்றல் குறைந்த,மணியோசை,காதால் கேட்கும் அளவிற்கு மணியோசை,தெரியும் மணியோசை,விசைபலகை,விசைகள்,ஒட்டும் விசைகள்,மீளும் தன்மையுடைய விசைகள்,மெதுவான விசைகள்,சுட்டிநாவிகேஷன்,எண்ணிக்கை அட்டை
+Keywords[th]=การเข้าถึง,ความง่ายในการใช้งาน,หูหนวก,บกพร่อง,ออด, ออดใช้ฟัง,ออดใช้ดู,แป้นพิมพ์,ปุ่ม,ปุ่มติดหนึบ,ปุ่มสะท้อน, ปุ่มชะลอ,นำทางโดยเมาส์,แผงปุ่มตัวเลข
+Keywords[tr]=erişim,erişilebilirlik,sağır,özürlü,zil,duyulabilir zil,görünür zil,Klavye,tuşlar,yapışkan tuşlar,zıplayan tuşlar,yavaş tuşlar,fare yönlendirmesi,num pad
+Keywords[uk]=доступ,доступність,глухий,каліка,дзвінок,аудіодзвінок,відеодзвінок,клавіатура,клавіші,липкі клавіші,пружні клавіші,повільні клавіші,навігація миші,цифрова клавіатура
+Keywords[ven]=dzhena,dzheneaho,dzingandevhe,bele,bele i pfalaho,bele i vhonalaho,khiibodo,khii,khii i nambatelaho,khii i fhufhaho,khii i lengaho,lwendo lwa mausu,num pad
+Keywords[vi]=truy cập,hỗ trợ người tàn tật,điếc,bị thương,chuông,chuông kêu,chuông rung,bàn phím,phím,phím dính,phím nảy,phím chậm,di chuyển chuột,bàn phím số
+Keywords[wa]=accès,accessibilité,sourd,mesplotche,cloke,clotche,veyåve,taprece,tapes,aclapantès tapes,tapes di ridjiblaedje,londjinnès tapes,naiviaedje al sori,num pad,xhilete,etindåve xhilete,veyåve xhilete
+Keywords[xh]=nikezela,unikezelo,ayiva,yonakalisiwe,intsimbi,intsimbi evakalayo, intsimbi ebonakalayo,ibhodi yezitshixo,izitshixo,isithixo esincangathi, izitshixo ezilungisiweyo,izitshixo ezinengxolo,izitshixo ezicothayo,indlela yokubeka i mouse endaweni,inkatha ye num
+Keywords[zh_CN]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,辅助功能,聋,键盘,粘滞键,撞击键,筛选键,鼠标导航,可视铃声,小键盘
+Keywords[zh_TW]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,使用,聾,鈴聲,聽得見的鈴,看得見的鈴,鍵盤,按鍵,滑鼠導向,數字鍵
+Keywords[zu]=ngena,ukungena,okuthuli,kukhubazekile,insimbi,insimbiezwakalayo, insimbi ebonakalayo,okhiye,okhiye abanamathelayo,okhiyeababhampayo,okhiye abahamba kancane,ukuzula kwe-mouse,num pad
+
+Categories=Qt;KDE;X-KDE-settings-accessibility;
diff --git a/kcontrol/access/kcmaccess.h b/kcontrol/access/kcmaccess.h
new file mode 100644
index 000000000..c40152324
--- /dev/null
+++ b/kcontrol/access/kcmaccess.h
@@ -0,0 +1,111 @@
+/**
+ * kcmaccess.h
+ *
+ * Copyright (c) 2000 Matthias H�zer-Klpfel <hoelzer@kde.org>
+ *
+ */
+
+#ifndef __kcmaccess_h__
+#define __kcmaccess_h__
+
+
+#include <kcmodule.h>
+#include <knuminput.h>
+
+
+class QCheckBox;
+class QComboBox;
+class QLabel;
+class QLineEdit;
+class QPushButton;
+class QRadioButton;
+class KColorButton;
+class QSlider;
+class KNumInput;
+class KAboutData;
+
+class ExtendedIntNumInput : public KIntNumInput
+{
+ Q_OBJECT
+
+ public:
+ /**
+ * Constructs an input control for integer values
+ * with base 10 and initial value 0.
+ */
+ ExtendedIntNumInput(QWidget *parent=0, const char *name=0);
+
+ /**
+ * Destructor
+ */
+ virtual ~ExtendedIntNumInput();
+
+ /**
+ * @param min minimum value
+ * @param max maximum value
+ * @param step step size for the QSlider
+ * @param slider whether the slider is created or not
+ */
+ void setRange(int min, int max, int step=1, bool slider=true);
+
+ private slots:
+ void slotSpinValueChanged(int);
+ void slotSliderValueChanged(int);
+
+ private:
+ int min, max;
+ int sliderMax;
+};
+
+class KAccessConfig : public KCModule
+{
+ Q_OBJECT
+
+public:
+
+ KAccessConfig(QWidget *parent = 0L, const char *name = 0L);
+ virtual ~KAccessConfig();
+
+ void load();
+ void load(bool useDefaults);
+ void save();
+ void defaults();
+
+protected slots:
+
+ void configChanged();
+ void checkAccess();
+ void invertClicked();
+ void flashClicked();
+ void selectSound();
+ void changeFlashScreenColor();
+ void configureKNotify();
+
+private:
+
+ QCheckBox *systemBell, *customBell, *visibleBell;
+ QRadioButton *invertScreen, *flashScreen;
+ QLabel *soundLabel, *colorLabel;
+ QLineEdit *soundEdit;
+ QPushButton *soundButton;
+ KColorButton *colorButton;
+ ExtendedIntNumInput *durationSlider;
+
+ QCheckBox *stickyKeys, *stickyKeysLock, *stickyKeysAutoOff;
+ QCheckBox *stickyKeysBeep, *toggleKeysBeep, *kNotifyModifiers;
+ QPushButton *kNotifyModifiersButton;
+
+ QCheckBox *slowKeys, *bounceKeys;
+ ExtendedIntNumInput *slowKeysDelay, *bounceKeysDelay;
+ QCheckBox *slowKeysPressBeep, *slowKeysAcceptBeep;
+ QCheckBox *slowKeysRejectBeep, *bounceKeysRejectBeep;
+
+ QCheckBox *gestures, *gestureConfirmation;
+ QCheckBox *timeout;
+ KIntNumInput *timeoutDelay;
+ QCheckBox *accessxBeep, *kNotifyAccessX;
+ QPushButton *kNotifyAccessXButton;
+};
+
+
+#endif
diff --git a/kcontrol/access/main.cpp b/kcontrol/access/main.cpp
new file mode 100644
index 000000000..a2dd0d5c7
--- /dev/null
+++ b/kcontrol/access/main.cpp
@@ -0,0 +1,49 @@
+
+#include "kaccess.h"
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <kdebug.h>
+
+extern "C" KDE_EXPORT int kdemain(int argc, char * argv[] )
+{
+ KAboutData about(I18N_NOOP("kaccess"), I18N_NOOP("KDE Accessibility Tool"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2000, Matthias Hoelzer-Kluepfel"));
+
+ about.addAuthor("Matthias Hoelzer-Kluepfel", I18N_NOOP("Author") , "hoelzer@kde.org");
+
+ KCmdLineArgs::init( argc, argv, &about );
+
+ if (!KAccessApp::start())
+ return 0;
+
+ // verify the Xlib has matching XKB extension
+ int major = XkbMajorVersion;
+ int minor = XkbMinorVersion;
+ if (!XkbLibraryVersion(&major, &minor))
+ {
+ kdError() << "Xlib XKB extension does not match" << endl;
+ return 1;
+ }
+ kdDebug() << "Xlib XKB extension major=" << major << " minor=" << minor << endl;
+
+ // we need an application object for qt_xdisplay()
+ KAccessApp app;
+
+ // verify the X server has matching XKB extension
+ // if yes, the XKB extension is initialized
+ int opcode_rtrn;
+ int error_rtrn;
+ int xkb_opcode;
+ if (!XkbQueryExtension(qt_xdisplay(), &opcode_rtrn, &xkb_opcode, &error_rtrn,
+ &major, &minor))
+ {
+ kdError() << "X server has not matching XKB extension" << endl;
+ return 1;
+ }
+ kdDebug() << "X server XKB extension major=" << major << " minor=" << minor << endl;
+
+ app.setXkbOpcode(xkb_opcode);
+ app.disableSessionManagement();
+ return app.exec();
+}
diff --git a/kcontrol/accessibility/Makefile.am b/kcontrol/accessibility/Makefile.am
new file mode 100644
index 000000000..67eb8957a
--- /dev/null
+++ b/kcontrol/accessibility/Makefile.am
@@ -0,0 +1,15 @@
+AM_CPPFLAGS = $(all_includes)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = kcm_accessibility.la
+
+kcm_accessibility_la_SOURCES = accessibility.cpp accessibilityconfigwidget.ui
+kcm_accessibility_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_accessibility_la_LIBADD = $(LIB_KIO)
+
+noinst_HEADERS = accessibility.h
+
+xdg_apps_DATA = accessibility.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmaccessibility.pot
diff --git a/kcontrol/accessibility/accessibility.cpp b/kcontrol/accessibility/accessibility.cpp
new file mode 100644
index 000000000..de7b9953b
--- /dev/null
+++ b/kcontrol/accessibility/accessibility.cpp
@@ -0,0 +1,141 @@
+/****************************************************************************
+ accessibility.cpp
+ KDE Control Accessibility module to control Bell, Keyboard and ?Mouse?
+ -------------------
+ Copyright : (c) 2000 Matthias Hlzer-Klpfel
+ -------------------
+ Original Author: Matthias Hlzer-Klpfel
+ Contributors: Jos Pablo Ezequiel "Pupeno" Fernndez <pupeno@kde.org>
+ Current Maintainer: Jos Pablo Ezequiel "Pupeno" Fernndez <pupeno@kde.org>
+ ****************************************************************************/
+
+/****************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ****************************************************************************/
+
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+#include <qtabwidget.h>
+
+#include <kaboutdata.h>
+#include <kcolorbutton.h>
+#include <kconfig.h>
+#include <kgenericfactory.h>
+#include <knuminput.h>
+#include <kurlrequester.h>
+
+#include "accessibility.moc"
+
+typedef KGenericFactory<AccessibilityConfig, QWidget> AccessibilityFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_accessibility, AccessibilityFactory("kcmaccessibility") )
+
+/**
+ * This function checks if the kaccess daemon needs to be run
+ * This function will be deprecated since the kaccess daemon will be part of kded
+ */
+// static bool needToRunKAccessDaemon( KConfig *config ){
+// KConfigGroup group( config, "Bell" );
+//
+// if(!group.readBoolEntry("SystemBell", true)){
+// return true;
+// }
+// if(group.readBoolEntry("ArtsBell", false)){
+// return true;
+// }
+// if(group.readBoolEntry("VisibleBell", false)){
+// return true;
+// }
+// return false; // don't need it
+// }
+
+AccessibilityConfig::AccessibilityConfig(QWidget *parent, const char *name, const QStringList &)
+ : AccessibilityConfigWidget( parent, name){
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmaccessiblity"), I18N_NOOP("KDE Accessibility Tool"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2000, Matthias Hoelzer-Kluepfel"));
+
+ about->addAuthor("Matthias Hoelzer-Kluepfel", I18N_NOOP("Author") , "hoelzer@kde.org");
+ about->addAuthor("Jos Pablo Ezequiel Fernndez", I18N_NOOP("Author") , "pupeno@kde.org");
+ setAboutData( about );
+
+ kdDebug() << "Running: AccessibilityConfig::AccessibilityConfig(QWidget *parent, const char *name, const QStringList &)" << endl;
+ // TODO: set the KURL Dialog to open just audio files
+ connect( mainTab, SIGNAL(currentChanged(QWidget*)), this, SIGNAL(quickHelpChanged()) );
+ load();
+}
+
+
+AccessibilityConfig::~AccessibilityConfig(){
+ kdDebug() << "Running: AccessibilityConfig::~AccessibilityConfig()" << endl;
+}
+
+void AccessibilityConfig::load()
+{
+ load( false );
+}
+
+void AccessibilityConfig::load( bool useDefaults )
+{
+ kdDebug() << "Running: AccessibilityConfig::load()" << endl;
+
+ KConfig *bell = new KConfig("bellrc", true);
+
+ bell->setReadDefaults( useDefaults );
+
+ bell->setGroup("General");
+ systemBell->setChecked(bell->readBoolEntry("SystemBell", false));
+ customBell->setChecked(bell->readBoolEntry("CustomBell", false));
+ visibleBell->setChecked(bell->readBoolEntry("VisibleBell", false));
+
+ bell->setGroup("CustomBell");
+ soundToPlay->setURL(bell->readPathEntry("Sound", ""));
+
+ bell->setGroup("Visible");
+ invertScreen->setChecked(bell->readBoolEntry("Invert", true));
+ flashScreen->setChecked(bell->readBoolEntry("Flash", false));
+ // TODO: There has to be a cleaner way.
+ QColor *redColor = new QColor(Qt::red);
+ flashScreenColor->setColor(bell->readColorEntry("FlashColor", redColor));
+ delete redColor;
+ visibleBellDuration->setValue(bell->readNumEntry("Duration", 500));
+
+ delete bell;
+ emit changed( useDefaults );
+}
+
+
+void AccessibilityConfig::save(){
+ kdDebug() << "Running: AccessibilityConfig::save()" << endl;
+
+ KConfig *bell = new KConfig("bellrc");
+
+ bell->setGroup("General");
+ bell->writeEntry("SystemBell", systemBell->isChecked());
+ bell->writeEntry("CustomBell", customBell->isChecked());
+ bell->writeEntry("VisibleBell", visibleBell->isChecked());
+
+ bell->setGroup("CustomBell");
+ bell->writePathEntry("Sound", soundToPlay->url());
+
+ bell->setGroup("Visible");
+ bell->writeEntry("Invert", invertScreen->isChecked());
+ bell->writeEntry("Flash", flashScreen->isChecked());
+ bell->writeEntry("FlashColor", flashScreenColor->color());
+ bell->writeEntry("Duration", visibleBellDuration->value());
+
+ bell->sync();
+ delete bell;
+}
+
+
+void AccessibilityConfig::defaults()
+{
+ load( true );
+}
diff --git a/kcontrol/accessibility/accessibility.desktop b/kcontrol/accessibility/accessibility.desktop
new file mode 100644
index 000000000..2295b85c6
--- /dev/null
+++ b/kcontrol/accessibility/accessibility.desktop
@@ -0,0 +1,239 @@
+[Desktop Entry]
+Exec=kcmshell accessibility
+Icon=access
+Type=Application
+
+
+X-KDE-Library=accessibility
+X-KDE-Factoryname=accessibility
+X-KDE-ParentApp=kcontrol
+
+Name=Accessibility
+Name[af]=Toeganklikheid
+Name[ar]=تسهيل الوصول
+Name[az]=Yetişmə Qabiliyyəti
+Name[be]=Даступнасць
+Name[bg]=Равностоен достъп
+Name[bn]=সহায়ক প্রযুক্তি
+Name[br]=Haezadusted
+Name[bs]=Pristupačnost
+Name[ca]=Accessibilitat
+Name[cs]=Zpřístupnění
+Name[csb]=Pòmòce przistãpù
+Name[cy]=Hygyrchedd
+Name[da]=Tilgængelighed
+Name[de]=Zugangshilfen
+Name[el]=Προσιτότητα
+Name[eo]=Alirebleco
+Name[es]=Accesibilidad
+Name[et]=Hõlbustus
+Name[eu]=Erabilerraztasuna
+Name[fa]=دستیابی‌پذیری
+Name[fi]=Helppokäyttötoiminnot
+Name[fr]=Accessibilité
+Name[fy]=Tagonklikens
+Name[ga]=Inrochtaineacht
+Name[gl]=Accesibilidade
+Name[he]=נגישות
+Name[hi]=पहुँच
+Name[hr]=Pristupačnost
+Name[hu]=Kezelési segítség
+Name[id]=Aksesibiliti
+Name[is]=Aðgengi
+Name[it]=Accessibilità
+Name[ja]=アクセシビリティ
+Name[ka]=სპეციალური შესაძლბლობები
+Name[kk]=Арнайы мүмкіндіктер
+Name[km]=ភាព​អាច​ចូល​ដំណើរការ​បាន
+Name[ko]=내게 필요한 설정
+Name[lo]=ຄວາມສາມາດໃນການໃຊ້ງານ
+Name[lt]=Prieinamumas
+Name[lv]=Pieejamība
+Name[mk]=Пристапливост
+Name[mn]=Хэрэглэх тохь
+Name[ms]=Kebolehcapaian
+Name[mt]=Aċċessibiltà
+Name[nb]=Tilgjengelighet
+Name[nds]=Behinnertenhülp
+Name[ne]=पहुँचता
+Name[nl]=Toegankelijkheid
+Name[nn]=Tilgjenge
+Name[nso]=Botsenelo
+Name[oc]=Accessibilitat
+Name[pa]=ਸਹੂਲਤਾਂ
+Name[pl]=Dostępność
+Name[pt]=Acessibilidade
+Name[pt_BR]=Acessibilidade
+Name[ro]=Accesibilitate
+Name[ru]=Специальные возможности
+Name[rw]=Ukugerwaho
+Name[se]=Álkkibut geavaheapmi
+Name[sk]=Prístupnosť
+Name[sl]=Dostopnost
+Name[sr]=Приступачност
+Name[sr@Latn]=Pristupačnost
+Name[ss]=Kutfolakala kalula
+Name[sv]=Handikappstöd
+Name[ta]=அணுகல்
+Name[te]=అందుబాటు
+Name[tg]=Имконпазирӣ
+Name[th]=ตัวช่วยในการใช้งาน
+Name[tr]=Erişilebilirlik
+Name[tt]=Qulaylıq
+Name[uk]=Доступність
+Name[uz]=Qulayliklar
+Name[uz@cyrillic]=Қулайликлар
+Name[ven]=Dzheneaho
+Name[vi]=Hỗ trợ người tàn tật
+Name[wa]=Accessibilité
+Name[xh]=Unikezelo
+Name[zh_CN]=辅助
+Name[zh_TW]=無障礙輔助
+Name[zu]=Ukungena
+
+Comment=Improve accessibility for disabled persons
+Comment[af]=Verbeter toeganklikheid vir gestremde persone
+Comment[ar]=تسهيل الاستخدام لذوي الاحتياجات الخاصة
+Comment[az]=Yetişmə qabiliyyəti zəyif olanların həyatını asanlaşdırar
+Comment[be]=Павялічвае даступнасць для людзей з фізічнымі адхіленнямі
+Comment[bg]=Настройване на достъпа за хора с увреждания
+Comment[bn]=অসমর্থ ব্যবহারকারীদের সহায়তা করার প্রযুক্তি
+Comment[bs]=Bolja pristupačnost za osobe sa nedostacima
+Comment[ca]=Accessibilitat millorada per a persones discapacitades
+Comment[cs]=Zlepšení přístupnosti pro osoby s postižením
+Comment[csb]=Pòprôwionô przistãpnosc dlô niefùlsprôwnëch lëdzi
+Comment[cy]=Gwella hygyrchedd i bobl anabl
+Comment[da]=Forbedr tilgængelighed for handicappede personer
+Comment[de]=Verbesserte Benutzbarkeit für behinderte Menschen
+Comment[el]=Βελτίωση της προσιτότητας για άτομα με ειδικές ανάγκες
+Comment[eo]=Plibonigita alirebleco por handikapitoj
+Comment[es]=Mejorar accesibilidad para discapacitados
+Comment[et]=Puuetega inimestele mõeldud seaded
+Comment[eu]=Erabilerraztasuna hobetzen du pertsona elbarrientzat
+Comment[fa]=بهبود دستیابی‌پذیری برای اشخاص ناتوان
+Comment[fi]=Käyttöä helpottavia asetuksia
+Comment[fr]=Accessibilité améliorée pour les personnes handicapées
+Comment[fy]=Ferbeterde tagonklikens foar brûkers mei in handikap
+Comment[ga]=Feabhsaigh an inrochtaineacht do dhaoine míchumasaithe
+Comment[gl]=Acesibilidade mellorada para persoas con discapacidades
+Comment[he]=שיפור הנגישות עבור אנשים עם מגבלות
+Comment[hi]=विकलांग व्यक्तियों के लिए पहुँच बेहतर बनाए
+Comment[hr]=Unaprijedite pristupačnost osobama s invaliditetom
+Comment[hu]=A számítógép kezelését segítő eszközök fogyatékosoknak
+Comment[is]=Endurbætt aðgengi fyrir þá sem þurfa
+Comment[it]=Accessibilità migliorata per le persone disabili
+Comment[ja]=障害のある方達のためのアクセス改善
+Comment[ka]=ფიზიკური ნაკლოვანებბის მქონი ხალხისთვის სპეციალური შესაძლბლობები
+Comment[kk]=Мүмкіншіліктері шектеулі адамдарға көмек
+Comment[km]=បង្កើន​មធ្យោបាយ​ងាយស្រួល​សម្រាប់​មនុស្ស​ពិការ
+Comment[ko]=장애인들을 위하여 접근성을 향상시킵니다
+Comment[lo]=ປັບຄ່າຄວາມສາມາດໃນການໃຊ້ງານສຳຫລັບຜູ້ທີ່ມີຄວາມສາມາດ
+Comment[lt]=Pagerintas prieinamumas neįgaliems asmenims
+Comment[lv]=Uzlabo pieejamību cilvekiem ar īpašām vajadzībām
+Comment[mk]=Ја подобрува пристапливоста за хендикепирани лица
+Comment[mn]=Гэмтэлтэй хүнд зориулан сайжруулсан хэрэглээ
+Comment[ms]=Tingkatkan keaksesan bagi orang kurang upaya
+Comment[mt]=Aċċessibbiltà aħjar għal persuni b'diżabilità
+Comment[nb]=Forbedret tilgjengelighet for funksjonshemmede
+Comment[nds]=Verbetert den Togang för Behinnerte
+Comment[ne]=अक्षम व्यक्तिका लागि पहुँच क्षमता सुधार गर्नुहोस्
+Comment[nl]=Verbeterde toegankelijkheid voor gebruikers met een handicap
+Comment[nn]=Forbetra tilgjenge for funksjonshemma personar
+Comment[nso]=Kaonafatsa botsenelo bja batho bao basa kgonego go itirela
+Comment[pa]=ਅਪੰਗ ਵਿਅਕਤੀ ਲਈ ਸੁਧਾਰੀ ਸਹਾਇਤਾ
+Comment[pl]=Poprawiona dostępność dla osób niepełnosprawnych
+Comment[pt]=Acessibilidade melhorada para pessoas com necessidades especiais
+Comment[pt_BR]=Melhora a acessibilidade para pessoas com deficiência
+Comment[ro]=Îmbunătățește accesibilitate KDE pentru persoanele cu handicap
+Comment[ru]=Специальные возможности для людей с физическими недостатками
+Comment[rw]=Kongera ukugerwaho kw'abantu bahagaritswe
+Comment[se]=Álkkibut geavaheapmi doaimmahehttejuvvon olbmuide
+Comment[sk]=Zlepšenie prístupnosti pre postihnutých používateľov
+Comment[sl]=Izboljšana dostopnost za prizadete osebe
+Comment[sr]=Унапређује приступачност за хендикепиране особе
+Comment[sr@Latn]=Unapređuje pristupačnost za hendikepirane osobe
+Comment[ss]=Phucula kufinyelela kwebantfu labachwalile
+Comment[sv]=Förbättrad tillgänglighet för handikappade personer
+Comment[ta]=பார்க்க முடியாதவர்களுக்கு அணுகலை அதிகப்படுத்தவும்
+Comment[tg]=Имкониятҳои махсус барои одамони нуқсони ҷисмонӣ
+Comment[th]=ทำให้ความสามารถในการใช้งาน สำหรับผู้พิการดีขึ้น
+Comment[tr]=Görme sorunu olanlar için erişilebilirlik seçenekleri
+Comment[tt]=Ğäriplär öçen uñaylıqlar
+Comment[uk]=Підвищення зручності для інвалідів
+Comment[uz]=Nogiron kishilar uchun qulayliklar
+Comment[uz@cyrillic]=Ногирон кишилар учун қулайликлар
+Comment[ven]=Khwinifhadzani madzhenele uitela vhathu vha zwihole
+Comment[vi]=Hỗ trợ người tàn tật
+Comment[wa]=Amidrêye l' accessibilité po les mesplotchès djins
+Comment[xh]=Phucula unikekezeleko lwabantu abakhubazekileyo
+Comment[zh_CN]=方便残疾人使用的辅助功能
+Comment[zh_TW]=方便傷殘人士使用
+Comment[zu]=Ukwenza ukungena kwabantu abakhubazekile kube lula
+
+Keywords=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[af]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num bordjie
+Keywords[az]=yetişmə,yetişmə qabiliyyəti,kar,əlil,çən,eşidilə bilən çən,görünür çən,Klaviatura,düymələr,yapışqan düymələr,hoppanan düymələr,yavaş düymələr,siçan yönləndirməsi,num pad
+Keywords[be]=доступ,даступнасць,званок,гукавы сігнал,бачны сігнал,клавіятура,клавішы,"ліпучыя" клавішы,"рухомыя" клавішы,марудныя клавішы,навігацыя мышшу,лічбавая клавіятура,access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[bg]=достъп, увреждания, равностоен, равноправен, зрителни, зрителен, без зрение, access, accessibility, deaf, impaired, bell, audible bell, visible bell, Keyboard, keys, sticky keys, bounce keys, slow keys, mouse navigation, num pad
+Keywords[ca]=accés,accessibilitat,sord,disminuït,timbre,timbre audible,timbre visible,Teclat,tecles,tecles apegaloses,tecles de repetició,tecles lentes,navegació del ratolí,teclat numèric
+Keywords[cs]=Zpřístupnění,Hluchý,Slepý,Postižený,Zvonek,Slyšitelný zvonek,Viditelný zvonek,Klávesnice,Pomalé klávesy,Navigace myši,Num pad
+Keywords[csb]=przistãp,przistãpnosc,głëchy,zwónk,słëszalny zwónk widzalny zwónk,klawiatura,klawisze,przëklejone klawisze,odbijanié klawiszów,pòwólné klawisze,nawigacëjô mëszą,numericznô klawiatura
+Keywords[cy]=mynediad,hygyrchedd,byddar,cloch,cloch clywadwy,cloch gweladwy,bysellfwrdd,allweddell,bysell,bysell gludog,bysell sponcio,bysell araf,llywio llygoden,pad rhif
+Keywords[da]=adgang,tilgængelighed,døv,handicappet,klokke,hørbar klokke,synlig klokke,Tastatur,taster,klæbrige taster,bounce-taster,langsomme taster,musenavigering,numerisk tastatur
+Keywords[de]=Behinderung,Maussteuerung,Signale,Tastatur,Tasten,Taubheit,Verlangsamte Tasten,Zahlenblock,Zugang,Zugangshilfen
+Keywords[el]=πρόσβαση,προσιτότητα,κωφός,impaired,κουδούνι,ακουστή ειδοποίηση,ορατή ειδοποίηση,Πληκτρολόγιο,πλήκτρα,κολλημένα πλήκτρα,πλήκτρα αναπήδησης,αργά πλήκτρα,πλοήγηση ποντικιού,αριθμητικό πληκτρολόγιο
+Keywords[eo]=aliro,handikapito,malhelpito,pepo,videbla pepo,klavaro,klavoj,klavfikso, musnavigado,nombroklavaro
+Keywords[es]=acceso,accesibilidad,sordo,disminuido,timbre,timbre audible,timbre visible,Teclado,teclas,teclas pegajosas,teclas de golpe,teclas lentas,navegación del ratón,teclado numérico
+Keywords[et]=juurdepääs,kurt,puue,puudega,signaal,kuuldav signaal,visuaalne signaal,klaviatuur,klahvid,kleepuvad klahvid,põrkavad klahvid,aeglased klahvid,hiire liigutamine,numbriklaviatuur
+Keywords[eu]=sarrera,erabilerraztasuna,gorra,elbarria,ezkila,ezkila entzungarria, ezkila ikusgarria,Teklatua,teklak,tekla itsaskorrak, bounce teklak,tekla geldoak,sagu bidezko arakaketa,tekla numerikoak
+Keywords[fa]=دستیابی، دستیابی‌پذیری، ناشنوا، معلول، زنگ، زنگ شنیدنی، زنگ مرئی، صفحه کلید، کلیدها، کلیدهای چسبناک، کلیدهای واگشت، کلیدهای کند، ناوش موشی، صفحه اعداد
+Keywords[fi]=käytettävyys,esteettömyys,kuuro,vammautunut,virheilmoitus,virheääni,näkyvä virheilmoitus,näppäimistö,näppäimet,alas jäävät näppäimet,toistavat näppäimet,hitaat näppäimet,hiirinavigointi,numeronäppäimistö
+Keywords[fr]=accès,accessibilité,surdité,sourd,cloche,son,cloche visuelle,cloche sonore,clavier,touches,souris,touches lentes,touches rémanentes,cloche auditive,touches répétées,répétition des touches,auto-maintien des touches,maintien des touches,navigation à la souris,pointeur de souris,émulation du clavier,clavier numérique
+Keywords[fy]=tagong,tagonklikens,dôf,handikap,beheind,bel,sinjalearing,sichtbermeldingen,Kaaiboerd,kaaien,kleef kaaien,kaaioanslag,Mûsnavigaasje,num pad,numeryske klavier
+Keywords[ga]=rochtain,inrochtaineacht,bodhar,clog,clog inchloiste,clog infheicthe,Méarchlár,eochracha,eochracha greamaitheacha,eochracha preabtha,eochracha go mall,nascleanúint luiche,eochaircheap uimhriúil
+Keywords[gl]=aceso,acesibilidade,impar,campá,badalada audíbel,badalada visíbel,teclado,teclas,teclas pegadias,teclas de repetición,teclas lentas,navegación do rato,teclado numérico
+Keywords[he]=גישה,נגישות,חירשים,לקויים,פעמון,פעמון נשמע,פעמון חזותי,לוח,מקשים ,מקלדת ,מקשים,מקשים דביקים,מקשים מוקפצים,מקשים אטיים,ניווט עכבר,מקשי מספרים, access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[hi]=एक्सेस, पहुँच,बघिर,दुर्बल,घंटी,सुनने योग्य घंटी,दिखने योग्य घंटी,कुंजीपट,कुंजियाँ, चिपकी (स्टिकी) कुंजी,बाउंस कुंजी,धीमी कुंजी,माउस नेविगेशन,न्यूम पैड
+Keywords[hr]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,pristup,pristupačnost,gluh,gluhoća,oštećenje,zvono,zvuk zvona,vidljivo zvono,tipkovnica,tipke,odbijanje tipki,spore tipke,navigacija mišem,numeričke tipke
+Keywords[hu]=hozzáférés,segédeszközök,süket,fogyatékos,csengő,hallható csengetés,látható csengetés,billentyűzet,billentyűk,ragadós billentyűk,visszaugró billentyűk,lassú billentyűk,egérkezelés,numerikus billentyűzet
+Keywords[is]=aðgangur,aðgengi,heyrnarlaus,fatlaður,píp,bjalla,sjáanleg bjalla,lyklaborð,takkar,músarnotkun,talnaborð
+Keywords[it]=accesso,accessibilità,non udenti,portatori di handicap,campanella,campanella udibile,campanella visibile,tastiera,tasti,permanenza dei tasti,pressione ravvicinata dei tasti,rallentamento dei tasti,navigazione mouse,tastierino numerico
+Keywords[ja]=アクセス,アクセシビリティ,聾唖,障害,ベル,音声ベル,視覚ベル,キーボート,キー,スティッキーキー,バウンスキー,スローキー,マウス補助,数字パッド
+Keywords[km]=ចូល​ដំណើរការ,មធ្យោបាយ​ងាយស្រួល,ថ្លង់,ពិការ,កណ្ដឹង,កណ្ដឹង​ឭ,កណ្ដឹង​មើល​ឃើញ,ក្ដារចុច,គ្រាប់ចុច,គ្រាប់ចុច​ស្អិត,គ្រាប់ចុច​លោត,គ្រាប់ចុច​យឺត,ការ​រុករក​កណ្ដុរ,បន្ទះ​លេខ
+Keywords[lt]=prieinamumas,kurčias,kurčnebylys,neįgalus,skambutis,girdimas,matomas skambutis,klaviatūra,mygtukai,prisegti mygtukai,lėti mygtukai,navigacija su pele
+Keywords[lv]=pieeja,pieejamība,kurls,vājināts,zvans,dzirdams zvans,redzams zvans,Tastatūra,taustiņi,salīmētie taustiņi,elastīgie taustiņi,lēnie taustiņi,peles navigācija,num pads
+Keywords[mk]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,пристап,пристапност,глув,хендикепиран,ѕвонче,звучно ѕвонче,визуелно ѕвонче,Тастатура,копчиња,лепливи копчиња,отскочни копчиња,бавни копчиња,навигација со глушецот,тастатура со бројки
+Keywords[mn]=Гар,Гэмтэл,Дүлий,Сигнал,Товчилуур,Тооны хэсэг,Хандалт,Хулганы жолоодлого,Хэрэглэх тохь, Удаашруулсан товчилуур
+Keywords[mt]=access,accessibility,aċċessibbiltà,deaf,trux,truxa,torox,impaired,ħadikappat,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[nb]=tilgang,tilgjengelighet,døv,handikappet,lyd,signal,bjelle,synlig signal,tastatur,taster,faste valgtaster,trege taster,filtertaster,musnavigering,numerisk tastatur
+Keywords[nds]=Togang,accessibility,doof,Behinnerte,Pingel,höörbore Pingel,Ogenpingel,Tastatuur,Tasten,backige Tasten,springen Tasten,langsam Tasten,Muusnavigatschoon,Tallenblock
+Keywords[ne]=पहुँच, पहुँचयोग्यता, डिफ, बिग्रेको, बेल, सुन्न सकिने बेल, हेर्न सकिने बेल, कुञ्जीपाटी, कुञ्जीहरू, टाँसिने कुञ्जीहरू, उफ्रिने कुञ्जीहरू, ढिलो कुञ्जीहरू, माउस नेभिगेसन, नम प्याड
+Keywords[nl]=toegang,toegankelijkheid,doof,handicap,gehandicapt,bel,signalering,zichtbare meldingen,Keyboard,toetsenbord,keys,toetsen,vastgeplakte toetsen,toetsenaanslag,muisnavigatie,num pad,numerieke klavier
+Keywords[nn]=tilgang,tilgjenge,døv,handikappa,lyd,signal,bjelle,synleg signal,tastatur,tastar,faste modifikasjonstastar,trege tastar,filtertastar,musnavigering,numerisk tastatur
+Keywords[nso]=tsenelo,botsenelo,sefofu,kelekantswe,bell,bell yeo e kwagalago, bell yeo e bonagalago,Keyboard,ditobetswa,ditobetswa tseo di tiilego,ditobetswa tsago pampa,ditobetswa tsago nanya,navigation ya legotlo,num pad
+Keywords[pa]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,ਕੀ-ਬੋਰਡ,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[pl]=dostęp,dostępność,głuchy,upośledzony,dzwonek,słyszalny dzwonek widzialny dzwonek,klawiatura,klawisze,klejące klawisze,odbijanie klawiszy,powolne klawisze,nawigacja myszą,klawiatura numeryczna
+Keywords[pt]=acesso,acessibilidade,surdo,deficiente,campainha,campainha audível,campainha visível,teclado,teclas,teclas 'sticky',teclas 'bounce',teclas lentas,navegação com o rato,num pad
+Keywords[pt_BR]=acesso,acessibilidade,surdo,deficiente,campainha,audível,campainha visível, teclado,teclas,teclas persistentes,teclas repetidas,teclas lentas,navegação do mouse,teclado numérico
+Keywords[ro]=acces,accesibilitate,surd,handicap,difuzor,audibil,sunet vizibil,tastatură,taste,taste comutator,taste fără repetiție,taste lente,navigare mouse,tastatura numerică
+Keywords[ru]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,залипающие клавиши,специальные возможности,клавиши
+Keywords[rw]=kugera,ukugerwaho,ikitumva,cyononekaye,inzogera,inzogera yumvikana,inzogera igaragara,mwandikisho,buto,buto zifashe,buto zidunda,iyega ry'imbeba,agacemibare
+Keywords[se]=álkkibut,bealljeheapmi,doaimmahehttejuvvon,jietna,signála,oaidnus signála,boallobeavdi,boalut,giddes boalut,sáhpannavigašuvdna,numerálaš boallobeavdi
+Keywords[sk]=prístup,prístupnosť,hluchý,postihnutý,zvonček,hlasný zvonček,viditeľný zvonček, klávesnica,klávesy,lepivé klávesy,odrážané klávesy,pomalé klávesy,navigácia myšou,číslice
+Keywords[sl]=dostop,dostopnost,gluh,gluhota,prizadetost,zvonec,vidni zvonec,zvonček,tipkovnica,tipke,lepljive tipke,počasne tipke,navigacija miške,numerična tipkovnica,invalidnost,invalid
+Keywords[sr]=приступ,приступачност,глув,хендикепиран,звоно,звучно звоно,визуелно звоно,тастатура,тастери,лепљиви тастери,спори тастери,померање миша,нумеричка тастатура
+Keywords[sr@Latn]=pristup,pristupačnost,gluv,hendikepiran,zvono,zvučno zvono,vizuelno zvono,tastatura,tasteri,lepljivi tasteri,spori tasteri,pomeranje miša,numerička tastatura
+Keywords[sv]=tillgång,tillgänglighet,döv,handikappad,signal,ljudsignal,visuell signal,Tangentbord,tangenter,klistriga tangenter,studsande tangenter,långsamma tangenter,musnavigering,numeriskt tangentbord
+Keywords[ta]=அணுகல்,அணுகும் முறை,காது கேளாத,ஆற்றல் குறைந்த,மணியோசை,காதால் கேட்கும் அளவிற்கு மணியோசை,தெரியும் மணியோசை,விசைபலகை,விசைகள்,ஒட்டும் விசைகள்,மீளும் தன்மையுடைய விசைகள்,மெதுவான விசைகள்,சுட்டிநாவிகேஷன்,எண்ணிக்கை அட்டை
+Keywords[th]=การเข้าถึง,ความง่ายในการใช้งาน,หูหนวก,บกพร่อง,ออด, ออดใช้ฟัง,ออดใช้ดู,แป้นพิมพ์,ปุ่ม,ปุ่มติดหนึบ,ปุ่มสะท้อน, ปุ่มชะลอ,นำทางโดยเมาส์,แผงปุ่มตัวเลข
+Keywords[tr]=erişim,erişilebilirlik,sağır,özürlü,zil,duyulabilir zil,görünür zil,Klavye,tuşlar,yapışkan tuşlar,zıplayan tuşlar,yavaş tuşlar,fare yönlendirmesi,num pad
+Keywords[uk]=доступ,доступність,глухий,каліка,дзвінок,аудіодзвінок,відеодзвінок,клавіатура,клавіші,липкі клавіші,пружні клавіші,повільні клавіші,навігація миші,цифрова клавіатура
+Keywords[ven]=dzhena,dzheneaho,dzingandevhe,bele,bele i pfalaho,bele i vhonalaho,khiibodo,khii,khii i nambatelaho,khii i fhufhaho,khii i lengaho,lwendo lwa mausu,num pad
+Keywords[vi]=truy cập,hỗ trợ người tàn tật,điếc,bị thương,chuông,chuông kêu,chuông rung,bàn phím,phím,phím dính,phím nảy,phím chậm,di chuyển chuột,bàn phím số
+Keywords[wa]=accès,accessibilité,sourd,mesplotche,cloke,clotche,veyåve,taprece,tapes,aclapantès tapes,tapes di ridjiblaedje,londjinnès tapes,naiviaedje al sori,num pad,xhilete,etindåve xhilete,veyåve xhilete
+Keywords[xh]=nikezela,unikezelo,ayiva,yonakalisiwe,intsimbi,intsimbi evakalayo, intsimbi ebonakalayo,ibhodi yezitshixo,izitshixo,isithixo esincangathi, izitshixo ezilungisiweyo,izitshixo ezinengxolo,izitshixo ezicothayo,indlela yokubeka i mouse endaweni,inkatha ye num
+Keywords[zh_CN]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,辅助功能,聋,键盘,粘滞键,撞击键,筛选键,鼠标导航,可视铃声,小键盘
+Keywords[zh_TW]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,使用,聾,鈴聲,聽得見的鈴,看得見的鈴,鍵盤,按鍵,滑鼠導向,數字鍵
+Keywords[zu]=ngena,ukungena,okuthuli,kukhubazekile,insimbi,insimbiezwakalayo, insimbi ebonakalayo,okhiye,okhiye abanamathelayo,okhiyeababhampayo,okhiye abahamba kancane,ukuzula kwe-mouse,num pad
+
+Categories=Qt;KDE;X-KDE-settings-accessibility;
diff --git a/kcontrol/accessibility/accessibility.h b/kcontrol/accessibility/accessibility.h
new file mode 100644
index 000000000..ad94dcdcc
--- /dev/null
+++ b/kcontrol/accessibility/accessibility.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+ accessibility.h
+ KDE Control Accessibility module to control Bell, Keyboard and ?Mouse?
+ -------------------
+ Copyright : (c) 2000 Matthias Hlzer-Klpfel
+ -------------------
+ Original Author: Matthias Hlzer-Klpfel
+ Contributors: Jos Pablo Ezequiel "Pupeno" Fernndez <pupeno@kde.org>
+ Current Maintainer: Jos Pablo Ezequiel "Pupeno" Fernndez <pupeno@kde.org>
+ ****************************************************************************/
+
+/****************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ****************************************************************************/
+
+#ifndef _ACCESSIBILITY_H_
+#define _ACCESSIBILITY_H_
+
+#include <kdebug.h>
+
+#include "accessibilityconfigwidget.h"
+
+class AccessibilityConfig : public AccessibilityConfigWidget {
+ Q_OBJECT
+
+ public:
+ /**
+ * Constructor
+ */
+ AccessibilityConfig(QWidget *parent = 0L, const char *name = 0L, const QStringList &foo = QStringList());
+
+ /**
+ * Destructor
+ */
+ virtual ~AccessibilityConfig();
+
+ /**
+ * This method is invoked whenever the module should read its
+ * configuration (most of the times from a config file) and update the
+ * user interface. This happens when the user clicks the "Reset" button in
+ * the control center, to undo all of his changes and restore the currently
+ * valid settings. NOTE that this is not called after the modules is loaded,
+ * so you probably want to call this method in the constructor.
+ */
+ void load();
+ void load( bool useDefaults );
+
+ /**
+ * This function gets called when the user wants to save the settings in
+ * the user interface, updating the config files or wherever the
+ * configuration is stored. The method is called when the user clicks "Apply"
+ * or "Ok".
+ */
+ void save();
+
+ /**
+ * This function is called to set the settings in the module to sensible
+ * default values. It gets called when hitting the "Default" button. The
+ * default values should probably be the same as the ones the application
+ * uses when started without a config file.
+ */
+ void defaults();
+
+};
+
+#endif // _ACCESSIBILITY_H_
diff --git a/kcontrol/accessibility/accessibilityconfigwidget.ui b/kcontrol/accessibility/accessibilityconfigwidget.ui
new file mode 100644
index 000000000..5d0069a09
--- /dev/null
+++ b/kcontrol/accessibility/accessibilityconfigwidget.ui
@@ -0,0 +1,1630 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>AccessibilityConfigWidget</class>
+<author>José Pablo Ezequiel Fernández &lt;pupeno@kde.org&gt;</author>
+<widget class="KCModule">
+ <property name="name">
+ <cstring>AccessibilityConfigWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>552</width>
+ <height>419</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Accessibility</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>mainTab</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Bell</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>audibleBellGroup</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Audible Bell</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is the configuration of the Audible Bell.&lt;br&gt;
+It could be the system bell and/or a custom bell.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>systemBell</cstring>
+ </property>
+ <property name="text">
+ <string>Use &amp;system bell</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is checked, the default system bell will be used. See the "System Bell" control module for how to customize the system bell.&lt;br&gt;
+Normally, this is just a "beep".</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>customBell</cstring>
+ </property>
+ <property name="text">
+ <string>Use &amp;customized bell</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option if you want to use a customized bell, playing a sound file. If you do this, you will probably want to turn off the system bell.&lt;br&gt;
+Please note that on slow machines this may cause a "lag" between the event causing the bell and the sound being played.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>soundToPlayLayout</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>soundToPlaySpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>soundToPlayLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Sound &amp;to play:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>soundToPlay</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If the option "Use customized bell" is enabled, you can choose a sound file here.</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>soundToPlay</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>visibleBellGroup</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Visible Bell</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>visibleBell</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use visible bell</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>visibleBellDurationLayout</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntSpinBox" row="1" column="0">
+ <property name="name">
+ <cstring>visibleBellDuration</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="suffix">
+ <string> msec</string>
+ </property>
+ <property name="maxValue">
+ <number>2000</number>
+ </property>
+ <property name="minValue">
+ <number>100</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>500</number>
+ </property>
+ </widget>
+ <widget class="QSlider" row="1" column="1">
+ <property name="name">
+ <cstring>visibleBellDurationSlider</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minValue">
+ <number>100</number>
+ </property>
+ <property name="maxValue">
+ <number>2000</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="pageStep">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>500</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Right</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>visibleBellDurationLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Duration:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>visibleBellDuration</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="0" column="0">
+ <property name="name">
+ <cstring>visibleBellOptionsSpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QButtonGroup" row="0" column="1">
+ <property name="name">
+ <cstring>inverFlashScreenButtonGroup</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>invertScreen</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>I&amp;nvert screen</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>flashScreenLayout</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>flashScreen</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>F&amp;lash screen:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton">
+ <property name="name">
+ <cstring>flashScreenColor</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="color">
+ <color>
+ <red>255</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>flashScreenSpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>15</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>bellSpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Keyboard</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>stickyKeysGroup</cstring>
+ </property>
+ <property name="title">
+ <string>S&amp;ticky Keys</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>stickyKeys</cstring>
+ </property>
+ <property name="text">
+ <string>Use &amp;sticky keys</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>lockWithStickyKeysLayout</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>lockWithStickyKeysSpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>lockWithStickyKeys</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Lock with sticky keys</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>slowKeysGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Slo&amp;w Keys</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>slowKeys</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use slow keys</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>slowKeysDelayLayout</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>slowKeysDelay</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="suffix">
+ <string> msec</string>
+ </property>
+ <property name="maxValue">
+ <number>2000</number>
+ </property>
+ <property name="minValue">
+ <number>100</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>500</number>
+ </property>
+ </widget>
+ <widget class="QSlider" row="1" column="2">
+ <property name="name">
+ <cstring>slowKeysDelaySlider</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minValue">
+ <number>100</number>
+ </property>
+ <property name="maxValue">
+ <number>2000</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="pageStep">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>500</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Right</enum>
+ </property>
+ </widget>
+ <spacer row="0" column="0">
+ <property name="name">
+ <cstring>slowKeysSpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>slowKeysDelayLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Duration:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>slowKeysDelay</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>bounceKeysGroup</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Bounce Keys</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>bounceKeys</cstring>
+ </property>
+ <property name="text">
+ <string>Use bou&amp;nce keys</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>bounceKeysDelayLayout</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSlider" row="1" column="2">
+ <property name="name">
+ <cstring>bounceKeysDelaySlider</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minValue">
+ <number>100</number>
+ </property>
+ <property name="maxValue">
+ <number>2000</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="pageStep">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>500</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Right</enum>
+ </property>
+ </widget>
+ <spacer row="0" column="0">
+ <property name="name">
+ <cstring>bounceKeysDelaySpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KIntSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>bounceKeysDelay</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="suffix">
+ <string> msec</string>
+ </property>
+ <property name="maxValue">
+ <number>2000</number>
+ </property>
+ <property name="minValue">
+ <number>100</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>500</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>bounceKeysDelayLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Du&amp;ration:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>bounceKeysDelay</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>keyboardSpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>61</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Mouse</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>mouseNavigationGroup</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Navigation</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>moveWithKeyboard</cstring>
+ </property>
+ <property name="text">
+ <string>Mo&amp;ve mouse with keyboard</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>moveWithKeyboardLayout</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntSpinBox" row="2" column="2">
+ <property name="name">
+ <cstring>accelerationTime</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>5000</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="lineStep">
+ <number>250</number>
+ </property>
+ <property name="value">
+ <number>1000</number>
+ </property>
+ </widget>
+ <widget class="QSlider" row="2" column="3">
+ <property name="name">
+ <cstring>accelerationTimeSlider</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="maxValue">
+ <number>5000</number>
+ </property>
+ <property name="lineStep">
+ <number>250</number>
+ </property>
+ <property name="pageStep">
+ <number>2500</number>
+ </property>
+ <property name="value">
+ <number>1000</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Right</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="1">
+ <property name="name">
+ <cstring>maximumSpeedLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Ma&amp;ximum speed:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>maximumSpeed</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="1">
+ <property name="name">
+ <cstring>accelerationTimeLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Acceleration &amp;time:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>accelerationTime</cstring>
+ </property>
+ </widget>
+ <widget class="QSlider" row="0" column="3">
+ <property name="name">
+ <cstring>accelerationDelaySlider</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="lineStep">
+ <number>50</number>
+ </property>
+ <property name="pageStep">
+ <number>500</number>
+ </property>
+ <property name="value">
+ <number>160</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Right</enum>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox" row="3" column="2">
+ <property name="name">
+ <cstring>maximumSpeed</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>500</number>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox" row="1" column="2">
+ <property name="name">
+ <cstring>repeatInterval</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="suffix">
+ <string> msec</string>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>5</number>
+ </property>
+ </widget>
+ <spacer row="0" column="0">
+ <property name="name">
+ <cstring>moveWithKeyboardSpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSlider" row="3" column="3">
+ <property name="name">
+ <cstring>maximumSpeedSlider</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="pageStep">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>500</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Right</enum>
+ </property>
+ <property name="tickInterval">
+ <number>50</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>repeatIntervalLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Repeat interval:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>repeatInterval</cstring>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox" row="0" column="2">
+ <property name="name">
+ <cstring>accelerationDelay</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix">
+ <string> msec</string>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="lineStep">
+ <number>50</number>
+ </property>
+ <property name="value">
+ <number>160</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="1">
+ <property name="name">
+ <cstring>accelerationProfileLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Acceleration &amp;profile:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>accelerationProfile</cstring>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox" row="4" column="2">
+ <property name="name">
+ <cstring>accelerationProfile</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="minValue">
+ <number>-1000</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ </widget>
+ <widget class="QSlider" row="4" column="3">
+ <property name="name">
+ <cstring>accelerationProfileSlider</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minValue">
+ <number>-1000</number>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="pageStep">
+ <number>1000</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Right</enum>
+ </property>
+ <property name="tickInterval">
+ <number>100</number>
+ </property>
+ </widget>
+ <widget class="QSlider" row="1" column="3">
+ <property name="name">
+ <cstring>repeatInternalSlider</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="pageStep">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>5</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Right</enum>
+ </property>
+ <property name="tickInterval">
+ <number>50</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>accelerationDelayLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Acceleration delay:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>accelerationDelay</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>mouseSpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>1</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>customBell</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>soundToPlay</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>customBell</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>soundToPlayLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>visibleBellDuration</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>visibleBellDurationSlider</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>visibleBellDurationSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>visibleBellDuration</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>slowKeysDelay</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>slowKeysDelaySlider</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>slowKeysDelaySlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>slowKeysDelay</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>bounceKeysDelay</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>bounceKeysDelaySlider</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>bounceKeysDelaySlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>bounceKeysDelay</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>visibleBell</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>invertScreen</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>visibleBell</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>flashScreen</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>visibleBell</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>updateFlashScreenColor()</slot>
+ </connection>
+ <connection>
+ <sender>visibleBell</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>visibleBellDuration</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>visibleBell</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>visibleBellDurationLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>visibleBell</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>visibleBellDurationSlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>flashScreen</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>flashScreenColor</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>stickyKeys</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lockWithStickyKeys</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>slowKeys</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>slowKeysDelayLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>slowKeys</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>slowKeysDelay</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>slowKeys</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>slowKeysDelaySlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>bounceKeys</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>bounceKeysDelayLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>bounceKeys</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>bounceKeysDelay</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>bounceKeys</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>bounceKeysDelaySlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>accelerationDelay</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>accelerationDelaySlider</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>accelerationDelaySlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>accelerationDelay</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>repeatInterval</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>repeatInternalSlider</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>repeatInternalSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>repeatInterval</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>accelerationTime</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>accelerationTimeSlider</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>accelerationTimeSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>accelerationTime</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>maximumSpeed</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>maximumSpeedSlider</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>maximumSpeedSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>maximumSpeed</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>accelerationProfile</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>accelerationProfileSlider</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>accelerationProfileSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>accelerationProfile</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>accelerationDelayLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>accelerationDelay</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>accelerationDelaySlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>repeatIntervalLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>repeatInterval</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>repeatInternalSlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>accelerationTimeLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>accelerationTime</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>accelerationTimeSlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>maximumSpeedLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>maximumSpeed</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>maximumSpeedSlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>accelerationProfileLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>accelerationProfile</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>accelerationProfileSlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>systemBell</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>customBell</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>soundToPlay</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>visibleBell</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>invertScreen</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>flashScreen</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>flashScreenColor</sender>
+ <signal>changed(const QColor&amp;)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>visibleBellDuration</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>visibleBellDurationSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>stickyKeys</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>lockWithStickyKeys</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>slowKeys</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>slowKeysDelay</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>slowKeysDelaySlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>bounceKeys</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>bounceKeysDelay</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>bounceKeysDelaySlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveWithKeyboard</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>accelerationDelay</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>accelerationDelaySlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>repeatInterval</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>repeatInternalSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>accelerationTime</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>accelerationTimeSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>maximumSpeed</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>maximumSpeedSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>accelerationProfile</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+ <connection>
+ <sender>accelerationProfileSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AccessibilityConfigWidget</receiver>
+ <slot>changed(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>mainTab</tabstop>
+ <tabstop>systemBell</tabstop>
+ <tabstop>customBell</tabstop>
+ <tabstop>soundToPlay</tabstop>
+ <tabstop>visibleBell</tabstop>
+ <tabstop>invertScreen</tabstop>
+ <tabstop>flashScreen</tabstop>
+ <tabstop>flashScreenColor</tabstop>
+ <tabstop>visibleBellDuration</tabstop>
+ <tabstop>visibleBellDurationSlider</tabstop>
+ <tabstop>stickyKeys</tabstop>
+ <tabstop>lockWithStickyKeys</tabstop>
+ <tabstop>slowKeys</tabstop>
+ <tabstop>slowKeysDelay</tabstop>
+ <tabstop>slowKeysDelaySlider</tabstop>
+ <tabstop>bounceKeys</tabstop>
+ <tabstop>bounceKeysDelay</tabstop>
+ <tabstop>bounceKeysDelaySlider</tabstop>
+ <tabstop>moveWithKeyboard</tabstop>
+ <tabstop>accelerationDelay</tabstop>
+ <tabstop>accelerationDelaySlider</tabstop>
+ <tabstop>repeatInterval</tabstop>
+ <tabstop>repeatInternalSlider</tabstop>
+ <tabstop>accelerationTime</tabstop>
+ <tabstop>accelerationTimeSlider</tabstop>
+ <tabstop>maximumSpeed</tabstop>
+ <tabstop>maximumSpeedSlider</tabstop>
+ <tabstop>accelerationProfile</tabstop>
+ <tabstop>accelerationProfileSlider</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">accessibilityconfigwidget.ui.h</include>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="private" specifier="non virtual">updateFlashScreenColor()</slot>
+</slots>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kcmodule.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/accessibility/accessibilityconfigwidget.ui.h b/kcontrol/accessibility/accessibilityconfigwidget.ui.h
new file mode 100644
index 000000000..38d44a502
--- /dev/null
+++ b/kcontrol/accessibility/accessibilityconfigwidget.ui.h
@@ -0,0 +1,22 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+
+void AccessibilityConfigWidget::updateFlashScreenColor(){
+ flashScreenColor->setEnabled(flashScreen->isChecked());
+}
+
+
+void AccessibilityConfigWidget::configChanged()
+{
+
+}
+
+
+
+
diff --git a/kcontrol/accessibility/configure.in.in b/kcontrol/accessibility/configure.in.in
new file mode 100644
index 000000000..c3f539bd5
--- /dev/null
+++ b/kcontrol/accessibility/configure.in.in
@@ -0,0 +1,3 @@
+ACCESSIBILITY_SUBDIR=
+KDE_CHECK_HEADER(X11/extensions/XKBstr.h, ACCESSIBILITY_SUBDIR=accessibility)
+AM_CONDITIONAL(include_kcontrol_accessibility, test -n "$ACCESSIBILITY_SUBDIR")
diff --git a/kcontrol/accessibility/kcm_accessibility.kcfg b/kcontrol/accessibility/kcm_accessibility.kcfg
new file mode 100644
index 000000000..ad9d0d450
--- /dev/null
+++ b/kcontrol/accessibility/kcm_accessibility.kcfg
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="bellrc"/>
+ <group name="General">
+ <entry name="SystemBell" type="Bool">
+ <label>If the simple PC speaker should be used</label>
+ <default>false</default>
+ </entry>
+ <entry name="CustomBell" type="Bool">
+ <label>Whether a custom sound should be used as bell</label>
+ <default>false</default>
+ </entry>
+ <entry name="Visiblebell" type="Bool">
+ <label>If the screen should blink when the bell is sounded</label>
+ <default>false</default>
+ </entry>
+ </group>
+ <group name="CustomBell">
+ <entry name="Sound" type="Path">
+ <label>The path to the custom sound, if it is used</label>
+ </entry>
+ </group>
+ <group name="Visible">
+ <entry name="Flash" type="Bool">
+ <label>If the screen should be flashed</label>
+ <default>false</default>
+ </entry>
+ <entry name="Invert" type="Bool">
+ <label>If the screen image should be inverted</label>
+ <default>true</default>
+ </entry>
+ <entry name="FlashColor" type="Color">
+ <label>The color to flash the screen with</label>
+ <default>#FF0000</default>
+ </entry>
+ <entry name="Duration" type="UInt">
+ <label>For how long the flash is active</label>
+ <default>500</default>
+ <max>3000</max>
+ </entry>
+ </group>
+ <!--
+ // keyboard
+ // sticky keys
+ stickykeys->setchecked(false);
+ lockwithstickykeys->setchecked(true);
+
+ // slow keys
+ slowkeys->setchecked(false);
+ slowkeysdelay->setvalue(500);
+
+ // bounce keys
+ bouncekeys->setchecked(false);
+ bouncekeysdelay->setvalue(500);
+
+ // mouse
+ // navigation
+ accelerationdelay->setvalue(160);
+ repeatinterval->setvalue(5);
+ accelerationtime->setvalue(1000);
+ maximumspeed->setvalue(500);
+ accelerationProfile->setValue(0);
+ -->
+</kcfg>
diff --git a/kcontrol/accessibility/settings.kcfgc b/kcontrol/accessibility/settings.kcfgc
new file mode 100644
index 000000000..b0b7a9407
--- /dev/null
+++ b/kcontrol/accessibility/settings.kcfgc
@@ -0,0 +1,5 @@
+File=kcm_accessibility.kcfg
+ClassName=Settings
+Singleton=true
+Mutators=true
+
diff --git a/kcontrol/arts/Makefile.am b/kcontrol/arts/Makefile.am
new file mode 100644
index 000000000..f4b68cfa1
--- /dev/null
+++ b/kcontrol/arts/Makefile.am
@@ -0,0 +1,15 @@
+kde_module_LTLIBRARIES = kcm_arts.la
+
+kcm_arts_la_SOURCES = arts.cpp generaltab.ui hardwaretab.ui krichtextlabel.cpp
+
+kcm_arts_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_arts_la_LIBADD = $(LIB_KIO) $(LIB_KUTILS) -lkmid
+
+AM_CPPFLAGS = -I$(kde_includes)/arts $(all_includes)
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmarts.pot
+
+xdg_apps_DATA = arts.desktop
diff --git a/kcontrol/arts/arts.cpp b/kcontrol/arts/arts.cpp
new file mode 100644
index 000000000..a8edb30a2
--- /dev/null
+++ b/kcontrol/arts/arts.cpp
@@ -0,0 +1,730 @@
+/*
+
+ Copyright (C) 2000 Stefan Westerfeld
+ stefan@space.twc.de
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ Permission is also granted to link this program with the Qt
+ library, treating Qt like a library that normally accompanies the
+ operating system kernel, whether or not that is in fact the case.
+
+*/
+
+#include <unistd.h>
+
+#include <qcombobox.h>
+#include <qdir.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+#include <qslider.h>
+#include <qtabwidget.h>
+#include <qwhatsthis.h>
+
+#include <dcopref.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kcmoduleloader.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <klineedit.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <krichtextlabel.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+#include <kurlrequester.h>
+#include <libkmid/deviceman.h>
+
+#include "arts.h"
+
+extern "C" {
+ KDE_EXPORT void init_arts();
+
+ KDE_EXPORT KCModule *create_arts(QWidget *parent, const char* /*name*/)
+ {
+ KGlobal::locale()->insertCatalogue("kcmarts");
+ return new KArtsModule(parent, "kcmarts" );
+ }
+}
+
+static bool startArts()
+{
+ KConfig *config = new KConfig("kcmartsrc", true, false);
+
+ config->setGroup("Arts");
+ bool startServer = config->readBoolEntry("StartServer",true);
+ bool startRealtime = config->readBoolEntry("StartRealtime",true);
+ QString args = config->readEntry("Arguments","-F 10 -S 4096 -s 60 -m artsmessage -c drkonqi -l 3 -f");
+
+ delete config;
+
+ if (startServer)
+ kapp->kdeinitExec(startRealtime?"artswrapper":"artsd",
+ QStringList::split(" ",args));
+ return startServer;
+}
+
+/*
+ * This function uses artsd -A to init audioIOList with the possible audioIO
+ * methods. Here is a sample output of artsd -A (note the two spaces before
+ * each "interesting" line are used in parsing:
+ *
+ * # artsd -A
+ * possible choices for the audio i/o method:
+ *
+ * toss Threaded Open Sound System
+ * esd Enlightened Sound Daemon
+ * null No audio input/output
+ * alsa Advanced Linux Sound Architecture
+ * oss Open Sound System
+ *
+ */
+void KArtsModule::initAudioIOList()
+{
+ KProcess* artsd = new KProcess();
+ *artsd << "artsd";
+ *artsd << "-A";
+
+ connect(artsd, SIGNAL(processExited(KProcess*)),
+ this, SLOT(slotArtsdExited(KProcess*)));
+ connect(artsd, SIGNAL(receivedStderr(KProcess*, char*, int)),
+ this, SLOT(slotProcessArtsdOutput(KProcess*, char*, int)));
+
+ if (!artsd->start(KProcess::Block, KProcess::Stderr)) {
+ KMessageBox::error(0, i18n("Unable to start the sound server to "
+ "retrieve possible sound I/O methods.\n"
+ "Only automatic detection will be "
+ "available."));
+ delete artsd;
+ }
+}
+
+void KArtsModule::slotArtsdExited(KProcess* proc)
+{
+ latestProcessStatus = proc->exitStatus();
+ delete proc;
+}
+
+void KArtsModule::slotProcessArtsdOutput(KProcess*, char* buf, int len)
+{
+ // XXX(gioele): I suppose this will be called with full lines, am I wrong?
+
+ QStringList availableIOs = QStringList::split("\n", QCString(buf, len));
+ // valid entries have two leading spaces
+ availableIOs = availableIOs.grep(QRegExp("^ {2}"));
+ availableIOs.sort();
+
+ QString name, fullName;
+ QStringList::Iterator it;
+ for (it = availableIOs.begin(); it != availableIOs.end(); ++it) {
+ name = (*it).left(12).stripWhiteSpace();
+ fullName = (*it).mid(12).stripWhiteSpace();
+ audioIOList.append(new AudioIOElement(name, fullName));
+ }
+}
+
+KArtsModule::KArtsModule(QWidget *parent, const char *name)
+ : KCModule(parent, name), configChanged(false)
+{
+ setButtons(Default|Apply);
+
+ setQuickHelp( i18n("<h1>Sound System</h1> Here you can configure aRts, KDE's sound server."
+ " This program not only allows you to hear your system sounds while simultaneously"
+ " listening to an MP3 file or playing a game with background music. It also allows you"
+ " to apply different effects to your system sounds and provides programmers with"
+ " an easy way to achieve sound support."));
+
+ initAudioIOList();
+
+ QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+ QTabWidget *tab = new QTabWidget(this);
+ layout->addWidget(tab);
+
+ general = new generalTab(tab);
+ hardware = new hardwareTab(tab);
+ //mixer = KCModuleLoader::loadModule("kmixcfg", tab);
+ //midi = new KMidConfig(tab, "kmidconfig");
+
+ general->layout()->setMargin( KDialog::marginHint() );
+ hardware->layout()->setMargin( KDialog::marginHint() );
+ general->latencyLabel->setFixedHeight(general->latencyLabel->fontMetrics().lineSpacing());
+
+ tab->addTab(general, i18n("&General"));
+ tab->addTab(hardware, i18n("&Hardware"));
+
+ startServer = general->startServer;
+ networkTransparent = general->networkTransparent;
+ startRealtime = general->startRealtime;
+ autoSuspend = general->autoSuspend;
+ suspendTime = general->suspendTime;
+
+ fullDuplex = hardware->fullDuplex;
+ customDevice = hardware->customDevice;
+ deviceName = hardware->deviceName;
+ customRate = hardware->customRate;
+ samplingRate = hardware->samplingRate;
+
+ QString deviceHint = i18n("Normally, the sound server defaults to using the device called <b>/dev/dsp</b> for sound output. That should work in most cases. On some systems where devfs is used, however, you may need to use <b>/dev/sound/dsp</b> instead. Other alternatives are things like <b>/dev/dsp0</b> or <b>/dev/dsp1</b>, if you have a soundcard that supports multiple outputs, or you have multiple soundcards.");
+
+ QString rateHint = i18n("Normally, the sound server defaults to using a sampling rate of 44100 Hz (CD quality), which is supported on almost any hardware. If you are using certain <b>Yamaha soundcards</b>, you might need to configure this to 48000 Hz here, if you are using <b>old SoundBlaster cards</b>, like SoundBlaster Pro, you might need to change this to 22050 Hz. All other values are possible, too, and may make sense in certain contexts (i.e. professional studio equipment).");
+
+ QString optionsHint = i18n("This configuration module is intended to cover almost every aspect of the aRts sound server that you can configure. However, there are some things which may not be available here, so you can add <b>command line options</b> here which will be passed directly to <b>artsd</b>. The command line options will override the choices made in the GUI. To see the possible choices, open a Konsole window, and type <b>artsd -h</b>.");
+
+ QWhatsThis::add(customDevice, deviceHint);
+ QWhatsThis::add(deviceName, deviceHint);
+ QWhatsThis::add(customRate, rateHint);
+ QWhatsThis::add(samplingRate, rateHint);
+ QWhatsThis::add(hardware->customOptions, optionsHint);
+ QWhatsThis::add(hardware->addOptions, optionsHint);
+
+ hardware->audioIO->insertItem( i18n( "Autodetect" ) );
+ for (AudioIOElement *a = audioIOList.first(); a != 0; a = audioIOList.next())
+ hardware->audioIO->insertItem(i18n(a->fullName.utf8()));
+
+ deviceManager = new DeviceManager();
+ deviceManager->initManager();
+
+ QString s;
+ for ( int i = 0; i < deviceManager->midiPorts()+deviceManager->synthDevices(); i++)
+ {
+ if ( strcmp( deviceManager->type( i ), "" ) != 0 )
+ s.sprintf( "%s - %s", deviceManager->name( i ), deviceManager->type( i ) );
+ else
+ s.sprintf( "%s", deviceManager->name( i ) );
+
+ hardware->midiDevice->insertItem( s, i );
+
+ };
+
+ config = new KConfig("kcmartsrc");
+ load();
+
+ suspendTime->setRange( 1, 999, 1, true );
+
+ connect(startServer,SIGNAL(clicked()),this,SLOT(slotChanged()));
+ connect(networkTransparent,SIGNAL(clicked()),this,SLOT(slotChanged()));
+ connect(startRealtime,SIGNAL(clicked()),this,SLOT(slotChanged()));
+ connect(fullDuplex,SIGNAL(clicked()),this,SLOT(slotChanged()));
+ connect(customDevice, SIGNAL(clicked()), SLOT(slotChanged()));
+ connect(deviceName, SIGNAL(textChanged(const QString&)), SLOT(slotChanged()));
+ connect(customRate, SIGNAL(clicked()), SLOT(slotChanged()));
+ connect(samplingRate, SIGNAL(valueChanged(const QString&)), SLOT(slotChanged()));
+// connect(general->volumeSystray, SIGNAL(clicked()), this, SLOT(slotChanged()) );
+
+ connect(hardware->audioIO,SIGNAL(highlighted(int)),SLOT(slotChanged()));
+ connect(hardware->audioIO,SIGNAL(activated(int)),SLOT(slotChanged()));
+ connect(hardware->customOptions,SIGNAL(clicked()),SLOT(slotChanged()));
+ connect(hardware->addOptions,SIGNAL(textChanged(const QString&)),SLOT(slotChanged()));
+ connect(hardware->soundQuality,SIGNAL(highlighted(int)),SLOT(slotChanged()));
+ connect(hardware->soundQuality,SIGNAL(activated(int)),SLOT(slotChanged()));
+ connect(general->latencySlider,SIGNAL(valueChanged(int)),SLOT(slotChanged()));
+ connect(autoSuspend,SIGNAL(clicked()),SLOT(slotChanged()));
+ connect(suspendTime,SIGNAL(valueChanged(int)),SLOT(slotChanged()));
+ connect(general->testSound,SIGNAL(clicked()),SLOT(slotTestSound()));
+ connect(hardware->midiDevice, SIGNAL( highlighted(int) ), this, SLOT( slotChanged() ) );
+ connect(hardware->midiDevice, SIGNAL( activated(int) ), this, SLOT( slotChanged() ) );
+ connect(hardware->midiUseMapper, SIGNAL( clicked() ), this, SLOT( slotChanged() ) );
+ connect(hardware->midiMapper, SIGNAL( textChanged( const QString& ) ),
+ this, SLOT( slotChanged() ) );
+
+ KAboutData *about = new KAboutData(I18N_NOOP("kcmarts"),
+ I18N_NOOP("The Sound Server Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 1999 - 2001, Stefan Westerfeld"));
+ about->addAuthor("Stefan Westerfeld",I18N_NOOP("aRts Author") , "stw@kde.org");
+ setAboutData(about);
+}
+
+void KArtsModule::load( bool useDefaults )
+{
+ config->setReadDefaults( useDefaults );
+ config->setGroup("Arts");
+ startServer->setChecked(config->readBoolEntry("StartServer",true));
+ startRealtime->setChecked(config->readBoolEntry("StartRealtime",true) &&
+ realtimeIsPossible());
+ networkTransparent->setChecked(config->readBoolEntry("NetworkTransparent",false));
+ fullDuplex->setChecked(config->readBoolEntry("FullDuplex",false));
+ autoSuspend->setChecked(config->readBoolEntry("AutoSuspend",true));
+ suspendTime->setValue(config->readNumEntry("SuspendTime",60));
+ deviceName->setText(config->readEntry("DeviceName",QString::null));
+ customDevice->setChecked(!deviceName->text().isEmpty());
+ hardware->addOptions->setText(config->readEntry("AddOptions",QString::null));
+ hardware->customOptions->setChecked(!hardware->addOptions->text().isEmpty());
+ general->latencySlider->setValue(config->readNumEntry("Latency",250));
+
+ int rate = config->readNumEntry("SamplingRate",0);
+ if(rate)
+ {
+ customRate->setChecked(true);
+ samplingRate->setValue(rate);
+ }
+ else
+ {
+ customRate->setChecked(false);
+ samplingRate->setValue(44100);
+ }
+
+ switch (config->readNumEntry("Bits", 0)) {
+ case 0:
+ hardware->soundQuality->setCurrentItem(0);
+ break;
+ case 16:
+ hardware->soundQuality->setCurrentItem(1);
+ break;
+ case 8:
+ hardware->soundQuality->setCurrentItem(2);
+ break;
+ }
+
+ QString audioIO = config->readEntry("AudioIO", QString::null);
+ hardware->audioIO->setCurrentItem(0);
+ for(AudioIOElement *a = audioIOList.first(); a != 0; a = audioIOList.next())
+ {
+ if(a->name == audioIO) // first item: "autodetect"
+ {
+ hardware->audioIO->setCurrentItem(audioIOList.at() + 1);
+ break;
+ }
+
+ }
+
+// config->setGroup( "Mixer" );
+// general->volumeSystray->setChecked( config->readBoolEntry( "VolumeControlOnSystray", true ) );
+
+ KConfig *midiConfig = new KConfig( "kcmmidirc", true );
+
+ midiConfig->setGroup( "Configuration" );
+ hardware->midiDevice->setCurrentItem( midiConfig->readNumEntry( "midiDevice", 0 ) );
+ QString mapurl( midiConfig->readPathEntry( "mapFilename" ) );
+ hardware->midiMapper->setURL( mapurl );
+ hardware->midiUseMapper->setChecked( midiConfig->readBoolEntry( "useMidiMapper", false ) );
+ hardware->midiMapper->setEnabled( hardware->midiUseMapper->isChecked() );
+
+ delete midiConfig;
+
+ updateWidgets();
+ emit changed( useDefaults );
+}
+
+KArtsModule::~KArtsModule() {
+ delete config;
+ audioIOList.setAutoDelete(true);
+ audioIOList.clear();
+}
+
+void KArtsModule::saveParams( void )
+{
+ QString audioIO;
+
+ int item = hardware->audioIO->currentItem() - 1; // first item: "default"
+
+ if (item >= 0) {
+ audioIO = audioIOList.at(item)->name;
+ }
+
+ QString dev = customDevice->isChecked() ? deviceName->text() : QString::null;
+ int rate = customRate->isChecked()?samplingRate->value() : 0;
+ QString addOptions;
+ if(hardware->customOptions->isChecked())
+ addOptions = hardware->addOptions->text();
+
+ int latency = general->latencySlider->value();
+ int bits = 0;
+
+ if (hardware->soundQuality->currentItem() == 1)
+ bits = 16;
+ else if (hardware->soundQuality->currentItem() == 2)
+ bits = 8;
+
+ config->setGroup("Arts");
+ config->writeEntry("StartServer",startServer->isChecked());
+ config->writeEntry("StartRealtime",startRealtime->isChecked());
+ config->writeEntry("NetworkTransparent",networkTransparent->isChecked());
+ config->writeEntry("FullDuplex",fullDuplex->isChecked());
+ config->writeEntry("DeviceName",dev);
+ config->writeEntry("SamplingRate",rate);
+ config->writeEntry("AudioIO",audioIO);
+ config->writeEntry("AddOptions",addOptions);
+ config->writeEntry("Latency",latency);
+ config->writeEntry("Bits",bits);
+ config->writeEntry("AutoSuspend", autoSuspend->isChecked());
+ config->writeEntry("SuspendTime", suspendTime->value());
+ calculateLatency();
+ // Save arguments string in case any other process wants to restart artsd.
+
+ config->writeEntry("Arguments",
+ createArgs(networkTransparent->isChecked(), fullDuplex->isChecked(),
+ fragmentCount, fragmentSize, dev, rate, bits,
+ audioIO, addOptions, autoSuspend->isChecked(),
+ suspendTime->value() ));
+
+// config->setGroup( "Mixer" );
+// config->writeEntry( "VolumeControlOnSystray", general->volumeSystray->isChecked() );
+
+ KConfig *midiConfig = new KConfig( "kcmmidirc", false );
+
+ midiConfig->setGroup( "Configuration" );
+ midiConfig->writeEntry( "midiDevice", hardware->midiDevice->currentItem() );
+ midiConfig->writeEntry( "useMidiMapper", hardware->midiUseMapper->isChecked() );
+ midiConfig->writePathEntry( "mapFilename", hardware->midiMapper->url() );
+
+ delete midiConfig;
+
+ KConfig *knotifyConfig = new KConfig( "knotifyrc", false );
+
+ knotifyConfig->setGroup( "StartProgress" );
+ knotifyConfig->writeEntry( "Arts Init", startServer->isChecked() );
+ knotifyConfig->writeEntry( "Use Arts", startServer->isChecked() );
+
+ delete knotifyConfig;
+
+ config->sync();
+}
+
+void KArtsModule::load()
+{
+ load( false );
+}
+
+void KArtsModule::save()
+{
+ if (configChanged) {
+ configChanged = false;
+ saveParams();
+ restartServer();
+ updateWidgets();
+ }
+ emit changed( false );
+}
+
+int KArtsModule::userSavedChanges()
+{
+ int reply;
+
+ if (!configChanged)
+ return KMessageBox::Yes;
+
+ QString question = i18n("The settings have changed since the last time "
+ "you restarted the sound server.\n"
+ "Do you want to save them?");
+ QString caption = i18n("Save Sound Server Settings?");
+ reply = KMessageBox::questionYesNo(this, question, caption,KStdGuiItem::save(),KStdGuiItem::discard());
+ if ( reply == KMessageBox::Yes)
+ {
+ configChanged = false;
+ saveParams();
+ }
+
+ return reply;
+}
+
+void KArtsModule::slotTestSound()
+{
+ if (configChanged && (userSavedChanges() == KMessageBox::Yes) || !artsdIsRunning() )
+ restartServer();
+
+ KProcess test;
+ test << "artsplay";
+ test << locate("sound", "KDE_Startup_1.ogg");
+ test.start(KProcess::DontCare);
+}
+
+void KArtsModule::defaults()
+{
+ load( true );
+}
+
+void KArtsModule::calculateLatency()
+{
+ int latencyInBytes, latencyInMs;
+
+ if(general->latencySlider->value() < 490)
+ {
+ int rate = customRate->isChecked() ? samplingRate->text().toLong() : 44100;
+
+ if (rate < 4000 || rate > 200000) {
+ rate = 44100;
+ }
+
+ int sampleSize = (hardware->soundQuality->currentItem() == 2) ? 2 : 4;
+
+ latencyInBytes = general->latencySlider->value()*rate*sampleSize/1000;
+
+ fragmentSize = 2;
+ do {
+ fragmentSize *= 2;
+ fragmentCount = latencyInBytes / fragmentSize;
+ } while (fragmentCount > 8 && fragmentSize != 4096);
+
+ latencyInMs = (fragmentSize*fragmentCount*1000) / rate / sampleSize;
+ general->latencyLabel->setText(
+ i18n("%1 milliseconds (%2 fragments with %3 bytes)")
+ .arg(latencyInMs).arg(fragmentCount).arg(fragmentSize));
+ }
+ else
+ {
+ fragmentCount = 128;
+ fragmentSize = 8192;
+ general->latencyLabel->setText(i18n("as large as possible"));
+ }
+}
+
+void KArtsModule::updateWidgets()
+{
+ bool startServerIsChecked = startServer->isChecked();
+ if (startRealtime->isChecked() && !realtimeIsPossible()) {
+ startRealtime->setChecked(false);
+ KMessageBox::error(this, i18n("Impossible to start aRts with realtime "
+ "priority because artswrapper is "
+ "missing or disabled"));
+ }
+ deviceName->setEnabled(customDevice->isChecked());
+ QString audioIO;
+ int item = hardware->audioIO->currentItem() - 1; // first item: "default"
+ if (item >= 0)
+ {
+ audioIO = audioIOList.at(item)->name;
+ bool jack = (audioIO == QString::fromLatin1("jack"));
+ if(jack)
+ {
+ customRate->setChecked(false);
+ hardware->soundQuality->setCurrentItem(0);
+ autoSuspend->setChecked(false);
+ }
+ customRate->setEnabled(!jack);
+ hardware->soundQuality->setEnabled(!jack);
+ autoSuspend->setEnabled(!jack);
+ }
+ samplingRate->setEnabled(customRate->isChecked());
+ hardware->addOptions->setEnabled(hardware->customOptions->isChecked());
+ suspendTime->setEnabled(autoSuspend->isChecked());
+ calculateLatency();
+
+ general->testSound->setEnabled(startServerIsChecked);
+
+// general->volumeSystray->setEnabled(startServerIsChecked);
+ general->networkedSoundGroupBox->setEnabled(startServerIsChecked);
+ general->realtimeGroupBox->setEnabled(startServerIsChecked);
+ general->autoSuspendGroupBox->setEnabled(startServerIsChecked);
+ hardware->setEnabled(startServerIsChecked);
+ hardware->midiMapper->setEnabled( hardware->midiUseMapper->isChecked() );
+}
+
+void KArtsModule::slotChanged()
+{
+ updateWidgets();
+ configChanged = true;
+ emit changed(true);
+}
+
+/* check if starting realtime would be possible */
+bool KArtsModule::realtimeIsPossible()
+{
+ static bool checked = false;
+ if (!checked)
+ {
+ KProcess* checkProcess = new KProcess();
+ *checkProcess << "artswrapper";
+ *checkProcess << "check";
+
+ connect(checkProcess, SIGNAL(processExited(KProcess*)),
+ this, SLOT(slotArtsdExited(KProcess*)));
+ if (!checkProcess->start(KProcess::Block))
+ {
+ delete checkProcess;
+ realtimePossible = false;
+ }
+ else if (latestProcessStatus == 0)
+ {
+ realtimePossible = true;
+ }
+ else
+ {
+ realtimePossible = false;
+ }
+
+ checked = true;
+
+ }
+ return realtimePossible;
+}
+
+void KArtsModule::restartServer()
+{
+ config->setGroup("Arts");
+ bool starting = config->readBoolEntry("StartServer", true);
+ bool restarting = artsdIsRunning();
+
+ // Shut down knotify
+ DCOPRef("knotify", "qt/knotify").send("quit");
+
+ // Shut down artsd
+ KProcess terminateArts;
+ terminateArts << "artsshell";
+ terminateArts << "terminate";
+ terminateArts.start(KProcess::Block);
+
+ if (starting)
+ {
+ // Wait for artsd to shutdown completely and then (re)start artsd again
+ KStartArtsProgressDialog dlg(this, "start_arts_progress",
+ restarting ? i18n("Restarting Sound System") : i18n("Starting Sound System"),
+ restarting ? i18n("Restarting sound system.") : i18n("Starting sound system."));
+ dlg.exec();
+ }
+
+ // Restart knotify
+ kapp->startServiceByDesktopName("knotify");
+}
+
+bool KArtsModule::artsdIsRunning()
+{
+ KProcess check;
+ check << "artsshell";
+ check << "status";
+ check.start(KProcess::Block);
+
+ return (check.exitStatus() == 0);
+}
+
+
+void init_arts()
+{
+ startArts();
+}
+
+QString KArtsModule::createArgs(bool netTrans,
+ bool duplex, int fragmentCount,
+ int fragmentSize,
+ const QString &deviceName,
+ int rate, int bits, const QString &audioIO,
+ const QString &addOptions, bool autoSuspend,
+ int suspendTime
+ )
+{
+ QString args;
+
+ if(fragmentCount)
+ args += QString::fromLatin1(" -F %1").arg(fragmentCount);
+
+ if(fragmentSize)
+ args += QString::fromLatin1(" -S %1").arg(fragmentSize);
+
+ if (!audioIO.isEmpty())
+ args += QString::fromLatin1(" -a %1").arg(audioIO);
+
+ if (duplex)
+ args += QString::fromLatin1(" -d");
+
+ if (netTrans)
+ args += QString::fromLatin1(" -n");
+
+ if (!deviceName.isEmpty())
+ args += QString::fromLatin1(" -D ") + deviceName;
+
+ if (rate)
+ args += QString::fromLatin1(" -r %1").arg(rate);
+
+ if (bits)
+ args += QString::fromLatin1(" -b %1").arg(bits);
+
+ if (autoSuspend && suspendTime)
+ args += QString::fromLatin1(" -s %1").arg(suspendTime);
+
+ if (!addOptions.isEmpty())
+ args += QChar(' ') + addOptions;
+
+ args += QString::fromLatin1(" -m artsmessage");
+ args += QString::fromLatin1(" -c drkonqi");
+ args += QString::fromLatin1(" -l 3");
+ args += QString::fromLatin1(" -f");
+
+ return args;
+}
+
+KStartArtsProgressDialog::KStartArtsProgressDialog(KArtsModule *parent, const char *name,
+ const QString &caption, const QString &text)
+ : KProgressDialog(parent, name, caption, text, true), m_module(parent), m_shutdown(false)
+{
+ connect(&m_timer, SIGNAL(timeout()), this, SLOT(slotProgress()));
+ progressBar()->setTotalSteps(20);
+ m_timeStep = 700;
+ m_timer.start(m_timeStep);
+ setAutoClose(false);
+}
+
+void
+KStartArtsProgressDialog::slotProgress()
+{
+ int p = progressBar()->progress();
+ if (p == 18)
+ {
+ progressBar()->reset();
+ progressBar()->setProgress(1);
+ m_timeStep = m_timeStep * 2;
+ m_timer.start(m_timeStep);
+ }
+ else
+ {
+ progressBar()->setProgress(p+1);
+ }
+
+ if (!m_shutdown)
+ {
+ // Wait for arts to shutdown
+ if (!m_module->artsdIsRunning())
+ {
+ // Shutdown complete, restart
+ if (!startArts())
+ slotFinished(); // Strange, it didn't start
+ else
+ m_shutdown = true;
+ }
+ }
+
+ // Shut down completed? Wait for artsd to come up again
+ if (m_shutdown && m_module->artsdIsRunning())
+ slotFinished(); // Restart complete
+}
+
+void
+KStartArtsProgressDialog::slotFinished()
+{
+ progressBar()->setProgress(20);
+ m_timer.stop();
+ QTimer::singleShot(1000, this, SLOT(close()));
+}
+
+
+#ifdef I18N_ONLY
+ //lukas: these are hacks to allow translation of the following
+ I18N_NOOP("No Audio Input/Output");
+ I18N_NOOP("Advanced Linux Sound Architecture");
+ I18N_NOOP("Open Sound System");
+ I18N_NOOP("Threaded Open Sound System");
+ I18N_NOOP("Network Audio System");
+ I18N_NOOP("Personal Audio Device");
+ I18N_NOOP("SGI dmedia Audio I/O");
+ I18N_NOOP("Sun Audio Input/Output");
+ I18N_NOOP("Portable Audio Library");
+ I18N_NOOP("Enlightened Sound Daemon");
+ I18N_NOOP("MAS Audio Input/Output");
+ I18N_NOOP("Jack Audio Connection Kit");
+#endif
+
+#include "arts.moc"
diff --git a/kcontrol/arts/arts.desktop b/kcontrol/arts/arts.desktop
new file mode 100644
index 000000000..cb7f28b61
--- /dev/null
+++ b/kcontrol/arts/arts.desktop
@@ -0,0 +1,240 @@
+[Desktop Entry]
+Exec=kcmshell arts
+Icon=arts
+Type=Application
+DocPath=kcontrol/arts/index.html
+
+
+X-KDE-Library=arts
+X-KDE-Init=arts
+X-KDE-ParentApp=kcontrol
+
+Name=Sound System
+Name[af]=Klank Stelsel
+Name[ar]=نظام الصوت
+Name[az]=Səs Sistemi
+Name[be]=Гукавая сістэма
+Name[bg]=Аудио система
+Name[bn]=সাউণ্ড সিস্টেম
+Name[br]=Reizhiad Son
+Name[bs]=Zvučni sistem
+Name[ca]=Sistema de so
+Name[cs]=Zvukový systém
+Name[csb]=Zwãkòwô systema
+Name[cy]=System Sain
+Name[da]=Lydsystem
+Name[de]=Sound-System
+Name[el]=Σύστημα ήχου
+Name[eo]=Sona Sistemo
+Name[es]=Sistema de sonido
+Name[et]=Helisüsteem
+Name[eu]=Soinu sistema
+Name[fa]=سیستم صوتی
+Name[fi]=Äänijärjestelmä
+Name[fr]=Système de sons
+Name[fy]=Lûdssysteem
+Name[ga]=Córas Fuaime
+Name[gl]=Sistema de Son
+Name[he]=מערכת צליל
+Name[hi]=ध्वनि तंत्र
+Name[hr]=Zvučni sustav
+Name[hu]=Hangszolgáltatás
+Name[id]=Sistem Suara
+Name[is]=Hljóðkerfi
+Name[it]=Sistema sonoro
+Name[ja]=サウンドシステム
+Name[ka]=ხმის სისტემა
+Name[kk]=Дыбыс жүйесі
+Name[km]=ប្រព័ន្ធ​សំឡេង
+Name[lo]=ແບບModSystem
+Name[lt]=Garso sistema
+Name[lv]=Skaņas Sistēma
+Name[mk]=Звучен систем
+Name[mn]=Дуун-Систем
+Name[ms]=Sistem Bunyi
+Name[mt]=Sistema Awdjo
+Name[nb]=Lydsystem
+Name[nds]=Klangsysteem
+Name[ne]=ध्वनि प्रणाली
+Name[nl]=Geluidssysteem
+Name[nn]=Lydsystem
+Name[nso]=System ya Modumo
+Name[pa]=ਧੁਨੀ ਸਿਸਟਮ
+Name[pl]=System dźwiękowy
+Name[pt]=Sistema de Som
+Name[pt_BR]=Sistema de Som
+Name[ro]=Sistemul de sunet
+Name[ru]=Звуковая система
+Name[rw]=Sistemu y'Ijwi
+Name[se]=Jietnavuogádat
+Name[sk]=Zvukový systém
+Name[sl]=Zvočni sistem
+Name[sr]=Звучни систем
+Name[sr@Latn]=Zvučni sistem
+Name[sv]=Ljudsystem
+Name[ta]=ஒலி சாதனம்
+Name[te]=శబ్ద వ్యవస్థ
+Name[tg]=Системаи Садо
+Name[th]=ระบบเสียง
+Name[tr]=Ses Sistemi
+Name[tt]=Tawış Sisteme
+Name[uk]=Система звуку
+Name[uz]=Tovush tizimi
+Name[uz@cyrillic]=Товуш тизими
+Name[ven]=Sisitemu ya Mubvumo
+Name[vi]=Hệ thống âm thanh
+Name[wa]=Sistinme di son
+Name[xh]=Indlela yokusebenza Yesandi
+Name[zh_CN]=声音系统
+Name[zh_TW]=聲音系統
+Name[zu]=Isistimu yomsindo
+
+Comment=Sound System Configuration
+Comment[af]=Klank Stelsel Opstelling
+Comment[ar]=إعداد نظام الصوت
+Comment[az]=Səs Sistemi Qurğuları
+Comment[be]=Настаўленні гукавай сістэмы
+Comment[bg]=Настройване на аудио системата
+Comment[bn]=সাউণ্ড সিস্টেম কনফিগারেশন
+Comment[br]=Kefluniañ reizhiad ar son
+Comment[bs]=Postavke zvučnog sistema
+Comment[ca]=Configuració del sistema de so
+Comment[cs]=Nastavení zvukového systému
+Comment[csb]=Kònfigùracëjô zwãkòwi systemë
+Comment[cy]=Ffurfweddu System Sain
+Comment[da]=Opsætning af lydsystem
+Comment[de]=Einrichtung des Sound-Systems
+Comment[el]=Ρύθμιση συστήματος ήχου
+Comment[eo]=Agordo de la sonoservo
+Comment[es]=Configuración del sistema de sonido
+Comment[et]=Helisüsteemi seadistamine
+Comment[eu]=Soinu sistemaren konfigurazioa
+Comment[fa]=پیکربندی سیستم صوتی
+Comment[fi]=Äänijärjestelmän asetukset
+Comment[fr]=Configuration du système de sons
+Comment[fy]=Lûdssysteem Ynstelle
+Comment[ga]=Cumraíocht an Chórais Fuaime
+Comment[gl]=Configuración do Sistema de Son
+Comment[he]=שינוי הגדרות מערכת הצליל
+Comment[hi]=ध्वनि तंत्र कॉन्फ़िगरेशन
+Comment[hr]=Konfiguracija zvučnog sustava
+Comment[hu]=A hangszolgáltatás beállításai
+Comment[id]=Konfigurasi Sistem Suara
+Comment[is]=Stillingar hljóðkerfis vélarinnar
+Comment[it]=Configurazione del sistema sonoro
+Comment[ja]=サウンドシステムの設定
+Comment[ka]=ხმის სისტემის კონფიგურაცია
+Comment[kk]=Дыбыс жүйесін баптау
+Comment[km]=ការ​កំណត់​រចនាសម្ព័ន្ធ​ប្រព័ន្ធ​សំឡេង
+Comment[ko]=시스템 종소리 설정
+Comment[lo]=ປັບແຕ່ງເຊີບເວີຂອງລະບົບສງງ
+Comment[lt]=Garso sistemos konfigūravimas
+Comment[lv]=Skaņas sistēmas konfigurācija
+Comment[mk]=Конфигурација на звучниот систем
+Comment[mn]=Дууны-системийн тохируулга
+Comment[ms]=Konfigurasi Sistem Bunyi
+Comment[mt]=Konfigurazzjoni tas-Sound
+Comment[nb]=Oppsett av lydsystemet
+Comment[nds]=Instellen för dat Klangsysteem
+Comment[ne]=ध्वनि प्रणाली कन्फिगरेसन
+Comment[nl]=Geluidssysteem instellen
+Comment[nn]=Oppsett av lydsystem
+Comment[nso]=Peakanyo ya System ya Modumo
+Comment[pa]=ਧੁਨੀ ਸਿਸਟਮ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja systemu dźwiękowego
+Comment[pt]=Configuração do Sistema de Som
+Comment[pt_BR]=Configuração do Sistema de Som
+Comment[ro]=Configurează sistemul de sunet
+Comment[ru]=Настройка звуковой системы
+Comment[rw]=Iboneza rya Sisitemu y'Ijwi
+Comment[se]=Jietnavuogádatheivehusat
+Comment[sk]=Nastavenie zvukového systému
+Comment[sl]=Nastavitve zvočnega sistema
+Comment[sr]=Подешавање звучног система
+Comment[sr@Latn]=Podešavanje zvučnog sistema
+Comment[sv]=Anpassa ljudsystem
+Comment[ta]=ஒலி சாதன அமைப்பு
+Comment[te]=శబ్ద వ్యవస్థ అమరిక
+Comment[tg]=Танзимоти системаи садо
+Comment[th]=ปรับแต่งระบบเสียง
+Comment[tr]=Ses Sistemi Yapılandırması
+Comment[tt]=Tawış Sistemen Caylaw
+Comment[uk]=Налаштування системи звуку
+Comment[uz]=Tovush tizimini moslash
+Comment[uz@cyrillic]=Товуш тизимини мослаш
+Comment[ven]=Nzudzanyo ya sisitemu ya mubvumo
+Comment[vi]=Cấu hình Hệ thống Âm thanh
+Comment[wa]=Apontiaedje do sistinme di son
+Comment[xh]=Uqwalaselo Lwendlela yokusebenza Yesandi
+Comment[zh_CN]=声音系统配置
+Comment[zh_TW]=聲音系統組態
+Comment[zu]=Inhlanganiselo yesistimu yomsindo
+
+Keywords=aRts,Sound Server,artsd,Audio,Sound,startup,network transparency,transparency,priority,duplex,full duplex,response time,Mixer,Volume,KMix,Mix,login,MIDI,synthesizer,music
+Keywords[az]=aRts,Sound Server,artsd,Audio,Sound,startup,network transparency,transparency,priority,duplex,full duplex,response time,Mixer,Volume,KMix,Mix,login,MIDI,synthesizer,music, şəbəkə keçirgənliyi,keçirəenlik,üstünlük,dubleks,tam dubleks,qarşılıq müddəti
+Keywords[be]=Гукавы сервер,гук,аўдыё,запуск,празрыстасць,сеткавая празрыстасць,прыярытэт,дуплекс,поўны дуплекс,час адказу,мікшэр,гучнасць,уваход,сінтэзатар,музыка,aRts,Sound Server,artsd,Audio,Sound,startup,network transparency,transparency,priority,duplex,full duplex,response time,Mixer,Volume,KMix,Mix,login,MIDI,synthesizer,music
+Keywords[bg]=аудио, звук, музика, aRts, Sound Server, artsd, Audio, Sound, startup, network transparency, transparency, priority, duplex, full duplex, response time, Mixer, Volume, KMix, Mix, login, MIDI, synthesizer, music
+Keywords[ca]=aRts,Servidor de so,artsd,Àudio,So,engegada,transparència a xarxa,transparència,prioritat,duplex,full duplex,temps de resposta,Mesclador,Volum,KMix,Mix,accés,MIDI,sintetitzador,música
+Keywords[cs]=aRts,Zvukový server,Zvuk,artsd,Audio,Spuštění,Priorita,Duplex, Plný duplex,Odezva,Směšovač,KMix,Přihlášení,MIDI,Hudba,Syntezátor,Hlasitost
+Keywords[csb]=aRts, zwãkòwi serwer,artsd,Audio,Zwãk,zrësznié,przezérnota dlô séce,przezérnota,prioritet,dupleks,fùl dupleks,czas odpòwiesce,mikser,głosnosc, KMix,Mix,logòwanié,MIDI,syntezator,mùzyka,rozpòczãce robòtë
+Keywords[cy]=aRTS,Gweinydd Sain,artsd,S?n,Sain,cychwyn,tryloywder rhwydwaith,tryloywder,blaenoriaeth,dyblyg,dyblyg llawn,amser ymateb,cymysgwr,sain,Kmix,Cymysgu,mewngofnodi,MIDI,syntheseisydd,cerdd
+Keywords[da]=aRts,Lydserver,artsd,Audio,Lyd,opstart,netværksgennemsigtighed,prioritet,duplex,fuld duplex,svartid,Mixer,Lydstyrke,KMix,Mix,login,MIDI,synthesizer,musik
+Keywords[de]=aRts,Soundserver,artsd,Audio,Klänge,Sound,Start,Netzwerktransparenz,Transparenz,Duplex,Voll-Duplex,Reaktionszeit,Priorität,Antwortzeit,Lautstärke, KMix,Mix,MIDI,Synthesizer,Musik,Anmeldung
+Keywords[el]=aRts,Εξυπηρετητής ήχου,artsd,Ήχος,Ήχος,εκκίνηση,διαφάνεια δικτύου,διαφάνεια,προτεραιότητα,duplex,full duplex,χρόνος απόκρισης,Μείκτης,Ένταση,KMix,Μίξη,σύνδεση,MIDI,συνθεσάιζερ,μουσική
+Keywords[en_GB]=aRts,Sound Server,artsd,Audio,Sound,startup,network transparency,transparency,priority,duplex,full duplex,response time,Mixer,Volume,KMix,Mix,login,MIDI,synthesiser,music
+Keywords[eo]=aRts,sonoservo,sonoj,artsd,lanĉo,reto,prioritato,dudirekta,reagtempo,Miksilo,KMix,Mix,MIDI,muziko
+Keywords[es]=aRts,Servidor de sonido,artsd,Audio,Sonido,arranque,transparencia de red,transparencia,prioridad,duplex,full duplex,tiempo de respuesta, tiempo,Mezclador,Volumen,KMix,Mix,acceso,MIDI,sintetizador,música
+Keywords[et]=aRts,heliserver,artsd,audio,heli,käivitamine,võrgu läbipaistvus,läbipaistvus,prioriteet,duplex,full duplex,reageerimise aeg,mikser,helitugevus,kmix,mix,sisselogimine,MIDI,süntesaator,muusika
+Keywords[eu]=aRts,Soinu zerbitzaria,artsd,Audio,Soinua,abioa,sare transparentzia,transparentzoa,lehentasuna,duplex,full duplex,erantzun denbora,Nahasgailua,Bolumena,KMix,Mix,sarrera,MIDI,sintetizagailua,musika
+Keywords[fa]= aRts، کارساز صوت، artsd ،صوتی، صوت، راه‌اندازی، شفافیت شبکه شفافیت، اولویت، دوسویه، تمام دوسویه، زمان پاسخ، مخلوط‌کن، حجم صدا، KMix ،Mix ،ورود ،MIDI ،ترکیب‌کننده، موسیقی
+Keywords[fi]=aRts,äänipalvelin,artsd,ääni,käynnistys,verkkoläpinäkyvyys, ,prioriteetti,duplex,full duplex,vasteaika,mikseri,äänenvoimakkuus,KMix,MIDI, syntetisaattori,musiikki
+Keywords[fr]=aRts,son,serveur de son,serveur sonore,bruit,artsd,audio,démarrage,transparence réseau,transparence,priorité,duplex,full duplex,temps de réponse,mixeur,volume,KMix,Mix,login,MIDI,synthétiseur,musique
+Keywords[fy]=aRts,Lûd tsjinner,artsd,audio,Lûd,lûdstsjinner,Begjinne,netwurk ,netwurktransparâsje,priority,prioriteit,duplex,full duplex,response tiid,responstiid,folume,KMix,kanalen,login,oanmelde,synthesizer,muzyk,mixer,midi,
+Keywords[ga]=aRts,Freastalaí Fuaime,artsd,Fuaim,tosú,trédhearcacht líonra,trédhearcacht,tosaíocht,déphléacsach,déphléacsach iomlán,aga freagartha,Meascthóir,Airde,KMix,Measc,logáil isteach,MIDI,sintéiseoir,ceol
+Keywords[gl]=aRts,Servidor de Son,artsd,Audio,Son,comezo,transparéncia de rede,transparéncia,prioridade,duplex,full duplex,tempo de resposta,Mesturador,Volume,KMix,login,MIDI,sintetizador,música
+Keywords[he]=aRts,שרת צליל,artsd,שמע,צליל,אתחול,שקיפות רשת,שקיפות,עדיפות,דו־כיווניות,דו־כיווניות מלאה,זמן תגובה,מערבל,עצמה,KMix,כניסה למערכת,MIDI,מידי,סינתסייזר,מוזיקה, aRts,Sound, Server,artsd,Audio, Sound,startup,network transparency,transparency,priority,duplex,full duplex,response time,Mixer,Volume,KMix,Mix,login,MIDI,synthesizer,music
+Keywords[hi]=ए-आरटीएस,ध्वनि सर्वर,एआरटीएसडी,ऑडियो,ध्वनि,स्टार्टअप,नेटवर्क ट्रांसपेरेंसी, ट्रांसपेरेंसी,प्राथमिकता,डुप्ले,फुल डुप्ले,प्रतिक्रिया समय,मिक्सर,आवाज़ निर्धारक,केमिक्स,मिक्स,लॉगइन,मिडी,सिंथेसाइजर,संगीत
+Keywords[hr]=aRts,Sound Server,artsd,Audio,Sound,startup,network transparency,transparency,priority,duplex,full duplex,response time,Mixer,Volume,KMix,Mix,login,MIDI,synthesizer,music,zvučni sustav,zvuk,pokretanje,mrežna transparentnost,transparentnost,priorite,vrijeme odziva,mikser,glasnoća,prijava,prijavljivanje,glazba,sintetizator
+Keywords[hu]=aRts,hangszolgáltatás,artsd,audió,hang,indulás,hálózati láthatóság,láthatóság,prioritás,duplex,full duplex,válaszidő,hangkeverő,hangerő,KMix,Mix,bejelentkezés,MIDI,szintetizátor,zene
+Keywords[is]=aRts,hljóðþjónn,hljóðmiðlari,artsd,hljóð,hljóð stillingar,ræsing,net,forgangur,tvíátta,svartími,mixer,MIDI,músík
+Keywords[it]=aRts,server sonoro,artsd,audio,suono,avvio,trasparenza di rete,trasparenza,priorità,duplex,full duplex,tempo di risposta,Mixer,Volume, KMix,login,MIDI,sintetizzatore,musica
+Keywords[ja]=aRts,サウンドサーバ,artsd,オーディオ,サウンド,スタートアップ,ネットワーク透過,透過,優先度,二重,全二重,反応時間,ミキサー,音量,KMix,Mix.ログイン,MIDI,シンセサイザー,音楽
+Keywords[ka]=aRts,ხმის სერვერი,artsd,აუდიო,ხმა,ჩატვირთვა,ქსელის გამჭირვალობა,გამჭირვალობა,პრიორიტეტი,დუპლექსი,მთლიანი დუპლექსი,გამოხმაურების დრო,მიქსერი,ხმა,KMix,Mix,ავტორიზაცია,MIDI,სინთეზატორი,მუსიკა
+Keywords[km]=aRts,ម៉ាស៊ីន​បម្រើ​សំឡេង,artsd,អូឌីយ៉ូ,សំឡេង,ចាប់ផ្ដើម,ភាព​ថ្លា​របស់​បណ្ដាញ,ភាព​ថ្លា,អាទិភាព,ទ្វេ,ទ្វេទិស,រយៈពេល​ឆ្លើយតប,ឧបករណ៍​លាយ,ទំហំ​សំឡេង,KMix,លាយ,ចូល,MIDI,synthesizer,តន្ត្រី
+Keywords[lt]=aRts,Garsų serveris,Sound Server,artsd,Audio,Sound,garsas,startup,įkrova,network transparency,tinklo skaidrumas,transparency,skaidrumas,priority,prioritetas,duplex,dupleksas,full duplex,pilnas dupleksas,response time,reakcijos laikas
+Keywords[lv]=aRts,Skaņas Serveris,artsd,Audio,Skaņa,palaišanās,tīkla caurspīdīgums,caurspīdīgums,prioritāte,duplekss,pilns duplekss,atbildes laiks,Mikseris,Skaļums,KMix,Mix,login,MIDI,sintizators,mūzika
+Keywords[mk]=aRts,Sound Server,artsd,Audio,Sound,startup,network transparency,transparency,priority,duplex,full duplex,response time,Mixer,Volume,KMix,Mix,login,MIDI,synthesizer,music,Звучен сервер,Аудио,Звук,старт,мрежна транспарентност,транспарентност,приоритет,дуплекс,цел дуплекс,време на одговор,Миксер,Гласност,најава,синтисајзер,музика
+Keywords[mn]=aRts,Дууны сервер,artsd,Дуу,Чимээ,Дуун,Эхлэл,Сүлжээ- Тунгалаг,Тунгалаг,Давхар,Бүтэн давхар,Хариулах хугацаа, Эрх,Дууны чанга, KMix,Mix,MIDI,Synthesizer,Хөгжим,Бүртгэл
+Keywords[nb]=aRts,lydtjener,artsd,lyd,audio,oppstart,nettverkstransparens,transparens,prioritet,dupleks,full dupleks,svartid,responstid,mikser,volum,lydstyrke,KMix,innlogging,synt,musikk
+Keywords[nds]=aRts,Sound Server,Klangserver,artsd,Audio,Klang,Kläng,Hoochfohren,Nettwarktransparenz,Transparenz,Prioriteet,duplex,vull duplex,Antwoorttiet,Mischer,Luutstärk,KMix,mischen,anmellen,MIDI,synthesizer,Musik,Klangteler
+Keywords[ne]=aRts, ध्वनि सर्भर, artsd, अडियो, ध्वनि, सुरुआत, सञ्जाल पारदर्शिता, पारदर्शिता, प्राथमिकता, डुप्लेक्स, पूरा डुप्लेक्स, प्रतिक्रिया समय, मिश्रक, भोल्युम, KMix, मिश्रण, लगइन, MIDI, संश्लेषक, सङ्गीत
+Keywords[nl]=aRts,sound server,artsd,audio,sound,geluidsserver,geluid,opstarten,netwerk ,netwerktransparantie,priority,prioriteit,duplex,full duplex,response time,responstijd,volume,KMix,kanalen,login,aanmelden,synthesizer,muziek,mixer,midi,
+Keywords[nn]=aRts,lydtenar,artsd,lyd,audio,oppstart,nettverkstransparens,transparens,prioritet,dupleks,full dupleks,svartid,responstid,miksar,volum,lydstyrke,KMix,innlogging,synt,musikk
+Keywords[nso]=aRts,Seabi sa Modumo,artsd,Kwagalo,Modumo,thomiso, bobontsha tsakamosola bja kgokagano,bobontsha tsaka mosola,kgethokgolo,kgatiso, kgatiso yeo e feleletsego,nako ya phetolo,Setswaki,Volume,KMix,Motswako,tsena,MIDI, mokopanyi,mmino
+Keywords[pl]=aRts,Serwer dźwiękowy,artsd,Audio,Dźwięk,uruchomienie,przeźroczystość dla sieci,przeźroczystość,priorytet,dupleks,pełny dupleks,czas odpowiedzi,mikser,głośność, KMix,Mix,logowanie,MIDI,syntezator,muzyka,rozpoczęcie pracy
+Keywords[pt]=aRts,servidor de som,artsd,áudio,som,iniciar,transparência de rede,transparência,prioridade,duplex,full duplex,tempo de resposta,mistura,volume,KMix,Misturador,MIDI,ligação,sintetizador,música
+Keywords[pt_BR]=aRts,servidor de som,artsd,áudio,som,inicialização,transparência de rede,transparência,prioridade,duplex,full-duplex,tempo de resposta,mixer,volume,KMix,Mix,login,MIDI,sintetizador,música
+Keywords[ro]=aRts,server de sunet,artsd,audio,sunet,pornire,startare,transparență de rețea,transparență,prioritate,duplex,duplex integral,timp de răspuns,mixer,volum,KMix,logare,MIDI,sintetizator,muzică
+Keywords[ru]=aRts,Sound Server,artsd,Audio,Sound,startup,network transparency,transparency,priority,duplex,full duplex,response time,Mixer,Volume,KMix,Mix,login,MIDI,synthesizer,music,звук,звуковой сервер,дуплекс,музыка
+Keywords[rw]=aRts,Seriveri y'Ijwi,artsd,Inyumvo,Ijwi,gutangira,ububonerane bw'urusobemiyoboro,ububonerane,uburenganzira,nzira-ebyiri,nzira-ebyiri zuzuye,igihe cy'igisubizo,Muvanga,Agahindurajwi,K-Kuvanga,Kuvanga,ifashayinjira,MIDI,inanga,umuziki
+Keywords[se]=aRts,jietnabálvá,artsd,audio,jietna,álggaheapmi,fierpmádatjietna,prioritehta,duplex,full duplex,vástidanáigi,mixer,sisačáliheapmi,MIDI,synthesizer,musihkka
+Keywords[sk]=aRts,Zvukový server,artsd,Zvuk,Audio,štart,sieťová transparencia,priehľadnosť,priorita,duplex,plný duplex,čas reakcie,mixér,hlasitosť,kmix,mix,prihlásenie,MIDI,syntezátor,hudba
+Keywords[sl]=aRts,zvočni strežnik,artsd,avdio,zvok,zagon,omrežna prosojnost,prosojnost,prioriteta,dupleks,duplex,full duplex,čas odgovora,Mixer,glasnost,KMix,Mix,prijava,MIDI,sintesajzer,glasba
+Keywords[sr]=aRts,Звучни сервер,artsd,Аудио,Звук,Покретање,мрежна транспарентност,транспарентност,приоритет,дуплекс,пуни-дуплекс,време одзива
+Keywords[sr@Latn]=aRts,Zvučni server,artsd,Audio,Zvuk,Pokretanje,mrežna transparentnost,transparentnost,prioritet,dupleks,puni-dupleks,vreme odziva
+Keywords[sv]=aRts,Ljudserver,artsd,Ljud,uppstart,nätverkstransparens,transparens,prioritet,duplex,full duplex,svarstid,Mixer,Volym,Kmix,Mixa,inloggning,MIDI,synthesizer,musik
+Keywords[ta]=aRts,ஒலி சேவகன்,artsd,ஒலி,கேட்பு ஒலி,துவக்கம்,வலைதள ஊடகம்,ஊடகம்,முக்கியத்துவம்,இருதிசை,முழு இருதிசை,பதில் நேரம்,கலவை,ஒலியளவு,KMix,கல,நுழை,MIDI,இணைப்பாக்கி,இசை
+Keywords[th]=aRts,Sound Server,artsd,Audio,เสียง,เริ่มต้น,network transparency,transparency,ลำดับก่อน,duplex,full duplex,เวลาในการตอบสนอง, มิกเซอร์,ระดับเสียง,KMix,Mix,ล็อกอิน,MIDI,synthesizer,ดนตรี
+Keywords[tr]=aRts,Ses Sunucu,artsd,Ses,Ses,Başlangıç,ağ geçirgenliği,geçirgenlik,öncelik,dubleks,tam dubleks,karşılık süresi,MIDI,karıştırıcı,Kmix
+Keywords[uk]=aRts,сервер звуку,artsd,аудіо,звук,запуск,прозорість мережі,прозорість,повний дуплекс,пріоритет,дуплекс,час відповіді,мікшер,гучність,KMix,MIDI,синтезатор,музика
+Keywords[uz]=aRts,Tovush serveri,artsd,Audio,Tovush,startup,tarmoq shaffofligi,shaffoflik,muhimlik darajasi,dupleks,toʻliq dupleks,javob berish vaqti,Mikser,Tovush balandligi,KMix,Mix,kirish,MIDI,sintezator,musiqa
+Keywords[uz@cyrillic]=aRts,Товуш сервери,artsd,Аудио,Товуш,startup,тармоқ шаффофлиги,шаффофлик,муҳимлик даражаси,дуплекс,тўлиқ дуплекс,жавоб бериш вақти,Миксер,Товуш баландлиги,KMix,Mix,кириш,MIDI,синтезатор,мусиқа
+Keywords[ven]=aRts,Siva ya Mubvumo,artsd,Pfala,Mubvumo,thoma,vhudavhidzano ha khagala,khagala,tshipikwa,dubulekisi,dubulekisi yo fhelelaho, tshifhinga tshau fhindula,tshitanganisi,Volomu,KMix,Tanganisa, u loga,MIDI,tshiiti,muzika
+Keywords[vi]=aRts,Trình phục vụ Âm thanh,artsd,Âm nhạc, âm thanh,khởi động,mạng trong suốt,trong suốt,ưu tiên,kép,kép hoàn toàn,phản hồi thời gian,Bộ hoà âm,Âm lượng,KMix,Trộn,đăng nhập,MIDI,Bộ tổng hợp âm nhạc,âm nhạc
+Keywords[wa]=aRts,Sound Server,sierveu d' son,artsd,Audio,son,Sound,startup,enonde tot seu,transparince rantoele, transparince,prumîristé,duplex,full duplex,complet duplex,tins d' response,Mixer,maxheu,Volume,KMix,Mix,login,MIDI,synthesizer,forveyeu,muzike
+Keywords[xh]=aRts,Umncedisi Wesandi,artsd,Evakalayo,qalisa kwakhona,umsebenzi womnatha obinisa ngaphaya, Isandi,Isandi,isiqalo,ubono ngaphaya komsebenzi womnatha,bona ngaphaya,intshukumo yokuqala,into ephindwe kabinini,into ephindwe kabini epheleleyo,ixesha lokujongana nokuthile
+Keywords[zh_CN]=aRts,Sound Server,artsd,Audio,Sound,startup,network transparency,transparency,priority,duplex,full duplex,response time,声音服务器,声音,启动,网络透明,优先级,全双工,响应时间
+Keywords[zh_TW]=aRts,Sound Server,artsd,Audio,Sound,startup,network transparency,transparency,priority,duplex,full duplex,response time,Mixer,Volume,KMix,Mix,login,MIDI,synthesizer,musica,聲音伺服器,聲音,啟動,網路透明,優先級,全雙工,響應時間,混音器,音量,登入
+Keywords[zu]=aRts,Umlekeleli Womsindo,artsd,Okuzwakalayo,Umsindo,Isiqaliso, ukubonakala koxhumano olusakazekile,Ukubonakala ngale,ukubaluleka,okunezingxemye ezimbili,okunezingxenye ezimbili eziphendulanayo,isikhathi sokuphendula, Umxubi,Izinga lomsindo,KMix,Xuba,ngena ngaphakathi,MIDI,umlungisi womsindo, umculo
+
+Categories=Qt;KDE;X-KDE-settings-sound;
diff --git a/kcontrol/arts/arts.h b/kcontrol/arts/arts.h
new file mode 100644
index 000000000..e69f5767d
--- /dev/null
+++ b/kcontrol/arts/arts.h
@@ -0,0 +1,135 @@
+ /*
+
+ Copyright (C) 2000 Stefan Westerfeld
+ stefan@space.twc.de
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ Permission is also granted to link this program with the Qt
+ library, treating Qt like a library that normally accompanies the
+ operating system kernel, whether or not that is in fact the case.
+
+ */
+
+#ifndef KARTSCONFIG_H
+#define KARTSCONFIG_H
+
+#include <kapplication.h>
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qradiobutton.h>
+#include <qtimer.h>
+
+#include <kcmodule.h>
+#include <knuminput.h>
+#include <kprogress.h>
+
+#include "generaltab.h"
+#include "hardwaretab.h"
+
+
+class KProcess;
+class DeviceManager;
+
+class KArtsModule : public KCModule
+{
+ Q_OBJECT
+
+public:
+
+ KArtsModule(QWidget *parent=0, const char *name=0);
+ ~KArtsModule();
+ void saveParams( void );
+
+ void load();
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+
+ bool artsdIsRunning();
+
+private slots:
+
+ void slotChanged();
+ void slotTestSound();
+ void slotArtsdExited(KProcess* proc);
+ void slotProcessArtsdOutput(KProcess* p, char* buf, int len);
+ //void slotStartServerChanged();
+
+private:
+
+ void updateWidgets ();
+ void calculateLatency();
+ QString createArgs(bool netTrans,bool duplex, int fragmentCount,
+ int fragmentSize,
+ const QString &deviceName,
+ int rate, int bits, const QString &audioIO,
+ const QString &addOptions, bool autoSuspend,
+ int suspendTime);
+ int userSavedChanges();
+
+ QCheckBox *startServer, *startRealtime, *networkTransparent,
+ *fullDuplex, *customDevice, *customRate, *autoSuspend;
+ QLineEdit *deviceName;
+ QSpinBox *samplingRate;
+ KIntNumInput *suspendTime;
+ generalTab *general;
+ hardwareTab *hardware;
+ KConfig *config;
+ DeviceManager *deviceManager;
+ int latestProcessStatus;
+ int fragmentCount;
+ int fragmentSize;
+ bool configChanged;
+ bool realtimePossible;
+
+ class AudioIOElement {
+ public:
+ AudioIOElement(const QString &name, const QString &fullName)
+ : name(name), fullName(fullName) {;}
+ QString name;
+ QString fullName;
+ };
+
+ void initAudioIOList();
+ QPtrList<AudioIOElement> audioIOList;
+
+ void restartServer();
+ bool realtimeIsPossible();
+};
+
+
+class KStartArtsProgressDialog : public KProgressDialog
+{
+ Q_OBJECT
+public:
+ KStartArtsProgressDialog(KArtsModule *parent, const char *name,
+ const QString &caption, const QString &text);
+public slots:
+ void slotProgress();
+ void slotFinished();
+
+private:
+ QTimer m_timer;
+ int m_timeStep;
+ KArtsModule *m_module;
+ bool m_shutdown;
+};
+
+#endif
+
diff --git a/kcontrol/arts/generaltab.ui b/kcontrol/arts/generaltab.ui
new file mode 100644
index 000000000..5b7ba7f79
--- /dev/null
+++ b/kcontrol/arts/generaltab.ui
@@ -0,0 +1,330 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>generalTab</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>generalTab</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>637</width>
+ <height>613</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>450</height>
+ </size>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>startServer</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>&amp;Enable the sound system</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is enabled, the sound system will be loaded on KDE startup.
+Recommended if you want sound.</string>
+ </property>
+ </widget>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>frame3</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>networkedSoundGroupBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Networked Sound</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KRichTextLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;i&gt;Enable this option if you want to play sound on a remote computer or you want to be able to control sound on this system from another computer.&lt;/i&gt;</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>networkTransparent</cstring>
+ </property>
+ <property name="text">
+ <string>Enable &amp;networked sound</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This option allows sound requests coming in from over the network to be accepted, instead of just limiting the server to the local computer.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>realtimeGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Skip Prevention</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KRichTextLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;i&gt;If your sound is skipping during playback, enable running with highest possible priority. Increasing your sound buffer might also help.&lt;/i&gt;</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>startRealtime</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Run with the highest possible priority (realtime priority)</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>On systems which support realtime scheduling, if you have sufficient permissions, this option will enable a very high priority for processing sound requests.</string>
+ </property>
+ </widget>
+ <widget class="QSlider" row="2" column="1">
+ <property name="name">
+ <cstring>latencySlider</cstring>
+ </property>
+ <property name="minValue">
+ <number>10</number>
+ </property>
+ <property name="maxValue">
+ <number>500</number>
+ </property>
+ <property name="value">
+ <number>150</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>NoMarks</enum>
+ </property>
+ <property name="tickInterval">
+ <number>50</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Sound &amp;buffer:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>latencySlider</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="1">
+ <property name="name">
+ <cstring>latencyLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;p align="right"&gt;&lt;b&gt;Huge&lt;/b&gt; buffer, for &lt;b&gt;low-end&lt;/b&gt; machines, &lt;b&gt;less skipping&lt;/b&gt;&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>autoSuspendGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Auto-Suspend</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KRichTextLabel">
+ <property name="name">
+ <cstring>textLabel5_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;i&gt;The KDE sound system takes exclusive control over your audio hardware, blocking programs that may wish to use it directly. If the KDE sound system sits idle it can give up this exclusive control.&lt;/i&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>autoSuspend</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Auto-suspend if idle after:</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The sound server will suspend itself if idle for this period of time.</string>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>suspendTime</cstring>
+ </property>
+ <property name="suffix">
+ <string> seconds</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer17_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>173</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3_2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>testSound</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Test &amp;Sound</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<includes>
+ <include location="local" impldecl="in implementation">krichtextlabel.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/arts/hardwaretab.ui b/kcontrol/arts/hardwaretab.ui
new file mode 100644
index 000000000..c11f19962
--- /dev/null
+++ b/kcontrol/arts/hardwaretab.ui
@@ -0,0 +1,358 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>hardwareTab</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>hardwareTab</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>372</width>
+ <height>357</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox4</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>GroupBoxPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="title">
+ <string>Select &amp;&amp; Configure your Audio Device</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout57</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Select the audio device:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>audioIO</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>audioIO</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout31</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>fullDuplex</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Full duplex</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This enables the soundserver to record and play sound at the same time. If you use applications like Internet telephony, voice recognition or similar, you probably want this.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="5" column="0">
+ <property name="name">
+ <cstring>customOptions</cstring>
+ </property>
+ <property name="text">
+ <string>Use other custom &amp;options:</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="0">
+ <property name="name">
+ <cstring>customDevice</cstring>
+ </property>
+ <property name="text">
+ <string>Override &amp;device location:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quality:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>soundQuality</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Default</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>16 Bits (high)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>8 Bits (low)</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>soundQuality</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>customRate</cstring>
+ </property>
+ <property name="text">
+ <string>Use &amp;custom sampling rate:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>samplingRate</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix">
+ <string> Hz </string>
+ </property>
+ <property name="maxValue">
+ <number>99999</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>44100</number>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLineEdit" row="5" column="1">
+ <property name="name">
+ <cstring>addOptions</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>deviceName</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>/dev/dsp</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Select your MIDI Device</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>midiUseMapper</cstring>
+ </property>
+ <property name="text">
+ <string>Use MIDI ma&amp;pper:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Select the &amp;MIDI device:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>deviceName</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>midiDevice</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="1" column="1">
+ <property name="name">
+ <cstring>midiMapper</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer17</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>60</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kcontrol/arts/krichtextlabel.cpp b/kcontrol/arts/krichtextlabel.cpp
new file mode 100644
index 000000000..7e292cde1
--- /dev/null
+++ b/kcontrol/arts/krichtextlabel.cpp
@@ -0,0 +1,115 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 2005 Waldo Bastian <bastian@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "krichtextlabel.h"
+
+#include <qtooltip.h>
+#include <qstylesheet.h>
+#include <qsimplerichtext.h>
+
+#include <kglobalsettings.h>
+
+static QString qrichtextify( const QString& text )
+{
+ if ( text.isEmpty() || text[0] == '<' )
+ return text;
+
+ QStringList lines = QStringList::split('\n', text);
+ for(QStringList::Iterator it = lines.begin(); it != lines.end(); ++it)
+ {
+ *it = QStyleSheet::convertFromPlainText( *it, QStyleSheetItem::WhiteSpaceNormal );
+ }
+
+ return lines.join(QString::null);
+}
+
+KRichTextLabel::KRichTextLabel( const QString &text , QWidget *parent, const char *name )
+ : QLabel ( parent, name ) {
+ m_defaultWidth = QMIN(500, KGlobalSettings::desktopGeometry(this).width()*3/5);
+ setAlignment( Qt::WordBreak );
+ setText(text);
+}
+
+KRichTextLabel::KRichTextLabel( QWidget *parent, const char *name )
+ : QLabel ( parent, name ) {
+ m_defaultWidth = QMIN(500, KGlobalSettings::desktopGeometry(this).width()*3/5);
+ setAlignment( Qt::WordBreak );
+}
+
+void KRichTextLabel::setDefaultWidth(int defaultWidth)
+{
+ m_defaultWidth = defaultWidth;
+ updateGeometry();
+}
+
+QSizePolicy KRichTextLabel::sizePolicy() const
+{
+ return QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum, false);
+}
+
+QSize KRichTextLabel::minimumSizeHint() const
+{
+ QString qt_text = qrichtextify( text() );
+ int pref_width = 0;
+ int pref_height = 0;
+ QSimpleRichText rt(qt_text, font());
+ pref_width = m_defaultWidth;
+ rt.setWidth(pref_width);
+ int used_width = rt.widthUsed();
+ if (used_width <= pref_width)
+ {
+ while(true)
+ {
+ int new_width = (used_width * 9) / 10;
+ rt.setWidth(new_width);
+ int new_height = rt.height();
+ if (new_height > pref_height)
+ break;
+ used_width = rt.widthUsed();
+ if (used_width > new_width)
+ break;
+ }
+ pref_width = used_width;
+ }
+ else
+ {
+ if (used_width > (pref_width *2))
+ pref_width = pref_width *2;
+ else
+ pref_width = used_width;
+ }
+
+ return QSize(pref_width, rt.height());
+}
+
+QSize KRichTextLabel::sizeHint() const
+{
+ return minimumSizeHint();
+}
+
+void KRichTextLabel::setText( const QString &text ) {
+ if (!text.startsWith("<qt>"))
+ QLabel::setText("<qt>"+text+"</qt>");
+ else
+ QLabel::setText(text);
+}
+
+void KRichTextLabel::virtual_hook( int, void* )
+{ /*BASE::virtual_hook( id, data );*/ }
+
+#include "krichtextlabel.moc"
diff --git a/kcontrol/arts/krichtextlabel.h b/kcontrol/arts/krichtextlabel.h
new file mode 100644
index 000000000..e03fe2509
--- /dev/null
+++ b/kcontrol/arts/krichtextlabel.h
@@ -0,0 +1,65 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 2005 Waldo Bastian <bastian@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KRICHTEXTLABEL_H
+#define KRICHTEXTLABEL_H
+
+#include <qlabel.h>
+
+#include <kdelibs_export.h>
+
+/**
+ * @short A replacement for QLabel that supports richtext and proper layout management
+ *
+ * @author Waldo Bastian <bastian@kde.org>
+ */
+
+/*
+ * QLabel
+ */
+class KDEUI_EXPORT KRichTextLabel : public QLabel {
+ Q_OBJECT
+
+public:
+ /**
+ * Default constructor.
+ */
+ KRichTextLabel( QWidget *parent, const char *name = 0 );
+ KRichTextLabel( const QString &text, QWidget *parent, const char *name = 0 );
+
+ int defaultWidth() const { return m_defaultWidth; }
+ void setDefaultWidth(int defaultWidth);
+
+ virtual QSize minimumSizeHint() const;
+ virtual QSize sizeHint() const;
+ QSizePolicy sizePolicy() const;
+
+public slots:
+ void setText( const QString & );
+
+protected:
+ int m_defaultWidth;
+
+protected:
+ virtual void virtual_hook( int id, void* data );
+private:
+ class KRichTextLabelPrivate;
+ KRichTextLabelPrivate *d;
+};
+
+#endif // KRICHTEXTLABEL_H
diff --git a/kcontrol/background/Makefile.am b/kcontrol/background/Makefile.am
new file mode 100644
index 000000000..e1d847ead
--- /dev/null
+++ b/kcontrol/background/Makefile.am
@@ -0,0 +1,27 @@
+SUBDIRS = . pics
+
+AM_CPPFLAGS = -I$(top_srcdir)/libkonq $(all_includes)
+
+kde_module_LTLIBRARIES = kcm_background.la
+
+kcm_background_la_SOURCES = main.cpp
+kcm_background_la_LDFLAGS = $(KDE_RPATH) -module -avoid-version $(all_libraries) -no-undefined
+kcm_background_la_LIBADD = libkcmbgnd.la libbgnd.la $(LIB_KFILE) $(LIB_KNEWSTUFF)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = main.h \
+ bgrender.h bgsettings.h \
+ bgdialog.h bgadvanced.h bgwallpaper.h bgdefaults.h bgmonitor.h
+
+noinst_LTLIBRARIES = libbgnd.la libkcmbgnd.la
+libbgnd_la_SOURCES = bgrender.cpp bgsettings.cpp
+libkcmbgnd_la_SOURCES = bgdialog.cpp bgdialog_ui.ui bgwallpaper_ui.ui \
+ bgwallpaper.cpp bgadvanced_ui.ui bgadvanced.cpp bgmonitor.cpp
+
+main.lo: bgdialog_ui.h
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmbackground.pot
+
+xdg_apps_DATA = background.desktop
diff --git a/kcontrol/background/background.desktop b/kcontrol/background/background.desktop
new file mode 100644
index 000000000..7329a2b27
--- /dev/null
+++ b/kcontrol/background/background.desktop
@@ -0,0 +1,240 @@
+[Desktop Entry]
+Exec=kcmshell background
+Icon=background
+Type=Application
+DocPath=kcontrol/background/index.html
+
+
+X-KDE-Library=background
+X-KDE-FactoryName=background
+X-KDE-ParentApp=kcontrol
+
+Name=Background
+Name[af]=Agtergrond
+Name[ar]=الخلفية
+Name[az]=Arxa plan
+Name[be]=Фон
+Name[bg]=Фон на екрана
+Name[bn]=পটভূমি
+Name[br]=Drekleur
+Name[bs]=Pozadina
+Name[ca]=Fons
+Name[cs]=Pozadí
+Name[csb]=Spòdlé
+Name[cy]=Cefndir
+Name[da]=Baggrund
+Name[de]=Hintergrund
+Name[el]=Φόντο
+Name[eo]=Fono
+Name[es]=Fondo
+Name[et]=Taust
+Name[eu]=Atzeko planoa
+Name[fa]=زمینه
+Name[fi]=Tausta
+Name[fr]=Fond d'écran
+Name[fy]=Eftergrûn
+Name[ga]=Cúlra
+Name[gl]=Fondo
+Name[he]=רקע
+Name[hi]=पृष्ठभूमि
+Name[hr]=Pozadina
+Name[hu]=Háttér
+Name[id]=Latarbelakang
+Name[is]=Bakgrunnur
+Name[it]=Sfondo
+Name[ja]=背景
+Name[ka]=ფონი
+Name[kk]=Аясы
+Name[km]=ផ្ទៃ​ខាង​ក្រោយ
+Name[lo]=ພື້ນຫລັງ
+Name[lt]=Fonas
+Name[lv]=Fons
+Name[mk]=Подлога
+Name[mn]=Дэвсгэр
+Name[ms]=Latar Belakang
+Name[nb]=Bakgrunn
+Name[nds]=Achtergrund
+Name[ne]=पृष्ठभूमि
+Name[nl]=Achtergrond
+Name[nn]=Bakgrunn
+Name[nso]=Bokamorago
+Name[oc]=Fons
+Name[pa]=ਪਿੱਠਭੂਮੀ
+Name[pl]=Tło
+Name[pt]=Fundo do Ecrã
+Name[pt_BR]=Fundo de tela
+Name[ro]=Fundal
+Name[ru]=Фон
+Name[rw]=Mburabuzi
+Name[se]=Duogáš
+Name[sk]=Pozadie
+Name[sl]=Ozadje
+Name[sr]=Позадина
+Name[sr@Latn]=Pozadina
+Name[ss]=Lingemuva
+Name[sv]=Bakgrund
+Name[ta]=பின்னணி
+Name[tg]=Пасзамина
+Name[th]=พื้นหลัง
+Name[tr]=Arkaplan
+Name[tt]=Asyaq
+Name[uk]=Тло
+Name[uz]=Orqa fon
+Name[uz@cyrillic]=Орқа фон
+Name[ven]=Zwangamurahu
+Name[vi]=Ảnh nền
+Name[wa]=Fond
+Name[xh]=Indawo yangasemva
+Name[zh_CN]=背景
+Name[zh_TW]=背景
+Name[zu]=Inkundla yangemuva
+
+Comment=Change the background settings
+Comment[af]=Verander die agtergrond instellings
+Comment[ar]=تغيير تعيينات الخلفية
+Comment[az]=Arxa plan qurğularını dəyişdirin
+Comment[be]=Змяняе настаўленні фону
+Comment[bg]=Настройване фона на работния плот
+Comment[bn]=পটভূমি সেটিংস পরিবর্তন করুন
+Comment[br]=Kemmañ kefluniadur an drekleur
+Comment[bs]=Promijenite postavke pozadine
+Comment[ca]=Canvia l'arranjament de la configuració del fons
+Comment[cs]=Změna nastavení pozadí
+Comment[csb]=Ùstôw spódkù
+Comment[cy]=Newid gosodiadau'r cefndir
+Comment[da]=Ændr baggrundsindstillinger
+Comment[de]=Hintergrundeinstellungen ändern
+Comment[el]=Αλλάξτε τις ρυθμίσεις του φόντου
+Comment[eo]=Ŝanĝu la agordon de la fono
+Comment[es]=Modificación de las preferencias del fondo
+Comment[et]=Töölaua tausta seaded
+Comment[eu]=Aldatu atzeko planoaren ezarpenak
+Comment[fa]=تغییر تنظیمات زمینه
+Comment[fi]=Muuta taustan asetuksia
+Comment[fr]=Configuration du fond d'écran
+Comment[fy]=Eftergrûnynstellings wizigje
+Comment[ga]=Athraigh socruithe an chúlra
+Comment[gl]=Cambiar as opcións do fondo
+Comment[he]=שינוי הגדרות הרקע
+Comment[hi]=पृष्ठभूमि सेटिंग बदलें
+Comment[hr]=Promjena postavki pozadine
+Comment[hu]=A háttérbeállítások megváltoztatása
+Comment[id]=Ubah pengaturan latar belakang
+Comment[is]=Stillingar bakgrunns
+Comment[it]=Cambia le impostazioni dello sfondo
+Comment[ja]=背景の設定を変更
+Comment[ka]=ფონის კონფიგურაციის შეცვლა
+Comment[kk]=Үстел аясын түрлендіру
+Comment[km]=ផ្លាស់ប្តូរការ​កំណត់​ផ្ទៃ​ខាង​ក្រោយ
+Comment[lo]=ຕັ້ງຄ່າພື້ນຫລັງ
+Comment[lt]=Keisti fono parinktis
+Comment[lv]=Mainīt fona parametrus
+Comment[mk]=Изменете ги поставувањата на подлогата
+Comment[mn]=Дэвсгэр өөрчилөх
+Comment[ms]=Ubah seting latar belakang
+Comment[mt]=Ibdel il-konfigurazzjoni tal-isfond
+Comment[nb]=Endre bakgrunnsinnstillingene
+Comment[nds]=Achtergrundinstellen ännern
+Comment[ne]=पृष्ठभूमि सेटिङ परिवर्तन गर्नुहोस्
+Comment[nl]=Achtergrondinstellingen wijzigen
+Comment[nn]=Endra bakgrunnsinnstillingane
+Comment[nso]=Fetosa dipeakanyo tsa bokamorago
+Comment[pa]=ਪਿੱਠਭੂਮੀ ਸੈਟਿੰਗ ਤਬਦੀਲ
+Comment[pl]=Ustawienia tła
+Comment[pt]=Alterar a configuração do fundo
+Comment[pt_BR]=Muda as configurações do fundo da tela
+Comment[ro]=Configurează setările fundalului
+Comment[ru]=Настройка фона рабочего стола
+Comment[rw]=Guhindura amagenamiterere ya mbuganyuma
+Comment[se]=Rievdat duogášheivehusaid
+Comment[sk]=Nastavenie pozadia
+Comment[sl]=Spremeni nastavitve ozadja
+Comment[sr]=Измена поставки позадине
+Comment[sr@Latn]=Izmena postavki pozadine
+Comment[ss]=Tjintja kuhleleka kwelingemuva
+Comment[sv]=Anpassa bakgrundsinställningar
+Comment[ta]=பின்னனி அமைப்பை மாற்று
+Comment[tg]=Таъғири танзимоти пасзамина
+Comment[th]=เปลี่ยนการตั้งค่าพื้นหลัง
+Comment[tr]=Arkaplan ayarlarını değiştirir
+Comment[tt]=Asyaq caylawın üzgärtü
+Comment[uk]=Зміна параметрів тла
+Comment[uz]=Orqa fonning moslamalarini oʻzgartirish
+Comment[uz@cyrillic]=Орқа фоннинг мосламаларини ўзгартириш
+Comment[ven]=Shandukisani mavhekanyele anga murahu
+Comment[vi]=Thay đổi thiết lập ảnh nền
+Comment[wa]=Candjî les apontiaedjes do fond del waitroûle
+Comment[xh]=Tshintsha izicwangciso zendawo yangasemva
+Comment[zh_CN]=更改背景设置
+Comment[zh_TW]=改變背景設定
+Comment[zu]=Shintsha izilungiselelo zendawo yangemuva
+
+Keywords=background,desktops,colors,colours,images,wallpapers,blending,balance,cache,multiple wallpapers,pixmap
+Keywords[az]=arxa plan,masa üstü,rənglər,rənglər,rəsmlər,divar kağızları,qarışdırma,denge,ön yaddaş,çoxlu divar kağızları,pixmap
+Keywords[be]=фон,працоўныя сталы,колеры,відарысы,малюнкі,шпалеры,баланс,кэш,некалькі шпалераў,background,desktops,colors,colours,images,wallpapers,blending,balance,cache,multiple wallpapers,pixmap
+Keywords[bg]=фон, изображение, работен, плот, работен плот, background, desktops, colors, colours, images, wallpapers, blending, balance, cache, multiple wallpapers, pixmap
+Keywords[ca]=fons,escriptoris,colors,colors,imatges,paper pintat,barreja,balanç,cau,múltiples papers pintats,mapa de píxels
+Keywords[cs]=Pozadí,Plochy,Barvy,Obrázky,Tapety,Směšování,Vyvážení,Cache,Pixmapa
+Keywords[csb]=spódk,spòdlé,pùltë,biurka,farwë,òbrôzczi,tapetë,mieszanié,pòdrãcznô pamiãc,wielorazowé tapetë,bitmapa
+Keywords[cy]=cefndir,penbwrdd,lliwiau,lliwiau,delweddau,papurau w?l,cymysgu,cydbwys,storfa,papurau w?l lluosog,picsfap
+Keywords[da]=baggrund,desktoppe,farver,billeder,tapeter,blanding,balance,cache,flere tapeter,billede
+Keywords[de]=Hintergrund,Arbeitsflächen,Desktop,Farben,Bilder,Hintergrundbilder,Überblendung,Pixmap,Cache,Zwischenspeicher
+Keywords[el]=φόντο,επιφάνειες εργασίας,χρώματα,χρώματα,εικόνες,ταπετσαρίες,εξομάλυνση,ισορροπία,λανθάνουσα μνήμη,πολλαπλές ταπετσαρίες,pixmap
+Keywords[en_GB]=background,desktops,colours,images,wallpapers,blending,balance,cache,multiple wallpapers,pixmap
+Keywords[eo]=fono,tabuloj,koloroj,bildoj,tapetoj,kolorŝanĝo,tenejo,rastrobildo
+Keywords[es]=fondo,escritorios,colores,imágenes,tapices,mezcla,equilibrio,caché,tapices múltiples,mapa de píxeles,pixmap
+Keywords[et]=taust,töölaud,töölauad,värvid,pildid,taustapildid,üleminek,tasakaal,vahemälu,pikselrastrid
+Keywords[eu]=atzeko planoa,mahaigainak,kolorea,koloreak,irudiak,hormapaperak,nahasketa, oreka,katxea,hormapaper anitz,pixel mapa
+Keywords[fa]=زمینه، رومیزیها، رنگها، رنگها، تصاویر، کاغذهای دیواری، مخلوط، توازن، نهانگاه، کاغذ دیواریهای متعدد، نگاشت بیت
+Keywords[fi]=tausta,työpöydät,värit,kuvat,taustakuvat,sekoitus,välimuisti,useat taustakuvat,kuvakartat
+Keywords[fr]=fond d'écran,fond,bureau,couleur,image,papier peint,image de fond,dégradé,cache,papiers peints multiples
+Keywords[fy]=eftergrûn,buroblêden,kleur,kleuren,ôfbyldingen,behang,ferminge, balâns,lyts ûnthâld,meardere ôfbyldingen,pixmap,grafysk
+Keywords[ga]=cúlra,deasca,dathanna,íomhánna,cúlbhrait,cumasc,cothrom,taisce,cúlbhrait iomadúla,mapa picteilíní
+Keywords[gl]=fondo,escritórios,cores,imaxes,papeis tapiz,balance,cache,múltiples papeis tapiz,mapa de píxels
+Keywords[he]=רקע,תמונות,background,desktops,colors,colours,images,wallpapers,blending,balance,cache,multiple,wallpapers,pixmapפטים,עירוב,איזון,מטמון,טפטים,מרובים,צבעים,שולחנות עבודה,
+Keywords[hi]=पृष्ठभूमि,डेस्कटॉप,रंग,अनेक रंग,छवि,वालपेपर,ब्लेंडिंग,बैलेंस,कैश,अनेक वालपेपर,पिक्समैप
+Keywords[hr]=background,desktops,colors,colours,images,wallpapers,blending,balance,cache,multiple wallpapers,pixmap,pozadina, radna površina,boje,boja,slike,slika radne površine,preklapanje,prozirnost,balans,pohrana,višestruke slike radne površine
+Keywords[hu]=háttér,asztalok,színek,képek,tapéták,színkeverés,egyensúly,gyorstár,több tapéta,pixmap
+Keywords[is]=bakgrunnur,skjáborð,litir,myndir,veggfóður,blöndun,jafnvægi,skyndiminni,mörg veggfóður,mynd,punktamynd,bitamynd
+Keywords[it]=sfondo,desktop,colori,immagini,immagini di sfondo,sfumature,bilanciamento,cache,sfondi multipli
+Keywords[ja]=背景,色,色付け,画像,壁紙,ブレンディング,バランス,キャッシュ,複数の壁紙,ピクスマップ
+Keywords[km]=ផ្ទៃ​ខាង​ក្រោយ,ផ្ទៃតុ,ពណ៌,រូបភាព,ក្រដាស​បិទ​ជញ្ជាំង,ច្របល់,តុល្យភាព,ឃ្លាំង​សម្ងាត់,ក្រដាសបិទ​ជញ្ជាំង​ច្រើន,pixmap
+Keywords[lt]=background,fonas,desktops,darbastaliai,colors,spalvos,colours,images,paveiksliukai,wallpapers,apmušalai,blending,balance,perėjimas,cache,kešas,krepšys,multiple wallpapers,pixmap,taškinė grafika
+Keywords[lv]=fons,darbvirsmas,krāsu,krāsas,attēli,tapetes,saplūstošas,balanss,kešs,daudzas tapetes,piksmapi
+Keywords[mk]=background,desktops,colors,colours,images,wallpapers,blending,balance,cache,multiple wallpapers,pixmap,подлога,позадина,површини,бои,слики,позадини,мешање,рамнотежа,кеш,повеќе подлоги,повеќе позадини
+Keywords[mn]=Дэвсгэр,Ажлын талбар,Desktop,Өнгө,Зураг,Дэвсгэр зураг,Анивчилт,Тэнцвэр,түр хадгалагч,pixmap
+Keywords[nb]=bakgrunn,skrivebord,farger,bilder,bakgrunnsbilder,flere bakgrunnsbilder
+Keywords[nds]=Achtergrund,Schriefdischen,Klören,Biller,wallpapers,blending,balance,Twischenspieker,multiple wallpapers,pixmap
+Keywords[ne]=पृष्ठभूमि,डेस्कटप,रङ,रङ,छवि, क्यास,छवि,बहुविध वालपेपर,सन्तुलन,ब्लेन्डिङ पिक्सम्याप
+Keywords[nl]=achtergrond,desktops,bureaubladen,kleur,kleuren,afbeeldingen,behang,wallpapers,gradiënt,vermenging,balans,cache,meerdere afbeeldingen,pixmap,graphics
+Keywords[nn]=bakgrunn,skrivebord,fargar,bilete,bakgrunnsbilete,overgang,balanse,fleire bakgrunnsbilete
+Keywords[nso]=bokamorago,di-desktop,mebala,mebala,ponagalo,wallpapers,blending,lekalekanya,polokelo,wallpapers tsa bontshi,pixmap
+Keywords[pa]=background,desktops,colors,colours,images,wallpapers,blending,balance,cache,multiple wallpapers,pixmap, ਵਾਲਪੇਪਰ, ਰੰਗ, ਚਿੱਤਰ, ਪਿੱਠਭੂਮੀ
+Keywords[pl]=tło,pulpity,biurka,kolory,obrazki,tapety,mieszanie,równowaga,pamięć podręczna,wielokrotne tapety,mapa bitowa
+Keywords[pt]=fundo,ecrãs,cores,imagens,papéis de parede,mistura,balanceamento,cache,múltiplos,imagem
+Keywords[pt_BR]=fundo,áreas de trabalho,cores,imagens,papel de parede,mistura,balanço,cache,múltiplos papéis de parede,pixmap
+Keywords[ro]=fundal,ecrane,culori,imagini,multiplu,amestecare,balans,cache,pixmap
+Keywords[ru]=background,desktops,colors,colours,images,wallpapers,blending,balance,cache,multiple wallpapers,pixmap,фон,изображение,обои,рабочий стол
+Keywords[rw]=Mbuganyuma,ibiro,amabara,amabara,amashusho,impapurorukuta,ivanga,iringaniza,ubwihisho,impapurorukuta zitandukanye,ikaritapigisi
+Keywords[se]=duogáš,čállinbeavddit,ivnnit,govat,duogášgovat,seaguheapmi,balánsa,máŋgá duogášgova
+Keywords[sk]=pozadie,plochy,farby,obrázky,tapety,blending,rovnováha,cache,viacnásobné tapety,pixmap
+Keywords[sl]=ozadje,namizja,barve,slike,tapete,več tapet,blending,pixmap
+Keywords[sr]=позадина,радне површине,боје,слике,позадинске слике,претапање,баланс,кеш,вишеструке позадинске слике
+Keywords[sr@Latn]=pozadina,radne površine,boje,slike,pozadinske slike,pretapanje,balans,keš,višestruke pozadinske slike
+Keywords[sv]=bakgrund,skrivbord,färger,bilder,skrivbordsunderlägg,blandning,balans,cache,flera skrivbordsunderlägg,pixmapp
+Keywords[ta]=பின்னணி,மேல்மேசை,வண்ணங்கள்,வண்ணங்கள்,சித்திரங்கள்,பின்னணி சித்திரங்கள்,கலத்தல்,மீதி,தற்காலிக,பலவகையான பின்னணி சித்திரங்கள்,பிக்ஸ்மாப்
+Keywords[tg]=background,desktops,colors,colours,images,wallpapers,blending,balance,cache,multiple wallpapers,pixmap, пасзамина
+Keywords[th]=พื้นหลัง,พื้นที่ทำงาน,สี,ชุดสี,ภาพ,ภาพพื้นหลัง,สมดุล,แคช,พื้นหลังหลายภาพ,บิตแมพ
+Keywords[tr]=artalan,masaüstü,renkler,renkler,resimler,duvar kağıtları,karıştırma,denge,ön bellek,çoklu duvar kağıtları,pixmap
+Keywords[uk]=тло,стільниці,кольори,зображення,шпалери,перехід,баланс,кеш,декілька шпалери,pixmap,стільниці
+Keywords[uz]=orqa fon,ish stollari,ranglar,rasmlar,wallpapers,blending,balance,kesh,multiple wallpapers,pixmap
+Keywords[uz@cyrillic]=орқа фон,иш столлари,ранглар,расмлар,wallpapers,блендинг,balance,кэш,multiple wallpapers,pixmap
+Keywords[ven]=murahu,desikithopo,mivhala,zwifanyiso,mabammbiri a luvhondoni,tanganisa,linganisa,cache,mabammbiri a luvhondoni manzhi,tsumbamashango ya phikisi
+Keywords[vi]=nền,màn hình nền,màu,màu sắc,ảnh,ảnh nền,trộn,cân bằng,đệm,nhiều ảnh nền,mảng ảnh
+Keywords[wa]=fond,sicribannes,coleurs,imaedjes,fond del waitroûle,maxhî,balance,muchete,sacwantes fonds d' waitroûle,pixmap
+Keywords[xh]=indawo yangasemva,desktops,imibala,imibala,imifanekiso,amaphepha odonga,uxubo,isikali,indawo efihlakeleyo yokufihla izixhobo,amaphepha odonga amaninzi,imaphu ye pix
+Keywords[zh_CN]=background,desktops,colors,colours,images,wallpapers,blending,balance,cache,multiple wallpapers,pixmap,背景,桌面,颜色,图像,墙纸,混色,平衡,缓冲,多个墙纸,位图
+Keywords[zh_TW]=background,desktops,colors,colours,images,wallpapers,blending,balance,cache,multiple wallpapers,pixmap,背景,桌面,顏色,影像,桌布,混色,平衡,緩衝,多個桌布,位圖
+Keywords[zu]=inkundla yangemuva,ama-desktop,imibala,imibala,izithombe,amaphepha ezindonga,ukuxubanisa,ukulinganisa,cache,amaphepha ezindonga eziningi,pixmap
+
+Categories=Qt;KDE;X-KDE-settings-looknfeel;
diff --git a/kcontrol/background/bgadvanced.cpp b/kcontrol/background/bgadvanced.cpp
new file mode 100644
index 000000000..3218ec470
--- /dev/null
+++ b/kcontrol/background/bgadvanced.cpp
@@ -0,0 +1,507 @@
+/* vi: ts=8 sts=4 sw=4
+
+ This file is part of the KDE project, module kcmbackground.
+
+ Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qheader.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <qspinbox.h>
+#include <qwhatsthis.h>
+
+#include <kconfig.h>
+#include <kcolorbutton.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpixmap.h>
+#include <kstandarddirs.h>
+#include <kwin.h>
+
+#include "bgrender.h"
+#include "bgadvanced.h"
+#include "bgadvanced_ui.h"
+
+#include <X11/Xlib.h>
+
+/**** BGAdvancedDialog ****/
+
+static QCString desktopConfigname()
+{
+ int desktop=0;
+ if (qt_xdisplay())
+ desktop = DefaultScreen(qt_xdisplay());
+ QCString name;
+ if (desktop == 0)
+ name = "kdesktoprc";
+ else
+ name.sprintf("kdesktop-screen-%drc", desktop);
+
+ return name;
+}
+
+
+BGAdvancedDialog::BGAdvancedDialog(KBackgroundRenderer *_r,
+ QWidget *parent,
+ bool m_multidesktop)
+ : KDialogBase(parent, "BGAdvancedDialog",
+ true, i18n("Advanced Background Settings"),
+ Ok | Cancel, Ok, true),
+ r(_r)
+{
+ dlg = new BGAdvancedBase(this);
+ setMainWidget(dlg);
+
+ dlg->m_listPrograms->header()->setStretchEnabled ( true, 1 );
+ dlg->m_listPrograms->setAllColumnsShowFocus(true);
+
+ connect(dlg->m_listPrograms, SIGNAL(clicked(QListViewItem *)),
+ SLOT(slotProgramItemClicked(QListViewItem *)));
+
+ // Load programs
+ QStringList lst = KBackgroundProgram::list();
+ QStringList::Iterator it;
+ for (it=lst.begin(); it != lst.end(); ++it)
+ addProgram(*it);
+
+ if (m_multidesktop)
+ {
+ KConfig cfg(desktopConfigname(), false, false);
+ cfg.setGroup( "General" );
+ if (!cfg.readBoolEntry( "Enabled", true ))
+ {
+ dlg->m_groupIconText->hide();
+ }
+
+ dlg->m_spinCache->setSteps(512, 1024);
+ dlg->m_spinCache->setRange(0, 40960);
+ dlg->m_spinCache->setSpecialValueText(i18n("Unlimited"));
+ dlg->m_spinCache->setSuffix(i18n(" KB"));
+
+ connect(dlg->m_buttonAdd, SIGNAL(clicked()),
+ SLOT(slotAdd()));
+ connect(dlg->m_buttonRemove, SIGNAL(clicked()),
+ SLOT(slotRemove()));
+ connect(dlg->m_buttonModify, SIGNAL(clicked()),
+ SLOT(slotModify()));
+
+ connect(dlg->m_listPrograms, SIGNAL(doubleClicked(QListViewItem *)),
+ SLOT(slotProgramItemDoubleClicked(QListViewItem *)));
+ }
+ else
+ {
+ dlg->m_buttonAdd->hide();
+ dlg->m_buttonRemove->hide();
+ dlg->m_buttonModify->hide();
+ dlg->m_groupIconText->hide();
+ dlg->m_groupCache->hide();
+ }
+
+ connect( dlg->m_cbProgram, SIGNAL(toggled(bool)),
+ SLOT(slotEnableProgram(bool)));
+
+ m_backgroundMode = m_oldBackgroundMode = r->backgroundMode();
+ if (m_oldBackgroundMode == KBackgroundSettings::Program)
+ m_oldBackgroundMode = KBackgroundSettings::Flat;
+
+ dlg->adjustSize();
+ updateUI();
+}
+
+void BGAdvancedDialog::makeReadOnly()
+{
+ dlg->m_cbProgram->setEnabled(false);
+ dlg->m_listPrograms->setEnabled(false);
+}
+
+void BGAdvancedDialog::setCacheSize(int s)
+{
+ dlg->m_spinCache->setValue(s);
+}
+
+int BGAdvancedDialog::cacheSize()
+{
+ return dlg->m_spinCache->value();
+}
+
+QColor BGAdvancedDialog::textColor()
+{
+ return dlg->m_colorText->color();
+}
+
+void BGAdvancedDialog::setTextColor(const QColor &color)
+{
+ dlg->m_colorText->setColor(color);
+}
+
+QColor BGAdvancedDialog::textBackgroundColor()
+{
+ return dlg->m_cbSolidTextBackground->isChecked() ?
+ dlg->m_colorTextBackground->color() : QColor();
+}
+
+void BGAdvancedDialog::setTextBackgroundColor(const QColor &color)
+{
+ dlg->m_colorTextBackground->blockSignals(true);
+ dlg->m_cbSolidTextBackground->blockSignals(true);
+ if (color.isValid())
+ {
+ dlg->m_cbSolidTextBackground->setChecked(true);
+ dlg->m_colorTextBackground->setColor(color);
+ dlg->m_colorTextBackground->setEnabled(true);
+ }
+ else
+ {
+ dlg->m_cbSolidTextBackground->setChecked(false);
+ dlg->m_colorTextBackground->setColor(Qt::white);
+ dlg->m_colorTextBackground->setEnabled(false);
+ }
+ dlg->m_colorTextBackground->blockSignals(false);
+ dlg->m_cbSolidTextBackground->blockSignals(false);
+}
+
+bool BGAdvancedDialog::shadowEnabled()
+{
+ return dlg->m_cbShadow->isChecked();
+}
+
+void BGAdvancedDialog::setShadowEnabled(bool enabled)
+{
+ dlg->m_cbShadow->setChecked(enabled);
+}
+
+void BGAdvancedDialog::setTextLines(int lines)
+{
+ dlg->m_spinTextLines->setValue(lines);
+}
+
+int BGAdvancedDialog::textLines() const
+{
+ return dlg->m_spinTextLines->value();
+}
+
+void BGAdvancedDialog::setTextWidth(int width)
+{
+ dlg->m_spinTextWidth->setValue(width);
+}
+
+int BGAdvancedDialog::textWidth() const
+{
+ return dlg->m_spinTextWidth->value();
+}
+
+void BGAdvancedDialog::updateUI()
+{
+ QString prog = r->KBackgroundProgram::name();
+
+ dlg->m_cbProgram->blockSignals(true);
+ if ((r->backgroundMode() == KBackgroundSettings::Program)
+ && !prog.isEmpty())
+ {
+ dlg->m_cbProgram->setChecked(true);
+ dlg->m_listPrograms->setEnabled(true);
+ dlg->m_buttonAdd->setEnabled(true);
+ dlg->m_buttonRemove->setEnabled(true);
+ dlg->m_buttonModify->setEnabled(true);
+ selectProgram(prog);
+ }
+ else
+ {
+ dlg->m_cbProgram->setChecked(false);
+ dlg->m_listPrograms->setEnabled(false);
+ dlg->m_buttonAdd->setEnabled(false);
+ dlg->m_buttonRemove->setEnabled(false);
+ dlg->m_buttonModify->setEnabled(false);
+ }
+ dlg->m_cbProgram->blockSignals(false);
+}
+
+void BGAdvancedDialog::removeProgram(const QString &name)
+{
+ if (m_programItems.find(name))
+ {
+ delete m_programItems[name];
+ m_programItems.remove(name);
+ }
+}
+
+void BGAdvancedDialog::addProgram(const QString &name)
+{
+ removeProgram(name);
+
+ KBackgroundProgram prog(name);
+ if (prog.command().isEmpty() || (prog.isGlobal() && !prog.isAvailable()))
+ return;
+
+ QListViewItem *item = new QListViewItem(dlg->m_listPrograms);
+ item->setText(0, prog.name());
+ item->setText(1, prog.comment());
+ item->setText(2, i18n("%1 min.").arg(prog.refresh()));
+
+ m_programItems.insert(name, item);
+}
+
+void BGAdvancedDialog::selectProgram(const QString &name)
+{
+ if (m_programItems.find(name))
+ {
+ QListViewItem *item = m_programItems[name];
+ dlg->m_listPrograms->ensureItemVisible(item);
+ dlg->m_listPrograms->setSelected(item, true);
+ m_selectedProgram = name;
+ }
+}
+
+void BGAdvancedDialog::slotAdd()
+{
+ KProgramEditDialog dlg;
+ dlg.exec();
+ if (dlg.result() == QDialog::Accepted)
+ {
+ QString program = dlg.program();
+ addProgram(program);
+ selectProgram(program);
+ }
+}
+
+void BGAdvancedDialog::slotRemove()
+{
+ if (m_selectedProgram.isEmpty())
+ return;
+
+ KBackgroundProgram prog(m_selectedProgram);
+ if (prog.isGlobal())
+ {
+ KMessageBox::sorry(this,
+ i18n("Unable to remove the program: the program is global "
+ "and can only be removed by the system administrator."),
+ i18n("Cannot Remove Program"));
+ return;
+ }
+ if (KMessageBox::warningContinueCancel(this,
+ i18n("Are you sure you want to remove the program `%1'?")
+ .arg(prog.name()),
+ i18n("Remove Background Program"),
+ i18n("&Remove")) != KMessageBox::Continue)
+ return;
+
+ prog.remove();
+ removeProgram(m_selectedProgram);
+ m_selectedProgram = QString::null;
+}
+
+/*
+ * Modify a program.
+ */
+void BGAdvancedDialog::slotModify()
+{
+ if (m_selectedProgram.isEmpty())
+ return;
+
+ KProgramEditDialog dlg(m_selectedProgram);
+ dlg.exec();
+ if (dlg.result() == QDialog::Accepted)
+ {
+ QString program = dlg.program();
+ if (program != m_selectedProgram)
+ {
+ KBackgroundProgram prog(m_selectedProgram);
+ prog.remove();
+ removeProgram(m_selectedProgram);
+ }
+ addProgram(dlg.program());
+ selectProgram(dlg.program());
+ }
+}
+
+void BGAdvancedDialog::slotProgramItemClicked(QListViewItem *item)
+{
+ if (item)
+ m_selectedProgram = item->text(0);
+ slotProgramChanged();
+}
+
+void BGAdvancedDialog::slotProgramItemDoubleClicked(QListViewItem *item)
+{
+ slotProgramItemClicked(item);
+ slotModify();
+}
+
+void BGAdvancedDialog::slotProgramChanged()
+{
+ if (dlg->m_cbProgram->isChecked() && !m_selectedProgram.isEmpty())
+ m_backgroundMode = KBackgroundSettings::Program;
+ else
+ m_backgroundMode = m_oldBackgroundMode;
+}
+
+void BGAdvancedDialog::slotEnableProgram(bool b)
+{
+ dlg->m_listPrograms->setEnabled(b);
+ if (b)
+ {
+ dlg->m_listPrograms->blockSignals(true);
+ QListViewItem *cur = dlg->m_listPrograms->currentItem();
+ dlg->m_listPrograms->setSelected(cur, true);
+ dlg->m_listPrograms->ensureItemVisible(cur);
+ dlg->m_listPrograms->blockSignals(false);
+ slotProgramItemClicked(cur);
+ }
+ else
+ {
+ slotProgramChanged();
+ }
+}
+
+QString BGAdvancedDialog::backgroundProgram() const
+{
+ return m_selectedProgram;
+}
+
+int BGAdvancedDialog::backgroundMode() const
+{
+ return m_backgroundMode;
+}
+
+/**** KProgramEditDialog ****/
+
+KProgramEditDialog::KProgramEditDialog(const QString &program, QWidget *parent, char *name)
+ : KDialogBase(parent, name, true, i18n("Configure Background Program"),
+ Ok | Cancel, Ok, true)
+{
+ QFrame *frame = makeMainWidget();
+
+ QGridLayout *grid = new QGridLayout(frame, 6, 2, 0, spacingHint());
+ grid->addColSpacing(1, 300);
+
+ QLabel *lbl = new QLabel(i18n("&Name:"), frame);
+ grid->addWidget(lbl, 0, 0);
+ m_NameEdit = new QLineEdit(frame);
+ lbl->setBuddy(m_NameEdit);
+ grid->addWidget(m_NameEdit, 0, 1);
+
+ lbl = new QLabel(i18n("Co&mment:"), frame);
+ grid->addWidget(lbl, 1, 0);
+ m_CommentEdit = new QLineEdit(frame);
+ lbl->setBuddy(m_CommentEdit);
+ grid->addWidget(m_CommentEdit, 1, 1);
+
+ lbl = new QLabel(i18n("Comman&d:"), frame);
+ grid->addWidget(lbl, 2, 0);
+ m_CommandEdit = new QLineEdit(frame);
+ lbl->setBuddy(m_CommandEdit);
+ grid->addWidget(m_CommandEdit, 2, 1);
+
+ lbl = new QLabel(i18n("&Preview cmd:"), frame);
+ grid->addWidget(lbl, 3, 0);
+ m_PreviewEdit = new QLineEdit(frame);
+ lbl->setBuddy(m_PreviewEdit);
+ grid->addWidget(m_PreviewEdit, 3, 1);
+
+ lbl = new QLabel(i18n("&Executable:"), frame);
+ grid->addWidget(lbl, 4, 0);
+ m_ExecEdit = new QLineEdit(frame);
+ lbl->setBuddy(m_ExecEdit);
+ grid->addWidget(m_ExecEdit, 4, 1);
+
+ lbl = new QLabel(i18n("&Refresh time:"), frame);
+ grid->addWidget(lbl, 5, 0);
+ m_RefreshEdit = new QSpinBox(frame);
+ m_RefreshEdit->setRange(5, 60);
+ m_RefreshEdit->setSteps(5, 10);
+ m_RefreshEdit->setSuffix(i18n(" min"));
+ m_RefreshEdit->setFixedSize(m_RefreshEdit->sizeHint());
+ lbl->setBuddy(m_RefreshEdit);
+ grid->addWidget(m_RefreshEdit, 5, 1, AlignLeft);
+
+ m_Program = program;
+ if (m_Program.isEmpty()) {
+ KBackgroundProgram prog(i18n("New Command"));
+ int i = 1;
+ while (!prog.command().isEmpty())
+ prog.load(i18n("New Command <%1>").arg(i++));
+ m_NameEdit->setText(prog.name());
+ m_NameEdit->setSelection(0, 100);
+ m_RefreshEdit->setValue(15);
+ return;
+ }
+
+ // Fill in the fields
+ m_NameEdit->setText(m_Program);
+ KBackgroundProgram prog(m_Program);
+ m_CommentEdit->setText(prog.comment());
+ m_ExecEdit->setText(prog.executable());
+ m_CommandEdit->setText(prog.command());
+ m_PreviewEdit->setText(prog.previewCommand());
+ m_RefreshEdit->setValue(prog.refresh());
+}
+
+
+QString KProgramEditDialog::program()const
+{
+ return m_NameEdit->text();
+}
+
+void KProgramEditDialog::slotOk()
+{
+ QString s = m_NameEdit->text();
+ if (s.isEmpty()) {
+ KMessageBox::sorry(this, i18n("You did not fill in the `Name' field.\n"
+ "This is a required field."));
+ return;
+ }
+
+ KBackgroundProgram prog(s);
+ if ((s != m_Program) && !prog.command().isEmpty()) {
+ int ret = KMessageBox::warningContinueCancel(this,
+ i18n("There is already a program with the name `%1'.\n"
+ "Do you want to overwrite it?").arg(s),QString::null,i18n("Overwrite"));
+ if (ret != KMessageBox::Continue)
+ return;
+ }
+
+ if (m_ExecEdit->text().isEmpty()) {
+ KMessageBox::sorry(this, i18n("You did not fill in the `Executable' field.\n"
+ "This is a required field."));
+ return;
+ }
+ if (m_CommandEdit->text().isEmpty()) {
+ KMessageBox::sorry(this, i18n("You did not fill in the `Command' field.\n"
+ "This is a required field."));
+ return;
+ }
+
+ prog.setComment(m_CommentEdit->text());
+ prog.setExecutable(m_ExecEdit->text());
+ prog.setCommand(m_CommandEdit->text());
+ prog.setPreviewCommand(m_PreviewEdit->text());
+ prog.setRefresh(m_RefreshEdit->value());
+
+ prog.writeSettings();
+ accept();
+}
+
+
+#include "bgadvanced.moc"
diff --git a/kcontrol/background/bgadvanced.h b/kcontrol/background/bgadvanced.h
new file mode 100644
index 000000000..6ede665a1
--- /dev/null
+++ b/kcontrol/background/bgadvanced.h
@@ -0,0 +1,121 @@
+/* vi: ts=8 sts=4 sw=4
+
+ This file is part of the KDE project, module kcmbackground.
+
+ Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#ifndef BGADVANCED_H
+#define BGADVANCED_H
+
+#include <qdict.h>
+#include <qlistview.h>
+#include <qstringlist.h>
+
+#include <kdialogbase.h>
+
+class QLineEdit;
+class QSpinBox;
+
+class BGAdvancedBase;
+class KBackgroundRenderer;
+class KBackgroundProgram;
+
+class BGAdvancedDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ BGAdvancedDialog(KBackgroundRenderer *_r, QWidget *parent, bool m_multidesktop);
+
+ void setCacheSize(int s);
+ int cacheSize();
+ QColor textColor();
+ void setTextColor(const QColor &color);
+ QColor textBackgroundColor();
+ void setTextBackgroundColor(const QColor &color);
+ bool shadowEnabled();
+ void setShadowEnabled(bool enabled);
+ void setTextLines(int lines);
+ int textLines() const;
+ void setTextWidth(int width);
+ int textWidth() const;
+
+ void updateUI();
+
+ void makeReadOnly();
+
+ QString backgroundProgram() const;
+ int backgroundMode() const;
+
+public slots:
+ void slotAdd();
+ void slotRemove();
+ void slotModify();
+
+protected:
+ void addProgram(const QString &name);
+ void removeProgram(const QString &name);
+ void selectProgram(const QString &name);
+
+protected slots:
+ void slotProgramItemClicked(QListViewItem *item);
+ void slotProgramItemDoubleClicked(QListViewItem *item);
+ void slotProgramChanged();
+ void slotEnableProgram(bool b);
+
+private:
+ KBackgroundRenderer *r;
+
+ BGAdvancedBase *dlg;
+
+ QWidget *m_pMonitor;
+ QDict<QListViewItem> m_programItems;
+ QString m_selectedProgram;
+ int m_oldBackgroundMode;
+ int m_backgroundMode;
+};
+
+/**
+ * Dialog to edit a background program.
+ */
+class KProgramEditDialog: public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ KProgramEditDialog(const QString &program=QString::null, QWidget *parent=0L,
+ char *name=0L);
+
+ /** The program name is here in case the user changed it */
+ QString program()const;
+
+public slots:
+ void slotOk();
+
+private:
+ QString m_Program;
+ QLineEdit *m_NameEdit, *m_CommentEdit;
+ QLineEdit *m_ExecEdit, *m_CommandEdit;
+ QLineEdit *m_PreviewEdit;
+ QSpinBox *m_RefreshEdit;
+ KBackgroundProgram *m_Prog;
+};
+
+
+#endif
+
diff --git a/kcontrol/background/bgadvanced_ui.ui b/kcontrol/background/bgadvanced_ui.ui
new file mode 100644
index 000000000..6aa3d436a
--- /dev/null
+++ b/kcontrol/background/bgadvanced_ui.ui
@@ -0,0 +1,462 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>BGAdvancedBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>BGAdvancedBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>511</width>
+ <height>454</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>m_groupProgram</cstring>
+ </property>
+ <property name="title">
+ <string>Background Program</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>m_buttonAdd</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Add...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+&lt;p&gt;Click here if you want to add a program to the listbox. This button opens a dialog where you are asked to give details about the program you want to run. To successfully add a program, you must know if it is compatible, the name of the executable file and, if necessary, its options.&lt;/p&gt;
+&lt;p&gt;You usually can get the available options to a suitable program by typing in a terminal emulator the name of the executable file plus --help (foobar --help).&lt;/p&gt;
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>m_buttonRemove</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to remove programs from this list. Please note that it does not remove the program from your system, it only removes it from the available options in the background drawing programs list.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>m_buttonModify</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Modify...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+&lt;p&gt;Click here to modify the programs options. You usually can get the available options to a suitable program by typing in a terminal emulator the name of the executable file plus --help. (example: kwebdesktop --help).&lt;/p&gt;
+&lt;p&gt;One useful example is the program kwebdesktop. It draws a web page on the background of your desktop. You can use this program by selecting it on the listbox on the right, but it will draw a predefined web page. To change the web page it renders, select the kwebdesktop program on the listbox, then click here. A dialog will appear, allowing you to change the web page by replacing the old address (URL) with a new one.&lt;/p&gt;
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>spacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QListView" row="1" column="0" rowspan="4" colspan="1">
+ <column>
+ <property name="text">
+ <string>Program</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Comment</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Refresh</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_listPrograms</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>400</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+&lt;p&gt;Select from this listbox the program you want to use to draw your desktop background.&lt;/p&gt;
+&lt;p&gt;The &lt;b&gt;Program&lt;/b&gt; column shows the name of the program.&lt;br&gt;
+The &lt;b&gt;Comment&lt;/b&gt; column brings a short description.&lt;br&gt;
+The &lt;b&gt;Refresh&lt;/b&gt; column indicates the time interval between redraws of the desktop.&lt;/p&gt;
+&lt;p&gt;The &lt;b&gt;K Web Desktop&lt;/b&gt; program (kwebdesktop) is worth noting: it draws a specified page of the web in your desktop. You can modify it, and the webpage it draws by selecting it here, then clicking on the &lt;b&gt;Modify&lt;/b&gt; button.&lt;br&gt;
+You can also add new compliant programs. To do that, click on the &lt;b&gt;Add&lt;/b&gt; button.&lt;br&gt;
+You can also remove programs from this list clicking on the &lt;b&gt;Remove&lt;/b&gt; button. Please note that it does not remove the program from your system, it only removes it from the available options in this listbox.&lt;/p&gt;
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_cbProgram</cstring>
+ </property>
+ <property name="text">
+ <string>Use the following program for drawing the background:</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check here if you want to allow a program to draw your desktop background. Below you can find the list of programs currently available for drawing the background. You may use one of the available programs, add new ones or modify the existing ones to fit your needs.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>m_groupIconText</cstring>
+ </property>
+ <property name="title">
+ <string>Background Icon Text</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KColorButton" row="0" column="1">
+ <property name="name">
+ <cstring>m_colorText</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to change the color of the desktop font.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Text color:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_colorText</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to change the color of the desktop font.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="2" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>220</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KColorButton" row="1" column="1">
+ <property name="name">
+ <cstring>m_colorTextBackground</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to select the solid background color. Choose a different color from the background text color to assure readability.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>m_cbSolidTextBackground</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use solid color behind text:</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check here if you want to use a solid background color. This is useful to ensure that the desktop text will be identifiable against all background colors and wallpapers, or in other words, that a background or wallpaper will not make a desktop text of a similar color difficult to read.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>m_cbShadow</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Enable shadow</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check here to enable a shadow outline around the desktop font. This also improves the readability of the desktop text against backgrounds of a similar color.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel6_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Lines for icon text:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_colorText</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose here the maximum number of text lines below an icon on the desktop. Longer text will be truncated at the end of the last line.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="3" column="1">
+ <property name="name">
+ <cstring>m_spinTextLines</cstring>
+ </property>
+ <property name="suffix">
+ <string></string>
+ </property>
+ <property name="value">
+ <number>0</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose here the maximum number of text lines below an icon on the desktop. Longer text will be truncated at the end of the last line.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="4" column="1">
+ <property name="name">
+ <cstring>m_spinTextWidth</cstring>
+ </property>
+ <property name="suffix">
+ <string></string>
+ </property>
+ <property name="specialValueText">
+ <string>Auto</string>
+ </property>
+ <property name="maxValue">
+ <number>99999</number>
+ </property>
+ <property name="value">
+ <number>0</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose here the maximum width of text lines (in pixel) below an icon on the desktop. If set to 'Auto' a default width based on the current font is used.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel6_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Width for icon text:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_colorText</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose here the maximum width of text lines (in pixel) below an icon on the desktop. If set to 'Auto' a default width based on the current font is used.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>m_groupCache</cstring>
+ </property>
+ <property name="title">
+ <string>Memory Usage</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_lblCache</cstring>
+ </property>
+ <property name="text">
+ <string>Size of background cache:</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>In this box you can enter how much memory KDE should use for caching the background(s). If you have different backgrounds for the different desktops caching can make switching desktops smoother at the expense of higher memory use.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>m_spinCache</cstring>
+ </property>
+ <property name="suffix">
+ <string> k</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>In this box you can enter how much memory KDE should use for caching the background(s). If you have different backgrounds for the different desktops caching can make switching desktops smoother at the expense of higher memory use.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>m_cbProgram</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_buttonAdd</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_cbProgram</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_buttonRemove</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_cbProgram</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_buttonModify</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_cbProgram</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_listPrograms</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_cbSolidTextBackground</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_colorTextBackground</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>m_cbProgram</tabstop>
+ <tabstop>m_listPrograms</tabstop>
+ <tabstop>m_buttonAdd</tabstop>
+ <tabstop>m_buttonRemove</tabstop>
+ <tabstop>m_buttonModify</tabstop>
+ <tabstop>m_colorText</tabstop>
+ <tabstop>m_cbSolidTextBackground</tabstop>
+ <tabstop>m_colorTextBackground</tabstop>
+ <tabstop>m_cbShadow</tabstop>
+ <tabstop>m_spinCache</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/background/bgdefaults.h b/kcontrol/background/bgdefaults.h
new file mode 100644
index 000000000..99846f0b0
--- /dev/null
+++ b/kcontrol/background/bgdefaults.h
@@ -0,0 +1,38 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * This file is part of the KDE project, module kdesktop.
+ * Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ *
+ * You can Freely distribute this program under the GNU General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ */
+#ifndef __BGDefaults_h_Included__
+#define __BGDefaults_h_Included__
+
+
+// Globals
+#define _defDrawBackgroundPerScreen false
+#define _defCommonScreen true
+#define _defCommonDesk true
+#define _defDock true
+#define _defExport false
+#define _defLimitCache false
+#define _defCacheSize 2048
+
+#define _defShm false
+// there are usually poor results with bpp<16 when tiling
+#define _defMinOptimizationDepth 1
+
+// Per desktop defaults
+// Before you change this get in touch with me (torsten@kde.org)
+// Thanks!!
+#define _defColorA QColor("#003082")
+#define _defColorB QColor("#C0C0C0")
+#define _defBackgroundMode KBackgroundSettings::Flat
+#define _defWallpaperMode KBackgroundSettings::NoWallpaper
+#define _defMultiMode KBackgroundSettings::NoMulti
+#define _defBlendMode KBackgroundSettings::NoBlending
+#define _defBlendBalance 100
+#define _defReverseBlending false
+
+#endif // __BGDefaults_h_Included__
diff --git a/kcontrol/background/bgdialog.cpp b/kcontrol/background/bgdialog.cpp
new file mode 100644
index 000000000..398e30d56
--- /dev/null
+++ b/kcontrol/background/bgdialog.cpp
@@ -0,0 +1,1279 @@
+/*
+ kate: space-indent on; indent-width 3; indent-mode cstyle;
+
+ This file is part of the KDE libraries
+
+ Copyright (c) 2005 David Saxton <david@bluehaze.org>
+ Copyright (c) 2003 Waldo Bastian <bastian@kde.org>
+ Copyright (c) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ Copyright (c) 1996 Martin R. Jones
+ Copyright (c) 1997 Matthias Hoelzer
+ Copyright (c) 1997 Mark Donohoe
+ Copyright (c) 1998 Stephan Kulow
+ Copyright (c) 1998 Matej Koss
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <config.h>
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qpainter.h>
+#include <qradiobutton.h>
+#include <qslider.h>
+#include <qtimer.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qapplication.h>
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kfiledialog.h>
+#include <kfilemetainfo.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kimageio.h>
+#include <klocale.h>
+#include <kpixmap.h>
+#include <kstandarddirs.h>
+#include <kstringhandler.h>
+#include <kurlrequester.h>
+#include <kwin.h>
+#include <kimagefilepreview.h>
+#include <knewstuff/downloaddialog.h>
+
+#include <stdlib.h>
+
+#include "bgmonitor.h"
+#include "bgwallpaper.h"
+#include "bgadvanced.h"
+#include "bgdialog.h"
+
+#define NR_PREDEF_PATTERNS 6
+
+BGDialog::BGDialog(QWidget* parent, KConfig* _config, bool _multidesktop)
+ : BGDialog_UI(parent, "BGDialog")
+{
+ m_pGlobals = new KGlobalBackgroundSettings(_config);
+ m_pDirs = KGlobal::dirs();
+ m_multidesktop = _multidesktop;
+ m_previewUpdates = true;
+
+ m_numDesks = m_multidesktop ? KWin::numberOfDesktops() : 1;
+ m_numScreens = QApplication::desktop()->numScreens();
+
+ QCString multiHead = getenv("KDE_MULTIHEAD");
+ if (multiHead.lower() == "true")
+ {
+ m_numScreens = 1;
+ }
+
+ m_desk = m_multidesktop ? KWin::currentDesktop() : 1;
+ m_screen = QApplication::desktop()->screenNumber(this);
+ if (m_screen >= (int)m_numScreens)
+ m_screen = m_numScreens-1;
+
+ m_eDesk = m_pGlobals->commonDeskBackground() ? 0 : m_desk;
+ getEScreen();
+ m_copyAllDesktops = true;
+ m_copyAllScreens = true;
+
+ if (!m_multidesktop)
+ {
+ m_pDesktopLabel->hide();
+ m_comboDesktop->hide();
+ }
+
+ if (m_numScreens < 2)
+ {
+ m_comboScreen->hide();
+ m_buttonIdentifyScreens->hide();
+ m_screen = 0;
+ m_eScreen = 0;
+ }
+
+ connect(m_buttonIdentifyScreens, SIGNAL(clicked()), SLOT(slotIdentifyScreens()));
+
+ // preview monitor
+ m_pMonitorArrangement = new BGMonitorArrangement(m_screenArrangement, "monitor arrangement");
+ connect(m_pMonitorArrangement, SIGNAL(imageDropped(const QString &)), SLOT(slotImageDropped(const QString &)));
+ if( m_multidesktop)
+ {
+ // desktop
+ connect(m_comboDesktop, SIGNAL(activated(int)),
+ SLOT(slotSelectDesk(int)));
+ }
+ if (m_numScreens > 1)
+ {
+ connect(m_comboScreen, SIGNAL(activated(int)),
+ SLOT(slotSelectScreen(int)));
+ }
+
+ // background image settings
+ QIconSet iconSet = SmallIconSet(QString::fromLatin1("fileopen"));
+ QPixmap pixMap = iconSet.pixmap( QIconSet::Small, QIconSet::Normal );
+ m_urlWallpaperButton->setIconSet( iconSet );
+ m_urlWallpaperButton->setFixedSize( pixMap.width()+8, pixMap.height()+8 );
+ QToolTip::add(m_urlWallpaperButton, i18n("Open file dialog"));
+
+ connect(m_buttonGroupBackground, SIGNAL(clicked(int)),
+ SLOT(slotWallpaperTypeChanged(int)));
+ connect(m_urlWallpaperBox, SIGNAL(activated(int)),
+ SLOT(slotWallpaper(int)));
+ connect(m_urlWallpaperButton, SIGNAL(clicked()),
+ SLOT(slotWallpaperSelection()));
+ connect(m_comboWallpaperPos, SIGNAL(activated(int)),
+ SLOT(slotWallpaperPos(int)));
+ connect(m_buttonSetupWallpapers, SIGNAL(clicked()),
+ SLOT(slotSetupMulti()));
+
+ // set up the background colour stuff
+ connect(m_colorPrimary, SIGNAL(changed(const QColor &)),
+ SLOT(slotPrimaryColor(const QColor &)));
+ connect(m_colorSecondary, SIGNAL(changed(const QColor &)),
+ SLOT(slotSecondaryColor(const QColor &)));
+ connect(m_comboPattern, SIGNAL(activated(int)),
+ SLOT(slotPattern(int)));
+
+ // blend
+ connect(m_comboBlend, SIGNAL(activated(int)), SLOT(slotBlendMode(int)));
+ connect(m_sliderBlend, SIGNAL(valueChanged(int)),
+ SLOT(slotBlendBalance(int)));
+ connect(m_cbBlendReverse, SIGNAL(toggled(bool)),
+ SLOT(slotBlendReverse(bool)));
+
+ // advanced options
+ connect(m_buttonAdvanced, SIGNAL(clicked()),
+ SLOT(slotAdvanced()));
+
+ connect(m_buttonGetNew, SIGNAL(clicked()),
+ SLOT(slotGetNewStuff()));
+
+ // renderers
+ m_renderer.resize(m_numDesks+1);
+
+ if (m_numScreens > 1)
+ {
+ for (unsigned i = 0; i < m_numDesks+1; ++i)
+ {
+ m_renderer[i].resize(m_numScreens+2);
+ m_renderer[i].setAutoDelete(true);
+
+ int eDesk = i>0 ? i-1 : 0;
+
+ // Setup the merged-screen renderer
+ KBackgroundRenderer * r = new KBackgroundRenderer(eDesk, 0, false, _config);
+ m_renderer[i].insert( 0, r );
+ connect( r, SIGNAL(imageDone(int,int)), SLOT(slotPreviewDone(int,int)) );
+
+ // Setup the common-screen renderer
+ r = new KBackgroundRenderer(eDesk, 0, true, _config);
+ m_renderer[i].insert( 1, r );
+ connect( r, SIGNAL(imageDone(int,int)), SLOT(slotPreviewDone(int,int)) );
+
+ // Setup the remaining renderers for each screen
+ for (unsigned j=0; j < m_numScreens; ++j )
+ {
+ r = new KBackgroundRenderer(eDesk, j, true, _config);
+ m_renderer[i].insert( j+2, r );
+ connect( r, SIGNAL(imageDone(int,int)), SLOT(slotPreviewDone(int,int)) );
+ }
+ }
+ }
+ else
+ {
+ for (unsigned i = 0; i < m_numDesks+1; ++i )
+ {
+ m_renderer[i].resize(1);
+ m_renderer[i].setAutoDelete(true);
+ }
+
+ // set up the common desktop renderer
+ KBackgroundRenderer * r = new KBackgroundRenderer(0, 0, false, _config);
+ m_renderer[0].insert(0, r);
+ connect(r, SIGNAL(imageDone(int,int)), SLOT(slotPreviewDone(int,int)));
+
+ // set up all the other desktop renderers
+ for (unsigned i = 0; i < m_numDesks; ++i)
+ {
+ r = new KBackgroundRenderer(i, 0, false, _config);
+ m_renderer[i+1].insert(0, r);
+ connect(r, SIGNAL(imageDone(int,int)), SLOT(slotPreviewDone(int,int)));
+ }
+ }
+
+ // Random or InOrder
+ m_slideShowRandom = eRenderer()->multiWallpaperMode();
+ if (m_slideShowRandom == KBackgroundSettings::NoMultiRandom)
+ m_slideShowRandom = KBackgroundSettings::Random;
+ if (m_slideShowRandom == KBackgroundSettings::NoMulti)
+ m_slideShowRandom = KBackgroundSettings::InOrder;
+
+ // Wallpaper Position
+ m_wallpaperPos = eRenderer()->wallpaperMode();
+ if (m_wallpaperPos == KBackgroundSettings::NoWallpaper)
+ m_wallpaperPos = KBackgroundSettings::Centred; // Default
+
+ if (KGlobal::dirs()->isRestrictedResource("wallpaper"))
+ {
+ m_urlWallpaperButton->hide();
+ m_buttonSetupWallpapers->hide();
+ m_radioSlideShow->hide();
+ }
+
+ initUI();
+ updateUI();
+
+#if (QT_VERSION-0 >= 0x030200)
+ connect( qApp->desktop(), SIGNAL( resized( int )), SLOT( desktopResized())); // RANDR support
+#endif
+}
+
+BGDialog::~BGDialog()
+{
+ delete m_pGlobals;
+}
+
+KBackgroundRenderer * BGDialog::eRenderer()
+{
+ return m_renderer[m_eDesk][m_eScreen];
+}
+
+void BGDialog::getEScreen()
+{
+ if ( m_pGlobals->drawBackgroundPerScreen( m_eDesk>0 ? m_eDesk-1 : 0 ) )
+ m_eScreen = m_pGlobals->commonScreenBackground() ? 1 : m_screen+2;
+ else
+ m_eScreen = 0;
+
+ if ( m_numScreens == 1 )
+ m_eScreen = 0;
+ else if ( m_eScreen > int(m_numScreens+1) )
+ m_eScreen = m_numScreens+1;
+}
+
+void BGDialog::makeReadOnly()
+{
+ m_pMonitorArrangement->setEnabled( false );
+ m_comboScreen->setEnabled( false );
+ m_comboDesktop->setEnabled( false );
+ m_colorPrimary->setEnabled( false );
+ m_colorSecondary->setEnabled( false );
+ m_comboPattern->setEnabled( false );
+ m_radioNoPicture->setEnabled( false );
+ m_radioPicture->setEnabled( false );
+ m_radioSlideShow->setEnabled( false );
+ m_urlWallpaperBox->setEnabled( false );
+ m_urlWallpaperButton->setEnabled( false );
+ m_comboWallpaperPos->setEnabled( false );
+ m_buttonSetupWallpapers->setEnabled( false );
+ m_comboBlend->setEnabled( false );
+ m_sliderBlend->setEnabled( false );
+ m_cbBlendReverse->setEnabled( false );
+ m_buttonAdvanced->setEnabled( false );
+ m_buttonGetNew->setEnabled( false );
+}
+
+void BGDialog::load( bool useDefaults )
+{
+ m_pGlobals->getConfig()->setReadDefaults( useDefaults );
+ m_pGlobals->readSettings();
+ m_eDesk = m_pGlobals->commonDeskBackground() ? 0 : m_desk;
+ getEScreen();
+
+ for (unsigned desk = 0; desk < m_renderer.size(); ++desk)
+ {
+ unsigned eDesk = desk>0 ? desk-1 : 0;
+ for (unsigned screen = 0; screen < m_renderer[desk].size(); ++screen)
+ {
+ unsigned eScreen = screen>1 ? screen-2 : 0;
+// m_renderer[desk][screen]->load( eDesk, eScreen, (screen>0) );
+ m_renderer[desk][screen]->load( eDesk, eScreen, (screen>0), useDefaults );
+ }
+ }
+
+ m_copyAllDesktops = true;
+ m_copyAllScreens = true;
+
+ // Random or InOrder
+ m_slideShowRandom = eRenderer()->multiWallpaperMode();
+ if (m_slideShowRandom == KBackgroundSettings::NoMultiRandom)
+ m_slideShowRandom = KBackgroundSettings::Random;
+ if (m_slideShowRandom == KBackgroundSettings::NoMulti)
+ m_slideShowRandom = KBackgroundSettings::InOrder;
+
+ // Wallpaper Position
+ m_wallpaperPos = eRenderer()->wallpaperMode();
+ if (m_wallpaperPos == KBackgroundSettings::NoWallpaper)
+ m_wallpaperPos = KBackgroundSettings::Centred; // Default
+
+ updateUI();
+ emit changed(useDefaults);
+}
+
+void BGDialog::save()
+{
+ m_pGlobals->writeSettings();
+
+ // write out the common desktop or the "Desktop 1" settings
+ // depending on which are the real settings
+ // they both share Desktop[0] in the config file
+ // similar for screen...
+
+ for (unsigned desk = 0; desk < m_renderer.size(); ++desk)
+ {
+ if (desk == 0 && !m_pGlobals->commonDeskBackground())
+ continue;
+
+ if (desk == 1 && m_pGlobals->commonDeskBackground())
+ continue;
+
+ for (unsigned screen = 0; screen < m_renderer[desk].size(); ++screen)
+ {
+ if (screen == 1 && !m_pGlobals->commonScreenBackground())
+ continue;
+
+ if (screen == 2 && m_pGlobals->commonScreenBackground())
+ continue;
+
+ m_renderer[desk][screen]->writeSettings();
+ }
+ }
+
+ emit changed(false);
+}
+
+void BGDialog::defaults()
+{
+ load( true );
+ eRenderer()->setWallpaper( eRenderer()->wallpaper() );
+}
+
+QString BGDialog::quickHelp() const
+{
+ return i18n("<h1>Background</h1> This module allows you to control the"
+ " appearance of the virtual desktops. KDE offers a variety of options"
+ " for customization, including the ability to specify different settings"
+ " for each virtual desktop, or a common background for all of them.<p>"
+ " The appearance of the desktop results from the combination of its"
+ " background colors and patterns, and optionally, wallpaper, which is"
+ " based on the image from a graphic file.<p>"
+ " The background can be made up of a single color, or a pair of colors"
+ " which can be blended in a variety of patterns. Wallpaper is also"
+ " customizable, with options for tiling and stretching images. The"
+ " wallpaper can be overlaid opaquely, or blended in different ways with"
+ " the background colors and patterns.<p>"
+ " KDE allows you to have the wallpaper change automatically at specified"
+ " intervals of time. You can also replace the background with a program"
+ " that updates the desktop dynamically. For example, the \"kdeworld\""
+ " program shows a day/night map of the world which is updated periodically.");
+}
+
+void BGDialog::slotIdentifyScreens()
+{
+ // Taken from PositionTab::showIdentify in kdebase/kcontrol/kicker/positiontab_impl.cpp
+ for(unsigned s = 0; s < m_numScreens; s++)
+ {
+ QLabel *screenLabel = new QLabel(0,"Screen Identify", WDestructiveClose | WStyle_Customize | WX11BypassWM);
+
+ QFont identifyFont(KGlobalSettings::generalFont());
+ identifyFont.setPixelSize(100);
+ screenLabel->setFont(identifyFont);
+
+ screenLabel->setFrameStyle(QFrame::Panel);
+ screenLabel->setFrameShadow(QFrame::Plain);
+
+ screenLabel->setAlignment(Qt::AlignCenter);
+ screenLabel->setNum(int(s + 1));
+ // BUGLET: we should not allow the identification to be entered again
+ // until the timer fires.
+ QTimer::singleShot(1500, screenLabel, SLOT(close()));
+
+ QPoint screenCenter(QApplication::desktop()->screenGeometry(s).center());
+ QRect targetGeometry(QPoint(0,0),screenLabel->sizeHint());
+ targetGeometry.moveCenter(screenCenter);
+
+ screenLabel->setGeometry(targetGeometry);
+
+ screenLabel->show();
+ }
+}
+
+void BGDialog::initUI()
+{
+ // Desktop names
+ for (unsigned i = 0; i < m_numDesks; ++i)
+ m_comboDesktop->insertItem(m_pGlobals->deskName(i));
+
+ // Screens
+ for (unsigned i = 0; i < m_numScreens; ++i)
+ m_comboScreen->insertItem( i18n("Screen %1").arg(QString::number(i+1)) );
+
+ // Patterns
+ m_comboPattern->insertItem(i18n("Single Color"));
+ m_comboPattern->insertItem(i18n("Horizontal Gradient"));
+ m_comboPattern->insertItem(i18n("Vertical Gradient"));
+ m_comboPattern->insertItem(i18n("Pyramid Gradient"));
+ m_comboPattern->insertItem(i18n("Pipecross Gradient"));
+ m_comboPattern->insertItem(i18n("Elliptic Gradient"));
+
+ m_patterns = KBackgroundPattern::list();
+ m_patterns.sort(); // Defined order
+ QStringList::Iterator it;
+ for (it=m_patterns.begin(); it != m_patterns.end(); ++it)
+ {
+ KBackgroundPattern pat(*it);
+ if (pat.isAvailable())
+ m_comboPattern->insertItem(pat.comment());
+ }
+
+ loadWallpaperFilesList();
+
+ // Wallpaper tilings: again they must match the ones from bgrender.cc
+ m_comboWallpaperPos->insertItem(i18n("Centered"));
+ m_comboWallpaperPos->insertItem(i18n("Tiled"));
+ m_comboWallpaperPos->insertItem(i18n("Center Tiled"));
+ m_comboWallpaperPos->insertItem(i18n("Centered Maxpect"));
+ m_comboWallpaperPos->insertItem(i18n("Tiled Maxpect"));
+ m_comboWallpaperPos->insertItem(i18n("Scaled"));
+ m_comboWallpaperPos->insertItem(i18n("Centered Auto Fit"));
+ m_comboWallpaperPos->insertItem(i18n("Scale & Crop"));
+
+ // Blend modes: make sure these match with kdesktop/bgrender.cc !!
+ m_comboBlend->insertItem(i18n("No Blending"));
+ m_comboBlend->insertItem(i18n("Flat"));
+ m_comboBlend->insertItem(i18n("Horizontal"));
+ m_comboBlend->insertItem(i18n("Vertical"));
+ m_comboBlend->insertItem(i18n("Pyramid"));
+ m_comboBlend->insertItem(i18n("Pipecross"));
+ m_comboBlend->insertItem(i18n("Elliptic"));
+ m_comboBlend->insertItem(i18n("Intensity"));
+ m_comboBlend->insertItem(i18n("Saturation"));
+ m_comboBlend->insertItem(i18n("Contrast"));
+ m_comboBlend->insertItem(i18n("Hue Shift"));
+}
+
+void BGDialog::loadWallpaperFilesList() {
+
+ // Wallpapers
+ // the following QMap is lower cased names mapped to cased names and URLs
+ // this way we get case insensitive sorting
+ QMap<QString, QPair<QString, QString> > papers;
+
+ //search for .desktop files before searching for images without .desktop files
+ QStringList lst = m_pDirs->findAllResources("wallpaper", "*desktop", false, true);
+ QStringList files;
+ for (QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it)
+ {
+ KSimpleConfig fileConfig(*it);
+ fileConfig.setGroup("Wallpaper");
+
+ QString imageCaption = fileConfig.readEntry("Name");
+ QString fileName = fileConfig.readEntry("File");
+
+ if (imageCaption.isEmpty())
+ {
+ imageCaption = fileName;
+ imageCaption.replace('_', ' ');
+ imageCaption = KStringHandler::capwords(imageCaption);
+ }
+
+ // avoid name collisions
+ QString rs = imageCaption;
+ QString lrs = rs.lower();
+ for (int n = 1; papers.find(lrs) != papers.end(); ++n)
+ {
+ rs = imageCaption + " (" + QString::number(n) + ')';
+ lrs = rs.lower();
+ }
+ int slash = (*it).findRev('/') + 1;
+ QString directory = (*it).left(slash);
+ bool canLoadScaleable = false;
+#ifdef HAVE_LIBART
+ canLoadScaleable = true;
+#endif
+ if ( fileConfig.readEntry("ImageType") == "pixmap" || canLoadScaleable ) {
+ papers[lrs] = qMakePair(rs, directory + fileName);
+ files.append(directory + fileName);
+ }
+ }
+
+ //now find any wallpapers that don't have a .desktop file
+ lst = m_pDirs->findAllResources("wallpaper", "*", false, true);
+ for (QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it)
+ {
+ if ( !(*it).endsWith(".desktop") && files.grep(*it).empty() ) {
+ // First try to see if we have a comment describing the image. If we do
+ // just use the first line of said comment.
+ KFileMetaInfo metaInfo(*it);
+ QString imageCaption;
+
+ if (metaInfo.isValid() && metaInfo.item("Comment").isValid())
+ imageCaption = metaInfo.item("Comment").string().section('\n', 0, 0);
+
+ if (imageCaption.isEmpty())
+ {
+ int slash = (*it).findRev('/') + 1;
+ int endDot = (*it).findRev('.');
+
+ // strip the extension if it exists
+ if (endDot != -1 && endDot > slash)
+ imageCaption = (*it).mid(slash, endDot - slash);
+ else
+ imageCaption = (*it).mid(slash);
+
+ imageCaption.replace('_', ' ');
+ imageCaption = KStringHandler::capwords(imageCaption);
+ }
+
+ // avoid name collisions
+ QString rs = imageCaption;
+ QString lrs = rs.lower();
+ for (int n = 1; papers.find(lrs) != papers.end(); ++n)
+ {
+ rs = imageCaption + " (" + QString::number(n) + ')';
+ lrs = rs.lower();
+ }
+ papers[lrs] = qMakePair(rs, *it);
+ }
+ }
+
+ KComboBox *comboWallpaper = m_urlWallpaperBox;
+ comboWallpaper->clear();
+ m_wallpaper.clear();
+ int i = 0;
+ for (QMap<QString, QPair<QString, QString> >::Iterator it = papers.begin();
+ it != papers.end();
+ ++it)
+ {
+ comboWallpaper->insertItem(it.data().first);
+ m_wallpaper[it.data().second] = i;
+ i++;
+ }
+}
+
+void BGDialog::setWallpaper(const QString &s)
+{
+ KComboBox *comboWallpaper = m_urlWallpaperBox;
+ comboWallpaper->blockSignals(true);
+
+ if (m_wallpaper.find(s) == m_wallpaper.end())
+ {
+ int i = comboWallpaper->count();
+ QString imageCaption;
+ int slash = s.findRev('/') + 1;
+ int endDot = s.findRev('.');
+
+ // strip the extension if it exists
+ if (endDot != -1 && endDot > slash)
+ imageCaption = s.mid(slash, endDot - slash);
+ else
+ imageCaption = s.mid(slash);
+ if (comboWallpaper->text(i-1) == imageCaption)
+ {
+ i--;
+ comboWallpaper->removeItem(i);
+ }
+ comboWallpaper->insertItem(imageCaption);
+ m_wallpaper[s] = i;
+ comboWallpaper->setCurrentItem(i);
+ }
+ else
+ {
+ comboWallpaper->setCurrentItem(m_wallpaper[s]);
+ }
+ comboWallpaper->blockSignals(false);
+}
+
+void BGDialog::slotWallpaperSelection()
+{
+ KFileDialog dlg( QString::null, QString::null, this,
+ "file dialog", true );
+
+ KImageFilePreview* previewWidget = new KImageFilePreview(&dlg);
+ dlg.setPreviewWidget(previewWidget);
+
+ QStringList mimeTypes = KImageIO::mimeTypes( KImageIO::Reading );
+#ifdef HAVE_LIBART
+ mimeTypes += "image/svg+xml";
+#endif
+ dlg.setFilter( mimeTypes.join( " " ) );
+ dlg.setMode( KFile::File | KFile::ExistingOnly | KFile::LocalOnly );
+ dlg.setCaption( i18n("Select Wallpaper") );
+
+ int j = m_urlWallpaperBox->currentItem();
+ QString uri;
+ for(QMap<QString,int>::ConstIterator it = m_wallpaper.begin();
+ it != m_wallpaper.end();
+ ++it)
+ {
+ if (it.data() == j)
+ {
+ uri = it.key();
+ break;
+ }
+ }
+
+ if ( !uri.isEmpty() ) {
+ dlg.setSelection( uri );
+ }
+
+ if ( dlg.exec() == QDialog::Accepted )
+ {
+ setWallpaper(dlg.selectedFile());
+
+ int optionID = m_buttonGroupBackground->id(m_radioPicture);
+ m_buttonGroupBackground->setButton( optionID );
+ slotWallpaperTypeChanged( optionID );
+
+ emit changed(true);
+ }
+}
+
+void BGDialog::updateUI()
+{
+ KBackgroundRenderer *r = eRenderer();
+ m_comboDesktop->setCurrentItem(m_eDesk);
+ m_comboScreen->setCurrentItem(m_eScreen);
+
+ m_colorPrimary->setColor(r->colorA());
+ m_colorSecondary->setColor(r->colorB());
+
+ int wallpaperMode = r->wallpaperMode();
+ int multiMode = r->multiWallpaperMode();
+
+ if (r->backgroundMode() == KBackgroundSettings::Program &&
+ wallpaperMode == KBackgroundSettings::NoWallpaper)
+ groupBox3->setEnabled( false );
+ else
+ groupBox3->setEnabled( true );
+
+ if ((multiMode == KBackgroundSettings::NoMultiRandom) ||
+ (multiMode == KBackgroundSettings::NoMulti))
+ {
+ // No wallpaper
+ if (wallpaperMode == KBackgroundSettings::NoWallpaper )
+ {
+ m_urlWallpaperBox->setEnabled(false);
+ m_urlWallpaperButton->setEnabled(false);
+ m_buttonSetupWallpapers->setEnabled(false);
+ m_comboWallpaperPos->setEnabled(false);
+ m_lblWallpaperPos->setEnabled(false);
+ m_buttonGroupBackground->setButton(
+ m_buttonGroupBackground->id(m_radioNoPicture) );
+ }
+
+ // 1 Picture
+ else
+ {
+ m_urlWallpaperBox->setEnabled(true);
+ m_urlWallpaperButton->setEnabled(true);
+ m_buttonSetupWallpapers->setEnabled(false);
+ m_comboWallpaperPos->setEnabled(true);
+ m_lblWallpaperPos->setEnabled(true);
+ setWallpaper(r->wallpaper());
+ m_buttonGroupBackground->setButton(
+ m_buttonGroupBackground->id(m_radioPicture) );
+ }
+ }
+
+ // Slide show
+ else
+ {
+ m_urlWallpaperBox->setEnabled(false);
+ m_urlWallpaperButton->setEnabled(false);
+ m_buttonSetupWallpapers->setEnabled(true);
+ m_comboWallpaperPos->setEnabled(true);
+ m_lblWallpaperPos->setEnabled(true);
+ m_buttonGroupBackground->setButton(
+ m_buttonGroupBackground->id(m_radioSlideShow) );
+ }
+
+ m_comboWallpaperPos->setCurrentItem(r->wallpaperMode()-1);
+
+ bool bSecondaryEnabled = true;
+ m_comboPattern->blockSignals(true);
+ switch (r->backgroundMode()) {
+ case KBackgroundSettings::Flat:
+ m_comboPattern->setCurrentItem(0);
+ bSecondaryEnabled = false;
+ break;
+
+ case KBackgroundSettings::Pattern:
+ {
+ int i = m_patterns.findIndex(r->KBackgroundPattern::name());
+ if (i >= 0)
+ m_comboPattern->setCurrentItem(NR_PREDEF_PATTERNS+i);
+ else
+ m_comboPattern->setCurrentItem(0);
+ }
+ break;
+
+ case KBackgroundSettings::Program:
+ m_comboPattern->setCurrentItem(0);
+ bSecondaryEnabled = false;
+ break;
+
+ default: // Gradient
+ m_comboPattern->setCurrentItem(
+ 1 + r->backgroundMode() - KBackgroundSettings::HorizontalGradient);
+ break;
+ }
+ m_comboPattern->blockSignals(false);
+
+ m_colorSecondary->setEnabled(bSecondaryEnabled);
+
+ int mode = r->blendMode();
+
+ m_comboBlend->blockSignals(true);
+ m_sliderBlend->blockSignals(true);
+
+ m_comboBlend->setCurrentItem(mode);
+ m_cbBlendReverse->setChecked(r->reverseBlending());
+ m_sliderBlend->setValue( r->blendBalance() / 10 );
+
+ m_comboBlend->blockSignals(false);
+ m_sliderBlend->blockSignals(false);
+
+ // turn it off if there is no background picture set!
+ setBlendingEnabled(wallpaperMode != KBackgroundSettings::NoWallpaper);
+
+ // Start preview renderer(s)
+ if ( m_eScreen == 0 )
+ {
+ r->setPreview( m_pMonitorArrangement->combinedPreviewSize() );
+ r->start(true);
+ }
+ else if ( m_eScreen == 1 )
+ {
+ r->setPreview( m_pMonitorArrangement->maxPreviewSize() );
+ r->start(true);
+ }
+ else
+ {
+ for (unsigned j = 0; j < m_numScreens; ++j)
+ {
+ m_renderer[m_eDesk][j+2]->stop();
+ m_renderer[m_eDesk][j+2]->setPreview( m_pMonitorArrangement->monitor(j)->size() );
+ m_renderer[m_eDesk][j+2]->start(true);
+ }
+ }
+}
+
+void BGDialog::slotPreviewDone(int desk_done, int screen_done)
+{
+ int currentDesk = (m_eDesk > 0) ? m_eDesk-1 : 0;
+
+ if ( desk_done != currentDesk )
+ return;
+
+ if (!m_previewUpdates)
+ return;
+
+ KBackgroundRenderer * r = m_renderer[m_eDesk][(m_eScreen>1) ? (screen_done+2) : m_eScreen];
+
+ if (r->image().isNull())
+ return;
+
+ r->saveCacheFile();
+
+ KPixmap pm;
+ if (QPixmap::defaultDepth() < 15)
+ pm.convertFromImage(r->image(), KPixmap::LowColor);
+ else
+ pm.convertFromImage(r->image());
+
+ if ( m_eScreen == 0 )
+ {
+ m_pMonitorArrangement->setPixmap(pm);
+ }
+ else if ( m_eScreen == 1 )
+ {
+ for (unsigned i = 0; i < m_pMonitorArrangement->numMonitors(); ++i)
+ m_pMonitorArrangement->monitor(i)->setPixmap(pm);
+ }
+ else
+ {
+ m_pMonitorArrangement->monitor(screen_done)->setPixmap(pm);
+ }
+}
+
+void BGDialog::slotImageDropped(const QString &uri)
+{
+ setWallpaper(uri);
+
+ int optionID = m_buttonGroupBackground->id(m_radioPicture);
+ m_buttonGroupBackground->setButton( optionID );
+ slotWallpaperTypeChanged( optionID );
+}
+
+void BGDialog::slotWallpaperTypeChanged(int i)
+{
+ KBackgroundRenderer *r = eRenderer();
+ r->stop();
+
+ // No picture
+ if (i == m_buttonGroupBackground->id(m_radioNoPicture)) //None
+ {
+ m_urlWallpaperBox->setEnabled(false);
+ m_urlWallpaperButton->setEnabled(false);
+ m_buttonSetupWallpapers->setEnabled(false);
+ m_comboWallpaperPos->setEnabled(false);
+ m_lblWallpaperPos->setEnabled(false);
+ r->setWallpaperMode(KBackgroundSettings::NoWallpaper);
+
+ if (m_slideShowRandom == KBackgroundSettings::InOrder)
+ r->setMultiWallpaperMode(KBackgroundSettings::NoMulti);
+ else
+ r->setMultiWallpaperMode(KBackgroundSettings::NoMultiRandom);
+
+ setBlendingEnabled(false);
+ }
+
+ // Slide show
+ else if (i == m_buttonGroupBackground->id(m_radioSlideShow))
+ {
+ m_urlWallpaperBox->setEnabled(false);
+ m_urlWallpaperButton->setEnabled(false);
+ m_buttonSetupWallpapers->setEnabled(true);
+ m_comboWallpaperPos->setEnabled(true);
+ m_lblWallpaperPos->setEnabled(true);
+ setBlendingEnabled(true);
+
+ m_comboWallpaperPos->blockSignals(true);
+ m_comboWallpaperPos->setCurrentItem(m_wallpaperPos-1);
+ m_comboWallpaperPos->blockSignals(false);
+
+ if (r->wallpaperList().count() == 0)
+ r->setWallpaperMode( KBackgroundSettings::NoWallpaper );
+ else
+ r->setWallpaperMode(m_wallpaperPos);
+
+ r->setMultiWallpaperMode(m_slideShowRandom);
+ setWallpaper(r->wallpaper());
+ setBlendingEnabled(true);
+ }
+
+ // 1 Picture
+ else if (i == m_buttonGroupBackground->id(m_radioPicture))
+ {
+ m_urlWallpaperBox->setEnabled(true);
+ m_urlWallpaperButton->setEnabled(true);
+ m_buttonSetupWallpapers->setEnabled(false);
+ m_lblWallpaperPos->setEnabled(true);
+ m_comboWallpaperPos->setEnabled(true);
+ setBlendingEnabled(true);
+
+ if (m_slideShowRandom == KBackgroundSettings::InOrder)
+ r->setMultiWallpaperMode(KBackgroundSettings::NoMulti);
+ else
+ r->setMultiWallpaperMode(KBackgroundSettings::NoMultiRandom);
+
+ int j = m_urlWallpaperBox->currentItem();
+ QString path;
+ for(QMap<QString,int>::ConstIterator it = m_wallpaper.begin();
+ it != m_wallpaper.end();
+ ++it)
+ {
+ if (it.data() == j)
+ {
+ path = it.key();
+ break;
+ }
+ }
+
+ KFileMetaInfo metaInfo(path);
+ if (metaInfo.isValid() && metaInfo.item("Dimensions").isValid())
+ {
+ // If the image is greater than 800x600 default to using scaled mode,
+ // otherwise default to tiled.
+
+ QSize s = metaInfo.item("Dimensions").value().toSize();
+ if (s.width() >= 800 && s.height() >= 600)
+ m_wallpaperPos = KBackgroundSettings::Scaled;
+ else
+ m_wallpaperPos = KBackgroundSettings::Tiled;
+ }
+ else if (KMimeType::findByPath(path)->is("image/svg+xml"))
+ {
+ m_wallpaperPos = KBackgroundSettings::Scaled;
+ }
+
+ r->setWallpaperMode(m_wallpaperPos);
+ m_comboWallpaperPos->blockSignals(true);
+ m_comboWallpaperPos->setCurrentItem(m_wallpaperPos-1);
+ m_comboWallpaperPos->blockSignals(false);
+
+ r->setWallpaper(path);
+ }
+
+ r->start(true);
+ m_copyAllDesktops = true;
+ m_copyAllScreens = true;
+ emit changed(true);
+}
+
+void BGDialog::slotWallpaper(int)
+{
+ slotWallpaperTypeChanged(m_buttonGroupBackground->id(m_radioPicture));
+ emit changed(true);
+}
+
+void BGDialog::setBlendingEnabled(bool enable)
+{
+ int mode = eRenderer()->blendMode();
+
+ bool b = !(mode == KBackgroundSettings::NoBlending);
+ m_lblBlending->setEnabled(enable);
+ m_comboBlend->setEnabled(enable);
+ m_lblBlendBalance->setEnabled(enable && b);
+ m_sliderBlend->setEnabled(enable && b);
+
+ b = !(mode < KBackgroundSettings::IntensityBlending);
+ m_cbBlendReverse->setEnabled(enable && b);
+}
+
+void BGDialog::slotWallpaperPos(int mode)
+{
+ KBackgroundRenderer *r = eRenderer();
+
+ mode++;
+ m_wallpaperPos = mode;
+
+ if (mode == r->wallpaperMode())
+ return;
+
+ r->stop();
+ r->setWallpaperMode(mode);
+ r->start(true);
+ m_copyAllDesktops = true;
+ m_copyAllScreens = true;
+ emit changed(true);
+}
+
+void BGDialog::slotSetupMulti()
+{
+ KBackgroundRenderer *r = eRenderer();
+
+ BGMultiWallpaperDialog dlg(r, topLevelWidget());
+ if (dlg.exec() == QDialog::Accepted) {
+ r->stop();
+ m_slideShowRandom = r->multiWallpaperMode();
+ r->setWallpaperMode(m_wallpaperPos);
+ r->start(true);
+ m_copyAllDesktops = true;
+ m_copyAllScreens = true;
+ emit changed(true);
+ }
+}
+
+void BGDialog::slotPrimaryColor(const QColor &color)
+{
+ KBackgroundRenderer *r = eRenderer();
+
+ if (color == r->colorA())
+ return;
+
+ r->stop();
+ r->setColorA(color);
+ r->start(true);
+ m_copyAllDesktops = true;
+ m_copyAllScreens = true;
+ emit changed(true);
+}
+
+void BGDialog::slotSecondaryColor(const QColor &color)
+{
+ KBackgroundRenderer *r = eRenderer();
+
+ if (color == r->colorB())
+ return;
+
+ r->stop();
+ r->setColorB(color);
+ r->start(true);
+ m_copyAllDesktops = true;
+ m_copyAllScreens = true;
+ emit changed(true);
+}
+
+void BGDialog::slotPattern(int pattern)
+{
+ KBackgroundRenderer *r = eRenderer();
+ r->stop();
+ bool bSecondaryEnabled = true;
+ if (pattern < NR_PREDEF_PATTERNS)
+ {
+ if (pattern == 0)
+ {
+ r->setBackgroundMode(KBackgroundSettings::Flat);
+ bSecondaryEnabled = false;
+ }
+ else
+ {
+ r->setBackgroundMode(pattern - 1 + KBackgroundSettings::HorizontalGradient);
+ }
+ }
+ else
+ {
+ r->setBackgroundMode(KBackgroundSettings::Pattern);
+ r->setPatternName(m_patterns[pattern - NR_PREDEF_PATTERNS]);
+ }
+ r->start(true);
+ m_colorSecondary->setEnabled(bSecondaryEnabled);
+
+ m_copyAllDesktops = true;
+ m_copyAllScreens = true;
+ emit changed(true);
+}
+
+void BGDialog::slotSelectScreen(int screen)
+{
+ // Copy the settings from "All screens" to all the other screens
+ // at a suitable point
+ if (m_pGlobals->commonScreenBackground() && (screen >1) && m_copyAllScreens)
+ {
+ // Copy stuff
+ for (unsigned desk = 0; desk < m_numDesks+1; ++desk )
+ {
+ KBackgroundRenderer *master = m_renderer[desk][1];
+ for (unsigned screen = 0; screen < m_numScreens; ++screen)
+ {
+ m_renderer[desk][screen+2]->copyConfig(master);
+ }
+ }
+ }
+
+ if (screen == m_eScreen )
+ {
+ return; // Nothing to do
+ }
+
+ m_copyAllScreens = false;
+
+ bool drawBackgroundPerScreen = screen > 0;
+ bool commonScreenBackground = screen < 2;
+
+ // Update drawBackgroundPerScreen
+ if (m_eDesk == 0)
+ {
+ for (unsigned desk = 0; desk < m_numDesks; ++desk )
+ m_pGlobals->setDrawBackgroundPerScreen(desk, drawBackgroundPerScreen);
+ }
+ else
+ {
+ m_pGlobals->setDrawBackgroundPerScreen(m_eDesk-1, drawBackgroundPerScreen);
+ }
+
+ m_pGlobals->setCommonScreenBackground(commonScreenBackground);
+
+ if (screen < 2)
+ emit changed(true);
+ else
+ {
+ for (unsigned i = 0; i < m_renderer[m_eDesk].size(); ++i)
+ {
+ if ( m_renderer[m_eDesk][i]->isActive() )
+ m_renderer[m_eDesk][i]->stop();
+ }
+ }
+
+ m_eScreen = screen;
+ updateUI();
+}
+
+void BGDialog::slotSelectDesk(int desk)
+{
+ // Copy the settings from "All desktops" to all the other desktops
+ // at a suitable point.
+ if (m_pGlobals->commonDeskBackground() && (desk > 0) && m_copyAllDesktops)
+ {
+ // Copy stuff
+ for (unsigned screen = 0; screen < m_renderer[0].size(); ++screen )
+ {
+ KBackgroundRenderer *master = m_renderer[0][screen];
+ for (unsigned desk = 0; desk < m_numDesks; ++desk )
+ {
+ m_renderer[desk+1][screen]->copyConfig(master);
+ }
+ }
+ }
+
+ if (desk == m_eDesk)
+ {
+ return; // Nothing to do
+ }
+
+ m_copyAllDesktops = false;
+ if (desk == 0)
+ {
+ if (m_pGlobals->commonDeskBackground())
+ return; // Nothing to do
+
+ m_pGlobals->setCommonDeskBackground(true);
+ emit changed(true);
+ }
+ else
+ {
+ for (unsigned i = 0; i < m_renderer[m_eDesk].size(); ++i)
+ {
+ if ( m_renderer[m_eDesk][i]->isActive() )
+ m_renderer[m_eDesk][i]->stop();
+ }
+ m_pGlobals->setCommonDeskBackground(false);
+ }
+
+ m_eDesk = desk;
+ getEScreen();
+ updateUI();
+}
+
+void BGDialog::slotAdvanced()
+{
+ KBackgroundRenderer *r = eRenderer();
+
+ m_previewUpdates = false;
+ BGAdvancedDialog dlg(r, topLevelWidget(), m_multidesktop);
+
+ if (!m_pMonitorArrangement->isEnabled()) {
+ dlg.makeReadOnly();
+ dlg.exec();
+ return;
+ }
+
+ dlg.setTextColor(m_pGlobals->textColor());
+ dlg.setTextBackgroundColor(m_pGlobals->textBackgroundColor());
+ dlg.setShadowEnabled(m_pGlobals->shadowEnabled());
+ dlg.setTextLines(m_pGlobals->textLines());
+ dlg.setTextWidth(m_pGlobals->textWidth());
+
+ if (m_pGlobals->limitCache())
+ dlg.setCacheSize( m_pGlobals->cacheSize() );
+ else
+ dlg.setCacheSize( 0 );
+
+ if( !dlg.exec())
+ {
+ m_previewUpdates = true;
+ return;
+ }
+
+ r->setBackgroundMode(dlg.backgroundMode());
+ if (dlg.backgroundMode() == KBackgroundSettings::Program)
+ {
+ r->setProgram(dlg.backgroundProgram());
+ }
+
+ int cacheSize = dlg.cacheSize();
+ if (cacheSize)
+ {
+ m_pGlobals->setCacheSize(cacheSize);
+ m_pGlobals->setLimitCache(true);
+ }
+ else
+ {
+ m_pGlobals->setLimitCache(false);
+ }
+
+ m_pGlobals->setTextColor(dlg.textColor());
+ m_pGlobals->setTextBackgroundColor(dlg.textBackgroundColor());
+ m_pGlobals->setShadowEnabled(dlg.shadowEnabled());
+ m_pGlobals->setTextLines(dlg.textLines());
+ m_pGlobals->setTextWidth(dlg.textWidth());
+
+ r->stop();
+ m_previewUpdates = true;
+ r->start(true);
+
+ updateUI();
+ m_copyAllDesktops = true;
+ emit changed(true);
+}
+
+void BGDialog::slotGetNewStuff()
+{
+ //FIXME set this to a server when we get one
+ //should really be in a .rc file but could be either
+ //kcmshellrc or kcontrolrc
+ KConfig* config = KGlobal::config();
+ config->setGroup("KNewStuff");
+ config->writeEntry( "ProvidersUrl", "http://download.kde.org/khotnewstuff/wallpaper-providers.xml" );
+ config->writeEntry( "StandardResource", "wallpaper" );
+ config->sync();
+
+ KNS::DownloadDialog::open("wallpapers", i18n("Get New Wallpapers"));
+ loadWallpaperFilesList();
+}
+
+void BGDialog::slotBlendMode(int mode)
+{
+ if (mode == eRenderer()->blendMode())
+ return;
+
+ bool b = !(mode == KBackgroundSettings::NoBlending);
+ m_sliderBlend->setEnabled( b );
+ m_lblBlendBalance->setEnabled( b );
+
+ b = !(mode < KBackgroundSettings::IntensityBlending);
+ m_cbBlendReverse->setEnabled(b);
+ emit changed(true);
+
+ eRenderer()->stop();
+ eRenderer()->setBlendMode(mode);
+ eRenderer()->start(true);
+}
+
+void BGDialog::slotBlendBalance(int value)
+{
+ value = value*10;
+ if (value == eRenderer()->blendBalance())
+ return;
+ emit changed(true);
+
+ eRenderer()->stop();
+ eRenderer()->setBlendBalance(value);
+ eRenderer()->start(true);
+}
+
+void BGDialog::slotBlendReverse(bool b)
+{
+ if (b == eRenderer()->reverseBlending())
+ return;
+ emit changed(true);
+
+ eRenderer()->stop();
+ eRenderer()->setReverseBlending(b);
+ eRenderer()->start(true);
+}
+
+void BGDialog::desktopResized()
+{
+ for (unsigned i = 0; i < m_renderer.size(); ++i)
+ {
+ for (unsigned j = 0; j < m_renderer[i].size(); ++j )
+ {
+ KBackgroundRenderer * r = m_renderer[i][j];
+ if( r->isActive())
+ r->stop();
+ r->desktopResized();
+ }
+ }
+ eRenderer()->start(true);
+}
+
+
+#include "bgdialog.moc"
diff --git a/kcontrol/background/bgdialog.h b/kcontrol/background/bgdialog.h
new file mode 100644
index 000000000..02fbf3f3a
--- /dev/null
+++ b/kcontrol/background/bgdialog.h
@@ -0,0 +1,109 @@
+/*
+ This file is part of the KDE libraries
+ Copyright (c) 2003 Waldo Bastian <bastian@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _BGDIALOG_H_
+#define _BGDIALOG_H_
+
+#include <qptrvector.h>
+#include <qmap.h>
+#include <qvaluevector.h>
+
+#include "bgdialog_ui.h"
+#include "bgrender.h"
+#include "bgsettings.h"
+#include "bgdefaults.h"
+
+class BGMonitorArrangement;
+class KStandardDirs;
+
+class BGDialog : public BGDialog_UI
+{
+ Q_OBJECT
+public:
+ BGDialog(QWidget* parent, KConfig* _config, bool _multidesktop = true);
+ ~BGDialog();
+
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+
+ void makeReadOnly();
+
+ QString quickHelp() const;
+
+signals:
+ void changed(bool);
+
+protected:
+ void initUI();
+ void updateUI();
+ KBackgroundRenderer * eRenderer();
+
+ void setWallpaper(const QString &);
+
+ void loadWallpaperFilesList();
+
+protected slots:
+ void slotIdentifyScreens();
+ void slotSelectScreen(int screen);
+ void slotSelectDesk(int desk);
+ void slotWallpaperTypeChanged(int i);
+ void slotWallpaper(int i);
+ void slotWallpaperPos(int);
+ void slotWallpaperSelection();
+ void slotSetupMulti();
+ void slotPrimaryColor(const QColor &color);
+ void slotSecondaryColor(const QColor &color);
+ void slotPattern(int pattern);
+ void slotImageDropped(const QString &uri);
+ void slotPreviewDone(int desk, int screen);
+ void slotAdvanced();
+ void slotGetNewStuff();
+ void slotBlendMode(int mode);
+ void slotBlendBalance(int value);
+ void slotBlendReverse(bool b);
+ void desktopResized();
+ void setBlendingEnabled(bool);
+
+protected:
+ void getEScreen();
+ KGlobalBackgroundSettings *m_pGlobals;
+ KStandardDirs *m_pDirs;
+ bool m_multidesktop;
+
+ unsigned m_numDesks;
+ unsigned m_numScreens;
+ int m_desk;
+ int m_screen;
+ int m_eDesk;
+ int m_eScreen;
+ QValueVector< QPtrVector<KBackgroundRenderer> > m_renderer; // m_renderer[desk][screen]
+ QMap<QString,int> m_wallpaper;
+ QStringList m_patterns;
+ int m_slideShowRandom; // Remembers last Slide Show setting
+ int m_wallpaperPos; // Remembers last wallpaper pos
+
+ BGMonitorArrangement * m_pMonitorArrangement;
+
+ bool m_previewUpdates;
+ bool m_copyAllDesktops;
+ bool m_copyAllScreens;
+};
+
+#endif
diff --git a/kcontrol/background/bgdialog_ui.ui b/kcontrol/background/bgdialog_ui.ui
new file mode 100644
index 000000000..7cc6571d5
--- /dev/null
+++ b/kcontrol/background/bgdialog_ui.ui
@@ -0,0 +1,722 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>BGDialog_UI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>BGDialog_UI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>603</width>
+ <height>433</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>1</number>
+ </property>
+
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>m_pDesktopLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Setting for &amp;desktop:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_comboDesktop</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose the desktop you wish to configure the background for from this list. If you want the same background settings to be applied to all desktops select the "All Desktops" option.</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>All Desktops</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_comboDesktop</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose the desktop you wish to configure the background for from this list. If you want the same background settings to be applied to all desktops select the "All Desktops" option.</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="0" column="2">
+ <item>
+ <property name="text">
+ <string>Across All Screens</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>On Each Screen</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_comboScreen</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose the screen you wish to configure the background for from this list.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="3" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Spacer37</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="1" column="4" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>layout36</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>m_screenArrangement</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout35</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer800</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>4</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m_buttonIdentifyScreens</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Identify Screens</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click this button to show the identifying number for each screen.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer810</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>4</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer80</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>4</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m_buttonAdvanced</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Advanced Options</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click this button to set the icon text colors and shadow, set up a program to run for the background picture or control the size of the background cache.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer81</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>4</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer80</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>4</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m_buttonGetNew</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Get New Wallpapers</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click this button to give you a list of new wallpapers to download from the Internet.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer81</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>4</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>m_lblWallpaperPos</cstring>
+ </property>
+ <property name="text">
+ <string>Posi&amp;tion:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_comboWallpaperPos</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;You can choose here how a background picture is shown on the desktop:
+&lt;ul&gt;
+&lt;li&gt;&lt;em&gt;Centered:&lt;/em&gt; Center the picture on the desktop.&lt;/li&gt;
+ &lt;li&gt;&lt;em&gt;Tiled:&lt;/em&gt; Tile the picture beginning at the top left of the desktop, so the desktop is totally covered up.&lt;/li&gt;
+&lt;li&gt;&lt;em&gt;Center Tiled:&lt;/em&gt; Center the picture on the desktop and then tile around it so that the background is totally covered up.&lt;/li&gt;
+&lt;li&gt;&lt;em&gt;Centered Maxpect:&lt;/em&gt; Magnify the picture without distorting it until it fills either the width or height of the desktop, and then center it on the desktop.&lt;/li&gt;
+&lt;li&gt;&lt;em&gt;Scaled:&lt;/em&gt; Magnify the picture, until the entire desktop is covered. This may result in some distortion of the picture.&lt;/li&gt;
+&lt;li&gt;&lt;em&gt;Centered Auto Fit:&lt;/em&gt; If the picture fits the desktop this mode works like the Centered option. If the picture is larger than the desktop it is scaled down to fit while keeping the aspect ratio.&lt;/li&gt;
+&lt;li&gt;&lt;em&gt;Scale and Crop:&lt;/em&gt; Magnify the picture without distorting it until it fills both the width and height of the desktop (cropping the picture if necessary), and then center it on the desktop.&lt;/li&gt;
+&lt;/ul&gt;&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="5" column="1">
+ <property name="name">
+ <cstring>m_comboBlend</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If you have selected to use a background picture you can choose various methods of blending the background colors with the picture. The default option of "No Blending" means that the picture simply obscures the background colors below.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="1">
+ <property name="name">
+ <cstring>layout31</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KColorButton">
+ <property name="name">
+ <cstring>m_colorPrimary</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click to choose the primary background color.</string>
+ </property>
+ </widget>
+ <widget class="KColorButton">
+ <property name="name">
+ <cstring>m_colorSecondary</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click to choose the secondary background color. If no secondary color is required by the pattern selected this button will be disabled.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>m_lblColors</cstring>
+ </property>
+ <property name="text">
+ <string>Co&amp;lors:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_comboPattern</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>m_lblBlending</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Blending:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_comboBlend</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="6" column="1">
+ <property name="name">
+ <cstring>layout23</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_lblBlendBalance</cstring>
+ </property>
+ <property name="text">
+ <string>Balance:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_sliderBlend</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>You can use this slider to control the degree of blending. You can experiment by moving the slider and looking at the effects in the preview image.</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>m_sliderBlend</cstring>
+ </property>
+ <property name="minValue">
+ <number>-20</number>
+ </property>
+ <property name="maxValue">
+ <number>20</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>NoMarks</enum>
+ </property>
+ <property name="tickInterval">
+ <number>10</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>You can use this slider to control the degree of blending. You can experiment by moving the slider and looking at the effects in the preview image.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="7" column="1">
+ <property name="name">
+ <cstring>m_cbBlendReverse</cstring>
+ </property>
+ <property name="text">
+ <string>Reverse roles</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>For some types of blending, you can reverse the role of the background and the picture by checking this option.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="1">
+ <property name="name">
+ <cstring>m_comboPattern</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer6_2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>120</width>
+ <height>10</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>spacer6_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>130</width>
+ <height>10</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>m_comboWallpaperPos</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;You can choose here how a background picture is shown on the desktop:
+&lt;ul&gt;
+&lt;li&gt;&lt;em&gt;Centered:&lt;/em&gt; Center the picture on the desktop.&lt;/li&gt;
+ &lt;li&gt;&lt;em&gt;Tiled:&lt;/em&gt; Tile the picture beginning at the top left of the desktop, so the desktop is totally covered up.&lt;/li&gt;
+&lt;li&gt;&lt;em&gt;Center Tiled:&lt;/em&gt; Center the picture on the desktop and then tile around it so that the background is totally covered up.&lt;/li&gt;
+&lt;li&gt;&lt;em&gt;Centered Maxpect:&lt;/em&gt; Magnify the picture without distorting it until it fills either the width or height of the desktop, and then center it on the desktop.&lt;/li&gt;
+&lt;li&gt;&lt;em&gt;Scaled:&lt;/em&gt; Magnify the picture, until the entire desktop is covered. This may result in some distortion of the picture.&lt;/li&gt;
+&lt;li&gt;&lt;em&gt;Centered Auto Fit:&lt;/em&gt; If the picture fits the desktop this mode works like the Centered option. If the picture is larger than the desktop it is scaled down to fit while keeping the aspect ratio.&lt;/li&gt;
+&lt;li&gt;&lt;em&gt;Scale and Crop:&lt;/em&gt; Magnify the picture without distorting it until it fills both the width and height of the desktop (cropping the picture if necessary), and then center it on the desktop.&lt;/li&gt;
+&lt;/ul&gt;&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>m_buttonGroupBackground</cstring>
+ </property>
+ <property name="title">
+ <string>Background</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>m_radioNoPicture</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;No picture</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>m_radioSlideShow</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Slide show:</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>m_radioPicture</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Picture:</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="0" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>spacer20</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>260</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>m_buttonSetupWallpapers</cstring>
+ </property>
+ <property name="text">
+ <string>Set&amp;up...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click this button to select a set of images to be used as background pictures. One picture at a time will be shown for a specified amount of time, after which another image from the set will be shown. Images can be shown at random or in the order you specify them.</string>
+ </property>
+ </widget>
+ <spacer row="2" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer19</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>110</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="1" column="3">
+ <property name="name">
+ <cstring>m_urlWallpaperButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_urlWallpaperBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>m_buttonGroupBackground</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>groupBox3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>m_comboScreen</tabstop>
+ <tabstop>m_comboDesktop</tabstop>
+ <tabstop>m_radioPicture</tabstop>
+ <tabstop>m_urlWallpaperBox</tabstop>
+ <tabstop>m_urlWallpaperButton</tabstop>
+ <tabstop>m_buttonSetupWallpapers</tabstop>
+ <tabstop>m_comboWallpaperPos</tabstop>
+ <tabstop>m_comboPattern</tabstop>
+ <tabstop>m_colorPrimary</tabstop>
+ <tabstop>m_colorSecondary</tabstop>
+ <tabstop>m_comboBlend</tabstop>
+ <tabstop>m_sliderBlend</tabstop>
+ <tabstop>m_cbBlendReverse</tabstop>
+ <tabstop>m_buttonAdvanced</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in declaration">kcolorbutton.h</include>
+ <include location="global" impldecl="in declaration">kcombobox.h</include>
+ <include location="global" impldecl="in implementation">kurlrequester.h</include>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcombobox.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/background/bghash.h b/kcontrol/background/bghash.h
new file mode 100644
index 000000000..932c6ebab
--- /dev/null
+++ b/kcontrol/background/bghash.h
@@ -0,0 +1,22 @@
+#ifndef BGHASH_H
+#define BGHASH_H
+
+/*
+ * QString -> int hash. From Qt's QGDict::hashKeyString().
+ */
+
+static int QHash(QString key)
+{
+ int g, h = 0;
+ const QChar *p = key.unicode();
+ for (unsigned i=0; i < key.length(); i++) {
+ h = (h << 4) + p[i].cell();
+ if ((g = (h & 0xf0000000)))
+ h ^= (g >> 24);
+ h &= ~g;
+ }
+ return h;
+}
+
+#endif
+
diff --git a/kcontrol/background/bgmonitor.cpp b/kcontrol/background/bgmonitor.cpp
new file mode 100644
index 000000000..6af2f7458
--- /dev/null
+++ b/kcontrol/background/bgmonitor.cpp
@@ -0,0 +1,220 @@
+/* vi: ts=8 sts=4 sw=4
+ kate: space-indent on; indent-width 4; indent-mode cstyle;
+
+ This file is part of the KDE project, module kcmbackground.
+
+ Copyright (C) 2002 Laurent Montel <montell@club-internet.fr>
+ Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
+ Copyright (C) 2005 David Saxton <david@bluehaze.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kpixmap.h>
+#include <kstandarddirs.h>
+#include <kurldrag.h>
+#include <qapplication.h>
+#include <qpixmap.h>
+#include <qwhatsthis.h>
+
+#include "bgmonitor.h"
+
+// Constants used (should they be placed somewhere?)
+// Size of monitor image: 200x186
+// Geometry of "display" part of monitor image: (23,14)-[151x115]
+
+//BEGIN class BGMonitorArrangement
+BGMonitorArrangement::BGMonitorArrangement(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ m_pBGMonitor.resize( QApplication::desktop()->numScreens(), 0l );
+
+ for (int screen = 0; screen < QApplication::desktop()->numScreens(); ++screen)
+ {
+ BGMonitorLabel * label = new BGMonitorLabel(this);
+ m_pBGMonitor[screen] = label;
+
+ connect( label->monitor(), SIGNAL(imageDropped(const QString &)), this, SIGNAL(imageDropped(const QString &)) );
+ }
+
+ parent->setFixedSize(200, 186);
+ setFixedSize(200, 186);
+ updateArrangement();
+}
+
+
+BGMonitor * BGMonitorArrangement::monitor( unsigned screen ) const
+{
+ return m_pBGMonitor[screen]->monitor();
+}
+
+
+QRect BGMonitorArrangement::expandToPreview( QRect r ) const
+{
+ double scaleX = 200.0 / 151.0;
+ double scaleY = 186.0 / 115.0;
+ return QRect( int(r.x()*scaleX), int(r.y()*scaleY), int(r.width()*scaleX), int(r.height()*scaleY) );
+}
+
+
+QSize BGMonitorArrangement::expandToPreview( QSize s ) const
+{
+ double scaleX = 200.0 / 151.0;
+ double scaleY = 186.0 / 115.0;
+ return QSize( int(s.width()*scaleX), int(s.height()*scaleY) );
+}
+
+
+QPoint BGMonitorArrangement::expandToPreview( QPoint p ) const
+{
+ double scaleX = 200.0 / 151.0;
+ double scaleY = 186.0 / 115.0;
+ return QPoint( int(p.x()*scaleX), int(p.y()*scaleY) );
+}
+
+
+void BGMonitorArrangement::updateArrangement()
+{
+ // In this function, sizes, etc have a normal value, and their "expanded"
+ // value. The expanded value is used for setting the size of the monitor
+ // image that contains the preview of the background. The monitor image
+ // will set the background preview back to the normal value.
+
+ QRect overallGeometry;
+ for (int screen = 0; screen < QApplication::desktop()->numScreens(); ++screen)
+ overallGeometry |= QApplication::desktop()->screenGeometry(screen);
+
+ QRect expandedOverallGeometry = expandToPreview(overallGeometry);
+
+ double scale = QMIN(
+ double(width()) / double(expandedOverallGeometry.width()),
+ double(height()) / double(expandedOverallGeometry.height())
+ );
+
+ m_combinedPreviewSize = overallGeometry.size() * scale;
+
+ m_maxPreviewSize = QSize(0,0);
+ int previousMax = 0;
+
+ for (int screen = 0; screen < QApplication::desktop()->numScreens(); ++screen)
+ {
+ QPoint topLeft = (QApplication::desktop()->screenGeometry(screen).topLeft() - overallGeometry.topLeft()) * scale;
+ QPoint expandedTopLeft = expandToPreview(topLeft);
+
+ QSize previewSize = QApplication::desktop()->screenGeometry(screen).size() * scale;
+ QSize expandedPreviewSize = expandToPreview(previewSize);
+
+ if ( (previewSize.width() * previewSize.height()) > previousMax )
+ {
+ previousMax = previewSize.width() * previewSize.height();
+ m_maxPreviewSize = previewSize;
+ }
+
+ m_pBGMonitor[screen]->setPreviewPosition( QRect( topLeft, previewSize ) );
+ m_pBGMonitor[screen]->setGeometry( QRect( expandedTopLeft, expandedPreviewSize ) );
+ m_pBGMonitor[screen]->updateMonitorGeometry();
+ }
+}
+
+
+void BGMonitorArrangement::resizeEvent( QResizeEvent * e )
+{
+ QWidget::resizeEvent(e);
+ updateArrangement();
+}
+
+
+void BGMonitorArrangement::setPixmap( const KPixmap & pm )
+{
+ for (unsigned screen = 0; screen < m_pBGMonitor.size(); ++screen)
+ {
+ QRect position = m_pBGMonitor[screen]->previewPosition();
+
+ QPixmap monitorPixmap( position.size(), pm.depth() );
+ copyBlt( &monitorPixmap, 0, 0, &pm, position.x(), position.y(), position.width(), position.height() );
+ m_pBGMonitor[screen]->monitor()->setPixmap(monitorPixmap);
+ }
+}
+//END class BGMonitorArrangement
+
+
+
+//BEGIN class BGMonitorLabel
+BGMonitorLabel::BGMonitorLabel(QWidget *parent, const char *name)
+ : QLabel(parent, name)
+{
+ setAlignment(AlignCenter);
+ setScaledContents(true);
+ setPixmap( QPixmap( locate("data", "kcontrol/pics/monitor.png") ) );
+ m_pBGMonitor = new BGMonitor(this);
+
+ QWhatsThis::add( this, i18n("This picture of a monitor contains a preview of what the current settings will look like on your desktop.") );
+}
+
+
+void BGMonitorLabel::updateMonitorGeometry()
+{
+ double scaleX = double(width()) / double(sizeHint().width());
+ double scaleY = double(height()) / double(sizeHint().height());
+
+ kdDebug() << k_funcinfo << " Setting geometry to " << QRect( int(23*scaleX), int(14*scaleY), int(151*scaleX), int(115*scaleY) ) << endl;
+ m_pBGMonitor->setGeometry( int(23*scaleX), int(14*scaleY), int(151*scaleX), int(115*scaleY) );
+}
+
+
+void BGMonitorLabel::resizeEvent( QResizeEvent * e )
+{
+ QWidget::resizeEvent(e);
+ updateMonitorGeometry();
+}
+//END class BGMonitorLabel
+
+
+
+//BEGIN class BGMonitor
+BGMonitor::BGMonitor(QWidget *parent, const char *name)
+ : QLabel(parent, name)
+{
+ setAlignment(AlignCenter);
+ setScaledContents(true);
+ setAcceptDrops(true);
+}
+
+
+void BGMonitor::dropEvent(QDropEvent *e)
+{
+ if (!KURLDrag::canDecode(e))
+ return;
+
+ KURL::List uris;
+ if (KURLDrag::decode(e, uris) && (uris.count() > 0)) {
+ // TODO: Download remote file
+ if (uris.first().isLocalFile())
+ emit imageDropped(uris.first().path());
+ }
+}
+
+void BGMonitor::dragEnterEvent(QDragEnterEvent *e)
+{
+ if (KURLDrag::canDecode(e))
+ e->accept(rect());
+ else
+ e->ignore(rect());
+}
+//END class BGMonitor
+
+#include "bgmonitor.moc"
diff --git a/kcontrol/background/bgmonitor.h b/kcontrol/background/bgmonitor.h
new file mode 100644
index 000000000..1e714194e
--- /dev/null
+++ b/kcontrol/background/bgmonitor.h
@@ -0,0 +1,111 @@
+/* vi: ts=8 sts=4 sw=4
+ kate: space-indent on; indent-width 4; indent-mode cstyle;
+
+ This file is part of the KDE project, module kcmbackground.
+
+ Copyright (C) 2002 Laurent Montel <montell@club-internet.fr>
+ Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
+ Copyright (C) 2005 David Saxton <david@bluehaze.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _BGMONITOR_H_
+#define _BGMONITOR_H_
+
+#include <qlabel.h>
+#include <qvaluevector.h>
+#include <qwidget.h>
+
+class BGMonitor;
+class BGMonitorLabel;
+class KPixmap;
+
+/**
+ * This class arranges and resizes a set of monitor images according to the
+ * monitor geometries.
+ */
+class BGMonitorArrangement : public QWidget
+{
+ Q_OBJECT
+public:
+ BGMonitorArrangement(QWidget *parent, const char *name=0L);
+
+ /**
+ * Splits up the pixmap according to monitor geometries and sets each
+ * BGMonitor pixmap accordingly.
+ */
+ void setPixmap( const KPixmap & pm );
+ QSize combinedPreviewSize() const { return m_combinedPreviewSize; }
+ QSize maxPreviewSize() const { return m_maxPreviewSize; }
+ unsigned numMonitors() const { return m_pBGMonitor.size(); }
+
+ BGMonitor * monitor( unsigned screen ) const;
+ void updateArrangement();
+
+signals:
+ void imageDropped(const QString &);
+
+protected:
+ virtual void resizeEvent( QResizeEvent * );
+ QRect expandToPreview( QRect r ) const;
+ QSize expandToPreview( QSize s ) const;
+ QPoint expandToPreview( QPoint p ) const;
+
+ QValueVector<BGMonitorLabel*> m_pBGMonitor;
+ QSize m_combinedPreviewSize;
+ QSize m_maxPreviewSize;
+};
+
+/**
+ * Contains a BGMonitor.
+ */
+class BGMonitorLabel : public QLabel
+{
+public:
+ BGMonitorLabel(QWidget *parent, const char *name=0L);
+
+ BGMonitor * monitor() const { return m_pBGMonitor; }
+ void updateMonitorGeometry();
+
+ void setPreviewPosition( QRect r ) { m_previewPosition = r; }
+ QRect previewPosition() const { return m_previewPosition; }
+
+protected:
+ virtual void resizeEvent( QResizeEvent * );
+ BGMonitor * m_pBGMonitor;
+ QRect m_previewPosition;
+};
+
+
+/**
+ * This class handles drops on the preview monitor.
+ */
+class BGMonitor : public QLabel
+{
+ Q_OBJECT
+public:
+ BGMonitor(QWidget *parent, const char *name=0L);
+
+signals:
+ void imageDropped(const QString &);
+
+protected:
+ virtual void dropEvent(QDropEvent *);
+ virtual void dragEnterEvent(QDragEnterEvent *);
+};
+
+
+#endif
diff --git a/kcontrol/background/bgrender.cpp b/kcontrol/background/bgrender.cpp
new file mode 100644
index 000000000..f17892dce
--- /dev/null
+++ b/kcontrol/background/bgrender.cpp
@@ -0,0 +1,1359 @@
+/* vi: ts=8 sts=4 sw=4
+ * kate: space-indent on; tab-width 8; indent-width 4; indent-mode cstyle;
+ *
+ * This file is part of the KDE project, module kdesktop.
+ * Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ *
+ * You can Freely distribute this program under the GNU Library General
+ * Public License. See the file "COPYING.LIB" for the exact licensing terms.
+ */
+
+#include <config.h>
+
+#include <time.h>
+#include <stdlib.h>
+#include <utime.h>
+
+#include <qtimer.h>
+#include <qpainter.h>
+#include <qimage.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+
+#include <dcopclient.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+#include <kimageeffect.h>
+#include <kprocess.h>
+#include <kpixmapio.h>
+#include <ktempfile.h>
+#include <kcursor.h>
+#include <kmimetype.h>
+#include <kfilemetainfo.h>
+
+#ifdef HAVE_LIBART
+#include <ksvgiconengine.h>
+#endif
+
+#include "bgdefaults.h"
+#include "bghash.h"
+#include "bgrender.h"
+
+#include <X11/Xlib.h>
+
+#include <config.h>
+
+/**** KBackgroundRenderer ****/
+
+
+KBackgroundRenderer::KBackgroundRenderer(int desk, int screen, bool drawBackgroundPerScreen, KConfig *config)
+ : KBackgroundSettings(desk, screen, drawBackgroundPerScreen, config)
+{
+ m_State = 0;
+ m_isBusyCursor = false;
+ m_enableBusyCursor = false;
+ m_pDirs = KGlobal::dirs();
+ m_rSize = m_Size = drawBackgroundPerScreen ?
+ QApplication::desktop()->screenGeometry(screen).size() : QApplication::desktop()->size();
+ m_pProc = 0L;
+ m_Tempfile = 0L;
+ m_bPreview = false;
+ m_Cached = false;
+ m_TilingEnabled = false;
+
+ m_pTimer = new QTimer(this);
+ connect(m_pTimer, SIGNAL(timeout()), SLOT(render()));
+}
+
+
+KBackgroundRenderer::~KBackgroundRenderer()
+{
+ cleanup();
+ delete m_Tempfile;
+ m_Tempfile = 0;
+}
+
+
+void KBackgroundRenderer::setSize(const QSize &size)
+{
+ m_rSize = m_Size = size;
+}
+
+/*
+ * Re-configure because the desktop has been resized.
+ */
+void KBackgroundRenderer::desktopResized()
+{
+ m_State = 0;
+ m_rSize = drawBackgroundPerScreen() ?
+ QApplication::desktop()->screenGeometry(screen()).size() : QApplication::desktop()->size();
+ if( !m_bPreview )
+ m_Size = m_rSize;
+}
+
+
+void KBackgroundRenderer::tile(QImage& dest, QRect rect, const QImage& src)
+{
+ rect &= dest.rect();
+
+ int x, y;
+ int h = rect.height(), w = rect.width();
+ int offx = rect.x(), offy = rect.y();
+ int sw = src.width(), sh = src.height();
+
+ for (y=offy; y<offy+h; y++)
+ for (x=offx; x<offx+w; x++)
+ dest.setPixel(x, y, src.pixel(x%sw, y%sh));
+}
+
+
+/*
+ * Build a command line to run the program.
+ */
+
+QString KBackgroundRenderer::buildCommand()
+{
+ QString num;
+ int pos = 0;
+
+ QString cmd;
+ if (m_bPreview)
+ cmd = previewCommand();
+ else
+ cmd = command();
+
+ if (cmd.isEmpty())
+ return QString();
+
+ while ((pos = cmd.find('%', pos)) != -1) {
+
+ if (pos == (int) (cmd.length() - 1))
+ break;
+
+ switch (cmd.at(pos+1).latin1()) {
+ case 'f':
+ createTempFile();
+ cmd.replace(pos, 2, KShellProcess::quote(m_Tempfile->name()));
+ pos += m_Tempfile->name().length() - 2;
+ break;
+
+ case 'x':
+ num.setNum(m_Size.width());
+ cmd.replace(pos, 2, num);
+ pos += num.length() - 2;
+ break;
+
+ case 'y':
+ num.setNum(m_Size.height());
+ cmd.replace(pos, 2, num);
+ pos += num.length() - 2;
+ break;
+
+ case '%':
+ cmd.replace(pos, 2, "%");
+ pos--;
+ break;
+ default:
+ ++pos; // avoid infinite loop
+ break;
+ }
+
+ }
+ return cmd;
+}
+
+
+/*
+ * Create a background tile. If the background mode is `Program',
+ * this is asynchronous.
+ */
+int KBackgroundRenderer::doBackground(bool quit)
+{
+ if (m_State & BackgroundDone)
+ return Done;
+ int bgmode = backgroundMode();
+
+ if (!enabled())
+ bgmode= Flat;
+
+ if (quit) {
+ if (bgmode == Program && m_pProc)
+ m_pProc->kill();
+ return Done;
+ }
+
+ int retval = Done;
+ QString file;
+
+ static unsigned int tileWidth = 0;
+ static unsigned int tileHeight = 0;
+ if( tileWidth == 0 )
+ {
+ int tile_val = QPixmap::defaultDepth() >= 24 ? 1 : 2;
+ // some dithering may be needed even with bpb==15/16, so don't use tileWidth==1
+ // for them
+ // with tileWidth>2, repainting the desktop causes nasty effect (XFree86 4.1.0 )
+ if( XQueryBestTile( qt_xdisplay(), qt_xrootwin(), tile_val, tile_val,
+ &tileWidth, &tileHeight ) != Success )
+ tileWidth = tileHeight = tile_val; // some defaults
+ }
+ switch (bgmode) {
+
+ case Flat:
+ // this can be tiled correctly without problems
+ m_Background.create( tileWidth, tileHeight, 32);
+ m_Background.fill(colorA().rgb());
+ break;
+
+ case Pattern:
+ {
+ if (pattern().isEmpty())
+ break;
+ file = m_pDirs->findResource("dtop_pattern", pattern());
+ if (file.isEmpty())
+ break;
+
+ m_Background.load(file);
+ if (m_Background.isNull())
+ break;
+ int w = m_Background.width();
+ int h = m_Background.height();
+ if ((w > m_Size.width()) || (h > m_Size.height())) {
+ w = QMIN(w, m_Size.width());
+ h = QMIN(h, m_Size.height());
+ m_Background = m_Background.copy(0, 0, w, h);
+ }
+ KImageEffect::flatten(m_Background, colorA(), colorB(), 0);
+ break;
+ }
+ case Program:
+ if (m_State & BackgroundStarted)
+ break;
+ m_State |= BackgroundStarted;
+ createTempFile();
+
+ file = buildCommand();
+ if (file.isEmpty())
+ break;
+
+ delete m_pProc;
+ m_pProc = new KShellProcess;
+ *m_pProc << file;
+ connect(m_pProc, SIGNAL(processExited(KProcess *)),
+ SLOT(slotBackgroundDone(KProcess *)));
+ m_pProc->start(KShellProcess::NotifyOnExit);
+ retval = Wait;
+ break;
+
+ case HorizontalGradient:
+ {
+ QSize size = m_Size;
+ // on <16bpp displays the gradient sucks when tiled because of dithering
+ if( canTile())
+ size.setHeight( tileHeight );
+ m_Background = KImageEffect::gradient(size, colorA(), colorB(),
+ KImageEffect::HorizontalGradient, 0);
+ break;
+ }
+ case VerticalGradient:
+ {
+ QSize size = m_Size;
+ // on <16bpp displays the gradient sucks when tiled because of dithering
+ if( canTile())
+ size.setWidth( tileWidth );
+ m_Background = KImageEffect::gradient(size, colorA(), colorB(),
+ KImageEffect::VerticalGradient, 0);
+ break;
+ }
+ case PyramidGradient:
+ m_Background = KImageEffect::gradient(m_Size, colorA(), colorB(),
+ KImageEffect::PyramidGradient, 0);
+ break;
+
+ case PipeCrossGradient:
+ m_Background = KImageEffect::gradient(m_Size, colorA(), colorB(),
+ KImageEffect::PipeCrossGradient, 0);
+ break;
+
+ case EllipticGradient:
+ m_Background = KImageEffect::gradient(m_Size, colorA(), colorB(),
+ KImageEffect::EllipticGradient, 0);
+ break;
+ }
+
+ if (retval == Done)
+ m_State |= BackgroundDone;
+
+ return retval;
+}
+
+
+int KBackgroundRenderer::doWallpaper(bool quit)
+{
+ if (m_State & WallpaperDone)
+ return Done;
+
+ if (quit)
+ // currently no asynch. wallpapers
+ return Done;
+
+ int wpmode= enabled()?wallpaperMode():NoWallpaper;
+
+ m_Wallpaper = QImage();
+ if (wpmode != NoWallpaper) {
+wp_load:
+ if (currentWallpaper().isEmpty()) {
+ wpmode = NoWallpaper;
+ goto wp_out;
+ }
+ QString file = m_pDirs->findResource("wallpaper", currentWallpaper());
+ if (file.isEmpty()) {
+ wpmode = NoWallpaper;
+ goto wp_out;
+ }
+
+ // _Don't_ use KMimeType, as it relies on ksycoca which we really
+ // don't want in krootimage (kdm context).
+ //if ( KMimeType::findByPath( file )->is( "image/svg+xml" ) ) {
+ if (file.endsWith(".svg") || file.endsWith(".svgz")) {
+#ifdef HAVE_LIBART
+ // Special stuff for SVG icons
+ KSVGIconEngine* svgEngine = new KSVGIconEngine();
+
+ //FIXME
+ //ksvgiconloader doesn't seem to let us find out the
+ //ratio of width to height so for the most part we just
+ //assume it's a square
+ int svgWidth;
+ int svgHeight;
+ switch (wpmode)
+ {
+ case Centred:
+ case CentredAutoFit:
+ svgHeight = (int)(m_Size.height() * 0.8);
+ svgWidth = svgHeight;
+ break;
+ case Tiled:
+ case CenterTiled:
+ svgHeight = (int)(m_Size.height() * 0.5);
+ svgWidth = svgHeight;
+ break;
+ case Scaled:
+ svgHeight = m_Size.height();
+ svgWidth = m_Size.width();
+ break;
+ case CentredMaxpect:
+ case ScaleAndCrop:
+ case TiledMaxpect:
+ svgHeight = m_Size.height();
+ svgWidth = svgHeight;
+ break;
+ case NoWallpaper:
+ default:
+ kdWarning() << k_funcinfo << "unknown diagram type" << endl;
+ svgHeight = m_Size.height();
+ svgWidth = svgHeight;
+ break;
+ }
+ //FIXME hack due to strangeness with
+ //background control modules
+ if ( svgHeight < 200 ) {
+ svgHeight *= 6;
+ svgWidth *= 6;
+ }
+
+ if (svgEngine->load(svgWidth, svgHeight, file )) {
+ QImage *image = svgEngine->image();
+ m_Wallpaper = *image;
+ delete image;
+ } else {
+ kdWarning() << "failed to load SVG file " << file << endl;
+ }
+
+ delete svgEngine;
+#else //not libart
+ kdWarning() << k_funcinfo
+ << "tried to load SVG file but libart not installed" << endl;
+#endif
+ } else {
+ m_Wallpaper.load(file);
+ }
+ if (m_Wallpaper.isNull()) {
+ if (discardCurrentWallpaper())
+ goto wp_load;
+ wpmode = NoWallpaper;
+ goto wp_out;
+ }
+ m_Wallpaper = m_Wallpaper.convertDepth(32, DiffuseAlphaDither);
+
+ // If we're previewing, scale the wallpaper down to make the preview
+ // look more like the real desktop.
+ if (m_bPreview) {
+ int xs = m_Wallpaper.width() * m_Size.width() / m_rSize.width();
+ int ys = m_Wallpaper.height() * m_Size.height() / m_rSize.height();
+ if ((xs < 1) || (ys < 1))
+ {
+ xs = ys = 1;
+ }
+ if( m_Wallpaper.size() != QSize( xs, ys ))
+ m_Wallpaper = m_Wallpaper.smoothScale(xs, ys);
+ }
+
+ // HACK: Use KFileMetaInfo only when we're attached to DCOP.
+ // KFileMetaInfo needs ksycoca and so on, but this code is
+ // used also in krootimage (which in turn is used by kdm).
+ if( kapp->dcopClient()->isAttached()) {
+ KFileMetaInfo metaInfo(file);
+ if (metaInfo.isValid() && metaInfo.item("Orientation").isValid()) {
+ switch (metaInfo.item("Orientation").string().toInt()) {
+ case 2:
+ // Flipped horizontally
+ m_Wallpaper = m_Wallpaper.mirror(true, false);
+ break;
+ case 3:
+ // Rotated 180 degrees
+ m_Wallpaper = KImageEffect::rotate(m_Wallpaper, KImageEffect::Rotate180);
+ break;
+ case 4:
+ // Flipped vertically
+ m_Wallpaper = m_Wallpaper.mirror(false, true);
+ break;
+ case 5:
+ // Rotated 90 degrees & flipped horizontally
+ m_Wallpaper = KImageEffect::rotate(m_Wallpaper, KImageEffect::Rotate90).mirror(true, false);
+ break;
+ case 6:
+ // Rotated 90 degrees
+ m_Wallpaper = KImageEffect::rotate(m_Wallpaper, KImageEffect::Rotate90);
+ break;
+ case 7:
+ // Rotated 90 degrees & flipped vertically
+ m_Wallpaper = KImageEffect::rotate(m_Wallpaper, KImageEffect::Rotate90).mirror(false, true);
+ break;
+ case 8:
+ // Rotated 270 degrees
+ m_Wallpaper = KImageEffect::rotate(m_Wallpaper, KImageEffect::Rotate270);
+ break;
+ case 1:
+ default:
+ // Normal or invalid orientation
+ break;
+ }
+ }
+ }
+ }
+wp_out:
+
+ if (m_Background.isNull()) {
+ m_Background.create(8, 8, 32);
+ m_Background.fill(colorA().rgb());
+ }
+
+ int retval = Done;
+
+ int w = m_Size.width(); // desktop width/height
+ int h = m_Size.height();
+
+ int ww = m_Wallpaper.width(); // wallpaper width/height
+ int wh = m_Wallpaper.height();
+
+ m_WallpaperRect = QRect(); // to be filled destination rectangle; may exceed desktop!
+
+ switch (wpmode)
+ {
+ case NoWallpaper:
+ break;
+ case Centred:
+ m_WallpaperRect.setRect((w - ww) / 2, (h - wh) / 2, ww, wh);
+ break;
+ case Tiled:
+ m_WallpaperRect.setRect(0, 0, w, h);
+ break;
+ case CenterTiled:
+ m_WallpaperRect.setCoords(-ww + ((w - ww) / 2) % ww, -wh + ((h - wh) / 2) % wh, w-1, h-1);
+ break;
+ case Scaled:
+ ww = w;
+ wh = h;
+ if( m_WallpaperRect.size() != QSize( w, h ))
+ m_Wallpaper = m_Wallpaper.smoothScale( w, h );
+ m_WallpaperRect.setRect(0, 0, w, h);
+ break;
+ case CentredAutoFit:
+ if( ww <= w && wh <= h ) {
+ m_WallpaperRect.setRect((w - ww) / 2, (h - wh) / 2, ww, wh); // like Centred
+ break;
+ }
+ // fall through
+ case CentredMaxpect:
+ {
+ double sx = (double) w / ww;
+ double sy = (double) h / wh;
+ if (sx > sy) {
+ ww = (int)(sy * ww);
+ wh = h;
+ } else {
+ wh = (int)(sx * wh);
+ ww = w;
+ }
+ if( m_WallpaperRect.size() != QSize( ww, wh ))
+ m_Wallpaper = m_Wallpaper.smoothScale(ww, wh);
+ m_WallpaperRect.setRect((w - ww) / 2, (h - wh) / 2, ww, wh);
+ break;
+ }
+ case TiledMaxpect:
+ {
+ double sx = (double) w / ww;
+ double sy = (double) h / wh;
+ if (sx > sy) {
+ ww = (int)(sy * ww);
+ wh = h;
+ } else {
+ wh = (int)(sx * wh);
+ ww = w;
+ }
+ if( m_WallpaperRect.size() != QSize( ww, wh ))
+ m_Wallpaper = m_Wallpaper.smoothScale(ww, wh);
+ m_WallpaperRect.setRect(0, 0, w, h);
+ break;
+ }
+ case ScaleAndCrop:
+ {
+ double sx = (double) w / ww;
+ double sy = (double) h / wh;
+ if (sx > sy) {
+ //Case 1: x needs bigger scaling. Lets increase x and leave part of y offscreen
+ ww = w;
+ wh=(int)(sx * wh);
+ } else {
+ //Case 2: y needs bigger scaling. Lets increase y and leave part of x offscreen
+ wh = h;
+ ww = (int)(sy*ww);
+ }
+ if( m_WallpaperRect.size() != QSize( ww, wh ))
+ m_Wallpaper = m_Wallpaper.smoothScale(ww, wh);
+ m_WallpaperRect.setRect((w - ww) / 2, (h - wh) / 2,w, h);
+ break;
+ }
+ }
+
+ wallpaperBlend();
+
+ if (retval == Done)
+ m_State |= WallpaperDone;
+
+ return retval;
+}
+
+bool KBackgroundRenderer::canTile() const
+{
+ return m_TilingEnabled && optimize();
+}
+
+extern bool qt_use_xrender; // in Qt ( qapplication_x11.cpp )
+
+void KBackgroundRenderer::wallpaperBlend()
+{
+ if( !enabled() || wallpaperMode() == NoWallpaper
+ || (blendMode() == NoBlending && ( qt_use_xrender || !m_Wallpaper.hasAlphaBuffer()))) {
+ fastWallpaperBlend();
+ }
+ else {
+ fullWallpaperBlend();
+ }
+}
+
+// works only for NoBlending and no alpha in wallpaper
+// but is much faster than QImage fidling
+void KBackgroundRenderer::fastWallpaperBlend()
+{
+ m_Image = QImage();
+ // copy background to m_pPixmap
+ if( !enabled() || (wallpaperMode() == NoWallpaper && canTile())) {
+ // if there's no wallpaper, no need to tile the pixmap to the size of desktop, as X does
+ // that automatically and using a smaller pixmap should save some memory
+ m_Pixmap.convertFromImage( m_Background );
+ return;
+ }
+ else if( wallpaperMode() == Tiled && !m_Wallpaper.hasAlphaBuffer() && canTile() && !m_bPreview ) {
+ // tiles will be tiled by X automatically
+ if( useShm()) {
+ KPixmapIO io;
+ m_Pixmap = io.convertToPixmap( m_Wallpaper );
+ }
+ else
+ m_Pixmap.convertFromImage( m_Wallpaper );
+ return;
+ }
+ else if( m_WallpaperRect.contains( QRect( QPoint( 0, 0 ), m_Size ))
+ && !m_Wallpaper.hasAlphaBuffer()) // wallpaper covers all and no blending
+ m_Pixmap = QPixmap( m_Size );
+ else if (m_Background.size() == m_Size)
+ m_Pixmap.convertFromImage( m_Background );
+ else {
+ m_Pixmap = QPixmap( m_Size );
+ QPainter p( &m_Pixmap );
+ QPixmap pm;
+ pm.convertFromImage( m_Background );
+ p.drawTiledPixmap( 0, 0, m_Size.width(), m_Size.height(), pm );
+ }
+
+ // paint/alpha-blend wallpaper to destination rectangle of m_pPixmap
+ if (m_WallpaperRect.isValid()) {
+ QPixmap wp_pixmap;
+ if( useShm() && !m_Wallpaper.hasAlphaBuffer()) {
+ KPixmapIO io;
+ wp_pixmap = io.convertToPixmap( m_Wallpaper );
+ }
+ else
+ wp_pixmap.convertFromImage( m_Wallpaper );
+ int ww = m_Wallpaper.width();
+ int wh = m_Wallpaper.height();
+ for (int y = m_WallpaperRect.top(); y < m_WallpaperRect.bottom(); y += wh) {
+ for (int x = m_WallpaperRect.left(); x < m_WallpaperRect.right(); x += ww) {
+ bitBlt( &m_Pixmap, x, y, &wp_pixmap, 0, 0, ww, wh );
+ }
+ }
+ }
+}
+
+
+void KBackgroundRenderer::fullWallpaperBlend()
+{
+ m_Pixmap = QPixmap();
+ int w = m_Size.width(); // desktop width/height
+ int h = m_Size.height();
+ // copy background to m_pImage
+ if (m_Background.size() == m_Size) {
+ m_Image = m_Background.copy();
+
+ if (m_Image.depth() < 32)
+ m_Image = m_Image.convertDepth(32, DiffuseAlphaDither);
+
+ } else {
+ m_Image.create(w, h, 32);
+ tile(m_Image, QRect(0, 0, w, h), m_Background);
+ }
+
+ // blend wallpaper to destination rectangle of m_pImage
+ if (m_WallpaperRect.isValid())
+ {
+ int blendFactor = 100;
+ if (blendMode() == FlatBlending)
+ blendFactor = (blendBalance()+200)/4;
+ int ww = m_Wallpaper.width();
+ int wh = m_Wallpaper.height();
+ for (int y = m_WallpaperRect.top(); y < m_WallpaperRect.bottom(); y += wh) {
+ for (int x = m_WallpaperRect.left(); x < m_WallpaperRect.right(); x += ww) {
+ blend(m_Image, QRect(x, y, ww, wh), m_Wallpaper,
+ QPoint(-QMIN(x, 0), -QMIN(y, 0)), blendFactor);
+ }
+ }
+ }
+
+
+ // blend whole desktop
+ if ( wallpaperMode() != NoWallpaper) {
+ int bal = blendBalance();
+
+ switch( blendMode() ) {
+ case HorizontalBlending:
+ KImageEffect::blend( m_Image, m_Background,
+ KImageEffect::HorizontalGradient,
+ bal, 100 );
+ break;
+
+ case VerticalBlending:
+ KImageEffect::blend( m_Image, m_Background,
+ KImageEffect::VerticalGradient,
+ 100, bal );
+ break;
+
+ case PyramidBlending:
+ KImageEffect::blend( m_Image, m_Background,
+ KImageEffect::PyramidGradient,
+ bal, bal );
+ break;
+
+ case PipeCrossBlending:
+ KImageEffect::blend( m_Image, m_Background,
+ KImageEffect::PipeCrossGradient,
+ bal, bal );
+ break;
+
+ case EllipticBlending:
+ KImageEffect::blend( m_Image, m_Background,
+ KImageEffect::EllipticGradient,
+ bal, bal );
+ break;
+
+ case IntensityBlending:
+ KImageEffect::modulate( m_Image, m_Background, reverseBlending(),
+ KImageEffect::Intensity, bal, KImageEffect::All );
+ break;
+
+ case SaturateBlending:
+ KImageEffect::modulate( m_Image, m_Background, reverseBlending(),
+ KImageEffect::Saturation, bal, KImageEffect::Gray );
+ break;
+
+ case ContrastBlending:
+ KImageEffect::modulate( m_Image, m_Background, reverseBlending(),
+ KImageEffect::Contrast, bal, KImageEffect::All );
+ break;
+
+ case HueShiftBlending:
+ KImageEffect::modulate( m_Image, m_Background, reverseBlending(),
+ KImageEffect::HueShift, bal, KImageEffect::Gray );
+ break;
+
+ case FlatBlending:
+ // Already handled
+ break;
+ }
+ }
+}
+
+/* Alpha blend an area from <src> with offset <soffs> to rectangle <dr> of <dst>
+ * Default offset is QPoint(0, 0).
+ * blendfactor = [0, 100%]
+ */
+void KBackgroundRenderer::blend(QImage& dst, QRect dr, const QImage& src, QPoint soffs, int blendFactor)
+{
+ int x, y, a;
+ dr &= dst.rect();
+
+ for (y = 0; y < dr.height(); y++) {
+ if (dst.scanLine(dr.y() + y) && src.scanLine(soffs.y() + y)) {
+ QRgb *b, *d;
+ for (x = 0; x < dr.width(); x++) {
+ b = reinterpret_cast<QRgb*>(dst.scanLine(dr.y() + y)
+ + (dr.x() + x) * sizeof(QRgb));
+ d = reinterpret_cast<QRgb*>(src.scanLine(soffs.y() + y)
+ + (soffs.x() + x) * sizeof(QRgb));
+ a = (qAlpha(*d) * blendFactor) / 100;
+ *b = qRgb(qRed(*b) - (((qRed(*b) - qRed(*d)) * a) >> 8),
+ qGreen(*b) - (((qGreen(*b) - qGreen(*d)) * a) >> 8),
+ qBlue(*b) - (((qBlue(*b) - qBlue(*d)) * a) >> 8));
+ }
+ }
+ }
+}
+
+
+
+void KBackgroundRenderer::slotBackgroundDone(KProcess *process)
+{
+ Q_ASSERT(process == m_pProc);
+ m_State |= BackgroundDone;
+
+ if (m_pProc->normalExit() && !m_pProc->exitStatus()) {
+ m_Background.load(m_Tempfile->name());
+ m_State |= BackgroundDone;
+ }
+
+ m_Tempfile->unlink();
+ delete m_Tempfile; m_Tempfile = 0;
+ m_pTimer->start(0, true);
+ setBusyCursor(false);
+}
+
+
+
+/*
+ * Starts the rendering process.
+ */
+void KBackgroundRenderer::start(bool enableBusyCursor)
+{
+ m_enableBusyCursor = enableBusyCursor;
+ setBusyCursor(true);
+
+ m_Cached = false;
+
+ m_State = Rendering;
+ m_pTimer->start(0, true);
+}
+
+
+/*
+ * This slot is connected to a timer event. It is called repeatedly until
+ * the rendering is done.
+ */
+void KBackgroundRenderer::render()
+{
+ setBusyCursor(true);
+ if (!(m_State & Rendering))
+ return;
+
+ if( !(m_State & InitCheck)) {
+ QString f = cacheFileName();
+ if( useCacheFile()) {
+ QString w = m_pDirs->findResource("wallpaper", currentWallpaper());
+ QFileInfo wi( w );
+ QFileInfo fi( f );
+ if( wi.lastModified().isValid() && fi.lastModified().isValid()
+ && wi.lastModified() < fi.lastModified()) {
+ QImage im;
+ if( im.load( f, "PNG" )) {
+ m_Image = im;
+ m_Pixmap = QPixmap( m_Size );
+ m_Pixmap.convertFromImage( m_Image );
+ m_Cached = true;
+ m_State |= InitCheck | BackgroundDone | WallpaperDone;
+ }
+ }
+ }
+ m_pTimer->start(0, true);
+ m_State |= InitCheck;
+ return;
+ }
+
+ int ret;
+
+ if (!(m_State & BackgroundDone)) {
+ ret = doBackground();
+ if (ret != Wait)
+ m_pTimer->start(0, true);
+ return;
+ }
+
+ // No async wallpaper
+ doWallpaper();
+
+ done();
+ setBusyCursor(false);
+}
+
+
+/*
+ * Rendering is finished.
+ */
+void KBackgroundRenderer::done()
+{
+ setBusyCursor(false);
+ m_State |= AllDone;
+ emit imageDone(desk(), screen());
+ if(backgroundMode() == Program && m_pProc &&
+ m_pProc->normalExit() && m_pProc->exitStatus()) {
+ emit programFailure(desk(), m_pProc->exitStatus());
+ } else if(backgroundMode() == Program && m_pProc &&
+ !m_pProc->normalExit()) {
+ emit programFailure(desk(), -1);
+ } else if(backgroundMode() == Program) {
+ emit programSuccess(desk());
+ }
+
+}
+
+/*
+ * This function toggles a busy cursor on and off, for use in rendering.
+ * It is useful because of the ASYNC nature of the rendering - it is hard
+ * to make sure we don't set the busy cursor twice, but only restore
+ * once.
+ */
+void KBackgroundRenderer::setBusyCursor(bool isBusy) {
+ if(m_isBusyCursor == isBusy)
+ return;
+ if (isBusy && !m_enableBusyCursor)
+ return;
+ m_isBusyCursor = isBusy;
+ if(isBusy)
+ QApplication::setOverrideCursor( KCursor::workingCursor() );
+ else
+ QApplication::restoreOverrideCursor();
+}
+
+/*
+ * Stop the rendering.
+ */
+void KBackgroundRenderer::stop()
+{
+ if (!(m_State & Rendering))
+ return;
+
+ doBackground(true);
+ doWallpaper(true);
+ m_State = 0;
+}
+
+
+/*
+ * Cleanup after rendering.
+ */
+void KBackgroundRenderer::cleanup()
+{
+ setBusyCursor(false);
+ m_Background = QImage();
+ m_Image = QImage();
+ m_Pixmap = QPixmap();
+ m_Wallpaper = QImage();
+ delete m_pProc; m_pProc = 0L;
+ m_State = 0;
+ m_WallpaperRect = QRect();
+ m_Cached = false;
+}
+
+
+void KBackgroundRenderer::setPreview(const QSize &size)
+{
+ if (size.isNull())
+ m_bPreview = false;
+ else {
+ m_bPreview = true;
+ m_Size = size;
+ }
+}
+
+
+QPixmap KBackgroundRenderer::pixmap()
+{
+ if (m_State & AllDone) {
+ if( m_Pixmap.isNull())
+ m_Pixmap.convertFromImage( m_Image );
+ return m_Pixmap;
+ }
+ return QPixmap();
+}
+
+QImage KBackgroundRenderer::image()
+{
+ if (m_State & AllDone) {
+ if( m_Image.isNull())
+ fullWallpaperBlend(); // create from m_Pixmap
+ return m_Image;
+ }
+ return QImage();
+}
+
+
+void KBackgroundRenderer::load(int desk, int screen, bool drawBackgroundPerScreen, bool reparseConfig)
+{
+ if (m_State & Rendering)
+ stop();
+
+ cleanup();
+ m_bPreview = false;
+ m_Size = m_rSize;
+
+ KBackgroundSettings::load(desk, screen, drawBackgroundPerScreen, reparseConfig);
+}
+
+void KBackgroundRenderer::createTempFile()
+{
+ if( !m_Tempfile )
+ m_Tempfile = new KTempFile();
+}
+
+QString KBackgroundRenderer::cacheFileName()
+{
+ QString f = fingerprint();
+ f.replace ( ':', '_' ); // avoid characters that shouldn't be in filenames
+ f.replace ( '/', '#' );
+ f = locateLocal( "cache", QString( "background/%1x%2_%3.png" )
+ .arg( m_Size.width()).arg( m_Size.height()).arg( f ));
+ return f;
+}
+
+bool KBackgroundRenderer::useCacheFile() const
+{
+ if( !enabled())
+ return false;
+ if( backgroundMode() == Program )
+ return false; // don't cache these at all
+ if( wallpaperMode() == NoWallpaper )
+ return false; // generating only background patterns should be always faster
+ QString file = currentWallpaper();
+ if( file.endsWith(".svg") || file.endsWith(".svgz"))
+ return true; // cache these, they can be bloody slow
+ switch( backgroundMode())
+ {
+ case NoWallpaper:
+ case Centred:
+ case Tiled:
+ case CenterTiled:
+ return false; // these don't need scaling
+ case CentredMaxpect:
+ case TiledMaxpect:
+ case Scaled:
+ case CentredAutoFit:
+ case ScaleAndCrop:
+ default:
+ return true;
+ }
+}
+
+void KBackgroundRenderer::saveCacheFile()
+{
+ if( !( m_State & AllDone ))
+ return;
+ if( !useCacheFile())
+ return;
+ if( m_Image.isNull())
+ fullWallpaperBlend(); // generate from m_Pixmap
+ QString f = cacheFileName();
+ if( KStandardDirs::exists( f ) || m_Cached )
+ utime( QFile::encodeName( f ), NULL );
+ else {
+ m_Image.save( f, "PNG" );
+ // remove old entries from the cache
+ QDir dir( locateLocal( "cache", "background/" ));
+ if( const QFileInfoList* list = dir.entryInfoList( "*.png", QDir::Files, QDir::Time | QDir::Reversed )) {
+ int size = 0;
+ for( QFileInfoListIterator it( *list );
+ QFileInfo* info = it.current();
+ ++it )
+ size += info->size();
+ for( QFileInfoListIterator it( *list );
+ QFileInfo* info = it.current();
+ ++it ) {
+ if( size < 8 * 1024 * 1024 )
+ break;
+ // keep everything newer than 10 minutes if the total size is less than 50M (just in case)
+ if( size < 50 * 1024 * 1024
+ && ( time_t ) info->lastModified().toTime_t() >= time( NULL ) - 10 * 60 )
+ break;
+ size -= info->size();
+ QFile::remove( info->absFilePath());
+ }
+ }
+ }
+}
+
+//BEGIN class KVirtualBGRenderer
+KVirtualBGRenderer::KVirtualBGRenderer( int desk, KConfig *config )
+{
+ m_pPixmap = 0l;
+ m_desk = desk;
+ m_numRenderers = 0;
+ m_scaleX = 1;
+ m_scaleY = 1;
+
+ // The following code is borrowed from KBackgroundSettings::KBackgroundSettings
+ if (!config) {
+ int screen_number = 0;
+ if (qt_xdisplay())
+ screen_number = DefaultScreen(qt_xdisplay());
+ QCString configname;
+ if (screen_number == 0)
+ configname = "kdesktoprc";
+ else
+ configname.sprintf("kdesktop-screen-%drc", screen_number);
+
+ m_pConfig = new KConfig(configname, false, false);
+ m_bDeleteConfig = true;
+ } else {
+ m_pConfig = config;
+ m_bDeleteConfig = false;
+ }
+
+ initRenderers();
+ m_size = QApplication::desktop()->size();
+}
+
+KVirtualBGRenderer::~KVirtualBGRenderer()
+{
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ delete m_renderer[i];
+
+ delete m_pPixmap;
+
+ if (m_bDeleteConfig)
+ delete m_pConfig;
+}
+
+
+KBackgroundRenderer * KVirtualBGRenderer::renderer(unsigned screen)
+{
+ return m_renderer[screen];
+}
+
+
+QPixmap KVirtualBGRenderer::pixmap()
+{
+ if (m_numRenderers == 1)
+ return m_renderer[0]->pixmap();
+
+ return *m_pPixmap;
+}
+
+
+bool KVirtualBGRenderer::needProgramUpdate()
+{
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ {
+ if ( m_renderer[i]->backgroundMode() == KBackgroundSettings::Program &&
+ m_renderer[i]->KBackgroundProgram::needUpdate() )
+ return true;
+ }
+ return false;
+}
+
+
+void KVirtualBGRenderer::programUpdate()
+{
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ {
+ if ( m_renderer[i]->backgroundMode() == KBackgroundSettings::Program &&
+ m_renderer[i]->KBackgroundProgram::needUpdate() )
+ {
+ m_renderer[i]->KBackgroundProgram::update();
+ }
+ }
+}
+
+
+bool KVirtualBGRenderer::needWallpaperChange()
+{
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ {
+ if ( m_renderer[i]->needWallpaperChange() )
+ return true;
+ }
+ return false;
+}
+
+
+void KVirtualBGRenderer::changeWallpaper()
+{
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ {
+ m_renderer[i]->changeWallpaper();
+ }
+}
+
+
+int KVirtualBGRenderer::hash()
+{
+ QString fp;
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ {
+ fp += m_renderer[i]->fingerprint();
+ }
+ //kdDebug() << k_funcinfo << " fp=\""<<fp<<"\" h="<<QHash(fp)<<endl;
+ return QHash(fp);
+}
+
+
+bool KVirtualBGRenderer::isActive()
+{
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ {
+ if ( m_renderer[i]->isActive() )
+ return true;
+ }
+ return false;
+}
+
+
+void KVirtualBGRenderer::setEnabled(bool enable)
+{
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ m_renderer[i]->setEnabled(enable);
+}
+
+
+void KVirtualBGRenderer::desktopResized()
+{
+ m_size = QApplication::desktop()->size();
+
+ if (m_pPixmap)
+ {
+ delete m_pPixmap;
+ m_pPixmap = new QPixmap(m_size);
+ m_pPixmap->fill(Qt::black);
+ }
+
+ initRenderers();
+}
+
+
+void KVirtualBGRenderer::setPreview(const QSize & size)
+{
+ if (m_size == size)
+ return;
+
+ m_size = size;
+
+ if (m_pPixmap)
+ m_pPixmap->resize(m_size);
+
+ // Scaling factors
+ m_scaleX = float(m_size.width()) / float(QApplication::desktop()->size().width());
+ m_scaleY = float(m_size.height()) / float(QApplication::desktop()->size().height());
+
+ // Scale renderers appropriately
+ for (unsigned i=0; i<m_renderer.size(); ++i)
+ {
+ QSize unscaledRendererSize = renderSize(i);
+
+ m_renderer[i]->setPreview( QSize(
+ int(unscaledRendererSize.width() * m_scaleX),
+ int(unscaledRendererSize.height() * m_scaleY) ) );
+ }
+}
+
+
+QSize KVirtualBGRenderer::renderSize(int screen)
+{
+ return m_bDrawBackgroundPerScreen ?
+ QApplication::desktop()->screenGeometry(screen).size() : QApplication::desktop()->size();
+}
+
+
+void KVirtualBGRenderer::initRenderers()
+{
+ m_pConfig->setGroup("Background Common");
+ m_bDrawBackgroundPerScreen = m_pConfig->readBoolEntry( QString("DrawBackgroundPerScreen_%1").arg(m_desk), _defDrawBackgroundPerScreen );
+
+ m_bCommonScreen = m_pConfig->readBoolEntry("CommonScreen", _defCommonScreen);
+
+ m_numRenderers = m_bDrawBackgroundPerScreen ? QApplication::desktop()->numScreens() : 1;
+
+ m_bFinished.resize(m_numRenderers);
+ m_bFinished.fill(false);
+
+ if (m_numRenderers == m_renderer.size())
+ return;
+
+ for (unsigned i=0; i<m_renderer.size(); ++i)
+ delete m_renderer[i];
+
+ m_renderer.resize(m_numRenderers);
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ {
+ int eScreen = m_bCommonScreen ? 0 : i;
+ KBackgroundRenderer * r = new KBackgroundRenderer( m_desk, eScreen, m_bDrawBackgroundPerScreen, m_pConfig );
+ m_renderer.insert( i, r );
+ r->setSize(renderSize(i));
+ connect( r, SIGNAL(imageDone(int,int)), this, SLOT(screenDone(int,int)) );
+ }
+}
+
+
+void KVirtualBGRenderer::load(int desk, bool reparseConfig)
+{
+ m_desk = desk;
+
+ m_pConfig->setGroup("Background Common");
+ m_bCommonScreen = m_pConfig->readBoolEntry("CommonScreen", _defCommonScreen);
+
+ initRenderers();
+
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ {
+ unsigned eScreen = m_bCommonScreen ? 0 : i;
+ m_renderer[i]->load(desk, eScreen, m_bDrawBackgroundPerScreen, reparseConfig);
+ }
+}
+
+
+void KVirtualBGRenderer::screenDone(int _desk, int _screen)
+{
+ Q_UNUSED(_desk);
+ Q_UNUSED(_screen);
+
+ const KBackgroundRenderer * sender = dynamic_cast<const KBackgroundRenderer*>(this->sender());
+ int screen = m_renderer.find(sender);
+ if (screen == -1)
+ //??
+ return;
+
+ m_bFinished[screen] = true;
+
+
+ if (m_pPixmap)
+ {
+ // There's more than one renderer, so we are drawing each output to our own pixmap
+
+ QRect overallGeometry;
+ for (int i=0; i < QApplication::desktop()->numScreens(); ++i)
+ overallGeometry |= QApplication::desktop()->screenGeometry(i);
+
+ QPoint drawPos = QApplication::desktop()->screenGeometry(screen).topLeft() - overallGeometry.topLeft();
+ drawPos.setX( int(drawPos.x() * m_scaleX) );
+ drawPos.setY( int(drawPos.y() * m_scaleY) );
+
+ QPixmap source = m_renderer[screen]->pixmap();
+ QSize renderSize = this->renderSize(screen);
+ renderSize.setWidth( int(renderSize.width() * m_scaleX) );
+ renderSize.setHeight( int(renderSize.height() * m_scaleY) );
+
+ QPainter p(m_pPixmap);
+
+ if (renderSize == source.size())
+ p.drawPixmap( drawPos, source );
+
+ else
+ p.drawTiledPixmap( drawPos.x(), drawPos.y(), renderSize.width(), renderSize.height(), source );
+
+ p.end();
+ }
+
+ for (unsigned i=0; i<m_bFinished.size(); ++i)
+ {
+ if (!m_bFinished[i])
+ return;
+ }
+
+ emit imageDone(m_desk);
+}
+
+
+void KVirtualBGRenderer::start()
+{
+ if (m_pPixmap)
+ {
+ delete m_pPixmap;
+ m_pPixmap = 0l;
+ }
+
+ if (m_numRenderers > 1)
+ {
+ m_pPixmap = new QPixmap(m_size);
+ // If are screen sizes do not properly tile the overall virtual screen
+ // size, then we want the untiled parts to be black for use in desktop
+ // previews, etc
+ m_pPixmap->fill(Qt::black);
+ }
+
+ m_bFinished.fill(false);
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ m_renderer[i]->start();
+}
+
+
+void KVirtualBGRenderer::stop()
+{
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ m_renderer[i]->stop();
+}
+
+
+void KVirtualBGRenderer::cleanup()
+{
+ m_bFinished.fill(false);
+
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ m_renderer[i]->cleanup();
+
+ delete m_pPixmap;
+ m_pPixmap = 0l;
+}
+
+void KVirtualBGRenderer::saveCacheFile()
+{
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ m_renderer[i]->saveCacheFile();
+}
+
+void KVirtualBGRenderer::enableTiling( bool enable )
+{
+ for (unsigned i=0; i<m_numRenderers; ++i)
+ m_renderer[i]->enableTiling( enable );
+}
+
+//END class KVirtualBGRenderer
+
+
+#include "bgrender.moc"
diff --git a/kcontrol/background/bgrender.h b/kcontrol/background/bgrender.h
new file mode 100644
index 000000000..39e00ff5d
--- /dev/null
+++ b/kcontrol/background/bgrender.h
@@ -0,0 +1,182 @@
+/* vi: ts=8 sts=4 sw=4
+ * kate: space-indent on; tab-width 8; indent-width 4; indent-mode cstyle;
+ *
+ * This file is part of the KDE project, module kdesktop.
+ * Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ *
+ * You can Freely distribute this program under the GNU Library General
+ * Public License. See the file "COPYING.LIB" for the exact licensing terms.
+ */
+
+#ifndef BGRender_h_Included
+#define BGRender_h_Included
+
+#include <qobject.h>
+#include <qptrvector.h>
+#include <qimage.h>
+#include <qpixmap.h>
+
+#include "bgsettings.h"
+
+class QSize;
+class QRect;
+class QString;
+class QTimer;
+
+class KConfig;
+class KProcess;
+class KTempFile;
+class KShellProcess;
+class KStandardDirs;
+
+/**
+ * This class renders a desktop background to a QImage. The operation is
+ * asynchronous: connect to the signal imageDone() to find out when the
+ * rendering is finished. It also has support for preview images, like
+ * the monitor in kcmdisplay.
+ */
+class KBackgroundRenderer:
+ public QObject,
+ public KBackgroundSettings
+{
+ Q_OBJECT
+
+public:
+ KBackgroundRenderer(int desk, int screen, bool drawBackgroundPerScreen, KConfig *config=0);
+ ~KBackgroundRenderer();
+
+ void load(int desk, int screen, bool drawBackgroundPerScreen, bool reparseConfig=true);
+
+ void setPreview(const QSize &size);
+ void setSize(const QSize &size);
+
+ QPixmap pixmap();
+ QImage image();
+ bool isActive() { return m_State & Rendering; }
+ void cleanup();
+ void saveCacheFile();
+ void enableTiling( bool enable ) { m_TilingEnabled = enable; }
+
+public slots:
+ void start(bool enableBusyCursor = false);
+ void stop();
+ void desktopResized();
+
+signals:
+ void imageDone(int desk, int screen);
+ void programFailure(int desk, int exitstatus); //Guaranteed either programFailure or
+ void programSuccess(int desk); //programSuccess is emitted after imageDone
+
+private slots:
+ void slotBackgroundDone(KProcess *);
+ void render();
+ void done();
+
+private:
+ enum { Error, Wait, WaitUpdate, Done };
+ enum { Rendering = 1, InitCheck = 2,
+ BackgroundStarted = 4, BackgroundDone = 8,
+ WallpaperStarted = 0x10, WallpaperDone = 0x20,
+ AllDone = 0x40 };
+
+ QString buildCommand();
+ void createTempFile();
+ void tile(QImage& dst, QRect rect, const QImage& src);
+ void blend(QImage& dst, QRect dr, const QImage& src, QPoint soffs = QPoint(0, 0), int blendFactor=100);
+
+ void wallpaperBlend();
+ void fastWallpaperBlend();
+ void fullWallpaperBlend();
+
+ int doBackground(bool quit=false);
+ int doWallpaper(bool quit=false);
+ void setBusyCursor(bool isBusy);
+ QString cacheFileName();
+ bool useCacheFile() const;
+ bool canTile() const;
+
+ bool m_isBusyCursor;
+ bool m_enableBusyCursor;
+ bool m_bPreview;
+ int m_State;
+ bool m_Cached;
+ bool m_TilingEnabled;
+
+ KTempFile* m_Tempfile;
+ QSize m_Size, m_rSize;
+ QRect m_WallpaperRect;
+ QImage m_Image, m_Background, m_Wallpaper;
+ QPixmap m_Pixmap;
+ QTimer *m_pTimer;
+
+ KStandardDirs *m_pDirs;
+ KShellProcess *m_pProc;
+
+};
+
+/**
+ * In xinerama mode, each screen is rendered seperately by KBackgroundRenderer.
+ * This class controls a set of renderers for a desktop, and coallates the
+ * images. Usage is similar to KBackgroundRenderer: connect to the imageDone
+ * signal.
+ */
+class KVirtualBGRenderer : public QObject
+{
+ Q_OBJECT
+public:
+ KVirtualBGRenderer(int desk, KConfig *config=0l);
+ ~KVirtualBGRenderer();
+
+ KBackgroundRenderer * renderer(unsigned screen);
+ unsigned numRenderers() const { return m_numRenderers; }
+
+ QPixmap pixmap();
+
+ void setPreview(const QSize & size);
+
+ bool needProgramUpdate();
+ void programUpdate();
+
+ bool needWallpaperChange();
+ void changeWallpaper();
+
+ int hash();
+ bool isActive();
+ void setEnabled( bool enable );
+ void desktopResized();
+
+ void load(int desk, bool reparseConfig=true);
+ void start();
+ void stop();
+ void cleanup();
+ void saveCacheFile();
+ void enableTiling( bool enable );
+
+signals:
+ void imageDone(int desk);
+
+private slots:
+ void screenDone(int desk, int screen);
+
+private:
+ QSize renderSize(int screen); // the size the renderer should be
+ void initRenderers();
+
+ KConfig *m_pConfig;
+ float m_scaleX;
+ float m_scaleY;
+ int m_desk;
+ unsigned m_numRenderers;
+ bool m_bDrawBackgroundPerScreen;
+ bool m_bCommonScreen;
+ bool m_bDeleteConfig;
+ QSize m_size;
+
+ QMemArray<bool> m_bFinished;
+ QPtrVector<KBackgroundRenderer> m_renderer;
+ QPixmap *m_pPixmap;
+};
+
+
+#endif // BGRender_h_Included
+
diff --git a/kcontrol/background/bgsettings.cpp b/kcontrol/background/bgsettings.cpp
new file mode 100644
index 000000000..9b657393f
--- /dev/null
+++ b/kcontrol/background/bgsettings.cpp
@@ -0,0 +1,1267 @@
+/* vi: ts=8 sts=4 sw=4
+ * kate: space-indent on; indent-width 4; indent-mode cstyle;
+ *
+ * This file is part of the KDE project, module kdesktop.
+ * Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ *
+ * You can Freely distribute this program under the GNU Library General
+ * Public License. See the file "COPYING.LIB" for the exact licensing terms.
+ */
+
+#include <netwm.h>
+#include <time.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+// Clean up after X.h/Xlib.h
+#undef Bool
+#undef Unsorted
+
+#include <qdir.h>
+#include <qpixmap.h>
+
+#include <dcopclient.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kglobalsettings.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+#include <krandomsequence.h>
+#include <konq_defaults.h>
+
+#include "bgdefaults.h"
+#include "bghash.h"
+#include "bgsettings.h"
+
+
+/**** KBackgroundPattern ****/
+
+
+KBackgroundPattern::KBackgroundPattern(QString name)
+{
+ dirty = false;
+ hashdirty = true;
+
+ m_pDirs = KGlobal::dirs();
+ m_pDirs->addResourceType("dtop_pattern", m_pDirs->kde_default("data") +
+ "kdesktop/patterns");
+ m_pConfig = 0L;
+
+ m_Name = name;
+ if (m_Name.isEmpty())
+ return;
+
+ init();
+ readSettings();
+}
+
+
+KBackgroundPattern::~KBackgroundPattern()
+{
+ delete m_pConfig;
+}
+
+void KBackgroundPattern::copyConfig(const KBackgroundPattern *settings)
+{
+ dirty = hashdirty = true;
+ m_Name = settings->m_Name;
+ m_Comment = settings->m_Comment;
+ m_Pattern = settings->m_Pattern;
+ m_File = settings->m_File;
+}
+
+void KBackgroundPattern::load(QString name)
+{
+ m_Name = name;
+ init();
+ readSettings();
+}
+
+
+void KBackgroundPattern::init(bool force_rw)
+{
+ delete m_pConfig;
+
+ m_File = m_pDirs->findResource("dtop_pattern", m_Name + ".desktop");
+ if (force_rw || m_File.isEmpty()) {
+ m_File = m_pDirs->saveLocation("dtop_pattern") + m_Name + ".desktop";
+ m_pConfig = new KSimpleConfig(m_File);
+ } else
+ m_pConfig = new KSimpleConfig(m_File);
+
+ m_pConfig->setGroup("KDE Desktop Pattern");
+
+ QFileInfo fi(m_File);
+ m_bReadOnly = !fi.isWritable();
+}
+
+
+void KBackgroundPattern::setComment(const QString &comment)
+{
+ if (m_Comment == comment)
+ return;
+ dirty = true;
+ m_Comment = comment;
+}
+
+
+void KBackgroundPattern::setPattern(QString pattern)
+{
+ if (m_Pattern == pattern)
+ return;
+ dirty = hashdirty = true;
+ m_Pattern = pattern;
+}
+
+
+void KBackgroundPattern::readSettings()
+{
+ dirty = false;
+ hashdirty = true;
+
+ m_Pattern = m_pConfig->readPathEntry("File");
+ m_Comment = m_pConfig->readEntry("Comment");
+ if (m_Comment.isEmpty())
+ m_Comment = m_File.mid(m_File.findRev('/')+1);
+}
+
+
+void KBackgroundPattern::writeSettings()
+{
+ if (!dirty)
+ return;
+ if (m_bReadOnly)
+ init(true);
+
+ if ( !m_pConfig )
+ return; // better safe than sorry
+
+ m_pConfig->writePathEntry("File", m_Pattern);
+ m_pConfig->writeEntry("Comment", m_Comment);
+ m_pConfig->sync();
+ dirty = false;
+}
+
+
+bool KBackgroundPattern::isAvailable()
+{
+ if (m_Pattern.isEmpty())
+ return false;
+ QString file = m_Pattern;
+ if (file.at(0) != '/')
+ file = m_pDirs->findResource("dtop_pattern", file);
+ QFileInfo fi(file);
+ return (fi.exists());
+}
+
+
+bool KBackgroundPattern::remove()
+{
+ if (m_bReadOnly)
+ return false;
+ return !unlink(QFile::encodeName(m_File));
+}
+
+
+QString KBackgroundPattern::fingerprint()
+{
+ return m_File;
+}
+
+
+int KBackgroundPattern::hash()
+{
+ if (hashdirty) {
+ m_Hash = QHash(fingerprint());
+ hashdirty = false;
+ }
+ return m_Hash;
+}
+
+
+/* static */
+QStringList KBackgroundPattern::list()
+{
+ KStandardDirs *dirs = KGlobal::dirs();
+ dirs->addResourceType("dtop_pattern", dirs->kde_default("data") +
+ "kdesktop/patterns");
+ QStringList lst = dirs->findAllResources("dtop_pattern", "*.desktop",
+ false, true);
+ QStringList::Iterator it;
+ for (it=lst.begin(); it!=lst.end(); ++it) {
+ // Strip path and suffix
+ int pos = (*it).findRev('/');
+ if (pos != -1)
+ (*it) = (*it).mid(pos+1);
+ pos = (*it).findRev('.');
+ if (pos != -1)
+ (*it) = (*it).left(pos);
+ }
+ return lst;
+}
+
+
+/**** KBackgroundProgram ****/
+
+
+KBackgroundProgram::KBackgroundProgram(QString name)
+{
+ dirty = false;
+ hashdirty = true;
+
+ m_pDirs = KGlobal::dirs();
+ m_pDirs->addResourceType("dtop_program", m_pDirs->kde_default("data") +
+ "kdesktop/programs");
+ m_pConfig = 0L;
+
+ // prevent updates when just constructed.
+ m_LastChange = (int) time(0L);
+
+ m_Name = name;
+ if (m_Name.isEmpty())
+ return;
+
+ init();
+ readSettings();
+}
+
+
+KBackgroundProgram::~KBackgroundProgram()
+{
+ delete m_pConfig;
+}
+
+void KBackgroundProgram::copyConfig(const KBackgroundProgram *settings)
+{
+ dirty = hashdirty = true;
+ m_Refresh = settings->m_Refresh;
+ m_LastChange = settings->m_LastChange;
+ m_Name = settings->m_Name;
+ m_Command = settings->m_Command;
+ m_PreviewCommand = settings->m_PreviewCommand;
+ m_Comment = settings->m_Comment;
+ m_Executable = settings->m_Executable;
+ m_File = settings->m_File;
+}
+
+
+void KBackgroundProgram::init(bool force_rw)
+{
+ delete m_pConfig;
+
+ m_File = m_pDirs->findResource("dtop_program", m_Name + ".desktop");
+ if (force_rw || m_File.isEmpty()) {
+ m_File = m_pDirs->saveLocation("dtop_program") + m_Name + ".desktop";
+ m_pConfig = new KSimpleConfig(m_File);
+ m_bReadOnly = false;
+ } else {
+ m_pConfig = new KSimpleConfig(m_File);
+ m_bReadOnly = (m_File != locateLocal("dtop_program", m_Name + ".desktop"));
+ }
+ m_pConfig->setGroup("KDE Desktop Program");
+}
+
+
+void KBackgroundProgram::load(const QString &name)
+{
+ m_Name = name;
+ init();
+ readSettings();
+}
+
+
+void KBackgroundProgram::setComment(const QString &comment)
+{
+ if (m_Comment == comment)
+ return;
+ dirty = true;
+ m_Comment = comment;
+}
+
+
+void KBackgroundProgram::setExecutable(const QString &executable)
+{
+ if (m_Executable == executable)
+ return;
+ dirty = true;
+ m_Executable = executable;
+}
+
+
+void KBackgroundProgram::setCommand(const QString &command)
+{
+ if (m_Command == command)
+ return;
+ dirty = hashdirty = true;
+ m_Command = command;
+}
+
+
+void KBackgroundProgram::setPreviewCommand(const QString &command)
+{
+ if (m_PreviewCommand == command)
+ return;
+ dirty = true;
+ m_PreviewCommand = command;
+}
+
+
+void KBackgroundProgram::setRefresh(int refresh)
+{
+ if (m_Refresh == refresh)
+ return;
+ dirty = hashdirty = true;
+ m_Refresh = refresh;
+}
+
+
+void KBackgroundProgram::readSettings()
+{
+ dirty = false;
+ hashdirty = true;
+
+ m_Comment = m_pConfig->readEntry("Comment");
+ m_Executable = m_pConfig->readPathEntry("Executable");
+ m_Command = m_pConfig->readPathEntry("Command");
+ m_PreviewCommand = m_pConfig->readPathEntry("PreviewCommand", m_Command);
+ m_Refresh = m_pConfig->readNumEntry("Refresh", 300);
+}
+
+
+void KBackgroundProgram::writeSettings()
+{
+ if (!dirty)
+ return;
+ if (m_bReadOnly)
+ init(true);
+
+ if ( !m_pConfig )
+ return; // better safe than sorry
+
+ m_pConfig->writeEntry("Comment", m_Comment);
+ m_pConfig->writePathEntry("Executable", m_Executable);
+ m_pConfig->writePathEntry("Command", m_Command);
+ m_pConfig->writeEntry("PreviewCommand", m_PreviewCommand);
+ m_pConfig->writeEntry("Refresh", m_Refresh);
+ m_pConfig->sync();
+ dirty = false;
+}
+
+
+bool KBackgroundProgram::isAvailable()
+{
+ return !m_pDirs->findExe(m_Executable).isEmpty();
+}
+
+
+bool KBackgroundProgram::remove()
+{
+ if (m_bReadOnly)
+ return false;
+ return !unlink(QFile::encodeName(m_File));
+}
+
+
+bool KBackgroundProgram::needUpdate()
+{
+ return (m_LastChange + 60*m_Refresh <= time(0L));
+}
+
+
+void KBackgroundProgram::update()
+{
+ m_LastChange = (int) time(0L);
+}
+
+
+QString KBackgroundProgram::fingerprint()
+{
+ return QString("co:%1;re:%2").arg(m_Command).arg(m_Refresh);
+}
+
+
+int KBackgroundProgram::hash()
+{
+ if (hashdirty) {
+ m_Hash = QHash(fingerprint());
+ hashdirty = false;
+ }
+ return m_Hash;
+}
+
+
+/* static */
+QStringList KBackgroundProgram::list()
+{
+ KStandardDirs *dirs = KGlobal::dirs();
+ dirs->addResourceType("dtop_program", dirs->kde_default("data") +
+ "kdesktop/programs");
+ QStringList lst = dirs->findAllResources("dtop_program", "*.desktop",
+ false, true);
+ QStringList::Iterator it;
+ for (it=lst.begin(); it!=lst.end(); ++it) {
+ // Strip path and suffix
+ int pos = (*it).findRev('/');
+ if (pos != -1)
+ (*it) = (*it).mid(pos+1);
+ pos = (*it).findRev('.');
+ if (pos != -1)
+ (*it) = (*it).left(pos);
+ }
+ return lst;
+}
+
+
+/**** KBackgroundSettings ****/
+
+
+KBackgroundSettings::KBackgroundSettings(int desk, int screen, bool drawBackgroundPerScreen, KConfig *config)
+ : KBackgroundPattern(),
+ KBackgroundProgram()
+{
+ dirty = false; hashdirty = true;
+ m_bDrawBackgroundPerScreen = drawBackgroundPerScreen;
+ m_Desk = desk;
+ m_Screen = screen;
+ m_bEnabled = true;
+
+ // Default values.
+ defColorA = _defColorA;
+ defColorB = _defColorB;
+ if (QPixmap::defaultDepth() > 8)
+ defBackgroundMode = _defBackgroundMode;
+ else
+ defBackgroundMode = Flat;
+ defWallpaperMode = _defWallpaperMode;
+ defMultiMode = _defMultiMode;
+ defBlendMode = _defBlendMode;
+ defBlendBalance = _defBlendBalance;
+ defReverseBlending = _defReverseBlending;
+
+ m_MinOptimizationDepth = _defMinOptimizationDepth;
+ m_bShm = _defShm;
+
+ // Background modes
+ #define ADD_STRING(ID) m_BMMap[#ID] = ID; m_BMRevMap[ID] = (char *) #ID;
+ ADD_STRING(Flat)
+ ADD_STRING(Pattern)
+ ADD_STRING(Program)
+ ADD_STRING(HorizontalGradient)
+ ADD_STRING(VerticalGradient)
+ ADD_STRING(PyramidGradient)
+ ADD_STRING(PipeCrossGradient)
+ ADD_STRING(EllipticGradient)
+ #undef ADD_STRING
+
+ // Blend modes
+ #define ADD_STRING(ID) m_BlMMap[#ID] = ID; m_BlMRevMap[ID] = (char *) #ID;
+ ADD_STRING(NoBlending)
+ ADD_STRING(FlatBlending)
+ ADD_STRING(HorizontalBlending)
+ ADD_STRING(VerticalBlending)
+ ADD_STRING(PyramidBlending)
+ ADD_STRING(PipeCrossBlending)
+ ADD_STRING(EllipticBlending)
+ ADD_STRING(IntensityBlending)
+ ADD_STRING(SaturateBlending)
+ ADD_STRING(ContrastBlending)
+ ADD_STRING(HueShiftBlending)
+ #undef ADD_STRING
+
+ // Wallpaper modes
+ #define ADD_STRING(ID) m_WMMap[#ID] = ID; m_WMRevMap[ID] = (char *) #ID;
+ ADD_STRING(NoWallpaper)
+ ADD_STRING(Centred)
+ ADD_STRING(Tiled)
+ ADD_STRING(CenterTiled)
+ ADD_STRING(CentredMaxpect)
+ ADD_STRING(TiledMaxpect)
+ ADD_STRING(Scaled)
+ ADD_STRING(CentredAutoFit)
+ ADD_STRING(ScaleAndCrop)
+ #undef ADD_STRING
+
+ // Multiple wallpaper modes
+ #define ADD_STRING(ID) m_MMMap[#ID] = ID; m_MMRevMap[ID] = (char *) #ID;
+ ADD_STRING(NoMulti)
+ ADD_STRING(InOrder)
+ ADD_STRING(Random)
+ ADD_STRING(NoMultiRandom)
+ #undef ADD_STRING
+
+ m_pDirs = KGlobal::dirs();
+
+ if (!config) {
+ int screen_number = 0;
+ if (qt_xdisplay())
+ screen_number = DefaultScreen(qt_xdisplay());
+ QCString configname;
+ if (screen_number == 0)
+ configname = "kdesktoprc";
+ else
+ configname.sprintf("kdesktop-screen-%drc", screen_number);
+
+ m_pConfig = new KConfig(configname, false, false);
+ m_bDeleteConfig = true;
+ } else {
+ m_pConfig = config;
+ m_bDeleteConfig = false;
+ }
+
+ if (m_Desk == -1)
+ return;
+
+ readSettings();
+}
+
+
+KBackgroundSettings::~KBackgroundSettings()
+{
+ if (m_bDeleteConfig)
+ delete m_pConfig;
+}
+
+void KBackgroundSettings::copyConfig(const KBackgroundSettings *settings)
+{
+ dirty = true;
+ hashdirty = true;
+
+ m_ColorA = settings->m_ColorA;
+ m_ColorB = settings->m_ColorB;
+ m_Wallpaper = settings->m_Wallpaper;
+ m_WallpaperList = settings->m_WallpaperList;
+ m_WallpaperFiles = settings->m_WallpaperFiles;
+
+ m_BackgroundMode = settings->m_BackgroundMode;
+ m_WallpaperMode = settings->m_WallpaperMode;
+ m_BlendMode = settings->m_BlendMode;
+ m_BlendBalance = settings->m_BlendBalance;
+ m_ReverseBlending = settings->m_ReverseBlending;
+ m_MinOptimizationDepth = settings->m_MinOptimizationDepth;
+ m_bShm = settings->m_bShm;
+ m_MultiMode = settings->m_MultiMode;
+ m_Interval = settings->m_Interval;
+ m_CurrentWallpaper = settings->m_CurrentWallpaper;
+ m_CurrentWallpaperName = settings->m_CurrentWallpaperName;
+
+ KBackgroundPattern::copyConfig(settings);
+ KBackgroundProgram::copyConfig(settings);
+}
+
+
+void KBackgroundSettings::load(int desk, int screen, bool drawBackgroundPerScreen, bool reparseConfig)
+{
+ m_Desk = desk;
+ m_Screen = screen;
+ m_bDrawBackgroundPerScreen = drawBackgroundPerScreen;
+ readSettings(reparseConfig);
+}
+
+
+void KBackgroundSettings::setColorA(const QColor& color)
+{
+ if (m_ColorA == color)
+ return;
+ dirty = hashdirty = true;
+ m_ColorA = color;
+}
+
+
+void KBackgroundSettings::setColorB(const QColor& color)
+{
+ if (m_ColorB == color)
+ return;
+ dirty = hashdirty = true;
+ m_ColorB = color;
+}
+
+
+void KBackgroundSettings::setPatternName(QString name)
+{
+ int ohash = KBackgroundPattern::hash();
+ KBackgroundPattern::load(name);
+ if (ohash == KBackgroundPattern::hash())
+ return;
+
+ dirty = hashdirty = true;
+ return;
+}
+
+
+void KBackgroundSettings::setProgram(QString name)
+{
+ int ohash = KBackgroundProgram::hash();
+ KBackgroundProgram::load(name);
+ if (ohash == KBackgroundProgram::hash())
+ return;
+
+ dirty = hashdirty = true;
+ return;
+}
+
+
+void KBackgroundSettings::setBackgroundMode(int mode)
+{
+ if (m_BackgroundMode == mode)
+ return;
+ dirty = hashdirty = true;
+ m_BackgroundMode = mode;
+}
+
+void KBackgroundSettings::setBlendMode(int mode)
+{
+ if (m_BlendMode == mode)
+ return;
+ dirty = hashdirty = true;
+ m_BlendMode = mode;
+}
+
+void KBackgroundSettings::setBlendBalance(int value)
+{
+ if (m_BlendBalance == value)
+ return;
+ dirty = hashdirty = true;
+ m_BlendBalance = value;
+}
+
+void KBackgroundSettings::setReverseBlending(bool value)
+{
+ if (m_ReverseBlending == value)
+ return;
+ dirty = hashdirty = true;
+ m_ReverseBlending = value;
+}
+
+
+void KBackgroundSettings::setWallpaper(QString wallpaper)
+{
+ dirty = hashdirty = true;
+ m_Wallpaper = wallpaper;
+}
+
+
+void KBackgroundSettings::setWallpaperMode(int mode)
+{
+ if (m_WallpaperMode == mode)
+ return;
+ dirty = hashdirty = true;
+ m_WallpaperMode = mode;
+}
+
+
+void KBackgroundSettings::setWallpaperList(QStringList list)
+{
+ KStandardDirs *d = KGlobal::dirs();
+ if (m_WallpaperList == list)
+ return;
+
+ dirty = hashdirty = true;
+ m_WallpaperList.clear();
+ for(QStringList::ConstIterator it = list.begin();
+ it != list.end(); ++it)
+ {
+ QString rpath = d->relativeLocation("wallpaper", *it);
+ m_WallpaperList.append( !rpath.isEmpty() ? rpath : *it );
+ }
+ updateWallpaperFiles();
+ // Try to keep the current wallpaper (-1 to set position to one before it)
+ m_CurrentWallpaper = m_WallpaperFiles.findIndex(m_CurrentWallpaperName) - 1;
+ changeWallpaper(m_CurrentWallpaper < 0);
+}
+
+
+void KBackgroundSettings::setWallpaperChangeInterval(int interval)
+{
+ if (m_Interval == interval)
+ return;
+ dirty = hashdirty = true;
+ m_Interval = interval;
+}
+
+
+void KBackgroundSettings::setMultiWallpaperMode(int mode)
+{
+ if (m_MultiMode == mode)
+ return;
+ dirty = hashdirty = true;
+ m_MultiMode = mode;
+ changeWallpaper(true);
+}
+
+
+void KBackgroundSettings::setMinOptimizationDepth(int mode)
+{
+ if (m_MinOptimizationDepth == mode)
+ return;
+ dirty = hashdirty = true;
+ m_MinOptimizationDepth = mode;
+}
+
+bool KBackgroundSettings::optimize() const
+{
+ switch( m_MinOptimizationDepth )
+ {
+ case AlwaysOpt :
+ return true;
+ case Opt16bpp :
+ return QPixmap::defaultDepth() >= 16;
+ case Opt15bpp :
+ return QPixmap::defaultDepth() >= 15;
+ case NeverOpt :
+ default :
+ return false;
+ }
+}
+
+void KBackgroundSettings::setUseShm(bool use)
+{
+ if (m_bShm == use)
+ return;
+ dirty = hashdirty = true;
+ m_bShm = use;
+}
+
+QString KBackgroundSettings::configGroupName() const
+{
+ QString screenName;
+ if (m_bDrawBackgroundPerScreen)
+ screenName = QString("Screen%1").arg(QString::number(m_Screen));
+ return QString("Desktop%1%2").arg(m_Desk).arg(screenName);
+}
+
+void KBackgroundSettings::readSettings(bool reparse)
+{
+ if (reparse)
+ m_pConfig->reparseConfiguration();
+
+ m_pConfig->setGroup(configGroupName());
+
+ // Background mode (Flat, div. Gradients, Pattern or Program)
+ m_ColorA = m_pConfig->readColorEntry("Color1", &defColorA);
+ m_ColorB = m_pConfig->readColorEntry("Color2", &defColorB);
+
+ QString s = m_pConfig->readPathEntry("Pattern");
+ if (!s.isEmpty())
+ KBackgroundPattern::load(s);
+
+ s = m_pConfig->readPathEntry("Program");
+ if (!s.isEmpty())
+ KBackgroundProgram::load(s);
+
+ m_BackgroundMode = defBackgroundMode;
+ s = m_pConfig->readEntry("BackgroundMode", "invalid");
+
+ if (m_BMMap.contains(s)) {
+ int mode = m_BMMap[s];
+ // consistency check
+ if ( ((mode != Pattern) && (mode != Program)) ||
+ ((mode == Pattern) && !pattern().isEmpty()) ||
+ ((mode == Program) && !command().isEmpty())
+ )
+ m_BackgroundMode = mode;
+ }
+
+ m_BlendMode = defBlendMode;
+ s = m_pConfig->readEntry("BlendMode", "invalid");
+ if (m_BlMMap.contains(s)) {
+ m_BlendMode = m_BlMMap[s];
+ }
+
+ m_BlendBalance = defBlendBalance;
+ int value = m_pConfig->readNumEntry( "BlendBalance", defBlendBalance);
+ if (value > -201 && value < 201)
+ m_BlendBalance = value;
+
+ m_ReverseBlending = m_pConfig->readBoolEntry( "ReverseBlending", defReverseBlending);
+
+ // Multiple wallpaper config
+ m_WallpaperList = m_pConfig->readPathListEntry("WallpaperList");
+
+ m_Interval = m_pConfig->readNumEntry("ChangeInterval", 60);
+ m_LastChange = m_pConfig->readNumEntry("LastChange", 0);
+ m_CurrentWallpaper = m_pConfig->readNumEntry("CurrentWallpaper", 0);
+ m_CurrentWallpaperName = m_pConfig->readEntry("CurrentWallpaperName");
+
+ m_MultiMode = defMultiMode;
+ s = m_pConfig->readEntry("MultiWallpaperMode");
+ if (m_MMMap.contains(s)) {
+ int mode = m_MMMap[s];
+ m_MultiMode = mode;
+ }
+
+ updateWallpaperFiles();
+ if( !m_CurrentWallpaperName.isEmpty())
+ m_CurrentWallpaper = m_WallpaperFiles.findIndex(m_CurrentWallpaperName);
+ if(m_CurrentWallpaper < 0)
+ m_CurrentWallpaper = 0;
+
+ // Wallpaper mode (NoWallpaper, div. tilings)
+ m_WallpaperMode = defWallpaperMode;
+ m_Wallpaper = m_pConfig->readPathEntry("Wallpaper");
+ s = m_pConfig->readEntry("WallpaperMode", "invalid");
+ if (m_WMMap.contains(s)) {
+ int mode = m_WMMap[s];
+ // consistency check.
+ if ((mode == NoWallpaper) || !m_Wallpaper.isEmpty() || (m_MultiMode == InOrder || m_MultiMode == Random))
+ m_WallpaperMode = mode;
+ }
+
+ m_MinOptimizationDepth = m_pConfig->readNumEntry( "MinOptimizationDepth",
+ _defMinOptimizationDepth );
+ m_bShm = m_pConfig->readBoolEntry( "UseSHM", _defShm );
+
+ dirty = reparse; hashdirty = true;
+}
+
+
+void KBackgroundSettings::writeSettings()
+{
+ KBackgroundPattern::writeSettings();
+ KBackgroundProgram::writeSettings();
+
+ if (!dirty)
+ return;
+
+ m_pConfig->setGroup(configGroupName());
+ m_pConfig->writeEntry("Color1", m_ColorA);
+ m_pConfig->writeEntry("Color2", m_ColorB);
+ m_pConfig->writePathEntry("Pattern", KBackgroundPattern::name());
+ m_pConfig->writeEntry("Program", KBackgroundProgram::name());
+ m_pConfig->writeEntry("BackgroundMode", m_BMRevMap[m_BackgroundMode]);
+ m_pConfig->writePathEntry("Wallpaper", m_Wallpaper);
+ m_pConfig->writeEntry("WallpaperMode", m_WMRevMap[m_WallpaperMode]);
+ m_pConfig->writeEntry("MultiWallpaperMode", m_MMRevMap[m_MultiMode]);
+ m_pConfig->writeEntry("BlendMode", m_BlMRevMap[m_BlendMode]);
+ m_pConfig->writeEntry("BlendBalance", m_BlendBalance);
+ m_pConfig->writeEntry("ReverseBlending", m_ReverseBlending);
+ m_pConfig->writeEntry("MinOptimizationDepth", m_MinOptimizationDepth);
+ m_pConfig->writeEntry("UseSHM", m_bShm);
+
+ m_pConfig->writePathEntry("WallpaperList", m_WallpaperList);
+ m_pConfig->writeEntry("ChangeInterval", m_Interval);
+ m_pConfig->writeEntry("LastChange", m_LastChange);
+ m_pConfig->deleteEntry("CurrentWallpaper"); // obsolete, remember name
+ m_pConfig->writeEntry("CurrentWallpaperName", m_CurrentWallpaperName);
+
+ m_pConfig->sync();
+
+ dirty = false;
+}
+
+/*
+ * (re)Build m_WallpaperFiles from m_WallpaperList
+ */
+void KBackgroundSettings::updateWallpaperFiles()
+{
+ QStringList::Iterator it;
+ m_WallpaperFiles.clear();
+ for (it=m_WallpaperList.begin(); it!=m_WallpaperList.end(); ++it) {
+ QString file = locate("wallpaper", *it);
+ if (file.isEmpty())
+ continue;
+ QFileInfo fi(file);
+ if (!fi.exists())
+ continue;
+ if (fi.isFile() && fi.isReadable())
+ m_WallpaperFiles.append(file);
+ if (fi.isDir()) {
+ QDir dir(file);
+ QStringList lst = dir.entryList(QDir::Files | QDir::Readable);
+ QStringList::Iterator it;
+ for (it=lst.begin(); it!=lst.end(); ++it)
+ {
+ file = dir.absFilePath(*it);
+ QFileInfo fi(file);
+ if (fi.isFile() && fi.isReadable())
+ m_WallpaperFiles.append(file);
+ }
+ }
+ }
+
+ if (m_MultiMode == Random)
+ randomizeWallpaperFiles();
+}
+
+// Randomize the m_WallpaperFiles in a non-repeating method.
+void KBackgroundSettings::randomizeWallpaperFiles()
+{
+ if (m_WallpaperFiles.count() < 4)
+ return;
+
+ KRandomSequence rseq;
+ QStringList tmpList = m_WallpaperFiles;
+ QStringList randomList;
+ randomList.append(tmpList.front());
+ tmpList.pop_front();
+ while(tmpList.count())
+ {
+ randomList.insert(randomList.at(
+ rseq.getLong(randomList.count()+1)),
+ 1, tmpList.front());
+
+ tmpList.pop_front();
+ }
+ m_WallpaperFiles = randomList;
+}
+
+QStringList KBackgroundSettings::wallpaperList() const
+{
+ if ( m_WallpaperMode == NoWallpaper )
+ return QStringList();
+ if ( m_MultiMode == NoMulti || m_MultiMode == NoMultiRandom )
+ return QStringList(m_Wallpaper);
+ return m_WallpaperList;
+}
+
+QStringList KBackgroundSettings::wallpaperFiles() const
+{
+ if ( m_WallpaperMode == NoWallpaper )
+ return QStringList();
+ if ( m_MultiMode == NoMulti || m_MultiMode == NoMultiRandom )
+ return QStringList(m_Wallpaper);
+ return m_WallpaperFiles;
+}
+
+/*
+ * Select a new wallpaper from the list.
+ */
+void KBackgroundSettings::changeWallpaper(bool init)
+{
+ if (m_WallpaperFiles.count() == 0) {
+ if( init ) {
+ m_CurrentWallpaper = 0;
+ m_CurrentWallpaperName = QString();
+ }
+ return;
+ }
+
+ switch (m_MultiMode) {
+ case InOrder:
+ m_CurrentWallpaper++;
+ if (init || (m_CurrentWallpaper >= (int) m_WallpaperFiles.count()))
+ m_CurrentWallpaper = 0;
+ break;
+
+ case Random:
+ // Random: m_WallpaperFiles is randomized in a non-repeating
+ // method. Hence we just increment the index.
+ m_CurrentWallpaper++;
+ if (init || (m_CurrentWallpaper >= (int) m_WallpaperFiles.count())) {
+ m_CurrentWallpaper = 0;
+ randomizeWallpaperFiles(); // Get a new random-ordered list.
+ }
+ break;
+ default:
+ break;
+ }
+
+ m_CurrentWallpaperName = m_WallpaperFiles[ m_CurrentWallpaper ];
+ m_LastChange = (int) time(0L);
+ m_pConfig->setGroup(configGroupName());
+ m_pConfig->deleteEntry("CurrentWallpaper"); // obsolete, remember name
+ m_pConfig->writeEntry("CurrentWallpaperName", m_CurrentWallpaperName);
+ m_pConfig->writeEntry("LastChange", m_LastChange);
+ m_pConfig->sync();
+
+ hashdirty = true;
+}
+
+
+QString KBackgroundSettings::currentWallpaper() const
+{
+ if ( m_WallpaperMode == NoWallpaper )
+ return QString::null;
+ if (m_MultiMode == NoMulti || m_MultiMode == NoMultiRandom)
+ return m_Wallpaper;
+
+ if (m_CurrentWallpaper >= 0 && m_CurrentWallpaper < (int) m_WallpaperFiles.count())
+ return m_WallpaperFiles[m_CurrentWallpaper];
+ return QString::null;
+}
+
+bool KBackgroundSettings::discardCurrentWallpaper()
+{
+ if (m_MultiMode == NoMulti || m_MultiMode == NoMultiRandom)
+ {
+ return false;
+ }
+ m_WallpaperFiles.remove(m_WallpaperFiles.at(m_CurrentWallpaper));
+ --m_CurrentWallpaper;
+ changeWallpaper();
+
+ return true;
+}
+
+
+bool KBackgroundSettings::needWallpaperChange()
+{
+ if (m_MultiMode == NoMulti || m_MultiMode == NoMultiRandom)
+ return false;
+
+ return ((m_LastChange + 60*m_Interval) <= time(0L));
+}
+
+
+/*
+ * Create a fingerprint string for this config. Be somewhat (overly) carefull
+ * that only a different final result will give a different fingerprint.
+ */
+
+QString KBackgroundSettings::fingerprint()
+{
+ QString s = QString("bm:%1;en:%2").arg(m_BackgroundMode).arg(m_bEnabled);
+ switch (m_BackgroundMode) {
+ case Flat:
+ s += QString("ca:%1;").arg(m_ColorA.rgb());
+ break;
+ case Program:
+ s += QString("pr:%1;").arg(KBackgroundProgram::hash());
+ break;
+ case Pattern:
+ s += QString("ca:%1;cb:%2;pt:%3;").arg(m_ColorA.rgb())
+ .arg(m_ColorB.rgb()).arg(KBackgroundPattern::hash());
+ break;
+ default:
+ s += QString("ca:%1;cb:%2;").arg(m_ColorA.rgb()).arg(m_ColorB.rgb());
+ break;
+ }
+
+ s += QString("wm:%1;").arg(m_WallpaperMode);
+ if (m_WallpaperMode != NoWallpaper)
+ {
+ Q_UINT32 rh = KGlobal::dirs()->calcResourceHash("wallpaper", currentWallpaper(), false);
+ s += QString("wp:%2:%1;").arg(rh).arg(currentWallpaper());
+
+ }
+ s += QString("blm:%1;").arg(m_BlendMode);
+ if (m_BlendMode != NoBlending) {
+ s += QString("blb:%1;").arg(m_BlendBalance);
+ s += QString("rbl:%1;").arg(int(m_ReverseBlending));
+ }
+ s += QString::number( m_bShm );
+ s += QString::number( m_MinOptimizationDepth );
+
+ return s;
+}
+
+
+int KBackgroundSettings::hash()
+{
+ if (hashdirty) {
+ m_Hash = QHash(fingerprint());
+ hashdirty = false;
+ }
+ return m_Hash;
+}
+
+void KBackgroundSettings::setEnabled(const bool enable)
+{
+ if (m_bEnabled == enable)
+ return;
+
+ m_bEnabled= enable;
+ hashdirty = true;
+}
+
+/**** KGlobalBackgroundSettings ****/
+
+KGlobalBackgroundSettings::KGlobalBackgroundSettings(KConfig *_config)
+{
+ m_pConfig = _config;
+
+ readSettings();
+}
+
+
+QString KGlobalBackgroundSettings::deskName(int desk)
+{
+ return m_Names[desk];
+}
+
+
+/*
+void KGlobalBackgroundSettings::setDeskName(int desk, QString name)
+{
+ if (name == m_Names[desk])
+ return;
+ dirty = true;
+ m_Names[desk] = name;
+}
+*/
+
+
+void KGlobalBackgroundSettings::setCacheSize(int size)
+{
+ if (size == m_CacheSize)
+ return;
+ dirty = true;
+ m_CacheSize = size;
+}
+
+
+void KGlobalBackgroundSettings::setLimitCache(bool limit)
+{
+ if (limit == m_bLimitCache)
+ return;
+ dirty = true;
+ m_bLimitCache = limit;
+}
+
+
+bool KGlobalBackgroundSettings::drawBackgroundPerScreen(int desk) const
+{
+ if ( desk > int(m_bDrawBackgroundPerScreen.size()) )
+ return _defDrawBackgroundPerScreen;
+ return m_bDrawBackgroundPerScreen[desk];
+}
+
+
+void KGlobalBackgroundSettings::setDrawBackgroundPerScreen(int desk, bool perScreen)
+{
+ if ( desk >= int(m_bDrawBackgroundPerScreen.size()) )
+ return;
+
+ if ( m_bDrawBackgroundPerScreen[desk] == perScreen )
+ return;
+
+ dirty = true;
+ m_bDrawBackgroundPerScreen[desk] = perScreen;
+}
+
+
+void KGlobalBackgroundSettings::setCommonScreenBackground(bool common)
+{
+ if (common == m_bCommonScreen)
+ return;
+ dirty = true;
+ m_bCommonScreen = common;
+}
+
+
+void KGlobalBackgroundSettings::setCommonDeskBackground(bool common)
+{
+ if (common == m_bCommonDesk)
+ return;
+ dirty = true;
+ m_bCommonDesk = common;
+}
+
+
+void KGlobalBackgroundSettings::setDockPanel(bool dock)
+{
+ if (dock == m_bDock)
+ return;
+ dirty = true;
+ m_bDock = dock;
+}
+
+
+void KGlobalBackgroundSettings::setExportBackground(bool _export)
+{
+ if (_export == m_bExport)
+ return;
+ dirty = true;
+ m_bExport = _export;
+}
+
+void KGlobalBackgroundSettings::setTextColor(QColor _color)
+{
+ if (_color == m_TextColor)
+ return;
+ dirty = true;
+ m_TextColor = _color;
+}
+
+void KGlobalBackgroundSettings::setTextBackgroundColor(QColor _color)
+{
+ if (_color == m_TextBackgroundColor)
+ return;
+ dirty = true;
+ m_TextBackgroundColor = _color;
+}
+
+void KGlobalBackgroundSettings::setShadowEnabled(bool enabled)
+{
+ if (enabled == m_shadowEnabled)
+ return;
+ dirty = true;
+ m_shadowEnabled = enabled;
+}
+
+void KGlobalBackgroundSettings::setTextLines(int lines)
+{
+ if (lines == m_textLines)
+ return;
+ dirty = true;
+ m_textLines = lines;
+}
+
+void KGlobalBackgroundSettings::setTextWidth(int width)
+{
+ if (width == m_textWidth)
+ return;
+ dirty = true;
+ m_textWidth = width;
+}
+
+void KGlobalBackgroundSettings::readSettings()
+{
+ m_pConfig->setGroup("Background Common");
+ m_bCommonScreen = m_pConfig->readBoolEntry("CommonScreen", _defCommonScreen);
+ m_bCommonDesk = m_pConfig->readBoolEntry("CommonDesktop", _defCommonDesk);
+ m_bDock = m_pConfig->readBoolEntry("Dock", _defDock);
+ m_bExport = m_pConfig->readBoolEntry("Export", _defExport);
+ m_bLimitCache = m_pConfig->readBoolEntry("LimitCache", _defLimitCache);
+ m_CacheSize = m_pConfig->readNumEntry("CacheSize", _defCacheSize);
+
+ m_Names.clear();
+ NETRootInfo info( qt_xdisplay(), NET::DesktopNames | NET::NumberOfDesktops );
+ m_bDrawBackgroundPerScreen.resize(info.numberOfDesktops());
+ for ( int i = 0 ; i < info.numberOfDesktops() ; ++i )
+ m_bDrawBackgroundPerScreen[i] = m_pConfig->readBoolEntry( QString("DrawBackgroundPerScreen_%1").arg(i), _defDrawBackgroundPerScreen );
+
+ m_TextColor = KGlobalSettings::textColor();
+ m_pConfig->setGroup("FMSettings");
+ m_TextColor = m_pConfig->readColorEntry("NormalTextColor", &m_TextColor);
+ m_TextBackgroundColor = m_pConfig->readColorEntry("ItemTextBackground");
+ m_shadowEnabled = m_pConfig->readBoolEntry("ShadowEnabled", true);
+ m_textLines = m_pConfig->readNumEntry("TextHeight", DEFAULT_TEXTHEIGHT);
+ m_textWidth = m_pConfig->readNumEntry("TextWidth", DEFAULT_TEXTWIDTH);
+
+ for ( int i = 0 ; i < info.numberOfDesktops() ; ++i )
+ m_Names.append( QString::fromUtf8(info.desktopName(i+1)) );
+
+ dirty = false;
+}
+
+void KGlobalBackgroundSettings::writeSettings()
+{
+ if (!dirty)
+ return;
+
+ m_pConfig->setGroup("Background Common");
+ m_pConfig->writeEntry("CommonScreen", m_bCommonScreen);
+ m_pConfig->writeEntry("CommonDesktop", m_bCommonDesk);
+ m_pConfig->writeEntry("Dock", m_bDock);
+ m_pConfig->writeEntry("Export", m_bExport);
+ m_pConfig->writeEntry("LimitCache", m_bLimitCache);
+ m_pConfig->writeEntry("CacheSize", m_CacheSize);
+
+ for ( unsigned i = 0 ; i < m_bDrawBackgroundPerScreen.size() ; ++i )
+ m_pConfig->writeEntry(QString("DrawBackgroundPerScreen_%1").arg(i), m_bDrawBackgroundPerScreen[i] );
+
+ m_pConfig->setGroup("FMSettings");
+ m_pConfig->writeEntry("NormalTextColor", m_TextColor);
+ m_pConfig->writeEntry("ItemTextBackground", m_TextBackgroundColor);
+ m_pConfig->writeEntry("ShadowEnabled", m_shadowEnabled);
+ m_pConfig->writeEntry("TextHeight", m_textLines);
+ m_pConfig->writeEntry("TextWidth", m_textWidth);
+
+ m_pConfig->sync();
+ dirty = false;
+
+ // tell kdesktop to get it's butt in gear and pick up the new settings
+ QByteArray data;
+ kapp->dcopClient()->send("kdesktop", "KDesktopIface", "configure()", data);
+}
+
diff --git a/kcontrol/background/bgsettings.h b/kcontrol/background/bgsettings.h
new file mode 100644
index 000000000..928f66360
--- /dev/null
+++ b/kcontrol/background/bgsettings.h
@@ -0,0 +1,372 @@
+/* vi: ts=8 sts=4 sw=4
+ * kate: space-indent on; indent-width 4; indent-mode cstyle;
+ *
+ * This file is part of the KDE project, module kdesktop.
+ * Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ *
+ * You can Freely distribute this program under the GNU Library General
+ * Public License. See the file "COPYING.LIB" for the exact licensing terms.
+ */
+
+#ifndef __BGSettings_h_Included__
+#define __BGSettings_h_Included__
+
+
+#include <qstringlist.h>
+#include <qcolor.h>
+#include <qvaluevector.h>
+
+template <class QString, class T> class QMap;
+class KStandardDirs;
+class KSimpleConfig;
+class KConfig;
+class QString;
+class QImage;
+
+/**
+ * A class to manipulate/read/write/list KDE desktop patterns.
+ *
+ * A pattern is a raster image. An entry for earch pattern is
+ * stored as a .desktop file in $(datadir)/kdesktop/patterns.
+ */
+class KBackgroundPattern
+{
+public:
+ KBackgroundPattern(QString name=QString::null);
+ ~KBackgroundPattern();
+
+ void copyConfig(const KBackgroundPattern*);
+
+ QString name() const { return m_Name; }
+ void load(QString name);
+
+ void setComment(const QString &comment);
+ QString comment() const {return m_Comment; }
+
+ void setPattern(QString file);
+ QString pattern() const { return m_Pattern; }
+
+ void readSettings();
+ void writeSettings();
+
+ bool isAvailable();
+ bool isGlobal()const { return m_bReadOnly; }
+ bool remove();
+
+ int hash();
+
+ static QStringList list();
+
+private:
+ void init(bool force_rw=false);
+ QString fingerprint();
+
+ bool dirty, hashdirty;
+ bool m_bReadOnly;
+ int m_Hash;
+ QString m_Name, m_Comment;
+ QString m_Pattern, m_File;
+ KStandardDirs *m_pDirs;
+ KSimpleConfig *m_pConfig;
+};
+
+
+/**
+ * A class to manipulate/read/write/list KDE desktop programs (a la xearth).
+ *
+ * A program is described by a string like:
+ *
+ * a_program -xres %x -yres %y -outfile %f
+ *
+ * Possible escape sequences:
+ *
+ * %x Horizontal resolution in pixels.
+ * %y Vertical resulution in pixels.
+ * %f Filename to dump to.
+ *
+ * An entry for each program is stored as a .desktop file in
+ * $(datadir)/kdesktop/programs.
+ */
+class KBackgroundProgram
+{
+public:
+ KBackgroundProgram(QString name=QString::null);
+ ~KBackgroundProgram();
+
+ void copyConfig(const KBackgroundProgram*);
+
+ QString name()const { return m_Name; }
+ void load(const QString & name);
+
+ void setComment(const QString &comment);
+ QString comment()const { return m_Comment; }
+
+ void setCommand(const QString &command);
+ QString command()const { return m_Command; }
+
+ void setPreviewCommand(const QString &command);
+ QString previewCommand()const { return m_PreviewCommand; }
+
+ void setRefresh(int refresh);
+ int refresh()const { return m_Refresh; }
+
+ void setExecutable(const QString &executable);
+ QString executable()const { return m_Executable; }
+
+ void readSettings();
+ void writeSettings();
+
+ void update();
+ bool needUpdate();
+
+ int hash();
+
+ bool isAvailable();
+ bool isGlobal()const { return m_bReadOnly; }
+ bool remove();
+
+ static QStringList list();
+
+private:
+ void init(bool force_rw=false);
+ QString fingerprint();
+
+ bool dirty, hashdirty;
+ bool m_bReadOnly;
+ int m_Refresh, m_Hash, m_LastChange;
+ QString m_Name, m_Command;
+ QString m_PreviewCommand, m_Comment;
+ QString m_Executable, m_File;
+ KStandardDirs *m_pDirs;
+ KSimpleConfig *m_pConfig;
+};
+
+
+/**
+ * KBackgroundSettings: A class to read/write/manipulate
+ * KDE desktop settings.
+ */
+class KBackgroundSettings
+ : public KBackgroundPattern,
+ public KBackgroundProgram
+{
+public:
+ /**
+ * @param drawBackgroundPerScreen if false, then all screens (in xinerama
+ * mode) will be treated as one big display, and the "screen" paramater
+ * will be ignored.
+ */
+ KBackgroundSettings(int desk, int screen, bool drawBackgroundPerScreen, KConfig *config);
+ ~KBackgroundSettings();
+
+ void copyConfig(const KBackgroundSettings*);
+
+ bool drawBackgroundPerScreen() const { return m_bDrawBackgroundPerScreen; }
+ void setDrawBackgroundPerScreen(bool draw);
+
+ int desk() const { return m_Desk; }
+ int screen() const { return m_Screen; }
+// void load(int desk, int screen, bool drawBackgroundPerScreen, bool reparseConfig=true);
+ void load(int desk, int screen, bool drawBackgroundPerScreen, bool reparseConfig);
+
+ void setColorA(const QColor &color);
+ QColor colorA() const { return m_ColorA; }
+ void setColorB(const QColor &color);
+ QColor colorB() const { return m_ColorB; }
+
+ void setProgram(QString program);
+ void setPatternName(QString pattern);
+
+ enum BackgroundMode {
+ Flat, Pattern, Program,
+ HorizontalGradient, VerticalGradient, PyramidGradient,
+ PipeCrossGradient, EllipticGradient, lastBackgroundMode
+ };
+ void setBackgroundMode(int mode);
+ int backgroundMode() const { return m_BackgroundMode; }
+
+ enum BlendMode {
+ NoBlending, FlatBlending,
+ HorizontalBlending, VerticalBlending, PyramidBlending,
+ PipeCrossBlending, EllipticBlending,
+ IntensityBlending, SaturateBlending, ContrastBlending,
+ HueShiftBlending, lastBlendMode
+ };
+ void setBlendMode(int mode);
+ int blendMode() const { return m_BlendMode; }
+
+ void setReverseBlending(bool value);
+ bool reverseBlending() const { return m_ReverseBlending; }
+
+ void setBlendBalance(int value);
+ int blendBalance() const { return m_BlendBalance; }
+
+ void setWallpaper(QString name);
+ QString wallpaper() const { return m_Wallpaper; }
+
+ enum WallpaperMode {
+ NoWallpaper, Centred, Tiled, CenterTiled, CentredMaxpect, TiledMaxpect,
+ Scaled, CentredAutoFit, ScaleAndCrop, lastWallpaperMode
+ };
+ void setWallpaperMode(int mode);
+ int wallpaperMode() const { return m_WallpaperMode; }
+
+ void setWallpaperList(QStringList);
+ QStringList wallpaperList() const;
+ QStringList wallpaperFiles() const;
+
+ void setWallpaperChangeInterval(int);
+ int wallpaperChangeInterval() const { return m_Interval; }
+
+ enum MultiMode {
+ NoMulti, InOrder, Random, NoMultiRandom
+ };
+ void setMultiWallpaperMode(int mode);
+ int multiWallpaperMode() const { return m_MultiMode; }
+
+ enum MinOptDepth {
+ AlwaysOpt, Opt16bpp, Opt15bpp, NeverOpt };
+
+ void setMinOptimizationDepth( int mode );
+ int minOptimizationDepth() const { return m_MinOptimizationDepth; }
+ bool optimize() const;
+
+ void setUseShm( bool use );
+ bool useShm() const { return m_bShm; }
+
+ void changeWallpaper(bool init=false);
+ void updateWallpaperFiles();
+ void randomizeWallpaperFiles();
+
+ QString currentWallpaper() const;
+ /**
+ * @return true if the currentWallpaper has changed
+ */
+ bool discardCurrentWallpaper();
+ int lastWallpaperChange() const { return m_LastChange; }
+ bool needWallpaperChange();
+
+ void readSettings(bool reparse=false);
+ void writeSettings();
+ QString configGroupName() const;
+
+ int hash();
+ QString fingerprint();
+
+ void setEnabled( const bool enable );
+ bool enabled() const { return m_bEnabled; }
+
+private:
+ void updateHash();
+
+ bool dirty;
+ bool hashdirty;
+ int m_Screen, m_Desk, m_Hash;
+
+ QColor m_ColorA, defColorA;
+ QColor m_ColorB, defColorB;
+ QString m_Wallpaper;
+ QStringList m_WallpaperList, m_WallpaperFiles;
+
+ int m_BackgroundMode, defBackgroundMode;
+ int m_WallpaperMode, defWallpaperMode;
+ int m_BlendMode, defBlendMode;
+ int m_BlendBalance, defBlendBalance;
+ bool m_ReverseBlending, defReverseBlending;
+ int m_MinOptimizationDepth;
+ bool m_bShm;
+ bool m_bDrawBackgroundPerScreen;
+
+ int m_MultiMode, defMultiMode;
+ int m_Interval, m_LastChange;
+ int m_CurrentWallpaper;
+ QString m_CurrentWallpaperName;
+
+ KConfig *m_pConfig;
+ KStandardDirs *m_pDirs;
+ bool m_bDeleteConfig;
+ bool m_bEnabled;
+
+public:
+ QMap<QString,int> m_BMMap;
+ QMap<QString,int> m_WMMap;
+ QMap<QString,int> m_MMMap;
+ QMap<QString,int> m_BlMMap;
+ char *m_BMRevMap[16];
+ char *m_WMRevMap[16];
+ char *m_MMRevMap[16];
+ char *m_BlMRevMap[16];
+};
+
+
+/**
+ * A class to read/modify the global desktop background settings.
+ */
+class KGlobalBackgroundSettings
+{
+public:
+ KGlobalBackgroundSettings(KConfig *config);
+
+ QString deskName(int desk);
+ //void setDeskName(int desk, QString name);
+
+ int cacheSize() { return m_CacheSize; }
+ void setCacheSize(int size);
+
+ bool drawBackgroundPerScreen(int desk) const;
+ void setDrawBackgroundPerScreen(int desk, bool perScreen);
+
+ bool limitCache() { return m_bLimitCache; }
+ void setLimitCache(bool limit);
+
+ bool commonScreenBackground() { return m_bCommonScreen; }
+ void setCommonScreenBackground(bool common);
+
+ bool commonDeskBackground() { return m_bCommonDesk; }
+ void setCommonDeskBackground(bool common);
+
+ bool dockPanel() { return m_bDock; }
+ void setDockPanel(bool dock);
+
+ bool exportBackground() {return m_bExport; }
+ void setExportBackground(bool _export);
+
+ void setTextColor(QColor _color);
+ QColor textColor() const { return m_TextColor; }
+
+ void setTextBackgroundColor(QColor _color);
+ QColor textBackgroundColor() const { return m_TextBackgroundColor; }
+
+ void setShadowEnabled(bool enabled);
+ bool shadowEnabled() const { return m_shadowEnabled; }
+
+ void setTextLines(int lines);
+ int textLines() const { return m_textLines; }
+ void setTextWidth(int width);
+ int textWidth() const { return m_textWidth; }
+
+ void readSettings();
+ void writeSettings();
+ KConfig* getConfig() { return m_pConfig; }
+
+private:
+ bool dirty;
+ bool m_bCommonDesk;
+ bool m_bCommonScreen;
+ bool m_bDock;
+ bool m_bLimitCache, m_bExport;
+ int m_CacheSize;
+ QStringList m_Names;
+
+ QColor m_TextColor;
+ QColor m_TextBackgroundColor;
+ bool m_shadowEnabled;
+ int m_textLines;
+ int m_textWidth;
+ KConfig *m_pConfig;
+ bool m_bDeleteConfig;
+ QValueVector<bool> m_bDrawBackgroundPerScreen; // m_bDrawBackgroundPerScreen[desk]
+};
+
+
+#endif // __BGSettings_h_Included__
diff --git a/kcontrol/background/bgwallpaper.cpp b/kcontrol/background/bgwallpaper.cpp
new file mode 100644
index 000000000..9786059eb
--- /dev/null
+++ b/kcontrol/background/bgwallpaper.cpp
@@ -0,0 +1,238 @@
+/* vi: ts=8 sts=4 sw=4
+
+ This file is part of the KDE project, module kcmbackground.
+
+ Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#include <qcheckbox.h>
+#include <qevent.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+
+#include <kfiledialog.h>
+#include <kimageio.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kurldrag.h>
+
+#include "bgsettings.h"
+#include "bgwallpaper.h"
+#include "bgwallpaper_ui.h"
+
+/**** BGMultiWallpaperList ****/
+
+BGMultiWallpaperList::BGMultiWallpaperList(QWidget *parent, const char *name)
+ : QListBox(parent, name)
+{
+ setAcceptDrops(true);
+ setSelectionMode(QListBox::Extended);
+}
+
+
+void BGMultiWallpaperList::dragEnterEvent(QDragEnterEvent *ev)
+{
+ ev->accept(KURLDrag::canDecode(ev));
+}
+
+
+void BGMultiWallpaperList::dropEvent(QDropEvent *ev)
+{
+ QStringList files;
+ KURL::List urls;
+ KURLDrag::decode(ev, urls);
+ for(KURL::List::ConstIterator it = urls.begin();
+ it != urls.end(); ++it)
+ {
+ // TODO: Download remote files
+ if ((*it).isLocalFile())
+ files.append((*it).path());
+ }
+ insertStringList(files);
+}
+
+bool BGMultiWallpaperList::hasSelection()
+{
+ for ( unsigned i = 0; i < count(); i++)
+ {
+ if ( item( i ) && item( i )->isSelected() )
+ return true;
+ }
+ return false;
+}
+
+void BGMultiWallpaperList::ensureSelectionVisible()
+{
+ for ( int i = topItem(); i < topItem() + numItemsVisible() - 1; i++)
+ if ( item( i ) && item( i )->isSelected() )
+ return;
+
+ for ( unsigned i = 0; i < count(); i++)
+ if ( item( i ) && item( i )->isSelected() )
+ {
+ setTopItem( i );
+ return;
+ }
+}
+
+/**** BGMultiWallpaperDialog ****/
+
+BGMultiWallpaperDialog::BGMultiWallpaperDialog(KBackgroundSettings *settings,
+ QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, i18n("Setup Slide Show"),
+ Ok | Cancel, Ok, true), m_pSettings(settings)
+{
+ dlg = new BGMultiWallpaperBase(this);
+ setMainWidget(dlg);
+
+ dlg->m_spinInterval->setRange(1, 99999);
+ dlg->m_spinInterval->setSteps(1, 15);
+ dlg->m_spinInterval->setSuffix(i18n(" min"));
+
+ // Load
+ dlg->m_spinInterval->setValue(QMAX(1,m_pSettings->wallpaperChangeInterval()));
+
+ dlg->m_listImages->insertStringList(m_pSettings->wallpaperList());
+
+ if (m_pSettings->multiWallpaperMode() == KBackgroundSettings::Random)
+ dlg->m_cbRandom->setChecked(true);
+
+ connect(dlg->m_buttonAdd, SIGNAL(clicked()), SLOT(slotAdd()));
+ connect(dlg->m_buttonRemove, SIGNAL(clicked()), SLOT(slotRemove()));
+ connect(dlg->m_buttonMoveUp, SIGNAL(clicked()), SLOT(slotMoveUp()));
+ connect(dlg->m_buttonMoveDown, SIGNAL(clicked()), SLOT(slotMoveDown()));
+ connect(dlg->m_listImages, SIGNAL(clicked ( QListBoxItem * )), SLOT(slotItemSelected( QListBoxItem *)));
+ dlg->m_buttonRemove->setEnabled( false );
+ dlg->m_buttonMoveUp->setEnabled( false );
+ dlg->m_buttonMoveDown->setEnabled( false );
+
+}
+
+void BGMultiWallpaperDialog::slotItemSelected( QListBoxItem * )
+{
+ dlg->m_buttonRemove->setEnabled( dlg->m_listImages->hasSelection() );
+ setEnabledMoveButtons();
+}
+
+void BGMultiWallpaperDialog::setEnabledMoveButtons()
+{
+ bool hasSelection = dlg->m_listImages->hasSelection();
+ QListBoxItem * item;
+
+ item = dlg->m_listImages->firstItem();
+ dlg->m_buttonMoveUp->setEnabled( hasSelection && item && !item->isSelected() );
+ item = dlg->m_listImages->item( dlg->m_listImages->count() - 1 );
+ dlg->m_buttonMoveDown->setEnabled( hasSelection && item && !item->isSelected() );
+}
+
+void BGMultiWallpaperDialog::slotAdd()
+{
+ QStringList mimeTypes = KImageIO::mimeTypes( KImageIO::Reading );
+#ifdef HAVE_LIBART
+ mimeTypes += "image/svg+xml";
+#endif
+
+ KFileDialog fileDialog(KGlobal::dirs()->findDirs("wallpaper", "").first(),
+ mimeTypes.join( " " ), this,
+ 0L, true);
+
+ fileDialog.setCaption(i18n("Select Image"));
+ KFile::Mode mode = static_cast<KFile::Mode> (KFile::Files |
+ KFile::Directory |
+ KFile::ExistingOnly |
+ KFile::LocalOnly);
+ fileDialog.setMode(mode);
+ fileDialog.exec();
+ QStringList files = fileDialog.selectedFiles();
+ if (files.isEmpty())
+ return;
+
+ dlg->m_listImages->insertStringList(files);
+}
+
+void BGMultiWallpaperDialog::slotRemove()
+{
+ int current = -1;
+ for ( unsigned i = 0; i < dlg->m_listImages->count();)
+ {
+ QListBoxItem * item = dlg->m_listImages->item( i );
+ if ( item && item->isSelected())
+ {
+ dlg->m_listImages->removeItem(i);
+ if (current == -1)
+ current = i;
+ }
+ else
+ i++;
+ }
+ if ((current != -1) && (current < (signed)dlg->m_listImages->count()))
+ dlg->m_listImages->setSelected(current, true);
+
+ dlg->m_buttonRemove->setEnabled(dlg->m_listImages->hasSelection());
+
+ setEnabledMoveButtons();
+}
+
+void BGMultiWallpaperDialog::slotMoveUp()
+{
+ for ( unsigned i = 1; i < dlg->m_listImages->count(); i++)
+ {
+ QListBoxItem * item = dlg->m_listImages->item( i );
+ if ( item && item->isSelected() )
+ {
+ dlg->m_listImages->takeItem( item );
+ dlg->m_listImages->insertItem( item, i - 1 );
+ }
+ }
+ dlg->m_listImages->ensureSelectionVisible();
+ setEnabledMoveButtons();
+}
+
+void BGMultiWallpaperDialog::slotMoveDown()
+{
+ for ( unsigned i = dlg->m_listImages->count() - 1; i > 0; i--)
+ {
+ QListBoxItem * item = dlg->m_listImages->item( i - 1 );
+ if ( item && item->isSelected())
+ {
+ dlg->m_listImages->takeItem( item );
+ dlg->m_listImages->insertItem( item, i );
+ }
+ }
+ dlg->m_listImages->ensureSelectionVisible();
+ setEnabledMoveButtons();
+}
+
+void BGMultiWallpaperDialog::slotOk()
+{
+ QStringList lst;
+ for (unsigned i=0; i < dlg->m_listImages->count(); i++)
+ lst.append(dlg->m_listImages->text(i));
+ m_pSettings->setWallpaperList(lst);
+ m_pSettings->setWallpaperChangeInterval(dlg->m_spinInterval->value());
+ if (dlg->m_cbRandom->isChecked())
+ m_pSettings->setMultiWallpaperMode(KBackgroundSettings::Random);
+ else
+ m_pSettings->setMultiWallpaperMode(KBackgroundSettings::InOrder);
+ accept();
+}
+
+
+#include "bgwallpaper.moc"
diff --git a/kcontrol/background/bgwallpaper.h b/kcontrol/background/bgwallpaper.h
new file mode 100644
index 000000000..0ecc1e6a4
--- /dev/null
+++ b/kcontrol/background/bgwallpaper.h
@@ -0,0 +1,66 @@
+/* vi: ts=8 sts=4 sw=4
+
+ This file is part of the KDE project, module kcmbackground.
+
+ Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _BGWALLPAPER_H_
+#define _BGWALLPAPER_H_
+
+#include <qlistbox.h>
+#include <qstringlist.h>
+
+#include <kdialogbase.h>
+
+class BGMultiWallpaperBase;
+class KBackgroundSettings;
+
+class BGMultiWallpaperList : public QListBox
+{
+public:
+ BGMultiWallpaperList(QWidget *parent, const char *name);
+
+ void dragEnterEvent(QDragEnterEvent *ev);
+ void dropEvent(QDropEvent *ev);
+ bool hasSelection();
+ void ensureSelectionVisible();
+};
+
+class BGMultiWallpaperDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ BGMultiWallpaperDialog(KBackgroundSettings *settings, QWidget *parent, const char *name=0);
+
+public slots:
+ void slotAdd();
+ void slotRemove();
+ void slotMoveUp();
+ void slotMoveDown();
+ void slotOk();
+ void slotItemSelected( QListBoxItem * );
+private:
+ void setEnabledMoveButtons();
+
+ KBackgroundSettings *m_pSettings;
+
+ BGMultiWallpaperBase *dlg;
+};
+
+#endif
diff --git a/kcontrol/background/bgwallpaper_ui.ui b/kcontrol/background/bgwallpaper_ui.ui
new file mode 100644
index 000000000..c3d9a9a40
--- /dev/null
+++ b/kcontrol/background/bgwallpaper_ui.ui
@@ -0,0 +1,167 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>BGMultiWallpaperBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>BGMultiWallPaperBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>410</width>
+ <height>196</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Show the following pictures:</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>m_cbRandom</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Show pictures in random order</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Change &amp;picture after:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_spinInterval</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>m_spinInterval</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="BGMultiWallpaperList" row="0" column="0" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>m_listImages</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>300</width>
+ <height>100</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>m_buttonAdd</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add...</string>
+ </property>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>m_buttonRemove</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>m_buttonMoveDown</cstring>
+ </property>
+ <property name="text">
+ <string>Move &amp;Down</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>m_buttonMoveUp</cstring>
+ </property>
+ <property name="text">
+ <string>Move &amp;Up</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<includes>
+ <include location="local" impldecl="in declaration">bgwallpaper.h</include>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/background/main.cpp b/kcontrol/background/main.cpp
new file mode 100644
index 000000000..433065c85
--- /dev/null
+++ b/kcontrol/background/main.cpp
@@ -0,0 +1,123 @@
+/* vi: ts=8 sts=4 sw=4
+ * This file is part of the KDE project, module kcmbackground.
+ * Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ * Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
+ *
+ * Based on old backgnd.cpp:
+ *
+ * Copyright (c) Martin R. Jones 1996
+ * Converted to a kcc module by Matthias Hoelzer 1997
+ * Gradient backgrounds by Mark Donohoe 1997
+ * Pattern backgrounds by Stephan Kulow 1998
+ * Randomizing & dnd & new display modes by Matej Koss 1998
+ *
+ * You can Freely distribute this program under the GNU General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ */
+
+#include <qlayout.h>
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <dcopclient.h>
+#include <kimageio.h>
+#include <kgenericfactory.h>
+
+#include "bgdialog.h"
+
+#include "main.h"
+
+/* as late as possible, as it includes some X headers without protecting them */
+#include <X11/Xlib.h>
+
+/**** DLL Interface ****/
+typedef KGenericFactory<KBackground, QWidget> KBackGndFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_background, KBackGndFactory("kcmbackground"))
+
+/**** KBackground ****/
+KBackground::~KBackground( )
+{
+ delete m_pConfig;
+}
+
+KBackground::KBackground(QWidget *parent, const char *name, const QStringList &/* */)
+ : KCModule(KBackGndFactory::instance(), parent, name)
+{
+ int screen_number = 0;
+ if (qt_xdisplay())
+ screen_number = DefaultScreen(qt_xdisplay());
+ QCString configname;
+ if (screen_number == 0)
+ configname = "kdesktoprc";
+ else
+ configname.sprintf("kdesktop-screen-%drc", screen_number);
+ m_pConfig = new KConfig(configname, false, false);
+
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ m_base = new BGDialog(this, m_pConfig);
+ setQuickHelp( m_base->quickHelp());
+ layout->add(m_base);
+ layout->addStretch();
+
+ KImageIO::registerFormats();
+
+ // reparenting that is done.
+ setAcceptDrops(true);
+
+ connect(m_base, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmbackground"), I18N_NOOP("KDE Background Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 1997-2002 Martin R. Jones"));
+
+ about->addAuthor("Waldo Bastian", 0, "bastian@kde.org");
+ about->addAuthor("George Staikos", 0, "staikos@kde.org");
+ about->addAuthor("Martin R. Jones", 0, "jones@kde.org");
+ about->addAuthor("Matthias Hoelzer-Kluepfel", 0, "mhk@kde.org");
+ about->addAuthor("Stephan Kulow", 0, "coolo@kde.org");
+ about->addAuthor("Mark Donohoe", 0, 0);
+ about->addAuthor("Matej Koss", 0 , 0);
+
+ setAboutData( about );
+}
+
+void KBackground::load()
+{
+ load( false );
+}
+
+void KBackground::load( bool useDefaults )
+{
+ m_base->load( useDefaults );
+}
+
+
+void KBackground::save()
+{
+ m_base->save();
+
+ // reconfigure kdesktop. kdesktop will notify all clients
+ DCOPClient *client = kapp->dcopClient();
+ if (!client->isAttached())
+ client->attach();
+
+ int screen_number = 0;
+ if (qt_xdisplay())
+ screen_number = DefaultScreen(qt_xdisplay());
+ QCString appname;
+ if (screen_number == 0)
+ appname = "kdesktop";
+ else
+ appname.sprintf("kdesktop-screen-%d", screen_number);
+
+ client->send(appname, "KBackgroundIface", "configure()", "");
+}
+
+void KBackground::defaults()
+{
+ m_base->defaults();
+}
+
+#include "main.moc"
diff --git a/kcontrol/background/main.h b/kcontrol/background/main.h
new file mode 100644
index 000000000..a220b57b6
--- /dev/null
+++ b/kcontrol/background/main.h
@@ -0,0 +1,40 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * This file is part of the KDE project, module kcmdisplay.
+ * Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ *
+ * You can Freely distribute this program under the GNU General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ */
+
+#ifndef __Bgnd_h_Included__
+#define __Bgnd_h_Included__
+
+#include <kcmodule.h>
+
+class KConfig;
+class BGDialog;
+
+/**
+ * The Desktop/Background tab in kcontrol.
+ */
+class KBackground: public KCModule
+{
+ Q_OBJECT
+
+public:
+ KBackground(QWidget *parent, const char *name, const QStringList &);
+ ~KBackground();
+
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+
+private:
+ BGDialog *m_base;
+ KConfig *m_pConfig;
+};
+
+
+#endif // __Bgnd_h_Included__
diff --git a/kcontrol/background/pics/Makefile.am b/kcontrol/background/pics/Makefile.am
new file mode 100644
index 000000000..d639379d0
--- /dev/null
+++ b/kcontrol/background/pics/Makefile.am
@@ -0,0 +1,5 @@
+pics_DATA = monitor.png
+picsdir = $(kde_datadir)/kcontrol/pics
+
+EXTRA_DIST = $(pics_DATA)
+
diff --git a/kcontrol/background/pics/monitor.png b/kcontrol/background/pics/monitor.png
new file mode 100644
index 000000000..ecd86b9e4
--- /dev/null
+++ b/kcontrol/background/pics/monitor.png
Binary files differ
diff --git a/kcontrol/bell/Makefile.am b/kcontrol/bell/Makefile.am
new file mode 100644
index 000000000..3c3d94181
--- /dev/null
+++ b/kcontrol/bell/Makefile.am
@@ -0,0 +1,15 @@
+kde_module_LTLIBRARIES = kcm_bell.la
+
+kcm_bell_la_SOURCES = bell.cpp
+
+kcm_bell_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_bell_la_LIBADD = -lkdeui
+
+AM_CPPFLAGS= $(all_includes)
+
+METASOURCES = bell.moc
+
+messages:
+ $(XGETTEXT) $(kcm_bell_la_SOURCES) -o $(podir)/kcmbell.pot
+
+xdg_apps_DATA = bell.desktop
diff --git a/kcontrol/bell/bell.cpp b/kcontrol/bell/bell.cpp
new file mode 100644
index 000000000..707e6c151
--- /dev/null
+++ b/kcontrol/bell/bell.cpp
@@ -0,0 +1,256 @@
+/*
+ Copyright (c) 1997 Christian Czezatke (e9025461@student.tuwien.ac.at)
+ 1998 Bernd Wuebben <wuebben@kde.org>
+ 2000 Matthias Elter <elter@kde.org>
+ 2001 Carsten PFeiffer <pfeiffer@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qwhatsthis.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <knotifyclient.h>
+#include <knuminput.h>
+
+#include "bell.h"
+#include "bell.moc"
+
+#include <X11/Xlib.h>
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_bell(QWidget *parent, const char *)
+ {
+ return new KBellConfig(parent, "kcmbell");
+ }
+
+ KDE_EXPORT void init_bell()
+ {
+ XKeyboardState kbd;
+ XKeyboardControl kbdc;
+
+ XGetKeyboardControl(kapp->getDisplay(), &kbd);
+
+ KConfig config("kcmbellrc", true, false);
+ config.setGroup("General");
+
+ kbdc.bell_percent = config.readNumEntry("Volume", kbd.bell_percent);
+ kbdc.bell_pitch = config.readNumEntry("Pitch", kbd.bell_pitch);
+ kbdc.bell_duration = config.readNumEntry("Duration", kbd.bell_duration);
+ XChangeKeyboardControl(kapp->getDisplay(),
+ KBBellPercent | KBBellPitch | KBBellDuration,
+ &kbdc);
+ }
+}
+
+KBellConfig::KBellConfig(QWidget *parent, const char *name):
+ KCModule(parent, name)
+{
+ QBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ int row = 0;
+ QGroupBox *box = new QGroupBox( i18n("Bell Settings"), this );
+ box->setColumnLayout( 0, Qt::Horizontal );
+ layout->addWidget(box);
+ layout->addStretch();
+ QGridLayout *grid = new QGridLayout(box->layout(), KDialog::spacingHint());
+ grid->setColStretch(0, 0);
+ grid->setColStretch(1, 1);
+ grid->addColSpacing(0, 30);
+
+ m_useBell = new QCheckBox( i18n("&Use system bell instead of system notification" ), box );
+ QWhatsThis::add(m_useBell, i18n("You can use the standard system bell (PC speaker) or a "
+ "more sophisticated system notification, see the "
+ "\"System Notifications\" control module for the "
+ "\"Something Special Happened in the Program\" event."));
+ connect(m_useBell, SIGNAL( toggled( bool )), SLOT( useBell( bool )));
+ row++;
+ grid->addMultiCellWidget(m_useBell, row, row, 0, 1);
+
+ setQuickHelp( i18n("<h1>System Bell</h1> Here you can customize the sound of the standard system bell,"
+ " i.e. the \"beep\" you always hear when there is something wrong. Note that you can further"
+ " customize this sound using the \"Accessibility\" control module; for example, you can choose"
+ " a sound file to be played instead of the standard bell."));
+
+ m_volume = new KIntNumInput(50, box);
+ m_volume->setLabel(i18n("&Volume:"));
+ m_volume->setRange(0, 100, 5);
+ m_volume->setSuffix("%");
+ m_volume->setSteps(5,25);
+ grid->addWidget(m_volume, ++row, 1);
+ QWhatsThis::add( m_volume, i18n("Here you can customize the volume of the system bell. For further"
+ " customization of the bell, see the \"Accessibility\" control module.") );
+
+ m_pitch = new KIntNumInput(m_volume, 800, box);
+ m_pitch->setLabel(i18n("&Pitch:"));
+ m_pitch->setRange(20, 2000, 20);
+ m_pitch->setSuffix(i18n(" Hz"));
+ m_pitch->setSteps(40,200);
+ grid->addWidget(m_pitch, ++row, 1);
+ QWhatsThis::add( m_pitch, i18n("Here you can customize the pitch of the system bell. For further"
+ " customization of the bell, see the \"Accessibility\" control module.") );
+
+ m_duration = new KIntNumInput(m_pitch, 100, box);
+ m_duration->setLabel(i18n("&Duration:"));
+ m_duration->setRange(1, 1000, 50);
+ m_duration->setSuffix(i18n(" msec"));
+ m_duration->setSteps(20,100);
+ grid->addWidget(m_duration, ++row, 1);
+ QWhatsThis::add( m_duration, i18n("Here you can customize the duration of the system bell. For further"
+ " customization of the bell, see the \"Accessibility\" control module.") );
+
+ QBoxLayout *boxLayout = new QHBoxLayout();
+ m_testButton = new QPushButton(i18n("&Test"), box, "test");
+ boxLayout->addWidget(m_testButton, 0, AlignRight);
+ grid->addLayout( boxLayout, ++row, 1 );
+ connect( m_testButton, SIGNAL(clicked()), SLOT(ringBell()));
+ QWhatsThis::add( m_testButton, i18n("Click \"Test\" to hear how the system bell will sound using your changed settings.") );
+
+ // watch for changes
+ connect(m_volume, SIGNAL(valueChanged(int)), SLOT(changed()));
+ connect(m_pitch, SIGNAL(valueChanged(int)), SLOT(changed()));
+ connect(m_duration, SIGNAL(valueChanged(int)), SLOT(changed()));
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmbell"), I18N_NOOP("KDE Bell Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 1997 - 2001 Christian Czezatke, Matthias Elter"));
+
+ about->addAuthor("Christian Czezatke", I18N_NOOP("Original author"), "e9025461@student.tuwien.ac.at");
+ about->addAuthor("Bernd Wuebben", 0, "wuebben@kde.org");
+ about->addAuthor("Matthias Elter", I18N_NOOP("Current maintainer"), "elter@kde.org");
+ about->addAuthor("Carsten Pfeiffer", 0, "pfeiffer@kde.org");
+ setAboutData(about);
+
+ load();
+}
+
+void KBellConfig::load()
+{
+ load( false );
+}
+
+void KBellConfig::load( bool useDefaults )
+{
+ XKeyboardState kbd;
+ XGetKeyboardControl(kapp->getDisplay(), &kbd);
+
+ m_volume->setValue(kbd.bell_percent);
+ m_pitch->setValue(kbd.bell_pitch);
+ m_duration->setValue(kbd.bell_duration);
+
+ KConfig cfg("kdeglobals", false, false);
+ cfg.setReadDefaults( useDefaults );
+ cfg.setGroup("General");
+ m_useBell->setChecked(cfg.readBoolEntry("UseSystemBell", false));
+ useBell(m_useBell->isChecked());
+ emit changed( useDefaults );
+}
+
+void KBellConfig::save()
+{
+ XKeyboardControl kbd;
+
+ int bellVolume = m_volume->value();
+ int bellPitch = m_pitch->value();
+ int bellDuration = m_duration->value();
+
+ kbd.bell_percent = bellVolume;
+ kbd.bell_pitch = bellPitch;
+ kbd.bell_duration = bellDuration;
+ XChangeKeyboardControl(kapp->getDisplay(),
+ KBBellPercent | KBBellPitch | KBBellDuration,
+ &kbd);
+
+ KConfig config("kcmbellrc", false, false);
+ config.setGroup("General");
+ config.writeEntry("Volume",bellVolume);
+ config.writeEntry("Pitch",bellPitch);
+ config.writeEntry("Duration",bellDuration);
+
+ config.sync();
+
+ KConfig cfg("kdeglobals", false, false);
+ cfg.setGroup("General");
+ cfg.writeEntry("UseSystemBell", m_useBell->isChecked());
+ cfg.sync();
+
+ if (!m_useBell->isChecked())
+ {
+ KConfig config("kaccessrc", false);
+
+ config.setGroup("Bell");
+ config.writeEntry("SystemBell", false);
+ config.writeEntry("ArtsBell", false);
+ config.writeEntry("VisibleBell", false);
+ }
+}
+
+void KBellConfig::ringBell()
+{
+ if (!m_useBell->isChecked()) {
+ KNotifyClient::beep();
+ return;
+ }
+
+ // store the old state
+ XKeyboardState old_state;
+ XGetKeyboardControl(kapp->getDisplay(), &old_state);
+
+ // switch to the test state
+ XKeyboardControl kbd;
+ kbd.bell_percent = m_volume->value();
+ kbd.bell_pitch = m_pitch->value();
+ if (m_volume->value() > 0)
+ kbd.bell_duration = m_duration->value();
+ else
+ kbd.bell_duration = 0;
+ XChangeKeyboardControl(kapp->getDisplay(),
+ KBBellPercent | KBBellPitch | KBBellDuration,
+ &kbd);
+ // ring bell
+ XBell(kapp->getDisplay(),0);
+
+ // restore old state
+ kbd.bell_percent = old_state.bell_percent;
+ kbd.bell_pitch = old_state.bell_pitch;
+ kbd.bell_duration = old_state.bell_duration;
+ XChangeKeyboardControl(kapp->getDisplay(),
+ KBBellPercent | KBBellPitch | KBBellDuration,
+ &kbd);
+}
+
+void KBellConfig::defaults()
+{
+ load( true );
+}
+
+void KBellConfig::useBell( bool on )
+{
+ m_volume->setEnabled( on );
+ m_pitch->setEnabled( on );
+ m_duration->setEnabled( on );
+ m_testButton->setEnabled( on );
+ changed();
+}
diff --git a/kcontrol/bell/bell.desktop b/kcontrol/bell/bell.desktop
new file mode 100644
index 000000000..5fbc7193e
--- /dev/null
+++ b/kcontrol/bell/bell.desktop
@@ -0,0 +1,251 @@
+[Desktop Entry]
+Exec=kcmshell bell
+Icon=bell
+Type=Application
+DocPath=kcontrol/bell/index.html
+Categories=Qt;KDE;X-KDE-settings-sound;
+
+
+X-KDE-Library=bell
+X-KDE-Init=bell
+X-KDE-ParentApp=kcontrol
+
+Name=System Bell
+Name[af]=Stelsel Klok
+Name[ar]=جرس النظام
+Name[az]=Sistem Zınqırovu
+Name[be]=Сістэмны званок
+Name[bg]=Системен звук
+Name[bn]=সিস্টেম ঘণ্টা
+Name[br]=Kloc'h ar reizhiad
+Name[bs]=Sistemsko zvono
+Name[ca]=Timbre del sistema
+Name[cs]=Systémový zvonek
+Name[csb]=Systemowi brzãczk
+Name[cy]=Cloch Cysawd
+Name[da]=Systemklokke
+Name[de]=Signalton
+Name[el]=Μεγαφωνάκι συστήματος
+Name[eo]=Sistempepo
+Name[es]=Timbre del sistema
+Name[et]=Süsteemne signaal
+Name[eu]=Sistemaren ezkila
+Name[fa]=زنگ سیستم
+Name[fi]=Järjestelmän varoitus
+Name[fo]=Kervisklokka
+Name[fr]=Cloche du système
+Name[fy]=Systeembel
+Name[ga]=Clog an Chórais
+Name[gl]=Badalada do Sistema
+Name[he]=פעמון המערכת
+Name[hi]=तंत्र घंटी
+Name[hr]=Sistemsko zvono
+Name[hu]=Rendszercsengő
+Name[id]=Bel Sistem
+Name[is]=Kerfisbjalla
+Name[it]=Campanella di sistema
+Name[ja]=システムベル
+Name[ka]=სისტემის ხმოვანი სიგნალი
+Name[kk]=Жүйелік қоңырау
+Name[km]=កណ្ដឹង​ប្រព័ន្ធ
+Name[ko]=시스템 종소리
+Name[lo]=ກະດິງລະບົບ
+Name[lt]=Sistemos skambutis
+Name[lv]=Sistēmas Zvans
+Name[mk]=Системско ѕвонче
+Name[mn]=Сигналийн чимээ
+Name[ms]=Loceng Sistem
+Name[mt]=Spijker tas-sistema
+Name[nb]=Systemlyd
+Name[nds]=Systeempingel
+Name[ne]=प्रणाली बेल
+Name[nl]=Systeembel
+Name[nn]=Systemlyd
+Name[nso]=Bell ya System
+Name[oc]=Timbre dèu sistemo
+Name[pa]=ਸਿਸਟਮ ਘੰਟੀ
+Name[pl]=Brzęczyk systemowy
+Name[pt]=Campainha do Sistema
+Name[pt_BR]=Campainha do sistema
+Name[ro]=Sunet de difuzor
+Name[ru]=Системный звуковой сигнал
+Name[rw]=Inzogera Sisitemu
+Name[se]=Vuogádatjietna
+Name[sk]=Zvonček
+Name[sl]=Sistemski zvonec
+Name[sr]=Системско звоно
+Name[sr@Latn]=Sistemsko zvono
+Name[ss]=Umshini Bell
+Name[sv]=Systemsummer
+Name[ta]=அமைப்பு மணி
+Name[te]=వ్యవస్థ గంట
+Name[tg]=Занги система
+Name[th]=ออดระบบ
+Name[tr]=Sistem Zili
+Name[tt]=Sistem Zile
+Name[uk]=Системний дзвінок
+Name[uz]=Tizim tovush signali
+Name[uz@cyrillic]=Тизим товуш сигнали
+Name[ven]=Bele ya sisitemu
+Name[vi]=Chuông Hệ thống
+Name[wa]=Xhîlete do sistinme
+Name[xh]=Indlela yokusebenza Yentsimbi
+Name[zh_CN]=系统铃声
+Name[zh_TW]=系統鈴聲
+Name[zu]=Insimbi yesistimu
+
+Comment=System Bell Configuration
+Comment[af]=Stelsel Klok Opstelling
+Comment[ar]=اعداد جرس النظام
+Comment[az]=Sistem Səsləri Quraşdırması
+Comment[be]=Настаўленне сістэмнага званка
+Comment[bg]=Настройване звуковия сигнал на системата
+Comment[bn]=সিস্টেম ঘণ্টা কনফিগারেশন
+Comment[br]=Kefluniañ kloc'h ar reizhiad
+Comment[bs]=Postavke za sistemsko zvono
+Comment[ca]=Configuració del timbre del sistema
+Comment[cs]=Nastavení systémového zvonku
+Comment[csb]=Kònfigùracëjô systemòwégò brzãczka
+Comment[cy]=Gosodiadau'r Cloch Cysawd
+Comment[da]=Systemklokkeindstilling
+Comment[de]=Einstellungen zum Signalton
+Comment[el]=Ρυθμίσεις για το μεγαφωνάκι του συστήματός σας
+Comment[eo]=Agordo de la sistempepo
+Comment[es]=Configuración del timbre del sistema
+Comment[et]=Süsteemse signaali seadistamine
+Comment[eu]=Sistemaren ezkilaren konfigurazioa
+Comment[fa]=پیکربندی زنگ سیستم
+Comment[fi]=Järjestelmän varoitusäänen asetus
+Comment[fo]=Uppseting av kervisklokka
+Comment[fr]=Configuration de la cloche du système
+Comment[fy]=Systeemlûden ynstelle
+Comment[ga]=Cumraíocht Chloig an Chórais
+Comment[gl]=Configuración da Badalada do Sistema
+Comment[he]=שינוי הגדרות פעמון המערכת
+Comment[hi]=तंत्र घंटी कॉन्फ़िगरेशन
+Comment[hr]=Konfiguracija sistemskog zvona
+Comment[hu]=A rendszercsengő beállításai
+Comment[id]=Konfigurasi Sistem Bel
+Comment[is]=Stillingar kerfishljóða
+Comment[it]=Configurazione campanella di sistema
+Comment[ja]=システムベルの設定
+Comment[ka]=სისტემის ხმოვანი სიგნალის კონფიგურაცია
+Comment[kk]=Жүйелік қоңырауды баптау
+Comment[km]=ការ​កំណត់​រចនាសម្ព័ន្ធ​កណ្ដឹង​ប្រព័ន្ធ
+Comment[ko]=시스템 종소리 설정
+Comment[lo]=ປັບແຕ່ງກະດິງລະບົບ
+Comment[lt]=Sistemos skambučio derinimas
+Comment[lv]=Sistēmas Zvana Konfigurācija
+Comment[mk]=Конфигурација на системското ѕвонче
+Comment[mn]=Сигналийн чимээ тохируулах
+Comment[ms]=Konfigurasi Loceng Sistem
+Comment[mt]=Konfigurazzjoni tal-ispijker tas-sistema
+Comment[nb]=Systemlydoppsett
+Comment[nds]=Systeempingel instellen
+Comment[ne]=प्रणाली बेल कन्फिगरेसन
+Comment[nl]=Systeemgeluiden instellen
+Comment[nn]=Systemlydoppsett
+Comment[nso]=Peakanyo ya Bell ya System
+Comment[oc]=Configuracion dèu timbre dèu sistemo
+Comment[pa]=ਸਿਸਟਮ ਘੰਟੀ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja brzęczka systemowego
+Comment[pt]=Configuração da Campainha do Sistema
+Comment[pt_BR]=Configuração da Campainha do Sistema
+Comment[ro]=Configurează sunetul de difuzor
+Comment[ru]=Настройка системного звукового сигнала
+Comment[rw]=Iboneza ry'Inzogera Sisitemu
+Comment[se]=Vuogádatjietnaheivehusat
+Comment[sk]=Nastavenie zvončeka
+Comment[sl]=Nastavitve sistemskega zvonca
+Comment[sr]=Подешавање системског звона
+Comment[sr@Latn]=Podešavanje sistemskog zvona
+Comment[ss]=Kuhleleka kwebheli yemshini
+Comment[sv]=Anpassa systemets summer
+Comment[ta]=மணி,ஒலி,சத்தம்,உரப்பு,சுருதி,இடைவெளி
+Comment[te]=వ్యవస్థ గంట అమరిక
+Comment[tg]=Танзимоти занги системаы
+Comment[th]=ปรับแต่งออดระบบ
+Comment[tr]=Sistem Sesleri Yapılandırması
+Comment[tt]=Sistem Zil Caylawı
+Comment[uk]=Налаштування системного дзвінка
+Comment[uz]=Tizim tovush signalini moslash
+Comment[uz@cyrillic]=Тизим товуш сигналини мослаш
+Comment[ven]=Nzudzanyo ya sisitemu ya Bele
+Comment[vi]=Cấu hình Chuông Hệ thống
+Comment[wa]=Apontiaedje del xhîlete do sistinme
+Comment[xh]=Uqwalaselo Lwendlela Yentsimbi
+Comment[zh_CN]=系统铃声配置
+Comment[zh_TW]=系統鈴聲組態
+Comment[zu]=Inhlanganiselo Yensimbi Yesistimu
+
+Keywords=Bell,Audio,Sound,Volume,Pitch,Duration
+Keywords[az]=çən,Səs,Səs,Səs Qurğusu,Addım,Müddət
+Keywords[be]=Званок,аўдыё,гук,гучнасць,Bell,Audio,Sound,Volume,Pitch,Duration
+Keywords[bg]=звук, системен, говорител, сила, Bell, Audio, Sound, Volume, Pitch, Duration
+Keywords[ca]=Timbre,Àudio,So,Volum,To,Durada
+Keywords[cs]=Systémový zvonek,Audio,Zvuk,Hlasitost,Trvání
+Keywords[csb]=brzãczk,audio,zwãk,głosnosc,tonacëjô,dérowanié
+Keywords[cy]=Cloch,Awdio,S?n,Sain,Gogwydd,Hyd
+Keywords[da]=Klokke,Audio,Lyd,Lydstyrke,Tonehøjde,Varighed
+Keywords[de]=Signalton,Systemton,Klänge,Audio,Sound,Dauer,Lautstärke,Höhen
+Keywords[el]=Μεγαφωνάκι,Audio,Ήχος,Ένταση,Τονισμός,Διάρκεια
+Keywords[eo]=pepo,sonoro,sono,aŭdio,alteco,daŭro
+Keywords[es]=Timbre,Audio,Sonido,Volumen,Tono,Duración
+Keywords[et]=signaal,audio,heli,helitugevus,helikõrgus,kestvus
+Keywords[eu]=Ezkila,Audioa,Soinua,Bolumena,Pitch-a,Iraupena
+Keywords[fa]=زنگ، صوتی، صوت، حجم صدا، زیروبمی صدا، دوام
+Keywords[fi]=Äänet,Piippaus,Ääni,Äänenvoimakkuus,Korkeus,Kesto
+Keywords[fr]=cloche,audio,son,volume,durée,modulation,bip
+Keywords[fy]=bel,audio,lûd,folume,singalering,lûd,duer,toan,toanen,toanhichte,systeemlûden,systeembel
+Keywords[ga]=Clog,Fuaim,Airde,Fad
+Keywords[gl]=Badalada,Audio,Son,Volume,Pitch,Duración
+Keywords[he]=פעמון,שמע,צליל,עצמה,גובה,משך, Bell,Audio,Sound,Volume,Pitch,Duration
+Keywords[hi]=घंटी,ऑडियो,ध्वनि,आवाज़ निर्धारक,पिच,अवधि
+Keywords[hr]=Bell,Audio,Sound,Volume,Pitch,Duration,Zvono,Zvuk,Zvuci sustava,Sistemsko zvono,Glasnoća,Razdoblje
+Keywords[hu]=csengő,audió,hang,hangerő,hangmagasság,időtartam
+Keywords[id]=Bel,Audio,Suara,Volume,Pitch,Durasi
+Keywords[is]=Kerfishljóð,hljóð,bjalla,styrkur,hljóðstyrkur,tónn,lengd,tónlengd
+Keywords[it]=campanella,audio,suono,volume,tono,durata
+Keywords[ja]=ベル,オーディオ,サウンド,音量,ピッチ,持続時間
+Keywords[ka]=ზარი, აუდიო, ხმა, ხმა, მიწოდება, ხანგრძლივობა
+Keywords[km]=កណ្ដឹង,សោត,សំឡេង,កម្ពស់​សំឡេង,ថិរវេលា
+Keywords[lo]=ກະດິງ,ລະບົບສງງ,ຄວາມດັງຂອງສງງ,ພິດສງງ, ດູເຣເຊິນ
+Keywords[lt]=Bell,skambutis,Audio,Sound,garsas,Volume,garsumas,Pitch,aukštis,Duration,trukmė
+Keywords[lv]=Zvans,Audio,Skaņa,Līmenis,Pīķis,Ilgums
+Keywords[mk]=Bell,Audio,Sound,Volume,Pitch,Duration,Ѕвонче,Аудио,Звук,Гласност,Амплитуда,Траење
+Keywords[mn]=Сигналийн чимээ,Системын чимээ,Чимээ,Дуу,Дууны чанга,Үргэлжилэл,Өндөр
+Keywords[ms]=Loceng,Audio,Bunyi,Volum,Pic,Tempoh
+Keywords[nb]=signal,audio,lyd,lydstyrke,volum,tone,lengde
+Keywords[nds]=Pingel,Audio,Klang,Kläng,Luutstärk,Pitch,Duer
+Keywords[ne]=बेल, अडियो, ध्वनि, भोल्युम, पिच, अन्तराल
+Keywords[nl]=bel,audio,sound,volume,signalering,geluid,duur,toon,tonen,toonhoogte,systeemgeluiden,systeembel
+Keywords[nn]=signal,audio,lyd,lydstyrke,volum,tone,lengd
+Keywords[nso]=Bell,Audio,Modumo,Volume,Pitch,Nako
+Keywords[pa]=Bell,Audio,Sound,Volume,Pitch,Duration, ਘੰਟੀ, ਆਡੀਓ, ਸਾਊਡ
+Keywords[pl]=Brzęczyk,Audio,Dźwięk,Głośność,Tonacja,Trwanie
+Keywords[pt]=Campainha,Áudio,Som,Volume,Frequência,Duração
+Keywords[pt_BR]=Campainha,Áudio,Som,Volume,Tom,Duração
+Keywords[ro]=difuzor,audio,sunet,volum,frecvență,durată
+Keywords[rw]=Inzogera,Inyumvo,Ijwi,Agahindurajwi,Iyatura,Igihebimara
+Keywords[se]=signála,audio,jietna,voluma,nuohtta,guhkkodat
+Keywords[sk]=Zvonček,Audio,Zvuk,Hlasitosť,Výška,Trvanie
+Keywords[sl]=zvonec,avdio,zvok,glasnost,višina,trajanje
+Keywords[sr]=Звоно,Аудио,Звук,Јачина,Трајање
+Keywords[sr@Latn]=Zvono,Audio,Zvuk,Jačina,Trajanje
+Keywords[ss]=Ibheli,I-audio,Umsindvo,Ivolumu,I-pitch,Sikhatsi
+Keywords[sv]=Summer,Ljud,Volym,Tonhöjd,Varaktighet
+Keywords[ta]=மணி,ஒலி அமைப்பு,ஒலி,ஒலி,இடம்,நேர அளவு
+Keywords[tg]=Bell,Audio,Sound,Volume,Pitch,Duration,Занг,Аудио,Садо
+Keywords[th]=ออด,ระบบเสียง,เสียง,ความดังเสียง,พิทช์เสียง,ดูเรชัน
+Keywords[tr]=zil,Ses,Ses,Ses Ayarı,Adım,Süre
+Keywords[uk]=аудіо,гучність,висота,тривалість,гудок,звук
+Keywords[uz]=Tovush signali,Audio,Tovush,Tovush balandligi,Pitch,Davom etishi
+Keywords[uz@cyrillic]=Товуш сигнали,Аудио,Товуш,Товуш баландлиги,Pitch,Давом этиши
+Keywords[ven]=Bele,Zwo u pfala,Mubvumo,Volomu,Fhufhela,Tshikhala
+Keywords[vi]=Chuông,Âm nhạc,Âm thanh,Âm lượng,Âm sắc,Thời lượng
+Keywords[wa]=Xhilete,Audio,Son,Volume,ton,hôteu,longueur
+Keywords[xh]=Intsimbi,Evakalayo,iSandi,Umqulu,Uniko lobude obufunekayo,Ixesha ezalithatha
+Keywords[zh_CN]=Bell,Audio,Sound,Volume,Pitch,Duration,响铃,音频,音量,音调,持续时间
+Keywords[zh_TW]=Bell,Audio,Sound,Volume,Pitch,Duration,響鈴,聲音,音量,音調,持續時間
+Keywords[zu]=Insimbi,Okuzwakalayo,Usimdo,Izinga lomsindo,Umnswininizo,Ubude besikhathi
+
diff --git a/kcontrol/bell/bell.h b/kcontrol/bell/bell.h
new file mode 100644
index 000000000..ceaf875df
--- /dev/null
+++ b/kcontrol/bell/bell.h
@@ -0,0 +1,54 @@
+/*
+ Copyright (c) 1997 Christian Czezatke (e9025461@student.tuwien.ac.at)
+ 1998 Bernd Wuebben <wuebben@kde.org>
+ 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __bell_h__
+#define __bell_h__
+
+#include "kcmodule.h"
+
+class QCheckBox;
+class KIntNumInput;
+class QPushButton;
+
+class KBellConfig : public KCModule
+{
+ Q_OBJECT
+
+ public:
+ KBellConfig(QWidget *parent, const char *name);
+
+ void load();
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+
+ protected slots:
+ void ringBell();
+ void useBell( bool );
+
+ private:
+ QPushButton *m_testButton;
+ KIntNumInput *m_volume;
+ KIntNumInput *m_pitch;
+ KIntNumInput *m_duration;
+ QCheckBox *m_useBell;
+};
+
+#endif
diff --git a/kcontrol/clock/Makefile.am b/kcontrol/clock/Makefile.am
new file mode 100644
index 000000000..0348e5878
--- /dev/null
+++ b/kcontrol/clock/Makefile.am
@@ -0,0 +1,15 @@
+kde_module_LTLIBRARIES = kcm_clock.la
+
+kcm_clock_la_SOURCES = dtime.cpp tzone.cpp main.cpp
+
+kcm_clock_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_clock_la_LIBADD = $(LIB_KIO)
+
+AM_CPPFLAGS = $(all_includes)
+
+METASOURCES = AUTO
+
+messages:
+ $(XGETTEXT) $(kcm_clock_la_SOURCES) -o $(podir)/kcmkclock.pot
+
+xdg_apps_DATA = clock.desktop
diff --git a/kcontrol/clock/clock.desktop b/kcontrol/clock/clock.desktop
new file mode 100644
index 000000000..1c3fc755a
--- /dev/null
+++ b/kcontrol/clock/clock.desktop
@@ -0,0 +1,250 @@
+[Desktop Entry]
+Type=Application
+Exec=kcmshell kde-clock.desktop
+Icon=date
+DocPath=kcontrol/clock/index.html
+
+
+X-KDE-Library=clock
+X-KDE-RootOnly=true
+X-KDE-SubstituteUID=true
+X-KDE-ParentApp=kcontrol
+
+Name=Date & Time
+Name[af]=Datum & Tyd
+Name[ar]=التاريخ و الوقت
+Name[az]=Tarix və Saat
+Name[be]=Дата і час
+Name[bg]=Дата и час
+Name[bn]=তারিখ এবং সময়
+Name[br]=Deiziad hag eur
+Name[bs]=Datum i vrijeme
+Name[ca]=Dia i hora
+Name[cs]=Datum a čas
+Name[csb]=Datum ë czas
+Name[cy]=Dyddiad ac Amser
+Name[da]=Dato og tid
+Name[de]=Datum & Zeit
+Name[el]=Ημερομηνία & Ώρα
+Name[eo]=Dato kaj Tempo
+Name[es]=Fecha y hora
+Name[et]=Kuupäev ja kellaaeg
+Name[eu]=Data eta ordua
+Name[fa]=تاریخ و زمان
+Name[fi]=Päivämäärä ja aika
+Name[fo]=Dato og tíð
+Name[fr]=Date et heure
+Name[fy]=Datum en Tiid
+Name[ga]=Dáta agus Am
+Name[gl]=Data e Hora
+Name[he]=תאריך ושעה
+Name[hi]=तिथि व समय
+Name[hr]=Datum i vrijeme
+Name[hu]=Dátum és idő
+Name[id]=Tanggal & Waktu
+Name[is]=Dagssetning og tími
+Name[it]=Data e ora
+Name[ja]=日付と時間
+Name[ka]=თარიღი და დრო
+Name[kk]=Күн мен уақыт
+Name[km]=កាលបរិច្ឆេទ & ពេលវេលា
+Name[ko]=날짜와 시간
+Name[lo]=ວັນແລະເວລາ
+Name[lt]=Data ir laikas
+Name[lv]=Datums un Laiks
+Name[mk]=Датум и време
+Name[mn]=Огноо & Цаг
+Name[ms]=Tarikh & Masa
+Name[mt]=Data u Ħin
+Name[nb]=Dato og klokkeslett
+Name[nds]=Datum & Tiet
+Name[ne]=मिति र समय
+Name[nl]=Datum en Tijd
+Name[nn]=Dato og Tid
+Name[nso]=Tsatsikgwedi & Nako
+Name[oc]=Dia e ora
+Name[pa]=ਮਿਤੀ ਅਤੇ ਸਮਾਂ
+Name[pl]=Data i czas
+Name[pt]=Data e Hora
+Name[pt_BR]=Data & Hora
+Name[ro]=Data și timpul
+Name[ru]=Дата и время
+Name[rw]=Itariki & Igihe
+Name[se]=Dáhton ja áigi
+Name[sk]=Dátum a čas
+Name[sl]=Datum in čas
+Name[sr]=Датум и време
+Name[sr@Latn]=Datum i vreme
+Name[ss]=Lisuku & sikhatsi
+Name[sv]=Datum och tid
+Name[ta]=தேதி & நேரம்
+Name[te]=తేది & సమయం
+Name[tg]=Таърих ва вақт
+Name[th]=วันและเวลา
+Name[tr]=Tarih ve Saat
+Name[tt]=Waqıt & Zaman
+Name[uk]=Дата і час
+Name[uz]=Sana va vaqt
+Name[uz@cyrillic]=Сана ва вақт
+Name[ven]=Datumu & Tshifhinga
+Name[vi]=Ngày & Giờ
+Name[wa]=Date et eure
+Name[xh]=Umhla & Ixesha
+Name[zh_CN]=日期和时间
+Name[zh_TW]=日期和時間
+Name[zu]=Usuku & Isikhathi
+
+Comment=Date and time settings
+Comment[af]=Datum en tyd instellings
+Comment[ar]=تعيينات التاريخ و الوقت
+Comment[az]=Tarix və saat qurğuları
+Comment[be]=Настаўленне даты і часу
+Comment[bg]=Настройване на датата и часа
+Comment[bn]=তারিখ এবং সময় সেটিংস
+Comment[br]=Kefluniañ an deiziad hag an eur
+Comment[bs]=Podesite datum i vrijeme
+Comment[ca]=Arranjament del dia i l'hora
+Comment[cs]=Nastavení data a času
+Comment[csb]=Ùstôw datuma ë czasu
+Comment[cy]=Gosodiadau dyddiad ac amser
+Comment[da]=Dato- og tidsindstillinger
+Comment[de]=Einstellungen für Datum und Zeit
+Comment[el]=Ρυθμίσεις ημερομηνίας και ώρας
+Comment[eo]=Agordo de dato kaj tempo
+Comment[es]=Preferencias sobre la fecha y hora
+Comment[et]=Kuupäeva ja kellaaja seadistused
+Comment[eu]=Data eta orduaren konfigurazioa
+Comment[fa]=تنظیمات تاریخ و زمان
+Comment[fi]=Päiväyksen ja ajan asetukset
+Comment[fo]=Seta urið
+Comment[fr]=Configuration de la date et de l'heure
+Comment[fy]=Ynstelle fan datum en tiid
+Comment[ga]=Socruithe dáta/ama
+Comment[gl]=Configuración da data e a hora
+Comment[he]=שינוי הגדרות התאריך והשעה
+Comment[hi]=तारीख़ तथा समय का विन्यास
+Comment[hr]=Postavke datuma i vremena
+Comment[hu]=A dátum és az idő beállításai
+Comment[id]=Seting tanggal dan waktu
+Comment[is]=Stillingar dagssetningar og klukku
+Comment[it]=Impostazione della data e dell'ora
+Comment[ja]=日付と時間の設定
+Comment[ka]=თარიღისა და დროის კონფიგურაცია
+Comment[kk]=Күн мен уақытты орнату
+Comment[km]=ការ​កំណត់​កាលបរិច្ឆេទ និង​ពេលវេលា
+Comment[ko]=날짜와 시간 설정
+Comment[lo]=ຕັ້ງຄ່າວັນແລະເວລາ
+Comment[lt]=Datos ir laiko parametrai
+Comment[lv]=Datuma un laika parametri
+Comment[mk]=Поставувања на датум и време
+Comment[mn]=Огноо ба цаг тохируулах
+Comment[ms]=Seting tarikh & Masa
+Comment[mt]=Konfigurazzjoni tad-data u l-ħin
+Comment[nb]=Innstilling av dato og klokkeslett
+Comment[nds]=Instellen vun Datum un Tiet
+Comment[ne]=मिति र समय सेटिङ
+Comment[nl]=Instellen van datum en tijd
+Comment[nn]=Innstilling av dato og klokkeslett
+Comment[nso]=Dipeakanyo tsa tsatsikgwedi le nako
+Comment[oc]=Configuracion dèu dia e l'ora
+Comment[pa]=ਮਿਤੀ ਅਤੇ ਸਮਾਂ ਸੈਟਿੰਗ
+Comment[pl]=Ustawienia daty i czasu
+Comment[pt]=Configuração da data e hora
+Comment[pt_BR]=Configurações de data e hora
+Comment[ro]=Configurează data și ora sistemului
+Comment[ru]=Настройка даты и времени
+Comment[rw]=Amagenamiterere y'itariki n'igihe
+Comment[se]=Dáhton- ja áigeheivehusat
+Comment[sk]=Nastavenia dátumu a času
+Comment[sl]=Nastavitve datuma in časa
+Comment[sr]=Поставке за датум и време
+Comment[sr@Latn]=Postavke za datum i vreme
+Comment[ss]=Kuhleleka kwelilanga kanye nesikhatsi
+Comment[sv]=Anpassa datum och tid
+Comment[ta]=தேதி மற்றும் நேர அமைப்புகள்
+Comment[te]=తేది మరయూ సమయం అమరికలు
+Comment[tg]=Танзимоти таърих ва вақт
+Comment[th]=ตั้งค่าวันและเวลา
+Comment[tr]=Tarih ve saat ayarları
+Comment[tt]=Waqıt-zaman caylaw
+Comment[uk]=Налаштування дати і часу
+Comment[uz]=Sana va vaqtning moslamalari
+Comment[uz@cyrillic]=Сана ва вақтнинг мосламалари
+Comment[ven]=Mavhekanyele a datumu na tshifhinga
+Comment[vi]=Thiết lập ngày giờ
+Comment[wa]=Apontiaedjes del date et l' eure
+Comment[xh]=Izicwangciso zomhla kunye nexesha
+Comment[zh_CN]=日期和时间设置
+Comment[zh_TW]=日期和時間設定值
+Comment[zu]=Izilungiso Zosuku kanye nesikhathi
+
+Keywords=clock,date,time,time zone
+Keywords[af]=horlosie,date,time,time zone,datum,tyd,tyd sone
+Keywords[ar]=الساعة,التاريخ,الوقت,المنطقة الزمنية
+Keywords[az]=tarix,saat,saat zolağı,zaman zolağı, vaxt, vaxt zolağı
+Keywords[be]=гадзіннік,дата,час,часавая зона,часавы пояс,clock,date,time,time zone
+Keywords[bg]=дата, час, време, часови, пояс, clock, date, time, time zone
+Keywords[br]=eurier,deiziad,amzer,takad-eur
+Keywords[bs]=sat,datum,vrijeme,date,time,clock
+Keywords[ca]=rellotge,data,hora,zona horària
+Keywords[cs]=Datum,Čas,Časová zóna
+Keywords[csb]=zédżer,datum,czas,czasowô cona
+Keywords[cy]=cloc,dyddiad,amser,cylchfa amser
+Keywords[da]=ur,dato,tid,tidszone
+Keywords[de]=uhr,datum,zeit,zeitzone
+Keywords[el]=ρολόι,ημερομηνία,ώρα,ζώνη ώρας
+Keywords[eo]=horloĝo,dato,tempo,tempozono
+Keywords[es]=reloj,fecha,hora,zona horaria
+Keywords[et]=kell,kuupäev,kellaaeg,ajavöönd
+Keywords[eu]=erlojua,data,ordua,ordu eremua
+Keywords[fa]=ساعت، تاریخ، زمان، ناحیۀ زمان
+Keywords[fi]=kello,päiväys,aika,aikavyöhyke
+Keywords[fr]=horloge,date,heure,fuseau horaire
+Keywords[fy]=datum,tiid,tiidszone,klok
+Keywords[ga]=clog,dáta,am,crios ama
+Keywords[gl]=data,reloxo,hora,zona horária
+Keywords[he]=clock,date,time,time zoneשעון,תאריך,זמן,אזור זמן
+Keywords[hi]=घड़ी,तारीख़,समय,समय क्षेत्र (टाइम ज़ोन)
+Keywords[hr]=clock,date,time,time zone,datum,vrijeme,vremenska zona
+Keywords[hu]=óra,dátum,idő,időzóna
+Keywords[id]=jam,tanggal,waktu,zona waktu
+Keywords[is]=dagssetning,klukka,tími
+Keywords[it]=data,ora,fuso orario,orologio
+Keywords[ja]=時刻,日付,時間,タイムゾーン
+Keywords[ka]=საათი, თარიღი, დრო, დროიტი სარტყელი
+Keywords[km]=នាឡិកា,កាលបរិច្ឆេទ,ពេលវេលា,តំបន់​ពេលវេលា
+Keywords[lt]=laikrodis,data,laikas,laiko juosta
+Keywords[lv]=pulkstenis,datums,laiks,laika zona
+Keywords[mk]=часовник,датум,време,временска зона
+Keywords[mn]=цаг,огноо,хугацаа,цагийн бүс
+Keywords[ms]=jam,tarikh,masa,zon masa
+Keywords[nb]=klokke,dato,tid,tidssone
+Keywords[nds]=Klock,Datum,Tiet,Tietzone,Tietrebeet
+Keywords[ne]=घडी, मिति, समय, टाइमजोन
+Keywords[nl]=datum,tijd,tijdszone,klok
+Keywords[nn]=klokke,dato,tid,tidssone
+Keywords[pa]=clock,date,time,time zone,ਘੜੀ,ਸਮਾਂ,ਸਮਾਂ ਖੇਤਰ
+Keywords[pl]=zegar, data, czas, strefa czasowa
+Keywords[pt]=relógio,data,hora,fuso horário
+Keywords[pt_BR]=relógio,data,hora,fuso horário
+Keywords[ro]=ceas,dată,timp,ora,zona de timp
+Keywords[rw]=Isaha,itariki,igihe,igihe fatizo
+Keywords[se]=diibmu,dáhton,áigi,áigeavádat
+Keywords[sk]=dátum,čas,časová zóna,hodiny
+Keywords[sl]=datum,ura,čas,časovno območje,CET,SEČ
+Keywords[sr]=date,time,time zone,датум,време,временска зона,датум,време,временска зона
+Keywords[sr@Latn]=date,time,time zone,datum,vreme,vremenska zona,datum,vreme,vremenska zona
+Keywords[sv]=klocka,datum,tid,tidszon
+Keywords[ta]=கடிகாரம்,தேதி,நேரம்,நேர பகுதி
+Keywords[tg]=соат,таърих,вақт,минтақаи вақт
+Keywords[th]=นาฬิกา,วัน,เวลา,พื้นที่เวลา
+Keywords[tr]=tarih,saat,saat dilimi,zaman,zaman dilimi
+Keywords[uk]=дата,час,часовий пояс,годинник
+Keywords[uz]=soat,sana,vaqt,vaqt zonasi
+Keywords[uz@cyrillic]=соат,сана,вақт,вақт зонаси
+Keywords[vi]=đồng hồ,ngày,giờ,múi giờ
+Keywords[wa]=ôrlodje,date,eure,coisse d' eureye
+Keywords[zh_CN]=clock,date,time,time zone,时钟,日期,时间,时区
+Keywords[zh_TW]=clock,日期,時間,時區
+
+Categories=Qt;KDE;X-KDE-settings-system;
diff --git a/kcontrol/clock/dtime.cpp b/kcontrol/clock/dtime.cpp
new file mode 100644
index 000000000..ba8330c7a
--- /dev/null
+++ b/kcontrol/clock/dtime.cpp
@@ -0,0 +1,449 @@
+/*
+ * dtime.cpp
+ *
+ * Copyright (C) 1998 Luca Montecchiani <m.luca@usa.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <qcombobox.h>
+#include <qgroupbox.h>
+#include <qpushbutton.h>
+#include <qpainter.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qwhatsthis.h>
+#include <qcheckbox.h>
+#include <qregexp.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kprocess.h>
+#include <kmessagebox.h>
+#include <kdialog.h>
+#include <kconfig.h>
+
+#include "dtime.h"
+#include "dtime.moc"
+
+HMSTimeWidget::HMSTimeWidget(QWidget *parent, const char *name) :
+ KIntSpinBox(parent, name)
+{
+}
+
+QString HMSTimeWidget::mapValueToText(int value)
+{
+ QString s = QString::number(value);
+ if( value < 10 ) {
+ s = "0" + s;
+ }
+ return s;
+}
+
+Dtime::Dtime(QWidget * parent, const char *name)
+ : QWidget(parent, name)
+{
+ // *************************************************************
+ // Start Dialog
+ // *************************************************************
+
+ // Time Server
+
+ privateLayoutWidget = new QWidget( this, "layout1" );
+ QHBoxLayout *layout1 = new QHBoxLayout( privateLayoutWidget, 0, 0, "ntplayout");
+
+ setDateTimeAuto = new QCheckBox( privateLayoutWidget, "setDateTimeAuto" );
+ setDateTimeAuto->setText(i18n("Set date and time &automatically:"));
+ connect(setDateTimeAuto, SIGNAL(toggled(bool)), this, SLOT(serverTimeCheck()));
+ connect(setDateTimeAuto, SIGNAL(toggled(bool)), SLOT(configChanged()));
+ layout1->addWidget( setDateTimeAuto );
+
+ timeServerList = new QComboBox( false, privateLayoutWidget, "timeServerList" );
+ connect(timeServerList, SIGNAL(activated(int)), SLOT(configChanged()));
+ connect(timeServerList, SIGNAL(textChanged(const QString &)), SLOT(configChanged()));
+ connect(setDateTimeAuto, SIGNAL(toggled(bool)), timeServerList, SLOT(setEnabled(bool)));
+ timeServerList->setEnabled(false);
+ timeServerList->setEditable(true);
+ layout1->addWidget( timeServerList );
+ findNTPutility();
+
+ // Date box
+ QGroupBox* dateBox = new QGroupBox( this, "dateBox" );
+
+ QVBoxLayout *l1 = new QVBoxLayout( dateBox, KDialog::spacingHint() );
+
+ cal = new KDatePicker( dateBox );
+ cal->setMinimumSize(cal->sizeHint());
+ l1->addWidget( cal );
+ QWhatsThis::add( cal, i18n("Here you can change the system date's day of the month, month and year.") );
+
+ // Time frame
+ QGroupBox* timeBox = new QGroupBox( this, "timeBox" );
+
+ QVBoxLayout *v2 = new QVBoxLayout( timeBox, KDialog::spacingHint() );
+
+ kclock = new Kclock( timeBox, "kclock" );
+ kclock->setMinimumSize(150,150);
+ v2->addWidget( kclock );
+
+ QGridLayout *v3 = new QGridLayout( v2, 2, 9 );
+
+ // Even if the module's widgets are reversed (usually when using RTL
+ // languages), the placing of the time fields must always be H:M:S, from
+ // left to right.
+ bool isRTL = QApplication::reverseLayout();
+
+ QSpacerItem *spacer1 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
+ v3->addMultiCell(spacer1, 0, 1, 1, 1);
+
+ hour = new HMSTimeWidget( timeBox );
+ hour->setWrapping(true);
+ hour->setMaxValue(23);
+ hour->setValidator(new KStrictIntValidator(0, 23, hour));
+ v3->addMultiCellWidget(hour, 0, 1, isRTL ? 6 : 2, isRTL ? 6 : 2 );
+
+ QLabel *dots1 = new QLabel(":", timeBox);
+ dots1->setMinimumWidth( 7 );
+ dots1->setAlignment( QLabel::AlignCenter );
+ v3->addMultiCellWidget(dots1, 0, 1, 3, 3 );
+
+ minute = new HMSTimeWidget( timeBox );
+ minute->setWrapping(true);
+ minute->setMinValue(0);
+ minute->setMaxValue(59);
+ minute->setValidator(new KStrictIntValidator(0, 59, minute));
+ v3->addMultiCellWidget(minute, 0, 1, 4, 4 );
+
+ QLabel *dots2 = new QLabel(":", timeBox);
+ dots2->setMinimumWidth( 7 );
+ dots2->setAlignment( QLabel::AlignCenter );
+ v3->addMultiCellWidget(dots2, 0, 1, 5, 5 );
+
+ second = new HMSTimeWidget( timeBox );
+ second->setWrapping(true);
+ second->setMinValue(0);
+ second->setMaxValue(59);
+ second->setValidator(new KStrictIntValidator(0, 59, second));
+ v3->addMultiCellWidget(second, 0, 1, isRTL ? 2 : 6, isRTL ? 2 : 6 );
+
+ v3->addColSpacing(7, 7);
+
+ QString wtstr = i18n("Here you can change the system time. Click into the"
+ " hours, minutes or seconds field to change the relevant value, either"
+ " using the up and down buttons to the right or by entering a new value.");
+ QWhatsThis::add( hour, wtstr );
+ QWhatsThis::add( minute, wtstr );
+ QWhatsThis::add( second, wtstr );
+
+ QSpacerItem *spacer3 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
+ v3->addMultiCell(spacer3, 0, 1, 9, 9);
+
+ QGridLayout *top = new QGridLayout( this, 2,2, KDialog::spacingHint() );
+
+ top->addWidget(dateBox, 1,0);
+ top->addWidget(timeBox, 1,1);
+ top->addMultiCellWidget(privateLayoutWidget, 0,0, 0,1);
+
+ // *************************************************************
+ // End Dialog
+ // *************************************************************
+
+ connect( hour, SIGNAL(valueChanged(int)), SLOT(set_time()) );
+ connect( minute, SIGNAL(valueChanged(int)), SLOT(set_time()) );
+ connect( second, SIGNAL(valueChanged(int)), SLOT(set_time()) );
+ connect( cal, SIGNAL(dateChanged(QDate)), SLOT(changeDate(QDate)));
+
+ connect( &internalTimer, SIGNAL(timeout()), SLOT(timeout()) );
+
+ load();
+
+ if (getuid() != 0)
+ {
+ cal->setEnabled(false);
+ hour->setEnabled(false);
+ minute->setEnabled(false);
+ second->setEnabled(false);
+ timeServerList->setEnabled(false);
+ setDateTimeAuto->setEnabled(false);
+ }
+ kclock->setEnabled(false);
+}
+
+void Dtime::serverTimeCheck() {
+ bool enabled = !setDateTimeAuto->isChecked();
+ cal->setEnabled(enabled);
+ hour->setEnabled(enabled);
+ minute->setEnabled(enabled);
+ second->setEnabled(enabled);
+ //kclock->setEnabled(enabled);
+}
+
+void Dtime::findNTPutility(){
+ KProcess proc;
+ proc << "which" << "ntpdate";
+ proc.start(KProcess::Block);
+ if(proc.exitStatus() == 0) {
+ ntpUtility = "ntpdate";
+ kdDebug() << "ntpUtility = " << ntpUtility.latin1() << endl;
+ return;
+ }
+ proc.clearArguments();
+ proc << "which" << "rdate";
+ proc.start(KProcess::Block);
+ if(proc.exitStatus() == 0) {
+ ntpUtility = "rdate";
+ kdDebug() << "ntpUtility = " << ntpUtility.latin1() << endl;
+ return;
+ }
+ privateLayoutWidget->hide();
+ kdDebug() << "ntpUtility not found!" << endl;
+}
+
+void Dtime::set_time()
+{
+ if( ontimeout )
+ return;
+
+ internalTimer.stop();
+
+ time.setHMS( hour->value(), minute->value(), second->value() );
+ kclock->setTime( time );
+
+ emit timeChanged( TRUE );
+}
+
+void Dtime::changeDate(QDate d)
+{
+ date = d;
+ emit timeChanged( TRUE );
+}
+
+void Dtime::configChanged(){
+ emit timeChanged( TRUE );
+}
+
+void Dtime::load()
+{
+ KConfig config("kcmclockrc", true, false);
+ config.setGroup("NTP");
+ timeServerList->insertStringList(QStringList::split(',', config.readEntry("servers",
+ i18n("Public Time Server (pool.ntp.org),\
+asia.pool.ntp.org,\
+europe.pool.ntp.org,\
+north-america.pool.ntp.org,\
+oceania.pool.ntp.org"))));
+ setDateTimeAuto->setChecked(config.readBoolEntry("enabled", false));
+
+ // Reset to the current date and time
+ time = QTime::currentTime();
+ date = QDate::currentDate();
+ cal->setDate(date);
+
+ // start internal timer
+ internalTimer.start( 1000 );
+
+ timeout();
+}
+
+void Dtime::save()
+{
+ KConfig config("kcmclockrc", false, false);
+ config.setGroup("NTP");
+
+ // Save the order, but don't duplicate!
+ QStringList list;
+ if( timeServerList->count() != 0)
+ list.append(timeServerList->currentText());
+ for ( int i=0; i<timeServerList->count();i++ ) {
+ QString text = timeServerList->text(i);
+ if( list.find(text) == list.end())
+ list.append(text);
+ // Limit so errors can go away and not stored forever
+ if( list.count() == 10)
+ break;
+ }
+ config.writeEntry("servers", list.join(","));
+ config.writeEntry("enabled", setDateTimeAuto->isChecked());
+
+ if(setDateTimeAuto->isChecked() && !ntpUtility.isEmpty()){
+ // NTP Time setting
+ QString timeServer = timeServerList->currentText();
+ if( timeServer.find( QRegExp(".*\\(.*\\)$") ) != -1 ) {
+ timeServer.replace( QRegExp(".*\\("), "" );
+ timeServer.replace( QRegExp("\\).*"), "" );
+ // Would this be better?: s/^.*\(([^)]*)\).*$/\1/
+ }
+ KProcess proc;
+ proc << ntpUtility << timeServer;
+ proc.start( KProcess::Block );
+ if( proc.exitStatus() != 0 ){
+ KMessageBox::error( this, i18n(QString("Unable to contact time server: %1.").arg(timeServer).latin1()));
+ setDateTimeAuto->setChecked( false );
+ }
+ else {
+ // success
+ kdDebug() << "Set date from time server " << timeServer.latin1() << " success!" << endl;
+ }
+ }
+ else {
+ // User time setting
+ KProcess c_proc;
+
+ // BSD systems reverse year compared to Susv3
+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
+ BufS.sprintf("%04d%02d%02d%02d%02d.%02d",
+ date.year(),
+ date.month(), date.day(),
+ hour->value(), minute->value(), second->value());
+#else
+ BufS.sprintf("%02d%02d%02d%02d%04d.%02d",
+ date.month(), date.day(),
+ hour->value(), minute->value(),
+ date.year(), second->value());
+#endif
+
+ kdDebug() << "Set date " << BufS << endl;
+
+ c_proc << "date" << BufS;
+ c_proc.start( KProcess::Block );
+ int result = c_proc.exitStatus();
+ if (result != 0
+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
+ && result != 2 // can only set local date, which is okay
+#endif
+ ) {
+ KMessageBox::error( this, i18n("Can not set date."));
+ return;
+ }
+
+ // try to set hardware clock. We do not care if it fails
+ KProcess hwc_proc;
+ hwc_proc << "hwclock" << "--systohc";
+ hwc_proc.start(KProcess::Block);
+ }
+
+ // restart time
+ internalTimer.start( 1000 );
+}
+
+void Dtime::timeout()
+{
+ // get current time
+ time = QTime::currentTime();
+
+ ontimeout = TRUE;
+ second->setValue(time.second());
+ minute->setValue(time.minute());
+ hour->setValue(time.hour());
+ ontimeout = FALSE;
+
+ kclock->setTime( time );
+}
+
+QString Dtime::quickHelp() const
+{
+ return i18n("<h1>Date & Time</h1> This control module can be used to set the system date and"
+ " time. As these settings do not only affect you as a user, but rather the whole system, you"
+ " can only change these settings when you start the Control Center as root. If you do not have"
+ " the root password, but feel the system time should be corrected, please contact your system"
+ " administrator.");
+}
+
+void Kclock::setTime(const QTime &time)
+{
+ this->time = time;
+ repaint();
+}
+
+void Kclock::paintEvent( QPaintEvent * )
+{
+ if ( !isVisible() )
+ return;
+
+ QPainter paint;
+ paint.begin( this );
+
+ QPointArray pts;
+ QPoint cp = rect().center();
+ int d = QMIN(width(),height());
+ QColor hands = colorGroup().dark();
+ QColor shadow = colorGroup().text();
+ paint.setPen( shadow );
+ paint.setBrush( shadow );
+ paint.setViewport(4,4,width(),height());
+
+ for ( int c=0 ; c < 2 ; c++ )
+ {
+ QWMatrix matrix;
+ matrix.translate( cp.x(), cp.y() );
+ matrix.scale( d/1000.0F, d/1000.0F );
+
+ // lancetta delle ore
+ float h_angle = 30*(time.hour()%12-3) + time.minute()/2;
+ matrix.rotate( h_angle );
+ paint.setWorldMatrix( matrix );
+ pts.setPoints( 4, -20,0, 0,-20, 300,0, 0,20 );
+ paint.drawPolygon( pts );
+ matrix.rotate( -h_angle );
+
+ // lancetta dei minuti
+ float m_angle = (time.minute()-15)*6;
+ matrix.rotate( m_angle );
+ paint.setWorldMatrix( matrix );
+ pts.setPoints( 4, -10,0, 0,-10, 400,0, 0,10 );
+ paint.drawPolygon( pts );
+ matrix.rotate( -m_angle );
+
+ // lancetta dei secondi
+ float s_angle = (time.second()-15)*6;
+ matrix.rotate( s_angle );
+ paint.setWorldMatrix( matrix );
+ pts.setPoints(4,0,0,0,0,400,0,0,0);
+ paint.drawPolygon( pts );
+ matrix.rotate( -s_angle );
+
+ // quadrante
+ for ( int i=0 ; i < 60 ; i++ )
+ {
+ paint.setWorldMatrix( matrix );
+ if ( (i % 5) == 0 )
+ paint.drawLine( 450,0, 500,0 ); // draw hour lines
+ else paint.drawPoint( 480,0 ); // draw second lines
+ matrix.rotate( 6 );
+ }
+
+ paint.setPen( hands );
+ paint.setBrush( hands );
+ paint.setViewport(0,0,width(),height());
+ }
+ paint.end();
+}
+
+QValidator::State KStrictIntValidator::validate( QString & input, int & d ) const
+{
+ if( input.isEmpty() )
+ return Valid;
+
+ State st = QIntValidator::validate( input, d );
+
+ if( st == Intermediate )
+ return Invalid;
+
+ return st;
+}
diff --git a/kcontrol/clock/dtime.h b/kcontrol/clock/dtime.h
new file mode 100644
index 000000000..5fcbb62df
--- /dev/null
+++ b/kcontrol/clock/dtime.h
@@ -0,0 +1,125 @@
+/*
+ * dtime.h
+ *
+ * Copyright (C) 1998 Luca Montecchiani <m.luca@usa.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef dtime_included
+#define dtime_included
+
+#include <qdatetime.h>
+#include <qlineedit.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qtimer.h>
+#include <qvalidator.h>
+#include <qwidget.h>
+#include <qcheckbox.h>
+
+#include <kdatepicker.h>
+#include <knuminput.h>
+
+class Kclock;
+
+class HMSTimeWidget : public KIntSpinBox
+{
+ Q_OBJECT
+ public:
+ HMSTimeWidget(QWidget *parent=0, const char *name=0);
+ protected:
+ QString mapValueToText(int);
+};
+
+class Dtime : public QWidget
+{
+ Q_OBJECT
+ public:
+ Dtime( QWidget *parent=0, const char* name=0 );
+
+ void save();
+ void load();
+
+ QString quickHelp() const;
+
+signals:
+ void timeChanged(bool);
+
+ private slots:
+ void configChanged();
+ void serverTimeCheck();
+ void timeout();
+ void set_time();
+ void changeDate(QDate);
+
+private:
+ void findNTPutility();
+ QString ntpUtility;
+
+ QWidget* privateLayoutWidget;
+ QCheckBox *setDateTimeAuto;
+ QComboBox *timeServerList;
+
+ KDatePicker *cal;
+ QComboBox *month;
+ QSpinBox *year;
+
+ HMSTimeWidget *hour;
+ HMSTimeWidget *minute;
+ HMSTimeWidget *second;
+
+ Kclock *kclock;
+
+ QTime time;
+ QDate date;
+ QTimer internalTimer;
+
+ QString BufS;
+ int BufI;
+ bool refresh;
+ bool ontimeout;
+};
+
+class Kclock : public QWidget
+{
+ Q_OBJECT
+
+public:
+ Kclock( QWidget *parent=0, const char *name=0 )
+ : QWidget(parent, name) {};
+
+ void setTime(const QTime&);
+
+protected:
+ virtual void paintEvent( QPaintEvent *event );
+
+
+private:
+ QTime time;
+};
+
+class KStrictIntValidator : public QIntValidator
+{
+public:
+ KStrictIntValidator(int bottom, int top, QWidget * parent,
+ const char * name = 0 )
+ : QIntValidator(bottom, top, parent, name) {};
+
+ QValidator::State validate( QString & input, int & d ) const;
+};
+
+#endif // dtime_included
diff --git a/kcontrol/clock/main.cpp b/kcontrol/clock/main.cpp
new file mode 100644
index 000000000..8522973a1
--- /dev/null
+++ b/kcontrol/clock/main.cpp
@@ -0,0 +1,95 @@
+/*
+ * main.cpp
+ *
+ * Copyright (C) 1998 Luca Montecchiani <m.luca@usa.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 <qlabel.h>
+#include <qlayout.h>
+
+#include <dcopclient.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdialog.h>
+#include <kgenericfactory.h>
+
+#include "main.h"
+#include "main.moc"
+
+#include "tzone.h"
+#include "dtime.h"
+
+typedef KGenericFactory<KclockModule, QWidget> KlockModuleFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_clock, KlockModuleFactory("kcmkclock"))
+
+KclockModule::KclockModule(QWidget *parent, const char *name, const QStringList &)
+ : KCModule(KlockModuleFactory::instance(), parent, name)
+{
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmclock"), I18N_NOOP("KDE Clock Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ "(c) 1996 - 2001 Luca Montecchiani");
+
+ about->addAuthor("Luca Montecchiani", I18N_NOOP("Original author"), "m.luca@usa.net");
+ about->addAuthor("Paul Campbell", I18N_NOOP("Current Maintainer"), "paul@taniwha.com");
+ about->addAuthor("Benjamin Meyer", I18N_NOOP("Added NTP support"), "ben+kcmclock@meyerhome.net");
+ setAboutData( about );
+ setQuickHelp( i18n("<h1>Date & Time</h1> This control module can be used to set the system date and"
+ " time. As these settings do not only affect you as a user, but rather the whole system, you"
+ " can only change these settings when you start the Control Center as root. If you do not have"
+ " the root password, but feel the system time should be corrected, please contact your system"
+ " administrator."));
+
+ KGlobal::locale()->insertCatalogue("timezones"); // For time zone translations
+
+ QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ dtime = new Dtime(this);
+ layout->addWidget(dtime);
+ connect(dtime, SIGNAL(timeChanged(bool)), this, SIGNAL(changed(bool)));
+
+ tzone = new Tzone(this);
+ layout->addWidget(tzone);
+ connect(tzone, SIGNAL(zoneChanged(bool)), this, SIGNAL(changed(bool)));
+
+ layout->addStretch();
+
+ if(getuid() == 0)
+ setButtons(Help|Apply);
+ else
+ setButtons(Help);
+}
+
+void KclockModule::save()
+{
+// The order here is important
+ dtime->save();
+ tzone->save();
+
+ // Tell the clock applet about the change so that it can update its timezone
+ kapp->dcopClient()->send( "kicker", "ClockApplet", "reconfigure()", QByteArray() );
+}
+
+void KclockModule::load()
+{
+ dtime->load();
+ tzone->load();
+}
+
diff --git a/kcontrol/clock/main.h b/kcontrol/clock/main.h
new file mode 100644
index 000000000..3c57469f0
--- /dev/null
+++ b/kcontrol/clock/main.h
@@ -0,0 +1,47 @@
+/*
+ * main.h
+ *
+ * Copyright (C) 1998 Luca Montecchiani <m.luca@usa.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+#ifndef main_included
+#define main_included
+
+#include <kcmodule.h>
+
+class Dtime;
+class Tzone;
+class QTabWidget;
+
+
+class KclockModule : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KclockModule(QWidget *parent, const char *name, const QStringList &);
+
+ void save();
+ void load();
+
+private:
+ QTabWidget *tab;
+ Tzone *tzone;
+ Dtime *dtime;
+};
+
+#endif // main_included
diff --git a/kcontrol/clock/tzone.cpp b/kcontrol/clock/tzone.cpp
new file mode 100644
index 000000000..fad22152a
--- /dev/null
+++ b/kcontrol/clock/tzone.cpp
@@ -0,0 +1,200 @@
+/*
+ * tzone.cpp
+ *
+ * Copyright (C) 1998 Luca Montecchiani <m.luca@usa.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+#include <config.h>
+
+#include <qlabel.h>
+#include <qfile.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kdialog.h>
+#include <kio/netaccess.h>
+
+//#include "xpm/world.xpm"
+#include "tzone.h"
+#include "tzone.moc"
+
+#if defined(USE_SOLARIS)
+#include <ktempfile.h>
+#include <kstandarddirs.h>
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#endif
+
+Tzone::Tzone(QWidget * parent, const char *name)
+ : QVGroupBox(parent, name)
+{
+ setTitle(i18n("To change the timezone, select your area from the list below"));
+
+ tzonelist = new KTimezoneWidget(this, "ComboBox_1", &m_zoneDb);
+ connect( tzonelist, SIGNAL(selectionChanged()), SLOT(handleZoneChange()) );
+
+ m_local = new QLabel(this);
+
+ load();
+
+ tzonelist->setEnabled(getuid() == 0);
+}
+
+void Tzone::load()
+{
+ currentZone();
+
+ // read the currently set time zone
+ tzonelist->setSelected(m_zoneDb.local()->name(), true);
+}
+
+void Tzone::currentZone()
+{
+ QString localZone(i18n("Current local timezone: %1 (%2)"));
+ QCString result(100);
+
+ time_t now = time(0);
+ tzset();
+ strftime(result.data(), result.size(), "%Z", localtime(&now));
+ m_local->setText(localZone.arg(KTimezoneWidget::displayName(m_zoneDb.local())).arg(result));
+}
+
+// FIXME: Does the logic in this routine actually work correctly? For example,
+// on non-Solaris systems which do not use /etc/timezone?
+void Tzone::save()
+{
+ QStringList selectedZones(tzonelist->selection());
+
+ if (selectedZones.count() > 0)
+ {
+ // Find untranslated selected zone
+ QString selectedzone(selectedZones[0]);
+
+#if defined(USE_SOLARIS) // MARCO
+
+ KTempFile tf( locateLocal( "tmp", "kde-tzone" ) );
+ tf.setAutoDelete( true );
+ QTextStream *ts = tf.textStream();
+
+# ifndef INITFILE
+# define INITFILE "/etc/default/init"
+# endif
+
+ QFile fTimezoneFile(INITFILE);
+ bool updatedFile = false;
+
+ if (tf.status() == 0 && fTimezoneFile.open(IO_ReadOnly))
+ {
+ bool found = false;
+
+ QTextStream is(&fTimezoneFile);
+
+ for (QString line = is.readLine(); !line.isNull();
+ line = is.readLine())
+ {
+ if (line.find("TZ=") == 0)
+ {
+ *ts << "TZ=" << selectedzone << endl;
+ found = true;
+ }
+ else
+ {
+ *ts << line << endl;
+ }
+ }
+
+ if (!found)
+ {
+ *ts << "TZ=" << selectedzone << endl;
+ }
+
+ updatedFile = true;
+ fTimezoneFile.close();
+ }
+
+ if (updatedFile)
+ {
+ ts->device()->reset();
+ fTimezoneFile.remove();
+
+ if (fTimezoneFile.open(IO_WriteOnly | IO_Truncate))
+ {
+ QTextStream os(&fTimezoneFile);
+
+ for (QString line = ts->readLine(); !line.isNull();
+ line = ts->readLine())
+ {
+ os << line << endl;
+ }
+
+ fchmod(fTimezoneFile.handle(),
+ S_IXUSR | S_IRUSR | S_IRGRP | S_IXGRP |
+ S_IROTH | S_IXOTH);
+ fTimezoneFile.close();
+ }
+ }
+
+
+ QString val = selectedzone;
+#else
+ QFile fTimezoneFile("/etc/timezone");
+
+ if (fTimezoneFile.open(IO_WriteOnly | IO_Truncate) )
+ {
+ QTextStream t(&fTimezoneFile);
+ t << selectedzone;
+ fTimezoneFile.close();
+ }
+
+ QString tz = "/usr/share/zoneinfo/" + selectedzone;
+
+ kdDebug() << "Set time zone " << tz << endl;
+
+ if (!QFile::remove("/etc/localtime"))
+ {
+ //After the KDE 3.2 release, need to add an error message
+ }
+ else
+ if (!KIO::NetAccess::file_copy(KURL(tz),KURL("/etc/localtime")))
+ KMessageBox::error( 0, i18n("Error setting new timezone."),
+ i18n("Timezone Error"));
+
+ QString val = ":" + tz;
+#endif // !USE_SOLARIS
+
+ setenv("TZ", val.ascii(), 1);
+ tzset();
+
+ } else {
+#if !defined(USE_SOLARIS) // Do not update the System!
+ unlink( "/etc/timezone" );
+ unlink( "/etc/localtime" );
+
+ setenv("TZ", "", 1);
+ tzset();
+#endif // !USE SOLARIS
+ }
+
+ currentZone();
+}
diff --git a/kcontrol/clock/tzone.h b/kcontrol/clock/tzone.h
new file mode 100644
index 000000000..618cb10c6
--- /dev/null
+++ b/kcontrol/clock/tzone.h
@@ -0,0 +1,55 @@
+/*
+ * tzone.h
+ *
+ * Copyright (C) 1998 Luca Montecchiani <m.luca@usa.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef tzone_included
+#define tzone_included
+
+#include <ktimezones.h>
+#include <ktimezonewidget.h>
+#include <qvgroupbox.h>
+
+class QComboBox;
+class QLabel;
+
+class Tzone : public QVGroupBox
+{
+ Q_OBJECT
+
+public:
+ Tzone( QWidget *parent=0, const char* name=0 );
+
+ void save();
+ void load();
+
+signals:
+ void zoneChanged(bool);
+
+protected slots:
+ void handleZoneChange() {emit zoneChanged( TRUE );}
+
+private:
+ void currentZone();
+ KTimezones m_zoneDb;
+ QLabel *m_local;
+ KTimezoneWidget *tzonelist;
+};
+
+#endif // tzone_included
diff --git a/kcontrol/clock/xpm/kcmclock.xpm b/kcontrol/clock/xpm/kcmclock.xpm
new file mode 100644
index 000000000..d04cee036
--- /dev/null
+++ b/kcontrol/clock/xpm/kcmclock.xpm
@@ -0,0 +1,47 @@
+/* XPM */
+static char*kcmclock[]={
+"34 34 10 1",
+"% c none",
+". c #f8fcf8",
+"# c #787878",
+"a c #000000",
+"b c #b8bcb8",
+"c c #0000f8",
+"d c #780000",
+"e c #f80000",
+"f c #000078",
+"g c #787800",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%############%############a%%%%%",
+"%%%#..........ba#...........#a%%%%",
+"%%a#..........ba#...........#baa%%",
+"%%a#....cc....ba#....ccc....#b#aa%",
+"%%a#...ccc....a.ba..ccccc...#b#aa%",
+"%%a#...ccc....aaaa..cc.cc...#b#aa%",
+"%%a#....cc....ba#......cc...#b#aa%",
+"%%a#....cc....ba#.....ccc...#b#aa%",
+"%%a#....cc....ba#....ccc....#b#aa%",
+"%%a#....cc....ba#...ccc.....#b#aa%",
+"%%a#...cccc...a.ba..ccccc...#b#aa%",
+"%%a#...cccc...aaaa..ccccc...#b#aa%",
+"%%a#..........ba#...........#b#aa%",
+"%%a#..........ba#...........#b#aa%",
+"%%a#..aaaaaa.dddddd.aaaaaa..#b#aa%",
+"%%a#.......ddeeeeeeda.......#b#aa%",
+"%%a#..aaaadeeeadddeeeaaaaa..#b#aa%",
+"%%a#.....deeaa....ddeea.....#b#aa%",
+"%%a#....deea...ab...deea....#b#aa%",
+"%%a#....dea..........dea....#b#aa%",
+"%%a####deea....f.....deea####b#aa%",
+"%%aa#bbdea.....f.g....deabbbbb#aa%",
+"%%aa###dea.b...fg...a.dea######aa%",
+"%%aaaaadea.a...fffb.b.deaaaaaaaaa%",
+"%%%aaaadea....g.......deaaaaaaaa%%",
+"%%%%%%%deea..g.......deea%%%%%%%%%",
+"%%%%%%%%dea..........dea%%%%%%%%%%",
+"%%%%%%%%deea...ba...deea%%%%%%%%%%",
+"%%%%%%%%%deead....ddeea%%%%%%%%%%%",
+"%%%%%%%%%%deeeddddeeea%%%%%%%%%%%%",
+"%%%%%%%%%%%ddeeeeeeaa%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%aaaaaa%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"};
diff --git a/kcontrol/clock/xpm/world.xpm b/kcontrol/clock/xpm/world.xpm
new file mode 100644
index 000000000..a10a317cd
--- /dev/null
+++ b/kcontrol/clock/xpm/world.xpm
@@ -0,0 +1,190 @@
+/* XPM */
+const char *world[] = {
+"356 184 3 1",
+". c #000078",
+"# c #007800",
+"a c #0000f8",
+"....................................................................................................................................................................................................................................................................................................................................................................",
+"....................................................................................................................................................................................................................................................................................................................................................................",
+"....................................................................................................................................................................................................................................................................................................................................................................",
+"....................................................................................................................................................................................................................................................................................................................................................................",
+"...................................................................................................................................................................................................................................................................................................................................................############.....",
+"................................................................................................................................................................................................................................................................................................................................................################....",
+".........................................................................................................................................................................................................................................................................................................###############....................#######################.",
+".......................................................................................................................................................................................................................................................................................................##################...............############################",
+"..................................................................................................................................................................................................................................................................................................########################.......###################################",
+"...####.....................................................................##...................................................................................................................................................................................................................########################...####################################.###",
+".#######...................................................................###....##.............................#.............................................................................................................................................................................#########################..#########################################.",
+"########.........................................................#####....###..#.###............................####........................................................................................................................................................................##..####.##################..###########################################",
+"######................................###.###...................######...#..#.###.............................####.....................................................................................................................................................................#...####..####......##########..#############################################",
+"#####..........................#....#.#########...................###..##..##..#..............................###..##.................................................................................................................................................................###..######.....##############...#############################################",
+"####..........................########...####................................................................##..#####...........................................................................................................................................................####..##...#######..############.....##############################################",
+"##.............................########...........................................................................####...##.....................................................................................................................................................######.......######..##########.....################################################",
+"##.............................##.######..........................................................................###..#####...............................................................................................................................................##....######.##....#####..##########...##################################################",
+"##................................#####.##.............................................................................####.............................................................................................................................................#####.....##########.#####.#.##########..###################################################",
+"##...............................######.###...............................................................................#............................................................................................................................................######....#.###..#####.###..#.#########...###################################################",
+"###................................###...##..........................................##................................#####......................................................................................................................................####....##......#........#......##.#######........################################################",
+"###.................................#...............................................####...............................#######..................................................................................................................................#####..................#...##..#.###.#######.......#################################################",
+"#...............................................................................##.#####.......................##.#..#############..............................................................................................................................#####...##..####.########.#######.###..####..........######.########################################",
+"#.............................................................................######........................#########################......................#####...............................................................................................####....##########.#######....####...#.##..............##.....#######################################",
+"##...........................................................................######.......................###########################.....................#######...###...............................................................................................###########..######.##.#######.#####.....................#####################################",
+"#..........................................................................#####.........................##########################........................#####....###.................................................................................................######......###...###.######.####.......................####################################",
+"##.........................................................................####..........................########################...........................##.................................................................................................#######.................#...........##............................###################################",
+"#.........................................................................####.....................###.######################.#..##............................#..............................................................................................#########.........#...######..####.......##.###....................###################################",
+".........................................................................####............#.........##########################...#########....###..............###.............................................................................................########.........###..#####..#####..##..########...................###################################",
+"........................................................................####.............##..###...##########################.#############.#######.............#.............................................................................................######..############..######..###..##############..................##################################.",
+"........................................................................###.............####.#####..#################################################.........###..#.........................................................................................######.##############..######......####..##########.................##################################.",
+"........................................................................####...........############..################################################........##########.............................#..........................................................###################....###..##....###...###########................#################################.",
+"............................................##.##.......................####..........#####.###############################################################.##############.........................####.......................###.##.............................###################......####...###.#.#############.................##############################.",
+"........................................##########.........................##.##.....#######.####################################################################################...................##.....................############..............................################.....#####..###.##.##############.............###############################..",
+".....................................#############............................####...#######.######################################################################################.........#.............................##################...........##.##..........################..#######....##...###############............##############################...",
+"...................................###################.#.......................#####..######..######################################################################################.#####.########...................###########################..################...##########.####..###.#####.....#.......##########............##############################...",
+"...................................######################..............###..##.#####...#####..#######################################################################################################................##################################################.######..#.###..####.######...####.....########.................#########################....",
+".................................##########################.....##...##################.####..############################################################################################################...........###################################################.##....###.#######.########..####....############...........########################.##.....",
+"..................................###########################..###..########################.##############################################################################################################..........###################################################################################....####.#########.........######################.#.........",
+".................................############################..###.##########################################################################################################################################...........#################################################################################...###.##########.#.......#####################............",
+"...###...........................####################...####...##################################################################################################################################################....############################################.#.###################################........##############.......###################...........#.",
+"#######.........................######################......######################################################################################################################################################..#############################################..##################################..........#######..####........##################...........###",
+"########.......................##########..############.....######################################################################################################################################################..####################################################################################....############.#...........#############..#............###",
+"#######........................##########...###########..############################################################################################################################################...#####.##.....####################################################################################..##############.............###########.................##",
+"######.......................############...############..#########################################################################################################################################...................####################################################################################..##..#########.............###########..................#",
+".##........................############...##########################################################################################################################################################..................##########################################################################....#...##........#####.#..............#########....................",
+".............#............############...############################################################################################################################################################.................##########################################################################......##..#..........###................#######.....................",
+"............##...........#############..###########################################################################################################################################################..................#####################################################.###################.......###..#.######....#.................#######.....................",
+".........................############...##########.#################################################################################################################################..#########.......................#######################################################################...............#######......................######.....................",
+".........................#############..######..##..###########################################################################################################################..##a#########.........................#######################################################################...............#########....#.................####.....................",
+".........................##############..####..##############################################################################################################################.....#####..##............................################...##################################################................#########....#...................#......................",
+".................#........############....#...#########################################################################################################################.#####....#####....................................########.##...........############################..##############...............###########.####.........................................",
+".............#...#........##...#######......#######################################################################################################################.##...###....#####.....................................########...............#############################################.............#################........................................",
+".............#.##...........##.######....#.#######################################################################################################################.............#####.........................................####.#...............############################################..............################........................................",
+"..............###..........###.######...#######################################################################################################################.#.............#######.......................................####..#...............#################################################..........################.......................................",
+"..............###..........####.####....#####################################################################################################################.................#######....................................#####...##.................#################################################....##.#################.......................................",
+"...............###..........##..........####################################################################################################################.................#######....................................######........................##############################################.......##################.......................................",
+"............###.###.........###.##..######################################################################################################################...................######....##..............................###.#...........................#################################################...#####################....................................",
+"...........####..###........#############################################################################################################################....................######......#...........................#.##.............................#.################################################..#######################...................................",
+"..........####..#####.....#################################################################################################################################..#..#............#####..................................##................................##################################################...#######################..................................",
+"..........####..#####...#########################################################################################################################################.............###...............#.....................................................###################################################..#######################..................................",
+"..........####.######..#########################################################################################################################################..............##.......................................................................#..################################################.########################.................................",
+"...........##..######..##########################################################################################################################################.............#.............................................................................#############################################.#######################...................................",
+".....................#############################################################################################################################################............#............................................................................####################################################################.....................................",
+"..................################################################################################################################################################..........................................................................................###########################################################.....##...##.................................",
+"...............##################################################################################################################################################..........#................................................................................###.##################################.##################.####.#....##..................................",
+"................################################################################################################################################################..........##..................................................................................###################################...################.#####.....####.................................",
+".................###############################################################################################################################################.......####...................................................................................####################################...###################......#####.................................",
+"..................##########################################################################################################################################..........####....................................................................................#####################################...###############.#.......######................................",
+"...................################################.#######################################################################################################..........####......................................................................................#####################################...#.############........#######................................",
+"...................##############.################...##...#################################################################################################....##...###........................................................................................####################################.###..############............#.#................................",
+".............####.##########..####.##############..........#############..#######.########################################################################.....###.............................................................................................####################################.###.###...######................................................",
+"............#############.#....####.############............###########..#######..#######################################################################......####............................................................................................####################################.################................................................",
+"............###########......#..####..#########.....###......##########.########..######################################################################......####.............................................................................................####################################.#####.##########................................................",
+"............###########.....##...####..#########..#####################.#############################################################################.........###.............................................................................................######################################################................................................",
+"............#########.......##.....###.########.#######################..###########################################################################..........#...............................................................................................###################################################...................................................",
+"............#########.##.....#.....##...###############################..#########################################################################...........###...............................................................................................#################################################....................................................",
+".............#######.............#.##....####.##########################..###############################################################...#..####..........###...............................................................................................################################################.............................................##......",
+"..............#####.............##.......###..#########################...##############################################################.......####.........###.................................................................................................###############################################..............................................###....",
+"...............###...#####.####.###......##.#..########################....#################################################################....####.......####.................................................................................................##############################################................................................##....",
+"...................############............###..##...#.#####################################################################################....####....#######..................................................................................................##############################################.....................................................",
+"...............#################............##....#.##.###################################################################################.......##..#########...................................................................................................##############################################.....................................................",
+".............##################.............##...####..####################################################################################.....###..#######......................................................................................................###########################################.......................................................",
+"............###################.........##........##..#####################################################################################.........#..####.........................................................................................................########################################........................................................",
+"...........########################.....###..#........######################################################################################.......#######...........................................................................................................#####################################..........................................................",
+"...........##########################..########.############################################################################################.......###.......##.......................................................................................................####################################..........................................................",
+"...........#################################################################################################################################........#.........##......................................................................................................###.###############################...........................................................",
+"...........###########################################.#####################################################################################..................#........................................................................................................######################.###...######..........................................................",
+"..........############################################.#####################################################################################...................#........................................##..............................................................##.#################...#.......###..........................................................",
+".........#############################################.##############.######################################################################.......#...........#.........................................###............................................................###.###############............###..#.......................................................",
+".......###############################################..##############.###...##############################################################......#.............##........................................###..............................................................##.#############..............###.##......................................................",
+"......#################################################.###############....#..############################################################......###.............##........................................................................................................###.############..............##...##.....................................................",
+"......#################################################..##############...##...#.###########################..############################.##....#.............###...............................................####......................................................##.############..............##...###....................................................",
+".....##################################################...#############..####.........#####################....##########################.###...................#..................................................###......................................................##.##########....................###....................................................",
+".....###################################################..####################.........####################....#########################..##........................................................................####........................................................#########..............####....#....................................................",
+"....#####################################################..####################.........###################....#######################....#............................................................................##.###.#...................................................########............######........................................................",
+"....######################################################.###################..........###################...#################.###.......#.............................................................................####..###.................................................########.......###...########.....................................................",
+"....#######################################################.##################...........#.##############.....################.##..............................................................................................##.................................................#########.....####........##...###................................................",
+".....######################################################.#################..............#############.......###################..............................................................................................##.................................................#########...####..............####...............................................",
+".....#######################################################.###############...............#############........#############..##.........#..........................................................................................................................................##############........####.######.##...........................................",
+".....######################################################...##############...............###########...........############............###.......................#...................................................................................................................############..........#.........#..##........................................",
+".....#######################################################..###########...................#########............#############...........###.......................#.....................................................................................................................########...##....................#.#.....................................#.",
+".....########################################################.########......................#######..............#..###########...........##..............................................................................................................................................#.###########.....................##...................................##.",
+".....########################################################..####..........................######............##...###########............##................................................................................................................................................##########......................#....................................#.",
+".....##########################################################.##...........................#######..........###...############............#......................#...........................................................................................................................########......................#......................................",
+".....###########################################################.............................#######...........##...###..#######...........#.#.....................#...............................................................................................................................###............###........#......................................",
+"......#############################################################.####......................######..........##....###..######..........#..#.##....................................................................................................................................................###.........#######......#......................................",
+"......#################################################################.......................####.............#...####...###...........##.#.#...........#..........................................................................................................................................###....#..###############.......................................",
+".......################################################################........................##..#................###....##...........#...............##............................................................................................................................................#########################.....................................",
+".......###############################################################............................###...............###................#....####.......###............................................................................................................................................#####.###################.....................................",
+"........##############################################################............................####...............###.....................####......##........................#..........................................................................................................................###################.....................................",
+".........##############.#############################################.............................###.................##..............##......###......#........................###.........................................................................................................................####################....................................",
+"............########.....###########################################...............................#.............###..###...........#####........................................##.........................................................................................................................##########################..............................",
+"...........................########################################...............................................#####.##.........######........................................##.........................................................................................................................###########################.............................",
+"............................#######################################................................................####..##.......######..........................................#.........................................................................................................................###########################.............................",
+".............................####################################...................................................###..###.....########......................................................................................................................................................#...........############################.............................",
+"..............................###################################....................................................###..##....##########..###............................................................##..................................................................................##..........############################.............................",
+".............................##################################......................................................####.......#########.####.......##....................................................##.................................................................................###.........#############################.............................",
+"............................##################################........................................................######....#######..####.......####...................................................##..................................................................................##........###################################........................",
+".............................################################..........................................................######...#######..####...##...####.###..................................................................................................................................##........####################################.......................",
+"..............................###############################.............##...........................................######....######.#####.....##..########............................................................................................................................................#####################################.....................",
+"...............................#############################.............###............................................#####......####..###...##.###.##########........##...............................................................................................................................##########################################.................",
+"................................###########################.............###...............................................###............###.......#....############...####..........................##........###.......................................................................................##########################################.................",
+".................................##########################.............##.................................................####........................###.##########.####.##........................##........###........................................................................................############################################..............",
+"................................###########################.................................................................######..................#..##...#########.......#.........................##......####.........................................................................................###########################################..............",
+".................................##########################..................................................................########.#....###.##...##......#########........####......................#.......##..........................................................................................###########################################..............",
+".................................###########################...................................................................######.#######..#..............###..###........####.........................................................................................................................##########################################...............",
+".................................############################..##.....................................................................#..###.###....................###..........###........................................................................................................................#########################################...............",
+"..................................###########################..##................................................................................................................###.........................................................................................................................#######################################................",
+"..................................###########################.......#................................................................................###........#...............................................###..........................................................................................######################################.................",
+".................................############################.......###.............................................................................######.....###.....................................##......####...........................................................................................#####################################.................",
+".................................############################......####............................................................................#######.....###......................................#.......##............................................................................................#####################################.................",
+"................................#############################....#####.........................................................................############....####.....................#......................................................................................................................####################################.................",
+"................................#############################...######........................................................................###############..#####...................###......................................................................................................................##################################..................",
+"................................############################....######........................................................................###############.######.....................#.........#.#............................................................................................................################################..................",
+".................................##########################....#######......................................................................########################..............................###...............................................................................................................###############################.................",
+".................................########################......######........#.............................................................#########################..............................####..............................................................................................................###############################.................",
+"..................................######################........#####.....##.#...........................................................#############################............................................................................#.................................................................##############################..................",
+"..................................#####################........######.....##...........................................................################################..............##..........................................................####...............................................................#############################...................",
+"..................................######################.......#####..................................................................##################################..............##..........................................................####..............................................................#############################...................",
+"...................................#####################.......#####.................................................................###################################..............###...........................................................#...............................................................###########################.....................",
+"...................................#####################.......#####................................................................#####################################..............................................................................##...........................................................#########################.......................",
+"...................................####################..........##.................................................................######################################............................................................................####.........................................................##########################.......................",
+"...................................###################..............................................................................#######################################.............................................................................##.........................................................#######################..........................",
+"...................................##################..............................................................................########################################........................................................................................................................................#######################..........................",
+"...................................##################...............................................................................########################################.......................................................................................................................................#######################..........................",
+"....................................#################...............................................................................########################################.......................................................................................................................................######################...........................",
+"....................................################.................................................................................#######################################.......................................................................................................................................#####################............................",
+"....................................###############...................................................................................#####################################........................................................................................................................................#####################............................",
+".....................................##############...................................................................................#####################################........................................................................................................................................####################.............................",
+"......................................#############...................................................................................############....####################.........................................................................................................................................##################...............................",
+"......................................###########.....................................................................................############......###.##############.........................................................................................................................................##################...............................",
+"......................................#########.......................................................................................#######............#..#############..........................................................................................................................................###############.#................................",
+"........................................####.........................................................................................####..................##############.....................#....................................................................................................................##############...................................",
+"......................................................................................................................................##..................###############.....................##..................................................................................................................###############...................................",
+".............................................................................................................................................................###########......................###.................................................................................................................###############...................................",
+"..............................................................................................................................................................##########.......................###...............................................................................................................###############....................................",
+"...............................................................................................................................................................#..###.#.........................####.............................................................................................................##############.....................................",
+"...................................................................................................................................................................##..........................#####.............................................................................................................############.......................................",
+"...............................................................................................................................................................................................####..............................................................................................................###########........................................",
+"...................................................................................................................................................................#............................##..............................................................................................................###########.........................................",
+"..................................................................................................................................................................###........................###.#................................................................................................................########..........................................",
+"...................................................................................................................................................................####......................###..................................................................................................................#######...........................................",
+"....................................................................................................................................................................##.....................####...................................................................................................................#######...........................................",
+"..........................................................................................................................................................................................#####..................................................................................................................########...........................................",
+".........................................................................................................................................................................................#####..................................................................................................................########............................................",
+"........................................................................................................................................................................................#####...................................................................................................................#######.............................................",
+"........................................................................................................................................................................................####....................................................................................................................#########...........................................",
+"........................................................................................................................................................................................###.....................................................................................................................#########...........................................",
+"................................................................................................................................................................................................................................................................................................................#########...........................................",
+".......................................................................................##.......................................................................................................................................................................................................................########............................................",
+"........................................................................................#.......................................................................................................................................................................................................................#######.............................................",
+"................................................................................................................................................................................................................................................................................................................######.......####...................................",
+".................................................................................................................................................................................................................................................................................................................#####......#####...................................",
+"..........................................................................................#......................................................................................................................................................................................................................######......#......................................",
+".........................................................................................###......................................................................................................................................................................................................................######............................................",
+"..........................................................................................##.......................................................................................................................................................................................................................######...........................................",
+"...................................................................................................................................................................................................................................................................................................................#######..........................................",
+".....................................................................................................................................................................................................................................................................................................................####...........................................",
+"......................................................................................................................................................................................................................................................................................................................##............................................",
+"....................................................................................................................................................................................................................................................................................................................................................................",
+"....................................................................................................................................................................................................................................................................................................................................................................",
+"....................................................................................................................................................................................................................................................................................................................................................................",
+"....................................................................................................................................................................................................................................................................................................................................................................",
+"...................................................................................................................................................................................................................................................................................................................................................................."};
diff --git a/kcontrol/colors/Makefile.am b/kcontrol/colors/Makefile.am
new file mode 100644
index 000000000..87f4048ef
--- /dev/null
+++ b/kcontrol/colors/Makefile.am
@@ -0,0 +1,15 @@
+AM_CPPFLAGS = $(all_includes)
+
+kde_module_LTLIBRARIES = kcm_colors.la
+
+kcm_colors_la_SOURCES = colorscm.cpp widgetcanvas.cpp
+kcm_colors_la_LDFLAGS = $(KDE_RPATH) -module -avoid-version $(all_libraries) -no-undefined
+kcm_colors_la_LIBADD = $(LIB_KDEUI) $(LIB_KIO) $(top_builddir)/kcontrol/krdb/libkrdb.la
+METASOURCES = colorscm.moc widgetcanvas.moc
+
+noinst_HEADERS = colorscm.h widgetcanvas.h
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/kcmcolors.pot
+
+xdg_apps_DATA = colors.desktop
diff --git a/kcontrol/colors/colors.desktop b/kcontrol/colors/colors.desktop
new file mode 100644
index 000000000..a13e45861
--- /dev/null
+++ b/kcontrol/colors/colors.desktop
@@ -0,0 +1,252 @@
+[Desktop Entry]
+Exec=kcmshell colors
+Icon=colorscm
+Type=Application
+DocPath=kcontrol/colors/index.html
+
+
+X-KDE-Library=colors
+X-KDE-FactoryName=colors
+X-KDE-ParentApp=kcontrol
+
+Name=Colors
+Name[af]=Kleure
+Name[ar]=الألوان
+Name[az]=Rənglər
+Name[be]=Колеры
+Name[bg]=Цветове
+Name[bn]=রং
+Name[br]=Livioù
+Name[bs]=Boje
+Name[cs]=Barvy
+Name[csb]=Farwë
+Name[cy]=Lliwiau
+Name[da]=Farver
+Name[de]=Farben
+Name[el]=Χρώματα
+Name[en_GB]=Colours
+Name[eo]=Koloroj
+Name[es]=Colores
+Name[et]=Värvid
+Name[eu]=Koloreak
+Name[fa]=رنگها
+Name[fi]=Värit
+Name[fo]=Litir
+Name[fr]=Couleurs
+Name[fy]=Kleuren
+Name[ga]=Dathanna
+Name[gl]=Cores
+Name[he]=צבעים
+Name[hi]=रंग
+Name[hr]=Boje
+Name[hu]=Színek
+Name[id]=Warna
+Name[is]=Litir
+Name[it]=Colori
+Name[ja]=色
+Name[ka]=ცვეტები
+Name[kk]=Түстер
+Name[km]=ពណ៌
+Name[ko]=색
+Name[lo]=ສີ
+Name[lt]=Spalvos
+Name[lv]=Krāsas
+Name[mk]=Бои
+Name[mn]=Өнгө
+Name[ms]=Warna
+Name[mt]=Kuluri
+Name[nb]=Farger
+Name[nds]=Klören
+Name[ne]=रङ
+Name[nl]=Kleuren
+Name[nn]=Fargar
+Name[nso]=Mebala
+Name[pa]=ਰੰਗ
+Name[pl]=Kolory
+Name[pt]=Cores
+Name[pt_BR]=Cores
+Name[ro]=Culori
+Name[ru]=Цвета
+Name[rw]=Amabara
+Name[se]=Ivnnit
+Name[sk]=Farby
+Name[sl]=Barve
+Name[sr]=Боје
+Name[sr@Latn]=Boje
+Name[ss]=Imibala
+Name[sv]=Färger
+Name[ta]=வண்ணங்கள்
+Name[te]=రంగులు
+Name[tg]=Рангҳо
+Name[th]=สี
+Name[tr]=Renkler
+Name[tt]=Töslär
+Name[uk]=Кольори
+Name[uz]=Ranglar
+Name[uz@cyrillic]=Ранглар
+Name[ven]=Mivhala
+Name[vi]=Màu
+Name[wa]=Coleurs
+Name[xh]=Imibala
+Name[zh_CN]=颜色
+Name[zh_TW]=顏色
+Name[zu]=Imibala
+
+Comment=Color settings
+Comment[af]=Kleur instellings
+Comment[ar]=ضبط الألوان
+Comment[az]=Rəng qurğuları
+Comment[be]=Настаўленне колераў
+Comment[bg]=Настройване цветовете на системата
+Comment[bn]=রং সেটিংস
+Comment[br]=Kefluniañ al livioù
+Comment[bs]=Podešavanje boja
+Comment[ca]=Arranjament dels colors
+Comment[cs]=Nastavení barev
+Comment[csb]=Ùstôw farwów
+Comment[cy]=Gosodiadau lliwiau
+Comment[da]=Farveindstillinger
+Comment[de]=Einstellung der Bildschirmfarben
+Comment[el]=Ρυθμίσεις χρωμάτων
+Comment[en_GB]=Colour settings
+Comment[eo]=Agordo de la koloroj
+Comment[es]=Preferencias sobre los colores
+Comment[et]=Värvide seadistused
+Comment[eu]=Koloreen konfigurazioa
+Comment[fa]=تنطیمات رنگها
+Comment[fi]=Väriasetukset
+Comment[fo]=Lituppseting
+Comment[fr]=Configuration des couleurs
+Comment[fy]=Kleuren ynstelle
+Comment[ga]=Socruithe na ndathanna
+Comment[gl]=Configuración das cores
+Comment[he]=שינוי הגדרות הצבעים
+Comment[hi]=रंग विन्यास
+Comment[hr]=Postava boja
+Comment[hu]=Színbeállítások
+Comment[id]=Seting warna
+Comment[is]=Stillingar lita
+Comment[it]=Impostazioni dei colori
+Comment[ja]=色の設定
+Comment[ka]=ფერების კონფიგურაცია
+Comment[kk]=Түстерді орнату
+Comment[km]=ការ​កំណត់​ពណ៌
+Comment[ko]=색 설정
+Comment[lo]=ຕັ້ງຄ່າສີ
+Comment[lt]=Spalvų parametrai
+Comment[lv]=Krāsu uzstādījumi
+Comment[mk]=Поставувања за боите
+Comment[mn]=Дэлгэцийн өнгө тохируулах
+Comment[ms]=Seting warna
+Comment[mt]=Konfigurazzjoni tal-kuluri
+Comment[nb]=Fargeinnstillinger
+Comment[nds]=Klören instellen
+Comment[ne]=रङ सेटिङ
+Comment[nl]=Kleuren instellen
+Comment[nn]=Fargeinnstillingar
+Comment[nso]=Dipeakanyo tsa mebala
+Comment[oc]=Arranjament dèus colors
+Comment[pa]=ਰੰਗ ਸੈਟਿੰਗ
+Comment[pl]=Ustawienia kolorów
+Comment[pt]=Configuração das cores
+Comment[pt_BR]=Configurações de cor
+Comment[ro]=Configurează culorile ferestrelor
+Comment[ru]=Настройка цветов
+Comment[rw]=Amagenamiterere y'ibara
+Comment[se]=Ivdneheivehusat
+Comment[sk]=Nastavenie farieb
+Comment[sl]=Nastavitve barv
+Comment[sr]=Поставке боја
+Comment[sr@Latn]=Postavke boja
+Comment[ss]=Kuhleleka kwembala
+Comment[sv]=Anpassa färger
+Comment[ta]=வண்ண அமைப்புகள்
+Comment[te]=రంగుల అమరికలు
+Comment[tg]=Танзимоти ранг
+Comment[th]=ตั้งค่าสี
+Comment[tr]=Renk ayarları
+Comment[tt]=Tös caylaw
+Comment[uk]=Налаштування кольорів
+Comment[uz]=Ranglarning moslamalari
+Comment[uz@cyrillic]=Рангларнинг мосламалари
+Comment[ven]=Mavhekanyele a muvhala
+Comment[vi]=Thiết lập màu
+Comment[wa]=Apontiaedje des coleurs
+Comment[xh]=Izicwangciso zombala
+Comment[zh_CN]=颜色设置
+Comment[zh_TW]=顏色設定
+Comment[zu]=Izilungiso zombala
+
+Keywords=colors,colours,scheme,contrast,Widget colors,Color Scheme
+Keywords[af]=colors,colours,Skema,contrast,Widget colors,Color Skema
+Keywords[az]=rənglər,sxem,kontrast,Rəng Cədvəli
+Keywords[be]=колеры,схема,кантраст,колеры віджэтаў,колерная схема,colors,colours,scheme,contrast,Widget colors,Color Scheme
+Keywords[bg]=цветове, схема, цветова, colors, colours, scheme, contrast, Widget colors, Color Scheme
+Keywords[ca]=colors,esquema,contrast,colors d'estri,esquema de color
+Keywords[cs]=Barvy,Schéma,Kontrast,Barevná schémata
+Keywords[csb]=farwa,schema,kòntrast,farwë elementów òknów,schema farwów
+Keywords[cy]=lliwiau,cynlluniau,cyferbyniad,lliwiau celfigion,Cynllun Lliw
+Keywords[da]=farver,system,kontrast,Kontrolfarver,Farvesammensætning
+Keywords[de]=Farben,Schema,Kontrast,Farbschema,Elemente
+Keywords[el]=χρώματα,χρώματα,θέμα,αντίθεση,Χρώματα γραφικού συστατικού,Θέμα χρωμάτων
+Keywords[en_GB]=colours,scheme,contrast,Widget colours,Colour Scheme
+Keywords[eo]=koloroj,skemo,kontrasto,fenestraĵo-koloroj,koloraro
+Keywords[es]=colores,esquema,contraste,Colores de los objetos visuales,Colores de los widgets,Esquema de colores
+Keywords[et]=värvid,skeem,kontrast,värviskeem
+Keywords[eu]=koloreak,antolamendua,kontrastea,Widget-en koloreak,Kolore eskema
+Keywords[fa]=رنگها، رنگها، طرحواره، سایه روشن، رنگهای عنصر، طرحوارۀ رنگ
+Keywords[fi]=väri,teema,kontrasti,työkalujen värit,väriteema
+Keywords[fo]=litir
+Keywords[fr]=couleurs,modèles de couleurs,contraste,couleur des éléments graphiques,modèle
+Keywords[fy]=kleuren,kleur,skema,kontrast,widgetkleuren,kleurenskema
+Keywords[ga]=dathanna,scéim,codarsnacht,dathanna giuirléidí,Scéim Dathanna
+Keywords[gl]=cor,cores,esquema,contraste,cores dos widgets,Esquema das cores
+Keywords[he]=colors,colours,scheme,contrast,Widget colors,Color,Schemeצבעים,תבנית,חדות,צבע פריטים,תבנית צבעים
+Keywords[hi]=रंग,योजना,कंट्रास्ट,विजेट रंग,रंग योजना
+Keywords[hr]=colors,colours,scheme,contrast,Widget colors,Color Scheme,boja,boje,shema,kontrast,Boje widgeta,Shema bojanja
+Keywords[hu]=színek,séma,kontraszt,elemszín,színösszeállítás
+Keywords[id]=warna,scheme,kontras, warna widget, warna scheme
+Keywords[is]=litir,litur,skema,skerpa
+Keywords[it]=colori,schema,contrasto,colore widget,colore elementi grafici,schema di colori
+Keywords[ja]=色,スキーム,コントラスト,ウィジェット色,色スキーム
+Keywords[km]=ពណ៌,គ្រោងការណ៍,កម្រិត​ពណ៌,ពណ៌​របស់​វត្ថុ​មើលឃើញ,គ្រោងការណ៍​ពណ៌
+Keywords[lt]=colors,colours,scheme,contrast,Widget colors,Color Scheme,spalvos,koloritai,schema,kontrastas, Valdiklių spalvos, Spalvų Schema
+Keywords[lv]=krāsu,krāsas,shēma,kontrasts,Vidžeta krāsas,Krāsu Shēma
+Keywords[mk]=colors,colours,scheme,contrast,Widget colors,Color Scheme,бои,шема,контраст,Шема на бои
+Keywords[mn]=Өнгө,Схем,Эрчим,Өнгөний схем,Элемент
+Keywords[ms]=warna,warna,skema, kontras, warna Widget,Skema Warna
+Keywords[nb]=farger,oppsett,kontrast,elementfarger,fargeoppsett
+Keywords[nds]=Klören,Schema,Kontrast,Bedeenelementen,Klöörschema
+Keywords[ne]=रङ, रङ्ग, योजना, व्यतिरेक, विजेट रङ, रङ योजना
+Keywords[nl]=kleuren,kleur,schema,contrast,widgetkleuren,kleurenschema
+Keywords[nn]=fargar,oppsett,kontrast,elementfargar,fargeoppsett
+Keywords[nso]=mebala,mebala,leano,phapano,Mebala ya Widget,Leano la Mmala
+Keywords[pa]=colors,colours,scheme,contrast,Widget colors,Color Scheme,ਰੰਗ,ਸਕੀਮ
+Keywords[pl]=kolory,schemat,kontrast,kolory elementów okienek,schemat kolorów
+Keywords[pt]=cores,esquema,esquema,contraste,cores dos elementos,esquema de cor
+Keywords[pt_BR]=cores,esquema,contraste,cores de controles,Esquema de cor
+Keywords[ro]=culoare,culori,schemă,contrast,componente,schemă de culori
+Keywords[rw]=Amabara,amabara,Igishushanyombonera,inyuranyamigaragarire, Amabara y'akabanga,Igishushombonera cy'ibara
+Keywords[se]=ivnnit,coahkádusat,vuostálasvuohta,áhtaivnnit,ivdnečoahkádus
+Keywords[sk]=farby,schémy,kontrast,farby prvkov,schéma farieb
+Keywords[sl]=barva,barve,sheme,kontrast,nadzor gradnikov,barvna shema
+Keywords[sr]=боје,шема,контраст,шема боја
+Keywords[sr@Latn]=boje,šema,kontrast,šema boja
+Keywords[ss]=mibala,mibala,inhlanganisela,kucatsanisa,mibala yesisetjentiswa,kwakheka kwembala
+Keywords[sv]=färger,schema,kontrast,Komponentfärger,Färgschema
+Keywords[ta]=வண்ணங்கள்,வண்ணங்கள்,திட்டம்,எதிரான,Widget வண்ணங்கள்,வண்ண முறை
+Keywords[tg]=colors,colours,scheme,contrast,Widget colors,Color Scheme,рангҳо,рангҳо
+Keywords[th]=สี,ชุดสี,ความตัดกันของสี,สีของคอนโทรล
+Keywords[tr]=renkler,şema,kontrast,Renk Tablosu
+Keywords[uk]=кольори,схема,контрастність,кольори віджетів,схема кольорів
+Keywords[uz]=ranglar,qolip,kontrast,vidjet ranglari,rang qolipi
+Keywords[uz@cyrillic]=ранглар,қолип,контраст,виджет ранглари,ранг қолипи
+Keywords[ven]=mivhala,mivhala,tshikimu,mbambe,Widget mivhala,Tshikimu tsha Muvhala
+Keywords[vi]=màu,màu sắc,sắc thái,tương phản,Màu của ô điều khiển,Sắc thái Màu
+Keywords[wa]=coleurs,arindjmint,contrasse,coleurs d' ahesse,arindjmint di coleurs,arindjmints d' coleurs
+Keywords[xh]=imibala,imibala,udweliso,isiboniso somahluko,Imibala ye widget,Udweliso Olunombala
+Keywords[zh_CN]=colors,colours,scheme,contrast,Widget colors,Color Scheme,颜色,方案,对比,部件颜色,配色方案
+Keywords[zh_TW]=colors,colours,scheme,contrast,Widget colors,Color Scheme,顏色,對比,元件顏色,配色
+Keywords[zu]=imibala,imibala,iplani,ukugqama,imibala ye-Widget,Iplani Lombala
+
+Categories=Qt;KDE;X-KDE-settings-looknfeel;
diff --git a/kcontrol/colors/colorscm.cpp b/kcontrol/colors/colorscm.cpp
new file mode 100644
index 000000000..39e5574c2
--- /dev/null
+++ b/kcontrol/colors/colorscm.cpp
@@ -0,0 +1,980 @@
+// KDE Display color scheme setup module
+//
+// Copyright (c) Mark Donohoe 1997
+//
+// Converted to a kcc module by Matthias Hoelzer 1997
+// Ported to Qt-2.0 by Matthias Ettrich 1999
+// Ported to kcontrol2 by Geert Jansen 1999
+// Made maintainable by Waldo Bastian 2000
+
+#include <assert.h>
+#include <config.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qdir.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qslider.h>
+#include <qvgroupbox.h>
+#include <qwhatsthis.h>
+
+#include <kcolorbutton.h>
+#include <kcursor.h>
+#include <kfiledialog.h>
+#include <kgenericfactory.h>
+#include <kglobalsettings.h>
+#include <kinputdialog.h>
+#include <kio/netaccess.h>
+#include <kipc.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <kstandarddirs.h>
+#include <kaboutdata.h>
+
+#if defined Q_WS_X11 && !defined K_WS_QTONLY
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#endif
+
+#include "../krdb/krdb.h"
+
+#include "colorscm.h"
+
+
+/**** DLL Interface ****/
+typedef KGenericFactory<KColorScheme , QWidget> KolorFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_colors, KolorFactory("kcmcolors") )
+
+class KColorSchemeEntry {
+public:
+ KColorSchemeEntry(const QString &_path, const QString &_name, bool _local)
+ : path(_path), name(_name), local(_local) { }
+
+ QString path;
+ QString name;
+ bool local;
+};
+
+class KColorSchemeList : public QPtrList<KColorSchemeEntry> {
+public:
+ KColorSchemeList()
+ { setAutoDelete(true); }
+
+ int compareItems(QPtrCollection::Item item1, QPtrCollection::Item item2)
+ {
+ KColorSchemeEntry *i1 = (KColorSchemeEntry*)item1;
+ KColorSchemeEntry *i2 = (KColorSchemeEntry*)item2;
+ if (i1->local != i2->local)
+ return i1->local ? -1 : 1;
+ return i1->name.localeAwareCompare(i2->name);
+ }
+};
+
+#define SIZE 8
+
+// make a 24 * 8 pixmap with the main colors in a scheme
+QPixmap mkColorPreview(const WidgetCanvas *cs)
+{
+ QPixmap group(SIZE*3,SIZE);
+ QPixmap block(SIZE,SIZE);
+ group.fill(QColor(0,0,0));
+ block.fill(cs->back); bitBlt(&group,0*SIZE,0,&block,0,0,SIZE,SIZE);
+ block.fill(cs->window); bitBlt(&group,1*SIZE,0,&block,0,0,SIZE,SIZE);
+ block.fill(cs->aTitle); bitBlt(&group,2*SIZE,0,&block,0,0,SIZE,SIZE);
+ QPainter p(&group);
+ p.drawRect(0,0,3*SIZE,SIZE);
+ return group;
+}
+
+/**** KColorScheme ****/
+
+KColorScheme::KColorScheme(QWidget *parent, const char *name, const QStringList &)
+ : KCModule(KolorFactory::instance(), parent, name)
+{
+ nSysSchemes = 2;
+
+ setQuickHelp( i18n("<h1>Colors</h1> This module allows you to choose"
+ " the color scheme used for the KDE desktop. The different"
+ " elements of the desktop, such as title bars, menu text, etc.,"
+ " are called \"widgets\". You can choose the widget whose"
+ " color you want to change by selecting it from a list, or by"
+ " clicking on a graphical representation of the desktop.<p>"
+ " You can save color settings as complete color schemes,"
+ " which can also be modified or deleted. KDE comes with several"
+ " predefined color schemes on which you can base your own.<p>"
+ " All KDE applications will obey the selected color scheme."
+ " Non-KDE applications may also obey some or all of the color"
+ " settings, if this option is enabled."));
+
+ KConfig *cfg = new KConfig("kcmdisplayrc");
+ cfg->setGroup("X11");
+ useRM = cfg->readBoolEntry("useResourceManager", true);
+ delete cfg;
+
+ cs = new WidgetCanvas( this );
+ cs->setCursor( KCursor::handCursor() );
+
+ // LAYOUT
+
+ QGridLayout *topLayout = new QGridLayout( this, 3, 2, 0,
+ KDialog::spacingHint() );
+ topLayout->setRowStretch(0,0);
+ topLayout->setRowStretch(1,0);
+ topLayout->setColStretch(0,1);
+ topLayout->setColStretch(1,1);
+
+ cs->setFixedHeight(160);
+ cs->setMinimumWidth(440);
+
+ QWhatsThis::add( cs, i18n("This is a preview of the color settings which"
+ " will be applied if you click \"Apply\" or \"OK\". You can click on"
+ " different parts of this preview image. The widget name in the"
+ " \"Widget color\" box will change to reflect the part of the preview"
+ " image you clicked.") );
+
+ connect( cs, SIGNAL( widgetSelected( int ) ),
+ SLOT( slotWidgetColor( int ) ) );
+ connect( cs, SIGNAL( colorDropped( int, const QColor&)),
+ SLOT( slotColorForWidget( int, const QColor&)));
+ topLayout->addMultiCellWidget( cs, 0, 0, 0, 1 );
+
+ QGroupBox *group = new QVGroupBox( i18n("Color Scheme"), this );
+ topLayout->addWidget( group, 1, 0 );
+
+ sList = new KListBox( group );
+ mSchemeList = new KColorSchemeList();
+ readSchemeNames();
+ sList->setCurrentItem( 0 );
+ connect(sList, SIGNAL(highlighted(int)), SLOT(slotPreviewScheme(int)));
+
+ QWhatsThis::add( sList, i18n("This is a list of predefined color schemes,"
+ " including any that you may have created. You can preview an existing"
+ " color scheme by selecting it from the list. The current scheme will"
+ " be replaced by the selected color scheme.<p>"
+ " Warning: if you have not yet applied any changes you may have made"
+ " to the current scheme, those changes will be lost if you select"
+ " another color scheme.") );
+
+ addBt = new QPushButton(i18n("&Save Scheme..."), group);
+ connect(addBt, SIGNAL(clicked()), SLOT(slotAdd()));
+
+ QWhatsThis::add( addBt, i18n("Press this button if you want to save"
+ " the current color settings as a color scheme. You will be"
+ " prompted for a name.") );
+
+ removeBt = new QPushButton(i18n("R&emove Scheme"), group);
+ removeBt->setEnabled(FALSE);
+ connect(removeBt, SIGNAL(clicked()), SLOT(slotRemove()));
+
+ QWhatsThis::add( removeBt, i18n("Press this button to remove the selected"
+ " color scheme. Note that this button is disabled if you do not have"
+ " permission to delete the color scheme.") );
+
+ importBt = new QPushButton(i18n("I&mport Scheme..."), group);
+ connect(importBt, SIGNAL(clicked()),SLOT(slotImport()));
+
+ QWhatsThis::add( importBt, i18n("Press this button to import a new color"
+ " scheme. Note that the color scheme will only be available for the"
+ " current user." ));
+
+
+ QBoxLayout *stackLayout = new QVBoxLayout;
+ topLayout->addLayout(stackLayout, 1, 1);
+
+ group = new QGroupBox(i18n("&Widget Color"), this);
+ stackLayout->addWidget(group);
+ QBoxLayout *groupLayout = new QVBoxLayout(group, 10);
+ groupLayout->addSpacing(10);
+
+ wcCombo = new QComboBox(false, group);
+ for(int i=0; i < CSM_LAST;i++)
+ {
+ wcCombo->insertItem(QString::null);
+ }
+
+ setColorName(i18n("Inactive Title Bar") , CSM_Inactive_title_bar);
+ setColorName(i18n("Inactive Title Text"), CSM_Inactive_title_text);
+ setColorName(i18n("Inactive Title Blend"), CSM_Inactive_title_blend);
+ setColorName(i18n("Active Title Bar"), CSM_Active_title_bar);
+ setColorName(i18n("Active Title Text"), CSM_Active_title_text);
+ setColorName(i18n("Active Title Blend"), CSM_Active_title_blend);
+ setColorName(i18n("Window Background"), CSM_Background);
+ setColorName(i18n("Window Text"), CSM_Text);
+ setColorName(i18n("Selected Background"), CSM_Select_background);
+ setColorName(i18n("Selected Text"), CSM_Select_text);
+ setColorName(i18n("Standard Background"), CSM_Standard_background);
+ setColorName(i18n("Standard Text"), CSM_Standard_text);
+ setColorName(i18n("Button Background"), CSM_Button_background);
+ setColorName(i18n("Button Text"), CSM_Button_text);
+ setColorName(i18n("Active Title Button"), CSM_Active_title_button);
+ setColorName(i18n("Inactive Title Button"), CSM_Inactive_title_button);
+ setColorName(i18n("Active Window Frame"), CSM_Active_frame);
+ setColorName(i18n("Active Window Handle"), CSM_Active_handle);
+ setColorName(i18n("Inactive Window Frame"), CSM_Inactive_frame);
+ setColorName(i18n("Inactive Window Handle"), CSM_Inactive_handle);
+ setColorName(i18n("Link"), CSM_Link);
+ setColorName(i18n("Followed Link"), CSM_Followed_Link);
+ setColorName(i18n("Alternate Background in Lists"), CSM_Alternate_background);
+
+ wcCombo->adjustSize();
+ connect(wcCombo, SIGNAL(activated(int)), SLOT(slotWidgetColor(int)));
+ groupLayout->addWidget(wcCombo);
+
+ QWhatsThis::add( wcCombo, i18n("Click here to select an element of"
+ " the KDE desktop whose color you want to change. You may either"
+ " choose the \"widget\" here, or click on the corresponding part"
+ " of the preview image above.") );
+
+ colorButton = new KColorButton( group );
+ connect( colorButton, SIGNAL( changed(const QColor &)),
+ SLOT(slotSelectColor(const QColor &)));
+
+ groupLayout->addWidget( colorButton );
+
+ QWhatsThis::add( colorButton, i18n("Click here to bring up a dialog"
+ " box where you can choose a color for the \"widget\" selected"
+ " in the above list.") );
+
+ cbShadeList = new QCheckBox(i18n("Shade sorted column in lists"), this);
+ stackLayout->addWidget(cbShadeList);
+ connect(cbShadeList, SIGNAL(toggled(bool)), this, SLOT(slotShadeSortColumnChanged(bool)));
+
+ QWhatsThis::add(cbShadeList,
+ i18n("Check this box to show the sorted column in a list with a shaded background"));
+
+ group = new QGroupBox( i18n("Con&trast"), this );
+ stackLayout->addWidget(group);
+
+ QVBoxLayout *groupLayout2 = new QVBoxLayout(group, 10);
+ groupLayout2->addSpacing(10);
+ groupLayout = new QHBoxLayout;
+ groupLayout2->addLayout(groupLayout);
+
+ sb = new QSlider( QSlider::Horizontal,group,"Slider" );
+ sb->setRange( 0, 10 );
+ sb->setFocusPolicy( QWidget::StrongFocus );
+ connect(sb, SIGNAL(valueChanged(int)), SLOT(sliderValueChanged(int)));
+
+ QWhatsThis::add(sb, i18n("Use this slider to change the contrast level"
+ " of the current color scheme. Contrast does not affect all of the"
+ " colors, only the edges of 3D objects."));
+
+ QLabel *label = new QLabel(sb, i18n("Low Contrast", "Low"), group);
+ groupLayout->addWidget(label);
+ groupLayout->addWidget(sb, 10);
+ label = new QLabel(group);
+ label->setText(i18n("High Contrast", "High"));
+ groupLayout->addWidget( label );
+
+ cbExportColors = new QCheckBox(i18n("Apply colors to &non-KDE applications"), this);
+ topLayout->addMultiCellWidget( cbExportColors, 2, 2, 0, 1 );
+ connect(cbExportColors, SIGNAL(toggled(bool)), this, SLOT(changed()));
+
+ QWhatsThis::add(cbExportColors, i18n("Check this box to apply the"
+ " current color scheme to non-KDE applications."));
+
+ load();
+
+ KAboutData* about = new KAboutData("kcmcolors", I18N_NOOP("Colors"), 0, 0,
+ KAboutData::License_GPL,
+ I18N_NOOP("(c) 1997-2005 Colors Developers"), 0, 0);
+ about->addAuthor("Mark Donohoe", 0, 0);
+ about->addAuthor("Matthias Hoelzer", 0, 0);
+ about->addAuthor("Matthias Ettrich", 0, 0);
+ about->addAuthor("Geert Jansen", 0, 0);
+ about->addAuthor("Waldo Bastian", 0, 0);
+ setAboutData( about );
+}
+
+
+KColorScheme::~KColorScheme()
+{
+ delete mSchemeList;
+}
+
+void KColorScheme::setColorName( const QString &name, int id )
+{
+ wcCombo->changeItem(name, id);
+ cs->addToolTip( id, name );
+}
+
+void KColorScheme::load()
+{
+ load( false );
+}
+void KColorScheme::load( bool useDefaults )
+{
+ KConfig *config = KGlobal::config();
+ config->setReadDefaults( useDefaults );
+ config->setGroup("KDE");
+ sCurrentScheme = config->readEntry("colorScheme");
+
+ sList->setCurrentItem(findSchemeByName(sCurrentScheme));
+ readScheme(0);
+
+ cbShadeList->setChecked(cs->shadeSortColumn);
+
+ cs->drawSampleWidgets();
+ slotWidgetColor(wcCombo->currentItem());
+ sb->blockSignals(true);
+ sb->setValue(cs->contrast);
+ sb->blockSignals(false);
+
+ KConfig cfg("kcmdisplayrc", true, false);
+ cfg.setGroup("X11");
+ bool exportColors = cfg.readBoolEntry("exportKDEColors", true);
+ cbExportColors->setChecked(exportColors);
+
+ emit changed( useDefaults );
+}
+
+
+void KColorScheme::save()
+{
+ KConfig *cfg = KGlobal::config();
+ cfg->setGroup( "General" );
+ cfg->writeEntry("background", cs->back, true, true);
+ cfg->writeEntry("selectBackground", cs->select, true, true);
+ cfg->writeEntry("foreground", cs->txt, true, true);
+ cfg->writeEntry("windowForeground", cs->windowTxt, true, true);
+ cfg->writeEntry("windowBackground", cs->window, true, true);
+ cfg->writeEntry("selectForeground", cs->selectTxt, true, true);
+ cfg->writeEntry("buttonBackground", cs->button, true, true);
+ cfg->writeEntry("buttonForeground", cs->buttonTxt, true, true);
+ cfg->writeEntry("linkColor", cs->link, true, true);
+ cfg->writeEntry("visitedLinkColor", cs->visitedLink, true, true);
+ cfg->writeEntry("alternateBackground", cs->alternateBackground, true, true);
+
+ cfg->writeEntry("shadeSortColumn", cs->shadeSortColumn, true, true);
+
+ cfg->setGroup( "WM" );
+ cfg->writeEntry("activeForeground", cs->aTxt, true, true);
+ cfg->writeEntry("inactiveBackground", cs->iaTitle, true, true);
+ cfg->writeEntry("inactiveBlend", cs->iaBlend, true, true);
+ cfg->writeEntry("activeBackground", cs->aTitle, true, true);
+ cfg->writeEntry("activeBlend", cs->aBlend, true, true);
+ cfg->writeEntry("inactiveForeground", cs->iaTxt, true, true);
+ cfg->writeEntry("activeTitleBtnBg", cs->aTitleBtn, true, true);
+ cfg->writeEntry("inactiveTitleBtnBg", cs->iTitleBtn, true, true);
+ cfg->writeEntry("frame", cs->aFrame, true, true);
+ cfg->writeEntry("inactiveFrame", cs->iaFrame, true, true);
+ cfg->writeEntry("handle", cs->aHandle, true, true);
+ cfg->writeEntry("inactiveHandle", cs->iaHandle, true, true);
+
+ cfg->setGroup( "KDE" );
+ cfg->writeEntry("contrast", cs->contrast, true, true);
+ cfg->writeEntry("colorScheme", sCurrentScheme, true, true);
+ cfg->sync();
+
+ // KDE-1.x support
+ KSimpleConfig *config =
+ new KSimpleConfig( QDir::homeDirPath() + "/.kderc" );
+ config->setGroup( "General" );
+ config->writeEntry("background", cs->back );
+ config->writeEntry("selectBackground", cs->select );
+ config->writeEntry("foreground", cs->txt, true, true);
+ config->writeEntry("windowForeground", cs->windowTxt );
+ config->writeEntry("windowBackground", cs->window );
+ config->writeEntry("selectForeground", cs->selectTxt );
+ config->sync();
+ delete config;
+
+ KConfig cfg2("kcmdisplayrc", false, false);
+ cfg2.setGroup("X11");
+ bool exportColors = cbExportColors->isChecked();
+ cfg2.writeEntry("exportKDEColors", exportColors);
+ cfg2.sync();
+ QApplication::syncX();
+
+ // Notify all qt-only apps of the KDE palette changes
+ uint flags = KRdbExportQtColors;
+ if ( exportColors )
+ flags |= KRdbExportColors;
+ else
+ {
+#if defined Q_WS_X11 && !defined K_WS_QTONLY
+ // Undo the property xrdb has placed on the root window (if any),
+ // i.e. remove all entries, including ours
+ XDeleteProperty( qt_xdisplay(), qt_xrootwin(), XA_RESOURCE_MANAGER );
+#endif
+ }
+ runRdb( flags ); // Save the palette to qtrc for KStyles
+
+ // Notify all KDE applications
+ KIPC::sendMessageAll(KIPC::PaletteChanged);
+
+ // Update the "Current Scheme"
+ int current = findSchemeByName(sCurrentScheme);
+ sList->setCurrentItem(0);
+ readScheme(0);
+ QPixmap preview = mkColorPreview(cs);
+ sList->changeItem(preview, sList->text(0), 0);
+ sList->setCurrentItem(current);
+ readScheme(current);
+ preview = mkColorPreview(cs);
+ sList->changeItem(preview, sList->text(current), current);
+
+ emit changed(false);
+}
+
+
+void KColorScheme::defaults()
+{
+ load( true );
+}
+
+void KColorScheme::sliderValueChanged( int val )
+{
+ cs->contrast = val;
+ cs->drawSampleWidgets();
+
+ sCurrentScheme = QString::null;
+
+ emit changed(true);
+}
+
+
+void KColorScheme::slotSave( )
+{
+ KColorSchemeEntry *entry = mSchemeList->at(sList->currentItem()-nSysSchemes);
+ if (!entry) return;
+ sCurrentScheme = entry->path;
+ KSimpleConfig *config = new KSimpleConfig(sCurrentScheme );
+ int i = sCurrentScheme.findRev('/');
+ if (i >= 0)
+ sCurrentScheme = sCurrentScheme.mid(i+1);
+
+ config->setGroup("Color Scheme" );
+ config->writeEntry("background", cs->back );
+ config->writeEntry("selectBackground", cs->select );
+ config->writeEntry("foreground", cs->txt );
+ config->writeEntry("activeForeground", cs->aTxt );
+ config->writeEntry("inactiveBackground", cs->iaTitle );
+ config->writeEntry("inactiveBlend", cs->iaBlend );
+ config->writeEntry("activeBackground", cs->aTitle );
+ config->writeEntry("activeBlend", cs->aBlend );
+ config->writeEntry("inactiveForeground", cs->iaTxt );
+ config->writeEntry("windowForeground", cs->windowTxt );
+ config->writeEntry("windowBackground", cs->window );
+ config->writeEntry("selectForeground", cs->selectTxt );
+ config->writeEntry("contrast", cs->contrast );
+ config->writeEntry("buttonForeground", cs->buttonTxt );
+ config->writeEntry("buttonBackground", cs->button );
+ config->writeEntry("activeTitleBtnBg", cs->aTitleBtn);
+ config->writeEntry("inactiveTitleBtnBg", cs->iTitleBtn);
+ config->writeEntry("frame", cs->aFrame);
+ config->writeEntry("inactiveFrame", cs->iaFrame);
+ config->writeEntry("handle", cs->aHandle);
+ config->writeEntry("inactiveHandle", cs->iaHandle);
+ config->writeEntry("linkColor", cs->link);
+ config->writeEntry("visitedLinkColor", cs->visitedLink);
+ config->writeEntry("alternateBackground", cs->alternateBackground);
+ config->writeEntry("shadeSortColumn", cs->shadeSortColumn);
+
+ delete config;
+}
+
+
+void KColorScheme::slotRemove()
+{
+ uint ind = sList->currentItem();
+ KColorSchemeEntry *entry = mSchemeList->at(ind-nSysSchemes);
+ if (!entry) return;
+
+ if (unlink(QFile::encodeName(entry->path).data())) {
+ KMessageBox::error( 0,
+ i18n("This color scheme could not be removed.\n"
+ "Perhaps you do not have permission to alter the file"
+ "system where the color scheme is stored." ));
+ return;
+ }
+
+ sList->removeItem(ind);
+ mSchemeList->remove(entry);
+
+ ind = sList->currentItem();
+ entry = mSchemeList->at(ind-nSysSchemes);
+ if (!entry) return;
+ removeBt->setEnabled(entry ? entry->local : false);
+}
+
+
+/*
+ * Add a local color scheme.
+ */
+void KColorScheme::slotAdd()
+{
+ QString sName;
+ if (sList->currentItem() >= nSysSchemes)
+ sName = sList->currentText();
+
+ QString sFile;
+
+ bool valid = false;
+ bool ok;
+ int exists = -1;
+
+ while (!valid)
+ {
+ sName = KInputDialog::getText( i18n( "Save Color Scheme" ),
+ i18n( "Enter a name for the color scheme:" ), sName, &ok, this );
+ if (!ok)
+ return;
+
+ sName = sName.simplifyWhiteSpace();
+ sFile = sName;
+
+ int i = 0;
+
+ exists = -1;
+ // Check if it's already there
+ for (i=0; i < (int) sList->count(); i++)
+ {
+ if (sName == sList->text(i))
+ {
+ exists = i;
+ int result = KMessageBox::warningContinueCancel( this,
+ i18n("A color scheme with the name '%1' already exists.\n"
+ "Do you want to overwrite it?\n").arg(sName),
+ i18n("Save Color Scheme"),
+ i18n("Overwrite"));
+ if (result == KMessageBox::Cancel)
+ break;
+ }
+ }
+ if (i == (int) sList->count())
+ valid = true;
+ }
+
+ disconnect(sList, SIGNAL(highlighted(int)), this,
+ SLOT(slotPreviewScheme(int)));
+
+ if (exists != -1)
+ {
+ sList->setFocus();
+ sList->setCurrentItem(exists);
+ }
+ else
+ {
+ sFile = KGlobal::dirs()->saveLocation("data", "kdisplay/color-schemes/") + sFile + ".kcsrc";
+ KSimpleConfig *config = new KSimpleConfig(sFile);
+ config->setGroup( "Color Scheme");
+ config->writeEntry("Name", sName);
+ delete config;
+
+ insertEntry(sFile, sName);
+
+ }
+ slotSave();
+
+ QPixmap preview = mkColorPreview(cs);
+ int current = sList->currentItem();
+ sList->changeItem(preview, sList->text(current), current);
+ connect(sList, SIGNAL(highlighted(int)), SLOT(slotPreviewScheme(int)));
+ slotPreviewScheme(current);
+}
+
+void KColorScheme::slotImport()
+{
+ QString location = locateLocal( "data", "kdisplay/color-schemes/" );
+
+ KURL file ( KFileDialog::getOpenFileName(QString::null, "*.kcsrc", this) );
+ if ( file.isEmpty() )
+ return;
+
+ //kdDebug() << "Location: " << location << endl;
+ if (!KIO::NetAccess::file_copy(file, KURL( location+file.fileName( false ) ) ) )
+ {
+ KMessageBox::error(this, KIO::NetAccess::lastErrorString(),i18n("Import failed."));
+ return;
+ }
+ else
+ {
+ QString sFile = location + file.fileName( false );
+ KSimpleConfig *config = new KSimpleConfig(sFile);
+ config->setGroup( "Color Scheme");
+ QString sName = config->readEntry("Name", i18n("Untitled Theme"));
+ delete config;
+
+
+ insertEntry(sFile, sName);
+ QPixmap preview = mkColorPreview(cs);
+ int current = sList->currentItem();
+ sList->changeItem(preview, sList->text(current), current);
+ connect(sList, SIGNAL(highlighted(int)), SLOT(slotPreviewScheme(int)));
+ slotPreviewScheme(current);
+ }
+}
+
+QColor &KColorScheme::color(int index)
+{
+ switch(index) {
+ case CSM_Inactive_title_bar:
+ return cs->iaTitle;
+ case CSM_Inactive_title_text:
+ return cs->iaTxt;
+ case CSM_Inactive_title_blend:
+ return cs->iaBlend;
+ case CSM_Active_title_bar:
+ return cs->aTitle;
+ case CSM_Active_title_text:
+ return cs->aTxt;
+ case CSM_Active_title_blend:
+ return cs->aBlend;
+ case CSM_Background:
+ return cs->back;
+ case CSM_Text:
+ return cs->txt;
+ case CSM_Select_background:
+ return cs->select;
+ case CSM_Select_text:
+ return cs->selectTxt;
+ case CSM_Standard_background:
+ return cs->window;
+ case CSM_Standard_text:
+ return cs->windowTxt;
+ case CSM_Button_background:
+ return cs->button;
+ case CSM_Button_text:
+ return cs->buttonTxt;
+ case CSM_Active_title_button:
+ return cs->aTitleBtn;
+ case CSM_Inactive_title_button:
+ return cs->iTitleBtn;
+ case CSM_Active_frame:
+ return cs->aFrame;
+ case CSM_Active_handle:
+ return cs->aHandle;
+ case CSM_Inactive_frame:
+ return cs->iaFrame;
+ case CSM_Inactive_handle:
+ return cs->iaHandle;
+ case CSM_Link:
+ return cs->link;
+ case CSM_Followed_Link:
+ return cs->visitedLink;
+ case CSM_Alternate_background:
+ return cs->alternateBackground;
+ }
+
+ assert(0); // Should never be here!
+ return cs->iaTxt; // Silence compiler
+}
+
+
+void KColorScheme::slotSelectColor(const QColor &col)
+{
+ int selection;
+ selection = wcCombo->currentItem();
+
+ // Adjust the alternate background color if the standard color changes
+ // Only if the previous alternate color was not a user-configured one
+ // of course
+ if ( selection == CSM_Standard_background &&
+ color(CSM_Alternate_background) ==
+ KGlobalSettings::calculateAlternateBackgroundColor(
+ color(CSM_Standard_background) ) )
+ {
+ color(CSM_Alternate_background) =
+ KGlobalSettings::calculateAlternateBackgroundColor( col );
+ }
+
+ color(selection) = col;
+
+ cs->drawSampleWidgets();
+
+ sCurrentScheme = QString::null;
+
+ emit changed(true);
+}
+
+
+void KColorScheme::slotWidgetColor(int indx)
+{
+ if (indx < 0)
+ indx = 0;
+ if (wcCombo->currentItem() != indx)
+ wcCombo->setCurrentItem( indx );
+
+ // Do not emit KCModule::changed()
+ colorButton->blockSignals( true );
+
+ QColor col = color(indx);
+ colorButton->setColor( col );
+ colorPushColor = col;
+
+ colorButton->blockSignals( false );
+}
+
+
+void KColorScheme::slotColorForWidget(int indx, const QColor& col)
+{
+ if (wcCombo->currentItem() != indx)
+ wcCombo->setCurrentItem( indx );
+
+ slotSelectColor(col);
+}
+
+void KColorScheme::slotShadeSortColumnChanged(bool b)
+{
+ cs->shadeSortColumn = b;
+ sCurrentScheme = QString::null;
+
+ emit changed(true);
+}
+
+/*
+ * Read a color scheme into "cs".
+ *
+ * KEEP IN SYNC with thememgr!
+ */
+void KColorScheme::readScheme( int index )
+{
+ KConfigBase* config;
+
+ QColor widget(239, 239, 239);
+ QColor kde34Blue(103,141,178);
+ QColor inactiveBackground(157,170,186);
+ QColor activeBackground(65,142,220);
+ QColor inactiveForeground(221,221,221);
+ QColor activeBlend(107,145,184);
+ QColor inactiveBlend(157,170,186);
+ QColor activeTitleBtnBg(220,220,220);
+ QColor inactiveTitleBtnBg(220,220,220);
+ QColor alternateBackground(237,244,249);
+
+ QColor button;
+ if (QPixmap::defaultDepth() > 8)
+ button.setRgb(221, 223, 228 );
+ else
+ button.setRgb(220, 220, 220);
+
+ QColor link(0, 0, 238);
+ QColor visitedLink(82, 24,139);
+
+ // note: keep default color scheme in sync with default Current Scheme
+ if (index == 1) {
+ sCurrentScheme = "<default>";
+ cs->txt = black;
+ cs->back = widget;
+ cs->select = kde34Blue;
+ cs->selectTxt = white;
+ cs->window = white;
+ cs->windowTxt = black;
+ cs->iaTitle = inactiveBackground;
+ cs->iaTxt = inactiveForeground;
+ cs->iaBlend = inactiveBlend;
+ cs->aTitle = activeBackground;
+ cs->aTxt = white;
+ cs->aBlend = activeBlend;
+ cs->button = button;
+ cs->buttonTxt = black;
+ cs->aTitleBtn = activeTitleBtnBg;
+ cs->iTitleBtn = inactiveTitleBtnBg;
+ cs->aFrame = cs->back;
+ cs->aHandle = cs->back;
+ cs->iaFrame = cs->back;
+ cs->iaHandle = cs->back;
+ cs->link = link;
+ cs->visitedLink = visitedLink;
+ cs->alternateBackground = alternateBackground;
+
+ cs->contrast = 7;
+ cs->shadeSortColumn = KDE_DEFAULT_SHADE_SORT_COLUMN;
+
+ return;
+ }
+
+ if (index == 0) {
+ // Current scheme
+ config = KGlobal::config();
+ config->setGroup("General");
+ } else {
+ // Open scheme file
+ KColorSchemeEntry *entry = mSchemeList->at(sList->currentItem()-nSysSchemes);
+ if (!entry) return;
+ sCurrentScheme = entry->path;
+ config = new KSimpleConfig(sCurrentScheme, true);
+ config->setGroup("Color Scheme");
+ int i = sCurrentScheme.findRev('/');
+ if (i >= 0)
+ sCurrentScheme = sCurrentScheme.mid(i+1);
+ }
+
+ cs->shadeSortColumn = config->readBoolEntry( "shadeSortColumn", KDE_DEFAULT_SHADE_SORT_COLUMN );
+
+ // note: defaults should be the same as the KDE default
+ cs->txt = config->readColorEntry( "foreground", &black );
+ cs->back = config->readColorEntry( "background", &widget );
+ cs->select = config->readColorEntry( "selectBackground", &kde34Blue );
+ cs->selectTxt = config->readColorEntry( "selectForeground", &white );
+ cs->window = config->readColorEntry( "windowBackground", &white );
+ cs->windowTxt = config->readColorEntry( "windowForeground", &black );
+ cs->button = config->readColorEntry( "buttonBackground", &button );
+ cs->buttonTxt = config->readColorEntry( "buttonForeground", &black );
+ cs->link = config->readColorEntry( "linkColor", &link );
+ cs->visitedLink = config->readColorEntry( "visitedLinkColor", &visitedLink );
+ QColor alternate = KGlobalSettings::calculateAlternateBackgroundColor(cs->window);
+ cs->alternateBackground = config->readColorEntry( "alternateBackground", &alternate );
+
+ if (index == 0)
+ config->setGroup( "WM" );
+
+ cs->iaTitle = config->readColorEntry("inactiveBackground", &inactiveBackground);
+ cs->iaTxt = config->readColorEntry("inactiveForeground", &inactiveForeground);
+ cs->iaBlend = config->readColorEntry("inactiveBlend", &inactiveBackground);
+ cs->iaFrame = config->readColorEntry("inactiveFrame", &cs->back);
+ cs->iaHandle = config->readColorEntry("inactiveHandle", &cs->back);
+ cs->aTitle = config->readColorEntry("activeBackground", &activeBackground);
+ cs->aTxt = config->readColorEntry("activeForeground", &white);
+ cs->aBlend = config->readColorEntry("activeBlend", &activeBlend);
+ cs->aFrame = config->readColorEntry("frame", &cs->back);
+ cs->aHandle = config->readColorEntry("handle", &cs->back);
+ // hack - this is all going away. For now just set all to button bg
+ cs->aTitleBtn = config->readColorEntry("activeTitleBtnBg", &activeTitleBtnBg);
+ cs->iTitleBtn = config->readColorEntry("inactiveTitleBtnBg", &inactiveTitleBtnBg);
+
+ if (index == 0)
+ config->setGroup( "KDE" );
+
+ cs->contrast = config->readNumEntry( "contrast", 7 );
+ if (index != 0)
+ delete config;
+}
+
+
+/*
+ * Get all installed color schemes.
+ */
+void KColorScheme::readSchemeNames()
+{
+ mSchemeList->clear();
+ sList->clear();
+ // Always a current and a default scheme
+ sList->insertItem( i18n("Current Scheme"), 0 );
+ sList->insertItem( i18n("KDE Default"), 1 );
+ nSysSchemes = 2;
+
+ // Global + local schemes
+ QStringList list = KGlobal::dirs()->findAllResources("data",
+ "kdisplay/color-schemes/*.kcsrc", false, true);
+
+ // And add them
+ for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) {
+ KSimpleConfig *config = new KSimpleConfig(*it);
+ config->setGroup("Color Scheme");
+ QString str = config->readEntry("Name");
+ if (str.isEmpty()) {
+ str = config->readEntry("name");
+ if (str.isEmpty())
+ continue;
+ }
+ mSchemeList->append(new KColorSchemeEntry(*it, str, !config->isImmutable()));
+ delete config;
+ }
+
+ mSchemeList->sort();
+
+ for(KColorSchemeEntry *entry = mSchemeList->first(); entry; entry = mSchemeList->next())
+ {
+ sList->insertItem(entry->name);
+ }
+
+ for (uint i = 0; i < (nSysSchemes + mSchemeList->count()); i++)
+ {
+ sList->setCurrentItem(i);
+ readScheme(i);
+ QPixmap preview = mkColorPreview(cs);
+ sList->changeItem(preview, sList->text(i), i);
+ }
+
+}
+
+/*
+ * Find scheme based on filename
+ */
+int KColorScheme::findSchemeByName(const QString &scheme)
+{
+ if (scheme.isEmpty())
+ return 0;
+ if (scheme == "<default>")
+ return 1;
+
+ QString search = scheme;
+ int i = search.findRev('/');
+ if (i >= 0)
+ search = search.mid(i+1);
+
+ i = 0;
+
+ for(KColorSchemeEntry *entry = mSchemeList->first(); entry; entry = mSchemeList->next())
+ {
+ KURL url;
+ url.setPath(entry->path);
+ if (url.fileName() == search)
+ return i+nSysSchemes;
+ i++;
+ }
+
+ return 0;
+}
+
+
+void KColorScheme::slotPreviewScheme(int indx)
+{
+ readScheme(indx);
+
+ // Set various appropriate for the scheme
+
+ cbShadeList->setChecked(cs->shadeSortColumn);
+
+ cs->drawSampleWidgets();
+ sb->blockSignals(true);
+ sb->setValue(cs->contrast);
+ sb->blockSignals(false);
+ slotWidgetColor(wcCombo->currentItem());
+ if (indx < nSysSchemes)
+ removeBt->setEnabled(false);
+ else
+ {
+ KColorSchemeEntry *entry = mSchemeList->at(indx-nSysSchemes);
+ removeBt->setEnabled(entry ? entry->local : false);
+ }
+
+ emit changed((indx != 0));
+}
+
+
+/* this function should dissappear: colorscm should work directly on a Qt palette, since
+ this will give us much more cusomization with qt-2.0.
+ */
+QPalette KColorScheme::createPalette()
+{
+ QColorGroup disabledgrp(cs->windowTxt, cs->back, cs->back.light(150),
+ cs->back.dark(), cs->back.dark(120), cs->back.dark(120),
+ cs->window);
+
+ QColorGroup colgrp(cs->windowTxt, cs->back, cs->back.light(150),
+ cs->back.dark(), cs->back.dark(120), cs->txt, cs->window);
+
+ colgrp.setColor(QColorGroup::Highlight, cs->select);
+ colgrp.setColor(QColorGroup::HighlightedText, cs->selectTxt);
+ colgrp.setColor(QColorGroup::Button, cs->button);
+ colgrp.setColor(QColorGroup::ButtonText, cs->buttonTxt);
+ return QPalette( colgrp, disabledgrp, colgrp);
+}
+
+void KColorScheme::insertEntry(const QString &sFile, const QString &sName)
+{
+ KColorSchemeEntry *newEntry = new KColorSchemeEntry(sFile, sName, true);
+ mSchemeList->inSort(newEntry);
+ int newIndex = mSchemeList->findRef(newEntry)+nSysSchemes;
+ sList->insertItem(sName, newIndex);
+ sList->setCurrentItem(newIndex);
+}
+
+#include "colorscm.moc"
diff --git a/kcontrol/colors/colorscm.h b/kcontrol/colors/colorscm.h
new file mode 100644
index 000000000..23b47c6a0
--- /dev/null
+++ b/kcontrol/colors/colorscm.h
@@ -0,0 +1,90 @@
+//-----------------------------------------------------------------------------
+//
+// KDE Display color scheme setup module
+//
+// Copyright (c) Mark Donohoe 1997
+//
+
+#ifndef __COLORSCM_H__
+#define __COLORSCM_H__
+
+#include <qcolor.h>
+#include <qobject.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+#include <kcmodule.h>
+#include <kdialogbase.h>
+
+#include "widgetcanvas.h"
+
+class QSlider;
+class QComboBox;
+class QPushButton;
+class QCheckBox;
+class QResizeEvent;
+class KLineEdit;
+class QPalette;
+class KListBox;
+class KColorButton;
+class KConfig;
+class KStdDirs;
+class KColorSchemeList;
+
+/**
+ * The Desktop/Colors tab in kcontrol.
+ */
+class KColorScheme: public KCModule
+{
+ Q_OBJECT
+
+public:
+ KColorScheme(QWidget *parent, const char *name, const QStringList &);
+ ~KColorScheme();
+
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+
+private slots:
+ void sliderValueChanged(int val);
+ void slotSave();
+ void slotAdd();
+ void slotRemove();
+ void slotImport();
+ void slotSelectColor(const QColor &col);
+ void slotWidgetColor(int);
+ void slotColorForWidget(int, const QColor &);
+ void slotPreviewScheme(int);
+ void slotShadeSortColumnChanged(bool);
+
+private:
+ void setColorName( const QString &name, int id );
+ void readScheme(int index=0);
+ void readSchemeNames();
+ void insertEntry(const QString &sFile, const QString &sName);
+ int findSchemeByName(const QString &scheme);
+ QPalette createPalette();
+
+ QColor &color(int index);
+
+ int nSysSchemes;
+ bool useRM;
+
+ QColor colorPushColor;
+ QSlider *sb;
+ QComboBox *wcCombo;
+ QPushButton *addBt, *removeBt, *importBt;
+ KListBox *sList;
+ KColorSchemeList *mSchemeList;
+ QString sCurrentScheme;
+
+ KColorButton *colorButton;
+ WidgetCanvas *cs;
+
+ QCheckBox *cbExportColors;
+ QCheckBox *cbShadeList;
+};
+
+#endif
diff --git a/kcontrol/colors/stdclient_bitmaps.h b/kcontrol/colors/stdclient_bitmaps.h
new file mode 100644
index 000000000..912040fe2
--- /dev/null
+++ b/kcontrol/colors/stdclient_bitmaps.h
@@ -0,0 +1,128 @@
+#ifndef __STDCLIENT_BITMAPS_H
+#define __STDCLIENT_BITMAPS_H
+
+/**
+ * The standard client has the capability to color it's titlebar buttons
+ * according to the new color scheme. In order to do this it needs a bitmap
+ * for each shade which it draws into a pixmap with the appropriate color.
+ * These are all the bitmaps.
+ */
+
+static unsigned char close_white_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x04, 0x08, 0x08, 0x04, 0x10, 0x02,
+ 0x20, 0x01, 0x40, 0x00, 0x40, 0x00, 0x20, 0x01, 0x10, 0x02, 0x08, 0x04,
+ 0x04, 0x08, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char close_dgray_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x18, 0x30, 0x30, 0x18, 0x60, 0x0c,
+ 0xc0, 0x06, 0x80, 0x03, 0x80, 0x03, 0xc0, 0x06, 0x60, 0x0c, 0x30, 0x18,
+ 0x18, 0x30, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char close_mask_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x1c, 0x38, 0x38, 0x1c, 0x70, 0x0e,
+ 0xe0, 0x07, 0xc0, 0x03, 0xc0, 0x03, 0xe0, 0x07, 0x70, 0x0e, 0x38, 0x1c,
+ 0x1c, 0x38, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char iconify_white_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x03, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char iconify_dgray_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+
+static unsigned char iconify_mask_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x03, 0x80, 0x02, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char maximize_white_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x04, 0x00, 0x04, 0x08, 0x04, 0x08,
+ 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0xf4, 0x0f,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char maximize_dgray_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x08, 0x10, 0x08, 0x10,
+ 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10,
+ 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char maximize_mask_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0xfc, 0x1f, 0x0c, 0x18, 0x0c, 0x18,
+ 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, 0xfc, 0x1f,
+ 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char maximizedown_white_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x08, 0x10,
+ 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10,
+ 0x08, 0x10, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char maximizedown_dgray_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x04, 0x00, 0x04, 0x08,
+ 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08,
+ 0xf4, 0x0f, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char maximizedown_mask_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0xfc, 0x1f, 0x0c, 0x18,
+ 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18, 0x0c, 0x18,
+ 0xfc, 0x1f, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char menu_white_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xfc, 0x3f, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char menu_dgray_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x20, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char menu_mask_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xfc, 0x3f, 0x04, 0x20, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char pindown_white_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x1f, 0xa0, 0x03,
+ 0xb0, 0x01, 0x30, 0x01, 0xf0, 0x00, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char pindown_gray_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c,
+ 0x00, 0x0e, 0x00, 0x06, 0x00, 0x00, 0x80, 0x07, 0xc0, 0x03, 0xe0, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char pindown_dgray_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x10, 0x70, 0x20, 0x50, 0x20,
+ 0x48, 0x30, 0xc8, 0x38, 0x08, 0x1f, 0x08, 0x18, 0x10, 0x1c, 0x10, 0x0e,
+ 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char pindown_mask_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x1f, 0xf0, 0x3f, 0xf0, 0x3f,
+ 0xf8, 0x3f, 0xf8, 0x3f, 0xf8, 0x1f, 0xf8, 0x1f, 0xf0, 0x1f, 0xf0, 0x0f,
+ 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char pinup_white_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x11,
+ 0x3f, 0x15, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char pinup_gray_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x0a, 0xbf, 0x0a, 0x80, 0x15, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char pinup_dgray_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x40, 0x31, 0x40, 0x2e,
+ 0x40, 0x20, 0x40, 0x20, 0x7f, 0x2a, 0x40, 0x3f, 0xc0, 0x31, 0xc0, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+static unsigned char pinup_mask_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0xc0, 0x31, 0xc0, 0x3f,
+ 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xc0, 0x3f, 0xc0, 0x31, 0xc0, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+
+#endif
diff --git a/kcontrol/colors/widgetcanvas.cpp b/kcontrol/colors/widgetcanvas.cpp
new file mode 100644
index 000000000..42adcc3bb
--- /dev/null
+++ b/kcontrol/colors/widgetcanvas.cpp
@@ -0,0 +1,596 @@
+//
+// A special widget which draws a sample of KDE widgets
+// It is used to preview color schemes
+//
+// Copyright (c) Mark Donohoe 1998
+//
+
+#include <qdrawutil.h>
+#include <qpainter.h>
+#include <qscrollbar.h>
+#include <qbitmap.h>
+#include <qtooltip.h>
+#include <qstyle.h>
+#include <qpopupmenu.h>
+
+#include <kcolordrag.h>
+#include <kpixmapeffect.h>
+#include <kglobalsettings.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <kpixmap.h>
+
+#include "widgetcanvas.h"
+#include "widgetcanvas.moc"
+#include "stdclient_bitmaps.h"
+
+static QPixmap* close_pix = 0;
+static QPixmap* maximize_pix = 0;
+static QPixmap* minimize_pix = 0;
+static QPixmap* normalize_pix = 0;
+static QPixmap* pinup_pix = 0;
+static QPixmap* pindown_pix = 0;
+static QPixmap* menu_pix = 0;
+
+static QPixmap* dis_close_pix = 0;
+static QPixmap* dis_maximize_pix = 0;
+static QPixmap* dis_minimize_pix = 0;
+static QPixmap* dis_normalize_pix = 0;
+static QPixmap* dis_pinup_pix = 0;
+static QPixmap* dis_pindown_pix = 0;
+static QPixmap* dis_menu_pix = 0;
+
+
+WidgetCanvas::WidgetCanvas( QWidget *parent, const char *name )
+ : QWidget( parent, name ), shadeSortColumn( true )
+{
+ setMouseTracking( true );
+ setBackgroundMode( NoBackground );
+ setAcceptDrops( true);
+ setMinimumSize(200, 100);
+ currentHotspot = -1;
+}
+
+void WidgetCanvas::addToolTip( int area, const QString &tip )
+{
+ tips.insert(area, tip);
+}
+
+void WidgetCanvas::paintEvent(QPaintEvent *)
+{
+ bitBlt( this, 0, 0, &smplw );
+}
+
+void WidgetCanvas::mousePressEvent( QMouseEvent *me )
+{
+ for ( int i = 0; i < MAX_HOTSPOTS; i++ )
+ if ( hotspots[i].rect.contains( me->pos() ) ) {
+ emit widgetSelected( hotspots[i].number );
+ return;
+ }
+}
+
+void WidgetCanvas::mouseMoveEvent( QMouseEvent *me )
+{
+ for ( int i = 0; i < MAX_HOTSPOTS; i++ )
+ if ( hotspots[i].rect.contains( me->pos() ) ) {
+ if ( i != currentHotspot ) {
+ QString tip = tips[hotspots[i].number];
+ QToolTip::remove( this );
+ QToolTip::add( this, tip );
+ currentHotspot = i;
+ }
+ return;
+ }
+
+ QToolTip::remove( this );
+}
+
+void WidgetCanvas::dropEvent( QDropEvent *e)
+{
+ QColor c;
+ if (KColorDrag::decode( e, c)) {
+ for ( int i = 0; i < MAX_HOTSPOTS; i++ )
+ if ( hotspots[i].rect.contains( e->pos() ) ) {
+ emit colorDropped( hotspots[i].number, c);
+ return;
+ }
+ }
+}
+
+
+void WidgetCanvas::dragEnterEvent( QDragEnterEvent *e)
+{
+ e->accept( KColorDrag::canDecode( e));
+}
+
+void WidgetCanvas::paletteChange(const QPalette &)
+{
+ drawSampleWidgets();
+}
+
+void WidgetCanvas::resizeEvent(QResizeEvent *)
+{
+ drawSampleWidgets();
+}
+
+/*
+ * This is necessary because otherwise the scrollbar in drawSampleWidgets()
+ * doesn't show the first time.
+ */
+void WidgetCanvas::showEvent(QShowEvent *)
+{
+ drawSampleWidgets();
+}
+
+void WidgetCanvas::resetTitlebarPixmaps(const QColor &actMed,
+ const QColor &disMed)
+{
+ if(close_pix) delete close_pix;
+ if(maximize_pix) delete maximize_pix;
+ if(minimize_pix) delete minimize_pix;
+ if(normalize_pix) delete normalize_pix;
+ if(pinup_pix) delete pinup_pix;
+ if(pindown_pix) delete pindown_pix;
+ if(menu_pix) delete menu_pix;
+
+ if(dis_close_pix) delete dis_close_pix;
+ if(dis_maximize_pix) delete dis_maximize_pix;
+ if(dis_minimize_pix) delete dis_minimize_pix;
+ if(dis_normalize_pix) delete dis_normalize_pix;
+ if(dis_pinup_pix) delete dis_pinup_pix;
+ if(dis_pindown_pix) delete dis_pindown_pix;
+ if(dis_menu_pix) delete dis_menu_pix;
+
+ QPainter pact, pdis;
+ QBitmap bitmap;
+ QColor actHigh = actMed.light(150);
+ QColor actLow = actMed.dark(120);
+ QColor disHigh = disMed.light(150);
+ QColor disLow = disMed.dark(120);
+
+ close_pix = new QPixmap(16, 16);
+ dis_close_pix = new QPixmap(16, 16);
+ pact.begin(close_pix); pdis.begin(dis_close_pix);
+ bitmap = QBitmap(16, 16, close_white_bits, true);
+ bitmap.setMask(bitmap);
+ pact.setPen(actHigh); pdis.setPen(disHigh);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ bitmap = QBitmap(16, 16, close_dgray_bits, true);
+ pact.setPen(actLow); pdis.setPen(disLow);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ pact.end(); pdis.end();
+ bitmap = QBitmap(16, 16, close_mask_bits, true);
+ close_pix->setMask(bitmap); dis_close_pix->setMask(bitmap);
+
+ minimize_pix = new QPixmap(16, 16);
+ dis_minimize_pix = new QPixmap(16, 16);
+ pact.begin(minimize_pix); pdis.begin(dis_minimize_pix);
+ bitmap = QBitmap(16, 16, iconify_white_bits, true);
+ bitmap.setMask(bitmap);
+ pact.setPen(actHigh); pdis.setPen(disHigh);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ bitmap = QBitmap(16, 16, iconify_dgray_bits, true);
+ pact.setPen(actLow); pdis.setPen(disLow);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ pact.end(); pdis.end();
+ bitmap = QBitmap(16, 16, iconify_mask_bits, true);
+ minimize_pix->setMask(bitmap); dis_minimize_pix->setMask(bitmap);
+
+ maximize_pix = new QPixmap(16, 16);
+ dis_maximize_pix = new QPixmap(16, 16);
+ pact.begin(maximize_pix); pdis.begin(dis_maximize_pix);
+ bitmap = QBitmap(16, 16, maximize_white_bits, true);
+ bitmap.setMask(bitmap);
+ pact.setPen(actHigh); pdis.setPen(disHigh);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ bitmap = QBitmap(16, 16, maximize_dgray_bits, true);
+ pact.setPen(actLow); pdis.setPen(disLow);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ pact.end(); pdis.end();
+ bitmap = QBitmap(16, 16, maximize_mask_bits, true);
+ maximize_pix->setMask(bitmap); dis_maximize_pix->setMask(bitmap);
+
+ normalize_pix = new QPixmap(16, 16);
+ dis_normalize_pix = new QPixmap(16, 16);
+ pact.begin(normalize_pix); pdis.begin(dis_normalize_pix);
+ bitmap = QBitmap(16, 16, maximizedown_white_bits, true);
+ bitmap.setMask(bitmap);
+ pact.setPen(actHigh); pdis.setPen(disHigh);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ bitmap = QBitmap(16, 16, maximizedown_dgray_bits, true);
+ pact.setPen(actLow); pdis.setPen(disLow);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ pact.end(); pdis.end();
+ bitmap = QBitmap(16, 16, maximizedown_mask_bits, true);
+ normalize_pix->setMask(bitmap); dis_normalize_pix->setMask(bitmap);
+
+ menu_pix = new QPixmap(16, 16);
+ dis_menu_pix = new QPixmap(16, 16);
+ pact.begin(menu_pix); pdis.begin(dis_menu_pix);
+ bitmap = QBitmap(16, 16, menu_white_bits, true);
+ bitmap.setMask(bitmap);
+ pact.setPen(actHigh); pdis.setPen(disHigh);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ bitmap = QBitmap(16, 16, menu_dgray_bits, true);
+ pact.setPen(actLow); pdis.setPen(disLow);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ pact.end(); pdis.end();
+ bitmap = QBitmap(16, 16, menu_mask_bits, true);
+ menu_pix->setMask(bitmap); dis_menu_pix->setMask(bitmap);
+
+ pinup_pix = new QPixmap(16, 16);
+ dis_pinup_pix = new QPixmap(16, 16);
+ pact.begin(pinup_pix); pdis.begin(dis_pinup_pix);
+ bitmap = QBitmap(16, 16, pinup_white_bits, true);
+ bitmap.setMask(bitmap);
+ pact.setPen(actHigh); pdis.setPen(disHigh);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ bitmap = QBitmap(16, 16, pinup_gray_bits, true);
+ pact.setPen(actMed); pdis.setPen(disMed);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ bitmap = QBitmap(16, 16, pinup_dgray_bits, true);
+ bitmap.setMask(bitmap);
+ pact.setPen(actLow); pdis.setPen(disLow);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ pact.end(); pdis.end();
+ bitmap = QBitmap(16, 16, pinup_mask_bits, true);
+ pinup_pix->setMask(bitmap); dis_pinup_pix->setMask(bitmap);
+
+ pindown_pix = new QPixmap(16, 16);
+ dis_pindown_pix = new QPixmap(16, 16);
+ pact.begin(pindown_pix); pdis.begin(dis_pindown_pix);
+ bitmap = QBitmap(16, 16, pindown_white_bits, true);
+ bitmap.setMask(bitmap);
+ pact.setPen(actHigh); pdis.setPen(disHigh);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ bitmap = QBitmap(16, 16, pindown_gray_bits, true);
+ pact.setPen(actMed); pdis.setPen(disMed);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ bitmap = QBitmap(16, 16, pindown_dgray_bits, true);
+ bitmap.setMask(bitmap);
+ pact.setPen(actLow); pdis.setPen(disLow);
+ pact.drawPixmap(0, 0, bitmap);
+ pdis.drawPixmap(0, 0, bitmap);
+ pact.end(); pdis.end();
+ bitmap = QBitmap(16, 16, pindown_mask_bits, true);
+ pindown_pix->setMask(bitmap); dis_pindown_pix->setMask(bitmap);
+
+}
+
+void WidgetCanvas::drawSampleWidgets()
+{
+ int textLen, tmp;
+ int highlightVal, lowlightVal;
+
+ KConfig * c = new KConfig("kcmfonts");
+
+ // Keep in sync with kglobalsettings.
+
+ QFont windowFontGuess(KGlobalSettings::generalFont().family(), 12, QFont::SansSerif, true);
+ windowFontGuess.setPixelSize(12);
+
+ c->setGroup("WM");
+ QFont windowFont = c->readFontEntry("activeFont", &windowFontGuess);
+
+ c->setGroup("General");
+ QFont defaultMenuFont = KGlobalSettings::menuFont();
+ QFont menuFont = c->readFontEntry("menuFont", &defaultMenuFont);
+
+ delete c;
+ c = 0;
+
+ // Calculate the highlight and lowloght from contrast value and create
+ // color group from color scheme.
+
+ highlightVal=100+(2*contrast+4)*16/10;
+ lowlightVal=100+(2*contrast+4)*10;
+
+ QColorGroup cg( txt, back,
+ back.light(highlightVal),
+ back.dark(lowlightVal),
+ back.dark(120),
+ txt, window );
+
+ // We will need this brush.
+
+ QBrush brush(SolidPattern);
+ brush.setColor( back );
+
+ // Create a scrollbar and redirect drawing into a temp. pixmap to save a
+ // lot of fiddly drawing later.
+
+ QScrollBar *vertScrollBar = new QScrollBar( QScrollBar::Vertical, this );
+ // TODO: vertScrollBar->setStyle( new QMotifStyle() );
+ vertScrollBar->setGeometry( 400, 400, SCROLLBAR_SIZE, height());
+ vertScrollBar->setRange( 0, 0 );
+ vertScrollBar->setPalette( QPalette(cg,cg,cg));
+ vertScrollBar->show();
+
+ QPixmap pm( vertScrollBar->width(), vertScrollBar->height() );
+ pm.fill( back );
+#ifndef __osf__
+ QPainter::redirect( vertScrollBar, &pm );
+#endif
+ vertScrollBar->repaint();
+ QPainter::redirect( vertScrollBar, 0 );
+ vertScrollBar->hide();
+
+ // Reset the titlebar pixmaps
+ resetTitlebarPixmaps(aTitleBtn, iTitleBtn);
+
+ // Initialize the pixmap which we draw sample widgets into.
+
+ smplw.resize(width(), height());
+ //smplw.fill( parentWidget()->back() );
+ smplw.fill( parentWidget()->colorGroup().mid() );
+
+ // Actually start painting in
+
+ QPainter paint( &smplw );
+
+ // Inactive window
+
+ qDrawWinPanel ( &paint, 15, 5, width()-48, height(), cg, FALSE,
+ &brush);
+
+ paint.setBrush( iaTitle );
+ paint.setPen( iaTitle );
+ //paint.drawRect( 20, 10, width()-60, 20 );
+
+ KPixmap pmTitle;
+ pmTitle.resize( width()-160, 20 );
+
+ // Switched to vertical gradient because those kwin styles that
+ // use the gradient have it vertical.
+ KPixmapEffect::gradient(pmTitle, iaTitle, iaBlend,
+ KPixmapEffect::HorizontalGradient);
+ paint.drawPixmap( 60, 10, pmTitle );
+
+
+ paint.setFont( windowFont );
+ paint.setPen( iaTxt );
+ paint.drawText( 65, 25, i18n("Inactive window") );
+ textLen = paint.fontMetrics().width( i18n("Inactive window") );
+
+ tmp = width()-100;
+ paint.drawPixmap(22, 12, *dis_menu_pix);
+ paint.drawPixmap(42, 12, *dis_pinup_pix);
+ paint.drawPixmap(tmp+2, 12, *dis_minimize_pix);
+ paint.drawPixmap(tmp+22, 12, *dis_maximize_pix);
+ paint.drawPixmap(tmp+42, 12, *dis_close_pix);
+
+ int spot = 0;
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 65, 25-14, textLen, 14 ), CSM_Inactive_title_text );
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 60, 10, (width()-160)/2, 20 ), CSM_Inactive_title_bar );
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 60+(width()-160)/2, 10,
+ (width()-160)/2, 20 ), CSM_Inactive_title_blend );
+
+ hotspots[spot++] =
+ HotSpot(QRect(20, 12, 40, 20), CSM_Inactive_title_button);
+ hotspots[spot++] =
+ HotSpot(QRect(tmp, 12, 60, 20), CSM_Inactive_title_button);
+
+
+ // Active window
+
+ qDrawWinPanel ( &paint, 20, 25+5, width()-40, height(), cg, FALSE,
+ &brush);
+
+ paint.setBrush( aTitle );paint.setPen( aTitle );
+ paint.drawRect( 65, 30+5, width()-152, 20 );
+
+ // Switched to vertical gradient because those kwin styles that
+ // use the gradient have it vertical.
+ pmTitle.resize( width()-152, 20 );
+ KPixmapEffect::gradient(pmTitle, aTitle, aBlend,
+ KPixmapEffect::HorizontalGradient);
+ paint.drawPixmap( 65, 35, pmTitle );
+
+ paint.setFont( windowFont );
+ paint.setPen( aTxt );
+ paint.drawText( 75, 50, i18n("Active window") );
+ textLen = paint.fontMetrics().width( i18n("Active window" ));
+
+ tmp = width()-152+65;
+ paint.drawPixmap(27, 35, *menu_pix);
+ paint.drawPixmap(47, 35, *pinup_pix);
+ paint.drawPixmap(tmp+2, 35, *minimize_pix);
+ paint.drawPixmap(tmp+22, 35, *maximize_pix);
+ paint.drawPixmap(tmp+42, 35, *close_pix);
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 75, 50-14, textLen, 14 ), CSM_Active_title_text);
+ hotspots[ spot ++] =
+ HotSpot( QRect( 65, 35, (width()-152)/2, 20 ), CSM_Active_title_bar );
+ hotspots[ spot ++] =
+ HotSpot( QRect( 65+(width()-152)/2, 35,
+ (width()-152)/2, 20 ), CSM_Active_title_blend );
+
+ hotspots[spot++] =
+ HotSpot(QRect(25, 35, 40, 20), CSM_Active_title_button);
+ hotspots[spot++] =
+ HotSpot(QRect(tmp, 35, 60, 20), CSM_Active_title_button);
+
+ // Menu bar
+
+ //qDrawShadePanel ( &paint, 25, 55, width()-52, 28, cg, FALSE, 2, &brush);
+ kapp->style().drawPrimitive(QStyle::PE_PanelMenuBar, &paint,
+ QRect(QPoint(25, 55), QSize(width()-52, 28)), cg);
+
+ paint.setFont( menuFont );
+ paint.setPen(txt );
+ QString file = i18n("File");
+ textLen = paint.fontMetrics().width( file );
+ //qDrawShadePanel ( &paint, 30, 59, textLen + 10, 21, cg, FALSE, 2, &brush);
+ kapp->style().drawPrimitive(QStyle::PE_Panel, &paint,
+ QRect(30, 59, textLen + 10, 21), cg);
+ paint.drawText( 35, 74, file );
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 35, 62, textLen, 14 ), CSM_Text );
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 27, 57, 33, 21 ), CSM_Background );
+
+ paint.setFont( menuFont );
+ paint.setPen( txt );
+ paint.drawText( 35 + textLen + 20, 74, i18n("Edit") );
+ textLen = paint.fontMetrics().width( i18n("Edit") );
+
+ hotspots[ spot++ ] = HotSpot( QRect( 35 + textLen + 20, 62, textLen, 14 ), CSM_Text );
+
+ // Button Rects need to go before window
+
+ // Frame and window contents
+
+ brush.setColor( window );
+ qDrawShadePanel ( &paint, 25, 80+5-4, width()-7-45-2,
+ height(), cg, TRUE, 2, &brush);
+
+ // Standard text
+ QFont fnt = KGlobalSettings::generalFont();
+ paint.setFont( fnt );
+ paint.setPen( windowTxt );
+ paint.drawText( 140, 127-20, i18n( "Standard text") );
+ textLen = paint.fontMetrics().width( i18n("Standard text") );
+ int column2 = 120 + textLen + 40 + 16;
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 140, 113-20, textLen, 14 ), CSM_Standard_text );
+
+ // Selected text
+ textLen = paint.fontMetrics().width( i18n("Selected text") );
+ if (120 + textLen + 40 + 16 > column2)
+ column2 = 120 + textLen + 40 + 16;
+
+ paint.setBrush( select );paint.setPen( select );
+ paint.drawRect ( 120, 115, textLen+40, 32);
+
+ paint.setFont( fnt );
+ paint.setPen( selectTxt );
+ paint.drawText( 140, 135, i18n( "Selected text") );
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 140, 121, textLen, 14 ), CSM_Select_text );
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 120, 115, textLen+40, 32), CSM_Select_background ); // select bg
+
+ // Link
+ paint.setPen( link );
+ paint.drawText( column2+18, 127-20, i18n( "link") );
+ textLen = paint.fontMetrics().width( i18n("link") );
+ paint.drawLine( column2+18, 109, column2+18+textLen, 109);
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect( column2+18, 113-20, textLen, 17 ), CSM_Link );
+
+ int column3 = column2 + 25 + textLen;
+ // Followed Link
+ paint.setPen( visitedLink );
+ paint.drawText( column3, 127-20, i18n( "followed link") );
+ textLen = paint.fontMetrics().width( i18n("followed link") );
+ paint.drawLine( column3, 109, column3+textLen, 109);
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect( column3, 113-20, textLen, 17 ), CSM_Followed_Link );
+
+ // Button
+ int xpos = column2;
+ int ypos = 115 + 2;
+ textLen = paint.fontMetrics().width(i18n("Push Button"));
+ hotspots[ spot++ ] =
+ HotSpot( QRect(xpos+16, ypos+((28-paint.fontMetrics().height())/2),
+ textLen, paint.fontMetrics().height()), CSM_Button_text );
+ hotspots[ spot++ ] =
+ HotSpot( QRect(xpos, ypos, textLen+32, 28), CSM_Button_background );
+ //brush.setColor( button );
+ QColorGroup cg2(cg);
+ cg2.setColor(QColorGroup::Button, button);
+ cg2.setColor(QColorGroup::Background, window);
+ //qDrawWinButton(&paint, xpos, ypos, textLen+32, 28, cg, false, &brush);
+ kapp->style().drawPrimitive(QStyle::PE_ButtonCommand, &paint,
+ QRect(xpos, ypos, textLen+32, 28), cg2, QStyle::Style_Enabled | QStyle::Style_Raised);
+ paint.setPen(buttonTxt);
+ paint.drawText(xpos, ypos, textLen+32, 28, AlignCenter,
+ i18n("Push Button"));
+
+ // Scrollbar
+ paint.drawPixmap(width()-55+27-16-2,80+5-2,pm);
+
+ // Menu
+
+ brush.setColor( back );
+
+ int textLenNew, textLenOpen, textLenSave;
+
+
+ textLenNew = paint.fontMetrics().width( i18n("New") );
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 56, 83, textLenNew, 14 ), CSM_Text );
+
+ paint.setFont( menuFont );
+ textLenOpen = paint.fontMetrics().width( i18n("Menu item", "Open") );
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 56, 105, textLenOpen, 14 ), CSM_Text );
+
+ paint.setFont( menuFont );
+ textLenSave = paint.fontMetrics().width( i18n("Menu item", "Save") );
+
+ QPopupMenu *popup = new QPopupMenu( this );
+ popup->setFont( menuFont );
+ popup->setPalette( QPalette(cg,cg,cg));
+ popup->insertItem(i18n("New"));
+ popup->insertItem(i18n("Menu item", "Open"));
+ int id = popup->insertItem(i18n("Menu item", "Save"));
+ popup->setItemEnabled( id, false );
+
+ // HACK: Force Layouting
+ //Sad Eagle: sizeHint() forces layouting too, and it's a lot less visible
+ //popup->sizeHint(); // Breaks with Qt 3.3
+ popup->resize(popup->sizeHint());
+
+ pm = QPixmap::grabWidget( popup );
+ delete popup;
+ bitBlt(&smplw, 30, 80, &pm, 0, 0, pm.width(), pm.height());
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 28, 78, 88, 77 ), CSM_Background );
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect(25, 80+5-4, width()-7-45-2-16, height()), CSM_Standard_background );
+
+
+ // Valance
+
+ qDrawWinPanel ( &paint, 0, 0, width(), height(),
+ parentWidget()->colorGroup(), TRUE, 0);
+
+ // Stop the painting
+
+ hotspots[ spot++ ] =
+ HotSpot( QRect( 0, 0, width(), height() ), CSM_Background ); // ?
+
+ repaint( FALSE );
+}
diff --git a/kcontrol/colors/widgetcanvas.h b/kcontrol/colors/widgetcanvas.h
new file mode 100644
index 000000000..e2f9bd057
--- /dev/null
+++ b/kcontrol/colors/widgetcanvas.h
@@ -0,0 +1,121 @@
+//
+// A special widget which draws a sample of KDE widgets
+// It is used to preview color schemes
+//
+// Copyright (c) Mark Donohoe 1998
+//
+
+#ifndef __WIDGETCANVAS_H__
+#define __WIDGETCANVAS_H__
+
+#include <qmap.h>
+#include <kapplication.h>
+
+#define MAX_HOTSPOTS 28
+#define SCROLLBAR_SIZE 16
+
+// These defines define the order of the colors in the combo box.
+#define CSM_Standard_background 0
+#define CSM_Standard_text 1
+#define CSM_Select_background 2
+#define CSM_Select_text 3
+#define CSM_Link 4
+#define CSM_Followed_Link 5
+#define CSM_Background 6
+#define CSM_Text 7
+#define CSM_Button_background 8
+#define CSM_Button_text 9
+#define CSM_Active_title_bar 10
+#define CSM_Active_title_text 11
+#define CSM_Active_title_blend 12
+#define CSM_Active_title_button 13
+#define CSM_Inactive_title_bar 14
+#define CSM_Inactive_title_text 15
+#define CSM_Inactive_title_blend 16
+#define CSM_Inactive_title_button 17
+#define CSM_Active_frame 18
+#define CSM_Active_handle 19
+#define CSM_Inactive_frame 20
+#define CSM_Inactive_handle 21
+#define CSM_Alternate_background 22
+#define CSM_LAST 23
+
+class QPixmap;
+class QColor;
+class QPainter;
+class QEvent;
+
+class KPixmap;
+
+class HotSpot
+{
+public:
+ HotSpot() {}
+ HotSpot( const QRect &r, int num )
+ : rect(r), number(num) {}
+
+ QRect rect;
+ int number;
+};
+
+class WidgetCanvas : public QWidget
+{
+ Q_OBJECT
+
+public:
+ WidgetCanvas( QWidget *parent=0, const char *name=0 );
+ void drawSampleWidgets();
+ void resetTitlebarPixmaps(const QColor &active,
+ const QColor &inactive);
+ void addToolTip( int area, const QString & );
+ QPixmap smplw;
+
+ QColor iaTitle;
+ QColor iaTxt;
+ QColor iaBlend;
+ QColor iaFrame;
+ QColor iaHandle;
+ QColor aTitle;
+ QColor aTxt;
+ QColor aBlend;
+ QColor aFrame;
+ QColor aHandle;
+ QColor back;
+ QColor txt;
+ QColor select;
+ QColor selectTxt;
+ QColor window;
+ QColor windowTxt;
+ QColor button;
+ QColor buttonTxt;
+ QColor aTitleBtn;
+ QColor iTitleBtn;
+ QColor link;
+ QColor visitedLink;
+ QColor alternateBackground;
+
+ int contrast;
+ bool shadeSortColumn;
+
+signals:
+ void widgetSelected( int );
+ void colorDropped( int, const QColor&);
+
+protected:
+ void redrawPopup(const QColorGroup &cg);
+
+ virtual void paintEvent( QPaintEvent * );
+ virtual void mousePressEvent( QMouseEvent * );
+ virtual void mouseMoveEvent( QMouseEvent * );
+ virtual void resizeEvent( QResizeEvent * );
+ virtual void showEvent( QShowEvent * );
+ virtual void dropEvent( QDropEvent *);
+ virtual void dragEnterEvent( QDragEnterEvent *);
+ void paletteChange( const QPalette & );
+
+ QMap<int,QString> tips;
+ HotSpot hotspots[MAX_HOTSPOTS];
+ int currentHotspot;
+};
+
+#endif
diff --git a/kcontrol/componentchooser/EXAMPLE.desktop b/kcontrol/componentchooser/EXAMPLE.desktop
new file mode 100644
index 000000000..f5501162b
--- /dev/null
+++ b/kcontrol/componentchooser/EXAMPLE.desktop
@@ -0,0 +1,159 @@
+Name=A nice name you have chosen for your interface
+Name[af]='n oulike naam jy het gekies vir jou koppelvlak
+Name[ar]=اسم ما اخترته من قبل للواجهة الخاصة بك
+Name[az]=Ara üzünüzə seçdiyiniz ə'la ad
+Name[be]=Файная назва, якую вы выбралі для свайго інтэрфейса
+Name[bg]=Име на компонент
+Name[bn]=আপনার ইন্টারফেসের জন্য আপনার পছন্দ করা সুন্দর একটা নাম
+Name[bs]=Lijepo ime koje ste odabrali za vaš interfejs
+Name[ca]=Un bonic nom que heu triat per a la interfície
+Name[cs]=Hezký název pro vaše rozhraní
+Name[csb]=Miłé miono, jaczé òstało wëbróné dlô programë
+Name[cy]=Enw neis yr ydych wedi dewis am eich rhyngwyneb
+Name[da]=Et godt navn som du har valgt for din grænseflade
+Name[de]=Der von Ihnen gewählte Name für die Schnittstelle
+Name[el]=Ένα όμορφο όνομα που έχετε επιλέξει για τη διασύνδεσή σας
+Name[eo]=Plaĉa nomo, kiun vi elektis por via interfaco
+Name[es]=Un bonito nombre de su elección para su interfaz
+Name[et]=Mõni kena nimi, mille sa oma liidesele valinud oled
+Name[eu]=Zure interfazerako aukeratu duzun izen dotorea
+Name[fa]=لقبی که برای واسط خود انتخاب کرده‌اید
+Name[fi]=Valittu nimi rajapinnalle
+Name[fo]=Navn markamótsins
+Name[fr]=Un joli nom que vous avez choisi pour votre interface
+Name[fy]=In namme dy jo koazen ha foar jo ynterface
+Name[gl]=Un bon nome que escolleu para a sua interface
+Name[he]=שם שבחרת לממשק שלך
+Name[hi]=आपने अपने इंटरफेस के लिए एक अच्छा नाम चुना है
+Name[hr]=Naziv koji ste odabrali za vaše sučelje
+Name[hu]=Egy Ön által választott név a felülethez
+Name[is]=Vingjarnlegt nafn þú hefur valið fyrir umhverfið þitt
+Name[it]=Un bel nome per la tua interfaccia
+Name[ja]=あなたのインターフェースに素敵な名前を付けてください
+Name[ka]=მშვენიერი სახელია ინტერფეისისთვის
+Name[kk]=Интерфейсіңізге таңдаған атауыңыз
+Name[km]=ឈ្មោះ​ល្អ​មួយ ដែល​អ្នក​បាន​ជ្រើស​សម្រាប់​ចំណុច​ប្រទាក់​របស់​អ្នក
+Name[ko]=인터페이스에 지정할 이름
+Name[lo]=A nice name you have chosen for your interfaceName=A nice name you have chosen for your interface
+Name[lt]=Gražus vardas, kurį Jūs pasirinkote savo sąsajai
+Name[lv]=Jauks nosaukums, ko Jūs izvelējāties savam interfeisam
+Name[mk]=Убаво име што сте го избрале за вашиот интерфејс
+Name[mn]=Таны харьцах хэсэгт сонгосон нэр
+Name[ms]=Nama yang anda pilih untuk antara muka anda
+Name[mt]=Isem sabiħ li għażilt għall-interfaċċja tiegħek
+Name[nb]=Et fint navn du har valgt for grensesnittet
+Name[nds]=Dor hest Du Di'n smucken Naam för Dien Koppelsteed utsöcht
+Name[ne]=तपाईँले इन्टरफेसका लागि रोजेको नाम राम्रो छ
+Name[nl]=Een naam die u hebt gekozen voor uw interface
+Name[nn]=Eit fint namn du har valt for grensesnittet
+Name[nso]=Leina le lebotsana leo ole kgethetsego interface ya gago
+Name[pa]=ਆਪਣੇ ਇੰਟਰਫੇਸ ਲਈ ਇੱਕ ਸੋਹਣਾ ਨਾਂ ਚੁਣੋ
+Name[pl]=Zgrabna nazwa którą wybrałeś dla programu
+Name[pt]=Um nome bonito que escolheu para a sua interface
+Name[pt_BR]=Um bom nome que você escolheu para a sua interface
+Name[ro]=Un nume drăguț ales de dumneavoastră pentru interfață
+Name[ru]=имя, которое вы выбрали для своего интерфейса
+Name[rw]=Izina ryiza wahisemo ry'imigaragarire yawe
+Name[se]=Du lavtta čáppa namma
+Name[sk]=Pekné meno pre vaše rozhranie
+Name[sl]=Lepo ime, ki ste ga izbrali za svoj vmesnik
+Name[sr]=Лепо име које сте изабрали за ваш интерфејс
+Name[sr@Latn]=Lepo ime koje ste izabrali za vaš interfejs
+Name[ss]=Ligama lelimnandzi lolikhetsele sichumanisi sakho
+Name[sv]=Ett bra namn som du har valt för gränssnittet
+Name[ta]=உங்கள் இடைமுகத்துக்கு நல்ல பெயரை தேர்ந்தெடுத்துள்ளீர்கள்
+Name[tg]=Номи зебое ки барои робитаатон интихоб кардаед
+Name[th]=ชื่อดีๆ ที่คุณเลือกสำหรับระบบติดต่อผู้ใช้ของคุณ
+Name[tr]=İlginç bir oyun
+Name[tt]=Üz yözara öçen saylanğan isem
+Name[uk]=Гарна назва, вибрана вами для вашого інтерфейсу
+Name[uz]=Interfeysingiz uchun chiroyli nom
+Name[uz@cyrillic]=Интерфейсингиз учун чиройли ном
+Name[ven]=Dziona la vhudi lenali nanga uitela tshikirini tsha khomupwutha yanu
+Name[vi]=Một cái tên đẹp bạn đã chọn cho giao diện của bạn
+Name[wa]=On clapant no k' vos avoz tchoezi po vost eterface
+Name[xh]=Igama elihle olikhetileyo kujongano lwakho
+Name[zh_CN]=选择您的界面的好名字
+Name[zh_TW]=您為您的界面選擇的好名字
+Name[zu]=Igama elihle olikhethele umxhumanisi wakho
+Comment=A helpful description of the interface for the top right info box
+Comment[af]='n hulpvaardig beskrywing van die koppelvlak vir die bo regterkant inligting boks
+Comment[az]=Ara üzünüzün faydalı izahatı
+Comment[be]=Карыснае апісанне інтэрфейсу для інфармацыйнай скрыні ў правым верхнім куце
+Comment[bg]=Описание на компонент
+Comment[bn]=ইন্টারফেসটির সহজবোধ্য বর্ণনা, উপরে ডানদিকের ইনফো বক্স-এর জন্য
+Comment[bs]=Koristan opis interfejsa za info kocku gore-desno
+Comment[ca]=Una útil descripció de la interfície per al rètol informatiu superior dret
+Comment[cs]=Smysluplný popis vašeho rozhraní pro informační box
+Comment[csb]=Pòmòcny òpis programë (dlô wëdowiédzë w oczénkù w prawim, górnym rogù)
+Comment[cy]=Disgrifiad cymorthwyol o'r rhyngwyneb i'r blwch gwybodaeth top de
+Comment[da]=En nyttig beskrivelse af grænsefladen for infofeltet øverst til højre
+Comment[de]=Hilfreiche Beschreibung der Schnittstelle für das Infofeld rechts oben
+Comment[el]=Μια χρήσιμη περιγραφή της διασύνδεσης για το πάνω δεξιά πλαίσιο πληροφοριών
+Comment[eo]=helpema priskribo de le interfaco de la supre-dekstra infolisto
+Comment[es]=Una descripción útil de la interfaz para el cuadro de información superior derecho
+Comment[et]=Abiks kirjeldus
+Comment[eu]=Goi-eskumako info kutxarako interfazearen deskripzio lagungarri bat
+Comment[fa]=یک توصیف مفید واسط برای سمت راست بالای جعبه اطلاعات
+Comment[fi]=Tässä pitäisi olla pieni kuvaus rajapinnasta oikean yläkulman laatikkoon
+Comment[fo]=Lýsing av markamóti
+Comment[fr]=Une description utile de l'interface pour la boîte d'informations en haut à droite
+Comment[fy]=In helpzame omskriuwing fan de ynterface, Wat bedoelt is foar it ynformaasjefak rjochtboppe
+Comment[gl]=Unha descrición da interface para o botón de información
+Comment[he]=תיאור שימושי של הממשק בשביל תיבת המידע המוצגת מצד שמאל למעלה
+Comment[hi]=ऊपरी दाएँ कोने के जानकारी बाक्स के इंटरफेस का उपयोगी वर्णन.
+Comment[hr]=Koristan opis sučelja u info-okviru gore desno
+Comment[hu]=A felület leírása a jobb felső sarokban található tájékoztató ablakhoz
+Comment[is]=Jamm, hér ætti að vera smá lýsing á viðbótinni
+Comment[it]=Un'utile descrizione dell'interfaccia per la casella delle informazioni
+Comment[ja]=右上の情報ボックスのためのインターフェースに関する説明
+Comment[kk]=Жоғары оң жақ мәлімет коршау үшін интерфейстің сипаттамасы
+Comment[km]=សេចក្ដី​ពណ៌នា​មាន​ប្រយោជន៍​របស់​ចំណុច​ប្រទាក់ សម្រាប់​ប្រអប់​ព័ត៌មាន​ខាង​លើ​ស្ដាំ
+Comment[ko]=오른쪽 위 정보 상자의 인터페이스에 대한 설명
+Comment[lo]=ນີ້ເປັນລາຍລະອງດນ້ອຍໆກ່ງວກັບຮູຸບແບບສ່ວນ ຕິດຕໍ່ສຳຫລັບກ່ອງຂໍ້ມູນດ້ານຂວາເທິງ
+Comment[lt]=Naudingas sąsajos aprašymas, skirtas viršutinei dešinei informacijos langelio daliai
+Comment[mk]=Опис со објаснување за интерфејсот за горното десно поле за инфо.
+Comment[mn]=Баруун дээд мэдээллийн самбарын хувьд харьцах хэсгийн ашигтай тодорхойлолт
+Comment[ms]=Huraian antara muka yang sangat membantu untuk kotak maklumat kanan atas
+Comment[mt]=Hawn ikteb deskrizzjoni qasira dwar l-interfaċċja għall-kaxxa ta' informazzjoni
+Comment[nb]=Beskrivelse av grensesnittet for infoboksen øverst til høyre
+Comment[nds]=En hölpsche Beschrieven vun de Koppelsteed för den Info-Kasten rechterhand baven
+Comment[ne]=माथिको दायाँ सूचना बाकसका लागि इन्टरफेसको उपयोगी वर्णन
+Comment[nl]=Een behulpzame omschrijving van de interface, bedoelt voor het informatievak rechts boven
+Comment[nn]=Ei hjelpsam skildring av grensesnittet for infoboksen oppe til høgre
+Comment[nso]=Thlaloso yeo e tletsego thuso ya interface ya lepokisi la tshedimoso la godimo kago lagoja
+Comment[pa]=ਸੱਜੇ ਜਾਣਕਾਰੀ ਬਕਸੇ ਲਈ ਇੰਟਰਫੇਸ ਲ਼ਈ ਸਹਾਇਤਾ ਵੇਰਵਾ
+Comment[pl]=Pomocny opis programu (dla informacji w okienku w prawym, górnym rogu)
+Comment[pt]=Uma descrição útil da interface para a zona de informação do canto superior direito
+Comment[pt_BR]=Uma descrição útil da interface para a caixa de informação superior direita
+Comment[ro]=Aici trebuie să fie descrierea interfeței pentru căsuța din dreapta-sus
+Comment[ru]=Полезное описание интерфейса в верхнем правом информационном окне
+Comment[rw]=Umwirondoro ngirakamaro w'imigaragarire ujyanye n'agasanduku k'ibisobanuro hejuru iburyo
+Comment[se]=Laktaválddahus maid infoboksa badjin olgešbealde geavaha.
+Comment[sk]=Pomocný popis rozhrania pre informačný box v pravom hornom rohu
+Comment[sl]=Primeren opis vmesnika za gornjo desno okno z informacijami
+Comment[sr]=Опис интерфејса који сте изабрали за горњу десну инфо коцкицу
+Comment[sr@Latn]=Opis interfejsa koji ste izabrali za gornju desnu info kockicu
+Comment[ss]=Sichasiso lesinelusito sesichumanisi kwelibhokisi lemniningwane lesetulu ngesekudla
+Comment[sv]=Hjälpsam beskrivning av gränssnittet för informationsrutan uppe till höger
+Comment[ta]=மேல் வலது தகவல் பெட்டிக்கான பயனுள்ள விவர இடைமுகம்
+Comment[tg]=Манфиати тавсифи робита дар тирезаи иттилооти самти рости боло
+Comment[th]=นี่เป็นคำอธิบายเกี่ยวกับรูปแบบส่วนติดต่อสำหรับกล่องข้อมูลด้านขวาบน
+Comment[tr]=Arayüzle ilgili yardım bilgisi
+Comment[tt]=Yözara turında faydalı açıqlama öske uñ qırında
+Comment[uk]=Допоміжний опис інтерфейсу для віконця інформації вгорі праворуч
+Comment[ven]=Thalutshedzo yau thusa ya tshikirini tsha khomupwutha uitela bogisi la mafhungo la tshaula ntha
+Comment[vi]=Một mô tả giao diện có ích cho hộp thông tin ở trên cùng bên phải
+Comment[wa]=On discrijhaedje aidant d' l' eterface pol boesse d' informåcion e hôt a droete
+Comment[xh]=Uchazo oluluncedo lojongano olungaphezulu ekunene kwebhokisi yolwazi
+Comment[zh_CN]=右侧信息框中界面的简短描述
+Comment[zh_TW]=用於右上方資訊方塊界面的有用敘述
+Comment[zu]=Incazelo esizayo yomxhumanisi yebhokisi lolwazi eliphezulu ngakwesokudla
+
+configurationType=Possible values are component and application. Only component is handled at the moment though
+ServiceTypeToConfigure=The service type, which should be configured. If this line is empty you have to provide a plugin (not supported yet)
+MimeTypeOfInterest=A mimetype which should be used in conjunction with ServiceTypeToConfigure
+defaultImplementation=The name of the default implementation as it would be returned by KService::desktopEntryName()
+storeInFile=default_components //the file where the setting should be saved (default_components sounds reasonable for a central storage)
+valueSection=The desktop section, where the setting should be stored
+valueName=the name of the value entry
diff --git a/kcontrol/componentchooser/Makefile.am b/kcontrol/componentchooser/Makefile.am
new file mode 100644
index 000000000..3a63947a0
--- /dev/null
+++ b/kcontrol/componentchooser/Makefile.am
@@ -0,0 +1,15 @@
+SUBDIRS= . componentservices
+AM_CPPFLAGS = -I../ -I$(top_srcdir)/kio -I$(top_srcdir) $(all_includes)
+
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = kcm_componentchooser.la
+
+kcm_componentchooser_la_SOURCES = componentchooser_ui.ui componentconfig_ui.ui emailclientconfig_ui.ui terminalemulatorconfig_ui.ui browserconfig_ui.ui componentchooser.cpp kcm_componentchooser.cpp
+kcm_componentchooser_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_componentchooser_la_LIBADD = $(LIB_KIO)
+
+xdg_apps_DATA = componentchooser.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmcomponentchooser.pot
diff --git a/kcontrol/componentchooser/browserconfig_ui.ui b/kcontrol/componentchooser/browserconfig_ui.ui
new file mode 100644
index 000000000..886724970
--- /dev/null
+++ b/kcontrol/componentchooser/browserconfig_ui.ui
@@ -0,0 +1,174 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>BrowserConfig_UI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>BrowserConfig_UI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>394</width>
+ <height>324</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>label</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;qt&gt;Open &lt;b&gt;http&lt;/b&gt; and &lt;b&gt;https&lt;/b&gt; URLs&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioKIO</cstring>
+ </property>
+ <property name="text">
+ <string>in an application based on the contents of the URL</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioExec</cstring>
+ </property>
+ <property name="text">
+ <string>in the following browser:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>lineExec</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>btnSelectBrowser</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>radioExec</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lineExec</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>radioExec</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>btnSelectBrowser</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>btnSelectBrowser</sender>
+ <signal>clicked()</signal>
+ <receiver>BrowserConfig_UI</receiver>
+ <slot>selectBrowser()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected">selectBrowser()</slot>
+</slots>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/componentchooser/componentchooser.cpp b/kcontrol/componentchooser/componentchooser.cpp
new file mode 100644
index 000000000..792b250a0
--- /dev/null
+++ b/kcontrol/componentchooser/componentchooser.cpp
@@ -0,0 +1,530 @@
+/***************************************************************************
+ componentchooser.cpp - description
+ -------------------
+ copyright : (C) 2002 by Joseph Wenninger
+ email : jowenn@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License verstion 2 as *
+ * published by the Free Software Foundation *
+ * *
+ ***************************************************************************/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "componentchooser.h"
+#include "componentchooser.moc"
+
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qwidgetstack.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kemailsettings.h>
+#include <kipc.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kopenwith.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+#include <ktrader.h>
+#include <kurlrequester.h>
+
+class MyListBoxItem: public QListBoxText
+{
+public:
+ MyListBoxItem(const QString& text, const QString &file):QListBoxText(text),File(file){}
+ virtual ~MyListBoxItem(){;}
+ QString File;
+};
+
+
+//BEGIN General kpart based Component selection
+
+CfgComponent::CfgComponent(QWidget *parent):ComponentConfig_UI(parent),CfgPlugin(){
+ m_lookupDict.setAutoDelete(true);
+ m_revLookupDict.setAutoDelete(true);
+ connect(ComponentSelector,SIGNAL(activated(const QString&)),this,SLOT(slotComponentChanged(const QString&)));
+}
+
+CfgComponent::~CfgComponent(){}
+
+void CfgComponent::slotComponentChanged(const QString&) {
+ emit changed(true);
+}
+
+void CfgComponent::save(KConfig *cfg) {
+ // yes, this can happen if there are NO KTrader offers for this component
+ if (!m_lookupDict[ComponentSelector->currentText()])
+ return;
+
+ QString ServiceTypeToConfigure=cfg->readEntry("ServiceTypeToConfigure");
+ KConfig *store = new KConfig(cfg->readPathEntry("storeInFile","null"));
+ store->setGroup(cfg->readEntry("valueSection"));
+ store->writePathEntry(cfg->readEntry("valueName","kcm_componenchooser_null"),*m_lookupDict[ComponentSelector->currentText()]);
+ store->sync();
+ delete store;
+ emit changed(false);
+}
+
+void CfgComponent::load(KConfig *cfg) {
+
+ ComponentSelector->clear();
+ m_lookupDict.clear();
+ m_revLookupDict.clear();
+
+ QString ServiceTypeToConfigure=cfg->readEntry("ServiceTypeToConfigure");
+
+ QString MimeTypeOfInterest=cfg->readEntry("MimeTypeOfInterest");
+ KTrader::OfferList offers = KTrader::self()->query(MimeTypeOfInterest, "'"+ServiceTypeToConfigure+"' in ServiceTypes");
+
+ for (KTrader::OfferList::Iterator tit = offers.begin(); tit != offers.end(); ++tit)
+ {
+ ComponentSelector->insertItem((*tit)->name());
+ m_lookupDict.insert((*tit)->name(),new QString((*tit)->desktopEntryName()));
+ m_revLookupDict.insert((*tit)->desktopEntryName(),new QString((*tit)->name()));
+ }
+
+ KConfig *store = new KConfig(cfg->readPathEntry("storeInFile","null"));
+ store->setGroup(cfg->readEntry("valueSection"));
+ QString setting=store->readEntry(cfg->readEntry("valueName","kcm_componenchooser_null"));
+ delete store;
+ if (setting.isEmpty()) setting=cfg->readEntry("defaultImplementation");
+ QString *tmp=m_revLookupDict[setting];
+ if (tmp)
+ for (int i=0;i<ComponentSelector->count();i++)
+ if ((*tmp)==ComponentSelector->text(i))
+ {
+ ComponentSelector->setCurrentItem(i);
+ break;
+ }
+ emit changed(false);
+}
+
+void CfgComponent::defaults()
+{
+ //todo
+}
+
+//END General kpart based Component selection
+
+
+
+
+
+
+//BEGIN Email client config
+CfgEmailClient::CfgEmailClient(QWidget *parent):EmailClientConfig_UI(parent),CfgPlugin(){
+ pSettings = new KEMailSettings();
+
+ connect(kmailCB, SIGNAL(toggled(bool)), SLOT(configChanged()) );
+ connect(txtEMailClient, SIGNAL(textChanged(const QString&)), SLOT(configChanged()) );
+ connect(chkRunTerminal, SIGNAL(clicked()), SLOT(configChanged()) );
+}
+
+CfgEmailClient::~CfgEmailClient() {
+ delete pSettings;
+}
+
+void CfgEmailClient::defaults()
+{
+ load(0L);
+}
+
+void CfgEmailClient::load(KConfig *)
+{
+ QString emailClient = pSettings->getSetting(KEMailSettings::ClientProgram);
+ bool useKMail = (emailClient.isEmpty());
+
+ kmailCB->setChecked(useKMail);
+ otherCB->setChecked(!useKMail);
+ txtEMailClient->setText(emailClient);
+ txtEMailClient->setFixedHeight(txtEMailClient->sizeHint().height());
+ chkRunTerminal->setChecked((pSettings->getSetting(KEMailSettings::ClientTerminal) == "true"));
+
+ emit changed(false);
+
+}
+
+void CfgEmailClient::configChanged()
+{
+ emit changed(true);
+}
+
+void CfgEmailClient::selectEmailClient()
+{
+ KURL::List urlList;
+ KOpenWithDlg dlg(urlList, i18n("Select preferred email client:"), QString::null, this);
+ // hide "Do not &close when command exits" here, we don't need it for a mail client
+ dlg.hideNoCloseOnExit();
+ if (dlg.exec() != QDialog::Accepted) return;
+ QString client = dlg.text();
+
+ // get the preferred Terminal Application
+ KConfigGroup confGroup( KGlobal::config(), QString::fromLatin1("General") );
+ QString preferredTerminal = confGroup.readPathEntry("TerminalApplication", QString::fromLatin1("konsole"));
+ preferredTerminal += QString::fromLatin1(" -e ");
+
+ int len = preferredTerminal.length();
+ bool b = client.left(len) == preferredTerminal;
+ if (b) client = client.mid(len);
+ if (!client.isEmpty())
+ {
+ chkRunTerminal->setChecked(b);
+ txtEMailClient->setText(client);
+ }
+}
+
+
+void CfgEmailClient::save(KConfig *)
+{
+ if (kmailCB->isChecked())
+ {
+ pSettings->setSetting(KEMailSettings::ClientProgram, QString::null);
+ pSettings->setSetting(KEMailSettings::ClientTerminal, "false");
+ }
+ else
+ {
+ pSettings->setSetting(KEMailSettings::ClientProgram, txtEMailClient->text());
+ pSettings->setSetting(KEMailSettings::ClientTerminal, (chkRunTerminal->isChecked()) ? "true" : "false");
+ }
+
+ // insure proper permissions -- contains sensitive data
+ QString cfgName(KGlobal::dirs()->findResource("config", "emails"));
+ if (!cfgName.isEmpty())
+ ::chmod(QFile::encodeName(cfgName), 0600);
+
+ kapp->dcopClient()->emitDCOPSignal("KDE_emailSettingsChanged()", QByteArray());
+
+ emit changed(false);
+}
+
+
+//END Email client config
+
+
+
+//BEGIN Terminal Emulator Configuration
+
+CfgTerminalEmulator::CfgTerminalEmulator(QWidget *parent):TerminalEmulatorConfig_UI(parent),CfgPlugin(){
+ connect(terminalLE,SIGNAL(textChanged(const QString &)), this, SLOT(configChanged()));
+ connect(terminalCB,SIGNAL(toggled(bool)),this,SLOT(configChanged()));
+ connect(otherCB,SIGNAL(toggled(bool)),this,SLOT(configChanged()));
+}
+
+CfgTerminalEmulator::~CfgTerminalEmulator() {
+}
+
+void CfgTerminalEmulator::configChanged()
+{
+ emit changed(true);
+}
+
+void CfgTerminalEmulator::defaults()
+{
+ load(0L);
+}
+
+
+void CfgTerminalEmulator::load(KConfig *) {
+ KConfig *config = new KConfig("kdeglobals", true);
+ config->setGroup("General");
+ QString terminal = config->readPathEntry("TerminalApplication","konsole");
+ if (terminal == "konsole")
+ {
+ terminalLE->setText("xterm");
+ terminalCB->setChecked(true);
+ }
+ else
+ {
+ terminalLE->setText(terminal);
+ otherCB->setChecked(true);
+ }
+ delete config;
+
+ emit changed(false);
+}
+
+void CfgTerminalEmulator::save(KConfig *) {
+
+ KConfig *config = new KConfig("kdeglobals");
+ config->setGroup("General");
+ config->writePathEntry("TerminalApplication",terminalCB->isChecked()?"konsole":terminalLE->text(), true, true);
+ config->sync();
+ delete config;
+
+ KIPC::sendMessageAll(KIPC::SettingsChanged);
+ kapp->dcopClient()->send("klauncher", "klauncher","reparseConfiguration()", QString::null);
+
+ emit changed(false);
+}
+
+void CfgTerminalEmulator::selectTerminalApp()
+{
+ KURL::List urlList;
+ KOpenWithDlg dlg(urlList, i18n("Select preferred terminal application:"), QString::null, this);
+ // hide "Run in &terminal" here, we don't need it for a Terminal Application
+ dlg.hideRunInTerminal();
+ if (dlg.exec() != QDialog::Accepted) return;
+ QString client = dlg.text();
+
+ if (!client.isEmpty())
+ {
+ terminalLE->setText(client);
+ }
+}
+
+//END Terminal Emulator Configuration
+
+//BEGIN Browser Configuration
+
+CfgBrowser::CfgBrowser(QWidget *parent) : BrowserConfig_UI(parent),CfgPlugin(){
+ connect(lineExec,SIGNAL(textChanged(const QString &)),this,SLOT(configChanged()));
+ connect(radioKIO,SIGNAL(toggled(bool)),this,SLOT(configChanged()));
+ connect(radioExec,SIGNAL(toggled(bool)),this,SLOT(configChanged()));
+}
+
+CfgBrowser::~CfgBrowser() {
+}
+
+void CfgBrowser::configChanged()
+{
+ emit changed(true);
+}
+
+void CfgBrowser::defaults()
+{
+ load(0L);
+}
+
+
+void CfgBrowser::load(KConfig *) {
+ KConfig *config = new KConfig("kdeglobals", true);
+ config->setGroup("General");
+ QString exec = config->readEntry("BrowserApplication");
+ if (exec.isEmpty())
+ {
+ radioKIO->setChecked(true);
+ m_browserExec = exec;
+ m_browserService = 0;
+ }
+ else
+ {
+ radioExec->setChecked(true);
+ if (exec.startsWith("!"))
+ {
+ m_browserExec = exec.mid(1);
+ m_browserService = 0;
+ }
+ else
+ {
+ m_browserService = KService::serviceByStorageId( exec );
+ if (m_browserService)
+ m_browserExec = m_browserService->desktopEntryName();
+ else
+ m_browserExec = QString::null;
+ }
+ }
+
+ lineExec->setText(m_browserExec);
+ delete config;
+
+ emit changed(false);
+}
+
+void CfgBrowser::save(KConfig *) {
+
+ KConfig *config = new KConfig("kdeglobals");
+ config->setGroup("General");
+ QString exec;
+ if (radioExec->isChecked())
+ {
+ exec = lineExec->text();
+ if (m_browserService && (exec == m_browserExec))
+ exec = m_browserService->storageId(); // Use service
+ else
+ exec = "!" + exec; // Litteral command
+ }
+ config->writePathEntry("BrowserApplication", exec, true, true);
+ config->sync();
+ delete config;
+
+ KIPC::sendMessageAll(KIPC::SettingsChanged);
+
+ emit changed(false);
+}
+
+void CfgBrowser::selectBrowser()
+{
+ KURL::List urlList;
+ KOpenWithDlg dlg(urlList, i18n("Select preferred Web browser application:"), QString::null, this);
+ if (dlg.exec() != QDialog::Accepted) return;
+ m_browserService = dlg.service();
+ if (m_browserService)
+ m_browserExec = m_browserService->desktopEntryName();
+ else
+ m_browserExec = dlg.text();
+
+ lineExec->setText(m_browserExec);
+}
+
+//END Terminal Emulator Configuration
+
+ComponentChooser::ComponentChooser(QWidget *parent, const char *name):
+ ComponentChooser_UI(parent,name), configWidget(0) {
+
+ ComponentChooser_UILayout->setRowStretch(1, 1);
+ somethingChanged=false;
+ latestEditedService="";
+
+ QStringList dummy;
+ QStringList services=KGlobal::dirs()->findAllResources( "data","kcm_componentchooser/*.desktop",false,true,dummy);
+ for (QStringList::Iterator it=services.begin();it!=services.end();++it)
+ {
+ KSimpleConfig cfg(*it);
+ ServiceChooser->insertItem(new MyListBoxItem(cfg.readEntry("Name",i18n("Unknown")),(*it)));
+
+ }
+ ServiceChooser->setFixedWidth(ServiceChooser->sizeHint().width());
+ ServiceChooser->sort();
+ connect(ServiceChooser,SIGNAL(highlighted(QListBoxItem*)),this,SLOT(slotServiceSelected(QListBoxItem*)));
+ ServiceChooser->setSelected(0,true);
+ slotServiceSelected(ServiceChooser->item(0));
+
+}
+
+void ComponentChooser::slotServiceSelected(QListBoxItem* it) {
+ if (!it) return;
+
+ if (somethingChanged) {
+ if (KMessageBox::questionYesNo(this,i18n("<qt>You changed the default component of your choice. Do you want to save that change now?</qt>"),QString::null,KStdGuiItem::save(),KStdGuiItem::discard())==KMessageBox::Yes) save();
+ }
+ KSimpleConfig cfg(static_cast<MyListBoxItem*>(it)->File);
+
+ ComponentDescription->setText(cfg.readEntry("Comment",i18n("No description available")));
+ ComponentDescription->setMinimumSize(ComponentDescription->sizeHint());
+
+
+ QString cfgType=cfg.readEntry("configurationType");
+ QWidget *newConfigWidget = 0;
+ if (cfgType.isEmpty() || (cfgType=="component"))
+ {
+ if (!(configWidget && configWidget->qt_cast("CfgComponent")))
+ {
+ CfgComponent* cfgcomp = new CfgComponent(configContainer);
+ cfgcomp->ChooserDocu->setText(i18n("Choose from the list below which component should be used by default for the %1 service.").arg(it->text()));
+ newConfigWidget = cfgcomp;
+ }
+ else
+ {
+ static_cast<CfgComponent*>(configWidget)->ChooserDocu->setText(i18n("Choose from the list below which component should be used by default for the %1 service.").arg(it->text()));
+ }
+ }
+ else if (cfgType=="internal_email")
+ {
+ if (!(configWidget && configWidget->qt_cast("CfgEmailClient")))
+ {
+ newConfigWidget = new CfgEmailClient(configContainer);
+ }
+
+ }
+ else if (cfgType=="internal_terminal")
+ {
+ if (!(configWidget && configWidget->qt_cast("CfgTerminalEmulator")))
+ {
+ newConfigWidget = new CfgTerminalEmulator(configContainer);
+ }
+
+ }
+ else if (cfgType=="internal_browser")
+ {
+ if (!(configWidget && configWidget->qt_cast("CfgBrowser")))
+ {
+ newConfigWidget = new CfgBrowser(configContainer);
+ }
+
+ }
+
+ if (newConfigWidget)
+ {
+ configContainer->addWidget(newConfigWidget);
+ configContainer->raiseWidget(newConfigWidget);
+ configContainer->removeWidget(configWidget);
+ delete configWidget;
+ configWidget=newConfigWidget;
+ connect(configWidget,SIGNAL(changed(bool)),this,SLOT(emitChanged(bool)));
+ configContainer->setMinimumSize(configWidget->sizeHint());
+ }
+
+ if (configWidget)
+ static_cast<CfgPlugin*>(configWidget->qt_cast("CfgPlugin"))->load(&cfg);
+
+ emitChanged(false);
+ latestEditedService=static_cast<MyListBoxItem*>(it)->File;
+}
+
+
+void ComponentChooser::emitChanged(bool val) {
+ somethingChanged=val;
+ emit changed(val);
+}
+
+
+ComponentChooser::~ComponentChooser()
+{
+ delete configWidget;
+}
+
+void ComponentChooser::load() {
+ if( configWidget )
+ {
+ CfgPlugin * plugin = static_cast<CfgPlugin*>(
+ configWidget->qt_cast( "CfgPlugin" ) );
+ if( plugin )
+ {
+ KSimpleConfig cfg(latestEditedService);
+ plugin->load( &cfg );
+ }
+ }
+}
+
+void ComponentChooser::save() {
+ if( configWidget )
+ {
+ CfgPlugin * plugin = static_cast<CfgPlugin*>(
+ configWidget->qt_cast( "CfgPlugin" ) );
+ if( plugin )
+ {
+ KSimpleConfig cfg(latestEditedService);
+ plugin->save( &cfg );
+ }
+ }
+}
+
+void ComponentChooser::restoreDefault() {
+ if (configWidget)
+ {
+ static_cast<CfgPlugin*>(configWidget->qt_cast("CfgPlugin"))->defaults();
+ emitChanged(true);
+ }
+
+/*
+ txtEMailClient->setText("kmail");
+ chkRunTerminal->setChecked(false);
+
+ // Check if -e is needed, I do not think so
+ terminalLE->setText("xterm"); //No need for i18n
+ terminalCB->setChecked(true);
+ emitChanged(false);
+*/
+}
+
+// vim: sw=4 ts=4 noet
diff --git a/kcontrol/componentchooser/componentchooser.desktop b/kcontrol/componentchooser/componentchooser.desktop
new file mode 100644
index 000000000..487fb04d4
--- /dev/null
+++ b/kcontrol/componentchooser/componentchooser.desktop
@@ -0,0 +1,237 @@
+[Desktop Entry]
+Exec=kcmshell componentchooser
+Icon=misc
+Type=Application
+
+
+X-KDE-Library=componentchooser
+
+X-KDE-ParentApp=kcontrol
+
+Name=Component Chooser
+Name[af]=Komponent Kieser
+Name[ar]=اختيار المكونات
+Name[az]=Tərkib Hissəsi Seçicisi
+Name[be]=Выбар кампанентаў
+Name[bg]=Избор на компоненти
+Name[bn]=কম্পোনেন্ট নির্বাচক
+Name[br]=Dibaber ar parzhioù
+Name[bs]=Izbornik komponenti
+Name[ca]=Selector de components
+Name[cs]=Výběr komponent
+Name[csb]=Wëbiérk kòmpònentów
+Name[cy]=Dewisydd Cydrannau
+Name[da]=Komponentvælger
+Name[de]=Komponentenauswahl
+Name[el]=Επιλογέας συστατικών
+Name[eo]=Komponenta Elektilo
+Name[es]=Selector de componentes
+Name[et]=Komponentide valija
+Name[eu]=Osagai aukeratzailea
+Name[fa]=انتخابگر مؤلفه
+Name[fi]=Komponenttivalitsin
+Name[fr]=Sélecteur de composants
+Name[fy]=Komponintenkiezer
+Name[ga]=Roghnóir Comhpháirte
+Name[gl]=Selector de Compoñentes
+Name[he]=בוחר הרכיבים
+Name[hi]=अवयव चयनक
+Name[hr]=Odabir komponenti
+Name[hu]=Komponensválasztó
+Name[id]=Pemilih Komponen
+Name[is]=Einingaval
+Name[it]=Scelta componenti
+Name[ja]=コンポーネントの選択
+Name[ka]=კომპონენტების არჩევა
+Name[kk]=Компонеттерін таңдау
+Name[km]=កម្មវិធី​ជ្រើស​សមាសភាគ
+Name[lo]=ເຄືອ່ງມືເລືອກຄອມໂພເນນ
+Name[lt]=Komponentų parinkėjas
+Name[lv]=Komponenšu izvēlētājs
+Name[mk]=Избирач на компоненти
+Name[mn]=Бүрэлдхүүн сонгогч
+Name[ms]=Pemilih Komponen
+Name[mt]=Agħżel komponent
+Name[nb]=Komponentvelger
+Name[nds]=Komponenten utsöken
+Name[ne]=अवयव चयनकर्ता
+Name[nl]=Componentenkiezer
+Name[nn]=Komponentveljar
+Name[nso]=Mokgethi wa Seripa
+Name[pa]=ਭਾਗ ਚੋਣਕਾਰ
+Name[pl]=Wybór komponentów
+Name[pt]=Selector de Componentes
+Name[pt_BR]=Seletor de Componentes
+Name[ro]=Selector de componente
+Name[ru]=Компоненты по умолчанию
+Name[rw]=Mutoranya w'Inyangingo
+Name[se]=Oasseválljejeaddji
+Name[sk]=Výber komponentov
+Name[sl]=Izbiralec komponent
+Name[sr]=Изборник компоненти
+Name[sr@Latn]=Izbornik komponenti
+Name[ss]=Sikhetsi sencenye
+Name[sv]=Komponentväljare
+Name[ta]=கூறுதேர்வாளர்
+Name[tg]=Интихоби қисматҳо
+Name[th]=เครื่องมือเลือกคอมโพเน็นต์
+Name[tr]=Bileşen Seçici
+Name[tt]=Komponent Saylağıç
+Name[uk]=Селектор компонентів
+Name[uz]=Komponentlarni tanlagich
+Name[uz@cyrillic]=Компонентларни танлагич
+Name[ven]=Tshinangi tsha tshipida
+Name[vi]=Bộ chọn Thành phần
+Name[wa]=Tchoezixheu d' componints
+Name[xh]=Inxenye Yomkhethi
+Name[zh_CN]=组件选择程序
+Name[zh_TW]=元件選擇程式
+Name[zu]=Umkhethi welunga
+Comment=Choose the default components for various services
+Comment[af]=Kies die verstek komponente vir verskeie dienste
+Comment[ar]=لاختيار المكونات الافتراضية للخدمات المختلفة
+Comment[az]=Müxtəlif xidmətlər üçün ön qurğulu tərkib hissəsini seçin
+Comment[be]=Выбірае стандартныя кампаненты для розных сервісаў
+Comment[bg]=Избор на предпочитани компоненти за е-поща, редактиране на текст и др.
+Comment[bn]=বিভিন্ন সার্ভিসের জন্য ডিফল্ট কম্পোনেন্ট নির্বাচন করুন
+Comment[bs]=Izaberite podrazumjevane komponente za razne usluge
+Comment[ca]=Escull els components predeterminats per a diversos serveis
+Comment[cs]=Vyberte výchozí komponenty pro různé služby
+Comment[csb]=Wébiérk domëslnych kòmpònentów dlô wszelejaczich ùsłëżnotów
+Comment[cy]=Dewiswch y cydrannau rhagosodedig i wasanaethau amrywiol
+Comment[da]=Vælg standardkomponenterne for forskellige tjenester
+Comment[de]=Die Standardkomponenten für diverse Dienste
+Comment[el]=Επιλέξτε τα προκαθορισμένα συστατικά για διάφορες υπηρεσίες
+Comment[eo]=Elektu la defaŭltajn komponentojn por diversaj servoj
+Comment[es]=Elegir los componentes predeterminados para varios servicios
+Comment[et]=Mitmete teenuste vaikekomponentide valimine
+Comment[eu]=Hautatu zerbitzu batzuetarako osagai lehenetsiak
+Comment[fa]=انتخاب مؤلفه‌های پیش‌فرض برای خدمات گوناگون
+Comment[fi]=Calitse oletuskomponentit eri palveluille
+Comment[fr]=Choix des composants par défaut pour différents services
+Comment[fy]=Kies de standertkomponinten foar de ferskate tsjinsten
+Comment[gl]=Escolla as compoñentes por defeito para varios servizos
+Comment[he]=בחירת הרכיבים המשמשים כברירת מחדל עבור שירותים שונים
+Comment[hi]=भिन्न सेवाओं के लिए डिफ़ॉल्ट अवयव चुनें
+Comment[hr]=Odaberite zadane komponente za različite usluge
+Comment[hu]=Az alapértelmezett komponensek kiválasztása a különféle szolgáltatásokhoz
+Comment[is]=Velja sjálfgefnar einingar fyrir ýmsar þjónustur
+Comment[it]=Scelta dei componenti predefiniti per vari servizi
+Comment[ja]=各種サービスのための標準コンポーネントを選択
+Comment[ka]=თავდაპირველი კომპონენტების არჩევა სხვა და სხვა მომსახურეობებისთვის
+Comment[kk]=Түрлі қызметтердің әдетті компоненттерін таңдау
+Comment[km]=ជ្រើស​សមាសភាគ​លំនាំដើម សម្រាប់​សេវា​ផ្សេងៗ
+Comment[ko]=다양한 서비스에 사용할 기본 구성 요소 설정
+Comment[lo]=ເລືອກຄອມໂພເນັນສຳຫລັບບໍລິການທົ່ວໄປ
+Comment[lt]=Pasirinkite numatytus komponentus įvairioms tarnyboms
+Comment[lv]=Izvēlieties noklusējuma komponentes dažādiem servisiem
+Comment[mk]=Изберете ги стандардните компоненти за разните сервиси
+Comment[mn]=Өөр үйлчилгээнүүдийн хувьд стандарт-бүрэлдхүүнүүд сонгох
+Comment[ms]=Pilih komponen piawai untuk pelbagai servis
+Comment[mt]=Agħżel il-komponenti impliċiti għal diversi servizzi
+Comment[nb]=Velg standardkomponenter for ulike tjenester
+Comment[nds]=Wähl de Standardprogrammen för Deensten ut
+Comment[ne]=विविध सेवाका लागि पूर्वनिर्धारित अवयवहरू रोज्नुहोस्
+Comment[nl]=Kies de standaardcomponenten voor diverse services
+Comment[nn]=Vel standardkomponentar for ymse tenester
+Comment[nso]=Kgethela ditirelo tseo di fapanego dikarolwana tsa thuso ya tshoganetso
+Comment[pa]=ਵੱਖ ਵੱਖ ਸੇਵਾਵਾਂ ਲਈ ਮੂਲ ਇੰਦਰਾਜ਼ ਚੁਣੋ
+Comment[pl]=Wybór domyślnych komponentów dla różnych usług
+Comment[pt]=Escolha os componentes predefinidos para os vários serviços
+Comment[pt_BR]=Escolha os componentes padrão para vários serviços
+Comment[ro]=Alegeți componentele implicite pentru diferite servicii
+Comment[ru]=Выбор основных компонентов разнообразных служб
+Comment[rw]=Guhitamo inyangingo mburabuzi ku maserivise atandukanye
+Comment[se]=Vállje bálválusaid standárdosiid
+Comment[sk]=Výber štandardných komponentov pre rôzne služby
+Comment[sl]=Izberite privzete komponente za različne storitve
+Comment[sr]=Избор подразумеваних компоненти за разне сервисе
+Comment[sr@Latn]=Izbor podrazumevanih komponenti za razne servise
+Comment[sv]=Väljer normalkomponenter för olika sorters tjänster
+Comment[ta]=பலவிதமான சேவைகளுக்கும் முன்னிருந்த பகுதிகளை தேர்வு செய்யவும்
+Comment[tg]=Интихоби қисматҳои асосӣ барои хизматҳои гуногун
+Comment[th]=เลือกคอมโพเน็นต์ปริยายสำหรับบริการต่างๆ
+Comment[tr]=Çeşitli servisler için öntanımlı bileşenleri seçin
+Comment[tt]=Törle xezmätlär öçen töp öleşlärne saylaw
+Comment[uk]=Вибір типових компонентів для різноманітних служб
+Comment[uz]=Turli xizmatlar uchun andoza komponentlarni tanlash
+Comment[uz@cyrillic]=Турли хизматлар учун андоза компонентларни танлаш
+Comment[ven]=Nangani zwipida zwa default uitela tshumelo dzo vhambanaho
+Comment[vi]=Chọn các thành phần mặc định cho các dịch vụ khác nhau
+Comment[wa]=Tchoezixhoz les prémetous componints po sacwants siervices
+Comment[xh]=Khetha ingxenye zokungagqibekanga kweenkonzo eziliqela
+Comment[zh_CN]=选择各种服务的默认组件
+Comment[zh_TW]=選擇各種服務的預設元件
+Comment[zu]=Khetha amalunga endalo emisebenzi eyahlukene
+
+Keywords=components,component chooser,resources, email client, terminal emulator
+Keywords[af]=components,component chooser,resources, e-pos kliënt, terminaal emulasie
+Keywords[be]=кампаненты,выбар кампанентаў,рэсурсы,кліент электроннай пошты,эмулятар тэрміналу,components,component chooser,resources, email client, terminal emulator
+Keywords[bg]=е-поща, ел, поща, редактор, стандартен, компонент, модул, components, component chooser, resources, email client, terminal emulator
+Keywords[bs]=komponente,izbornik komponenti,resursi, email klijent, simulator terminala
+Keywords[ca]=components,selector de components,recursos, client de correu, emulador de terminal
+Keywords[cs]=komponenty,výběr komponent,zdroje, emailový klient, emulace terminálu
+Keywords[csb]=kòmpònentë,dzél,wëbiérk kòmpònentu,dostónki,pòcztowô programa,emùlator terminala
+Keywords[cy]=cydrannau,dewisydd cydrannau,adnoddau,dibynnydd ebost,efelychwr terfynell
+Keywords[da]=komponenter,komponentvælger,ressources, e-mail-klient, terminalemulator
+Keywords[de]=Komponenten,Ressources,E-Mail-Programm,Terminal-Emulation
+Keywords[el]=συστατικά,επιλογέας συστατικών,πόροι, πελάτης email, προσομοιωτής τερματικού
+Keywords[eo]=komponentoj,komponenta elektilo,risurco,uzanta retpoŝtilo,terminala imitilo
+Keywords[es]=componentes,selector de componentes,recursos,cliente de correo,emulador de terminal
+Keywords[et]=komponendid,komponentide valija,ressursid,e-posti klient,terminaliemulaator
+Keywords[eu]=osagai, osagai hautatzailea, baliabideak, posta elektroniko bezeroa, terminal emuladorea
+Keywords[fa]=مؤلفه‌ها، انتخابگر مؤلفه، منابع، کارخواه رایانامه، مقلد رایانه
+Keywords[fi]=komponentit, komponenttivalitsin,resurssit,sähköpostiohjelma,pääte-emulaatio
+Keywords[fr]=composant,sélecteur de composants,ressources,client de courrier,email,émulateur de terminal
+Keywords[fy]=komponintenkiezer,helpboarne,e-postprogramma,terminal emulator
+Keywords[ga]=comhpháirteanna,roghnóir comhpháirte,acmhainní, cliant ríomhphoist, aithriseoir teirminéil
+Keywords[gl]=compoñentes,selector de compoñentes,servizos, cliente de correo, emulador de terminal
+Keywords[he]=, רכיבים,בוחר הרכיבים,משאבים,תוכנית דוא"ל ,הדמיית,מסוף,components,component chooser, resources, email client, terminal emulator
+Keywords[hi]=अवयव,अवयव चयनक,संसाधन,ईमेल क्लाएंट,टर्मिनल एमुलेटर
+Keywords[hr]=components,component chooser,resources, email client, terminal emulator,komponente,odabir komponenti,resursi,klijent e-pošte,emulator terminala
+Keywords[hu]=komponensek,komponensválasztó,erőforrások,levelezőprogram,terminálemuláció
+Keywords[is]=eining,einingar,einingaval,auðlindir,póstforrit,skjáhermir
+Keywords[it]=componenti,scelta componenti,risorse,email,client di posta,posta elettronica,terminale,emulatore di terminale
+Keywords[ja]=コンポーネント,選択,リソース,Eメール,クライアント,ターミナルエミュレータ
+Keywords[ka]=კომპონენტი,კომპონენტის ამმჩევი,რესურსი,ელფოსტის ჩეთი, ტერმინალის ემულატორი
+Keywords[km]=សមាសភាគ,កម្មវិធី​ជ្រើស​សមាសភាគ,ធនធាន,កម្មវិធី​អ៊ីមែល,វត្ថុ​ត្រាប់​តាម​ស្ថានីយ
+Keywords[lo]=ຄອມໂພເນັດ,ເລືອກຄອມໂພເນັນ,ຊັບພະຍາກອນ
+Keywords[lt]=components,component chooser,resources, email client, terminal emulator, komponentai, komponentų parinkėjas, resursai, e. pašto klientas, terminalo emuliatorius
+Keywords[lv]=komponentes,komponenšu izvēlētājs,resursi,epasta klients,termināļa emulātors
+Keywords[mk]=components,component chooser,resources,email client,terminal emulator,компоненти,избирач на компоненти,ресурси, е-поштенски клиент,терминалски емулатор
+Keywords[mn]=Бүрэлдхүүнүүд,Нөөц,Э-Захиа-програм,Терминал-Эмулатор
+Keywords[ms]=komponen, pemilih komponen, sumber, klien e-mel, pelagak terminal
+Keywords[mt]=components,component chooser,resources, email client, terminal emulator, komponenti,riżorsi,imejl,klijent imejl,emulatur
+Keywords[nb]=komponenter,komponentvelger,ressurser,e-postprogram,terminalemulator
+Keywords[nds]=Komponenten,Komponenten wählen,Ressourcen,EMail Client,Nettpost-Programm,Terminalemulator
+Keywords[ne]=टिप्पणी, अवयव छनौटकर्ता, संसाधनहरू, इमेल क्लाइन्ट, टर्मिनल इमुलेटेर
+Keywords[nl]=componentenkiezer,gegevensbronnen,e-mailprogramma,terminal
+Keywords[nn]=komponentar,komponentveljar,ressursar,e-postprogram,terminalemulator
+Keywords[nso]=diripana,mokgethi wa seripana,didiriswa, moreki wa e-poso, moekisi wa terminal
+Keywords[pa]=components,component chooser,resources, email client, terminal emulator,ਭਾਗ,ਸਰੋਤ
+Keywords[pl]=komponenty,składniki,wybór komponentu,zasoby,program pocztowy,emulator terminala
+Keywords[pt]=componentes,selector de componentes,recursos,cliente de e-mail,emulador de terminal
+Keywords[pt_BR]=componentes,seletor de componentes,recursos,cliente de e-mail, emulador de terminal
+Keywords[ro]=componente,selector componentă,resurse,client de email,emulator de terminal
+Keywords[rw]=inyangingo,muhitamo w'inyangingo,ibikorana, umukiriya imeli, mukuruzi igihera
+Keywords[se]=oasit,oasseválljejeaddji,resurssat,e-boasta prográmma,terminálemuláhtor
+Keywords[sk]=komponenty,výber komponent,zdroje,e-mailový klient,terminál
+Keywords[sl]=sestavni deli,komponente,izbiralec,izbirnik,terminalni emulator,odejmalec e-pošt
+Keywords[sr]=компоненте,изборник компоненти,ресурси,клијент eлектронске поште,емулатор терминала,е-пошта
+Keywords[sr@Latn]=komponente,izbornik komponenti,resursi,klijent elektronske pošte,emulator terminala,e-pošta
+Keywords[sv]=komponenter,komponentväljare,resurser,e-postklient,terminalemulator
+Keywords[ta]=பகுதிகள்,பகுதி தேர்ந்தெடுப்பான்,மூலங்கள், மின்னஞ்சல் உறுப்பினர், கடைசி போட்டியாளர்
+Keywords[th]=คอมโพนเน็นต์,เลือกคอมโพเน็นต์,ทรัพยากรโปรแกรมรับส่งอีเมล,ตัวจำลองเทอร์มินัล
+Keywords[tr]=bileşenler,bileşen seçici,kaynaklar,e-posta istemcisi,terminal emülasyonu
+Keywords[uk]=компоненти,селектор компонентів,ресурси,клієнт ел. пошти,емулятор термінала
+Keywords[uz]=komponentlar,komponent tanlagich,imkoniyatlar,xat-xabar klienti,terminal emulyatori
+Keywords[uz@cyrillic]=компонентлар,компонент танлагич,имкониятлар,хат-хабар клиенти,терминал эмулятори
+Keywords[ven]=Zwipida,tshipida,zwishumiswa,mushumisani wa email, tshitevhedzeli tsha theminala
+Keywords[vi]=thành phần,bộ chọn thành phần,tài nguyên,trình thư,mô phỏng thiết bị cuối
+Keywords[wa]=componints,thcoezixheu d' componint,rissources,cliyint emile,terminå
+Keywords[xh]=iingxenye,umkhethi wengxenye,amacebo, umxhasi weposi, umlinganiseli wesiphelo sendlela
+Keywords[zh_CN]=components,component chooser,resources, email client, terminal emulator,组件,组件选择程序,资源,电子邮件程序,终端仿真器
+Keywords[zh_TW]=components,component chooser,resources, email client, terminal emulator,元件,元件選擇程式,資源,電子郵件客戶端程式,終端機模擬程式
+Keywords[zu]=amalunga,umkhethi welunga,amathuluzi okusebenza,umxhasi weposi lekhomputha,umlingisi wethuluzi langaphandle
+
+Categories=Qt;KDE;X-KDE-settings-components;
diff --git a/kcontrol/componentchooser/componentchooser.h b/kcontrol/componentchooser/componentchooser.h
new file mode 100644
index 000000000..fdb863344
--- /dev/null
+++ b/kcontrol/componentchooser/componentchooser.h
@@ -0,0 +1,154 @@
+/***************************************************************************
+ componentchooser.h - description
+ -------------------
+ copyright : (C) 2002 by Joseph Wenninger
+ email : jowenn@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License version 2 as *
+ * published by the Free Software Foundationi *
+ * *
+ ***************************************************************************/
+
+#ifndef _COMPONENTCHOOSER_H_
+#define _COMPONENTCHOOSER_H_
+
+#include "componentchooser_ui.h"
+#include "componentconfig_ui.h"
+#include "emailclientconfig_ui.h"
+#include "terminalemulatorconfig_ui.h"
+#include "browserconfig_ui.h"
+#include <qdict.h>
+#include <qstring.h>
+
+#include <kservice.h>
+
+class QListBoxItem;
+class KEMailSettings;
+class KConfig;
+
+/* The CfgPlugin class is an exception. It is LGPL. It will be parted of the plugin interface
+ which I plan for KDE 3.2.
+*/
+class CfgPlugin
+{
+public:
+ CfgPlugin(){};
+ virtual ~CfgPlugin(){};
+ virtual void load(KConfig *cfg)=0;
+ virtual void save(KConfig *cfg)=0;
+ virtual void defaults()=0;
+};
+
+
+class CfgComponent: public ComponentConfig_UI,public CfgPlugin
+{
+Q_OBJECT
+public:
+ CfgComponent(QWidget *parent);
+ virtual ~CfgComponent();
+ virtual void load(KConfig *cfg);
+ virtual void save(KConfig *cfg);
+ virtual void defaults();
+
+protected:
+ QDict<QString> m_lookupDict,m_revLookupDict;
+
+protected slots:
+ void slotComponentChanged(const QString&);
+signals:
+ void changed(bool);
+};
+
+
+class CfgEmailClient: public EmailClientConfig_UI,public CfgPlugin
+{
+Q_OBJECT
+public:
+ CfgEmailClient(QWidget *parent);
+ virtual ~CfgEmailClient();
+ virtual void load(KConfig *cfg);
+ virtual void save(KConfig *cfg);
+ virtual void defaults();
+
+private:
+ KEMailSettings *pSettings;
+
+protected slots:
+ void selectEmailClient();
+ void configChanged();
+signals:
+ void changed(bool);
+};
+
+class CfgTerminalEmulator: public TerminalEmulatorConfig_UI,public CfgPlugin
+{
+Q_OBJECT
+public:
+ CfgTerminalEmulator(QWidget *parent);
+ virtual ~CfgTerminalEmulator();
+ virtual void load(KConfig *cfg);
+ virtual void save(KConfig *cfg);
+ virtual void defaults();
+
+protected slots:
+ void selectTerminalApp();
+ void configChanged();
+
+signals:
+ void changed(bool);
+};
+
+class CfgBrowser: public BrowserConfig_UI,public CfgPlugin
+{
+Q_OBJECT
+public:
+ CfgBrowser(QWidget *parent);
+ virtual ~CfgBrowser();
+ virtual void load(KConfig *cfg);
+ virtual void save(KConfig *cfg);
+ virtual void defaults();
+
+protected slots:
+ void selectBrowser();
+ void configChanged();
+
+signals:
+ void changed(bool);
+private:
+ QString m_browserExec;
+ KService::Ptr m_browserService;
+};
+
+
+class ComponentChooser : public ComponentChooser_UI
+{
+
+Q_OBJECT
+
+public:
+ ComponentChooser(QWidget *parent=0, const char *name=0);
+ virtual ~ComponentChooser();
+ void load();
+ void save();
+ void restoreDefault();
+
+private:
+ QString latestEditedService;
+ bool somethingChanged;
+ QWidget *configWidget;
+ QVBoxLayout *myLayout;
+protected slots:
+ void emitChanged(bool);
+ void slotServiceSelected(QListBoxItem *);
+
+signals:
+ void changed(bool);
+
+};
+
+
+#endif
diff --git a/kcontrol/componentchooser/componentchooser_ui.ui b/kcontrol/componentchooser/componentchooser_ui.ui
new file mode 100644
index 000000000..ed1ed7f7b
--- /dev/null
+++ b/kcontrol/componentchooser/componentchooser_ui.ui
@@ -0,0 +1,133 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ComponentChooser_UI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ComponentChooser_UI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>482</width>
+ <height>451</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox" row="1" column="1">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Default Component</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can change the component program. Components are programs that handle basic tasks, like the terminal emulator, the text editor and the email client. Different KDE applications sometimes need to invoke a console emulator, send a mail or display some text. To do so consistently, these applications always call the same components. You can choose here which programs these components are.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <widget class="QWidgetStack">
+ <property name="name">
+ <cstring>configContainer</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="0" column="1">
+ <property name="name">
+ <cstring>GroupBox2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Component Description</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can read a small description of the currently selected component. To change the selected component, click on the list to the left. To change the component program, please choose it below.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ComponentDescription</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignTop</set>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="KListBox" row="0" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>ServiceChooser</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="currentItem">
+ <number>-1</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+&lt;p&gt;This list shows the configurable component types. Click the component you want to configure.&lt;/p&gt;
+&lt;p&gt;In this dialog you can change KDE default components. Components are programs that handle basic tasks, like the terminal emulator, the text editor and the email client. Different KDE applications sometimes need to invoke a console emulator, send a mail or display some text. To do so consistently, these applications always call the same components. Here you can select which programs these components are.&lt;/p&gt;
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<includes>
+ <include location="global" impldecl="in declaration">klistbox.h</include>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>klistbox.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/componentchooser/componentconfig_ui.ui b/kcontrol/componentchooser/componentconfig_ui.ui
new file mode 100644
index 000000000..d6a7bba87
--- /dev/null
+++ b/kcontrol/componentchooser/componentconfig_ui.ui
@@ -0,0 +1,63 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>ComponentConfig_UI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ComponentConfig_UI</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ChooserDocu</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <property name="name">
+ <cstring>ComponentSelector</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>91</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<includes>
+ <include location="global" impldecl="in declaration">kcombobox.h</include>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/componentchooser/componentservices/Makefile.am b/kcontrol/componentchooser/componentservices/Makefile.am
new file mode 100644
index 000000000..eea682ff8
--- /dev/null
+++ b/kcontrol/componentchooser/componentservices/Makefile.am
@@ -0,0 +1,3 @@
+kcm_ktexteditor_DATA = kcm_kemail.desktop kcm_terminal.desktop kcm_browser.desktop
+kcm_ktexteditordir = $(kde_datadir)/kcm_componentchooser
+
diff --git a/kcontrol/componentchooser/componentservices/kcm_browser.desktop b/kcontrol/componentchooser/componentservices/kcm_browser.desktop
new file mode 100644
index 000000000..481ba419c
--- /dev/null
+++ b/kcontrol/componentchooser/componentservices/kcm_browser.desktop
@@ -0,0 +1,149 @@
+Name=Web Browser
+Name[af]=Web Blaaier
+Name[ar]=متصفح الشبكة
+Name[az]=Veb Səyyahı
+Name[be]=Вандроўнік па Сеціве
+Name[bg]=Уеб браузър
+Name[bn]=ওয়েব ব্রাউজার
+Name[br]=Furcher an Internet
+Name[bs]=Web preglednik
+Name[ca]=Navegació Web
+Name[cs]=Prohlížeč Webu
+Name[csb]=Przezérnik WWW
+Name[cy]=Porydd Gwê
+Name[da]=Browser
+Name[de]=Webbrowser
+Name[el]=Περιηγητής ιστού
+Name[eo]=TTT-legilo
+Name[es]=Navegador Web
+Name[et]=Veebilehitseja
+Name[eu]=Web arakatzailea
+Name[fa]=مرورگر وب‌‌
+Name[fi]=WWW-selain
+Name[fo]=Vevlesari
+Name[fr]=Navigateur web
+Name[fy]=Webblêder
+Name[ga]=Brabhsálaí Lín
+Name[gl]=Navegador Web
+Name[he]=דפדפן
+Name[hi]=वेब ब्राउज़र
+Name[hr]=Web preglednik
+Name[hsb]=Web-browser
+Name[hu]=Webböngésző
+Name[id]=Peselancar Web
+Name[is]=Vafri
+Name[it]=Navigazione Web
+Name[ja]=ウェブブラウザ
+Name[ka]=ვებ ბრაუზერი
+Name[kk]=Веб шолғыш
+Name[km]=កម្មវិធី​រុករក​បណ្ដាញ
+Name[ko]=웹 브라우저
+Name[lo]=ຮງກເບິ່ງຖານເບິ່ງຂໍ້ມູນ
+Name[lt]=Žiniatinklio naršyklė
+Name[lv]=Tīmekļa Pārlūks
+Name[mk]=Веб-прелистувач
+Name[mn]=Вэб-Хөтөч
+Name[ms]=Pelayar Web
+Name[nb]=Nettleser
+Name[nds]=Nettkieker
+Name[ne]=वेब ब्राउजर
+Name[nl]=Webbrowser
+Name[nn]=Nettlesar
+Name[nso]=Seinyakisi sa Web
+Name[pa]=ਵੈਬ ਝਲਕਾਰਾ
+Name[pl]=Przeglądarka WWW
+Name[pt]=Navegação Web
+Name[pt_BR]=Navegador Web
+Name[ro]=Navigator de web
+Name[ru]=Браузер
+Name[rw]=Mucukumbuzi Rubuga
+Name[se]=Fierpmádatlogan
+Name[sk]=Webový prehliadač
+Name[sl]=Spletni brskalnik
+Name[sr]=Веб прегледач
+Name[sr@Latn]=Veb pregledač
+Name[ss]=Ibrawuza ye-Web
+Name[sv]=Webbläsning
+Name[ta]=வலை உலாவி
+Name[te]=వెబ్ బ్రౌజర్
+Name[tg]=Намоишгари Веб
+Name[th]=เว็บเบราว์เซอร์
+Name[tr]=Web Tarayıcı
+Name[uk]=Навігатор Тенет
+Name[uz]=Veb-brauzer
+Name[uz@cyrillic]=Веб-браузер
+Name[ven]=Burausa ya Web
+Name[vi]=Trình duyệt Mạng
+Name[wa]=Betchteu waibe
+Name[xh]=Umkhangeli zincwadi we Web
+Name[zh_CN]=Web 浏览器
+Name[zh_TW]=網頁瀏覽器
+Name[zu]=Umcingi we-Web
+Comment=Here you can configure your default web browser. All KDE applications in which you can select hyperlinks should honor this setting.
+Comment[af]=Hier kan jy die standaard web blaaier opstel. Al die KDE programme waarin jy hiperskakels kan kies behoort hierdie instelling te gebruik.
+Comment[be]=Тут вы можаце вызначыць для сябе стандартны вандроўнік па Сеціве. Усе праграмы KDE, у якіх вы можаце выбраць гіперспасылку, павінны выкарыстоўваць гэтае настаўленне.
+Comment[bg]=Избор на предпочитан браузър. Всички програми на KDE ще ползват този компонент.
+Comment[bn]=এখানে আপনি আপনার ডিফল্ট ওয়েব ব্রাউজার কনফিগার করতে পারেন। যে কোনো কে.ডি.ই. অ্যাপলিকেশনে একটি হাইপার-লিঙ্ক নির্বাচন করা হলে এই পছন্দটি ব্যবহার করা হবে।
+Comment[bs]=Ovdje možete podesiti vaš podrazumijevani web preglednik. Svi KDE programi u kojima možete kliknuti na link bi trebali poštovati ovu postavku.
+Comment[ca]=Aquí podeu configurar el vostre fullejador web per omissió. Totes les aplicacions KDE on podeu seleccionar hiperenllaços haurien de respectar aquest arranjament.
+Comment[cs]=Tato služba umožňuje nastavit si výchozí prohlížeč. Všechny KDE aplikace, které vyžadují přístup k hypertextovým odkazům, by měly používat toto nastavení.
+Comment[csb]=Tuwò je mòżno wëbrac domëslny przezérnik. Wszëtczé programë KDE, w jaczich brëkùje sã z lënkòw, mùszôłëbë ùżëwac tegò ùstôwù.
+Comment[cy]=Dyma lle gallwch ffurfweddu eich porydd gwe rhagosodol. Dylai pob rhaglen KDE lle gallwch ddewis hypergysylltau ddefnyddio'r gosodiad yma.
+Comment[da]=Her kan du indstille din standard-browser. Alle KDE-programmer hvor du kan vælge hyperlink skulle respektere denne indstilling.
+Comment[de]=Hier können Sie Ihren Standard-Browser festlegen. Alle KDE-Programme, in denen Sie Verknüpfungen (Links) aufrufen können, benutzen diese Einstellung.
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε τον προκαθορισμένο περιηγητή ιστού σας. Όλες οι εφαρμογές του KDE στις οποίες μπορείτε να επιλέξετε υπερσυνδέσεις θα πρέπει να χρησιμοποιούν αυτή τη ρύθμιση.
+Comment[en_GB]=Here you can configure your default web browser. All KDE applications in which you can select hyperlinks should honour this setting.
+Comment[eo]=Tiu servo ebligas, ke vi elektas vian norman retumilon. Ĉiuj KDEaj aplikaĵoj, kiuj bezonas retumilon, uzos tiun agordon.
+Comment[es]=Este servicio le permite configurar su navegador de Internet predeterminado. Todas las aplicaciones KDE que precisan acceso a hiperenlaces deberían reconocer esta opción.
+Comment[et]=Siin saab seadistada vaikimisi kasutatavat veebilehitsejat. Kõik KDE rakendused, kus saab valida hüperlinke, peaksid siinsete seadistustega arvestama.
+Comment[eu]=Hemen zure web arakatzaile lehenetsia konfigura dezakezu. Aukera honek estekak darabiltzaten KDEren aplikazio guztiei eragin behar die.
+Comment[fa]=در اینجا می‌توانید مرورگر وب پیش‌فرض خود را پیکربندی کنید. همۀ کاربردهای KDE که می‌توانید ابرپیوندها را در آن گزینش کنید، باید این تنظیمات را قبول کنند.
+Comment[fi]=Tämän palvelun avulla voit määritellä oletusselaimen. Kaikki selainta käyttävät KDE-sovellukset huomioivat tämän asetuksen.
+Comment[fr]=Ce service vous permet de configurer votre navigateur internet par défaut. Toutes les applications KDE permettant de cliquer sur un lien hypertexte doivent accepter ce réglage.
+Comment[fy]=Hjir kinne jo de standert web blêder ynstelle. Alle KDE-tapassingen weryn jo in hyperskeakel oanklikke kinne brûk meitsje fan dizze ynstelling
+Comment[gl]=Aqui pode configurar o seu navegador predeterminado. Todas as aplicacións de KDE nas que poda premer en ligazóns farán uso deste.
+Comment[he]=שירות זה מאפשר לך להגדיר את תוכנית הדוא"ל שתשמש כברירת מחדל. כל יישומי KDE שיזדקקו לגישה אל תוכנית דוא"ל יתחשבו בהגדרה זו.
+Comment[hi]=यहाँ पर आप अपने डिफ़ॉल्ट वेब ब्राउज़र को कॉन्फ़िगर कर सकते हैं. सभी केडीई अनुप्रयोगों में जिसमें हायपरलिंक चुन सकते हैं, वे इस विन्यास का इस्तेमाल करेंगे.
+Comment[hr]=Konfiguriranje zadanog web-preglednika. Sve KDE aplikacije unutar kojih odaberete (kliknete) hiperveze poštivat će ovaj odabir.
+Comment[hu]=Itt lehet beállítani, mi legyen az alapértelmezett webböngésző. Az összes KDE-alkalmazásnak figyelembe kell vennie ezt az értéket levelezési funkció használata esetén.
+Comment[is]=Þessi þjónusta leyfir þér að skilgreina sjálfgefinn vafra. Öll KDE forrit sem gera þér kleift að smella á tengla ættu að virða þessa stillingu.
+Comment[it]=Definisci il tuo browser web predefinito. Tutte le applicazioni di KDE in cui è selezionabile un collegamento dovrebbero rispettare questa impostazione.
+Comment[ja]=ここで標準のウェブブラウザを設定します。ハイパーリンクの選択が可能なすべての KDE アプリケーションは、この設定に従います。
+Comment[ka]=აქ შეიძლება სტანდარტული ვებ ბრაუზერის დაკონფიგურირება. KDE-ს ყველა პროგრამა, ვისაც შეუძლია ბმულების გამოძახება, გაითვალისწინებენ ამ პარამეტრს
+Comment[kk]=Мұнда Сіз әдетті веб-браузеріңізді таңдай аласыз. Бүкіл KDE қолданбаларда гиперсілтемелерді түрткенде осы таңдау қолданылады.
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនាសម្ព័ន្ធ​កម្មវិធី​រុករក​បណ្ដាញ​លំនាំដើម​របស់​អ្នក ។ កម្មវិធី KDE ទាំងអស់​ដែល​អ្នក​អាច​ជ្រើស​តំណ​ខ្ពស់​ក្នុង គួរ​តែ​គោរព​ការ​កំណត់​នេះ ។
+Comment[ko]=여기에서 기본 웹 브라우저를 설정할 수 있습니다. 모든 KDE 프로그램에서 하이퍼링크를 처리하려면 이 설정을 따라야 합니다.
+Comment[lt]=Ši tarnyba leidžia jums nustatyti Jūsų numatytą žiniatinklio naršyklę. Visos KDE programos, kuriose galima spragtelėti hipersaitus, turi atsižvelgti į šį nustatymą.
+Comment[lv]=Šeit Jūs varat konfigurēt noklusējuma tīmekļa pārlūkprogrammu. Visas KDE aplikācijas, kurās Jūs varat klikšķināt uz hipersaitēm, izmantos šo parametru.
+Comment[mk]=Тука може да го конфигурирате вашиот стандарден веб-прелистувач. Сите KDE-апликации во кои може да изберете хиперврски ќе го почитуваат ова поставување.
+Comment[ms]=Di sini anda boleh konfigur pelayar web piawai anda.Semua aplikasi KDE yang di dalamnya anda boleh pilih hiperpautan hendaklah menerima seting ini.
+Comment[mt]=Hawn tista' tikkonfigura l-browser impliċitu. Il-programmi kollha tal-KDE fejn tista' tagħżel hyperlink għandhom jużaw dan il-programm.
+Comment[nb]=Her kan du sette opp nettleseren du bruker mest. Alle KDE-programmer der du kan velge hyperlenker skal bruke denne nettleseren.
+Comment[nds]=Hier kannst Du Dien Standard-Nettkieker angeven. All KDE- Programmen, binnen de Du Hyperlinks bruken kannst, schullen dat ümsetten.
+Comment[ne]=यहाँ तपाईँले पूर्वनिर्धारित वेब ब्राउजर कन्फिगर गर्न सक्नुहुन्छ । तपाईँले हाइपरलिङ्कहरू चयन गर्न सक्ने सबै KDE अनुप्रयोगहरूमा यो सेटिङ मान्नु पर्छ ।
+Comment[nl]=Hier kunt u uw standaard webbrowser instellen. Alle KDE-toepassingen waarin u een hyperkoppeling kunt aanklikken maken gebruik van deze instelling.
+Comment[nn]=Med denne tenesta kan du setja opp standardnettlesaren. Alle KDE-program der du kan følgja hyperlenkjer skal bruka denne innstillinga.
+Comment[pa]=ਇਥੇ ਤੁਸੀਂ ਆਪਣੇ ਮੂਲ ਵੈੱਬ ਝਲਕਾਰੇ ਦੀ ਸੰਰਚਨਾ ਕਰ ਸਕਦੇ ਹੋ।ਸਭ KDE ਕਾਰਜ, ਜਿਨਾਂ ਵਿੱਚ ਵੀ ਨੈੱਟ ਸੰਬੰਧ ਹਨ, ਇਸ ਸੈਟਿੰਗ ਦਾ ਸਨਮਾਨ ਕਰਨਗੇ।
+Comment[pl]=Tu można wybrać domyślną przeglądarkę. Wszystkie programy KDE, w których korzysta się z odnośników, powinny używać tego ustawienia.
+Comment[pt]=Este serviço permite-lhe configurar o seu navegador Web predefinido. Todas as aplicações do KDE onde possa seleccionar hiperligações deverão respeitar esta configuração.
+Comment[pt_BR]=Aqui você pode configurar o seu navegador Internet padrão. Todas os aplicativos do KDE que precisarem acessar um site através de um link devem seguir esta configuração.
+Comment[ro]=Aici puteți configura navigatorul de web implicit. Toate aplicațiile KDE în care puteți selecta o hiperlegătură ar trebui să onoreze această setare.
+Comment[ru]=Здесь можно настроить веб-браузер по умолчанию. Все приложения KDE, в которых можно вызвать гиперссылку, будут использовать этот параметр.
+Comment[rw]=Hano ushobora kuboneza mucukumbuzi y'urubuga mburabuzi. Amaporogaramu yose KDE muri yo ushobora guhitamo amahuzanyobora yakubahiriza iri genamiterere.
+Comment[se]=Dáinna bálvalusain sáhtát heivehit standárda fierpmádatlogana. Buot KDE-prográmmain mas sáhttá čuovvut hyperliŋkkaid geavaha dán heivehusa.
+Comment[sk]=Tu môžete nastaviť štandardný prehliadač. Všetky aplikácie KDE, v ktorým môžete aktivovať URL, by mali používať toto nastavenie.
+Comment[sl]=Tu lahko nastavite vaš privzeti spletni brskalnik. Vsi programi za KDE, ki ga uporabljajo, bi morali upoštevati te nastavitve.
+Comment[sr]=Овде можете да подесите ваш подразумевани веб прегледач. Сви KDE програми у којима можете да одаберете хипервезе требало би да поштују ово подешавање.
+Comment[sr@Latn]=Ovde možete da podesite vaš podrazumevani veb pregledač. Svi KDE programi u kojima možete da odaberete hiperveze trebalo bi da poštuju ovo podešavanje.
+Comment[sv]=Här kan du anpassa förvald webbläsare. Alla KDE-program där du kan välja hyperlänkar bör följa inställningen.
+Comment[ta]=இந்த சேவை உங்களுடைய முன்னிருந்த மின் அஞ்சல்உறுப்பினர வடிவமைத்துக்கொள்ள அனுமதிக்கிறது. மின்அஞ்சல் உறுப்பினர் பயன்பாடுதேவைப்படுகிற எல்லா கேடிஇபயன்பாடுகளும் இந்த அமைப்பைநிறுவவேண்டும்.
+Comment[tg]=Ин сервиси коргири пешфарзи почтаи электроникиатонро танзим мекунед. Тамоми нармафзорҳои KDE ки ниёз ба дастраси ба коргири почтаи электроникӣ доранд аз ин танзимоти табии хоҳанд кард.
+Comment[th]=คุณสามารถปรับแต่งเว็บบราวเซอร์ปริยายของคุณได้ที่นี่ แอพพลิเคชั่นของ KDE ทุกตัว ที่คุณสามารถเลือก hyperlink ได้จะทำตามค่าที่ตั้งนี้
+Comment[tr]=Burada öntanımlı web tarayıcınızı yapılandırabilrsiniz. Tüm KDE uygulamalarında bulunan bağlantılar bu seçenek kullanılarak açılacaktır.
+Comment[tt]=Monda töp gizgeçeñne köyläp bula. Hiperlink saylanğan çaqta bar KDE-yazılımnar da bu köyläwlärne qullanırğa tieş.
+Comment[uk]=Тут можна вказати ваш типовий навігатор Тенет. Всі програми KDE, які підтримують роботу з гіперпосиланнями повинні використовувати це налаштування.
+Comment[vi]=Dịch vụ này cho phép bạn cấu hình trình duyệt mạng mặc định. Tất cả các chương trình của KDE có chứa liên kết mạng sẽ cần một trình duyệt dựa vào thiết lập này.
+Comment[wa]=Vos ploz apontyî vaici vosse prémetou betchteu waibe. Tos les programes KDE ki vs poloz tchoezi des hårdeyes duvrént shure cisse tchuze.
+Comment[zh_CN]=您可以在这里配置您默认的 Web 浏览器。您在所有 KDE 应用程序中单击超级链接时都应该遵从此设置。
+Comment[zh_TW]=您可以在這裡設定您的預設網頁瀏覽器。所有你可以選擇超連結的 KDE 應用程式都應該遵從這個設定。
+configurationType=internal_browser
diff --git a/kcontrol/componentchooser/componentservices/kcm_kemail.desktop b/kcontrol/componentchooser/componentservices/kcm_kemail.desktop
new file mode 100644
index 000000000..0952e56a7
--- /dev/null
+++ b/kcontrol/componentchooser/componentservices/kcm_kemail.desktop
@@ -0,0 +1,158 @@
+Name=Email Client
+Name[af]=E-pos Kliënt
+Name[ar]=زبون البريد الإلكتروني
+Name[az]=Epoçt Alıcısı
+Name[be]=Кліент электроннай пошты
+Name[bg]=Пощенски клиент
+Name[bn]=ই-মেইল ক্লায়েন্ট
+Name[br]=Kliant Postel
+Name[bs]=Email klijent
+Name[ca]=Client de correu
+Name[cs]=Emailový klient
+Name[csb]=Pòcztowô programa
+Name[cy]=Dibynnydd Ebost
+Name[da]=E-mail-klient
+Name[de]=E-Mail-Programm
+Name[el]=Πελάτης email
+Name[eo]=Retpoŝtkliento
+Name[es]=Cliente de correo electrónico
+Name[et]=E-posti klient
+Name[eu]=Posta elektroniko bezeroa
+Name[fa]=کارخواه رایانامه
+Name[fi]=Sähköpostiohjelma
+Name[fo]=Postforrit
+Name[fr]=Client de courrier
+Name[fy]=E-postprogramma
+Name[ga]=Cliant Ríomhphoist
+Name[gl]=Cliente de Correo-e
+Name[he]=תוכנית דוא"ל
+Name[hi]=ईमेल डाकिया
+Name[hr]=Klijent e-pošte
+Name[hu]=Levelezőprogram
+Name[id]=Klien Mail
+Name[is]=Póstforrit
+Name[it]=Programma di posta elettronica
+Name[ja]=メールクライアント
+Name[ka]=საფოსტო კლიენტი
+Name[kk]=Эл.пошта клиенті
+Name[km]=កម្មវិធី​អ៊ីមែល
+Name[ko]=전자 우편 클라이언트
+Name[lo]=ໄຄແອນ Alarm
+Name[lt]=E. pašto klientas
+Name[lv]=Epasta klients
+Name[mk]=Клиент за е-пошта
+Name[mn]=Захиа-програм
+Name[ms]=Pelanggan E-mel
+Name[mt]=Programm tal-imejl
+Name[nb]=E-postprogram
+Name[nds]=Nettpost-Programm
+Name[ne]=इमेल क्लाइन्ट
+Name[nl]=E-mailprogramma
+Name[nn]=E-postprogram
+Name[nso]=Moreki wa E-poso
+Name[pa]=ਈ-ਮੇਲ ਕਲਾਂਈਟ
+Name[pl]=Program pocztowy
+Name[pt]=Cliente de E-mail
+Name[pt_BR]=Cliente de E-mail
+Name[ro]=Client de email
+Name[ru]=Клиент электр. почты
+Name[rw]=Umukiriya Imeli
+Name[se]=E-boastaprográmma
+Name[sk]=E-mailový klient
+Name[sl]=Odjemalec e-pošte
+Name[sr]=Е-поштански клијент
+Name[sr@Latn]=E-poštanski klijent
+Name[ss]=Likhasimende le email
+Name[sv]=E-postklient
+Name[ta]=மின்னஞ்சல் வேண்டி
+Name[te]=ఈమెయిల్ క్లైంట్
+Name[tg]=Коргири почтаи электроникӣ
+Name[th]=โปรแกรมรับส่งอีเมล
+Name[tr]=E-posta Programı
+Name[tt]=Email Klient
+Name[uk]=Клієнт електронної пошти
+Name[uz]=Xat-xabar klienti
+Name[uz@cyrillic]=Хат-хабар клиенти
+Name[ven]=Mushumisani wa Email
+Name[vi]=Trình thư
+Name[wa]=Cliyint d' emilaedje
+Name[xh]=Umxhasi we Email
+Name[zh_CN]=电子邮件客户程序
+Name[zh_TW]=電子郵件客戶端程式
+Name[zu]=Umxhasi weposi lekhomputha
+Comment=This service allows you to configure your default email client. All KDE applications which need access to an email client application should honor this setting.
+Comment[af]=Hierdie diens laat jou toe om jou standaard e-pos kliënt op te stel. Al die KDE programme wat toegang tot 'n e-pos kliënt benodig behoort hierdie instelling te gebruik.
+Comment[ar]=هذه الخدمة تسمح لك بتهيئة برنامج البريد الافتراضي. جميع تطبيقات كيدي التي ستحتاج الى الوصول الى تطبيق بريد الكتروني يجب أن تتبع هذا الضبط.
+Comment[be]=Гэты сервіс дазваляе вызначыць для сябе стандартны кліент электроннай пошты. Усе праграмы KDE, у якіх вы можаце выбраць гіперспасылку, павінны выкарыстоўваць гэтае настаўленне.
+Comment[bg]=Избор на предпочитан пощенски клиент. Всички програми на KDE ще ползват този компонент.
+Comment[bn]=এই সার্ভিসটির সাহায্যে আপনার ডিফল্ট ই-মেইল ক্লায়েন্ট কনফিগার করতে পারেন। যে কোনো কে.ডি.ই. অ্যাপলিকেশনের ই-মেইল ক্লায়েন্ট প্রয়োজন হলে এই নির্বাচন মানা উচিত।
+Comment[bs]=Ovaj servis vam omogućuje da podesite vaš podrazumjevani email klijent. Sve KDE aplikacije kojima je potreban pristup email klijent aplikaciji bi trebale poštovati ovu postavku.
+Comment[ca]=Aquest servei us permet configurar el vostre client de correu per omissió. Totes les aplicacions KDE que precisin d'accés a una aplicació de client de correu tindria que reconèixer aquesta opció.
+Comment[cs]=Tato služba umožňuje nastavit si výchozího klienta emailu. Všechny KDE aplikace, které vyžadují přístup k emailové aplikaci, by měly používat toto nastavení.
+Comment[csb]=Tuwò je mòżno wëbrac domëslną pòcztową programã. Wszëtczé programë KDE, w jaczich brëkùje sã z lënkòw, mùszôłëbë ùżëwac tegò ùstôwù.
+Comment[cy]=Mae'r gwasanaeth ymayn gadael i chi ffurfweddu eich dibynnydd ebost cyffredinol. Dylai bob raglen KDE sydd angen cyrchiad i ddibynnydd ebost ddefnyddio'r gosodiad yma.
+Comment[da]=Denne service tillader dig at indstille din e-mail-klient. Alle KDE-programmer der behøver adgang til en e-mail-klient skulle respektere denne indstilling.
+Comment[de]=Hier können Sie Ihr E-Mail-Programm einrichten. Alle KDE-Anwendungen, die Zugriff auf ein solches Programm benötigen, sollten diese Einstellungen verwenden.
+Comment[el]=Αυτή η υπηρεσία σας επιτρέπει να ρυθμίσετε τον προκαθορισμένο πελάτη email σας. Όλες οι εφαρμογές του KDE που χρειάζονται πρόσβαση σε μια εφαρμογή πελάτη email θα πρέπει να χρησιμοποιούν αυτή τη ρύθμιση.
+Comment[en_GB]=This service allows you to configure your default email client. All KDE applications which need access to an email client application should honour this setting.
+Comment[eo]=Tiu servo ebligas, ke vi elektas vian norman retpoŝtilon. Ĉiuj KDEaj aplikoj, kiuj bezonas retpoŝtilon, uzos tiun agordon.
+Comment[es]=Este servicio le permite configurar su cliente de correo predefinido. Todas las aplicaciones KDE que precisan acceso a una aplicación de cliente de correo deberían reconocer esta opción.
+Comment[et]=See teenus võimaldab sul määrata kindlaks vaikimisi kasutatava e-posti kliendi. Kõik KDE rakendused, mis vajavad mingil moel e-posti klienti, peaksid arvestama selle seadega.
+Comment[eu]=Zerbitzu honen bidez zure posta eletronikoko bezero lehenetsia konfigura dezakezu. Posta elektroniko bezeroa behar duten KDE aplikazio guztiek ezarpen hau errespetatu egin beharko lukete.
+Comment[fa]=این خدمت به شما اجازۀ پیکربندی کارخواه رایانامۀ پیش‌فرضتان را می‌دهد. همۀ کاربردهای KDE که نیاز به دستیابی به کاربردهای کارخواه رایانامه دارند، باید این تنظیم را قبول کنند.
+Comment[fi]=Tämän palvelun avulla voit määritellä oletussähköpostiohjelman. Kaikki sähköpostiohjelmaa käyttävätKDE-sovellukset huomioivat tämän asetuksen.
+Comment[fr]=Ce service vous permet de configurer votre client de courrier par défaut. Toutes les applications KDE qui ont besoin d'accéder à un client de courrier électronique doivent accepter ce réglage.
+Comment[fy]=Mei dizze tsjinst kinne jo de standert e-postprogramma ynstelle. KDE-tapassingen dy tagong ta in e-postprogramma neadich ha sille dizze ynstellings brûke.
+Comment[gl]=Este servizo permite-lle configurar o seu cliente de correo predeterminado. Todas as aplicacións de KDE que precisen aceso á aplicación de correo electrónico deberian ter en conta esta opción.
+Comment[he]=שירות זה מאפשר לך להגדיר את תוכנית הדוא"ל שתשמש כברירת מחדל. כל יישומי KDE שיזדקקו לגישה אל תוכנית דוא"ל יתחשבו בהגדרה זו.
+Comment[hi]=यह सेवा आपको आपके डिफ़ॉल्ट ईमेल क्लाएंट को कॉन्फ़िगर करने की स्वीकृति देती है. सभी केडीई अनुप्रयोग जो ईमेल क्लाएंट अनुप्रयोग एक्सेस करते हैं, वे इस विन्यास इस्तेमाल करेंगे.
+Comment[hr]=Usluga koja omogućuje konfiguriranje zadanog klijenta e-pošte. Sve KDE aplikacije koje zahtijevaju pristup klijentu e-pošte poštivat će ovaj odabir.
+Comment[hu]=Ez a szolgáltatás lehetővé teszi az alapértelmezett e-mail-kliens előírását. Az összes KDE-alkalmazásnak figyelembe kell vennie ezt az értéket a levelezőprogram elindításakor.
+Comment[is]=Þessi þjónusta leyfir þér að skilgreina sjálfgefið tölvupóstforrit. Öll KDE forrit sem þurfa aðgengi að tölvupóstforriti ættu að virða þessa stillingu.
+Comment[it]= Questo servizio ti permette di configurare il tuo programma di posta elettronica preferito. Tutte le applicazioni di KDE che avranno bisogno di accedere ad un programma di posta elettronica dovranno rispettare questa impostazione.
+Comment[ja]=ここで標準のメールクライアントを設定します。メールクライアントを必要とするすべての KDE アプリケーションは、この設定に従います。
+Comment[ka]=აქ შეიძლება სტანდარტული საფოსტო კლიენტის დაკონფიგურირება. KDE-ს ყველა პროგრამა, ვისაც სჭირდება ფოსტა, გაითვალისწინებენ ამ პარამეტრს
+Comment[kk]=Мұнда Сіз әдетті эл.пошта клиентін таңдай аласыз. Бүкіл KDE қолданбаларда эл.пошта керек болғанда осы таңдау қолданылады.
+Comment[km]=សេវា​នេះ​អនុញ្ញាត​ឲ្យ​អ្នក​កំណត់​រចនាសម្ព័ន្ធ​កម្មវិធី​អ៊ីមែល​លំនាំដើម​របស់​អ្នក ។ កម្មវិធី KDE ទាំងអស់ ដែល​ត្រូវការ​ចូលដំណើរការ​កម្មវិធី​អ៊ីមែល គួរ​តែ​គោរព​ការ​កំណត់​នេះ ។
+Comment[ko]=이 서비스에서는 기본 전자 우편 클라이언트를 설정할 수 있습니다. 전자 우편 클라이언트에 접근하려고 하는 모든 KDE 프로그램에서는 이 설정을 따라야 합니다.
+Comment[lt]=Ši tarnyba leidžia jums nustatyti Jūsų numatytą pašto klientą. Visos KDE programos, kurioms reikia e. pašto kliento programos, turėtų atsižvelgti į šį nustatymą.
+Comment[lv]=Šis servis ļauj Jums konfigurēt noklusējuma epasta klientu. Visas KDE aplikācijas, kurām ir nepieciešams epasts, izmantos šo parametru.
+Comment[mk]=Овој сервис ви овозможува да го конфигурирате вашиот стандарден клиент за електронска пошта. Сите KDE-апликации на кои им е потребен пристап до електронска пошта ќе ги почитуваат овие поставувања.
+Comment[mn]=Та энд өөрийн захианы програмаа тохируулж болно. Захианы програмд хандах шаардлагатай бүх КДЭ-х.программууд энэ тохируулгыг хэрэглэх болно.
+Comment[ms]=Servis ini membolehkan anda konfigur klien e-mel piawai anda. Semua aplikasi KDE yang perlu akses kepada aplikasi klien e-mel hendaklah menerima seting ini.
+Comment[mt]=Dan is-servizz iħallik tikkonfigura programm tal-imejl impliċitu. Il-programmi ta' KDE kollha li jkollom bżonn iħaddmu programm tal-imejl għandhom itellgħu il-programm li tagħżel hawn.
+Comment[nb]=Med denne tjenesten kan du sette opp standard-e-postprogrammet. Alle KDE-programmer som trenger tilgang til e-post bør ta hensyn til denne innstillinga.
+Comment[nds]=Hier kannst Du Dien Standard-Nettpostprogramm angeven. All KDE- Programmen, de Togang to'n Nettpostprogramm bruukt, schullen dat denn anwennen.
+Comment[ne]=यो सेवाले तपाईँलाई पूर्वनिर्धारित इमेल क्लाइन्ट कन्फिगर गर्न अनुमति दिन्छ । इमेल क्लाइन्ट अनुप्रयोग पहुँच आवश्यक पर्ने सबै KDE अनुप्रयोगहरूले यो सेटिङ मान्नु पर्छ ।
+Comment[nl]=Met deze service kunt u uw standaard e-mailprogramma instellen. KDE-toepassingen die toegang tot een e-mailprogramma nodig hebben zullen deze instellingen gebruiken.
+Comment[nn]=Med denne tenesta kan du setja opp standard-e-postprogrammet. Alle KDE-program som treng tilgang til e-post bør følgja denne innstillinga.
+Comment[nso]=Tirelo ye ego dumelela go beakanya moreki wa gago wa e-poso wa thuso ya tshoganetso. Ditshumiso kamoka tsa KDE tseo di hlokago tsenelo go tshomiso ya moreki wa e-poso di swanetse go hlompha dipeakanyo tse.
+Comment[pa]=ਇਥੇ ਤੁਸੀਂ ਆਪਣੇ ਮੂਲ ਈ-ਮੇਲ ਕਲਾਂਈਟ ਦੀ ਸੰਰਚਨਾ ਕਰ ਸਕਦੇ ਹੋ। ਸਭ KDE ਕਾਰਜ, ਜਿਨਾਂ ਨੇ ਵੀ ਈ-ਮੇਲ ਕਲਾਂਈਟ ਵਰਤਣਾ ਹੈ, ਇਸ ਸੈਟਿੰਗ ਦਾ ਸਨਮਾਨ ਕਰਨਗੇ।
+Comment[pl]=Tu można wybrać domyślny program pocztowy. Wszystkie programy KDE, które korzystają z poczty, powinny używać tego ustawienia.
+Comment[pt]=Este serviço permite-lhe configurar o seu cliente de e-mail por omissão. Todas as aplicações do KDE que necessitem do acesso a um cliente de e-mail devem respeitar esta configuração.
+Comment[pt_BR]=Este serviço permite a você configurar o seu cliente de e-mail padrão. Todas os aplicativos do KDE que precisarem acessar um cliente de e-mail devem seguir esta configuração.
+Comment[ro]=Acest serviciu vă permite să configurați clientul de email implicit. Toate aplicațiile KDE care au nevoie de o aplicație client de email ar trebui să onoreze această setare.
+Comment[ru]=Эта служба позволяет вам настроить почтовый клиент по умолчанию. Все приложения KDE, которым нужен почтовый клиент, будут использовать этот параметр.
+Comment[rw]=Iyi serivisi ikwemerera kuboneza umukiriya imeli mburabuzi wawe. Porogaramu KDE zose zikeneye ukugera kuri porogaramu mukiriya imeli zizakurikiza iri genamiterere.
+Comment[se]=Dáinna bálvalusain sáhtát heivehit standárd e-boastaprográmma. Buot KDE-prográmmat mat geavahit e-boastta berret dáid heivehusaid geavahit.
+Comment[sk]=Táto služba umožňuje nastaviť štandardného klienta pošty. Všetky aplikácie KDE, ktoré používajú poštového klienta, by mali používať toto nastavenie.
+Comment[sl]=Ta storitev vam omogoča nastavitev vašega privzetega e-poštnega odjemalca. Vsi programi za KDE, ki ga uporabljajo, bi morali upoštevati te nastavitve.
+Comment[sr]=Овај сервис вам дозвољава да подесите подразумевани клијент за електронску пошту. Сви KDE програми, којима је потребан приступ електронској пошти, требало би да поштују ову поставку.
+Comment[sr@Latn]=Ovaj servis vam dozvoljava da podesite podrazumevani klijent za elektronsku poštu. Svi KDE programi, kojima je potreban pristup elektronskoj pošti, trebalo bi da poštuju ovu postavku.
+Comment[sv]=Den här tjänsten låter dig anpassa förvald e-postklient. Alla KDE-program som behöver använda e-postklient ska använda den här inställningen
+Comment[ta]=இந்த சேவை உங்களுடைய முன்னிருந்த மின் அஞ்சல் உறுப்பினரை வடிவமைத்துக் கொள்ள அனுமதிக்கிறது. மின் அஞ்சல் உறுப்பினர் பயன்பாடு தேவைப்படுகிற எல்லா கேடிஇ பயன்பாடுகளும் இந்த அமைப்பை நிறுவவேண்டும்.
+Comment[tg]= Ин сервиси коргири пешфарзи почтаи электроникиатонро танзим мекунед. Тамоми нармафзорҳои KDE ки ниёз ба дастраси ба коргири почтаи электроникӣ доранд аз ин танзимоти табии хоҳанд кард.
+Comment[th]=บริการนี้จะอนุญาตให้คุณตั้งโปรแกรมรับส่งอีเมลปริยายของคุณ แอพพลิเคชั่นของ KDE ทุกตัวซึ่งจำเป็นต้องใช้งานโปรแกรมรับส่งอีเมล จะทำตาม ค่าที่ตั้งนี้
+Comment[tr]=Bu servis öntanımlı e-posta istemcinizi seçmenize yardımcı olur.
+Comment[tt]=Monda töp email-klienteñne köyläp bula. Email belän eşlägän çaqta bar KDE-yazılımnar da bu köyläwlärne qullanırğa tieş.
+Comment[uk]=Ця служба дозволяє вам налаштувати ваш типовий клієнт електронної пошти. Всі програми KDE, яким потрібен доступ до клієнта ел. пошти повинні користуватися цими параметрами.
+Comment[uz]=Bu xizmat andoza xat-xabar klientingizni moslash uchun imkoniyat yaratadi. Xat-xabar klienti kerak boʻlgan hamma KDE dasturlari shu moslamadan foydalanishi kerak.
+Comment[uz@cyrillic]=Бу хизмат андоза хат-хабар клиентингизни мослаш учун имконият яратади. Хат-хабар клиенти керак бўлган ҳамма KDE дастурлари шу мосламадан фойдаланиши керак.
+Comment[ven]=Tshumelo iyi ini tendela u dzudzanya mushumisani wa email ya default yanu. Apulifikhesheni dza KDE dzothe dzine dza toda apulifikhesheni ya mushimisani wa email i fanela u thonifha mavhekanyele aya.
+Comment[vi]=Dịch vụ này cho phép bạn cấu hình trình thư mặc định. Tất cả các chương trình của KDE cần gửi thư điện tử đều dựa vào thiết lập này.
+Comment[wa]=Ci siervice vos permete d' apontyî vosse prémetou cliyint d' emile. Tos les programes di KDE k' ont dandjî d' eployî on cliyint emile duvrént shure cisse tchuze.
+Comment[xh]=Lenkonzo ikuvumela ukuba uqwalasele umxhasi wakho we email. Zonke izicelo ezidinga unikezelo kumxhasi we email wesicelo kufuneka yamkele esisicelo.
+Comment[zh_CN]=此服务允许您配置您的默认电子邮件程序。所有需要访问电子邮件客户程序的 KDE 应用程序都遵从此设置。
+Comment[zh_TW]=這個服務允許您設定您的預設電子郵件客戶端程式。所有需要使用電子郵件客戶端應用程式的 KDE 應用程式都應該遵從這個設定。
+Comment[zu]=Lo msebenzi ukuvumela ukuthi uhlanganisele umxhasi weposi lekhomputha wendalo. Bonke abayaleli be-KDE abadinga ukungena kumyaleli womxhasi weposi lekhomputha kumele bahloniphe lesi silingiselelo.
+configurationType=internal_email
diff --git a/kcontrol/componentchooser/componentservices/kcm_terminal.desktop b/kcontrol/componentchooser/componentservices/kcm_terminal.desktop
new file mode 100644
index 000000000..1bcd9171d
--- /dev/null
+++ b/kcontrol/componentchooser/componentservices/kcm_terminal.desktop
@@ -0,0 +1,157 @@
+Name=Terminal Emulator
+Name[af]=Terminaal Emulasie
+Name[ar]=مضاهِ مطراف
+Name[az]=Terminal Emulyasiyası
+Name[be]=Эмулятар тэрміналу
+Name[bg]=Конзолна програма
+Name[bn]=টার্মিনাল এমুলেটর
+Name[br]=Kendarvanerezh termenell
+Name[bs]=Simulator terminala
+Name[ca]=Emulador de terminal
+Name[cs]=Emulátor terminálu
+Name[csb]=Emùlator terminala
+Name[cy]=Efelychydd Terfynell
+Name[da]=terminalemulator
+Name[de]=Terminal-Emulator
+Name[el]=Προσομοιωτής τερματικού
+Name[eo]=Terminalimitaĵo
+Name[es]=Emulador de terminal
+Name[et]=Terminaliemulaator
+Name[eu]=Terminal emuladorea
+Name[fa]=مقلد پایانه
+Name[fi]=Komentoikkuna
+Name[fo]=Útstøðshermari
+Name[fr]=Émulateur de terminal
+Name[fy]=Terminal
+Name[ga]=Aithriseoir Teirminéil
+Name[gl]=Emulador de Terminal
+Name[he]=הדמיית מסוף
+Name[hi]=टर्मिनल एमुलेटर
+Name[hr]=Emulator terminala
+Name[hu]=Parancsértelmező
+Name[id]=Emulator Terminal
+Name[is]=Skjáhermir KDE
+Name[it]=Emulatore di terminale
+Name[ja]=ターミナルエミュレータ
+Name[ka]=ტერმინალის ემულატორი
+Name[kk]=Терминал эмуляторы
+Name[km]=វត្ថុ​ត្រាប់​តាម​ស្ថានីយ
+Name[ko]=터미널 에뮬레이터
+Name[lo]=ຕົວຈຳລອງເທີມີນອນ
+Name[lt]=Terminalo emuliatorius
+Name[lv]=Termināla Emulators
+Name[mk]=Терминалски емулатор
+Name[mn]=Терминал-Эмулатор
+Name[ms]=Pelagak Terminal
+Name[mt]=Emulatur ta' terminal
+Name[nb]=Terminalemulator
+Name[nds]=Terminal-Emulator
+Name[ne]=टर्मिनल इमुलेटर
+Name[nl]=Terminal
+Name[nn]=Terminalemulator
+Name[nso]=Moekisi wa Terminal
+Name[pa]=ਟਰਮੀਨਲ ਸਮਰੂਪ
+Name[pl]=Emulator terminala
+Name[pt]=Emulador de Terminal
+Name[pt_BR]=Emulador de Terminal
+Name[ro]=Emulator de terminal
+Name[ru]=Эмулятор терминала
+Name[rw]= Mukuruzi Ihera
+Name[se]=Terminálemuláhtor
+Name[sk]=Emulátor terminálu
+Name[sl]=Terminalski emulator
+Name[sr]=Емулатор терминала
+Name[sr@Latn]=Emulator terminala
+Name[ss]=Silingiseli sesikhungo
+Name[sv]=Terminalemulator
+Name[ta]=கடைசி போட்டியாளர்
+Name[te]=టెర్మినల్ ఎములేటర్
+Name[tg]=Эмулятори поёна
+Name[th]=โปรแกรมจำลองเทอร์มินัล
+Name[tr]=Uçbirim Emülasyonu
+Name[tt]=Terminal Emulatorı
+Name[uk]=Емуляція терміналу
+Name[uz]=Terminal emulyatori
+Name[uz@cyrillic]=Терминал эмулятори
+Name[ven]=Mulingedzisi wa theminala
+Name[vi]=Mô phỏng thiết bị cuối
+Name[wa]=Terminå
+Name[xh]=Umzami kulinganisela ngokulinganayo Wendlela yesiphelo
+Name[zh_CN]=终端仿真器
+Name[zh_TW]=終端機模擬程式
+Name[zu]=Umlingisi wangaphandle
+Comment=This service allows you to configure your default terminal emulator. All KDE applications which invoke a terminal emulator application should honor this setting.
+Comment[af]=Hierdie diens laat jou toe om jou standaard terminaal emuleerder op te stel. Al die KDE programme wat 'n terminaal skep behoort hierdie instelling te gebruik.
+Comment[be]=Гэты сервіс дазваляе вызначыць для сябе стандартны эмулятар тэрміналу. Усе праграмы KDE, якія запускаюць эмулятар тэрміналу, павінны выкарыстоўваць гэтае настаўленне.
+Comment[bg]=Избор на предпочитана конзолна програма. Всички програми на KDE ще ползват този компонент.
+Comment[bn]=এই সার্ভিসটির সাহায্যে আপনার ডিফল্ট টার্মিনাল এমুলেটর কনফিগার করতে পারেন। যে কোনো কে.ডি.ই. অ্যাপলিকেশনের টার্মিনাল এমুলেটর চালানোর প্রয়োজন হলে এই নির্বাচন মানা উচিত।
+Comment[bs]=Ovaj servis vam omogućuje da podesite vaš podrazumijevani simulator terminala. Sve KDE aplikacije kojima je potreban terminal bi trebale poštovati ovu postavku.
+Comment[ca]=Aquest servei us permet configurar el vostre emulador de terminal per omissió. Totes les aplicacions KDE que precisin d'accés a una aplicació de client de correu tindria que reconèixer aquesta opció.
+Comment[cs]=Tato služba umožňuje nastavit si výchozího emulátor terminálu. Všechny KDE aplikace, které spouští emulátor terminálu, by měly používat toto nastavení.
+Comment[csb]=Tuwò je mòżno wëbrac domëslny emùlator terminala. Wszëtczé programë KDE, w jaczich brëkùje sã z lënkòw, mùszôłëbë ùżëwac tegò ùstôwù.
+Comment[cy]=Mae'r gwasanaeth yma yn gadael i chi ffurfweddu eich efelychydd terfynell cyffredinol. Dylai pob rhaglen KDE sy'n cychwyn efelychydd terfynell ddefnyddio'r gosodiad yma.
+Comment[da]=Denne service tillader dig at indstille din terminalemulator. Alle KDE-programmer der behøver adgang til en terminalemulator skulle respektere denne indstilling.
+Comment[de]=Hier können Sie den voreingestellten Terminal-Emulator einrichten. Alle KDE-Anwendungen, die Zugriff auf ein solches Programm benötigen, sollten diese Einstellungen verwenden.
+Comment[el]=Αυτή η υπηρεσία σας επιτρέπει να ρυθμίσετε τον προκαθορισμένο προσομοιωτή τερματικού σας. Όλες οι εφαρμογές του KDE που καλούν μια εφαρμογή προσομοιωτή τερματικού θα πρέπει να τηρούν αυτήν τη ρύθμιση.
+Comment[en_GB]=This service allows you to configure your default terminal emulator. All KDE applications which invoke a terminal emulator application should honour this setting.
+Comment[eo]=Tiu servo ebligas, ke vi elektas vian norman terminalon. Ĉiuj KDEaj aplikoj, kiuj bezonas terminalon, uzos tiun agordon.
+Comment[es]=Este servicio le permite configurar su emulador de terminal predefinido. Todas las aplicaciones KDE que invoquen un emulador de terminal deberían reconocer esta opción.
+Comment[et]=See teenus võimaldab sul määrata kindlaks vaikimisi kasutatava terminaliemulaatori. Kõik KDE rakendused, mis vajavad mingil moel terminaliemulaatorit, peaksid arvestama selle seadega.
+Comment[eu]=Zerbitzu honen bidez zure terminal emuladore lehenetsia konfiguradezakezu. Terminal emuladore bati deitzen dioten KDEren aplikazio guztiek ezarpen hau onartu egin beharko lukete.
+Comment[fa]=این خدمت به شما اجازۀ پیکربندی مقلد پایانۀ پیش‌فرضتان را می‌دهد. همۀ کاربردهای KDE که نیاز به دستیابی به کاربردهای کارخواه رایانامه دارند، باید این تنظیم را قبول کنند.
+Comment[fi]=Tämän palvelun avulla voit asettaa oletus-komentoikkunaa. Kaikki komentoikkunaa käyttävät KDE-sovellukset huomioivat tämän asetuksen.
+Comment[fr]=Ce service vous permet de configurer votre émulateur de terminal par défaut. Toutes les applications KDE qui appellent une application d'émulation de terminal doivent accepter ce réglage.
+Comment[fy]=Mei dizze tsjinst kinne jo de standert terminalemulator ynstelle. Alle KDE-tapassingen dy in terminalemulator oanroppe sille brûk meitsje fan dizze ynstelling.
+Comment[gl]=Este servizo permite-lle configurar o seu emulador de terminal predeterminado. Todas as aplicacións de KDE que invoquen a un emulador de terminal deberian facer caso desta opción.
+Comment[he]=שירות זה מאפשר לך להגדיר את תוכנית הדמיית המסוף שתשמש כברירת מחדל. כל יישומי KDE שיקראו ליישום הדמיית מסוף יתחשבו בהגדרה זו.
+Comment[hi]=यह सेवा आपको आपके डिफ़ॉल्ट टर्मिनल एमुलेटर को कॉन्फ़िगर करने की स्वीकृति देती है. सभी केडीई अनुप्रयोग जो टर्मिनल एमुलेटर अनुप्रयोग चालू करते हैं, वे इस विन्यास इस्तेमाल करेंगे.
+Comment[hr]=Usluga koja omogućuje konfiguriranje zadanog emulatora terminala. Sve KDE aplikacije koje pozivaju aplikaciju emulatora terminala poštivat će ovaj odabir.
+Comment[hu]=Ez a szolgáltatás lehetővé teszi az alapértelmezett parancsértelmező előírását. Az összes KDE-alkalmazásnak figyelembe kell vennie ezt az értéket a parancsértelmező elindításakor.
+Comment[is]=Þessi þjónusta leyfir þér að skilgreina sjálfgefinn skjáhermi. Öll KDE forrit sem þurfa aðgengi að skjáhermi ættu að virða þessa stillingu.
+Comment[it]= Questo servizio ti permette di configurare il tuo programma di emulazione terminale preferito. Tutte le applicazioni di KDE che avranno bisogno di aprire un terminale dovranno rispettare questa impostazione.
+Comment[ja]=ここで標準のターミナルエミュレータを設定します。ターミナルエミュレータを起動するすべての KDE アプリケーションは、この設定に従います。
+Comment[ka]=Comment=აქ შეიძლება სტანდარტული ტერმინალის ემულატორის დაკონფიგურირება. KDE-ს ყველა პროგრამა, ვისაც სჭირდება ფოსტა, გაითვალისწინებენ ამ პარამეტრს
+Comment[kk]=Мұнда Сіз әдетті терминал эмуляторын таңдай аласыз. Бүкіл KDE қолданбаларда терминал эмуляторы керек болғанда осы таңдау қолданылады.
+Comment[km]=សេវា​នេះ​អនុញ្ញាត​ឲ្យ​អ្នក​កំណត់​រចនាសម្ព័ន្ធ វត្ថុ​ត្រាប់​តាម​ស្ថានីយ​លំនាំដើម​របស់​អ្នក ។ កម្មវិធី KDE ទាំងអស់ ដែល​ហៅ​វត្ថុ​ត្រាប់​តាម​ស្ថានីយ​មួយ គួរ​តែ​គោរព​ការ​កំណត់​នេះ ។
+Comment[ko]=이 서비스에서는 기본 터미널 에뮬레이터를 설정할 수 있습니다. 터미널 에뮬레이터에 접근하려고 하는 모든 KDE 프로그램에서는 이 설정을 따라야 합니다.
+Comment[lt]=Ši tarnyba leidžia jumos nustatyti Jūsų numatytą pašto klientą. Visos KDE programos, kurios iškviečia terminalo emuliatoriaus programa, turėtų atsižvelgti į šį nustatymą.
+Comment[lv]=Šis serviss Jums ļauj uzstādīt noklusējuma termināla emulātoru. Visas KDE aplikācijas, kurām vajag termināla emulātoru, izmantos šo parametru.
+Comment[mk]=Овој сервис ви овозможува да го конфигурирате вашиот стандарден терминалски емулатор. Сите KDE-апликации кои стартуваат апликација во терминалски емулатор ќе ги почитуваат овие поставувања.
+Comment[mn]=Энд та стандарт Терминал-Эмулатораа тохируулж болно. Терминал-Эмулатор програмд хандах шаардлагатай бүх КДЭ-х.программууд энэ тохируулгыг хэрэглэх болно.
+Comment[ms]=Servis ini membolehkan anda konfigur pelagak terminal piawai. Semua aplikasi KDE yang membatalkan aplikasi pelagak terminal hendaklah menerima seting ini.
+Comment[mt]=Dan is-servizz iħallik tikkonfigura emulatur ta' terminal impliċitu. Il-programmi ta' KDE kollha li jkollom bżonn iħaddmu emulatur ta' terminal għandhom itellgħu il-programm li tagħżel hawn.
+Comment[nb]=Denne tjenesten lar deg velge hvilken terminalemulator du foretrekker. Alle KDE-program som starter en terminalemulator bør ta hensyn til disse innstillingene.
+Comment[nds]=Hier kannst Du Dien Standard-Terminalemulator angeven. All KDE- Programmen, de en Terminalemulator starten wüllt, schullen dat denn anwennen.
+Comment[ne]=यो सेवाले तपाईँलाई पूर्वनिर्धारित टर्मिनल इमुलेटर कन्फिगर गर्न अनुमति दिन्छ । टर्मिनल इमुलेटर आव्हान गर्ने सबै KDE अनुप्रयोगहरूले यो सेटिङ मान्नु पर्छ ।
+Comment[nl]=Met deze service kunt u uw standaard terminalemulator instellen. Alle KDE-toepassingen die een terminalemulator aanroepen zullen gebruik maken van deze instelling.
+Comment[nn]=Med denne tenesta kan du setja oppp standardterminalemulatoren. Alle KDE-program som startar terminalemulatorar bør følgja denne innstillinga.
+Comment[nso]=Tirelo ye ego dumelela go beakanya moekisi wa gago wa terminal wa thuso ya tshoganetso. Ditshomiso kamoka tsa KDE tseo di tlisago tshomiso ya moekisi wa bofelong di swanetse go hlompha peakanyo ye.
+Comment[pa]=ਇਥੇ ਤੁਸੀਂ ਆਪਣੇ ਮੂਲ ਟਰਮੀਨਲ ਦੀ ਸੰਰਚਨਾ ਕਰ ਸਕਦੇ ਹੋ। ਸਭ KDE ਕਾਰਜ, ਜਿਨਾਂ ਵਿੱਚ ਵੀ ਟਰਮੀਨਲ ਲੋੜੀਦਾ ਹੈ, ਇਸ ਸੈਟਿੰਗ ਦਾ ਸਨਮਾਨ ਕਰਨਗੇ।
+Comment[pl]=Tu można wybrać domyślny emulator terminala. Wszystkie programy KDE, które korzystają z terminala, powinny używać tego ustawienia.
+Comment[pt]=Este serviço permite-lhe configurar o seu emulador de terminal por omissão. Todas as aplicações do KDE que invoquem um emulador de terminal devem respeitar esta configuração.
+Comment[pt_BR]=Este serviço permite a você configurar o seu emulador de terminal padrão. Todos os aplicativos do KDE que precisarem acessar um emulador de terminal devem seguir esta configuração.
+Comment[ro]=Acest serviciu vă permite să configurați emulatorul de terminal implicit. Toate aplicațiile de KDE care invocă un emulator de terminal ar trebuie să onoreze această setare.
+Comment[ru]=Эта служба позволяет настроить эмулятор терминала по умолчанию. Все приложения KDE, которые вызывают эмулятор терминала, должны следовать этому параметру.
+Comment[rw]=Iyi serivisi ikwemerera kuboneza mukuruzi igihera mburabuzi yawe. Porogaramu KDE zose zihamagara mukuruzi igihera zizakurikiza iri genamiterere.
+Comment[se]=Dáinna bálvalusain sáhtát bidjat standárdterminálemuláhtora. Buot KDE-prográmmat mat álggahit terminálemuláhtoriid berret dán heivehusa geavahit.
+Comment[sk]=Táto služba umožňuje nastaviť štandardný emulátor terminálu. Všetky aplikácie KDE, ktoré používajú emulátor terminálu, by mali používať toto nastavenie.
+Comment[sl]=Ta storitev vam omogoča nastavitev vašega privzetega terminalskega emulatorja. Vsi programi za KDE, ki ga uporabljajo, bi morali upoštevati te nastavitve.
+Comment[sr]=Овај сервис вам дозвољава да подесите подразумевани емулатор терминала. Сви KDE програми, који позивају емулатор терминала, требало би да поштују ову поставку.
+Comment[sr@Latn]=Ovaj servis vam dozvoljava da podesite podrazumevani emulator terminala. Svi KDE programi, koji pozivaju emulator terminala, trebalo bi da poštuju ovu postavku.
+Comment[sv]=Den här tjänsten låter dig anpassa din förvalda terminalemulator. Alla KDE-program som startar ett terminalprogram ska använda den här inställningen
+Comment[ta]=இந்த சேவை உங்களுடைய முன்னிருந்த கடைசி போட்டியாளர வடிவமைத்துக் கொள்ள அனுமதிக்கிறது. கடைசி போட்டியாளர் பயன்பாடு தேவைப்படுகிற எல்லா கேடிஇ பயன்பாடுகளும் இந்த அமைப்பை நிறுவவேண்டும்.
+Comment[tg]= Ин сервис ба шумо иҷозат медиҳад эмулятори поёнаи пешфарзатонро танзим кунед. Тамоми нармафзорҳои KDE ки ба эмулятори поёна ниёз доранд ба ин танзимот эҳтиром хоҳанд гузошт.
+Comment[th]=บริการนี้จะอนุญาตให้คุณปรับแต่งโปรแกรมจำลองเทอร์มินัลของคุณ แอพพลิเคชั่นของ KDE ทุกตัวที่เรียกใช้งานโปรแกรมจำลองเทอร์มินัลจะทำตาม ค่าที่ตั้งนี้
+Comment[tr]=Bu servis öntanımlı terminal emülatörünü seçmenize yardımcı olur.
+Comment[tt]=Monda töp terminal emulatorıñnı köyläp bula. Terminal emulatorın çaqıru kiräk bulğan çaqta bar KDE-yazılımnar da bu köyläwlärne qullanırğa tieş.
+Comment[uk]=Ця служба дає змогу вказати ваш типовий емулятор термінала. Всі програми KDE, яким потрібен доступ до емулятора термінала повинні використовувати це налаштування.
+Comment[uz]=Bu xizmat andoza terminal emulyatoringizni moslash uchun imkoniyat yaratadi. Terminal emulyatori kerak boʻlgan hamma KDE dasturlari shu moslamadan foydalanishi kerak.
+Comment[uz@cyrillic]=Бу хизмат андоза терминал эмуляторингизни мослаш учун имконият яратади. Терминал эмулятори керак бўлган ҳамма KDE дастурлари шу мосламадан фойдаланиши керак.
+Comment[ven]=Tshumelo iyi ini tendela u dzudzanya tshilingedzi tsha theminala ya default. Apulifikhesheni dzothe dza KDE dzine dza shandukisa apulifikhesheni ya tshilingedzi tsha theminala dzi fanela u thonifha mavhekanyele aya.
+Comment[vi]=Dịch vụ này cho phép bạn cấu hình trình mô phỏng thiết bị cuối mặc định. Tất cả các chương trình của KDE cần mở thiết bị đầu cuối đều dựa vào thiết lập này.
+Comment[wa]=Ci siervice vos permete d' apontyî vosse prémetou terminå. Tos les programes di KDE ki dmandèt on terminå duvrént shure cisse tchuze
+Comment[xh]=Lenkonzo ikuvumela ukuba ukwazi ukuqwalasela isiphelo esingagqibekanga sendlela yokulinganisa.Zonke izicelo ze KDE eziqalisa isicelo sesiphelo sendlela yokulinganisa kumele zisamkele esisicwangciso.
+Comment[zh_CN]=此服务允许您配置您的默认终端仿真器。所有调用终端仿真程序的 KDE 应用程序都遵从此设置。
+Comment[zh_TW]=這個服務允許您設定您的預設終端機模擬程式。所有呼叫終端機模擬程式的 KDE 應用程式都應該遵從這個設定。
+Comment[zu]=Lo msebenzi ukuvumela ukuthi uhlanganisele umlingisi wangaphandle wendalo. Bonke abayaleli be-KDE ababiza umyaleli womlingisi wangaphandle bahloniphe lesi silingiselelo.
+configurationType=internal_terminal
diff --git a/kcontrol/componentchooser/emailclientconfig_ui.ui b/kcontrol/componentchooser/emailclientconfig_ui.ui
new file mode 100644
index 000000000..d4cb44085
--- /dev/null
+++ b/kcontrol/componentchooser/emailclientconfig_ui.ui
@@ -0,0 +1,236 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>EmailClientConfig_UI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>EmailClientConfig_UI</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>388</width>
+ <height>267</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup2</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>txtEMailClient</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>&lt;ul&gt; &lt;li&gt;%t: Recipient's address&lt;/li&gt; &lt;li&gt;%s: Subject&lt;/li&gt; &lt;li&gt;%c: Carbon Copy (CC)&lt;/li&gt; &lt;li&gt;%b: Blind Carbon Copy (BCC)&lt;/li&gt; &lt;li&gt;%B: Template body text&lt;/li&gt; &lt;li&gt;%A: Attachment &lt;/li&gt; &lt;/ul&gt;</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Press this button to select your favorite email client. Please note that the file you select has to have the executable attribute set in order to be accepted.&lt;br&gt; You can also use several placeholders which will be replaced with the actual values when the email client is called:&lt;ul&gt; &lt;li&gt;%t: Recipient's address&lt;/li&gt; &lt;li&gt;%s: Subject&lt;/li&gt; &lt;li&gt;%c: Carbon Copy (CC)&lt;/li&gt; &lt;li&gt;%b: Blind Carbon Copy (BCC)&lt;/li&gt; &lt;li&gt;%B: Template body text&lt;/li&gt; &lt;li&gt;%A: Attachment &lt;/li&gt; &lt;/ul&gt;</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>btnSelectEmail</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to browse for the mail program file.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="3" column="1">
+ <property name="name">
+ <cstring>chkRunTerminal</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Run in terminal</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Activate this option if you want the selected email client to be executed in a terminal (e.g. &lt;em&gt;Konsole&lt;/em&gt;).</string>
+ </property>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QRadioButton" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>kmailCB</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use KMail as preferred email client</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Kmail is the standard Mail program for the KDE desktop.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>otherCB</cstring>
+ </property>
+ <property name="text">
+ <string>Use a different &amp;email client:</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select this option if you want to use any other mail program.</string>
+ </property>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>Spacer16</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>Spacer16_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>otherCB</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>chkRunTerminal</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>otherCB</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>txtEMailClient</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>otherCB</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>btnSelectEmail</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>btnSelectEmail</sender>
+ <signal>clicked()</signal>
+ <receiver>EmailClientConfig_UI</receiver>
+ <slot>selectEmailClient()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>kmailCB</tabstop>
+ <tabstop>otherCB</tabstop>
+ <tabstop>txtEMailClient</tabstop>
+ <tabstop>chkRunTerminal</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected">selectEmailClient()</slot>
+</slots>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/componentchooser/kcm_componentchooser.cpp b/kcontrol/componentchooser/kcm_componentchooser.cpp
new file mode 100644
index 000000000..8e6ae7ba7
--- /dev/null
+++ b/kcontrol/componentchooser/kcm_componentchooser.cpp
@@ -0,0 +1,64 @@
+/***************************************************************************
+ kcm_componentchooser.cpp - description
+ -------------------
+ copyright : (C) 2002 by Joseph Wenninger
+ email : jowenn@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License version 2 as *
+ * published by the Free Software Foundation *
+ * *
+ ***************************************************************************/
+
+#include <qlayout.h>
+
+#include <kaboutdata.h>
+#include <kglobal.h>
+
+#include "kcm_componentchooser.h"
+#include "kcm_componentchooser.moc"
+
+
+KCMComponentChooser::KCMComponentChooser( QWidget *parent, const char *name ):
+ KCModule(parent,name) {
+
+ (new QVBoxLayout(this))->setAutoAdd(true);
+ m_chooser=new ComponentChooser(this,"ComponentChooser");
+ connect(m_chooser,SIGNAL(changed(bool)),this,SIGNAL(changed(bool)));
+ setButtons( Help | Apply );
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmcomponentchooser"), I18N_NOOP("Component Chooser"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c), 2002 Joseph Wenninger"));
+
+ about->addAuthor("Joseph Wenninger", 0 , "jowenn@kde.org");
+ setAboutData( about );
+
+}
+
+void KCMComponentChooser::load(){
+ m_chooser->load();
+}
+
+void KCMComponentChooser::save(){
+ m_chooser->save();
+}
+
+void KCMComponentChooser::defaults(){
+ m_chooser->restoreDefault();
+}
+
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_componentchooser( QWidget *parent, const char * )
+ {
+ KGlobal::locale()->insertCatalogue("kcmcomponentchooser");
+ return new KCMComponentChooser( parent, "kcmcomponentchooser" );
+ }
+}
+
diff --git a/kcontrol/componentchooser/kcm_componentchooser.h b/kcontrol/componentchooser/kcm_componentchooser.h
new file mode 100644
index 000000000..eac9ad055
--- /dev/null
+++ b/kcontrol/componentchooser/kcm_componentchooser.h
@@ -0,0 +1,39 @@
+/***************************************************************************
+ kcm_componentchooser.h - description
+ -------------------
+ copyright : (C) 2002 by Joseph Wenninger
+ email : jowenn@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License version 2 as *
+ * published by the Free Software Foundation *
+ * *
+ ***************************************************************************/
+
+#ifndef _KCM_KTEXTEDITORCHOOSER_H_
+#define _KCM_KTEXTEDITORCHOOSER_H_
+
+#include <kcmodule.h>
+
+#include "componentchooser.h"
+
+class KAboutData;
+
+class KCMComponentChooser : public KCModule
+{
+ Q_OBJECT
+public:
+ KCMComponentChooser( QWidget *parent = 0, const char *name = 0 );
+
+ void load();
+ void save();
+ void defaults();
+
+private:
+ ComponentChooser *m_chooser;
+};
+
+#endif
diff --git a/kcontrol/componentchooser/terminalemulatorconfig_ui.ui b/kcontrol/componentchooser/terminalemulatorconfig_ui.ui
new file mode 100644
index 000000000..7d355fdd8
--- /dev/null
+++ b/kcontrol/componentchooser/terminalemulatorconfig_ui.ui
@@ -0,0 +1,194 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>TerminalEmulatorConfig_UI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>TerminalEmulatorConfig_UI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>263</width>
+ <height>188</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>87</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QRadioButton" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>otherCB</cstring>
+ </property>
+ <property name="text">
+ <string>Use a different &amp;terminal program:</string>
+ </property>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>Spacer15</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QRadioButton" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>terminalCB</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use Konsole as terminal application</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>terminalLE</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Press this button to select your favorite terminal client. Please note that the file you select has to have the executable attribute set in order to be accepted.&lt;br&gt; Also note that some programs that utilize Terminal Emulator will not work if you add command line arguments (Example: konsole -ls).</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>btnSelectTerminal</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to browse for terminal program.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>otherCB</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>terminalLE</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>otherCB</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>btnSelectTerminal</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>btnSelectTerminal</sender>
+ <signal>clicked()</signal>
+ <receiver>TerminalEmulatorConfig_UI</receiver>
+ <slot>selectTerminalApp()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>terminalCB</tabstop>
+ <tabstop>otherCB</tabstop>
+ <tabstop>terminalLE</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected">selectTerminalApp()</slot>
+</slots>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/crypto/Makefile.am b/kcontrol/crypto/Makefile.am
new file mode 100644
index 000000000..73a79653d
--- /dev/null
+++ b/kcontrol/crypto/Makefile.am
@@ -0,0 +1,19 @@
+AM_CPPFLAGS = $(all_includes) $(SSL_INCLUDES)
+kde_module_LTLIBRARIES = kcm_crypto.la
+
+kcm_crypto_la_SOURCES = crypto.cpp certexport.cpp kdatetimedlg.cpp
+
+AM_CXXFLAGS = $(CXXFLAGS) -DLIBDIR=$(libdir)
+
+kcm_crypto_la_LDFLAGS = $(KDE_RPATH) $(all_libraries) $(SSL_LDFLAGS) -module -avoid-version -no-undefined
+kcm_crypto_la_LIBADD = -lkdeui $(LIB_KIO) $(LIBSSL)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = crypto.h certexport.h kdatetimedlg.h
+
+messages: rc.cpp
+ : > rc.cpp
+ $(XGETTEXT) $(kcm_crypto_la_SOURCES) *.h -o $(podir)/kcmcrypto.pot
+
+xdg_apps_DATA = crypto.desktop
diff --git a/kcontrol/crypto/README b/kcontrol/crypto/README
new file mode 100644
index 000000000..f86d974f1
--- /dev/null
+++ b/kcontrol/crypto/README
@@ -0,0 +1,2 @@
+This needs to be updated to use libkssl instead of OpenSSL directly.
+
diff --git a/kcontrol/crypto/certexport.cpp b/kcontrol/crypto/certexport.cpp
new file mode 100644
index 000000000..7c31bb84b
--- /dev/null
+++ b/kcontrol/crypto/certexport.cpp
@@ -0,0 +1,148 @@
+/**
+ * certexport.cpp
+ *
+ * Copyright (c) 2001 George Staikos <staikos@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "certexport.h"
+#include <qpushbutton.h>
+#include <klineedit.h>
+#include <kfiledialog.h>
+#include <qradiobutton.h>
+#include <qvbuttongroup.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <ksslall.h>
+
+
+KCertExport::KCertExport(QWidget *parent, const char *name)
+ : KDialog(parent, name, true) {
+QGridLayout *grid = new QGridLayout(this, 9, 6, marginHint(), spacingHint());
+
+ setCaption(i18n("X509 Certificate Export"));
+
+ QVButtonGroup *bg = new QVButtonGroup(i18n("Format"), this);
+ _pem = new QRadioButton(i18n("&PEM"), bg);
+ _netscape = new QRadioButton(i18n("&Netscape"), bg);
+ _der = new QRadioButton(i18n("&DER/ASN1"), bg);
+ _text = new QRadioButton(i18n("&Text"), bg);
+ grid->addMultiCellWidget(bg, 0, 4, 0, 3);
+ _pem->setChecked(true);
+
+ grid->addMultiCellWidget(new QLabel(i18n("Filename:"), this), 5, 5, 0, 3);
+
+ _filename = new KLineEdit(this);
+ grid->addMultiCellWidget(_filename, 6, 6, 0, 4);
+ connect(_filename, SIGNAL(textChanged(const QString &)), this, SLOT(slotTextChanged(const QString &)));
+ connect(_filename, SIGNAL(returnPressed()), this, SLOT(slotExport()));
+
+ _choose = new QPushButton("...", this);
+ grid->addWidget(_choose, 6, 5);
+ connect(_choose, SIGNAL(clicked()), this, SLOT(slotChoose()));
+
+ _export = new QPushButton(i18n("&Export"), this);
+ grid->addWidget(_export, 8, 4);
+ connect(_export, SIGNAL(clicked()), this, SLOT(slotExport()));
+ _export->setEnabled(false);
+
+ _cancel = new QPushButton(i18n("&Cancel"), this);
+ grid->addWidget(_cancel, 8, 5);
+ connect(_cancel, SIGNAL(clicked()), this, SLOT(reject()));
+}
+
+
+KCertExport::~KCertExport() {
+
+}
+
+
+void KCertExport::setCertificate(KSSLCertificate *c) {
+ _c = c;
+}
+
+
+void KCertExport::slotExport() {
+QByteArray cert;
+QString certt;
+
+ if (_filename->text().isEmpty()) return;
+
+ if (!_c) {
+ KMessageBox::sorry(this, i18n("Internal error. Please report to kfm-devel@kde.org."), i18n("SSL"));
+ return;
+ }
+
+ if (_der->isChecked()) {
+ cert = _c->toDer();
+ } else if (_pem->isChecked()) {
+ cert = _c->toPem();
+ } else if (_text->isChecked()) {
+ certt = _c->toText();
+ } else { // netscape
+ cert = _c->toNetscape();
+ }
+
+ if ((!_text->isChecked() && cert.size() <= 0) && certt.isEmpty()) {
+ KMessageBox::error(this, i18n("Error converting the certificate into the requested format."), i18n("SSL"));
+ reject();
+ return;
+ }
+
+ QFile outFile(_filename->text());
+
+ if (!outFile.open(IO_WriteOnly)) {
+ KMessageBox::error(this, i18n("Error opening file for output."), i18n("SSL"));
+ reject();
+ return;
+ }
+
+ if (_text->isChecked())
+ outFile.writeBlock(certt.local8Bit(), certt.length());
+ else outFile.writeBlock(cert);
+
+ outFile.close();
+
+accept();
+}
+
+
+void KCertExport::slotChoose() {
+ //QString newFile = KFileDialog::getSaveFileName("::x509save", i18n("*.pem|Privacy Enhanced Mail Format\n*.der|DER/ASN1 Format"));
+ QString newFile = KFileDialog::getSaveFileName(QString::null, "application/x-x509-ca-cert");
+
+ // Dunno about this one yet
+ // \n*.ncert|Netscape certificate files");
+
+ if (!newFile.isEmpty()) _filename->setText(newFile);
+}
+
+
+void KCertExport::slotTextChanged(const QString& x) {
+ _export->setEnabled(!x.isEmpty());
+}
+
+
+#include "certexport.moc"
+
diff --git a/kcontrol/crypto/certexport.h b/kcontrol/crypto/certexport.h
new file mode 100644
index 000000000..983cf0804
--- /dev/null
+++ b/kcontrol/crypto/certexport.h
@@ -0,0 +1,55 @@
+/**
+ * certexport.h
+ *
+ * Copyright (c) 2001 George Staikos <staikos@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _CERTEXPORT_H
+#define _CERTEXPORT_H
+
+#include <kdialog.h>
+
+class KLineEdit;
+class QRadioButton;
+class QPushButton;
+class KSSLCertificate;
+
+
+class KCertExport : public KDialog
+{
+ Q_OBJECT
+public:
+ KCertExport(QWidget *parent = 0L, const char *name = 0L);
+ virtual ~KCertExport();
+
+ void setCertificate(KSSLCertificate *c);
+
+protected slots:
+ void slotExport();
+ void slotChoose();
+ void slotTextChanged(const QString &);
+
+private:
+ QPushButton *_export, *_cancel, *_choose;
+ QRadioButton *_pem, *_netscape, *_der, *_text;
+ KLineEdit *_filename;
+
+ KSSLCertificate *_c;
+
+};
+
+#endif
diff --git a/kcontrol/crypto/certgen.ui b/kcontrol/crypto/certgen.ui
new file mode 100644
index 000000000..19ee05535
--- /dev/null
+++ b/kcontrol/crypto/certgen.ui
@@ -0,0 +1,513 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>D_GenCert</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>D_GenCert</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>539</width>
+ <height>367</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Certificate Creation Wizard</string>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>70</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="text">
+ <string>Passphrase:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>100</y>
+ <width>90</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Country code:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>130</y>
+ <width>150</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>State or province (in full):</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>T_CertType</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>100</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Certificate type:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel2_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>70</y>
+ <width>120</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Passphrase (verify):</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel5</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>160</y>
+ <width>30</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>City:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel6</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>190</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Organization name:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel7</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>220</y>
+ <width>150</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Organizational unit/group:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel8</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>250</y>
+ <width>170</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Full hostname of the server:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>L_CertType</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>10</y>
+ <width>130</width>
+ <height>21</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LineEdit3</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>100</y>
+ <width>41</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="maxLength">
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel9</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>280</y>
+ <width>111</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Email address:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LineEdit4_2_2_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>220</y>
+ <width>121</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="maxLength">
+ <number>200</number>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LineEdit4_2_2_2_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>250</y>
+ <width>121</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="maxLength">
+ <number>200</number>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LineEdit4_2_2_2_3</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>280</y>
+ <width>121</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="maxLength">
+ <number>200</number>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>E_Passphrase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>40</y>
+ <width>130</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="maxLength">
+ <number>500</number>
+ </property>
+ <property name="echoMode">
+ <enum>Password</enum>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>E_Passphrase_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>70</y>
+ <width>131</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="maxLength">
+ <number>500</number>
+ </property>
+ <property name="echoMode">
+ <enum>Password</enum>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel10</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>310</y>
+ <width>121</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Days valid:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>SpinBox1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>310</y>
+ <width>81</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="maxValue">
+ <number>365</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>365</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel11</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>40</y>
+ <width>60</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Digest:</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>CheckBox1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>10</y>
+ <width>80</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Self sign</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel12</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>70</y>
+ <width>50</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Alias:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LineEdit19</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>380</x>
+ <y>70</y>
+ <width>131</width>
+ <height>22</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LineEdit4_2_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>190</y>
+ <width>121</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="maxLength">
+ <number>200</number>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LineEdit4_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>160</y>
+ <width>121</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="maxLength">
+ <number>200</number>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>ComboBox2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>380</x>
+ <y>40</y>
+ <width>130</width>
+ <height>21</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>CheckBox2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>100</y>
+ <width>161</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Use DSA instead of RSA</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel13</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>130</y>
+ <width>71</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Bit strength:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>ComboBox5</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>400</x>
+ <y>130</y>
+ <width>111</width>
+ <height>21</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LineEdit4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>130</y>
+ <width>121</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="maxLength">
+ <number>200</number>
+ </property>
+ </widget>
+</widget>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/crypto/configure.in.in b/kcontrol/crypto/configure.in.in
new file mode 100644
index 000000000..680e26e0a
--- /dev/null
+++ b/kcontrol/crypto/configure.in.in
@@ -0,0 +1 @@
+KDE_CHECK_SSL
diff --git a/kcontrol/crypto/crypto.cpp b/kcontrol/crypto/crypto.cpp
new file mode 100644
index 000000000..f5c4b0099
--- /dev/null
+++ b/kcontrol/crypto/crypto.cpp
@@ -0,0 +1,2458 @@
+/**
+ * crypto.cpp
+ *
+ * Copyright (c) 2000-2005 George Staikos <staikos@kde.org>
+ * 2000 Carsten Pfeiffer <pfeiffer@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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.
+ */
+
+//
+// Attention. The suck factor on this code is increasing. It's a bit of a
+// hack. </understatement> It might be time to rewrite it soon.
+//
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <stdlib.h>
+#include <pwd.h>
+#include <unistd.h>
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qframe.h>
+#include <qhbuttongroup.h>
+#include <qhgroupbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qregexp.h>
+#include <qvbox.h>
+#include <qvbuttongroup.h>
+#include <qvgroupbox.h>
+#include <qwhatsthis.h>
+
+#include <kaboutdata.h>
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kdatepicker.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kfiledialog.h>
+#include <kgenericfactory.h>
+#include <kglobal.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kmdcodec.h>
+#include <kmessagebox.h>
+#include <kpassdlg.h>
+#include <kprocess.h>
+#include <kpushbutton.h>
+#include <kresolver.h>
+#include <kseparator.h>
+#include <kstandarddirs.h>
+#include <kurllabel.h>
+#include <kurlrequester.h>
+
+#include <config.h>
+#ifdef HAVE_SSL
+#define crypt _openssl_crypt
+#include <openssl/ssl.h>
+#include <openssl/x509.h>
+#include <openssl/x509v3.h>
+#include <openssl/pem.h>
+#include <openssl/rand.h>
+#include <openssl/err.h>
+#include <openssl/stack.h>
+#include <openssl/safestack.h>
+#undef crypt
+#endif
+
+#include <ksslall.h>
+#include <kopenssl.h>
+
+#include "crypto.h"
+#include "certexport.h"
+#include "kdatetimedlg.h"
+
+using namespace KNetwork;
+
+typedef KGenericFactory<KCryptoConfig, QWidget> KryptoFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_crypto, KryptoFactory("kcmcrypto") )
+
+CipherItem::CipherItem( QListView *view, const QString& cipher, int bits,
+ int maxBits, KCryptoConfig *module )
+ : QCheckListItem( view, QString::null, CheckBox )
+{
+ m_cipher = cipher;
+ m_bits = bits;
+ m_module = module;
+
+ QString tmp( i18n("%1 (%2 of %3 bits)") );
+ setText( 0, tmp.arg( cipher ).arg( bits ).arg( maxBits ));
+}
+
+void CipherItem::stateChange( bool )
+{
+ m_module->configChanged();
+}
+
+QString CipherItem::configName() const
+{
+ QString cipherName("cipher_%1");
+ return cipherName.arg( m_cipher );
+}
+
+
+
+OtherCertItem::OtherCertItem( QListView *view, const QString& sub, const QString& md5, bool perm, int policy, QDateTime exp, KCryptoConfig *module )
+ : QListViewItem( view, QString::null ), _sub(sub), _md5(md5), _exp(exp), _perm(perm), _policy(policy)
+
+{
+ m_module = module;
+KSSLX509Map cert(sub);
+ setText(0, cert.getValue("O"));
+ setText(1, cert.getValue("CN").replace("\n", ", "));
+
+ if (_exp.date().year() > 3000 || _exp.date().year() < 1900)
+ _exp.setDate(QDate(3000,1,1));
+}
+
+void OtherCertItem::stateChange( bool )
+{
+ m_module->configChanged();
+}
+
+QString OtherCertItem::configName() const
+{
+ return _sub;
+}
+
+
+YourCertItem::YourCertItem( QListView *view, QString pkcs, QString pass, QString name, KCryptoConfig *module )
+ : QListViewItem( view, QString::null )
+
+{
+ m_module = module;
+KSSLX509Map cert(name);
+ QString tmp = cert.getValue("CN").replace("\n", ", ");
+ setText(0, tmp);
+ setText(1, cert.getValue("Email"));
+ _pkcs = pkcs;
+ _name = name;
+ _pass = pass;
+}
+
+void YourCertItem::stateChange( bool )
+{
+ m_module->configChanged();
+}
+
+QString YourCertItem::configName() const
+{
+ return _name;
+}
+
+
+
+CAItem::CAItem( QListView *view, QString name, QString cert, bool site, bool email, bool code, KCryptoConfig *module )
+ : QListViewItem( view, QString::null )
+
+{
+ m_module = module;
+KSSLX509Map mcert(name);
+QString tmp;
+ setText(0, mcert.getValue("O"));
+ tmp = mcert.getValue("OU");
+ tmp.replace("\n", ", ");
+ setText(1, tmp);
+ tmp = mcert.getValue("CN");
+ tmp.replace("\n", ", ");
+ setText(2, tmp);
+ _name = name;
+ _cert = cert;
+ _site = site;
+ _email = email;
+ _code = code;
+ isNew = false;
+ modified = false;
+}
+
+void CAItem::stateChange( bool )
+{
+ m_module->configChanged();
+}
+
+QString CAItem::configName() const
+{
+ return _name;
+}
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+
+
+
+KCryptoConfig::KCryptoConfig(QWidget *parent, const char *name, const QStringList &)
+ : KCModule(KryptoFactory::instance(), parent, name)
+{
+QGridLayout *grid;
+QBoxLayout *top = new QVBoxLayout(this);
+QString whatstr;
+
+ setQuickHelp( i18n("<h1>Crypto</h1> This module allows you to configure SSL for"
+ " use with most KDE applications, as well as manage your personal"
+ " certificates and the known certificate authorities."));
+
+ ___lehack = false;
+ otherCertDelList.setAutoDelete(true);
+ yourCertDelList.setAutoDelete(true);
+ authDelList.setAutoDelete(true);
+ caDelList.setAutoDelete(true);
+
+ _signers = new KSSLSigners;
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmcrypto"), I18N_NOOP("KDE Crypto Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2000 - 2001 George Staikos"));
+ about->addAuthor("George Staikos", 0, "staikos@kde.org");
+ about->addAuthor("Carsten Pfeiffer", 0, "pfeiffer@kde.org");
+ setAboutData( about );
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Create the GUI here - there are currently a total of 6 tabs.
+ // The first is SSL and cipher related
+ // The second is OpenSSL settings
+ // The third is user's SSL certificate related
+ // The fourth is certificate authentication related
+ // The fifth is other SSL certificate related
+ // The sixth is CA related
+ // The seventh is misc. settings related (unimplemented)
+ // The eighth is peer [email] certificate related (unimplemented)
+ ///////////////////////////////////////////////////////////////////////////
+
+ tabs = new QTabWidget(this);
+ top->addWidget(tabs);
+
+ ///////////////////////////////////////////////////////////////////////////
+ // FIRST TAB
+ ///////////////////////////////////////////////////////////////////////////
+ tabSSL = new QFrame(this);
+ grid = new QGridLayout(tabSSL, 7, 2, KDialog::marginHint(),
+ KDialog::spacingHint() );
+ mUseTLS = new QCheckBox(i18n("Enable &TLS support if supported by the server"), tabSSL);
+ connect(mUseTLS, SIGNAL(clicked()), SLOT(configChanged()));
+ grid->addWidget(mUseTLS, 0, 0);
+ whatstr = i18n("TLS is the newest revision of the SSL protocol."
+ " It integrates better with other protocols and has"
+ " replaced SSL in protocols such as POP3 and SMTP.");
+ QWhatsThis::add(mUseTLS, whatstr);
+
+ mUseSSLv2 = new QCheckBox(i18n("Enable SSLv&2"), tabSSL);
+ connect(mUseSSLv2, SIGNAL(clicked()), SLOT(configChanged()));
+ grid->addWidget(mUseSSLv2, 1, 0);
+ whatstr = i18n("SSL v2 is the second revision of the SSL protocol."
+ " It is most common to enable v2 and v3.");
+ QWhatsThis::add(mUseSSLv2, whatstr);
+
+ mUseSSLv3 = new QCheckBox(i18n("Enable SSLv&3"), tabSSL);
+ connect(mUseSSLv3, SIGNAL(clicked()), SLOT(configChanged()));
+ grid->addWidget(mUseSSLv3, 1, 1);
+ whatstr = i18n("SSL v3 is the third revision of the SSL protocol."
+ " It is most common to enable v2 and v3.");
+ QWhatsThis::add(mUseSSLv3, whatstr);
+
+#ifdef HAVE_SSL
+ SSLv2Box = new QListView(tabSSL, "v2ciphers");
+ (void) SSLv2Box->addColumn(i18n("SSLv2 Ciphers to Use"));
+ whatstr = i18n("Select the ciphers you wish to enable when using the"
+ " SSL v2 protocol. The actual protocol used will be"
+ " negotiated with the server at connection time.");
+ QWhatsThis::add(SSLv2Box, whatstr);
+ SSLv2Box->setSelectionMode(QListView::NoSelection);
+
+ grid->addWidget( SSLv2Box, 2, 0 );
+ connect( mUseSSLv2, SIGNAL( toggled( bool ) ),
+ SSLv2Box, SLOT( setEnabled( bool )));
+#else
+ QLabel *nossllabel = new QLabel(i18n("SSL ciphers cannot be configured"
+ " because this module was not linked"
+ " with OpenSSL."), tabSSL);
+ grid->addMultiCellWidget(nossllabel, 2, 2, 0, 1);
+ grid->addRowSpacing( 3, 100 ); // give minimum height to look better
+#endif
+
+ // no need to parse kdeglobals.
+ config = new KConfig("cryptodefaults", false, false);
+ policies = new KSimpleConfig("ksslpolicies", false);
+ pcerts = new KSimpleConfig("ksslcertificates", false);
+ authcfg = new KSimpleConfig("ksslauthmap", false);
+
+#ifdef HAVE_SSL
+ SSLv3Box = new QListView(tabSSL, "v3ciphers");
+ (void) SSLv3Box->addColumn(i18n("SSLv3 Ciphers to Use"));
+ whatstr = i18n("Select the ciphers you wish to enable when using the"
+ " SSL v3 protocol. The actual protocol used will be"
+ " negotiated with the server at connection time.");
+ QWhatsThis::add(SSLv3Box, whatstr);
+ SSLv3Box->setSelectionMode(QListView::NoSelection);
+ grid->addWidget(SSLv3Box, 2, 1);
+ connect( mUseSSLv3, SIGNAL( toggled( bool ) ),
+ SSLv3Box, SLOT( setEnabled( bool )));
+
+ loadCiphers();
+
+ //
+ // CipherWizards
+ //
+ QHGroupBox *cwbg = new QHGroupBox(i18n("Cipher Wizard"), tabSSL);
+ QComboBox *cwcb = new QComboBox(cwbg);
+ grid->addMultiCellWidget(cwbg, 3, 3, 0, 1);
+ QString whatStr = i18n("<qt>Use these preconfigurations to more easily configure the SSL encryption settings. You can choose among the following modes: <ul>");
+
+ cwcb->insertItem(QString::null);
+ cwcb->insertItem(i18n("Most Compatible"));
+ whatStr += i18n("<li><b>Most Compatible:</b> Select the settings found to be most compatible.</li>");
+ cwcb->insertItem(i18n("US Ciphers Only"));
+ whatStr += i18n("<li><b>US Ciphers Only:</b> Select only the US strong (&gt;= 128 bit) encryption ciphers.</li>");
+ cwcb->insertItem(i18n("Export Ciphers Only"));
+ whatStr += i18n("<li><b>Export Ciphers Only:</b> Select only the weak ciphers (&lt;= 56 bit).</li>");
+ cwcb->insertItem(i18n("Enable All"));
+ whatStr += i18n("<li><b>Enable All:</b> Select all SSL ciphers and methods.</li></ul>");
+
+ QWhatsThis::add(cwcb, whatStr);
+
+ connect(cwcb, SIGNAL(activated(int)), SLOT(slotSelectCipher(int)));
+
+
+
+
+#endif
+
+ mWarnOnEnter = new QCheckBox(i18n("Warn on &entering SSL mode"), tabSSL);
+ connect(mWarnOnEnter, SIGNAL(clicked()), SLOT(configChanged()));
+ grid->addWidget(mWarnOnEnter, 5, 0);
+ whatstr = i18n("If selected, you will be notified when entering an SSL"
+ " enabled site");
+ QWhatsThis::add(mWarnOnEnter, whatstr);
+
+ mWarnOnLeave = new QCheckBox(i18n("Warn on &leaving SSL mode"), tabSSL);
+ connect(mWarnOnLeave, SIGNAL(clicked()), SLOT(configChanged()));
+ grid->addWidget(mWarnOnLeave, 5, 1);
+ whatstr = i18n("If selected, you will be notified when leaving an SSL"
+ " based site.");
+ QWhatsThis::add(mWarnOnLeave, whatstr);
+
+ mWarnOnUnencrypted = new QCheckBox(i18n("Warn on sending &unencrypted data"), tabSSL);
+ connect(mWarnOnUnencrypted, SIGNAL(clicked()), SLOT(configChanged()));
+ grid->addWidget(mWarnOnUnencrypted, 6, 0);
+ whatstr = i18n("If selected, you will be notified before sending"
+ " unencrypted data via a web browser.");
+ QWhatsThis::add(mWarnOnUnencrypted, whatstr);
+
+#if 0 // NOT IMPLEMENTED IN KDE 3.0
+ mWarnOnMixed = new QCheckBox(i18n("Warn on &mixed SSL/non-SSL pages"), tabSSL);
+ connect(mWarnOnMixed, SIGNAL(clicked()), SLOT(configChanged()));
+ grid->addWidget(mWarnOnMixed, 6, 1);
+ whatstr = i18n("If selected, you will be notified if you view a page"
+ " that has both encrypted and non-encrypted parts.");
+ QWhatsThis::add(mWarnOnMixed, whatstr);
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // SECOND TAB
+ ///////////////////////////////////////////////////////////////////////////
+
+#ifdef HAVE_SSL
+ tabOSSL = new QFrame(this);
+ QBoxLayout *vbox = new QVBoxLayout(tabOSSL, KDialog::marginHint(), KDialog::spacingHint());
+
+ oInfo = new QVGroupBox(i18n("Path to OpenSSL Shared Libraries"), tabOSSL);
+ vbox->addWidget(oInfo);
+ oPath = new KURLRequester(oInfo);
+ oPath->setMode(KFile::Directory);
+ oTest = new QPushButton(i18n("&Test"), oInfo);
+ connect(oTest, SIGNAL(clicked()), SLOT(slotTestOSSL()));
+
+ connect(oPath, SIGNAL(textChanged(const QString&)), SLOT(configChanged()));
+
+ //
+ // Settings for the EGD
+ //
+ QFrame *eFrame = new QFrame(tabOSSL);
+ QVBoxLayout *egrid = new QVBoxLayout(eFrame);
+ mUseEGD = new QCheckBox(i18n("Use EGD"), eFrame);
+ connect(mUseEGD, SIGNAL(clicked()), SLOT(slotUseEGD()));
+ mUseEFile = new QCheckBox(i18n("Use entropy file"), eFrame);
+ connect(mUseEFile, SIGNAL(clicked()), SLOT(slotUseEFile()));
+ vbox->addWidget(eFrame);
+ egrid->addWidget(mUseEGD);
+ egrid->addWidget(mUseEFile);
+ QFrame *egdframe = new QFrame(tabOSSL);
+ QGridLayout *grid2 = new QGridLayout(egdframe, 2, 2, KDialog::marginHint(),
+ KDialog::spacingHint());
+ mEGDLabel = new QLabel(i18n("Path to EGD:"), egdframe);
+ grid2->addWidget(mEGDLabel, 0, 0);
+ mEGDPath = new KURLRequester(egdframe);
+ grid2->addWidget(mEGDPath, 0, 1);
+ connect(mEGDPath, SIGNAL(textChanged(const QString&)), SLOT(configChanged()));
+ vbox->addWidget(egdframe);
+ whatstr = i18n("If selected, OpenSSL will be asked to use the entropy gathering"
+ " daemon (EGD) for initializing the pseudo-random number generator.");
+ QWhatsThis::add(mUseEGD, whatstr);
+ whatstr = i18n("If selected, OpenSSL will be asked to use the given file"
+ " as entropy for initializing the pseudo-random number generator.");
+ QWhatsThis::add(mUseEFile, whatstr);
+ whatstr = i18n("Enter the path to the socket created by the entropy gathering"
+ " daemon (or the entropy file) here.");
+ QWhatsThis::add(mEGDPath, whatstr);
+ whatstr = i18n("Click here to browse for the EGD socket file.");
+ QWhatsThis::add(mEGDPath, whatstr);
+
+ vbox->addStretch();
+#endif
+
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // THIRD TAB
+ ///////////////////////////////////////////////////////////////////////////
+ tabYourSSLCert = new QFrame(this);
+
+#ifdef HAVE_SSL
+ grid = new QGridLayout(tabYourSSLCert, 16, 6, KDialog::marginHint(), KDialog::spacingHint() );
+
+ yourSSLBox = new QListView(tabYourSSLCert);
+ yourSSLBox->setAllColumnsShowFocus(true);
+ whatstr = i18n("This list box shows which certificates of yours KDE"
+ " knows about. You can easily manage them from here.");
+ QWhatsThis::add(yourSSLBox, whatstr);
+ grid->addMultiCellWidget(yourSSLBox, 0, 5, 0, 4);
+ yourSSLBox->addColumn(i18n("Common Name"));
+ yourSSLBox->addColumn(i18n("Email Address"));
+ connect(yourSSLBox, SIGNAL(selectionChanged()), SLOT(slotYourCertSelect()));
+
+ yourSSLImport = new QPushButton(i18n("I&mport..."), tabYourSSLCert);
+ connect(yourSSLImport, SIGNAL(clicked()), SLOT(slotYourImport()));
+ grid->addWidget(yourSSLImport, 0, 5);
+
+ yourSSLExport = new QPushButton(i18n("&Export..."), tabYourSSLCert);
+ yourSSLExport->setEnabled(false);
+ connect(yourSSLExport, SIGNAL(clicked()), SLOT(slotYourExport()));
+ grid->addWidget(yourSSLExport, 1, 5);
+
+ yourSSLRemove = new QPushButton(i18n("Remo&ve"), tabYourSSLCert);
+ yourSSLRemove->setEnabled(false);
+ connect(yourSSLRemove, SIGNAL(clicked()), SLOT(slotYourRemove()));
+ grid->addWidget(yourSSLRemove, 2, 5);
+
+ yourSSLUnlock = new QPushButton(i18n("&Unlock"), tabYourSSLCert);
+ yourSSLUnlock->setEnabled(false);
+ connect(yourSSLUnlock, SIGNAL(clicked()), SLOT(slotYourUnlock()));
+ grid->addWidget(yourSSLUnlock, 3, 5);
+
+ yourSSLVerify = new QPushButton(i18n("Verif&y"), tabYourSSLCert);
+ yourSSLVerify->setEnabled(false);
+ connect(yourSSLVerify, SIGNAL(clicked()), SLOT(slotYourVerify()));
+ grid->addWidget(yourSSLVerify, 4, 5);
+
+ yourSSLPass = new QPushButton(i18n("Chan&ge Password..."), tabYourSSLCert);
+ yourSSLPass->setEnabled(false);
+ connect(yourSSLPass, SIGNAL(clicked()), SLOT(slotYourPass()));
+ grid->addWidget(yourSSLPass, 5, 5);
+
+ grid->addMultiCellWidget(new KSeparator(KSeparator::HLine, tabYourSSLCert), 6, 6, 0, 5);
+ ySubject = KSSLInfoDlg::certInfoWidget(tabYourSSLCert, QString(QString::null));
+ yIssuer = KSSLInfoDlg::certInfoWidget(tabYourSSLCert, QString(QString::null));
+ grid->addMultiCellWidget(ySubject, 7, 11, 0, 2);
+ grid->addMultiCellWidget(yIssuer, 7, 11, 3, 5);
+ whatstr = i18n("This is the information known about the owner of the certificate.");
+ QWhatsThis::add(ySubject, whatstr);
+ whatstr = i18n("This is the information known about the issuer of the certificate.");
+ QWhatsThis::add(yIssuer, whatstr);
+
+ grid->addWidget(new QLabel(i18n("Valid from:"), tabYourSSLCert), 12, 0);
+ grid->addWidget(new QLabel(i18n("Valid until:"), tabYourSSLCert), 13, 0);
+ yValidFrom = new QLabel(tabYourSSLCert);
+ grid->addWidget(yValidFrom, 12, 1);
+ yValidUntil = new QLabel(tabYourSSLCert);
+ grid->addWidget(yValidUntil, 13, 1);
+ whatstr = i18n("The certificate is valid starting at this date.");
+ QWhatsThis::add(yValidFrom, whatstr);
+ whatstr = i18n("The certificate is valid until this date.");
+ QWhatsThis::add(yValidUntil, whatstr);
+ grid->addWidget(new QLabel(i18n("MD5 digest:"), tabYourSSLCert), 14, 0);
+ yHash = new QLabel(tabYourSSLCert);
+ grid->addWidget(yHash, 14, 1);
+ whatstr = i18n("A hash of the certificate used to identify it quickly.");
+ QWhatsThis::add(yHash, whatstr);
+
+#if 0
+ QHButtonGroup *ocbg = new QHButtonGroup(i18n("On SSL Connection..."), tabYourSSLCert);
+ yourSSLUseDefault = new QRadioButton(i18n("&Use default certificate"), ocbg);
+ yourSSLList = new QRadioButton(i18n("&List upon connection"), ocbg);
+ yourSSLDont = new QRadioButton(i18n("&Do not use certificates"), ocbg);
+ grid->addMultiCellWidget(ocbg, 14, 14, 0, 5);
+#endif
+#else
+ nossllabel = new QLabel(i18n("SSL certificates cannot be managed"
+ " because this module was not linked"
+ " with OpenSSL."), tabYourSSLCert);
+ grid->addMultiCellWidget(nossllabel, 3, 3, 0, 5);
+#endif
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // FOURTH TAB
+ ///////////////////////////////////////////////////////////////////////////
+ tabAuth = new QFrame(this);
+
+#ifdef HAVE_SSL
+ grid = new QGridLayout(tabAuth, 20, 6, KDialog::marginHint(), KDialog::spacingHint());
+
+ grid->addMultiCellWidget(new QLabel(i18n("Default Authentication Certificate"), tabAuth), 0, 0, 0, 2);
+ defCertBG = new QVButtonGroup(i18n("Default Action"), tabAuth);
+ defSend = new QRadioButton(i18n("&Send"), defCertBG);
+ defPrompt = new QRadioButton(i18n("&Prompt"), defCertBG);
+ defDont = new QRadioButton(i18n("Do &not send"), defCertBG);
+ grid->addMultiCellWidget(defCertBG, 1, 3, 0, 2);
+ grid->addMultiCellWidget(new QLabel(i18n("Default certificate:"), tabAuth), 1, 1, 3, 5);
+ defCertBox = new KComboBox(false, tabAuth);
+ grid->addMultiCellWidget(defCertBox, 2, 2, 3, 5);
+
+ grid->addMultiCellWidget(new KSeparator(KSeparator::HLine, tabAuth), 4, 4, 0, 5);
+
+
+ grid->addMultiCellWidget(new QLabel(i18n("Host authentication:"), tabAuth), 5, 5, 0, 1);
+ hostAuthList = new QListView(tabAuth);
+ hostAuthList->setAllColumnsShowFocus(true);
+ grid->addMultiCellWidget(hostAuthList, 6, 13, 0, 5);
+ hostAuthList->addColumn(i18n("Host"));
+ hostAuthList->addColumn(i18n("Certificate"));
+ hostAuthList->addColumn(i18n("Policy"));
+
+ grid->addWidget(new QLabel(i18n("Host:"), tabAuth), 14, 0);
+ grid->addWidget(new QLabel(i18n("Certificate:"), tabAuth), 15, 0);
+
+ authHost = new QLineEdit(tabAuth);
+ grid->addMultiCellWidget(authHost, 14, 14, 1, 4);
+ hostCertBox = new KComboBox(false, tabAuth);
+ grid->addMultiCellWidget(hostCertBox, 15, 15, 1, 4);
+
+ hostCertBG = new QHButtonGroup(i18n("Action"), tabAuth);
+ hostSend = new QRadioButton(i18n("Send"), hostCertBG);
+ hostPrompt = new QRadioButton(i18n("Prompt"), hostCertBG);
+ hostDont = new QRadioButton(i18n("Do not send"), hostCertBG);
+ grid->addMultiCellWidget(hostCertBG, 16, 16, 0, 5);
+
+ authAdd = new QPushButton(i18n("Ne&w"), tabAuth);
+ authRemove = new QPushButton(i18n("Remo&ve"), tabAuth);
+ grid->addWidget(authAdd, 17, 4);
+ grid->addWidget(authRemove, 17, 5);
+
+ authHost->setEnabled(false);
+ hostCertBox->setEnabled(false);
+ hostCertBG->setEnabled(false);
+ authRemove->setEnabled(false);
+
+ connect(defCertBox, SIGNAL(activated(int)), this, SLOT(configChanged()));
+ connect(defCertBG, SIGNAL(clicked(int)), this, SLOT(configChanged()));
+ connect(hostAuthList, SIGNAL(selectionChanged()), this, SLOT(slotAuthItemChanged()));
+ connect(authAdd, SIGNAL(clicked()), this, SLOT(slotNewHostAuth()));
+ connect(authRemove, SIGNAL(clicked()), this, SLOT(slotRemoveHostAuth()));
+ connect(authHost, SIGNAL(textChanged(const QString &)), this, SLOT(slotAuthText(const QString &)));
+ connect(hostCertBG, SIGNAL(clicked(int)), this, SLOT(slotAuthButtons()));
+ connect(hostCertBox, SIGNAL(activated(int)), this, SLOT(slotAuthCombo()));
+
+#else
+ nossllabel = new QLabel(i18n("SSL certificates cannot be managed"
+ " because this module was not linked"
+ " with OpenSSL."), tabAuth);
+ grid->addMultiCellWidget(nossllabel, 3, 3, 0, 5);
+#endif
+
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // FIFTH TAB
+ ///////////////////////////////////////////////////////////////////////////
+ tabOtherSSLCert = new QFrame(this);
+
+#ifdef HAVE_SSL
+ oGrid = grid = new QGridLayout(tabOtherSSLCert, 21, 6, KDialog::marginHint(), KDialog::spacingHint());
+
+ otherSSLBox = new QListView(tabOtherSSLCert);
+ otherSSLBox->setAllColumnsShowFocus(true);
+ connect(otherSSLBox, SIGNAL(selectionChanged()), SLOT(slotOtherCertSelect()));
+ whatstr = i18n("This list box shows which site and person certificates KDE"
+ " knows about. You can easily manage them from here.");
+ QWhatsThis::add(otherSSLBox, whatstr);
+ otherSSLBox->addColumn(i18n("Organization"));
+ otherSSLBox->addColumn(i18n("Common Name"));
+ grid->addMultiCellWidget(otherSSLBox, 0, 7, 0, 4);
+
+ otherSSLExport = new QPushButton(i18n("&Export..."), tabOtherSSLCert);
+ connect(otherSSLExport, SIGNAL(clicked()), SLOT(slotExportCert()));
+ grid->addWidget(otherSSLExport, 0, 5);
+ whatstr = i18n("This button allows you to export the selected certificate"
+ " to a file of various formats.");
+ QWhatsThis::add(otherSSLExport, whatstr);
+
+ otherSSLRemove = new QPushButton(i18n("&Remove"), tabOtherSSLCert);
+ connect(otherSSLRemove, SIGNAL(clicked()), SLOT(slotRemoveCert()));
+ grid->addWidget(otherSSLRemove, 1, 5);
+ whatstr = i18n("This button removes the selected certificate"
+ " from the certificate cache.");
+ QWhatsThis::add(otherSSLRemove, whatstr);
+
+ otherSSLVerify = new QPushButton(i18n("&Verify"), tabOtherSSLCert);
+ connect(otherSSLVerify, SIGNAL(clicked()), SLOT(slotVerifyCert()));
+ grid->addWidget(otherSSLVerify, 2, 5);
+ whatstr = i18n("This button tests the selected certificate"
+ " for validity.");
+ QWhatsThis::add(otherSSLVerify, whatstr);
+
+ otherSSLExport->setEnabled(false);
+ otherSSLVerify->setEnabled(false);
+ otherSSLRemove->setEnabled(false);
+
+ grid->addMultiCellWidget(new KSeparator(KSeparator::HLine, tabOtherSSLCert), 8, 8, 0, 5);
+ oSubject = KSSLInfoDlg::certInfoWidget(tabOtherSSLCert, QString(QString::null));
+ oIssuer = KSSLInfoDlg::certInfoWidget(tabOtherSSLCert, QString(QString::null));
+ grid->addMultiCellWidget(oSubject, 9, 13, 0, 2);
+ grid->addMultiCellWidget(oIssuer, 9, 13, 3, 5);
+ whatstr = i18n("This is the information known about the owner of the certificate.");
+ QWhatsThis::add(oSubject, whatstr);
+ whatstr = i18n("This is the information known about the issuer of the certificate.");
+ QWhatsThis::add(oIssuer, whatstr);
+
+ fromLabel = new QLabel(i18n("Valid from:"), tabOtherSSLCert);
+ untilLabel = new QLabel(i18n("Valid until:"), tabOtherSSLCert);
+ grid->addWidget(fromLabel, 14, 0);
+ grid->addWidget(untilLabel, 15, 0);
+ fromLabel->setEnabled(false);
+ untilLabel->setEnabled(false);
+ validFrom = new QLabel(tabOtherSSLCert);
+ grid->addWidget(validFrom, 14, 1);
+ validUntil = new QLabel(tabOtherSSLCert);
+ grid->addWidget(validUntil, 15, 1);
+ whatstr = i18n("The certificate is valid starting at this date.");
+ QWhatsThis::add(validFrom, whatstr);
+ whatstr = i18n("The certificate is valid until this date.");
+ QWhatsThis::add(validUntil, whatstr);
+
+ cacheGroup = new QVButtonGroup(i18n("Cache"), tabOtherSSLCert);
+ cachePerm = new QRadioButton(i18n("Permanentl&y"), cacheGroup);
+ cacheUntil = new QRadioButton(i18n("&Until"), cacheGroup);
+ untilDate = new KURLLabel(QString::null, QString::null, cacheGroup);
+ cacheGroup->setEnabled(false);
+ grid->addMultiCellWidget(cacheGroup, 16, 19, 0, 2);
+
+ cachePerm->setEnabled(false);
+ cacheUntil->setEnabled(false);
+ untilDate->setEnabled(false);
+ connect(cachePerm, SIGNAL(clicked()), SLOT(slotPermanent()));
+ connect(cacheUntil, SIGNAL(clicked()), SLOT(slotUntil()));
+ connect(untilDate, SIGNAL(leftClickedURL()), SLOT(slotDatePick()));
+ whatstr = i18n("Select here to make the cache entry permanent.");
+ QWhatsThis::add(cachePerm, whatstr);
+ whatstr = i18n("Select here to make the cache entry temporary.");
+ QWhatsThis::add(cacheUntil, whatstr);
+ whatstr = i18n("The date and time until the certificate cache entry should expire.");
+ QWhatsThis::add(untilDate, whatstr);
+
+ policyGroup = new QVButtonGroup(i18n("Policy"), tabOtherSSLCert);
+ policyAccept = new QRadioButton(i18n("Accep&t"), policyGroup);
+ policyReject = new QRadioButton(i18n("Re&ject"), policyGroup);
+ policyPrompt = new QRadioButton(i18n("&Prompt"), policyGroup);
+ policyGroup->setEnabled(false);
+ grid->addMultiCellWidget(policyGroup, 16, 19, 3, 5);
+ connect(policyGroup, SIGNAL(clicked(int)), SLOT(slotPolicyChanged(int)));
+ whatstr = i18n("Select this to always accept this certificate.");
+ QWhatsThis::add(policyAccept, whatstr);
+ whatstr = i18n("Select this to always reject this certificate.");
+ QWhatsThis::add(policyReject, whatstr);
+ whatstr = i18n("Select this if you wish to be prompted for action when receiving this certificate.");
+ QWhatsThis::add(policyPrompt, whatstr);
+ grid->addWidget(new QLabel(i18n("MD5 digest:"), tabOtherSSLCert), 20, 0);
+ pHash = new QLabel(tabOtherSSLCert);
+ grid->addWidget(pHash, 20, 1);
+ whatstr = i18n("A hash of the certificate used to identify it quickly.");
+ QWhatsThis::add(pHash, whatstr);
+
+#else
+ nossllabel = new QLabel(i18n("SSL certificates cannot be managed"
+ " because this module was not linked"
+ " with OpenSSL."), tabOtherSSLCert);
+ grid->addMultiCellWidget(nossllabel, 1, 1, 0, 1);
+#endif
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // SIXTH TAB
+ ///////////////////////////////////////////////////////////////////////////
+ tabSSLCA = new QFrame(this);
+
+#ifdef HAVE_SSL
+ grid = new QGridLayout(tabSSLCA, 11, 8, KDialog::marginHint(), KDialog::spacingHint());
+
+ caList = new QListView(tabSSLCA);
+ caList->setAllColumnsShowFocus(true);
+ whatstr = i18n("This list box shows which certificate authorities KDE"
+ " knows about. You can easily manage them from here.");
+ QWhatsThis::add(caList, whatstr);
+ grid->addMultiCellWidget(caList, 0, 3, 0, 6);
+ caList->addColumn(i18n("Organization"));
+ caList->addColumn(i18n("Organizational Unit"));
+ caList->addColumn(i18n("Common Name"));
+ connect(caList, SIGNAL(selectionChanged()), SLOT(slotCAItemChanged()));
+
+ caSSLImport = new QPushButton(i18n("I&mport..."), tabSSLCA);
+ connect(caSSLImport, SIGNAL(clicked()), SLOT(slotCAImport()));
+ grid->addWidget(caSSLImport, 0, 7);
+
+ caSSLRemove = new QPushButton(i18n("&Remove"), tabSSLCA);
+ connect(caSSLRemove, SIGNAL(clicked()), SLOT(slotCARemove()));
+ grid->addWidget(caSSLRemove, 1, 7);
+ caSSLRemove->setEnabled(false);
+
+ caSSLRestore = new QPushButton(i18n("Res&tore"), tabSSLCA);
+ connect(caSSLRestore, SIGNAL(clicked()), SLOT(slotCARestore()));
+ grid->addWidget(caSSLRestore, 2, 7);
+
+ caSubject = KSSLInfoDlg::certInfoWidget(tabSSLCA, QString(QString::null));
+ caIssuer = KSSLInfoDlg::certInfoWidget(tabSSLCA, QString(QString::null));
+ grid->addMultiCellWidget(caSubject, 4, 6, 0, 3);
+ grid->addMultiCellWidget(caIssuer, 4, 6, 4, 7);
+
+ // Accept for Web Site Signing, Email Signing, Code Signing
+ caSite = new QCheckBox(i18n("Accept for site signing"), tabSSLCA);
+ caEmail = new QCheckBox(i18n("Accept for email signing"), tabSSLCA);
+ caCode = new QCheckBox(i18n("Accept for code signing"), tabSSLCA);
+ grid->addMultiCellWidget(caSite, 7, 7, 0, 3);
+ connect(caSite, SIGNAL(clicked()), SLOT(slotCAChecked()));
+ grid->addMultiCellWidget(caEmail, 8, 8, 0, 3);
+ connect(caEmail, SIGNAL(clicked()), SLOT(slotCAChecked()));
+ grid->addMultiCellWidget(caCode, 9, 9, 0, 3);
+ connect(caCode, SIGNAL(clicked()), SLOT(slotCAChecked()));
+ caSite->setEnabled(false);
+ caEmail->setEnabled(false);
+ caCode->setEnabled(false);
+ grid->addWidget(new QLabel(i18n("MD5 digest:"), tabSSLCA), 10, 0);
+ cHash = new QLabel(tabSSLCA);
+ grid->addWidget(cHash, 10, 1);
+ whatstr = i18n("A hash of the certificate used to identify it quickly.");
+ QWhatsThis::add(cHash, whatstr);
+
+#else
+ nossllabel = new QLabel(i18n("SSL certificates cannot be managed"
+ " because this module was not linked"
+ " with OpenSSL."), tabSSLCA);
+ grid->addMultiCellWidget(nossllabel, 1, 1, 0, 1);
+#endif
+
+
+#if 0
+ ///////////////////////////////////////////////////////////////////////////
+ // SEVENTH TAB
+ ///////////////////////////////////////////////////////////////////////////
+ tabSSLCOpts = new QFrame(this);
+
+#ifdef HAVE_SSL
+ grid = new QGridLayout(tabSSLCOpts, 9, 4, KDialog::marginHint(), KDialog::spacingHint());
+ mWarnSelfSigned = new QCheckBox(i18n("Warn on &self-signed certificates or unknown CA's"), tabSSLCOpts);
+ connect(mWarnSelfSigned, SIGNAL(clicked()), SLOT(configChanged()));
+ mWarnExpired = new QCheckBox(i18n("Warn on &expired certificates"), tabSSLCOpts);
+ connect(mWarnExpired, SIGNAL(clicked()), SLOT(configChanged()));
+ mWarnRevoked = new QCheckBox(i18n("Warn on re&voked certificates"), tabSSLCOpts);
+ connect(mWarnRevoked, SIGNAL(clicked()), SLOT(configChanged()));
+ grid->addMultiCellWidget(mWarnSelfSigned, 0, 0, 0, 3);
+ grid->addMultiCellWidget(mWarnExpired, 1, 1, 0, 3);
+ grid->addMultiCellWidget(mWarnRevoked, 2, 2, 0, 3);
+
+ macCert = new QLineEdit(tabSSLCOpts);
+ grid->addMultiCellWidget(macCert, 4, 4, 0, 2);
+
+ macBox = new QListBox(tabSSLCOpts);
+ whatstr = i18n("This list box shows which sites you have decided to accept"
+ " a certificate from even though the certificate might fail"
+ " the validation procedure.");
+ QWhatsThis::add(macBox, whatstr);
+ caSSLBox->setSelectionMode(QListBox::Single);
+ caSSLBox->setColumnMode(QListBox::FixedNumber);
+ grid->addMultiCellWidget(macBox, 5, 8, 0, 2);
+
+ macAdd = new QPushButton(i18n("&Add"), tabSSLCOpts);
+ //connect(macAdd, SIGNAL(), SLOT());
+ grid->addWidget(macAdd, 4, 3);
+
+ macRemove = new QPushButton(i18n("&Remove"), tabSSLCOpts);
+ //connect(macRemove, SIGNAL(), SLOT());
+ grid->addWidget(macRemove, 5, 3);
+
+ macClear = new KPushButton(KGuiItem::clear(), tabSSLCOpts);
+ //connect(macAdd, SIGNAL(), SLOT());
+ grid->addWidget(macClear, 6, 3);
+
+#else
+ nossllabel = new QLabel(i18n("These options are not configurable"
+ " because this module was not linked"
+ " with OpenSSL."), tabSSLCOpts);
+ grid->addMultiCellWidget(nossllabel, 1, 1, 0, 1);
+#endif
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Add the tabs and startup
+ ///////////////////////////////////////////////////////////////////////////
+ tabs->addTab(tabSSL, i18n("SSL"));
+#ifdef HAVE_SSL
+ tabs->addTab(tabOSSL, i18n("OpenSSL"));
+#endif
+ tabs->addTab(tabYourSSLCert, i18n("Your Certificates"));
+ tabs->addTab(tabAuth, i18n("Authentication"));
+ tabs->addTab(tabOtherSSLCert, i18n("Peer SSL Certificates"));
+ tabs->addTab(tabSSLCA, i18n("SSL Signers"));
+
+#if 0
+ tabs->addTab(tabSSLCOpts, i18n("Validation Options"));
+#endif
+
+ tabs->resize(tabs->sizeHint());
+ load();
+}
+
+KCryptoConfig::~KCryptoConfig()
+{
+ delete config;
+ delete policies;
+ delete pcerts;
+ delete authcfg;
+ delete _signers;
+}
+
+void KCryptoConfig::configChanged()
+{
+ emit changed(true);
+}
+
+void KCryptoConfig::load()
+{
+ load( false );
+}
+
+void KCryptoConfig::load( bool useDefaults )
+{
+ config->setReadDefaults( useDefaults );
+#ifdef HAVE_SSL
+ otherCertDelList.clear();
+ yourCertDelList.clear();
+ authDelList.clear();
+ caDelList.clear();
+ config->setGroup("TLS");
+ mUseTLS->setChecked(config->readBoolEntry("Enabled", true));
+
+ config->setGroup("SSLv2");
+ mUseSSLv2->setChecked(config->readBoolEntry("Enabled", true));
+
+ config->setGroup("SSLv3");
+ mUseSSLv3->setChecked(config->readBoolEntry("Enabled", true));
+
+ config->setGroup("Warnings");
+ mWarnOnEnter->setChecked(config->readBoolEntry("OnEnter", false));
+ mWarnOnLeave->setChecked(config->readBoolEntry("OnLeave", true));
+ mWarnOnUnencrypted->setChecked(config->readBoolEntry("OnUnencrypted", true));
+
+#if 0 // NOT IMPLEMENTED IN KDE 2.0
+ mWarnOnMixed->setChecked(config->readBoolEntry("OnMixed", true));
+
+ config->setGroup("Validation");
+ mWarnSelfSigned->setChecked(config->readBoolEntry("WarnSelfSigned", true));
+ mWarnExpired->setChecked(config->readBoolEntry("WarnExpired", true));
+ mWarnRevoked->setChecked(config->readBoolEntry("WarnRevoked", true));
+#endif
+
+ config->setGroup("EGD");
+ slotUseEGD(); // set the defaults
+ if (config->readBoolEntry("UseEGD", false)) {
+ mUseEGD->setChecked(true);
+ slotUseEGD();
+ } else if (config->readBoolEntry("UseEFile", false)) {
+ mUseEFile->setChecked(true);
+ slotUseEFile();
+ }
+ mEGDPath->setURL(config->readPathEntry("EGDPath"));
+
+
+#ifdef HAVE_SSL
+ config->setGroup("OpenSSL");
+ oPath->setURL(config->readPathEntry("Path"));
+#endif
+
+ config->setGroup("SSLv2");
+ CipherItem *item = static_cast<CipherItem *>(SSLv2Box->firstChild());
+ while ( item ) {
+ item->setOn(config->readBoolEntry(item->configName(),
+ item->bits() >= 56));
+ item = static_cast<CipherItem *>(item->nextSibling());
+ }
+
+ config->setGroup("SSLv3");
+ item = static_cast<CipherItem *>(SSLv3Box->firstChild());
+ while ( item ) {
+ item->setOn(config->readBoolEntry(item->configName(),
+ item->bits() >= 56));
+ item = static_cast<CipherItem *>(item->nextSibling());
+ }
+
+ SSLv2Box->setEnabled( mUseSSLv2->isChecked() );
+ SSLv3Box->setEnabled( mUseSSLv3->isChecked() );
+
+ QStringList groups = policies->groupList();
+
+ otherSSLBox->clear();
+ for (QStringList::Iterator i = groups.begin(); i != groups.end(); ++i) {
+ if ((*i).isEmpty() || *i == "<default>" || *i == "General") continue;
+ policies->setGroup(*i);
+ KSSLCertificate *cert = KSSLCertificate::fromString(policies->readEntry("Certificate", QString::null).local8Bit());
+ if (cert) {
+ new OtherCertItem(otherSSLBox, cert->getSubject(), *i,
+ policies->readBoolEntry("Permanent", true),
+ policies->readNumEntry("Policy", 3),
+ policies->readDateTimeEntry("Expires"), this );
+ delete cert;
+ }
+ }
+
+ groups = pcerts->groupList();
+
+ yourSSLBox->clear();
+ for (QStringList::Iterator i = groups.begin(); i != groups.end(); ++i) {
+ if ((*i).isEmpty() || *i == "<default>") continue;
+ pcerts->setGroup(*i);
+ YourCertItem *j = new YourCertItem(yourSSLBox,
+ pcerts->readEntry("PKCS12Base64"),
+ pcerts->readEntry("Password"),
+ *i, this );
+ j->setPassCache(QString::null);
+ }
+
+ setAuthCertLists();
+
+ config->setGroup("Auth");
+ QString whichAuth = config->readEntry("AuthMethod", "none");
+ if (whichAuth == "send")
+ defCertBG->setButton(defCertBG->id(defSend));
+ else if (whichAuth == "prompt")
+ defCertBG->setButton(defCertBG->id(defPrompt));
+ else
+ defCertBG->setButton(defCertBG->id(defDont));
+
+ QString whichCert = config->readEntry("DefaultCert");
+ defCertBox->setCurrentItem(0);
+ for (int i = 0; i < defCertBox->count(); i++) {
+ if (defCertBox->text(i) == whichCert) {
+ defCertBox->setCurrentItem(i);
+ break;
+ }
+ }
+ hostAuthList->clear();
+ groups = authcfg->groupList();
+ for (QStringList::Iterator i = groups.begin();
+ i != groups.end();
+ ++i) {
+ if ((*i).isEmpty() || *i == "<default>") continue;
+ authcfg->setGroup(*i);
+ KSSLCertificateHome::KSSLAuthAction aa = KSSLCertificateHome::AuthDont;
+ if (authcfg->readBoolEntry("send", false) == true)
+ aa = KSSLCertificateHome::AuthSend;
+ else if (authcfg->readBoolEntry("prompt", false) == true)
+ aa = KSSLCertificateHome::AuthPrompt;
+ HostAuthItem *j = new HostAuthItem(hostAuthList,
+ KResolver::domainToAscii(*i),
+ authcfg->readEntry("certificate"),
+ this );
+ j->setAction(aa);
+ j->setOriginalName(*i);
+ }
+
+ groups = _signers->list();
+ KConfig sigcfg("ksslcalist", true, false);
+ caList->clear();
+ for (QStringList::Iterator i = groups.begin();
+ i != groups.end();
+ ++i) {
+ if ((*i).isEmpty() || *i == "<default>") continue;
+ if (!sigcfg.hasGroup(*i)) continue;
+ sigcfg.setGroup(*i);
+ if (!sigcfg.hasKey("x509")) continue;
+ new CAItem(caList,
+ (*i),
+ sigcfg.readEntry("x509"),
+ sigcfg.readBoolEntry("site", false),
+ sigcfg.readBoolEntry("email", false),
+ sigcfg.readBoolEntry("code", false),
+ this );
+ }
+
+ slotCAItemChanged();
+ slotOtherCertSelect();
+ slotYourCertSelect();
+#endif
+
+ emit changed( useDefaults );
+}
+
+void KCryptoConfig::save()
+{
+#ifdef HAVE_SSL
+ if (!mUseSSLv2->isChecked() &&
+ !mUseSSLv3->isChecked())
+ KMessageBox::information(this, i18n("If you do not select at least one"
+ " SSL algorithm, either SSL will not"
+ " work or the application may be"
+ " forced to choose a suitable default."),
+ i18n("SSL"));
+
+ config->setGroup("TLS");
+ config->writeEntry("Enabled", mUseTLS->isChecked());
+
+ config->setGroup("SSLv2");
+ config->writeEntry("Enabled", mUseSSLv2->isChecked());
+
+ config->setGroup("SSLv3");
+ config->writeEntry("Enabled", mUseSSLv3->isChecked());
+
+ config->setGroup("Warnings");
+ config->writeEntry("OnEnter", mWarnOnEnter->isChecked());
+ config->writeEntry("OnLeave", mWarnOnLeave->isChecked());
+ config->writeEntry("OnUnencrypted", mWarnOnUnencrypted->isChecked());
+
+ config->setGroup("EGD");
+ config->writeEntry("UseEGD", mUseEGD->isChecked());
+ config->writeEntry("UseEFile", mUseEFile->isChecked());
+ config->writePathEntry("EGDPath", mEGDPath->url());
+
+#if 0 // NOT IMPLEMENTED IN KDE 2.0
+ config->writeEntry("OnMixed", mWarnOnMixed->isChecked());
+
+ config->setGroup("Validation");
+ config->writeEntry("WarnSelfSigned", mWarnSelfSigned->isChecked());
+ config->writeEntry("WarnExpired", mWarnExpired->isChecked());
+ config->writeEntry("WarnRevoked", mWarnRevoked->isChecked());
+#endif
+
+#ifdef HAVE_SSL
+ config->setGroup("OpenSSL");
+ config->writePathEntry("Path", oPath->url());
+#endif
+
+ int ciphercount = 0;
+ config->setGroup("SSLv2");
+ CipherItem *item = static_cast<CipherItem *>(SSLv2Box->firstChild());
+ while ( item ) {
+ if (item->isOn()) {
+ config->writeEntry(item->configName(), true);
+ ciphercount++;
+ } else config->writeEntry(item->configName(), false);
+
+ item = static_cast<CipherItem *>(item->nextSibling());
+ }
+
+ if (mUseSSLv2->isChecked() && ciphercount == 0)
+ KMessageBox::information(this, i18n("If you do not select at least one"
+ " cipher, SSLv2 will not work."),
+ i18n("SSLv2 Ciphers"));
+
+ ciphercount = 0;
+ config->setGroup("SSLv3");
+ item = static_cast<CipherItem *>(SSLv3Box->firstChild());
+ while ( item ) {
+ if (item->isOn()) {
+ config->writeEntry(item->configName(), true);
+ ciphercount++;
+ } else config->writeEntry(item->configName(), false);
+
+ item = static_cast<CipherItem *>(item->nextSibling());
+ }
+
+ KSSLCertificateCache _cc;
+
+ if (mUseSSLv3->isChecked() && ciphercount == 0)
+ KMessageBox::information(this, i18n("If you do not select at least one"
+ " cipher, SSLv3 will not work."),
+ i18n("SSLv3 Ciphers"));
+ // SSL Policies code
+ for (OtherCertItem *x = otherCertDelList.first(); x != 0; x = otherCertDelList.next()) {
+ KSSLX509Map cert(x->configName());
+ QString thisCN = cert.getValue("CN");
+ _cc.removeByCN(thisCN);
+ otherCertDelList.remove(x);
+ }
+ // Go through the non-deleted ones and save them
+ for (OtherCertItem *x =
+ static_cast<OtherCertItem *>(otherSSLBox->firstChild());
+ x;
+ x = static_cast<OtherCertItem *>(x->nextSibling())) {
+ KSSLX509Map cert(x->configName());
+ QString thisCN = cert.getValue("CN");
+ QDateTime expires = x->getExpires();
+ _cc.modifyByCN(thisCN, (KSSLCertificateCache::KSSLCertificatePolicy)x->getPolicy(), x->isPermanent(), expires);
+ }
+
+ // SSL Personal certificates code
+ for (YourCertItem *x = yourCertDelList.first(); x != 0; x = yourCertDelList.next()) {
+ pcerts->deleteGroup(x->configName());
+ yourCertDelList.remove(x);
+ }
+ // Go through the non-deleted ones and save them
+ for (YourCertItem *x =
+ static_cast<YourCertItem *>(yourSSLBox->firstChild());
+ x;
+ x = static_cast<YourCertItem *>(x->nextSibling())) {
+ pcerts->setGroup(x->configName());
+ pcerts->writeEntry("PKCS12Base64", x->getPKCS());
+ pcerts->writeEntry("Password", x->getPass());
+ }
+
+ bool doGen = false;
+
+ // CA certificates code
+ for (CAItem *x = caDelList.first(); x != 0; x = caDelList.next()) {
+ _signers->remove(x->configName());
+ caDelList.remove(x);
+ doGen = true;
+ }
+
+ // Go through the non-deleted ones and save them
+ for (CAItem *x = static_cast<CAItem *>(caList->firstChild()); x;
+ x = static_cast<CAItem *>(x->nextSibling())) {
+ if (!x->modified && !x->isNew) continue;
+ if (x->isNew) {
+ x->isNew = false;
+ _signers->addCA(x->getCert(),
+ x->getSite(),
+ x->getEmail(),
+ x->getCode());
+ } else {
+ _signers->setUse(x->configName(),
+ x->getSite(),
+ x->getEmail(),
+ x->getCode());
+ }
+ x->modified = false;
+ doGen = true;
+ }
+
+ if (doGen) genCAList();
+
+
+ config->setGroup("Auth");
+ QString whichAuth = config->readEntry("AuthMethod", "none");
+ if (defCertBG->selected() == defSend)
+ config->writeEntry("AuthMethod", "send");
+ else if (defCertBG->selected() == defPrompt)
+ config->writeEntry("AuthMethod", "prompt");
+ else
+ config->writeEntry("AuthMethod", "none");
+
+ if (defCertBox->currentItem() == 0)
+ config->writeEntry("DefaultCert", QString::null);
+ else config->writeEntry("DefaultCert", defCertBox->currentText());
+
+ for (HostAuthItem *x = authDelList.first(); x != 0; x = authDelList.next()) {
+ authcfg->deleteGroup(x->configName());
+ authDelList.remove(x);
+ }
+
+ for (HostAuthItem *x =
+ static_cast<HostAuthItem *>(hostAuthList->firstChild());
+ x;
+ x = static_cast<HostAuthItem *>(x->nextSibling())) {
+ if (!x->originalName().isNull())
+ authcfg->deleteGroup(x->originalName());
+ }
+
+ for (HostAuthItem *x =
+ static_cast<HostAuthItem *>(hostAuthList->firstChild());
+ x;
+ x = static_cast<HostAuthItem *>(x->nextSibling())) {
+ authcfg->setGroup(KResolver::domainToAscii(x->configName()));
+ authcfg->writeEntry("certificate", x->getCertName());
+ authcfg->writeEntry("prompt", (x->getAction() == KSSLCertificateHome::AuthPrompt));
+ authcfg->writeEntry("send", (x->getAction() == KSSLCertificateHome::AuthSend));
+ }
+
+#endif
+
+ config->sync();
+ policies->sync();
+ pcerts->sync();
+ authcfg->sync();
+
+ // insure proper permissions -- contains sensitive data
+ QString cfgName(KGlobal::dirs()->findResource("config", "cryptodefaults"));
+ if (!cfgName.isEmpty())
+ ::chmod(QFile::encodeName(cfgName), 0600);
+
+ emit changed(false);
+}
+
+void KCryptoConfig::defaults()
+{
+ load( true );
+}
+
+void KCryptoConfig::genCAList() {
+ _signers->regenerate();
+
+}
+
+void KCryptoConfig::slotSelectCipher(int id) {
+ switch(id) {
+ case 1:
+ cwCompatible();
+ break;
+ case 2:
+ cwUS();
+ break;
+ case 3:
+ cwExp();
+ break;
+ case 4:
+ cwAll();
+ }
+}
+
+void KCryptoConfig::cwCompatible() {
+ #ifdef HAVE_SSL
+ CipherItem *item;
+ for ( item = static_cast<CipherItem *>(SSLv2Box->firstChild()); item;
+ item = static_cast<CipherItem *>(item->nextSibling()) ) {
+ item->setOn( item->bits() >= 56 && item->bits() <= 128 );
+ }
+
+ for ( item = static_cast<CipherItem *>(SSLv3Box->firstChild()); item;
+ item = static_cast<CipherItem *>(item->nextSibling()) ) {
+ item->setOn( item->bits() >= 56 && item->bits() <= 128 );
+ }
+
+ mUseTLS->setChecked(true);
+ mUseSSLv2->setChecked(true);
+ mUseSSLv3->setChecked(true);
+ configChanged();
+ #endif
+}
+
+
+void KCryptoConfig::cwUS() {
+ #ifdef HAVE_SSL
+ CipherItem *item;
+ for ( item = static_cast<CipherItem *>(SSLv2Box->firstChild()); item;
+ item = static_cast<CipherItem *>(item->nextSibling()) ) {
+ item->setOn( item->bits() >= 128 );
+ }
+
+ for ( item = static_cast<CipherItem *>(SSLv3Box->firstChild()); item;
+ item = static_cast<CipherItem *>(item->nextSibling()) ) {
+ item->setOn( item->bits() >= 128 );
+ }
+
+ configChanged();
+ #endif
+}
+
+
+void KCryptoConfig::cwExp() {
+ #ifdef HAVE_SSL
+ CipherItem *item;
+ for ( item = static_cast<CipherItem *>(SSLv2Box->firstChild()); item;
+ item = static_cast<CipherItem *>(item->nextSibling()) ) {
+ item->setOn( item->bits() <= 56 && item->bits() > 0);
+ }
+
+ for ( item = static_cast<CipherItem *>(SSLv3Box->firstChild()); item;
+ item = static_cast<CipherItem *>(item->nextSibling()) ) {
+ item->setOn( item->bits() <= 56 && item->bits() > 0);
+ }
+
+ configChanged();
+ #endif
+}
+
+
+void KCryptoConfig::cwAll() {
+ #ifdef HAVE_SSL
+ CipherItem *item;
+ for ( item = static_cast<CipherItem *>(SSLv2Box->firstChild()); item;
+ item = static_cast<CipherItem *>(item->nextSibling()) ) {
+ item->setOn( true );
+ }
+
+ for ( item = static_cast<CipherItem *>(SSLv3Box->firstChild()); item;
+ item = static_cast<CipherItem *>(item->nextSibling()) ) {
+ item->setOn( true );
+ }
+
+ mUseTLS->setChecked(true);
+ mUseSSLv2->setChecked(true);
+ mUseSSLv3->setChecked(true);
+ configChanged();
+ #endif
+}
+
+
+
+void KCryptoConfig::slotExportCert() {
+OtherCertItem *x = static_cast<OtherCertItem *>(otherSSLBox->selectedItem());
+ if (x) {
+ policies->setGroup(x->getMD5());
+ KSSLCertificate *cert = KSSLCertificate::fromString(policies->readEntry("Certificate", QString::null).local8Bit());
+ if (cert) {
+ KCertExport kce;
+ kce.setCertificate(cert);
+ kce.exec();
+ delete cert;
+ } else KMessageBox::sorry(this, i18n("Could not open the certificate."),
+ i18n("SSL"));
+ }
+}
+
+
+
+void KCryptoConfig::slotRemoveCert() {
+QListViewItem *act = otherSSLBox->selectedItem();
+OtherCertItem *x = static_cast<OtherCertItem *>(act);
+ if (x) {
+ QListViewItem *next = act->itemBelow();
+ if (!next) next = act->itemAbove();
+ otherSSLBox->takeItem(x);
+ otherCertDelList.append(x);
+ configChanged();
+ if (next) otherSSLBox->setSelected(next, true);
+ }
+}
+
+
+
+void KCryptoConfig::slotVerifyCert() {
+OtherCertItem *x = static_cast<OtherCertItem *>(otherSSLBox->selectedItem());
+ if (!x) return;
+
+ policies->setGroup(x->getMD5());
+ KSSLCertificate *cert = KSSLCertificate::fromString(policies->readEntry("Certificate", QString::null).local8Bit());
+
+ if (!cert) {
+ KMessageBox::error(this, i18n("Error obtaining the certificate."), i18n("SSL"));
+ return;
+ }
+
+ cert->chain().setCertChain(policies->readListEntry("Chain"));
+
+ KSSLCertificate::KSSLValidation v = cert->revalidate(KSSLCertificate::SSLServer);
+
+ /*
+ * Don't enable this until we keep this info in the cache
+ if (v != KSSLCerticiate::Ok)
+ v = cert->revalidate(KSSLCertificate::SMIMESign);
+ if (v != KSSLCerticiate::Ok)
+ v = cert->revalidate(KSSLCertificate::SMIMEEncrypt);
+ */
+
+ if (v == KSSLCertificate::Ok) {
+ KMessageBox::information(this, i18n("This certificate passed the verification tests successfully."), i18n("SSL"));
+ } else {
+ KMessageBox::detailedError(this, i18n("This certificate has failed the tests and should be considered invalid."), KSSLCertificate::verifyText(v), i18n("SSL"));
+ }
+
+ delete cert;
+}
+
+
+
+void KCryptoConfig::slotUntil() {
+OtherCertItem *x = static_cast<OtherCertItem *>(otherSSLBox->selectedItem());
+
+ cachePerm->setChecked(false);
+ untilDate->setEnabled(true);
+
+ if (!x) return;
+ x->setPermanent(false);
+
+ configChanged();
+}
+
+
+
+void KCryptoConfig::slotPermanent() {
+OtherCertItem *x = static_cast<OtherCertItem *>(otherSSLBox->selectedItem());
+
+ cacheUntil->setChecked(false);
+ untilDate->setEnabled(false);
+
+ if (!x) return;
+ x->setPermanent(true);
+
+ configChanged();
+}
+
+
+
+void KCryptoConfig::slotPolicyChanged(int id) {
+OtherCertItem *x = static_cast<OtherCertItem *>(otherSSLBox->selectedItem());
+if (!x) return;
+
+ if (id == policyGroup->id(policyAccept)) {
+ x->setPolicy(KSSLCertificateCache::Accept);
+ } else if (id == policyGroup->id(policyReject)) {
+ x->setPolicy(KSSLCertificateCache::Reject);
+ } else if (id == policyGroup->id(policyPrompt)) {
+ x->setPolicy(KSSLCertificateCache::Prompt);
+ }
+
+ configChanged();
+}
+
+
+
+void KCryptoConfig::slotDatePick() {
+KDateTimeDlg kdtd;
+OtherCertItem *x = static_cast<OtherCertItem *>(otherSSLBox->selectedItem());
+
+ if (!x || !untilDate->isEnabled()) return;
+
+QDateTime qdt = x->getExpires();
+
+ kdtd.setDateTime(qdt);
+ int rc = kdtd.exec();
+ if (rc == KDialog::Accepted) {
+ x->setExpires(kdtd.getDateTime());
+ untilDate->setText(KGlobal::locale()->formatDateTime(x->getExpires()));
+ configChanged();
+ }
+}
+
+
+
+void KCryptoConfig::slotOtherCertSelect() {
+OtherCertItem *x = static_cast<OtherCertItem *>(otherSSLBox->selectedItem());
+QString iss = QString::null;
+ if (x) {
+ otherSSLExport->setEnabled(true);
+ otherSSLVerify->setEnabled(true);
+ otherSSLRemove->setEnabled(true);
+
+ fromLabel->setEnabled(true);
+ untilLabel->setEnabled(true);
+ policyGroup->setEnabled(true);
+ cacheGroup->setEnabled(true);
+ cachePerm->setEnabled(true);
+ cacheUntil->setEnabled(true);
+ policies->setGroup(x->getMD5());
+
+ KSSLCertificate *cert = KSSLCertificate::fromString(policies->readEntry("Certificate", QString::null).local8Bit());
+
+ if (cert) {
+ QPalette cspl;
+ iss = cert->getIssuer();
+ cspl = validFrom->palette();
+ if (QDateTime::currentDateTime(Qt::UTC) < cert->getQDTNotBefore()) {
+ cspl.setColor(QColorGroup::Foreground, QColor(196,33,21));
+ } else {
+ cspl.setColor(QColorGroup::Foreground, QColor(42,153,59));
+ }
+ validFrom->setPalette(cspl);
+
+ cspl = validUntil->palette();
+ if (QDateTime::currentDateTime(Qt::UTC) > cert->getQDTNotAfter()) {
+ cspl.setColor(QColorGroup::Foreground, QColor(196,33,21));
+ } else {
+ cspl.setColor(QColorGroup::Foreground, QColor(42,153,59));
+ }
+ validUntil->setPalette(cspl);
+
+ validFrom->setText(cert->getNotBefore());
+ validUntil->setText(cert->getNotAfter());
+ untilDate->setText(x ? KGlobal::locale()->formatDateTime(x->getExpires())
+ : KGlobal::locale()->formatDateTime(QDateTime::currentDateTime(Qt::UTC)));
+ untilDate->setEnabled(x && !x->isPermanent());
+ pHash->setText(cert->getMD5DigestText());
+ delete cert;
+ } else {
+ validFrom->setText(QString::null);
+ validUntil->setText(QString::null);
+ pHash->clear();
+ }
+
+ switch(x->getPolicy()) {
+ case KSSLCertificateCache::Accept:
+ policyGroup->setButton(policyGroup->id(policyAccept));
+ break;
+ case KSSLCertificateCache::Reject:
+ policyGroup->setButton(policyGroup->id(policyReject));
+ break;
+ case KSSLCertificateCache::Prompt:
+ policyGroup->setButton(policyGroup->id(policyPrompt));
+ break;
+ }
+
+ cachePerm->setChecked(x->isPermanent());
+ cacheUntil->setChecked(!x->isPermanent());
+
+ } else {
+ otherSSLExport->setEnabled(false);
+ otherSSLVerify->setEnabled(false);
+ otherSSLRemove->setEnabled(false);
+ fromLabel->setEnabled(false);
+ untilLabel->setEnabled(false);
+ policyGroup->setEnabled(false);
+ cacheGroup->setEnabled(false);
+ cachePerm->setChecked(false);
+ cacheUntil->setChecked(false);
+ policyAccept->setChecked(false);
+ policyReject->setChecked(false);
+ policyPrompt->setChecked(false);
+ cachePerm->setEnabled(false);
+ cacheUntil->setEnabled(false);
+ validFrom->setText(QString::null);
+ validUntil->setText(QString::null);
+ untilDate->setText(QString::null);
+ untilDate->setEnabled(false);
+ pHash->clear();
+ }
+
+
+ oSubject->setValues(x ? x->getSub() : QString(QString::null));
+ oIssuer->setValues(iss);
+
+}
+
+
+void KCryptoConfig::slotYourImport() {
+
+ QString certFile = KFileDialog::getOpenFileName(QString::null, "application/x-pkcs12");
+ if (certFile.isEmpty())
+ return;
+
+#ifdef HAVE_SSL
+KSSLPKCS12 *cert = NULL;
+QCString pass;
+
+TryImportPassAgain:
+ int rc = KPasswordDialog::getPassword(pass, i18n("Certificate password"));
+ if (rc != KPasswordDialog::Accepted) return;
+
+ cert = KSSLPKCS12::loadCertFile(certFile, QString(pass));
+
+ if (!cert) {
+ rc = KMessageBox::warningYesNo(this, i18n("The certificate file could not be loaded. Try a different password?"), i18n("SSL"),i18n("Try"),i18n("Do Not Try"));
+ if (rc == KMessageBox::Yes) goto TryImportPassAgain;
+ return;
+ }
+
+ // At this point, we know that we can read the certificate in.
+ // The procedure will be to convert it to Base64 in it's raw form
+ // and add it to the ListView - eventually going into the SimpleConfig.
+
+ // FIXME: prompt if the user wants the password stored along with the
+ // certificate
+
+ QString name = cert->getCertificate()->getSubject();
+ for (YourCertItem *i =
+ static_cast<YourCertItem *>(yourSSLBox->firstChild());
+ i;
+ i = static_cast<YourCertItem *>(i->nextSibling())) {
+ if (i->configName() == name) {
+ rc = KMessageBox::warningContinueCancel(this, i18n("A certificate with that name already exists. Are you sure that you wish to replace it?"), i18n("SSL"), i18n("Replace"));
+ if (rc == KMessageBox::Cancel) {
+ delete cert;
+ return;
+ }
+ yourSSLBox->takeItem(i);
+ yourCertDelList.append(i);
+ }
+ }
+
+ new YourCertItem(yourSSLBox,
+ cert->toString(),
+ QString::null, // the password - don't store it yet!
+ name,
+ this );
+
+ setAuthCertLists();
+ configChanged();
+ delete cert;
+#endif
+
+ offerImportToKMail( certFile );
+}
+
+
+void KCryptoConfig::slotYourExport() {
+YourCertItem *x = static_cast<YourCertItem *>(yourSSLBox->selectedItem());
+ if (!x) return;
+
+ KSSLPKCS12 *pkcs = KSSLPKCS12::fromString(x->getPKCS(), x->getPass());
+ if (!pkcs)
+ pkcs = KSSLPKCS12::fromString(x->getPKCS(), x->getPassCache());
+ if (!pkcs) {
+ QString pprompt = i18n("Enter the certificate password:");
+ QCString oldpass;
+ do {
+ int i = KPasswordDialog::getPassword(oldpass, pprompt);
+ if (i != KPasswordDialog::Accepted) return;
+ pkcs = KSSLPKCS12::fromString(x->getPKCS(), oldpass);
+ pprompt = i18n("Decoding failed. Please try again:");
+ } while (!pkcs);
+ x->setPassCache(oldpass);
+ slotYourUnlock();
+ }
+
+ // For now, we will only export to PKCS#12
+ QString certFile = KFileDialog::getSaveFileName(QString::null,
+ "application/x-pkcs12");
+ if (certFile.isEmpty())
+ return;
+
+ if (!pkcs->toFile(certFile))
+ KMessageBox::sorry(this, i18n("Export failed."), i18n("SSL"));
+}
+
+
+void KCryptoConfig::slotYourVerify() {
+YourCertItem *x = static_cast<YourCertItem *>(yourSSLBox->selectedItem());
+QString iss;
+ if (!x) return;
+
+ KSSLPKCS12 *pkcs = KSSLPKCS12::fromString(x->getPKCS(), x->getPass());
+ if (!pkcs)
+ pkcs = KSSLPKCS12::fromString(x->getPKCS(), x->getPassCache());
+ if (!pkcs) {
+ QString pprompt = i18n("Enter the certificate password:");
+ QCString oldpass;
+ do {
+ int i = KPasswordDialog::getPassword(oldpass, pprompt);
+ if (i != KPasswordDialog::Accepted) return;
+ pkcs = KSSLPKCS12::fromString(x->getPKCS(), oldpass);
+ pprompt = i18n("Decoding failed. Please try again:");
+ } while (!pkcs);
+ x->setPassCache(oldpass);
+ slotYourUnlock();
+ }
+
+ KSSLCertificate::KSSLValidation v = pkcs->revalidate(KSSLCertificate::SSLClient);
+ if (v != KSSLCertificate::Ok)
+ v = pkcs->revalidate(KSSLCertificate::SMIMEEncrypt);
+ if (v != KSSLCertificate::Ok)
+ v = pkcs->revalidate(KSSLCertificate::SMIMESign);
+
+ if (v == KSSLCertificate::Ok) {
+ KMessageBox::information(this, i18n("This certificate passed the verification tests successfully."), i18n("SSL"));
+ } else {
+ KMessageBox::detailedError(this, i18n("This certificate has failed the tests and should be considered invalid."), KSSLCertificate::verifyText(v), i18n("SSL"));
+ }
+
+ delete pkcs;
+}
+
+
+void KCryptoConfig::slotYourRemove() {
+YourCertItem *x = static_cast<YourCertItem *>(yourSSLBox->selectedItem());
+ if (x) {
+ yourSSLBox->takeItem(x);
+ yourCertDelList.append(x);
+ setAuthCertLists();
+ configChanged();
+ }
+}
+
+
+void KCryptoConfig::slotYourUnlock() {
+YourCertItem *x = static_cast<YourCertItem *>(yourSSLBox->selectedItem());
+QString iss;
+ if (!x || !yourSSLUnlock->isEnabled()) return;
+
+ KSSLPKCS12 *pkcs = KSSLPKCS12::fromString(x->getPKCS(), x->getPass());
+ if (!pkcs)
+ pkcs = KSSLPKCS12::fromString(x->getPKCS(), x->getPassCache());
+ if (!pkcs) {
+ QString pprompt = i18n("Enter the certificate password:");
+ QCString oldpass;
+ do {
+ int i = KPasswordDialog::getPassword(oldpass, pprompt);
+ if (i != KPasswordDialog::Accepted) return;
+ pkcs = KSSLPKCS12::fromString(x->getPKCS(), oldpass);
+ pprompt = i18n("Decoding failed. Please try again:");
+ } while (!pkcs);
+ x->setPassCache(oldpass);
+ }
+
+ // update the info
+ iss = pkcs->getCertificate()->getIssuer();
+ ySubject->setValues(x ? x->getName() : QString(QString::null));
+ yIssuer->setValues(iss);
+ QPalette cspl;
+ KSSLCertificate *cert = pkcs->getCertificate();
+ cspl = yValidFrom->palette();
+ if (QDateTime::currentDateTime(Qt::UTC) < cert->getQDTNotBefore()) {
+ cspl.setColor(QColorGroup::Foreground, QColor(196,33,21));
+ } else {
+ cspl.setColor(QColorGroup::Foreground, QColor(42,153,59));
+ }
+ yValidFrom->setPalette(cspl);
+
+ cspl = yValidUntil->palette();
+ if (QDateTime::currentDateTime(Qt::UTC) > cert->getQDTNotAfter()) {
+ cspl.setColor(QColorGroup::Foreground, QColor(196,33,21));
+ } else {
+ cspl.setColor(QColorGroup::Foreground, QColor(42,153,59));
+ }
+ yValidUntil->setPalette(cspl);
+
+ yValidFrom->setText(cert->getNotBefore());
+ yValidUntil->setText(cert->getNotAfter());
+ yHash->setText(cert->getMD5DigestText());
+ yourSSLUnlock->setEnabled(false);
+ delete pkcs;
+}
+
+
+void KCryptoConfig::slotYourCertSelect() {
+YourCertItem *x = static_cast<YourCertItem *>(yourSSLBox->selectedItem());
+QString iss;
+
+ yourSSLExport->setEnabled(x != NULL);
+ yourSSLPass->setEnabled(x != NULL);
+ yourSSLUnlock->setEnabled(false);
+ yourSSLVerify->setEnabled(x != NULL);
+ yourSSLRemove->setEnabled(x != NULL);
+
+ if (x) {
+ KSSLPKCS12 *pkcs = KSSLPKCS12::fromString(x->getPKCS(), x->getPass());
+ if (pkcs) {
+ QPalette cspl;
+ KSSLCertificate *cert = pkcs->getCertificate();
+ iss = cert->getIssuer();
+ cspl = yValidFrom->palette();
+ if (QDateTime::currentDateTime(Qt::UTC) < cert->getQDTNotBefore()) {
+ cspl.setColor(QColorGroup::Foreground, QColor(196,33,21));
+ } else {
+ cspl.setColor(QColorGroup::Foreground, QColor(42,153,59));
+ }
+ yValidFrom->setPalette(cspl);
+
+ cspl = yValidUntil->palette();
+ if (QDateTime::currentDateTime(Qt::UTC) > cert->getQDTNotAfter()) {
+ cspl.setColor(QColorGroup::Foreground, QColor(196,33,21));
+ } else {
+ cspl.setColor(QColorGroup::Foreground, QColor(42,153,59));
+ }
+ yValidUntil->setPalette(cspl);
+
+ yValidFrom->setText(cert->getNotBefore());
+ yValidUntil->setText(cert->getNotAfter());
+ yHash->setText(cert->getMD5DigestText());
+ delete pkcs;
+ } else {
+ yourSSLUnlock->setEnabled(x != NULL);
+ yHash->clear();
+ }
+ } else {
+ yHash->clear();
+ }
+
+ ySubject->setValues(x ? x->getName() : QString(QString::null));
+ yIssuer->setValues(iss);
+}
+
+
+void KCryptoConfig::slotYourPass() {
+YourCertItem *x = static_cast<YourCertItem *>(yourSSLBox->selectedItem());
+QCString oldpass = "";
+ if (!x) return;
+
+ KSSLPKCS12 *pkcs = KSSLPKCS12::fromString(x->getPKCS(), x->getPass());
+ if (!pkcs)
+ pkcs = KSSLPKCS12::fromString(x->getPKCS(), x->getPassCache());
+ if (!pkcs) {
+ QString pprompt = i18n("Enter the OLD password for the certificate:");
+ do {
+ int i = KPasswordDialog::getPassword(oldpass, pprompt);
+ if (i != KPasswordDialog::Accepted) break;
+ pkcs = KSSLPKCS12::fromString(x->getPKCS(), oldpass);
+ pprompt = i18n("Decoding failed. Please try again:");
+ } while (!pkcs);
+ }
+
+ if (pkcs) {
+ x->setPassCache(oldpass);
+ slotYourUnlock();
+ KPasswordDialog *kpd = new KPasswordDialog(KPasswordDialog::NewPassword, false, 0, this);
+ kpd->setPrompt(i18n("Enter the new certificate password"));
+ kpd->setAllowEmptyPasswords(true);
+
+ int i = kpd->exec();
+ if (i == KPasswordDialog::Accepted) {
+ QCString pass = kpd->password();
+ pkcs->changePassword(QString(oldpass), QString(pass));
+ x->setPKCS(pkcs->toString());
+ x->setPassCache(pass);
+ configChanged();
+ }
+ delete kpd;
+ delete pkcs;
+ }
+}
+
+
+void KCryptoConfig::slotCAImport() {
+ QString certFile = KFileDialog::getOpenFileName(QString::null, "application/x-x509-ca-cert");
+
+ if (certFile.isEmpty())
+ return;
+
+#ifdef HAVE_SSL
+#define sk_free KOSSL::self()->sk_free
+#define sk_num KOSSL::self()->sk_num
+#define sk_value KOSSL::self()->sk_value
+
+ // First try to load using the OpenSSL method
+ X509_STORE *certStore = KOSSL::self()->X509_STORE_new();
+ X509_LOOKUP *certLookup = KOSSL::self()->X509_STORE_add_lookup(certStore, KOSSL::self()->X509_LOOKUP_file());
+
+ if (certLookup &&
+ KOSSL::self()->X509_LOOKUP_load_file(certLookup,
+ certFile.local8Bit(),
+ X509_FILETYPE_PEM)) {
+ for (int i = 0; i < sk_X509_OBJECT_num(certStore->objs); i++) {
+ X509_OBJECT* x5o = sk_X509_OBJECT_value(certStore->objs, i);
+ if (!x5o) continue;
+
+ if (x5o->type != X509_LU_X509) continue;
+
+ X509 *x5 = x5o->data.x509;
+ if (!x5) continue;
+
+ // Easier to use in this form
+ KSSLCertificate *x = KSSLCertificate::fromX509(x5);
+
+ // Only import CA's
+ if (!x || !x->x509V3Extensions().certTypeCA()) {
+ if (x) {
+ QString emsg = x->getSubject() + ":\n" +
+ i18n("This is not a signer certificate.");
+ KMessageBox::error(this,
+ emsg,
+ i18n("SSL"));
+ delete x;
+ }
+ continue;
+ }
+
+ QString name = x->getSubject();
+
+ // search for dups
+ for (CAItem *m = static_cast<CAItem *>(caList->firstChild());
+ m;
+ m = static_cast<CAItem *>(m->nextSibling())) {
+ if (m->configName() == name) {
+ KSSLCertificate *y = KSSLCertificate::fromString(m->getCert().local8Bit());
+ if (!y) continue;
+ if (*x == *y) {
+ QString emsg = name + ":\n" +
+ i18n("You already have this signer certificate installed.");
+ KMessageBox::error(this,
+ emsg,
+ i18n("SSL"));
+ delete x;
+ delete y;
+ x = NULL;
+ break;
+ }
+ delete y;
+ }
+ }
+
+ if (!x) continue;
+
+ // Ok, add it to the list
+ (new CAItem(caList,
+ name,
+ x->toString(),
+ true, true, true, this)
+ )->isNew = true;
+ delete x;
+ }
+
+ // Can the PEM code be wiped out now?
+ } else { // try to load it manually as a single X.509 DER encoded
+ // ASSUMPTION: we only read one certificate in this code
+ QFile qf(certFile);
+ QString name;
+ QString certtext;
+ KSSLCertificate *x;
+ qf.open(IO_ReadOnly);
+ qf.readLine(certtext, qf.size());
+
+ if (certStore) { KOSSL::self()->X509_STORE_free(certStore);
+ certStore = NULL; }
+
+ if (certtext.contains("-----BEGIN CERTIFICATE-----")) {
+ qf.reset();
+ certtext = QString::null;
+ while (!qf.atEnd()) {
+ QString xx;
+ qf.readLine(xx, qf.size());
+ certtext += xx;
+ }
+ certtext = certtext.replace("-----BEGIN CERTIFICATE-----", QString::null);
+ certtext = certtext.replace("-----END CERTIFICATE-----", QString::null);
+ certtext = certtext.stripWhiteSpace();
+ certtext = certtext.replace("\n", QString::null);
+ } else {
+ // Must [could?] be DER
+ qf.close();
+ qf.open(IO_ReadOnly);
+ char *cr;
+ cr = new char[qf.size()+1];
+ qf.readBlock(cr, qf.size());
+ QByteArray qba;
+ qba.duplicate(cr, qf.size());
+ certtext = KCodecs::base64Encode(qba);
+ delete [] cr;
+ }
+
+ qf.close();
+
+ x = KSSLCertificate::fromString(certtext.latin1());
+
+ if (!x) {
+ KMessageBox::sorry(this,
+ i18n("The certificate file could not be loaded."),
+ i18n("SSL"));
+ return;
+ }
+
+ if (!x->x509V3Extensions().certTypeCA()) {
+ KMessageBox::sorry(this,
+ i18n("This is not a signer certificate."),
+ i18n("SSL"));
+ return;
+ }
+
+ name = x->getSubject();
+
+ for (CAItem *i = static_cast<CAItem *>(caList->firstChild());
+ i;
+ i = static_cast<CAItem *>(i->nextSibling())) {
+ if (i->configName() == name) {
+ KSSLCertificate *y = KSSLCertificate::fromString(i->getCert().local8Bit());
+ if (!y) continue;
+ if (*x == *y) {
+ KMessageBox::error(this,
+ i18n("You already have this signer certificate installed."),
+ i18n("SSL"));
+ delete x;
+ delete y;
+ return;
+ }
+ delete y;
+ }
+ }
+
+ (new CAItem(caList, name, x->toString(), true, true, true, this))->isNew = true;
+
+ delete x;
+ }
+
+
+ if (certStore) KOSSL::self()->X509_STORE_free(certStore);
+
+ configChanged();
+#undef sk_free
+#undef sk_num
+#undef sk_value
+#endif
+
+ offerImportToKMail( certFile );
+}
+
+void KCryptoConfig::offerImportToKMail( const QString& certFile )
+{
+ if ( KMessageBox::questionYesNo( this, i18n( "Do you want to make this certificate available to KMail as well?" ), QString::null, i18n("Make Available"), i18n("Do Not Make Available") ) == KMessageBox::Yes ) {
+ KProcess proc;
+ proc << "kleopatra";
+ proc << "--import-certificate";
+ proc << certFile;
+ if ( !proc.start( KProcess::DontCare ) )
+ KMessageBox::error( this, i18n( "Could not execute Kleopatra. You might have to install or update the kdepim package." ) );
+ }
+}
+
+
+void KCryptoConfig::slotCARemove() {
+CAItem *x = static_cast<CAItem *>(caList->selectedItem());
+ if (x) {
+ caList->takeItem(x);
+ caDelList.append(x);
+ configChanged();
+ slotCAItemChanged();
+ }
+}
+
+
+void KCryptoConfig::slotCARestore() {
+
+ int rc = KMessageBox::warningContinueCancel(this, i18n("This will revert your certificate signers database to the KDE default.\nThis operation cannot be undone.\nAre you sure you wish to continue?"), i18n("SSL"),i18n("Revert"));
+ if (rc == KMessageBox::Cancel) {
+ return;
+ }
+
+// For now, we just rm the existing file and rebuild
+
+ QString path = KGlobal::dirs()->saveLocation("config");
+
+ path += "/ksslcalist";
+
+ QFile::remove(path);
+
+ // Remove all our old work and rebuild the GUI/List
+ caDelList.clear();
+ caList->clear();
+
+
+ QStringList groups = _signers->list();
+ KConfig sigcfg("ksslcalist", true, false);
+
+ for (QStringList::Iterator i = groups.begin();
+ i != groups.end();
+ ++i) {
+ if ((*i).isEmpty() || *i == "<default>") continue;
+ if (!sigcfg.hasGroup(*i)) continue;
+ sigcfg.setGroup(*i);
+ if (!sigcfg.hasKey("x509")) continue;
+ new CAItem(caList,
+ (*i),
+ sigcfg.readEntry("x509", QString::null),
+ sigcfg.readBoolEntry("site", false),
+ sigcfg.readBoolEntry("email", false),
+ sigcfg.readBoolEntry("code", false),
+ this );
+ }
+
+ genCAList();
+ slotCAItemChanged();
+}
+
+
+void KCryptoConfig::slotCAItemChanged() {
+CAItem *x = static_cast<CAItem *>(caList->selectedItem());
+ if (x) {
+ caSSLRemove->setEnabled(true);
+ caSubject->setValues(x ? x->getName() : QString(QString::null));
+ KSSLCertificate *cert = KSSLCertificate::fromString(x->getCert().local8Bit());
+ if (!cert) {
+ caIssuer->setValues(QString(QString::null));
+ caSite->setEnabled(false);
+ caEmail->setEnabled(false);
+ caCode->setEnabled(false);
+ caSite->setChecked(false);
+ caEmail->setChecked(false);
+ caCode->setChecked(false);
+ cHash->clear();
+ } else {
+ caSite->setEnabled(cert->x509V3Extensions().certTypeSSLCA());
+ caEmail->setEnabled(cert->x509V3Extensions().certTypeEmailCA());
+ caCode->setEnabled(cert->x509V3Extensions().certTypeCodeCA());
+ caSite->setChecked(x->getSite());
+ caEmail->setChecked(x->getEmail());
+ caCode->setChecked(x->getCode());
+ caIssuer->setValues(cert->getIssuer());
+ cHash->setText(cert->getMD5DigestText());
+ delete cert;
+ }
+ } else {
+ caSSLRemove->setEnabled(false);
+ caSite->setEnabled(false);
+ caEmail->setEnabled(false);
+ caCode->setEnabled(false);
+ caSubject->setValues(QString(QString::null));
+ caIssuer->setValues(QString(QString::null));
+ cHash->clear();
+ }
+}
+
+
+void KCryptoConfig::slotCAChecked() {
+CAItem *x = static_cast<CAItem *>(caList->selectedItem());
+ if (x) {
+ x->setSite(caSite->isChecked());
+ x->setEmail(caEmail->isChecked());
+ x->setCode(caCode->isChecked());
+ x->modified = true;
+ configChanged();
+ }
+}
+
+
+
+void KCryptoConfig::slotNewHostAuth() {
+ HostAuthItem *j = new HostAuthItem(hostAuthList,
+ QString::null,
+ QString::null,
+ this );
+ j->setAction(KSSLCertificateHome::AuthSend);
+ hostAuthList->setSelected(j, true);
+ authHost->setEnabled(true);
+ hostCertBox->setEnabled(true);
+ hostCertBG->setEnabled(true);
+ authRemove->setEnabled(true);
+
+ hostCertBG->setButton(0);
+
+ authHost->setFocus();
+}
+
+
+
+void KCryptoConfig::slotRemoveHostAuth() {
+QListViewItem *act = hostAuthList->selectedItem();
+HostAuthItem *x = static_cast<HostAuthItem *>(act);
+
+ if (x) {
+ QListViewItem *next = act->itemBelow();
+ if (!next) next = act->itemAbove();
+ hostAuthList->takeItem(x);
+ authDelList.append(x);
+ configChanged();
+ if (next) hostAuthList->setSelected(next, true);
+ }
+}
+
+
+void KCryptoConfig::slotAuthItemChanged() {
+HostAuthItem *x = static_cast<HostAuthItem *>(hostAuthList->selectedItem());
+
+if (x) {
+ // Make sure the fields are enabled
+ authHost->setEnabled(true);
+ hostCertBox->setEnabled(true);
+ hostCertBG->setEnabled(true);
+ authRemove->setEnabled(true);
+
+ // Populate the fields
+ switch(x->getAction()) {
+ case KSSLCertificateHome::AuthSend:
+ hostCertBG->setButton(hostCertBG->id(hostSend));
+ break;
+ case KSSLCertificateHome::AuthPrompt:
+ hostCertBG->setButton(hostCertBG->id(hostPrompt));
+ break;
+ case KSSLCertificateHome::AuthDont:
+ hostCertBG->setButton(hostCertBG->id(hostDont));
+ break;
+ default:
+ hostSend->setChecked(false);
+ hostPrompt->setChecked(false);
+ hostDont->setChecked(false);
+ break;
+ }
+
+ ___lehack = true;
+ authHost->setText(x->configName());
+ ___lehack = false;
+ hostCertBox->setCurrentItem(0);
+
+ QString theCert = x->getCertName();
+ for (int i = 0; i < hostCertBox->count(); i++) {
+ if (hostCertBox->text(i) == theCert) {
+ hostCertBox->setCurrentItem(i);
+ break;
+ }
+ }
+} else {
+ authHost->clear();
+ authHost->setEnabled(false);
+ hostCertBox->setEnabled(false);
+ hostCertBG->setEnabled(false);
+ authRemove->setEnabled(false);
+}
+}
+
+
+void KCryptoConfig::slotAuthText(const QString &t) {
+if (___lehack) return;
+HostAuthItem *x = static_cast<HostAuthItem *>(hostAuthList->selectedItem());
+
+if (x) {
+ x->setHost(t);
+configChanged();
+}
+}
+
+
+
+void KCryptoConfig::slotAuthButtons() {
+HostAuthItem *x = static_cast<HostAuthItem *>(hostAuthList->selectedItem());
+
+if (x) {
+ KSSLCertificateHome::KSSLAuthAction aa = KSSLCertificateHome::AuthDont;
+ int sel = hostCertBG->id(hostCertBG->selected());
+
+ if (sel == hostCertBG->id(hostSend))
+ aa = KSSLCertificateHome::AuthSend;
+ else if (sel == hostCertBG->id(hostPrompt))
+ aa = KSSLCertificateHome::AuthPrompt;
+ else
+ aa = KSSLCertificateHome::AuthDont;
+
+ x->setAction(aa);
+configChanged();
+}
+}
+
+
+void KCryptoConfig::slotAuthCombo() {
+HostAuthItem *x = static_cast<HostAuthItem *>(hostAuthList->selectedItem());
+
+ if (x) {
+ if (hostCertBox->currentItem() == 0)
+ x->setCertName(QString::null);
+ else x->setCertName(hostCertBox->currentText());
+ configChanged();
+ }
+}
+
+
+void KCryptoConfig::slotTestOSSL() {
+KOSSL::self()->destroy();
+
+if (!KOSSL::self()->hasLibSSL()) {
+ KMessageBox::detailedSorry(this,
+ i18n("Failed to load OpenSSL."),
+ i18n("libssl was not found or successfully loaded."),
+ i18n("OpenSSL"));
+ return;
+}
+
+if (!KOSSL::self()->hasLibCrypto()) {
+ KMessageBox::detailedSorry(this,
+ i18n("Failed to load OpenSSL."),
+ i18n("libcrypto was not found or successfully loaded."),
+ i18n("OpenSSL"));
+ return;
+}
+
+ KMessageBox::information(this, i18n("OpenSSL was successfully loaded."), i18n("OpenSSL"));
+}
+
+
+void KCryptoConfig::slotUseEGD() {
+ if (mUseEGD->isChecked()) {
+ mUseEFile->setChecked(false);
+ }
+ mEGDLabel->setText(i18n("Path to EGD:"));
+ mEGDPath->setEnabled(mUseEGD->isChecked());
+ mEGDLabel->setEnabled(mUseEGD->isChecked());
+ configChanged();
+}
+
+
+void KCryptoConfig::slotUseEFile() {
+ if (mUseEFile->isChecked()) {
+ mUseEGD->setChecked(false);
+ }
+ mEGDLabel->setText(i18n("Path to entropy file:"));
+ mEGDPath->setEnabled(mUseEFile->isChecked());
+ mEGDLabel->setEnabled(mUseEFile->isChecked());
+ configChanged();
+}
+
+
+// Lets make this a separate module. it's a whole lot of work and can really be
+// encompassed in a separate module quite nicely.
+void KCryptoConfig::slotGeneratePersonal() {
+#if 0
+ QStringList qslCertTypes;
+
+ qslCertTypes << i18n("Personal SSL")
+ << i18n("Server SSL")
+ << i18n("S/MIME")
+ << i18n("PGP")
+ << i18n("GPG")
+ << i18n("SSL Personal Request")
+ << i18n("SSL Server Request")
+ << i18n("Netscape SSL")
+ << i18n("Server certificate authority", "Server CA")
+ << i18n("Personal certificate authority", "Personal CA")
+ << i18n("Secure MIME certificate authority", "S/MIME CA");
+#endif
+
+}
+
+
+#ifdef HAVE_SSL
+// This gets all the available ciphers from OpenSSL
+bool KCryptoConfig::loadCiphers() {
+unsigned int i;
+SSL_CTX *ctx;
+SSL *ssl;
+SSL_METHOD *meth;
+
+ SSLv2Box->clear();
+ SSLv3Box->clear();
+
+ meth = SSLv2_client_method();
+ SSLeay_add_ssl_algorithms();
+ ctx = SSL_CTX_new(meth);
+ if (ctx == NULL) return false;
+
+ ssl = SSL_new(ctx);
+ if (!ssl) return false;
+
+ CipherItem *item;
+ for (i=0; ; i++) {
+ int j, k;
+ SSL_CIPHER *sc;
+ sc = (meth->get_cipher)(i);
+ if (!sc)
+ break;
+ // Leak of sc*?
+ QString scn(sc->name);
+ if (scn.contains("ADH-") || scn.contains("NULL-") || scn.contains("DES-CBC3-SHA") || scn.contains("FZA-")) {
+ continue;
+ }
+ k = SSL_CIPHER_get_bits(sc, &j);
+
+ item = new CipherItem( SSLv2Box, sc->name, k, j, this );
+ }
+
+ if (ctx) SSL_CTX_free(ctx);
+ if (ssl) SSL_free(ssl);
+
+ // We repeat for SSLv3
+ meth = SSLv3_client_method();
+ SSLeay_add_ssl_algorithms();
+ ctx = SSL_CTX_new(meth);
+ if (ctx == NULL) return false;
+
+ ssl = SSL_new(ctx);
+ if (!ssl) return false;
+
+ for (i=0; ; i++) {
+ int j, k;
+ SSL_CIPHER *sc;
+ sc = (meth->get_cipher)(i);
+ if (!sc)
+ break;
+ // Leak of sc*?
+ QString scn(sc->name);
+ if (scn.contains("ADH-") || scn.contains("NULL-") || scn.contains("DES-CBC3-SHA") || scn.contains("FZA-")) {
+ continue;
+ }
+ k = SSL_CIPHER_get_bits(sc, &j);
+
+ item = new CipherItem( SSLv3Box, sc->name, k, j, this );
+ }
+
+ if (ctx) SSL_CTX_free(ctx);
+ if (ssl) SSL_free(ssl);
+
+return true;
+}
+#endif
+
+
+void KCryptoConfig::setAuthCertLists() {
+QString oldDef, oldHost;
+bool noneDef, noneHost;
+
+// get the old setting
+ oldDef = defCertBox->currentText();
+ oldHost = hostCertBox->currentText();
+ noneDef = (0 == defCertBox->currentItem());
+ noneHost = (0 == hostCertBox->currentItem());
+
+// repopulate
+ defCertBox->clear();
+ hostCertBox->clear();
+ QStringList defCertStrList; // = KSSLCertificateHome::getCertificateList();
+ defCertStrList.append(i18n("None"));
+ for (YourCertItem *x = static_cast<YourCertItem *>(yourSSLBox->firstChild());
+ x;
+ x = static_cast<YourCertItem *>(x->nextSibling())) {
+ defCertStrList.append(x->configName());
+ }
+ defCertBox->insertStringList(defCertStrList);
+ hostCertBox->insertStringList(defCertStrList);
+
+// try to restore it
+
+ defCertBox->setCurrentItem(0);
+ if (!noneDef) {
+ for (int i = 0; i < defCertBox->count(); i++) {
+ if (defCertBox->text(i) == oldDef) {
+ defCertBox->setCurrentItem(i);
+ break;
+ }
+ }
+ }
+
+ if (!noneDef && defCertBox->currentItem() == 0) configChanged();
+
+ hostCertBox->setCurrentItem(0);
+ if (!noneHost) {
+ for (int i = 0; i < hostCertBox->count(); i++) {
+ if (hostCertBox->text(i) == oldHost) {
+ hostCertBox->setCurrentItem(i);
+ break;
+ }
+ }
+ }
+
+ if (!noneHost && hostCertBox->currentItem() == 0) configChanged();
+
+ // Update the host entries too
+ for (HostAuthItem *x =
+ static_cast<HostAuthItem *>(hostAuthList->firstChild());
+ x;
+ x = static_cast<HostAuthItem *>(x->nextSibling())) {
+ QString newValue = QString::null;
+ for (int i = 1; i < hostCertBox->count(); i++) {
+ if (hostCertBox->text(i) == x->getCertName()) {
+ newValue = x->getCertName();
+ break;
+ }
+ }
+ if (newValue != x->getCertName()) configChanged();
+ x->setCertName(newValue);
+ }
+
+
+}
+
+#include "crypto.moc"
diff --git a/kcontrol/crypto/crypto.desktop b/kcontrol/crypto/crypto.desktop
new file mode 100644
index 000000000..127f1adab
--- /dev/null
+++ b/kcontrol/crypto/crypto.desktop
@@ -0,0 +1,229 @@
+[Desktop Entry]
+Icon=encrypted
+Type=Application
+Exec=kcmshell crypto
+DocPath=kcontrol/crypto/index.html
+
+X-KDE-Library=crypto
+X-KDE-ParentApp=kcontrol
+
+Name=Crypto
+Name[af]=Kripto
+Name[ar]=التشفير
+Name[az]=Şifrləmə
+Name[be]=Крыптаграфія
+Name[bg]=Шифроване
+Name[bn]=ক্রিপ্টো
+Name[br]=Krypto
+Name[cs]=Kryptografie
+Name[csb]=Kriptografijô
+Name[da]=Krypto
+Name[de]=Verschlüsselung
+Name[el]=Κρυπτογραφία
+Name[eo]=Ĉifrado
+Name[es]=Criptografía
+Name[et]=Krüpto
+Name[fa]=رمز
+Name[fi]=Salaus
+Name[fo]=Brongling
+Name[fr]=Cryptographie
+Name[fy]=kryptografie
+Name[ga]=Criptiú
+Name[gl]=Cifrado
+Name[he]=הצפנה
+Name[hi]=क्रिप्टो
+Name[hr]=Šifriranje
+Name[hu]=Titkosítás
+Name[id]=Kripto
+Name[is]=Dulritun
+Name[it]=Crittografia
+Name[ja]=暗号
+Name[ka]=კრიპტოგრაფია
+Name[kk]=Криптография
+Name[lo]=ການເຂົ້າລະຫັດ
+Name[lt]=Šifravimas
+Name[lv]=Kripto
+Name[mk]=Криптографија
+Name[mn]=Түлхүүрлэлт
+Name[mt]=Kriptografija
+Name[nb]=Kryptering
+Name[nds]=Verslöteln
+Name[ne]=क्रिप्टो
+Name[nl]=Cryptografie
+Name[nn]=Krypto
+Name[nso]=Tshiro
+Name[pl]=Kryptografia
+Name[pt]=Cifra
+Name[pt_BR]=Criptografia
+Name[ro]=Criptografie
+Name[ru]=Криптография
+Name[se]=Kryptografija
+Name[sk]=Šifrovanie
+Name[sl]=Kripto
+Name[sr]=Криптографија
+Name[sr@Latn]=Kriptografija
+Name[sv]=Krypto
+Name[ta]=சங்கேத
+Name[te]=క్రిప్టో
+Name[tg]=Рамзӣ
+Name[th]=การเข้ารหัส
+Name[tr]=Şifreleme
+Name[tt]=Serläw
+Name[uk]=Криптографія
+Name[uz]=Kripto
+Name[uz@cyrillic]=Крипто
+Name[vi]=Mật mã
+Name[wa]=Criptografeye
+Name[xh]=Imfihlo
+Name[zh_CN]=加密
+Name[zh_TW]=加密
+Comment=Configure SSL, manage certificates, and other cryptography settings
+Comment[af]=Konfigureer Ssl, bestuur sertifikate, en ander kriptografie instellings
+Comment[ar]=قم بتهيئة SSL و ادارة الشهادات اضافة الى اعدادات الضبط الأخرى
+Comment[az]=SSL,vəsiqə,vəsiqə qurğuları,digər şifrləmə qurğuları
+Comment[be]=Настаўленне SSL, кіраванне сертыфікатамі і іншыя настаўленні крыптаграфіі
+Comment[bg]=Настройване и управление на удостоверения за шифроване
+Comment[bn]=এস-এস-এল কনফিগার করুন, সার্টিফিকেট ম্যানেজ করুন এবং ক্রিপ্টোগ্রাফী সংক্রান্ত অন্যান্য মানসমূহ বেছে নিন
+Comment[bs]=Podešavanje SSL, upravljanje certifikatima i ostalim kriptografskim postavkama
+Comment[ca]=Aquí podeu configurar SSL, gestionar certificats, i altres valors de la criptografia
+Comment[cs]=Nastavení SSL, správa certifikátů a ostatní kryptografická nastavení
+Comment[csb]=Kònfigùracëjô SSL, sprôwianié certifikatama, jinszé kriptograficzné ùstôwë
+Comment[cy]=Ffurfweddu SSL, rheoli tystysgrifau a gosodiadau cryptograffeg eraill
+Comment[da]=Indstil SSL, håndtér certifikater og andre kryptografiske indstillinger
+Comment[de]=SSL einrichten, Zertifikate verwalten und andere Einstellungen zur Verschlüsselung von Daten vornehmen
+Comment[el]=Ρύθμιση SSL, διαχείριση πιστοποιητικών, και άλλες ρυθμίσεις κρυπτογραφίας
+Comment[eo]=Agordo de SSL, administrado de atestiloj ktp.
+Comment[es]=Configura SSL, administra los certificados y otras preferencias de criptografía.
+Comment[et]=SSL seadistamine, sertifikaatide haldamine jms.
+Comment[eu]=SSL konfiguratu, ziurtagiriak eta kriptografiaren beste ezarpen bazuk kudeatu
+Comment[fa]=پیکربندی SSL، گواهی‌نامه‌های مدیر و دیگر تنظیمات رمزنگاری
+Comment[fi]=SSL-, sertifikaatti- ja muut salausasetukset
+Comment[fr]=Configuration de SSL, de la cryptographie et gestion des certificats
+Comment[fy]=Hjir kinne jo SSL, sertifikatenbehear en oare kryptografyske ynstellings wizigje
+Comment[ga]=Cumraigh SSL, bainistigh teastais, agus socruithe cripteagrafaíochta eile
+Comment[gl]=Configurar SSL, xestionar certificados, e outras configuracións de cifrado
+Comment[he]=שינוי ההגדרות של SSL, ניהול תעודות, והגדרות הצפנה אחרות
+Comment[hi]=कॉन्फ़िगर एसएसएल, प्रमाणपत्र प्रबंधन, तथा अन्य क्रिप्टोग्राफी विन्यास करे
+Comment[hr]=Konfiguriranje SSL-a, upravljanje potvrdama i ostalim postavkama šifriranja
+Comment[hu]=Az SSL beállítása, a tanúsítványok kezelése és más titkosítási beállítások
+Comment[id]=Konfigurasi SSL, manaje sertifikat, dan seting kriptografi lainnya
+Comment[is]=Stilla SSL, vinna með skilríki og aðrar stillingar dulritunar
+Comment[it]=Configura SSL, gestisce certificati e altre impostazioni crittografiche
+Comment[ja]=SSL の設定、証明書の管理、その他の暗号作成形式の設定
+Comment[ka]= SSL კონფიგურაცია, სერთიფიკატის მენეჯმენტი და სხვა კრიპტოგრაფიული ელემენტების კონფიგურაცია
+Comment[kk]=SSL-ді баптау, сертификаттарды және басқа шифрлау параметрлерді басқару
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ SSL, គ្រប់គ្រង​វិញ្ញាបនបត្រ និង​ការ​កំណត់​រហស្សលិខសាស្ត្រ
+Comment[lo]=ປັບແຕ່ງ SSL, ຈັດການໃບຮັບຮອງແລະຕັ້ງການເຂົ້າລະຫັດອື່ນໆ
+Comment[lt]=Derina SSL, tvarko sertifikatus ir kitus šifravimo parametrus
+Comment[lv]=Konfigurēt SSL, pārvaldīt sertifikātus un citus kriptogrāfijas parametrus
+Comment[mk]=Конфигурација на SSL, менаџмент на сертификати\nи други криптографски поставувања
+Comment[mn]=SSL, Үнэмлэх зохицуулах, ба бусад нууцлалт тохируулах
+Comment[ms]=Konfigur SSL, urus sijil, dan seting kriptografi lain
+Comment[mt]=Ikkonfigura l-SSL, immaniġġja ċertifikati, u konfigurazzjoni oħra tal-kriptografija
+Comment[nb]=Innstilling av SSL, behandling av sertifikater og andre krypteringsinnstillinger
+Comment[nds]=SSL instellen, Zertifikaten plegen, un annere Verslöteln-Instellen
+Comment[ne]=SSL कन्फिगर गर्नुहोस्, प्रमाणपत्रहरू र अन्य गुप्तलेखन सेटिङ प्रबन्ध गर्नुहोस्
+Comment[nl]=Hier kunt u SSL, certificatenbeheer en andere cryptografische instellingen wijzigen
+Comment[nn]=Oppsett av SSL, sertifikat og andre krypteringsinnstillingar
+Comment[nso]=Beakanya SSL, laola dikgonthisiso, le dipeakanyo tsedingwe tsa tshiro
+Comment[oc]=Configura SSL, gestiona certificats, e autres valors de criptografia
+Comment[pa]=SSL ਸੰਰਚਨਾ,ਸਰਟੀਫਕੇਟ ਅਤੇ ਕਰੋਫਟੋਗਰਾਫੀ ਸੈਟਿੰਗ
+Comment[pl]=Konfiguracja SSL, zarządzanie certyfikatami, inne ustawienia kryptograficzne
+Comment[pt]=Configurar o SSL, gerir certificados e outras configurações de cifra
+Comment[pt_BR]=Configura SSL, gerencia certificados e outras configurações de criptografia
+Comment[ro]=Configurează SSL, administrează certificate și alte setări criptografice
+Comment[ru]=Настройка SSL, управление сертификатами и другими параметрами шифрования
+Comment[rw]=Kuboneza SSL, kuyobora impamyabushobozi , n'andi magenamiterere y'umukonobanga.
+Comment[se]=Heivet SSL:a, fuolat duođaštusaid, ja eará kryptografiija heivehusaid
+Comment[sk]=Konfigurácia SSL, správa certifikátov a iné kryptografické nastavenia
+Comment[sl]=Nastavite SSL, urejajte certifikate in ostale nastavitve šifriranja
+Comment[sr]=Подесите SSL, управљајте сертификатима и другим крииптографским поставкама
+Comment[sr@Latn]=Podesite SSL, upravljajte sertifikatima i drugim kriiptografskim postavkama
+Comment[sv]=Anpassa SSL, hantera certifikat, samt andra kryptografiska inställningar
+Comment[ta]=SSLஐ அமை , சான்றிதழ்களை கையாளு, மற்றும் ரகசிய அமைப்புகளை வடிவமை
+Comment[tg]= Мудирияти эътиборномаҳо, ва соири танзими SSL, танзимоти рамзнагузорӣ
+Comment[th]=ปรับแต่ง SSL, จัดการใบรับรอง และตั้งการการเข้ารหัสอื่น ๆ
+Comment[tr]=SSL,sertifika,sertifika ayarları,diğer şifreleme ayarları
+Comment[tt]=SSL, tanıqlıqlar, şulay uq başqa serläw çaraların caylaw üzäge bu
+Comment[uk]=Налаштування SSL, керування сертифікатами та іншими параметрами криптографії
+Comment[uz]=SSL'ni moslash, sertifikatlarni boshqarish va boshqa kriptografiya moslamalari
+Comment[uz@cyrillic]=SSL'ни мослаш, сертификатларни бошқариш ва бошқа криптография мосламалари
+Comment[ven]=Khonifiga SSL, i laula sethifikheithi, na dzine mbekanyo dza khiraiputogirafi
+Comment[vi]=Cấu hình SSL, quản lí giấy chứng nhận và các thiết lập về mật mã khác
+Comment[wa]=Apontiaedje SSL, manaedje les acertinaedjes et ls ôtès tchuzes di criptografeye
+Comment[xh]=Qwalasela i SSL, yenza iziqinisekiso, kunye nezinye izicwangciso zokufihlakeleyo
+Comment[zh_CN]=配置 SSL,管理证书和其它加密设置
+Comment[zh_TW]=設定 SSL、管理憑證和其它的加密設定
+Comment[zu]=Hlanganisela i-SSL, phatha izitifiketi, kanye nezinye izilungiselelo zokuqaqa umbhalo ongaqondakali
+
+Keywords=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security
+Keywords[ar]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security,تشفير,التشفير,شهادات,الشهادات,الشفرات,آمن,الأمن
+Keywords[az]=Şifr,şifrləmə,kriptoqrafiya,SSL,https,vəsiqə,TLS,təhlüükəsizlik,e'tibarlı
+Keywords[be]=Крыптаграфія,шыфраванне,бяспека,бяспечны,Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security
+Keywords[bg]=шифър, шифроване, удостоверения, удостоверение, сигурност, сертификат, сертификати, шифри, ключове, Crypto, Krypto, Cryptography, encryption, SSL, https, certificates, ciphers, TLS, secure, security
+Keywords[ca]=Cripto,Kripto,Criptografia,xifrat,SSL,https,certificats,xifres,TLS,segur,seguretat
+Keywords[cs]=Kryptografie,Šifrování,SSL,https,Certifikáty,Kódy,Krypto,TLS,bezpečnost
+Keywords[csb]=Krypto,Kriptografijô,szifrowanié,SSL,https,cerifikatë,szifrë,TLS,bezpieczno,bezpiek
+Keywords[cy]=Crypto,Krypto,Cryptograffaeth,amgryptio,SSL,https,tystysgrifau,seifferau,TLS,diogel,diogelwch
+Keywords[da]=Crypto,Krypto,Kryptografi,kryptering,SSL,https,certifikater,chifre,TLS,sikker,sikkerhed
+Keywords[de]=Chiffrierung,Crypto,Krypto,Kryptographie,Verschlüsselung,SSL,https,Zertifikate,TLS,Sicherheit
+Keywords[el]=Κρυπτογραφία,Krypto,Κρυπτογράφηση,κρυπτογράφηση,SSL,https,πιστοποιητικά,ciphers,TLS,ασφαλές,ασφάλεια
+Keywords[eo]=ĉifrado,SSL,HTTPS,atestoj,ĉifroj,TLS,sekureco
+Keywords[es]=Criptografía,cifra,SSL,https,certificados,cifrados,TLS,seguro,seguridad
+Keywords[et]=Crypto,krüpto,krüptograafia,krüptimine,SSL,https,sertifikaadid,šifrid,TLS,turvaline,turvalisus
+Keywords[eu]=Crypto,Krypto,Kriptografia,enkriptazioa,SSL,https,ziurtagiriak,zifratuak,TLS,segurua,segurtasuna
+Keywords[fa]=Crypto، Krypto، رمزنگاری، رمزبندی،SSL، https،گواهی‌نامه‌ها، رمزها، TLS،امن، امنیت
+Keywords[fi]=Salaus,Krypto,SSL,https,sertifikaatit,salaukset,TLS,turvallinen,turvallisuus
+Keywords[fr]=cryptographie,cryptage,encryptage,chiffrage,SSL,https,certificats,codes,TLS,sécurisé,sécurité
+Keywords[fy]=crypto,krypto,kryptografie,fersifering,ssl,https,sertifikaten,siferje,tls,befeiliging,feilig,kodearring,kodearre,fersifering
+Keywords[ga]=Krypto,rúnscríobh,criptiú,incriptiúchán,SSL,https,teastais,sifir,TLS,daingean,slándáil
+Keywords[gl]=Criptografia,krypto,cripto,cifrado,SSL,https,certificados,ciphers,TLS,seguro,seguridade
+Keywords[he]=מאובטח,אבטחה,TLS,תעודות,צפנים,https,SSL,הצפנה,Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security
+Keywords[hi]=क्रिप्टो,क्रिप्टोग्राफी,एनक्रिप्शन,एसएसएल,एचटीटीपीएस,प्रमाणपत्र,साइफर्स,टीएलएस,सुरक्षित,सुरक्षा
+Keywords[hr]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security,Šifriranje,šifriranje,šifre,šifra,potvrde,sigurnost,osigurano
+Keywords[hu]=Crypto,Krypto,kriptográfia,titkosítás,SSL,https,tanúsítványok,kódolás,TLS,biztonságos,biztonság
+Keywords[id]=Kripto,Kriptografi,enkripsi,SSL,https,sertifikat,ciphers,TLS,secure,security
+Keywords[is]=Dulritun,Dulmál,Krypto,SSL,https,skilríki,brenglun,TLS,öryggi,öruggt
+Keywords[it]=crittografia,cifratura,SSL,https,certificati,cifrari,TLS,sicuro,sicurezza
+Keywords[ja]=暗号化,Krypto,暗号作成形式,暗号化,SSL,http,証明書,暗号,TLS,セキュア,セキュリティ
+Keywords[km]=Crypto,Krypto,រហស្សលិខសាស្ត្រ,ការ​បម្លែង​ជា​កូដ,SSL,https,វិញ្ញាបនបត្រ,សរសេរ​សម្ងាត់,TLS,សុវត្ថិភាព
+Keywords[lt]=Crypto,Krypto,Cryptography,kriptografija,encryption,šifravimas,SSL,https,certificates,sertifikatai,ciphers,šifrai,TLS,secure,saugus,security,saugumas,apsauga
+Keywords[lv]=Kripto,Kriptogrāfija,kodēšana,SSL,https,sertifkāti,kiperi,TLS,droši,drošība
+Keywords[mk]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security,Крипто,Криптографија,енкрипција,сертификати,шифри,сигурно,сигурност
+Keywords[mn]=Шифрлэх,Crypto,Krypto,Түлхүүрлэлт,Нууцлалт,SSL,https,Үнэмлэх,TLS,Хамгаалалт
+Keywords[mt]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security,kriptografija
+Keywords[nb]=Krypto,Kryptering,SSL,https,sertifikater,TTL,sikkerhet,sikker
+Keywords[nds]=Crypto,Krypto,Kryptografie,verslöteln,SSL,https,Zertifikaten,ciphers,TLS,seker,Sekerheit
+Keywords[ne]=क्रिप्टो, क्राइप्टो, गुप्तलेखन, समक्रमण, SSL, https, प्रमाणपत्र, गुप्त, TLS, सुरक्षण, सुरक्षा
+Keywords[nl]=crypto,krypto,cryptografie,encryptie,ssl,https,certificaten,ciphers,tls,beveiliging,veilig,codering,gecodeerd,versleuteling
+Keywords[nn]=Crypto,Krypto,kryptering,SSL,https,sertifikat,TLS,sikker,tryggleik
+Keywords[nso]=Tshiro,Krypto,Tshiro,sesiro,SSL,https,dikgonthisiso,ciphers,TSL, sireletsa,tshireletso
+Keywords[pa]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security, ਸੁਰੱਖਿਆ, ਇਕਰਿਪਸ਼ਨ
+Keywords[pl]=Krypto,Kryptografia,szyfrowanie,SSL,https,certyfikaty,szyfry,TLS,bezpieczny,bezpieczeństwo
+Keywords[pt]=Cifra,Criptografia,cifra,SSL,https,certificados,cifras,TLS,seguro,segurança,encriptação
+Keywords[pt_BR]=Cripto,Krypto,Criptografia,criptografia,SSL,https,certificados,cifras, TLS,seguro,segurança
+Keywords[ro]=crypto,criptografie,criptare,SSL,https,certificate,cifrare,TLS,sigur,securitate
+Keywords[ru]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security,сертификат,сертификаты,шифрование,подпись
+Keywords[rw]=Crypto,Krypto,Umukonobanga,isobeka,SSL,https,impamyabushobozi,imibarebanga,TLS,byizewe,umutekano
+Keywords[se]=Krypto,krypteren,SSL,https,duođaštusat,cipherat,sihkkarvuohtta,TLS
+Keywords[sk]=Crypto,Krypto,Kryptografia,kryptovanie,SSL,https,certifikáty,šifra,TLS,zabezpečenie,bezpečnosť
+Keywords[sl]=Kripto,Kriptografija,šifriranje,SSL,https,certifikati,šifrirni algoritmi,TLS,varnost,varno
+Keywords[sr]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security,Крипто,Криптографија,енкрипција,сертификати,шифре,безбедност
+Keywords[sr@Latn]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security,Kripto,Kriptografija,enkripcija,sertifikati,šifre,bezbednost
+Keywords[sv]=Crypto,Krypto,Kryptografi,kryptering,SSL,https,certifikat,krypton,TLS,säkra,säkerhet
+Keywords[ta]=ரகசிய,ரகசிய,ரகசியமான,சங்கேதம்,SSL,https,சான்றிதழ்கள்,ciphers,TLS,பாதுகாப்பான,பாதுகாப்பு
+Keywords[tg]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security,рамз,рамзгузорӣ,амният
+Keywords[th]=เข้ารหัส,Krypto,Cryptography,การเข้ารหัส,SSL,https,ใบรับรอง,ciphers,TLS,ปลอดภัย,ความปลอดภัย
+Keywords[tr]=Şifre,şifreleme,şifrebilim,SSL,https,sertifika,TLS,güvenlik,güvenli
+Keywords[uk]=криптографія,криптографія,Cryptography,шифрування,SSL,https,TLS,сертифікати,шифри,Crypto,Krypto,безпека,безпечність
+Keywords[uz]=SSL,https,TLS,Kripto,Kriptografiya,kodlash,sertifikatlar,shifr,xavfsiz,xavfsizlik
+Keywords[uz@cyrillic]=SSL,https,TLS,Крипто,Криптография,кодлаш,сертификатлар,шифр,хавфсиз,хавфсизлик
+Keywords[ven]=Crypto,Krypto,Cryptography,encryption,SSL,https,sethifikheithi,ciphers,TLS,tsireledza,vhutsireledzi
+Keywords[vi]=Mật mã,Mã khoá,Mật mã học,mã hóa,SSL,https,giấy chứng nhận,phá mã,TLS,bảo mật,sự bảo mật
+Keywords[wa]=Crypto,Krypto,criptografeye,SSL,https,certificates,acertinaedjes,ciphers,TLS,secure,security,såve,såvrité
+Keywords[xh]=Imfihlo,Imfihlo,Okufihlakeleyo,ufihlo,SSL,https,iziqinisekiso,imibhalo efihlakeleyo,TLS,khusela,ukhuseleko
+Keywords[zh_CN]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security,加密,加密学,证书,密码,安全
+Keywords[zh_TW]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security,加密,加密學,証書,密碼,安全
+Keywords[zu]=Crypto,Krypto,Ukuqaqa umbhalo ongaqondakali,SSL,https, izitifiketi,imibhalo yekhodi,TLS,vikela,ukuvikela
+
+Categories=Qt;KDE;X-KDE-settings-security;
diff --git a/kcontrol/crypto/crypto.h b/kcontrol/crypto/crypto.h
new file mode 100644
index 000000000..4d335570a
--- /dev/null
+++ b/kcontrol/crypto/crypto.h
@@ -0,0 +1,362 @@
+/**
+ * crypto.h
+ *
+ * Copyright (c) 2000-2001 George Staikos <staikos@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _CRYPTO_H
+#define _CRYPTO_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qcheckbox.h>
+#include <qdatetime.h>
+#include <qlineedit.h>
+#include <qlistview.h>
+#include <qptrlist.h>
+#include <qtabwidget.h>
+#include <qvbuttongroup.h>
+
+#include <kcmodule.h>
+#include <ksimpleconfig.h>
+
+class QGridLayout;
+class QVButtonGroup;
+
+class KComboBox;
+class KCryptoConfig;
+class KPushButton;
+class KSSLCertBox;
+class KSSLSigners;
+class KURLLabel;
+class KURLRequester;
+
+class CipherItem : public QCheckListItem
+{
+public:
+ CipherItem( QListView *view, const QString& cipher, int bits, int maxBits,
+ KCryptoConfig *module );
+ ~CipherItem() {}
+
+ void setCipher( const QString& cipher ) { m_cipher = cipher; }
+ const QString& cipher() const { return m_cipher; }
+ void setBits( int bits ) { m_bits = bits; }
+ int bits() const { return m_bits; }
+
+ QString configName() const;
+
+protected:
+ virtual void stateChange( bool );
+
+private:
+ int m_bits;
+ QString m_cipher;
+ KCryptoConfig *m_module; // just to call configChanged()
+};
+
+
+
+class OtherCertItem : public QListViewItem
+{
+public:
+ OtherCertItem(QListView *view, const QString& sub, const QString& md5, bool perm, int policy, QDateTime exp, KCryptoConfig *module );
+ ~OtherCertItem() {}
+
+ QString configName() const;
+ const QString& getSub() { return _sub; }
+ int getPolicy() { return _policy; }
+ const QString& getMD5() { return _md5; }
+ bool isPermanent() { return _perm; }
+ QDateTime getExpires() { return _exp; }
+ void setPolicy(int x) { _policy = x; }
+ void setPermanent(bool x) { _perm = x; }
+ void setExpires(QDateTime x) { _exp = x; }
+
+protected:
+ virtual void stateChange( bool );
+
+private:
+ QString _sub, _md5;
+ KCryptoConfig *m_module; // just to call configChanged()
+ QDateTime _exp;
+ bool _perm;
+ int _policy;
+};
+
+
+
+
+class YourCertItem : public QListViewItem
+{
+public:
+ YourCertItem(QListView *view, QString pkcs, QString pass, QString name, KCryptoConfig *module );
+ ~YourCertItem() {}
+
+ QString configName() const;
+ QString& getPKCS() { return _pkcs; }
+ void setPKCS(QString pkcs) { _pkcs = pkcs; }
+ QString& getPass() { return _pass; }
+ void setPass(QString pass) { _pass = pass; }
+ QString& getName() { return _name; }
+ void setName(QString name) { _name = name; }
+ QString& getPassCache() { return _cpass; }
+ void setPassCache(QString pass) { _cpass = pass; }
+
+protected:
+ virtual void stateChange( bool );
+
+private:
+ QString _pkcs;
+ QString _pass;
+ QString _cpass;
+ QString _name;
+ KCryptoConfig *m_module; // just to call configChanged()
+};
+
+
+
+
+class CAItem : public QListViewItem
+{
+public:
+ CAItem(QListView *view, QString name, QString cert, bool site, bool email, bool code, KCryptoConfig *module );
+ ~CAItem() {}
+
+ QString configName() const;
+ QString& getName() { return _name; }
+ void setName(QString name) { _name = name; }
+
+ inline QString getCert() const { return _cert; }
+ inline bool getSite() const { return _site; }
+ inline bool getEmail() const { return _email; }
+ inline bool getCode() const { return _code; }
+ inline void setSite(bool x) { _site = x; }
+ inline void setEmail(bool x) { _email = x; }
+ inline void setCode(bool x) { _code = x; }
+
+ bool isNew, modified;
+
+protected:
+ virtual void stateChange( bool );
+
+private:
+ QString _name;
+ QString _cert;
+ bool _site, _email, _code;
+ KCryptoConfig *m_module; // just to call configChanged()
+};
+
+
+
+
+
+class HostAuthItem : public QListViewItem
+{
+public:
+ HostAuthItem(QListView *view, QString host, QString name, KCryptoConfig *module ) : QListViewItem(view, QString::null ) {
+ _name = name; _host = host;
+ m_module = module;
+ setText(0, _host);
+ setText(1, _name);
+ _oname = QString::null;
+ }
+ ~HostAuthItem() {}
+
+ void setAction(KSSLCertificateHome::KSSLAuthAction aa) {
+ _aa = aa;
+ switch (aa) {
+ case KSSLCertificateHome::AuthSend:
+ setText(2, i18n("Send"));
+ break;
+ case KSSLCertificateHome::AuthDont:
+ setText(2, i18n("Don't Send"));
+ break;
+ case KSSLCertificateHome::AuthPrompt:
+ setText(2, i18n("Prompt"));
+ break;
+ default:
+ break;
+ }
+ }
+ KSSLCertificateHome::KSSLAuthAction getAction() const { return _aa; }
+ QString configName() const { return _host; }
+ QString getCertName() const { return _name; }
+ void setCertName(QString name) { _name = name; setText(1, name); }
+ void setHost(QString name) { _host = name; setText(0, name); }
+ void setOriginalName(QString oname) { _oname = oname; }
+ QString originalName() const { return _oname; }
+
+protected:
+
+private:
+ QString _host;
+ QString _name, _oname;
+ KSSLCertificateHome::KSSLAuthAction _aa;
+ KCryptoConfig *m_module; // just to call configChanged()
+};
+
+
+
+
+
+class KCryptoConfig : public KCModule
+{
+ Q_OBJECT
+public:
+ KCryptoConfig(QWidget *parent = 0L, const char *name = 0L, const QStringList &list = QStringList());
+ virtual ~KCryptoConfig();
+
+ void load();
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+
+#ifdef HAVE_SSL
+ bool loadCiphers();
+#endif
+
+public slots:
+ void configChanged();
+
+ void slotGeneratePersonal();
+ void slotUseEGD();
+ void slotUseEFile();
+ void slotSelectCipher(int id);
+
+ void slotTestOSSL();
+
+ void slotExportCert();
+ void slotRemoveCert();
+ void slotVerifyCert();
+ void slotOtherCertSelect();
+ void slotPolicyChanged(int id);
+ void slotPermanent();
+ void slotUntil();
+ void slotDatePick();
+
+ void slotYourImport();
+ void slotYourExport();
+ void slotYourVerify();
+ void slotYourRemove();
+ void slotYourUnlock();
+ void slotYourPass();
+ void slotYourCertSelect();
+
+ void slotNewHostAuth();
+ void slotRemoveHostAuth();
+ void slotAuthItemChanged();
+ void slotAuthText(const QString &t);
+ void slotAuthButtons();
+ void slotAuthCombo();
+
+ void slotCAImport();
+ void slotCARemove();
+ void slotCARestore();
+ void slotCAItemChanged();
+ void slotCAChecked();
+
+protected:
+ void cwCompatible();
+ void cwUS();
+ void cwExp();
+ void cwAll();
+
+private:
+
+ void offerImportToKMail( const QString& certFile );
+ void setAuthCertLists();
+ void genCAList();
+
+ QTabWidget *tabs;
+ QWidget *tabSSL, *tabOSSL;
+
+ QWidget *tabYourSSLCert, *tabOtherSSLCert, *tabSSLCA, *tabSSLCOpts, *tabAuth;
+
+ QListView *SSLv2Box, *SSLv3Box;
+ QCheckBox *mUseTLS, *mUseSSLv2, *mUseSSLv3;
+ QCheckBox *mWarnOnEnter, *mWarnOnLeave;
+
+ /* EGD stuff */
+ QLabel *mEGDLabel;
+ KURLRequester *mEGDPath;
+ QCheckBox *mUseEGD;
+ QCheckBox *mUseEFile;
+
+ /* CipherWizards */
+ QPushButton *mCWall, *mCWus, *mCWexp, *mCWcompatible;
+
+ QCheckBox *mWarnOnUnencrypted, *mWarnOnMixed;
+ QListView *yourSSLBox, *otherSSLBox, *caList;
+ QCheckBox *mWarnSelfSigned, *mWarnExpired, *mWarnRevoked;
+ QPushButton *macAdd, *macRemove;
+ KPushButton *macClear;
+ QListBox *macBox;
+ QPushButton *otherSSLExport, *otherSSLView, *otherSSLRemove, *otherSSLVerify;
+ QPushButton *yourSSLImport, *yourSSLPass, *yourSSLRemove, *yourSSLExport,
+ *yourSSLUnlock, *yourSSLVerify;
+ QRadioButton *yourSSLUseDefault, *yourSSLList, *yourSSLDont;
+ QLineEdit *macCert;
+ KSSLCertBox *oSubject, *oIssuer;
+ KSSLCertBox *ySubject, *yIssuer;
+ QGridLayout *oGrid;
+
+ QVButtonGroup *policyGroup;
+ QVButtonGroup *cacheGroup;
+ QRadioButton *policyAccept, *policyReject, *policyPrompt;
+ QRadioButton *cacheUntil, *cachePerm;
+ QLabel *fromLabel, *untilLabel;
+ QLabel *validFrom, *validUntil;
+ QLabel *yValidFrom, *yValidUntil;
+ KURLLabel *untilDate;
+
+ QVGroupBox *oInfo;
+ KURLRequester *oPath;
+ QPushButton *oTest;
+ QPtrList<OtherCertItem> otherCertDelList;
+ QPtrList<YourCertItem> yourCertDelList;
+ QPtrList<CAItem> caDelList;
+
+ /* Personal Cert Policies tab */
+ KComboBox *defCertBox;
+ KComboBox *hostCertBox;
+ QVButtonGroup *defCertBG;
+ QHButtonGroup *hostCertBG;
+ QRadioButton *defSend, *defPrompt, *defDont;
+ QRadioButton *hostSend, *hostPrompt, *hostDont;
+ QListView *hostAuthList;
+ QPushButton *authAdd, *authRemove;
+ QLineEdit *authHost;
+ QPtrList<HostAuthItem> authDelList;
+ QLabel *yHash, *pHash;
+
+ /* CA stuff */
+ KSSLCertBox *caSubject, *caIssuer;
+ QPushButton *caSSLImport, *caSSLRemove, *caSSLRestore;
+ QCheckBox *caSite, *caEmail, *caCode;
+ KSSLSigners *_signers;
+ QLabel *cHash;
+
+ KConfig *config;
+ KSimpleConfig *policies, *pcerts, *authcfg;
+ KConfig *cacfg;
+
+ bool ___lehack; // to hack around a lineedit problem
+};
+
+#endif
diff --git a/kcontrol/crypto/kdatetimedlg.cpp b/kcontrol/crypto/kdatetimedlg.cpp
new file mode 100644
index 000000000..26001afdd
--- /dev/null
+++ b/kcontrol/crypto/kdatetimedlg.cpp
@@ -0,0 +1,118 @@
+/**
+ * kdatetimedlg.cpp
+ *
+ * Copyright (c) 2001 George Staikos <staikos@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "kdatetimedlg.h"
+#include <qlayout.h>
+#include <qlabel.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kdatepicker.h>
+#include <kpushbutton.h>
+#include <knuminput.h>
+#include <kstdguiitem.h>
+
+KDateTimeDlg::KDateTimeDlg(QWidget *parent, const char *name)
+ : KDialog(parent, name, true) {
+QGridLayout *grid = new QGridLayout(this, 9, 6, marginHint(), spacingHint());
+
+ setCaption(i18n("Date & Time Selector"));
+
+ _date = new KDatePicker(this);
+ grid->addMultiCellWidget(_date, 0, 5, 0, 5);
+
+ grid->addWidget(new QLabel(i18n("Hour:"), this), 7, 0);
+ _hours = new KIntNumInput(this);
+ _hours->setRange(0, 23, 1, false);
+ grid->addWidget(_hours, 7, 1);
+
+ grid->addWidget(new QLabel(i18n("Minute:"), this), 7, 2);
+ _mins = new KIntNumInput(this);
+ _mins->setRange(0, 59, 1, false);
+ grid->addWidget(_mins, 7, 3);
+
+ grid->addWidget(new QLabel(i18n("Second:"), this), 7, 4);
+ _secs = new KIntNumInput(this);
+ _secs->setRange(0, 59, 1, false);
+ grid->addWidget(_secs, 7, 5);
+
+ _ok = new KPushButton(KStdGuiItem::ok(), this);
+ grid->addWidget(_ok, 8, 4);
+ connect(_ok, SIGNAL(clicked()), SLOT(accept()));
+
+ _cancel = new KPushButton(KStdGuiItem::cancel(), this);
+ grid->addWidget(_cancel, 8, 5);
+ connect(_cancel, SIGNAL(clicked()), SLOT(reject()));
+
+}
+
+
+KDateTimeDlg::~KDateTimeDlg() {
+
+}
+
+
+QDate KDateTimeDlg::getDate() {
+ return _date->date();
+}
+
+
+QTime KDateTimeDlg::getTime() {
+QTime rc(_hours->value(), _mins->value(), _secs->value());
+return rc;
+}
+
+
+QDateTime KDateTimeDlg::getDateTime() {
+QDateTime qdt;
+QTime qtime(_hours->value(), _mins->value(), _secs->value());
+
+ qdt.setDate(_date->date());
+ qdt.setTime(qtime);
+
+return qdt;
+}
+
+
+void KDateTimeDlg::setDate(const QDate& qdate) {
+ _date->setDate(qdate);
+}
+
+
+void KDateTimeDlg::setTime(const QTime& qtime) {
+ _hours->setValue(qtime.hour());
+ _mins->setValue(qtime.minute());
+ _secs->setValue(qtime.second());
+}
+
+
+void KDateTimeDlg::setDateTime(const QDateTime& qdatetime) {
+ _date->setDate(qdatetime.date());
+ _hours->setValue(qdatetime.time().hour());
+ _mins->setValue(qdatetime.time().minute());
+ _secs->setValue(qdatetime.time().second());
+}
+
+
+#include "kdatetimedlg.moc"
+
diff --git a/kcontrol/crypto/kdatetimedlg.h b/kcontrol/crypto/kdatetimedlg.h
new file mode 100644
index 000000000..3f25cad2b
--- /dev/null
+++ b/kcontrol/crypto/kdatetimedlg.h
@@ -0,0 +1,60 @@
+/**
+ * kdatetimedlg.h
+ *
+ * Copyright (c) 2001 George Staikos <staikos@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _KDATETIMEDLG_H
+#define _KDATETIMEDLG_H
+
+#include <kdialog.h>
+
+class KDatePicker;
+class KIntNumInput;
+class KPushButton;
+class QDate;
+class QTime;
+class QDateTime;
+
+class KDateTimeDlgPrivate;
+
+class KDateTimeDlg : public KDialog
+{
+ Q_OBJECT
+public:
+ KDateTimeDlg(QWidget *parent = 0L, const char *name = 0L);
+ virtual ~KDateTimeDlg();
+
+ virtual QTime getTime();
+ virtual QDate getDate();
+ virtual QDateTime getDateTime();
+
+ virtual void setDate(const QDate& qdate);
+ virtual void setTime(const QTime& qtime);
+ virtual void setDateTime(const QDateTime& qdatetime);
+
+protected slots:
+
+private:
+ KPushButton *_ok, *_cancel;
+ KDatePicker *_date;
+ KIntNumInput *_hours, *_mins, *_secs;
+
+ KDateTimeDlgPrivate *d;
+};
+
+#endif
diff --git a/kcontrol/css/Makefile.am b/kcontrol/css/Makefile.am
new file mode 100644
index 000000000..9f55b5a75
--- /dev/null
+++ b/kcontrol/css/Makefile.am
@@ -0,0 +1,16 @@
+AM_CPPFLAGS = $(all_includes)
+
+template_DATA = template.css
+templatedir = $(kde_datadir)/kcmcss
+
+kde_module_LTLIBRARIES = kcm_css.la
+kcm_css_la_SOURCES = template.cpp cssconfig.ui csscustom.ui kcmcss.cpp preview.ui
+kcm_css_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_css_la_LIBADD = -lkdeui $(LIB_KIO)
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmcss.pot
+
+xdg_apps_DATA = kcmcss.desktop
diff --git a/kcontrol/css/cssconfig.ui b/kcontrol/css/cssconfig.ui
new file mode 100644
index 000000000..c3d064b48
--- /dev/null
+++ b/kcontrol/css/cssconfig.ui
@@ -0,0 +1,242 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>CSSConfigDialog</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>CSSConfigDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>487</width>
+ <height>195</height>
+ </rect>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Stylesheets&lt;/b&gt;&lt;p&gt;See http://www.w3.org/Style/CSS for further information on cascading style sheets.&lt;/p&gt;</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Stylesheets</string>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Stylesheets&lt;/b&gt;&lt;p&gt;Use this groupbox to determine how Konqueror will render style sheets.&lt;/p&gt;</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>useDefault</cstring>
+ </property>
+ <property name="text">
+ <string>Us&amp;e default stylesheet</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Use default stylesheet&lt;/b&gt;&lt;p&gt;Select this option to use the default stylesheet.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>useUser</cstring>
+ </property>
+ <property name="text">
+ <string>Use &amp;user-defined stylesheet</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Use user-defined stylesheet&lt;/b&gt;&lt;p&gt;If this box is checked, Konqueror will try to load a user-defined style sheet as specified in the location below. The style sheet allows you to completely override the way web pages are rendered in your browser. The file specified should contain a valid style sheet (see http://www.w3.org/Style/CSS for further information on cascading style sheets).&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer9_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>urlRequester</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>useAccess</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>U&amp;se accessibility stylesheet</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Use accessibility stylesheet&lt;/b&gt;&lt;p&gt;Selecting this option will allow you to define a default font, font size, and font color with a few simple clicks of the mouse. Simply wander over to the Customize... dialog and pick out your desired options.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>customize</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Custom&amp;ize...</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>451</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>50</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>useAccess</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>customize</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>useUser</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>urlRequester</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/css/csscustom.ui b/kcontrol/css/csscustom.ui
new file mode 100644
index 000000000..b19e08baf
--- /dev/null
+++ b/kcontrol/css/csscustom.ui
@@ -0,0 +1,554 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>CSSCustomDialog</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>CSSCustomDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>584</width>
+ <height>456</height>
+ </rect>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Stylesheets&lt;/b&gt;&lt;p&gt;See http://www.w3.org/Style/CSS for further information on cascading style sheets.&lt;/p&gt;</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="0" column="1">
+ <property name="name">
+ <cstring>GroupBox3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Font Size</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>7</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>8</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>9</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>10</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>11</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>12</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>14</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>16</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>20</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>24</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>32</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>48</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>64</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>basefontsize</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>txtFontsize</cstring>
+ </property>
+ <property name="text">
+ <string>Base font si&amp;ze:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>basefontsize</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>dontScale</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Use same size for all elements</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Use same size for all elements&lt;/b&gt;&lt;p&gt;Select this option to override custom font sizes in favor of the base font size. All fonts will be displayed in the same size.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>GroupBox3_2</cstring>
+ </property>
+ <property name="title">
+ <string>Images</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Images&lt;/b&gt;&lt;p&gt;</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>hideImages</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Suppress images</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Suppress images&lt;/b&gt;&lt;p&gt;Selecting this will prevent Konqueror from loading images.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>hideBackground</cstring>
+ </property>
+ <property name="text">
+ <string>Suppress background images</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Suppress background images&lt;/b&gt;&lt;p&gt;Selecting this option will prevent Konqueror from loading background images.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>GroupBox7</cstring>
+ </property>
+ <property name="title">
+ <string>Font Family</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Font family&lt;/b&gt;&lt;p&gt;A font family is a group of fonts that resemble one another, with family members that are e.g. bold, italic, or any number of the above.&lt;/p&gt;</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>txtBaseFontFamily</cstring>
+ </property>
+ <property name="text">
+ <string>Base fa&amp;mily:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>fontFamily</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>fontFamily</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;This is the currently selected font family&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>Spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>sameFamily</cstring>
+ </property>
+ <property name="text">
+ <string>Use same family for all text</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Use same family for all text&lt;/b&gt;&lt;p&gt;Select this option to override custom fonts everywhere in favor of the base font.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>Spacer5_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>preview</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Preview</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Preview&lt;/b&gt;&lt;p&gt;Click on this button to see what your selections look like in action.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1_4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>ButtonGroup2</cstring>
+ </property>
+ <property name="title">
+ <string>Colors</string>
+ </property>
+ <property name="exclusive">
+ <bool>false</bool>
+ </property>
+ <property name="radioButtonExclusive">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>blackOnWhite</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Black on white</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Black on White&lt;/b&gt;&lt;p&gt;This is what you normally see.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>whiteOnBlack</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;White on black</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;White on Black&lt;/b&gt;&lt;p&gt;This is your classic inverse color scheme.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>customColor</cstring>
+ </property>
+ <property name="text">
+ <string>Cus&amp;tom</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Custom&lt;/b&gt;&lt;p&gt;Select this option to define a custom color for the default font.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="KColorButton" row="1" column="2">
+ <property name="name">
+ <cstring>foregroundColor</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Foreground color&lt;/b&gt;&lt;p&gt;The foreground color is the color that the text is drawn in.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <spacer row="1" column="3">
+ <property name="name">
+ <cstring>Spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="0" column="0">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>Spacer1_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="0" column="3">
+ <property name="name">
+ <cstring>Spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>txtForeground</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Foreground:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>foregroundColor</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Foreground color&lt;/b&gt;&lt;p&gt;The foreground color is the color that the text is drawn in.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="0" column="2">
+ <property name="name">
+ <cstring>backgroundColor</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Background&lt;/b&gt;&lt;p&gt;Behind this door lays the ability to choose a custom default background.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>txtBackground</cstring>
+ </property>
+ <property name="text">
+ <string>Bac&amp;kground:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>backgroundColor</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Background&lt;/b&gt;&lt;p&gt;This background color is the one displayed behind the text by default. A background image will override this.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>sameColor</cstring>
+ </property>
+ <property name="text">
+ <string>Use same color for all text</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;Use same color for all text&lt;/b&gt;&lt;p&gt;Select this option to apply your chosen color to the default font as well as any custom fonts as specified in a stylesheet.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<tabstops>
+ <tabstop>fontFamily</tabstop>
+ <tabstop>sameFamily</tabstop>
+ <tabstop>basefontsize</tabstop>
+ <tabstop>dontScale</tabstop>
+ <tabstop>blackOnWhite</tabstop>
+ <tabstop>backgroundColor</tabstop>
+ <tabstop>foregroundColor</tabstop>
+ <tabstop>sameColor</tabstop>
+ <tabstop>hideImages</tabstop>
+ <tabstop>hideBackground</tabstop>
+ <tabstop>preview</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in declaration">kcolorbutton.h</include>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/css/kcmcss.cpp b/kcontrol/css/kcmcss.cpp
new file mode 100644
index 000000000..bd72a1375
--- /dev/null
+++ b/kcontrol/css/kcmcss.cpp
@@ -0,0 +1,385 @@
+
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qtextbrowser.h>
+
+#include <kapplication.h>
+#include <kcolorbutton.h>
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <kfontdialog.h>
+#include <kgenericfactory.h>
+#include <kglobalsettings.h>
+#include <kstandarddirs.h>
+#include <kurlrequester.h>
+
+#include "cssconfig.h"
+#include "csscustom.h"
+#include "template.h"
+#include "preview.h"
+
+#include "kcmcss.h"
+
+typedef KGenericFactory<CSSConfig, QWidget> CSSFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_css, CSSFactory("kcmcss") )
+
+CSSConfig::CSSConfig(QWidget *parent, const char *name, const QStringList &)
+ : KCModule(CSSFactory::instance(), parent, name)
+{
+ customDialogBase = new KDialogBase(this, "customCSSDialog", true, QString::null,
+ KDialogBase::Close, KDialogBase::Close, true );
+ customDialog = new CSSCustomDialog(customDialogBase);
+ customDialogBase->setMainWidget(customDialog);
+ configDialog = new CSSConfigDialog(this);
+
+ setQuickHelp( i18n("<h1>Konqueror Stylesheets</h1> This module allows you to apply your own color"
+ " and font settings to Konqueror by using"
+ " stylesheets (CSS). You can either specify"
+ " options or apply your own self-written"
+ " stylesheet by pointing to its location.<br>"
+ " Note that these settings will always have"
+ " precedence before all other settings made"
+ " by the site author. This can be useful to"
+ " visually impaired people or for web pages"
+ " that are unreadable due to bad design."));
+
+
+ QStringList fonts;
+ KFontChooser::getFontList(fonts, 0);
+ customDialog->fontFamily->insertStringList(fonts);
+
+ connect(configDialog->useDefault, SIGNAL(clicked()),
+ SLOT(changed()));
+ connect(configDialog->useAccess, SIGNAL(clicked()),
+ SLOT(changed()));
+ connect(configDialog->useUser, SIGNAL(clicked()),
+ SLOT(changed()));
+ connect(configDialog->urlRequester, SIGNAL(textChanged(const QString&)),
+ SLOT(changed()));
+ connect(configDialog->customize, SIGNAL(clicked()),
+ SLOT(slotCustomize()));
+ connect(customDialog->basefontsize, SIGNAL(highlighted(int)),
+ SLOT(changed()));
+ connect(customDialog->basefontsize, SIGNAL(textChanged(const QString&)),
+ SLOT(changed()));
+ connect(customDialog->dontScale, SIGNAL(clicked()),
+ SLOT(changed()));
+ connect(customDialog->blackOnWhite, SIGNAL(clicked()),
+ SLOT(changed()));
+ connect(customDialog->whiteOnBlack, SIGNAL(clicked()),
+ SLOT(changed()));
+ connect(customDialog->customColor, SIGNAL(clicked()),
+ SLOT(changed()));
+ connect(customDialog->foregroundColor, SIGNAL(changed(const QColor &)),
+ SLOT(changed()));
+ connect(customDialog->backgroundColor, SIGNAL(changed(const QColor &)),
+ SLOT(changed()));
+ connect(customDialog->fontFamily, SIGNAL(highlighted(int)),
+ SLOT(changed()));
+ connect(customDialog->fontFamily, SIGNAL(textChanged(const QString&)),
+ SLOT(changed()));
+ connect(customDialog->sameFamily, SIGNAL(clicked()),
+ SLOT(changed()));
+ connect(customDialog->preview, SIGNAL(clicked()),
+ SLOT(slotPreview()));
+ connect(customDialog->sameColor, SIGNAL(clicked()),
+ SLOT(changed()));
+ connect(customDialog->hideImages, SIGNAL(clicked()),
+ SLOT(changed()));
+ connect(customDialog->hideBackground, SIGNAL(clicked()),
+ SLOT(changed()));
+
+ QVBoxLayout *vbox = new QVBoxLayout(this, 0, 0);
+ vbox->addWidget(configDialog);
+
+ load();
+}
+
+void CSSConfig::load()
+{
+ load( false );
+}
+
+void CSSConfig::load( bool useDefaults )
+{
+ KConfig *c = new KConfig("kcmcssrc", false, false);
+ c->setReadDefaults( useDefaults );
+
+ c->setGroup("Stylesheet");
+ QString u = c->readEntry("Use", "default");
+ configDialog->useDefault->setChecked(u == "default");
+ configDialog->useUser->setChecked(u == "user");
+ configDialog->useAccess->setChecked(u == "access");
+ configDialog->urlRequester->setURL(c->readEntry("SheetName"));
+
+ c->setGroup("Font");
+ customDialog->basefontsize->setEditText(QString::number(c->readNumEntry("BaseSize", 12)));
+ customDialog->dontScale->setChecked(c->readBoolEntry("DontScale", false));
+
+ QString fname = c->readEntry("Family", "Arial");
+ for (int i=0; i < customDialog->fontFamily->count(); ++i)
+ if (customDialog->fontFamily->text(i) == fname)
+ {
+ customDialog->fontFamily->setCurrentItem(i);
+ break;
+ }
+
+ customDialog->sameFamily->setChecked(c->readBoolEntry("SameFamily", false));
+
+ c->setGroup("Colors");
+ QString m = c->readEntry("Mode", "black-on-white");
+ customDialog->blackOnWhite->setChecked(m == "black-on-white");
+ customDialog->whiteOnBlack->setChecked(m == "white-on-black");
+ customDialog->customColor->setChecked(m == "custom");
+ customDialog->backgroundColor->setColor(c->readColorEntry("BackColor", &Qt::white));
+ customDialog->foregroundColor->setColor(c->readColorEntry("ForeColor", &Qt::black));
+ customDialog->sameColor->setChecked(c->readBoolEntry("SameColor", false));
+
+ // Images
+ c->setGroup("Images");
+ customDialog->hideImages->setChecked(c->readBoolEntry("Hide", false));
+ customDialog->hideBackground->setChecked(c->readBoolEntry("HideBackground", true));
+
+ delete c;
+
+ emit changed( useDefaults );
+}
+
+
+void CSSConfig::save()
+{
+ // write to config file
+ KConfig *c = new KConfig("kcmcssrc", false, false);
+
+ c->setGroup("Stylesheet");
+ if (configDialog->useDefault->isChecked())
+ c->writeEntry("Use", "default");
+ if (configDialog->useUser->isChecked())
+ c->writeEntry("Use", "user");
+ if (configDialog->useAccess->isChecked())
+ c->writeEntry("Use", "access");
+ c->writeEntry("SheetName", configDialog->urlRequester->url());
+
+ c->setGroup("Font");
+ c->writeEntry("BaseSize", customDialog->basefontsize->currentText());
+ c->writeEntry("DontScale", customDialog->dontScale->isChecked());
+ c->writeEntry("SameFamily", customDialog->sameFamily->isChecked());
+ c->writeEntry("Family", customDialog->fontFamily->currentText());
+
+ c->setGroup("Colors");
+ if (customDialog->blackOnWhite->isChecked())
+ c->writeEntry("Mode", "black-on-white");
+ if (customDialog->whiteOnBlack->isChecked())
+ c->writeEntry("Mode", "white-on-black");
+ if (customDialog->customColor->isChecked())
+ c->writeEntry("Mode", "custom");
+ c->writeEntry("BackColor", customDialog->backgroundColor->color());
+ c->writeEntry("ForeColor", customDialog->foregroundColor->color());
+ c->writeEntry("SameColor", customDialog->sameColor->isChecked());
+
+ c->setGroup("Images");
+ c->writeEntry("Hide", customDialog->hideImages->isChecked());
+ c->writeEntry("HideBackground", customDialog->hideBackground->isChecked());
+
+ c->sync();
+ delete c;
+
+ // generate CSS template
+ QString templ = locate("data", "kcmcss/template.css");
+ QString dest;
+ if (!templ.isEmpty())
+ {
+ CSSTemplate css(templ);
+
+ dest = kapp->dirs()->saveLocation("data", "kcmcss");
+ dest += "/override.css";
+
+ css.expand(dest, cssDict());
+ }
+
+ // make konqueror use the right stylesheet
+ c = new KConfig("konquerorrc", false, false);
+
+ c->setGroup("HTML Settings");
+ c->writeEntry("UserStyleSheetEnabled", !configDialog->useDefault->isChecked());
+
+ if (configDialog->useUser->isChecked())
+ c->writeEntry("UserStyleSheet", configDialog->urlRequester->url());
+ if (configDialog->useAccess->isChecked())
+ c->writeEntry("UserStyleSheet", dest);
+
+ c->sync();
+ delete c;
+ emit changed(false);
+}
+
+
+void CSSConfig::defaults()
+{
+ load( true );
+}
+
+
+QString px(int i, double scale)
+{
+ QString px;
+ px.setNum(static_cast<int>(i * scale));
+ px += "px";
+ return px;
+}
+
+
+QMap<QString,QString> CSSConfig::cssDict()
+{
+ QMap<QString,QString> dict;
+
+ // Fontsizes ------------------------------------------------------
+
+ int bfs = customDialog->basefontsize->currentText().toInt();
+ dict.insert("fontsize-base", px(bfs, 1.0));
+
+ if (customDialog->dontScale->isChecked())
+ {
+ dict.insert("fontsize-small-1", px(bfs, 1.0));
+ dict.insert("fontsize-large-1", px(bfs, 1.0));
+ dict.insert("fontsize-large-2", px(bfs, 1.0));
+ dict.insert("fontsize-large-3", px(bfs, 1.0));
+ dict.insert("fontsize-large-4", px(bfs, 1.0));
+ dict.insert("fontsize-large-5", px(bfs, 1.0));
+ }
+ else
+ {
+ // TODO: use something harmonic here
+ dict.insert("fontsize-small-1", px(bfs, 0.8));
+ dict.insert("fontsize-large-1", px(bfs, 1.2));
+ dict.insert("fontsize-large-2", px(bfs, 1.4));
+ dict.insert("fontsize-large-3", px(bfs, 1.5));
+ dict.insert("fontsize-large-4", px(bfs, 1.6));
+ dict.insert("fontsize-large-5", px(bfs, 1.8));
+ }
+
+ // Colors --------------------------------------------------------
+
+ if (customDialog->blackOnWhite->isChecked())
+ {
+ dict.insert("background-color", "White");
+ dict.insert("foreground-color", "Black");
+ }
+ else if (customDialog->whiteOnBlack->isChecked())
+ {
+ dict.insert("background-color", "Black");
+ dict.insert("foreground-color", "White");
+ }
+ else
+ {
+ dict.insert("background-color", customDialog->backgroundColor->color().name());
+ dict.insert("foreground-color", customDialog->foregroundColor->color().name());
+ }
+
+ if (customDialog->sameColor->isChecked())
+ dict.insert("force-color", "! important");
+ else
+ dict.insert("force-color", "");
+
+ // Fonts -------------------------------------------------------------
+ dict.insert("font-family", customDialog->fontFamily->currentText());
+ if (customDialog->sameFamily->isChecked())
+ dict.insert("force-font", "! important");
+ else
+ dict.insert("force-font", "");
+
+ // Images
+
+ if (customDialog->hideImages->isChecked())
+ dict.insert("display-images", "background-image : none ! important");
+ else
+ dict.insert("display-images", "");
+ if (customDialog->hideBackground->isChecked())
+ dict.insert("display-background", "background-image : none ! important");
+ else
+ dict.insert("display-background", "");
+
+ return dict;
+}
+
+
+void CSSConfig::slotCustomize()
+{
+ customDialogBase->exec();
+}
+
+
+void CSSConfig::slotPreview()
+{
+
+ QStyleSheetItem *h1 = new QStyleSheetItem(QStyleSheet::defaultSheet(), "h1");
+ QStyleSheetItem *h2 = new QStyleSheetItem(QStyleSheet::defaultSheet(), "h2");
+ QStyleSheetItem *h3 = new QStyleSheetItem(QStyleSheet::defaultSheet(), "h3");
+ QStyleSheetItem *text = new QStyleSheetItem(QStyleSheet::defaultSheet(), "p");
+
+ // Fontsize
+
+ int bfs = customDialog->basefontsize->currentText().toInt();
+ text->setFontSize(bfs);
+ if (customDialog->dontScale->isChecked())
+ {
+ h1->setFontSize(bfs);
+ h2->setFontSize(bfs);
+ h3->setFontSize(bfs);
+ }
+ else
+ {
+ h1->setFontSize(static_cast<int>(bfs * 1.8));
+ h2->setFontSize(static_cast<int>(bfs * 1.6));
+ h3->setFontSize(static_cast<int>(bfs * 1.4));
+ }
+
+ // Colors
+
+ QColor back, fore;
+
+ if (customDialog->blackOnWhite->isChecked())
+ {
+ back = Qt::white;
+ fore = Qt::black;
+ }
+ else if (customDialog->whiteOnBlack->isChecked())
+ {
+ back = Qt::black;
+ fore = Qt::white;
+ }
+ else
+ {
+ back = customDialog->backgroundColor->color();
+ fore = customDialog->foregroundColor->color();
+ }
+
+ h1->setColor(fore);
+ h2->setColor(fore);
+ h3->setColor(fore);
+ text->setColor(fore);
+
+ // Fonts
+
+ h1->setFontFamily(customDialog->fontFamily->currentText());
+ h2->setFontFamily(customDialog->fontFamily->currentText());
+ h3->setFontFamily(customDialog->fontFamily->currentText());
+ text->setFontFamily(customDialog->fontFamily->currentText());
+
+ // Show the preview
+ PreviewDialog *dlg = new PreviewDialog(this, 0, true);
+ dlg->preview->setPaper(back);
+ dlg->preview->viewport()->setFont(QFont(KGlobalSettings::generalFont().family(), bfs));
+
+ dlg->exec();
+
+ delete dlg;
+}
+
+
+
+
+#include "kcmcss.moc"
+
diff --git a/kcontrol/css/kcmcss.desktop b/kcontrol/css/kcmcss.desktop
new file mode 100644
index 000000000..d5a1116f6
--- /dev/null
+++ b/kcontrol/css/kcmcss.desktop
@@ -0,0 +1,233 @@
+[Desktop Entry]
+Icon=stylesheet
+Type=Application
+Exec=kcmshell kcmcss
+DocPath=kcontrol/kcmcss/index.html
+
+
+X-KDE-Library=css
+X-KDE-FactoryName=kcmcss
+X-KDE-ParentApp=kcontrol
+
+Name=Stylesheets
+Name[af]=Stylblaaie
+Name[az]=Stylesheet
+Name[be]=Табліцы стыляў
+Name[bg]=CSS стилове
+Name[bn]=স্টাইলশিট
+Name[br]=Folennoù c'hiz
+Name[ca]=Fulls d'estil
+Name[cs]=Soubory se styly
+Name[csb]=Bôdżi sztélów
+Name[cy]=Dalennau arddull
+Name[da]=Stilark
+Name[de]=Stilvorlagen
+Name[el]=Φύλλα στυλ
+Name[eo]=Stildifinoj
+Name[es]=Hojas de estilo
+Name[et]=Laaditabelid
+Name[eu]=Estilo orriak
+Name[fa]=صفحه سبکها
+Name[fi]=Tyylisivut
+Name[fo]=Sniðørk
+Name[fr]=Feuilles de style
+Name[fy]=Stylblêden
+Name[ga]=Stílbhileoga
+Name[gl]=Follas de Estilo
+Name[he]=גיליונות סגנון
+Name[hi]=स्टाइलशीट
+Name[hr]=Stilska oblikovanja
+Name[hu]=Stíluslapok
+Name[is]=Stílblöð
+Name[it]=Fogli di stile
+Name[ja]=スタイルシート
+Name[kk]=CSS стильдері
+Name[km]=សន្លឹក​រចនាប័ទ្ម
+Name[ko]=스타일시트
+Name[lo]=ສະຕາຍຊິດ
+Name[lt]=Stiliaus aprašymai
+Name[mk]=Дизајни на страница
+Name[mn]=Хэлбэрт хуудас
+Name[ms]=Lemabaran Gaya
+Name[nb]=Stilsett
+Name[nds]=Stilvörlagen
+Name[ne]= शैलीपाना
+Name[nl]=Stijlbladen
+Name[nn]=Stilsett
+Name[nso]=Matlakala a mokgwa
+Name[pl]=Arkusze stylów
+Name[pt]=Folhas de estilo
+Name[pt_BR]=Folhas de estilo
+Name[ro]=Foi de stil
+Name[ru]=Стили CSS
+Name[rw]=Impapuromisusire
+Name[se]=Stiilaárkkat
+Name[sk]=Štýly
+Name[sl]=Slogovne predloge
+Name[sr]=Описи стилова
+Name[sr@Latn]=Opisi stilova
+Name[ss]=Emashidi yetitayhela
+Name[sv]=Stilmallar
+Name[ta]=அமைக்கும் பாணி
+Name[tg]=Намуди варақа
+Name[th]=สไตล์ชีต
+Name[tr]=Stil Kağıtları
+Name[tt]=Bizütabaq
+Name[uk]=Таблиці стилів
+Name[uz]=Staylshitlar
+Name[uz@cyrillic]=Стайлшитлар
+Name[ven]=Siatari la Tshitaela
+Name[vi]=Kiểu dáng mẫu
+Name[wa]=Foyes di stîle
+Name[xh]=Amakhasi ohlobo oluthile
+Name[zh_CN]=样式表
+Name[zh_TW]=樣式表單
+Name[zu]=Amakhasi esitayela
+Comment=Configure the stylesheets used to render web pages
+Comment[af]=Konfigureer die stylblaaie gebruik word na interpreteer web bladsye
+Comment[az]=Veb səhifələrində işlədilən tərz laylarını quraşdır
+Comment[be]=Настаўленне табліц стыляў для малявання старонак Сеціва
+Comment[bg]=Настройване на използваните CSS стилове в уеб страниците
+Comment[bn]=ওয়েব পেজ দেখাতে ব্যবহৃত বিভিন্ন স্টাইলশিট কনফিগার করুন
+Comment[br]=Kefluniañ ar folennoù c'hiz evit ar pajennoù gwiad
+Comment[bs]=Podesite stilove koji se koriste za prikazivanje web stranica
+Comment[ca]=Aquí podeu configurar els fulls d'estil emprats per a renderitzar les pàgines web
+Comment[cs]=Zde je možné nastavit styly používané pro zobrazování HTML
+Comment[csb]=Kònfigùracëjô bògów sztélów do wëskrzënianiô internetowich starnów
+Comment[cy]=Ffurfweddu'r dalennau arddull sy'n trosi tudalennau gwe.
+Comment[da]=Indstil stilark brugt til at vise netsider
+Comment[de]=Stilvorlagen für die Anzeige von HTML-Seiten einrichten
+Comment[el]=Ρυθμίστε τα φύλλα στυλ που χρησιμοποιούνται για την εμφάνιση των ιστοσελίδων
+Comment[eo]=Agordo de la stildifinoj por HTML-prezento
+Comment[es]=Configuración de las hojas de estilo usadas para mostrar páginas web
+Comment[et]=Laaditabelite seadistamine veebilehtede renderdamiseks
+Comment[eu]=Kondiguratu HTML errenderizatzeko erabilitako estilo orriak
+Comment[fa]=پیکربندی صفحه سبکهای مورد استفادۀ پرداخت صفحات وب
+Comment[fi]=WWW-sivuilla käytettävien tyylisivujen asetukset
+Comment[fr]=Configuration des feuilles de style utilisées pour l'affichage HTML
+Comment[fy]=Hjir kinne jo de stylblêden ynstelle dy brûkt wurde foar de werjefte fan websiden
+Comment[ga]=Cumraigh na stílbhileoga a úsáidtear chun leathanaigh ghréasáin a rindreáil
+Comment[gl]=Configurar as follas de estilo empregadas para visualizar páxinas
+Comment[he]=שינוי הגדרות גיליונות הסגנון המשמשים להצגת דפי אינטרנט
+Comment[hi]=वेब पृष्ठ प्रस्तुत करने के लिए उपयोग में आने वाले स्टाइलशीट कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje stilskih oblikovanja koja se upotrebljavaju za prikaz web sadržaja
+Comment[hu]=A weboldalak megjelenítéséhez használt stíluslapok beállításai
+Comment[is]=Stilla stílblöð sem vinna á HTML skrám
+Comment[it]=Configura i fogli di stile da usare per visualizzare le pagine web
+Comment[ja]=ウェブページのレンダリングに使用するスタイルシートを設定
+Comment[ka]=CSS კონფიგურაცია ვებ გვერდების ასახვისთვის
+Comment[kk]=Веб-парақтарды көрсеткенде қолданатын CSS-стильдерді баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​សន្លឹក​រចនាប័ទ្ម ដែល​ប្រើ​ដើម្បី​បង្ហាញ​ទំព័រ​បណ្ដាញ
+Comment[ko]=웹 페이지를 나타내는 스타일시트를 설정합니다
+Comment[lo]=ປັບແຕ່ງສະຕາຍຊິດໃນການສະແດງຜົນ HTML
+Comment[lt]=Konfigūruoti stiliaus aprašymus naudojamus tinklalapių atvaizdavimui
+Comment[lv]=Konfigurēt stilus, ko izmantos tīmekļa lapu attainošanai
+Comment[mk]=Конфигурирајте ги страниците со дизајн\nшто се користат за прикажување веб-страници
+Comment[mn]=Хэлбэрт хуудас хэрэглэдэг HTML-хуудсуудын тохируулга
+Comment[ms]=Konfigur lembaran gaya yang digunakan untuk merealisasikan laman web
+Comment[mt]=Ikkonfigura l-istylesheets li jintużaw biex juru paġni fuq il-web.
+Comment[nb]=Her kan du sette opp stilsett for visning av nettsider
+Comment[nds]=Stell de Stilvörlaag in, de för't Wiesen vun Nettsieden bruukt warrt
+Comment[ne]=रेन्डर वेब पृष्ठहरू प्रयोग गर्ने शैलीपाना कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u de stijlbladen instellen die gebruikt worden voor de weergave van webpagina's
+Comment[nn]=Oppsett av stilsett for vising av nettsider
+Comment[nso]=Beakanya matlakala a mokgwa ao a somisitswego go neela matlakala a web
+Comment[pa]= ਵੈਬ ਸਫਿਆਂ ਨੂੰ ਪੇਸ਼ ਕਰਨ ਲਈ ਸਾਰਣੀਕਾਰ ਸ਼ੀਟਾਂ ਦੀ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja arkuszy stylów do wyświetlania stron internetowych
+Comment[pt]=Configuração das folhas de estilo, usadas para mostrar as páginas Web
+Comment[pt_BR]=Configura as folhas de estilo utilizadas para renderizar páginas da web
+Comment[ro]=Configurează foile de stil utilizate la randarea paginilor de web
+Comment[ru]=Настройка стилей CSS, используемых при показа веб-страниц
+Comment[rw]=Kuboneza impapuromisusire zikoreshwa mu gutanga amapaji rubugamakuru
+Comment[se]=Heivet stiilaárkkaid mainna čájeha HTML-siidduid
+Comment[sk]=Nastavenie štýlov používaných pre zobrazovanie HTML
+Comment[sl]=Nastavite slogovne predloge za upodabljanje HTML
+Comment[sr]=Подешавање стилова који се користе за приказ веб страница
+Comment[sr@Latn]=Podešavanje stilova koji se koriste za prikaz veb stranica
+Comment[sv]=Anpassa stilmallarna som används för att visa webbsidor
+Comment[ta]=வலை பக்கங்கள் நடைமுறைக்கு பயன்படுத்தப்பட்ட பாணிபட்டியல்களை வடிவமை
+Comment[tg]=Танзимоти услуби CSS, дар вақти равшан созии варақаҳои вэб истифода мешаванд.
+Comment[th]=ปรับแต่งสไตล์ชีตที่ใช้ในการแสดงผล HTML
+Comment[tr]=Stylesheet ayarlarını yapın
+Comment[tt]=Web-bitlär eşkärtkändä qullanıla torğan tışlaw caylawları
+Comment[uk]=Налаштування таблиць стилів для відображення сторінок Тенет
+Comment[uz]=Veb-sahifalarni koʻrsatishda ishlatiladigan CSS uslublarini moslash
+Comment[uz@cyrillic]=Веб-саҳифаларни кўрсатишда ишлатиладиган CSS услубларини мослаш
+Comment[ven]=Dzudzanyani tshitaela tsha siatari tshino shumiswa u nekedza masiatari a webu
+Comment[vi]=Cấu hình kiểu dáng mẫu được dùng để hỗ trợ trang mạng
+Comment[wa]=Apontyî les foyes di stîle eployeyes ezès pådjes waibe
+Comment[xh]=Qwalasela uhlobo lwamakhasi asebenziswa ukuchaza amaphepha e web
+Comment[zh_CN]=配置用来渲染网页的样式表
+Comment[zh_TW]=設定用來顯示網頁的樣式表單
+Comment[zu]=Hlanganisela amakhasi esitayela asetshenziswa ukunikeza amakhasi e-web
+
+Keywords=CSS,HTML,style,stylesheet,accessibility
+Keywords[az]=CSS,HTML,style,tərz,stylesheet,yetişmə,yetişmə qabiliyyəti
+Keywords[be]=Стыль,табліца стыляў,даступнасць,CSS,HTML,style,stylesheet,accessibility
+Keywords[bg]=стил, стилове, страници, достъпност, CSS, HTML, style, stylesheet, accessibility
+Keywords[br]=CSS,HTML,giz,folenn c'hiz,haezadusted
+Keywords[ca]=CSS,HTML,estil,full d'estil,accessibilitat
+Keywords[cs]=CSS,HTML,styl,style,stylesheet,zpřístupnění
+Keywords[csb]=CSS,HTML,sztél,bòga sztélu,przistãpnosc
+Keywords[cy]=CSS,HTML,ardull,dalen arddull,hygyrchedd
+Keywords[da]=CSS,HTML,stil,stilark,tilgængelighed
+Keywords[de]=CSS,HTML,Stylesheet,Stilvorlagen,Zugangshilfen
+Keywords[el]=CSS,HTML,στυλ,φύλλο στυλ,προσιτότητα
+Keywords[eo]=CSS,HTML,stilo,stildifino,alirebleco
+Keywords[es]=CSS,HTML,estilo,hoja de estilo,accesibilidad
+Keywords[et]=CSS,HTML,stiil,laaditabel
+Keywords[eu]=CSS,HTML,estiloa,estilo orria,erabilerraztasuna
+Keywords[fa]=CSS، زنگام، سبک، صفحه سبک، دستیابی‌پذیری
+Keywords[fi]=CSS,HTML,tyyli,tyylimäärittely,esteettömyys
+Keywords[fo]=CSS,HTML,snið,sniðørk,sniðark
+Keywords[fr]=CSS,HTML,style,feuille de style,accessibilité
+Keywords[fy]=CSS,HTML,styl,stylblêd,tagonklikens,stylblêden
+Keywords[ga]=CSS,HTML,stíl,stílbhileog,inrochtaineacht
+Keywords[gl]=CSS,HTML,estilo,follas de estilo,acesibilidade
+Keywords[he]=CSS,HTML,סגנון,גיליון סגנון,נגישות,style,stylesheet,accessibility
+Keywords[hi]=सीएसएस,एचटीएमएल,स्टाइल,स्टाइलशीट,पहुँच
+Keywords[hr]=CSS,HTML,style,stylesheet,accessibility,stil,stilsko oblikovanje,pristupačnost
+Keywords[hu]=CSS,HTML,stílus,stíluslap,elérhetőség
+Keywords[id]=Gaya,style,theme,themes,tampilan,aksesbilitas
+Keywords[is]=CSS,HTML,stíll,stílblað,aðgengi,aðgengilegheit,aðgangur
+Keywords[it]=CSS,HTML,stile,fogli di stile,stylesheet,accessibilità
+Keywords[ja]=CSS,HTML,スタイル,スタイルシート,アクセシビリティ
+Keywords[km]=CSS,HTML,រចនាប័ទ្ម,សន្លឹក​រចនាប័ទ្ម,ភាព​អាច​ចូល​ដំណើរការ​បាន
+Keywords[ko]=CSS,HTML,스타일,스타일시트,접근성
+Keywords[lt]=CSS,HTML,style,stylesheet,accessibility,stilius,stiliaus aprašymas
+Keywords[lv]=CSS,HTML,stils,stilusaraksts,pieejamība
+Keywords[mk]=CSS,HTML,style,stylesheet,accessibility,стил,страница,дизајн,пристапност
+Keywords[mn]=CSS,HTML,Stylesheet,Хэлбэрт хуудас,Хэрэглэх тохь
+Keywords[mt]=CSS,HTML,style,stylesheet,accessibility,aċċessibbiltà
+Keywords[nb]=CSS,HTML,stil,stilsett,tilgjengelighet
+Keywords[nds]=CSS,HTML,Stil,Stilvörlaag,Behinnerte
+Keywords[ne]=CSS, HTML, शैली, शैलीपाना, पहुँचता
+Keywords[nl]=CSS,HTML,stijl,stylesheet,toegankelijkheid,stijlbladen
+Keywords[nn]=CSS,HTML,stilsett,tilgjenge,brukarstilsett
+Keywords[nso]=CSS,HTML,mokgwa,letlakala la mokgwa,tsenelo
+Keywords[pa]=CSS,HTML,style,stylesheet,accessibility, ਸ਼ੈਲੀ
+Keywords[pl]=CSS,HTML,styl,arkusz stylu,dostępność
+Keywords[pt]=CSS,HTML,estilo,stylesheet,acessibilidade
+Keywords[pt_BR]=CSS,HTML,estilo,folha de estilo,acessibilidade
+Keywords[ro]=CSS,HTML,stil,foi de stil,accesibilitate
+Keywords[rw]=CSS,HTML,imisusire,urupapuromisusire,ukugerwaho
+Keywords[se]=CSS,HTML,stiila,stiilaárka
+Keywords[sk]=CSS,HTML,štýl,style,stylesheet,prístupnosť
+Keywords[sl]=CSS,HTML,slog,slogovne predloge,dostopnost
+Keywords[sr]=CSS,HTML,style,stylesheet,accessibility,стил,опис стила,приступачност
+Keywords[sr@Latn]=CSS,HTML,style,stylesheet,accessibility,stil,opis stila,pristupačnost
+Keywords[sv]=CSS,HTML,stil,stilmall,handikappstöd
+Keywords[ta]=CSS,HTML,பாணிe,விரிப்பட்டியல்,அணுகல்
+Keywords[tr]=CSS,HTML,style,stil,stylesheet,erişim,erişilebilirlik
+Keywords[uk]=CSS,HTML,стиль,таблиця стилів,доступність
+Keywords[uz]=CSS,HTML,uslub,stylesheet,qulayliklar
+Keywords[uz@cyrillic]=CSS,HTML,услуб,stylesheet,қулайликлар
+Keywords[ven]=CSS,HTML,tshitaela,siatari la tshitaela,u dzhenea
+Keywords[vi]=CSS,HTML,kiểu dáng,kiểu dáng mẫu,hỗ trợ người tàn tật
+Keywords[wa]=CSS,HTML,style,stylesheet,accessibility,stîle,foye di stîle,accessibilité
+Keywords[xh]=CSS,HTML,uhlobo,ikhasi lohlobo oluthile,unikezelo
+Keywords[zh_CN]=CSS,HTML,style,stylesheet,accessibility,风格,样式表,辅助功能
+Keywords[zh_TW]=CSS,HTML,style,stylesheet,accessibility,風格,風格表單,可用性
+Keywords[zu]=CSS,HTML,isitayela,ikhasi lesitayela,ukungena
+
+Categories=Qt;KDE;X-KDE-settings-webbrowsing;
diff --git a/kcontrol/css/kcmcss.h b/kcontrol/css/kcmcss.h
new file mode 100644
index 000000000..decf5c3a3
--- /dev/null
+++ b/kcontrol/css/kcmcss.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2000 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#ifndef __KCMCSS_H__
+#define __KCMCSS_H__
+
+
+#include <qmap.h>
+
+#include <kcmodule.h>
+
+
+class CSSConfigDialog;
+class CSSCustomDialog;
+class KDialogBase;
+
+
+class CSSConfig : public KCModule
+{
+ Q_OBJECT
+
+public:
+
+ CSSConfig(QWidget *parent = 0L, const char *name = 0L, const QStringList &list =QStringList() );
+
+ void load();
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+
+public slots:
+
+ void slotPreview();
+ void slotCustomize();
+
+private:
+
+ QMap<QString,QString> cssDict();
+
+ CSSConfigDialog *configDialog;
+ CSSCustomDialog *customDialog;
+ KDialogBase *customDialogBase;
+};
+
+
+#endif
diff --git a/kcontrol/css/preview.ui b/kcontrol/css/preview.ui
new file mode 100644
index 000000000..438d40d37
--- /dev/null
+++ b/kcontrol/css/preview.ui
@@ -0,0 +1,95 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>PreviewDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>PreviewDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>558</width>
+ <height>349</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Preview</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KSeparator" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Line1</cstring>
+ </property>
+ <property name="orientation">
+ <number>5</number>
+ </property>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QTextBrowser" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>preview</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;qt&gt;
+
+&lt;h1&gt;Heading 1&lt;/h1&gt;&lt;br/&gt;
+&lt;h2&gt;Heading 2&lt;/h2&gt;&lt;br/&gt;
+&lt;h3&gt;Heading 3&lt;/h3&gt;&lt;br/&gt;
+
+&lt;p&gt;User defined stylesheets allow increased
+accessibility for visually handicapped
+people.&lt;/p&gt;
+
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>PreviewDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in declaration">kseparator.h</include>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kseparator.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/css/template.cpp b/kcontrol/css/template.cpp
new file mode 100644
index 000000000..94eba6053
--- /dev/null
+++ b/kcontrol/css/template.cpp
@@ -0,0 +1,45 @@
+
+
+#include <qfile.h>
+
+
+#include "template.h"
+
+
+bool CSSTemplate::expand(QString destname, const QMap<QString,QString> &dict)
+{
+ QFile inf(_filename);
+ if (!inf.open(IO_ReadOnly))
+ return false;
+ QTextStream is(&inf);
+
+ QFile outf(destname);
+ if (!outf.open(IO_WriteOnly))
+ return false;
+ QTextStream os(&outf);
+
+ QString line;
+ while (!is.eof())
+ {
+ line = is.readLine();
+
+ int start = line.find('$');
+ if (start >= 0)
+ {
+ int end = line.find('$', start+1);
+ if (end >= 0)
+ {
+ QString expr = line.mid(start+1, end-start-1);
+ QString res = dict[expr];
+
+ line.replace(start, end-start+1, res);
+ }
+ }
+ os << line << endl;
+ }
+
+ inf.close();
+ outf.close();
+
+ return true;
+}
diff --git a/kcontrol/css/template.css b/kcontrol/css/template.css
new file mode 100644
index 000000000..dd2afaba9
--- /dev/null
+++ b/kcontrol/css/template.css
@@ -0,0 +1,77 @@
+/*
+ * Font sizes
+ */
+
+* {
+ font-size : $fontsize-base$ ! important;
+}
+
+SMALL, SUB, SUP {
+ font-size : $fontsize-small-1$ ! important;
+}
+
+BIG {
+ font-size : $fontsize-large-1$ ! important;
+}
+
+H1, H1 A {
+ font-size : $fontsize-large-5$ ! important;
+}
+
+H2, H2 A {
+ font-size : $fontsize-large-4$ ! important;
+}
+
+H3, H3 A {
+ font-size : $fontsize-large-3$ ! important;
+}
+
+H4, H4 A {
+ font-size : $fontsize-large-2$ ! important;
+}
+
+H5, H5 A {
+ font-size : $fontsize-large-1$ ! important;
+}
+
+
+/*
+ * Colors
+ */
+
+* {
+ background : $background-color$ ! important;
+ color : $foreground-color$
+ $force-color$;
+}
+
+BODY {
+ color : $foreground-color$ ! important;
+}
+
+TABLE, TD {
+ border-color : $foreground-color$;
+}
+
+
+/*
+ * Font family
+ */
+
+* {
+ font-family : $font-family$
+ $force-font$;
+}
+
+
+/*
+ * Images
+ */
+
+IMG {
+ $display-images$;
+}
+
+BODY {
+ $display-background$;
+}
diff --git a/kcontrol/css/template.h b/kcontrol/css/template.h
new file mode 100644
index 000000000..2b701a238
--- /dev/null
+++ b/kcontrol/css/template.h
@@ -0,0 +1,21 @@
+#ifndef __TEMPLATE_H__
+#define __TEMPLATE_H__
+
+
+#include <qstring.h>
+#include <qmap.h>
+
+class CSSTemplate
+{
+public:
+
+ CSSTemplate(QString fname) : _filename(fname) {};
+ bool expand(QString destname, const QMap<QString,QString> &dict);
+
+protected:
+ QString _filename;
+
+};
+
+
+#endif
diff --git a/kcontrol/display/Makefile.am b/kcontrol/display/Makefile.am
new file mode 100644
index 000000000..442639b38
--- /dev/null
+++ b/kcontrol/display/Makefile.am
@@ -0,0 +1,16 @@
+kde_module_LTLIBRARIES = kcm_display.la
+
+kcm_display_la_SOURCES = display.cpp
+
+kcm_display_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_display_la_LIBADD = $(LIB_KUTILS)
+AM_CPPFLAGS = $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = display.h
+
+xdg_apps_DATA = display.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/display.pot
diff --git a/kcontrol/display/display.cpp b/kcontrol/display/display.cpp
new file mode 100644
index 000000000..1c514810c
--- /dev/null
+++ b/kcontrol/display/display.cpp
@@ -0,0 +1,110 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003-2004 Nadeem Hasan <nhasan@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qapplication.h>
+#include <qlayout.h>
+#include <qtabwidget.h>
+
+#include <kcmoduleloader.h>
+#include <kdialog.h>
+#include <kgenericfactory.h>
+
+#include "display.h"
+
+typedef KGenericFactory<KCMDisplay, QWidget> DisplayFactory;
+K_EXPORT_COMPONENT_FACTORY ( kcm_display, DisplayFactory( "display" ) )
+
+KCMDisplay::KCMDisplay( QWidget *parent, const char *name, const QStringList& )
+ : KCModule( parent, name )
+ , m_changed(false)
+{
+ m_tabs = new QTabWidget( this );
+
+ addTab( "randr", i18n( "Size && Orientation" ) );
+ addTab( "nvidiadisplay", i18n( "Graphics Adaptor" ) );
+ addTab( "nvidia3d", i18n( "3D Options" ) );
+ addTab( "kgamma", i18n( "Monitor Gamma" ) );
+ if ( QApplication::desktop()->isVirtualDesktop() )
+ addTab( "xinerama", i18n( "Multiple Monitors" ) );
+ addTab( "energy", i18n( "Power Control" ) );
+
+ QVBoxLayout *top = new QVBoxLayout( this, 0, KDialog::spacingHint() );
+ top->addWidget( m_tabs );
+
+ setButtons( Apply|Help );
+ load();
+}
+
+void KCMDisplay::addTab( const QString &name, const QString &label )
+{
+ QWidget *page = new QWidget( m_tabs, name.latin1() );
+ QVBoxLayout *top = new QVBoxLayout( page, KDialog::marginHint() );
+
+ KCModule *kcm = KCModuleLoader::loadModule( name, page );
+
+ if ( kcm )
+ {
+ top->addWidget( kcm );
+ m_tabs->addTab( page, label );
+
+ connect( kcm, SIGNAL( changed(bool) ), SLOT( moduleChanged(bool) ) );
+ m_modules.insert(kcm, false);
+ }
+ else
+ delete page;
+}
+
+void KCMDisplay::load()
+{
+ for (QMap<KCModule*, bool>::ConstIterator it = m_modules.begin(); it != m_modules.end(); ++it)
+ it.key()->load();
+}
+
+void KCMDisplay::save()
+{
+ for (QMap<KCModule*, bool>::Iterator it = m_modules.begin(); it != m_modules.end(); ++it)
+ if (it.data())
+ it.key()->save();
+}
+
+void KCMDisplay::moduleChanged( bool isChanged )
+{
+ QMap<KCModule*, bool>::Iterator currentModule = m_modules.find(static_cast<KCModule*>(const_cast<QObject*>(sender())));
+ Q_ASSERT(currentModule != m_modules.end());
+ if (currentModule.data() == isChanged)
+ return;
+
+ currentModule.data() = isChanged;
+
+ bool c = false;
+
+ for (QMap<KCModule*, bool>::ConstIterator it = m_modules.begin(); it != m_modules.end(); ++it) {
+ if (it.data()) {
+ c = true;
+ break;
+ }
+ }
+
+ if (m_changed != c) {
+ m_changed = c;
+ emit changed(c);
+ }
+}
+
+#include "display.moc"
diff --git a/kcontrol/display/display.desktop b/kcontrol/display/display.desktop
new file mode 100644
index 000000000..8ed7bbdc5
--- /dev/null
+++ b/kcontrol/display/display.desktop
@@ -0,0 +1,154 @@
+[Desktop Entry]
+Icon=kscreensaver
+Type=Application
+Exec=kcmshell display
+DocPath=kcontrol/kcmdisplay/index.html
+
+X-KDE-Library=display
+X-KDE-FactoryName=display
+X-KDE-ParentApp=kcontrol
+Name=Display
+Name[af]=Skerm
+Name[ar]=عرض
+Name[az]=Displey
+Name[be]=Манітор
+Name[bg]=Монитор
+Name[bn]=ডিসপ্লে
+Name[br]=Diskwel
+Name[bs]=Ekran
+Name[ca]=Pantalla
+Name[cs]=Obrazovka
+Name[csb]=Ekran
+Name[cy]= Arddangos
+Name[da]=Skærm
+Name[de]=Anzeige
+Name[el]=Οθόνη
+Name[eo]=Vidigilo
+Name[es]=Pantalla
+Name[et]=Monitor
+Name[eu]=Pantaila
+Name[fa]=نمایش
+Name[fi]=Näyttö
+Name[fr]=Affichage
+Name[fy]=Byldskerm
+Name[gl]=Pantalla
+Name[he]=תצוגה
+Name[hi]=रूप-रंग
+Name[hr]=Zaslon
+Name[hu]=Képernyő
+Name[is]=Skjár
+Name[ja]=ディスプレイ
+Name[ka]=ჩვენება
+Name[kk]=Дисплей
+Name[km]=បង្ហាញ
+Name[ko]=디스플레이
+Name[lt]=Ekranas
+Name[lv]=Ekrāns
+Name[mk]=Приказ
+Name[mn]=Дэлгэц
+Name[ms]=Paparan
+Name[mt]=Skrin
+Name[nb]=Skjerm
+Name[nds]=Dorstellen
+Name[ne]=प्रदर्शन गर्नुहोस्
+Name[nl]=Beeldscherm
+Name[nn]=Skjerm
+Name[pa]=ਝਲਕ
+Name[pl]=Ekran
+Name[pt]=Ecrã
+Name[pt_BR]=Tela
+Name[ro]=Monitor
+Name[ru]=Дисплей
+Name[rw]=Kwerekana
+Name[se]=Šearbma
+Name[sk]=Displej
+Name[sl]=Zaslon
+Name[sr]=Екран
+Name[sr@Latn]=Ekran
+Name[sv]=Bildskärm
+Name[ta]=காட்சி
+Name[tg]=Намоиш
+Name[th]=การแสดงผล
+Name[tr]=Görüntü
+Name[tt]=Kürsätü
+Name[uk]=Дисплей
+Name[uz]=Displey
+Name[uz@cyrillic]=Дисплей
+Name[vi]=Hiển thị
+Name[wa]=Håynaedje
+Name[zh_CN]=显示
+Name[zh_TW]=顯示
+Comment=Display Settings
+Comment[af]=Skerm Instellings
+Comment[ar]=إعدادت العرض
+Comment[az]=Displey Qurğuları
+Comment[be]=Настаўленні манітора
+Comment[bg]=Настройване на екрана
+Comment[bn]=ডিসপ্লে সেটিংস
+Comment[br]=Kefluniañ an diskwel
+Comment[bs]=Postavke ekrana
+Comment[ca]=Arranjament de la pantalla
+Comment[cs]=Nastavení obrazovky
+Comment[csb]=Ùstôw ekranu
+Comment[cy]=Gosodiadau Arddangos
+Comment[da]=Opsætning af skærm
+Comment[de]=Anzeige-Einstellungen
+Comment[el]=Ρυθμίσεις οθόνης
+Comment[eo]=Vidigila Agordo
+Comment[es]=Preferencias de la pantalla
+Comment[et]=Monitoride seadistused
+Comment[eu]=Pantailaren konfigurazioa
+Comment[fa]=نمایش تنظیمات
+Comment[fi]=Näytön asetukset
+Comment[fr]=Paramètres d'affichage
+Comment[fy]=Byldskerm ynstellings
+Comment[ga]=Socruithe an Scáileáin
+Comment[gl]=Opcións da Pantalla
+Comment[he]=הגדרות תצוגה
+Comment[hi]=रूप-रंग विन्यास
+Comment[hr]=Postavke zaslona
+Comment[hu]=Képernyőbeállítások
+Comment[is]=Stillingar skjás
+Comment[it]=Impostazioni del display
+Comment[ja]=ディスプレイの設定
+Comment[ka]=დისპლეის კონფიგურირება
+Comment[kk]=Дисплей баптаулары
+Comment[km]=កំណត់​ការ​បង្ហាញ
+Comment[ko]=디스플레이 설정
+Comment[lt]=Ekrano parametrai
+Comment[lv]=Ekrāna parametri
+Comment[mk]=Поставувања на приказот
+Comment[mn]=Дэлгэц тохируулга
+Comment[ms]=Seting Paparan
+Comment[mt]=Konfigurazzjoni tal-iskrin
+Comment[nb]=Skjerminnstillinger
+Comment[nds]=Dorstellen inrichten
+Comment[ne]=सेटिङ प्रदर्शन गर्नुहोस्
+Comment[nl]=Beeldscherminstellingen
+Comment[nn]=Skjerminnstillingar
+Comment[pa]=ਝਲਕ ਸੰਰਚਨਾ
+Comment[pl]=Ustawienia ekranu
+Comment[pt]=Configuração do ecrã
+Comment[pt_BR]=Configurações da Tela
+Comment[ro]=Configurează monitorul
+Comment[ru]=Настройка дисплея
+Comment[rw]=Kwerekana Amagenamiterere
+Comment[se]=Šearbmaheivehusat
+Comment[sk]=Nastavenie displeja
+Comment[sl]=Nastavitve zaslona
+Comment[sr]=Подешавања екрана
+Comment[sr@Latn]=Podešavanja ekrana
+Comment[sv]=Anpassa bildskärm
+Comment[ta]=அமைப்புகளை காட்டு
+Comment[tg]=Танзимоти намоиш
+Comment[th]=ตั้งค่าการแสดงผล
+Comment[tr]=Görüntü Ayarları
+Comment[tt]=Küräk Caylaw
+Comment[uk]=Налаштування дисплея
+Comment[uz]=Displeyning moslamalari
+Comment[uz@cyrillic]=Дисплейнинг мосламалари
+Comment[vi]=Thiết lập Hiển thị
+Comment[wa]=Apontiaedjes do Håynaedje
+Comment[zh_CN]=显示设置
+Comment[zh_TW]=顯示設定
+Categories=Qt;KDE;X-KDE-settings-hardware;
diff --git a/kcontrol/display/display.h b/kcontrol/display/display.h
new file mode 100644
index 000000000..d07695320
--- /dev/null
+++ b/kcontrol/display/display.h
@@ -0,0 +1,48 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Nadeem Hasan <nhasan@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef DISPLAY_H
+#define DISPLAY_H
+
+#include <kcmodule.h>
+
+class QTabWidget;
+
+class KCMDisplay : public KCModule
+{
+ Q_OBJECT
+
+ public:
+ KCMDisplay( QWidget *parent, const char *name, const QStringList& );
+ void load();
+ void save();
+
+ private slots:
+ void moduleChanged(bool isChanged);
+
+ private:
+ void addTab( const QString &name, const QString &label );
+
+ QTabWidget *m_tabs;
+ QMap<KCModule*, bool> m_modules;
+ bool m_changed;
+};
+
+#endif // DISPLAY_H
+
diff --git a/kcontrol/dnssd/Makefile.am b/kcontrol/dnssd/Makefile.am
new file mode 100644
index 000000000..892244300
--- /dev/null
+++ b/kcontrol/dnssd/Makefile.am
@@ -0,0 +1,12 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = kcm_kdnssd.la
+kcm_kdnssd_la_LDFLAGS = -avoid-version -module -no-undefined $(all_libraries)
+kcm_kdnssd_la_SOURCES = configdialog.ui kcmdnssd.cpp kcmdnssd.h
+
+xdg_apps_DATA = kcm_kdnssd.desktop
+kcm_kdnssd_la_LIBADD = $(LIB_KDNSSD) $(LIB_KDEUI)
+
+messages: rc.cpp
+ $(EXTRACTRC) *.ui *.rc >> rc.cpp
+ $(XGETTEXT) $(kcm_kdnssd_la_SOURCES) rc.cpp -o $(podir)/kcmkdnssd.pot
diff --git a/kcontrol/dnssd/configdialog.ui b/kcontrol/dnssd/configdialog.ui
new file mode 100644
index 000000000..83808d1bb
--- /dev/null
+++ b/kcontrol/dnssd/configdialog.ui
@@ -0,0 +1,304 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ConfigDialog</class>
+<widget class="KCModule">
+ <property name="name">
+ <cstring>ConfigDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>571</width>
+ <height>486</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>MyDialog1</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>tabs</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;General</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_BrowseLocal</cstring>
+ </property>
+ <property name="text">
+ <string>Browse local networ&amp;k</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Browse local network (domain .local) using multicast DNS.</string>
+ </property>
+ </widget>
+ <widget class="KEditListBox">
+ <property name="name">
+ <cstring>kcfg_DomainList</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Additional Domains</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>List of Internet domains that will be browsed for services. Do not put .local here - it
+is configured with 'Browse local network' option above.</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>kcfg_PublishType</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Publishing Mode</string>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>LANButtor</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>11</x>
+ <y>23</y>
+ <width>618</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Loc&amp;al network</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Advertise services on local network (in domain .local) using multicast DNS.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>WANButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>11</x>
+ <y>51</y>
+ <width>618</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&amp;Wide area network</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Advertise services on Internet domain using public IP. To have this option working you need to configure wide area operation in using administrator mode</string>
+ </property>
+ </widget>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>W&amp;ide area</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Shared secret:</string>
+ </property>
+ </widget>
+ <spacer row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>130</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KLineEdit" row="1" column="3">
+ <property name="name">
+ <cstring>hostedit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Name of this machine. Must be in fully qualified form (host.domain)</string>
+ </property>
+ </widget>
+ <widget class="KPasswordEdit" row="2" column="3">
+ <property name="name">
+ <cstring>secretedit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Optional shared secret used for authorization of DNS dynamic updates.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>domainLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Domain:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Hostname:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="3">
+ <property name="name">
+ <cstring>domainedit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>90</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>90</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>50</width>
+ <height>110</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<slots>
+ <slot>radioButton2_2_toggled(bool)</slot>
+</slots>
+<includes>
+ <include location="global" impldecl="in declaration">kcmodule.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcmodule.h</includehint>
+ <includehint>keditlistbox.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpassdlg.h</includehint>
+ <includehint>klineedit.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/dnssd/kcm_kdnssd.desktop b/kcontrol/dnssd/kcm_kdnssd.desktop
new file mode 100644
index 000000000..8b949e370
--- /dev/null
+++ b/kcontrol/dnssd/kcm_kdnssd.desktop
@@ -0,0 +1,154 @@
+[Desktop Entry]
+Comment=Configure service discovery
+Comment[af]=Stel dienste ontdekker op
+Comment[ar]=إعداد إكتشاف الخدمات
+Comment[be]=Настаўленні пошуку сервісаў
+Comment[bg]=Настройване откриването на услуги
+Comment[bn]=সার্ভিস উদ্ঘাটন কনফিগার করুন
+Comment[bs]=Podesite otkrivanje servisa
+Comment[ca]=Configura el descobriment de serveis
+Comment[cs]=Nastavení hledání služeb
+Comment[csb]=Kòfigùracëjô wëkrëwaniô ùsłëżnotów
+Comment[da]=Indstil opdagelse af tjeneste
+Comment[de]=Diensteerkennung einrichten
+Comment[el]=Ρύθμιση εύρεσης υπηρεσιών
+Comment[eo]=Agordu servo-seĉadon
+Comment[es]=Configura el buscador de servicios
+Comment[et]=Teenuste tuvastamise seadistamine
+Comment[eu]=Konfiguratu igartze zerbitzua
+Comment[fa]=پیکربندی کشف خدمت
+Comment[fi]=Asetuspalvelimen löytäminen
+Comment[fr]=Configuration de la découverte de service
+Comment[fy]=Tsjinst waarnimming ynstellen
+Comment[ga]=Cumraigh fionnachtain seirbhísí
+Comment[gl]=Configurar o descubremento de servizos
+Comment[he]=הגדרת זיהוי השירותים
+Comment[hi]=सेवा डिस्कवरी कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje usluge discovery
+Comment[hu]=A szolgáltatásdetektálás beállításai
+Comment[is]=Stilla uppgötvun þjónustna
+Comment[it]=Configura scoperta servizi
+Comment[ja]=サービスディスカバリの設定
+Comment[ka]=სერვისის არმოჩენის კონფიგურირება
+Comment[kk]=Қызыметтерді байқауды баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ការ​រកឃើញ​សេវា
+Comment[ko]=서비스 발견 설정
+Comment[lt]=Konfigūruoti tarnybų radimą
+Comment[lv]=Konfigurē servisu atrašanu
+Comment[mk]=Конфигурирајте го откривањето сервиси
+Comment[ms]=Konfigur penemuan servis
+Comment[nb]=Sett opp oppdagingstjenesten
+Comment[nds]=Dat Finnen vun Deensten inrichten
+Comment[ne]=पत्ता लगाउने कार्य कन्फिगर गर्नुहोस्
+Comment[nl]=Dienstwaarneming instellen
+Comment[nn]=Set opp oppdagingstenesta
+Comment[pa]=ਸੇਵਾ ਖੋਜ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja wykrywania usług
+Comment[pt]=Configurar a descoberta de serviços
+Comment[pt_BR]=Configurar o serviço discovery
+Comment[ro]=Configurează serviciul de descoperire
+Comment[ru]=Настройка обнаружения сервисов
+Comment[rw]=Kuboneza ivumbura serivisi
+Comment[se]=Heivet bálvalusáicama
+Comment[sk]=Nastavenie služby Discovery
+Comment[sl]=Nastavi odkrivanje storitev
+Comment[sr]=Подешавање откривања сервиса
+Comment[sr@Latn]=Podešavanje otkrivanja servisa
+Comment[sv]=Anpassa tjänstupptäckt
+Comment[ta]=சர்வீஸ் டிஸ்கவரியை வடிவமை
+Comment[tg]=Танзими хизмати ихтироъ
+Comment[th]=ปรับแต่งการค้นพบบริการ
+Comment[tr]=Hizmet araştırmasını yapılandır
+Comment[tt]=Xezmätlär tabu caylawı
+Comment[uk]=Налаштування знаходження служб
+Comment[uz]=Tarmoqdagi xizmatlarni qidirishni moslash
+Comment[uz@cyrillic]=Тармоқдаги хизматларни қидиришни мослаш
+Comment[vi]=Cấu hình dịch vụ khám phá
+Comment[wa]=Apontiaedjes do discovraedje do siervice
+Comment[zh_CN]=配置探索服务
+Comment[zh_TW]=設定服務偵測
+Exec=kcmshell kcm_kdnssd
+GenericName=
+GenericName[ko]=일반
+Icon=blockdevice
+MimeType=
+Name=Service Discovery
+Name[af]=Dienste ontdekker
+Name[ar]=إكتشاف الخدمات
+Name[be]=Пошук сервісаў
+Name[bg]=Откриване на услуги
+Name[bn]=সার্ভিস উদ্ঘাটন
+Name[bs]=Otkrivanje servisa
+Name[ca]=Descobriment de serveis
+Name[cs]=Hledání služeb
+Name[csb]=Wëkrëwanié ùsłëżnotów
+Name[da]=Opdagelse af tjenester
+Name[de]=Dienste-Suche
+Name[el]=Εύρεση υπηρεσιών
+Name[eo]=Servo-Serĉado
+Name[es]=Buscador de servicios
+Name[et]=Teenuste tuvastamine
+Name[eu]=Igartze zerbitzua
+Name[fa]=کشف خدمت
+Name[fi]=Palvelut
+Name[fr]=Découverte de service
+Name[fy]=Tsjinst warskôging
+Name[ga]=Fionnachtain Seirbhísí
+Name[gl]=Descubremento de Servizos
+Name[he]=זיהוי שירותים
+Name[hi]=सेवा डिस्कवरी
+Name[hr]=Usluga Discovery
+Name[hu]=Zeroconf-beállítások
+Name[is]=Uppgötvun þjónustu
+Name[it]=Scoperta servizi
+Name[ja]=サービスディスカバリ
+Name[ka]=სერვისის აღმოჩენა
+Name[kk]=Қызметтерді байқау
+Name[km]=ការ​រកឃើញ​សេវា
+Name[ko]=서비스 발견
+Name[lt]=Tarnybų radimas
+Name[lv]=Servisu atklāšana
+Name[mk]=Откривање сервиси
+Name[ms]=Penemuan Servis
+Name[nb]=Oppdaging av tjenester
+Name[nds]=Deensten finnen
+Name[ne]=पत्ता लगाउने कार्य
+Name[nl]=Dienstwaarneming
+Name[nn]=Oppdaging av tenester
+Name[pa]=ਸੇਵਾ ਖੋਜ
+Name[pl]=Wykrywanie usług
+Name[pt]=Descoberta de Serviços
+Name[pt_BR]=Serviço Discovery
+Name[ro]=Descoperire servicii
+Name[ru]=Обнаружение служб
+Name[rw]=Ivumbura rya Serivisi
+Name[se]=Bálvalusáican
+Name[sk]=Služba Discovery
+Name[sl]=Odkrivanje storitev
+Name[sr]=Откривање сервиса
+Name[sr@Latn]=Otkrivanje servisa
+Name[sv]=Tjänstupptäckt
+Name[ta]=சர்வீஸ் டிஸ்கவரி
+Name[tg]=Хизмати ихтироъ
+Name[th]=การค้นพบบริการ
+Name[tr]=Hizmet Araştırması
+Name[tt]=Xezmätlär Tabu
+Name[uk]=Знаходження служб
+Name[uz]=Tarmoqdagi xizmatlarni qidirish
+Name[uz@cyrillic]=Тармоқдаги хизматларни қидириш
+Name[vi]=Dịch vụ Khám phá
+Name[wa]=Discovraedje di siervices
+Name[zh_CN]=服务探索
+Name[zh_TW]=服務偵測
+Path=
+StartupNotify=true
+Terminal=false
+Type=Application
+X-DCOP-ServiceType=
+X-KDE-HasReadOnlyMode=false
+X-KDE-Library=kdnssd
+X-KDE-ModuleType=Library
+X-KDE-ParentApp=kcontrol
+X-KDE-SubstituteUID=false
+X-KDE-RootOnly=true
+Categories=Qt;KDE;X-KDE-settings-network;
diff --git a/kcontrol/dnssd/kcmdnssd.cpp b/kcontrol/dnssd/kcmdnssd.cpp
new file mode 100644
index 000000000..d86cc2897
--- /dev/null
+++ b/kcontrol/dnssd/kcmdnssd.cpp
@@ -0,0 +1,142 @@
+/***************************************************************************
+ * Copyright (C) 2004,2005 by Jakub Stachowski *
+ * qbast@go2.pl *
+ * *
+ * 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/stat.h>
+#include <config.h>
+
+#include <qlayout.h>
+#include <qfile.h>
+#include <qgroupbox.h>
+#include <qradiobutton.h>
+#include <qtimer.h>
+#include <qtabwidget.h>
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kparts/genericfactory.h>
+#include <kprocess.h>
+#include <klineedit.h>
+#include <kpassdlg.h>
+#include <ksimpleconfig.h>
+
+#include "kcmdnssd.h"
+#include <dnssd/settings.h>
+#include <dnssd/domainbrowser.h>
+#include <kipc.h>
+
+#define MDNSD_CONF "/etc/mdnsd.conf"
+#define MDNSD_PID "/var/run/mdnsd.pid"
+
+typedef KGenericFactory<KCMDnssd, QWidget> KCMDnssdFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_kdnssd, KCMDnssdFactory("kcmkdnssd"))
+
+KCMDnssd::KCMDnssd(QWidget *parent, const char *name, const QStringList&)
+ : ConfigDialog(parent, name), m_wdchanged(false)
+{
+ setAboutData(new KAboutData(I18N_NOOP("kcm_kdnssd"),
+ I18N_NOOP("ZeroConf configuration"),0,0,KAboutData::License_GPL,
+ I18N_NOOP("(C) 2004,2005 Jakub Stachowski")));
+ setQuickHelp(i18n("Setup services browsing with ZeroConf"));
+ if (geteuid()!=0) tabs->removePage(tab_2); // normal user cannot change wide-area settings
+ // show only global things in 'administrator mode' to prevent confusion
+ else if (getenv("KDESU_USER")!=0) tabs->removePage(tab);
+ addConfig(DNSSD::Configuration::self(),this);
+ // it is host-wide setting so it has to be in global config file
+ domain = new KSimpleConfig( QString::fromLatin1( KDE_CONFDIR "/kdnssdrc" ));
+ domain->setGroup("publishing");
+ load();
+ connect(hostedit,SIGNAL(textChanged(const QString&)),this,SLOT(wdchanged()));
+ connect(secretedit,SIGNAL(textChanged(const QString&)),this,SLOT(wdchanged()));
+ connect(domainedit,SIGNAL(textChanged(const QString&)),this,SLOT(wdchanged()));
+ if (DNSSD::Configuration::self()->publishDomain().isEmpty()) WANButton->setEnabled(false);
+}
+
+KCMDnssd::~KCMDnssd()
+{
+ delete domain;
+}
+
+void KCMDnssd::save()
+{
+ KCModule::save();
+ if (geteuid()==0 && m_wdchanged) saveMdnsd();
+ domain->setFileWriteMode(0644); // this should be readable for everyone
+ domain->writeEntry("PublishDomain",domainedit->text());
+ domain->sync();
+ KIPC::sendMessageAll((KIPC::Message)KIPCDomainsChanged);
+}
+
+void KCMDnssd::load()
+{
+ KCModule::load();
+ if (geteuid()==0) loadMdnsd();
+}
+
+// hack to work around not working isModified() for KPasswordEdit
+void KCMDnssd::wdchanged()
+{
+ WANButton->setEnabled(!domainedit->text().isEmpty() && !hostedit->text().isEmpty());
+ changed();
+ m_wdchanged=true;
+}
+
+void KCMDnssd::loadMdnsd()
+{
+ QFile f(MDNSD_CONF);
+ if (!f.open(IO_ReadWrite)) return;
+ QTextStream stream(&f);
+ QString line;
+ while (!stream.atEnd()) {
+ line = stream.readLine();
+ mdnsdLines.insert(line.section(' ',0,0,QString::SectionSkipEmpty),
+ line.section(' ',1,-1,QString::SectionSkipEmpty));
+ }
+ if (!mdnsdLines["zone"].isNull()) domainedit->setText(mdnsdLines["zone"]);
+ if (!mdnsdLines["hostname"].isNull()) hostedit->setText(mdnsdLines["hostname"]);
+ if (!mdnsdLines["secret-64"].isNull()) secretedit->setText(mdnsdLines["secret-64"]);
+}
+
+bool KCMDnssd::saveMdnsd()
+{
+ mdnsdLines["zone"]=domainedit->text();
+ mdnsdLines["hostname"]=hostedit->text();
+ if (!secretedit->text().isEmpty()) mdnsdLines["secret-64"]=QString(secretedit->password());
+ else mdnsdLines.remove("secret-64");
+ QFile f(MDNSD_CONF);
+ bool newfile=!f.exists();
+ if (!f.open(IO_WriteOnly)) return false;
+ QTextStream stream(&f);
+ for (QMap<QString,QString>::ConstIterator it=mdnsdLines.begin();it!=mdnsdLines.end();
+ ++it) stream << it.key() << " " << (*it) << "\n";
+ f.close();
+ // if it is new file, then make it only accessible for root as it can contain shared
+ // secret for dns server.
+ if (newfile) chmod(MDNSD_CONF,0600);
+ f.setName(MDNSD_PID);
+ if (!f.open(IO_ReadOnly)) return true; // it is not running so no need to signal
+ QString line;
+ if (f.readLine(line,16)<1) return true;
+ unsigned int pid = line.toUInt();
+ if (pid==0) return true; // not a pid
+ kill(pid,SIGHUP);
+ return true;
+}
+
+#include "kcmdnssd.moc"
diff --git a/kcontrol/dnssd/kcmdnssd.h b/kcontrol/dnssd/kcmdnssd.h
new file mode 100644
index 000000000..2e66f6a8f
--- /dev/null
+++ b/kcontrol/dnssd/kcmdnssd.h
@@ -0,0 +1,49 @@
+/***************************************************************************
+ * Copyright (C) 2004,2005 by Jakub Stachowski *
+ * qbast@go2.pl *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef _KCMDNSSD_H_
+#define _KCMDNSSD_H_
+
+#include <qmap.h>
+
+#include <configdialog.h>
+#include <kaboutdata.h>
+
+class KSimpleConfig;
+class KCMDnssd: public ConfigDialog
+{
+ Q_OBJECT
+
+public:
+ KCMDnssd( QWidget *parent=0, const char *name=0, const QStringList& = QStringList() );
+ ~KCMDnssd();
+ virtual void save();
+ virtual void load();
+private slots:
+ void wdchanged();
+private:
+ void loadMdnsd();
+ bool saveMdnsd();
+ QMap<QString,QString> mdnsdLines;
+ bool m_wdchanged;
+ KSimpleConfig* domain;
+};
+
+#endif
diff --git a/kcontrol/ebrowsing/Makefile.am b/kcontrol/ebrowsing/Makefile.am
new file mode 100644
index 000000000..dfb9fdbe8
--- /dev/null
+++ b/kcontrol/ebrowsing/Makefile.am
@@ -0,0 +1,21 @@
+
+SUBDIRS = plugins
+
+AM_CPPFLAGS = -I$(srcdir)/plugins/ikws $(all_includes)
+
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = kcm_kurifilt.la
+kcm_kurifilt_la_SOURCES = filteropts.cpp main.cpp
+
+kcm_kurifilt_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_kurifilt_la_LIBADD = $(LIB_KSYCOCA)
+# Don't link this lib to the plugins. They are dlopened and linking to them
+# results in crashes when closing kcmshell.
+# plugins/ikws/libkuriikwsfilter.la plugins/shorturi/libkshorturifilter.la
+
+messages: rc.cpp
+ $(EXTRACTRC) plugins/*/*.ui >> rc.cpp
+ $(XGETTEXT) *.cpp plugins/ikws/*.cpp plugins/shorturi/*.cpp -o $(podir)/kcmkurifilt.pot
+
+xdg_apps_DATA = ebrowsing.desktop
diff --git a/kcontrol/ebrowsing/ebrowsing.desktop b/kcontrol/ebrowsing/ebrowsing.desktop
new file mode 100644
index 000000000..a0bf4593b
--- /dev/null
+++ b/kcontrol/ebrowsing/ebrowsing.desktop
@@ -0,0 +1,237 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/ebrowsing/index.html
+Icon=enhanced_browsing
+Exec=kcmshell ebrowsing
+
+
+X-KDE-Library=kurifilt
+X-KDE-FactoryName=kurifilt
+X-KDE-ParentApp=kcontrol
+
+Name=Web Shortcuts
+Name[af]=Web Kortpaaie
+Name[ar]=إختصارات الشبكة
+Name[az]=Veb Qısa Yolları
+Name[be]=Скароты Сеціва
+Name[bg]=Уеб съкращения
+Name[bn]=ওয়েব শর্টকাট
+Name[br]=Berradennoù ar gwiad
+Name[bs]=Web kratice
+Name[ca]=Dreceres web
+Name[cs]=Webové zkratky
+Name[csb]=Sécowé skrodzënë
+Name[cy]=Byr-lwybrau Gwe
+Name[da]=Net-genveje
+Name[de]=Webkürzel
+Name[el]=Συντομεύσεις ιστού
+Name[eo]=TTT Klavokombinoj
+Name[es]=Accesos rápidos para web
+Name[et]=Veebi kiirkorraldused
+Name[eu]=Web lasterbideak
+Name[fa]=میان‌برهای وب
+Name[fi]=WWW-pikavalinnat
+Name[fr]=Raccourcis Web
+Name[fy]=Webskeakels
+Name[ga]=Aicearraí Gréasáin
+Name[gl]=Atallos Web
+Name[he]=קיצורי דרך אינטרנטיים
+Name[hi]=वेब शॉर्टकट
+Name[hr]=Internetski prečaci
+Name[hu]=Keresési azonosítók
+Name[is]=Vefskammstafanir
+Name[it]=Scorciatoie del web
+Name[ja]=ウェブショートカット
+Name[ka]=ვებგვერდების მალსახმობი
+Name[kk]=Веб қысқартулары
+Name[km]=ផ្លូវកាត់​បណ្ដាញ
+Name[ko]=웹 바로 가기
+Name[lo]=ປຸ່ມພິມພັລດ
+Name[lt]=Žiniatinklio trumpės
+Name[lv]=Tīmekļa īsinājumikonas
+Name[mk]=Интернет-кратенки
+Name[mn]=Вэб-богино товчилуур
+Name[ms]=Jalan Pintas Web
+Name[nb]=Nettsnarveier
+Name[nds]=Söökafkörten
+Name[ne]=वेब सर्टकट
+Name[nl]=Webkoppelingen
+Name[nn]=Vevsnarvegar
+Name[nso]=Ditselakopana tsa Web
+Name[pa]=ਵੈਬ ਸ਼ਾਰਟਕੱਟ
+Name[pl]=Skróty sieciowe
+Name[pt]=Atalhos Web
+Name[pt_BR]=Atalhos da Web
+Name[ro]=Acceleratori de web
+Name[ru]=Сокращения Веб
+Name[rw]=Amahinanzira y'Urubugamakuru
+Name[se]=Fierpmádatlávkestagat
+Name[sk]=Internetové skratky
+Name[sl]=Spletne bližnjice
+Name[sr]=Веб пречице
+Name[sr@Latn]=Veb prečice
+Name[ss]=Tindlela letimfunshane te web
+Name[sv]=Webbgenvägar
+Name[ta]=வலை குறுக்கு வழிகள்
+Name[te]=వెబ్ శీఘ్ర మార్గాలు
+Name[tg]=Мухтасаркунии Вэб
+Name[th]=ทางลัดเว็บ
+Name[tr]=Web Kısayolları
+Name[tt]=Web Qısqartmaları
+Name[uk]=Скорочення Тенет
+Name[uz]=Veb-qisqartmalari
+Name[uz@cyrillic]=Веб-қисқартмалари
+Name[ven]=Tshikhau tsha webu
+Name[vi]=Đường tắt Mạng
+Name[wa]=Rascourtis waibe
+Name[xh]=Ezimfutshane ze Web
+Name[zh_CN]=速搜
+Name[zh_TW]=網頁捷徑
+Name[zu]=Izindlela Ezimfishane ze-Web
+
+Comment=Configure enhanced browsing
+Comment[af]=Konfigureer verbeterde blaaiïng
+Comment[ar]=إعداد التصفح المحسّن
+Comment[az]=Təkmilləşdirilmiş gəzintini quraşdır
+Comment[be]=Настаўленні прасунутага вандравання
+Comment[bg]=Настройване на уеб съкращения и бързи препратки
+Comment[bn]=বর্ধিত ব্রাউজিং কনফিগার করুন
+Comment[br]=Kefluniañ ar furchal gwellaet
+Comment[bs]=Podesite napredno pregledavanje
+Comment[ca]=Aquí podeu configurar la navegació millorada
+Comment[cs]=Nastavení rozšířeného prohledávání
+Comment[csb]=Kònfigùracëjô rozszérzonëch cechów przezéraniô
+Comment[cy]=Ffurfweddu pori uchel
+Comment[da]=Indstil udvidet netsøgning
+Comment[de]=Die Verwendung von Webkürzeln einrichten
+Comment[el]=Ρυθμίστε την εμπλουτισμένη περιήγηση
+Comment[eo]=Agordo de rapidserĉo, ŝlosilvortoj ktp.
+Comment[es]=Configuración de la navegación mejorada
+Comment[et]=Täiustatud lehitsemise konfigureerimine
+Comment[eu]=Konfiguratu arakatze hobetua
+Comment[fa]=پیکربندی مرور بهبودیافته
+Comment[fi]=Muokkaa selaimen lisäasetuksia
+Comment[fr]=Configuration de la navigation avancée
+Comment[fy]=Hjir kinne jo it avansearre blêdzjen ynstelle
+Comment[ga]=Cumraigh brabhsáil fheabhsaithe
+Comment[gl]=Configurar a Navegación Mellorada
+Comment[he]=שינוי הגדרות הגלישה המשופרת
+Comment[hi]=एनहेंस्ड ब्राउज़िंग कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje poboljšanog pregledavanja
+Comment[hu]=A keresési beállításokat lehet módosítani
+Comment[is]=Hér getur þú stillt endurbætur á vefskoðara
+Comment[it]=Configurazione della navigazione avanzata
+Comment[ja]=拡張ブラウズの設定
+Comment[kk]=Вебті шарлағанда қолданатын қысқартулар
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ការ​រុករក​ឲ្យ​កាន់​តែ​ប្រសើរ
+Comment[ko]=확장 브라우징 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງການຮງກເບິ່ງເວບເພດຈ໌ຂັ້ນກ້າວຫນ້າໄດ້ດັ່ງນີ້
+Comment[lt]=Konfigūruoti išplėstinį naršymą
+Comment[lv]=Šeit Jūs varat nokonfigurēt Uzlaboto Pārlūkošanu
+Comment[mk]=Конфигурирајте го напредното прелистување
+Comment[mn]=Интернэт-хайлттай нэгжилт тохируулах
+Comment[ms]=Konfigur pelayaran lanjutan
+Comment[mt]=Ikkonfigura l-browsing estiż
+Comment[nb]=Oppsett av utvidet surfing
+Comment[nds]=Söökafkörten för't gaue Söken in't Nett inrichten
+Comment[ne]=बढाइएको ब्राउजिङ कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u het geavanceerd browsen instellen
+Comment[nn]=Oppsett av utvida surfing
+Comment[nso]=Beakanya boinyakisi bjo bo hlohleleditswego
+Comment[pa]=ਸਹਾਇਕ ਝਲਕਾਰਾ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja rozszerzonych cech przeglądania
+Comment[pt]=Configuração da navegação melhorada
+Comment[pt_BR]=Configura a navegação melhorada
+Comment[ro]=Configurează navigarea de web avansată
+Comment[ru]=Сокращения, используемые при просмотре Веб
+Comment[rw]=Kuboneza icukumbura rivuguruye
+Comment[se]=Heivet viiddiduvvon fierbmegolgama
+Comment[sk]=Nastaenie rozšíreného prehliadača
+Comment[sl]=Nastavite izboljšano brskanje
+Comment[sr]=Подешавање побољшаног прегледања
+Comment[sr@Latn]=Podešavanje poboljšanog pregledanja
+Comment[sv]=Anpassa utökad webbläsning
+Comment[ta]= மேம்படுத்தப்பட்ட தேடுதலை அமை
+Comment[tg]=Мухтасаркунӣ, дар вақти тасвири Вэб истифода мешаванд
+Comment[th]=ปรับแต่งการเรียกดูแบบเพิ่มความสามารถ
+Comment[tr]=Gelişkin taramayı buradan yapılandırabilirsiniz
+Comment[tt]=Köçäytelgän gizü caylawı
+Comment[uk]=Налаштування спецфункцій навігації
+Comment[uz]=Tezlashtirilgan veb-koʻrishni moslash
+Comment[uz@cyrillic]=Тезлаштирилган веб-кўришни мослаш
+Comment[ven]=Dzudzanyani burausu yo engedzhwaho
+Comment[vi]=Cấu hình Duyệt Nâng cao
+Comment[wa]=Apontyî li naiviaedje waibe avancî
+Comment[xh]=Qwalasela ukhangelo lwencwadi olongezelelweyo
+Comment[zh_CN]=配置增强浏览特性
+Comment[zh_TW]=設定增強式瀏覽
+Comment[zu]=Hlannganisela ukucinga okujulile
+
+Keywords=Enhanced Browsing,Browsing,WWW,Internet,Internet Keywords,Internet Filters,Network,Search Engines,Shortcuts
+Keywords[af]=Verbeterde Browsing,Browsing,WWW,Internet,Internet Keywords,Internet Filters,Network,Search Engines,Shortcuts
+Keywords[ar]=Enhanced Browsing,Browsing,WWW,Internet,Internet Keywords,Internet Filters,Network,Search Engines,Shortcuts,التصفح المحسن,التصفح,الشبكة العالمية,الإنترنت مفاتيح الإنترنت,فلاتر الإنترنت,شبكة,الشبكة,محركات البحث,اختصارات,الاختصارات
+Keywords[az]=Təkmilləşmiş Darama,Darama,WWW,İnternet,İnternet Açar Kəliimələri,İnternet Süzgəcləri,Şəbəkə,Qısa yollar,Qısa yol düymələri
+Keywords[be]=Палепшанае вандраванне,вандраванне,прагляд,Інэтрнэт,ключавыя словы,фільтры,сетка,рухавікі пошуку,машыны пошуку,скароты,Enhanced Browsing,Browsing,WWW,Internet,Internet Keywords,Internet Filters,Network,Search Engines,Shortcuts
+Keywords[bg]=съкращения, сърфиране, разширено, уеб, препратка, връзка, хипервръзка, Enhanced Browsing, Browsing, WWW, Internet, Internet Keywords, Internet Filters, Network, Search Engines, Shortcuts
+Keywords[ca]=Navegació millorada,Navegació,WWW,Internet,Paraules clau d'Internet,Filtres d'Internet,Xarxa,Motors de recerca,Dreceres
+Keywords[cs]=Rozšířené procházení,Procházení,WWW,Internet,Klíčová slova internetu,Internetové filtry,Síť,Zkratky,Vyhledávací stroje
+Keywords[csb]=Rozszérzoné przezéranié,przezéranié,WWW,Internet,kluczowé słowa w Internece,filtrë w Internece,séc,szëkôrze,skrodzënë
+Keywords[cy]=Pori Uchel,Pori,WWW,Rhyngrwyd,Allweddair Rhyngrwyd,Hidl Rhyngrwyd,Rhwydwaith,Peiriannau Chwilio,Llwybrau Byr
+Keywords[da]=Udvidet netsøgning,Netsøgning,www,Internet,Internet-nøgleord,Internet-filtre,Søgemaskiner,Genveje
+Keywords[de]=Browsen,Erweitertes Browsen,WWW,Internet,Stichwörter,Filter,Netz,Internetfilter,Suchmaschinen,Kurzbefehle,Netzwerk
+Keywords[el]=Εμπλουτισμένη περιήγηση,Περιήγηση,WWW,Διαδίκτυο,Λέξεις κλειδιά διαδικτύου,Φίλτρα διαδικτύου,Δίκτυο,Μηχανές αναζήτησης,Συντομεύσεις
+Keywords[eo]=progresintoj,TTT,krozado,WWW,Interreto,filtrilo,reto,serĉiloj,mallongigoj
+Keywords[es]=Navegación Mejorada,Navegación,WWW,Internet,Palabras clave de Internet,Filtros de Internet,Red,Motores de búsqueda,Accesos directos
+Keywords[et]=Täiustatud lehitsemine,lehitsemine,WWW,internet,interneti võtmesõnad,interneti filtrid,võrk,otsingumootorid,kiirkorraldused
+Keywords[eu]=Arakatze hobetua,Arakatzea,WWW,Internet,Interneteko hitz gakoak, Interneteko irakazkiak,Sarea,Bilaketa motorea,Lasterbideak
+Keywords[fa]=مرور بهبودیافته، مرور، WWW، اینترنت، کلیدواژه‌های اینترنت، پالایه‌های اینترنت، شبکه، موتورهای جستجو، میان‌برها
+Keywords[fi]=Edistynyt selailu,selailu,WWW,Internet,Internet-hakusanat,Internet suodattimet,Verkko,Hakukoneet,Pikavalinnat
+Keywords[fr]=navigation avancée,navigation,www,web,internet,mots clés internet,filtres internet,réseau,moteurs de recherche,raccourcis
+Keywords[fy]=avansearre browsen,browsing,blêdzje,blêdzjen,www,ynternet,ynternet kaaiwurden,surfen,ynternetsykwurden,sykmasines,sykmotors, snelskeakels,ynternetfilters,Netwurk,blêdzje avensearre
+Keywords[ga]=Brabhsáil Fheabhsaithe,Brabhsáil,WWW,Idirlíon,Eochairfhocail Idirlín,Scagairí Idirlín,Líonra,Innill Chuardaigh,Aicearraí
+Keywords[gl]=Navegación Mellorada,Navegación,WWW,Internet,Palabras chave de Internet,Filtros de Internet,Rede,Ferramentas de Procura,Atallos
+Keywords[he]=מילות מפתח אינטרנטיות,מסננים אינטרנטיים,רשת,מנועי חיפוש,קיצורי דרך,WWW,גלישה משופרת,גלישה,רשת,אינטרנט,Enhanced Browsing,Browsing,Internet,Internet Keywords,Internet Filters,Network,Search Engines,Shortcuts
+Keywords[hi]=एनहैंस्ड ब्राउज़िंग,ब्राउज़िंग,डब्ल्यूडब्ल्यूडब्ल्यू,इंटरनेट,इंटरनेट की-वर्ड्स,इंटरनेट फ़िल्टर्स,नेटवर्क,सर्च इंजिन्स,शॉर्टकट्स
+Keywords[hr]=Enhanced Browsing,Browsing,WWW,Internet,Internet Keywords,Internet Filters,Network,Search Engines,Shortcuts,poboljšano pregledavanje,pregledavanje,ključne riječi,filtri,mreža,tražilice,prečaci
+Keywords[hu]=böngészéskönnyítés,böngészés,WWW,internet,internetes kulcsszavak,internetes szűrők,hálózat,keresőszolgáltatók,keresési azonosítók
+Keywords[id]=Browsing yang disempurnakan,browsing,WWW,Internet,Intranet Keywords,Internet Filter,Jaringan,Search Engines,Shortcuts
+Keywords[is]=endurbætur,vefskoðun,vafri,flakka,WWW,Internet,Internet leitarorð,net,tenglar,tengill,hlekkur,hlekkir,leitarvél,internet
+Keywords[it]=navigazione avanzata,navigazione,WWW,Internet,parole chiave Internet,filtri Internet,rete,scorciatoie,motori di ricerca
+Keywords[ja]=拡張ブラウズ,ブラウズ,WWW,インターネット,インターネットキーワード,インターネットフィルタ,ネットワーク,検索エンジン,ショートカット
+Keywords[km]=រុករក​កាន់​តែ​ប្រសើរ,ការ​រុករក,WWW,អ៊ិនធឺណិត,ពាក្យ​គន្លឹះ​អ៊ិនធឺណិត,តម្រង​អ៊ិនធឺណិត,បណ្ដាញ,ម៉ាស៊ីន​ស្វែងរក,ផ្លូវកាត់
+Keywords[lt]=Enhanced Browsing,Išplėstinis naršymas,WWW,voratinklis,Internet,Internetas,Internet Keywords,Interneto raktažodžiai,Internet Filters,Interneto filtrai,Network,tinklas,Search Engines,paieškos stotys,Shortcuts,nuorodos
+Keywords[lv]=Uzlabota Pārlūkošana,Pārlūkošana,WWW,Internets,Interneta Atslēgas vārdi,Interneta Filtri,Tīkls,Meklēšanas dzinēji,ĪsinājumIkonas
+Keywords[mk]=Enhanced Browsing,Browsing,WWW,Internet,Internet Keywords,Internet Filters,Network,Search Engines,Shortcuts,унапредено прелистување,Прелистување,Интернет,Клучни Интернет зборови,Интернет филтри,Мрежа,Пребарувачки сервиси,Кратенки
+Keywords[mn]=Нэгжих,Өргөтгөсөн нэгжилт,WWW,Интернэт,Түлхүүр үг,Шүүлт,Сүлжээ, Интернэт-Шүүлт, Хайлтын машин,Богино тушаал,Сүлжээ
+Keywords[nb]=utvidet surfing,surfing,WWW,internett,internettnøkkelord,internettfilter,nettverk,verdensveven,søkemotorer,søking,snarveier
+Keywords[nds]=Enhanced Browsing,Nettkieken,WWW,Internet,Internet Slötelwöör,Internet Filter,Nettwark,Söökmaschinen,Afkörten,Söökafkörten
+Keywords[ne]=बढाइएको ब्राउजिङ, ब्राउजिङ, WWW, इन्टरनेट, इन्टरनेट शब्दकुञ्जीहरू, इन्टरनेट फिल्टरहरू, सञ्जाल, खोजी इन्जीनहरू, सर्टकट
+Keywords[nl]=geavanceerd browsen,browsing,www,internet,internet keywords,surfen,internetzoektermen,zoekmachines,search engines,snelkoppelingen,internetfilters,Netwerk,verbeterd browsen
+Keywords[nn]=utvida surfing,surfing,WWW,internett,internettnøkkelord,internettfilter,nettverk,verdsveven,søkjemotorar,søkjing,snarvegar
+Keywords[nso]=Boinyakisi bjo bo Hlohleleditswego,Boinyakisi,WWW,Internet, Mantsuhlokwa a Internet ,Disekodi tsa Internet,Kgokagano,Di-Engine tsa Nyako, Ditselakopana
+Keywords[pa]=Enhanced Browsing,Browsing,WWW,Internet,Internet Keywords,Internet Filters,Network,Search Engines,Shortcuts,ਇੰਟਰਨੈਟ,ਇੰਟਰਨੈਟ ਸ਼ਬਦ,ਇੰਟਰਨੈਟ ਫਿਲਟਰ, ਨੈਟਵਰਕ
+Keywords[pl]=Rozszerzone przeglądanie,przeglądanie,WWW,Internet,słowa kluczowe w Internecie,filtry w Internecie,sieć,przeszukiwarki,skróty
+Keywords[pt]=navegação melhorada,navegação,WWW,internet,palavras-chave da internet,filtros internet,rede,motores de busca,atalhos
+Keywords[pt_BR]=navegação melhorada,navegação,WWW,Internet,palavras-chave Internet, filtros Internet,rede,mecanismos de procura,atalhos
+Keywords[ro]=navigare avansată,răsfoire,WWW,Internet,cuvinte cheie Internet,filtre Internet,rețea,motoare de căutare,acceleratori
+Keywords[rw]=Icukumbura Ritunganye,Icukumbura,WWW,Interineti, Amagamborufunguzo Interineti,Muyunguruzi wa Interineti,Urusobemiyoboro, Mushakisha, Amahinanzira
+Keywords[sk]=Rozšírené prehliadanie,Prehliadač,Prehliadanie,WWW,Internet, Sieť,Klávesové skratky,Internetové kľúčové slová,Vyhľadávacie stroje,Skratky
+Keywords[sl]=izboljšano brskanje,brskanje,WWW,splet,internet,ključne besede interneta,filtri interneta,omrežje,iskalni stroji,bližnjice
+Keywords[sr]=Enhanced Browsing,Browsing,WWW,Интернет,Интернет Keywords,Интернет Filters,Network,Search Engines,Shortcuts,Прегледање,Мрежа,Пречице
+Keywords[sr@Latn]=Enhanced Browsing,Browsing,WWW,Internet,Internet Keywords,Internet Filters,Network,Search Engines,Shortcuts,Pregledanje,Mreža,Prečice
+Keywords[sv]=Utökad webbläsning,Surfning,WWW,Internet,Internetsökord,Nätverk,Sökmotorer,Internetfilter,Genvägar
+Keywords[ta]= அதிகப்படுத்தப்பட்ட உலாவுதல்,உலாவுதல்,WWW,இணைதளம்,இணைய முக்கிய வார்த்தைகள்,இணையதள வடிகட்டிகள்,வலைப்பின்னல்,தேடு இயந்திரங்கள்,குறுக்கு வழிகள்
+Keywords[th]=การเรียกดูแบบเพิ่มความสามารถ,การเรียกดู,WWW,อินเทอร์เน็ต,คำค้นทางอินเทอร์เน็ต,ตัวกรองทางอินเทอร์เน็ต,Network,เครื่องมือค้นหา,ทางลัด
+Keywords[tr]=Gelişkin Tarama,Tarama,WWW,İnternet,İnternet Anahtar Kelimeleri,İnternet Süzgeçleri,Ağ,Kısayollar,Kısayol tuşları
+Keywords[uk]=додаткова навігація,навігація,Browsing,WWW,Інтернет,Тенета,Internet,Мережа,машини пошуку,фільтри Інтернет,посилання
+Keywords[uz]=Tezlashtirilgan veb-koʻrish,Qisqartmalar,WWW,Internet,Internet kalit soʻzlari,Internet filterlari,Tarmoq,Qidirish vositasi,Qisqartmalar
+Keywords[uz@cyrillic]=Тезлаштирилган веб-кўриш,Қисқартмалар,WWW,Интернет,Интернет калит сўзлари,Интернет филтерлари,Тармоқ,Қидириш воситаси,Қисқартмалар
+Keywords[ven]=Burausu yo Engedzhaho,WWW,Inithanete,Khii dza maipfi dza Inithanete,Dzifilithara dza Inithanethe,Vhukwamani,Mutshini wau toda,Zwa tshikhau
+Keywords[vi]=Duyệt Nâng cao,Duyệt,WWW,Internet,Từ khoá Internet,Bộ lọc Internet,Mạng,Tìm kiếm,Đường tắt
+Keywords[wa]=Naiviaedje waibe avancî,naivyî,naiviaedje,betchteu,waibe,WWW,internet,daegntoele,rascourtis waibe,passetes waibe,rantoele,ricwerreces,rascourtis
+Keywords[xh]=Ukhangelo zincwadi olomeleziweyo,Khangela iincwadi,WWW,Amagama angundoqo e Internet,Amacebo okucoca ulwelo e Internet,Umsebenzi womnatha,Iinjini Zophendlo,Iindlela ezimfutshane
+Keywords[zh_CN]=Enhanced Browsing,Browsing,WWW,Internet,Internet Keywords,Internet Filters,Network,Search Engines,Shortcuts,增强浏览,浏览,Internet 关键字,Internet 过滤,网络,搜索引擎,快捷方式,速搜
+Keywords[zh_TW]=Enhanced Browsing,Browsing,WWW,Internet,Internet Keywords,Internet Filters,Network,Search Engines,Shortcuts,增強瀏覽,瀏覽,網際網路,網路,搜尋引擎,捷徑
+Keywords[zu]=Ukucinga okujulile,Ukucinga,WWW,Internet,Amagama abalulekile e-Internet,Amahluzo,Uxhumano olusakazekile,Izinjini zokusesha, Izindlela ezimfushane
+
+Categories=Qt;KDE;X-KDE-settings-webbrowsing;
diff --git a/kcontrol/ebrowsing/filteropts.cpp b/kcontrol/ebrowsing/filteropts.cpp
new file mode 100644
index 000000000..ae2127380
--- /dev/null
+++ b/kcontrol/ebrowsing/filteropts.cpp
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2000 Yves Arrouye <yves@realnames.com>
+ *
+ * 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 <unistd.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+
+#include <dcopclient.h>
+#include <klocale.h>
+
+#include "filteropts.h"
+
+FilterOptions::FilterOptions(QWidget *parent, const char *name)
+ :KCModule(parent, name)
+{
+
+ QGridLayout *lay = new QGridLayout(this, 1, 1, 10, 5);
+
+ lay->addWidget(new QLabel(i18n("Under construction..."), this), 0, 0);
+ lay->activate();
+
+}
+
+void FilterOptions::load( bool useDefaults )
+{
+
+}
+
+void FilterOptions::save()
+{
+}
+
+void FilterOptions::defaults()
+{
+ load( true );
+}
+
+void FilterOptions::moduleChanged(bool state)
+{
+ emit changed(state);
+}
+
+#include "filteropts.moc"
diff --git a/kcontrol/ebrowsing/filteropts.h b/kcontrol/ebrowsing/filteropts.h
new file mode 100644
index 000000000..f8a530b4a
--- /dev/null
+++ b/kcontrol/ebrowsing/filteropts.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2000 Yves Arrouye <yves@realnames.com>
+ *
+ * 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.
+ */
+
+
+#ifndef __FILTEROPTS_H___
+#define __FILTEROPTS_H___
+
+#include <kcmodule.h>
+
+class QListBox;
+
+class FilterOptions : public KCModule
+{
+ Q_OBJECT
+
+public:
+ FilterOptions(QWidget *parent = 0, const char *name = 0);
+
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+
+protected slots:
+ void moduleChanged(bool state);
+
+private:
+ QListBox* m_lbFilterList;
+};
+
+#endif
+
diff --git a/kcontrol/ebrowsing/main.cpp b/kcontrol/ebrowsing/main.cpp
new file mode 100644
index 000000000..8c7ab1e5d
--- /dev/null
+++ b/kcontrol/ebrowsing/main.cpp
@@ -0,0 +1,131 @@
+/*
+ * main.cpp
+ *
+ * Copyright (c) 2000 Yves Arrouye <yves@realnames.com>
+ *
+ * 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 <unistd.h>
+
+#include <qlayout.h>
+#include <qmap.h>
+#include <qtabwidget.h>
+
+#include <dcopclient.h>
+#include <kdialog.h>
+#include <kurifilter.h>
+#include <kgenericfactory.h>
+
+#include "filteropts.h"
+#include "main.h"
+
+typedef KGenericFactory<KURIFilterModule, QWidget> KURIFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_kurifilt, KURIFactory("kcmkurifilt") )
+
+class FilterOptions;
+
+KURIFilterModule::KURIFilterModule(QWidget *parent, const char *name, const QStringList &)
+ :KCModule(KURIFactory::instance(), parent, name)
+{
+
+ filter = KURIFilter::self();
+
+ setQuickHelp( i18n("<h1>Enhanced Browsing</h1> In this module you can configure some enhanced browsing"
+ " features of KDE. <h2>Internet Keywords</h2>Internet Keywords let you"
+ " type in the name of a brand, a project, a celebrity, etc... and go to the"
+ " relevant location. For example you can just type"
+ " \"KDE\" or \"K Desktop Environment\" in Konqueror to go to KDE's homepage."
+ "<h2>Web Shortcuts</h2>Web Shortcuts are a quick way of using Web search engines. For example, type \"altavista:frobozz\""
+ " or \"av:frobozz\" and Konqueror will do a search on AltaVista for \"frobozz\"."
+ " Even easier: just press Alt+F2 (if you have not"
+ " changed this shortcut) and enter the shortcut in the KDE Run Command dialog."));
+
+ QVBoxLayout *layout = new QVBoxLayout(this);
+
+#if 0
+ opts = new FilterOptions(this);
+ tab->addTab(opts, i18n("&Filters"));
+ connect(opts, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+#endif
+
+ modules.setAutoDelete(true);
+
+ QMap<QString,KCModule*> helper;
+ QPtrListIterator<KURIFilterPlugin> it = filter->pluginsIterator();
+ for (; it.current(); ++it)
+ {
+ KCModule *module = it.current()->configModule(this, 0);
+ if (module)
+ {
+ modules.append(module);
+ helper.insert(it.current()->configName(), module);
+ connect(module, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+ }
+ }
+
+ if (modules.count() > 1)
+ {
+ QTabWidget *tab = new QTabWidget(this);
+
+ QMapIterator<QString,KCModule*> it2;
+ for (it2 = helper.begin(); it2 != helper.end(); ++it2)
+ {
+ tab->addTab(it2.data(), it2.key());
+ }
+
+ tab->showPage(modules.first());
+ widget = tab;
+ }
+ else if (modules.count() == 1)
+ {
+ widget = modules.first();
+ layout->setMargin(-KDialog::marginHint());
+ }
+
+ layout->addWidget(widget);
+}
+
+void KURIFilterModule::load()
+{
+ QPtrListIterator<KCModule> it(modules);
+ for (; it.current(); ++it)
+ {
+ it.current()->load();
+ }
+}
+
+void KURIFilterModule::save()
+{
+ QPtrListIterator<KCModule> it(modules);
+ for (; it.current(); ++it)
+ {
+ it.current()->save();
+ }
+}
+
+void KURIFilterModule::defaults()
+{
+ QPtrListIterator<KCModule> it(modules);
+ for (; it.current(); ++it)
+ {
+ it.current()->defaults();
+ }
+}
+
+#include "main.moc"
diff --git a/kcontrol/ebrowsing/main.h b/kcontrol/ebrowsing/main.h
new file mode 100644
index 000000000..6b9a0aa21
--- /dev/null
+++ b/kcontrol/ebrowsing/main.h
@@ -0,0 +1,51 @@
+/*
+ * main.h
+ *
+ * Copyright (c) 2000 Yves Arrouye <yves@realnames.com>
+ *
+ * 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.
+ */
+
+
+#ifndef __MAIN_H__
+#define __MAIN_H__
+
+#include <kcmodule.h>
+
+class KURIFilter;
+
+class KURIFilterModule : public KCModule {
+ Q_OBJECT
+
+public:
+ KURIFilterModule(QWidget *parent, const char *name, const QStringList &);
+
+ void load();
+ void load(bool useDefaults );
+ void save();
+ void defaults();
+
+private:
+ KURIFilter *filter;
+
+ QWidget *widget;
+ FilterOptions *opts;
+ QPtrList<KCModule> modules;
+};
+
+#endif
diff --git a/kcontrol/ebrowsing/plugins/Makefile.am b/kcontrol/ebrowsing/plugins/Makefile.am
new file mode 100644
index 000000000..df9163228
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/Makefile.am
@@ -0,0 +1,3 @@
+
+SUBDIRS = ikws shorturi localdomain
+
diff --git a/kcontrol/ebrowsing/plugins/ikws/Makefile.am b/kcontrol/ebrowsing/plugins/ikws/Makefile.am
new file mode 100644
index 000000000..9fbde1ecb
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/Makefile.am
@@ -0,0 +1,31 @@
+## Makefile.am of kdebase/kcontrol/ebrowsing/plugins/ikws
+
+SUBDIRS = searchproviders
+
+AM_CPPFLAGS = $(all_includes)
+
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = libkuriikwsfilter.la libkurisearchfilter.la
+
+libkuriikwsfilter_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+libkuriikwsfilter_la_LIBADD = $(LIB_KSYCOCA) $(LIB_KDEUI)
+
+libkurisearchfilter_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+libkurisearchfilter_la_LIBADD = $(LIB_KSYCOCA) $(LIB_KDEUI)
+
+libkuriikwsfilter_la_SOURCES = kuriikwsfiltereng.cpp kuriikwsfilter.skel \
+ kuriikwsfilter.cpp searchprovider.cpp
+
+libkurisearchfilter_la_SOURCES = kurisearchfilter.cpp kurisearchfilter.skel \
+ kuriikwsfiltereng.cpp ikwsopts.cpp searchproviderdlg.cpp searchprovider.cpp \
+ searchproviderdlg_ui.ui ikwsopts_ui.ui
+
+update_DATA = kuriikwsfilter.upd
+updatedir = $(kde_datadir)/kconf_update
+
+service_DATA = kuriikwsfilter.desktop kurisearchfilter.desktop
+servicedir = $(kde_servicesdir)
+
+servicetypes_DATA = searchprovider.desktop
+servicetypesdir = $(kde_servicetypesdir)
diff --git a/kcontrol/ebrowsing/plugins/ikws/ikwsopts.cpp b/kcontrol/ebrowsing/plugins/ikws/ikwsopts.cpp
new file mode 100644
index 000000000..6c055255d
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/ikwsopts.cpp
@@ -0,0 +1,492 @@
+/*
+ * Copyright (c) 2000 Yves Arrouye <yves@realnames.com>
+ * Copyright (c) 2001, 2002 Dawit Alemayehu <adawit@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <qcheckbox.h>
+#include <qfile.h>
+#include <qgroupbox.h>
+#include <qheader.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qvbox.h>
+#include <qwhatsthis.h>
+
+#include <kdebug.h>
+#include <kglobal.h>
+#include <dcopref.h>
+#include <kapplication.h>
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kiconloader.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kservice.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+#include <ktrader.h>
+
+#include "ikwsopts.h"
+#include "ikwsopts_ui.h"
+#include "kuriikwsfiltereng.h"
+#include "searchprovider.h"
+#include "searchproviderdlg.h"
+
+
+class SearchProviderItem : public QCheckListItem
+{
+public:
+ SearchProviderItem(QListView *parent, SearchProvider *provider)
+ :QCheckListItem(parent, provider->name(), CheckBox), m_provider(provider)
+ {
+ update();
+ }
+
+ virtual ~SearchProviderItem()
+ {
+ delete m_provider;
+ }
+
+ void update()
+ {
+ setText(0, m_provider->name());
+ setText(1, m_provider->keys().join(","));
+ }
+
+ SearchProvider *provider() const { return m_provider; }
+
+private:
+ SearchProvider *m_provider;
+};
+
+FilterOptions::FilterOptions(KInstance *instance, QWidget *parent, const char *name)
+ :KCModule(instance, parent, name)
+{
+ QVBoxLayout *mainLayout = new QVBoxLayout( this, KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ m_dlg = new FilterOptionsUI (this);
+ mainLayout->addWidget(m_dlg);
+
+ m_dlg->lvSearchProviders->header()->setLabel(0, SmallIconSet("bookmark"),i18n("Name"));
+ m_dlg->lvSearchProviders->setSorting(0);
+
+ // Load the options
+ load();
+}
+
+QString FilterOptions::quickHelp() const
+{
+ return i18n("In this module you can configure the web shortcuts feature. "
+ "Web shortcuts allow you to quickly search or lookup words on "
+ "the Internet. For example, to search for information about the "
+ "KDE project using the Google engine, you simply type <b>gg:KDE</b> "
+ "or <b>google:KDE</b>."
+ "<p>If you select a default search engine, normal words or phrases "
+ "will be looked up at the specified search engine by simply typing "
+ "them into applications, such as Konqueror, that have built-in support "
+ "for such a feature.");
+}
+
+void FilterOptions::load()
+{
+ load( false );
+}
+
+void FilterOptions::load( bool useDefaults )
+{
+ // Clear state first.
+ m_dlg->lvSearchProviders->clear();
+
+ KConfig config( KURISearchFilterEngine::self()->name() + "rc", false, false );
+
+ config.setReadDefaults( useDefaults );
+
+ config.setGroup("General");
+
+ QString defaultSearchEngine = config.readEntry("DefaultSearchEngine");
+
+ m_favoriteEngines.clear();
+ m_favoriteEngines << "google" << "google_groups" << "google_news" << "webster" << "dmoz" << "wikipedia";
+ m_favoriteEngines = config.readListEntry("FavoriteSearchEngines", m_favoriteEngines);
+
+ const KTrader::OfferList services = KTrader::self()->query("SearchProvider");
+
+ for (KTrader::OfferList::ConstIterator it = services.begin();
+ it != services.end(); ++it)
+ {
+ displaySearchProvider(new SearchProvider(*it),
+ ((*it)->desktopEntryName() == defaultSearchEngine));
+ }
+
+ bool webShortcutsEnabled = config.readBoolEntry("EnableWebShortcuts", true);
+ m_dlg->cbEnableShortcuts->setChecked( webShortcutsEnabled );
+
+ setDelimiter (config.readNumEntry ("KeywordDelimiter", ':'));
+
+ // Update the GUI to reflect the config options read above...
+ setWebShortcutState();
+
+ if (m_dlg->lvSearchProviders->childCount())
+ m_dlg->lvSearchProviders->setSelected(m_dlg->lvSearchProviders->firstChild(), true);
+
+ // Connect all the signals/slots...
+ connect(m_dlg->cbEnableShortcuts, SIGNAL(clicked()), this,
+ SLOT(setWebShortcutState()));
+ connect(m_dlg->cbEnableShortcuts, SIGNAL(clicked()), this,
+ SLOT(configChanged()));
+
+ connect(m_dlg->lvSearchProviders, SIGNAL(selectionChanged(QListViewItem *)),
+ this, SLOT(updateSearchProvider()));
+ connect(m_dlg->lvSearchProviders, SIGNAL(doubleClicked(QListViewItem *)),
+ this, SLOT(changeSearchProvider()));
+ connect(m_dlg->lvSearchProviders, SIGNAL(returnPressed(QListViewItem *)),
+ this, SLOT(changeSearchProvider()));
+ connect(m_dlg->lvSearchProviders, SIGNAL(executed(QListViewItem *)),
+ this, SLOT(checkFavoritesChanged()));
+ connect(m_dlg->lvSearchProviders, SIGNAL(spacePressed(QListViewItem *)),
+ this, SLOT(checkFavoritesChanged()));
+ connect(m_dlg->lvSearchProviders, SIGNAL(pressed(QListViewItem *)),
+ this, SLOT(checkFavoritesChanged()));
+
+ connect(m_dlg->cmbDefaultEngine, SIGNAL(activated(const QString &)), this,
+ SLOT(configChanged()));
+ connect(m_dlg->cmbDelimiter, SIGNAL(activated(const QString &)), this,
+ SLOT(configChanged()));
+
+ connect(m_dlg->pbNew, SIGNAL(clicked()), this, SLOT(addSearchProvider()));
+ connect(m_dlg->pbChange, SIGNAL(clicked()), this, SLOT(changeSearchProvider()));
+ connect(m_dlg->pbDelete, SIGNAL(clicked()), this, SLOT(deleteSearchProvider()));
+
+ emit changed( useDefaults );
+}
+
+char FilterOptions::delimiter ()
+{
+ switch (m_dlg->cmbDelimiter->currentItem())
+ {
+ case 1:
+ return ' ';
+ case 0:
+ default:
+ return ':';
+ };
+}
+
+void FilterOptions::setDelimiter (char sep)
+{
+ switch (sep)
+ {
+ case ' ':
+ m_dlg->cmbDelimiter->setCurrentItem (1);
+ break;
+ case ':':
+ default:
+ m_dlg->cmbDelimiter->setCurrentItem (0);
+ };
+}
+
+void FilterOptions::save()
+{
+ KConfig config( KURISearchFilterEngine::self()->name() + "rc", false, false );
+
+ config.setGroup("General");
+ config.writeEntry("EnableWebShortcuts", m_dlg->cbEnableShortcuts->isChecked());
+ config.writeEntry("KeywordDelimiter", delimiter() );
+
+ QString engine;
+
+ if (m_dlg->cmbDefaultEngine->currentItem() != 0)
+ engine = m_dlg->cmbDefaultEngine->currentText();
+
+ config.writeEntry("DefaultSearchEngine", m_defaultEngineMap[engine]);
+
+ // kdDebug () << "Engine: " << m_defaultEngineMap[engine] << endl;
+
+ int changedProviderCount = 0;
+ QString path = kapp->dirs()->saveLocation("services", "searchproviders/");
+
+ m_favoriteEngines.clear();
+
+ for (QListViewItemIterator it(m_dlg->lvSearchProviders); it.current(); ++it)
+ {
+ SearchProviderItem *item = dynamic_cast<SearchProviderItem *>(it.current());
+
+ Q_ASSERT(item);
+
+ SearchProvider *provider = item->provider();
+
+ QString name = provider->desktopEntryName();
+
+ if (item->isOn())
+ m_favoriteEngines << name;
+
+ if (provider->isDirty())
+ {
+ changedProviderCount++;
+
+ if (name.isEmpty())
+ {
+ // New provider
+ // Take the longest search shortcut as filename,
+ // if such a file already exists, append a number and increase it
+ // until the name is unique
+ for (QStringList::ConstIterator it = provider->keys().begin(); it != provider->keys().end(); ++it)
+ {
+ if ((*it).length() > name.length())
+ name = (*it).lower();
+ }
+ for (int suffix = 0; ; ++suffix)
+ {
+ QString located, check = name;
+ if (suffix)
+ check += QString().setNum(suffix);
+ if ((located = locate("services", "searchproviders/" + check + ".desktop")).isEmpty())
+ {
+ name = check;
+ break;
+ }
+ else if (located.left(path.length()) == path)
+ {
+ // If it's a deleted (hidden) entry, overwrite it
+ if (KService(located).isDeleted())
+ break;
+ }
+ }
+ }
+
+ KSimpleConfig service(path + name + ".desktop");
+ service.setGroup("Desktop Entry");
+ service.writeEntry("Type", "Service");
+ service.writeEntry("ServiceTypes", "SearchProvider");
+ service.writeEntry("Name", provider->name());
+ service.writeEntry("Query", provider->query(), true, false, true);
+ service.writeEntry("Keys", provider->keys());
+ service.writeEntry("Charset", provider->charset());
+
+ // we might be overwriting a hidden entry
+ service.writeEntry("Hidden", false);
+ }
+ }
+
+ for (QStringList::ConstIterator it = m_deletedProviders.begin();
+ it != m_deletedProviders.end(); ++it)
+ {
+ QStringList matches = kapp->dirs()->findAllResources("services", "searchproviders/" + *it + ".desktop");
+
+ // Shouldn't happen
+ if (!matches.count())
+ continue;
+
+ if (matches.count() == 1 && matches[0].left(path.length()) == path)
+ {
+ // If only the local copy existed, unlink it
+ // TODO: error handling
+ QFile::remove(matches[0]);
+ continue;
+ }
+ KSimpleConfig service(path + *it + ".desktop");
+ service.setGroup("Desktop Entry");
+ service.writeEntry("Type", "Service");
+ service.writeEntry("ServiceTypes", "SearchProvider");
+ service.writeEntry("Hidden", true);
+ }
+
+ config.writeEntry("FavoriteSearchEngines", m_favoriteEngines);
+ config.sync();
+
+ emit changed(false);
+
+ // Update filters in running applications...
+ (void) DCOPRef("*", "KURIIKWSFilterIface").send("configure");
+ (void) DCOPRef("*", "KURISearchFilterIface").send("configure");
+
+ // If the providers changed, tell sycoca to rebuild its database...
+ if (changedProviderCount)
+ KService::rebuildKSycoca(this);
+}
+
+void FilterOptions::defaults()
+{
+ load( true );
+}
+
+void FilterOptions::configChanged()
+{
+ // kdDebug () << "FilterOptions::configChanged: TRUE" << endl;
+ emit changed(true);
+}
+
+void FilterOptions::checkFavoritesChanged()
+{
+ QStringList currentFavoriteEngines;
+ for (QListViewItemIterator it(m_dlg->lvSearchProviders); it.current(); ++it)
+ {
+ SearchProviderItem *item = dynamic_cast<SearchProviderItem *>(it.current());
+
+ Q_ASSERT(item);
+
+ if (item->isOn())
+ currentFavoriteEngines << item->provider()->desktopEntryName();
+ }
+
+ if (!(currentFavoriteEngines==m_favoriteEngines)) {
+ m_favoriteEngines=currentFavoriteEngines;
+ configChanged();
+ }
+}
+
+void FilterOptions::setWebShortcutState()
+{
+ bool use_keywords = m_dlg->cbEnableShortcuts->isChecked();
+ m_dlg->lvSearchProviders->setEnabled(use_keywords);
+ m_dlg->pbNew->setEnabled(use_keywords);
+ m_dlg->pbChange->setEnabled(use_keywords);
+ m_dlg->pbDelete->setEnabled(use_keywords);
+ m_dlg->lbDelimiter->setEnabled (use_keywords);
+ m_dlg->cmbDelimiter->setEnabled (use_keywords);
+ m_dlg->lbDefaultEngine->setEnabled (use_keywords);
+ m_dlg->cmbDefaultEngine->setEnabled (use_keywords);
+}
+
+void FilterOptions::addSearchProvider()
+{
+ SearchProviderDialog dlg(0, this);
+ if (dlg.exec())
+ {
+ m_dlg->lvSearchProviders->setSelected(displaySearchProvider(dlg.provider()), true);
+ configChanged();
+ }
+}
+
+void FilterOptions::changeSearchProvider()
+{
+ SearchProviderItem *item = dynamic_cast<SearchProviderItem *>(m_dlg->lvSearchProviders->currentItem());
+ Q_ASSERT(item);
+
+ SearchProviderDialog dlg(item->provider(), this);
+
+ if (dlg.exec())
+ {
+ m_dlg->lvSearchProviders->setSelected(displaySearchProvider(dlg.provider()), true);
+ configChanged();
+ }
+}
+
+void FilterOptions::deleteSearchProvider()
+{
+ SearchProviderItem *item = dynamic_cast<SearchProviderItem *>(m_dlg->lvSearchProviders->currentItem());
+ Q_ASSERT(item);
+
+ // Update the combo box to go to None if the fallback was deleted.
+ int current = m_dlg->cmbDefaultEngine->currentItem();
+ for (int i = 1, count = m_dlg->cmbDefaultEngine->count(); i < count; ++i)
+ {
+ if (m_dlg->cmbDefaultEngine->text(i) == item->provider()->name())
+ {
+ m_dlg->cmbDefaultEngine->removeItem(i);
+ if (i == current)
+ m_dlg->cmbDefaultEngine->setCurrentItem(0);
+ else if (current > i)
+ m_dlg->cmbDefaultEngine->setCurrentItem(current - 1);
+
+ break;
+ }
+ }
+
+ if (item->nextSibling())
+ m_dlg->lvSearchProviders->setSelected(item->nextSibling(), true);
+ else if (item->itemAbove())
+ m_dlg->lvSearchProviders->setSelected(item->itemAbove(), true);
+
+ if (!item->provider()->desktopEntryName().isEmpty())
+ m_deletedProviders.append(item->provider()->desktopEntryName());
+
+ delete item;
+ updateSearchProvider();
+ configChanged();
+}
+
+void FilterOptions::updateSearchProvider()
+{
+ m_dlg->pbChange->setEnabled(m_dlg->lvSearchProviders->currentItem());
+ m_dlg->pbDelete->setEnabled(m_dlg->lvSearchProviders->currentItem());
+}
+
+SearchProviderItem *FilterOptions::displaySearchProvider(SearchProvider *p, bool fallback)
+{
+ // Show the provider in the list.
+ SearchProviderItem *item = 0L;
+
+ QListViewItemIterator it(m_dlg->lvSearchProviders);
+
+ for (; it.current(); ++it)
+ {
+ if (it.current()->text(0) == p->name())
+ {
+ item = dynamic_cast<SearchProviderItem *>(it.current());
+ Q_ASSERT(item);
+ break;
+ }
+ }
+
+ if (item)
+ item->update ();
+ else
+ {
+ // Put the name in the default search engine combo box.
+ int itemCount;
+ int totalCount = m_dlg->cmbDefaultEngine->count();
+
+ item = new SearchProviderItem(m_dlg->lvSearchProviders, p);
+
+ if (m_favoriteEngines.find(p->desktopEntryName())!=m_favoriteEngines.end())
+ item->setOn(true);
+
+ for (itemCount = 1; itemCount < totalCount; itemCount++)
+ {
+ if (m_dlg->cmbDefaultEngine->text(itemCount) > p->name())
+ {
+ int currentItem = m_dlg->cmbDefaultEngine->currentItem();
+ m_dlg->cmbDefaultEngine->insertItem(p->name(), itemCount);
+ m_defaultEngineMap[p->name ()] = p->desktopEntryName ();
+ if (currentItem >= itemCount)
+ m_dlg->cmbDefaultEngine->setCurrentItem(currentItem+1);
+ break;
+ }
+ }
+
+ // Append it to the end of the list...
+ if (itemCount == totalCount)
+ {
+ m_dlg->cmbDefaultEngine->insertItem(p->name(), itemCount);
+ m_defaultEngineMap[p->name ()] = p->desktopEntryName ();
+ }
+
+ if (fallback)
+ m_dlg->cmbDefaultEngine->setCurrentItem(itemCount);
+ }
+
+ if (!it.current())
+ m_dlg->lvSearchProviders->sort();
+
+ return item;
+}
+
+#include "ikwsopts.moc"
diff --git a/kcontrol/ebrowsing/plugins/ikws/ikwsopts.h b/kcontrol/ebrowsing/plugins/ikws/ikwsopts.h
new file mode 100644
index 000000000..b533fb9a7
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/ikwsopts.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2000 Yves Arrouye <yves@realnames.com>
+ * Copyright (c) 2002, 2003 Dawit Alemayehu <adawit@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __IKWSOPTS_H___
+#define __IKWSOPTS_H___
+
+#include <qlayout.h>
+#include <qtabwidget.h>
+
+#include <kcmodule.h>
+#include <kservice.h>
+
+class FilterOptionsUI;
+class SearchProvider;
+class SearchProviderItem;
+
+class FilterOptions : public KCModule
+{
+ Q_OBJECT
+
+public:
+ FilterOptions(KInstance *instance, QWidget *parent = 0, const char *name = 0);
+
+ void load();
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+ QString quickHelp() const;
+
+protected slots:
+ void configChanged();
+ void checkFavoritesChanged();
+
+ void setWebShortcutState();
+
+ void addSearchProvider();
+ void changeSearchProvider();
+ void deleteSearchProvider();
+ void updateSearchProvider();
+
+private:
+ SearchProviderItem *displaySearchProvider(SearchProvider *p, bool fallback = false);
+
+ void setDelimiter (char);
+ char delimiter ();
+
+ // The names of the providers that the user deleted,
+ // these are marked as deleted in the user's homedirectory
+ // on save if a global service file exists for it.
+ QStringList m_deletedProviders;
+ QMap <QString, QString> m_defaultEngineMap;
+ QStringList m_favoriteEngines;
+
+ FilterOptionsUI* m_dlg;
+};
+
+#endif
diff --git a/kcontrol/ebrowsing/plugins/ikws/ikwsopts_ui.ui b/kcontrol/ebrowsing/plugins/ikws/ikwsopts_ui.ui
new file mode 100644
index 000000000..fdeeb27ca
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/ikwsopts_ui.ui
@@ -0,0 +1,258 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>FilterOptionsUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>FilterOptionsUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>360</width>
+ <height>327</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbEnableShortcuts</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Enable Web shortcuts</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enable shortcuts that allow you to quickly search for information on the web. For example, entering the shortcut &lt;b&gt;gg:KDE&lt;/b&gt; will result in a search of the word &lt;b&gt;KDE&lt;/b&gt; on the Google(TM) search engine.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>lbDelimiter</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Keyword delimiter:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cmbDelimiter</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose the delimiter that separates the keyword from the phrase or word to be searched.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>lbDefaultEngine</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Default &amp;search engine:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cmbDefaultEngine</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Select the search engine to use for input boxes that provide automatic lookup services when you type in normal words and phrases instead of a URL. To disable this feature select &lt;b&gt;None&lt;/b&gt; from the list.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="4" column="1">
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>cmbDefaultEngine</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Select the search engine to use for input boxes that provide automatic lookup services when you type in normal words and phrases instead of a URL. To disable this feature select &lt;b&gt;None&lt;/b&gt; from the list.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>pbChange</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Chan&amp;ge...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Modify a search provider.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="2">
+ <property name="name">
+ <cstring>pbDelete</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>De&amp;lete</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Delete the selected search provider.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="2">
+ <property name="name">
+ <cstring>pbNew</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Add a search provider.</string>
+ </property>
+ </widget>
+ <spacer row="3" column="2" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>170</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KListView" row="0" column="0" rowspan="4" colspan="2">
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Shortcuts</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>lvSearchProviders</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>1</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ <property name="treeStepSize">
+ <number>0</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>List of search providers, their associated shortcuts and whether they shall be listed in menus.</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="5" column="1">
+ <item>
+ <property name="text">
+ <string>Colon</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Space</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>cmbDelimiter</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose the delimiter that separates the keyword from the phrase or word to be searched.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>cbEnableShortcuts</tabstop>
+ <tabstop>lvSearchProviders</tabstop>
+ <tabstop>pbNew</tabstop>
+ <tabstop>pbChange</tabstop>
+ <tabstop>pbDelete</tabstop>
+ <tabstop>cmbDefaultEngine</tabstop>
+ <tabstop>cmbDelimiter</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.cpp b/kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.cpp
new file mode 100644
index 000000000..a7e2e5239
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.cpp
@@ -0,0 +1,81 @@
+/* This file is part of the KDE project
+ Copyright (C) 1999 Simon Hausmann <hausmann@kde.org>
+ Copyright (C) 2000 Yves Arrouye <yves@realnames.com>
+ Copyright (C) 2002, 2003 Dawit Alemayehu <adawit@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <unistd.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <kinstance.h>
+#include <kglobal.h>
+
+#include "ikwsopts.h"
+#include "kuriikwsfiltereng.h"
+#include "kuriikwsfilter.h"
+
+/**
+ * IMPORTANT: If you change anything here, please run the regression test
+ * kdelibs/kio/tests/kurifiltertest
+ */
+
+typedef KGenericFactory<KAutoWebSearch> KAutoWebSearchFactory;
+K_EXPORT_COMPONENT_FACTORY (libkuriikwsfilter, KAutoWebSearchFactory("kcmkurifilt"))
+
+KAutoWebSearch::KAutoWebSearch(QObject *parent, const char *name, const QStringList&)
+ :KURIFilterPlugin(parent, name ? name : "kuriikwsfilter", 1.0),
+ DCOPObject("KURIIKWSFilterIface")
+{
+}
+
+KAutoWebSearch::~KAutoWebSearch()
+{
+}
+
+void KAutoWebSearch::configure()
+{
+ if ( KURISearchFilterEngine::self()->verbose() )
+ kdDebug() << "KAutoWebSearch::configure: Config reload requested..." << endl;
+
+ KURISearchFilterEngine::self()->loadConfig();
+}
+
+bool KAutoWebSearch::filterURI( KURIFilterData &data ) const
+{
+ if (KURISearchFilterEngine::self()->verbose())
+ kdDebug() << "KAutoWebSearch::filterURI: '" << data.uri().url() << "'" << endl;
+
+ KURL u = data.uri();
+ if ( u.pass().isEmpty() )
+ {
+ QString result = KURISearchFilterEngine::self()->autoWebSearchQuery( data.typedString() );
+ if( !result.isEmpty() )
+ {
+ if ( KURISearchFilterEngine::self()->verbose() )
+ kdDebug () << "Filtered URL: " << result << endl;
+
+ setFilteredURI( data, KURL( result ) );
+ setURIType( data, KURIFilterData::NET_PROTOCOL );
+ return true;
+ }
+ }
+ return false;
+}
+
+#include "kuriikwsfilter.moc"
diff --git a/kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.desktop b/kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.desktop
new file mode 100644
index 000000000..bf223f22b
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.desktop
@@ -0,0 +1,70 @@
+[Desktop Entry]
+Type=Service
+Name=InternetKeywordsFilter
+Name[af]=Internetsleutelwoordefilter
+Name[az]=İnternetAçarKəliməSüzgəci
+Name[be]=Фільтр ключавых словаў
+Name[br]=SilGerioùAlc'hwezArKenrouedad
+Name[ca]=Filtre de paraules clau d'Internet
+Name[csb]=Filter internetowëch kluczowëch słów
+Name[cy]=HidlAllweddeiriauRhyngrwyd
+Name[da]=InternetNøgleordsFilter
+Name[de]=Internet-Stichwort-Filter
+Name[el]=Φίλτρο λέξεων κλειδιών διαδικτύου
+Name[eo]=Filtrilo por interretaj ŝlosilvortoj
+Name[es]=Filtro de palabras clave de Internet
+Name[et]=Interneti võtmesõnade filter
+Name[eu]=Interneteko gako-hitzen iragazkia
+Name[fa]=پالایۀ واژه‌های کلیدی اینترنت
+Name[fr]=Mots clés internet
+Name[fy]=YnternetSykwurdenFilter
+Name[hi]=इंटरनेट की-वर्ड्स फ़िल्टर
+Name[hr]=Filtar internetskih ključnih riječi
+Name[hu]=Internetes kulcsszavak szűrője
+Name[id]=FilterInternetKeyword
+Name[is]=InternetStikkorðaSía
+Name[ja]=インターネットキーワードフィルタ
+Name[ka]=ინტერნეტ საკვანძო სიტყვების ფილტრი
+Name[kk]=Интернет түйінді сөздер сүзгісі
+Name[lo]=ຕົວກອງຄຳຄົ້ນຫາເທິງອິນເຕີເນັດ
+Name[lt]=InternetoRaktažodžiųfiltras
+Name[lv]=InternetAtslēgasvārduFiltrs
+Name[mn]=Интернэт-Түлхүүр үг-Шүүгч
+Name[nb]=Filter for Internettnøkkelord
+Name[nds]=Filter för Internet-Slötelwöör
+Name[ne]=इन्टरनेट शब्दकुञ्जी फिल्टर
+Name[nl]=InternetZoektermenFilter
+Name[nn]=Filter for Internettnøkkelord
+Name[nso]=Sesekodi sa Mantsuhlokwa a Internet
+Name[oc]=Filtre de paraules clau Internet
+Name[pa]=ਇੰਟਰਨੈੱਟ ਸ਼ਬਦ ਫਿਲਟਰ
+Name[pl]=Filtr internetowych słów kluczowych
+Name[pt]=Filtro de Palavras-chave na Internet
+Name[pt_BR]=Filtro de Palavras-chave da Internet
+Name[ro]=Filtru de cuvinte cheie Internet
+Name[ru]=Фильтр ключевых слов Интернет
+Name[rw]=MuyunguruziAmagamborufunguzoInterineti
+Name[sk]=Filter Klávesových skratiek pre Internet
+Name[sl]=Filter ključnih besed za internet
+Name[sr]=Филтер кључних речи Интернета
+Name[sr@Latn]=Filter ključnih reči Interneta
+Name[sv]=Internetsökordsfilter
+Name[ta]=தேடல் மூலச்சொற்கள் வடிகட்டி
+Name[te]=ఇంటర్నెట్ కీలకపదాల గలని
+Name[tg]=Софи калидвожаҳои интернет
+Name[th]=ตัวกรองคำค้นหาบนอินเทอร์เน็ต
+Name[tr]=İnternetAnahtarKelimeSüzgeci
+Name[tt]=İnternetTöpsüzSözgeçe
+Name[uk]=Фільтр ключових слів Інтернет
+Name[uz]=Internet kalit soʻzlar filteri
+Name[uz@cyrillic]=Интернет калит сўзлар филтери
+Name[ven]=Filithara ya Khiimaipfi ya Inithanete
+Name[vi]=Trình lọc các từ khoá Mạng
+Name[wa]=PasseteMotsClésDelDaegntoele
+Name[xh]=Amagama Angundoqo ecebo lokucoca ulwelo e Internet
+Name[zh_CN]=Internet 关键字过滤
+Name[zh_TW]=Internet 關鍵字過濾
+Name[zu]=Ihluzo lamagama abalulekile e-Internet
+X-KDE-Library=libkuriikwsfilter
+ServiceTypes=KURIFilter/Plugin
+InitialPreference=1
diff --git a/kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.h b/kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.h
new file mode 100644
index 000000000..e286b3bd6
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.h
@@ -0,0 +1,48 @@
+/* This file is part of the KDE project
+ Copyright (C) 1999 Simon Hausmann <hausmann@kde.org>
+ Copyright (C) 2000 Yves Arrouye <yves@realnames.com>
+ Copyright (C) 2002, 2003 Dawit Alemayehu <adawit@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __KURIIKWSFILTER_H__
+#define __KURIIKWSFILTER_H__
+
+#include <dcopobject.h>
+#include <kgenericfactory.h>
+
+#include <kurifilter.h>
+
+class KInstance;
+
+class KAutoWebSearch : public KURIFilterPlugin, public DCOPObject
+{
+ K_DCOP
+ Q_OBJECT
+public:
+ KAutoWebSearch(QObject *parent = 0, const char *name = 0,
+ const QStringList &args = QStringList() );
+ ~KAutoWebSearch();
+
+ virtual bool filterURI( KURIFilterData& ) const;
+
+k_dcop:
+ virtual void configure();
+};
+
+#endif
+
diff --git a/kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.upd b/kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.upd
new file mode 100644
index 000000000..61d11999d
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/kuriikwsfilter.upd
@@ -0,0 +1,7 @@
+Id=post-kde3.1/cvs
+File=kuriikwsfilterrc
+Group=General
+Key=SearchEngineShortcutsEnabled,EnableWebShortcuts
+Key=InternetKeywordsSearchFallback,DefaultSearchEngine
+RemoveKey=InternetKeywordsEnabled
+RemoveKey=InternetKeywordsSelectedEngine \ No newline at end of file
diff --git a/kcontrol/ebrowsing/plugins/ikws/kuriikwsfiltereng.cpp b/kcontrol/ebrowsing/plugins/ikws/kuriikwsfiltereng.cpp
new file mode 100644
index 000000000..9cf0cf94d
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/kuriikwsfiltereng.cpp
@@ -0,0 +1,540 @@
+
+/* This file is part of the KDE project
+
+ Copyright (C) 2002, 2003 Dawit Alemayehu <adawit@kde.org>
+ Copyright (C) 2000 Yves Arrouye <yves@realnames.com>
+ Copyright (C) 1999 Simon Hausmann <hausmann@kde.org>
+
+ Advanced web shortcuts:
+ Copyright (C) 2001 Andreas Hochsteger <e9625392@student.tuwien.ac.at>
+
+
+ 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 <qregexp.h>
+#include <qtextcodec.h>
+
+#include <kurl.h>
+#include <kdebug.h>
+#include <kconfig.h>
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include <kprotocolinfo.h>
+#include <ksimpleconfig.h>
+#include <kstaticdeleter.h>
+
+#include "kuriikwsfiltereng.h"
+#include "searchprovider.h"
+
+#define PIDDBG kdDebug(7023) << "(" << getpid() << ") "
+#define PDVAR(n,v) PIDDBG << n << " = '" << v << "'\n"
+
+/**
+ * IMPORTANT: If you change anything here, please run the regression test
+ * kdelibs/kio/tests/kurifiltertest
+ */
+
+KURISearchFilterEngine *KURISearchFilterEngine::s_pSelf = 0;
+static KStaticDeleter<KURISearchFilterEngine> kurisearchfilterengsd;
+
+KURISearchFilterEngine::KURISearchFilterEngine()
+{
+ loadConfig();
+}
+
+QString KURISearchFilterEngine::webShortcutQuery( const QString& typedString ) const
+{
+ QString result;
+
+ if (m_bWebShortcutsEnabled)
+ {
+ QString search = typedString;
+ int pos = search.find(m_cKeywordDelimiter);
+
+ QString key;
+ if (pos > -1)
+ key = search.left(pos);
+ else if (m_cKeywordDelimiter == ' ' && !search.isEmpty())
+ key = search;
+
+ if (!key.isEmpty() && !KProtocolInfo::isKnownProtocol( key ))
+ {
+ // Make web shortcut keywords case-insensitive, i.e.
+ // kde == KDE == Kde == kDe == kdE
+ SearchProvider *provider = SearchProvider::findByKey(key.lower());
+
+ if (provider)
+ {
+ result = formatResult(provider->query(), provider->charset(),
+ QString::null, search.mid(pos+1), true);
+ delete provider;
+ }
+ }
+ }
+
+ return result;
+}
+
+
+QString KURISearchFilterEngine::autoWebSearchQuery( const QString& typedString ) const
+{
+ QString result;
+
+ if (m_bWebShortcutsEnabled && !m_defaultSearchEngine.isEmpty())
+ {
+ // Make sure we ignore supported protocols, e.g. "smb:", "http:"
+ int pos = typedString.find(':');
+
+ if (pos == -1 || !KProtocolInfo::isKnownProtocol(typedString.left(pos)))
+ {
+ SearchProvider *provider = SearchProvider::findByDesktopName(m_defaultSearchEngine);
+
+ if (provider)
+ {
+ result = formatResult (provider->query(), provider->charset(),
+ QString::null, typedString, true);
+ delete provider;
+ }
+ }
+ }
+
+ return result;
+}
+
+QCString KURISearchFilterEngine::name() const
+{
+ return "kuriikwsfilter";
+}
+
+KURISearchFilterEngine* KURISearchFilterEngine::self()
+{
+ if (!s_pSelf)
+ kurisearchfilterengsd.setObject( s_pSelf, new KURISearchFilterEngine );
+ return s_pSelf;
+}
+
+QStringList KURISearchFilterEngine::modifySubstitutionMap(SubstMap& map,
+ const QString& query) const
+{
+ // Returns the number of query words
+ QString userquery = query;
+
+ // Do some pre-encoding, before we can start the work:
+ {
+ int start = 0;
+ int pos = 0;
+ QRegExp qsexpr("\\\"[^\\\"]*\\\"");
+
+ // Temporary substitute spaces in quoted strings (" " -> "%20")
+ // Needed to split user query into StringList correctly.
+ while ((pos = qsexpr.search(userquery, start)) >= 0)
+ {
+ int i = 0;
+ int n = 0;
+ QString s = userquery.mid (pos, qsexpr.matchedLength());
+ while ((i = s.find(" ")) != -1)
+ {
+ s = s.replace (i, 1, "%20");
+ n++;
+ }
+ start = pos + qsexpr.matchedLength() + 2*n; // Move after last quote
+ userquery = userquery.replace (pos, qsexpr.matchedLength(), s);
+ }
+ }
+
+ // Split user query between spaces:
+ QStringList l = QStringList::split(" ", userquery.simplifyWhiteSpace());
+
+ // Back-substitute quoted strings (%20 -> " "):
+ {
+ int i = 0;
+ while ((i = userquery.find("%20")) != -1)
+ userquery = userquery.replace(i, 3, " ");
+
+ for ( QStringList::Iterator it = l.begin(); it != l.end(); ++it )
+ *it = (*it).replace("%20", " ");
+ }
+
+ PIDDBG << "Generating substitution map:\n";
+ // Generate substitution map from user query:
+ for (unsigned int i=0; i<=l.count(); i++)
+ {
+ int j = 0;
+ int pos = 0;
+ QString v = "";
+ QString nr = QString::number(i);
+
+ // Add whole user query (\{0}) to substitution map:
+ if (i==0)
+ v = userquery;
+ // Add partial user query items to substitution map:
+ else
+ v = l[i-1];
+
+ // Back-substitute quoted strings (%20 -> " "):
+ while ((j = v.find("%20")) != -1)
+ v = v.replace(j, 3, " ");
+
+ // Insert partial queries (referenced by \1 ... \n) to map:
+ map.replace(QString::number(i), v);
+ PDVAR (" map['" + nr + "']", map[nr]);
+
+ // Insert named references (referenced by \name) to map:
+ j = 0;
+ if ((i>0) && (pos = v.find("=")) > 0)
+ {
+ QString s = v.mid(pos + 1);
+ QString k = v.left(pos);
+
+ // Back-substitute references contained in references (e.g. '\refname' substitutes to 'thisquery=\0')
+ while ((j = s.find("%5C")) != -1) s = s.replace(j, 3, "\\");
+ map.replace(k, s);
+ PDVAR (" map['" + k + "']", map[k]);
+ }
+ }
+
+ return l;
+}
+
+static QString encodeString(const QString &s, int mib)
+{
+ QStringList l = QStringList::split(" ", s, true);
+ for(QStringList::Iterator it = l.begin();
+ it != l.end(); ++it)
+ {
+ *it = KURL::encode_string(*it, mib);
+ }
+ return l.join("+");
+}
+
+QString KURISearchFilterEngine::substituteQuery(const QString& url, SubstMap &map, const QString& userquery, const int encodingMib) const
+{
+ QString newurl = url;
+ QStringList ql = modifySubstitutionMap (map, userquery);
+ int count = ql.count();
+
+ // Check, if old style '\1' is found and replace it with \{@} (compatibility mode):
+ {
+ int pos = -1;
+ if ((pos = newurl.find("\\1")) >= 0)
+ {
+ PIDDBG << "WARNING: Using compatibility mode for newurl='" << newurl
+ << "'. Please replace old style '\\1' with new style '\\{0}' "
+ "in the query definition.\n";
+ newurl = newurl.replace(pos, 2, "\\{@}");
+ }
+ }
+
+ PIDDBG << "Substitute references:\n";
+ // Substitute references (\{ref1,ref2,...}) with values from user query:
+ {
+ int pos = 0;
+ QRegExp reflist("\\\\\\{[^\\}]+\\}");
+
+ // Substitute reflists (\{ref1,ref2,...}):
+ while ((pos = reflist.search(newurl, 0)) >= 0)
+ {
+ bool found = false;
+
+ //bool rest = false;
+ QString v = "";
+ QString rlstring = newurl.mid(pos + 2, reflist.matchedLength() - 3);
+ PDVAR (" reference list", rlstring);
+
+ // \{@} gets a special treatment later
+ if (rlstring == "@")
+ {
+ v = "\\@";
+ found = true;
+ }
+
+ // TODO: strip whitespaces around commas
+ QStringList rl = QStringList::split(",", rlstring);
+ unsigned int i = 0;
+
+ while ((i<rl.count()) && !found)
+ {
+ QString rlitem = rl[i];
+ QRegExp range("[0-9]*\\-[0-9]*");
+
+ // Substitute a range of keywords
+ if (range.search(rlitem, 0) >= 0)
+ {
+ int pos = rlitem.find("-");
+ int first = rlitem.left(pos).toInt();
+ int last = rlitem.right(rlitem.length()-pos-1).toInt();
+
+ if (first == 0)
+ first = 1;
+
+ if (last == 0)
+ last = count;
+
+ for (int i=first; i<=last; i++)
+ {
+ v += map[QString::number(i)] + " ";
+ // Remove used value from ql (needed for \{@}):
+ ql[i-1] = "";
+ }
+
+ v = v.stripWhiteSpace();
+ if (!v.isEmpty())
+ found = true;
+
+ PDVAR (" range", QString::number(first) + "-" + QString::number(last) + " => '" + v + "'");
+ v = encodeString(v, encodingMib);
+ }
+ else if ( rlitem.startsWith("\"") && rlitem.endsWith("\"") )
+ {
+ // Use default string from query definition:
+ found = true;
+ QString s = rlitem.mid(1, rlitem.length() - 2);
+ v = encodeString(s, encodingMib);
+ PDVAR (" default", s);
+ }
+ else if (map.contains(rlitem))
+ {
+ // Use value from substitution map:
+ found = true;
+ PDVAR (" map['" + rlitem + "']", map[rlitem]);
+ v = encodeString(map[rlitem], encodingMib);
+
+ // Remove used value from ql (needed for \{@}):
+ QString c = rlitem.left(1);
+ if (c=="0")
+ {
+ // It's a numeric reference to '0'
+ for (QStringList::Iterator it = ql.begin(); it!=ql.end(); ++it)
+ (*it) = "";
+ }
+ else if ((c>="0") && (c<="9"))
+ {
+ // It's a numeric reference > '0'
+ int n = rlitem.toInt();
+ ql[n-1] = "";
+ }
+ else
+ {
+ // It's a alphanumeric reference
+ QStringList::Iterator it = ql.begin();
+ while ((it != ql.end()) && ((rlitem + "=") != (*it).left(rlitem.length()+1)))
+ ++it;
+ if ((rlitem + "=") == (*it).left(rlitem.length()+1))
+ (*it) = "";
+ }
+
+ // Encode '+', otherwise it would be interpreted as space in the resulting url:
+ int vpos = 0;
+ while ((vpos = v.find('+')) != -1)
+ v = v.replace (vpos, 1, "%2B");
+
+ }
+ else if (rlitem == "@")
+ {
+ v = "\\@";
+ PDVAR (" v", v);
+ }
+
+ i++;
+ }
+
+ newurl = newurl.replace(pos, reflist.matchedLength(), v);
+ }
+
+ // Special handling for \{@};
+ {
+ PDVAR (" newurl", newurl);
+ // Generate list of unmatched strings:
+ QString v = "";
+ for (unsigned int i=0; i<ql.count(); i++) {
+ v += " " + ql[i];
+ }
+ v = v.simplifyWhiteSpace();
+ PDVAR (" rest", v);
+ v = encodeString(v, encodingMib);
+
+ // Substitute \{@} with list of unmatched query strings
+ int vpos = 0;
+ while ((vpos = newurl.find("\\@")) != -1)
+ newurl = newurl.replace (vpos, 2, v);
+ }
+ }
+
+ return newurl;
+}
+
+QString KURISearchFilterEngine::formatResult( const QString& url,
+ const QString& cset1,
+ const QString& cset2,
+ const QString& query,
+ bool isMalformed ) const
+{
+ SubstMap map;
+ return formatResult (url, cset1, cset2, query, isMalformed, map);
+}
+
+QString KURISearchFilterEngine::formatResult( const QString& url,
+ const QString& cset1,
+ const QString& cset2,
+ const QString& query,
+ bool /* isMalformed */,
+ SubstMap& map ) const
+{
+ // Return nothing if userquery is empty and it contains
+ // substitution strings...
+ if (query.isEmpty() && url.find(QRegExp(QRegExp::escape("\\{"))) > 0)
+ return QString::null;
+
+ // Debug info of map:
+ if (!map.isEmpty())
+ {
+ PIDDBG << "Got non-empty substitution map:\n";
+ for(SubstMap::Iterator it = map.begin(); it != map.end(); ++it)
+ PDVAR (" map['" + it.key() + "']", it.data());
+ }
+
+ // Create a codec for the desired encoding so that we can transcode the user's "url".
+ QString cseta = cset1;
+ if (cseta.isEmpty())
+ cseta = "iso-8859-1";
+
+ QTextCodec *csetacodec = QTextCodec::codecForName(cseta.latin1());
+ if (!csetacodec)
+ {
+ cseta = "iso-8859-1";
+ csetacodec = QTextCodec::codecForName(cseta.latin1());
+ }
+
+ // Decode user query:
+ QString userquery = KURL::decode_string(query, 106 /* utf-8*/);
+
+ PDVAR ("user query", userquery);
+ PDVAR ("query definition", url);
+
+ // Add charset indicator for the query to substitution map:
+ map.replace("ikw_charset", cseta);
+
+ // Add charset indicator for the fallback query to substitution map:
+ QString csetb = cset2;
+ if (csetb.isEmpty())
+ csetb = "iso-8859-1";
+ map.replace("wsc_charset", csetb);
+
+ QString newurl = substituteQuery (url, map, userquery, csetacodec->mibEnum());
+
+ PDVAR ("substituted query", newurl);
+
+ return newurl;
+}
+
+void KURISearchFilterEngine::loadConfig()
+{
+ // Migrate from the old format, this block should remain until
+ // we can assume "every" user has upgraded to a KDE version that
+ // contains the sycoca based search provider configuration (malte).
+ // TODO: Remove in KDE 4 !!! This has been here a sufficient amount of time...
+ {
+ KSimpleConfig oldConfig(kapp->dirs()->saveLocation("config") + QString(name()) + "rc");
+ oldConfig.setGroup("General");
+
+ if (oldConfig.hasKey("SearchEngines"))
+ {
+ // User has an old config file in his local config dir
+ PIDDBG << "Migrating config file to .desktop files..." << endl;
+ QString fallback = oldConfig.readEntry("InternetKeywordsSearchFallback");
+ QStringList engines = oldConfig.readListEntry("SearchEngines");
+ for (QStringList::ConstIterator it = engines.begin(); it != engines.end(); ++it)
+ {
+ if (!oldConfig.hasGroup(*it + " Search"))
+ continue;
+
+ oldConfig.setGroup(*it + " Search");
+ QString query = oldConfig.readEntry("Query");
+ QStringList keys = oldConfig.readListEntry("Keys");
+ QString charset = oldConfig.readEntry("Charset");
+ oldConfig.deleteGroup(*it + " Search");
+
+ QString name;
+ for (QStringList::ConstIterator key = keys.begin(); key != keys.end(); ++key)
+ {
+ // take the longest key as name for the .desktop file
+ if ((*key).length() > name.length())
+ name = *key;
+ }
+
+ if (*it == fallback)
+ fallback = name;
+ SearchProvider *provider = SearchProvider::findByKey(name);
+
+ if (provider)
+ {
+ // If this entry has a corresponding global entry
+ // that comes with KDE's default configuration,
+ // compare both and if thei're equal, don't
+ // create a local copy
+ if (provider->name() == *it && provider->query() == query &&
+ provider->keys() == keys && (provider->charset() == charset ||
+ (provider->charset().isEmpty() && charset.isEmpty())))
+ {
+ PIDDBG << *it << " is unchanged, skipping" << endl;
+ continue;
+ }
+
+ delete provider;
+ }
+
+ KSimpleConfig desktop(kapp->dirs()->saveLocation("services", "searchproviders/") + name + ".desktop");
+ desktop.setGroup("Desktop Entry");
+ desktop.writeEntry("Type", "Service");
+ desktop.writeEntry("ServiceTypes", "SearchProvider");
+ desktop.writeEntry("Name", *it);
+ desktop.writeEntry("Query", query);
+ desktop.writeEntry("Keys", keys);
+ desktop.writeEntry("Charset", charset);
+
+ PIDDBG << "Created searchproviders/" << name << ".desktop for " << *it << endl;
+ }
+
+ oldConfig.deleteEntry("SearchEngines", false);
+ oldConfig.setGroup("General");
+ oldConfig.writeEntry("InternetKeywordsSearchFallback", fallback);
+
+ PIDDBG << "...completed" << endl;
+ }
+ }
+
+ PIDDBG << "Keywords Engine: Loading config..." << endl;
+
+ // Load the config.
+ KConfig config( name() + "rc", false, false );
+ config.setGroup( "General" );
+
+ m_cKeywordDelimiter = config.readNumEntry("KeywordDelimiter", ':');
+ m_bWebShortcutsEnabled = config.readBoolEntry("EnableWebShortcuts", true);
+ m_defaultSearchEngine = config.readEntry("DefaultSearchEngine");
+ m_bVerbose = config.readBoolEntry("Verbose", false);
+
+ // Use either a white space or a : as the keyword delimiter...
+ if (strchr (" :",m_cKeywordDelimiter) == 0)
+ m_cKeywordDelimiter = ':';
+
+ PIDDBG << "Keyword Delimiter: " << m_cKeywordDelimiter << endl;
+ PIDDBG << "Default Search Engine: " << m_defaultSearchEngine << endl;
+ PIDDBG << "Web Shortcuts Enabled: " << m_bWebShortcutsEnabled << endl;
+ PIDDBG << "Verbose: " << m_bVerbose << endl;
+}
diff --git a/kcontrol/ebrowsing/plugins/ikws/kuriikwsfiltereng.h b/kcontrol/ebrowsing/plugins/ikws/kuriikwsfiltereng.h
new file mode 100644
index 000000000..d45c17033
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/kuriikwsfiltereng.h
@@ -0,0 +1,77 @@
+/* This file is part of the KDE project
+
+ Copyright (C) 2002,2003 Dawit Alemayehu <adawit@kde.org>
+ Copyright (C) 1999 Simon Hausmann <hausmann@kde.org>
+ Copyright (C) 1999 Yves Arrouye <yves@realnames.com>
+
+ Advanced web shortcuts
+ Copyright (C) 2001 Andreas Hochsteger <e9625392@student.tuwien.ac.at>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __KURISearchFILTERENGINE_H__
+#define __KURISearchFILTERENGINE_H__
+
+#include <qvaluelist.h>
+#include <qstringlist.h>
+
+#include <kservice.h>
+
+class KURL;
+
+
+class KURISearchFilterEngine
+{
+public:
+ typedef QMap <QString, QString> SubstMap;
+
+ KURISearchFilterEngine();
+ ~KURISearchFilterEngine() {};
+
+ QCString name() const;
+
+ QString webShortcutQuery (const QString&) const;
+
+ QString autoWebSearchQuery (const QString&) const;
+
+ bool verbose() const { return m_bVerbose; }
+
+ void loadConfig();
+
+ static KURISearchFilterEngine *self();
+
+protected:
+ QString formatResult (const QString& url, const QString& cset1, const QString& cset2,
+ const QString& query, bool isMalformed) const;
+
+ QString formatResult (const QString& url, const QString& cset1, const QString& cset2,
+ const QString& query, bool isMalformed, SubstMap& map) const;
+
+private:
+ QStringList modifySubstitutionMap (SubstMap& map, const QString& query) const;
+
+ QString substituteQuery (const QString& url, SubstMap &map,
+ const QString& userquery, const int encodingMib) const;
+
+ bool m_bVerbose;
+ bool m_bWebShortcutsEnabled;
+ char m_cKeywordDelimiter;
+
+ QString m_defaultSearchEngine;
+ static KURISearchFilterEngine *s_pSelf;
+};
+
+#endif
diff --git a/kcontrol/ebrowsing/plugins/ikws/kurisearchfilter.cpp b/kcontrol/ebrowsing/plugins/ikws/kurisearchfilter.cpp
new file mode 100644
index 000000000..d56220935
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/kurisearchfilter.cpp
@@ -0,0 +1,90 @@
+/* This file is part of the KDE project
+ Copyright (C) 1999 Simon Hausmann <hausmann@kde.org>
+ Copyright (C) 2000 Yves Arrouye <yves@realnames.com>
+ Copyright (C) 2002, 2003 Dawit Alemayehu <adawit@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <unistd.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kinstance.h>
+#include <kglobal.h>
+
+#include "ikwsopts.h"
+#include "kuriikwsfiltereng.h"
+#include "kurisearchfilter.h"
+
+/**
+ * IMPORTANT: If you change anything here, please run the regression test
+ * kdelibs/kio/tests/kurifiltertest
+ */
+
+typedef KGenericFactory<KURISearchFilter> KURISearchFilterFactory;
+K_EXPORT_COMPONENT_FACTORY(libkurisearchfilter, KURISearchFilterFactory("kcmkurifilt"))
+
+KURISearchFilter::KURISearchFilter(QObject *parent, const char *name,
+ const QStringList &)
+ :KURIFilterPlugin(parent, name ? name : "kurisearchfilter", 1.0),
+ DCOPObject("KURISearchFilterIface")
+{
+}
+
+KURISearchFilter::~KURISearchFilter()
+{
+}
+
+void KURISearchFilter::configure()
+{
+ if ( KURISearchFilterEngine::self()->verbose() )
+ kdDebug() << "KURISearchFilter::configure: Config reload request..." << endl;
+
+ KURISearchFilterEngine::self()->loadConfig();
+}
+
+bool KURISearchFilter::filterURI( KURIFilterData &data ) const
+{
+ if ( KURISearchFilterEngine::self()->verbose() )
+ kdDebug() << "KURISearchFilter::filterURI: '" << data.typedString() << "'" << endl;
+
+ QString result = KURISearchFilterEngine::self()->webShortcutQuery( data.typedString() );
+
+ if ( !result.isEmpty() )
+ {
+ if ( KURISearchFilterEngine::self()->verbose() )
+ kdDebug() << "Filtered URL: " << result << endl;
+
+ setFilteredURI( data, KURL( result ) );
+ setURIType( data, KURIFilterData::NET_PROTOCOL );
+ return true;
+ }
+
+ return false;
+}
+
+KCModule *KURISearchFilter::configModule(QWidget *parent, const char *) const
+{
+ return new FilterOptions( KURISearchFilterFactory::instance(), parent, "kcmkurifilt");
+}
+
+QString KURISearchFilter::configName() const
+{
+ return i18n("Search F&ilters");
+}
+
+#include "kurisearchfilter.moc"
diff --git a/kcontrol/ebrowsing/plugins/ikws/kurisearchfilter.desktop b/kcontrol/ebrowsing/plugins/ikws/kurisearchfilter.desktop
new file mode 100644
index 000000000..0b1a36cfd
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/kurisearchfilter.desktop
@@ -0,0 +1,68 @@
+[Desktop Entry]
+Type=Service
+Name=SearchKeywordsFilter
+Name[af]=Soektogsleutelwoordfilter
+Name[az]=DaramaKəliməSüzgəci
+Name[be]=Фільтр пошуку ключавых словаў
+Name[br]=SilGerioùAlc'hwezKlask
+Name[ca]=Filtre de paraules de recerca
+Name[csb]=Filter kluczowëch słów
+Name[cy]=HidlChwilioAllweddeiriau
+Name[da]=SøgNøgleordsFilter
+Name[de]=Suchstichwort-Filter
+Name[el]=Φίλτρο λέξεων κλειδιών αναζήτησης
+Name[eo]=Filtrilo por serĉaj ŝlosilvortoj
+Name[es]=Filtro de palabras clave de búsqueda
+Name[eu]=Bilaketarako gako-hitzen iragazkia
+Name[fa]=پالایۀ واژه‌های کلیدی جستجو
+Name[fr]=Filtre de mots clés de recherche
+Name[fy]=SykwurdenFilter
+Name[he]=מסנן מילות מפתח לחיפוש
+Name[hi]=सर्च की-वर्ड्स फ़िल्टर
+Name[hr]=Filtar ključnih riječi pretraživanja
+Name[hu]=Kulcsszavak keresési szűrője
+Name[id]=FilterPencarianKeyword
+Name[is]=StikkorðaLeitarSía
+Name[ja]=キーワード検索フィルタ
+Name[ka]=ძიების საკვანძო სიტყვების ფილტრი
+Name[kk]=Іздеу түйінді сөздер сүзгісі
+Name[lo]=ຕົວກອງຄຳຄົ້ນຫາ
+Name[lt]=PaieškosRaktažodžiųFiltras
+Name[lv]=MeklēšanasAtslēgasvārduFiltrs
+Name[mn]=Хайх түлхүүр үг-Шүүгч
+Name[nds]=Filter för Söökafkörten
+Name[ne]=शब्दकुञ्जी फिल्टर खोजी गर्नुहोस्
+Name[nl]=ZoekTermenFilter
+Name[nso]=Sesekodi sa Mantsuhlokwa a Nyako
+Name[oc]=Filtre de paraules de cerca
+Name[pa]=ਖੋਜ ਸ਼ਬਦ ਫਿਲਟਰ
+Name[pl]=Filtr słów kluczowych
+Name[pt]=Filtro de Palavras-chave de Busca
+Name[pt_BR]=Filtro de Procura de Palavras-Chave
+Name[ro]=Filtru de cuvinte cheie de căutare
+Name[ru]=Фильтр ключевых слов поиска
+Name[rw]=MuyunguruziAmagamborufunguzoIshakisha
+Name[sk]=Filter Kľúčových slov Hľadania
+Name[sl]=Filter ključnih besed za iskanje
+Name[sr]=Филтер речи за претраживање
+Name[sr@Latn]=Filter reči za pretraživanje
+Name[sv]=Sökordsökningsfilter
+Name[ta]=முக்கிய வார்த்தைகள் வடிகட்டியை தேடு
+Name[te]=అన్వెషణ కీలకపదాల గలని
+Name[tg]=Софи калидвожаҳои ҷустуҷӯӣ
+Name[th]=ตัวกรองคำค้นหา
+Name[tr]=TaramaKelimeSüzgeci
+Name[tt]=EzläwTöpsuzSözgeçe
+Name[uk]=Фільтр ключових слів Інтернет
+Name[uz]=Qidirish kalit soʻzlar filteri
+Name[uz@cyrillic]=Қидириш калит сўзлар филтери
+Name[ven]=Filithara ya Khiimaipfi yau setsha
+Name[vi]=Trình tìm các từ khoá
+Name[wa]=PasseteCweraedjeDiMotsClés
+Name[xh]=Phendla Amagama Angundoqo Ecebo Lokucoca Ulwelo
+Name[zh_CN]=搜索关键字过滤
+Name[zh_TW]=搜索關鍵字過濾
+Name[zu]=Ihluzo lamagama abalulekile okusesha
+X-KDE-Library=libkurisearchfilter
+ServiceTypes=KURIFilter/Plugin
+InitialPreference=4
diff --git a/kcontrol/ebrowsing/plugins/ikws/kurisearchfilter.h b/kcontrol/ebrowsing/plugins/ikws/kurisearchfilter.h
new file mode 100644
index 000000000..0b8dd1b14
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/kurisearchfilter.h
@@ -0,0 +1,50 @@
+/* This file is part of the KDE project
+ Copyright (C) 1999 Simon Hausmann <hausmann@kde.org>
+ Copyright (C) 2000 Yves Arrouye <yves@realnames.com>
+ Copyright (C) 2002, 2003 Dawit Alemayehu <adawit@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __KURISEARCHFILTER_H__
+#define __KURISEARCHFILTER_H__
+
+#include <dcopobject.h>
+#include <kgenericfactory.h>
+
+#include <kurifilter.h>
+
+class KInstance;
+
+class KURISearchFilter : public KURIFilterPlugin, public DCOPObject
+{
+ Q_OBJECT
+ K_DCOP
+public:
+ KURISearchFilter(QObject *parent = 0, const char *name = 0,
+ const QStringList &args = QStringList() );
+ ~KURISearchFilter();
+
+ virtual bool filterURI( KURIFilterData& ) const;
+ virtual KCModule *configModule(QWidget *parent = 0, const char *name = 0) const;
+ virtual QString configName() const;
+
+k_dcop:
+ virtual void configure();
+};
+
+#endif
+
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchprovider.cpp b/kcontrol/ebrowsing/plugins/ikws/searchprovider.cpp
new file mode 100644
index 000000000..c9e13dc1f
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchprovider.cpp
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2000 Malte Starostik <malte@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <ktrader.h>
+
+#include "searchprovider.h"
+
+SearchProvider::SearchProvider(const KService::Ptr service)
+ : m_dirty(false)
+{
+ m_desktopEntryName = service->desktopEntryName();
+ m_name = service->name();
+ m_query = service->property("Query").toString();
+ m_keys = service->property("Keys").toStringList();
+ m_charset = service->property("Charset").toString();
+}
+
+void SearchProvider::setName(const QString &name)
+{
+ if (m_name == name)
+ return;
+ m_name = name;
+ m_dirty = true;
+}
+
+void SearchProvider::setQuery(const QString &query)
+{
+ if (m_query == query)
+ return;
+ m_query = query;
+ m_dirty = true;
+}
+
+void SearchProvider::setKeys(const QStringList &keys)
+{
+ if (m_keys == keys)
+ return;
+ m_keys = keys;
+ m_dirty = true;
+}
+
+void SearchProvider::setCharset(const QString &charset)
+{
+ if (m_charset == charset)
+ return;
+ m_charset = charset;
+ m_dirty = true;
+}
+
+SearchProvider *SearchProvider::findByDesktopName(const QString &name)
+{
+ KService::Ptr service =
+ KService::serviceByDesktopPath(QString("searchproviders/%1.desktop").arg(name));
+ return service ? new SearchProvider(service) : 0;
+}
+
+SearchProvider *SearchProvider::findByKey(const QString &key)
+{
+ KTrader::OfferList providers =
+ KTrader::self()->query("SearchProvider", QString("'%1' in Keys").arg(key));
+ return providers.count() ? new SearchProvider(providers[0]) : 0;
+}
+
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchprovider.desktop b/kcontrol/ebrowsing/plugins/ikws/searchprovider.desktop
new file mode 100644
index 000000000..35bb3242a
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchprovider.desktop
@@ -0,0 +1,91 @@
+[Desktop Entry]
+Type=ServiceType
+X-KDE-ServiceType=SearchProvider
+Comment=Search Engine
+Comment[af]=Soektog Masjien
+Comment[ar]=محرك البحث
+Comment[az]=Axtarış Mühərriki
+Comment[be]=Рухавік пошуку
+Comment[bn]=সার্চ ইঞ্জিন
+Comment[br]=Keflusker klask
+Comment[bs]=Tražilica
+Comment[ca]=Motor de recerca
+Comment[cs]=Vyhledávací stroj
+Comment[csb]=Szëkôrz
+Comment[cy]=Peiriant Chwilio
+Comment[da]=Søgemaskine
+Comment[de]=Suchmaschine
+Comment[el]=Μηχανή αναζήτησης
+Comment[eo]=Serĉilo
+Comment[es]=Motor de búsqueda
+Comment[et]=Otsingumootor
+Comment[eu]=Bilaketa motorea
+Comment[fa]=موتور جستجو
+Comment[fi]=Hakukone
+Comment[fo]=Leitiskipan
+Comment[fr]=Moteur de recherche
+Comment[fy]=Sykmasine
+Comment[ga]=Inneall Cuardaigh
+Comment[gl]=Ferramenta de Procura
+Comment[he]=מנוע חיפוש
+Comment[hi]=खोज इंजिन
+Comment[hr]=Tražilica
+Comment[hu]=Keresőmotor
+Comment[is]=Leitarvél
+Comment[it]=Motore di ricerca
+Comment[ja]=検索エンジン
+Comment[ka]=საძიებო სისტემა
+Comment[kk]=Іздеу құралы
+Comment[km]=ម៉ាស៊ីន​ស្វែងរក
+Comment[ko]=검색 엔진
+Comment[lo]=ກົນໄກການຄົ້ນຫາ
+Comment[lt]=Paieškos tarnyba
+Comment[lv]=Meklēšanas dzinējs
+Comment[mk]=Машина за пребарување
+Comment[mn]=Хайлтын машин
+Comment[ms]=Enjin Carian
+Comment[mt]=Magna tat-Tfittxija
+Comment[nb]=Søkemotor
+Comment[nds]=Söökmaschien
+Comment[ne]=इन्जीन खोज्नुहोस्
+Comment[nl]=Zoekmachine
+Comment[nn]=Søkjemotor
+Comment[nso]=Engine ya Nyako
+Comment[pa]=ਖੋਜ ਇੰਜਣ
+Comment[pl]=Wyszukiwarka
+Comment[pt]=Motor de Busca
+Comment[pt_BR]=Mecanismo de procura
+Comment[ro]=Motor de căutare
+Comment[ru]=Поисковая машина
+Comment[rw]=Moteri Ishakisha
+Comment[se]=Ohcanmotor
+Comment[sk]=Vyhľadávač
+Comment[sl]=Iskalnik
+Comment[sr]=Претраживачка машина
+Comment[sr@Latn]=Pretraživačka mašina
+Comment[ss]=Injini yekusesha
+Comment[sv]=Sökmotor
+Comment[ta]=தேடு இயந்திரம்
+Comment[tg]=Мошини ҷустуҷӯӣ
+Comment[th]=เครื่องมือสำหรับค้นหา
+Comment[tr]=Arama Motoru
+Comment[tt]=Ezläw Maşínası
+Comment[uk]=Механізм пошуку
+Comment[uz]=Qidirish vositasi
+Comment[uz@cyrillic]=Қидириш воситаси
+Comment[ven]=Nzhini yau setsha
+Comment[vi]=Máy Tìm kiếm
+Comment[wa]=Ricwerrece
+Comment[xh]=Phendla Injini
+Comment[zh_CN]=搜索引擎
+Comment[zh_TW]=搜索引擎
+Comment[zu]=Injini Yokusesha
+
+[PropertyDef::Keys]
+Type=QStringList
+
+[PropertyDef::Query]
+Type=QString
+
+[PropertyDef::Charset]
+Type=QString
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchprovider.h b/kcontrol/ebrowsing/plugins/ikws/searchprovider.h
new file mode 100644
index 000000000..b7916892c
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchprovider.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2000 Malte Starostik <malte@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef __SEARCHPROVIDER_H___
+#define __SEARCHPROVIDER_H___
+
+#include <kservice.h>
+
+class SearchProvider
+{
+public:
+ SearchProvider() : m_dirty(false) {};
+ SearchProvider(const KService::Ptr service);
+
+ const QString &desktopEntryName() const { return m_desktopEntryName; }
+ const QString &name() const { return m_name; }
+ const QString &query() const { return m_query; }
+ const QStringList &keys() const { return m_keys; }
+ const QString &charset() const { return m_charset; }
+ bool isDirty() const { return m_dirty; }
+
+ void setName(const QString &);
+ void setQuery(const QString &);
+ void setKeys(const QStringList &);
+ void setCharset(const QString &);
+
+ static SearchProvider *findByDesktopName(const QString &);
+ static SearchProvider *findByKey(const QString &);
+private:
+ QString m_desktopEntryName;
+ QString m_name;
+ QString m_query;
+ QStringList m_keys;
+ QString m_charset;
+
+ bool m_dirty;
+};
+
+#endif
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.cpp b/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.cpp
new file mode 100644
index 000000000..ca7161b1c
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2000 Malte Starostik <malte@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qwhatsthis.h>
+
+#include <kapplication.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kcharsets.h>
+#include <klineedit.h>
+#include <kcombobox.h>
+#include <kmessagebox.h>
+
+#include "searchproviderdlg_ui.h"
+#include "searchproviderdlg.h"
+#include "searchprovider.h"
+
+SearchProviderDialog::SearchProviderDialog(SearchProvider *provider,
+ QWidget *parent, const char *name)
+ :KDialogBase(parent, name, true, QString::null, Ok|Cancel),
+ m_provider(provider)
+{
+ m_dlg = new SearchProviderDlgUI (this);
+ setMainWidget(m_dlg);
+
+ enableButtonSeparator(true);
+
+ m_dlg->leQuery->setMinimumWidth(kapp->fontMetrics().maxWidth() * 40);
+
+ connect(m_dlg->leName, SIGNAL(textChanged(const QString &)), SLOT(slotChanged()));
+ connect(m_dlg->leQuery, SIGNAL(textChanged(const QString &)), SLOT(slotChanged()));
+ connect(m_dlg->leShortcut, SIGNAL(textChanged(const QString &)), SLOT(slotChanged()));
+
+ // Data init
+ QStringList charsets = KGlobal::charsets()->availableEncodingNames();
+ charsets.prepend(i18n("Default"));
+ m_dlg->cbCharset->insertStringList(charsets);
+
+ if (m_provider)
+ {
+ setPlainCaption(i18n("Modify Search Provider"));
+ m_dlg->leName->setText(m_provider->name());
+ m_dlg->leQuery->setText(m_provider->query());
+ m_dlg->leShortcut->setText(m_provider->keys().join(","));
+ m_dlg->cbCharset->setCurrentItem(m_provider->charset().isEmpty() ? 0 : charsets.findIndex(m_provider->charset()));
+ m_dlg->leName->setEnabled(false);
+ m_dlg->leQuery->setFocus();
+ }
+ else
+ {
+ setPlainCaption(i18n("New Search Provider"));
+ m_dlg->leName->setFocus();
+ enableButton(Ok, false);
+ }
+}
+
+void SearchProviderDialog::slotChanged()
+{
+ enableButton(Ok, !(m_dlg->leName->text().isEmpty()
+ || m_dlg->leShortcut->text().isEmpty()
+ || m_dlg->leQuery->text().isEmpty()));
+}
+
+void SearchProviderDialog::slotOk()
+{
+ if ((m_dlg->leQuery->text().find("\\{") == -1)
+ && KMessageBox::warningContinueCancel(0,
+ i18n("The URI does not contain a \\{...} placeholder for the user query.\n"
+ "This means that the same page is always going to be visited, "
+ "regardless of what the user types."),
+ QString::null, i18n("Keep It")) == KMessageBox::Cancel)
+ return;
+
+ if (!m_provider)
+ m_provider = new SearchProvider;
+ m_provider->setName(m_dlg->leName->text().stripWhiteSpace());
+ m_provider->setQuery(m_dlg->leQuery->text().stripWhiteSpace());
+ m_provider->setKeys(QStringList::split(",", m_dlg->leShortcut->text().stripWhiteSpace()));
+ m_provider->setCharset(m_dlg->cbCharset->currentItem() ? m_dlg->cbCharset->currentText() : QString::null);
+ KDialog::accept();
+}
+
+#include "searchproviderdlg.moc"
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.h b/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.h
new file mode 100644
index 000000000..5abb2f057
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2000 Malte Starostik <malte@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef __SEARCHPROVIDERDLG_H___
+#define __SEARCHPROVIDERDLG_H___
+
+#include <kdialogbase.h>
+
+class SearchProvider;
+class SearchProviderDlgUI;
+
+class SearchProviderDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ SearchProviderDialog(SearchProvider *provider, QWidget *parent = 0, const char *name = 0);
+
+ SearchProvider *provider() { return m_provider; }
+
+protected slots:
+ void slotChanged();
+ void slotOk();
+
+private:
+ SearchProvider *m_provider;
+ SearchProviderDlgUI *m_dlg;
+};
+
+#endif
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg_ui.ui b/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg_ui.ui
new file mode 100644
index 000000000..1a507c0ff
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg_ui.ui
@@ -0,0 +1,137 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>SearchProviderDlgUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SearchProviderDlgUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>399</width>
+ <height>206</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="KLineEdit" row="1" column="0">
+ <property name="name">
+ <cstring>leName</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter the human readable name of the search provider here.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="6" column="0">
+ <property name="name">
+ <cstring>lbCharset</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Charset:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cbCharset</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select the character set that will be used to encode your search query</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>lbQuery</cstring>
+ </property>
+ <property name="text">
+ <string>Search &amp;URI:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leQuery</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the URI that is used to do a search on the search engine here.&lt;br/&gt;The whole text to be searched for can be specified as \{@} or \{0}.&lt;br/&gt;
+Recommended is \{@}, since it removes all query variables (name=value) from the resulting string whereas \{0} will be substituted with the unmodified query string.&lt;br/&gt;You can use \{1} ... \{n} to specify certain words from the query and \{name} to specify a value given by 'name=value' in the user query.&lt;br/&gt;In addition it is possible to specify multiple references (names, numbers and strings) at once (\{name1,name2,...,"string"}).&lt;br/&gt;The first matching value (from the left) will be used as substitution value for the resulting URI.&lt;br/&gt;A quoted string can be used as default value if nothing matches from the left of the reference list.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>lbName</cstring>
+ </property>
+ <property name="text">
+ <string>Search &amp;provider name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leName</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter the human readable name of the search provider here.</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="5" column="0">
+ <property name="name">
+ <cstring>leShortcut</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+The shortcuts entered here can be used as a pseudo-URI scheme in KDE. For example, the shortcut &lt;b&gt;av&lt;/b&gt; can be used as in &lt;b&gt;av&lt;/b&gt;:&lt;b&gt;my search&lt;/b&gt;
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>lbShortcut</cstring>
+ </property>
+ <property name="text">
+ <string>UR&amp;I shortcuts:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leShortcut</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+The shortcuts entered here can be used as a pseudo-URI scheme in KDE. For example, the shortcut &lt;b&gt;av&lt;/b&gt; can be used as in &lt;b&gt;av&lt;/b&gt;:&lt;b&gt;my search&lt;/b&gt;
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="3" column="0">
+ <property name="name">
+ <cstring>leQuery</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the URI that is used to do a search on the search engine here.&lt;br/&gt;The whole text to be searched for can be specified as \{@} or \{0}.&lt;br/&gt;
+Recommended is \{@}, since it removes all query variables (name=value) from the resulting string whereas \{0} will be substituted with the unmodified query string.&lt;br/&gt;You can use \{1} ... \{n} to specify certain words from the query and \{name} to specify a value given by 'name=value' in the user query.&lt;br/&gt;In addition it is possible to specify multiple references (names, numbers and strings) at once (\{name1,name2,...,"string"}).&lt;br/&gt;The first matching value (from the left) will be used as substitution value for the resulting URI.&lt;br/&gt;A quoted string can be used as default value if nothing matches from the left of the reference list.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="7" column="0">
+ <property name="name">
+ <cstring>cbCharset</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select the character set that will be used to encode your search query.</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<tabstops>
+ <tabstop>leName</tabstop>
+ <tabstop>leQuery</tabstop>
+ <tabstop>leShortcut</tabstop>
+ <tabstop>cbCharset</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kcombobox.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/Makefile.am b/kcontrol/ebrowsing/plugins/ikws/searchproviders/Makefile.am
new file mode 100644
index 000000000..66a6ab8bf
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/Makefile.am
@@ -0,0 +1,91 @@
+# List generated with ls -1 *.desktop | sed -e 's/^/\t\t/;s/$/ \\/'
+services_DATA = \
+ acronym.desktop \
+ alexa.desktop \
+ alexa_url.desktop \
+ alltheweb.desktop \
+ altavista.desktop \
+ amg.desktop \
+ appsy.desktop \
+ austronaut.desktop \
+ backports.desktop \
+ bugft.desktop \
+ bugno.desktop \
+ call.desktop \
+ cia.desktop \
+ citeseer.desktop \
+ cpan.desktop \
+ ctan_cat.desktop \
+ ctan.desktop \
+ dbug.desktop \
+ de2en.desktop \
+ de2fr.desktop \
+ deb.desktop \
+ dmoz.desktop \
+ docbook.desktop \
+ doi.desktop \
+ en2de.desktop \
+ en2es.desktop \
+ en2fr.desktop \
+ en2it.desktop \
+ es2en.desktop \
+ excite.desktop \
+ feedster.desktop \
+ foldoc.desktop \
+ fr2de.desktop \
+ fr2en.desktop \
+ freedb.desktop \
+ freshmeat.desktop \
+ froogle.desktop \
+ fsd.desktop \
+ google_advanced.desktop \
+ google.desktop \
+ google_groups.desktop \
+ google_images.desktop \
+ google_lucky.desktop \
+ google_movie.desktop \
+ google_news.desktop \
+ gracenote.desktop \
+ grec.desktop \
+ hotbot.desktop \
+ hyperdictionary.desktop \
+ hyperdictionary_thesaurus.desktop \
+ imdb.desktop \
+ it2en.desktop \
+ jeeves.desktop \
+ kde.desktop \
+ kde_websvn.desktop \
+ katatudo.desktop \
+ leo.desktop \
+ lycos.desktop \
+ mamma.desktop \
+ metacrawler.desktop \
+ msdn.desktop \
+ netcraft.desktop \
+ nl-telephone.desktop \
+ nl-teletekst.desktop \
+ pgpkeys.desktop \
+ php.desktop \
+ python.desktop \
+ qt.desktop \
+ qt3.desktop \
+ rae.desktop \
+ rfc.desktop \
+ rpmfind.desktop \
+ ruby_application_archive.desktop \
+ seek.desktop \
+ sourceforge.desktop \
+ technorati.desktop \
+ technoratitags.desktop \
+ thesaurus.desktop \
+ tvtome.desktop \
+ uspto.desktop \
+ vivisimo.desktop \
+ voila.desktop \
+ webster.desktop \
+ whatis.desktop \
+ wikipedia.desktop \
+ wiktionary.desktop \
+ wordref.desktop
+
+servicesdir = $(kde_servicesdir)/searchproviders
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/acronym.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/acronym.desktop
new file mode 100644
index 000000000..ddd1039d4
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/acronym.desktop
@@ -0,0 +1,83 @@
+[Desktop Entry]
+Type=Service
+Name=Acronym Database
+Name[af]=Akroniem Databasis
+Name[ar]=قاعدة بيانات النحت الأوائلي ( Acronym )
+Name[az]=Akronim Kəlimə Databeyzi
+Name[be]=Скарачэнні
+Name[bn]=অ্যাক্রোনিম ডেটাবেস
+Name[bs]=Baza akronima
+Name[ca]=Base de dades d'acrònims
+Name[cs]=Databáze akronymů
+Name[csb]=Baza akronimów
+Name[cy]=Cronfa Llythrenwau
+Name[da]=Akronymdatabase
+Name[de]=Acronym-Datenbank
+Name[el]=Βάση δεδομένων αρκτικόλεξου
+Name[eo]=Mallongigo-datumbazo
+Name[es]=Base de datos Acronym
+Name[et]=Akronüümide andmebaas
+Name[eu]=Acronym datu-basea
+Name[fa]=دادگان سرنام
+Name[fi]=Akronyymitietokanta
+Name[fo]=Styttingardátugrunnur
+Name[fr]=Base de données Acronym
+Name[fy]=Acroniemen databank
+Name[ga]=Bunachar Sonraí Acrainmeacha
+Name[gl]=Base de Datos de Acrónimos
+Name[he]=בסיס נתונים של מילים נרדפות
+Name[hi]=एक्रोनिम डाटाबेस
+Name[hr]=Baza podataka kratica
+Name[hu]=Mozaikszó-adatbázis
+Name[is]=Samheitagrunnur
+Name[it]=Database acronimi
+Name[ka]=აკრონიმთა ბაზა
+Name[kk]=Қысқартулар дерек қоры
+Name[km]=មូលដ្ឋាន​ទិន្នន័យ​អក្សរ​កាត់
+Name[ko]=두문자어 정보
+Name[lo]=ຖານຂໍ້ມູນ Acronym
+Name[lt]=Akronimų duomenų bazė
+Name[lv]=Akronīmu Datubāze
+Name[mk]=База на податоци со акроними
+Name[mn]=Acronym-Өгөгдлийн бааз
+Name[ms]=Pangkalan Data Akronim
+Name[mt]=Database ta' taqsiriet
+Name[nb]=Forkortingsdatabase
+Name[nds]=Akronüm-Datenbank
+Name[ne]=एक्रोनम डेटाबेस
+Name[nl]=Acroniemen database
+Name[nn]=Forkortingsdatabase
+Name[nso]=Database ya Acronym
+Name[pa]=ਅਕਰੋਨਮ ਡਾਟਾਬੇਸ
+Name[pl]=Baza akronimów
+Name[pt]=Base de Dados de Acrónimos
+Name[pt_BR]=Banco de Acrônimos
+Name[ro]=Bază de date de acronime
+Name[ru]=База данных акронимов
+Name[rw]=Ububikoshingiro bw'Impine
+Name[se]=Oanádusdiehtovuođđu
+Name[sk]=Databáza skratiek
+Name[sl]=Zbirka okrajšav
+Name[sr]=База скраћеница
+Name[sr@Latn]=Baza skraćenica
+Name[ss]=Silulu semniningwane yetifinyeto
+Name[ta]=குறுஞ்சொற் தரவுத்தளம்
+Name[tg]=Бонки иттилооти маҳқуф
+Name[th]=ฐานข้อมูล Acronym
+Name[tr]=Eş Kelime Veritabanı
+Name[tt]=Qısqartma Biremlege
+Name[uk]=База даних акронімів
+Name[uz]=Qisqartma maʼlumot bazasi
+Name[uz@cyrillic]=Қисқартма маълумот базаси
+Name[ven]=Databeizi ya tshikau
+Name[vi]=Cơ sở dữ liệu Viết tắt
+Name[wa]=Båzes di dnêyes d' acronimes
+Name[xh]=Isiseko sedata Segama elenziwe ngonoobumba bamanye amagama
+Name[zh_CN]=首字母缩写数据库
+Name[zh_TW]=Acronym 資料庫
+Name[zu]=Isiqu sedata samagama asho okufanayo
+ServiceTypes=SearchProvider
+Keys=ad,acro,acronym
+Query=http://www.chemie.de/tools/acronym.php3?language=e&acronym=\\{@}
+Query[ne]=http://www.chemie.de/tools/acronym.php3?language=eacronym=\\{@}
+Query[sk]=http://www.chemie.de/tools/acronym.php3?language=sk&acronym=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/alexa.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/alexa.desktop
new file mode 100644
index 000000000..aaa75e772
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/alexa.desktop
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Type=Service
+Name=Alexa
+Name[bn]=অ্যালেক্সা
+Name[eo]=Aleksa
+Name[hi]=अलेक्सा
+Name[lo]=ສຸວັນທອງ
+Name[ne]=एलेक्सा
+Name[pa]=ਅਲੀਕਸਾ
+Name[ta]=அலெக்சா
+Name[te]=ఎలెక్సా
+ServiceTypes=SearchProvider
+Keys=al,alexa
+Query=http://info.alexa.com/search?q=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/alexa_url.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/alexa_url.desktop
new file mode 100644
index 000000000..70b93be4d
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/alexa_url.desktop
@@ -0,0 +1,43 @@
+[Desktop Entry]
+Type=Service
+Name=Alexa URL
+Name[bn]=অ্যালেক্সা ইউ-আর-এল
+Name[br]=URL Alexa
+Name[ca]=URL d'Alexa
+Name[csb]=Lënk Alexa
+Name[da]=Alexa-URL
+Name[de]=Alexa-Adresse
+Name[eo]=Aleksa URL
+Name[es]=URL de Alexa
+Name[fa]=نشانی وب Alexa
+Name[fr]=URL Alexa
+Name[fy]=Alexa URL-adres
+Name[ga]=URL Alexa
+Name[he]=כתובת של Alexa
+Name[hi]=एलेक्सा यूआरएल
+Name[is]=Alexa slóð
+Name[it]=URL Alexa
+Name[lo]=ສຸວັນທອງ
+Name[mn]=Alexa-Хаяг
+Name[ms]=URL Alexa
+Name[mt]=URL Alexa
+Name[nb]=Alexa-nettadresse
+Name[ne]=एलेक्सा यूआरएल
+Name[nl]=Alexa URL-adres
+Name[nso]=URL ya Alexa
+Name[pa]=ਅਲੀਕਸਾ URL
+Name[pl]=Odnośnik Alexa
+Name[pt]=URL do Alexa
+Name[pt_BR]=URL do Alexa
+Name[ro]=URL Alexa
+Name[sl]=URL Alexe
+Name[ss]=I-URL ye Alexa
+Name[sv]=Alexa webbadress
+Name[ta]=அலெக்சா URL
+Name[te]=ఎలెక్సా యూ అర్ ఎల్
+Name[vi]=Địa chỉ Alexa
+Name[wa]=URL d' Alexa
+Name[zu]=I-URL ye-Alexa
+ServiceTypes=SearchProvider
+Keys=alu,url
+Query=http://info.alexa.com/data/details?url=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/alltheweb.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/alltheweb.desktop
new file mode 100644
index 000000000..fca85d4d2
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/alltheweb.desktop
@@ -0,0 +1,45 @@
+[Desktop Entry]
+Type=Service
+Name=AllTheWeb fast
+Name[af]=Allesvandieweb vinnige
+Name[az]=AllTheWeb
+Name[ca]=AllTheWeb ràpid
+Name[csb]=AllTheWeb - tekstë, filmë, teledisczi, serwerë FTP
+Name[cy]=AllTheWeb cyflym
+Name[da]=AllTheWeb hurtigt
+Name[eo]=La tuta teksaĵo rapide
+Name[es]=AllTheWeb de Fast
+Name[fa]=سرعت AllTheWeb
+Name[gl]=AllTheWeb rápido
+Name[hi]=आल-द-वेब फास्ट
+Name[hr]=AllTheWeb brzo
+Name[hu]=AllTheWeb (gyors)
+Name[is]=AllTheWeb hratt
+Name[it]=AllTheWeb veloce
+Name[km]=AllTheWeb លឿន
+Name[lo]=AlltheWebfast
+Name[ne]=सबै वेब छिटो
+Name[nn]=AllTheWeb Fast
+Name[nso]=Web Kamoka ka lebelo
+Name[pa]=ਸਭ ਵੈਬ ਤੇਜ਼
+Name[pl]=AllTheWeb - teksty, filmy, teledyski, serwery FTP
+Name[pt]=AllThe Web fast
+Name[pt_BR]=AllTheWeb
+Name[ro]=AllTheWeb rapid
+Name[rw]=Imbugamakuru Zose zihuta
+Name[sl]=AllTheWeb hitro
+Name[sv]=AllTheWeb snabb
+Name[ta]=எல்லா வலைப்பின்னலும் விரைவாக உள்ளது
+Name[th]=AllTheWeb หารวดเร็ว
+Name[tr]=AllTheWeb
+Name[tt]=AllTheWeb
+Name[uz]=Butun vebni (tez)
+Name[uz@cyrillic]=Бутун вебни (тез)
+Name[ven]=Webu dzothe ngau tavhanya
+Name[vi]=Tìm mọi trang mạng nhanh
+Name[wa]=AllTheWeb rade
+Name[xh]=Yonke i Web ngokukhawuleza
+Name[zu]=Yonke i-Web ngokushesha
+ServiceTypes=SearchProvider
+Keys=atw,alltheweb
+Query=http://www.alltheweb.com/search?exec=FAST+Search&type=all&query=\\{@}&cat=web
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/altavista.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/altavista.desktop
new file mode 100644
index 000000000..42b273d68
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/altavista.desktop
@@ -0,0 +1,23 @@
+[Desktop Entry]
+Type=Service
+Name=AltaVista
+Name[af]=Altavista
+Name[csb]=AltaVista - szëkôrz starnów WWW
+Name[eo]=Altavisto
+Name[et]=Altavista
+Name[hi]=अल्टाविस्टा
+Name[lo]=Altavista
+Name[ne]=अल्टाभिस्टा
+Name[pa]=ਅਲਟਾ ਵੀਸਟਾ
+Name[pl]=AltaVista - wyszukiwarka stron WWW
+Name[sv]=Altavista
+Name[ta]=அல்டாவிஸ்டா
+Name[te]=ఆల్టావిస్టా
+Name[th]=อัลต้าวิสต้า
+ServiceTypes=SearchProvider
+Keys=av,altavista
+Query=http://www.altavista.com/cgi-bin/query?pg=q&kl=XX&stype=stext&q=\\{@}
+Query[nb]=http://no.altavista.com/cgi-bin/query?pg=q&kl=XX&stype=stext&q=\\{@}
+Query[ne]=http://www.altavista.com/cgi-bin/query?pg=qkl=XX&stype=stext&q=\\{@}
+Query[nn]=http://no.altavista.com/cgi-bin/query?pg=q&kl=XX&stype=stext&q=\\{@}
+Query[ro]=http://www.altavista.com/cgi-bin/query?pg=q&kl=ro&stype=stext&q=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/amg.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/amg.desktop
new file mode 100644
index 000000000..908f3fee8
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/amg.desktop
@@ -0,0 +1,49 @@
+[Desktop Entry]
+Hidden=false
+Keys=amg
+Name=All Music Guide
+Name[ar]=مرشد لكل الموسيقى
+Name[az]=Geniş Musiqi Rəhbəri
+Name[bn]=অল মিউজিক গাইড
+Name[bs]=Vodič za svu muziku
+Name[ca]=Guia per a tota la música
+Name[csb]=Mùzyczny prowôdnik
+Name[cy]=Canllaw Cerdd
+Name[da]=All musik-guide
+Name[el]=Οδηγός All Music
+Name[eo]=Konciza muzik-gvidlibro
+Name[es]=Guía All Music
+Name[eu]=All Music gida
+Name[fa]=کل راهنمای موسیقی
+Name[fr]=Guide All Music
+Name[gl]=Guia de Toda a Música
+Name[he]=מדריך למוסיקה
+Name[hi]=सम्पूर्ण संगीत मार्गदर्शिका
+Name[hr]=Glazbeni vodič
+Name[is]=Tónlistarhandbók
+Name[it]=Guida All Music
+Name[km]=មគ្គុទ្ទេសក៍​តន្ត្រី​ទាំងអស់
+Name[ms]=Panduan Semua Muzik
+Name[ne]=सबै सङ्गीत मार्गदर्शक
+Name[pa]=ਸਭ ਸੰਗੀਤ ਗਾਈਡ
+Name[pl]=Przewodnik muzyczny
+Name[pt]=Guia 'Toda a Música'
+Name[pt_BR]=Guia All Music
+Name[ro]=Ghid muzical complet
+Name[rw]=Inyifashisho y'Imiziki Yose
+Name[sl]=Vodnik All Music
+Name[sr]=Свемузички водич
+Name[sr@Latn]=Svemuzički vodič
+Name[sv]=Guiden All Musik
+Name[ta]=அனைத்து இசை துணை
+Name[tg]=Ҳамаи мусиқихо
+Name[tr]=Müzik Kılavuzu
+Name[tt]=All Music
+Name[vi]=Hướng dẫn Âm nhạc
+Name[wa]=Guide All Music
+Name[zh_CN]=全音乐指南
+Name[zh_TW]=所有音樂指南
+Query=http://www.allmusic.com/cg/amg.dll?p=amg&opt1=1&sql=\\{@}
+Query[ne]=http://www.allmusic.com/cg/amg.dll?p=amgopt1=1&sql=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/appsy.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/appsy.desktop
new file mode 100644
index 000000000..13584e1f3
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/appsy.desktop
@@ -0,0 +1,84 @@
+[Desktop Entry]
+Type=Service
+Name=KDE App Search
+Name[af]=KDE App Soektog
+Name[ar]=بحث عن تطبيقات KDE
+Name[az]=KDE Proqram Axtarışı
+Name[be]=Пошук праграмаў KDE
+Name[bn]=কে.ডি.ই. অ্যাপলিকেশন অনুসন্ধান
+Name[bs]=KDE App tražilica
+Name[ca]=Recerca d'aplicacions KDE
+Name[cs]=Vyhledávání KDE aplikací
+Name[csb]=Szëkba programów KDE
+Name[cy]=KDE App Chwilio
+Name[da]=KDE Prog-søgning
+Name[de]=Programmsuche
+Name[el]=Αναζήτηση εφαρμογών του KDE
+Name[eo]=KDE app-serĉo
+Name[es]=Búsqueda de apps. de KDE
+Name[et]=KDE rakenduste otsing
+Name[eu]=KDEren aplikazio bilaketa
+Name[fa]=جستجوی کاربرد KDE
+Name[fi]=KDE-sovellusten haku
+Name[fo]=KDE Forritsleitan
+Name[fr]=Application de recherche de KDE
+Name[fy]=Programma's sykje
+Name[ga]=Cuardach Feidhmchláir KDE
+Name[gl]=Procura de Aplicacións de KDE
+Name[he]=חיפוש יישומי KDE
+Name[hi]=केडीई एप खोज
+Name[hr]=KDE pretraživanje aplikacija
+Name[hu]=KDE alkalmazások keresése
+Name[it]=Ricerca applicazioni di KDE
+Name[ja]=KDE アプリケーション検索
+Name[ka]=KDE–ს პროგრამების ძებნა
+Name[kk]=KDE қолданбаларын табу
+Name[km]=ស្វែងរក​កម្មវិធី KDE
+Name[ko]=KDE 프로그램 검색
+Name[lo]=ຝຣັ່ງເສດ
+Name[lt]=KDE programų paieška
+Name[lv]=KDE programmu meklēšana
+Name[mk]=Пребарување за KDE-апликации
+Name[mn]=Програм хайх
+Name[ms]=Carian Aplikasi KDE
+Name[mt]=Fittex Programmi KDE
+Name[nb]=KDE programsøk
+Name[nds]=KDE Programmsöök
+Name[ne]=KDE App खोजी
+Name[nl]=Programma's zoeken
+Name[nn]=KDE Programsøk
+Name[nso]=Nyako ya App ya KDE
+Name[pa]=KDE ਕਾਰਜ ਖੋਜ
+Name[pl]=Wyszukiwanie programów KDE
+Name[pt]=Pesquisa de Aplicações do KDE
+Name[pt_BR]=Busca por aplicativos do KDE
+Name[ro]=Căutare aplicații KDE
+Name[ru]=Поиск приложений
+Name[rw]=Ishakisha rya KDE App
+Name[se]=KDE prográmmaohci
+Name[sk]=Hľadanie aplikácií KDE
+Name[sl]=Iskanje programov za KDE
+Name[sr]=Претраживање KDE програма
+Name[sr@Latn]=Pretraživanje KDE programa
+Name[ss]=Kusesha kwe App ku KDE
+Name[sv]=KDE-programsökning
+Name[ta]=KDE App தேடுதல்
+Name[te]=కెడిఈ కార్యక్రమాల అన్వెషణ
+Name[tg]=Ҷустуҷӯи барномаи KDE
+Name[th]=ค้นหาแอพพลิเคชั่น KDE
+Name[tr]=KDE Uygulama Arayıcı
+Name[tt]=KDE App Ezläw
+Name[uk]=Пошук програм KDE
+Name[uz]=KDE dasturlarida qidirish
+Name[uz@cyrillic]=KDE дастурларида қидириш
+Name[ven]=U setsha ha apulifikhesheni ya KDE
+Name[vi]=Tìm Ứng dụng KDE
+Name[wa]=Programe di cweraedje di KDE
+Name[xh]=Uphendlo lwe KDE App
+Name[zh_CN]=KDE 应用程序搜索
+Name[zh_TW]=KDE 程式搜尋
+Name[zu]=Usesho lwe-App lwe-KDE
+ServiceTypes=SearchProvider
+Keys=apps,appsy
+Query=http://www.kde-apps.org/content/search.php?search=Search&name=\\{@}
+Query[ne]=http://www.kde-apps.org/content/search.php?search=Searchname=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/austronaut.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/austronaut.desktop
new file mode 100644
index 000000000..9dddb3a59
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/austronaut.desktop
@@ -0,0 +1,18 @@
+[Desktop Entry]
+Type=Service
+Name=AustroNaut
+Name[af]=Ruimtevaarder
+Name[bn]=অস্ট্রো-নট
+Name[eo]=Aŭstronaŭto
+Name[hi]=आस्ट्रोनॉट
+Name[ne]=एस्ट्रोनट
+Name[pa]=ਅਸਟਰੋਨਾਊਟ
+Name[sv]=Astronaut
+Name[ta]=ஆஸ்ட்ரோநட்
+Name[te]=ఆస్ట్రొనాట్
+Name[zu]=Umuntu wasemkhathini
+ServiceTypes=SearchProvider
+Keys=austro,austronaut
+Query=http://austronaut.at/page.php?begriff=\{@}&wo=at
+Query[ko]=http://austronaut.at/page.php?begriff=\\{@}&wo=at
+Query[ne]=http://austronaut.at/page.php?begriff=\{@}wo=at
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/backports.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/backports.desktop
new file mode 100644
index 000000000..ac9c933fb
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/backports.desktop
@@ -0,0 +1,66 @@
+[Desktop Entry]
+Keys=backports
+Name=Debian Backports Search
+Name[af]=Debian Backports Soektog
+Name[az]=Debian Backports Axtarışı
+Name[be]=Пошук Debian Backports
+Name[bn]=ডেবিয়ান ব্যাকপোর্ট অনুসন্ধান
+Name[ca]=Cerca de reratransports Debian
+Name[cs]=Vyhledávání v Debian Backports
+Name[csb]=Szëkba starszëch paczétów Debiana
+Name[da]=Debian Backports søgning
+Name[de]=Suche für Debian Backports
+Name[el]=Αναζήτηση νέων Πακέτων Debian για σταθερή έκδοση
+Name[eo]=Retradukaĵa serĉo de Debiano
+Name[es]=Búsqueda de backports de Debian
+Name[et]=Debiani backport'ide otsing
+Name[eu]=Debian Backports bilaketa
+Name[fa]=جستجوی پس‌درگاههای دبیان
+Name[fi]=Debianin takaisinsovittamishaku
+Name[fr]=Recherche dans le système de rétroportage de Debian
+Name[gl]=Procura de Backports de Debian
+Name[he]=חיפוש של backports עבור דביאן
+Name[hi]=डेबियन बैकपोर्ट्स खोज
+Name[hr]=Debian pretraživanje povratnih portova
+Name[hu]=Debian Backports-keresés
+Name[is]=Debian Backports leit
+Name[it]=Ricerca Debian backports
+Name[ja]=Debian バックポート検索
+Name[kk]=Debian порттарын табу
+Name[km]=ស្វែងរក Debian Backports
+Name[ko]=데비안 백포트 검색
+Name[lt]=Debian Backports paieška
+Name[mk]=Пребарување во Debian Backports
+Name[ms]=Carian Port Belakang Debian
+Name[mt]=Tfittxija tal-Backports tad-Debian
+Name[nb]=Søk etter tilbakeporta Debian-pakker
+Name[nds]=Söök na Debian-Backports
+Name[ne]=डेबियन ब्याकस्पोर्टस खोजी
+Name[nn]=Søk etter tilbakeporta Debian-pakkar
+Name[pa]=ਡੇਬੀਅਨ ਬੈਕਪੋਰਟ ਖੋਜ
+Name[pl]=Wyszukiwanie starszych pakietów Debiana
+Name[pt]=Procura de Transposições para Versões Anteriores da Debian
+Name[pt_BR]=Busca de Backports Debian
+Name[ro]=Căutare în sistemul Debian Backports
+Name[ru]=Поиск портов Debian
+Name[rw]=Ishakisha ImiyoboroInyuma Debiyani
+Name[se]=Oza maŋosportejuvvon Debian-páhkaid
+Name[sk]=Hľadanie v Debian Backports
+Name[sl]=Iskanje po prenosih v Debian
+Name[sr]=Debian-ова Backports претрага
+Name[sr@Latn]=Debian-ova Backports pretraga
+Name[sv]=Sökning i Debians uppdateringar
+Name[ta]=டெபியன் பின்முனையங்கள் தேடல்
+Name[te]=డెబియన్ బేక్ పొర్ట్ల అన్వెషణ
+Name[tg]=Ҷустуҷӯи Debian Backports
+Name[th]=ค้นหา Debian Backports
+Name[tr]=Debian Arkakapı Arama
+Name[tt]=Debian Portların Ezläw
+Name[uk]=Пошук серед додаткових пакетів Debian
+Name[vi]=Tìm kiếm trên Cổng sau Debian
+Name[wa]=Cweraedje Backports Debian
+Name[zh_CN]=Debian 后端搜索
+Name[zh_TW]=Debian Backports 搜尋
+Query=http://www.backports.org/package.php?search=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/bugft.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/bugft.desktop
new file mode 100644
index 000000000..1984716d1
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/bugft.desktop
@@ -0,0 +1,81 @@
+[Desktop Entry]
+Keys=bugft
+Name=KDE Bug Database Fulltext Search
+Name[af]=KDE Fout Databasis voltext Soektog
+Name[ar]=بحث عن نص كلي في قاعدة بيانات عيوب كيدي
+Name[az]=KDE Xəta Databeyzi Tam Sözcük Axtarışı
+Name[be]=Паўнатэкставы пошук па базе памылак KDE
+Name[bn]=কে.ডি.ই. বাগ ডেটাবেস-এ পূর্ণ টেক্সট অনুসন্ধান
+Name[bs]=Tekstualna pretraga KDE baze bugova
+Name[ca]=Cercador de text per la base de dades d'errors de KDE
+Name[cs]=Plnotextové vyhledávání v databázi chyb KDE
+Name[csb]=Baza felów KDE - szëkba w òpisach felów
+Name[cy]=Chwilio Llawn-destun y Gronfa Gwallau KDE
+Name[da]=Fuldtekst-søgning i KDE's fejldatabase
+Name[de]=KDE-Problemdatenbank: Volltextsuche
+Name[el]=Αναζήτηση πλήρους κειμένου στη βάση δεδομένων σφαλμάτων του KDE
+Name[eo]=Plenteksta serĉo en la KDEa Erarodatumbazo
+Name[es]=Búsqueda textual en la base de datos de fallos de KDE
+Name[et]=Täisteksti otsing KDE vigade andmebaasist
+Name[eu]=KDEren akatsen datu-baseko testu erako bilaketa
+Name[fa]=جستجوی متن کامل دادگان اشکال KDE
+Name[fi]=KDE-vikailmoitustietokannan tekstihaku
+Name[fo]=Leita í villudátugrunnur KDE's
+Name[fr]=Recherche de bogue de KDE par texte
+Name[fy]=KDE Bug Databank - folsleine-tekst-sykaksje
+Name[gl]=Procura de Texto Completo na Base de Datos de Erros de KDE
+Name[he]=חיפוש של טקסט מלא ברשימת באגים של KDE
+Name[hi]=केडीई बग डाटाबेस संपूर्ण-पाठ खोज
+Name[hr]=Pretraga KDE baze podataka o nedostacima pomoću potpunog teksta
+Name[hu]=A KDE hibaadatbázis teljes szöveges keresési eszköze
+Name[is]=Leit eftir orðum í KDE villugagnagrunni
+Name[it]=Ricerca testo completo nel Database dei bug di KDE
+Name[ja]=KDE バグデータベース全文検索
+Name[ka]=KDE–ს შეცდომების ძებნა სრული ტექსტით
+Name[kk]=KDE қателер дерек қорында толық мәтінді іздеу
+Name[km]=ស្វែងរក​ជា​អត្ថបទ​ពេញលេញ​ក្នុង​មូលដ្ឋាន​ទិន្នន័យ​កំហុស KDE
+Name[ko]=KDE 버그 데이터베이스 전체 텍스트 검색
+Name[lo]=ຄົ້ນຫາຖານຂໍ້ມູນບັກ KDE ແບບຂໍ້ຄວາມ
+Name[lv]=KDE Kļūdu Datubāzes pilnteksta meklēšana
+Name[mk]=База на податоци со бубачки од KDE, пребарување по цел текст
+Name[mn]=КДЭ-Асуудлын бааз: Бүтэн текст хайх
+Name[ms]=Carian Teks Penuh Pangkalan Data Pepijat
+Name[mt]=Database ta' bugs tal-KDE - tfittxija bil-kliem
+Name[nb]=Fulltekstsøk i feildatabasen til KDE
+Name[nds]=KDE Fehler-Datenbank: Vulltext-Söök
+Name[ne]=KDE बग डेटाबेस फुलटेक्स्ट खोजी
+Name[nl]=KDE Bug Database - volledige-tekst-zoekactie
+Name[nn]=Fulltekstsøk i feildatabasen til KDE
+Name[nso]=Nyako ya Sengwalwana seo se Tletsego sa Database ya Bug ya KDE
+Name[pa]=KDE ਬੱਗ ਡਾਟਾਬੇਸ ਪੂਰਾ-ਪਾਠ ਖੋਜ
+Name[pl]=Baza błędów KDE - wyszukiwanie w opisach błędów
+Name[pt]=Pesquisa por Nome Completo na Base de Dados de Erros do KDE
+Name[pt_BR]=Procura por texto no banco de erros do KDE
+Name[ro]=Baza de date de erori KDE - căutare integrală de text
+Name[ru]=Полнотекстовый поиск ошибок в базе KDE
+Name[rw]=Ishakisha Mwandikowuzuye ry'Ububikoshingiro bw'Ikosaporogaramu KDE
+Name[se]=KDE dihkkediehtovuođu ollesteakstaohcan
+Name[sk]=Hľadanie fulltext v KDE databáze chýb
+Name[sl]=Iskanje besedila po zbirki hroščev v KDE
+Name[sr]=KDE база грешака са подршком за пуну претрагу текста
+Name[sr@Latn]=KDE baza grešaka sa podrškom za punu pretragu teksta
+Name[sv]=Textsökning i KDE:s feldatabas
+Name[ta]=KDE பிழை தகவல்தள முழு உரை தேடுதல்
+Name[te]=కెడిఈ తప్పుల డాటాబేస్ పూర్తి వచన అన్వెషణ
+Name[tg]=Ҷустуҷӯи тамоми матни бонки иттилооти ишколоти KDE
+Name[th]=ค้นหาฐานข้อมูลบัก KDE แบบครบถ้วน
+Name[tr]=KDE Hata Veritabanı Tam Sözcük Arama
+Name[tt]=KDE Bet Biremlegendä Mäten buyınça Ezläw
+Name[uk]=Повнотекстовий пошук у базі даних KDE
+Name[uz]=KDE xato maʼlumot bazasi (butun matnni qidirish)
+Name[uz@cyrillic]=KDE хато маълумот базаси (бутун матнни қидириш)
+Name[ven]=Databeizi ya KDE baga ya manwalwafhelela a u todulusa
+Name[vi]=Tìm kiếm cơ sở dữ liệu lỗi của KDE, dùng toàn bộ dòng từ khoá đã nhập
+Name[wa]=Cweraedje di tecse el båze di dnêyes des bugs di KDE
+Name[xh]=Uphendlo lwesiseko sedata ye KDE Bug Olubhaliweyo ngokupheleleyo
+Name[zh_CN]=KDE 错误数据库全文检索
+Name[zh_TW]=KDE 臭蟲資料庫全文檢索
+Name[zu]=Usesho lwe-KDE lombhalo ogcwele lwesiqu sedata sedata
+Query=http://bugs.kde.org/simple_search.cgi?id=\\{1}+\\{2}+\\{3}+\\{4}+\\{5}+\\{6}+\\{7}+\\{8}+\\{9}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/bugno.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/bugno.desktop
new file mode 100644
index 000000000..4e495a4a5
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/bugno.desktop
@@ -0,0 +1,82 @@
+[Desktop Entry]
+Keys=bug,bugno,bugnr
+Name=KDE Bug Database Bug Number Search
+Name[af]=Kde Fout Databasis Fout Nommer Soektog
+Name[ar]=بحث عن رقم عيب في قاعدة بيانات عيوب كيدي
+Name[az]=KDE Xəta Databeyzi Xəta Numarasıyla Axtarış
+Name[be]=Пошук па нумару памылкі ў базе памылак KDE
+Name[bn]=কে.ডি.ই. বাগ ডেটাবেস-এ বাগ সংখ্যা অনুসন্ধান
+Name[bs]=Numerička pretraga KDE baze bugova
+Name[ca]=Cercador per número per la base de dades d'errors de KDE
+Name[cs]=Vyhledávání v databázi chyb KDE podle čísla chyby
+Name[csb]=Baza felów KDE - szëkba pò numrze felë
+Name[cy]=Chwilio Rhif Gwall y Gronfa Gwallau KDE
+Name[da]=Nummersøgning i KDE's fejldatabase
+Name[de]=KDE-Problemdatenbank: Suche nach Nummer
+Name[el]=Αναζήτηση αριθμού σφάλματος στη βάση δεδομένων σφαλμάτων του KDE
+Name[eo]=Serĉo laŭ numero en la KDEa Erarodatumbazo
+Name[es]=Búsqueda de número de fallo en la base de datos de fallos de KDE
+Name[et]=Veanumbri otsing KDE vigade andmebaasist
+Name[eu]=Akats zenbakiaren bidezko bilaketa KDEren akats datu-basean
+Name[fa]=جستجوی شمارۀ اشکال دادگان اشکال KDE
+Name[fi]=KDE-vikailmoitustietokannan numerohaku
+Name[fo]=Leita í villudátugrunnur KDE's (nýt villunummar)
+Name[fr]=Recherche de bogue de KDE par numéro
+Name[fy]=KDE Bug Databank - sykje op breknûmer
+Name[gl]=Procura Numérica na Base de Datos de Erros de KDE
+Name[he]=חיפוש מספר באג ברשימת הבאגים של KDE
+Name[hi]=केडीई बग डाटाबेस बग संख्या खोज
+Name[hr]=Pretraga KDE baze podataka o nedostacima pomoću broja nedostatka
+Name[hu]=A KDE hibaadatbázis hibaszám-keresési eszköze
+Name[is]=Leit eftir númerum í KDE villugagnagrunni
+Name[it]=Ricerca per numero nel Database dei bug di KDE
+Name[ja]=KDE バグデータベース バグ番号検索
+Name[ka]=KDE–ს შეცდომების ძებნა ნომრების მიხედვით
+Name[kk]=KDE қателер дерек қорында қате нөмірі бойынша іздеу
+Name[km]=ស្វែងរក​លេខ​កំហុស​ក្នុង​មូលដ្ឋាន​ទិន្នន័យ​កំហុស KDE
+Name[ko]=KDE 버그 데이터베이스 버그 번호 검색
+Name[lo]=ຄົ້ນຫາຖານຂໍ້ມູນບັກ KDE ແບບຫມາຍເລກ
+Name[lt]=Paieška KDE ydų duombazėje pagal klaidos numerį
+Name[lv]=KDE Kļūdu Datubāze Meklēšana pēc Kļūdas Numura
+Name[mk]=База на податоци со бубачки од KDE, пребарување по броеви
+Name[mn]=КДЭ-Асуудлын бааз: Дугаараар хайх
+Name[ms]=Carian Bilangan Pepijat Pangkalan Data Pepijat KDE
+Name[mt]=Database ta' BUGS tal-KDE - tfittxija bin-numru tal-bug
+Name[nb]=Feilnummersøk i feildatabasen til KDE
+Name[nds]=KDE Fehler-Datenbank: Fehlernummer-Söök
+Name[ne]=KDE बग डेटाबेस बग सङ्ख्या खोजी
+Name[nl]=KDE Bug Database - zoeken op bugnummer
+Name[nn]=Feilnummersøk i feildatabasen til KDE
+Name[nso]=Nyako ya Nomoro ya Bug ya Database ya Bug ya KDE
+Name[pa]=KDE ਬੱਗ ਡਾਟਾਬੇਸ ਬੱਗ ਨੰਬਰ ਖੋਜ
+Name[pl]=Baza błędów KDE - wyszukiwanie po numerze błędu
+Name[pt]=Pesquisa por Número na Base de Dados de Erros do KDE
+Name[pt_BR]=Procura por número no banco de erros do KDE
+Name[ro]=Baza de date de erori KDE- căutare după număr
+Name[ru]=Поиск по номеру в базе ошибок KDE
+Name[rw]=Ishakisha Umubare w'ikosaporogaramu ry'Ububikoshingiro bw'Ikosaporogaramu KDE
+Name[se]=KDE dihkkediehtovuođu dihkkenummir ohcan
+Name[sk]=Hľadanie podľa čísla chyby v KDE databáze chýb
+Name[sl]=Iskanje v zbirki hroščev KDE po številki hrošča
+Name[sr]=KDE-ова база грешака, претраживање по броју грешке
+Name[sr@Latn]=KDE-ova baza grešaka, pretraživanje po broju greške
+Name[sv]=Felnummersökning i KDE:s feldatabas
+Name[ta]=கேடிஇ பிழையான தகவல்தள பிழையான எண் தேடுதல்
+Name[te]=కెడిఈ తప్పుల డాటాబేస్ తప్పు సంఖ్య అన్వెషణ
+Name[tg]=Бар ҳисби KDE ҷустуҷӯи бонки иттилооти ишколоти шумора
+Name[th]=ค้นหาฐานข้อมูลบัก KDE แบบหมายเลข
+Name[tr]=KDE Hata Veritabanı Hata Numarasıyla Arama
+Name[tt]=KDE Bet Biremlegendä Bicra Sanı buyınça Ezläw
+Name[uk]=Пошук у базі даних помилок KDE по номеру
+Name[uz]=KDE xato maʼlumot bazasi (xatoning raqamini qidirish)
+Name[uz@cyrillic]=KDE хато маълумот базаси (хатонинг рақамини қидириш)
+Name[ven]=Databeizi ya baga ya KDE baga yau todulusa nomboro
+Name[vi]=Tìm kiếm số thứ tự của lỗi trong cơ sở dữ liệu lỗi của KDE
+Name[wa]=Cweraedje di nombe el båze di dnêyes des bugs di KDE
+Name[xh]=KDE Uphendlo Lwenani Legciwane Isiseko se data Segciwane
+Name[zh_CN]=KDE 错误数据库按错误编号搜索
+Name[zh_TW]=KDE 臭蟲資料庫按錯誤編號搜索
+Name[zu]=Usesho lwe-KDE lwenombolo yegciwane lwesiqu sedata segciwane
+Query=http://bugs.kde.org/show_bug.cgi?id=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/call.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/call.desktop
new file mode 100644
index 000000000..527bf39f1
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/call.desktop
@@ -0,0 +1,70 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=qrz,call
+Name=QRZ.com Callsign Database
+Name[af]=QRZ.com Callsign databasis
+Name[az]=QRZ.com Callsign Databeyzi
+Name[be]=База дадзеных QRZ.com Callsign
+Name[bn]=QRZ.com কল-সাইন ডেটাবেস
+Name[bs]=QRZ.com baza pozivnih brojeva
+Name[ca]=Base de dades d'indicatius de QRZ.com
+Name[cs]=Databáze volacích znaků QRZ.com
+Name[csb]=QRZ.com - baza radiowëch wëwòłaniów
+Name[cy]=Cronfa Ddata Arwydd-galwad QRZ.com
+Name[da]=QRZ.com callsign-database
+Name[de]=QRZ.com Callsign-Datenbank
+Name[el]=QRZ.com βάση δεδομένων τηλεπικοινωνίας
+Name[eo]=Voksigno-datumbazo ĉe QRZ.com
+Name[es]=Base de datos callsign QRZ.com
+Name[et]=QRZ.com callsign andmebaas
+Name[eu]=QRZ.com callsign datu-basea
+Name[fa]=دادگان QRZ.com Callsign
+Name[fi]=QRZ.com-kutsumerkkitietokanta
+Name[fr]=Base de données QRZ.com callsign
+Name[fy]=QRZ.com callsign database
+Name[gl]=Base de Datos Callsign QRZ.com
+Name[hi]=QRZ.com काल-साइन डाटाबेस
+Name[hr]=QRZ.com baza podataka pozivnih znakova
+Name[hu]=QRZ.com hívójel-adatbázis
+Name[is]=QRZ.com kallmerkjagrunnur
+Name[it]=Database dei segnali di chiamata QRZ.com
+Name[ja]=QRZ.com Callsign データベース
+Name[kk]=QRZ.com шақыру атаулар дерек қоры
+Name[km]=មូលដ្ឋាន​ទិន្នន័យ QRZ.com Callsign
+Name[ko]=QRZ.com 호출 부호 데이터베이스
+Name[lt]=QRZ.com callsign duomenų bazė
+Name[lv]=QRZ.com izsaukuma signālu datubāze
+Name[mk]=База на податоци QRZ.com callsign
+Name[mt]=Database ta' "callsigns" QRZ.com
+Name[nb]=QRZ.com database for kallesignal
+Name[nds]=QRZ.com Callsign-Datenbank
+Name[ne]=QRZ.com कलसाइन डेटाबेस
+Name[nl]=QRZ.com callsign database
+Name[nn]=QRZ.com database for kallesignal
+Name[pa]=QRZ.com Callsign ਡਾਟਾਬੇਸ
+Name[pl]=QRZ.com - baza wywołań radiowych
+Name[pt]=Base de Dados de Chamada do QRZ.com
+Name[pt_BR]=Banco QRZ.com
+Name[ro]=Baza de date de indicative QRZ.com
+Name[ru]=База позывных QRZ.com
+Name[rw]=Ububikoshingiro Ihamagarayingira QRZ.com
+Name[se]=QRZ.com gohččonsignálaid diehtovuođđu
+Name[sk]=Databáza skratiek QRZ.com
+Name[sl]=Zbirka okrajšav QRZ.com
+Name[sr]=QRZ.com callsign база података
+Name[sr@Latn]=QRZ.com callsign baza podataka
+Name[sv]=Databas för QRZ.com-anropssignaler
+Name[ta]=QRZ.com அழைப்புநுழை தகவல்தளம்
+Name[tg]=Базаи иттилооти QRZ.com callsign
+Name[th]=ฐานข้อมูล QRZ.com Callsign
+Name[tr]=QRZ.com Aramaişaret Veritabanı
+Name[tt]=QRZ.com Imlaw-Biremlege
+Name[uk]=База даних callsign QRZ.com
+Name[vi]=Cơ sở dữ liệu callsign QRZ.com
+Name[wa]=Båze di dnêyes callsign QRZ.com
+Name[zh_CN]=QRZ.com Callsign 数据库
+Name[zh_TW]=QRZ.com Callsign 資料庫
+Query=http://www.qrz.com/database?callsign=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/cia.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/cia.desktop
new file mode 100644
index 000000000..1bd7725f2
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/cia.desktop
@@ -0,0 +1,45 @@
+[Desktop Entry]
+Hidden=false
+Keys=cia
+Name=CIA World Factbook
+Name[af]=CIA Wêreld Feiteboek
+Name[bn]=সি-আই-এ ওয়ার্ল্ড ফ্যাক্টবুক
+Name[cs]=Světová kniha faktů CIA
+Name[csb]=Swiatowé wëdarzenia CIA (CIA World Factbook)
+Name[da]=CIA Bog over verdens fakta
+Name[el]=Παγκόσμιο βιβλίο γεγονότων της CIA
+Name[eo]=CIA Monda faktlibro
+Name[es]=Libro del estado del mundo de la CIA
+Name[eu]=CIA World Fact Book
+Name[fy]=CIA Wrâld Feitboek
+Name[hr]=CIA činjenice iz svijeta
+Name[id]=Buku Fakta Dunia CIA
+Name[it]=World Fact Book della CIA
+Name[ka]=CIA მსოფლიო ფაქტები
+Name[km]=សៀវភៅ​ការ​ពិត​នៃ​ពិភពលោក​របស់ CIA
+Name[ko]=CIA 월드 팩트 북
+Name[lt]=CŽV pasaulio faktų knyga
+Name[ms]=Buku Fakta Dunia CIA
+Name[ne]=CIA वर्ल्ड फ्याक्टबुक
+Name[pa]=CIA ਸੰਸਾਰ ਜਾਣਕਾਰੀ ਕਿਤਾਬ
+Name[pl]=Światowe wydarzenia CIA (CIA World Factbook)
+Name[pt_BR]=CIA World Fact Book
+Name[ro]=CIA World Fact Book
+Name[ru]=Всемирная книга фактов (ЦРУ)
+Name[se]=CIA:a máilbmediehtogirji
+Name[sk]=CIA svetová kniha faktov
+Name[sr]=Књига светских чињеница CIA-е
+Name[sr@Latn]=Knjiga svetskih činjenica CIA-e
+Name[sv]=CIA-världsfaktabok
+Name[tg]=CIA Ҷаҳонӣ китоби аслан
+Name[tr]=CIA Dünya Gerçekleri Kitabı
+Name[uk]=Світова книга фактів ЦРУ
+Name[vi]=Sách sự thật Thế giới CIA
+Query=http://www.google.com/search?q=allintitle%3A\\{@}+world+factbook+site%3Awww.cia.gov&ie=UTF-8&btnI=I%27m+Feeling+Lucky
+Query[fi]=http://www.google.fi/search?q=allintitle%3A\\{@}+world+factbook+site%3Awww.cia.gov&ie=UTF-8&btnI=I%27m+Feeling+Lucky
+Query[he]=http://www.google.co.il/search?q=allintitle%3A\\{@}+world+factbook+site%3Awww.cia.gov&ie=UTF-8&btnI=I%27m+Feeling+Lucky
+Query[ja]=http://www.google.com/search?q=allintitle%3A\\{@}+world+fact+book+site%3Awww.cia.gov&ie=UTF-8&btnI=I%27m+Feeling+Lucky
+Query[nds]=http://www.google.com/search?q=allintitle%3A\\{@}+world+fact+book+site%3Awww.cia.gov&ie=UTF-8&btnI=I%27m+Feeling+Lucky
+Query[th]=http://www.google.com/search?q=allintitle%3A\\{@}+world+fact+book+site%3Awww.cia.gov&ie=UTF-8&btnI=I%27m+Feeling+Lucky
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/citeseer.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/citeseer.desktop
new file mode 100644
index 000000000..c92d86d0b
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/citeseer.desktop
@@ -0,0 +1,72 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=cite,cs
+Name=CiteSeer: Scientific Literature Digital Library
+Name[af]=CiteSeer: Wetenskaplike Digitale Literatuur Biblioteek
+Name[az]=CiteSeer: Elmi Ədəbiyyat Dijital Kitabxanası
+Name[be]=CiteSeer: Лічбавая бібліятэка навуковай літаратуры
+Name[bn]=CiteSeer: বিজ্ঞানসাহিত্যের ডিজিটাল লাইব্রেরী
+Name[bs]=CiteSeer: digitalna biblioteka naučne literature
+Name[ca]=CiteSeer: Biblioteca digital de literatura científica
+Name[cs]=CiteSeer: Vědecká digitální knihovna
+Name[csb]=CiteSeer - Nôùkòwô elektronicznô bibloteka
+Name[cy]=CiteSeer: Llyfgell Digidol Llenyddiaeth Gwyddonol
+Name[da]=CiteSeer: Digitalt bibliotek for digital litteratur
+Name[de]=CiteSeer: Digitale Bibliothek für wissenschaftliche Literatur
+Name[el]=CiteSeer: Ψηφιακή βιβλιοθήκη επιστημονικής βιβλιογραφίας
+Name[eo]=CiteSeer: Sciencoliteratura biblioteko cifereca
+Name[es]=CiteSeer: Biblioteca digital de literatura científica
+Name[et]=CiteSeer: Teaduskirjanduse digitaalraamatukogu
+Name[eu]=CiteSeer: Zientzia-literatur liburutegi digitala
+Name[fa]=CiteSeer: کتابخانۀ رقمی ادبیات علمی
+Name[fi]=CiteSeer: Tieteellisten tekstien digitaalinen kirjasto
+Name[fr]=CiteSeer : Bibliothèque numérique de littérature scientifique
+Name[ga]=CiteSeer: Leabharlann Dhigiteach den Litríocht Eolaíochta
+Name[gl]=CiteSeer: Libraria Dixital de Literatura Científica
+Name[he]=CiteSeer: ספרית ספרות דיגיטלית מדעית
+Name[hi]=CiteSeer: वैज्ञानिक साहित्य डिजिटल पुस्तकालय
+Name[hr]=CiteSeer: Digitalna knjižnica znanstvene literature
+Name[hu]=CiteSeer: tudományos szakirodalom digitális könyvtára
+Name[it]=CiteSeer: Biblioteca digitale di letteratura scientifica
+Name[ja]=CiteSeer: 学術電子論文ブラウザ
+Name[kk]=CiteSeer: ғылыми әдебиет цифрлық кітапханасы
+Name[km]=CiteSeer ៖ បណ្ណាល័យ​ឌីជីថល​អក្សរសាស្ត្រ​វិទ្យាសាស្ត្រ
+Name[ko]=CiteSeer: 과학적 문학 디지털 도서관
+Name[lt]=CiteSeer: Mokslinės literatūros skaitmeninė biblioteka
+Name[lv]=CiteSeer: Zinātniskās literatūras elektroniskā bibliotēka
+Name[mk]=CiteSeer: дигитална библиотека со научна литература
+Name[mn]=CiteSeer: Шинжлэх ухаан уран зохиолын дижитал сан
+Name[ms]=CiteSeer: Pustaka Digital Risalah Sains
+Name[nb]=CiteSeer: Digitalt bibliotek for vitenskaplig litteratur
+Name[nds]=CiteSeer: Digitale Bibliotheek för wetenschaplich Literatuur
+Name[ne]=CiteSeer: वैज्ञानिक साहित्य डिजिटल लाइब्रेरी
+Name[nn]=CiteSeer: Digitalt bibliotek for vitskapleg litteratur
+Name[pa]=CiteSeer: ਵਿਗਿਆਨਕ ਸਾਹਿਤ ਡਿਜ਼ੀਟਲ ਲਾਇਬਰੇਰੀ
+Name[pl]=CiteSeer - elektroniczna biblioteka naukowa
+Name[pt]=CiteSeer: Biblioteca Digital de Literatura Científica
+Name[pt_BR]=CiteSeer: Biblioteca Digital de Literatura Científica
+Name[ro]=CiteSeer: Biblioteca digitală de literatură științifică
+Name[ru]=CiteSeer: цифровая библиотека научной литературы
+Name[rw]=UmuhanuziKuvuga: Isomero Bimenyetsomibare ry'Ubuvanganzo Buhanga
+Name[se]=CiteSeer:Digitálalaš bibliotehka mas lea dieđálaš litteratuvra
+Name[sk]=CiteSeer: Digitálna knižnica vedeckej literatúry
+Name[sl]=CiteSeer: Digitalna knjižnica znanstvene literature
+Name[sr]=CiteSeer: Дигитална библиотека научне литературе
+Name[sr@Latn]=CiteSeer: Digitalna biblioteka naučne literature
+Name[sv]=CiteSeer: Digitalt bibliotek med vetenskaplig litteratur
+Name[ta]=சைட்சீர்: அறிவியல் சம்மந்தமான கல்வி டிஜிட்டல் நூலகம்
+Name[tg]= CiteSeer: Китобхонаи digital-и адабиёти умумӣ
+Name[th]=CiteSeer: ห้องสมุดดิจิตอลของข้อเขียนทางวิทยาศาสตร์
+Name[tr]=CiteSeer: Bilimsel Literatür Kütüphanesi
+Name[tt]=CiteSeer: Fänni Eşlär buyınça Online-Kitapxänä
+Name[uk]=CiteSeer: цифрова бібліотека наукової літератури
+Name[uz]=CiteSeer: Aniq fanlar uchun elektron kutubxona
+Name[uz@cyrillic]=CiteSeer: Аниқ фанлар учун электрон кутубхона
+Name[vi]=CiteSeer:Thư viện khoa học & văn học số hoá
+Name[wa]=CiteSeer: Didjitåle livreye di literateure siyintifike
+Name[zh_TW]=CiteSeer: 科學文獻數位圖書館
+Query=http://citeseer.ist.psu.edu/cs?q=\\{@}&submit=Search+Documents&cs=1
+Query[ne]=http://citeseer.ist.psu.edu/cs?q=\\{@}submit=Search+Documents&cs=1
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/cpan.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/cpan.desktop
new file mode 100644
index 000000000..fe2503e13
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/cpan.desktop
@@ -0,0 +1,53 @@
+[Desktop Entry]
+Keys=cpan
+Name=CPAN - Comprehensive Perl Archive Network
+Name[af]=CPAN - Omvattende Perl Argief Netwerk
+Name[bn]=CPAN - কমপ্রিহেনসিভ পার্ল আর্কাইভ নেটওয়ার্ক
+Name[bs]=CPAN - Mreža sveobuhvatne Perl arhive
+Name[ca]=CPAN - Xarxa comprensible de l'arxiu Perl
+Name[csb]=CPAN - archiwa skriptów Perl
+Name[cy]=CPAN - Rhwydwaith Archif Cynhwysfawr Perl
+Name[da]=CPAN - omfattende Perl-arkivnetværk
+Name[de]=CPAN - Umfassendes Perl-Archiv
+Name[el]=CPAN - Περιεκτικό δίκτυο αρχειοθήκης perl
+Name[eo]=CPAN - Ampleksa Perl-arĥiv-reto
+Name[es]=CPAN - Red de archivos Perl comprensibles
+Name[eu]=CPAN - Perl fitxategi sare ulergarria
+Name[fa]=CPAN - شبکۀ‌ وسیع بایگانی پرل
+Name[fr]=CPAN (Comprehensive Perl Archive Network)
+Name[gl]=CPAN - Colección de Materiais Acerca de Perl
+Name[hi]=CPAN - कॉम्प्रेहेंसिव पर्ल आर्काइव नेटवर्क
+Name[hr]=CPAN - Perl mreža sveobuhvatne arhive
+Name[kk]=CPAN - Perl скрипттер архив желісі
+Name[lo]=CPAN-Comprehensive perlArchive Network
+Name[lt]=CPAN – Visapusiško Perlo Archyvo Tinklas
+Name[lv]=CPAN - Visaptverošs Perl arhīvu tīkls
+Name[mk]=CPAN - Обемна мрежа со Perl архиви
+Name[mn]=CPAN - Өргөн хүрээтэй Perl-Архив
+Name[mt]=CPAN - Databażi komprensiv ta' arkivji Perl
+Name[nb]=CPAN -– Perl-arkiv: «Comprehensive Perl Archive Network»
+Name[ne]=CPAN - व्यापक पर्ल सङ्ग्रह सञ्जाल
+Name[nn]=CPAN – Perl-arkiv: «Comprehensive Perl Archive Network»
+Name[nso]=Kgokagano ya Polokelo ya Perl ya Kelelo ya Godimo
+Name[pa]=CPAN - ਪੈਰਾ ਪਰਲ ਆਰਚੀਵ ਨੈੱਟਵਰਕ
+Name[pl]=CPAN - archiwum skryptów Perl
+Name[pt_BR]=CPAN
+Name[ro]=CPAN - Arhiva completă de programe Perl
+Name[ru]=CPAN - архив скриптов Perl
+Name[rw]=CPAN - Urusobemiyoboro rw'Ubushyinguro Perl Rwuzuye
+Name[se]=CPAN – Perl-vuorká: «Comprehensive Perl Archive Network»
+Name[sl]=CPAN - Omrežje obsežnega arhiva za Perl
+Name[ta]=CPAN -பரந்த பர்ல் ஆவண வலைப்பின்னல்
+Name[tg]=CPAN -Шабакаи ҳаматарафаи архиви Perl
+Name[tr]=CPAN - Detaylı Perl Arşiv Ağı
+Name[tt]=CPAN - Perl Tuplamalar Çeltäre
+Name[uk]=CPAN - Всеосяжна мережа архівів Perl
+Name[uz]=CPAN - Perl boʻyicha mukammal arxiv tarmogʻi
+Name[uz@cyrillic]=CPAN - Perl бўйича мукаммал архив тармоғи
+Name[ven]=CPAN - Vhudavhidzani ha Mbeazwakale ya Perl vhu Pfalaho
+Name[vi]=CPAN - Mạng lưới lưu trữ Perl đầy đủ
+Name[xh]=CPAN - Enomxholo Perl Indawo yokugcina Yomsebenzi womnatha
+Name[zh_TW]=CPAN - 全面的 Perl 收集網路
+Query=http://search.cpan.org/search?mode=\\{mode,2,"dist"}&query=\\{query,q,1}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/ctan.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/ctan.desktop
new file mode 100644
index 000000000..824a7f8b0
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/ctan.desktop
@@ -0,0 +1,54 @@
+[Desktop Entry]
+Keys=ctan
+Name=CTAN - Comprehensive TeX Archive Network
+Name[af]=CTAN - Omvattende Tex Argief Netwerk
+Name[bn]=CTAN - কমপ্রিহেনসিভ টেক আর্কাইভ নেটওয়ার্ক
+Name[bs]=CTAN - Mreža sveobuhvatne TeX arhive
+Name[ca]=CTAN - Xarxa extensa d'arxius TeX
+Name[csb]=CTAN - archiwa TeX-a
+Name[cy]=CTAN - Rhwydwaith Archif Cynhwysfawr TeX
+Name[da]=CTAN - omfattende TeX-arkivnetværk
+Name[de]=CTAN - Umfassendes TeX-Archiv
+Name[el]=CTAN - Περιεκτικό δίκτυο αρχειοθήκης TeX
+Name[eo]=CTAN - Ampleksa TeX-arĥiv-reto
+Name[es]=CTAN - Red de archivos TeX comprensivos
+Name[eu]=CTAN - TeX fitxategi sare ulergarria
+Name[fa]=CTAN - شبکۀ وسیع بایگانی TeX
+Name[fr]=CTAN (Comprehensive TeX Archive Network)
+Name[hi]=CTAN - कॉम्प्रेहेंसिव टीईएक्स आर्काइव नेटवर्क
+Name[hr]=CTAN - TeX mreža sveobuhvatne arhive
+Name[kk]=CTAN - TeX архив желісі
+Name[lt]=CTAN – Visapusiško TeX Archyvo Tinklas
+Name[lv]=CTAN - Visaptverošs TeX Arhīvu Tīkls
+Name[mk]=CTAN - Обемна мрежа со TeX архиви
+Name[mn]=CTAN - Өргөн хүрээтэй TeX-Архив
+Name[ms]=CTAN - Rangkaian Arkib TeX Komprehensif
+Name[mt]=CTAN - Databażi komprensiv ta' arkivji TeX
+Name[nb]=CTAN -– TeX-arkiv: «Comprehensive TeX Archive Network»
+Name[ne]=CTAN - व्यापक TeX सङ्ग्रह सञ्जाल
+Name[nn]=CTAN – TeX-arkiv: «Comprehensive TeX Archive Network»
+Name[nso]=Kgokagano ya Polokelo ya TeX ya Kelelo ya Godimo
+Name[pa]=CTAN - ਪੈਰਾ TeX ਆਰਚੀਵ ਨੈੱਟਵਰਕ
+Name[pl]=CTAN - archiwum TeX-a
+Name[pt_BR]=CTAN
+Name[ro]=CTAN - Arhiva completă de programe TeX
+Name[ru]=CTAN - архив TeX
+Name[rw]=CTAN - Urusobemiyoboro rw'Ubushyinguro TeX Rwuzuye
+Name[se]=CTAN – TeX-vuorká: «Comprehensive TeX Archive Network»
+Name[sl]=CPAN - Omrežje obsežnega arhiva za TeX
+Name[ta]=CTAN - முழுமையான TeX ஆவண வலைப்பின்னல்
+Name[tg]=CTAN -Шабакаи ҳаматарафаи архиви TeX
+Name[tr]=CTAN - Detaylı TeX Arşiv Ağı
+Name[tt]=CTAN - TeX Tuplamalar Çeltäre
+Name[uk]=CTAN - Всеосяжна мережа архівів TeX
+Name[uz]=CTAN - TeX boʻyicha mukammal arxiv tarmogʻi
+Name[uz@cyrillic]=CTAN - TeX бўйича мукаммал архив тармоғи
+Name[ven]=CTAN - Vhudavhidzani ha Mbeazwakale ya TeX Vhupfalaho
+Name[vi]=CTAN - Mạng lưới lưu trữ TeX đầy đủ
+Name[xh]=CTAN - Enomxholo TeX Indawo yokugcina Yomsebenzi womnatha
+Name[zh_TW]=CTAN - 全面的 Tex 收集網路
+Query=http://tug.ctan.org/cgi-bin/filenameSearch.py?action=/search/&filename=\\{ at }
+Query[ja]=http://tug.ctan.org/tools/filenamesearch.py?action=/search/&filename=\\\\{ at }
+Query[tg]=http://tug.ctan.org/cgi-bin/filenameSearch.py?action=/search/&filename=\\{ аз }
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/ctan_cat.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/ctan_cat.desktop
new file mode 100644
index 000000000..faa4f7fce
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/ctan_cat.desktop
@@ -0,0 +1,77 @@
+[Desktop Entry]
+Keys=ctan_cat
+Name=CTAN Catalog
+Name[af]=CTAN Katalogus
+Name[az]=CTAN Kataloqu
+Name[be]=Каталог CTAN
+Name[bn]=CTAN ক্যাটালগ
+Name[br]=Katalog CTAN
+Name[bs]=CTAN katalog
+Name[ca]=Catàleg CTAN
+Name[cs]=CTAN katalog
+Name[csb]=CTAN - katalog TeX-owëch paczétów
+Name[cy]=Catalog CTAN
+Name[da]=CTAN-katalog
+Name[de]=CTAN-Katalog
+Name[el]=Κατάλογος CTAN
+Name[en_GB]=CTAN Catalogue
+Name[eo]=CTAN-Katalogo
+Name[es]=Catálogo CTAN
+Name[et]=CTAN kataloog
+Name[eu]=CTAN Katalogoa
+Name[fa]=فهرست CTAN
+Name[fi]=CTAN-katalogi
+Name[fr]=Catalogue du CTAN
+Name[fy]=CTAN Catalogus
+Name[ga]=Catalóg CTAN
+Name[gl]=Catálogo CTAN
+Name[he]=קטלוג CTAN
+Name[hi]=CTAN कैटलॉग
+Name[hr]=CTAN katalog
+Name[id]=Katalog CTAN
+Name[is]=CTAN Catalogue
+Name[it]=Catalogo CTAN
+Name[ja]=CTAN カタログ
+Name[ka]=CTAN კატალოგი
+Name[kk]=CTAN каталогы
+Name[km]=កាតាឡុក CTAN
+Name[ko]=CTAN 카달로그
+Name[lt]=CTAN katalogas
+Name[lv]=CTAN Katalogs
+Name[mk]=Каталог од CTAN
+Name[mn]=CTAN Катлог
+Name[ms]=Katalog CTAN
+Name[mt]=Katalgu CTAN
+Name[nb]=CTAN-katalog
+Name[nds]=CTAN Kataloog
+Name[ne]=CTAN विवरणिका
+Name[nl]=CTAN Catalogus
+Name[nn]=CTAN-katalog
+Name[pa]=CTAN ਸੂਚੀ
+Name[pl]=CTAN - katalog pakietów TeX-owych
+Name[pt]=Catálogo do CTAN
+Name[pt_BR]=Catálogo CTAN
+Name[ro]=Catalog CTAN
+Name[ru]=Каталог CTAN
+Name[rw]=Ububikobisobanuro CTAN
+Name[se]=CTAN-kataloga
+Name[sk]=Katalóg CTAN
+Name[sl]=Katalog CTAN
+Name[sr]=CTAN Каталог
+Name[sr@Latn]=CTAN Katalog
+Name[sv]=CTAN-katalog
+Name[ta]=CTAN வகை
+Name[tg]=Каталоги CTAN
+Name[th]=แคตตาล็อก CTAN
+Name[tr]=CTAN Kataloğu
+Name[tt]=CTAN Törgäge
+Name[uk]=Каталог CTAN
+Name[uz]=CTAN katalogi
+Name[uz@cyrillic]=CTAN каталоги
+Name[vi]=Thư mục CTAN
+Name[wa]=Catalogue do CTAN
+Name[zh_CN]=CTAN 目录
+Name[zh_TW]=CTAN 目錄
+Query=http://www.ctan.org/tools/cataloguesearch?action=/search/&catstring=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/dbug.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/dbug.desktop
new file mode 100644
index 000000000..d580154e2
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/dbug.desktop
@@ -0,0 +1,67 @@
+[Desktop Entry]
+Keys=dbug
+Name=Debian BTS Bug Search
+Name[af]=Debian BTS Fout Soektog
+Name[az]=Debian BTS Xəta Axtarışı
+Name[be]=Пошук памылак Debian BTS
+Name[bn]=ডেবিয়ান বি-টি-এস বাগ অনুসন্ধান
+Name[bs]=Debian BTS pretraga bugova
+Name[ca]=Cerca d'errors Debian BTS
+Name[cs]=Hledání chyb Debianu
+Name[csb]=Szëkba felów Debiana
+Name[cy]=Chwiliad Nam BTS Debian
+Name[da]=Debian BTS fejlsøgning
+Name[de]=Debian BTS-Programmfehlersuche
+Name[el]=Σύστημα εντοπισμού σφαλμάτων του Debian
+Name[eo]=Eraroserĉo de Debiano
+Name[es]=Búsqueda de fallos BTS de Debian
+Name[et]=Debiani BTS veaotsing
+Name[eu]=Debianen BTS akats bilaketa
+Name[fa]=جستجوی اشکال BTS دبیان
+Name[fi]=Debianin vikajärjestelmän haku
+Name[fr]=Recherche dans le système de gestion des bogues Debian
+Name[gl]=Procura de Erros en Debian BTS
+Name[he]=חיפוש BTS במערכת דביאן
+Name[hi]=डेबियन बीटीएस बग खोज
+Name[hr]=Debian BTS pretraživanje nedostataka
+Name[hu]=Debian BTS hibakereső
+Name[is]=Debian BTS villuleit
+Name[it]=Ricerca bug Debian BTS
+Name[ja]=Debian BTS バグ検索
+Name[kk]=Debian қателер тіркеу жүйесінде іздеу
+Name[km]=ស្វែងរក​កំហុស Debian BTS
+Name[ko]=데비안 BTS 버그 검색
+Name[lt]=Debian BTS yda paieška
+Name[lv]=Debian BTS kļūdu meklēšana
+Name[mk]=Debian BTS пребарување на бубачки
+Name[ms]=Carian Pepijat BTS Debian
+Name[nb]=Søk etter lus i Debian BTS
+Name[nds]=Debian-BTS-Fehlersöök
+Name[ne]=डेबियन BTS बग खोज्नुहोस्
+Name[nn]=Søk etter lus i Debian BTS
+Name[pa]=ਡੇਬੀਅਨ BTS ਬੱਗ ਖੋਜ
+Name[pl]=Wyszukiwanie błędów Debiana
+Name[pt]=Procura de Erros no Debian BTS
+Name[pt_BR]=Busca de bugs Debian
+Name[ro]=Căutare în sistemul Debian de raportare a erorilor
+Name[ru]=Поиск в системе учёта ошибок Debian
+Name[rw]=Ishakisha ry'Ikosaporogaramu BTS Debiyani
+Name[se]=Oza dihkiid Debian BTS:as
+Name[sk]=Hľadanie chýb na Debian BTS
+Name[sl]=Iskanje po hroščih Debian BTS
+Name[sr]=Debian-ова BTS претрага грешака
+Name[sr@Latn]=Debian-ova BTS pretraga grešaka
+Name[sv]=Sökning i Debians felspårningssystem
+Name[ta]=டெபியன் BTS பிழை தேடல்
+Name[te]=డెబియన్ బిటిఎస్ తప్పుల అన్వెషణ
+Name[th]=ค้นหาบักของ Debian BTS
+Name[tr]=Debian BTS Hata Arama
+Name[tt]=Debian'nıñ BTS (Bet Tabu Sisteme)
+Name[uk]=Пошук у системі стеження за помилками для Debian
+Name[vi]=Tìm kiếm lỗi Debian BTS
+Name[wa]=Cweraedje di Bug BTS Debian
+Name[zh_CN]=Debian BTS Bug 搜索
+Name[zh_TW]=Debian BTS 臭蟲搜尋
+Query=http://bugs.debian.org/\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/de2en.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/de2en.desktop
new file mode 100644
index 000000000..c8717a2d4
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/de2en.desktop
@@ -0,0 +1,69 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=de2en
+Name=dict.cc Translation: German to English
+Name[ar]=dict.cc ترجمة من : الألمانية إلى الإنكليزية
+Name[be]=dict.cc Пераклад: з нямецкай на англійскую
+Name[bs]=dict.cc prijevod: njemački u engleski
+Name[ca]=Traducció dict.cc: Alemany - Anglès
+Name[cs]=Překlad dic.cc: z němčiny do angličtiny
+Name[csb]=dict.cc: miemiecczi -> anielsczi
+Name[da]=dict.cc oversættelse: Tysk til engelsk
+Name[de]=dict.cc-Übersetzung: Deutsch/Englisch
+Name[el]=Μετάφραση dict.cc: Γερμανικά σε Αγγλικά
+Name[eo]=dict.cc Traduko: Germana al Angla
+Name[es]=dict.cc Traducción: alemán a inglés
+Name[et]=dict.cc tõlkimine: saksa->inglise
+Name[eu]=dict.cc itzulpena: Alemanatik ingelera
+Name[fa]=ترجمۀ dict.cc: آلمانی به انگلیسی
+Name[fi]=dict.cc Käännös: saksasta englanniksi
+Name[fr]=Traduction dict.cc : Allemand en Anglais
+Name[fy]=dict.cc-oersetting Dûts nei Ingelsk
+Name[ga]=dist.cc Aistriúchán: Gearmáinis go Béarla
+Name[gl]=Tradución dict.cc: Alemán a Inglés
+Name[he]=תרגום dict.cc: גרמני־אנגלי
+Name[hi]=dict.cc अनुवादः जर्मन से अंग्रेजी
+Name[hr]=dict.cc Prijevod: njemački na engleski
+Name[hu]=Dict.cc - Fordítás németről angolra
+Name[is]=dict.cc Þýðing: Þýska til ensku
+Name[it]=Traduzioni dict.cc: dal tedesco all'inglese
+Name[ja]=dict.cc ドイツ語-英語翻訳
+Name[kk]=dict.cc аудармашы: неміс тілінен ағылшынға
+Name[km]=dict.cc ៖ បកប្រែ​ពី​ភាសា​អាល្លឺម៉ង់​ទៅ​អង់គ្លេស
+Name[ko]=dict.cc 번역: 독일어에서 영어로
+Name[lt]=dict.cc vertimas: iš vokiečių į anglų
+Name[lv]=dict.cc Tulkošana: no Vācu uz Angļu
+Name[mk]=dict.cc превод: од германски на англиски
+Name[nb]=dict.cc Oversettelse fra tysk til engelsk
+Name[nds]=dict.cc Översetten: Hoochdüütsch na Engelsch
+Name[ne]=dict.cc अनुवाद: जर्मनीलाई अङ्ग्रेजीमा
+Name[nl]=dict.cc-vertaling: Duits naar Engels
+Name[nn]=dict.cc Omsetjing: Tysk til engelsk
+Name[pa]=dict.cc ਅਨੁਵਾਦ: ਜਰਮਨ ਤੋਂ ਅੰਗਰੇਜ਼ੀ
+Name[pl]=dict.cc: niemiecki -> angielski
+Name[pt]=Tradução do dict.cc: Alemão para Inglês
+Name[pt_BR]=dict.cc - Tradução: Alemão para Inglês
+Name[ro]=Traducere dict.cc: germană la engleză
+Name[ru]=Переводчик dictcc.com: немецко-английский
+Name[rw]=dict.cc Ivunura: Ikidage mu Cyongereza
+Name[se]=dict.cc Jorgaleapmi: Duiskkagielas eŋgelašgillii
+Name[sk]=dict.cc Preklad z nemčiny do angličtiny
+Name[sl]=Prevod dict.cc: nemščina v angleščino
+Name[sr]=Превод на dict.cc: са немачког на енглески
+Name[sr@Latn]=Prevod na dict.cc: sa nemačkog na engleski
+Name[sv]=dict.cc översättning: tyska till engelska
+Name[ta]=dict.cc Translation மொழிப்பெயர்ப்பு: ஜெர்மன் மொழியில் இருந்து ஆங்கிலத்துக்கு
+Name[te]=dict.cc అనువాదం: జెర్మన్ నుంచి ఆంగ్లం కు
+Name[th]=dict.cc แปลภาษาเยอรมันเป็นอังกฤษ
+Name[tr]=dict.cc Çevirisi: Almancadan İngilizceye
+Name[tt]=dict.cc Tärcemä: Almança -› İnglizçä
+Name[uk]=dict.cc: переклад з німецької на англійську
+Name[uz]=dict.cc tarjima: Nemischadan Inglizchaga
+Name[uz@cyrillic]=dict.cc таржима: Немисчадан Инглизчага
+Name[vi]=dict.cc Dịch: Tiếng Đức sang tiếng Anh
+Name[wa]=Ratournadje dict.cc: Almand viè inglès
+Name[zh_TW]=dict.cc 翻譯: 德文至英文
+Query=http://www.dict.cc/?s=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/de2fr.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/de2fr.desktop
new file mode 100644
index 000000000..646f3313e
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/de2fr.desktop
@@ -0,0 +1,72 @@
+[Desktop Entry]
+Type=Service
+Name=LEO - Translate Between German and French
+Name[af]=LEO - Vertaal tussn Duits en Fraans
+Name[ar]=LEO - ترجمة ألمانية فرنسية
+Name[be]=LEO - Пераклад з нямецкай на французскую і наадварот
+Name[bn]=লিও - জার্মান থেকে ফরাসী বা ফরাসী থেকে জার্মান-এ অনুবাদ করুন
+Name[bs]=LEO prijevod: njemački u francuski
+Name[ca]=LEO - Tradueix entre alemany i francès
+Name[cs]=LEO - překlad mezi němčinou a francouzštinou
+Name[csb]=LEO - dolmaczenié miemiecczi -> francësczi
+Name[da]=LEO - Oversæt mellem tysk og fransk
+Name[de]=LEO - Übersetzung Deutsch/Französisch
+Name[el]=LEO - Μετάφραση μεταξύ Γερμανικών και Γαλλικών
+Name[eo]=LEO - Traduko inter la germana kaj la franca
+Name[es]=LEO - Traducción entre alemán y francés
+Name[et]=LEO - tõlkimine: saksa-prantsuse
+Name[eu]=LEO - Itzuli alemana eta ingelesaren artean
+Name[fa]=LEO - ترجمه بین آلمانی و فرانسوی
+Name[fi]=LEO - Käännä saksan ja ranskan välillä
+Name[fr]=LEO - Traduction Allemand - Français
+Name[fy]=LEO -oersetting tusken Dûtsk en Frânsk
+Name[ga]=LEO - Aistrigh idir Gearmáinis agus Fraincis
+Name[gl]=LEO - Tradución entre Alemán e Francés
+Name[he]=LEO - תרגום בין גרמנית לצרפתית
+Name[hi]=लिओ - जर्मनी तथा फ्रेंच के बीच अनुवाद
+Name[hr]=LEO - Prevođenje između njemačkog i francuskog
+Name[hu]=LEO - Fordítás németről franciára (mindkét irányban)
+Name[is]=LEO - Þýða á milli þýsku og frönsku
+Name[it]=LEO - Traduzioni dal tedesco al francese
+Name[ja]=LEO - ドイツ語-フランス語間の翻訳
+Name[ka]=LEO - გერმანულ-ფრანგული მთარგმნელი
+Name[kk]=LEO - неміс және француз тілдер арасында аудару
+Name[km]=LEO - បកប្រែ​រវាង​ភាសា​អាល្លឺម៉ង់ និង​អង់គ្លេស
+Name[ko]=LEO - 독일어에서 프랑스어로 번역
+Name[lt]=LEO - vertimas iš vokiečių į prancūzų ir atvirkščiai
+Name[lv]=LEO - Tulkot no Vācu uz Franču
+Name[mk]=LEO - превод меѓу германски и француски
+Name[nb]=LEO – Oversettelse fra tysk til fransk
+Name[nds]=LEO - Översetten twischen Hoochdüütsch un Franzöösch
+Name[ne]=LEO - जर्मनी र फ्रान्सेलीमा अनुवाद गर्नुहोस्
+Name[nl]=LEO - vertaling tussen Duits en Frans
+Name[nn]=LEO – Omsetjing frå tysk til fransk
+Name[pa]=LEO -ਜਰਮਨ ਅਤੇ ਫਰੈਂਚ ਵਿੱਚ ਅਨੁਵਾਦ
+Name[pl]=LEO - tłumaczenie niemiecki -> francuski
+Name[pt]=LEO - Traduzir Entre Alemão e Francês
+Name[pt_BR]=LEO - Tradução entre Alemão e Francês
+Name[ro]=LEO - Traduce între germană și franceză
+Name[ru]=LEO - немецко-французский перевод
+Name[rw]=LEO - Kuvunura Hagati y'Ikidage n'Igifaransa
+Name[se]=LEO – Jorgal duiskka- ja fránskkagiela gaskkas
+Name[sk]=LEO - Preklad z nemčiny do francúzštiny
+Name[sl]=LEO - Prevod med nemščino in francoščino
+Name[sr]=LEO — превод између немачког и француског
+Name[sr@Latn]=LEO — prevod između nemačkog i francuskog
+Name[sv]=LEO - översätt från tyska till franska
+Name[ta]=LEO - ஜெர்மன் மற்றும் ப்ரென்ச் இடையே மொழிப்பெயர்க்கவும்
+Name[te]=లియొ - జెర్మన్ మరయూ ఫ్రెంచ్ మద్య అనువాదం
+Name[tg]=LEO - Тарҷума мобайни Олмонӣ ва Фаронсавӣ
+Name[th]=LEO - แปลภาษาเยอรมัน<->ฝรั่งเศส
+Name[tr]=LEO - Almancadan Fransızcaya Çeviri
+Name[tt]=LEO - Tärcemä: Almança -› Fransça
+Name[uk]=LEO - переклад між німецькою та французькою
+Name[uz]=LEO - Nemischadan Fransuzchaga tarjima
+Name[uz@cyrillic]=LEO - Немисчадан Французчага таржима
+Name[vi]=LEO - Dịch tiếng Đức sang tiếng Pháp
+Name[wa]=LEO - Ratourner etur l' almand et l' francès
+Name[zh_TW]=LEO - 翻譯德語和法語
+ServiceTypes=SearchProvider
+Keys=de2fr
+Query=http://dict.leo.org/?lp=frde&search=\\{@}
+Query[ne]=http://dict.leo.org/?lp=frdesearch=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/deb.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/deb.desktop
new file mode 100644
index 000000000..7422c8776
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/deb.desktop
@@ -0,0 +1,72 @@
+[Desktop Entry]
+Keys=deb
+Name=Debian Package Search
+Name[af]=Debian Paket Soektog
+Name[az]=Debian Paket Axtarışı
+Name[be]=Пошук пакетаў Debian
+Name[bn]=ডেবিয়ান প্যাকেজ অনুসন্ধান
+Name[br]=Klask ur pakad Debian
+Name[bs]=Pretraga Debian paketa
+Name[ca]=Cerca de paquets Debian
+Name[cs]=Hledání Debian balíčků
+Name[csb]=Szëkba paczetów Debiana
+Name[da]=Debian pakkesøgning
+Name[de]=Debian-Paketsuche
+Name[el]=Αναζήτηση πακέτων Debian
+Name[eo]=Pakaĵa serĉo de Debiano
+Name[es]=Búsqueda de paquetes de Debian
+Name[et]=Debiani paketiotsing
+Name[eu]=Debianen pakete bilaketa
+Name[fa]=جستجوی بستۀ دبیان
+Name[fi]=Debianin pakettihaku
+Name[fr]=Recherche dans le système de paquetages Debian
+Name[gl]=Procura de Pacotes Debian
+Name[he]=חיפוש חבילות דביאן
+Name[hi]=डेबियन पैकेज खोज
+Name[hr]=Debian pretraživanje paketa
+Name[hu]=Debian csomagkereső
+Name[id]=Cari Paket Debian
+Name[is]=Debian pakkaleit
+Name[it]=Ricerca pacchetti debian
+Name[ja]=Debian パッケージ検索
+Name[ka]=Debian-ის პაკეტის ძიება
+Name[kk]=Debian дестелерін табу
+Name[km]=ស្វែងរក​កញ្ចប់ Debian
+Name[ko]=데비안 꾸러미 검색
+Name[lt]=Debian paketų paieška
+Name[lv]=Debian Pakotņu meklēšana
+Name[mk]=Пребарување на Debian-пакети
+Name[ms]=Carian Pakej Debian
+Name[mt]=Tfittxija tal-pakkett Debian
+Name[nb]=Søk etter Debian-pakker
+Name[nds]=Debian-Paketsöök
+Name[ne]=डेबियन प्याकेज खोज्नुहोस्
+Name[nn]=Søk etter Debian-pakkar
+Name[pa]=ਡੇਬੀਅਨ ਪੈਕੇਜ ਖੋਜ
+Name[pl]=Wyszukiwanie pakietów Debiana
+Name[pt]=Procura de Pacotes da Debian
+Name[pt_BR]=Busca de Pacotes Debian
+Name[ro]=Căutare în sistemul Debian de pachete
+Name[ru]=Поиск пакетов Debian
+Name[rw]=Ishakisha rya Rukomatanya Debiyani
+Name[se]=Oza Debian-páhkaid
+Name[sk]=Hľadanie balíkov Debian
+Name[sl]=Iskanje po paketih Debian
+Name[sr]=Претрага Debian-ових пакета
+Name[sr@Latn]=Pretraga Debian-ovih paketa
+Name[sv]=Sökning i Debians paket
+Name[ta]=டெபியன் BTS பிழை தேடல்
+Name[tg]=Ҷустуҷӯи Debian Package
+Name[th]=ค้นหาแพคเกจของ Debian
+Name[tr]=Debian Paket Arama
+Name[tt]=Debian Tuplamaların Ezläw
+Name[uk]=Пошук пакунків для Debian
+Name[uz]=Debian paketlarini qidirish
+Name[uz@cyrillic]=Debian пакетларини қидириш
+Name[vi]=Tìm kiếm gói Debian
+Name[wa]=Cweraedje di pakets Debian
+Name[zh_CN]=Debian 软件包搜索
+Name[zh_TW]=Debian 套件搜尋
+Query=http://packages.debian.org/\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/dmoz.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/dmoz.desktop
new file mode 100644
index 000000000..5715e5161
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/dmoz.desktop
@@ -0,0 +1,51 @@
+[Desktop Entry]
+Type=Service
+Name=Open Directory
+Name[az]=Açıq Qovluq
+Name[bn]=ওপেন ডিরেক্টরি
+Name[br]=Digeriñ ur renkell
+Name[bs]=Otvoreni direktorij (DMOZ)
+Name[csb]=Open Directory - Ôpen katalog starnów WWW
+Name[cy]=Cyfeiriadur Agored
+Name[da]=Åben mappe
+Name[eo]=Malfermu dosierujon
+Name[es]=Directorio abierto
+Name[eu]=Irekitako direktorioa
+Name[fa]=باز کردن فهرست راهنما
+Name[fi]=Avoin kansio
+Name[fo]=Opin Alnótsskránni
+Name[fy]=Iepen Directory
+Name[gl]=Directorio Aberto
+Name[he]=תיקייה פתוחה
+Name[hi]=ओपन डिरेक्ट्री
+Name[id]=Buka Direktori
+Name[ka]=ღია კატალოგები
+Name[kk]=Ашық каталог
+Name[km]=ថត​បើក​ចំហ
+Name[mk]=Отворен директориум
+Name[mn]=Лавлах нээх
+Name[ne]=डाइरेक्टरी खोल्नुहोस्
+Name[pa]=ਖੁੱਲੀ ਡਾਇਰੈਕਟਰੀ
+Name[pl]=Open Directory - katalog stron WWW
+Name[ro]=Director web open-source
+Name[ru]=Открытый каталог
+Name[rw]= Gufungura Inkoranyamagambo
+Name[sl]=Odpri imenik
+Name[sr]=Отворени адресар
+Name[sr@Latn]=Otvoreni adresar
+Name[sv]=Öppen katalog
+Name[ta]=அடைவை திற
+Name[te]=ఒపెన్ డైరెక్టరి
+Name[tg]=Кушодани феҳраст
+Name[tt]=Açıq Törgäk
+Name[uk]=Відкритий каталог
+Name[ven]=Tsumbavhulwo yo Vuleaho
+Name[vi]=Thư mục mở
+Name[wa]=Drovi ridant
+Name[xh]=Vula Ulawulo
+Name[zh_TW]=開啟目錄
+Name[zu]=Vula Uhlu lwamafayela
+ServiceTypes=SearchProvider
+Keys=dmoz,odp
+Query=http://search.dmoz.org/cgi-bin/search?search=\\{@}
+Query[ne]=http://search.dmoz.org/cgi-bin/search?खोज्नुहोस्=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/docbook.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/docbook.desktop
new file mode 100644
index 000000000..fd422d7ba
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/docbook.desktop
@@ -0,0 +1,72 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=db,docbook
+Name=DocBook - The Definitive Guide
+Name[af]=Docbook - Die Definitiewe Gids
+Name[ar]=DocBook - المرشد النهائي
+Name[az]=DocBook - Bələdçi
+Name[be]=DocBook - Падручнік
+Name[bn]=ডকবুক - দি ডেফিনিটিভ গাইড
+Name[bs]=DocBook - Konačni priručnik
+Name[ca]=DocBook - La guia definitiva
+Name[csb]=DocBook (systema dokùmentacëji) - pòdrãcznik
+Name[cy]=DocBook - Y Canllaw Awdurdodol
+Name[da]=DocBook - den definitive guide
+Name[de]=DocBook - Definitive Einführung
+Name[el]=DocBook - Ο απόλυτος οδηγός
+Name[eo]=DocBook - La definitiva manlibro
+Name[es]=DocBook - La guía definitiva
+Name[eu]=DocBook - Behin-betiko gida
+Name[fa]=DocBook - راهنمای صریح
+Name[gl]=DocBook - A Guia Definitiva
+Name[he]=DocBook - המדריך האולטימטיבי
+Name[hi]=डॉकबुक - निर्णायक मार्गदर्शक
+Name[hr]=DocBook - Definitivni vodič
+Name[is]=DocBook - Opinbera handbókin
+Name[it]=DocBook - La guida definitiva
+Name[ja]=DocBook - 完全ガイド
+Name[ka]=DocBook - განსაზღვრებები
+Name[kk]=DocBook - толық бағыттамасы
+Name[km]=DocBook - មគ្គុទ្ទេសក៍​ច្បាស់លាស់
+Name[ko]=DocBook - 명확한 가이드
+Name[lo]=DocBook -the Definitive Guide
+Name[lt]=DocBook – galutinis vadovas
+Name[lv]=DocBook - Izsmeļošs Ceļvedis
+Name[mk]=DocBook - дефинитивниот водач
+Name[mn]=DocBook - Тодорхой зааварчилгаа
+Name[ms]=DocBook - Panduan Definitif
+Name[nb]=DocBook – Den endelige guiden
+Name[nds]=DocBook - De Inföhren
+Name[ne]=DocBook - निर्णायक मार्गदर्शक
+Name[nn]=DocBook – The Definitive Guide
+Name[nso]=DocBook - Keletso yeo e Feleletsego
+Name[pa]=DocBook - ਨਿਸ਼ਚਿਤ ਗਾਈਡ
+Name[pl]=DocBook (system dokumentacji) - podręcznik
+Name[pt]=DocBook - O Guia Definitivo
+Name[pt_BR]=DocBook - O Guia Definitivo
+Name[ro]=DocBook - Ghidul de referință
+Name[ru]=DocBook - полное руководство
+Name[rw]=IgitaboInyandiko - Inyifashisho ya Nyuma
+Name[se]=DocBook – The Definitive Guide
+Name[sl]=DocBook - Popolni vodič
+Name[sr]=DocBook — Дефинитивни водич
+Name[sr@Latn]=DocBook — Definitivni vodič
+Name[sv]=Den slutgiltiga guiden till docbook
+Name[ta]=Docபுத்தகம் - விளக்கமான வழிகாட்டி
+Name[tg]=DocBook - Роҳнамои таърифӣ
+Name[tr]=DocBook - Eksiksiz Rehber
+Name[tt]=DocBook - Tulı Qullanma
+Name[uk]=Посібник визначень DocBook
+Name[uz]=DocBook - toʻliq qoʻllanma
+Name[uz@cyrillic]=DocBook - тўлиқ қўлланма
+Name[ven]=DocBook - Tsumbavhulwo i Talutshedzaho
+Name[vi]=DocBook - Hướng dẫn Đầy đủ
+Name[wa]=DocBook - Li guide definitif
+Name[xh]=DocBook - Incwadi Echazayo
+Name[zh_CN]=DocBook - 权威的指南
+Name[zh_TW]=DocBook - 終極指南
+Name[zu]=DocBook - Umbonisi ochazayo
+Query=http://www.docbook.org/tdg/en/html/\\{1}.html
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/doi.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/doi.desktop
new file mode 100644
index 000000000..07b5a0a52
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/doi.desktop
@@ -0,0 +1,63 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=doi
+Name=Digital Object Identifier
+Name[ar]=مُعرّف الكائن الرّقمي
+Name[az]=Dijital Obyekt Bildiricisi
+Name[bn]=ডিজিটাল অবজেক্ট আইডেন্টিফায়ার
+Name[bs]=Digitalni identifikator objekta
+Name[ca]=Identificador d'objecte digital
+Name[cs]=Digitální identifikátor objektu
+Name[csb]=Cëfrowi identifikator òbiektu (DOI)
+Name[cy]=Dynodydd Gwrthrych Digidol
+Name[da]=Digital objekt-identifikator
+Name[de]=Identifizierung digitaler Objekte
+Name[el]=Αναγνώριση ψηφιακών αντικειμένων
+Name[eo]=Cifereca objektnomo
+Name[es]=Identificador de objeto digital
+Name[eu]=Objektu digital identifikatzailea
+Name[fa]=شناسۀ شئ دیجیتال
+Name[fi]=Digitaalinen objektitunniste
+Name[he]=מזהה אובייקט דיגיטלי
+Name[hi]=डिजिटल ऑब्जेक्ट पहचानकर्ता
+Name[hr]=Prepoznavanje digitalnog objekta
+Name[hu]=Digitális objektumazonosító (DOI)
+Name[is]=Stafrænn hlutaauðkennir
+Name[it]=Identificatore oggetti digitali
+Name[ja]=デジタルオブジェクト識別子
+Name[ka]=ციფრული ობიექტის ამომცნობი
+Name[kk]=Цифрлық нысандарды танушы
+Name[lt]=Skaitmeninių objektų identifikatorius
+Name[lv]=Digitālo objektu Meklētājs
+Name[mk]=Идентификатор на дигитален објект
+Name[mn]=Дижитал объект ялгагч
+Name[ms]=Pengenal Pasti Objek Digital
+Name[nb]=Digitalt objektnavn
+Name[ne]=डिजिटल वस्तु पहिचायक
+Name[nn]=Digitalt objektnamn
+Name[pa]=ਡਿਜ਼ੀਟਲ ਇਕਾਈ ਪਛਾਣਕਾਰ
+Name[pl]=Cyfrowy identyfikator obiektu (DOI)
+Name[pt_BR]=Identificador de Objeto Digital
+Name[ro]=Identificator digital obiect
+Name[ru]=Идентификатор цифровых объектов
+Name[rw]=Ikiranga Igikoresho Bimenyetsomibare
+Name[se]=Digitálalaš objeaktanamma
+Name[sk]=Identifikátor digitálnych objektov
+Name[sl]=Identifikator digitalnega predmeta
+Name[sr]=Идентификатор дигиталног објекта
+Name[sr@Latn]=Identifikator digitalnog objekta
+Name[sv]=Identifikation av digitala objekt
+Name[ta]=எண்ணிய பொருள் அடையாளங்காட்டி
+Name[tg]=Муайянкунандаи мавзӯъҳои рақамӣ
+Name[th]=ตัวระบุวัตถุดิจิตอล
+Name[tr]=Sayısal Nesne Kimlikleyici
+Name[tt]=Sanlı Cisem Ayırğıçı
+Name[uk]=Цифровий ідентифікатор об'єкта
+Name[vi]=Số chứng minh vật thể
+Name[wa]=Idintifieu di didjitås agayons
+Name[zh_TW]=數位物件識別
+Query=http://dx.doi.org/\\{@}
+Query[sk]=http://dx.doi.org/\\{@
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/en2de.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/en2de.desktop
new file mode 100644
index 000000000..3e5861baf
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/en2de.desktop
@@ -0,0 +1,73 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=en2de
+Name=dict.cc Translation: English to German
+Name[af]=dict.cc Vertaling: Engels na Duits
+Name[ar]=dict.cc ترجمة : من الإنكليزية إلى الألمانية
+Name[be]=dict.cc Пераклад: з англійскай на нямецкую
+Name[bn]=dict.cc অনুবাদ: ইংরাজি থেকে জার্মান
+Name[bs]=dict.cc prijevod: engleski u njemački
+Name[ca]=Traducció dict.cc: Anglès - Alemany
+Name[cs]=Překlad dict.cc: z angličtiny do němčiny
+Name[csb]=dict.cc: anielsczi -> miemiecczi
+Name[da]=dict.cc oversættelse: Engelsk til tysk
+Name[de]=dict.cc-Übersetzung: Englisch/Deutsch
+Name[el]=dict.cc Μετάφραση: Αγγλικά σε Γερμανικά
+Name[eo]=dict.cc Traduko: Angla al Germana
+Name[es]=dict.cc Tranducción: inglés a alemán
+Name[et]=dict.cc tõlkimine: inglise->saksa
+Name[eu]=dict.cc Itzulpena: ingelesetik alemanerara
+Name[fa]=ترجمۀ dict.cc: انگلیسی به آلمانی
+Name[fi]=dict.cc käännös: englannista saksaksi
+Name[fr]=Traduction dict.cc : Anglais en Allemand
+Name[fy]=dict.cc-oersetting: Ingelsk nei Dûtsk
+Name[ga]=dict.cc Aistriúchán: Béarla go Gearmáinis
+Name[gl]=Tradución dict.cc: Inglés a Alemán
+Name[he]=תרגום dict.cc: אנגלי־גרמני
+Name[hi]=dict.cc अनुवादः अंग्रेजी से जर्मन
+Name[hr]=dict.cc Prijevod: engleski na njemački
+Name[hu]=Dict.cc - Fordítás angolról németre
+Name[is]=dict.cc Þýðing: Enska í þýsku
+Name[it]=Traduzione dict.cc: dall'inglese al tedesco
+Name[ja]=dict.cc 英語-ドイツ語翻訳
+Name[ka]=dict.cc თარგმნა: ინგლისურ-გერმანული
+Name[kk]=dict.cc аудармашы: ағылшын тілінен немісшеге
+Name[km]=dict.cc ៖ បកប្រែ​ពី​ភាសា​អង់គ្លេស​ទៅ​អាល្លឺម៉ង់
+Name[ko]=dict.cc 번역: 영어에서 독일어로
+Name[lt]=dict.cc vertimas: iš anglų į vokiečių
+Name[lv]=dict.cc Tulkošana: no Angļu uz Vācu
+Name[mk]=dict.cc превод: од англиски на германски
+Name[nb]=dict.cc Oversettelse fra engelsk til tysk
+Name[nds]=dict.cc Översetten: Engelsch na Hoochdüütsch
+Name[ne]=dict.cc अनुवाद: अङ्ग्रेजीलाई जर्मनीमा
+Name[nl]=dict.cc-vertaling: Engels naar Duits
+Name[nn]=dict.cc Omsetjing: Engelsk til tysk
+Name[pa]=dict.cc ਅਨੁਵਾਦ: ਅੰਗਰੇਜ਼ੀ ਤੋਂ ਜਰਮਨ
+Name[pl]=dict.cc: angielski -> niemiecki
+Name[pt]=Tradução do dict.cc: Inglês para Alemão
+Name[pt_BR]=dict.cc - Tradução: Inglês para Alemão
+Name[ro]=Traducere dict.cc: engleză la germană
+Name[ru]=Переводчик dict.cc: англо-немецкий
+Name[rw]=dict.cc Ivunura:Icyongereza mu Kidage
+Name[se]=dict.cc Jorgaleapmi: Eŋgelasgielas duiskkagillii
+Name[sk]=dict.cc Preklad z angličtiny do nemčiny
+Name[sl]=Prevod dict.cc: angleščina v nemščino
+Name[sr]=Превод на dict.cc: са енглеског на немачки
+Name[sr@Latn]=Prevod na dict.cc: sa engleskog na nemački
+Name[sv]=dict.cc översättning: engelska till tyska
+Name[ta]=dict.cc Translation மொழிபெயர்ப்பு: ஆங்கிலத்தில் இருந்து ஜெர்மன் மொழிக்கு
+Name[te]=dict.cc అనువాదం: ఆంగ్లం నుంచి జెర్మన్ కు
+Name[tg]=dict.cc Тарҷума: аз Англисӣ ба Олмонӣ
+Name[th]=dict.cc แปลภาษาเยอรมันเป็นอังกฤษ
+Name[tr]=dict.cc Çevirisi: İngilizceden Almancaya
+Name[tt]=dict.cc Tärcemä: İnglizçä -› Almança
+Name[uk]=dict.cc: переклад з англійської на німецьку
+Name[uz]=dict.cc tarjima: Inglizchadan Nemischaga
+Name[uz@cyrillic]=dict.cc таржима: Инглизчадан Немисчага
+Name[vi]=dict.cc Dịch: Tiếng Anh sang tiếng Đức
+Name[wa]=Ratournaedje dict.cc di l' inglès viè l' almand
+Name[zh_TW]=dict.cc 翻譯: 英文至德文
+Query=http://www.dict.cc/?s=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/en2es.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/en2es.desktop
new file mode 100644
index 000000000..06a71322e
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/en2es.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=en2es
+Name=WordReference.com Translation: English to Spanish
+Name[af]=WordReference.com Vertaling: Engels na Spaans
+Name[ar]=ترجمة WordReference.com : من الإنكليزية إلى الإسبانية
+Name[az]=WordReference.com Tərcümə: İngiliscədən İspancaya
+Name[be]=WordReference.com Пераклад: з англійскай на гішпанскую
+Name[bn]=WordReference.com অনুবাদ: ইংরাজি থেকে স্প্যানিশ
+Name[bs]=WordReference.com prijevod: engleski u španski
+Name[ca]=Traducció WordReference.com: Anglès - Espanyol
+Name[cs]=Překlad WordReference.com: z angličtiny do španělštiny
+Name[csb]=WordReference.com: anielsczi -> szpańsczi
+Name[cy]=Cyfieithiad WordReference.com: Saesneg i Sbaeneg
+Name[da]=WordReference.com oversættelse: Engelsk til spansk
+Name[de]=WordReference.com-Übersetzung: Englisch/Spanisch
+Name[el]=WordReference.com Μετάφραση: Αγγλικά σε Ισπανικά
+Name[eo]=WordReference.com Traduko: angla al hispana
+Name[es]=WordReference.com Traducción: inglés a español
+Name[et]=WordReference.com tõlkimine: inglise->hispaania
+Name[eu]=WordReference.com Itzulpena: ingelesetik gaztelerara
+Name[fa]=ترجمۀ WordReference.com: انگلیسی به اسپانیایی
+Name[fi]=WordReference.com-käännös: englannista espanjaksi
+Name[fr]=Traduction sur WordReference.com : Anglais en Espagnol
+Name[fy]=WordReference.com-oersetting: Ingelsk nei Spaansk
+Name[ga]=Aistriúchán WordReference.com: Béarla go Spáinnis
+Name[gl]=Tradución WordReference.com: Inglés a Español
+Name[he]=תרגום WordReference.com: אנגלי־ספרדי
+Name[hi]=WordReference.com अनुवादः अंग्रेजी से स्पेनी
+Name[hr]=WordReference.com prijevod: engleski u španjolski
+Name[hu]=WordReference.com fordítás: angolról spanyolra
+Name[is]=WordReference.com þýðing: Ensk/spönsk
+Name[it]=Traduzione WordReference.com: dall'inglese allo spagnolo
+Name[ja]=WordReference.com 英語-スペイン語翻訳
+Name[kk]=WordReference.com ағылшын тілінен испаншаға аудару
+Name[km]=WordReference.com ៖ បកប្រែ​ពី​ភាសា​អង់គ្លេស​ទៅ​អេស្ប៉ាញ
+Name[ko]=WordReference.com 번역: 영어에서 스페인어로
+Name[lt]=WordReference.com vertimas: iš anglų į ispanų
+Name[lv]=WordReference.com Tulkošana: no Angļu uz Spāņu
+Name[mk]=WordReference.com превод: од англиски на шпански
+Name[mt]=Traduzzjoni WordReference.com: Ingliż għall-iSpanjol
+Name[nb]=WordReference.com – oversettelse fra engelsk til spansk
+Name[nds]=WordReference.com Översetten: Engelsch na Spaansch
+Name[ne]=WordReference.com Translation: अङ्ग्रेजीलाई स्पेनीसमा
+Name[nl]=WordReference.com-vertaling: Engels naar Spaans
+Name[nn]=WordReference.com – omsetjing: engelsk til spansk
+Name[pa]=WordReference.com ਅਨੁਵਾਦ:ਅੰਗਰੇਜ਼ੀ ਤੋਂ ਸਪੇਨੀ
+Name[pl]=WordReference.com: angielski -> hiszpański
+Name[pt]=Tradução do WordReference.com: Inglês para Espanhol
+Name[pt_BR]=WordReference.com - Tradução: Inglês para Espanhol
+Name[ro]=Traducere WordReference.com: engleză la spaniolă
+Name[ru]=Переводчик WordReference.com: англо-испанский
+Name[rw]=WordReference.com Ivunura: Icyongereza mu Gisipanyore
+Name[se]=WordReference.com – jorgaleapmi: eŋgelasgielas spánskkagillii
+Name[sk]=WordReference.com preklad z angličtiny do španieštiny
+Name[sl]=Prevod WordReference.com: angleščina v španščino
+Name[sr]=Превод на WordReference.com: са енглеског на шпански
+Name[sr@Latn]=Prevod na WordReference.com: sa engleskog na španski
+Name[sv]=Wordreference.com översättning: engelska till spanska
+Name[ta]=WordReference.com மொழிபெயர்ப்பு: ஆங்கிலத்தில் இருந்து ஸ்பானிஷ் மொழிக்கு
+Name[te]=WordReference.com అనువాదం: ఆంగ్లం నుంచి స్పానిష్ కు
+Name[tg]=WordReference.com Тарҷума: Аз Англисӣ ба Испанӣ
+Name[th]=WordReference.com แปลภาษาอังกฤษเป็นสเปน
+Name[tr]=WordReference.com Çevirisi: İngilizceden İspanyolcaya
+Name[tt]=WordReference.com Tärcemäse: İnglizçä -› İspança
+Name[uk]=WordReference.com: переклад з англійської на іспанську
+Name[uz]=WordReference.com tarjima: Inglizchadan Ispanchaga
+Name[uz@cyrillic]=WordReference.com таржима: Инглизчадан Испанчага
+Name[vi]=WordReference.com Dịch: tiếng Anh sang tiếng Tây Ban Nha
+Name[wa]=WordReference.com ratournaedje di l' inglès viè l' espagnol
+Name[zh_CN]=WordReference.com 翻译:英语译西班牙语
+Name[zh_TW]=WordReference.com 翻譯: 英文至西班牙文
+Query=http://www.wordreference.com/es/translation.asp?tranword=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/en2fr.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/en2fr.desktop
new file mode 100644
index 000000000..545d8fc2b
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/en2fr.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=en2fr
+Name=WordReference.com Translation: English to French
+Name[af]=WordReference.com Vertaling: Engels na Fraans
+Name[ar]=ترجمة WordReference.com : من الإنجليزية إلى الفرنسية
+Name[az]=WordReference.com Tərcümə: İngiliscədən Fransızcaya
+Name[be]=WordReference.com Пераклад: з англійскай на французскую
+Name[bn]=WordReference.com অনুবাদ: ইংরাজি থেকে ফরাসী
+Name[bs]=WordReference.com prijevod: engleski u francuski
+Name[ca]=Traducció WordReference.com: Anglès - Francès
+Name[cs]=Překlad WordReference.com: z angličtiny do francouzštiny
+Name[csb]=WordReference.com: anielsczi -> francësczi
+Name[cy]=Cyfieithiad WordReference.com: Saesneg i Ffrangeg
+Name[da]=WordReference.com oversættelse: Engelsk til fransk
+Name[de]=WordReference.com-Übersetzung: Englisch/Französisch
+Name[el]=WordReference.com Μετάφραση: Αγγλικά σε Γαλλικά
+Name[eo]=WordReference.com Traduko: angla al franca
+Name[es]=WordReference.com Traducción: inglés a francés
+Name[et]=WordReference.com tõlkimine: inglise->prantsuse
+Name[eu]=WordReference.com Itzulpena: ingelesetik frantsesera
+Name[fa]=ترجمۀ WordReference.com: انگلیسی به فرانسوی
+Name[fi]=WordReference.com-käännös: englannista ranskaksi
+Name[fr]=Traduction sur WordReference.com : Anglais en Français
+Name[fy]=WordReference.com-oersetting: Ingelsk nei Frânsk
+Name[ga]=Aistriúchán WordReference.com: Béarla go Fraincis
+Name[gl]=Tradución WordReference.com: Inglés a Francés
+Name[he]=תרגום WordReference.com: אנגלי־צרפתי
+Name[hi]=WordReference.com अनुवादः अंग्रेजी से फ्रांसीसी
+Name[hr]=WordReference.com prijevod: engleski na francuski
+Name[hu]=WordReference.com fordítás: angolról franciára
+Name[is]=WordReference.com þýðing: Ensk/frönsk
+Name[it]=Traduzione WordReference.com: dall'inglese al francese
+Name[ja]=WordReference.com 英語-フランス語翻訳
+Name[kk]=WordReference.com ағылшын тілінен французшаға аудару
+Name[km]=WordReference.com ៖ បកប្រែ​ពី​ភាសា​អង់គ្លេស​ទៅ​បារាំង
+Name[ko]=WordReference.com 번역: 영어에서 프랑스어로
+Name[lt]=WordReference.com vertimas: iš anglų į prancūzų
+Name[lv]=WordReference.com Tulkošana: no Angļu uz Franču
+Name[mk]=WordReference.com превод: од англиски на француски
+Name[mt]=Traduzzjoni WordReference.com: Ingliż għall-Franċiż
+Name[nb]=WordReference.com – oversettelse fra engelsk til fransk
+Name[nds]=WordReference.com Översetten: Engelsch na Franzöösch
+Name[ne]=WordReference.com Translation: अङ्ग्रेजीलाई फ्रेन्चमा
+Name[nl]=WordReference.com-vertaling: Engels naar Frans
+Name[nn]=WordReference.com – omsetjing: engelsk til fransk
+Name[pa]=WordReference.com ਅਨੁਵਾਦ:ਅੰਗਰੇਜ਼ੀ ਤੋਂ ਫਰੈਂਚ
+Name[pl]=WordReference.com: angielski -> francuski
+Name[pt]=Tradução do WordReference.com: Inglês para Francês
+Name[pt_BR]=WordReference.com - Tradução: Inglês para Francês
+Name[ro]=Traducere WordReference.com: engleză la franceză
+Name[ru]=Переводчик WordReference.com: англо-французский
+Name[rw]=WordReference.com Ivunura: Icyongereza mu Gifaransa
+Name[se]=WordReference.com – jorgaleapmi: eŋgelasgielas fránskkagillii
+Name[sk]=WordReference.com preklad z angličtiny do francúzštiny
+Name[sl]=Prevod WordReference.com: angleščina v francoščino
+Name[sr]=Превод на WordReference.com: са енглеског на француски
+Name[sr@Latn]=Prevod na WordReference.com: sa engleskog na francuski
+Name[sv]=Wordreference.com översättning: engelska till franska
+Name[ta]=WordReference.com மொழிபெயர்ப்பு: ஆங்கிலத்தில் இருந்து ப்ரென்சு மொழிக்கு
+Name[te]=WordReference.com అనువాదం: ఆంగ్లం నుంచి ఫ్రెంచి కు
+Name[tg]=WordReference.com Тарҷума: Аз Англисӣ ба Фаронсавӣ
+Name[th]=WordReference.com แปลภาษาอังกฤษเป็นฝรั่งเศส
+Name[tr]=WordReference.com Çevirisi: İngilizceden Fransızcaya
+Name[tt]=WordReference.com Tärcemäse: İnglizçä -› Fransça
+Name[uk]=WordReference.com: переклад з англійської на французьку
+Name[uz]=WordReference.com tarjima: Inglizchadan Fransuzchaga
+Name[uz@cyrillic]=WordReference.com таржима: Инглизчадан Французчага
+Name[vi]=WordReference.com Dịch: Tiếng Anh sang tiếng Pháp
+Name[wa]=WordReference.com ratournaedje di l' inglès viè l' francès
+Name[zh_CN]=WordReference.com 翻译:英语译法语
+Name[zh_TW]=WordReference.com 翻譯: 英文至法文
+Query=http://www.wordreference.com/fr/Translation.asp?enfr=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/en2it.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/en2it.desktop
new file mode 100644
index 000000000..f4db13931
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/en2it.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=en2it
+Name=WordReference.com Translation: English to Italian
+Name[af]=WordReference.com Vertaling: Engels na Italiaans
+Name[ar]=ترجمة WordReference.com: من الإنجليزية إلى الإيطالية
+Name[az]=WordReference.com Tərcümə: İngiliscədən İtalyancaya
+Name[be]=WordReference.com Пераклад: з англійскай на італійскую
+Name[bn]=WordReference.com অনুবাদ: ইংরাজি থেকে ইতালীয়
+Name[bs]=WordReference.com prijevod: engleski u italijanski
+Name[ca]=Traducció WordReference.com: Anglès - Italià
+Name[cs]=Překlad WordReference.com: z angličtiny do italštiny
+Name[csb]=WordReference.com: anielsczi -> italsczi
+Name[cy]=Cyfieithiad WordReference.com: Saesneg i Eidaleg
+Name[da]=WordReference.com oversættelse: Engelsk til italiensk
+Name[de]=WordReference.com-Übersetzung: Englisch/Italienisch
+Name[el]=WordReference.com Μετάφραση: Αγγλικά σε Ιταλικά
+Name[eo]=WordReference.com Traduko: angla al itala
+Name[es]=WordReference.com Traducción: inglés a italiano
+Name[et]=WordReference.com tõlkimine: inglise->itaalia
+Name[eu]=WordReference.com Itzulpena: ingelesetik italierara
+Name[fa]=ترجمۀ WordReference.com: انگلیسی به ایتالیایی
+Name[fi]=WordReference.com-käännös: englannista italiaksi
+Name[fr]=Traduction sur WordReference.com : Anglais en Italien
+Name[fy]=WordReference.com-oersetting: Ingelsk nei Italiaansk
+Name[ga]=Aistriúchán WordReference.com: Béarla go Iodáilis
+Name[gl]=Tradución WordReference.com: Inglés a Italiano
+Name[he]=תרגום WordReference.com: אנגלי־איטלקי
+Name[hi]=WordReference.com अनुवादः अंग्रेजी से इतालवी
+Name[hr]=WordReference.com Prijevod: engleski na talijanski
+Name[hu]=WordReference.com fordítás: angolról olaszra
+Name[is]=WordReference.com þýðing: Ensk/ítölsk
+Name[it]=Traduzione WordReference.com: dall'inglese all'italiano
+Name[ja]=WordReference.com 英語-イタリア語翻訳
+Name[kk]=WordReference.com ағылшын тілінен итальяншаға аудару
+Name[km]=WordReference.com ៖ បកប្រែ​ពី​ភាសា​អង់គ្លេស​ទៅ​អ៊ីតាលី
+Name[ko]=WordReference.com 번역: 영어에서 이탈리아어로
+Name[lt]=WordReference.com vertimas: iš anglų į italų
+Name[lv]=WordReference.com Tulkošana: no Angļu uz Itāļu
+Name[mk]=WordReference.com превод: од англиски на италијански
+Name[mt]=Trasuzzjoni WordReference.com: Ingliż għat-Taljan
+Name[nb]=WordReference.com – oversettelse fra engelsk til italiensk
+Name[nds]=WordReference.com Översetten: Engelsch na Italieensch
+Name[ne]=WordReference.com Translation: अङ्ग्रेजीलाई इटलीमा
+Name[nl]=WordReference.com-vertaling: Engels naar Italiaans
+Name[nn]=WordReference.com – omsetjing: engelsk til italiensk
+Name[pa]=WordReference.com ਅਨੁਵਾਦ:ਅੰਗਰੇਜ਼ੀ ਤੋਂ ਇਤਾਲਵੀ
+Name[pl]=WordReference.com: angielski -> włoski
+Name[pt]=Tradução do WordReference.com: Inglês para Italiano
+Name[pt_BR]=WordReference.com - Tradução: Inglês para Italiano
+Name[ro]=Traducere WordReference.com: engleză la italiană
+Name[ru]=Переводчик WordReference.com: англо-итальянский
+Name[rw]=WordReference.com Ivunura: Icyongereza mu Gitaliyani
+Name[se]=WordReference.com – jorgaleapmi: eŋgelasgielas italialašgillii
+Name[sk]=WordReference.com preklad z angličtiny do talianštiny
+Name[sl]=Prevod WordReference.com: angleščina v italijanščino
+Name[sr]=Превод на WordReference.com: са енглеског на италијански
+Name[sr@Latn]=Prevod na WordReference.com: sa engleskog na italijanski
+Name[sv]=Wordreference.com översättning: engelska till italienska
+Name[ta]=WordReference.com மொழிபெயர்ப்பு: ஆங்கிலத்தில் இருந்து இத்தாலிய மொழிக்கு
+Name[te]=WordReference.com అనువాదం: ఆంగ్లం నుంచి ఇటాలియన్ కు
+Name[tg]=WordReference.com Тарҷума: Аз Англисӣ ба Итолиёгӣ
+Name[th]=WordReference.com แปลภาษาอังกฤษเป็นอิตาเลี่ยน
+Name[tr]=WordReference.com Çevirisi: İngilizceden İtalyancaya
+Name[tt]=WordReference.com Tärcemäse: İnglizçä -› İtalça
+Name[uk]=WordReference.com: переклад з англійської на італійську
+Name[uz]=WordReference.com tarjima: Inglizchadan Italyanchaga
+Name[uz@cyrillic]=WordReference.com таржима: Инглизчадан Италянчага
+Name[vi]=WordReference.com Dịch: Tiếng Anh sang tiếng Ý
+Name[wa]=WordReference.com ratournaedje di l' inglès viè l' itålyin
+Name[zh_CN]=WordReference.com 翻译:英语译意大利语
+Name[zh_TW]=WordReference.com 翻譯: 英文至義大利文
+Query=http://www.wordreference.com/it/translation.asp?enit=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/es2en.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/es2en.desktop
new file mode 100644
index 000000000..48e49a249
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/es2en.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=es2en
+Name=WordReference.com Translation: Spanish to English
+Name[af]=WordReference.com Vertaling: Spaans na Engels
+Name[ar]=ترجمة WordReference.com : من الأسبانية إلى الإنجليزية
+Name[az]=WordReference.com Tərcümə: İspancadan İngiliscəyə
+Name[be]=WordReference.com Пераклад: з гішпанскай на англійскую
+Name[bn]=WordReference.com অনুবাদ: স্প্যানিশ থেকে ইংরাজি
+Name[bs]=WordReference.com prijevod: španski u engleski
+Name[ca]=Traducció WordReference.com: Espanyol - Anglès
+Name[cs]=Překlad WordReference.com: ze španělštiny do angličtiny
+Name[csb]=WordReference.com: szpańsczi -> anielsczi
+Name[cy]=Cyfieithiad WordReference.com: Sbaeneg i Saesneg
+Name[da]=WordReference.com oversættelse: Spansk til engelsk
+Name[de]=WordReference.com-Übersetzung: Spanisch/Englisch
+Name[el]=WordReference.com Μετάφραση: Ισπανικά σε Αγγλικά
+Name[eo]=WordReference.com Traduko: hispana al angla
+Name[es]=WordReference.com Traducción: español a inglés
+Name[et]=WordReference.com tõlkimine: hispaania->inglise
+Name[eu]=WordReference.com Itzulpena: gazteleratik ingelesera
+Name[fa]=ترجمۀ WordReference.com: اسپانیایی به انگلیسی
+Name[fi]=WordReference.com-käännös: espanjasta englanniksi
+Name[fr]=Traduction sur WordReference.com : Espagnol en Anglais
+Name[fy]=WordReference.com-oersetting: Spaansk nei Ingelsk
+Name[ga]=WordReference.com Aistriúchán: Spáinnis go Béarla
+Name[gl]=Tradución WordReference.com: Español a Inglés
+Name[he]=תרגום WordReference.com: ספרדי־אנגלי
+Name[hi]=WordReference.com अनुवादः स्पेनी से अंग्रेजी
+Name[hr]=WordReference.com Prijevod: španjolski na engleski
+Name[hu]=WordReference.com fordítás: spanyolról angolra
+Name[is]=WordReference.com þýðing: Spönsk/ensk
+Name[it]=Traduzione WordReference.com: dallo spagnolo all'inglese
+Name[ja]=WordReference.com スペイン語-英語翻訳
+Name[kk]=WordReference.com испан тілінен ағылшынға аудару
+Name[km]=WordReference.com ៖ បកប្រែ​ពី​ភាសា​អេស្ប៉ាញ​ទៅ​អង់គ្លេស
+Name[ko]=WordReference.com 번역: 스페인어에서 영어로
+Name[lt]=WordReference.com vertimas: iš ispanų į anglų
+Name[lv]=WordReference.com Tulkošana: no Spāņu uz Angļu
+Name[mk]=WordReference.com превод: од шпански на англиски
+Name[mt]=Traduzzjoni WordReference.com: Spanjol għall-Ingliż
+Name[nb]=WordReference.com – oversettelse fra spansk til engelsk
+Name[nds]=WordReference.com Översetten: Spaansch na Engelsch
+Name[ne]=WordReference.com Translation: स्पेनिसलाई अङ्ग्रेजीमा
+Name[nl]=WordReference.com-vertaling: Spaans naar Engels
+Name[nn]=WordReference.com – omsetjing: spansk til engelsk
+Name[pa]=WordReference.com ਅਨੁਵਾਦ:ਸਪੇਨੀ ਤੋਂ ਅੰਗਰੇਜ਼ੀ
+Name[pl]=WordReference.com: hiszpański -> angielski
+Name[pt]=Tradução do WordReference.com: Espanhol para Inglês
+Name[pt_BR]=WordReference.com - Tradução: Espanhol para Inglês
+Name[ro]=Traducere WordReference.com: spaniolă la engleză
+Name[ru]=Переводчик WordReference.com: испанско-английский
+Name[rw]=WordReference.com Ivunura: Igisipanyore mu Cyongereza
+Name[se]=WordReference.com – jorgaleapmi: spánskkagielas eŋgelasgillii
+Name[sk]=WordReference.com preklad zo španieštiny do angličtiny
+Name[sl]=Prevod WordReference.com: španščina v angleščino
+Name[sr]=Превод на WordReference.com: са шпанског на енглески
+Name[sr@Latn]=Prevod na WordReference.com: sa španskog na engleski
+Name[sv]=Wordreference.com översättning: spanska till engelska
+Name[ta]=WordReference.com மொழிபெயர்ப்பு: ஸ்பானிஷ் மொழியில் இருந்து ஆங்கிலத்துக்கு
+Name[te]=WordReference.com అనువాదం: స్పానిష్ నుంచి ఆంగ్లం కు
+Name[tg]=WordReference.com Тарҷума: Аз Испанӣ ба Англисӣ
+Name[th]=WordReference.com แปลภาษาสเปนเป็นอังกฤษ
+Name[tr]=WordReference.com Çevirisi: İspanyolcadan İngilizceye
+Name[tt]=WordReference.com Tärcemäse: İspança -› İnglizçä
+Name[uk]=WordReference.com: переклад з іспанської на англійську
+Name[uz]=WordReference.com tarjima: Ispanchadan Inglizchaga
+Name[uz@cyrillic]=WordReference.com таржима: Испанчадан Инглизчага
+Name[vi]=WordReference.com Dịch: Tiếng Tây Ban Nha sang tiếng Anh
+Name[wa]=WordReference.com ratournaedje do castiyan viè l' inglès
+Name[zh_CN]=WordReference.com 翻译:西班牙语译英语
+Name[zh_TW]=WordReference.com 翻譯: 西班牙文至英文
+Query=http://www.wordreference.com/es/en/translation.asp?spen=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/excite.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/excite.desktop
new file mode 100644
index 000000000..f889c0257
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/excite.desktop
@@ -0,0 +1,22 @@
+[Desktop Entry]
+Type=Service
+Name=Excite
+Name[bn]=এক্সসাইট
+Name[csb]=Excite - szëkôrz starnów WWW
+Name[eo]=Ekscito
+Name[hi]=एक्साइट
+Name[ne]=उत्तेजना
+Name[nso]=Thabisa
+Name[pa]=ਐਕਸਾਟੀ
+Name[pl]=Excite - wyszukiwarka stron WWW
+Name[rw]=Gusembura
+Name[ss]=Jabulisa
+Name[ta]=ஆச்சர்யம்
+Name[te]=ఎక్సైట్
+Name[ven]=Takadza
+Name[vi]=Tra Excite
+Name[zu]=Jabulisa
+ServiceTypes=SearchProvider
+Keys=ex,excite
+Query=http://search.excite.com/search.gw?search=\\{@}
+Query[en_GB]=http://www.excite.co.uk/search/web/results?q=\\{@}&c=web
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/feedster.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/feedster.desktop
new file mode 100644
index 000000000..4843936df
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/feedster.desktop
@@ -0,0 +1,18 @@
+[Desktop Entry]
+Type=Service
+Name=Feedster
+Name[bn]=ফীডস্টার
+Name[hi]=फीडस्टर
+Name[ja]=Feedster 検索
+Name[ne]=फेडस्टर
+Name[pa]=ਫੀਡਸਟੀਰ
+Name[ta]=பீட்ஸ்டர்
+Name[te]=ఫీడ్ స్టర్
+Name[th]=Feedster หาบล็อก
+Name[vi]=Tra Feedster
+ServiceTypes=SearchProvider
+Keys=blog,rss,feedster
+Query=http://www.feedster.com/search.php?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[he]=http://www.feedster.com/search.php?q=\\{@}&ie=UTF8&oe=UTF-88
+Query[ne]=http://www.feedster.com/search.php?q=\\{@}ie=UTF-8&oe=UTF-8
+Charset=utf8
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/foldoc.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/foldoc.desktop
new file mode 100644
index 000000000..2ff15b7a7
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/foldoc.desktop
@@ -0,0 +1,72 @@
+[Desktop Entry]
+Type=Service
+Name=Free On-Line Dictionary of Computing
+Name[af]=Gratis Aanlyn Woordeboek van Rekenaars
+Name[ar]=قاموس الحاسوب و البرمجة المجاني على الخط
+Name[az]=Onlayn Kompüter Lüğəti
+Name[be]=Свабодны кампутарны слоўнік
+Name[bn]=কমপিউটিং-এর ফ্রী অন-লাইন অভিধান
+Name[bs]=Besplatni on-line rječnik računarstva (FOLDOC)
+Name[ca]=Diccionari lliure d'informàtica en línia
+Name[cs]=Online slovník výp. techniky
+Name[csb]=Wòlnoprzistãpny kòmpùtrowi słowôrz
+Name[cy]=Geiriadur Rhydd Ar-lein o Gyfrifiaduro
+Name[da]=Gratis online-computerordbog
+Name[el]=Ελεύθερο διαδικτυακό λεξικό υπολογιστών
+Name[eo]=Libera reta vortaro de komputado
+Name[es]=Free On-Line Dictionary Of Computing
+Name[et]=Vaba arvutialane võrgusõnastik
+Name[eu]=Konputazioari buruzko lineako hiztegi librea
+Name[fa]=واژه‌نامۀ برخط رایگان محاسبات
+Name[fi]=Vapaa tietokonealan sanasto
+Name[fr]=Dictionnaire de l'informatique gratuit en ligne
+Name[fy]=Free On-Line Dictionary Of Computing (IT-wurdboek)
+Name[gl]=Diccionario Libre En liña da Computación
+Name[he]=מילון מחשוב מקוון חופשי
+Name[hi]=कम्प्यूटर कार्य हेतु मुफ्त ऑन-लाइन शब्दकोश
+Name[hr]=Slobodan internetski rječnik računarstva
+Name[hu]=Szabad hozzáférésű számítástechnikai szótár
+Name[is]=Ókeypis tölvuorðabók á Netinu
+Name[it]=Dizionario libero on-line di informatica
+Name[ja]=コンピューティングに関するフリーオンライン辞書
+Name[ka]=თავისუფალი კომპიუტერული წებ ლექსიკონი
+Name[kk]=Ашық компьютерлік онлайн сөздігі
+Name[km]=វចនានុក្រម​កុំព្យូទ័រ​លើ​បណ្ដាញ មិន​គិត​ថ្លៃ
+Name[ko]=무료 온라인 컴퓨터 사전
+Name[lt]=Nemokamas kompiuterijos žodynas tinkle
+Name[lv]=Bezmaksas Datorikas vārdnīca
+Name[mk]=Слободен мрежен речник за компјутери
+Name[ms]=Kamus Perkomputeran Dalam Talian Percuma
+Name[mt]=Dizzjunarju tal-Compjuters Online B'xejn (FOLDOC)
+Name[nb]=Gratis engelsk dataordbok på nett
+Name[nds]=Free On-Line Dictionary Of Computing
+Name[ne]=कम्प्युटिङको अन-लाइन शब्दकोश
+Name[nl]=Free On-Line Dictionary Of Computing (IT-woordenboek)
+Name[nn]=Free On-Line Dictionary Of Computing
+Name[pa]=ਕੰਪਿਊਟਰ ਦਾ ਆਨ-ਲਾਈਨ ਮੁਫਤ ਸ਼ਬਦ-ਕੋਸ਼
+Name[pl]=Darmowy słownik informatyczny
+Name[pt]=Dicionário Livre de Computação On-Line
+Name[pt_BR]=Dicionário de Computação On-line Gratuito
+Name[ro]=Dicționar on-line gratuit despre calculatoare
+Name[ru]=Свободный онлайн-словарь по информатике
+Name[rw]=Inkoranyamagambo ya Mudasobwa kuri Interineti y'Ubuntu
+Name[sk]=Free On-Line Dictionary Of Computing
+Name[sl]=Free On-Line Dictionary Of Computing
+Name[sr]=Бесплатни On-Line речник за рачунаре
+Name[sr@Latn]=Besplatni On-Line rečnik za računare
+Name[sv]=Free On-Line Dictionary Of Computing (en datortermsordlista)
+Name[ta]=கணிப்பொறி அகராதி வலைதளத்தில் இலவசமாக
+Name[tg]=Луғати озоди дар шабакаи онлайн вуҷуддоштаи информатика
+Name[th]=พจนานุกรมสำหรับวิทยาการคอมพิวเตอร์ แบบออนไลน์
+Name[tr]=Ücretsiz Çevrimiçi Bilişim Sözlüğü
+Name[tt]=Sanaq Tarmağı buyınça On-Line Süzlek
+Name[uk]=Вільний словник з інформатики в мережі
+Name[uz]=Kompyuter atamalari boʻyicha Internet lugʻat
+Name[uz@cyrillic]=Компьютер атамалари бўйича Интернет луғат
+Name[vi]=Từ điển Tin học Trực tuyến Miễn phí
+Name[wa]=Diccionaire informatike libe so les fyis
+Name[zh_CN]=Free On-Line Dictionary Of Computing
+Name[zh_TW]=免費的線上電腦辭典
+ServiceTypes=SearchProvider
+Keys=fd,foldoc
+Query=http://foldoc.doc.ic.ac.uk/foldoc/foldoc.cgi?query=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/fr2de.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/fr2de.desktop
new file mode 100644
index 000000000..c73229494
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/fr2de.desktop
@@ -0,0 +1,72 @@
+[Desktop Entry]
+Type=Service
+Name=LEO - Translate Between French and German
+Name[af]=LEO - Vertaal tussen Fraans en Duits
+Name[ar]=LEO - ترجم بين الألمانية و الفرنسية
+Name[be]=LEO - Пераклад з французскай на нямецкую і наадварот
+Name[bn]=লিও - জার্মান থেকে ফরাসী বা ফরাসী থেকে জার্মান-এ অনুবাদ করুন
+Name[bs]=LEO prijevod: francuski u njemački
+Name[ca]=LEO - Tradueix entre francès i alemany
+Name[cs]=LEO - překlad mezi francouzštinou a němčinou
+Name[csb]=LEO - dolmaczenié: francësczi ->miemiecczi
+Name[da]=LEO - Oversæt mellem fransk og tysk
+Name[de]=LEO - Übersetzung Französisch/Deutsch
+Name[el]=LEO - Μετάφραση μεταξύ Γαλλικών και Γερμανικών
+Name[eo]=LEO - Traduko inter la franca kaj la germana
+Name[es]=LEO - Traducción entre francés y alemán
+Name[et]=LEO - tõlkimine: prantsuse-saksa
+Name[eu]=LEO - itzuli alemana eta frantsearen artean
+Name[fa]=LEO - ترجمۀ بین فرانسوی و آلمانی
+Name[fi]=LEO - Käännä ranskan ja saksan välillä
+Name[fr]=LEO - Traduction Français - Allemand
+Name[fy]=LEO - oersetting tusken Fransk en Dûtsk
+Name[ga]=LEO - Aistriúchán idir Fraincis agus Gearmáinis
+Name[gl]=LEO -Tradución entre Francés e Alemán
+Name[he]=LEO - תרגום צרפתי-אנגלי
+Name[hi]=लिओ - फ्रांसीसी तथा जर्मनी के बीच अनुवाद
+Name[hr]=LEO - Prevođenje između francuskog i njemačkog
+Name[hu]=LEO - Fordítás franciáról németre (mindkét irányban)
+Name[is]=LEO - Þýða á milli frönsku og þýsku
+Name[it]=LEO - Traduzione dal francese al tedesco
+Name[ja]=LEO - フランス語-ドイツ語間の翻訳
+Name[ka]=LEO - ფრანგულ-გერმანული მთარგმნელი
+Name[kk]=LEO - француз және неміс тілдер арасында аудару
+Name[km]=LEO - បកប្រែ​រវាង​ភាសា​បារាំង និង​អាល្លឺម៉ង់
+Name[ko]=LEO - 프랑스어와 독일어 사이 번역
+Name[lt]=LEO - vertimas iš prancūzų į vokiečių ir atvirkščiai
+Name[lv]=LEO - Tulkot no Franču uz Vācu
+Name[mk]=LEO - превод меѓу француски и германски
+Name[nb]=LEO – Oversettelse fra fransk til tysk
+Name[nds]=LEO - Översetten twischen Franzöösch un Hoochdüütsch
+Name[ne]=LEO - फ्रेन्च र जर्मनमा अनुवाद गर्नुहोस्
+Name[nl]=LEO - vertaling tussen Frans en Duits
+Name[nn]=LEO – Omsetjing frå fransk til tysk
+Name[pa]=LEO - ਫਰੈਂਚ ਤੇ ਜਰਮਨ ਵਿੱਚ ਅਨੁਵਾਦ
+Name[pl]=LEO - tłumaczenie: francuski ->niemiecki
+Name[pt]=LEO - Traduzir Entre Francês e Alemão
+Name[pt_BR]=LEO - Tradução entre Francês e Alemão
+Name[ro]=LEO - Traducere între franceză și germană
+Name[ru]=LEO - французско-немецкий перевод
+Name[rw]=LEO - Kuvunura Hagati y'Igifaransa n'Icyongereza
+Name[se]=LEO – jorgal fránskka- ja duiskkagiela gaskkas
+Name[sk]=LEO - Preklad z francúzštiny do nemčiny
+Name[sl]=LEO - Prevod med francoščino in nemščino
+Name[sr]=LEO — превод између француског и немачког
+Name[sr@Latn]=LEO — prevod između francuskog i nemačkog
+Name[sv]=LEO - översätt från franska till tyska
+Name[ta]=LEO - ப்ரென்ச் மற்றும் ஜெர்மன் இடையே மொழிப்பெயர்க்கவும்
+Name[te]=లియొ - ఫ్రెంచ్ మరయూ జెర్మన్ మద్య అనువాదం
+Name[tg]=LEO - Тарҷума дар байни Фрасавию Олмонӣ
+Name[th]=LEO - แปลภาษา ฝรั่งเศส <-> เยอรมัน
+Name[tr]=LEO - Fransızcadan Almancaya Çeviri
+Name[tt]=LEO - Tärcemä: Fransça -› Almança
+Name[uk]=LEO - переклад між французькою та німецькою
+Name[uz]=LEO - Fransuzchadan Nemischaga tarjima
+Name[uz@cyrillic]=LEO - Французчадан Немисчага таржима
+Name[vi]=LEO - Dịch tiếng Pháp sang tiếng Đức
+Name[wa]=LEO - Ratournaedje do francès viè l' almand
+Name[zh_TW]=LEO - 翻譯法語和德語
+ServiceTypes=SearchProvider
+Keys=fr2de
+Query=http://dict.leo.org/?lp=frde&search=\\{@}
+Query[ne]=http://dict.leo.org/?lp=frdesearch=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/fr2en.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/fr2en.desktop
new file mode 100644
index 000000000..44694be00
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/fr2en.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=fr2en
+Name=WordReference.com Translation: French to English
+Name[af]=WordReference.com Vertaling: Fraans na Engels
+Name[ar]=ترجمة WordReference.com: من الفرنسية إلى الإنجليزية
+Name[az]=WordReference.com Tərcümə: Fransızcadan İngiliscəyə
+Name[be]=Пераклад WordReference.com: з французскай на англійскую
+Name[bn]=WordReference.com অনুবাদ: ফরাসী থেকে ইংরাজি
+Name[bs]=WordReference.com prijevod: francuski u engleski
+Name[ca]=Traducció WordReference.com: Francès - Anglès
+Name[cs]=Překlad WordReference.com: z francouzštiny do angličtiny
+Name[csb]=WordReference.com: francësczi -> anielsczi
+Name[cy]=Cyfieithiad WordReference.com: Ffrangeg i Saesneg
+Name[da]=WordReference.com oversættelse: Fransk til engelsk
+Name[de]=WordReference.com-Übersetzung: Französisch/Englisch
+Name[el]=WordReference.com Μετάφραση: Γαλλικά σε Αγγλικά
+Name[eo]=WordReference.com Traduko: franca al angla
+Name[es]=WordReference.com Traducción: francés a inglés
+Name[et]=WordReference.com tõlkimine: prantsuse->inglise
+Name[eu]=WordReference.com Itzulpena: frantsesetik ingelesera
+Name[fa]=ترجمۀ WordReference.com: فرانسوی به انگلیسی
+Name[fi]=WordReference.com-käännös: ranskasta englanniksi
+Name[fr]=Traduction sur WordReference.com : Français en Anglais
+Name[fy]=WordReference.com-oersetting: Frânsk nei Ingelsk
+Name[ga]=Aistriúchán WordReference.com: Fraincis go Béarla
+Name[gl]=Tradución WordReference.com: Francés a Inglés
+Name[he]=תרגום WordReference.com: צרפתי־אנגלי
+Name[hi]=WordReference.com अनुवादः फ्रांसीसी से अंग्रेजी
+Name[hr]=WordReference.com Prijevod: francuski na engleski
+Name[hu]=WordReference.com fordítás: franciáról angolra
+Name[is]=WordReference.com þýðing: Frönsk/ensk
+Name[it]=Traduzione WordReference.com: dal francese all'inglese
+Name[ja]=WordReference.com フランス語-英語翻訳
+Name[kk]=WordReference.com француз тілінен ағылшынға аудару
+Name[km]=WordReference.com ៖ បកប្រែ​ពី​ភាសា​បារាំង​ទៅ​អង់គ្លេស
+Name[ko]=WordReference.com 번역: 프랑스어에서 영어로
+Name[lt]=WordReference.com vertimas: iš prancūzų į anglų
+Name[lv]=WordReference.com Tulkošana: no Franču uz Angļu
+Name[mk]=WordReference.com превод: од француски на англиски
+Name[mt]=Traduzzjoni WordReference.com: Franċiż għall-Ingliż
+Name[nb]=WordReference.com – oversettelse fra fransk til engelsk
+Name[nds]=WordReference.com Översetten: Franzöösch na Engelsch
+Name[ne]=WordReference.com Translation: फ्रेन्चलाई अङ्ग्रेजीमा
+Name[nl]=WordReference.com-vertaling: Frans naar Engels
+Name[nn]=WordReference.com – omsetjing: fransk til engelsk
+Name[pa]=WordReference.com ਅਨੁਵਾਦ:ਫਰੈਂਚ ਤੋਂ ਅੰਗਰੇਜ਼ੀ
+Name[pl]=WordReference.com: francuski -> angielski
+Name[pt]=Tradução do WordReference.com: Francês para Inglês
+Name[pt_BR]=WordReference.com - Tradução: Francês para Inglês
+Name[ro]=Traducere WordReference.com: franceză la engleză
+Name[ru]=Переводчик WordReference.com: французско-английский
+Name[rw]=WordReference.com Ivunura: Igifaransa mu Cyongereza
+Name[se]=WordReference.com – jorgaleapmi: fránskkagielas eŋgelasgillii
+Name[sk]=WordReference.com preklad z francúzštiny do angličtiny
+Name[sl]=Prevod WordReference.com: francoščina v angleščino
+Name[sr]=Превод на WordReference.com: са француског на енглески
+Name[sr@Latn]=Prevod na WordReference.com: sa francuskog na engleski
+Name[sv]=Wordreference.com översättning: franska till engelska
+Name[ta]=WordReference.com மொழிபெயர்ப்பு: பிரென்சு மொழியில் இருந்து ஆங்கிலத்துக்கு
+Name[te]=WordReference.com అనువాదం: ఫ్రెంచి నుంచి ఆంగ్లం కు
+Name[tg]=WordReference.com Тарҷума: аз Франсавӣ ба Англисӣ
+Name[th]=WordReference.com แปลภาษาฝรั่งเศสเป็นอังกฤษ
+Name[tr]=WordReference.com Çevirisi: Fransızcadan İngilizceye
+Name[tt]=WordReference.com Tärcemäse: Fransça -› İnglizçä
+Name[uk]=WordReference.com: переклад з французької на англійську
+Name[uz]=WordReference.com tarjima: Fransuzchadan Inglizchaga
+Name[uz@cyrillic]=WordReference.com таржима: Французчадан Инглизчага
+Name[vi]=WordReference.com Dịch: tiếng Pháp sang tiếng Anh
+Name[wa]=WordReference.com ratournaedje do francès viè l' inglès
+Name[zh_CN]=WordReference.com 翻译:法语译英语
+Name[zh_TW]=WordReference.com 翻譯: 法文至英文
+Query=http://www.wordreference.com/fr/en/translation.asp?fren=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/freedb.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/freedb.desktop
new file mode 100644
index 000000000..0ee044112
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/freedb.desktop
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Type=Service
+Name=FreeDB
+Name[bn]=ফ্রী-ডি.বি.
+Name[eo]=Libera Datumbazo
+Name[hi]=फ्री-डीबी
+Name[ne]=नि: शुल्क DB
+Name[ta]=இலவசடிபி
+Name[te]=ఫ్రీడిబి
+Name[tg]=ОзодиDB
+Name[vi]=Tra FreeDB
+ServiceTypes=SearchProvider
+Keys=fdb,freedb
+Query=http://www.freedb.org/freedb_search.php?words=\\{@}
+Charset=utf8
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/freshmeat.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/freshmeat.desktop
new file mode 100644
index 000000000..598c26a06
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/freshmeat.desktop
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Type=Service
+Name=Freshmeat
+Name[bn]=ফ্রেশমীট
+Name[csb]=Freshmeat - szëkôrz programów
+Name[hi]=फ्रेशमीट
+Name[mn]=Шинэмах
+Name[ne]=फ्रेसमिट
+Name[nso]=Nama ye Botse
+Name[pa]=ਤਾਜ਼ਾ
+Name[pl]=Freshmeat - wyszukiwarka programów
+Name[ta]=புது இறைச்சி
+Name[te]=ఫ్రెష్ మీట్
+Name[ven]=Namathethe
+Name[vi]=Tra Freshmeat
+Name[zu]=Inyama yamanje
+ServiceTypes=SearchProvider
+Keys=fm,freshmeat
+Query=http://freshmeat.net/search/?q=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/froogle.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/froogle.desktop
new file mode 100644
index 000000000..2cb235ac1
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/froogle.desktop
@@ -0,0 +1,17 @@
+[Desktop Entry]
+Type=Service
+Name=Froogle
+Name[bn]=ফ্রুগল্
+Name[hi]=फ्रूगल
+Name[ja]=Froogle 商品検索
+Name[ne]=फ्रुगल
+Name[pa]=ਫਰੂਗਲ
+Name[ta]=ஃப்ரூகுல்
+Name[te]=ఫ్రూగుల్
+Name[th]=Froogle หาสินค้าผ่าน google
+Name[vi]=Tra Froogle
+ServiceTypes=SearchProvider
+Keys=froogle
+Query=http://froogle.google.com/froogle?q=\\{@}
+Query[en_GB]=http://froogle.google.co.uk/froogle?q=\\{@}
+Query[nb]=http://froogle.google.no/froogle?q=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/fsd.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/fsd.desktop
new file mode 100644
index 000000000..ed09b4b7e
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/fsd.desktop
@@ -0,0 +1,66 @@
+[Desktop Entry]
+Type=Service
+Name=FSF/UNESCO Free Software Directory
+Name[af]=FSF/UNESCO Gratis Sagteware Gids
+Name[ar]=دليل FSF/UNESCO للبرامج الحرّة
+Name[be]=Каталог свабоднага праграмнага забеспячэння FSF/UNESCO
+Name[bn]=FSF/UNESCO ফ্রী সফ্‌টওয়্যার ডিরেক্টরি
+Name[br]=Renkell meziantoù frank FSF/UNESCO
+Name[bs]=FSF/UNESCO imenik slobodnog softvera
+Name[ca]=Directori de programari lliure FSF/UNESCO
+Name[cs]=Adresář svobodného softwaru FSF/UNESCO
+Name[csb]=Wòlnoprzistãpny katalog programów FSF/UNESCO
+Name[da]=FSF/UNESCO Free Software katalog
+Name[eo]=FSF/UNESCO Libera Programa Dosierujo
+Name[es]=Directorio de software libre de FSF/UNESCO
+Name[eu]=FSF/UNESCO Free Software direktorioa
+Name[fa]=واژه‌نامۀ نرم‌افزار آزاد FSF/UNESCO
+Name[fi]=FSF/UNESCO Vapaa ohjelmien hakemisto
+Name[fr]=Catalogue de logiciels libres FSF/UNESCO
+Name[ga]=Eolaire Saorbhogearraí FSF/UNESCO
+Name[gl]=Directório de Software Libre FSF/UNESCO
+Name[he]=ספריית תוכנה חופשית של FSF/UNESCO
+Name[hi]=एफएसएफ/यूनेस्को फ्री सॉफ़्टवेयर डिरेक्ट्री
+Name[hr]=FSF/UNESCO mapa slobodnog softvera
+Name[hu]=FSF/UNESCO szabadszoftver-gyűjtemény
+Name[it]=Elenco software libero FSF/UNESCO
+Name[ja]=FSF/UNESCO フリーソフトウェア ディレクトリ
+Name[ka]=FSF/UNESCO თავისუფალი პროგრამების კატალოგი
+Name[kk]=FSF/UNESCO ашық бағдарламалық жасау каталогы
+Name[km]=ថត​កម្មវិធី​ឥត​គិត​ថ្លៃ​របស់ FSF/UNESCO
+Name[ko]=FSF/UNESCO 자유 소프트웨어 디렉터리
+Name[lt]=FSF/UNESCO laisvos programinės įrangos katalogas
+Name[lv]=FSF/UNESCO Brīvās programmatūras krātuve
+Name[mk]=Каталог на слободен софтвер на FSF/UNESCO
+Name[ms]=Direktori Perisian Percuma FSF/UNESCO
+Name[nb]=FSF/UNESCO-katalogen over fri programvare
+Name[nds]=FSF/UNESCO-Verteken mit fre'e Programmen
+Name[ne]=FSF/UNESCO नि: शुल्क सफ्टवेयर शब्दकोश
+Name[nn]=FSF/UNESCO-katalogen over fri programvare
+Name[pa]=FSF/UNESCO ਮੁਕਤ ਸਾਫਟਵੇਅਰ ਡਾਇਰੈਕਟਰੀ
+Name[pl]=Słownik darmowego oprogramowania FSF/UNESCO
+Name[pt]=Directoria de Software Livre FSF/UNESCO
+Name[pt_BR]=Diretório de Software Livre - FSF/UNESCO
+Name[ro]=Director de software liber FSF/UNESCO
+Name[ru]=Каталог свободного ПО FSF/UNESCO
+Name[rw]=Ububiko Porogaramu y'Ubuntu FSF/UNESCO
+Name[sk]=FSF/UNESCO Adresár voľného softwaru
+Name[sl]=Imenik prostega programja FSF/UNESCO
+Name[sr]=Адресар слободног софтвера FSF-а/UNESCO-а
+Name[sr@Latn]=Adresar slobodnog softvera FSF-a/UNESCO-a
+Name[sv]=FSF/UNESCO katalog över fri programvara
+Name[ta]=FSF/UNESCO இலவச மென்பொருள் அடைவு
+Name[tg]=FSF/UNESCO директорияи озоди шабакаи локалӣ
+Name[th]=FSF/UNESCO ไดเร็คทอรีซอฟท์แวร์เสรี
+Name[tr]=FSF/UNESCO Ücretsiz Yazılım Dizini
+Name[tt]=FSF/UNESCO'nıñ Buş Yazılımnar Törgäge
+Name[uk]=Словник з вільного програмного забезпечення FSF/UNESCO
+Name[vi]=Thư mục Phần mềm Tự do FSF/UNESCO
+Name[wa]=Livreye di libes programes FSF/UNESCO
+Name[zh_TW]=FSF/UNESCO 自由軟體目錄
+ServiceTypes=SearchProvider
+Keys=fsd
+Query=http://directory.fsf.org/search/?query=\\{@}
+Query[nds]=http://directory.fsf.org/search/fsd-search.py?q=\\{@}
+
+
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/google.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google.desktop
new file mode 100644
index 000000000..535fff91f
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google.desktop
@@ -0,0 +1,31 @@
+[Desktop Entry]
+Type=Service
+Name=Google
+Name[bn]=গুগল্
+Name[csb]=Google - szëkôrz starnów WWW
+Name[fa]=گوگل
+Name[he]=גוגל
+Name[hi]=गूगल
+Name[mn]=Гооглэ
+Name[ne]=गुगल
+Name[pl]=Google - wyszukiwarka stron WWW
+Name[ta]=கூகுல்
+Name[te]=గూగుల్
+Name[th]=กูเกิ้ล
+ServiceTypes=SearchProvider
+Keys=gg,google
+Query=http://www.google.com/search?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[de]=http://www.google.de/search?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[en_GB]=http://www.google.co.uk/search?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[fi]=http://www.google.fi/search?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[fr]=http://www.google.fr/search?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[he]=http://www.google.co.il/search?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[it]=http://www.google.it/search?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[nb]=http://www.google.no/search?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[ne]=http://www.google.com/search?q=\\{@}ie=UTF-8&oe=UTF-8
+Query[nl]=http://www.google.nl/search?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[nn]=http://www.google.com/search?hl=nn&q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[pt]=http://www.google.pt/search?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[wa]=http://www.google.be/search?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[zh_TW]=http://www.google.com.tw/search?q=\\{@}&ie=UTF-8&oe=UTF-8&hl=zh-TW
+Charset=utf8
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_advanced.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_advanced.desktop
new file mode 100644
index 000000000..121ca5e1b
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_advanced.desktop
@@ -0,0 +1,95 @@
+[Desktop Entry]
+Keys=ggx
+Name=Google Advanced Search
+Name[af]=Google Gevorderde Soektog
+Name[ar]=بحث Google المتقدم
+Name[az]=Google Təkmilləşdirilmiş Axtarış
+Name[be]=Адмысловы пошук Google
+Name[bn]=গুগল্ অগ্রসর অনুসন্ধান
+Name[br]=Klask Google barek
+Name[bs]=Google napredno pretraživanje
+Name[ca]=Recerca avançada de Google
+Name[cs]=Rozšířené hledání (Google)
+Name[csb]=Google - awansowónô szëkba
+Name[cy]=Chwilio Uwch Google
+Name[da]=Google avanceret søgning
+Name[de]=Erweiterte Google-Suche
+Name[el]=Προχωρημένη αναζήτηση του Google
+Name[eo]=Detala serĉo ĉe "Google"
+Name[es]=Búsqueda avanzada de Google
+Name[et]=Google täpsem otsing
+Name[eu]=Googleren bilaketa aurreratua
+Name[fa]=جستجوی پیشرفتۀ گوگل
+Name[fi]=Googlen lisähaku
+Name[fo]=Google (tilkomin leiting)
+Name[fr]=Recherche avancée avec Google
+Name[fy]=Google Avansearre Sykje
+Name[ga]=Cuardach Casta Google
+Name[gl]=Procura Avanzada de Google
+Name[he]=חיפוש מתקדם של גוגל
+Name[hi]=गूगल विस्तृत खोज
+Name[hr]=Google napredno pretraživanje
+Name[hu]=Google részletes keresés
+Name[is]=Google - Nánar
+Name[it]=Ricerca avanzate di Google
+Name[ja]=Google 検索オプション
+Name[ka]=Google დეტალური ძიება
+Name[kk]=Google кеңейтілген іздеу
+Name[km]=ស្វែងរក​កម្រិត​ខ្ពស់​តាម​រយៈ Google
+Name[ko]=Google 고급 검색
+Name[lt]=Išplėsta Google paieška
+Name[lv]=Google Uzlabotā Meklēšana
+Name[mk]=Google - напредно пребарување
+Name[mn]=Өргөтгсөн Гооглэ-хайлт
+Name[ms]=Carian Lanjutan Google
+Name[mt]=Tfittxija avvanzata Google
+Name[nb]=Google avansert søk
+Name[nds]=Google sien verwiederte Söök
+Name[ne]=गुगल उन्नत खोजी
+Name[nl]=Google geavanceerd zoeken
+Name[nn]=Google avansert søk
+Name[nso]=Nyako yeo e Beetswegopele ya Google
+Name[pa]=Google ਤਕਨੀਕੀ ਖੋਜ
+Name[pl]=Google - wyszukiwanie zaawansowane
+Name[pt]=Pesquisa Avançada do Google
+Name[pt_BR]=Procura Avançada do Google
+Name[ro]=Căutare avansată Google
+Name[ru]=Google - продвинутый поиск
+Name[rw]=Ishakisha Rihanitse rya Google
+Name[se]=Dárkilis ohcan Google báikkis
+Name[sk]=Pokročilé hľadanie Google
+Name[sl]=Napredno iskanje z Google
+Name[sr]=Google-ово напредно претраживање
+Name[sr@Latn]=Google-ovo napredno pretraživanje
+Name[ss]=Kusesha lokusembili kwe Google
+Name[sv]=Google avancerad sökning
+Name[ta]=கூகுல் மேம்படுத்தப்பட்ட தேடுதல்
+Name[te]=గూగుల్ మరింత నిసిస్టమైన అన్వెషణ
+Name[tg]=Ҷустуҷӯи пешрафта дар Google
+Name[th]=ค้นหาด้วยกูเกิ้ลแบบขั้นสูง
+Name[tr]=Google Gelişmiş Arayıcı
+Name[tt]=Google aşa Tögäl Ezläw
+Name[uk]=Складний пошук на Google
+Name[uz]=Google - Ilgʻor qidirish
+Name[uz@cyrillic]=Google - Илғор қидириш
+Name[ven]=U setsha ho Engedzeaho ha Google
+Name[vi]=Tra cứu Nâng cao Google
+Name[wa]=Ricweraedje avancî di Google
+Name[xh]=Uphendlo Olubhekisa phambili lwe Google
+Name[zh_CN]=Google 高级搜索
+Name[zh_TW]=Google 進階搜尋
+Name[zu]=Usesho lwezinga eliphezulu lwe-Google
+Query=http://www.google.com/search?as_q=\\{all,@}&num=\\{num,"10"}&btnG=Google+Search&as_epq=\\{exact,""}&as_oq=\\{any,""}&as_eq=\\{without,""}&lr=\\{lang,""}&as_ft=\\{ft,"i"}&as_filetype=\\{filetype,""}&as_qdr=\{date,"all"}&as_occt=\\{occ,"any"}&as_dt=\\{siteop,"i"}&as_sitesearch=\\{site}&safe=\\{safe,"active"}&ie=UTF-8&oe=UTF-8
+Query[en_GB]=http://www.google.co.uk/search?as_q=\\{all,@}&num=\\{num,"10"}&btnG=Google+Search&as_epq=\\{exact,""}&as_oq=\\{any,""}&as_eq=\\{without,""}&lr=\\{lang,""}&as_ft=\\{ft,"i"}&as_filetype=\\{filetype,""}&as_qdr=\{date,"all"}&as_occt=\\{occ,"any"}&as_dt=\\{siteop,"i"}&as_sitesearch=\\{site}&safe=\\{safe,"active"}&ie=UTF-8&oe=UTF-8
+Query[es]=http://www.google.com/search?as_q=\\{all,@}&num=\\{num,"10"}&btnG=Google+Search&as_epq=\\{exact,""}&as_oq=\\{any,""}&as_eq=\\{without,""}&lr=\\{lang,""}&as_ft=\\{ft,"i"}&as_filetype=\\{filetype,""}&as_qdr=\{date,"all"}&as_occt=\\{occ,"any"}&as_dt=\\{siteop,"i" }&as_sitesearch=\\{site}&safe=\\{safe, "active"}&ie=UTF-8&oe=UTF-8
+Query[fi]=http://www.google.fi/search?as_q=\\{all,@}&num=\\{num,"10"}&btnG=Google+Search&as_epq=\\{exact,""}&as_oq=\\{any,""}&as_eq=\\{without,""}&lr=\\{lang,""}&as_ft=\\{ft,"i"}&as_filetype=\\{filetype,""}&as_qdr=\{date,"all"}&as_occt=\\{occ,"any"}&as_dt=\\{siteop,"i"}&as_sitesearch=\\{site}&safe=\\{safe,"active"}&ie=UTF-8&oe=UTF-8
+Query[fr]=http://www.google.fr/search?as_q=\\{all,@}&num=\\{num,"10"}&btnG=Google+Search&as_epq=\\{exact,""}&as_oq=\\{any,""}&as_eq=\\{without,""}&lr=\\{lang,""}&as_ft=\\{ft,"i"}&as_filetype=\\{filetype,""}&as_qdr=\{date,"all"}&as_occt=\\{occ,"any"}&as_dt=\\{siteop,"i"}&as_sitesearch=\\{site}&safe=\\{safe,"active"}&ie=UTF-8&oe=UTF-8
+Query[he]=http://www.google.co.il/search?as_q=\\{all,@}&num=\\{num,"10"}&btnG=Google+Search&as_epq=\\{exact,""}&as_oq=\\{any,""}&as_eq=\\{without,""}&lr=\\{lang,""}&as_ft=\\{ft,"i"}&as_filetype=\\{filetype,""}&as_qdr=\{date,"all"}&as_occt=\\{occ,"any"}&as_dt=\\{siteop,"i"}&as_sitesearch=\\{site}&safe=\\{safe,"active"}&ie=UTF-8&oe=UTF-8
+Query[nb]=http://www.google.no/search?as_q=\\{all,@}&num=\\{num,"10"}&btnG=Google+Search&as_epq=\\{exact,""}&as_oq=\\{any,""}&as_eq=\\{without,""}&lr=\\{lang,""}&as_ft=\\{ft,"i"}&as_filetype=\\{filetype,""}&as_qdr=\{date,"all"}&as_occt=\\{occ,"any"}&as_dt=\\{siteop,"i"}&as_sitesearch=\\{site}&safe=\\{safe,"active"}&ie=UTF-8&oe=UTF-8
+Query[nl]=http://www.google.nl/search?as_q=\\{all,@}&num=\\{num,"10"}&btnG=Google+Search&as_epq=\\{exact,""}&as_oq=\\{any,""}&as_eq=\\{without,""}&lr=\\{lang,""}&as_ft=\\{ft,"i"}&as_filetype=\\{filetype,""}&as_qdr=\{date,"all"}&as_occt=\\{occ,"any"}&as_dt=\\{siteop,"i"}&as_sitesearch=\\{site}&safe=\\{safe,"active"}&ie=UTF-8&oe=UTF-8
+Query[nn]=http://www.google.com/search?hl=nn&as_q=\\{all,@}&num=\\{num,"10"}&btnG=Google+Search&as_epq=\\{exact,""}&as_oq=\\{any,""}&as_eq=\\{without,""}&lr=\\{lang,""}&as_ft=\\{ft,"i"}&as_filetype=\\{filetype,""}&as_qdr=\{date,"all"}&as_occt=\\{occ,"any"}&as_dt=\\{siteop,"i"}&as_sitesearch=\\{site}&safe=\\{safe,"active"}&ie=UTF-8&oe=UTF-8
+Query[pt]=http://www.google.pt/search?as_q=\\{all,@}&num=\\{num,"10"}&btnG=Google+Search&as_epq=\\{exact,""}&as_oq=\\{any,""}&as_eq=\\{without,""}&lr=\\{lang,""}&as_ft=\\{ft,"i"}&as_filetype=\\{filetype,""}&as_qdr=\{date,"all"}&as_occt=\\{occ,"any"}&as_dt=\\{siteop,"i"}&as_sitesearch=\\{site}&safe=\\{safe,"active"}&ie=UTF-8&oe=UTF-8
+Query[wa]=http://www.google.be/search?as_q=\\{all,@}&num=\\{num,"10"}&btnG=Google+Search&as_epq=\\{exact,""}&as_oq=\\{any,""}&as_eq=\\{without,""}&lr=\\{lang,""}&as_ft=\\{ft,"i"}&as_filetype=\\{filetype,""}&as_qdr=\{date,"all"}&as_occt=\\{occ,"any"}&as_dt=\\{siteop,"i"}&as_sitesearch=\\{site}&safe=\\{safe,"active"}&ie=UTF-8&oe=UTF-8
+Charset=utf8
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_groups.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_groups.desktop
new file mode 100644
index 000000000..ee9f24f3a
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_groups.desktop
@@ -0,0 +1,89 @@
+[Desktop Entry]
+Type=Service
+Name=Google Groups
+Name[af]=Google Groepe
+Name[ar]=مجموعات Google
+Name[az]=Google Qroupları
+Name[be]=Групы Google
+Name[bn]=গুগল্ গ্রুপস
+Name[br]=Stroladoù Google
+Name[bs]=Google Grupe
+Name[ca]=Grups a Google
+Name[cs]=Google - diskuzní skupiny
+Name[csb]=Google - archiwa diskùsjowëch karnów
+Name[cy]=Grwpiau Google
+Name[da]=Google-grupper
+Name[de]=Google-Newsgruppen
+Name[el]=Ομάδες του Google
+Name[eo]=Forumserĉo ĉe "Google"
+Name[es]=Grupos de Google
+Name[et]=Google uudisegrupid
+Name[eu]=Google taldeak
+Name[fa]=گروههای گوگل
+Name[fi]=Googlen keskusteluryhmät
+Name[fr]=Groupes Google
+Name[fy]=Google Diskusjegroepen
+Name[ga]=Grúpaí Google
+Name[gl]=Grupos de Google
+Name[he]=קבוצות גוגל
+Name[hi]=गूगल समूह
+Name[hr]=Google Grupe
+Name[is]=Google - Ráðstefnur
+Name[it]=Google gruppi
+Name[ja]=Google グループ
+Name[ka]=Google ჯგუფები
+Name[kk]=Google топтары
+Name[km]=ក្រុម Google
+Name[ko]=Google 그룹스
+Name[lt]=Google grupės
+Name[lv]=Google Grupas
+Name[mk]=Google-групи
+Name[mn]=Гооглэ-Мэдээлэл
+Name[ms]=Kumpulan Google
+Name[mt]=Gruppi Google
+Name[nb]=Google-grupper
+Name[ne]=गुगल समूह
+Name[nl]=Google Groepen
+Name[nso]=Dihlopha tsa Google
+Name[pa]=Google ਗਰੁੱਪ
+Name[pl]=Google - archiwum grup dyskusyjnych
+Name[pt]=Grupos do Google
+Name[pt_BR]=Grupos do Google
+Name[ro]=Grupuri Google
+Name[ru]=Группы Google
+Name[rw]=Amatsinda Google
+Name[sk]=Diskusné skupiny Google
+Name[sl]=Skupine Google
+Name[sr]=Google-ове групе
+Name[sr@Latn]=Google-ove grupe
+Name[ss]=Emacembu ye Google
+Name[sv]=Google-grupper
+Name[ta]=கூகுல் குழுக்கள்
+Name[te]=గూగుల్ గుంపులు
+Name[tg]=Гурӯҳҳои Google
+Name[th]=กลุ่มข่าวกูเกิ้ล
+Name[tr]=Google Grupları
+Name[tt]=Google Törkemnäre
+Name[uk]=Групи Google
+Name[uz]=Google - Guruhlar
+Name[uz@cyrillic]=Google - Гуруҳлар
+Name[ven]=Tshigwada tsha Google
+Name[vi]=Nhóm Google
+Name[wa]=Groupes Google
+Name[xh]=Amaqela e Google
+Name[zh_CN]=Google 兴趣组
+Name[zh_TW]=Google 群組
+Name[zu]=Amaqembu e-Google
+ServiceTypes=SearchProvider
+Keys=ggg,groups,dj,deja
+Query=http://groups.google.com/groups?oi=djq&as_q=\\{@}
+Query[en_GB]=http://groups.google.co.uk/groups?oi=djq&as_q=\\{@}
+Query[fr]=http://groups.google.fr/groups?oi=djq&as_q=\\{@}
+Query[he]=http://groups.google.co.il/groups?oi=djq&as_q=\\{@}
+Query[nb]=http://groups.google.no/groups?hl=nn&oi=djq&as_q=\\{@}
+Query[ne]=http://groups.google.com/groups?oi=djqas_q=\\{@}
+Query[nl]=http://groups.google.nl/groups?oi=djq&as_q=\\{@}
+Query[nn]=http://groups.google.com/groups?hl=nn&oi=djq&as_q=\\{@}
+Query[pt]=http://groups.google.pt/groups?oi=djq&as_q=\\{@}
+Query[wa]=http://groups.google.be/groups?oi=djq&as_q=\\{@}
+Query[zh_TW]=http://groups.google.com.tw/groups?oi=djq&as_q=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_images.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_images.desktop
new file mode 100644
index 000000000..e0b808df9
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_images.desktop
@@ -0,0 +1,94 @@
+[Desktop Entry]
+Type=Service
+Name=Google Image Search
+Name[af]=Google Beeld Soektog
+Name[ar]=بحث صور Google
+Name[az]=Google Rəsm Axtarıcısı
+Name[be]=Пошук відарысаў Google
+Name[bn]=গুগল্ চিত্র অনুসন্ধান
+Name[br]=Klask skeudennoù Google
+Name[bs]=Google traženje slika
+Name[ca]=Recerca d'imatges a Google
+Name[cs]=Hledání obrázků (Google)
+Name[csb]=Google - szëkba òbrôzków
+Name[cy]=Chwilio Delweddau Google
+Name[da]=Google billedsøgning
+Name[de]=Google-Bildsuche
+Name[el]=Αναζήτηση εικόνων του Google
+Name[eo]=Bildoserĉo ce "Google"
+Name[es]=Búsqueda de imágenes de Google
+Name[et]=Google piltide otsing
+Name[eu]=Google irudi bilaketa
+Name[fa]=جستجوی تصویر گوگل
+Name[fi]=Googlen kuvahaku
+Name[fo]=Google (myndaleiting)
+Name[fr]=Recherche d'images avec Google
+Name[fy]=Google printsjesykjen
+Name[ga]=Cuardach Íomhá Google
+Name[gl]=Procura de Imaxes de Google
+Name[he]=חיפוש תמונות של גוגל
+Name[hi]=गूगल छवि खोज
+Name[hr]=Google pretraživanje slika
+Name[hu]=Google képkereső
+Name[is]=Google - Myndaleit
+Name[it]=Ricerca immagini di Google
+Name[ja]=Google 画像検索
+Name[ka]=Google ნახატის ძიება
+Name[kk]=Google кескіндерді табу
+Name[km]=ស្វែងរក​រូបភាព​តាម​រយៈ Google
+Name[ko]=Google 이미지 검색
+Name[lt]=Google paveikslėlių paieška
+Name[lv]=Google Attēlu Meklēšana
+Name[mk]=Google - пребарување на слики
+Name[mn]=Гооглэ-Зураг хайлт
+Name[ms]=Carian Imej Google
+Name[mt]=Fittex stampi fuq Google
+Name[nb]=Bildesøk i Google
+Name[nds]=Google sien Biller-Söök
+Name[ne]=गुगल छवि खोजी
+Name[nl]=Google afbeeldingen zoeken
+Name[nn]=Google biletsøk
+Name[nso]=Nyako ya Ponagalo ya Google
+Name[pa]=Google ਚਿੱਤਰ ਖੋਜ
+Name[pl]=Google - wyszukiwanie zdjęć
+Name[pt]=Pesquisa de Imagens do Google
+Name[pt_BR]=Busca de Imagens do Google
+Name[ro]=Căutare de imagini Google
+Name[ru]=Рисунки Google
+Name[rw]=Ishakisha Ishusho Google
+Name[se]=Oza govaid Google báikkis
+Name[sk]=Hľadanie obrázkov Google
+Name[sl]=Iskanje slik z Google
+Name[sr]=Google-ово претраживање слика
+Name[sr@Latn]=Google-ovo pretraživanje slika
+Name[ss]=Kusesha kwemfanekiso ku Google
+Name[sv]=Google bildsökning
+Name[ta]=கூகுல் சித்திர தேடு
+Name[te]=గూగుల్ బొమ్మల అన్వెషణ
+Name[tg]=Ҷусуҷӯи тасвири Google
+Name[th]=ค้นหาภาพด้วยกูเกิ้ล
+Name[tr]=Google Resim Arayıcı
+Name[tt]=Google aşa Sürät Ezläw
+Name[uk]=Пошук зображень на Google
+Name[uz]=Google - Rasm qidirish
+Name[uz@cyrillic]=Google - Расм қидириш
+Name[ven]=U setsha nga Tshivhoni tsha Google
+Name[vi]=Tìm kiếm Hình ảnh Google
+Name[wa]=Cweraedje d' imådjes avou Google
+Name[xh]=Uphendlo Lomfanekiso we Google
+Name[zh_CN]=Google 图像搜索
+Name[zh_TW]=Google 圖片搜尋
+Name[zu]=Ukusesha isithombe kwe-Google
+ServiceTypes=SearchProvider
+Keys=ggi,images
+Query=http://images.google.com/images?q=\\{@}
+Query[en_GB]=http://images.google.co.uk/images?q=\\{@}
+Query[fr]=http://images.google.fr/images?q=\\{@}
+Query[he]=http://images.google.co.il/images?q=\\{@}
+Query[nb]=http://images.google.no/images?hl=nn&q=\\{@}
+Query[nl]=http://images.google.nl/images?q=\\{@}
+Query[nn]=http://images.google.com/images?hl=nn&q=\\{@}
+Query[pt]=http://images.google.pt/images?q=\\{@}
+Query[ru]=http://images.google.com/images?q=\\{@}&hl=ru&ie=UTF-8&oe=UTF-8
+Query[wa]=http://images.google.be/images?q=\\{@}
+Query[zh_TW]=http://images.google.com.tw/images?q=\\{@}&hl=zh-TW
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_lucky.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_lucky.desktop
new file mode 100644
index 000000000..f72e175d6
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_lucky.desktop
@@ -0,0 +1,94 @@
+[Desktop Entry]
+Type=Service
+Name=Google (I'm Feeling Lucky)
+Name[af]=Google (Vat 'n kaans)
+Name[ar]=Google (ضربة حظ)
+Name[az]=Google (Eləbil Bəxtim Gətirəcək)
+Name[be]=Google (Мне пашанцуе)
+Name[bg]=Google (I"m Feeling Lucky)
+Name[bn]=গুগল্ (ভাগ্যবান মনে করছি)
+Name[bs]=Google (Osjećam se sretno)
+Name[ca]=Google (Avui tinc sort!)
+Name[cs]=Google (Zkusím štěstí)
+Name[csb]=Google - "Szczestlëwé trafienié"
+Name[cy]=Google(Dwi'n Teimlo'n Lwcus)
+Name[da]=Google (Jeg føler mig heldig)
+Name[de]=Google ("Auf gut Glück!")
+Name[el]=Google (Αισθάνομαι τυχερός)
+Name[eo]=Google (je bonŝanco)
+Name[es]=Google (Me siento afortunado)
+Name[et]=Google (Ehk veab)
+Name[eu]=Google (Zorte onean nago)
+Name[fa]=گوگل )یا شانس و یا اقبال(
+Name[fi]=Google (Kokeile onneasi)
+Name[fo]=Google (ein heppin dagur)
+Name[fr]=Google (J'ai de la chance)
+Name[fy]=Google (Ik doch in gok)
+Name[ga]=Google (Tá an t-ádh orm inniu)
+Name[gl]=Google (Sinto-me Afortunado)
+Name[he]=גוגל (יותר מזל משכל)
+Name[hi]=गूगल (आज मेरी क़िस्मत चमक़ी है)
+Name[hr]=Google (osjećam se sretnim)
+Name[is]=Google (Ég er heppin(n) í dag)
+Name[it]=Google (Mi sento fortunato)
+Name[ka]=Google (გამიმართლა)
+Name[kk]=Google (Сәтті сынап көрелік)
+Name[km]=Google (ខ្ញុំ​មាន​អារម្មណ៍​ថា​សំណាង)
+Name[ko]=Google (운 좋은 예감)
+Name[lt]=Google (Man sekasi!)
+Name[lv]=Google (Es jūtos laimīgs)
+Name[mk]=Google Од прва рака
+Name[mn]=Гооглэ ("Азтай байг!")
+Name[ms]=Google (Saya Rasa Bertuah)
+Name[mt]=Google (inħossni xxurtjat)
+Name[nb]=Google (prøv lykken)
+Name[nds]=Google op goot Glück
+Name[ne]=गुगल (मैले भाग्यमानी अनुभव गर्दैछु)
+Name[nl]=Google (Ik doe een gok)
+Name[nn]=Google (Eg prøver lykka)
+Name[nso]=Google (Ke Ikwa Mahlatse)
+Name[pa]=Google (ਮੈਂ ਖੁਸ਼ਨਸੀਬ ਹਾਂ)
+Name[pl]=Google - "Szczęśliwy traf"
+Name[pt]=Google (Sinto-me Com Sorte)
+Name[pt_BR]=Google (Estou com sorte)
+Name[ro]=Google (Mă simt norocos)
+Name[ru]=Google (Мне повезёт!)
+Name[rw]=Google (Ndumva Nezerewe)
+Name[se]=Google (Geahččalan lihkku)
+Name[sk]=Google (Cítim sa štastne)
+Name[sl]=Google (Počutim se srečnega)
+Name[sr]=Google (Добијам из прве)
+Name[sr@Latn]=Google (Dobijam iz prve)
+Name[ss]=Google (Ngitiva nginenhlanhla)
+Name[sv]=Google (Jag har tur)
+Name[ta]=கூகுல் (நான் அதிர்ஷ்டசாலியாக உணர்கிறேன்)
+Name[te]=గూగుల్ (నెరుగా వెబ్ లొ ప్రవేశించు)
+Name[tg]=Google (Бо бахт ва бо иқбол)
+Name[th]=Google (ดีใจจัง ค้นแล้วเจอเลย)
+Name[tr]=Google
+Name[tt]=Google (Yaqşı Sizämen!)
+Name[uk]=Google (Я - везунчик)
+Name[uz]=Google (Omadim borga oʻxshaydi)
+Name[uz@cyrillic]=Google (Омадим борга ўхшайди)
+Name[ven]=Google (Ndi pfa ndina Mashudu)
+Name[vi]=Google (Xem một trang)
+Name[wa]=Cweraedje d' imådjes avou Google (Dji tchai roed dsu)
+Name[zh_CN]=Google (手气不错)
+Name[zh_TW]=Google (好手氣)
+Name[zu]=Google (Ngizizwa Ngisenhlanhleni)
+ServiceTypes=SearchProvider
+Keys=ggl,gglucky
+Query=http://www.google.com/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8
+Query[csb]=http://www.google.pl/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8
+Query[en_GB]=http://www.google.co.uk/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8
+Query[fi]=http://www.google.fi/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8
+Query[fr]=http://www.google.fr/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8
+Query[he]=http://www.google.co.il/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8
+Query[it]=http://www.google.it/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8
+Query[nb]=http://www.google.no/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8
+Query[nl]=http://www.google.nl/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8
+Query[pl]=http://www.google.pl/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8
+Query[pt]=http://www.google.pt/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8
+Query[wa]=http://www.google.be/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8
+Query[zh_TW]=http://www.google.com.tw/search?q=\\{@}&btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8&hl=zh-TW
+Charset=utf8
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_movie.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_movie.desktop
new file mode 100644
index 000000000..47d53118f
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_movie.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Type=Service
+Name=Google Movies
+Name[af]=Google Films
+Name[ar]=أفلام Google
+Name[be]=Фільмы Google
+Name[bn]=গুগল্ মুভিস্
+Name[br]=Filmoù Google
+Name[bs]=Google filmovi
+Name[ca]=Pel·lícules Google
+Name[cs]=Google filmy
+Name[csb]=Google - filmë
+Name[da]=Google film
+Name[de]=Google Filme
+Name[el]=Google ταινίες
+Name[eo]=Google Filmoj
+Name[es]=Películas de Google
+Name[eu]=Google pelikulak
+Name[fa]=فیلمهای Google
+Name[fi]=Googlen elokuvat
+Name[fr]=Google Vidéos
+Name[fy]=Google Films
+Name[ga]=Scannáin Google
+Name[gl]=Películas de Google
+Name[he]=הסרטים של גוגל
+Name[hr]=Google filmovi
+Name[is]=Google kvikmyndir
+Name[it]=Google filmati
+Name[ka]=Google ფილმები
+Name[kk]=Google фильмдер
+Name[km]=កុនតាម​រយៈ Google
+Name[ko]=Google 영화
+Name[lt]=Google filmai
+Name[mk]=Google - филмови
+Name[ms]=Wayang Google
+Name[nb]=Google, filmer
+Name[nds]=Google Filmen
+Name[ne]=गुगल चलचित्र
+Name[nn]=Google filmar
+Name[pa]=Google ਫਿਲਮਾਂ
+Name[pl]=Google - filmy
+Name[pt]=Filmes do Google
+Name[ro]=Filme Google
+Name[ru]=Видео Google
+Name[rw]=Filimi za Google
+Name[se]=Google filmmat
+Name[sk]=Google filmy
+Name[sr]=Google филмови
+Name[sr@Latn]=Google filmovi
+Name[sv]=Google filmer
+Name[ta]=கூகுல் படங்கள்
+Name[te]=గూగుల్ చలనచిత్రాలు
+Name[tg]=Филмҳои Google
+Name[th]=ค้นหาภาพยนตร์ด้วยกูเกิ้ล
+Name[tr]=Google Filmleri
+Name[tt]=Google Tasmaları
+Name[uk]=Фільми на Google
+Name[uz]=Google - Kino
+Name[uz@cyrillic]=Google - Кино
+Name[vi]=Tìm phim ảnh qua Google
+Name[zh_TW]=Google 電影
+ServiceTypes=SearchProvider
+Keys=ggmovie
+Query=http://www.google.com/search?q=movie:\{@}&ie=UTF-8&oe=UTF-8
+Query[csb]=http://www.google.pl/search?q=movie:\{@}&ie=UTF-8&oe=UTF-8
+Query[en_GB]=http://www.google.co.uk/search?q=movie:\{@}&ie=UTF-8&oe=UTF-8
+Query[he]=http://www.google.co.il/search?q=movie:\{@}&ie=UTF-8&oe=UTF-8
+Query[ja]=http://www.google.com/search?q=movie:\\{@}&ie=UTF-8&oe=UTF-8
+Query[ko]=http://www.google.com/search?q=movie:\\{@}&ie=UTF-8&oe=UTF-8
+Query[nb]=http://www.google.no/search?q=movie:\{@}&ie=UTF-8&oe=UTF-8
+Query[ne]=http://www.google.com/search?q=movie:\{@}ie=UTF-8&oe=UTF-8
+Query[nn]=http://www.google.no/search?q=movie:\{@}&ie=UTF-8&oe=UTF-8
+Query[pl]=http://www.google.pl/search?q=movie:\{@}&ie=UTF-8&oe=UTF-8
+Query[tg]=http://www.google.com/search?q=филми:\\{@}&ie=UTF-8&oe=UTF-8
+Query[zh_TW]=http://www.google.com.tw/search?q=movie:\{@}&ie=UTF-8&oe=UTF-8&hl=zh-TW
+Charset=utf8
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_news.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_news.desktop
new file mode 100644
index 000000000..f8521c3a3
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/google_news.desktop
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Name=Google News
+Name[af]=Google Nuus
+Name[ar]=أخبار Google
+Name[az]=Google Xəbərlər
+Name[be]=Навіны Google
+Name[bn]=গুগল্ সংবাদ
+Name[br]=Keleier Google
+Name[bs]=Google vijesti
+Name[ca]=Notícies de Google
+Name[csb]=Google - nowinë
+Name[cy]=Newyddion Google
+Name[da]=Google nyheder
+Name[el]=Google νέα
+Name[eo]=Google Novaĵoj
+Name[es]=Noticias de Google
+Name[fa]=اخبار گوگل
+Name[fi]=Googlen uutiset
+Name[fr]=Google Informations
+Name[fy]=Google-nijs
+Name[ga]=Nuacht Google
+Name[gl]=Novas de Google
+Name[he]=חדשות גוגל
+Name[hi]=गूगल समाचार
+Name[hr]=Google novosti
+Name[hu]=Google hírek
+Name[is]=Google fréttir
+Name[it]=Google notizie
+Name[ja]=Google ニュース
+Name[ka]=Google სიახლეები
+Name[kk]=Google жаңалықтар
+Name[km]=ព័ត៌មាន​តាម​រយៈ Google
+Name[ko]=Google 뉴스
+Name[lt]=Google naujienos
+Name[lv]=Google Ziņas
+Name[mk]=Google Вести
+Name[mn]=Гооглэ мэдээ
+Name[ms]=Berita Google
+Name[mt]=Aħbarijiet Google
+Name[nb]=Google nyheter
+Name[nds]=Google Narichten
+Name[ne]=गुगल समाचार
+Name[nl]=Google-nieuws
+Name[nn]=Google nyhende
+Name[pa]=Google ਖ਼ਬਰਾਂ
+Name[pl]=Google - wiadomości
+Name[pt]=Notícias Google
+Name[pt_BR]=Notícias do Google
+Name[ro]=Știri Google
+Name[ru]=Новости Google
+Name[rw]=Amakuru za Google
+Name[se]=Google ođđasat
+Name[sk]=Google správy
+Name[sr]=Google новости
+Name[sr@Latn]=Google novosti
+Name[sv]=Google diskussionsgrupper
+Name[ta]=கூகுல் செய்திகள்
+Name[te]=గూగుల్ వార్తలు
+Name[tg]=Ахбори Google
+Name[th]=ข่าวจากกูเกิ้ล
+Name[tr]=Google Haberleri
+Name[tt]=Google Yañalıqları
+Name[uk]=Новини Google
+Name[uz]=Google - Yangiliklar
+Name[uz@cyrillic]=Google - Янгиликлар
+Name[vi]=Tin tức Google
+Name[wa]=Noveles Google
+Name[zh_CN]=Google 新闻
+Name[zh_TW]=Google 新聞
+ServiceTypes=SearchProvider
+Keys=ggn,googlenews
+Query=http://news.google.com/news?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[en_GB]=http://news.google.co.uk/news?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[fi]=http://news.google.fi/news?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[fr]=http://news.google.fr/news?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[he]=http://news.google.co.il/news?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[it]=http://news.google.it/news?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[nb]=http://news.google.no/news?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[ne]=http://news.google.com/news?q=\\{@}ie=UTF-8&oe=UTF-8
+Query[nl]=http://news.google.nl/news?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[pt]=http://news.google.pt/news?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[wa]=http://news.google.be/news?q=\\{@}&ie=UTF-8&oe=UTF-8
+Query[zh_TW]=http://news.google.com.tw/news?q=\\{@}&ie=UTF-8&oe=UTF-8&hl=zh-TW
+Charset=utf8
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/gracenote.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/gracenote.desktop
new file mode 100644
index 000000000..04a6655c8
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/gracenote.desktop
@@ -0,0 +1,17 @@
+[Desktop Entry]
+Type=Service
+Name=Gracenote
+Name[bn]=গ্রেস-নোট
+Name[eo]=Ornamaĵo
+Name[hi]=ग्रेसनोट
+Name[ne]=ग्रेसनोट
+Name[pa]=ਗਰੇਸਨੋਟ
+Name[rw]=AkandikoImpuwe
+Name[ta]=க்ரேஸ்நோட்
+Name[te]=గ్రెస్ నోట్
+Name[th]=Gracenote ค้นหาดนตรี, วิดิโอ
+Name[vi]=Tra Gracenote
+ServiceTypes=SearchProvider
+Keys=gn,gracenote
+Query=http://www.gracenote.com/music/search-adv.html?q=\\{@}
+Charset=utf8
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/grec.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/grec.desktop
new file mode 100644
index 000000000..295637533
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/grec.desktop
@@ -0,0 +1,65 @@
+[Desktop Entry]
+Charset=ISO-8859-15
+Hidden=false
+Keys=grec
+Name=Great Dictionary of the Catalan Language (GRan Enciclopèdia Catalana)
+Name[af]=Groot woordeboek van die Catalan Taal
+Name[be]=Вялікі слоўнік каталонскай мовы (GRan Enciclopèdia Catalana)
+Name[bn]=কাটালান ভাষার অভিধান (GRan Enciclopèdia Catalana)
+Name[bs]=Veliki rječnik katalonskog jezika (GRan Enciclopèdia Catalana)
+Name[ca]=Gran diccionari de la Llengua Catalana (Grup Enciclopèdia Catalana)
+Name[cs]=Velký katalánský slovník (GRan Enciclopèdia Catalana)
+Name[csb]=Wiôldżi słowôrz katalońsczégò jãzëka (GRan Enciclopèdia Catalana)
+Name[da]=Storartet ordbog for det katalanske sprog (GRan Enciclopèdia Catalana)
+Name[de]=Großes Wörterbuch der Katalanischen Sprache (GRan Enciclopèdia Catalana)
+Name[el]=Μεγάλο Λεξικό της Καταλανικής Γλώσσας (GRan Enciclopèdia Catalana)
+Name[eo]=Granda Vortaro de la Kataluna lingvo (GRan Enciclopèdia Catalana)
+Name[es]=Gran enciclopedia catalana
+Name[et]=Suur katalaani sõnaraamat (GRan Enciclopèdia Catalana)
+Name[eu]=Katalaniera hiztegia (GRan Enciclopèdia Catalana)
+Name[fa]=واژه‌نامۀ بزرگ زبان کاتالان (GRan Enciclopèdia Catalana)
+Name[fi]=Catalanian suuri sanakirja (GRan Enciclopèdia Catalana)
+Name[fr]=Grand dictionnaire du langage catalan (GRan Enciclopèdia Catalana)
+Name[ga]=OllFhoclóir Catalóinise (GRan Enciclopèdia Catalana)
+Name[gl]=Grande Enciclopèdia Catalana
+Name[he]=המילון הגדול של השפה הקטלנית (GRan Enciclopèdia Catalana)
+Name[hr]=Veliki rječnik katalonskog jezika (GRan Enciclopèdia Catalana)
+Name[hu]=Katalán nagyszótár (GRan Enciclopèdia Catalana)
+Name[is]=Stóra orðabók katalónska tungumálsins (GRan Enciclopèdia Catalana)
+Name[it]=Grande dizionario della lingua catalana (GRan Enciclopèdia Catalana)
+Name[ja]=カタロニア語大辞典 (GRan Enciclopèdia Catalana)
+Name[kk]=Каталан тілдің үлкен сөздігі (GRan Enciclopèdia Catalana)
+Name[km]=វចនានុក្រម​ភាសា​កាតាឡាន (GRan Enciclopèdia Catalana)
+Name[ko]=카탈루냐어 대사전 (GRan Enciclopèdia Catalana)
+Name[lt]=Puikus katalonų kalbos žodynas (GRan Enciclopèdia Catalana)
+Name[mk]=Голем речник на каталонскиот јазик (GRan Enciclopèdia Catalana)
+Name[ms]=Kamus Besar Bahasa Catalan (GRan Enciclopèdia Catalana)
+Name[nb]=Den store, katalanske ordboka (GRan Enciclopèdia Catalana)
+Name[nds]=Groot Wöörbook vun de Katalaansche Spraak (GRan Enciclopèdia Catalana)
+Name[ne]=क्याटालान भाषाको ठूलो शब्दकोश (GRan इनसाइक्लोपिडीया कातालान)
+Name[nl]=Catalaanse Encyclopedie
+Name[nn]=Den store, katalanske ordboka (GRan Enciclopèdia Catalana)
+Name[pa]=ਕਾਟਾਲਾਨ ਭਾਸ਼ਾ ਲਈ ਮਹਾਨ ਕੋਸ਼ (GRan ਵਿਸ਼ਵਕੋਸ਼ ਕਾਟਾਲਾਨਾ)
+Name[pl]=Wielki słownik języka katalońskiego (GRan Enciclopèdia Catalana)
+Name[pt]=Grande Dicionário da Língua Catalã (GRan Enciclopèdia Catalana)
+Name[pt_BR]=Dicionário no Idioma Catalão (GRan Enciclopèdia Catalana)
+Name[ru]=Большой словарь каталонского языка (GRan Enciclopèdia Catalana)
+Name[rw]=Inkoranyamagambo Nini y'Ururimi rwa Katalani (GRan Enciclopèdia Catalana)
+Name[se]=Katalangiela stuorra sátnegirji (GRan Enciclopèdia Catalana)
+Name[sk]=Veľký slovník katalánskeho jazyka (GRan Enciclopèdia Catalana)
+Name[sl]=Veliki slovar katalonščine (GRan Enciclopèdia Catalana)
+Name[sr]=Велики речник каталонског језика (Gran Enciclopèdia Catalana)
+Name[sr@Latn]=Veliki rečnik katalonskog jezika (Gran Enciclopèdia Catalana)
+Name[sv]=Stor ordbok för katalanska språket (Gran Enciclopèdia Catalana)
+Name[ta]=கேடலன் மொழியின் அகராதி (GRan Enciclopèdia Catalana)
+Name[tg]=Ташкилдиҳии луғат барои забони Catalan (GRan Enciclopèdia Catalana)
+Name[th]=พจนานุกรมที่ยิ่งใหญ่ของภาษาคาตะลาน(GRan Enciclopรจdia Catalana)
+Name[tr]=Katalanca Büyük Sözlük (GRan Enciclopèdia Catalana)
+Name[tt]=Katalan Teleneñ Olı Süzlege
+Name[uk]=Великий словник каталонської мови (GRan Enciclopèdia Catalana)
+Name[vi]=Tra Từ điển Lớn của tiếng Catalan (GRan Enciclopèdia Catalana)
+Name[wa]=Grand motî do catalan lingaedje (GRan Enciclopèdia Catalana)
+Name[zh_TW]=很棒的加泰隆尼亞語文字典 (GRan Enciclopèdia Catalana)
+Query=http://www.grec.net/cgibin/lexicx.pgm?GECART=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/hotbot.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/hotbot.desktop
new file mode 100644
index 000000000..c555088ac
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/hotbot.desktop
@@ -0,0 +1,18 @@
+[Desktop Entry]
+Type=Service
+Name=Hotbot
+Name[bn]=হটবট
+Name[csb]=Hotbot - szëkôrz starnów WWW
+Name[hi]=हॉटबॉट
+Name[ne]=हटबोट
+Name[pa]=ਹੋਟਬੋਟ
+Name[pl]=Hotbot - wyszukiwarka stron WWW
+Name[ta]=ஹாட்பாட்
+Name[te]=హాట్ బాట్
+Name[ven]=Bot yau fhisa
+Name[vi]=Tra Hotbot
+ServiceTypes=SearchProvider
+Keys=hb,hotbot
+Query=http://hotbot.lycos.com/?MT=\\{@}&SM=MC&DV=0&LG=any&DC=10&DE=2
+Query[en_GB]=http://search.hotbot.co.uk/cgi-bin/pursuit?query=\\{@}&cat=hb_loc&enc=utf-8&SITE=uk&command=
+Query[ne]=http://hotbot.lycos.com/?MT=\\{@}SM=MC&DV=0&LG=any&DC=10&DE=2
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/hyperdictionary.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/hyperdictionary.desktop
new file mode 100644
index 000000000..54627f6c6
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/hyperdictionary.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Type=Service
+Name=HyperDictionary.com
+Name[csb]=HyperDictionary.com - słowôrz
+Name[hi]=हायपर-डिक्शनरी.कॉम
+Name[hu]=HyperDirectory.com
+Name[pl]=HyperDictionary.com - słownik
+Name[sv]=Hyperdictionary.com
+Name[ta]=திறந்த அடைவு
+ServiceTypes=SearchProvider
+Keys=hd,hyperdict
+Query=http://www.hyperdictionary.com/search.aspx?define=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/hyperdictionary_thesaurus.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/hyperdictionary_thesaurus.desktop
new file mode 100644
index 000000000..aa66572c4
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/hyperdictionary_thesaurus.desktop
@@ -0,0 +1,65 @@
+[Desktop Entry]
+Type=Service
+Name=HyperDictionary.com Thesaurus
+Name[ar]=مرادفات HyperDictionary.com
+Name[az]=HyperDictionary.com Tezaurus
+Name[be]=Тэзаўрус HyperDictionary.com
+Name[bn]=HyperDictionary.com থেসরাস (সমার্থক ও বিপরীত শব্দ)
+Name[br]=Tezorus HyperDictionary.com
+Name[bs]=HyperDictionary.com rječnik
+Name[cs]=Tezaurus HyperDictionary.com
+Name[csb]=HyperDictionary.com - słowôrz blëskòznacznëch słów (thesarus)
+Name[cy]=Thesawrws HyperDictionary.com
+Name[de]=HyperDictionary.com: Thesaurus
+Name[el]=Θησαυρός λέξεων HyperDictionary.com
+Name[eo]=HyperDictionary.com-tezaŭro
+Name[es]=Tesaurus de HyperDictionary.com
+Name[et]=HyperDictionary.com tesaurus
+Name[eu]=HyperDictionary.com Thesaurus-a
+Name[fa]=فرهنگ جامع HyperDictionary.com
+Name[fi]=HyperDictionary.com-sanakirja
+Name[fr]=Thésaurus HyperDictionary.com
+Name[ga]=Teasáras HyperDictionary.com
+Name[he]=HyperDictionary.com - מילים נרדפות
+Name[hi]=हायपर-डिक्शनरी.कॉम समांतर शब्दकोश
+Name[hr]=HyperDictionary.com rječnik sinonima
+Name[hu]=HyperDictionary.com szinonimaszótár
+Name[is]=HyperDictionary.com samheitaorðabók
+Name[it]=Sinonimi HyperDictionary.com
+Name[ja]=HyperDictionary.com シソーラス
+Name[ka]=Тезаурус HyperDictionary.com
+Name[kk]=HyperDictionary.com тезаурус
+Name[km]=កម្រង​វេវចនសព្ទ HyperDictionary.com
+Name[ko]=HyperDictionary.com 시소러스
+Name[lt]=Merriam-Webster sinonimų žodynas
+Name[lv]=HyperDictionary.com Tēzaurs
+Name[mk]=HyperDictionary.com Енциклопедија
+Name[mt]=Teżawru HyperDictionary.com
+Name[nb]=HyperDictionary.com, synonymordbok
+Name[nds]=HyperDictionary.com-Synonümwöörbook
+Name[pa]=HyperDictionary.com ਥੀਸਾਰਸ ਕੋਸ਼
+Name[pl]=HyperDictionary.com - słownik wyrazów bliskoznacznych
+Name[pt]=Gramática do HyperDictionary.com
+Name[ro]=Dicționarul HyperDictionary.com
+Name[ru]=Тезаурус HyperDictionary.com
+Name[rw]=Impuzansobanuro HyperDictionary.com
+Name[sk]=HyperDictionary.com - slovník synoným
+Name[sl]=Tezaver HyperDictionary.com
+Name[sr]=Речник синонима на HyperDictionary.com
+Name[sr@Latn]=Rečnik sinonima na HyperDictionary.com
+Name[sv]=HyperDictionary.com synonymlexikon
+Name[ta]=HyperDictionary.com சொற்களஞ்சியம்
+Name[th]=HyperDictionary.com อรรถาพิธาน
+Name[tr]=HyperDictionary.com Terimler
+Name[tt]=HyperDictionary.com Süznämäse
+Name[uk]=Словник синонімів HyperDictionary.com
+Name[uz]=HyperDictionary.com lugʻati
+Name[uz@cyrillic]=HyperDictionary.com луғати
+Name[vi]=Từ điển đồng nghĩa HyperDictionary.com
+Name[wa]=HyperDictionary.com
+Name[zh_CN]=HyperDictionary.com 宝藏
+Name[zh_TW]=HyperDictionary.com 辭典
+ServiceTypes=SearchProvider
+Keys=hdt,hd-ths,hd-thesaurus
+Query=http://www.hyperdictionary.com/search.aspx?Dict=T&define=\\{@}
+Query[ne]=http://www.hyperdictionary.com/search.aspx?Dict=Tdefine=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/imdb.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/imdb.desktop
new file mode 100644
index 000000000..c2dc64cd3
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/imdb.desktop
@@ -0,0 +1,74 @@
+[Desktop Entry]
+Type=Service
+Name=Internet Movie Database
+Name[af]=Internet Film Databasis
+Name[ar]=قاعدة بيانات الأفلام على الإنترنت
+Name[az]=İnternet Film Databeyzi
+Name[be]=База звестак аб фільмах
+Name[bn]=ইন্টারনেট চলচ্চিত্র ডেটাবেস
+Name[br]=Stlennvon filmoù Internet
+Name[bs]=Internet baza filmova
+Name[ca]=Base de dades de pel·lícules a Internet
+Name[cs]=Internetová databáze filmů
+Name[csb]=Internetowô baza filmów (IMDB)
+Name[cy]=Cronfa Ffilmiau y Rhyngrwyd
+Name[da]=Internetfilm-database
+Name[de]=Internet-Filmdatenbank
+Name[el]=Βάση δεδομένων ταινιών στο διαδίκτυο
+Name[eo]=Reta Filmdatumbazo
+Name[es]=Base de datos de internet de películas
+Name[et]=Interneti filmide andmebaas
+Name[eu]=Interneteko filmeen datu-basea
+Name[fa]=دادگان فیلم اینترنت
+Name[fy]=Ynternetfilm-databank
+Name[gl]=Base de Datos de Filmes de Internet
+Name[he]=מסד נתונים מקוון לסרטים
+Name[hi]=इंटरनेट चलचित्र डाटाबेस
+Name[hr]=Internetska baza podataka filmova
+Name[hu]=Internetes filmadatbázis (IMDb)
+Name[is]=Internet kvikmyndagagnagrunnurinn
+Name[it]=Database internet dei film
+Name[ja]=インターネット映画データベース
+Name[kk]=Internet фильмдер қоры
+Name[km]=មូលដ្ឋាន​ទិន្នន័យ​ភាពយន្ត​តាម​អ៊ិនធឺណិត
+Name[ko]=인터넷 영화 데이터베이스
+Name[lo]=ເດມອນ Write ຂອງ KDE
+Name[lt]=Interneto kinofilmų duomenų bazė
+Name[lv]=Interneta Filmu Datubāze
+Name[mk]=Интернет база на филмови
+Name[mn]=Интернэт кино өгөгдлийн бааз
+Name[ms]=Pangkalan Data Wayang Internet
+Name[nb]=Internett filmdatabase
+Name[nds]=Internet-Filmdatenbank
+Name[ne]=इन्टरनेट चलचित्र डेटावेस
+Name[nl]=Internetfilm-database
+Name[pa]=ਇੰਟਰਨੈੱਟ ਫਿਲਮ ਡਾਟਾਬੇਸ
+Name[pl]=Internetowa baza filmów (IMDB)
+Name[pt_BR]=Base de dados de filmes na Internet
+Name[ro]=Bază de date Internet de filme
+Name[ru]=Интернет-база кинофильмов (imdb)
+Name[rw]=Ububikoshingiro bwa Filimi Interineti
+Name[sk]=Internetová databáza filmov
+Name[sl]=Internetna zbirka filmov
+Name[sr]=База података о филмовима на Интернету
+Name[sr@Latn]=Baza podataka o filmovima na Internetu
+Name[sv]=Internet filmdatabas
+Name[ta]=வலைதள திரைப்பட தகவல்தளம்
+Name[te]=ఇంటర్నెట్ చలన చిత్ర డాటాబేస్
+Name[tg]=Базаи иттилооти филм дар интернет
+Name[th]=ฐานข้อมูลภาพยนตร์
+Name[tr]=İnternet Film Veritabanı
+Name[tt]=Päräwezdäge Tasmalar Biremlege
+Name[uk]=База даних кінофільмів в Інтернет
+Name[uz]=Internetdagi kino maʼlumot bazasi
+Name[uz@cyrillic]=Интернетдаги кино маълумот базаси
+Name[vi]=Cơ sở dữ liệu Phim ảnh trên Mạng
+Name[wa]=Båze di dnêyes di films sol Daegntoele
+Name[zh_CN]=互联网电影数据库
+Name[zh_TW]=Internet 電影資料庫
+ServiceTypes=SearchProvider
+Keys=imdb
+Query=http://imdb.com/Find?\\{@}
+Query[en_GB]=http://imdb.co.uk/Find?\\{@}
+Query[it]=http://italian.imdb.com/Find?\\{@}
+
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/it2en.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/it2en.desktop
new file mode 100644
index 000000000..cc4b867f8
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/it2en.desktop
@@ -0,0 +1,75 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=it2en
+Name=WordReference.com Translation: Italian to English
+Name[af]=WordReference.com Vertaling: Italiaans na Engels
+Name[ar]=ترجمة WordReference.com: الإيطالية إلى الإنجليزية
+Name[az]=WordReference.com Tərcümə: İtalyancadan İngiliscəyə
+Name[be]=WordReference.com Пераклад: з італійскай на англійскую
+Name[bn]=WordReference.com অনুবাদ: ইতালীয় থেকে ইংরাজি
+Name[bs]=WordReference.com prijevod: italijanski u engleski
+Name[ca]=Traducció WordReference.com: Italià - Anglès
+Name[cs]=Překlad WordReference.com: z italštiny do angličtiny
+Name[csb]=WordReference.com: italsczi -> anielsczi
+Name[cy]=Cyfieithiad WordReference.com: Eidaleg i Saesneg
+Name[da]=WordReference.com oversættelse: Italiensk til engelsk
+Name[de]=WordReference.com-Übersetzung: Italienisch/Englisch
+Name[el]=WordReference.com Μετάφραση: Ιταλικά σε Αγγλικά
+Name[eo]=WordReference.com Traduko: itala al angla
+Name[es]=WordReference.com Traducción: italiano a inglés
+Name[et]=WordReference.com tõlkimine: itaalia->inglise
+Name[eu]=WordReference.com Itzulpena: italieratik ingelesera
+Name[fa]=ترجمۀ WordReference.com: ایتالیایی به انگلیسی
+Name[fi]=WordReference.com-käännös: italiasta englanniksi
+Name[fr]=Traduction sur WordReference.com : Italien en Anglais
+Name[fy]=WordReference.com-oersetting: Italiaansk nei Ingelsk
+Name[ga]=Aistriúchán WordReference.com: Iodáilis go Béarla
+Name[gl]=Tradución WordReference.com: Italiano a Inglés
+Name[he]=תרגום WordReference.com: איטלקי־אנגלי
+Name[hi]=WordReference.com अनुवादः इतालवी से अंग्रेजी
+Name[hr]=WordReference.com Prijevod: talijanski na engleski
+Name[hu]=WordReference.com fordítás: olaszról angolra
+Name[is]=WordReference.com þýðing: Ítölsk/ensk
+Name[it]=Traduzione WordReference.com: dall'italiano all'inglese
+Name[ja]=WordReference.com イタリア語-英語翻訳
+Name[kk]=WordReference.com итальян тілінен ағылшынға аудару
+Name[km]=WordReference.com ៖ បកប្រែ​ពី​ភាសា​អ៊ីតាលី​ទៅ​អង់គ្លេស
+Name[ko]=WordReference.com 번역: 이탈리아어에서 영어로
+Name[lt]=WordReference.com vertimas: iš italų į anglų
+Name[lv]=WordReference.com Tulkošana: no Itāļu uz Angļu
+Name[mk]=WordReference.com превод: од италијански на англиски
+Name[mt]=Traduzzjoni WordReference.com: Taljan għall-Ingliż
+Name[nb]=WordReference.com – oversettelse fra italiensk til engelsk
+Name[nds]=WordReference.com Översetten: Italieensch na Engelsch
+Name[ne]=WordReference.com Translation: इटालियनलाई अङ्ग्रेजीमा
+Name[nl]=WordReference.com-vertaling: Italiaans naar Engels
+Name[nn]=WordReference.com – omsetjing: italiensk til engelsk
+Name[pa]=WordReference.com ਅਨੁਵਾਦ:ਇਤਾਲਵੀ ਤੋਂ ਅੰਗਰੇਜ਼ੀ
+Name[pl]=WordReference.com: włoski -> angielski
+Name[pt]=Traduções do WordReference.com: Italiano para Inglês
+Name[pt_BR]=WordReference.com - Tradução: Italiano para Inglês
+Name[ro]=Traducere WordReference.com: italiană la engleză
+Name[ru]=Переводчик WordReference.com: итальянско-английский
+Name[rw]=WordReference.com Ivunura: Igitaliyani mu Cyongereza
+Name[se]=WordReference.com – jorgaleapmi: italialašgielas eŋgelasgillii
+Name[sk]=WordReference.com preklad z talianštiny do angličtiny
+Name[sl]=Prevod WordReference.com: italijanščina v angleščino
+Name[sr]=Превод на WordReference.com: са италијанског на енглески
+Name[sr@Latn]=Prevod na WordReference.com: sa italijanskog na engleski
+Name[sv]=Wordreference.com översättning: italienska till engelska
+Name[ta]=WordReference.com மொழிபெயர்ப்பு: இத்தாலிய மொழியில் இருந்து ஆங்கிலத்துக்கு
+Name[tg]=WordReference.com Тарҷума: аз Итолиёгӣ ба Англисӣ
+Name[th]=WordReference.com แปลภาษาอิตาเลียนเป็นอังกฤษ
+Name[tr]=WordReference.com Çevirisi: İtalyancadan İngilizceye
+Name[tt]=WordReference.com Tärcemäse: İtalça -› İnglizçä
+Name[uk]=WordReference.com: переклад з італійської на англійську
+Name[uz]=WordReference.com tarjima: Italyanchadan Inglizchaga
+Name[uz@cyrillic]=WordReference.com таржима: Италянчадан Инглизчага
+Name[vi]=WordReference.com Dịch: Tiếng Ý sang tiếng Anh
+Name[wa]=WordReference.com ratournaedje di l' itålyin viè l' inglès
+Name[zh_CN]=WordReference.com 翻译:意大利语译英语
+Name[zh_TW]=WordReference.com 翻譯: 義大利文至英文
+Query=http://www.wordreference.com/it/en/translation.asp?iten=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/jeeves.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/jeeves.desktop
new file mode 100644
index 000000000..b1fc478fd
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/jeeves.desktop
@@ -0,0 +1,30 @@
+[Desktop Entry]
+Type=Service
+Name=Ask Jeeves
+Name[af]=Vra Jeeves
+Name[br]=Klask digant Jeeves
+Name[csb]=Ask Jeeves - spëtôj ò cos
+Name[de]=Frag Jeeves
+Name[eo]=Demandu Jeeves
+Name[fa]=پرسیدن Jeeves
+Name[fo]=Spyr Jeeves
+Name[he]=שאל את Jeeves
+Name[hi]=आस्क जीव्स
+Name[hr]=Pitajte Jeevesa
+Name[is]=Spyrja Jeeves
+Name[mk]=Прашајте го Jeeves
+Name[mn]=Frag Jeeves
+Name[nds]=Fraag Jeeves
+Name[ne]=आस्क जीभेज
+Name[nso]=Botsisa Jeeves
+Name[pl]=Ask Jeeves - zapytaj o coś
+Name[ss]=Buta Jeeves
+Name[ta]=ஜீவசை கேள்
+Name[te]=జీవ్స్ ను అడగండి
+Name[th]=ถามจีฟส์
+Name[ven]=Vhudzisani Jeeves
+Name[vi]=Hỏi Jeeves
+ServiceTypes=SearchProvider
+Keys=ask,jeeves
+Query=http://www.ask.com/main/askJeeves.asp?origin=0&qSource=4&site_name=Jeeves&metasearch=yes&ask=\\{@}
+Query[en_GB]=http://www.ask.co.uk/main/askJeeves.asp?origin=0&qSource=4&site_name=Jeeves&metasearch=yes&ask=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/katatudo.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/katatudo.desktop
new file mode 100644
index 000000000..ac220a515
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/katatudo.desktop
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Type=Service
+Name=KataTudo
+Name[bn]=কাটা-টুডো
+Name[eo]=Katatudo
+Name[eu]=Kata Tudo
+Name[hi]=केएटीए ट्यूडो
+Name[ne]=काता टुडो
+Name[ta]=காட்டா ட்யூடோ
+Name[te]=కటాటుడొ
+ServiceTypes=SearchProvider
+Keys=kt,katatudo
+Query=http://www.katatudo.com.br/busca/resultado.php?q=\\{@}&onde=&b=Buscar
+Query[ne]=http://www.katatudo.com.br/busca/resultado.php?q=\\{@}onde=&b=Buscar
+Charset=utf8
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/kde.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/kde.desktop
new file mode 100644
index 000000000..f5a96f71e
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/kde.desktop
@@ -0,0 +1,80 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=kde
+Name=KDE API Documentation
+Name[af]=KDE API Dokumentasie
+Name[ar]=توثيق واجهة برمجة تطبيقات (API) كيدي
+Name[az]=KDE API Sənədləri
+Name[be]=Дакументацыя па KDE API
+Name[bn]=কে.ডি.ই. এ-পি-আই নির্দেশিকা
+Name[br]=Teuliadur API KDE
+Name[bs]=KDE API dokumentacija
+Name[ca]=Documentació de l'API de KDE
+Name[cs]=KDE API dokumentace
+Name[csb]=Dokùmentacëjô API KDE
+Name[cy]=Dogfenniaeth API KDE
+Name[da]=KDE API Dokumentation
+Name[de]=KDE-API-Dokumentation
+Name[el]=Τεκμηρίωση KDE API
+Name[eo]=KDE API Dokumentaro
+Name[es]=Documentación de la API de KDE
+Name[et]=KDE API dokumentatsioon
+Name[eu]=KDEren API dokumentazioa
+Name[fa]=مستندات KDE ِAPI
+Name[fi]=KDE APIn dokumentaatio
+Name[fr]=Documentation de l'API de KDE
+Name[fy]=KDE API Dokumintaasje
+Name[ga]=Doiciméadú API KDE
+Name[gl]=Documentación da API de KDE
+Name[he]=תיעוד ממשק תכנות יישומים ב־KDE
+Name[hi]=केडीई एपीआई दस्तावेज़ीकरण
+Name[hr]=KDE API dokumentacija
+Name[hu]=A KDE API dokumentációja
+Name[id]=Dokumentasi API KDE
+Name[is]=KDE forritunarviðmótsleiðbeiningar
+Name[it]=Documentazione della API di KDE
+Name[ja]=KDE API 文書
+Name[kk]=KDE API құжаттамасы
+Name[km]=ឯកសារ API របស់ KDE
+Name[ko]=KDE API 문서
+Name[lt]=KDE API dokumentacija
+Name[lv]=KDE API Dokumentācija
+Name[mk]=KDE API документација
+Name[mn]=KDE API баримтжуулалт
+Name[ms]=Dokumentasi API KDE
+Name[mt]=Dokumentazzjoni tal-API ta' KDE
+Name[nb]=KDE API-dokumentasjon
+Name[nds]=KDE-API-Dokmentatschoon
+Name[ne]=KDE API कागजात
+Name[nl]=KDE API Documentatie
+Name[nn]=KDE API-dokumentasjon
+Name[pa]=KDE API ਦਸਤਾਵੇਜ਼
+Name[pl]=Dokumentacja API KDE
+Name[pt]=Documentação da API do KDE
+Name[pt_BR]=Documentação da API do KDE
+Name[ro]=Documentația API KDE
+Name[ru]=Документация KDE API
+Name[rw]=Ikoreshanyandiko KDE API
+Name[se]=KDE API-dokumentašuvdna
+Name[sk]=KDE dokumentácia API
+Name[sl]=Dokumentacija KDE API
+Name[sr]=Документација API-ја KDE-а
+Name[sr@Latn]=Dokumentacija API-ja KDE-a
+Name[sv]=Dokumentation av KDE:s programmeringsgränssnitt
+Name[ta]=KDE API ஆவணமாக்கல்
+Name[tg]=Мустанадоти KDE API
+Name[th]=เอกสารอธิบาย API บน KDE
+Name[tr]=KDE API Belgeleri
+Name[tt]=KDE API Qullanması
+Name[uk]=Документація по API KDE
+Name[uz]=KDE API boʻyicha qoʻllanmalar
+Name[uz@cyrillic]=KDE API бўйича қўлланмалар
+Name[vi]=Tài liệu về API của KDE
+Name[wa]=Documintåcion di l' API di KDE
+Name[zh_CN]=KDE API 文档
+Name[zh_TW]=KDE API 文件
+Query=http://developer.kde.org/documentation/library/classmapper.php?class=\\{@}
+Query[bg]=http://developer.kde.org/documentation/library/classmapper.php?class=\
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/kde_websvn.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/kde_websvn.desktop
new file mode 100644
index 000000000..6dd1ce121
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/kde_websvn.desktop
@@ -0,0 +1,32 @@
+[Desktop Entry]
+Type=Service
+Name=KDE WebSVN
+Name[bn]=কে.ডি.ই. ওয়েব-এস.ভি.এন
+Name[br]=WebSVN KDE
+Name[ca]=WebSVN de KDE
+Name[csb]=WebSVN dlô KDE
+Name[es]=WebSVN de KDE
+Name[fi]=KDE:n WebSVN
+Name[fr]=WebSVN de KDE
+Name[ga]=WebSVN KDE
+Name[gl]=WebCVS de KDE
+Name[it]=SVN web di KDE
+Name[nds]=KDE-WebSVN
+Name[ne]=KDE वेब एसभीएन
+Name[pl]=WebSVN dla KDE
+Name[pt]=WebSVN do KDE
+Name[pt_BR]=WebSVN do KDE
+Name[sr]=KDE-ов WebSVN
+Name[sr@Latn]=KDE-ov WebSVN
+Name[sv]=KDE-webbsvn
+Name[te]=కెడిఈ వెబె ఎస్ వి ఎన్
+Name[tg]=KDE ВэбSVN
+Name[th]=SVN บนเว็บของ KDE
+Name[vi]=Tra KDE WebSVN
+Name[wa]=WebSVN di KDE
+ServiceTypes=SearchProvider
+Keys=websvn,kdesvn,ksvn,kvs
+Query=http://websvn.kde.org/\\{@}
+Query[ja]=http://webcvs.kde.org/\\{@}
+Query[se]=http://webcvs.kde.org/\\{@}
+
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/leo.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/leo.desktop
new file mode 100644
index 000000000..87e961e5e
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/leo.desktop
@@ -0,0 +1,49 @@
+[Desktop Entry]
+Type=Service
+Name=LEO-Translate
+Name[af]=LEO-Vertaal
+Name[ar]=LEO-ترجم
+Name[bs]=LEO-Prevodilac
+Name[csb]=LEO - dwastarnowi anielskò-miemiecczi
+Name[cy]=LEO-Cyfieithu
+Name[de]=LEO-Übersetzung
+Name[eo]=LEO-Tradukilo
+Name[fa]=LEO - ترجمه کردن
+Name[fi]=LEO-käännös
+Name[fo]=LEO-Umset
+Name[fy]=LEO-oersetting (oersetting: Dûtsk-Ingelsk-Dûtsk)
+Name[ga]=Aistriúchán LEO
+Name[he]=LEO־תרגום
+Name[hi]=लिओ-अनुवाद
+Name[hr]=LEO-Prijevod
+Name[is]=LEO-þýðandi
+Name[km]=LEO-បកប្រែ
+Name[ko]=LEO-번역
+Name[lv]=LEO-Tulkot
+Name[mk]=LEO - превод
+Name[mn]=LEO-Орчуулга
+Name[ms]=LEO-Terjemah
+Name[nb]=LEO-oversetter
+Name[nds]=LEO-Översetten
+Name[ne]=LEO-अनुवाद
+Name[nl]=LEO-Translate (Vertaling Duits-Engels-Duits)
+Name[nso]=Thlathollo ya LEO
+Name[pa]=LEO-ਅਨੁਵਾਦ
+Name[pl]=LEO - dwustronny słownik angielsko-niemiecki
+Name[pt_BR]=LEO-Tradutor
+Name[rw]=LEO-Kuvunura
+Name[ss]=Humusha LEO
+Name[ta]=லியோ-மொழிபெயர்ப்பு
+Name[te]=లియొ-అనువాదం
+Name[tg]=LEO-Тарҷума
+Name[tt]=LEO-Tärcemä
+Name[uz]=LEO tarjima
+Name[uz@cyrillic]=LEO таржима
+Name[ven]=Hu dologa-LEO
+Name[vi]=Dịch bằng LEO
+Name[wa]=Ratournaedje LEO
+Name[xh]=LEO-Guqulela
+Name[zu]=Uguqulelo-LEO
+ServiceTypes=SearchProvider
+Keys=leo
+Query=http://dict.leo.org/?search=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/lycos.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/lycos.desktop
new file mode 100644
index 000000000..ba6b44c12
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/lycos.desktop
@@ -0,0 +1,17 @@
+[Desktop Entry]
+Type=Service
+Name=Lycos
+Name[bn]=লাইকস
+Name[csb]=Lycos - szëkôrz starnów WWW
+Name[hi]=लायकोस
+Name[ne]=लाइकस
+Name[pa]=ਲੁਕੋਸ
+Name[pl]=Lycos - wyszukiwarka stron WWW
+Name[ta]=லைகோஸ்
+Name[te]=లైకోస్
+Name[th]=ไลคอส
+Name[vi]=Tra Lycos
+ServiceTypes=SearchProvider
+Keys=lycos,ly
+Query=http://www.lycos.com/cgi-bin/pursuit?cat=dir&query=\\{@}
+Query[ne]=http://www.lycos.com/cgi-bin/pursuit?cat=dirquery=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/mamma.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/mamma.desktop
new file mode 100644
index 000000000..2e104f15b
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/mamma.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Type=Service
+Name=Mamma - Mother of all Search Engines
+Name[af]=Mamma - Moeder van alle Soektog Enjins
+Name[ar]=Mama -أم جميع محركات البحث
+Name[az]=Mamma - Bütün axtarış mühərriklərinin Anası
+Name[be]=Mamma - Маці ўсіх рухавікоў пошуку
+Name[br]=Mamma - Mamm pep keflusker klask
+Name[bs]=Mamma - Majka svih tražilica
+Name[ca]=Mamma - La mare de tots els motors de recerca
+Name[cs]=Mamma
+Name[csb]=Mamma - mëmka wszëstczich szëkôrzów
+Name[cy]=Mamma - Mam holl Beiriannau Chwilio
+Name[da]=Mamma - moderen til alle søgemaskiner
+Name[de]=Mamma - Die Mutter aller Suchmaschinen
+Name[el]=Mamma - Η μητέρα όλων των μηχανών αναζήτησης
+Name[eo]=Mamma - Patrino de ĉiuj retserĉiloj
+Name[es]=Mamma - La madre de todos los motores de búsqueda
+Name[et]=Mamma - kõigi otsingumootorite ema
+Name[eu]=Mamma - Bilaketa motore guztien ama
+Name[fa]=Mamma - مادر همۀ موتورهای جستجو
+Name[fr]=Mamma - La mère de tous les moteurs de recherche
+Name[fy]=Mamma - mem fan alle sykmasines
+Name[gl]=Mamma - Mai dos Motores de Procura
+Name[he]=Mamma - האימא של כל מנועי החיפוש
+Name[hi]=मम्मा- सभी खोज इंजिन की अम्मा
+Name[hr]=Mamma - Majka svih tražilica
+Name[hu]=Mamma
+Name[is]=Mamma - Mamma allra leitarvéla
+Name[it]=Mamma - Madre di tutti i motori di ricerca
+Name[kk]=Mamma - бүкіл іздеу жүйелерінің анасы
+Name[km]=Mamma - កំពូល​ម៉ាស៊ីន​ស្វែងរក
+Name[ko]=Mamma - 모든 검색 엔진의 어머니
+Name[lt]=Mamma – visų paieškų motina
+Name[lv]=Mamma - Visu Meklēšanas Dinēju Māte
+Name[mk]=Mamma - мајката на сите пребарувачки сервиси
+Name[mn]=Mamma - Бүх хайлтын машины эх
+Name[ms]=Mamma -Ibu semua Enjin Carian
+Name[nb]=Mamma – alle søkemotorers mor
+Name[nds]=Mamma - de Moder vun all Söökmaschinen
+Name[ne]=Mamma - सबै खोज्ने इन्जिनको जननी
+Name[nl]=Mamma - moeder van alle zoekmachines
+Name[nn]=Mamma – Mother of all Search Engines
+Name[nso]=Mamma - Mme wa Di-Engine kamoka tsa Nyako
+Name[pa]=ਮਾਮਾ -ਸਭ ਖੋਜ ਇੰਜਣਾਂ ਦੀ ਮਾਂ
+Name[pl]=Mamma - matka wszystkich przeszukiwarek
+Name[pt]=Mamma - Mãe de Todos os Motores de Busca
+Name[pt_BR]=Mamma - Mãe de todos os mecanismos de busca
+Name[ro]=Mamma - Mama tuturor motoarelor de căutare
+Name[ru]=Mamma - мать всех поисковых систем
+Name[rw]=Mamma - Nyina w'Imoteri z'ishakisha zose
+Name[se]=Mamma – Mother of all Search Engines
+Name[sl]=Mamma - Mati vseh iskalnikov
+Name[sr]=Mamma - Мајка свих претраживачких мотора
+Name[sr@Latn]=Mamma - Majka svih pretraživačkih motora
+Name[ss]=Mamma - make wato tonkhe tinjinin tekusesha
+Name[sv]=Mamma - Moder till alla sökmotorer
+Name[ta]=மம்மா - தேடு இயந்திரங்களின் தாய்
+Name[tg]=Mamma - Модари ҳамаи мошинҳои ҷустуҷӯ
+Name[th]=มามา - มารดาของเครื่องมือค้นหาทั้งปวง
+Name[tr]=Mamma - Bütün arama motorlarının Annesi
+Name[tt]=Mamma - Bar Ezläw-Maşínalarnıñ Anası
+Name[uk]=Mamma - мати всіх пошукових машин
+Name[uz]=Mamma - Hamma qidirish vositalarining onasi
+Name[uz@cyrillic]=Mamma - Ҳамма қидириш воситаларининг онаси
+Name[ven]=Mamma - Mmea nzhini dzothe dzau setsha
+Name[vi]=Mamma - Người mẹ của tất cả các máy truy tìm dữ liệu
+Name[wa]=Mamma - Li mame di tos les cwirress
+Name[xh]=Mamma - Umama weenjini zonke zophendlo
+Name[zh_CN]=Mamma - 所有搜索引擎之母
+Name[zh_TW]=Mamma - 搜尋引擎之母
+Name[zu]=Mamma - Umama wazo zonke Izinjini Zokusesha
+ServiceTypes=SearchProvider
+Keys=mm,mamma
+Query=http://www.mamma.com/Mamma?lang=1&timeout=4&qtype=0&query=\\{@}
+Query[ne]=http://www.mamma.com/Mamma?lang=1timeout=4&qtype=0&query=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/metacrawler.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/metacrawler.desktop
new file mode 100644
index 000000000..0c3fc2edf
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/metacrawler.desktop
@@ -0,0 +1,20 @@
+[Desktop Entry]
+Type=Service
+Name=MetaCrawler
+Name[af]=Metacrawler
+Name[ar]=MetaCrwaler
+Name[bn]=মেটা-ক্রলার
+Name[csb]=MetaCrawler - szëkôrz starnów WWW
+Name[hi]=मेटा-क्राउलर
+Name[ne]=मेटा क्रवलर
+Name[pa]=ਮੈਟਾਕਰਾਵਲੀਰ
+Name[pl]=MetaCrawler - wyszukiwarka stron WWW
+Name[rw]=Ikiziga-buhoroKidasanzwe
+Name[ta]=மெடா க்ராவ்லெர்
+Name[te]=మెటా క్రాలర్
+Name[th]=เมทาคลอเรอร์
+Name[ven]=Tshikokovhi tsha Meta
+Name[vi]=Tra MetaCrawler
+ServiceTypes=SearchProvider
+Keys=mc,meta,metacrawler
+Query=http://search.metacrawler.com/crawler?general=\\{@}&method=0&cat=Web&target=metaworld&redirect=web&rpp=20&hpe=10&region=0&timeout=0&sort=0&format=beta99&theme=classic&refer=mc-search&refer=mc-search
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/msdn.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/msdn.desktop
new file mode 100644
index 000000000..5a9fc733c
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/msdn.desktop
@@ -0,0 +1,74 @@
+[Desktop Entry]
+Type=Service
+Name=Microsoft Developer Network Search
+Name[af]=Microsoft Developer Network Soektog
+Name[ar]=بحث في شبكة مطوري مايكروسوفت
+Name[be]=Пошук у сетцы для распрацоўшчыкаў Microsoft
+Name[bn]=মাইক্রোসফট ডেভেলপার নেটওয়ার্ক অনুসন্ধান
+Name[bs]=Microsoft Developer Network (MSDN) pretraga
+Name[ca]=Xarxa de recerca del desenvolupador de Microsoft
+Name[cs]=Vyhledávání v Microsoft Developer Network
+Name[csb]=MSDN - dostónczi dlô programistów
+Name[cy]=Chwilio Rhwydwaith Datblygwyr Microsoft
+Name[da]=Søgning i Microsoft Developer Network
+Name[de]=Microsoft Developer Network Suche
+Name[el]=Microsoft - δικτυακή αναζήτηση προγραμματιστή
+Name[eo]=Serĉo en la Mikrosofta-programisto-reto
+Name[es]=Red de búsqueda del desarrollador de Microsoft
+Name[et]=Microsoft Developer Network otsing
+Name[eu]=Microsoft-en garatzaileen sare bilaketa
+Name[fa]=جستجوی شبکۀ توسعه‌دهندۀ مایکروسافت
+Name[fi]=Microsoft Developer Network -haku
+Name[fy]=Microsoft Developer Network Search
+Name[ga]=Cuardach Microsoft Developer Network
+Name[gl]=Procura na Rede de Desenvolvemento de Microsoft
+Name[hi]=माइक्रोसॉफ्ट डेवलपर नेटवर्क खोज
+Name[hr]=Microsoft Developer Network pretraga
+Name[is]=Microsoft Developer Network leit
+Name[it]=Ricerca Microsoft Developer Network
+Name[ja]=Microsoft Developer Network 検索
+Name[kk]=Microsoft Developer Network-те іздеу
+Name[km]=ស្វែងរក​តាម​រយៈ​បណ្ដាញ​អ្នក​អភិវឌ្ឍន៍ Microsoft
+Name[ko]=Microsoft Developer Network 검색
+Name[lt]=Microsoft Developer Network Paieška
+Name[lv]=Microsoft Izstrādātāju Tīkla Meklēšana
+Name[mn]=Microsoft Developer Network хайлт
+Name[ms]=Carian Rangkaian Pembangun Microsoft
+Name[mt]=Tfittxija fuq Microsoft Developer Network
+Name[nb]=Microsoft Developer Network-søk
+Name[ne]=माइक्रोसफ्ट विकासकर्ता सञ्जाल खोज्नुहोस्
+Name[nl]=Microsoft Developer Network Search
+Name[nn]=Microsoft Developer Network-søk
+Name[nso]=Nyako ya Kgokagano ya Mohlabolli wa Microsoft
+Name[pa]=ਮਾਈਕਰੋਸਾਫਟ ਖੋਜੀ ਨੈੱਟਵਰਕ ਖੋਜ
+Name[pl]=MSDN - zasoby dla programistów
+Name[pt]=Pesquisa na Microsoft Developer Network
+Name[pt_BR]=Busca no MDN (Microsoft Developer Network)
+Name[ro]=Căutare în Microsoft Developer Network
+Name[ru]=Поиск в Microsoft Developer Network
+Name[rw]=Ishakisha rya Mukoraporogaramu Urusobemiyoboro Microsoft
+Name[se]=Oza Microsoft Developer Network báikkis
+Name[sk]=Hľadanie Microsoft Developer Network
+Name[sl]=Iskalnik po razvijalnem omrežju Microsofta
+Name[sr]=Претраживање Мреже Microsoft-ових развијача (MSDN)
+Name[sr@Latn]=Pretraživanje Mreže Microsoft-ovih razvijača (MSDN)
+Name[ss]=Kusesha kweluchungechunge lesindlondlobalisi seMicrosoft
+Name[sv]=Sökning i Microsoft Developer Network
+Name[ta]=மைக்ரோசாப்ட் டெவலப்பர் வலைத்தள தேடுதல்
+Name[tg]=Ҷустуҷӯи шабакаи барноманависони Microsoft
+Name[th]=เครื่องมือค้นหาเกี่ยวกับเครือข่ายผู้พัฒนาของไมโครซอฟต์
+Name[tr]=Microsoft Developer Network Tarayıcı
+Name[tt]=Microsoft Developer Network eçendä Ezläw
+Name[uk]=Пошук в Microsoft Developer Network
+Name[uz]=Microsoft Developer Network'da qidirish
+Name[uz@cyrillic]=Microsoft Developer Network'да қидириш
+Name[ven]=Vhukwamani hau setsha ha mubveledzi wa Microsoft
+Name[vi]=Mạng Truy tìm cho Lập trình viên Microsoft
+Name[wa]=Cweraedje sol Rantoele des Programeus Microsoft
+Name[xh]=Uphendlo Womsebenzi womnatha Wombhekisi phambili we Microsoft
+Name[zh_CN]=MSDN 微软开发者网络搜索
+Name[zh_TW]=微軟開發者網路搜尋
+Name[zu]=Usesho Loxhumano olusakazekile Lomthuthukisi we-Microsoft
+ServiceTypes=SearchProvider
+Keys=msdn
+Query=http://msdn.microsoft.com/library/shared/searchtab/searchHandoff.asp?handoffurl=%2Fisapi%2Fgosearch.asp%3FTARGET%3D%2Fus%2Fdev%2Fdefault.asp&stcfg=d%3A%2Fhttp%2Fcnfg.xml&qu=\\{@}&btnSearch=GO
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/netcraft.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/netcraft.desktop
new file mode 100644
index 000000000..d2ea4be81
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/netcraft.desktop
@@ -0,0 +1,17 @@
+[Desktop Entry]
+Type=Service
+Name=Netcraft
+Name[bn]=নেট-ক্রাফ্ট
+Name[fy]=Netcraft
+Name[hi]=नेटक्राफ्ट
+Name[mn]=Нэтскафе
+Name[ne]=नेटक्राफ्ट
+Name[pa]=ਨੈੱਟਕਰਾਫਟ
+Name[ta]=நெட்க்ராஃப்ட்
+Name[te]=నెట్ క్రాఫ్ట్
+Name[tg]=Шабакаи craft
+Name[th]=เน็ตคราฟต์
+Name[vi]=Tra Netcraft
+ServiceTypes=SearchProvider
+Keys=nc,netcraft
+Query=http://uptime.netcraft.com/up/graph?site=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/nl-telephone.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/nl-telephone.desktop
new file mode 100644
index 000000000..7abbad0e1
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/nl-telephone.desktop
@@ -0,0 +1,71 @@
+[Desktop Entry]
+Name=Telephonebook Search Provider
+Name[af]=Telefoonbok soektog verskaffer
+Name[ar]=مزود البحث في دليل الهاتف
+Name[az]=Telephonebook Axtarış Xidmətçisi
+Name[be]=Пошук тэлефонаў
+Name[bn]=টেলিফোন-বুক অনুসন্ধান সরবরাহকারী
+Name[bs]=Telephonebook pretraga
+Name[ca]=Proveïdor de cerques a la guia de telèfons
+Name[cs]=Poskytovatel prohledávání tel. seznamu
+Name[csb]=Szëkôrz Telephonebook
+Name[cy]= Darparydd Chwiliadau Llyfr Ffôn
+Name[da]=Telefonbog-søgeudbyder
+Name[de]=Telefonbuchsuche
+Name[el]=Πάροχος αναζήτησης Telephonebook
+Name[eo]=Telefonlibro-serĉprovizanto
+Name[es]=Proveedor de búsqueda de teléfonos
+Name[et]=Hollandi telefoniraamatu otsingumootor
+Name[eu]=Telephonebook bilaketa hornitzailea
+Name[fa]=فراهم‌کنندۀ جستجوی دفتر تلفن
+Name[fi]=Puhelinluettelohaku
+Name[fr]=Moteur de recherche Telephonebook
+Name[fy]=Tillefoanboek-sykmasine
+Name[gl]=Fornecedor de Procuras na Guia Telefónica
+Name[he]=חיפוש ספר של ספר טלפונים
+Name[hi]=टेलिफोनबुक खोज प्रदायक
+Name[hr]=Davatelj usluge pretraživanja imenika
+Name[hu]=Telefonkönyv (NL)
+Name[is]=Leitarvél fyrir símaskrár
+Name[it]=Motore di ricerca Elencotelefonico
+Name[ja]=Telephonebook 検索プロバイダ
+Name[km]=អ្នក​ផ្ដល់​សេវា​ស្វែងរក​សៀវភៅ​លេខ​ទូរស័ព្ទ
+Name[ko]=전화번호부 검색 공급자
+Name[lt]=Telefono knygų paieškos teikėjas
+Name[lv]=Tālruņa katalogu meklēšanas sniedzējs
+Name[mk]=Telephonebook сервис за пребарување
+Name[ms]=Penyedia Carian Buku Telefon
+Name[mt]=Telephonebook search provider
+Name[nb]=Søkemotor for telefonkataloger
+Name[nds]=In't Telefoonbook söken (Nedderlannen)
+Name[ne]=टेलिफोन पुस्तिका खोजी प्रदायक
+Name[nl]=Telefoonboek-zoekmachine
+Name[nn]=Søkjemotor for telefonkatalog
+Name[pa]=ਟੈਲੀਫੋਨ ਖੋਜ ਪੇਸ਼ਕਾਰ
+Name[pl]=Wyszukiwarka Telephonebook
+Name[pt]=Motor de Busca de Lista Telefónica
+Name[pt_BR]=Guia Telefônico On-line
+Name[ro]=Căutare în cartea de telefoane
+Name[rw]=Utanga Ishakisha Agatabotelefone
+Name[se]=Ohcanmotor telefonkatalogaid várás
+Name[sk]=Hľadanie v telefónnom zozname
+Name[sl]=Ponudnik iskanja po telefonskem imeniku
+Name[sr]=Провајдер за претрагу телефонског именика
+Name[sr@Latn]=Provajder za pretragu telefonskog imenika
+Name[sv]=Söktjänst för telefonkatalog
+Name[ta]=தொலைபேசிபுத்தக தேடுதலை அளிப்பான்
+Name[tg]=Фароҳамкунандаи ҷустуҷӯи китобчаи рӯйхати телефонҳо
+Name[th]=ผู้ให้บริการค้นหาสมุดโทรศัพท์
+Name[tr]=Telefon Defteri Arama Sağlayıcı
+Name[tt]=Telefon Kitaplarında Ezläw
+Name[uk]=Провайдер пошуку Telephonebook
+Name[uz]=Telefonlar daftarida qidirish
+Name[uz@cyrillic]=Телефонлар дафтарида қидириш
+Name[vi]=Nhà cung cấp dịch vụ Tìm kiếm qua Danh bạ điện thoại
+Name[wa]=Dineu d' cweraedje di live di limeros d' telefone
+Name[zh_CN]=Telephonebook 搜索提供者
+Name[zh_TW]=電話號碼簿搜尋提供者
+Type=Service
+ServiceTypes=SearchProvider
+Keys=telnl,telefoon
+Query=http://www.detelefoongids.nl/tginl.dll?action=white&type=search&resultsperpage=25&pagestart=1&source=searchcategory&name2=\\{1}&name=&initials=&city=\\{2}&citycode=&zipcode4=&street=&area=conditional&areacode=&region=&subscription=&country=&catcode=&dcity=\\{2}&dname=\\{1}&dwhere=\\{2}&partnerid=
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/nl-teletekst.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/nl-teletekst.desktop
new file mode 100644
index 000000000..d305fd88b
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/nl-teletekst.desktop
@@ -0,0 +1,74 @@
+[Desktop Entry]
+Name=Teletekst Search Provider
+Name[af]=Teleteks soektog verskaffer
+Name[ar]=مزود البحث Teletekst
+Name[az]=Teletekst Axtarış Xidmətçisi
+Name[be]=Пошук тэлетэксту
+Name[bn]=Teletekst অনুসন্ধান সরবরাহকারী
+Name[bs]=Teletekst pretraga
+Name[ca]=Proveïdor de cerca a Teletekst
+Name[cs]=Poskytovatel Teletekstového prohledávání
+Name[csb]=Szëkôrz Teletekst
+Name[cy]= Darparwr Chwiliadau Teletekst
+Name[da]=Teletekst-søgeudbyder
+Name[de]=Teletekst-Suche
+Name[el]=Πάροχος αναζήτησης Teletekst
+Name[eo]=Teletekst-serĉprovizanto
+Name[es]=Proveedor de búsqueda Teletekst
+Name[et]=Hollandi teleteksti otsingumootor
+Name[eu]=Teletekst bilaketa hornitzailea
+Name[fa]=فراهم‌کنندۀ جستجوی پیام‌نما
+Name[fi]=Teleteksti-palveluntarjoaja
+Name[fr]=Moteur de recherche Teletekst
+Name[fy]=Teletekst-sykmasine
+Name[ga]=Cuardach Teletekst
+Name[gl]=Fornecedor de Procuras Teletekst
+Name[he]=חיפוש ספק שירות של Teletekst
+Name[hi]=टेलिटेक्स्ट खोज प्रदायक
+Name[hr]=Davatelj usluge pretraživanja teleteksta
+Name[hu]=Teletekst keresőszolgáltatás
+Name[is]=Teletekst leitarvél
+Name[it]=Motore di ricerca Teletekst
+Name[ja]=Teletekst 検索プロバイダ
+Name[ka]=Teletekst ძიების პროვაიდერი
+Name[km]=Teletekst ៖ អ្នក​ផ្ដល់​សេវា​ស្វែងរក
+Name[ko]=Teletekst 검색 공급자
+Name[lt]=Teleteksto paieškos teikėjas
+Name[lv]=Teleteksta meklēšanas sniedzējs
+Name[mk]=Телетекст сервис за пребарување
+Name[ms]=Penyedia Carian Teletekst
+Name[mt]=Tfittxika teletekst
+Name[nb]=Søkemotor for teletekst
+Name[nds]=In "Teletekst" söken (Nedderlannen)
+Name[ne]=टेलिटेक्स्ट खोजी प्रदायक
+Name[nl]=Teletekst-zoekmachine
+Name[nn]=Søkjemotoren Teletekst
+Name[pa]=ਟੇਲੇਟੇਕਸਟ ਖੋਜ ਪੇਸ਼ਕਾਰ
+Name[pl]=Wyszukiwarka Teletekst
+Name[pt]=Motor de Busca Teletekst
+Name[pt_BR]=Provedor de buscas Teletekst
+Name[ro]=Căutare Teletekst
+Name[ru]=Поиск телетекста
+Name[rw]=Utanga Ishakisha Teletekst
+Name[se]=Ohcanmotor Teletekst
+Name[sk]=Poskytovateľ hľadania Teletekst
+Name[sl]=Ponudnik iskanja po teletekstu
+Name[sr]=Провајдер за телетекст претрагу
+Name[sr@Latn]=Provajder za teletekst pretragu
+Name[sv]=Teletekst söktjänst
+Name[ta]=Teletekst தேடுதல் அளிப்பான்
+Name[tg]=Фароҳамкунандаи ҷустуҷӯи Тексти телевизионӣ
+Name[th]=ผู้ให้บริการการค้นหา Teleteskst
+Name[tr]=Teletekst Arama Sağlayıcı
+Name[tt]=Teletekst Ezläw
+Name[uk]=Провайдер пошуку Teletekst
+Name[uz]=Teletekstda qidirish
+Name[uz@cyrillic]=Телетекстда қидириш
+Name[vi]=Nhà cung cấp dịch vụ Tìm kiếm Teletekst
+Name[wa]=Dineu di cweraedje Teletecse
+Name[zh_CN]=Teletekst 搜索提供者
+Name[zh_TW]=Teletekst 搜尋提供者
+Type=Service
+ServiceTypes=SearchProvider
+Keys=tt,teletekst
+Query=http://teletekst.nos.nl/gif/\\{@}-01.html
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/pgpkeys.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/pgpkeys.desktop
new file mode 100644
index 000000000..c1b128780
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/pgpkeys.desktop
@@ -0,0 +1,83 @@
+[Desktop Entry]
+Keys=pgp,pgpkeys
+Name=OpenPGP Key Search
+Name[af]=OpenPGP Sleutel Soektog
+Name[ar]=بحث مفاتيح OpenPGP
+Name[az]=OpenPGP Açar Axtarışı
+Name[be]=Пошук ключа OpenPGP
+Name[bn]=ওপেন-পিজিপি কী (key) অনুসন্ধান
+Name[bs]=Tražilica OpenPGP ključeva
+Name[ca]=Recerca de claus OpenPGP
+Name[cs]=Vyhledávání OpenPGP klíčů
+Name[csb]=Szëkôrz kluczów OpenPGP
+Name[cy]=Chwilio Allwedd PGPAgored
+Name[da]=OpenPGP-nøglesøgning
+Name[de]=Suche nach OpenPGP-Schlüssel
+Name[el]=Αναζήτηση κλειδιού OpenPGP
+Name[eo]=OpenPGP-serĉo
+Name[es]=Búsqueda de clave OpenPGP
+Name[et]=OpenPGP võtme otsing
+Name[eu]=OpenPGP gako bilaketa
+Name[fa]=جستجوی کلید OpenPGP
+Name[fi]=OpenPGP-avainhaku
+Name[fo]=OpenPGP lyklaleiting
+Name[fr]=Clé de recherche OpenPGP
+Name[fy]=Sykje nei OpenPGP-Kaaien
+Name[gl]=Procura de Chaves de OpenPGP
+Name[he]=חיפוש מפתחות OpenPGP
+Name[hi]=ओपनपीजीपी कुंजी खोज
+Name[hr]=Pretraživanje OpenPGP ključeva
+Name[hu]=OpenPGP kulcskereső
+Name[is]=OpenPGP lykilleit
+Name[it]=Ricerca chiavi OpenPGP
+Name[ja]=OpenPGP キー検索
+Name[ka]=OpenPGP კოდის ძიება
+Name[kk]=OpenPGP кілттерін табу
+Name[km]=ស្វែងរក​កូនសោ​តាម​រយៈ OpenPGP
+Name[ko]=OpenPGP 키 검색
+Name[lt]=OpenPGP raktų paieška
+Name[lv]=OpenPGP Atslēgu meklēšana
+Name[mk]=Пребарување на OpenPGP клучеви
+Name[mn]=OpenPGP-түлхүүрээр хайх
+Name[ms]=Carian Kekunci OpenPGP
+Name[mt]=Tfittxija għal ċifrarju OpenPGP
+Name[nb]=OpenPGP nøkkelsøk
+Name[nds]=OpenPGP-Slötel-Söök
+Name[ne]=खुला PGP कुञ्जी खोजी
+Name[nl]=Zoeken naar OpenPGP-sleutels
+Name[nn]=OpenPGP-nøkkelsøk
+Name[nso]=Nyako ya Senotlelo sa PGP yeo e bulegilego
+Name[pa]=OpenPGP ਕੁੰਜੀ ਖੋਜ
+Name[pl]=Przeszukiwarka kluczy OpenPGP
+Name[pt]=Pesquisa de Chaves do OpenPGP
+Name[pt_BR]=Busca de Chaves OpenPGP
+Name[ro]=Căutare chei OpenPGP
+Name[ru]=Поиск ключей OpenPGP
+Name[rw]=Ishakisha Ijambo GufunguraPGP
+Name[se]=Oza OpenPGP-čoavdagiid
+Name[sk]=Hľadanie kľúčov OpenPGP
+Name[sl]=Iskanje ključa OpenPGP
+Name[sr]=Претраживање OpenPGP кључева
+Name[sr@Latn]=Pretraživanje OpenPGP ključeva
+Name[ss]=Vula kusesha lokuyinhloko kwePGP
+Name[sv]=OpenPGP-nyckelsökning
+Name[ta]=OpenPGP வார்த்தை தேடுதல்
+Name[te]=ఒపెన్ పిజిపి కీ అన్వెషణ
+Name[tg]=Ҷустуҷӯи калиди OpenPGP
+Name[th]=ค้นหารหัส OpenPGP
+Name[tr]=OpenPGP anahtar Arayıcı
+Name[tt]=OpenPGP Açqıç Ezläw
+Name[uk]=Пошук ключів OpenPGP
+Name[uz]=OpenPGP kalitlarni qidirish
+Name[uz@cyrillic]=OpenPGP калитларни қидириш
+Name[ven]=U setsha ha khii ya PGP yo vuleaho
+Name[vi]=Tìm kiếm bằng từ khoá của OpenPGP
+Name[wa]=Cweraedje d' ene clé OpenPGP
+Name[xh]=Uphendlo Lwesitshixo se OpenPGP
+Name[zh_CN]=OpenPGP 关键字搜索
+Name[zh_TW]=OpenPGP 金鑰搜尋
+Name[zu]=OpenPGP Usesho olubalulekile
+Query=http://pgp.dtype.org:11371/pks/lookup?search=\\{@}&op=vindex
+Query[ne]=http://pgp.dtype.org:11371/pks/lookup?search=\\{@}op=vindex
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/php.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/php.desktop
new file mode 100644
index 000000000..5289cd38d
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/php.desktop
@@ -0,0 +1,81 @@
+[Desktop Entry]
+Keys=php
+Name=PHP Search
+Name[af]=PHP Soektog
+Name[ar]=بحث PHP
+Name[az]=PHP Axtarışı
+Name[be]=Пошук PHP
+Name[bn]=পি-এইচ-পি অনুসন্ধান
+Name[br]=Klask PHP
+Name[bs]=PHP Tražilica
+Name[ca]=Recerca PHP
+Name[cs]=Vyhledávání PHP
+Name[csb]=PHP Szëkba
+Name[cy]=Chwilio PHP
+Name[da]=PHP-søgning
+Name[el]=Αναζήτηση PHP
+Name[eo]=PHP-serĉo
+Name[es]=Búsqueda PHP
+Name[eu]=PHP bilaketa
+Name[fa]=جستجوی PHP
+Name[fi]=PHP-haku
+Name[fr]=Recherche PHP
+Name[fy]=PHP-sykaksje
+Name[ga]=Cuardach PHP
+Name[gl]=Procura PHP
+Name[he]=חיפוש PHP
+Name[hi]=पीएचपी खोज
+Name[hr]=PHP pretraživanje
+Name[is]=PHP leit
+Name[it]=Ricerca PHP
+Name[ja]=PHP 検索
+Name[ka]=PHP ძიება
+Name[kk]=PHP іздеуі
+Name[km]=ស្វែងរក PHP
+Name[ko]=PHP 검색
+Name[lt]=PHP paieška
+Name[lv]=PHP Meklēšana
+Name[mk]=Пребарување за PHP
+Name[mn]=PHP хайлт
+Name[ms]=Carian PHP
+Name[mt]=Tfittxija PHP
+Name[nb]=PHP-søk
+Name[nds]=PHP-Söök
+Name[ne]=PHP खोजी
+Name[nl]=PHP-zoekactie
+Name[nn]=PHP-søk
+Name[nso]=Nyako ya PHP
+Name[pa]=PHP ਖੋਜ
+Name[pl]=PHP (język skryptowy)- dokumentacja
+Name[pt]=Pesquisa de PHP
+Name[pt_BR]=Busca PHP
+Name[ro]=Căutare PHP
+Name[ru]=Поиск PHP
+Name[rw]=Ishakisha PHP
+Name[se]=PHP-ohcan
+Name[sk]=Hľadanie PHP
+Name[sl]=Iskanje po PHP
+Name[sr]=PHP претраживање
+Name[sr@Latn]=PHP pretraživanje
+Name[ss]=Kusesha kwe PHP
+Name[sv]=PHP search
+Name[ta]=PHP தேடு
+Name[te]=పి హెచ్ పి అన్వెషణ
+Name[tg]=Ҷустуҷӯи PHP
+Name[th]=ค้นหาเกี่ยวกับ PHP
+Name[tr]=PHP Arayıcı
+Name[tt]=PHP Ezläw
+Name[uk]=Пошук PHP
+Name[uz]=PHP qidirish
+Name[uz@cyrillic]=PHP қидириш
+Name[ven]=U setsha ha PHP
+Name[vi]=Tìm kiếm PHP
+Name[wa]=Cweraedje PHP
+Name[xh]=Uphendlo lwe PHP
+Name[zh_CN]=PHP 搜索
+Name[zh_TW]=PHP 搜尋
+Name[zu]=Usesho lwe-PHP
+Query=http://www.php.net/search.php?show=\\{mode,"manual"}&pattern=\\{@}
+Query[ne]=http://www.php.net/search.php?show=\\{mode,"manual"}pattern=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/python.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/python.desktop
new file mode 100644
index 000000000..2825c073d
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/python.desktop
@@ -0,0 +1,84 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=py,python
+Name=Python Reference Manual
+Name[af]=Python Verwysing Handleiding
+Name[ar]=كتيب Python المصدري
+Name[az]=Python Əl Kitabcığı
+Name[be]=Падручнік Python
+Name[bn]=পাইথন রেফারেন্স ম্যানুয়াল
+Name[bs]=Python referentni priručnik
+Name[ca]=Manual de referència de Python
+Name[cs]=Manuál jazyka Python
+Name[csb]=Python - pòdrãcznik
+Name[cy]=Llawlyfr Cyfeiriol Python
+Name[da]=Python reference-manual
+Name[de]=Python-Handbuch
+Name[el]=Εγχειρίδιο αναφοράς Python
+Name[eo]=Pitono-manlibro
+Name[es]=Manual de referencia de Python
+Name[eu]=Python-en erreferentzia eskuliburua
+Name[fa]=راهنمای مرجع Python
+Name[fi]=Pythonin referenssimanuaali
+Name[fr]=Manuel de référence de Python
+Name[ga]=Lámhleabhar Python
+Name[gl]=Manual de Referéncia de Python
+Name[he]=תיעוד של פייתון
+Name[hi]=पायथन रेफरेंस मेनुअल
+Name[hr]=Python referentni priručnik
+Name[hu]=Python referencia-kézikönyv
+Name[id]=Manual Referensi Python
+Name[is]=Python Handbók
+Name[it]=Manuale di riferimento di Python
+Name[ja]=Python リファレンスマニュアル
+Name[kk]=Python анықтамасы
+Name[km]=សៀវភៅ​យោង Python
+Name[ko]=Python 참조 설명서
+Name[lt]=Python vadovas-žinynas
+Name[lv]=Python Rokasgrāmata
+Name[mk]=Референтен прирачник за Python
+Name[mn]=Python-Гарын авлага
+Name[ms]=Manual Rujukan Python
+Name[mt]=Manwal tal-Python
+Name[nb]=Referansehåndbok for Python
+Name[nds]=Python-Referenzhandbook
+Name[ne]=पाइथन सन्दर्भ म्यानुअल
+Name[nn]=Python-referansehandbok
+Name[nso]=Manual wa Tebeledisiso ya Python
+Name[pa]=Python ਹਵਾਲਾ ਦਸਤਾਵੇਜ਼
+Name[pl]=Python (język programowania)- podręcznik
+Name[pt]=Manual de Referência do Python
+Name[pt_BR]=Manual de Referência do Python
+Name[ro]=Manualul de referință Python
+Name[ru]=Справочник по Python
+Name[rw]=Igitabo cy'Imikorere ya Python
+Name[se]=Python-referánsagiehtagirji
+Name[sl]=Referenčni priročnik za python
+Name[sr]=Референтно упутство за Python
+Name[sr@Latn]=Referentno uputstvo za Python
+Name[sv]=Python referensmanual
+Name[ta]=பைதான் பார்வை கையேடு
+Name[tg]=Маълумотнома аз Python
+Name[th]=คู่มืออ้างอิงเกี่ยวกับ Python
+Name[tr]=Python Başvuru Elkitabı
+Name[tt]=Python Qullanması
+Name[uk]=Довідник по Python
+Name[uz]=Python uchun koʻllanma
+Name[uz@cyrillic]=Python учун кўлланма
+Name[ven]=Tshifanyisi tsha Manyuala tsha Python
+Name[vi]=Sách Tham khảo Python
+Name[wa]=Manuel di referince di Python
+Name[xh]=Ubhekiso lwe Python yesandla
+Name[zh_CN]=Python 参考手册
+Name[zh_TW]=Python 參考手冊
+Name[zu]=Incwadi yokuqondiwe ye-Python
+Query=http://www.google.com/search?sourceid=python-search&q=\{@}&submit=Search&q=site%3Apython.org
+Query[en_GB]=http://www.google.co.uk/search?sourceid=python-search&q=\{@}&submit=Search&q=site%3Apython.org
+Query[fr]=http://www.google.fr/search?sourceid=python-search&q=\{@}&submit=Search&q=site%3Apython.org
+Query[fy]=http://www.google.nl/search?sourceid=python-search&q=\{@}&submit=Search&q=site%3Apython.org
+Query[nb]=http://www.google.no/search?sourceid=python-search&q=\{@}&submit=Search&q=site%3Apython.org
+Query[nl]=http://www.google.nl/search?sourceid=python-search&q=\{@}&submit=Search&q=site%3Apython.org
+Query[pt]=http://www.google.pt/search?sourceid=python-search&q=\{@}&submit=Search&q=site%3Apython.org
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/qt.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/qt.desktop
new file mode 100644
index 000000000..2ee904fd9
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/qt.desktop
@@ -0,0 +1,78 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=qt
+Name=Latest Qt Online Documentation
+Name[af]=Nuutste Qt Aanlyn Dokumentasie
+Name[ar]=آخر وثائق مساعدة Qt
+Name[az]=Onlayn Qt Sənədləri
+Name[be]=Найноўшая дакументацыя па Qt
+Name[bn]=কিউ-টি অনলাইন ডকুমেন্টেশন
+Name[bs]=Najnovija Qt online dokumentacija
+Name[ca]=L'última documentació en línia de Qt
+Name[cs]=Nejnovější online dokumentace Qt
+Name[csb]=Slédnô dokùmentacëjô Qt
+Name[cy]=Dogfennaeth Diweddar QT Online
+Name[da]=Nyeste Qt online-dokumentation
+Name[de]=Aktuelle Qt-Online-Dokumentation
+Name[el]=Τελευταία τεκμηρίωση του Qt στο διαδίκτυο
+Name[eo]=La plej aktuala reta QT Dokumentaro
+Name[es]=Ultima documentación Qt en línea
+Name[et]=Qt uusim dokumentatsioon võrgus
+Name[eu]=Azken Qt lineako dokumentazioa
+Name[fa]=آخرین مستندات برخط Qt
+Name[fi]=Uusin Qt-dokumentaatio
+Name[fr]=La dernière documentation en ligne de Qt
+Name[fy]=Nijste Qt Online-dokumintaasje
+Name[ga]=Doiciméadú Ar Líne Is Déanaí Qt4
+Name[gl]=Última Documentación en Liña de Qt
+Name[he]=תיעוד מקוון מעודכן של Qt
+Name[hi]=नवीनतम क्यूटी आनलाइन दस्तावेज़
+Name[hr]=Najnovija Qt dokumentacija na Internetu
+Name[hu]=A legfrissebb Qt online dokumentáció
+Name[id]=Dokumentasi Qt Online Terbaru
+Name[is]=Nýjustu Qt handbækurnar
+Name[it]=Ultima documentazione online delle Qt
+Name[ja]=Qt 最新オンラインドキュメント
+Name[kk]=Qt-ның ең жаңа желідегі құжаттамасы
+Name[km]=ឯកសារ​ថ្មី​បំផុត​លើ​បណ្ដាញ​របស់ Qt
+Name[ko]=최신 Qt 온라인 문서
+Name[lt]=Naujausia Qt dokumentacija tinkle
+Name[lv]=Jaunākā Qt Dokumentācija
+Name[mk]=Последната Qt-документација на мрежа
+Name[mn]=Хамгийн сүүлийн Qt онлайн баримтжуулалт
+Name[ms]=Dokumentasi Dalam Talian Kuantiti Terakhir
+Name[mt]=Dokumentazzjoni Qt Online
+Name[nb]=Nyeste QT-dokumentasjon på nett
+Name[nds]=Niegst Online-Dokmentatschoon vun Qt
+Name[ne]=नवीनतम Qt अनलाइन मिसिलीकरण
+Name[nl]=Nieuwste Qt Online-documentatie
+Name[nn]=Nyaste QT-dokumentasjon på nett
+Name[pa]=ਤਾਜ਼ਾ Qt ਆਨਲਾਈਨ ਦਸਤਾਵੇਜ਼
+Name[pl]=Najnowsza dokumentacja Qt
+Name[pt]=Última Documentação 'Online' do Qt
+Name[pt_BR]=Documentação on-line da última versão da Qt
+Name[ro]=Documentația Qt on-line
+Name[ru]=Наиболее свежая онлайн-документация Qt
+Name[rw]=Ikoreshanyandiko Interineti rya Vuba Qt
+Name[se]=Ođđamus Qt-dokumentašuvdna fierpmádagas
+Name[sk]=Posledná online dokumentácia Qt
+Name[sl]=Najnovejša spletna dokumentacija za Qt
+Name[sr]=Најновија документација Qt-а на вези
+Name[sr@Latn]=Najnovija dokumentacija Qt-a na vezi
+Name[sv]=Senaste Qt-direktdokumentation
+Name[ta]=புதிய க்யூ டீ இணை ஆவணப்பதிவு
+Name[tg]=Ҷадидтарин мустанадҳои рӯи хати Qt
+Name[th]=เอกสารออนไลน์ล่าสุดเกี่ยวกับ Qt
+Name[tr]=Güncel Çevrimiçi Qt Dökümantasyonu
+Name[tt]=Qt'nıñ Online Qullanması
+Name[uk]=Остання документація Qt онлайн
+Name[uz]=Qt uchun koʻllanma
+Name[uz@cyrillic]=Qt учун кўлланма
+Name[vi]=Tài liệu Trực tuyến Mới nhất của Qt
+Name[wa]=Documintåcion di Qt so les fyis
+Name[zh_CN]=最新的 Qt 在线文档
+Name[zh_TW]=最新的 Qt 線上文件
+Query=http://doc.trolltech.com/latest/\\{@}.html
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/qt3.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/qt3.desktop
new file mode 100644
index 000000000..bc59a41ac
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/qt3.desktop
@@ -0,0 +1,71 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=qt3
+Name=Qt3 Online Documentation
+Name[af]=Qt3 Aanlyn Dokumentasie
+Name[ar]=توثيق Qt3 على الخط
+Name[be]=Дакументацыя Qt3
+Name[bn]=কিউ-টি-৩ অনলাইন ডকুমেন্টেশন
+Name[br]=Teuliadur Qt3 enlinenn
+Name[bs]=Qt3 online dokumentacija
+Name[ca]=Documentació en línia de Qt3
+Name[cs]=Online dokumentace Qt3
+Name[csb]=Dokùmentacëjô online Qt3
+Name[da]=Qt3 online-dokumentation
+Name[de]=Online-Dokumentation zu Qt3
+Name[el]=Τεκμηρίωση του Qt3 στο διαδίκτυο
+Name[eo]=Reta QT Dokumentaro
+Name[es]=Documentación Qt3 en línea
+Name[et]=Qt3 dokumentatsioon võrgus
+Name[eu]=Qt3 lineako dokumentazioa
+Name[fa]=مستندات برخط Qt3
+Name[fi]=QT3:n verkkodokumentaatio
+Name[fr]=Documentation en ligne de Qt
+Name[fy]=Qt3 online dokumintaasje
+Name[ga]=Doiciméadú Ar Líne Qt3
+Name[gl]=Documentación en Liña de Qt3
+Name[he]=תיעוד מקוון מעודכן של Qt3
+Name[hr]=Qt dokumentacija na Internetu
+Name[hu]=Qt3 online dokumentáció
+Name[id]=Dokumentasi Online Qt3
+Name[is]=Qt handbækur á Netinu
+Name[it]=Documentazione online delle Qt3
+Name[ja]=Qt3 オンラインドキュメント
+Name[ka]=Qt3 ინტერნეტ დოკუმენტაცია
+Name[kk]=Qt3 желідегі құжаттамасы
+Name[km]=ឯកសារ​ថ្មី​បំផុត​លើ​បណ្ដាញ​របស់ Qt3
+Name[ko]=Qt3 온라인 문서
+Name[lt]=Qt3 dokumentacija internete
+Name[mk]=Документација за Qt3 на мрежа
+Name[ms]=Dokumentasi Dalam Talian Qt3
+Name[nb]=QT3-dokumentasjon på nett
+Name[nds]=Qt3-Online-Dokmentatschoon
+Name[ne]=Qt3 अनलाइन मिसिलीकरण
+Name[nl]=Qt3 online documentatie
+Name[nn]=QT3-dokumentasjon på nett
+Name[pa]=Qt3 ਆਨਲਾਇਨ ਦਸਤਾਵੇਜ਼
+Name[pl]=Dokumentacja Qt3 w sieci
+Name[pt]=Documentação 'Online' do Qt3
+Name[pt_BR]=Documentação on-line da Qt3
+Name[ro]=Documentația Qt online
+Name[ru]=Документация Qt3
+Name[se]=Qt3-dokumentašuvdna fierpmádagas
+Name[sk]=Qt3 online dokumentácia
+Name[sl]=Spletna dokumentacija za Qt3
+Name[sr]=Документација на вези за Qt3
+Name[sr@Latn]=Dokumentacija na vezi za Qt3
+Name[sv]=Qt3-direktdokumentation
+Name[tg]=Мустанадҳои шабакаи локалии Qt3
+Name[th]=เอกสารออนไลน์เกี่ยวกับ Qt3
+Name[tr]=Qt3 Çevrimiçi Dökümantasyonu
+Name[uk]=Документація Qt3
+Name[uz]=Qt3 uchun koʻllanma
+Name[uz@cyrillic]=Qt3 учун кўлланма
+Name[vi]=Tài liệu Trực tuyến của Qt3
+Name[wa]=Documintåcion di Qt3 so les fyis
+Name[zh_CN]=Qt3 在线文档
+Name[zh_TW]=Qt3 線上文件
+Query=http://doc.trolltech.com/3.3/\\{@}.html
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/rae.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/rae.desktop
new file mode 100644
index 000000000..b87befb0a
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/rae.desktop
@@ -0,0 +1,77 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=rae
+Name=Dictionary of the Spanish Academy (RAE)
+Name[af]=Woordeboek van die Spaanse Akademie (RAE)
+Name[ar]=قاموس الأكاديمية الأسبانية (RAE)
+Name[az]=İspan Akademiyası Lüğəti (RAE)
+Name[be]=Слоўнік Гішпанскай акадэміі (RAE)
+Name[bn]=স্প্যানিশ অ্যাকাডেমীর অভিধান (RAE)
+Name[br]=Geriaoueg akadamiezh spaniolek (RAE)
+Name[bs]=Rječnik Španske akademije (RAE)
+Name[ca]=Diccionari de l'Acadèmia Espanyola (RAE)
+Name[cs]=Slovník Špenělské akademie
+Name[csb]=Słowôrz Szpańsczi Akademijë (RAE)
+Name[cy]=Geiriadur yr Academi Sbaeneg (RAE)
+Name[da]=Ordbog fra det spanske akademi (RAE)
+Name[de]=Lexikon der spanischen Akademie (RAE)
+Name[el]=Λεξικό της ισπανικής ακαδημίας (RAE)
+Name[eo]=Vortaro de la Reĝa Akademio Hispana
+Name[es]=Diccionario de la Real Academia de la Lengua Española (RAE)
+Name[et]=Hispaania akadeemia (RAE) sõnaraamat
+Name[eu]=Gazteleraren Akademiaren hiztegia (RAE)
+Name[fa]=واژه‌نامۀ فرهنگستان اسپانیایی (RAE)
+Name[fi]=Espanjalaisen akatemian sanakirja (RAE)
+Name[fr]=Dictionaire de la Spanish Academy (RAE)
+Name[fy]=Wurdboek fan de Spaanske akademy (RAE)
+Name[gl]=Dicionario da Academia Española (RAE)
+Name[he]=מילון של האקדמיה הספרדית (RAE)
+Name[hi]=स्पेनी अकादमी का शब्दकोश(RAE)
+Name[hr]=Rječnik španjolske akademije (RAE)
+Name[hu]=A Spanyol Akadémia címjegyzéke (RAE)
+Name[is]=Orðabók spönsku akademíunnar (RAE)
+Name[it]=Dizionario della Accademia Spagnola (RAE)
+Name[ja]=スペイン大学辞書
+Name[kk]=Испан Академиясының сөздігі (RAE)
+Name[km]=វចនានុក្រម Spanish Academy (RAE)
+Name[ko]=스페인 아카데미 사전 (RAE)
+Name[lt]=Ispanijos akademijos (RAE) žodynas
+Name[lv]=Spāņu Akadēmijas (RAE) vārdnīca
+Name[mk]=Речник на Шпанската академија (RAE)
+Name[mn]=Испани акдемийн толь бичиг (RAE)
+Name[ms]=Kamus Akademi Bahasa Sepanyol (RAE)
+Name[mt]=Dizzjunarju tal-Akkademja Spanjola (RAE)
+Name[nb]=Ordboka til det spanske akademiet (RAE)
+Name[nds]=Nakieksel vun de Spaansche Akademie (RAE)
+Name[ne]=स्पेनी प्रतिष्ठानको शब्दकोश (RAE)
+Name[nl]=Woordenboek van de Spaanse academie (RAE)
+Name[nn]=Ordboka til det spanske akademiet (RAE)
+Name[pa]=ਸਪੇਨੀ ਐਕਡਮੀ ਦਾ ਸ਼ਬਦ-ਕੋਸ਼ (RAE)
+Name[pl]=Słownik Akademii Hiszpańskiej (RAE)
+Name[pt]=Dicionário da Academia Espanhola (RAE)
+Name[pt_BR]=Dicionário da Academia Espanhola (RAE)
+Name[ro]=Dicționarul Academiei Spaniole (RAE)
+Name[ru]=Словарь Испанской Академии (RAE)
+Name[rw]=Inkoranyamagambo y'Ishyirahamwe-intiti rya Esipanye (RAE)
+Name[se]=Spanialaš akademiija sátnegirji (RAE)
+Name[sk]=Slovník Španielskej akadémie (RAE)
+Name[sl]=Slovar Španske akademije (RAE)
+Name[sr]=Речник шпанске академије (RAE)
+Name[sr@Latn]=Rečnik španske akademije (RAE)
+Name[sv]=Spanska akademins ordbok (RAE)
+Name[ta]= ஸ்பெனிஷ் அகேடமியின் அகராதி(RAE)
+Name[tg]=Луғати академии Испаниёӣ (RAE)
+Name[th]=พจนานุกรมของ Spanish Academy (RAE)
+Name[tr]=İspanyol Akademisinin Sözlüğü (RAE)
+Name[tt]=İspan Akademineñ Süzlege (RAE)
+Name[uk]=Словник Іспанської академії (RAE)
+Name[uz]=Ispan akademiyasining (RAE) lugʻati
+Name[uz@cyrillic]=Испан академиясининг (RAE) луғати
+Name[vi]=Từ điển của Viện hàn lâm Tây Ban Nha (RAE)
+Name[wa]=Diccionaire del Royåle Academeye Espagnole (RAE)
+Name[zh_CN]=西班牙学院的字典(RAE)
+Name[zh_TW]=西班牙金像獎字典 (RAE)
+Query=http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&LEMA=\\{@}&FORMATO=ampliado
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/rfc.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/rfc.desktop
new file mode 100644
index 000000000..a11b090b0
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/rfc.desktop
@@ -0,0 +1,57 @@
+[Desktop Entry]
+Keys=rfc,rfcs
+Name=IETF Requests for Comments
+Name[af]=IETF Versoeke vir Kommentaar
+Name[ar]=طلبات IETF للتعليقات
+Name[az]=IETF Şərh İstəyi
+Name[be]=Запыты каментараў IETF
+Name[bs]=IETF Requests for Comments (RFC)
+Name[ca]=Requeriments per a comentaris de la IETF
+Name[csb]=IETF - dokùmentë RFC (sztandardë ë protokòłë)
+Name[cy]=Ceisiadau am Sylwadau IETF
+Name[el]=IETF ερωτήσεις για σχόλια
+Name[eo]=IETF-Komentodokumento (RFC)
+Name[fa]=درخواست IETF برای توضیحات
+Name[fi]=IETF-kommenttipyynnöt (RFC)
+Name[fr]=RFC IETF
+Name[gl]=IETF Peticións de Comentarios
+Name[hi]=IETF निवेदन, टिप्पणी के लिए
+Name[hr]=IETF zahtjevi za komentarima
+Name[hu]=IETF RFC-k (Request for Comments)
+Name[is]=IETF Requests for Comments (RFC)
+Name[it]=RFC di IETF
+Name[kk]=IETF пайымдаманы сұрау (RFC)
+Name[km]=សំណើ​សុំ​សេចក្ដី​អធិប្បាយ​តាម​រយៈ IETF
+Name[ko]=IETF RFC
+Name[lv]=IETF Komentāru Pieprasījums
+Name[mk]=IETF Барања за коментари (rfc)
+Name[ms]=Permintaan Komen IETF
+Name[nds]=RFCs (IETF-"Requests for Comments")
+Name[ne]=टिप्पणीका लागि IETF अनुरोध
+Name[nso]=Dikgopelo tsa IETF tsa Dipolelwana
+Name[pa]=ਟਿੱਪਣੀ ਲਈ IETF ਬੇਨਤੀ
+Name[pl]=IETF - dokumenty RFC (standardy i protokoły)
+Name[pt]=Pedidos de Comentários do IETF
+Name[pt_BR]=RFC (Requests for Comments)
+Name[ro]=RFC-uri IETF
+Name[ru]=Запросы для комментариев IETF (RFC)
+Name[rw]=Ibisabwa IETF bijyanye n'IIbisobanuro
+Name[sl]=Zahteve IETF za komentarje
+Name[sr]=IETF-ови захтеви за коментаре
+Name[sr@Latn]=IETF-ovi zahtevi za komentare
+Name[ta]=IETF குறிப்புகளுக்கான வேண்டுதல்கள்
+Name[tg]=Барои назри IETF-и дархост
+Name[th]=การร้องขอ IETF สำหรับคำอธิบาย
+Name[tr]=IETF Yorum istemleri
+Name[tt]=IETF-Açıqlama Soraw
+Name[uk]=Запит коментарів (RFC) IETF
+Name[ven]=IETF i humbela Mahumbulwa
+Name[vi]=Yêu cầu Bình luận IETF
+Name[wa]=Ricweraedjes po des rawetes IETF
+Name[xh]=Izicelo Zogqabazo ze IETF
+Name[zh_CN]=IETF 评论请求
+Name[zh_TW]=IETF RFC 文件
+Name[zu]=Izicelo ze-IETF zemibono
+Query=http://www.ietf.org/rfc/rfc\\{@}.txt
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/rpmfind.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/rpmfind.desktop
new file mode 100644
index 000000000..a6e407083
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/rpmfind.desktop
@@ -0,0 +1,44 @@
+[Desktop Entry]
+Type=Service
+Name=RPM-Find
+Name[af]=RPM-Vind
+Name[be]=Пошук RPM
+Name[csb]=Rpmfind - szëkôrz paczétów RPM
+Name[de]=RPM-Suche
+Name[el]=RPM-Αναζήτηση
+Name[eo]=RPM-trovilo
+Name[fa]=یافتن RPM
+Name[fi]=RPM-haku
+Name[fo]=RPM-finn
+Name[hi]=आरपीएम-फाइंड
+Name[hr]=RPM traženje
+Name[is]=RPM-leit
+Name[ka]=RPM-პოვნა
+Name[kk]=RPM-ды табу
+Name[km]=រក RPM
+Name[ko]=RPM 찾기
+Name[lv]=RPM-Meklēšana
+Name[mk]=RPM-барање
+Name[mn]=RPM-хайлт
+Name[ne]=RPM-फेला पार्नुहोस्
+Name[nso]=RPM-Hwetsa
+Name[pl]=Rpmfind - wyszukiwarka pakietów RPM
+Name[ro]=Căutare pachete RPM
+Name[ru]=Поиск RPM
+Name[rw]=Kubona-RPM
+Name[ss]=Tfola i-RPM
+Name[ta]=RPM-தேடு
+Name[tg]=Ҷустуҷӯи RPM
+Name[th]=ค้นหา RPM
+Name[tt]=RPM-Ezläw
+Name[uz]=RPM qidirish
+Name[uz@cyrillic]=RPM қидириш
+Name[ven]=RPM-Toda
+Name[vi]=Tìm RPM
+Name[xh]=RPM-Fumana
+Name[zu]=RPM-Thola
+ServiceTypes=SearchProvider
+Keys=rf,rpmfind
+Query=http://www.rpmfind.net/linux/rpm2html/search.php?query=\{@}
+Query[en_GB]=http://fr.rpmfind.net/linux/rpm2html/search.php?query=\{@}
+Query[ko]=http://www.rpmfind.net/linux/rpm2html/search.php?query=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/ruby_application_archive.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/ruby_application_archive.desktop
new file mode 100644
index 000000000..6f165eb65
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/ruby_application_archive.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Type=Service
+Name=Ruby Application Archive
+Name[af]=Ruby Aansoek Argief
+Name[ar]=أرشيف تطبيقات Ruby
+Name[az]=Ruby Proqram Arxivçisi
+Name[be]=Архіў праграмаў Ruby
+Name[bn]=রুবি অ্যাপলিকেশন আর্কাইভ
+Name[br]=Diell arloadoù Ruby
+Name[bs]=Ruby arhiva aplikacija
+Name[ca]=Arxiu d'aplicacions Ruby
+Name[cs]=Archív aplikací Ruby
+Name[csb]=Ruby - archiwa programów
+Name[cy]=Archif Cymhwysiadau Ruby
+Name[da]=Ruby programarkiv
+Name[el]=Αρχειοθήκη εφαρμογών Ruby
+Name[eo]=Aplikaĵoaĥivo por "Ruby"
+Name[es]=Archivo de aplicación Ruby
+Name[eu]=Ruby aplikazio fitxategia
+Name[fa]=بایگانی کاربرد Ruby
+Name[fi]=Ruby-sovelluspaketti
+Name[fr]=Archive d'application Ruby
+Name[fy]=Ruby programma-argyf
+Name[ga]=Cartlann Feidhmchlár Ruby
+Name[gl]=Arquivo de Aplicacións Ruby
+Name[he]=מאגר יישומי Ruby
+Name[hi]=रूबी अनुप्रयोग आर्काइव
+Name[hr]=Arhiva Ruby aplikacija
+Name[hu]=Ruby alkalmazásarchívum
+Name[id]=Arsip Aplikasi Ruby
+Name[it]=Archivio di applicazioni Ruby
+Name[ja]=Ruby アプリケーションアーカイブ
+Name[kk]=Ruby қолданбалар архиві
+Name[km]=ប័ណ្ណសារ​កម្មវិធី Ruby
+Name[ko]=Ruby 프로그램 저장소
+Name[lt]=Ruby taikomųjų programų archyvas
+Name[lv]=Ruby Aplikāciju Arhīvs
+Name[mk]=Архива со Ruby-апликации
+Name[ms]=Arkib Aplikasi Ruby
+Name[mt]=Arkivju ta' programmi Ruby
+Name[nb]=Ruby programarkiv
+Name[nds]=Ruby-Programmarchiv
+Name[ne]=रुबी अनुप्रयोग सङ्ग्रह
+Name[nl]=Ruby programma-archief
+Name[nn]=Ruby-programarkiv
+Name[nso]=Polokelo ya Tshomiso ya Ruby
+Name[pa]=Ruby ਕਾਰਜ ਆਰਚੀਵ
+Name[pl]=Ruby (język programowania) - programy
+Name[pt]=Arquivo de Aplicações Ruby
+Name[pt_BR]=Arquivo de Aplicativos Ruby
+Name[ro]=Arhiva de aplicații Ruby
+Name[ru]=Архив приложений Ruby
+Name[rw]=Ubushyinguro bwa Porogaramu Ruby
+Name[se]=Ruby-prográmmavuorká
+Name[sl]=Arhiv programov Ruby
+Name[sr]=Архива Ruby програма
+Name[sr@Latn]=Arhiva Ruby programa
+Name[ta]=ரூபி பயன்பாட்டு களஞ்சியம்
+Name[tg]=Архиви барномаи Ruby
+Name[th]=คลังแอพพลิเคชันภาษารูบี้
+Name[tr]=Ruby Uygulama Arşivi
+Name[tt]=Ruby Yazılımnar Turlaması
+Name[uz]=Ruby dastur arxivi
+Name[uz@cyrillic]=Ruby дастур архиви
+Name[ven]=Apulifikhesheni ya Vhulungazwakale ya Ruby
+Name[vi]=Thư mục lưu trữ Ứng dụng Ruby
+Name[wa]=Årtchive di programes Ruby
+Name[xh]=Indawo ye Ruby yokugcina Isicelo
+Name[zh_TW]=Ruby 應用程式檔案庫
+Name[zu]=Umqulu Womyaleli we-Ruby
+ServiceTypes=SearchProvider
+Keys=raa
+Query=http://raa.ruby-lang.org/search.rhtml?search=\\{@}
+Query[fy]=http://www.ruby-lang.org/en/raa-list.rhtml?name=\\{@}
+Query[ja]=http://raa.ruby-lang.org/search.rhtml?name=\\{@}
+Query[ko]=http://www.ruby-lang.org/en/raa-list.rhtml?name=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/seek.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/seek.desktop
new file mode 100644
index 000000000..55351db8f
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/seek.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Type=Service
+Name=GO.com
+Name[de]=go.com
+Name[eo]=Go.com
+Name[hi]=गो.कॉम
+Name[mn]=go.com
+Name[nso]=EYA.com
+ServiceTypes=SearchProvider
+Keys=seek
+Query=http://www.go.com/Titles?col=WW&qt=\\{@}&svx=home_searchbox&sv=IS&lk=noframeso
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/sourceforge.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/sourceforge.desktop
new file mode 100644
index 000000000..3a04f92a2
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/sourceforge.desktop
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Keys=sf,sourceforge
+Name=SourceForge
+Name[af]=Sourceforge
+Name[bn]=সোর্স-ফর্জ
+Name[csb]=SourceForge - ùdbë
+Name[eo]=Programforĝejo
+Name[fo]=Sourceforge
+Name[hi]=सोर्स-फोर्ज
+Name[ne]=सोर्स फर्ज
+Name[nso]=Bofora bja Mothopo
+Name[pl]=SourceForge - projekty
+Name[rw]=GucuraInkomoko
+Name[ta]=மூலத்திருட்டு
+Name[te]=సొర్స్ ఫొర్జ్
+Name[vi]=Tra SourceForge
+Query=http://sourceforge.net/search/?type_of_search=\\{type,"soft"}&exact=\{exact,"0"}&words=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/technorati.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/technorati.desktop
new file mode 100644
index 000000000..6a82f51a1
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/technorati.desktop
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Type=Service
+Name=Technorati
+Name[bn]=টেক্‌নোক্রেটি
+Name[csb]=Technorati - blodżi
+Name[lt]=Technorati paieška
+Name[ne]=टेक्नोरती
+Name[vi]=Tra từ Kĩ thuật bằng Technorati
+ServiceTypes=SearchProvider
+Keys=tr,technorati
+Query=http://technorati.com/cosmos/search.html?sourceid=kde-search&url=\\{@}
+Query[ja]=http://technorati.com/cosmos/search.html?sourceid=kde-search&url=\\\\{@}
+Query[ne]=http://technorati.com/cosmos/search.html?sourceid=kde-searchurl=\\{@}
+Charset=utf8
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/technoratitags.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/technoratitags.desktop
new file mode 100644
index 000000000..ce7dd5056
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/technoratitags.desktop
@@ -0,0 +1,55 @@
+[Desktop Entry]
+Type=Service
+Name=Technorati Tags
+Name[be]=Тэгі Technorati
+Name[bn]=টেক্‌নোক্রেটি ট্যাগ
+Name[br]=Liketennoù Technorati
+Name[bs]=Technorati tagove
+Name[ca]=Etiquetes Technorati
+Name[cs]=Technorati značky
+Name[csb]=Merczi Technorati
+Name[da]=Technorati mærker
+Name[de]=Technorati Themen
+Name[el]=Ετικέτες Technorati
+Name[eo]=Technorati-aj Etikedoj
+Name[es]=Etiquetas de Technorati
+Name[et]=Technorati sildid
+Name[eu]=Technorati etiketak
+Name[fa]=برچسبهای Technorati
+Name[fi]=Technorati-tunnisteet
+Name[fr]=Balises Technorati
+Name[fy]=Technorati-markearring
+Name[ga]=Clibeanna Technorati
+Name[gl]=Etiquetas Technorati
+Name[hr]=Technorati oznake
+Name[is]=Technorati tög
+Name[it]=Tag di technorati
+Name[ja]=Technorati Tag
+Name[ka]=Technorati-ს ჭდეები
+Name[ko]=Technorati 태그
+Name[nb]=Technorati-tagger
+Name[nds]=Technorati-Themas
+Name[ne]=टेक्नोरती ट्याग
+Name[nl]=Technorati-tags
+Name[nn]=Technorati-taggar
+Name[pa]=Technorati ਟੈਗ
+Name[pl]=Znaczniki Technorati
+Name[pt]=Marcas do Technorati
+Name[pt_BR]=Tags do Technorati
+Name[ro]=Etichete Technorati
+Name[ru]=Статьи Technorati
+Name[rw]=Amatagi ya Technorati
+Name[se]=Technorati gilkorat
+Name[sr]=Technorati ознаке
+Name[sr@Latn]=Technorati oznake
+Name[sv]=Technorati-taggar
+Name[tg]=Тегҳои Technorati
+Name[uk]=Статті Technorati
+Name[vi]=Nhãn Technorati
+Name[wa]=Tags Technorati
+ServiceTypes=SearchProvider
+Keys=tags,tag,technoratitags
+Query=http://technorati.com/tag/\\{@}?sourceid=kde-search
+Query[ja]=http://technorati.com/tag/\\\\{@}?sourceid=kde-search
+Query[tg]=http://technorati.com/tag/\\{@}?sourceid=kde-ҷустуҷӯ
+Charset=utf8
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/thesaurus.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/thesaurus.desktop
new file mode 100644
index 000000000..f1c9576c0
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/thesaurus.desktop
@@ -0,0 +1,63 @@
+[Desktop Entry]
+Type=Service
+Name=Merriam-Webster Thesaurus
+Name[ar]=قاموس مصطلحات Merriam-Webster
+Name[be]=Тэзаўрус Merriam-Webster
+Name[bn]=মেরিয়াম-ওয়েবস্টার থেসরাস
+Name[br]=Tezorus Merriam-Webster
+Name[ca]=Tesaurus Merriam-Webster
+Name[cs]=Slovník synonym Merriam-Webster
+Name[csb]=Merriam-Webster - słowôrz blëskòznacznrch słowów (thesaurus)
+Name[cy]=Thesawrws Merriam-Webster
+Name[da]=Merriam-Webster-begrebsordbog
+Name[el]=Θησαυρός λέξεων Merriam-Webster
+Name[eo]=Merriam - Webster-tezaŭro
+Name[es]=Sinónimos Merriam-Webster
+Name[et]=Merriam-Websteri tesaurus
+Name[eu]=Merriam-Webster thesaurus-a
+Name[fa]=فرهنگ جامع Merriam-Webster
+Name[fi]=Merriam-Webster-synonyymit
+Name[fr]=Thésaurus Merriam-Webster
+Name[ga]=Teasáras Merriam-Webster
+Name[he]=מילים נרדפות Merriam-Webster
+Name[hi]=मरियम-वेबस्टर शब्दकोश
+Name[hr]=Merriam-Webster rječnik sinonima
+Name[hu]=Merriam-Webster szinonimaszótár
+Name[is]=Merriam-Webster samheitaorðabók
+Name[it]=Dizionario dei sinonimi Merriam-Webster
+Name[kk]=Merriam-Webster тезаурусы
+Name[km]=កម្រង​វេវចន​សព្ទ Merriam-Webster
+Name[ko]=Merriam-Webster 시소러스
+Name[lv]=Merriam-Webster Enciklopēdija
+Name[mk]=Merriam-Webster Енциклопедија
+Name[mt]=Teżawru Merriam-Webster
+Name[nb]=Merrian-Webster Thesaurus
+Name[nds]=Merriam-Webster-Thesaurus
+Name[ne]=मेरियम-वेबस्टर पर्यायकोष
+Name[pa]=Merriam-ਵੈੱਬ ਥੀਸਾਰਸ ਕੋਸ਼
+Name[pl]=Merriam-Webster - słownik wyrazów bliskoznacznych
+Name[pt]=Merriam-Gramática do Webster
+Name[ro]=Dicționarul Merriam-Webster
+Name[ru]=Тезаурус Merriam-Webster
+Name[rw]=Impuzansobanuro Merriam-Webster
+Name[sk]=Merriam-Webster Synonymá
+Name[sl]=Merriam-Websterjev tezaver
+Name[sr]=Речник синонима Меријам-Вебстер
+Name[sr@Latn]=Rečnik sinonima Merijam-Vebster
+Name[sv]=Merriam-Websters synonymlexikon
+Name[ta]=மெர்ரியம்-வெப்ஸ்டர் சொற்களஞ்சியம்
+Name[tg]=Тезауруси Merriam-Webster
+Name[th]=พจนานุกรมคำพ้องเมอเรียม-เว็บสเตอร์
+Name[tt]=Merriam-Webster Süznämäse
+Name[uk]=Словник синонімів Merriam-Webster
+Name[uz]=Merriam-Vebster lugʻati
+Name[uz@cyrillic]=Мерриам-Вебстер луғати
+Name[vi]=Từ điển đồng nghĩa Merriam-Webster
+Name[wa]=Diccionaire inglès Merriam-Webster
+Name[zh_CN]=韦氏辞典
+Name[zh_TW]=韋氏辭典
+Name[zu]=Incawdi yamagama afanayo ye-Merriam-Webster
+ServiceTypes=SearchProvider
+Keys=ths,thesaurus
+Query=http://www.m-w.com/cgi-bin/thesaurus?book=Thesaurus&va=\\{@}
+Query[ne]=http://www.m-w.com/cgi-bin/thesaurus?book=Thesaurusva=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/tvtome.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/tvtome.desktop
new file mode 100644
index 000000000..a24f74287
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/tvtome.desktop
@@ -0,0 +1,24 @@
+[Desktop Entry]
+Charset=utf8
+Keys=tvtome
+Name=TV Tome
+Name[be]=Хатняе ТБ
+Name[bn]=টিভি টোম
+Name[da]=TV-Tome
+Name[eu]=TV toma
+Name[nb]=Stor TV
+Name[ne]=टीभी टोम
+Name[nn]=Stor TV
+Name[rw]=Igice TV
+Name[sv]=TV-tome
+Name[te]=టివి టొమ్
+Name[tg]=Томи левизиони Хона
+Name[th]=ทีวีทอร์ม
+Name[tr]=TV Kanalları
+Name[vi]=Tra Quyển TV
+ServiceTypes=SearchProvider
+Query=http://www.tv.com/search.php?type=11&stype=all&qs=\\{@}&x=0&y=0
+Query[ja]=http://www.tv.com/search.php?type=11&stype=all&qs=\\\\{@}&x=0&y=0
+Query[ne]=http://www.tv.com/search.php?type=11stype=all&qs=\\{@}&x=0&y=0
+Query[tg]=http://www.tv.com/search.php?type=11&stype=ҳама&qs=\\{@}&x=0&y=0
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/uspto.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/uspto.desktop
new file mode 100644
index 000000000..6bed5bc9b
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/uspto.desktop
@@ -0,0 +1,74 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=uspto
+Name=U.S. Patent Database
+Name[af]=Amerikaanse Patente Databasis
+Name[ar]=قاعدة البيانات U.S. Patent Database
+Name[be]=База звестак аб патэнтах ЗША
+Name[bn]=মার্কিন পেটেন্ট ডেটাবেস
+Name[bs]=SAD baza patenata
+Name[ca]=Base de dades de patents U.S.
+Name[cs]=Patentová databáze USA
+Name[csb]=Baza patentów USA
+Name[da]=U.S. Patent-database
+Name[de]=U.S.-Patentdatenbank
+Name[eo]=U.S. Rajtaj datumbazoj
+Name[es]=Base de datos de patentes de EEUU
+Name[et]=USA patentide andmebaas
+Name[eu]=EEBB patente datu-basea
+Name[fa]=دادگان امتیاز امریکایی
+Name[fi]=Yhdysvaltojen patenttitietokanta
+Name[fr]=Base de données des brevets aux U.S.A
+Name[fy]=U.S. Patent-database
+Name[gl]=Base de Datos de Patentes dos E.E.U.U
+Name[he]=מסד הפטנטים של ארה"ב
+Name[hi]=यूएस पेटेन्ट डाटाबेस
+Name[hr]=Američka patentna baza podataka
+Name[hu]=Amerikai szabadalmi adatbázis
+Name[id]=Basisdata Paten Amerika Serikat
+Name[is]=Gagnagrunnur einkaleyfisstofu Bandaríkjana
+Name[it]=Database brevetti U.S.A.
+Name[ja]=米国特許データベース
+Name[ka]=აშშ პატენტების მონაცემთა ბაზა
+Name[kk]=АҚШ патенттер қоры
+Name[km]=មូលដ្ឋាន​ទិន្នន័យ​ប៉ាតង់​សហរដ្ឋ​អាមេរិក
+Name[ko]=미국 특허 데이터베이스
+Name[lt]=JAV patentų duomenų bazė
+Name[lv]=ASV patentu datubāze
+Name[mk]=База со патенти во САД
+Name[ms]=Pangkalan Data Paten A.S.
+Name[nb]=US patentdatabase
+Name[nds]=Datenbank mit de Patenten vun de USA
+Name[ne]=यूएस प्याटेन्ट डेटाबेस
+Name[nl]=U.S. Patent-database
+Name[nn]=US patentdatabase
+Name[pa]=U.S. Patent ਡਾਟਾਬੇਸ
+Name[pl]=Baza patentów USA
+Name[pt]=Base de Dados de Patentes dos EUA
+Name[pt_BR]=Base de dados de patentes dos EUA
+Name[ro]=Baza de date de patente S.U.A.
+Name[ru]=База патентов США
+Name[rw]=Ububikoshingiro Ipatanti bwa Leta Zunze Ubumwa z'Amerika
+Name[se]=Amerihká patenta diehtovuođđu
+Name[sk]=U.S. patentová databáza
+Name[sl]=Zbirka patentov U.S. Patent Database
+Name[sr]=База патената САД
+Name[sr@Latn]=Baza patenata SAD
+Name[sv]=Förenta staternas patentdatabas
+Name[ta]=U.S.காப்புரிமை தரவுதளம்
+Name[te]=యూఎస్ పెటెంట్ డాటాబేస్
+Name[tg]=Патенти базаи маълумотҳои Иолоти Муттаҳида
+Name[th]=ฐานข้อมูลสิทธิบัตรของสหรัฐอเมริกาฯ
+Name[tr]=U.S. Patent Veritabanı
+Name[tt]=AQŞ Patentlar Tuplaması
+Name[uk]=База даних патентів в США
+Name[uz]=AQSH patent maʼlumot bazasi
+Name[uz@cyrillic]=АҚШ патент маълумот базаси
+Name[vi]=Cơ sở dữ liệu Bằng sáng chế Hoa Kỳ
+Name[wa]=Båze di dnêyes des brevets U.S.
+Name[zh_CN]=美国专利数据库
+Name[zh_TW]=U.S. 專利權資料庫
+Query=http://patft.uspto.gov/netacgi/nph-Parser?TERM1=\\{@}&Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=/netahtml/srchnum.htm&r=0&f=S&l=50
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/vivisimo.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/vivisimo.desktop
new file mode 100644
index 000000000..4fb6d0551
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/vivisimo.desktop
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Type=Service
+Name=Vivisimo
+Name[bn]=ভিভিসিমো
+Name[hi]=विविसिमो
+Name[ka]=ვივისიმო
+Name[ne]=भिभिसिमो
+Name[pa]=ਵੀਵੀਸੀਮੋ
+Name[ta]=விவிசிமோ
+Name[te]=వివిస్మొ
+Name[vi]=Tra Vivisimo
+ServiceTypes=SearchProvider
+Keys=vi
+Query=http://vivisimo.com/search?query=\\{@}&se=Yahoo%2CAltaVista%2CMSN%2CFast%2COD%2CExcite%2CDirectHit%2CLooksmart%2CEuroseek&x=49&y=16
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/voila.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/voila.desktop
new file mode 100644
index 000000000..034213e7b
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/voila.desktop
@@ -0,0 +1,17 @@
+[Desktop Entry]
+Type=Service
+Name=Voila
+Name[bn]=ভয়লা
+Name[hi]=वाइला
+Name[ne]=भोइला
+Name[pa]=ਵੋਈਲਾ
+Name[ta]=வாய்லா
+Name[te]=వొయిలా
+Name[th]=เวยลา
+Name[vi]=Tra Voila
+Name[wa]=Voilà
+ServiceTypes=SearchProvider
+Keys=voila
+Query=http://search.ke.voila.fr/S/voila?lg=fr&profil=geeks&rtype=kw&bhv=web_mondial&rdata=\\{@}
+Query[ja]=http://search.ke.voila.fr/S/voila?lg=fr&profil=geeks&rtype=kw&bhv=web_mondial&rdata=\\\\{@}
+Query[sk]=http://search.ke.voila.fr/S/voila?lg=fr&profil=geeks&rtype=kw&bhv=web_mondial&rdata=\\{@
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/webster.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/webster.desktop
new file mode 100644
index 000000000..bcb5fe583
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/webster.desktop
@@ -0,0 +1,73 @@
+[Desktop Entry]
+Type=Service
+Name=Merriam-Webster Dictionary
+Name[af]=Merriam-Webster Woordeboek
+Name[ar]=قاموس Merriam-Webster
+Name[az]=Merriam-Webster Sözlüyü
+Name[be]=Слоўнік Merriam-Webster
+Name[bn]=মেরিয়াম-ওয়েবস্টার অভিধান
+Name[br]=Geriaoueg Merriam-Webster
+Name[bs]=Merriam-Webster rječnik
+Name[ca]=Diccionari Merriam-Webster
+Name[cs]=Slovník Merriam-Webster
+Name[csb]=Merriam-Webster - słowôrz
+Name[cy]=Geiriadur Merriam-Webster
+Name[da]=Merriam-Webster-ordbog
+Name[de]=Merriam-Webster-Dictionary
+Name[el]=Λεξικό Merriam-Webster
+Name[eo]=Merriam - Webster-vortaro
+Name[es]=Diccionario Merriam-Webster
+Name[et]=Merriam-Websteri sõnaraamat
+Name[eu]=Merriam-Webster hiztegia
+Name[fa]=واژه‌نامۀ Merriam-Webster
+Name[fi]=Merriam-Webster-sanakirja
+Name[fr]=Dictionnaire Merriam-Webster
+Name[ga]=Foclóir Merriam-Webster
+Name[hi]=मरियम-वेबस्टर शब्दकोश
+Name[hr]=Merriam-Webster rječnik
+Name[hu]=Merriam-Webster szótár
+Name[is]=Merriam-Webster orðabókin
+Name[it]=Dizionario Merriam-Webster
+Name[ka]=Словарь Merriam-Webster
+Name[kk]=Merriam-Webster сөздігі
+Name[km]=វចនានុក្រម Merriam-Webster
+Name[ko]=Merriam-Webster 사전
+Name[lv]=Merriam-Webster Vārdnīca
+Name[mk]=Merriam-Webster Речник
+Name[mt]=Dizzjunarju Merriam-Webster
+Name[nds]=Merriam-Webster-Wöörbook
+Name[ne]=मेरियम-वेबस्टर शब्दकोश
+Name[nso]=Pukuntsu ya Merriam-Webster
+Name[pa]=Merriam-ਵੈਬਸਟੀਰ ਸ਼ਬਦ-ਕੋਸ਼
+Name[pl]=Merriam-Webster - słownik
+Name[pt]=Merriam-Dicionário do Webster
+Name[pt_BR]=Dicionário Merriam-Webster
+Name[ro]=Dicționarul Merriam-Webster
+Name[ru]=Словарь Merriam-Webster
+Name[rw]=Inkoranyamagambo Merriam-Webster
+Name[sk]=Slovník Merriam-Webster
+Name[sl]=Slovar Merriam-Webster
+Name[sr]=Речник Меријам-Вебстер
+Name[sr@Latn]=Rečnik Merijam-Vebster
+Name[ss]=Sichazimagama se Merriam-Webster
+Name[sv]=Merriam-Websters ordlexikon
+Name[ta]=மெர்ரியம்-வெப்ஸ்டர் அகராதி
+Name[te]=మెర్రియం-వెబ్స్టర్ నిఘంటువు
+Name[tg]=Луғати Merriam-Webster
+Name[th]=พจนานุกรมเมอร์เรียม-เว็บสเตอร์
+Name[tr]=Merriam-Webster Sözlüğü
+Name[tt]=Merriam-Webster Süzlege
+Name[uk]=Словник Merriam-Webster
+Name[uz]=Merriam-Webster lugʻati
+Name[uz@cyrillic]=Merriam-Webster луғати
+Name[ven]=Bugu ya Thalutshedza maipfi ya Merrian-Webster
+Name[vi]=Từ điển Merriam-Webster
+Name[wa]=Diccionaire inglès Merriam-Webster
+Name[xh]= Dikshinari ye Merriam-Webster
+Name[zh_CN]=韦氏词典
+Name[zh_TW]=韋氏詞典
+Name[zu]=Isichazamagama se-Merriam-Webster
+ServiceTypes=SearchProvider
+Keys=dict,webster
+Query=http://www.m-w.com/cgi-bin/dictionary?book=Dictionary&va=\\{@}
+Query[ne]=http://www.m-w.com/cgi-bin/dictionary?book=Dictionaryva=\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/whatis.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/whatis.desktop
new file mode 100644
index 000000000..1cf117c27
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/whatis.desktop
@@ -0,0 +1,71 @@
+[Desktop Entry]
+Type=Service
+Name=Whatis Query
+Name[af]=Whatis navraag
+Name[az]=Whatis Sorğusu
+Name[be]=Запыт Whatis
+Name[bn]=Whatis জিজ্ঞাসা
+Name[br]=Klask Whatis
+Name[bs]=Whatis upit
+Name[ca]=Consulta Whatis
+Name[cs]=Dotaz 'Co je?'
+Name[csb]=Whatis - infòrmaticznô baza wiedzbë
+Name[cy]=Ymholiad Beth-yw-Hwn
+Name[da]=Whatis-forespørgsel
+Name[de]=Whatis-Abfrage
+Name[el]=Ερώτηση Whatis
+Name[eo]=Kio-estas-demando
+Name[es]=Consulta Whatis
+Name[et]=Whatis päring
+Name[eu]=Whatis bilaketa
+Name[fa]=پرس‌وجوی Whatis
+Name[fi]=Whatis-haku
+Name[fr]=Requête whatis
+Name[ga]=Iarratas Whatis
+Name[gl]=Pergunta a Whatis
+Name[he]=שאילתת Whatis
+Name[hi]=व्हाट-इज़ क्वेरी
+Name[hr]=Whatis propitivanje
+Name[hu]=Whatis-lekérdezés
+Name[is]=Whatis fyrirspurn
+Name[it]=Richiesta whatis
+Name[ja]=Whatis 検索
+Name[ka]=მოთხოვნა - რა არის
+Name[kk]=Whatis сұранысы
+Name[km]=សំណួរ Whatis
+Name[lt]=Whatis užklausa
+Name[lv]=Whatis pieprasījums
+Name[mk]=Whatis прашалник
+Name[ms]=WPertanyaan Apa itu
+Name[mt]=Tfittxija Whatis
+Name[nb]=Forespørsel i databasen «Whatis»
+Name[nds]=Whatis-Anfraag
+Name[ne]=Whatis क्वेरी
+Name[nn]=Whatis-oppslag
+Name[pa]=ਇਹ ਕੀ ਸਵਾਲ
+Name[pl]=Whatis - informatyczna baza wiedzy
+Name[pt]=Pesquisa 'O Que é Isto?'
+Name[pt_BR]=Busca Whatis
+Name[ro]=Interogare "Ce înseamnă asta"
+Name[ru]=Запрос whatis
+Name[rw]=Ikibazo ni iki
+Name[se]=Whatis-jearaldat
+Name[sk]=Otázka "Čo to je?"
+Name[sl]=Poizvedba Whatis
+Name[sr]=Whatis упит
+Name[sr@Latn]=Whatis upit
+Name[sv]=Vad är det här-fråga
+Name[ta]=கேள்வி என்றால் என்ன
+Name[tg]=Ҷустуҷӯъ чист
+Name[th]=การค้นหา Whatis
+Name[tr]=Nedir Sorgusu
+Name[tt]=Whatis Sorawı
+Name[uk]=Запит "Що це"
+Name[vi]=Hỏi Whatis
+Name[wa]=Cweraedje Whatis
+Name[zh_CN]=Whatis 查询
+Name[zh_TW]=Whatis 查詢
+ServiceTypes=SearchProvider
+Keys=wi,whatis
+Query=http://whatis.techtarget.com/wsearchResults/1,290214,,00.html?query=\\{@}
+Query[ja]=http://whatis.techtarget.com/wsearchResults/1,290214,,00.html?query=\\\\{@}
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/wikipedia.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/wikipedia.desktop
new file mode 100644
index 000000000..5bc56d83e
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/wikipedia.desktop
@@ -0,0 +1,94 @@
+[Desktop Entry]
+Type=Service
+Name=Wikipedia - The Free Encyclopedia
+Name[af]=Wikipedia - Die gratis ensiklopidie
+Name[ar]=الموسوعة الحرّة Wikipedia
+Name[az]=Wikipedia - Pulsuz Ensiklopediya
+Name[be]=Wikipedia - Свабодная Энцыклапедыя
+Name[bn]=উইকিপেডিয়া - মুক্ত বিশ্বকোষ
+Name[br]=Wikipedia - Ar geriadur ouiziegezh frank
+Name[bs]=Wikipedia - Slobodna enciklopedija
+Name[ca]=Viquipèdia - L'enciclopèdia lliure
+Name[cs]=Wikipedia - volně dostupná encyklopedie
+Name[csb]=Wikipedijô - wòlnô encyklopedijô
+Name[cy]=Wikipedia - Y Gwyddoniadur Rhydd
+Name[da]=Wikipedia - Det frie leksikon
+Name[de]=Wikipedia - Die freie Enzyklopädie
+Name[el]=Wikipedia - Η ελεύθερη εγκυκλοπαίδεια
+Name[eo]=Vikipedio - la libera enciklopedio
+Name[es]=Wikipedia - La enciclopedia libre
+Name[et]=Wikipedia - Vaba entsüklopeedia
+Name[eu]=Wikipedia - Entziklopedia librea
+Name[fa]=Wikipedia - دایره‌المعارف آزاد
+Name[fi]=Wikipedia - Vapaa tietosanakirja
+Name[fr]=Wikipedia - L'encyclopédie libre
+Name[fy]=Wikipedia - de frije ensyklopedy
+Name[ga]=Wikipedia - An Chiclipéid Shaor
+Name[gl]=Wikipedia - A Enciclopédia Libre
+Name[he]=וויקיפדיה - האנציקלופדיה החופשית
+Name[hi]=विकिपेडिया- मुफ्त विश्वकोश
+Name[hr]=Wikipedia - besplatna enciklopedija
+Name[hu]=Wikipedia
+Name[is]=Wikipedia - Frjálst alfræðiorðasafn
+Name[it]=Wikipedia - L'enciclopedia libera
+Name[ja]=Wikipedia - フリーな百科事典
+Name[ka]=ვიკიპედია - ღია ენციკლოპედია
+Name[kk]=Wikipedia - ашық энциклопедия
+Name[km]=Wikipedia - សព្វវចនាធិប្បាយ​ឥត​គិត​ថ្លៃ
+Name[ko]=위키백과 - 우리 모두의 백과사전
+Name[lt]=Wikipedia - laisva enciklopedija
+Name[lv]=Wikipedia - Brīvā enciklopēdija
+Name[mk]=Википедија - Слободната енциклопедија
+Name[mn]=Wikipedia - Чөлөөт толь бичиг
+Name[ms]=Wikipedia - Ensiklopedia Percuma
+Name[mt]=Wikipedia - L-Enċiklopedija Ħielsa
+Name[nb]=Wikipedia – det frie leksikonet
+Name[nds]=Wikipedia - dat fre'e Nakieksel
+Name[ne]=विकिपिडिया - नि: शुल्क इन्साइक्लोपेडिया
+Name[nl]=Wikipedia - de vrije encyclopedie
+Name[nn]=Wikipedia – det frie leksikonet
+Name[pa]=ਵਿੱਕੀਪੀਡਿਆ - ਮੁਫਤ ਵਿਸ਼ਵਕੋਸ਼
+Name[pl]=Wikipedia - otwarta encyklopedia
+Name[pt]=Wikipedia - A Enciclopédia Livre
+Name[pt_BR]=Wikipedia - A Enciclopédia Livre
+Name[ro]=Wikipedia - Enciclopedia liberă
+Name[ru]=Wikipedia - свободная энциклопедия
+Name[rw]=Wikipedia - Inkoranya y'Ubuntu
+Name[se]=Wikipedia – fridja leksikona
+Name[sk]=Wikipedia - voľne dostupná encyklopédia
+Name[sl]=Wikipedia - Prosta enciklopedija
+Name[sr]=Wikipedia — слободна енциклопедија
+Name[sr@Latn]=Wikipedia — slobodna enciklopedija
+Name[sv]=Wikipedia - den fria encyklopedin
+Name[ta]=விகிபிடியா - இலவச கலைக்களஞ்சியம்
+Name[te]=వికీపీడియా - స్వేఛ్ఛా విజ్ఞాన సర్వస్వము
+Name[tg]=Wikipedia - Энсиклопедияи озод
+Name[th]=วิกิพีเดีย - สารานุกรมฟรี
+Name[tr]=Wikipedia - Ücretsiz Ansiklopedi
+Name[tt]=Wikipedia - Buşlay Ensiklopedia
+Name[uk]=Wikipedia - вільна енциклопедія
+Name[uz]=Wikipedia - Erkin ensiklopediya
+Name[uz@cyrillic]=Wikipedia - Эркин энциклопедия
+Name[vi]=Wikipedia - Bách khoa toàn thư mở
+Name[wa]=Wikipedia - Li libe eciclopedeye (walon)
+Name[zh_CN]=维基百科 - 免费的百科全书
+Name[zh_TW]=Wikipedia - 免費的 Encyclopedia
+ServiceTypes=SearchProvider
+Keys=wp
+Query=http://en.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[de]=http://de.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[fi]=http://fi.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[fr]=http://fr.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[fy]=http://fy.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[it]=http://it.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[ko]=http://ko.wikipedia.org/wiki/Special:Search?search=\\{@}&go=Go
+Query[nb]=http://no.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[ne]=http://en.wikipedia.org/wiki/Special:Search?search=\{@}go=Go
+Query[nl]=http://nl.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[pa]=http://en.wikipedia.org/wiki/Special:Search?search=\{@}&go=ਜਾਓ
+Query[pl]=http://pl.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[tt]=http://tt.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[vi]=http://vi.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[wa]=http://wa.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[zh_CN]=http://zh.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Charset=utf8
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/wiktionary.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/wiktionary.desktop
new file mode 100644
index 000000000..f4dfa192d
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/wiktionary.desktop
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Name=Wiktionary - The Free Dictionary
+Name[af]=Wiktionary - Die gratis woordeboek
+Name[ar]=القاموس المجاني Wiktionary
+Name[be]=Wiktionary - Свабодны Слоўнік
+Name[bn]=ইউক্‌শনারি - মুক্ত অভিধান
+Name[br]=Wiktionary - Ar geriadur frank
+Name[bs]=Wiktionary - Slobodni rječnik
+Name[ca]=Viccionari - El diccionari lliure
+Name[cs]=Wiktionary - volně dostupný slovník
+Name[csb]=Wiktionary - wòlny słowôrz
+Name[da]=Wiktionary - Den frie ordbog
+Name[de]=Wiktionary - Das freie Wörterbuch
+Name[el]=Wiktionary - Το ελεύθερο λεξικό
+Name[eo]=Vikivortaro - la libera vortaro
+Name[es]=Wikitionary - El diccionario libre
+Name[et]=Wiktionary - Vaba sõnaraamat
+Name[eu]=Wiktionary - Hiztegi librea
+Name[fa]=Wiktionary - واژه‌نامۀ آزاد
+Name[fi]=Wiktionary - Vapaa sanakirja
+Name[fr]=Wiktionary - Le dictionnaire libre
+Name[fy]=Wiktionary - It frije wurdboek
+Name[ga]=Wiktionary - An Foclóir Saor
+Name[gl]=Wiktionary - O dicionario libre
+Name[he]=וויקימילון - המילון החופשי
+Name[hr]=Wiktionary - besplatna enciklopedija
+Name[hu]=Wiktionary
+Name[is]=Wiktionary - Frjálsa orðabókin
+Name[ja]=Wictionary - フリーな辞書
+Name[ka]=Wiktionary - თავისუფალი ლექსიკონი
+Name[kk]=Wiktionary - ашық сөздік
+Name[km]=Wikipedia - វចនានុក្រម​ឥតគិតថ្លៃ
+Name[ko]=위키낱말사전
+Name[lt]=Wiktionary - laisvasis žodynas
+Name[mk]=Wiktionary - Слободниот речник
+Name[nb]=Wiktionary – den frie ordboka
+Name[nds]=Wiktionary - dat fre'e Wöörbook (engl.)
+Name[ne]=विक्सनरी - नि: शुल्क शब्दकोश
+Name[nl]=Wiktionary - het vrije woordenboek
+Name[nn]=Wikipedia – det frie oppslagsverket
+Name[pa]=ਵਿੱਕੀਸ਼ਨਰੀ - ਮੁਫਤ ਸ਼ਬਦ-ਕੋਸ਼
+Name[pl]=Wiktionary - Otwarty słownik
+Name[pt]=Wiktionary - O Dicionário Livre
+Name[pt_BR]=Wiktionary - O Dicionário Livre
+Name[ro]=Wiktionary - Dictionarul liber
+Name[ru]=Wiktionary - свободный словарь
+Name[se]=Wiktinary – fridja sátnegirji
+Name[sk]=Wiktionary = voľne dostupný slovník
+Name[sl]=Wiktionary - Prosti slovar
+Name[sr]=Wiktionary — слободан речник
+Name[sr@Latn]=Wiktionary — slobodan rečnik
+Name[sv]=Wiktionary - den fria ordboken
+Name[te]=విక్షనరి - స్వేఛ్ఛా పదకోశము
+Name[tg]=Wiktionary - Энсиклопедияи озод
+Name[th]=วิกิชันนารี - พจนานุุกรมฟรี
+Name[tr]=Wiktionary - Ücretsiz Ansiklopedi
+Name[tt]=Wiktionary - Buşlay Süzlek
+Name[uk]=Wiktionary - вільний словник
+Name[uz]=Wiktionary - Erkin lugʻat
+Name[uz@cyrillic]=Wiktionary - Эркин луғат
+Name[vi]=Wiktionary - Từ điển mở
+Name[wa]=Wikitionary - Li libe motî (inglès)
+Name[zh_CN]=维基字典 - 免费的字典
+Name[zh_TW]=Wiktionary - 免費的字典
+ServiceTypes=SearchProvider
+Keys=wt,wikt
+Query=http://en.wiktionary.org/wiki/Special:Search?search=\{@}&go=Go
+Query[csb]=http://pl.wiktionary.org/wiki/Special:Search?search=\{@}&go=Go
+Query[eo]=http://eo.wiktionary.org/wiki/Special:Search?search=\{@}&go=Go
+Query[fr]=http://fr.wiktionary.org/wiki/Special:Search?search=\{@}&go=Go
+Query[fy]=http://fy.wiktionary.org/wiki/Special:Search?search=\{@}&go=Go
+Query[he]=http://he.wiktionary.org/wiki/Special:Search?search=\{@}&go=Go
+Query[ko]=http://ko.wiktionary.org/wiki/Special:Search?search=\\{@}&go=Go
+Query[nb]=http://no.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[ne]=http://en.wiktionary.org/wiki/Special:Search?search=\{@}go=Go
+Query[nl]=http://nl.wiktionary.org/wiki/Special:Search?search=\{@}&go=Go
+Query[nn]=http://en.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[pa]=http://en.wiktionary.org/wiki/Special:Search?search=\{@}&go=ਜਾਓ
+Query[pl]=http://pl.wiktionary.org/wiki/Special:Search?search=\{@}&go=Go
+Query[tg]=http://en.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[th]=http://en.wikipedia.org/wiki/Special:Search?search=\{@}&go=Go
+Query[tt]=http://tt.wiktionary.org/wiki/Special:Search?search=\{@}&go=Go
+Query[zh_CN]=http://zh.wiktionary.org/wiki/Special:Search?search=\{@}&go=Go
+Charset=utf8
diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviders/wordref.desktop b/kcontrol/ebrowsing/plugins/ikws/searchproviders/wordref.desktop
new file mode 100644
index 000000000..2a3d70523
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/ikws/searchproviders/wordref.desktop
@@ -0,0 +1,78 @@
+[Desktop Entry]
+Charset=
+Hidden=false
+Keys=wordref
+Name=WordReference.com English Dictionary
+Name[af]=WordReference.com Engelse Woordeboek
+Name[ar]=القاموس الإنجليزي من WordReference.com
+Name[az]=WordReference.com İngiliscə Lüğət
+Name[be]=WordReference.com Ангельскі слоўнік
+Name[bn]=WordReference.com ইংরাজি অভিধান
+Name[br]=Geriaoueg saozneg WordReference.com
+Name[bs]=WordReference.com Engleski rječnik
+Name[ca]=WordReference.com diccionari anglès
+Name[cs]=Anglický slovník WordReference.com
+Name[csb]=WordReference.com: anielsczi słowôrz
+Name[cy]=Geiriadur Saesneg WorldReference.com
+Name[da]=WordReference.com engelsk ordbog
+Name[de]=WordReference.com: Englischwörterbuch
+Name[el]=WordReference.com αγγλικό λεξικό
+Name[eo]=WordReference.com angla vortaro
+Name[es]=WordReference.com diccionario de inglés
+Name[et]=WordReference.com inglise keele sõnaraamat
+Name[eu]=WordReference.com Itzulpena: Ingeles hiztegia
+Name[fa]=واژه‌نامۀ انگلیسی WordReference.com
+Name[fi]=WordReference.comin englannin kielen sanasto
+Name[fr]=Dictionnaire anglais de WordReference.com
+Name[fy]=WordReference.com Ingelsk wurdboek
+Name[ga]=Foclóir Béarla WordReference.com
+Name[gl]=WordReference.com Dicionario de Inglés
+Name[he]=WordReference.com - מילון אנגלי
+Name[hi]=वर्डरेफ़रेंस.कॉम अंग्रेज़ी शब्दकोश
+Name[hr]=WordReference.com engleski rječnik
+Name[hu]=WordReference.com angol szótár
+Name[is]=WordReference.com ensk orðabók
+Name[it]=WordReference.com dizionario inglese
+Name[ja]=WordReference.com 英語辞書
+Name[kk]=WordReference.com ағылшын сөздігі
+Name[km]=វចនានុក្រម​អង់គ្លេស WordReference.com
+Name[ko]=WordReference.com 영어 사전
+Name[lt]=WordReference.com anglų kalbos žodynas
+Name[lv]=WordReference.com Angļu valodas vārdnīca
+Name[mk]=WordReference.com Англиски речник
+Name[mn]=WordReference.com Англи толь бичиг
+Name[mt]=WordReference.com Dizzjunarju Ingliż
+Name[nb]=WordReference.com, engelsk ordbok
+Name[nds]=WordReference.com Engelsch Nakieksel
+Name[ne]=WordReference.com अङ्ग्रेजी शब्दकोश
+Name[nl]=WordReference.com Engels woordenboek
+Name[nn]=WordReference.com engelsk ordbok
+Name[pa]=WordReference.com ਅੰਗਰੇਜ਼ੀ ਸ਼ਬਦ-ਕੋਸ਼
+Name[pl]=WordReference.com: słownik angielski
+Name[pt]=Dicionário Inglês WordReference.com
+Name[pt_BR]=Dicionário de Inglês WordReference.com
+Name[ro]=Dicționarul englez WordReference.com
+Name[ru]=Английский словарь WordReference.com
+Name[rw]=Inkoranyamagambo y'Icyongereza WordReference.com
+Name[se]=WordReference.com eŋgelaš sátnegirji
+Name[sk]=Anglický slovník WordReference.com
+Name[sl]=Angleški slovar WordReference.com
+Name[sr]=Енглески речник на WordReference.com
+Name[sr@Latn]=Engleski rečnik na WordReference.com
+Name[sv]=Wordreference.com engelsk ordbok
+Name[ta]=WordReference.com ஆங்கில அகராதி
+Name[te]=WordReference.com ఆంగ్ల నిఘంటువు
+Name[tg]=WordReference.com Луғати Англисӣ
+Name[th]=WordReference.com พจนานุกรมอังกฤษ
+Name[tr]=WordReference.com İngilizce Sözlük
+Name[tt]=WordReference.com: İngliz Süzlege
+Name[uk]=Англійський словник WordReference.com
+Name[uz]=WordReference.com Inglizcha lugʻat
+Name[uz@cyrillic]=WordReference.com Инглизча луғат
+Name[vi]=Từ điển tiếng Anh WordReference.com
+Name[wa]=WordReference.com diccionaire inglès
+Name[zh_CN]=WordReference.com 英语字典
+Name[zh_TW]=WordReference.com 英文字典
+Query=http://www.wordreference.com/english/definition.asp?en=\\{@}
+ServiceTypes=SearchProvider
+Type=Service
diff --git a/kcontrol/ebrowsing/plugins/localdomain/Makefile.am b/kcontrol/ebrowsing/plugins/localdomain/Makefile.am
new file mode 100644
index 000000000..cb524dd4b
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/localdomain/Makefile.am
@@ -0,0 +1,20 @@
+## Makefile.am of kdebase/kcontrol/ebrowsing/plugins/localdomain
+
+AM_CPPFLAGS = $(all_includes) -DQT_NO_CAST_ASCII
+
+kde_module_LTLIBRARIES = liblocaldomainurifilter.la
+
+liblocaldomainurifilter_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+liblocaldomainurifilter_la_LIBADD = $(LIB_KIO) $(LIB_KDEUI) $(LIB_KDECORE)
+
+liblocaldomainurifilter_la_SOURCES = localdomainurifilter.cpp localdomainurifilter.skel
+
+service_DATA = localdomainurifilter.desktop
+servicedir = $(kde_servicesdir)
+
+METASOURCES = AUTO
+
+bin_PROGRAMS = klocaldomainurifilterhelper
+
+klocaldomainurifilterhelper_SOURCES = klocaldomainurifilterhelper.c
+klocaldomainurifilterhelper_LDADD = $(LIBSOCKET)
diff --git a/kcontrol/ebrowsing/plugins/localdomain/klocaldomainurifilterhelper.c b/kcontrol/ebrowsing/plugins/localdomain/klocaldomainurifilterhelper.c
new file mode 100644
index 000000000..2f61d6824
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/localdomain/klocaldomainurifilterhelper.c
@@ -0,0 +1,60 @@
+/*
+ kshorturifilterhelper.cpp
+
+ This file is part of the KDE project
+ Copyright (C) 2002 Lubos Lunak <llunak@suse.cz>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ as published by the Free Software Foundation.
+
+ 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.
+*/
+
+/* Helper for localdomainurifilter for finding out if a host exist */
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#include <netdb.h>
+#include <stdio.h>
+#include <string.h>
+
+int main( int argc, char* argv[] )
+{
+ struct hostent* ent;
+
+ if( argc != 2 )
+ return 2;
+
+ ent = gethostbyname( argv[ 1 ] );
+ if (ent)
+ {
+ int i;
+ int found = 0;
+ /* try to find the same fully qualified name first */
+ for( i = 0;
+ ent->h_aliases[ i ] != NULL;
+ ++i )
+ {
+ if( strncmp( argv[ 1 ], ent->h_aliases[ i ], strlen( argv[ 1 ] )) == 0 )
+ {
+ found = 1;
+ fputs( ent->h_aliases[ i ], stdout );
+ break;
+ }
+ }
+ if( !found )
+ fputs( ent->h_name, stdout );
+ }
+
+ return (ent != NULL || h_errno == NO_ADDRESS) ? 0 : 1;
+}
diff --git a/kcontrol/ebrowsing/plugins/localdomain/localdomainurifilter.cpp b/kcontrol/ebrowsing/plugins/localdomain/localdomainurifilter.cpp
new file mode 100644
index 000000000..3bd247729
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/localdomain/localdomainurifilter.cpp
@@ -0,0 +1,117 @@
+/*
+ localdomainfilter.cpp
+
+ This file is part of the KDE project
+ Copyright (C) 2002 Lubos Lunak <llunak@suse.cz>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ as published by the Free Software Foundation.
+
+ 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 <config.h>
+
+#include "localdomainurifilter.h"
+
+#include <kprocess.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+
+#include <qregexp.h>
+#include <qfile.h>
+
+#define HOSTPORT_PATTERN "[a-zA-Z0-9][a-zA-Z0-9+-]*(?:\\:[0-9]{1,5})?(?:/[\\w:@&=+$,-.!~*'()]*)*"
+
+/**
+ * IMPORTANT: If you change anything here, please run the regression test
+ * kdelibs/kio/tests/kurifiltertest
+ */
+
+LocalDomainURIFilter::LocalDomainURIFilter( QObject *parent, const char *name,
+ const QStringList & /*args*/ )
+ : KURIFilterPlugin( parent, name ? name : "localdomainurifilter", 1.0 ),
+ DCOPObject( "LocalDomainURIFilterIface" ),
+ last_time( 0 ),
+ m_hostPortPattern( QString::fromLatin1(HOSTPORT_PATTERN) )
+{
+ configure();
+}
+
+bool LocalDomainURIFilter::filterURI( KURIFilterData& data ) const
+{
+ KURL url = data.uri();
+ QString cmd = url.url();
+
+ kdDebug() << "LocalDomainURIFilter::filterURI: " << url << endl;
+
+ if( m_hostPortPattern.exactMatch( cmd ) &&
+ isLocalDomainHost( cmd ) )
+ {
+ cmd.prepend( QString::fromLatin1("http://") );
+ setFilteredURI( data, KURL( cmd ) );
+ setURIType( data, KURIFilterData::NET_PROTOCOL );
+
+ kdDebug() << "FilteredURI: " << data.uri() << endl;
+ return true;
+ }
+
+ return false;
+}
+
+// if it's e.g. just 'www', try if it's a hostname in the local search domain
+bool LocalDomainURIFilter::isLocalDomainHost( QString& cmd ) const
+{
+ // find() returns -1 when no match -> left()/truncate() are noops then
+ QString host( cmd.left( cmd.find( '/' ) ) );
+ host.truncate( host.find( ':' ) ); // Remove port number
+
+ if( !(host == last_host && last_time > time( NULL ) - 5 ) ) {
+
+ QString helper = KStandardDirs::findExe(QString::fromLatin1( "klocaldomainurifilterhelper" ));
+ if( helper.isEmpty())
+ return last_result = false;
+
+ m_fullname = QString::null;
+
+ KProcess proc;
+ proc << helper << host;
+ connect( &proc, SIGNAL(receivedStdout(KProcess *, char *, int)),
+ SLOT(receiveOutput(KProcess *, char *, int)) );
+ if( !proc.start( KProcess::NotifyOnExit, KProcess::Stdout ))
+ return last_result = false;
+
+ last_host = host;
+ last_time = time( (time_t *)0 );
+
+ last_result = proc.wait( 1 ) && proc.normalExit() && !proc.exitStatus();
+
+ if( !m_fullname.isEmpty() )
+ cmd.replace( 0, host.length(), m_fullname );
+ }
+
+ return last_result;
+}
+
+void LocalDomainURIFilter::receiveOutput( KProcess *, char *buf, int )
+{
+ m_fullname = QFile::decodeName( buf );
+}
+
+void LocalDomainURIFilter::configure()
+{
+ // nothing
+}
+
+K_EXPORT_COMPONENT_FACTORY( liblocaldomainurifilter,
+ KGenericFactory<LocalDomainURIFilter>( "kcmkurifilt" ) )
+
+#include "localdomainurifilter.moc"
diff --git a/kcontrol/ebrowsing/plugins/localdomain/localdomainurifilter.desktop b/kcontrol/ebrowsing/plugins/localdomain/localdomainurifilter.desktop
new file mode 100644
index 000000000..57826630a
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/localdomain/localdomainurifilter.desktop
@@ -0,0 +1,48 @@
+[Desktop Entry]
+Type=Service
+Name=LocalDomainFilter
+Name[af]=Plaaslike domein filter
+Name[az]=YerliDomenSüzgəci
+Name[ca]=Filtre de dominis locals
+Name[cs]=Filtr pro lokální doménu
+Name[csb]=Filter môlowi domenë
+Name[cy]=HidlParthLleol
+Name[el]=Φίλτρο τοπικού τομέα
+Name[eo]=LokaRetejo-filtrilo
+Name[es]=FiltrodeDominioLocal
+Name[eu]=Domeinu lokal iragazkia
+Name[fr]=Filtre de domaine local
+Name[fy]=Lokaaldomeinfilter
+Name[he]=מסנן תחומים מקומיים
+Name[hi]=लोकल-डोमेन-फ़िल्टर
+Name[hr]=Filtar lokalnih domena
+Name[hu]=HelyiTartománySzűrő
+Name[it]=FiltroDominioLocale
+Name[lo]=ຕົວກອງການບີບຂອງ KDE
+Name[lv]=LokāloDomēnuFiltrs
+Name[mt]=FiltruDominjiLokali
+Name[nds]=Filter för LocalDomain
+Name[ne]=स्थानीय डोमेन फिल्टर
+Name[nl]=Lokaaldomeinfilter
+Name[nso]=Sesekodi sa Tikologo ya Selegae
+Name[pa]=ਲੋਕਲ ਡੋਮੇਨ ਫਿਲਟਰ
+Name[pl]=Filtr lokalnej domeny
+Name[pt_BR]=Filtro de Domínio Local
+Name[ro]=Filtru de domeniu local
+Name[rw]=MuyunguruziIndangarubugaYahafi
+Name[sk]=Filter lokálnej domény
+Name[sl]=FilterLokalneDomene
+Name[sv]=Filter för lokal domän
+Name[ta]=உள்பகுதிவடிகட்டி
+Name[te]=స్థానిక డొమెయిన్ గలని
+Name[th]=ตัวกรองโดเมนท้องถื่น
+Name[uk]=Фільтр локальних доменів
+Name[ven]=Filithara ya tshigwada ya henefhano
+Name[vi]=Lọc Tên miền Địa phương
+Name[wa]=PasseteLocåDominne
+Name[zh_CN]=本地域名过滤
+Name[zh_TW]=區域網域過濾器
+Name[zu]=Ihluzo Lendawo Yaseduze
+X-KDE-Library=liblocaldomainurifilter
+ServiceTypes=KURIFilter/Plugin
+InitialPreference=2
diff --git a/kcontrol/ebrowsing/plugins/localdomain/localdomainurifilter.h b/kcontrol/ebrowsing/plugins/localdomain/localdomainurifilter.h
new file mode 100644
index 000000000..465214e69
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/localdomain/localdomainurifilter.h
@@ -0,0 +1,65 @@
+/*
+ localdomainurifilter.h
+
+ This file is part of the KDE project
+ Copyright (C) 2002 Lubos Lunak <llunak@suse.cz>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _LOCALDOMAINURIFILTER_H_
+#define _LOCALDOMAINURIFILTER_H_
+
+#include <time.h>
+
+#include <dcopobject.h>
+#include <kgenericfactory.h>
+#include <kurifilter.h>
+#include <qregexp.h>
+
+class KInstance;
+class KProcess;
+
+/*
+ This filter takes care of hostnames in the local search domain.
+ If you're in domain domain.org which has a host intranet.domain.org
+ and the typed URI is just intranet, check if there's a host
+ intranet.domain.org and if yes, it's a network URI.
+*/
+
+class LocalDomainURIFilter : public KURIFilterPlugin, public DCOPObject
+{
+ K_DCOP
+ Q_OBJECT
+
+ public:
+ LocalDomainURIFilter( QObject* parent, const char* name, const QStringList& args );
+ virtual bool filterURI( KURIFilterData &data ) const;
+
+ k_dcop:
+ virtual void configure();
+
+ private:
+ bool isLocalDomainHost( QString& cmd ) const;
+ mutable QString last_host;
+ mutable bool last_result;
+ mutable time_t last_time;
+ mutable QString m_fullname;
+ QRegExp m_hostPortPattern;
+
+ private slots:
+ void receiveOutput( KProcess *, char *, int );
+};
+
+#endif
diff --git a/kcontrol/ebrowsing/plugins/shorturi/Makefile.am b/kcontrol/ebrowsing/plugins/shorturi/Makefile.am
new file mode 100644
index 000000000..134881987
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/shorturi/Makefile.am
@@ -0,0 +1,18 @@
+## Makefile.am of kdebase/kcontrol/ebrowsing/plugins/shorturi
+
+AM_CPPFLAGS = $(all_includes) -DQT_NO_CAST_ASCII
+
+kde_module_LTLIBRARIES = libkshorturifilter.la
+
+libkshorturifilter_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+libkshorturifilter_la_LIBADD = $(LIB_KSYCOCA) $(LIB_KDEUI)
+
+libkshorturifilter_la_SOURCES = kshorturifilter.cpp kshorturifilter.skel
+
+service_DATA = kshorturifilter.desktop
+servicedir = $(kde_servicesdir)
+
+rc_DATA = kshorturifilterrc
+rcdir = $(kde_confdir)
+
+METASOURCES = AUTO
diff --git a/kcontrol/ebrowsing/plugins/shorturi/kshorturifilter.cpp b/kcontrol/ebrowsing/plugins/shorturi/kshorturifilter.cpp
new file mode 100644
index 000000000..3c0677b0f
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/shorturi/kshorturifilter.cpp
@@ -0,0 +1,554 @@
+/* -*- c-basic-offset: 2 -*-
+
+ kshorturifilter.h
+
+ This file is part of the KDE project
+ Copyright (C) 2000 Dawit Alemayehu <adawit@kde.org>
+ Copyright (C) 2000 Malte Starostik <starosti@zedat.fu-berlin.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <pwd.h>
+#include <sys/stat.h>
+
+#include <qdir.h>
+#include <qregexp.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kprotocolinfo.h>
+#include <kstandarddirs.h>
+#include <kconfig.h>
+#include <kmimetype.h>
+
+#include "kshorturifilter.h"
+
+#define FQDN_PATTERN "(?:[a-zA-Z0-9][a-zA-Z0-9+-]*\\.[a-zA-Z]+)"
+#define IPv4_PATTERN "[0-9]{1,3}\\.[0-9]{1,3}(?:\\.[0-9]{0,3})?(?:\\.[0-9]{0,3})?"
+#define IPv6_PATTERN "^\\[.*\\]"
+#define ENV_VAR_PATTERN "\\$[a-zA-Z_][a-zA-Z0-9_]*"
+
+#define QFL1(x) QString::fromLatin1(x)
+
+ /**
+ * IMPORTANT:
+ * If you change anything here, please run the regression test
+ * kdelibs/kio/tests/kurifiltertest.
+ *
+ * If you add anything here, make sure to add a corresponding
+ * test code to kdelibs/kio/tests/kurifiltertest.
+ */
+
+typedef QMap<QString,QString> EntryMap;
+
+static bool isValidShortURL( const QString& cmd, bool verbose = false )
+{
+ // Examples of valid short URLs:
+ // "kde.org", "foo.bar:8080", "user@foo.bar:3128"
+ // "192.168.1.0", "127.0.0.1:3128"
+ // "[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]"
+ QRegExp exp;
+
+ // Match FQDN_PATTERN
+ exp.setPattern( QFL1(FQDN_PATTERN) );
+ if ( cmd.contains( exp ) )
+ {
+ if (verbose)
+ kdDebug() << "KShortURIFilter::isValidShortURL: " << cmd
+ << " matches FQDN_PATTERN" << endl;
+
+ // bug 133687
+#if 0
+ // stuff like wallpaper.png matches the FQDN_PATTERN but is most
+ // likely not a domain
+ if (KMimeType::findByPath(cmd, 0, true /* fast mode */) != KMimeType::defaultMimeTypePtr())
+ return false;
+#endif
+
+ return true;
+ }
+
+ // Match IPv4 addresses
+ exp.setPattern( QFL1(IPv4_PATTERN) );
+ if ( cmd.contains( exp ) )
+ {
+ if (verbose)
+ kdDebug() << "KShortURIFilter::isValidShortURL: " << cmd
+ << " matches IPv4_PATTERN" << endl;
+ return true;
+ }
+
+ // Match IPv6 addresses
+ exp.setPattern( QFL1(IPv6_PATTERN) );
+ if ( cmd.contains( exp ) )
+ {
+ if (verbose)
+ kdDebug() << "KShortURIFilter::isValidShortURL: " << cmd
+ << " matches IPv6_PATTERN" << endl;
+ return true;
+ }
+
+ if (verbose)
+ kdDebug() << "KShortURIFilter::isValidShortURL: '" << cmd
+ << "' is not a short URL." << endl;
+
+ return false;
+}
+
+static QString removeArgs( const QString& _cmd )
+{
+ QString cmd( _cmd );
+
+ if( cmd[0] != '\'' && cmd[0] != '"' )
+ {
+ // Remove command-line options (look for first non-escaped space)
+ int spacePos = 0;
+
+ do
+ {
+ spacePos = cmd.find( ' ', spacePos+1 );
+ } while ( spacePos > 1 && cmd[spacePos - 1] == '\\' );
+
+ if( spacePos > 0 )
+ {
+ cmd = cmd.left( spacePos );
+ //kdDebug() << k_funcinfo << "spacePos=" << spacePos << " returning " << cmd << endl;
+ }
+ }
+
+ return cmd;
+}
+
+KShortURIFilter::KShortURIFilter( QObject *parent, const char *name,
+ const QStringList & /*args*/ )
+ :KURIFilterPlugin( parent, name ? name : "kshorturifilter", 1.0),
+ DCOPObject("KShortURIFilterIface")
+{
+ configure();
+}
+
+bool KShortURIFilter::filterURI( KURIFilterData& data ) const
+{
+ /*
+ * Here is a description of how the shortURI deals with the supplied
+ * data. First it expands any environment variable settings and then
+ * deals with special shortURI cases. These special cases are the "smb:"
+ * URL scheme which is very specific to KDE, "#" and "##" which are
+ * shortcuts for man:/ and info:/ protocols respectively. It then handles
+ * local files. Then it checks to see if the URL is valid and one that is
+ * supported by KDE's IO system. If all the above checks fails, it simply
+ * lookups the URL in the user-defined list and returns without filtering
+ * if it is not found. TODO: the user-defined table is currently only manually
+ * hackable and is missing a config dialog.
+ */
+
+ KURL url = data.uri();
+ QString cmd = data.typedString();
+ bool isMalformed = !url.isValid();
+ //kdDebug() << "url=" << url.url() << " cmd=" << cmd << " isMalformed=" << isMalformed << endl;
+
+ if (!isMalformed &&
+ (url.protocol().length() == 4) &&
+ (url.protocol() != QString::fromLatin1("http")) &&
+ (url.protocol()[0]=='h') &&
+ (url.protocol()[1]==url.protocol()[2]) &&
+ (url.protocol()[3]=='p'))
+ {
+ // Handle "encrypted" URLs like: h++p://www.kde.org
+ url.setProtocol( QString::fromLatin1("http"));
+ setFilteredURI( data, url);
+ setURIType( data, KURIFilterData::NET_PROTOCOL );
+ return true;
+ }
+
+ // TODO: Make this a bit more intelligent for Minicli! There
+ // is no need to make comparisons if the supplied data is a local
+ // executable and only the argument part, if any, changed! (Dawit)
+ // You mean caching the last filtering, to try and reuse it, to save stat()s? (David)
+
+ const QString starthere_proto = QFL1("start-here:");
+ if (cmd.find(starthere_proto, 0, true) == 0 )
+ {
+ setFilteredURI( data, KURL("system:/") );
+ setURIType( data, KURIFilterData::LOCAL_DIR );
+ return true;
+ }
+
+ // Handle MAN & INFO pages shortcuts...
+ const QString man_proto = QFL1("man:");
+ const QString info_proto = QFL1("info:");
+ if( cmd[0] == '#' ||
+ cmd.find( man_proto, 0, true ) == 0 ||
+ cmd.find( info_proto, 0, true ) == 0 )
+ {
+ if( cmd.left(2) == QFL1("##") )
+ cmd = QFL1("info:/") + cmd.mid(2);
+ else if ( cmd[0] == '#' )
+ cmd = QFL1("man:/") + cmd.mid(1);
+
+ else if ((cmd==info_proto) || (cmd==man_proto))
+ cmd+='/';
+
+ setFilteredURI( data, KURL( cmd ));
+ setURIType( data, KURIFilterData::HELP );
+ return true;
+ }
+
+ // Detect UNC style (aka windows SMB) URLs
+ if ( cmd.startsWith( QString::fromLatin1( "\\\\") ) )
+ {
+ // make sure path is unix style
+ cmd.replace('\\', '/');
+ cmd.prepend( QString::fromLatin1( "smb:" ) );
+ setFilteredURI( data, KURL( cmd ));
+ setURIType( data, KURIFilterData::NET_PROTOCOL );
+ return true;
+ }
+
+ bool expanded = false;
+
+ // Expanding shortcut to HOME URL...
+ QString path;
+ QString ref;
+ QString query;
+ QString nameFilter;
+
+ if (KURL::isRelativeURL(cmd) && QDir::isRelativePath(cmd)) {
+ path = cmd;
+ }
+ else
+ {
+ if (url.isLocalFile())
+ {
+ // Split path from ref/query if the path exists
+ // but not for "/tmp/a#b", if "a#b" is an existing file,
+ // or for "/tmp/a?b" (#58990)
+ if ( ( url.hasRef() || !url.query().isEmpty() ) // avoid the calling exists() when not needed
+ && QFile::exists(url.path())
+ && !url.path().endsWith(QFL1("/")) ) // /tmp/?foo is a namefilter, not a query
+ {
+ path = url.path();
+ ref = url.ref();
+ query = url.query();
+ if (path.isEmpty() && url.hasHost())
+ path = '/';
+ }
+ else
+ {
+ path = cmd;
+ }
+ }
+ }
+
+ if( path[0] == '~' )
+ {
+ int slashPos = path.find('/');
+ if( slashPos == -1 )
+ slashPos = path.length();
+ if( slashPos == 1 ) // ~/
+ {
+ path.replace ( 0, 1, QDir::homeDirPath() );
+ }
+ else // ~username/
+ {
+ QString user = path.mid( 1, slashPos-1 );
+ struct passwd *dir = getpwnam(user.local8Bit().data());
+ if( dir && strlen(dir->pw_dir) )
+ {
+ path.replace (0, slashPos, QString::fromLocal8Bit(dir->pw_dir));
+ }
+ else
+ {
+ QString msg = dir ? i18n("<qt><b>%1</b> does not have a home folder.</qt>").arg(user) :
+ i18n("<qt>There is no user called <b>%1</b>.</qt>").arg(user);
+ setErrorMsg( data, msg );
+ setURIType( data, KURIFilterData::ERROR );
+ // Always return true for error conditions so
+ // that other filters will not be invoked !!
+ return true;
+ }
+ }
+ expanded = true;
+ }
+ else if ( path[0] == '$' ) {
+ // Environment variable expansion.
+ QRegExp r (QFL1(ENV_VAR_PATTERN));
+ if ( r.search( path ) == 0 )
+ {
+ const char* exp = getenv( path.mid( 1, r.matchedLength() - 1 ).local8Bit().data() );
+ if(exp)
+ {
+ path.replace( 0, r.matchedLength(), QString::fromLocal8Bit(exp) );
+ expanded = true;
+ }
+ }
+ }
+
+ if ( expanded )
+ {
+ // Look for #ref again, after $ and ~ expansion (testcase: $QTDIR/doc/html/functions.html#s)
+ // Can't use KURL here, setPath would escape it...
+ int pos = path.find('#');
+ if ( pos > -1 )
+ {
+ ref = path.mid( pos + 1 );
+ path = path.left( pos );
+ //kdDebug() << "Extracted ref: path=" << path << " ref=" << ref << endl;
+ }
+ }
+
+
+ bool isLocalFullPath = (!path.isEmpty() && path[0] == '/');
+
+ // Checking for local resource match...
+ // Determine if "uri" is an absolute path to a local resource OR
+ // A local resource with a supplied absolute path in KURIFilterData
+ QString abs_path = data.absolutePath();
+
+ bool canBeAbsolute = (isMalformed && !abs_path.isEmpty());
+ bool canBeLocalAbsolute = (canBeAbsolute && abs_path[0] =='/');
+ bool exists = false;
+
+ /*kdDebug() << "abs_path=" << abs_path << " malformed=" << isMalformed
+ << " canBeLocalAbsolute=" << canBeLocalAbsolute << endl;*/
+
+ struct stat buff;
+ if ( canBeLocalAbsolute )
+ {
+ QString abs = QDir::cleanDirPath( abs_path );
+ // combine absolute path (abs_path) and relative path (cmd) into abs_path
+ int len = path.length();
+ if( (len==1 && path[0]=='.') || (len==2 && path[0]=='.' && path[1]=='.') )
+ path += '/';
+ //kdDebug() << "adding " << abs << " and " << path << endl;
+ abs = QDir::cleanDirPath(abs + '/' + path);
+ //kdDebug() << "checking whether " << abs << " exists." << endl;
+ // Check if it exists
+ if( stat( QFile::encodeName(abs).data(), &buff ) == 0 )
+ {
+ path = abs; // yes -> store as the new cmd
+ exists = true;
+ isLocalFullPath = true;
+ }
+ }
+
+ if( isLocalFullPath && !exists )
+ {
+ exists = ( stat( QFile::encodeName(path).data() , &buff ) == 0 );
+
+ if ( !exists ) {
+ // Support for name filter (/foo/*.txt), see also KonqMainWindow::detectNameFilter
+ // If the app using this filter doesn't support it, well, it'll simply error out itself
+ int lastSlash = path.findRev( '/' );
+ if ( lastSlash > -1 && path.find( ' ', lastSlash ) == -1 ) // no space after last slash, otherwise it's more likely command-line arguments
+ {
+ QString fileName = path.mid( lastSlash + 1 );
+ QString testPath = path.left( lastSlash + 1 );
+ if ( ( fileName.find( '*' ) != -1 || fileName.find( '[' ) != -1 || fileName.find( '?' ) != -1 )
+ && stat( QFile::encodeName(testPath).data(), &buff ) == 0 )
+ {
+ nameFilter = fileName;
+ kdDebug() << "Setting nameFilter to " << nameFilter << endl;
+ path = testPath;
+ exists = true;
+ }
+ }
+ }
+ }
+
+ //kdDebug() << "path =" << path << " isLocalFullPath=" << isLocalFullPath << " exists=" << exists << endl;
+ if( exists )
+ {
+ KURL u;
+ u.setPath(path);
+ u.setRef(ref);
+ u.setQuery(query);
+
+ if (kapp && !kapp->authorizeURLAction( QString::fromLatin1("open"), KURL(), u))
+ {
+ // No authorisation, we pretend it's a file will get
+ // an access denied error later on.
+ setFilteredURI( data, u );
+ setURIType( data, KURIFilterData::LOCAL_FILE );
+ return true;
+ }
+
+ // Can be abs path to file or directory, or to executable with args
+ bool isDir = S_ISDIR( buff.st_mode );
+ if( !isDir && access ( QFile::encodeName(path).data(), X_OK) == 0 )
+ {
+ //kdDebug() << "Abs path to EXECUTABLE" << endl;
+ setFilteredURI( data, u );
+ setURIType( data, KURIFilterData::EXECUTABLE );
+ return true;
+ }
+
+ // Open "uri" as file:/xxx if it is a non-executable local resource.
+ if( isDir || S_ISREG( buff.st_mode ) )
+ {
+ //kdDebug() << "Abs path as local file or directory" << endl;
+ if ( !nameFilter.isEmpty() )
+ u.setFileName( nameFilter );
+ setFilteredURI( data, u );
+ setURIType( data, ( isDir ) ? KURIFilterData::LOCAL_DIR : KURIFilterData::LOCAL_FILE );
+ return true;
+ }
+
+ // Should we return LOCAL_FILE for non-regular files too?
+ kdDebug() << "File found, but not a regular file nor dir... socket?" << endl;
+ }
+
+ // Let us deal with possible relative URLs to see
+ // if it is executable under the user's $PATH variable.
+ // We try hard to avoid parsing any possible command
+ // line arguments or options that might have been supplied.
+ QString exe = removeArgs( cmd );
+ //kdDebug() << k_funcinfo << "findExe with " << exe << endl;
+ if( data.checkForExecutables() && !KStandardDirs::findExe( exe ).isNull() )
+ {
+ //kdDebug() << "EXECUTABLE exe=" << exe << endl;
+ setFilteredURI( data, KURL( exe ));
+ // check if we have command line arguments
+ if( exe != cmd )
+ setArguments(data, cmd.right(cmd.length() - exe.length()));
+ setURIType( data, KURIFilterData::EXECUTABLE );
+ return true;
+ }
+
+ // Process URLs of known and supported protocols so we don't have
+ // to resort to the pattern matching scheme below which can possibly
+ // be slow things down...
+ if ( !isMalformed && !isLocalFullPath )
+ {
+ const QStringList protocols = KProtocolInfo::protocols();
+ for( QStringList::ConstIterator it = protocols.begin(); it != protocols.end(); ++it )
+ {
+ if( (url.protocol() == *it) )
+ {
+ setFilteredURI( data, url );
+ if ( *it == QFL1("man") || *it == QFL1("help") )
+ setURIType( data, KURIFilterData::HELP );
+ else
+ setURIType( data, KURIFilterData::NET_PROTOCOL );
+ return true;
+ }
+ }
+ }
+
+ // Okay this is the code that allows users to supply custom matches for
+ // specific URLs using Qt's regexp class. This is hard-coded for now.
+ // TODO: Make configurable at some point...
+ if ( !cmd.contains( ' ' ) )
+ {
+ QValueList<URLHint>::ConstIterator it;
+ for( it = m_urlHints.begin(); it != m_urlHints.end(); ++it )
+ {
+ QRegExp match( (*it).regexp );
+ if ( match.search( cmd, 0 ) == 0 )
+ {
+ //kdDebug() << "match - prepending " << (*it).prepend << endl;
+ cmd.prepend( (*it).prepend );
+ setFilteredURI( data, KURL( cmd ) );
+ setURIType( data, (*it).type );
+ return true;
+ }
+ }
+
+ // If cmd is NOT a local resource, check if it is a valid "shortURL"
+ // candidate and append the default protocol the user supplied. (DA)
+ if ( isMalformed && isValidShortURL(cmd, m_bVerbose) )
+ {
+ if (m_bVerbose)
+ kdDebug() << "Valid short url, from malformed url -> using default proto="
+ << m_strDefaultProtocol << endl;
+
+ cmd.insert( 0, m_strDefaultProtocol );
+ setFilteredURI( data, KURL( cmd ));
+ setURIType( data, KURIFilterData::NET_PROTOCOL );
+ return true;
+ }
+ }
+
+ // If we previously determined that the URL might be a file,
+ // and if it doesn't exist, then error
+ if( isLocalFullPath && !exists )
+ {
+ KURL u;
+ u.setPath(path);
+ u.setRef(ref);
+
+ if (kapp && !kapp->authorizeURLAction( QString::fromLatin1("open"), KURL(), u))
+ {
+ // No authorisation, we pretend it exists and will get
+ // an access denied error later on.
+ setFilteredURI( data, u );
+ setURIType( data, KURIFilterData::LOCAL_FILE );
+ return true;
+ }
+ //kdDebug() << "fileNotFound -> ERROR" << endl;
+ setErrorMsg( data, i18n( "<qt>The file or folder <b>%1</b> does not exist." ).arg( data.uri().prettyURL() ) );
+ setURIType( data, KURIFilterData::ERROR );
+ return true;
+ }
+
+ // If we reach this point, we cannot filter this thing so simply return false
+ // so that other filters, if present, can take a crack at it.
+ return false;
+}
+
+KCModule* KShortURIFilter::configModule( QWidget*, const char* ) const
+{
+ return 0; //new KShortURIOptions( parent, name );
+}
+
+QString KShortURIFilter::configName() const
+{
+ return i18n("&ShortURLs");
+}
+
+void KShortURIFilter::configure()
+{
+ KConfig config( name() + QFL1("rc"), false, false );
+ m_bVerbose = config.readBoolEntry( "Verbose", false );
+
+ if ( m_bVerbose )
+ kdDebug() << "KShortURIFilter::configure: Config reload request..." << endl;
+
+ m_strDefaultProtocol = config.readEntry( "DefaultProtocol", QFL1("http://") );
+ EntryMap patterns = config.entryMap( QFL1("Pattern") );
+ const EntryMap protocols = config.entryMap( QFL1("Protocol") );
+ config.setGroup("Type");
+
+ for( EntryMap::Iterator it = patterns.begin(); it != patterns.end(); ++it )
+ {
+ QString protocol = protocols[it.key()];
+ if (!protocol.isEmpty())
+ {
+ int type = config.readNumEntry(it.key(), -1);
+ if (type > -1 && type <= KURIFilterData::UNKNOWN)
+ m_urlHints.append( URLHint(it.data(), protocol, static_cast<KURIFilterData::URITypes>(type) ) );
+ else
+ m_urlHints.append( URLHint(it.data(), protocol) );
+ }
+ }
+}
+
+K_EXPORT_COMPONENT_FACTORY( libkshorturifilter,
+ KGenericFactory<KShortURIFilter>( "kcmkurifilt" ) )
+
+#include "kshorturifilter.moc"
diff --git a/kcontrol/ebrowsing/plugins/shorturi/kshorturifilter.desktop b/kcontrol/ebrowsing/plugins/shorturi/kshorturifilter.desktop
new file mode 100644
index 000000000..b681deb90
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/shorturi/kshorturifilter.desktop
@@ -0,0 +1,54 @@
+[Desktop Entry]
+Type=Service
+Name=ShortURIFilter
+Name[af]=KortURIfilter
+Name[az]=KısaURISüzgeci
+Name[br]=SilURLBerr
+Name[ca]=Filtre d'URI curt
+Name[csb]=Filter krótczich URI
+Name[cy]=HidlURIByr
+Name[da]=KortURIFilter
+Name[de]=Kurz-URL-Filter
+Name[el]=Φίλτρο σύντομων URI
+Name[eo]=Mallonga URI-filtrilo
+Name[es]=Filtro de URIs cortas
+Name[et]=Lühikeste URLide filter
+Name[eu]=URL laburren iragazkia
+Name[fo]=Stutt URI-filtur
+Name[fr]=Filtres d'URL courtes
+Name[he]=מסנן כתובות קצרות
+Name[hi]=शॉर्ट-यूआरआई-फ़िल्टर
+Name[hr]=Filtar kratkih URI-a
+Name[hu]=RövidURISzűrő
+Name[id]=FilterURIPendek
+Name[it]=Filtro di URI brevi
+Name[ja]=ショート URI フィルタ
+Name[lv]=ĪssURIFiltrs
+Name[mn]=Богино-URL-Шүүлтүүр
+Name[nds]=KortURI-Filter
+Name[ne]=छोटो URI फिल्टर
+Name[nso]=Sesekodi se Sekopana sa URI
+Name[oc]=Filtre d'URI curta
+Name[pa]=ShortURI ਫਿਲਟਰ
+Name[pl]=Filtr Krótkich URI
+Name[pt_BR]=Filtro URI
+Name[ro]=Filtru de URI-uri scurte
+Name[rw]=MuyunguruziURINgufi
+Name[sk]=KrátkyURIFilter
+Name[sl]=FilterZaKratkeURI
+Name[sv]=Kortwebbadressfilter
+Name[ta]=சிறியtவலைப்பின்னல்வடிகட்டி
+Name[te]=చిన్న యు ఆర్ ఐ గలని
+Name[tg]=КӯтоҳиURI-и софӣ
+Name[th]=ตัวกรองURIแบบสั้น
+Name[tr]=KısaURISüzgeci
+Name[tt]=Qısqa URI Sözgeç
+Name[uk]=Фільтр коротких URI
+Name[ven]=Filithara thukhu ya URI
+Name[vi]=Lọc Địa chỉ URI Ngắn
+Name[wa]=PasseteCoutURI
+Name[zh_CN]=短 URI 过滤
+Name[zh_TW]=短 URI 過濾器
+X-KDE-Library=libkshorturifilter
+ServiceTypes=KURIFilter/Plugin
+InitialPreference=5
diff --git a/kcontrol/ebrowsing/plugins/shorturi/kshorturifilter.h b/kcontrol/ebrowsing/plugins/shorturi/kshorturifilter.h
new file mode 100644
index 000000000..c6603da19
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/shorturi/kshorturifilter.h
@@ -0,0 +1,111 @@
+/*
+ kshorturifilter.h
+
+ This file is part of the KDE project
+ Copyright (C) 2000 Dawit Alemayehu <adawit@kde.org>
+ Copyright (C) 2000 Malte Starostik <starosti@zedat.fu-berlin.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _KSHORTURIFILTER_H_
+#define _KSHORTURIFILTER_H_
+
+#include <dcopobject.h>
+#include <kgenericfactory.h>
+#include <kurifilter.h>
+
+class KInstance;
+
+/**
+* This is short URL filter class.
+*
+* @short A filter that converts short URLs into fully qualified ones.
+*
+* @author Dawit Alemayehu <adawit@kde.org>
+* @author Malte Starostik <starosti@zedat.fu-berlin.de>
+*/
+class KShortURIFilter : public KURIFilterPlugin , public DCOPObject
+{
+ K_DCOP
+ Q_OBJECT
+public:
+
+ /**
+ * Creates a Short URI filter object
+ *
+ * @param parent the parent of this class.
+ * @param name the internal name for this object.
+ */
+ KShortURIFilter( QObject *parent = 0, const char *name = 0,
+ const QStringList &args = QStringList() );
+
+ /**
+ * Destructor
+ */
+ virtual ~KShortURIFilter() {};
+
+ /**
+ * Converts short URIs into fully qualified valid URIs
+ * whenever possible.
+ *
+ * Parses any given invalid URI to determine whether it
+ * is a known short URI and converts it to its fully
+ * qualified version.
+ *
+ * @param data the data to be filtered
+ * @return true if the url has been filtered
+ */
+ virtual bool filterURI( KURIFilterData &data ) const;
+
+ /**
+ * Returns the name of the config module for
+ * this plugin.
+ *
+ * @return the name of the config module.
+ */
+ virtual QString configName() const;
+
+ /**
+ * Returns an instance of the module used to configure
+ * this object.
+ *
+ * @return the config module
+ */
+ virtual KCModule* configModule( QWidget*, const char* ) const;
+
+public:
+k_dcop:
+ virtual void configure();
+
+private:
+
+ struct URLHint
+ {
+ URLHint() {}
+ URLHint( QString r, QString p,
+ KURIFilterData::URITypes t = KURIFilterData::NET_PROTOCOL )
+ : regexp(r), prepend(p), type(t) {}
+ QString regexp; // if this matches, then...
+ QString prepend; // ...prepend this to the url
+ KURIFilterData::URITypes type;
+ };
+
+ QValueList<URLHint> m_urlHints;
+ QString m_strDefaultProtocol;
+ bool m_bVerbose;
+};
+
+#endif
diff --git a/kcontrol/ebrowsing/plugins/shorturi/kshorturifilterrc b/kcontrol/ebrowsing/plugins/shorturi/kshorturifilterrc
new file mode 100644
index 000000000..c98db1803
--- /dev/null
+++ b/kcontrol/ebrowsing/plugins/shorturi/kshorturifilterrc
@@ -0,0 +1,7 @@
+[Pattern]
+kdemailto=^(\w+)(?:[.]\w+)?@(\w+)(?:[.]\w+)+$
+kdeftp=^ftp(?:\.\w+)?\.\D{2,}(?:[0-9]{1,5})?
+
+[Protocol]
+kdemailto=mailto:
+kdeftp=ftp://
diff --git a/kcontrol/energy/Makefile.am b/kcontrol/energy/Makefile.am
new file mode 100644
index 000000000..ea6578582
--- /dev/null
+++ b/kcontrol/energy/Makefile.am
@@ -0,0 +1,18 @@
+SUBDIRS= . pics
+
+AM_CPPFLAGS = $(all_includes) $(DPMSINC)
+
+kde_module_LTLIBRARIES = kcm_energy.la
+
+kcm_energy_la_SOURCES = energy.cpp
+kcm_energy_la_LDFLAGS = -module -avoid-version $(all_libraries) -no-undefined
+kcm_energy_la_LIBADD = $(DPMSLIB) $(LIB_KDEUI) $(LIB_KIO)
+METASOURCES = energy.moc
+
+noinst_HEADERS = energy.h
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/kcmenergy.pot
+
+energy_data_DATA = energy.desktop
+energy_datadir = $(kde_appsdir)/.hidden
diff --git a/kcontrol/energy/configure.in.in b/kcontrol/energy/configure.in.in
new file mode 100644
index 000000000..7c9f247da
--- /dev/null
+++ b/kcontrol/energy/configure.in.in
@@ -0,0 +1 @@
+AC_HAVE_DPMS()
diff --git a/kcontrol/energy/energy.cpp b/kcontrol/energy/energy.cpp
new file mode 100644
index 000000000..af3c4965d
--- /dev/null
+++ b/kcontrol/energy/energy.cpp
@@ -0,0 +1,442 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ *
+ *
+ * This file is part of the KDE project, module kcontrol.
+ * Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ *
+ * You can Freely distribute this program under the GNU General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ *
+ * Based on kcontrol1 energy.cpp, Copyright (c) 1999 Tom Vijlbrief
+ */
+
+
+/*
+ * KDE Energy setup module.
+ */
+
+#include <config.h>
+
+#if !defined(QT_CLEAN_NAMESPACE)
+#define QT_CLEAN_NAMESPACE
+#endif
+
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <kconfig.h>
+#include <kcursor.h>
+#include <kdialog.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <knuminput.h>
+#include <krun.h>
+#include <kstandarddirs.h>
+#include <kurllabel.h>
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+
+#include "energy.h"
+
+
+#ifdef HAVE_DPMS
+#include <X11/Xmd.h>
+extern "C" {
+#include <X11/extensions/dpms.h>
+Status DPMSInfo ( Display *, CARD16 *, BOOL * );
+Bool DPMSCapable( Display * );
+int __kde_do_not_unload = 1;
+
+#ifndef HAVE_DPMSCAPABLE_PROTO
+Bool DPMSCapable ( Display * );
+#endif
+
+#ifndef HAVE_DPMSINFO_PROTO
+Status DPMSInfo ( Display *, CARD16 *, BOOL * );
+#endif
+}
+
+#if defined(XIMStringConversionRetrival) || defined (__sun) || defined(__hpux)
+extern "C" {
+#endif
+ Bool DPMSQueryExtension(Display *, int *, int *);
+ Status DPMSEnable(Display *);
+ Status DPMSDisable(Display *);
+ Bool DPMSGetTimeouts(Display *, CARD16 *, CARD16 *, CARD16 *);
+ Bool DPMSSetTimeouts(Display *, CARD16, CARD16, CARD16);
+#if defined(XIMStringConversionRetrival) || defined (__sun) || defined(__hpux)
+}
+#endif
+#endif
+
+static const int DFLT_STANDBY = 0;
+static const int DFLT_SUSPEND = 30;
+static const int DFLT_OFF = 60;
+
+
+/**** DLL Interface ****/
+
+extern "C" {
+
+ KDE_EXPORT KCModule *create_energy(QWidget *parent, char *) {
+ return new KEnergy(parent, "kcmenergy");
+ }
+
+ KDE_EXPORT void init_energy() {
+#ifdef HAVE_DPMS
+ KConfig *cfg = new KConfig("kcmdisplayrc", true /*readonly*/, false /*no globals*/);
+ cfg->setGroup("DisplayEnergy");
+
+ Display *dpy = qt_xdisplay();
+ CARD16 pre_configured_status;
+ BOOL pre_configured_enabled;
+ CARD16 pre_configured_standby;
+ CARD16 pre_configured_suspend;
+ CARD16 pre_configured_off;
+ bool enabled;
+ CARD16 standby;
+ CARD16 suspend;
+ CARD16 off;
+ int dummy;
+ /* query the running X server if DPMS is supported */
+ if (DPMSQueryExtension(dpy, &dummy, &dummy) && DPMSCapable(dpy)) {
+ DPMSGetTimeouts(dpy, &pre_configured_standby, &pre_configured_suspend, &pre_configured_off);
+ DPMSInfo(dpy, &pre_configured_status, &pre_configured_enabled);
+ /* let the user override the settings */
+ enabled = cfg->readBoolEntry("displayEnergySaving", pre_configured_enabled);
+ standby = cfg->readNumEntry("displayStandby", pre_configured_standby/60);
+ suspend = cfg->readNumEntry("displaySuspend", pre_configured_suspend/60);
+ off = cfg->readNumEntry("displayPowerOff", pre_configured_off/60);
+ } else {
+ /* provide our defauts */
+ enabled = true;
+ standby = DFLT_STANDBY;
+ suspend = DFLT_SUSPEND;
+ off = DFLT_OFF;
+ }
+
+ delete cfg;
+
+ KEnergy::applySettings(enabled, standby, suspend, off);
+#endif
+ }
+}
+
+/**** KEnergy ****/
+
+KEnergy::KEnergy(QWidget *parent, const char *name)
+ : KCModule(parent, name)
+{
+ m_bChanged = false;
+ m_bEnabled = false;
+ m_Standby = DFLT_STANDBY;
+ m_Suspend = DFLT_SUSPEND;
+ m_Off = DFLT_OFF;
+ m_bDPMS = false;
+ m_bMaintainSanity = true;
+
+ setQuickHelp( i18n("<h1>Display Power Control</h1> If your display supports"
+ " power saving features, you can configure them using this module.<p>"
+ " There are three levels of power saving: standby, suspend, and off."
+ " The greater the level of power saving, the longer it takes for the"
+ " display to return to an active state.<p>"
+ " To wake up the display from a power saving mode, you can make a small"
+ " movement with the mouse, or press a key that is not likely to cause"
+ " any unintentional side-effects, for example, the \"Shift\" key."));
+
+#ifdef HAVE_DPMS
+ int dummy;
+ m_bDPMS = DPMSQueryExtension(qt_xdisplay(), &dummy, &dummy);
+#endif
+
+ QVBoxLayout *top = new QVBoxLayout(this, 0, KDialog::spacingHint());
+ QHBoxLayout *hbox = new QHBoxLayout();
+ top->addLayout(hbox);
+
+ QLabel *lbl;
+ if (m_bDPMS) {
+ m_pCBEnable= new QCheckBox(i18n("&Enable display power management" ), this);
+ connect(m_pCBEnable, SIGNAL(toggled(bool)), SLOT(slotChangeEnable(bool)));
+ hbox->addWidget(m_pCBEnable);
+ QWhatsThis::add( m_pCBEnable, i18n("Check this option to enable the"
+ " power saving features of your display.") );
+ } else {
+ lbl = new QLabel(i18n("Your display does not support power saving."), this);
+ hbox->addWidget(lbl);
+ }
+
+ KURLLabel *logo = new KURLLabel(this);
+ logo->setURL("http://www.energystar.gov");
+ logo->setPixmap(QPixmap(locate("data", "kcontrol/pics/energybig.png")));
+ logo->setTipText(i18n("Learn more about the Energy Star program"));
+ logo->setUseTips(true);
+connect(logo, SIGNAL(leftClickedURL(const QString&)), SLOT(openURL(const QString &)));
+
+ hbox->addStretch();
+ hbox->addWidget(logo);
+
+ // Sliders
+ m_pStandbySlider = new KIntNumInput(m_Standby, this);
+ m_pStandbySlider->setLabel(i18n("&Standby after:"));
+ m_pStandbySlider->setRange(0, 120, 10);
+ m_pStandbySlider->setSuffix(i18n(" min"));
+ m_pStandbySlider->setSpecialValueText(i18n("Disabled"));
+ connect(m_pStandbySlider, SIGNAL(valueChanged(int)), SLOT(slotChangeStandby(int)));
+ top->addWidget(m_pStandbySlider);
+ QWhatsThis::add( m_pStandbySlider, i18n("Choose the period of inactivity"
+ " after which the display should enter \"standby\" mode. This is the"
+ " first level of power saving.") );
+
+ m_pSuspendSlider = new KIntNumInput(m_pStandbySlider, m_Suspend, this);
+ m_pSuspendSlider->setLabel(i18n("S&uspend after:"));
+ m_pSuspendSlider->setRange(0, 120, 10);
+ m_pSuspendSlider->setSuffix(i18n(" min"));
+ m_pSuspendSlider->setSpecialValueText(i18n("Disabled"));
+ connect(m_pSuspendSlider, SIGNAL(valueChanged(int)), SLOT(slotChangeSuspend(int)));
+ top->addWidget(m_pSuspendSlider);
+ QWhatsThis::add( m_pSuspendSlider, i18n("Choose the period of inactivity"
+ " after which the display should enter \"suspend\" mode. This is the"
+ " second level of power saving, but may not be different from the first"
+ " level for some displays.") );
+
+ m_pOffSlider = new KIntNumInput(m_pSuspendSlider, m_Off, this);
+ m_pOffSlider->setLabel(i18n("&Power off after:"));
+ m_pOffSlider->setRange(0, 120, 10);
+ m_pOffSlider->setSuffix(i18n(" min"));
+ m_pOffSlider->setSpecialValueText(i18n("Disabled"));
+ connect(m_pOffSlider, SIGNAL(valueChanged(int)), SLOT(slotChangeOff(int)));
+ top->addWidget(m_pOffSlider);
+ QWhatsThis::add( m_pOffSlider, i18n("Choose the period of inactivity"
+ " after which the display should be powered off. This is the"
+ " greatest level of power saving that can be achieved while the"
+ " display is still physically turned on.") );
+
+ top->addStretch();
+
+ if (m_bDPMS)
+ setButtons( KCModule::Help | KCModule::Default | KCModule::Apply );
+ else
+ setButtons( KCModule::Help );
+
+ m_pConfig = new KConfig("kcmdisplayrc", false /*readwrite*/, false /*no globals*/);
+ m_pConfig->setGroup("DisplayEnergy");
+
+ load();
+}
+
+
+KEnergy::~KEnergy()
+{
+ delete m_pConfig;
+}
+
+
+void KEnergy::load()
+{
+ load( false );
+}
+
+void KEnergy::load( bool useDefaults )
+{
+ m_pConfig->setReadDefaults( useDefaults );
+ readSettings();
+ showSettings();
+
+ emit changed( useDefaults );
+}
+
+
+void KEnergy::save()
+{
+ writeSettings();
+ applySettings(m_bEnabled, m_Standby, m_Suspend, m_Off);
+
+ emit changed(false);
+}
+
+
+void KEnergy::defaults()
+{
+ load( true );
+}
+
+
+void KEnergy::readSettings()
+{
+ m_bEnabled = m_pConfig->readBoolEntry("displayEnergySaving", false);
+ m_Standby = m_pConfig->readNumEntry("displayStandby", DFLT_STANDBY);
+ m_Suspend = m_pConfig->readNumEntry("displaySuspend", DFLT_SUSPEND);
+ m_Off = m_pConfig->readNumEntry("displayPowerOff", DFLT_OFF);
+
+ m_StandbyDesired = m_Standby;
+ m_SuspendDesired = m_Suspend;
+ m_OffDesired = m_Off;
+
+ m_bChanged = false;
+}
+
+
+void KEnergy::writeSettings()
+{
+ if (!m_bChanged)
+ return;
+
+ m_pConfig->writeEntry( "displayEnergySaving", m_bEnabled);
+ m_pConfig->writeEntry("displayStandby", m_Standby);
+ m_pConfig->writeEntry("displaySuspend", m_Suspend);
+ m_pConfig->writeEntry("displayPowerOff", m_Off);
+
+ m_pConfig->sync();
+ m_bChanged = false;
+}
+
+
+void KEnergy::showSettings()
+{
+ m_bMaintainSanity = false;
+
+ if (m_bDPMS)
+ m_pCBEnable->setChecked(m_bEnabled);
+
+ m_pStandbySlider->setEnabled(m_bEnabled);
+ m_pStandbySlider->setValue(m_Standby);
+ m_pSuspendSlider->setEnabled(m_bEnabled);
+ m_pSuspendSlider->setValue(m_Suspend);
+ m_pOffSlider->setEnabled(m_bEnabled);
+ m_pOffSlider->setValue(m_Off);
+
+ m_bMaintainSanity = true;
+}
+
+
+extern "C" {
+ int dropError(Display *, XErrorEvent *);
+ typedef int (*XErrFunc) (Display *, XErrorEvent *);
+}
+
+int dropError(Display *, XErrorEvent *)
+{
+ return 0;
+}
+
+/* static */
+void KEnergy::applySettings(bool enable, int standby, int suspend, int off)
+{
+#ifdef HAVE_DPMS
+ XErrFunc defaultHandler;
+ defaultHandler = XSetErrorHandler(dropError);
+
+ Display *dpy = qt_xdisplay();
+
+ int dummy;
+ bool hasDPMS = DPMSQueryExtension(dpy, &dummy, &dummy);
+ if (hasDPMS) {
+ if (enable) {
+ DPMSEnable(dpy);
+ DPMSSetTimeouts(dpy, 60*standby, 60*suspend, 60*off);
+ } else
+ DPMSDisable(dpy);
+ } else
+ qWarning("Server has no DPMS extension");
+
+ XFlush(dpy);
+ XSetErrorHandler(defaultHandler);
+#else
+ /* keep gcc silent */
+ if (enable | standby | suspend | off)
+ /* nothing */ ;
+#endif
+}
+
+
+void KEnergy::slotChangeEnable(bool ena)
+{
+ m_bEnabled = ena;
+ m_bChanged = true;
+
+ m_pStandbySlider->setEnabled(ena);
+ m_pSuspendSlider->setEnabled(ena);
+ m_pOffSlider->setEnabled(ena);
+
+ emit changed(true);
+}
+
+
+void KEnergy::slotChangeStandby(int value)
+{
+ m_Standby = value;
+
+ if ( m_bMaintainSanity ) {
+ m_bMaintainSanity = false;
+ m_StandbyDesired = value;
+ if ((m_Suspend > 0 && m_Standby > m_Suspend) ||
+ (m_SuspendDesired && m_Standby >= m_SuspendDesired) )
+ m_pSuspendSlider->setValue(m_Standby);
+ if ((m_Off > 0 && m_Standby > m_Off) ||
+ (m_OffDesired && m_Standby >= m_OffDesired) )
+ m_pOffSlider->setValue(m_Standby);
+ m_bMaintainSanity = true;
+ }
+
+ m_bChanged = true;
+ emit changed(true);
+}
+
+
+void KEnergy::slotChangeSuspend(int value)
+{
+ m_Suspend = value;
+
+ if ( m_bMaintainSanity ) {
+ m_bMaintainSanity = false;
+ m_SuspendDesired = value;
+ if (m_Suspend == 0 && m_StandbyDesired > 0)
+ m_pStandbySlider->setValue( m_StandbyDesired );
+ else if (m_Suspend < m_Standby || m_Suspend <= m_StandbyDesired )
+ m_pStandbySlider->setValue(m_Suspend);
+ if ((m_Off > 0 && m_Suspend > m_Off) ||
+ (m_OffDesired && m_Suspend >= m_OffDesired) )
+ m_pOffSlider->setValue(m_Suspend);
+ m_bMaintainSanity = true;
+ }
+
+ m_bChanged = true;
+ emit changed(true);
+}
+
+
+void KEnergy::slotChangeOff(int value)
+{
+ m_Off = value;
+
+ if ( m_bMaintainSanity ) {
+ m_bMaintainSanity = false;
+ m_OffDesired = value;
+ if (m_Off == 0 && m_StandbyDesired > 0)
+ m_pStandbySlider->setValue( m_StandbyDesired );
+ else if (m_Off < m_Standby || m_Off <= m_StandbyDesired )
+ m_pStandbySlider->setValue(m_Off);
+ if (m_Off == 0 && m_SuspendDesired > 0)
+ m_pSuspendSlider->setValue( m_SuspendDesired );
+ else if (m_Off < m_Suspend || m_Off <= m_SuspendDesired )
+ m_pSuspendSlider->setValue(m_Off);
+ m_bMaintainSanity = true;
+ }
+
+ m_bChanged = true;
+ emit changed(true);
+}
+
+void KEnergy::openURL(const QString &URL)
+{
+ new KRun(KURL( URL ));
+}
+
+#include "energy.moc"
diff --git a/kcontrol/energy/energy.desktop b/kcontrol/energy/energy.desktop
new file mode 100644
index 000000000..bf856866a
--- /dev/null
+++ b/kcontrol/energy/energy.desktop
@@ -0,0 +1,242 @@
+[Desktop Entry]
+Exec=kcmshell energy
+Icon=energy_star
+DocPath=kcontrol/energy/index.html
+Type=Application
+X-KDE-Library=energy
+X-KDE-Init=energy
+X-KDE-ParentApp=kcontrol
+X-KDE-Init-Phase=2
+
+Name=Power Control
+Name[af]=Krag Beheer
+Name[ar]=التحكّم بالطّاقة
+Name[az]=Güc İdarəsi
+Name[be]=Кіраванне сілкаваннем
+Name[bg]=Електрозахранване
+Name[bn]=পাওয়ার নিয়ন্ত্রণ
+Name[br]=Renadur ar gremm
+Name[bs]=Ušteda energije
+Name[ca]=Control d'energia
+Name[cs]=Správa napájení
+Name[csb]=Kòntrola sëłë
+Name[cy]=Rheoli Pŵer
+Name[da]=Strømstyring
+Name[de]=Energiekontrolle
+Name[el]=Έλεγχος ισχύος
+Name[eo]=Elektrostirilo
+Name[es]=Control de energía
+Name[et]=Voolutarve
+Name[eu]=Energia kontrola
+Name[fa]=کنترل توان
+Name[fi]=Virranhallinta
+Name[fo]=Orkustýring
+Name[fr]=Contrôle de l'énergie
+Name[fy]=Enerzjybehear
+Name[ga]=Rialú Cumhachta
+Name[gl]=Control da Enerxéa
+Name[he]=צריכת חשמל
+Name[hi]=बिज़ली नियंत्रण
+Name[hr]=Ušteda energije
+Name[hsb]=Milina
+Name[hu]=Energiakezelés
+Name[id]=Kontrol Power
+Name[is]=Orkustilling
+Name[it]=Controllo energia
+Name[ja]=電源管理
+Name[ka]=კვების კონტროლი
+Name[kk]=Қуаттандыруды бақылау
+Name[km]=ការ​ត្រួត​ពិនិត្យ​ថាមពល
+Name[ko]=전원 관리
+Name[lo]=ຄວບຄຸມການໃຊ້ພະລັງງານ
+Name[lt]=Energijos kontrolė
+Name[lv]=Energo Kontrole
+Name[mk]=Контрола на енергија
+Name[mn]=Энергийн удирдлага
+Name[ms]=Kawalan Kuasa
+Name[mt]=Kontroll tal-konsum
+Name[nb]=Strømkontroll
+Name[nds]=Stroomkuntrull
+Name[ne]=शक्ति नियन्त्रण
+Name[nl]=Energiebeheer
+Name[nn]=Straumkontroll
+Name[nso]=Taolo ya Matla
+Name[oc]=Contròle d'alimentacion
+Name[pa]=ਊਰਜਾ ਕੰਟਰੋਲ
+Name[pl]=Zasilanie
+Name[pt]=Controlo de Energia
+Name[pt_BR]=Controle de Energia
+Name[ro]=Control energie
+Name[ru]=Управление питанием
+Name[rw]=Igenzura ry'Umuriro
+Name[se]=El-rávdnje stivren
+Name[sk]=Ovládanie spotreby
+Name[sl]=Nadzor energije
+Name[sr]=Контрола енергије
+Name[sr@Latn]=Kontrola energije
+Name[ss]=Kulawulwa kwemlilo
+Name[sv]=Strömsparfunktion
+Name[ta]=மின்னோட்ட கட்டுப்பாடு
+Name[te]=విద్యుత్ నియంత్రణ
+Name[tg]=Идораи қувваи барқ
+Name[th]=ควบคุมการใช้พลังงาน
+Name[tr]=Güç Denetimi
+Name[tt]=Qüät İdäräse
+Name[uk]=Керування живленням
+Name[uz]=Elektr taʼminotni boshqarish
+Name[uz@cyrillic]=Электр таъминотни бошқариш
+Name[ven]=Ndanguli ya maanda
+Name[vi]=Điều khiển Nguồn điện
+Name[wa]=Controle di l' alimintåcion
+Name[xh]=Ulawulo Lwamandla
+Name[zh_CN]=电源控制
+Name[zh_TW]=電源控制
+Name[zu]=Ukulawulwa kwamandla
+
+Comment=Settings for display power management
+Comment[af]=Instellings vir die vertoon van die krag bestuurder
+Comment[ar]=تعيينات إدخار الطاقة للشاشة
+Comment[az]=Displey gec idarəsi qurğuları
+Comment[be]=Кіраванне сілкаваннем манітора
+Comment[bg]=Настройване на електрозахранването
+Comment[bn]=ডিসপ্লের বৈদ্যুতিক শক্তি ব্যবহার সংক্রান্ত সেটিংস
+Comment[br]=Kefluniadur renadur gremm an diskwell
+Comment[bs]=Postavke uštede energije monitora (ekrana)
+Comment[ca]=Arranjaments per al control d'energia a la pantalla
+Comment[cs]=Nastavení pro správu šetření napájení
+Comment[csb]=Nastôw sprôwianiô sëłą
+Comment[cy]=Gosodiadau i rheoli pw?r y dangosydd
+Comment[da]=Indstilling for visning af strømstyring
+Comment[de]=Stromspareinstellungen für Ihren Monitor bzw. Ihr Display
+Comment[el]=Ρυθμίσεις για την προβολή της διαχείρισης ενέργειας
+Comment[eo]=Agordo por de la elektrouzado de via ekrano
+Comment[es]=Preferencias para la pantalla de control de energía
+Comment[et]=Ekraani voolutarbe juhtimise seaded
+Comment[eu]=Pantailaren energia kudeatzeko ezarpenak
+Comment[fa]=تنظیمات برای نمایش مدیریت توان
+Comment[fi]=Asetukset näytön virranhallinnalle
+Comment[fr]=Paramètres de la gestion d'énergie pour l'affichage
+Comment[fy]=Ynstellings foar energybesparring foar byldskerms
+Comment[gl]=Configuracións para a xestión de enerxia da pantalla
+Comment[he]=שינוי הגדרות ניהול צריכת החשמל של התצוגה
+Comment[hi]=बिज़ली नियंत्रण प्रदर्शक के लिए विन्यास
+Comment[hr]=Postavke za štednju energije zaslona
+Comment[hu]=A képernyő energiatakarékossági beállításai
+Comment[is]=Stillingar fyrir orkustýringu skjás
+Comment[it]=Impostazioni per la gestione dell'energia dello schermo.
+Comment[ja]=ディスプレイの電源管理の設定
+Comment[ka]=დისპლეის კვების მონეჯმენტის კონფიგურაცია
+Comment[kk]=Дисплейді қуаттандыруды басқаруын баптау
+Comment[km]=ការ​កំណត់​សម្រាប់​គ្រប់គ្រង​ថាមពល​ការ​បង្ហាញ
+Comment[ko]=디스플레이 전원 관리 설정
+Comment[lo]=ຕັ້ງຄ່າສຳລັບການປະຫຍັດພະລັງງານຂອງລະບົບສະແດງຜົນ
+Comment[lt]=Parinktys displėjaus energijos tvarkymui
+Comment[lv]=Ekrāna enorgotaupības parametri
+Comment[mk]=Поставувања за менаџмент на енергијата за екранот
+Comment[mn]=Дэлгэцийн тань энерги-тохируулга
+Comment[ms]=Seting untuk pengurusan kuasa paparan
+Comment[mt]=Setings għall-kontroll tal-konsum tal-iskrin
+Comment[nb]=Innstillinger for strømkontroll av skjerm
+Comment[nds]=Stroomspoorinstellen för den Schirm
+Comment[ne]=प्रर्दशन शक्ति व्यवस्थापनका लागि सेटिङ
+Comment[nl]=Instellingen voor energiebesparing voor monitors/displays
+Comment[nn]=Innstillingar for straumkontroll av skjerm
+Comment[nso]=Dipeakanyo tsa taolo ya matla a pontsho
+Comment[pa]=ਊਰਜਾ ਪਰਬੰਧਨ ਝਲਕ ਲਈ ਸੈਟਿੰਗ
+Comment[pl]=Ustawienia zarządzania mocą
+Comment[pt]=Configurações para a gestão de energia do ecrã
+Comment[pt_BR]= Configurações para o gerenciamento de energia do monitor
+Comment[ro]=Setări pentru controlul energiei consumate de monitor
+Comment[ru]=Настройка управления питанием дисплея
+Comment[rw]=Amagenamiterere yo kwerekana icunga ry'umuriro
+Comment[se]=Heivehusat mat stivrejit rávdnji šerbmii
+Comment[sk]=Nastavenie šetrenia energiou obrazovky
+Comment[sl]=Nastavitve za nadzor energije zaslona
+Comment[sr]=Поставке за управаљање енергијом екрана
+Comment[sr@Latn]=Postavke za upravaljanje energijom ekrana
+Comment[ss]=Kuhleleka kwekubonisa kuphatfwa kwemandla
+Comment[sv]=Inställning av skärmens strömsparfunktion
+Comment[ta]=மின்சார மேலாண்மைக்கான அமைப்புகள்
+Comment[tg]=Танзимоти мудирияти барқии намоишгар
+Comment[th]=ตั้งค่าสำหรับการประหยัดพลังงานของระบบแสดงผล
+Comment[tr]=Ekran güç yöneticisi ayarları
+Comment[tt]=Küräk qüäten idäräläw caylawları
+Comment[uk]=Налаштування керування живленням дисплея
+Comment[uz]=Displeyning elektr taʼminoti uchun moslamalar
+Comment[uz@cyrillic]=Дисплейнинг электр таъминоти учун мосламалар
+Comment[ven]=Mavhekanyele au sumbedza ndangulo ya maanda
+Comment[vi]=Thiết lập cho quản lý nguồn điện
+Comment[wa]=Tchuzes po håyner l' manaedjmint d' enerdjeye
+Comment[xh]=Izicwangciso zoboniso lophatho lwamandla
+Comment[zh_CN]=显示器电源管理设置
+Comment[zh_TW]=顯示器電源管理的設定值
+Comment[zu]=Izilungiselelo zokuvezwa kokuphathwa kwamandla
+
+Keywords=energy,saver,apm,acpi,dpms,timeout,blanking,stand by,suspend,power
+Keywords[az]=enerji,apm,acpi,zamanaşımı,boşaltma,güç,karartma,ekran
+Keywords[be]=энергія,зберагальнік,збераганне,тэрмін чакання,ачышчэнне,выключэнне,сілкаванне,сон,energy,saver,apm,acpi,dpms,timeout,blanking,stand by,suspend,power
+Keywords[bg]=ток, захранване, прекъсване, батерия, батерии, контакт, energy, saver, apm, acpi, dpms, timeout, blanking, stand by, suspend, power
+Keywords[ca]=energia,salva,apm,acpi,dpms,expiració,en blanc,en espera, suspès,corrent
+Keywords[cs]=Energie,Úspora,APM,ACPI,Časový limit,Vypnutí,Napájení,Šetřič,Spořič
+Keywords[csb]=sëła, energijô,zachòwëwanié,apm,acpi,dpms,limit czasu,zaczôrnienié,wëłączanié, ùspienié,zasëlanié
+Keywords[cy]=ynni,arbedwr,apm,acpi,dpms,goroedi,gwagu,sefyll wrthlaw,seibio, pwer
+Keywords[da]=energi,sparer,apm,acpi,dpms,timeout,udløb,gør blank,standby,suspendér,strøm
+Keywords[de]=Energie,APM,ACPI,DPMS,Zeitüberlauf,Timeout,Standby,Bereitschaft
+Keywords[el]=ενέργεια,εξοικονόμηση,apm,acpi,dpms,χρονικό όριο,blanking,αναμονή,παύση,ισχύς
+Keywords[eo]=energio,sekurigo,APM,ACPI,tempolimo,ekrano,kurteno,nigrigo, dormigo,malŝalto
+Keywords[es]=energía,ahorro,APM,ACPI,tiempo de expiración,apagar monitor,modo de espera,suspender
+Keywords[et]=energia,säästja,apm,acpi,dpms,taimaut,energiasääst,passiivne
+Keywords[eu]=energia,babeslea,apm,acpi,dpms,denbora-muga,monitorea itzali, zain,suspenditu,indarra
+Keywords[fa]=انرژی، محافظ، apm، acpi، dpms، اتمام وقت، فاصله‌گذاری، نیمه روشن، معلق، توان
+Keywords[fi]=energia,säästö,apm,acpi,dpms,aikavalvonta,sammutus,valmiustila,teho
+Keywords[fr]=énergie,économie,apm,acpi,suspension,suspendre,tension,éteindre,extinction,veille,mise en veille,alimentation
+Keywords[fy]=energy,besparring,apm,acpi,tiidslimyt,sliepstân,stand-by,suspend,power,wachtstân,laptop,byldskerm,monitor,display,timeout
+Keywords[ga]=cumhacht,sábhálaí,apm,acpi,dpms,teorainn ama,bánú,croch,fuinneamh
+Keywords[gl]=enerxia,aforro,apm,acpi,dpms,tempo de espera,espera,suspender,timeout,bloqueo
+Keywords[he]=זמן מוקצב,האפלה,המתנה,חשמל,dpms,acpi,apm,אנרגיה,חיסכון, energy,saver,timeout,blanking,stand y,suspend,power
+Keywords[hi]=बिज़ली,रक्षक,एपीएम,एसीपीआई,डीपीएमएस,टाइम-आउट,ब्लैंकिंग,स्टैंड-बाय,सस्पैंड,उर्जा
+Keywords[hr]=energy,saver,apm,acpi,dpms,timeout,blanking,stand by,suspend,power,štednja energije,energija,štednja,crnilo
+Keywords[hu]=energia,kímélő,apm,acpi,dpms,időtúllépés,képernyőkioltás,készenlét,felfüggesztés,tápfeszültség
+Keywords[id]=energi,hemat,apm,acpi,timeout,blanking,stand by,suspend,Power
+Keywords[is]=orka,sparnaður,svæfing,apm,slökkva,svæfa,kveikja,dpms,tímamörk
+Keywords[it]=energia,risparmio,apm,acpi,tempo massimo,schermo nero,stand by,sospensione,corrente
+Keywords[ja]=電源,節約,apm,acpi,dpms,タイムアウト,ブランク,スタンバイ,サスペンド,パワー
+Keywords[ka]=ენერგია,შემნახველი, apm, acpi, dpms, დროის ამოწურვა, გასუფთავება, მზაობა, გაუქმება, კვება
+Keywords[km]=ថាមពល,អ្នក​សង្គ្រោះ,apm,acpi,dpms,អស់​ពេល,ទទេ,ឈប់​មួយ​ភ្លែត,ឈប់​បណ្ដោះ​អាសន្ន
+Keywords[lt]=energija,saugojimas,apm,acpi,pertrauka,gesinimas,stabdymas, pristabdymas,energija
+Keywords[lv]=enerģija,glabātājs,apm,acpi,dpms,taimauts,tukšs,gaidīt,izslēgt,iemidzināt,Barošana
+Keywords[mk]=energy,saver,apm,acpi,dpms,timeout,blanking,stand by,suspend,power,енергија,штедач,истек на време
+Keywords[mn]=Энерги,APM,ACPI,DPMS,Хугацаа хэтрэлт,Standby,Бэлэн байдал
+Keywords[mt]=energy,saver,apm,acpi,dpms,timeout,blanking,stand by,suspend,power,dawl,enerġija,elettriku,konsum
+Keywords[nb]=energi,sparing,apm,acpi,dpms,tidsgrense,tom skjerm,ventemodus,hvilemodus,dvalemodus,strøm
+Keywords[nds]=Energie,sporen,apm,acpi,dpms,timeout,blanking,stand by,suspend,Energie
+Keywords[ne]=शक्ति, बचतकर्ता, apm, acpi, dpms, समय समाप्त, रिक्त, उभिनु, निलम्बन, सामर्थ्य
+Keywords[nl]=energie,besparing,apm,acpi,tijdslimiet,slaapstand,stand-by,suspend,power,wachtstand,laptop,beeldscherm,monitor,display,timeout
+Keywords[nn]=energi,sparing,apm,acpi,dpms,tidsgrense,tom skjerm,standby,suspend,straum,dvale
+Keywords[nso]=maatla,seboloki,apm,acpi,dpms,feletswe ke nako,ga ena selo, moemalegato,koba bonakwana,matla
+Keywords[pa]=energy,saver,apm,acpi,dpms,timeout,blanking,stand by,suspend,ਊਰਜਾ,ਮੁਅੱਤਲ
+Keywords[pl]=energia,zachowywanie,apm,acpi,dpms,limit czasu,wygaszenie ekranu,wyłączanie,uśpienie,hibernacja,zasilanie
+Keywords[pt]=energia,poupança,apm,acpi,temporizador,stand by,suspender,alimentação
+Keywords[pt_BR]=energia,poupar,APM,ACPI,dpms,tempo limite,desligamento,em espera,suspender,Força
+Keywords[ro]=energie,salvare,apm,acpi,dpms,temporizare,stinge,stand by,suspendare,rețea electrică
+Keywords[rw]=ingufu,mubika,apm,acpi,dpms,igihecyarenze,kugira ahatanditseho, kuba witeguye,gusubika,umuriro
+Keywords[se]=árja,siestin,acpm,acpi,dpms,áigemearri,guorus šearbma,standby,suspend,el-rávdnji
+Keywords[sk]=energia,apm,acpi,vypnúť,timeout,zhasnúť,suspend,stand by,šetrič
+Keywords[sl]=energija,ohranjevalnik,varčevalnik,apm,acpi,suspend,potek,zatemnitev,energija
+Keywords[sr]=енергија,штедња,apm,acpi,timeout,blanking,stand by,suspend,напајање
+Keywords[sr@Latn]=energija,štednja,apm,acpi,timeout,blanking,stand by,suspend,napajanje
+Keywords[sv]=energi,spar,apm,acpi,dpms,tidsgräns,viloläge,vänteläge,ström
+Keywords[ta]=சக்தி,சேமிப்பான்,apm,acpi,dpms,நேரமுடிவு,இடைவெளி விடுதல்,ஆதாரம்,நீக்கம்,மின்சக்தி
+Keywords[th]=พลังงาน,ประหยัด,apm,acpi,dpms,หมดเวลา,ว่าง,เตรียมตัว,ปิดชั่วคราว,พลัง
+Keywords[tr]=enerji,apm,acpi,dpms,zaman aşımı,boşaltma,bekleme,karartma,güç
+Keywords[uk]=енергія,живлення,зберігач,apm,acpi, тайм-аут,гасіння,режим чергування,призупинення
+Keywords[uz]=energiya,tejash,apm,acpi,dpms,taymaut,blanking,stand by,suspend,elektr taʼminoti
+Keywords[uz@cyrillic]=энергия,тежаш,apm,acpi,dpms,таймаут,blanking,stand by,suspend,электр таъминоти
+Keywords[ven]=maanda,muvhulungi,apm,acpi,u fhela ha tshifhinga,blanking,zwanagatsini,phandela,Maanda
+Keywords[vi]=năng lượng,tiết kiệm,apm,acpi,dpms,hết giờ,mất điện,tạm nghỉ,treo,công suất
+Keywords[wa]=enerdjeye,schaper,schapeu,apm,acpi,dpms,timeout,blanking,stand by,suspend,power,djoker
+Keywords[xh]=amandla,umgcini,apm,acpi,dpms,ixesha lokuphuma,engenambhalo,umphumzi,gxotha,amandla
+Keywords[zh_CN]=energy,saver,apm,acpi,dpms,timeout,blanking,stand by,suspend,power,能源,节省,超时,黑屏,待机,休眠,电源
+Keywords[zh_TW]=energy,saver,apm,acpi,dpms,timeout,blanking,stand by,suspend,Power,能源,省電器,逾時,轉暗,待機,休眠,電源
+Keywords[zu]=umdlandla,umgcini,apm,acpi,isikhathi sokuphuma,ukuvimbela,lindela lengisa,amandla
+
diff --git a/kcontrol/energy/energy.h b/kcontrol/energy/energy.h
new file mode 100644
index 000000000..d41b89e26
--- /dev/null
+++ b/kcontrol/energy/energy.h
@@ -0,0 +1,68 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ *
+ *
+ * This file is part of the KDE project, module kcontrol.
+ * Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ *
+ * You can Freely distribute this program under the GNU General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ *
+ * Based on kcontrol1 energy.h, Copyright (c) 1999 Tom Vijlbrief.
+ */
+
+#ifndef __Energy_h_Included__
+#define __Energy_h_Included__
+
+#include <qobject.h>
+#include <kcmodule.h>
+
+class QCheckBox;
+class KIntNumInput;
+class KConfig;
+
+extern "C" void init_energy();
+
+/**
+ * The Desktop/Energy tab in kcontrol.
+ */
+class KEnergy: public KCModule
+{
+ Q_OBJECT
+
+public:
+ KEnergy(QWidget *parent, const char *name);
+ ~KEnergy();
+
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+
+private slots:
+ void slotChangeEnable(bool);
+ void slotChangeStandby(int);
+ void slotChangeSuspend(int);
+ void slotChangeOff(int);
+ void openURL(const QString &);
+
+private:
+ void readSettings();
+ void writeSettings();
+ void showSettings();
+
+ static void applySettings(bool, int, int, int);
+ friend void init_energy();
+
+ bool m_bChanged, m_bDPMS, m_bEnabled, m_bMaintainSanity;
+ int m_Standby, m_Suspend, m_Off;
+ int m_StandbyDesired, m_SuspendDesired, m_OffDesired;
+
+ QCheckBox *m_pCBEnable;
+ KIntNumInput *m_pStandbySlider;
+ KIntNumInput *m_pSuspendSlider;
+ KIntNumInput *m_pOffSlider;
+ KConfig *m_pConfig;
+};
+
+#endif // __Energy_h_Included__
diff --git a/kcontrol/energy/pics/Makefile.am b/kcontrol/energy/pics/Makefile.am
new file mode 100644
index 000000000..a53060d03
--- /dev/null
+++ b/kcontrol/energy/pics/Makefile.am
@@ -0,0 +1,5 @@
+pics_DATA = energybig.png lo-energy.png
+picsdir = $(kde_datadir)/kcontrol/pics
+
+EXTRA_DIST = $(pics_DATA)
+
diff --git a/kcontrol/energy/pics/energybig.png b/kcontrol/energy/pics/energybig.png
new file mode 100644
index 000000000..1a79fe748
--- /dev/null
+++ b/kcontrol/energy/pics/energybig.png
Binary files differ
diff --git a/kcontrol/energy/pics/lo-energy.png b/kcontrol/energy/pics/lo-energy.png
new file mode 100644
index 000000000..9706644b1
--- /dev/null
+++ b/kcontrol/energy/pics/lo-energy.png
Binary files differ
diff --git a/kcontrol/filetypes/Makefile.am b/kcontrol/filetypes/Makefile.am
new file mode 100644
index 000000000..b47763254
--- /dev/null
+++ b/kcontrol/filetypes/Makefile.am
@@ -0,0 +1,29 @@
+AM_CPPFLAGS = $(all_includes)
+
+kcm_filetypes_la_LIBADD = libfiletypes.la $(LIB_KIO)
+kcm_filetypes_la_LDFLAGS = -module -avoid-version -no-undefined $(all_libraries)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = kcm_filetypes.la
+
+kcm_filetypes_la_SOURCES = control.cpp
+
+noinst_HEADERS = filetypesview.h filetypedetails.h filegroupdetails.h \
+ kservicelistwidget.h typeslistitem.h newtypedlg.h \
+ kserviceselectdlg.h
+
+bin_PROGRAMS = keditfiletype
+
+noinst_LTLIBRARIES = libfiletypes.la
+libfiletypes_la_SOURCES = filetypesview.cpp filetypedetails.cpp filegroupdetails.cpp \
+ kservicelistwidget.cpp typeslistitem.cpp newtypedlg.cpp \
+ kserviceselectdlg.cpp
+
+keditfiletype_SOURCES = keditfiletype.cpp
+keditfiletype_LDADD = libfiletypes.la $(LIB_KIO)
+keditfiletype_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/filetypes.pot
+
+xdg_apps_DATA = filetypes.desktop
diff --git a/kcontrol/filetypes/control.cpp b/kcontrol/filetypes/control.cpp
new file mode 100644
index 000000000..55e98d95e
--- /dev/null
+++ b/kcontrol/filetypes/control.cpp
@@ -0,0 +1,11 @@
+#include "filetypesview.h"
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_filetypes(QWidget *parent, const char *)
+ {
+ return new FileTypesView(parent, "filetypes");
+ }
+
+}
+
diff --git a/kcontrol/filetypes/filegroupdetails.cpp b/kcontrol/filetypes/filegroupdetails.cpp
new file mode 100644
index 000000000..a8895965a
--- /dev/null
+++ b/kcontrol/filetypes/filegroupdetails.cpp
@@ -0,0 +1,65 @@
+/* This file is part of the KDE project
+ Copyright (C) 2000 David Faure <faure@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License version 2 as published by the Free Software Foundation.
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#include "filegroupdetails.h"
+#include "typeslistitem.h"
+#include <qlayout.h>
+#include <qvbuttongroup.h>
+#include <qradiobutton.h>
+#include <qwhatsthis.h>
+#include <kdialog.h>
+#include <klocale.h>
+
+FileGroupDetails::FileGroupDetails(QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+ QWidget * parentWidget = this;
+ QVBoxLayout *secondLayout = new QVBoxLayout(parentWidget,
+ 0, KDialog::spacingHint());
+
+ m_autoEmbed = new QVButtonGroup( i18n("Left Click Action"), parentWidget );
+ m_autoEmbed->layout()->setSpacing( KDialog::spacingHint() );
+ secondLayout->addWidget( m_autoEmbed );
+ // The order of those two items is very important. If you change it, fix typeslistitem.cpp !
+ new QRadioButton( i18n("Show file in embedded viewer"), m_autoEmbed );
+ new QRadioButton( i18n("Show file in separate viewer"), m_autoEmbed );
+ connect(m_autoEmbed, SIGNAL( clicked( int ) ), SLOT( slotAutoEmbedClicked( int ) ));
+
+ QWhatsThis::add( m_autoEmbed, i18n("Here you can configure what the Konqueror file manager"
+ " will do when you click on a file belonging to this group. Konqueror can display the file in"
+ " an embedded viewer or start up a separate application. You can change this setting for a"
+ " specific file type in the 'Embedding' tab of the file type configuration.") );
+
+ secondLayout->addStretch();
+}
+
+void FileGroupDetails::setTypeItem( TypesListItem * item )
+{
+ Q_ASSERT( item->isMeta() );
+ m_item = item;
+ m_autoEmbed->setButton( item ? item->autoEmbed() : -1 );
+}
+
+void FileGroupDetails::slotAutoEmbedClicked(int button)
+{
+ if ( !m_item )
+ return;
+ m_item->setAutoEmbed( button );
+ emit changed(true);
+}
+
+#include "filegroupdetails.moc"
diff --git a/kcontrol/filetypes/filegroupdetails.h b/kcontrol/filetypes/filegroupdetails.h
new file mode 100644
index 000000000..1716954f3
--- /dev/null
+++ b/kcontrol/filetypes/filegroupdetails.h
@@ -0,0 +1,50 @@
+/* This file is part of the KDE project
+ Copyright (C) 2000 David Faure <faure@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License version 2 as published by the Free Software Foundation.
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef _FILEGROUPDETAILS_H
+#define _FILEGROUPDETAILS_H
+
+#include <qwidget.h>
+class TypesListItem;
+class QButtonGroup;
+
+/**
+ * This widget contains the details for a filetype group.
+ * Currently this only involves the embedding configuration.
+ */
+class FileGroupDetails : public QWidget
+{
+ Q_OBJECT
+public:
+ FileGroupDetails(QWidget *parent = 0, const char *name = 0);
+
+ void setTypeItem( TypesListItem * item );
+
+signals:
+ void changed(bool);
+
+protected slots:
+ void slotAutoEmbedClicked(int button);
+
+private:
+ TypesListItem * m_item;
+
+ // Embedding config
+ QButtonGroup *m_autoEmbed;
+};
+
+#endif
diff --git a/kcontrol/filetypes/filetypedetails.cpp b/kcontrol/filetypes/filetypedetails.cpp
new file mode 100644
index 000000000..436fd138d
--- /dev/null
+++ b/kcontrol/filetypes/filetypedetails.cpp
@@ -0,0 +1,299 @@
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qvbuttongroup.h>
+#include <qwhatsthis.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kicondialog.h>
+#include <klineedit.h>
+#include <kinputdialog.h>
+#include <klocale.h>
+
+#include "kservicelistwidget.h"
+#include "filetypedetails.h"
+#include "typeslistitem.h"
+
+FileTypeDetails::FileTypeDetails( QWidget * parent, const char * name )
+ : QTabWidget( parent, name ), m_item( 0L )
+{
+ QString wtstr;
+ // First tab - General
+ QWidget * firstWidget = new QWidget(this);
+ QVBoxLayout *firstLayout = new QVBoxLayout(firstWidget,KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ QHBoxLayout *hBox = new QHBoxLayout(0L, 0, KDialog::spacingHint());
+ firstLayout->addLayout(hBox, 1);
+
+ iconButton = new KIconButton(firstWidget);
+ iconButton->setIconType(KIcon::Desktop, KIcon::MimeType);
+ connect(iconButton, SIGNAL(iconChanged(QString)), SLOT(updateIcon(QString)));
+
+ iconButton->setFixedSize(70, 70);
+ hBox->addWidget(iconButton);
+
+ QWhatsThis::add( iconButton, i18n("This button displays the icon associated"
+ " with the selected file type. Click on it to choose a different icon.") );
+
+ QGroupBox *gb = new QGroupBox(i18n("Filename Patterns"), firstWidget);
+ hBox->addWidget(gb);
+
+ QGridLayout *grid = new QGridLayout(gb, 3, 2, KDialog::marginHint(),
+ KDialog::spacingHint());
+ grid->addRowSpacing(0, fontMetrics().lineSpacing());
+
+ extensionLB = new QListBox(gb);
+ connect(extensionLB, SIGNAL(highlighted(int)), SLOT(enableExtButtons(int)));
+ grid->addMultiCellWidget(extensionLB, 1, 2, 0, 0);
+ grid->setRowStretch(0, 0);
+ grid->setRowStretch(1, 1);
+ grid->setRowStretch(2, 0);
+
+ QWhatsThis::add( extensionLB, i18n("This box contains a list of patterns that can be"
+ " used to identify files of the selected type. For example, the pattern *.txt is"
+ " associated with the file type 'text/plain'; all files ending in '.txt' are recognized"
+ " as plain text files.") );
+
+ addExtButton = new QPushButton(i18n("Add..."), gb);
+ addExtButton->setEnabled(false);
+ connect(addExtButton, SIGNAL(clicked()),
+ this, SLOT(addExtension()));
+ grid->addWidget(addExtButton, 1, 1);
+
+ QWhatsThis::add( addExtButton, i18n("Add a new pattern for the selected file type.") );
+
+ removeExtButton = new QPushButton(i18n("Remove"), gb);
+ removeExtButton->setEnabled(false);
+ connect(removeExtButton, SIGNAL(clicked()),
+ this, SLOT(removeExtension()));
+ grid->addWidget(removeExtButton, 2, 1);
+
+ QWhatsThis::add( removeExtButton, i18n("Remove the selected filename pattern.") );
+
+ gb = new QGroupBox(i18n("Description"), firstWidget);
+ firstLayout->addWidget(gb);
+
+ gb->setColumnLayout(1, Qt::Horizontal);
+ description = new KLineEdit(gb);
+ connect(description, SIGNAL(textChanged(const QString &)),
+ SLOT(updateDescription(const QString &)));
+
+ wtstr = i18n("You can enter a short description for files of the selected"
+ " file type (e.g. 'HTML Page'). This description will be used by applications"
+ " like Konqueror to display directory content.");
+ QWhatsThis::add( gb, wtstr );
+ QWhatsThis::add( description, wtstr );
+
+ serviceListWidget = new KServiceListWidget( KServiceListWidget::SERVICELIST_APPLICATIONS, firstWidget );
+ connect( serviceListWidget, SIGNAL(changed(bool)), this, SIGNAL(changed(bool)));
+ firstLayout->addWidget(serviceListWidget, 5);
+
+ // Second tab - Embedding
+ QWidget * secondWidget = new QWidget(this);
+ QVBoxLayout *secondLayout = new QVBoxLayout(secondWidget, KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ m_autoEmbed = new QVButtonGroup( i18n("Left Click Action"), secondWidget );
+ m_autoEmbed->layout()->setSpacing( KDialog::spacingHint() );
+ secondLayout->addWidget( m_autoEmbed, 1 );
+
+ m_autoEmbed->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)3, (QSizePolicy::SizeType)0, m_autoEmbed->sizePolicy().hasHeightForWidth() ) );
+
+ // The order of those three items is very important. If you change it, fix typeslistitem.cpp !
+ new QRadioButton( i18n("Show file in embedded viewer"), m_autoEmbed );
+ new QRadioButton( i18n("Show file in separate viewer"), m_autoEmbed );
+ m_rbGroupSettings = new QRadioButton( i18n("Use settings for '%1' group"), m_autoEmbed );
+ connect(m_autoEmbed, SIGNAL( clicked( int ) ), SLOT( slotAutoEmbedClicked( int ) ));
+
+ m_chkAskSave = new QCheckBox( i18n("Ask whether to save to disk instead"), m_autoEmbed);
+ connect(m_chkAskSave, SIGNAL( toggled(bool) ), SLOT( slotAskSaveToggled(bool) ));
+
+ QWhatsThis::add( m_autoEmbed, i18n("Here you can configure what the Konqueror file manager"
+ " will do when you click on a file of this type. Konqueror can display the file in"
+ " an embedded viewer or start up a separate application. If set to 'Use settings for G group',"
+ " Konqueror will behave according to the settings of the group G this type belongs to,"
+ " for instance 'image' if the current file type is image/png.") );
+
+ secondLayout->addSpacing(10);
+
+ embedServiceListWidget = new KServiceListWidget( KServiceListWidget::SERVICELIST_SERVICES, secondWidget );
+ embedServiceListWidget->setMinimumHeight( serviceListWidget->sizeHint().height() );
+ connect( embedServiceListWidget, SIGNAL(changed(bool)), this, SIGNAL(changed(bool)));
+ secondLayout->addWidget(embedServiceListWidget, 3);
+
+ addTab( firstWidget, i18n("&General") );
+ addTab( secondWidget, i18n("&Embedding") );
+}
+
+void FileTypeDetails::updateRemoveButton()
+{
+ removeExtButton->setEnabled(extensionLB->count()>0);
+}
+
+void FileTypeDetails::updateIcon(QString icon)
+{
+ if (!m_item)
+ return;
+
+ m_item->setIcon(icon);
+
+ emit changed(true);
+}
+
+void FileTypeDetails::updateDescription(const QString &desc)
+{
+ if (!m_item)
+ return;
+
+ m_item->setComment(desc);
+
+ emit changed(true);
+}
+
+void FileTypeDetails::addExtension()
+{
+ if ( !m_item )
+ return;
+
+ bool ok;
+ QString ext = KInputDialog::getText( i18n( "Add New Extension" ),
+ i18n( "Extension:" ), "*.", &ok, this );
+ if (ok) {
+ extensionLB->insertItem(ext);
+ QStringList patt = m_item->patterns();
+ patt += ext;
+ m_item->setPatterns(patt);
+ updateRemoveButton();
+ emit changed(true);
+ }
+}
+
+void FileTypeDetails::removeExtension()
+{
+ if (extensionLB->currentItem() == -1)
+ return;
+ if ( !m_item )
+ return;
+ QStringList patt = m_item->patterns();
+ patt.remove(extensionLB->text(extensionLB->currentItem()));
+ m_item->setPatterns(patt);
+ extensionLB->removeItem(extensionLB->currentItem());
+ updateRemoveButton();
+ emit changed(true);
+}
+
+void FileTypeDetails::slotAutoEmbedClicked( int button )
+{
+ if ( !m_item || (button > 2))
+ return;
+
+ m_item->setAutoEmbed( button );
+
+ updateAskSave();
+
+ emit changed(true);
+}
+
+void FileTypeDetails::updateAskSave()
+{
+ if ( !m_item )
+ return;
+
+ int button = m_item->autoEmbed();
+ if (button == 2)
+ {
+ bool embedParent = TypesListItem::defaultEmbeddingSetting(m_item->majorType());
+ emit embedMajor(m_item->majorType(), embedParent);
+ button = embedParent ? 0 : 1;
+ }
+
+ QString mimeType = m_item->name();
+
+ QString dontAskAgainName;
+
+ if (button == 0) // Embedded
+ dontAskAgainName = "askEmbedOrSave"+mimeType;
+ else
+ dontAskAgainName = "askSave"+mimeType;
+
+ KSharedConfig::Ptr config = KSharedConfig::openConfig("konquerorrc", false, false);
+ config->setGroup("Notification Messages");
+ bool ask = config->readEntry(dontAskAgainName).isEmpty();
+ m_item->getAskSave(ask);
+
+ bool neverAsk = false;
+
+ if (button == 0)
+ {
+ KMimeType::Ptr mime = KMimeType::mimeType( mimeType );
+ // Don't ask for:
+ // - html (even new tabs would ask, due to about:blank!)
+ // - dirs obviously (though not common over HTTP :),
+ // - images (reasoning: no need to save, most of the time, because fast to see)
+ // e.g. postscript is different, because takes longer to read, so
+ // it's more likely that the user might want to save it.
+ // - multipart/* ("server push", see kmultipart)
+ // - other strange 'internal' mimetypes like print/manager...
+ if ( mime->is( "text/html" ) ||
+ mime->is( "text/xml" ) ||
+ mime->is( "inode/directory" ) ||
+ mimeType.startsWith( "image" ) ||
+ mime->is( "multipart/x-mixed-replace" ) ||
+ mime->is( "multipart/replace" ) ||
+ mimeType.startsWith( "print" ) )
+ {
+ neverAsk = true;
+ }
+ }
+
+ m_chkAskSave->blockSignals(true);
+ m_chkAskSave->setChecked(ask && !neverAsk);
+ m_chkAskSave->setEnabled(!neverAsk);
+ m_chkAskSave->blockSignals(false);
+}
+
+void FileTypeDetails::slotAskSaveToggled(bool askSave)
+{
+ if (!m_item)
+ return;
+
+ m_item->setAskSave(askSave);
+ emit changed(true);
+}
+
+void FileTypeDetails::setTypeItem( TypesListItem * tlitem )
+{
+ m_item = tlitem;
+ if ( tlitem )
+ iconButton->setIcon(tlitem->icon());
+ else
+ iconButton->resetIcon();
+ description->setText(tlitem ? tlitem->comment() : QString::null);
+ if ( tlitem )
+ m_rbGroupSettings->setText( i18n("Use settings for '%1' group").arg( tlitem->majorType() ) );
+ extensionLB->clear();
+ addExtButton->setEnabled(true);
+ removeExtButton->setEnabled(false);
+
+ serviceListWidget->setTypeItem( tlitem );
+ embedServiceListWidget->setTypeItem( tlitem );
+ m_autoEmbed->setButton( tlitem ? tlitem->autoEmbed() : -1 );
+ m_rbGroupSettings->setEnabled( tlitem->canUseGroupSetting() );
+
+ if ( tlitem )
+ extensionLB->insertStringList(tlitem->patterns());
+ else
+ extensionLB->clear();
+
+ updateAskSave();
+}
+
+void FileTypeDetails::enableExtButtons(int /*index*/)
+{
+ removeExtButton->setEnabled(true);
+}
+
+#include "filetypedetails.moc"
diff --git a/kcontrol/filetypes/filetypedetails.h b/kcontrol/filetypes/filetypedetails.h
new file mode 100644
index 000000000..6f9a0a548
--- /dev/null
+++ b/kcontrol/filetypes/filetypedetails.h
@@ -0,0 +1,64 @@
+#ifndef _FILETYPEDETAILS_H
+#define _FILETYPEDETAILS_H
+
+#include <qtabwidget.h>
+class TypesListItem;
+class KIconButton;
+class QLineEdit;
+class QListBox;
+class QButtonGroup;
+class QCheckBox;
+class QRadioButton;
+class QPushButton;
+class KServiceListWidget;
+
+/**
+ * This widget contains the right part of the file type configuration
+ * dialog, that shows the details for a file type.
+ * It is implemented as a separate class so that it can be used by
+ * the keditfiletype program to show the details of a single mimetype.
+ */
+class FileTypeDetails : public QTabWidget
+{
+ Q_OBJECT
+public:
+ FileTypeDetails(QWidget *parent = 0, const char *name = 0);
+
+ void setTypeItem( TypesListItem * item );
+
+protected:
+ void updateRemoveButton();
+ void updateAskSave();
+
+signals:
+ void embedMajor(const QString &major, bool &embed); // To adjust whether major type is being embedded
+ void changed(bool);
+
+protected slots:
+ void updateIcon(QString icon);
+ void updateDescription(const QString &desc);
+ void addExtension();
+ void removeExtension();
+ void enableExtButtons(int index);
+ void slotAutoEmbedClicked(int button);
+ void slotAskSaveToggled(bool);
+
+private:
+ TypesListItem * m_item;
+
+ // First tab - General
+ KIconButton *iconButton;
+ QListBox *extensionLB;
+ QPushButton *addExtButton, *removeExtButton;
+ QLineEdit *description;
+ KServiceListWidget *serviceListWidget;
+
+ // Second tab - Embedding
+ QButtonGroup *m_autoEmbed;
+ KServiceListWidget *embedServiceListWidget;
+ QRadioButton *m_rbOpenSeparate;
+ QCheckBox *m_chkAskSave;
+ QRadioButton *m_rbGroupSettings;
+};
+
+#endif
diff --git a/kcontrol/filetypes/filetypes.desktop b/kcontrol/filetypes/filetypes.desktop
new file mode 100644
index 000000000..372af2213
--- /dev/null
+++ b/kcontrol/filetypes/filetypes.desktop
@@ -0,0 +1,235 @@
+[Desktop Entry]
+Icon=filetypes
+Type=Application
+Exec=kcmshell filetypes
+DocPath=kcontrol/filetypes/index.html
+Categories=Qt;KDE;X-KDE-settings-components;
+
+
+X-KDE-Library=filetypes
+X-KDE-ParentApp=kcontrol
+
+Name=File Associations
+Name[af]=Lêer Assosiasies
+Name[ar]=ارتباطات الملفات
+Name[az]=Fayl Əlaqələri
+Name[be]=Асацыяцыі файлаў
+Name[bg]=Файлови асоциации
+Name[bn]=ফাইল অ্যাসোসিয়েশন
+Name[br]=Kevreañ restroù
+Name[bs]=Asociranje datoteka
+Name[ca]=Associacions de fitxers
+Name[cs]=Asociace souborů
+Name[csb]=Pòwiązania lopków
+Name[cy]=Cysylltiadau Ffeiliau
+Name[da]=Filassociationer
+Name[de]=Dateizuordnungen
+Name[el]=Συσχετίσεις αρχείων
+Name[eo]=Dosiertipoj
+Name[es]=Asociaciones de archivo
+Name[et]=Failide seosed
+Name[eu]=Fitxategi elkarketak
+Name[fa]=انجمنهای پرونده
+Name[fi]=Tiedostosidokset
+Name[fr]=Associations de fichiers
+Name[fy]=Triemassosjaasjes
+Name[gl]=Asociacións de Ficheiros
+Name[he]=שיוכי קבצים
+Name[hi]=फ़ाइल असोसिएशन
+Name[hr]=Pridruživanja datoteka
+Name[hu]=Fájltársítások
+Name[id]=Asosiasi File
+Name[is]=Skráavensl
+Name[it]=Associazioni file
+Name[ja]=ファイルの関連付け
+Name[ka]=ფაილთა მიბმა
+Name[kk]=Файл сәйкестіктері
+Name[km]=ទំនាក់​ទំនង​ឯកសារ
+Name[ko]=파일 연결
+Name[lo]=ການກຳນົດໃຊ້ແຟ້ມ
+Name[lt]=Bylų asociacijos
+Name[lv]=Failu Asociācijas
+Name[mk]=Асоцијации на датотеки
+Name[mn]=Файл холбоосууд
+Name[mt]=Assoċjazzjonijiet tal-Fajls
+Name[nb]=Filtilknytninger
+Name[nds]=Datei-Toornen
+Name[ne]=फाइल संयोजन
+Name[nl]=Bestandsassociaties
+Name[nn]=Filtilknytingar
+Name[nso]=Dikopantsho tsa Difaele
+Name[oc]=Associacions de fiquièrs
+Name[pa]=ਫਾਇਲ ਸਬੰਧ
+Name[pl]=Skojarzenia plików
+Name[pt]=Associação de Ficheiros
+Name[pt_BR]=Associações de arquivos
+Name[ro]=Asociere fișiere
+Name[ru]=Привязки файлов
+Name[rw]=Ishyirahamwe ry'Idosiye
+Name[se]=Fiilačatnagasat
+Name[sk]=Asociácie súborov
+Name[sl]=Datotečne povezave
+Name[sr]=Придружења фајловима
+Name[sr@Latn]=Pridruženja fajlovima
+Name[sv]=Filbindningar
+Name[ta]=கோப்பு ஒருங்கமைப்புகள்
+Name[tg]=Вобастагонии Файл
+Name[th]=กำหนดการใช้แฟ้ม
+Name[tr]=Dosya İlişkileri
+Name[tt]=Kiremnär Kileşterü
+Name[uk]=Асоціації файлів
+Name[uz]=Fayl turi bilan\nbogʻliqlar
+Name[uz@cyrillic]=Файл тури билан\nбоғлиқлар
+Name[ven]=U fanyisa faela
+Name[vi]=Kiểu tập tin
+Name[wa]=Elaxhaedjes di fitchîs
+Name[xh]=Uyelemaniso Lwefayile
+Name[zh_CN]=文件关联
+Name[zh_TW]=檔案關聯
+Name[zu]=Ubudlelwano befayela
+
+Comment=Configure file associations
+Comment[af]=Konfigureer lêer assosiasies
+Comment[ar]=إعداد إرتباطات الملفات
+Comment[az]=Fayl əlaqələrini quraşdır
+Comment[be]=Настаўленні асацыяцыяў файлаў
+Comment[bg]=Настройване и асоцииране на файлови типове с програми
+Comment[bn]=ফাইল অ্যাসোসিয়েশন কনফিগার করুন
+Comment[br]=Kefluniañ kevreañ restroù
+Comment[bs]=Podesite asocijacije datoteka
+Comment[ca]=Configura les associacions de fitxers
+Comment[cs]=Nastavení asociací souborů
+Comment[csb]=Konfigùracëjô pòwiązaniów lopków
+Comment[cy]=Ffurfweddu cysylltiadau ffeiliau
+Comment[da]=Indstil filassociationer
+Comment[de]=Dateizuordnungen vornehmen
+Comment[el]=Ρύθμιση των συσχετίσεων αρχείων
+Comment[eo]=Agordu de ligo de programoj al dosiertipoj
+Comment[es]=Configuración de asociaciones de archivos
+Comment[et]=Failide seoste seadistamine
+Comment[eu]=Fitxategi elkarketak konfiguratzen ditu
+Comment[fa]=پیکربندی انجمنهای پرونده
+Comment[fi]=Tiedostosidokset
+Comment[fr]=Configuration des associations de fichiers
+Comment[fy]=Hjir kinne jo de triemassosjaasjes ynstelle
+Comment[gl]=Configurar as asociacións de ficheiros
+Comment[he]=שינוי הגדרות שיוכי הקבצים
+Comment[hi]=फ़ाइल असोसिएशन कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje pridruživanja datoteka
+Comment[hu]=A fájlhozzárendelések módosítása
+Comment[is]=Stilla skráavensl
+Comment[it]=Configura associazioni dei file
+Comment[ja]=ファイルの関連付けを設定
+Comment[ka]=ფაილთა მიბმის კონფიგურირება
+Comment[kk]=Файл сәйкестіктерін баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ទំនាក់​ទំនង​ឯកសារ
+Comment[ko]=파일 연결 설정
+Comment[lo]=ບັນທຶກຄ່າປັບແຕ່ງຂອງການເລີ່ມລະບົບ
+Comment[lt]=Konfigūruoti bylų sietis
+Comment[lv]=Konfigurēt failu asociācijas
+Comment[mk]=Конфигурирајте ги асоцијациите на датотеките
+Comment[mn]=Файлын холбоосуудыг тохируулах
+Comment[mt]=Ikkonfigura assoċjazzjoni ta' fajls
+Comment[nb]=Sette opp filtilknytninger
+Comment[nds]=Instellen, welk Dateitypen welk Programmen tohöört
+Comment[ne]=फाइल संयोजन कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u de bestandsassociaties instellen
+Comment[nn]=Set opp filassosiasjonar
+Comment[nso]=Beakanya dikopantsho tsa difaele
+Comment[pa]=ਫਾਇਲ ਸਬੰਧ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja skojarzeń plików
+Comment[pt]=Configuração das associações de ficheiros
+Comment[pt_BR]=Configura associações de arquivos
+Comment[ro]=Configurează asocierea fișierelor cu aplicații
+Comment[ru]=Настройка привязки файлов
+Comment[rw]=Kuboneza Ishyirahamwe ry'Idosiye
+Comment[se]=Heivet fiilačatnagasaid
+Comment[sk]=Nastavenie asociácií súborov
+Comment[sl]=Nastavi datotečne povezave
+Comment[sr]=Подешавање придружења фајловима
+Comment[sr@Latn]=Podešavanje pridruženja fajlovima
+Comment[sv]=Anpassa filbindningar
+Comment[ta]=ஒருங்கிணைப்புகளை வடிவமை
+Comment[tg]=Танзими вобастагони Файл
+Comment[th]=ปรับแต่งการเรียกใช้งานแฟ้ม
+Comment[tr]=Dosya bağıntılarını yapılandır
+Comment[tt]=Biremnärne yazılımnarğa totaştırıp kileşterü
+Comment[uk]=Налаштування асоціацій файлів
+Comment[uz]=Fayl turi bilan bogʻliqlarni moslash
+Comment[uz@cyrillic]=Файл тури билан боғлиқларни мослаш
+Comment[ven]=Nzudzanyo yau fanyisa ha faela
+Comment[vi]=Cấu hình kiểu tập tin
+Comment[wa]=Apontiaedjes des elaxhaedjes di fitchîs
+Comment[xh]=Qwalasela uloyamiso lwefayile
+Comment[zh_CN]=配置文件关联
+Comment[zh_TW]=設定檔案關聯
+Comment[zu]=Hlanganisela ubudlelwano befayela
+
+Keywords=Filetypes,File Associations,Mime Types,File Patterns,Files,Pattern
+Keywords[ar]=Filetypes,File Associations,Mime Types,File Patterns,Files,Pattern,ملفات,أنواع الملفات, أنواع Mime,ارتباطات الملفات,ملفات,الملفات,نسق,الأنساق,النسق.
+Keywords[az]=Fayl Növləri,Fayl Əlaqələri,Mime Növləri,Fayl Qəlibləri,Fayllar
+Keywords[be]=Тыпы файлаў,асацыяцыі файлаў,сувязі файлаў,тыпы MIME,шаблоны файлаў,файлы,шаблон,Filetypes,File Associations,Mime Types,File Patterns,Files,Pattern
+Keywords[bg]=файл, файлове, асоциация, асоциации, връзки, изпълнение, връзка, програма, тип на файл, тип, Filetypes, File Associations, Mime Types, File Patterns, Files, Pattern
+Keywords[ca]=Tipus de fitxer,Associacions de fitxers,Tipus Mime,Patrons de fitxer,Fitxers,Patró
+Keywords[cs]=Typy souborů,Asociace souborů,MIME typy,Vzory souborů,Soubory,Vzor
+Keywords[csb]=ôrt lopków,pòwiązania lopków,ôrtë MIME,mùster lopków,lopczi,mùster
+Keywords[cy]=Mathau o Ffeiliau,Cysylltiadau Ffeil,Mathau o Mime,Patrymau Ffeil,Ffeiliau,Patrwm
+Keywords[da]=Filtyper,Filassociationer,Mimetyper,Filmønstre,Filer,mønstre
+Keywords[de]=Dateitypen,Dateizuordnungen,MIME-Typen,Dateimuster,Filter,Muster,Dateien
+Keywords[el]=Τύποι αρχείων,Συσχετίσεις αρχείων,Τύποι mime,Μοτίβα αρχείων,Αρχεία,Μοτίβο
+Keywords[eo]=dosiertipoj,asocioj,MIME,dosieroj,ŝablonoj,dosieroj,MIME-tipoj
+Keywords[es]=Tipos de archivo,Asociaciones de archivo,Tipos MIME,Patrones de archivo,Archivos,Patrón
+Keywords[et]=Failitüübid,Failide seosed,MIME tüübid,failimustrid,failid,mustrid
+Keywords[eu]=Fitxategi motak,Fitxategi elkarketak,Mime motak, Fitxategi ereduak,Fitxategiak,Eredua
+Keywords[fa]=انواع پرونده، انجمنهای پرونده، انواع مایم، الگوهای پرونده، پرونده‌ها، الگو
+Keywords[fi]=Tiedostotyypit,Tiedostosidokset,Mimetyypit,Tiedostokuviot,Tiedostot,Kuvio
+Keywords[fo]=fíla,fílir,fíluslag
+Keywords[fr]=types de fichiers,associations de fichiers,types MIME,motifs de fichier,fichiers,motif,extension,extensions de fichiers,applications
+Keywords[fy]=Triemtypen,Triemtaheaksels,Triemassosjaasjes,mime types,Triempatroanen,Taheaksels,Triemmen
+Keywords[gl]=Tipos de ficheiro, Asociacións de ficheiro,Tipos Mime,Patróns de ficheiro,Ficheiros,Patrón
+Keywords[he]=תבניות קבצים,קבצים,תבנית,סוגי קבצים,שיוכי קבצים,טיפוסי,Mime,Filetypes,File Associations,Mime Types,File Patterns,Files,Pattern
+Keywords[hi]=फ़ाइल क़िस्म,फ़ाइल असोसिएशन,माइम क़िस्म,फ़ाइल पैटर्न,फ़ाइलें,पैटर्न
+Keywords[hr]=Filetypes,File Associations,Mime Types,File Patterns,Files,Pattern,Vrste datoteka,Pridruživanje datoteka,MIME vrste,Uzorci datoteka,datoteke,uzorci
+Keywords[hu]=fájltípusok,fájlhozzárendelések,MIME-típusok,fájlminták,fájlok,minta
+Keywords[id]=TipeFile,Asosiasi File,Mime Types,Pattern File,Files,Pattern
+Keywords[is]=Skráartegund,Skráavensl,Samhengi skráa,skráarbindingar,Mime-tög,síur,skrár,mynstur
+Keywords[it]=tipi di file,associazioni file,tipi MIME,MIME,pattern dei file,file,motivi dei file,schemi
+Keywords[ja]=ファイルタイプ,ファイルの関連付け,マイムタイプ,ファイルパターン,ファイル,パターン
+Keywords[km]=ប្រភេទ​ឯកសារ,ទំនាក់​ទំនង​ឯកសារ,ប្រភេទ Mime,លំនាំ​ឯកសារ,ឯកសារ,លំនាំ
+Keywords[lt]=Filetypes,File Associations,Mime Types,File Patterns,Files,Pattern,Bylų tipai,Bylų Asociacijos,Mime Tipai,Bylų modeliai,Bylos,Modeliai, bylų sietys
+Keywords[lv]=Failutipi,Failu Asociācijas,Maime Tipi,Failu Maskas,Faili,Maskas
+Keywords[mk]=Filetypes,File Associations,Mime Types,File Patterns,Files,Pattern,Типови на датотеки,Асоцијации на датотеки,типови,Датотеки
+Keywords[mn]=Файлын төрөл,Файлын холбоос,MIME-төрөл,Файл загвар,Шүүлтүүр,Загвар,Файлууд
+Keywords[mt]=Filetypes,File Associations,Mime Types,File Patterns,Files,Pattern,Fajls,Assoċjazzjoni,Assoċjazzjonijiet
+Keywords[nb]=Filtyper,Filtilknytninger,Mime-typer,Filmønster,filer
+Keywords[nds]=Dateitypen,Datei-Tohören,Mime Typen,Dateimuster,Datei,Muster
+Keywords[ne]=फाइल प्रकार, फाइल संयोजन, माइम प्रकार, फाइल बाँन्की, फाइलहरू, बाँन्की
+Keywords[nl]=bestandstypen,bestandsextensies,bestandsassociaties,mime types,bestandspatronen,extensies,bestanden
+Keywords[nn]=filtypar,filtilknytingar,MIME-typar,filmønster,filer,mønster
+Keywords[nso]=Mehuta ya difaele,Dikopantsho tsa Difaele,Mehuta ya Kekiso,Mekgwa ya Difaele,Difaele,Mokgwa
+Keywords[pa]=Filetypes,File Associations,Mime Types,File Patterns,ਫਾਇਲਾਂ,Pattern,ਫਾਇਲ ਕਿਸਮ,ਫਾਇਲ ਸਬੰਧ
+Keywords[pl]=Typy plików,skojarzenia plików,typy MIME,wzorce plików,pliki,wzorzec
+Keywords[pt]=tipos de ficheiros,associações a ficheiros,tipos mime,padrões de ficheiros,ficheiros,padrão
+Keywords[pt_BR]=tipos de arquivo,associações de arquivo,tipos MIME,padrões de arquivo,arquivos,MIME,padrão
+Keywords[ro]=tipuri de fișiere,asocieri fișiere,tipuri MIME,modele de fișiere,fișiere
+Keywords[rw]=Amokodosiye,Amashyirahamwe dosiye,Amoko Mime,Amashusho Dosiye,Amadosiye,Igishushanyo
+Keywords[se]=Fiilašlájat,Fiilačatnagasat,Mime-šlájat,Fiilaminsttar, fiillat,minsttar
+Keywords[sk]=Typy súborov,Prípony,Mime typy,Súbory,Vzorky,Vzorky súborov
+Keywords[sl]=vrste datotek,vezi datotek,vzorci datotek,datoteke,vzorec
+Keywords[sr]=Filetypes,File Associations,Mime Types,File Patterns,Files,Pattern,врсте фајлова,узорци фајлова,узорак,придружење,MIME типови
+Keywords[sr@Latn]=Filetypes,File Associations,Mime Types,File Patterns,Files,Pattern,vrste fajlova,uzorci fajlova,uzorak,pridruženje,MIME tipovi
+Keywords[sv]=Filtyper,Filbindningar,Mime-typer,Filmönster,Filer,Mönster
+Keywords[ta]=கோப்பு வகைகள்,கோப்பு சேர்ப்புகள், மைம் வகைகள், கோப்பு மாதிரிகள்,கோப்புகள்,மாதிரிகள்
+Keywords[th]=ประเภทแฟ้ม,กำหนดการใช้แฟ้ม,ประเภท Mime,รูปแบบแฟ้ม,แฟ้ม,รูปแบบ
+Keywords[tr]=Dosya Türleri,Dosya İlişkileri,Mime Türleri,Dosya Kalıpları,Dosyalar
+Keywords[uk]=типи файлів,асоціації файлів,типи MIME,MIME,шаблони файлів,файли,взірці,файли
+Keywords[uz]=Fayl turlari,Fayl bilan bogʻlangan dasturlar,MIME turlari,Fayl namunalari,Fayllar,Namuna
+Keywords[uz@cyrillic]=Файл турлари,Файл билан боғланган дастурлар,MIME турлари,Файл намуналари,Файллар,Намуна
+Keywords[ven]=Tshakha dza faela,U fanyisa ha Faela,Tshakha dza Maimi,Phathene ya Faela,Dzifaela,Phathene
+Keywords[vi]=Kiểu tập tin,Đuôi tập tin,Kiểu MIME,Mẫu tập tin,Tập tin, Mẫu
+Keywords[wa]=Sôre di fitchî,sôrt di fitchî,elaxhaedje di fitchî,Sôre MIME, Sôrt MIME,Modeles di fitchî,Fitchîs,Modele
+Keywords[xh]=Iindidi zefayile,Unxubelelaniso lwefayile,Iindidi zeMime,Imilinganiselo yefayile,Iifayile,Umlinganiselo
+Keywords[zh_CN]=Filetypes,File Associations,Mime Types,File Patterns,Files,文件类型,文件关联,Mime 类型,文件模式,文件
+Keywords[zh_TW]=Filetypes,File Associations,Mime Types,File Patterns,Files,Pattern,檔案類型,檔案關聯,MIME 類型,檔案樣式,檔案,樣式
+Keywords[zu]=Izinhlobo zamafayela, Ubudlelwano bamafayela,Izinhlobo zamafayela,Amaphethini amafayela,Iphethini
+
diff --git a/kcontrol/filetypes/filetypesview.cpp b/kcontrol/filetypes/filetypesview.cpp
new file mode 100644
index 000000000..4088e9eee
--- /dev/null
+++ b/kcontrol/filetypes/filetypesview.cpp
@@ -0,0 +1,440 @@
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qtimer.h>
+#include <qwhatsthis.h>
+#include <qwidgetstack.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kcursor.h>
+#include <kdebug.h>
+#include <kdesktopfile.h>
+#include <kipc.h>
+#include <klineedit.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+#include "newtypedlg.h"
+#include "filetypedetails.h"
+#include "filegroupdetails.h"
+#include "filetypesview.h"
+#include <ksycoca.h>
+
+FileTypesView::FileTypesView(QWidget *p, const char *name)
+ : KCModule(p, name)
+{
+ m_konqConfig = KSharedConfig::openConfig("konquerorrc", false, false);
+
+ setQuickHelp( i18n("<h1>File Associations</h1>"
+ " This module allows you to choose which applications are associated"
+ " with a given type of file. File types are also referred to MIME types"
+ " (MIME is an acronym which stands for \"Multipurpose Internet Mail"
+ " Extensions\".)<p> A file association consists of the following:"
+ " <ul><li>Rules for determining the MIME-type of a file, for example"
+ " the filename pattern *.kwd, which means 'all files with names that end"
+ " in .kwd', is associated with the MIME type \"x-kword\";</li>"
+ " <li>A short description of the MIME-type, for example the description"
+ " of the MIME type \"x-kword\" is simply 'KWord document';</li>"
+ " <li>An icon to be used for displaying files of the given MIME-type,"
+ " so that you can easily identify the type of file in, say, a Konqueror"
+ " view (at least for the types you use often);</li>"
+ " <li>A list of the applications which can be used to open files of the"
+ " given MIME-type -- if more than one application can be used then the"
+ " list is ordered by priority.</li></ul>"
+ " You may be surprised to find that some MIME types have no associated"
+ " filename patterns; in these cases, Konqueror is able to determine the"
+ " MIME-type by directly examining the contents of the file."));
+
+ setButtons(Help | Apply | Cancel | Ok);
+ QString wtstr;
+
+ QHBoxLayout *l = new QHBoxLayout(this, 0, KDialog::marginHint());
+ QGridLayout *leftLayout = new QGridLayout(0, 4, 3);
+ leftLayout->setSpacing( KDialog::spacingHint() );
+ leftLayout->setColStretch(1, 1);
+
+ l->addLayout( leftLayout );
+
+ QLabel *patternFilterLBL = new QLabel(i18n("F&ind filename pattern:"), this);
+ leftLayout->addMultiCellWidget(patternFilterLBL, 0, 0, 0, 2);
+
+ patternFilterLE = new KLineEdit(this);
+ patternFilterLBL->setBuddy( patternFilterLE );
+ leftLayout->addMultiCellWidget(patternFilterLE, 1, 1, 0, 2);
+
+ connect(patternFilterLE, SIGNAL(textChanged(const QString &)),
+ this, SLOT(slotFilter(const QString &)));
+
+ wtstr = i18n("Enter a part of a filename pattern. Only file types with a "
+ "matching file pattern will appear in the list.");
+
+ QWhatsThis::add( patternFilterLE, wtstr );
+ QWhatsThis::add( patternFilterLBL, wtstr );
+
+ typesLV = new KListView(this);
+ typesLV->setRootIsDecorated(true);
+ typesLV->setFullWidth(true);
+
+ typesLV->addColumn(i18n("Known Types"));
+ leftLayout->addMultiCellWidget(typesLV, 2, 2, 0, 2);
+ connect(typesLV, SIGNAL(selectionChanged(QListViewItem *)),
+ this, SLOT(updateDisplay(QListViewItem *)));
+ connect(typesLV, SIGNAL(doubleClicked(QListViewItem *)),
+ this, SLOT(slotDoubleClicked(QListViewItem *)));
+
+ QWhatsThis::add( typesLV, i18n("Here you can see a hierarchical list of"
+ " the file types which are known on your system. Click on the '+' sign"
+ " to expand a category, or the '-' sign to collapse it. Select a file type"
+ " (e.g. text/html for HTML files) to view/edit the information for that"
+ " file type using the controls on the right.") );
+
+ QPushButton *addTypeB = new QPushButton(i18n("Add..."), this);
+ connect(addTypeB, SIGNAL(clicked()), SLOT(addType()));
+ leftLayout->addWidget(addTypeB, 3, 0);
+
+ QWhatsThis::add( addTypeB, i18n("Click here to add a new file type.") );
+
+ m_removeTypeB = new QPushButton(i18n("&Remove"), this);
+ connect(m_removeTypeB, SIGNAL(clicked()), SLOT(removeType()));
+ leftLayout->addWidget(m_removeTypeB, 3, 2);
+ m_removeTypeB->setEnabled(false);
+
+ QWhatsThis::add( m_removeTypeB, i18n("Click here to remove the selected file type.") );
+
+ // For the right panel, prepare a widget stack
+ m_widgetStack = new QWidgetStack(this);
+
+ l->addWidget( m_widgetStack );
+
+ // File Type Details
+ m_details = new FileTypeDetails( m_widgetStack );
+ connect( m_details, SIGNAL( changed(bool) ),
+ this, SLOT( setDirty(bool) ) );
+ connect( m_details, SIGNAL( embedMajor(const QString &, bool &) ),
+ this, SLOT( slotEmbedMajor(const QString &, bool &)));
+ m_widgetStack->addWidget( m_details, 1 /*id*/ );
+
+ // File Group Details
+ m_groupDetails = new FileGroupDetails( m_widgetStack );
+ connect( m_groupDetails, SIGNAL( changed(bool) ),
+ this, SLOT( setDirty(bool) ) );
+ m_widgetStack->addWidget( m_groupDetails, 2 /*id*/ );
+
+ // Widget shown on startup
+ m_emptyWidget = new QLabel( i18n("Select a file type by name or by extension"), m_widgetStack);
+ m_emptyWidget->setAlignment(AlignCenter);
+
+ m_widgetStack->addWidget( m_emptyWidget, 3 /*id*/ );
+
+ m_widgetStack->raiseWidget( m_emptyWidget );
+
+ QTimer::singleShot( 0, this, SLOT( init() ) ); // this takes some time
+
+ connect( KSycoca::self(), SIGNAL( databaseChanged() ), SLOT( slotDatabaseChanged() ) );
+}
+
+FileTypesView::~FileTypesView()
+{
+}
+
+void FileTypesView::setDirty(bool state)
+{
+ emit changed(state);
+ m_dirty = state;
+}
+
+void FileTypesView::init()
+{
+ show();
+ setEnabled( false );
+
+ setCursor( KCursor::waitCursor() );
+ readFileTypes();
+ unsetCursor();
+
+ setDirty(false);
+ setEnabled( true );
+}
+
+// only call this method once on startup, then never again! Otherwise, newly
+// added Filetypes will be lost.
+void FileTypesView::readFileTypes()
+{
+ typesLV->clear();
+ m_majorMap.clear();
+ m_itemList.clear();
+ TypesListItem::reset();
+
+ TypesListItem *groupItem;
+ KMimeType::List mimetypes = KMimeType::allMimeTypes();
+ QValueListIterator<KMimeType::Ptr> it2(mimetypes.begin());
+ for (; it2 != mimetypes.end(); ++it2) {
+ QString mimetype = (*it2)->name();
+ int index = mimetype.find("/");
+ QString maj = mimetype.left(index);
+ QString min = mimetype.right(mimetype.length() - index+1);
+
+ QMapIterator<QString,TypesListItem*> mit = m_majorMap.find( maj );
+ if ( mit == m_majorMap.end() ) {
+ groupItem = new TypesListItem( typesLV, maj );
+ m_majorMap.insert( maj, groupItem );
+ }
+ else
+ groupItem = mit.data();
+
+ TypesListItem *item = new TypesListItem(groupItem, (*it2));
+ m_itemList.append( item );
+ }
+ updateDisplay(0L);
+
+}
+
+void FileTypesView::slotEmbedMajor(const QString &major, bool &embed)
+{
+ TypesListItem *groupItem;
+ QMapIterator<QString,TypesListItem*> mit = m_majorMap.find( major );
+ if ( mit == m_majorMap.end() )
+ return;
+
+ groupItem = mit.data();
+
+ embed = (groupItem->autoEmbed() == 0);
+}
+
+void FileTypesView::slotFilter(const QString & patternFilter)
+{
+ // one of the few ways to clear a listview without destroying the
+ // listviewitems and without making QListView crash.
+ QListViewItem *item;
+ while ( (item = typesLV->firstChild()) ) {
+ while ( item->firstChild() )
+ item->takeItem( item->firstChild() );
+
+ typesLV->takeItem( item );
+ }
+
+ // insert all items and their group that match the filter
+ QPtrListIterator<TypesListItem> it( m_itemList );
+ while ( it.current() ) {
+ if ( patternFilter.isEmpty() ||
+ !((*it)->patterns().grep( patternFilter, false )).isEmpty() ) {
+
+ TypesListItem *group = m_majorMap[ (*it)->majorType() ];
+ // QListView makes sure we don't insert a group-item more than once
+ typesLV->insertItem( group );
+ group->insertItem( *it );
+ }
+ ++it;
+ }
+}
+
+void FileTypesView::addType()
+{
+ QStringList allGroups;
+ QMapIterator<QString,TypesListItem*> it = m_majorMap.begin();
+ while ( it != m_majorMap.end() ) {
+ allGroups.append( it.key() );
+ ++it;
+ }
+
+ NewTypeDialog m(allGroups, this);
+
+ if (m.exec()) {
+ QListViewItemIterator it(typesLV);
+ QString loc = m.group() + "/" + m.text() + ".desktop";
+ loc = locateLocal("mime", loc);
+ KMimeType::Ptr mimetype = new KMimeType(loc,
+ m.group() + "/" + m.text(),
+ QString(), QString(),
+ QStringList());
+
+ TypesListItem *group = m_majorMap[ m.group() ];
+ if ( !group )
+ {
+ //group = new TypesListItem(
+ //TODO ! (The combo in NewTypeDialog must be made editable again when that happens)
+ Q_ASSERT(group);
+ }
+
+ // find out if our group has been filtered out -> insert if necessary
+ QListViewItem *item = typesLV->firstChild();
+ bool insert = true;
+ while ( item ) {
+ if ( item == group ) {
+ insert = false;
+ break;
+ }
+ item = item->nextSibling();
+ }
+ if ( insert )
+ typesLV->insertItem( group );
+
+ TypesListItem *tli = new TypesListItem(group, mimetype, true);
+ m_itemList.append( tli );
+
+ group->setOpen(true);
+ typesLV->setSelected(tli, true);
+
+ setDirty(true);
+ }
+}
+
+void FileTypesView::removeType()
+{
+ TypesListItem *current = (TypesListItem *) typesLV->currentItem();
+
+ if ( !current )
+ return;
+
+ // Can't delete groups
+ if ( current->isMeta() )
+ return;
+ // nor essential mimetypes
+ if ( current->isEssential() )
+ return;
+
+ QListViewItem *li = current->itemAbove();
+ if (!li)
+ li = current->itemBelow();
+ if (!li)
+ li = current->parent();
+
+ removedList.append(current->name());
+ current->parent()->takeItem(current);
+ m_itemList.removeRef( current );
+ setDirty(true);
+
+ if ( li )
+ typesLV->setSelected(li, true);
+}
+
+void FileTypesView::slotDoubleClicked(QListViewItem *item)
+{
+ if ( !item ) return;
+ item->setOpen( !item->isOpen() );
+}
+
+void FileTypesView::updateDisplay(QListViewItem *item)
+{
+ if (!item)
+ {
+ m_widgetStack->raiseWidget( m_emptyWidget );
+ m_removeTypeB->setEnabled(false);
+ return;
+ }
+
+ bool wasDirty = m_dirty;
+
+ TypesListItem *tlitem = (TypesListItem *) item;
+ if (tlitem->isMeta()) // is a group
+ {
+ m_widgetStack->raiseWidget( m_groupDetails );
+ m_groupDetails->setTypeItem( tlitem );
+ m_removeTypeB->setEnabled(false);
+ }
+ else
+ {
+ m_widgetStack->raiseWidget( m_details );
+ m_details->setTypeItem( tlitem );
+ m_removeTypeB->setEnabled( !tlitem->isEssential() );
+ }
+
+ // Updating the display indirectly called change(true)
+ if ( !wasDirty )
+ setDirty(false);
+}
+
+bool FileTypesView::sync( QValueList<TypesListItem *>& itemsModified )
+{
+ bool didIt = false;
+ // first, remove those items which we are asked to remove.
+ QStringList::Iterator it(removedList.begin());
+ QString loc;
+
+ for (; it != removedList.end(); ++it) {
+ didIt = true;
+ KMimeType::Ptr m_ptr = KMimeType::mimeType(*it);
+
+ loc = m_ptr->desktopEntryPath();
+ loc = locateLocal("mime", loc);
+
+ KDesktopFile config(loc, false, "mime");
+ config.writeEntry("Type", "MimeType");
+ config.writeEntry("MimeType", m_ptr->name());
+ config.writeEntry("Hidden", true);
+ }
+
+ // now go through all entries and sync those which are dirty.
+ // don't use typesLV, it may be filtered
+ QMapIterator<QString,TypesListItem*> it1 = m_majorMap.begin();
+ while ( it1 != m_majorMap.end() ) {
+ TypesListItem *tli = *it1;
+ if (tli->isDirty()) {
+ kdDebug() << "Entry " << tli->name() << " is dirty. Saving." << endl;
+ tli->sync();
+ itemsModified.append( tli );
+ didIt = true;
+ }
+ ++it1;
+ }
+ QPtrListIterator<TypesListItem> it2( m_itemList );
+ while ( it2.current() ) {
+ TypesListItem *tli = *it2;
+ if (tli->isDirty()) {
+ kdDebug() << "Entry " << tli->name() << " is dirty. Saving." << endl;
+ tli->sync();
+ itemsModified.append( tli );
+ didIt = true;
+ }
+ ++it2;
+ }
+
+ m_konqConfig->sync();
+
+ setDirty(false);
+ return didIt;
+}
+
+void FileTypesView::load()
+{
+ readFileTypes();
+}
+
+void FileTypesView::save()
+{
+ m_itemsModified.clear();
+ if (sync(m_itemsModified)) {
+ // only rebuild if sync() was necessary
+ KService::rebuildKSycoca(this);
+ KIPC::sendMessageAll(KIPC::SettingsChanged);
+ }
+}
+
+void FileTypesView::slotDatabaseChanged()
+{
+ if ( KSycoca::self()->isChanged( "mime" ) )
+ {
+ // ksycoca has new KMimeTypes objects for us, make sure to update
+ // our 'copies' to be in sync with it. Not important for OK, but
+ // important for Apply (how to differentiate those 2?).
+ // See BR 35071.
+ QValueList<TypesListItem *>::Iterator it = m_itemsModified.begin();
+ for( ; it != m_itemsModified.end(); ++it ) {
+ QString name = (*it)->name();
+ if ( removedList.find( name ) == removedList.end() ) // if not deleted meanwhile
+ (*it)->refresh();
+ }
+ m_itemsModified.clear();
+ }
+}
+
+void FileTypesView::defaults()
+{
+}
+
+#include "filetypesview.moc"
+
diff --git a/kcontrol/filetypes/filetypesview.h b/kcontrol/filetypes/filetypesview.h
new file mode 100644
index 000000000..bc6323d85
--- /dev/null
+++ b/kcontrol/filetypes/filetypesview.h
@@ -0,0 +1,73 @@
+#ifndef _FILETYPESVIEW_H
+#define _FILETYPESVIEW_H
+
+#include <qptrlist.h>
+#include <qmap.h>
+
+#include <kconfig.h>
+#include <kcmodule.h>
+
+#include "typeslistitem.h"
+
+class QLabel;
+class KListView;
+class QListViewItem;
+class QListBox;
+class QPushButton;
+class KIconButton;
+class QLineEdit;
+class QComboBox;
+class FileTypeDetails;
+class FileGroupDetails;
+class QWidgetStack;
+
+class FileTypesView : public KCModule
+{
+ Q_OBJECT
+public:
+ FileTypesView(QWidget *p = 0, const char *name = 0);
+ ~FileTypesView();
+
+ void load();
+ void save();
+ void defaults();
+
+protected slots:
+ /** fill in the various graphical elements, set up other stuff. */
+ void init();
+
+ void addType();
+ void removeType();
+ void updateDisplay(QListViewItem *);
+ void slotDoubleClicked(QListViewItem *);
+ void slotFilter(const QString &patternFilter);
+ void setDirty(bool state);
+
+ void slotDatabaseChanged();
+ void slotEmbedMajor(const QString &major, bool &embed);
+
+protected:
+ void readFileTypes();
+ bool sync( QValueList<TypesListItem *>& itemsModified );
+
+private:
+ KListView *typesLV;
+ QPushButton *m_removeTypeB;
+
+ QWidgetStack * m_widgetStack;
+ FileTypeDetails * m_details;
+ FileGroupDetails * m_groupDetails;
+ QLabel * m_emptyWidget;
+
+ QLineEdit *patternFilterLE;
+ QStringList removedList;
+ bool m_dirty;
+ QMap<QString,TypesListItem*> m_majorMap;
+ QPtrList<TypesListItem> m_itemList;
+
+ QValueList<TypesListItem *> m_itemsModified;
+
+ KSharedConfig::Ptr m_konqConfig;
+};
+
+#endif
diff --git a/kcontrol/filetypes/keditfiletype.cpp b/kcontrol/filetypes/keditfiletype.cpp
new file mode 100644
index 000000000..6c5c4eb6c
--- /dev/null
+++ b/kcontrol/filetypes/keditfiletype.cpp
@@ -0,0 +1,182 @@
+/* This file is part of the KDE project
+ Copyright (C) 2000 David Faure <faure@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License version 2 as published by the Free Software Foundation.
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#include "filetypedetails.h"
+#include "typeslistitem.h"
+#include "keditfiletype.h"
+
+#include <qfile.h>
+
+#include <dcopclient.h>
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kdebug.h>
+#include <kcmdlineargs.h>
+#include <ksycoca.h>
+#include <kstandarddirs.h>
+
+#ifdef Q_WS_X11
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#endif
+
+FileTypeDialog::FileTypeDialog( KMimeType::Ptr mime )
+ : KDialogBase( 0L, 0, false, QString::null, /* Help | */ Cancel | Apply | Ok,
+ Ok, false )
+{
+ init( mime, false );
+}
+
+FileTypeDialog::FileTypeDialog( KMimeType::Ptr mime, bool newItem )
+ : KDialogBase( 0L, 0, false, QString::null, /* Help | */ Cancel | Apply | Ok,
+ Ok, false )
+{
+ init( mime, newItem );
+}
+
+void FileTypeDialog::init( KMimeType::Ptr mime, bool newItem )
+{
+ m_details = new FileTypeDetails( this );
+ QListView * dummyListView = new QListView( m_details );
+ dummyListView->hide();
+ m_item = new TypesListItem( dummyListView, mime, newItem );
+ m_details->setTypeItem( m_item );
+
+ // This code is very similar to kcdialog.cpp
+ setMainWidget( m_details );
+ connect(m_details, SIGNAL(changed(bool)), this, SLOT(clientChanged(bool)));
+ // TODO setHelp()
+ enableButton(Apply, false);
+
+ connect( KSycoca::self(), SIGNAL( databaseChanged() ), SLOT( slotDatabaseChanged() ) );
+}
+
+void FileTypeDialog::save()
+{
+ if (m_item->isDirty()) {
+ m_item->sync();
+ KService::rebuildKSycoca(this);
+ }
+}
+
+void FileTypeDialog::slotApply()
+{
+ save();
+}
+
+void FileTypeDialog::slotOk()
+{
+ save();
+ accept();
+}
+
+void FileTypeDialog::clientChanged(bool state)
+{
+ // enable/disable buttons
+ enableButton(User1, state);
+ enableButton(Apply, state);
+}
+
+void FileTypeDialog::slotDatabaseChanged()
+{
+ if ( KSycoca::self()->isChanged( "mime" ) )
+ {
+ m_item->refresh();
+ }
+}
+
+#include "keditfiletype.moc"
+
+static KCmdLineOptions options[] =
+{
+ { "parent <winid>", I18N_NOOP("Makes the dialog transient for the window specified by winid"), 0 },
+ { "+mimetype", I18N_NOOP("File type to edit (e.g. text/html)"), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char ** argv)
+{
+ KLocale::setMainCatalogue("filetypes");
+ KAboutData aboutData( "keditfiletype", I18N_NOOP("KEditFileType"), "1.0",
+ I18N_NOOP("KDE file type editor - simplified version for editing a single file type"),
+ KAboutData::License_GPL,
+ I18N_NOOP("(c) 2000, KDE developers") );
+ aboutData.addAuthor("Preston Brown",0, "pbrown@kde.org");
+ aboutData.addAuthor("David Faure",0, "faure@kde.org");
+
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KCmdLineArgs::addCmdLineOptions( options ); // Add our own options.
+ KApplication app;
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if (args->count() == 0)
+ KCmdLineArgs::usage();
+
+ QString arg = args->arg(0);
+
+ bool createType = arg.startsWith( "*" );
+
+ KMimeType::Ptr mime;
+
+ if ( createType ) {
+ QString mimeString = "application/x-kdeuser%1";
+ QString loc;
+ int inc = 0;
+ do {
+ ++inc;
+ loc = locateLocal( "mime", mimeString.arg( inc ) + ".desktop" );
+ }
+ while ( QFile::exists( loc ) );
+
+ QStringList patterns;
+ if ( arg.length() > 2 )
+ patterns << arg.lower() << arg.upper();
+ QString comment;
+ if ( arg.startsWith( "*." ) && arg.length() >= 3 ) {
+ QString type = arg.mid( 3 ).prepend( arg[2].upper() );
+ comment = i18n( "%1 File" ).arg( type );
+ }
+ mime = new KMimeType( loc, mimeString.arg( inc ), QString::null, comment, patterns );
+ }
+ else {
+ mime = KMimeType::mimeType( arg );
+ if (!mime)
+ kdFatal() << "Mimetype " << arg << " not found" << endl;
+ }
+
+ FileTypeDialog dlg( mime, createType );
+#if defined Q_WS_X11
+ if( args->isSet( "parent" )) {
+ bool ok;
+ long id = args->getOption("parent").toLong(&ok);
+ if (ok)
+ XSetTransientForHint( qt_xdisplay(), dlg.winId(), id );
+ }
+#endif
+ args->clear();
+ if ( !createType )
+ dlg.setCaption( i18n("Edit File Type %1").arg(mime->name()) );
+ else {
+ dlg.setCaption( i18n("Create New File Type %1").arg(mime->name()) );
+ dlg.enableButton( KDialogBase::Apply, true );
+ }
+ app.setMainWidget( &dlg );
+ dlg.show(); // non-modal
+
+ return app.exec();
+}
+
diff --git a/kcontrol/filetypes/keditfiletype.h b/kcontrol/filetypes/keditfiletype.h
new file mode 100644
index 000000000..3ae7c0e35
--- /dev/null
+++ b/kcontrol/filetypes/keditfiletype.h
@@ -0,0 +1,54 @@
+/* This file is part of the KDE project
+ Copyright (C) 2000 David Faure <faure@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License version 2 as published by the Free Software Foundation.
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef __keditfiletype_h
+#define __keditfiletype_h
+
+#include <kdialogbase.h>
+#include <kmimetype.h>
+
+class TypesListItem;
+class FileTypeDetails;
+
+// A dialog for ONE file type to be edited.
+class FileTypeDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ FileTypeDialog( KMimeType::Ptr mime );
+ FileTypeDialog( KMimeType::Ptr mime, bool newItem );
+
+protected slots:
+
+ //virtual void slotDefault();
+ //virtual void slotUser1(); // Reset
+ virtual void slotApply();
+ virtual void slotOk();
+ void clientChanged(bool state);
+ void slotDatabaseChanged();
+
+protected:
+ void save();
+
+private:
+ void init( KMimeType::Ptr mime, bool newItem );
+ FileTypeDetails * m_details;
+ TypesListItem * m_item;
+};
+
+#endif
+
diff --git a/kcontrol/filetypes/kservicelistwidget.cpp b/kcontrol/filetypes/kservicelistwidget.cpp
new file mode 100644
index 000000000..ed6819a37
--- /dev/null
+++ b/kcontrol/filetypes/kservicelistwidget.cpp
@@ -0,0 +1,444 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
+ Copyright (C) 2003 David Faure <faure@kde.org>
+ Copyright (C) 2002 Daniel Molkentin <molkentin@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License version 2 as published by the Free Software Foundation.
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <unistd.h>
+
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <knotifyclient.h>
+#include <kopenwith.h>
+
+#include "kservicelistwidget.h"
+#include "kserviceselectdlg.h"
+#include "typeslistitem.h"
+#include <kpropertiesdialog.h>
+#include <kstandarddirs.h>
+
+KServiceListItem::KServiceListItem( KService *pService, int kind )
+ : QListBoxText(), desktopPath(pService->desktopEntryPath())
+{
+ if ( kind == KServiceListWidget::SERVICELIST_APPLICATIONS )
+ setText( pService->name() );
+ else
+ setText( i18n( "%1 (%2)" ).arg( pService->name() ).arg( pService->desktopEntryName() ) );
+
+ bool isApplication = pService->type() == "Application";
+ if (!isApplication)
+ localPath = locateLocal("services", desktopPath);
+ else
+ localPath = pService->locateLocal();
+}
+
+bool KServiceListItem::isImmutable()
+{
+ return !checkAccess(localPath, W_OK);
+}
+
+KServiceListWidget::KServiceListWidget(int kind, QWidget *parent, const char *name)
+ : QGroupBox( kind == SERVICELIST_APPLICATIONS ? i18n("Application Preference Order")
+ : i18n("Services Preference Order"), parent, name ),
+ m_kind( kind ), m_item( 0L )
+{
+ QWidget * gb = this;
+ QGridLayout * grid = new QGridLayout(gb, 7, 2, KDialog::marginHint(),
+ KDialog::spacingHint());
+ grid->addRowSpacing(0, fontMetrics().lineSpacing());
+ grid->setRowStretch(1, 1);
+ grid->setRowStretch(2, 1);
+ grid->setRowStretch(3, 1);
+ grid->setRowStretch(4, 1);
+ grid->setRowStretch(5, 1);
+ grid->setRowStretch(6, 1);
+
+ servicesLB = new QListBox(gb);
+ connect(servicesLB, SIGNAL(highlighted(int)), SLOT(enableMoveButtons(int)));
+ grid->addMultiCellWidget(servicesLB, 1, 6, 0, 0);
+ connect( servicesLB, SIGNAL( doubleClicked ( QListBoxItem * )), this, SLOT( editService()));
+
+ QString wtstr =
+ (kind == SERVICELIST_APPLICATIONS ?
+ i18n("This is a list of applications associated with files of the selected"
+ " file type. This list is shown in Konqueror's context menus when you select"
+ " \"Open With...\". If more than one application is associated with this file type,"
+ " then the list is ordered by priority with the uppermost item taking precedence"
+ " over the others.") :
+ i18n("This is a list of services associated with files of the selected"
+ " file type. This list is shown in Konqueror's context menus when you select"
+ " a \"Preview with...\" option. If more than one application is associated with this file type,"
+ " then the list is ordered by priority with the uppermost item taking precedence"
+ " over the others."));
+
+ QWhatsThis::add( gb, wtstr );
+ QWhatsThis::add( servicesLB, wtstr );
+
+ servUpButton = new QPushButton(i18n("Move &Up"), gb);
+ servUpButton->setEnabled(false);
+ connect(servUpButton, SIGNAL(clicked()), SLOT(promoteService()));
+ grid->addWidget(servUpButton, 2, 1);
+
+ QWhatsThis::add( servUpButton, kind == SERVICELIST_APPLICATIONS ?
+ i18n("Assigns a higher priority to the selected\n"
+ "application, moving it up in the list. Note: This\n"
+ "only affects the selected application if the file type is\n"
+ "associated with more than one application.") :
+ i18n("Assigns a higher priority to the selected\n"
+ "service, moving it up in the list."));
+
+ servDownButton = new QPushButton(i18n("Move &Down"), gb);
+ servDownButton->setEnabled(false);
+ connect(servDownButton, SIGNAL(clicked()), SLOT(demoteService()));
+ grid->addWidget(servDownButton, 3, 1);
+
+ QWhatsThis::add( servDownButton, kind == SERVICELIST_APPLICATIONS ?
+ i18n("Assigns a lower priority to the selected\n"
+ "application, moving it down in the list. Note: This \n"
+ "only affects the selected application if the file type is\n"
+ "associated with more than one application."):
+ i18n("Assigns a lower priority to the selected\n"
+ "service, moving it down in the list."));
+
+ servNewButton = new QPushButton(i18n("Add..."), gb);
+ servNewButton->setEnabled(false);
+ connect(servNewButton, SIGNAL(clicked()), SLOT(addService()));
+ grid->addWidget(servNewButton, 1, 1);
+
+ QWhatsThis::add( servNewButton, i18n( "Add a new application for this file type." ) );
+
+
+ servEditButton = new QPushButton(i18n("Edit..."), gb);
+ servEditButton->setEnabled(false);
+ connect(servEditButton, SIGNAL(clicked()), SLOT(editService()));
+ grid->addWidget(servEditButton, 4, 1);
+
+ QWhatsThis::add( servEditButton, i18n( "Edit command line of the selected application." ) );
+
+
+ servRemoveButton = new QPushButton(i18n("Remove"), gb);
+ servRemoveButton->setEnabled(false);
+ connect(servRemoveButton, SIGNAL(clicked()), SLOT(removeService()));
+ grid->addWidget(servRemoveButton, 5, 1);
+
+ QWhatsThis::add( servRemoveButton, i18n( "Remove the selected application from the list." ) );
+}
+
+void KServiceListWidget::setTypeItem( TypesListItem * item )
+{
+ m_item = item;
+ if ( servNewButton )
+ servNewButton->setEnabled(true);
+ // will need a selection
+ servUpButton->setEnabled(false);
+ servDownButton->setEnabled(false);
+
+ if ( servRemoveButton )
+ servRemoveButton->setEnabled(false);
+ if ( servEditButton )
+ servEditButton->setEnabled(false);
+
+ servicesLB->clear();
+ servicesLB->setEnabled(false);
+
+ if ( item )
+ {
+ QStringList services = ( m_kind == SERVICELIST_APPLICATIONS )
+ ? item->appServices()
+ : item->embedServices();
+
+ if (services.count() == 0) {
+ servicesLB->insertItem(i18n("None"));
+ } else {
+ for ( QStringList::Iterator it = services.begin();
+ it != services.end(); it++ )
+ {
+ KService::Ptr pService = KService::serviceByDesktopPath( *it );
+
+ if (pService)
+ servicesLB->insertItem( new KServiceListItem(pService, m_kind) );
+ }
+ servicesLB->setEnabled(true);
+ }
+ }
+}
+
+void KServiceListWidget::promoteService()
+{
+ if (!servicesLB->isEnabled()) {
+ KNotifyClient::beep();
+ return;
+ }
+
+ unsigned int selIndex = servicesLB->currentItem();
+ if (selIndex == 0) {
+ KNotifyClient::beep();
+ return;
+ }
+
+ QListBoxItem *selItem = servicesLB->item(selIndex);
+ servicesLB->takeItem(selItem);
+ servicesLB->insertItem(selItem, selIndex-1);
+ servicesLB->setCurrentItem(selIndex - 1);
+
+ updatePreferredServices();
+
+ emit changed(true);
+}
+
+void KServiceListWidget::demoteService()
+{
+ if (!servicesLB->isEnabled()) {
+ KNotifyClient::beep();
+ return;
+ }
+
+ unsigned int selIndex = servicesLB->currentItem();
+ if (selIndex == servicesLB->count() - 1) {
+ KNotifyClient::beep();
+ return;
+ }
+
+ QListBoxItem *selItem = servicesLB->item(selIndex);
+ servicesLB->takeItem(selItem);
+ servicesLB->insertItem(selItem, selIndex+1);
+ servicesLB->setCurrentItem(selIndex + 1);
+
+ updatePreferredServices();
+
+ emit changed(true);
+}
+
+void KServiceListWidget::addService()
+{
+ if (!m_item)
+ return;
+
+ KService::Ptr service = 0L;
+ if ( m_kind == SERVICELIST_APPLICATIONS )
+ {
+ KOpenWithDlg dlg(m_item->name(), QString::null, 0L);
+ dlg.setSaveNewApplications(true);
+ if (dlg.exec() != QDialog::Accepted)
+ return;
+
+ service = dlg.service();
+
+ Q_ASSERT(service);
+ if (!service)
+ return; // Don't crash if KOpenWith wasn't able to create service.
+ }
+ else
+ {
+ KServiceSelectDlg dlg(m_item->name(), QString::null, 0L);
+ if (dlg.exec() != QDialog::Accepted)
+ return;
+ service = dlg.service();
+ Q_ASSERT(service);
+ if (!service)
+ return;
+ }
+
+ // if None is the only item, then there currently is no default
+ if (servicesLB->text(0) == i18n("None")) {
+ servicesLB->removeItem(0);
+ servicesLB->setEnabled(true);
+ }
+ else
+ {
+ // check if it is a duplicate entry
+ for (unsigned int index = 0; index < servicesLB->count(); index++)
+ if (static_cast<KServiceListItem*>( servicesLB->item(index) )->desktopPath
+ == service->desktopEntryPath())
+ return;
+ }
+
+ servicesLB->insertItem( new KServiceListItem(service, m_kind), 0 );
+ servicesLB->setCurrentItem(0);
+
+ updatePreferredServices();
+
+ emit changed(true);
+}
+
+void KServiceListWidget::editService()
+{
+ if (!m_item)
+ return;
+ int selected = servicesLB->currentItem();
+ if ( selected >= 0 ) {
+
+ // Only edit applications, not services as
+ // they don't have any parameters
+ if ( m_kind == SERVICELIST_APPLICATIONS )
+ {
+ // Just like popping up an add dialog except that we
+ // pass the current command line as a default
+ QListBoxItem *selItem = servicesLB->item(selected);
+
+ KService::Ptr service = KService::serviceByDesktopPath(
+ ((KServiceListItem*)selItem)->desktopPath );
+ if (!service)
+ return;
+
+ QString path = service->desktopEntryPath();
+
+ // If the path to the desktop file is relative, try to get the full
+ // path from KStdDirs.
+ path = locate("apps", path);
+ KURL serviceURL;
+ serviceURL.setPath( path );
+ KFileItem item( serviceURL, "application/x-desktop", KFileItem::Unknown );
+ KPropertiesDialog dlg( &item, this, 0, true /*modal*/, false /*no auto-show*/ );
+ if ( dlg.exec() != QDialog::Accepted )
+ return;
+
+ // Reload service
+ service = KService::serviceByDesktopPath(
+ ((KServiceListItem*)selItem)->desktopPath );
+ if (!service)
+ return;
+
+ // Remove the old one...
+ servicesLB->removeItem( selected );
+
+ // ...check that it's not a duplicate entry...
+ bool addIt = true;
+ for (unsigned int index = 0; index < servicesLB->count(); index++)
+ if (static_cast<KServiceListItem*>( servicesLB->item(index) )->desktopPath
+ == service->desktopEntryPath()) {
+ addIt = false;
+ break;
+ }
+
+ // ...and add it in the same place as the old one:
+ if ( addIt ) {
+ servicesLB->insertItem( new KServiceListItem(service, m_kind), selected );
+ servicesLB->setCurrentItem(selected);
+ }
+
+ updatePreferredServices();
+
+ emit changed(true);
+ }
+ }
+}
+
+void KServiceListWidget::removeService()
+{
+ if (!m_item) return;
+ // Here are some strings already so that we don't have to break translations
+ // later on.
+ QString msg1 = i18n("The service <b>%1</b> can not be removed.");
+ QString msg2 = i18n("The service is listed here because it has been associated "
+ "with the <b>%1</b> (%2) file type and files of type "
+ "<b>%3</b> (%4) are per definition also of type "
+ "<b>%5</b>.");
+ QString msg3 = i18n("Either select the <b>%1</b> file type to remove the "
+ "service from there or move the service down "
+ "to deprecate it.");
+ QString msg4 = i18n("Do you want to remove the service from the <b>%1</b> "
+ "file type or from the <b>%2</b> file type?");
+
+ int selected = servicesLB->currentItem();
+
+ if ( selected >= 0 ) {
+ // Check if service is associated with this mimetype or with one of its parents
+ KServiceListItem *serviceItem = static_cast<KServiceListItem *>(servicesLB->item(selected));
+ KMimeType::Ptr mimetype = m_item->findImplicitAssociation(serviceItem->desktopPath);
+ if (serviceItem->isImmutable())
+ {
+ KMessageBox::sorry(this, i18n("You are not authorized to remove this service."));
+ }
+ else if (mimetype)
+ {
+ KMessageBox::sorry(this, "<qt>"+msg1.arg(serviceItem->text())+"<p>"+
+ msg2.arg(mimetype->name()).arg(mimetype->comment()).
+ arg(m_item->name()).arg(m_item->comment()).
+ arg(mimetype->name())+"<p>"+
+ msg3.arg(mimetype->name()));
+ }
+ else
+ {
+ servicesLB->removeItem( selected );
+ updatePreferredServices();
+
+ emit changed(true);
+ }
+ }
+
+ if ( servRemoveButton && servicesLB->currentItem() == -1 )
+ servRemoveButton->setEnabled(false);
+
+ if ( servEditButton && servicesLB->currentItem() == -1 )
+ servEditButton->setEnabled(false);
+}
+
+void KServiceListWidget::updatePreferredServices()
+{
+ if (!m_item)
+ return;
+ QStringList sl;
+ unsigned int count = servicesLB->count();
+
+ for (unsigned int i = 0; i < count; i++) {
+ KServiceListItem *sli = (KServiceListItem *) servicesLB->item(i);
+ sl.append( sli->desktopPath );
+ }
+ if ( m_kind == SERVICELIST_APPLICATIONS )
+ m_item->setAppServices(sl);
+ else
+ m_item->setEmbedServices(sl);
+}
+
+void KServiceListWidget::enableMoveButtons(int index)
+{
+ if (servicesLB->count() <= 1)
+ {
+ servUpButton->setEnabled(false);
+ servDownButton->setEnabled(false);
+ }
+ else if ((uint) index == (servicesLB->count() - 1))
+ {
+ servUpButton->setEnabled(true);
+ servDownButton->setEnabled(false);
+ }
+ else if (index == 0)
+ {
+ servUpButton->setEnabled(false);
+ servDownButton->setEnabled(true);
+ }
+ else
+ {
+ servUpButton->setEnabled(true);
+ servDownButton->setEnabled(true);
+ }
+
+ if ( servRemoveButton )
+ servRemoveButton->setEnabled(true);
+
+ if ( servEditButton )
+ servEditButton->setEnabled(true && ( m_kind == SERVICELIST_APPLICATIONS ) );
+}
+
+#include "kservicelistwidget.moc"
diff --git a/kcontrol/filetypes/kservicelistwidget.h b/kcontrol/filetypes/kservicelistwidget.h
new file mode 100644
index 000000000..fb20d1c64
--- /dev/null
+++ b/kcontrol/filetypes/kservicelistwidget.h
@@ -0,0 +1,77 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
+ Copyright (C) 2003 David Faure <faure@kde.org>
+ Copyright (C) 2002 Daniel Molkentin <molkentin@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License version 2 as published by the Free Software Foundation.
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _KSERVICELISTWIDGET_H
+#define _KSERVICELISTWIDGET_H
+
+#include <qgroupbox.h>
+#include <qlistbox.h>
+class TypesListItem;
+class QLineEdit;
+class QPushButton;
+class KService;
+
+class KServiceListItem : public QListBoxText
+{
+public:
+ KServiceListItem( KService *pService, int kind );
+ bool isImmutable();
+ QString desktopPath;
+ QString localPath;
+};
+
+/**
+ * This widget holds a list of services, with 5 buttons to manage it.
+ * It's a separate class so that it can be used by both tabs of the
+ * module, once for applications and once for services.
+ * The "kind" is determined by the argument given to the constructor.
+ */
+class KServiceListWidget : public QGroupBox
+{
+ Q_OBJECT
+public:
+ enum { SERVICELIST_APPLICATIONS, SERVICELIST_SERVICES };
+ KServiceListWidget(int kind, QWidget *parent = 0, const char *name = 0);
+
+ void setTypeItem( TypesListItem * item );
+
+signals:
+ void changed(bool);
+
+protected slots:
+ void promoteService();
+ void demoteService();
+ void addService();
+ void editService();
+ void removeService();
+ void enableMoveButtons(int index);
+
+protected:
+ void updatePreferredServices();
+
+private:
+ int m_kind;
+ QListBox *servicesLB;
+ QPushButton *servUpButton, *servDownButton;
+ QPushButton *servNewButton, *servEditButton, *servRemoveButton;
+ TypesListItem *m_item;
+};
+
+#endif
diff --git a/kcontrol/filetypes/kserviceselectdlg.cpp b/kcontrol/filetypes/kserviceselectdlg.cpp
new file mode 100644
index 000000000..c3a925218
--- /dev/null
+++ b/kcontrol/filetypes/kserviceselectdlg.cpp
@@ -0,0 +1,66 @@
+/* This file is part of the KDE project
+ Copyright (C) 2000 David Faure <faure@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License version 2 as published by the Free Software Foundation.
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "kserviceselectdlg.h"
+#include "kserviceselectdlg.moc"
+#include "kservicelistwidget.h"
+
+#include <klocale.h>
+
+#include <qvbox.h>
+#include <qlabel.h>
+
+KServiceSelectDlg::KServiceSelectDlg( const QString& /*serviceType*/, const QString& /*value*/, QWidget *parent )
+ : KDialogBase( parent, "serviceSelectDlg", true,
+ i18n( "Add Service" ), Ok|Cancel, Ok )
+{
+ QVBox *vbox = new QVBox ( this );
+
+ vbox->setSpacing( KDialog::spacingHint() );
+ new QLabel( i18n( "Select service:" ), vbox );
+ m_listbox=new KListBox( vbox );
+
+ // Can't make a KTrader query since we don't have a servicetype to give,
+ // we want all services that are not applications.......
+ // So we have to do it the slow way
+ // ### Why can't we query for KParts/ReadOnlyPart as the servicetype? Should work fine!
+ KService::List allServices = KService::allServices();
+ QValueListIterator<KService::Ptr> it(allServices.begin());
+ for ( ; it != allServices.end() ; ++it )
+ if ( (*it)->hasServiceType( "KParts/ReadOnlyPart" ) )
+ {
+ m_listbox->insertItem( new KServiceListItem( (*it), KServiceListWidget::SERVICELIST_SERVICES ) );
+ }
+
+ m_listbox->sort();
+ m_listbox->setMinimumHeight(350);
+ m_listbox->setMinimumWidth(300);
+ connect(m_listbox,SIGNAL(doubleClicked ( QListBoxItem * )),SLOT(slotOk()));
+ setMainWidget(vbox);
+}
+
+KServiceSelectDlg::~KServiceSelectDlg()
+{
+}
+
+KService::Ptr KServiceSelectDlg::service()
+{
+ unsigned int selIndex = m_listbox->currentItem();
+ KServiceListItem *selItem = static_cast<KServiceListItem *>(m_listbox->item(selIndex));
+ return KService::serviceByDesktopPath( selItem->desktopPath );
+}
diff --git a/kcontrol/filetypes/kserviceselectdlg.h b/kcontrol/filetypes/kserviceselectdlg.h
new file mode 100644
index 000000000..05a2d4e9d
--- /dev/null
+++ b/kcontrol/filetypes/kserviceselectdlg.h
@@ -0,0 +1,47 @@
+/* This file is part of the KDE project
+ Copyright (C) 2000 David Faure <faure@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License version 2 as published by the Free Software Foundation.
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __kserviceselectdlg_h
+#define __kserviceselectdlg_h
+#include <kdialogbase.h>
+#include <kservice.h>
+
+class KServiceSelectDlg : public KDialogBase
+{
+ Q_OBJECT
+public:
+ /**
+ * Create a dialog to select a service (not application) for a given service type.
+ *
+ * @param serviceType the service type we want to choose a service for.
+ * @param value is the initial service to select (not implemented currently)
+ * @param parent parent widget
+ */
+ KServiceSelectDlg( const QString& serviceType, const QString& value = QString::null, QWidget *parent = 0L );
+
+ ~KServiceSelectDlg();
+
+ /**
+ * @return the chosen service
+ */
+ KService::Ptr service();
+private:
+ KListBox * m_listbox;
+};
+
+#endif
diff --git a/kcontrol/filetypes/newtypedlg.cpp b/kcontrol/filetypes/newtypedlg.cpp
new file mode 100644
index 000000000..24760cf1d
--- /dev/null
+++ b/kcontrol/filetypes/newtypedlg.cpp
@@ -0,0 +1,57 @@
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qwhatsthis.h>
+#include <qcombobox.h>
+
+#include <klocale.h>
+#include <klineedit.h>
+
+#include "newtypedlg.h"
+
+NewTypeDialog::NewTypeDialog(QStringList groups,
+ QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, i18n( "Create New File Type" ),
+ Ok|Cancel, Ok, true)
+{
+ QFrame *main = makeMainWidget();
+ QVBoxLayout *topl = new QVBoxLayout(main, 0, spacingHint());
+
+ QGridLayout *grid = new QGridLayout(2, 2);
+ grid->setColStretch(1, 1);
+ topl->addLayout(grid);
+
+ QLabel *l = new QLabel(i18n("Group:"), main);
+ grid->addWidget(l, 0, 0);
+
+ groupCombo = new QComboBox(main);
+ //groupCombo->setEditable( true ); M.O.: Currently, the code in filetypesview isn't capable of handling
+ //new top level types; so better not let them be added than crash.
+ groupCombo->insertStringList(groups);
+ grid->addWidget(groupCombo, 0, 1);
+
+ QWhatsThis::add( groupCombo, i18n("Select the category under which"
+ " the new file type should be added.") );
+
+ l = new QLabel(i18n("Type name:"), main);
+ grid->addWidget(l, 1, 0);
+
+ typeEd = new KLineEdit(main);
+ grid->addWidget(typeEd, 1, 1);
+
+ typeEd->setFocus();
+
+ // Set a minimum size so that caption is not half-hidden
+ setMinimumSize( 300, 50 );
+}
+
+QString NewTypeDialog::group() const
+{
+ return groupCombo->currentText();
+}
+
+
+QString NewTypeDialog::text() const
+{
+ return typeEd->text();
+}
diff --git a/kcontrol/filetypes/newtypedlg.h b/kcontrol/filetypes/newtypedlg.h
new file mode 100644
index 000000000..386b5fcdb
--- /dev/null
+++ b/kcontrol/filetypes/newtypedlg.h
@@ -0,0 +1,28 @@
+#ifndef _NEWTYPEDLG_H
+#define _NEWTYPEDLG_H
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <kdialogbase.h>
+
+class KLineEdit;
+class QComboBox;
+
+/**
+ * A dialog for creating a new file type, with
+ * a combobox for choosing the group and a line-edit
+ * for entering the name of the file type
+ */
+class NewTypeDialog : public KDialogBase
+{
+public:
+ NewTypeDialog(QStringList groups, QWidget *parent = 0,
+ const char *name = 0);
+ QString group() const;
+ QString text() const;
+private:
+ KLineEdit *typeEd;
+ QComboBox *groupCombo;
+};
+
+#endif
diff --git a/kcontrol/filetypes/typeslistitem.cpp b/kcontrol/filetypes/typeslistitem.cpp
new file mode 100644
index 000000000..88f3c8035
--- /dev/null
+++ b/kcontrol/filetypes/typeslistitem.cpp
@@ -0,0 +1,579 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
+ Copyright (C) 2003 David Faure <faure@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License version 2 as published by the Free Software Foundation.
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <kstandarddirs.h>
+#include <kdesktopfile.h>
+#include <kstaticdeleter.h>
+
+#include "typeslistitem.h"
+
+QMap< QString, QStringList >* TypesListItem::s_changedServices;
+static KStaticDeleter< QMap< QString, QStringList > > deleter;
+
+TypesListItem::TypesListItem(QListView *parent, const QString & major)
+ : QListViewItem(parent), metaType(true), m_bNewItem(false), m_askSave(2)
+{
+ initMeta(major);
+ setText(0, majorType());
+}
+
+TypesListItem::TypesListItem(TypesListItem *parent, KMimeType::Ptr mimetype, bool newItem)
+ : QListViewItem(parent), metaType(false), m_bNewItem(newItem), m_askSave(2)
+{
+ init(mimetype);
+ setText(0, minorType());
+}
+
+TypesListItem::TypesListItem(QListView *parent, KMimeType::Ptr mimetype)
+ : QListViewItem(parent), metaType(false), m_bNewItem(false), m_askSave(2)
+{
+ init(mimetype);
+ setText(0, majorType());
+}
+
+TypesListItem::TypesListItem(QListView *parent, KMimeType::Ptr mimetype, bool newItem)
+ : QListViewItem(parent), metaType(false), m_bNewItem(newItem), m_askSave(2)
+{
+ init(mimetype);
+ setText(0, majorType());
+}
+
+TypesListItem::~TypesListItem()
+{
+}
+
+void TypesListItem::initMeta( const QString & major )
+{
+ m_bFullInit = true;
+ m_mimetype = 0L;
+ m_major = major;
+ KSharedConfig::Ptr config = KSharedConfig::openConfig("konquerorrc", false, false);
+ config->setGroup("EmbedSettings");
+ bool defaultValue = defaultEmbeddingSetting( major );
+ m_autoEmbed = config->readBoolEntry( QString::fromLatin1("embed-")+m_major, defaultValue ) ? 0 : 1;
+}
+
+bool TypesListItem::defaultEmbeddingSetting( const QString& major )
+{
+ // embedding is false by default except for image/*
+ return ( major=="image" );
+}
+
+void TypesListItem::setup()
+{
+ if (m_mimetype)
+ {
+ setPixmap(0, m_mimetype->pixmap(KIcon::Small, IconSize(KIcon::Small)));
+ }
+ QListViewItem::setup();
+}
+
+void TypesListItem::init(KMimeType::Ptr mimetype)
+{
+ m_bFullInit = false;
+ m_mimetype = mimetype;
+
+ int index = mimetype->name().find("/");
+ if (index != -1) {
+ m_major = mimetype->name().left(index);
+ m_minor = mimetype->name().right(mimetype->name().length() -
+ (index+1));
+ } else {
+ m_major = mimetype->name();
+ m_minor = "";
+ }
+ m_comment = mimetype->comment(QString(), false);
+ m_icon = mimetype->icon(QString(), false);
+ m_patterns = mimetype->patterns();
+ m_autoEmbed = readAutoEmbed( mimetype );
+}
+
+int TypesListItem::readAutoEmbed( KMimeType::Ptr mimetype )
+{
+ QVariant v = mimetype->property( "X-KDE-AutoEmbed" );
+ if ( v.isValid() )
+ return (v.toBool() ? 0 : 1);
+ else if ( !mimetype->property( "X-KDE-LocalProtocol" ).toString().isEmpty() )
+ return 0; // embed by default for zip, tar etc.
+ else
+ return 2;
+}
+
+QStringList TypesListItem::appServices() const
+{
+ if (!m_bFullInit)
+ {
+ TypesListItem *that = const_cast<TypesListItem *>(this);
+ that->getServiceOffers(that->m_appServices, that->m_embedServices);
+ that->m_bFullInit = true;
+ }
+ return m_appServices;
+}
+
+QStringList TypesListItem::embedServices() const
+{
+ if (!m_bFullInit)
+ {
+ TypesListItem *that = const_cast<TypesListItem *>(this);
+ that->getServiceOffers(that->m_appServices, that->m_embedServices);
+ that->m_bFullInit = true;
+ }
+ return m_embedServices;
+}
+
+void TypesListItem::getServiceOffers( QStringList & appServices, QStringList & embedServices ) const
+{
+ KServiceTypeProfile::setConfigurationMode();
+
+ KServiceTypeProfile::OfferList offerList =
+ KServiceTypeProfile::offers(m_mimetype->name(), "Application");
+ QValueListIterator<KServiceOffer> it(offerList.begin());
+ for (; it != offerList.end(); ++it)
+ if ((*it).allowAsDefault())
+ appServices.append((*it).service()->desktopEntryPath());
+
+ offerList = KServiceTypeProfile::offers(m_mimetype->name(), "KParts/ReadOnlyPart");
+ for ( it = offerList.begin(); it != offerList.end(); ++it)
+ embedServices.append((*it).service()->desktopEntryPath());
+
+ KServiceTypeProfile::unsetConfigurationMode();
+}
+
+bool TypesListItem::isMimeTypeDirty() const
+{
+ if ( m_bNewItem )
+ return true;
+ if ((m_mimetype->name() != name()) &&
+ (name() != "application/octet-stream"))
+ {
+ kdDebug() << "Mimetype Name Dirty: old=" << m_mimetype->name() << " name()=" << name() << endl;
+ return true;
+ }
+ if (m_mimetype->comment(QString(), false) != m_comment)
+ {
+ kdDebug() << "Mimetype Comment Dirty: old=" << m_mimetype->comment(QString(),false) << " m_comment=" << m_comment << endl;
+ return true;
+ }
+ if (m_mimetype->icon(QString(), false) != m_icon)
+ {
+ kdDebug() << "Mimetype Icon Dirty: old=" << m_mimetype->icon(QString(),false) << " m_icon=" << m_icon << endl;
+ return true;
+ }
+
+ if (m_mimetype->patterns() != m_patterns)
+ {
+ kdDebug() << "Mimetype Patterns Dirty: old=" << m_mimetype->patterns().join(";")
+ << " m_patterns=" << m_patterns.join(";") << endl;
+ return true;
+ }
+
+ if ( readAutoEmbed( m_mimetype ) != (int)m_autoEmbed )
+ return true;
+ return false;
+}
+
+bool TypesListItem::isDirty() const
+{
+ if ( !m_bFullInit)
+ {
+ return false;
+ }
+
+ if ( m_bNewItem )
+ {
+ kdDebug() << "New item, need to save it" << endl;
+ return true;
+ }
+
+ if ( !isMeta() )
+ {
+ QStringList oldAppServices;
+ QStringList oldEmbedServices;
+ getServiceOffers( oldAppServices, oldEmbedServices );
+
+ if (oldAppServices != m_appServices)
+ {
+ kdDebug() << "App Services Dirty: old=" << oldAppServices.join(";")
+ << " m_appServices=" << m_appServices.join(";") << endl;
+ return true;
+ }
+ if (oldEmbedServices != m_embedServices)
+ {
+ kdDebug() << "Embed Services Dirty: old=" << oldEmbedServices.join(";")
+ << " m_embedServices=" << m_embedServices.join(";") << endl;
+ return true;
+ }
+ if (isMimeTypeDirty())
+ return true;
+ }
+ else
+ {
+ KSharedConfig::Ptr config = KSharedConfig::openConfig("konquerorrc", false, false);
+ config->setGroup("EmbedSettings");
+ bool defaultValue = defaultEmbeddingSetting(m_major);
+ unsigned int oldAutoEmbed = config->readBoolEntry( QString::fromLatin1("embed-")+m_major, defaultValue ) ? 0 : 1;
+ if ( m_autoEmbed != oldAutoEmbed )
+ return true;
+ }
+
+ if (m_askSave != 2)
+ return true;
+
+ // nothing seems to have changed, it's not dirty.
+ return false;
+}
+
+void TypesListItem::sync()
+{
+ Q_ASSERT(m_bFullInit);
+ if ( isMeta() )
+ {
+ KSharedConfig::Ptr config = KSharedConfig::openConfig("konquerorrc", false, false);
+ config->setGroup("EmbedSettings");
+ config->writeEntry( QString::fromLatin1("embed-")+m_major, m_autoEmbed == 0 );
+ return;
+ }
+
+ if (m_askSave != 2)
+ {
+ KSharedConfig::Ptr config = KSharedConfig::openConfig("konquerorrc", false, false);
+ config->setGroup("Notification Messages");
+ if (m_askSave == 0)
+ {
+ // Ask
+ config->deleteEntry("askSave"+name());
+ config->deleteEntry("askEmbedOrSave"+name());
+ }
+ else
+ {
+ // Do not ask, open
+ config->writeEntry("askSave"+name(), "no" );
+ config->writeEntry("askEmbedOrSave"+name(), "no" );
+ }
+ }
+
+ if (isMimeTypeDirty())
+ {
+ // We must use KConfig otherwise config.deleteEntry doesn't
+ // properly cancel out settings already present in system files.
+ KConfig config( m_mimetype->desktopEntryPath(), false, false, "mime" );
+ config.setDesktopGroup();
+
+ config.writeEntry("Type", "MimeType");
+ config.writeEntry("MimeType", name());
+ config.writeEntry("Icon", m_icon);
+ config.writeEntry("Patterns", m_patterns, ';');
+ config.writeEntry("Comment", m_comment);
+ config.writeEntry("Hidden", false);
+
+ if ( m_autoEmbed == 2 )
+ config.deleteEntry( QString::fromLatin1("X-KDE-AutoEmbed"), false );
+ else
+ config.writeEntry( QString::fromLatin1("X-KDE-AutoEmbed"), m_autoEmbed == 0 );
+
+ m_bNewItem = false;
+ }
+
+ KConfig profile("profilerc", false, false);
+
+ // Deleting current contents in profilerc relating to
+ // this service type
+ //
+ QStringList groups = profile.groupList();
+
+ for (QStringList::Iterator it = groups.begin();
+ it != groups.end(); it++ )
+ {
+ profile.setGroup(*it);
+
+ // Entries with Preference <= 0 or AllowAsDefault == false
+ // are not in m_services
+ if ( profile.readEntry( "ServiceType" ) == name()
+ && profile.readNumEntry( "Preference" ) > 0
+ && profile.readBoolEntry( "AllowAsDefault" ) )
+ {
+ profile.deleteGroup( *it );
+ }
+ }
+
+ // Save preferred services
+ //
+
+ groupCount = 1;
+
+ saveServices( profile, m_appServices, "Application" );
+ saveServices( profile, m_embedServices, "KParts/ReadOnlyPart" );
+
+ // Handle removed services
+
+ KServiceTypeProfile::setConfigurationMode();
+ KServiceTypeProfile::OfferList offerList =
+ KServiceTypeProfile::offers(m_mimetype->name(), "Application");
+ offerList += KServiceTypeProfile::offers(m_mimetype->name(), "KParts/ReadOnlyPart");
+ KServiceTypeProfile::unsetConfigurationMode();
+
+ QValueListIterator<KServiceOffer> it_srv(offerList.begin());
+
+ for (; it_srv != offerList.end(); ++it_srv) {
+
+
+ KService::Ptr pService = (*it_srv).service();
+
+ bool isApplication = pService->type() == "Application";
+ if (isApplication && !pService->allowAsDefault())
+ continue; // Only those which were added in init()
+
+ // Look in the correct list...
+ if ( (isApplication && ! m_appServices.contains( pService->desktopEntryPath() ))
+ || (!isApplication && !m_embedServices.contains( pService->desktopEntryPath() ))
+ ) {
+ // The service was in m_appServices but has been removed
+ // create a new .desktop file without this mimetype
+
+ if( s_changedServices == NULL )
+ deleter.setObject( s_changedServices, new QMap< QString, QStringList > );
+ QStringList mimeTypeList = s_changedServices->contains( pService->desktopEntryPath())
+ ? (*s_changedServices)[ pService->desktopEntryPath() ] : pService->serviceTypes();
+
+ if ( mimeTypeList.contains( name() ) ) {
+ // The mimetype is listed explicitly in the .desktop files, so
+ // just remove it and we're done
+ KConfig *desktop;
+ if ( !isApplication )
+ {
+ desktop = new KConfig(pService->desktopEntryPath(), false, false, "services");
+ }
+ else
+ {
+ QString path = pService->locateLocal();
+ KConfig orig(pService->desktopEntryPath(), true, false, "apps");
+ desktop = orig.copyTo(path);
+ }
+ desktop->setDesktopGroup();
+
+ mimeTypeList = s_changedServices->contains( pService->desktopEntryPath())
+ ? (*s_changedServices)[ pService->desktopEntryPath() ] : desktop->readListEntry("MimeType", ';');
+
+ // Remove entry and the number that might follow.
+ QStringList::Iterator it;
+ for(;(it = mimeTypeList.find(name())) != mimeTypeList.end();)
+ {
+ it = mimeTypeList.remove(it);
+ if (it != mimeTypeList.end())
+ {
+ // Check next item
+ bool numeric;
+ (*it).toInt(&numeric);
+ if (numeric)
+ mimeTypeList.remove(it);
+ }
+ }
+
+ desktop->writeEntry("MimeType", mimeTypeList, ';');
+
+ // if two or more types have been modified, and they use the same service,
+ // accumulate the changes
+ (*s_changedServices)[ pService->desktopEntryPath() ] = mimeTypeList;
+
+ desktop->sync();
+ delete desktop;
+ }
+ else {
+ // The mimetype is not listed explicitly so it can't
+ // be removed. Preference = 0 handles this.
+
+ // Find a group header. The headers are just dummy names as far as
+ // KUserProfile is concerned, but using the mimetype makes it a
+ // bit more structured for "manual" reading
+ while ( profile.hasGroup(
+ name() + " - " + QString::number(groupCount) ) )
+ groupCount++;
+
+ profile.setGroup( name() + " - " + QString::number(groupCount) );
+
+ profile.writeEntry("Application", pService->storageId());
+ profile.writeEntry("ServiceType", name());
+ profile.writeEntry("AllowAsDefault", true);
+ profile.writeEntry("Preference", 0);
+ }
+ }
+ }
+}
+
+static bool inheritsMimetype(KMimeType::Ptr m, const QStringList &mimeTypeList)
+{
+ for(QStringList::ConstIterator it = mimeTypeList.begin();
+ it != mimeTypeList.end(); ++it)
+ {
+ if (m->is(*it))
+ return true;
+ }
+
+ return false;
+}
+
+KMimeType::Ptr TypesListItem::findImplicitAssociation(const QString &desktop)
+{
+ KService::Ptr s = KService::serviceByDesktopPath(desktop);
+ if (!s) return 0; // Hey, where did that one go?
+
+ if( s_changedServices == NULL )
+ deleter.setObject( s_changedServices, new QMap< QString, QStringList > );
+ QStringList mimeTypeList = s_changedServices->contains( s->desktopEntryPath())
+ ? (*s_changedServices)[ s->desktopEntryPath() ] : s->serviceTypes();
+
+ for(QStringList::ConstIterator it = mimeTypeList.begin();
+ it != mimeTypeList.end(); ++it)
+ {
+ if ((m_mimetype->name() != *it) && m_mimetype->is(*it))
+ {
+ return KMimeType::mimeType(*it);
+ }
+ }
+ return 0;
+}
+
+void TypesListItem::saveServices( KConfig & profile, QStringList services, const QString & genericServiceType )
+{
+ QStringList::Iterator it(services.begin());
+ for (int i = services.count(); it != services.end(); ++it, i--) {
+
+ KService::Ptr pService = KService::serviceByDesktopPath(*it);
+ if (!pService) continue; // Where did that one go?
+
+ // Find a group header. The headers are just dummy names as far as
+ // KUserProfile is concerned, but using the mimetype makes it a
+ // bit more structured for "manual" reading
+ while ( profile.hasGroup( name() + " - " + QString::number(groupCount) ) )
+ groupCount++;
+
+ profile.setGroup( name() + " - " + QString::number(groupCount) );
+
+ profile.writeEntry("ServiceType", name());
+ profile.writeEntry("GenericServiceType", genericServiceType);
+ profile.writeEntry("Application", pService->storageId());
+ profile.writeEntry("AllowAsDefault", true);
+ profile.writeEntry("Preference", i);
+
+ // merge new mimetype
+ if( s_changedServices == NULL )
+ deleter.setObject( s_changedServices, new QMap< QString, QStringList > );
+ QStringList mimeTypeList = s_changedServices->contains( pService->desktopEntryPath())
+ ? (*s_changedServices)[ pService->desktopEntryPath() ] : pService->serviceTypes();
+
+ if (!mimeTypeList.contains(name()) && !inheritsMimetype(m_mimetype, mimeTypeList))
+ {
+ KConfig *desktop;
+ if ( pService->type() == QString("Service") )
+ {
+ desktop = new KConfig(pService->desktopEntryPath(), false, false, "services");
+ }
+ else
+ {
+ QString path = pService->locateLocal();
+ KConfig orig(pService->desktopEntryPath(), true, false, "apps");
+ desktop = orig.copyTo(path);
+ }
+
+ desktop->setDesktopGroup();
+ mimeTypeList = s_changedServices->contains( pService->desktopEntryPath())
+ ? (*s_changedServices)[ pService->desktopEntryPath() ] : desktop->readListEntry("MimeType", ';');
+ mimeTypeList.append(name());
+
+ desktop->writeEntry("MimeType", mimeTypeList, ';');
+ desktop->sync();
+ delete desktop;
+
+ // if two or more types have been modified, and they use the same service,
+ // accumulate the changes
+ (*s_changedServices)[ pService->desktopEntryPath() ] = mimeTypeList;
+ }
+ }
+}
+
+void TypesListItem::setIcon( const QString& icon )
+{
+ m_icon = icon;
+ setPixmap( 0, SmallIcon( icon ) );
+}
+
+bool TypesListItem::isEssential() const
+{
+ QString n = name();
+ if ( n == "application/octet-stream" )
+ return true;
+ if ( n == "inode/directory" )
+ return true;
+ if ( n == "inode/directory-locked" )
+ return true;
+ if ( n == "inode/blockdevice" )
+ return true;
+ if ( n == "inode/chardevice" )
+ return true;
+ if ( n == "inode/socket" )
+ return true;
+ if ( n == "inode/fifo" )
+ return true;
+ if ( n == "application/x-shellscript" )
+ return true;
+ if ( n == "application/x-executable" )
+ return true;
+ if ( n == "application/x-desktop" )
+ return true;
+ return false;
+}
+
+void TypesListItem::refresh()
+{
+ kdDebug() << "TypesListItem refresh " << name() << endl;
+ m_mimetype = KMimeType::mimeType( name() );
+}
+
+void TypesListItem::reset()
+{
+ if( s_changedServices )
+ s_changedServices->clear();
+}
+
+void TypesListItem::getAskSave(bool &_askSave)
+{
+ if (m_askSave == 0)
+ _askSave = true;
+ if (m_askSave == 1)
+ _askSave = false;
+}
+
+void TypesListItem::setAskSave(bool _askSave)
+{
+ if (_askSave)
+ m_askSave = 0;
+ else
+ m_askSave = 1;
+}
+
+bool TypesListItem::canUseGroupSetting() const
+{
+ // "Use group settings" isn't available for zip, tar etc.; those have a builtin default...
+ bool hasLocalProtocolRedirect = !m_mimetype->property( "X-KDE-LocalProtocol" ).toString().isEmpty();
+ return !hasLocalProtocolRedirect;
+}
+
diff --git a/kcontrol/filetypes/typeslistitem.h b/kcontrol/filetypes/typeslistitem.h
new file mode 100644
index 000000000..5f44e9864
--- /dev/null
+++ b/kcontrol/filetypes/typeslistitem.h
@@ -0,0 +1,118 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
+ Copyright (C) 2003 David Faure <faure@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License version 2 as published by the Free Software Foundation.
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _TYPESLISTITEM_H
+#define _TYPESLISTITEM_H
+
+#include <qlistview.h>
+
+#include <kmimetype.h>
+#include <kuserprofile.h>
+
+class TypesListItem : public QListViewItem
+{
+public:
+ /**
+ * Create a filetype group
+ */
+ TypesListItem(QListView *parent, const QString & major );
+
+ /**
+ * Create a filetype item inside a group
+ */
+ TypesListItem(TypesListItem *parent, KMimeType::Ptr mimetype, bool newItem=false);
+
+ /**
+ * Create a filetype item not inside a group (used by keditfiletype)
+ */
+ TypesListItem(QListView *parent, KMimeType::Ptr mimetype);
+
+ /**
+ * Create a filetype item not inside a group (used by keditfiletype)
+ * KDE4: merge with previous
+ */
+ TypesListItem(QListView *parent, KMimeType::Ptr mimetype, bool newItem);
+
+ ~TypesListItem();
+
+ QString name() const { return m_major + "/" + m_minor; }
+ QString majorType() const { return m_major; }
+ QString minorType() const { return m_minor; }
+ void setMinor(QString m) { m_minor = m; }
+ QString comment() const { return m_comment; }
+ void setComment(QString c) { m_comment = c; }
+ /**
+ * Returns true if "this" is a group
+ */
+ bool isMeta() const { return metaType; }
+ /**
+ * Returns true if the type is essential, i.e. can't be deleted
+ * (see KMimeType::checkEssentialMimeTypes)
+ */
+ bool isEssential() const;
+ QString icon() const { return m_icon; }
+ void setIcon(const QString& i);
+ QStringList patterns() const { return m_patterns; }
+ void setPatterns(const QStringList &p) { m_patterns = p; }
+ QStringList appServices() const;
+ void setAppServices(const QStringList &dsl) { m_appServices = dsl; }
+ QStringList embedServices() const;
+ void setEmbedServices(const QStringList &dsl) { m_embedServices = dsl; }
+ int autoEmbed() const { return m_autoEmbed; }
+ void setAutoEmbed( int a ) { m_autoEmbed = a; }
+ const KMimeType::Ptr& mimeType() const { return m_mimetype; }
+ bool canUseGroupSetting() const;
+
+ void getAskSave(bool &);
+ void setAskSave(bool);
+
+ // Whether the service s lists this mimetype explicitly
+ KMimeType::Ptr findImplicitAssociation(const QString &desktop);
+
+ bool isMimeTypeDirty() const; // whether the mimetype .desktop file needs saving
+ bool isDirty() const;
+ void sync();
+ void setup();
+ void refresh(); // update m_mimetype from ksycoca when Apply is pressed
+
+ static bool defaultEmbeddingSetting( const QString& major );
+ static void reset();
+
+private:
+ void getServiceOffers( QStringList & appServices, QStringList & embedServices ) const;
+ void saveServices( KConfig & profile, QStringList services, const QString & servicetype2 );
+ void initMeta( const QString & major );
+ void init(KMimeType::Ptr mimetype);
+ static int readAutoEmbed( KMimeType::Ptr mimetype );
+
+ KMimeType::Ptr m_mimetype;
+ unsigned int groupCount:16; // shared between saveServices and sync
+ unsigned int m_autoEmbed:2; // 0 yes, 1 no, 2 use group setting
+ unsigned int metaType:1;
+ unsigned int m_bNewItem:1;
+ unsigned int m_bFullInit:1;
+ unsigned int m_askSave:2; // 0 yes, 1 no, 2 default
+ QString m_major, m_minor, m_comment, m_icon;
+ QStringList m_patterns;
+ QStringList m_appServices;
+ QStringList m_embedServices;
+ static QMap< QString, QStringList >* s_changedServices;
+};
+
+#endif
diff --git a/kcontrol/fonts/Makefile.am b/kcontrol/fonts/Makefile.am
new file mode 100644
index 000000000..5fe7aa2cf
--- /dev/null
+++ b/kcontrol/fonts/Makefile.am
@@ -0,0 +1,21 @@
+noinst_LTLIBRARIES = libkxftconfig.la
+
+libkxftconfig_la_SOURCES = kxftconfig.cpp
+libkxftconfig_la_LIBADD = $(LIBFONTCONFIG_LIBS)
+libkxftconfig_la_LDFLAGS = $(LIBFONTCONFIG_RPATH)
+
+AM_CPPFLAGS = $(all_includes) $(LIBFONTCONFIG_CFLAGS) $(FREETYPE2_CFLAGS) -D_LARGEFILE64_SOURCE
+
+kde_module_LTLIBRARIES = kcm_fonts.la
+
+kcm_fonts_la_SOURCES = fonts.cpp
+kcm_fonts_la_LDFLAGS = $(KDE_RPATH) $(LIBFONTCONFIG_RPATH) $(FREETYPE2_LDFLAGS) -module -avoid-version $(all_libraries) -no-undefined
+kcm_fonts_la_LIBADD = libkxftconfig.la $(top_builddir)/kcontrol/krdb/libkrdb.la $(LIB_KDEUI) $(LIBFONTCONFIG_LIBS)
+METASOURCES = AUTO
+
+noinst_HEADERS = fonts.h kxftconfig.h
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmfonts.pot
+
+xdg_apps_DATA = fonts.desktop
diff --git a/kcontrol/fonts/configure.in.in b/kcontrol/fonts/configure.in.in
new file mode 100644
index 000000000..0ecc46d91
--- /dev/null
+++ b/kcontrol/fonts/configure.in.in
@@ -0,0 +1,57 @@
+KDE_FIND_PATH(fontconfig-config, FONTCONFIG_CONFIG, [${prefix}/bin ${exec_prefix}/bin /usr/bin /usr/local/bin /opt/local/bin], [
+ KDE_FIND_PATH(pkg-config, PKGCONFIG, [${prefix}/bin ${exec_prefix}/bin /usr/bin /usr/local/bin /opt/local/bin], [
+ AC_MSG_WARN([Could not find neither pkg-config nor fontconfig-config, check http://www.fontconfig.org/ ])
+ ])
+])
+
+if test -n "$PKGCONFIG"; then
+ vers=`$PKGCONFIG fontconfig --modversion 2>/dev/null | sed -e 's/libfontconfig //' | awk 'BEGIN { FS = "."; } { printf "%d", ($1 * 1000 + $2) * 1000 + $3;}'`
+ if test -n "$vers" && test "$vers" -ge 1000000
+ then
+ LIBFONTCONFIG_LIBS="`$PKGCONFIG fontconfig --libs`"
+ LIBFONTCONFIG_RPATH=
+ for args in $LIBFONTCONFIG_LIBS; do
+ case $args in
+ -L*)
+ LIBFONTCONFIG_RPATH="$LIBFONTCONFIG_RPATH $args"
+ ;;
+ esac
+ done
+ LIBFONTCONFIG_RPATH=`echo $LIBFONTCONFIG_RPATH | sed -e "s/-L/-R/g"`
+ LIBFONTCONFIG_CFLAGS="`$PKGCONFIG fontconfig --cflags`"
+
+ AC_DEFINE_UNQUOTED(HAVE_FONTCONFIG, 1, [Defines if your system has the libfontconfig library])
+ fi
+fi
+
+if test -n "$FONTCONFIG_CONFIG"; then
+ vers=`$FONTCONFIG_CONFIG --version 2>/dev/null | sed -e 's/libfontconfig //' | awk 'BEGIN { FS = "."; } { printf "%d", ($1 * 1000 + $2) * 1000 + $3;}'`
+ if test -n "$vers" && test "$vers" -ge 1000000
+ then
+ LIBFONTCONFIG_LIBS="`$FONTCONFIG_CONFIG --libs`"
+ LIBFONTCONFIG_RPATH=
+ for args in $LIBFONTCONFIG_LIBS; do
+ case $args in
+ -L*)
+ LIBFONTCONFIG_RPATH="$LIBFONTCONFIG_RPATH $args"
+ ;;
+ esac
+ done
+ LIBFONTCONFIG_RPATH=`echo $LIBFONTCONFIG_RPATH | sed -e "s/-L/-R/g"`
+ LIBFONTCONFIG_CFLAGS="`$FONTCONFIG_CONFIG --cflags`"
+
+ AC_DEFINE_UNQUOTED(HAVE_FONTCONFIG, 1, [Defines if your system has the libfontconfig library])
+ fi
+fi
+
+AC_SUBST(LIBFONTCONFIG_LIBS)
+AC_SUBST(LIBFONTCONFIG_CFLAGS)
+AC_SUBST(LIBFONTCONFIG_RPATH)
+
+if pkg-config --exists freetype2 2>/dev/null; then
+ FREETYPE2_CFLAGS=`pkg-config --cflags freetype2`
+ FREETYPE2_LDFLAGS=`pkg-config --libs freetype2`
+ AC_DEFINE(HAVE_FREETYPE2, 1, [Define if you have FreeType2 library])
+fi
+AC_SUBST(FREETYPE2_CFLAGS)
+AC_SUBST(FREETYPE2_LDFLAGS)
diff --git a/kcontrol/fonts/fonts.cpp b/kcontrol/fonts/fonts.cpp
new file mode 100644
index 000000000..8cb1cbafc
--- /dev/null
+++ b/kcontrol/fonts/fonts.cpp
@@ -0,0 +1,802 @@
+// KDE Display fonts setup tab
+//
+// Copyright (c) Mark Donohoe 1997
+// lars Knoll 1999
+// Rik Hemsley 2000
+//
+// Ported to kcontrol2 by Geert Jansen.
+
+#include <config.h>
+
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qdir.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qsettings.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+
+#include <dcopclient.h>
+
+#include <kaccelmanager.h>
+#include <kapplication.h>
+#include <kgenericfactory.h>
+#include <kipc.h>
+#include <kmessagebox.h>
+#include <knuminput.h>
+#include <kprocio.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+#include <stdlib.h>
+
+#ifdef HAVE_FREETYPE2
+#include <ft2build.h>
+#ifdef FT_LCD_FILTER_H
+#include FT_FREETYPE_H
+#include FT_LCD_FILTER_H
+#endif
+#endif
+
+#include "../krdb/krdb.h"
+#include "fonts.h"
+#include "fonts.moc"
+
+#include <kdebug.h>
+
+#include <X11/Xlib.h>
+
+// X11 headers
+#undef Bool
+#undef Unsorted
+#undef None
+
+static const char *aa_rgb_xpm[]={
+"12 12 3 1",
+"a c #0000ff",
+"# c #00ff00",
+". c #ff0000",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa"};
+static const char *aa_bgr_xpm[]={
+"12 12 3 1",
+". c #0000ff",
+"# c #00ff00",
+"a c #ff0000",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa",
+"....####aaaa"};
+static const char *aa_vrgb_xpm[]={
+"12 12 3 1",
+"a c #0000ff",
+"# c #00ff00",
+". c #ff0000",
+"............",
+"............",
+"............",
+"............",
+"############",
+"############",
+"############",
+"############",
+"aaaaaaaaaaaa",
+"aaaaaaaaaaaa",
+"aaaaaaaaaaaa",
+"aaaaaaaaaaaa"};
+static const char *aa_vbgr_xpm[]={
+"12 12 3 1",
+". c #0000ff",
+"# c #00ff00",
+"a c #ff0000",
+"............",
+"............",
+"............",
+"............",
+"############",
+"############",
+"############",
+"############",
+"aaaaaaaaaaaa",
+"aaaaaaaaaaaa",
+"aaaaaaaaaaaa",
+"aaaaaaaaaaaa"};
+
+static const char** aaPixmaps[]={ aa_rgb_xpm, aa_bgr_xpm, aa_vrgb_xpm, aa_vbgr_xpm };
+
+/**** DLL Interface ****/
+typedef KGenericFactory<KFonts, QWidget> FontFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_fonts, FontFactory("kcmfonts") )
+
+/**** FontUseItem ****/
+
+FontUseItem::FontUseItem(
+ QWidget * parent,
+ const QString &name,
+ const QString &grp,
+ const QString &key,
+ const QString &rc,
+ const QFont &default_fnt,
+ bool f
+)
+ : KFontRequester(parent, 0L, f),
+ _rcfile(rc),
+ _rcgroup(grp),
+ _rckey(key),
+ _default(default_fnt)
+{
+ KAcceleratorManager::setNoAccel( this );
+ setTitle( name );
+ readFont( false );
+}
+
+void FontUseItem::setDefault()
+{
+ setFont( _default, isFixedOnly() );
+}
+
+void FontUseItem::readFont( bool useDefaults )
+{
+ KConfigBase *config;
+
+ bool deleteme = false;
+ if (_rcfile.isEmpty())
+ config = KGlobal::config();
+ else
+ {
+ config = new KConfig(_rcfile, true);
+ deleteme = true;
+ }
+
+ config->setReadDefaults( useDefaults );
+
+ config->setGroup(_rcgroup);
+ QFont tmpFnt(_default);
+ setFont( config->readFontEntry(_rckey, &tmpFnt), isFixedOnly() );
+ if (deleteme) delete config;
+}
+
+void FontUseItem::writeFont()
+{
+ KConfigBase *config;
+
+ if (_rcfile.isEmpty()) {
+ config = KGlobal::config();
+ config->setGroup(_rcgroup);
+ config->writeEntry(_rckey, font(), true, true);
+ } else {
+ config = new KSimpleConfig(locateLocal("config", _rcfile));
+ config->setGroup(_rcgroup);
+ config->writeEntry(_rckey, font());
+ config->sync();
+ delete config;
+ }
+}
+
+void FontUseItem::applyFontDiff( const QFont &fnt, int fontDiffFlags )
+{
+ QFont _font( font() );
+
+ if (fontDiffFlags & KFontChooser::FontDiffSize) {
+ _font.setPointSize( fnt.pointSize() );
+ }
+ if (fontDiffFlags & KFontChooser::FontDiffFamily) {
+ if (!isFixedOnly()) _font.setFamily( fnt.family() );
+ }
+ if (fontDiffFlags & KFontChooser::FontDiffStyle) {
+ _font.setBold( fnt.bold() );
+ _font.setItalic( fnt.italic() );
+ _font.setUnderline( fnt.underline() );
+ }
+
+ setFont( _font, isFixedOnly() );
+}
+
+/**** FontAASettings ****/
+
+FontAASettings::FontAASettings(QWidget *parent)
+ : KDialogBase(parent, "FontAASettings", true, i18n("Configure Anti-Alias Settings"), Ok|Cancel, Ok, true),
+ changesMade(false)
+{
+ QWidget *mw=new QWidget(this);
+ QGridLayout *layout=new QGridLayout(mw, 1, 1, 0, KDialog::spacingHint());
+
+ excludeRange=new QCheckBox(i18n("E&xclude range:"), mw),
+ layout->addWidget(excludeRange, 0, 0);
+ excludeFrom=new KDoubleNumInput(0, 72, 8.0, 1, 1, mw),
+ excludeFrom->setSuffix(i18n(" pt"));
+ layout->addWidget(excludeFrom, 0, 1);
+ excludeToLabel=new QLabel(i18n(" to "), mw);
+ layout->addWidget(excludeToLabel, 0, 2);
+ excludeTo=new KDoubleNumInput(0, 72, 15.0, 1, 1, mw);
+ excludeTo->setSuffix(i18n(" pt"));
+ layout->addWidget(excludeTo, 0, 3);
+
+ useSubPixel=new QCheckBox(i18n("&Use sub-pixel hinting:"), mw);
+ layout->addWidget(useSubPixel, 1, 0);
+
+ QWhatsThis::add(useSubPixel, i18n("If you have a TFT or LCD screen you"
+ " can further improve the quality of displayed fonts by selecting"
+ " this option.<br>Sub-pixel hinting is also known as ClearType(tm).<br>"
+ "<br><b>This will not work with CRT monitors.</b>"));
+
+ subPixelType=new QComboBox(false, mw);
+ layout->addMultiCellWidget(subPixelType, 1, 1, 1, 3);
+
+ QWhatsThis::add(subPixelType, i18n("In order for sub-pixel hinting to"
+ " work correctly you need to know how the sub-pixels of your display"
+ " are aligned.<br>"
+ " On TFT or LCD displays a single pixel is actually composed of"
+ " three sub-pixels, red, green and blue. Most displays"
+ " have a linear ordering of RGB sub-pixel, some have BGR."));
+
+ for(int t=KXftConfig::SubPixel::None+1; t<=KXftConfig::SubPixel::Vbgr; ++t)
+ subPixelType->insertItem(QPixmap(aaPixmaps[t-1]), KXftConfig::description((KXftConfig::SubPixel::Type)t));
+
+#ifdef HAVE_FONTCONFIG
+ QLabel *hintingLabel=new QLabel(i18n("Hinting style: "), mw);
+ layout->addWidget(hintingLabel, 2, 0);
+ hintingStyle=new QComboBox(false, mw);
+ layout->addMultiCellWidget(hintingStyle, 2, 2, 1, 3);
+ for(int s=KXftConfig::Hint::NotSet+1; s<=KXftConfig::Hint::Full; ++s)
+ hintingStyle->insertItem(KXftConfig::description((KXftConfig::Hint::Style)s));
+
+ QString hintingText(i18n("Hinting is a process used to enhance the quality of fonts at small sizes."));
+ QWhatsThis::add(hintingStyle, hintingText);
+ QWhatsThis::add(hintingLabel, hintingText);
+#endif
+ load();
+ enableWidgets();
+ setMainWidget(mw);
+
+ connect(excludeRange, SIGNAL(toggled(bool)), SLOT(changed()));
+ connect(useSubPixel, SIGNAL(toggled(bool)), SLOT(changed()));
+ connect(excludeFrom, SIGNAL(valueChanged(double)), SLOT(changed()));
+ connect(excludeTo, SIGNAL(valueChanged(double)), SLOT(changed()));
+ connect(subPixelType, SIGNAL(activated(const QString &)), SLOT(changed()));
+#ifdef HAVE_FONTCONFIG
+ connect(hintingStyle, SIGNAL(activated(const QString &)), SLOT(changed()));
+#endif
+}
+
+bool FontAASettings::load()
+{
+ return load( false );
+}
+
+
+bool FontAASettings::load( bool useDefaults )
+{
+ double from, to;
+ KXftConfig xft(KXftConfig::constStyleSettings);
+
+
+ if(xft.getExcludeRange(from, to))
+ excludeRange->setChecked(true);
+ else
+ {
+ excludeRange->setChecked(false);
+ from=8.0;
+ to=15.0;
+ }
+
+ excludeFrom->setValue(from);
+ excludeTo->setValue(to);
+
+ KXftConfig::SubPixel::Type spType;
+
+ if(!xft.getSubPixelType(spType) || KXftConfig::SubPixel::None==spType)
+ useSubPixel->setChecked(false);
+ else
+ {
+ int idx=getIndex(spType);
+
+ if(idx>-1)
+ {
+ useSubPixel->setChecked(true);
+ subPixelType->setCurrentItem(idx);
+ }
+ else
+ useSubPixel->setChecked(false);
+ }
+
+#ifdef HAVE_FONTCONFIG
+ KXftConfig::Hint::Style hStyle;
+
+ if(!xft.getHintStyle(hStyle) || KXftConfig::Hint::NotSet==hStyle)
+ {
+ KConfig kglobals("kdeglobals", false, false);
+
+ kglobals.setReadDefaults( useDefaults );
+
+ kglobals.setGroup("General");
+ hStyle=KXftConfig::Hint::Medium;
+ xft.setHintStyle(hStyle);
+ xft.apply(); // Save this setting
+ kglobals.writeEntry("XftHintStyle", KXftConfig::toStr(hStyle));
+ kglobals.sync();
+ runRdb(KRdbExportXftSettings);
+ }
+
+ hintingStyle->setCurrentItem(getIndex(hStyle));
+#endif
+
+ enableWidgets();
+
+ return xft.getAntiAliasing();
+}
+
+bool FontAASettings::save( bool useAA )
+{
+ KXftConfig xft(KXftConfig::constStyleSettings);
+ KConfig kglobals("kdeglobals", false, false);
+
+ kglobals.setGroup("General");
+
+ xft.setAntiAliasing( useAA );
+
+ if(excludeRange->isChecked())
+ xft.setExcludeRange(excludeFrom->value(), excludeTo->value());
+ else
+ xft.setExcludeRange(0, 0);
+
+ KXftConfig::SubPixel::Type spType(useSubPixel->isChecked()
+ ? getSubPixelType()
+ : KXftConfig::SubPixel::None);
+
+ xft.setSubPixelType(spType);
+ kglobals.writeEntry("XftSubPixel", KXftConfig::toStr(spType));
+ kglobals.writeEntry("XftAntialias", useAA);
+
+ bool mod=false;
+#ifdef HAVE_FONTCONFIG
+ KXftConfig::Hint::Style hStyle(getHintStyle());
+
+ xft.setHintStyle(hStyle);
+
+ QString hs(KXftConfig::toStr(hStyle));
+
+ if(!hs.isEmpty() && hs!=kglobals.readEntry("XftHintStyle"))
+ {
+ kglobals.writeEntry("XftHintStyle", hs);
+ mod=true;
+ }
+#endif
+ kglobals.sync();
+
+ if(!mod)
+ mod=xft.changed();
+
+ xft.apply();
+
+ return mod;
+}
+
+void FontAASettings::defaults()
+{
+ load( true );
+}
+
+int FontAASettings::getIndex(KXftConfig::SubPixel::Type spType)
+{
+ int pos=-1;
+ int index;
+
+ for(index=0; index<subPixelType->count(); ++index)
+ if(subPixelType->text(index)==KXftConfig::description(spType))
+ {
+ pos=index;
+ break;
+ }
+
+ return pos;
+}
+
+KXftConfig::SubPixel::Type FontAASettings::getSubPixelType()
+{
+ int t;
+
+ for(t=KXftConfig::SubPixel::None; t<=KXftConfig::SubPixel::Vbgr; ++t)
+ if(subPixelType->currentText()==KXftConfig::description((KXftConfig::SubPixel::Type)t))
+ return (KXftConfig::SubPixel::Type)t;
+
+ return KXftConfig::SubPixel::None;
+}
+
+#ifdef HAVE_FONTCONFIG
+int FontAASettings::getIndex(KXftConfig::Hint::Style hStyle)
+{
+ int pos=-1;
+ int index;
+
+ for(index=0; index<hintingStyle->count(); ++index)
+ if(hintingStyle->text(index)==KXftConfig::description(hStyle))
+ {
+ pos=index;
+ break;
+ }
+
+ return pos;
+}
+
+
+KXftConfig::Hint::Style FontAASettings::getHintStyle()
+{
+ int s;
+
+ for(s=KXftConfig::Hint::NotSet; s<=KXftConfig::Hint::Full; ++s)
+ if(hintingStyle->currentText()==KXftConfig::description((KXftConfig::Hint::Style)s))
+ return (KXftConfig::Hint::Style)s;
+
+ return KXftConfig::Hint::Medium;
+}
+#endif
+
+void FontAASettings::enableWidgets()
+{
+ excludeFrom->setEnabled(excludeRange->isChecked());
+ excludeTo->setEnabled(excludeRange->isChecked());
+ excludeToLabel->setEnabled(excludeRange->isChecked());
+ subPixelType->setEnabled(useSubPixel->isChecked());
+#ifdef FT_LCD_FILTER_H
+ static int ft_has_subpixel = -1;
+ if( ft_has_subpixel == -1 ) {
+ FT_Library ftLibrary;
+ if(FT_Init_FreeType(&ftLibrary) == 0) {
+ ft_has_subpixel = ( FT_Library_SetLcdFilter(ftLibrary, FT_LCD_FILTER_DEFAULT )
+ == FT_Err_Unimplemented_Feature ) ? 0 : 1;
+ FT_Done_FreeType(ftLibrary);
+ }
+ }
+ useSubPixel->setEnabled(ft_has_subpixel);
+ subPixelType->setEnabled(ft_has_subpixel);
+#endif
+}
+
+void FontAASettings::changed()
+{
+ changesMade=true;
+ enableWidgets();
+}
+
+int FontAASettings::exec()
+{
+ int i=KDialogBase::exec();
+
+ if(!i)
+ load(); // Reset settings...
+
+ return i && changesMade;
+}
+
+/**** KFonts ****/
+
+static QCString desktopConfigName()
+{
+ int desktop=0;
+ if (qt_xdisplay())
+ desktop = DefaultScreen(qt_xdisplay());
+ QCString name;
+ if (desktop == 0)
+ name = "kdesktoprc";
+ else
+ name.sprintf("kdesktop-screen-%drc", desktop);
+
+ return name;
+}
+
+KFonts::KFonts(QWidget *parent, const char *name, const QStringList &)
+ : KCModule(FontFactory::instance(), parent, name)
+{
+ QStringList nameGroupKeyRc;
+
+ nameGroupKeyRc
+ << i18n("General") << "General" << "font" << ""
+ << i18n("Fixed width") << "General" << "fixed" << ""
+ << i18n("Toolbar") << "General" << "toolBarFont" << ""
+ << i18n("Menu") << "General" << "menuFont" << ""
+ << i18n("Window title") << "WM" << "activeFont" << ""
+ << i18n("Taskbar") << "General" << "taskbarFont" << ""
+ << i18n("Desktop") << "FMSettings" << "StandardFont" << desktopConfigName();
+
+ QValueList<QFont> defaultFontList;
+
+ // Keep in sync with kdelibs/kdecore/kglobalsettings.cpp
+
+ QFont f0("Sans Serif", 10);
+ QFont f1("Monospace", 10);
+ QFont f2("Sans Serif", 10);
+ QFont f3("Sans Serif", 9, QFont::Bold);
+ QFont f4("Sans Serif", 10);
+
+ f0.setPointSize(10);
+ f1.setPointSize(10);
+ f2.setPointSize(10);
+ f3.setPointSize(9);
+ f4.setPointSize(10);
+
+ defaultFontList << f0 << f1 << f2 << f0 << f3 << f4 << f0;
+
+ QValueList<bool> fixedList;
+
+ fixedList
+ << false
+ << true
+ << false
+ << false
+ << false
+ << false
+ << false;
+
+ QStringList quickHelpList;
+
+ quickHelpList
+ << i18n("Used for normal text (e.g. button labels, list items).")
+ << i18n("A non-proportional font (i.e. typewriter font).")
+ << i18n("Used to display text beside toolbar icons.")
+ << i18n("Used by menu bars and popup menus.")
+ << i18n("Used by the window titlebar.")
+ << i18n("Used by the taskbar.")
+ << i18n("Used for desktop icons.");
+
+ QVBoxLayout * layout =
+ new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ QGridLayout * fontUseLayout =
+ new QGridLayout(layout, nameGroupKeyRc.count() / 4, 3);
+
+ fontUseLayout->setColStretch(0, 0);
+ fontUseLayout->setColStretch(1, 1);
+ fontUseLayout->setColStretch(2, 0);
+
+ QValueList<QFont>::ConstIterator defaultFontIt(defaultFontList.begin());
+ QValueList<bool>::ConstIterator fixedListIt(fixedList.begin());
+ QStringList::ConstIterator quickHelpIt(quickHelpList.begin());
+ QStringList::ConstIterator it(nameGroupKeyRc.begin());
+
+ unsigned int count = 0;
+
+ while (it != nameGroupKeyRc.end()) {
+
+ QString name = *it; it++;
+ QString group = *it; it++;
+ QString key = *it; it++;
+ QString file = *it; it++;
+
+ FontUseItem * i =
+ new FontUseItem(
+ this,
+ name,
+ group,
+ key,
+ file,
+ *defaultFontIt++,
+ *fixedListIt++
+ );
+
+ fontUseList.append(i);
+ connect(i, SIGNAL(fontSelected(const QFont &)), SLOT(fontSelected()));
+
+ QLabel * fontUse = new QLabel(name+":", this);
+ QWhatsThis::add(fontUse, *quickHelpIt++);
+
+ fontUseLayout->addWidget(fontUse, count, 0);
+ fontUseLayout->addWidget(i, count, 1);
+
+ ++count;
+ }
+
+ QHBoxLayout *hblay = new QHBoxLayout(layout, KDialog::spacingHint());
+ hblay->addStretch();
+ QPushButton * fontAdjustButton = new QPushButton(i18n("Ad&just All Fonts..."), this);
+ QWhatsThis::add(fontAdjustButton, i18n("Click to change all fonts"));
+ hblay->addWidget( fontAdjustButton );
+ connect(fontAdjustButton, SIGNAL(clicked()), SLOT(slotApplyFontDiff()));
+
+ layout->addSpacing(KDialog::spacingHint());
+
+ QGridLayout* lay = new QGridLayout(layout, 2, 4, KDialog::spacingHint());
+ lay->setColStretch( 3, 10 );
+ QLabel* label = new QLabel( i18n( "Use a&nti-aliasing:" ), this );
+ lay->addWidget( label, 0, 0 );
+ cbAA = new QComboBox( this );
+ cbAA->insertItem( i18n( "Enabled" )); // change AASetting type if order changes
+ cbAA->insertItem( i18n( "System settings" ));
+ cbAA->insertItem( i18n( "Disabled" ));
+ QWhatsThis::add(cbAA, i18n("If this option is selected, KDE will smooth the edges of curves in "
+ "fonts."));
+ aaSettingsButton = new QPushButton( i18n( "Configure..." ), this);
+ connect(aaSettingsButton, SIGNAL(clicked()), SLOT(slotCfgAa()));
+ label->setBuddy( cbAA );
+ lay->addWidget( cbAA, 0, 1 );
+ lay->addWidget( aaSettingsButton, 0, 2 );
+ connect(cbAA, SIGNAL(activated(int)), SLOT(slotUseAntiAliasing()));
+
+ label = new QLabel( i18n( "Force fonts DPI:" ), this );
+ lay->addWidget( label, 1, 0 );
+ comboForceDpi = new QComboBox( this );
+ label->setBuddy( comboForceDpi );
+ comboForceDpi->insertItem( i18n( "Disabled" )); // change DPISetti ng type if order changes
+ comboForceDpi->insertItem( i18n( "96 DPI" ));
+ comboForceDpi->insertItem( i18n( "120 DPI" ));
+ QString whatsthis = i18n(
+ "<p>This option forces a specific DPI value for fonts. It may be useful"
+ " when the real DPI of the hardware is not detected properly and it"
+ " is also often misused when poor quality fonts are used that do not"
+ " look well with DPI values other than 96 or 120 DPI.</p>"
+ "<p>The use of this option is generally discouraged. For selecting proper DPI"
+ " value a better option is explicitly configuring it for the whole X server if"
+ " possible (e.g. DisplaySize in xorg.conf or adding <i>-dpi value</i> to"
+ " ServerLocalArgs= in $KDEDIR/share/config/kdm/kdmrc). When fonts do not render"
+ " properly with real DPI value better fonts should be used or configuration"
+ " of font hinting should be checked.</p>" );
+ QWhatsThis::add(comboForceDpi, whatsthis);
+ connect( comboForceDpi, SIGNAL( activated( int )), SLOT( changed()));
+ lay->addWidget( comboForceDpi, 1, 1 );
+
+ layout->addStretch(1);
+
+ aaSettings=new FontAASettings(this);
+
+ load();
+}
+
+KFonts::~KFonts()
+{
+ fontUseList.setAutoDelete(true);
+ fontUseList.clear();
+}
+
+void KFonts::fontSelected()
+{
+ emit changed(true);
+}
+
+void KFonts::defaults()
+{
+ load( true );
+ aaSettings->defaults();
+}
+
+void KFonts::load()
+{
+ load( false );
+}
+
+
+void KFonts::load( bool useDefaults )
+{
+ for ( uint i = 0; i < fontUseList.count(); i++ )
+ fontUseList.at( i )->readFont( useDefaults );
+
+ useAA_original = useAA = aaSettings->load( useDefaults ) ? AAEnabled : AADisabled;
+ cbAA->setCurrentItem( useAA );
+
+ KConfig cfgfonts("kcmfonts", true);
+ cfgfonts.setGroup("General");
+ int dpicfg = cfgfonts.readNumEntry( "forceFontDPI", 0 );
+ DPISetting dpi = dpicfg == 120 ? DPI120 : dpicfg == 96 ? DPI96 : DPINone;
+ comboForceDpi->setCurrentItem( dpi );
+ dpi_original = dpi;
+ if( cfgfonts.readBoolEntry( "dontChangeAASettings", true )) {
+ useAA_original = useAA = AASystem;
+ cbAA->setCurrentItem( useAA );
+ }
+ aaSettingsButton->setEnabled( cbAA->currentItem() == AAEnabled );
+
+ emit changed( useDefaults );
+}
+
+void KFonts::save()
+{
+
+ for ( FontUseItem* i = fontUseList.first(); i; i = fontUseList.next() )
+ i->writeFont();
+ KGlobal::config()->sync();
+
+ KConfig cfgfonts("kcmfonts");
+ cfgfonts.setGroup("General");
+ DPISetting dpi = static_cast< DPISetting >( comboForceDpi->currentItem());
+ const int dpi2value[] = { 0, 96, 120 };
+ cfgfonts.writeEntry( "forceFontDPI", dpi2value[ dpi ] );
+ cfgfonts.writeEntry( "dontChangeAASettings", cbAA->currentItem() == AASystem );
+ cfgfonts.sync();
+ // if the setting is reset in the module, remove the dpi value,
+ // otherwise don't explicitly remove it and leave any possible system-wide value
+ if( dpi == DPINone && dpi_original != DPINone ) {
+ KProcIO proc;
+ proc << "xrdb" << "-quiet" << "-remove" << "-nocpp";
+ proc.writeStdin( QCString( "Xft.dpi" ), true );
+ proc.closeWhenDone();
+ proc.start( KProcess::Block );
+ }
+
+ // KDE-1.x support
+ KSimpleConfig* config = new KSimpleConfig( QDir::homeDirPath() + "/.kderc" );
+ config->setGroup( "General" );
+ for ( FontUseItem* i = fontUseList.first(); i; i = fontUseList.next() ) {
+ if("font"==i->rcKey())
+ QSettings().writeEntry("/qt/font", i->font().toString());
+ kdDebug(1208) << "write entry " << i->rcKey() << endl;
+ config->writeEntry( i->rcKey(), i->font() );
+ }
+ config->sync();
+ delete config;
+
+ KIPC::sendMessageAll(KIPC::FontChanged);
+
+ kapp->processEvents(); // Process font change ourselves
+
+ bool aaSave = false;
+ // Don't overwrite global settings unless explicitly asked for - e.g. the system
+ // fontconfig setup may be much more complex than this module can provide.
+ // TODO: With NoChange the changes already made by this module should be reverted somehow.
+ if( cbAA->currentItem() != AASystem )
+ aaSave = aaSettings->save( useAA == AAEnabled );
+
+ if( aaSave || (useAA != useAA_original) || dpi != dpi_original) {
+ KMessageBox::information(this,
+ i18n(
+ "<p>Some changes such as anti-aliasing will only affect newly started applications.</p>"
+ ), i18n("Font Settings Changed"), "FontSettingsChanged", false);
+ useAA_original = useAA;
+ dpi_original = dpi;
+ }
+
+ runRdb(KRdbExportXftSettings);
+
+ emit changed(false);
+}
+
+
+void KFonts::slotApplyFontDiff()
+{
+ QFont font = QFont(fontUseList.first()->font());
+ int fontDiffFlags = 0;
+ int ret = KFontDialog::getFontDiff(font,fontDiffFlags);
+
+ if (ret == KDialog::Accepted && fontDiffFlags)
+ {
+ for ( int i = 0; i < (int) fontUseList.count(); i++ )
+ fontUseList.at( i )->applyFontDiff( font,fontDiffFlags );
+ emit changed(true);
+ }
+}
+
+void KFonts::slotUseAntiAliasing()
+{
+ useAA = static_cast< AASetting >( cbAA->currentItem());
+ aaSettingsButton->setEnabled( cbAA->currentItem() == AAEnabled );
+ emit changed(true);
+}
+
+void KFonts::slotCfgAa()
+{
+ if(aaSettings->exec())
+ {
+ emit changed(true);
+ }
+}
+
+// vim:ts=2:sw=2:tw=78
diff --git a/kcontrol/fonts/fonts.desktop b/kcontrol/fonts/fonts.desktop
new file mode 100644
index 000000000..060772797
--- /dev/null
+++ b/kcontrol/fonts/fonts.desktop
@@ -0,0 +1,239 @@
+[Desktop Entry]
+Exec=kcmshell fonts
+Icon=fonts
+Type=Application
+DocPath=kcontrol/fonts/index.html
+
+
+X-KDE-Library=fonts
+X-KDE-FactoryName=fonts
+X-KDE-ParentApp=kcontrol
+
+Name=Fonts
+Name[af]=Skriftipes
+Name[ar]=المحارف
+Name[az]=Yazı növləri
+Name[be]=Шрыфты
+Name[bg]=Шрифтове
+Name[bn]=ফন্ট
+Name[br]=Fontoù
+Name[bs]=Fontovi
+Name[ca]=Lletres
+Name[cs]=Písma
+Name[csb]=Fòntë
+Name[cy]=Ffontiau
+Name[da]=Skrifttyper
+Name[de]=Schriftarten
+Name[el]=Γραμματοσειρές
+Name[eo]=Tiparoj
+Name[es]=Tipos de letra
+Name[et]=Fondid
+Name[eu]=Letra-tipoak
+Name[fa]=قلمها
+Name[fi]=Kirjasimet
+Name[fr]=Polices
+Name[fy]=Lettertypen
+Name[ga]=Clónna
+Name[gl]=Fontes
+Name[he]=גופנים
+Name[hi]=फ़ॉन्ट्स
+Name[hr]=Fontovi
+Name[hu]=Betűtípusok
+Name[is]=Letur
+Name[it]=Tipi di carattere
+Name[ja]=フォント
+Name[ka]=ფონტები
+Name[kk]=Қаріптер
+Name[km]=ពុម្ពអក្សរ
+Name[ko]=글꼴
+Name[lo]=ຮູບແບບຕົວອັກສອນ
+Name[lt]=Šriftai
+Name[lv]=Fonti
+Name[mk]=Фонтови
+Name[mn]=Бичгүүд
+Name[ms]=Fon
+Name[nb]=Skrifttype
+Name[nds]=Schriftoorden
+Name[ne]=फन्ट
+Name[nl]=Lettertypen
+Name[nn]=Skrifttypar
+Name[nso]=Difonto
+Name[pa]=ਫੋਂਟ
+Name[pl]=Czcionki
+Name[pt]=Tipos de Letra
+Name[pt_BR]=Fontes
+Name[ro]=Fonturi
+Name[ru]=Шрифты
+Name[rw]=Imyandikire
+Name[se]=Fonttat
+Name[sk]=Písma
+Name[sl]=Pisave
+Name[sr]=Фонтови
+Name[sr@Latn]=Fontovi
+Name[ss]=Timo tetinhlamvu temagama
+Name[sv]=Teckensnitt
+Name[ta]=எழுத்துருக்கள்
+Name[tg]=Ҳарфҳо
+Name[th]=แบบอักษร
+Name[tr]=Yazıtipleri
+Name[tt]=Yazu
+Name[uk]=Шрифти
+Name[uz]=Shriftlar
+Name[uz@cyrillic]=Шрифтлар
+Name[ven]=Fontu
+Name[vi]=Phông chữ
+Name[wa]=Fontes
+Name[xh]=Uhlobo lwamagama
+Name[zh_CN]=字体
+Name[zh_TW]=字型
+Name[zu]=Izinhlobo zamagama
+
+Comment=Font settings
+Comment[af]=Skrif tipe instellings
+Comment[ar]=تعيينات المحرف
+Comment[az]=Yazı növü qurğuları
+Comment[be]=Настаўленні шрыфтоў
+Comment[bg]=Настройване шрифтовете на системата
+Comment[bn]=ফন্ট সেটিংস
+Comment[br]=Kefluniañ ar fontoù
+Comment[bs]=Postavke fontova
+Comment[ca]=Arranjament de les lletres
+Comment[cs]=Nastavení písem
+Comment[csb]=Nastôw fòntów
+Comment[cy]=Gosodiadau Ffontiau
+Comment[da]=Skrifttypeindstillinger
+Comment[de]=Schriftarten-Einstellungen
+Comment[el]=Ρυθμίσεις γραμματοσειρών
+Comment[eo]=Tiparagordo
+Comment[es]=Opciones de los tipos de letra
+Comment[et]=Fontide seadistused
+Comment[eu]=Letra-tipoen konfigurazioa
+Comment[fa]=تنظیمات قلم
+Comment[fi]=Kirjasinten asetukset
+Comment[fr]=Configuration des police de caractères
+Comment[fy]=Lettertypen ynstellings
+Comment[ga]=Socruithe na gclónna
+Comment[gl]=Configuración das fontes
+Comment[he]=שינוי הגדרות הגופנים
+Comment[hi]=फ़ॉन्ट्स विन्यास
+Comment[hr]=Postavke fontova
+Comment[hu]=Betűtípus-beállítások
+Comment[id]=Seting font
+Comment[is]=Stillingar leturs
+Comment[it]=Impostazioni tipi di carattere
+Comment[ja]=フォントの設定
+Comment[ka]=ფონტების კონფიგურაცია
+Comment[kk]=Қаріптерді орнату
+Comment[km]=ការ​កំណត់​ពុម្ពអក្សរ
+Comment[ko]=글꼴 설정
+Comment[lo]=ຕັ້ງຄ່າຮູບແບບຕົວອັກສອນ
+Comment[lt]=Šriftų nustatymai
+Comment[lv]=Fontu parametri
+Comment[mk]=Поставувања на фонтовите
+Comment[mn]=Бичиг тохируулах
+Comment[ms]=Seting Fon
+Comment[mt]=Konfigurazzjoni tal-fonts
+Comment[nb]=Skriftinnstillinger
+Comment[nds]=Schriftoorden instellen
+Comment[ne]=फन्ट सेटिङ
+Comment[nl]=Lettertypeninstellingen
+Comment[nn]=Skriftinnstillingar
+Comment[nso]=Dipeakanyo tsa difonto
+Comment[oc]=Arranjament de les fonts
+Comment[pa]=ਫੋਂਟ ਸੈਟਿੰਗ
+Comment[pl]=Ustawienia czcionek
+Comment[pt]=Configuração dos tipos de letra
+Comment[pt_BR]=Configuraçõess de Fontes
+Comment[ro]=Configurează fonturile de sistem
+Comment[ru]=Настройка шрифтов
+Comment[rw]=Amagenamiterere y'imyandikire
+Comment[se]=Fontaheivehusat
+Comment[sk]=Nastavenie písiem
+Comment[sl]=Nastavitve pisav
+Comment[sr]=Поставке фонта
+Comment[sr@Latn]=Postavke fonta
+Comment[sv]=Anpassa teckensnitt
+Comment[ta]=எழுத்துரு அமைப்புகள்
+Comment[tg]=Танзимоти ҳарфҳо
+Comment[th]=ตั้งค่าแบบอักษร
+Comment[tr]=Yazıtipi ayarları
+Comment[tt]=Yazu şäkellären caylaw
+Comment[uk]=Налаштування шрифтів
+Comment[uz]=Shriftlarni moslash
+Comment[uz@cyrillic]=Шрифтларни мослаш
+Comment[ven]=Mavhekanyele a fontu
+Comment[vi]=Thiết lập phông chữ
+Comment[wa]=Apontiaedje des fontes
+Comment[xh]=Izicwangciso zohlobo lwamagama
+Comment[zh_CN]=字体设置
+Comment[zh_TW]=字型設定
+Comment[zu]=Izilungiselelo Zohlobo lwamagama
+
+Keywords=fonts,font size,styles,charsets,character sets,panel,kicker,control panel,desktops,FileManager,Toolbars,Menu,Window Title,Title
+Keywords[ar]=fonts,font size,styles,charsets,character sets,panel,kicker,control panel,desktops,FileManager,Toolbars,Menu,Window Title,Title,خطوط,حجم الخط,لوحة التحكم,محارف,المحارف,أسطح المكتب,مدير الملفات,أشرطة الأدوات,قائمة,عنوان النافذة,عنوان
+Keywords[az]=yazı növləri,yazı böyüklüyü,tərz,hərf köməsi,panel,kicker,idarə masası,masa üstü,masa üstləri,Vasitə Çubuğu,Menyu,Pəncərə Başlığı,Başlıq
+Keywords[be]=шрыфты,памер шрыфту,стылі,знаказборы,знакавыя зборы,панэль,панэль кіравання,працоўныя сталы,працоўны стол,кіраўнік файлаў,панэлі начынняў,панэль начыння,меню,загаловак акна,загаловак,назва,fonts,font size,styles,charsets,character sets,panel,kicker,control panel,desktops,FileManager,Toolbars,Menu,Window Title,Title
+Keywords[bg]=шрифт, шрифтове, размер, символи, знаци, системен панел, fonts, font size, styles, charsets, character sets, panel, kicker, control panel, desktops, FileManager, Toolbars, Menu, Window Title, Title
+Keywords[ca]=lletres,mida de lletra,estils,jocs de caràcters,plafó,kicker,plafó de control,escriptoris,Gestor de fitxers,Barres d'eines,Menú,Títol de finestra,Títol
+Keywords[cs]=Písma,Velikost písem,Styly,Znaková sada,Panel,Kicker,Ovládací centrum,Plocha,Správce souborů,Nástrojová lišta,Nabídka,Titulek okna,Titulek
+Keywords[csb]=fòntë,miara fòntu,sztél,zestôw znaków,panel,kicker,panel sterowaniô,pùltë,biurka,menedżera lopków,lëstwë nôrzãdzów,menu,titel òkna,titel
+Keywords[cy]=ffontiau,maint ffontiau,arddulliau,setiau nodau,panel,ciciwr,rheolydd panel,penbyrddau,Rheolwr Ffeiliau,Barrau Offer,Dewislen,Teitl Ffenestr,Teitl
+Keywords[da]=skrifttyper,skriftstørrelse,stil,tegnsæt,panel,kicker,kontrolpanel,desktoppe,Filhåndtering,Værktøjslinje,Menu,Vinduestitel,Titel
+Keywords[de]=Schriftarten,Schriftgrößen,Zeichensätze,Kontrollleiste,Panel,Kicker,Stile,Dateimanager,Arbeitsflächen,Werkzeugleisten,Menüs,Fenstertitel,Titel
+Keywords[el]=γραμματοσειρές,μέγεθος γραμματοσειράς,στυλ,σύνολα χαρακτήρων,σύνολα χαρακτήρων,πίνακας,kicker,πίνακας ελέγχου,επιφάνειες εργασίας,Διαχειριστής αρχείων,Γραμμές εργαλείων,Μενού,Τίτλος παραθύρου,Τίτλος
+Keywords[eo]=tiparo,grandeco,stilo,signaro,panelo,lanĉilo,stirpanelo,tabuloj,dosieradministrilo,ilobretoj,menuo,fenestrotitolo,titolo
+Keywords[es]=tipos de letra,tamaño del tipo de letra,estilos,mapas de caracteres,panel,kicker,panel de control,escritorios,Gestor de archivos,Barras de herramientas,Menú,Título de la ventana,Título
+Keywords[et]=fondid,font,fondi suurus,stiil,kooditabel,paneel,kicker,juhtimiskeskus,töölauad,failihaldur,tööriistaribad,menüü,akna pealdis,pealdis
+Keywords[eu]=letra-tipoak,letra-tipoa,neurria,estiloak,karaktere-multzoak,karactere ezarpenak ,panela,kicker,kontrol panela,mahaigainak,Fitxategi kudeatzailea,Tresna-barrak, Menua,Leihoaren titulua,Titulua
+Keywords[fa]=قلمها، اندازۀ قلم، سبکها، نویسه‌گان، نویسه‌گان، تابلو، kicker، تابلوی کنترل، رومیزیها، مدیر پرونده، میله ابزارها، گزینگان، عنوان پنجره، عنوان
+Keywords[fi]=kirjasimet,kirjasin,kirjasimen koko,tyyli,merkistö,paneeli,kicker,ohjauspaneeli,työpöydät,Tiedostonhallinta,Työkalurivit,Valikko,Ikkunan otsikko,Otsikko
+Keywords[fr]=polices,police,taille de police,jeu de caractères,tableau de bord,kicker,bureau,bureaux,gestionnaire de fichiers,gestion de fichiers,barre d'outils,menu,titre de fenêtre,titre,fenêtre,barre de menus,barres de menus,barres d'outils
+Keywords[fy]=fonts,font,letters,lettertypen,lettertypes,tekenset,karakterferzamling,paniel,kicker,Konfiguraasjesintrum,styl,triembehearder,wurkbalke,menu,Finster,titel,finstertitel,desktops,buroblêden
+Keywords[ga]=clónna,clófhoirne,clómhéid,stíleanna,tacair charachtair,painéal,kicker,painéal rialaithe,deasca,Bainisteoir Comhad,Barraí Uirlisí,Roghchlár,Teideal Fuinneoige,Teideal
+Keywords[gl]=fontes,tamaño da fonte,estilos,codificación,conxunto de carácteres,painel,kicker,painel de control,escritórios,Xestor de Ficheiros,Barras de ferramentas,Menu,Título da Fiestra,Título
+Keywords[he]=לוח הבקרה,שולחנות עבודה,מנהל קבצים,סרגלי כלים,תפריט,כותרת, חלון,כותרת,גופנים,גודל גופן,סגנונות,מערכי תווים,לוח, fonts,font size,styles,charsets,character sets,panel,kicker,control panel,desktops,FileManager,Toolbars,Menu,Window Title,Title
+Keywords[hi]=फ़ॉन्ट्स, फ़ॉन्ट्स आकार,शैली,कैरसेट,कैरेक्टर सेट्स,फलक,किकर, नियंत्रण फलक,डेस्कटॉप,फ़ाइल प्रबंधक,औज़ार पट्टी,मेन्यू,विंडो शीर्षक,शीर्षक
+Keywords[hr]=fonts,font size,styles,charsets,character sets,panel,kicker,control panel,desktops,FileManager,Toolbars,Menu,Window Title,Title,fontovi,veličina fonta,stilovi,znakovi,ploča,radna površina,alatne trake,izbornik,naslov prozora,naslov,upravljanje datotekama
+Keywords[hu]=betűtípusok,betűméret,stílusok,karakterkészletek,panel,Kicker,vezérlőközpont,asztalok,fájlkezelő,eszköztár,menü,ablakcím,címsor
+Keywords[id]=fonts,font,ukuran font,gaya,charset,panel,kicker,panel kontroldesktops,FileManager,Toolbars,Menu,Window Title,Title
+Keywords[is]=letur,leturstærð,leturgerð,stafatafla,spjald,stillingar,spjald,kicker,gluggar,titill,titilrönd
+Keywords[it]=tipi di carattere,caratteri,dimensione carattere,stile,insieme di caratteri,pannello,kicker,pannello di controllo,desktop,file manager,barre degli strumenti,menu,finestre,titolo finestra,titolo
+Keywords[ja]=フォント,フォントサイズ,スタイル,文字セットパネル,kicker,コントロールパネル,デスクトップ,ファイルマネージャ,ツールバー,メニュー,ウィンドウタイトル,タイトル
+Keywords[ka]=ფონტები,ფონტების ზომა,სტილები,სიმბოლოების რუქა,სიმბოლოების რუქა,პანელი,kicker,კონტროლის პანელი,სამუშაო მაგიდები,ფაილის მენეჯერი,ინსტრუმენტთა პანელი,მენიუ,ფანჯრის სათაური,სათაური
+Keywords[km]=ពុម្ពអក្សរ,ទំហំ​ពុម្ពអក្សរ,រចនាប័ទ្ម,តួអក្សរ,សំណុំ​តួអក្សរ,បន្ទះ,kicker,ស្លាបព្រិល​បញ្ជា,ផ្ទៃតុ,កម្មវិធី​គ្រប់គ្រង​ឯកសារ,របារ​ឧបករណ៍,ម៉ឺនុយ,ចំណងជើង​បង្អួច,ចំណងជើង
+Keywords[lt]=fonts,šriftai,font size,šrifto dydis,styles,stiliai,charsets,kodavimas,koduotė,simbolių rinkinys,panel,pultas,kicker,control panel,Valdymo Centras,desktops,darbastaliai,FileManager,failų tvarkyklė,Toolbars,įrankinės,įrankių juostos,Menu,meniu,Window Title,Title,antraštė
+Keywords[lv]=fonti,fonta izmērs,stili,čārseti,simbolu komplekti,panelis,kikers,vadības panelis,darbvirsmas,FailuMenedžeris,Rīkjoslas,Izvēlne,Loga Titli,Titli
+Keywords[mk]=fonts,font size,styles,charsets,character sets,panel,kicker,control panel,desktops,FileManager,Toolbars,Menu,Window Title,Title,фонтови,големина на фонтови,стилови,знаковно множество,знаковни множества,панел,контролен панел,површини,лентасо алатки,алатки,Мени,Наслов на прозорец,Наслов
+Keywords[mn]=Бичгүүд,Бичгийн хэмжээ,Тэмдэгтүүд,Удирдах самбар,Самбар,Дамжуулагч,Хэлбэр,Файл удирдагч,Ажлын тавцан,Багаж самбар,Цэс,Цонхны толгой,Гарчиг
+Keywords[nb]=skrift,skrifttyper,skriftstørrelse,stil,tegnsett,panel,kicker,kontrollpanel,skrivebord,filbehandler,verktøylinjer,meny,vindustittel,tittel
+Keywords[nds]=Schriftoorden,Schriftgrött,Stilen,Tekensetten,Paneel,kicker,Kuntrullbalken,Schriefdischen,Dateimanager,Dateipleger,Warktüüchbalken,Menü,Finstertitel,Titel
+Keywords[nl]=fonts,font,letters,lettertypen,lettertypes,tekenset,tekenverzamelingen,paneel,kicker,configuratiecentrum,stijl,bestandsbeheerder,werkbalk,menu,venster,titel,venstertitel,desktops,bureaubladen
+Keywords[nn]=skrift,skrift,skriftstorleik,stil,teiknsett,panel,kicker,kontrollpanel,skrivebord,filhandsamar,verktøylinjer,meny,vindaugstittel,tittel
+Keywords[nso]=difonto,bogolo bja difonto,mokgwa,charsets,dipeakanyo tsa dihlaka, panel,seragi,panel ya taolo,di-desktop,Molaodi wa Faele,Di-bar tsa Dibereka,Menu, Sehlogo sa Window,Sehlogo
+Keywords[pa]=fonts,font size,styles,charsets,character sets,panel,kicker,control panel,desktops,FileManager,Toolbars,Menu,Window Title,Title,ਫੋਂਟ,ਫੋਂਟ ਅਕਾਰ,ਕੰਟਰੋਲ ਪੈਨਲ,ਵੇਹੜਾ,ਫਾਇਲ ਮੈਨੇਜਰ,ਮੇਨੂ,ਟਾਇਟਲ
+Keywords[pl]=czcionki,rozmiar czcionki,styl,zestaw znaków,panel,kicker,panel sterowania,pulpity,biurka,menedżer plików,paski narzędzi,menu,tytuł okna,tytuł
+Keywords[pt]=tipo de letra,tipos de letra,fontes,fonte,tamanho de fonte,estilo,mapa de caracteres,painel,kicker,painel de controlo,ecrãs,gestor de ficheiros,barras de ferramentas,menu,título da janela,título
+Keywords[pt_BR]=fontes,letras,tipos de letra,tamanho de fonte,tamanho de letra,estilo,conjunto de caracteres,painel,gerenciador de janelas,painel de controle,áreas de trabalho,Gerenciador de arquivos,barras de ferramentas,título da janela,título
+Keywords[ro]=fonturi,font,mărime,stil,set de caractere,panou,kicker,panou de control,ecrane,manager de fișiere,bară de unelte,meniu,titlu fereastră,titlu
+Keywords[rw]=Imyandikire,ingano y'imyandikire,imisusire,itsinda-nyuguti,amatsinday'inyuguti,umwanya,igitera,umwanya w'igenzura,ibiro,Mucungadosiye, Imyanyabikoresho,ibikubiyemo,Umutwe w'idirishya,Umutwe
+Keywords[se]=fonttat,fontasturrodat,stiila,charsets,character sets,panela,kicker,stivrenpanela, čállinbeavddit,fiilagieđahalli,neavvoholggat,fálut,lásenamahusat,namahus
+Keywords[sk]=písma,písmo,veľkosť písma,panel,ovládací panel,znakové sady,kódovanie,štýly,kicker,plochy,Správca súborov,Panely nástrojov,Ponuka,menu,titulok,titulok okna
+Keywords[sl]=pisava,pisave,velikost pisave,slog,stil,znakovni nabor,pult,kicker,nadzorna plošča,upravitelj datotek,upravitelj,orodna vrstica,naslov okna,naslov
+Keywords[sr]=fonts,фонт size,styles,charsets,character sets,панел,kicker,control панел,desktops,FileManager,Toolbars,Menu,Window Title,Title,стилови,мени,прозор,трака са алатима,менаџер фајлова,радна површина,скуп знакова
+Keywords[sr@Latn]=fonts,font size,styles,charsets,character sets,panel,kicker,control panel,desktops,FileManager,Toolbars,Menu,Window Title,Title,stilovi,meni,prozor,traka sa alatima,menadžer fajlova,radna površina,skup znakova
+Keywords[sv]=typsnitt,teckensnitt,typsnittstorlek,teckensnittstorlek,stil,teckenkodning,panel,kicker,kontrollpanel,inställningscentral,Filhanterare,Verktygsrader,Meny,Fönstertitel,Titel
+Keywords[ta]=எழுத்துருக்கள்,எழுத்துரு அளவு,பாணிகள்,எழுத்து அமைப்பு,எழுத்து அமைப்புகள்,பலகம்,கிக்கர்,கட்டுப்பாட்டு பலகம்,மேல்மேசைகள்,கோப்பு மேலாளர்,கருவிப்பட்டிகள்,பட்டியல்,சாளர தலைப்பு,தலைப்பு
+Keywords[th]=แบบอักษร,ขนาดแบบอักษร,ลักษณะ,ชุดรหัสอักขระ,ชุดอักขระ,พาเนล,คิกเกอร์,ถาดควบคุม,พื้นที่ทำงาน,จัดการแฟ้ม,แถบเครื่องมือ,เมนู,แถบหัวเรื่องหน้าต่าง,แถบหัวเรื่อง
+Keywords[tr]=yazıtipleri,yazı boyutu,stil,karakter kümesi,panel,kicker,denetim masası,masaüstü,masaüstleri,Araç Çubuğu,Menü,Pencere Başlığı,Başlık
+Keywords[uk]=шрифти,шрифт,розмір шрифту,стиль,набір символів,панель,kicker,панель керування,стільниці,панель інструментів,меню,заголовок вікна,заголовок
+Keywords[uz]=shriftlar,shriftning oʻlchami,uslublar,belgi toʻplami,kodlash usuli,panel,boshqaruv paneli,ish stollari,Fayl boshqaruvchisi,Asboblar paneli,Menyu,Oynaning sarlavhasi,Sarlavha
+Keywords[uz@cyrillic]=шрифтлар,шрифтнинг ўлчами,услублар,белги тўплами,кодлаш усули,панел,бошқарув панели,иш столлари,Файл бошқарувчиси,Асбоблар панели,Меню,Ойнанинг сарлавҳаси,Сарлавҳа
+Keywords[ven]=Dzifontu,saizi ya Fontu,Zwitaela,Tshasete,Mubvumbedzhwa,Phanele,Murahi,Phanele yau langula,desikithopo,Mulanguli wa faela,bara ya tshishumiswa,Menu,thoho ya windo,Thoho
+Keywords[vi]=Phông chữ,cỡ,kiểu,bảng mã,bộ ký tự,bảng,thanh đẩy,bảng điều khiển,màn hình nền,Trình quản lý Tập tin,Thanh công cụ,Thực đơn,Tên Cửa sổ,Tên
+Keywords[wa]=fonte,fontes,grandeu del fonte,stîle,miernowes,cråsses,clintcheyes,ecôdaedjes,djeu di caracteres,scriftôr,kicker,cinte di contrôle,scribannes,Manaedjeu di fitchîs,Bår d' usteyes,Menu,Dressêye,Tite do purnea,Bår di tite,Tite
+Keywords[xh]=ubungakanani bamagama,ubungakanani begama,iintlobo,iicharset,amaqela abasebenzi,iqela labantu benjongo ethile,umkhabi,iqela labantu abalawulayo benjongo ethile,desktops,Umphathi wefayile iibar zesixhobo,Menu,Umxholo we Window,Umxholo
+Keywords[zh_CN]=fonts,font size,styles,charsets,character sets,panel,kicker,control panel,desktops,FileManager,Toolbars,Menu,Window Title,Title,字体,字体大小,风格,字符集,面板,控制面板,桌面,文件管理器,工具条,菜单,窗口标题,标题
+Keywords[zh_TW]=fonts,font size,styles,charsets,character sets,panel,kicker,control panel,desktops,FileManager,Toolbars,Menu,Window Title,Title,字型,字型大小,風格,字元,字元集,面板,控制面板,桌面,檔案管理程式,工具列,選單,視窗標題,標題
+Keywords[zu]=Izinhlobo zamagama,uhlobo lwamagama,izitayela,charsets, amaqoqo ezaimpawu,kicker,lawula,iwindi lemininingwane,ama-desktop,Imenenja yefayela,amabha amathuluzi,Imenu,Isihloko se-Window,Isihloko
+
+Categories=Qt;KDE;X-KDE-settings-looknfeel;
diff --git a/kcontrol/fonts/fonts.h b/kcontrol/fonts/fonts.h
new file mode 100644
index 000000000..ca1ab7729
--- /dev/null
+++ b/kcontrol/fonts/fonts.h
@@ -0,0 +1,124 @@
+//-----------------------------------------------------------------------------
+//
+// kdisplay, fonts tab
+//
+// Copyright (c) Mark Donohoe 1997
+// Lars Knoll 1999
+
+#ifndef FONTS_H
+#define FONTS_H
+
+#include <qobject.h>
+
+#include <kcmodule.h>
+#include <kdialogbase.h>
+#include <kfontdialog.h>
+#include <kfontrequester.h>
+
+#include "kxftconfig.h"
+
+class QCheckBox;
+class QComboBox;
+class KDoubleNumInput;
+class FontAASettings;
+
+class FontUseItem : public KFontRequester
+{
+ Q_OBJECT
+
+public:
+ FontUseItem(QWidget * parent, const QString &name, const QString &grp,
+ const QString &key, const QString &rc, const QFont &default_fnt,
+ bool fixed = false);
+
+ void readFont( bool useDefaults );
+ void writeFont();
+ void setDefault();
+ void applyFontDiff(const QFont &fnt, int fontDiffFlags);
+
+ const QString& rcFile() { return _rcfile; }
+ const QString& rcGroup() { return _rcgroup; }
+ const QString& rcKey() { return _rckey; }
+
+private:
+ QString _rcfile;
+ QString _rcgroup;
+ QString _rckey;
+ QFont _default;
+};
+
+class FontAASettings : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+
+ FontAASettings(QWidget *parent);
+
+ bool save( bool useAA );
+ bool load();
+ bool load( bool useDefaults );
+ void defaults();
+ int getIndex(KXftConfig::SubPixel::Type spType);
+ KXftConfig::SubPixel::Type getSubPixelType();
+#ifdef HAVE_FONTCONFIG
+ int getIndex(KXftConfig::Hint::Style hStyle);
+ KXftConfig::Hint::Style getHintStyle();
+#endif
+ void enableWidgets();
+ int exec();
+
+protected slots:
+
+ void changed();
+
+private:
+
+ QCheckBox *excludeRange;
+ QCheckBox *useSubPixel;
+ KDoubleNumInput *excludeFrom;
+ KDoubleNumInput *excludeTo;
+ QComboBox *subPixelType;
+#ifdef HAVE_FONTCONFIG
+ QComboBox *hintingStyle;
+#endif
+ QLabel *excludeToLabel;
+ bool changesMade;
+};
+
+/**
+ * The Desktop/fonts tab in kcontrol.
+ */
+class KFonts : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KFonts(QWidget *parent, const char *name, const QStringList &);
+ ~KFonts();
+
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+
+protected slots:
+ void fontSelected();
+ void slotApplyFontDiff();
+ void slotUseAntiAliasing();
+ void slotCfgAa();
+
+private:
+ enum AASetting { AAEnabled, AASystem, AADisabled };
+ enum DPISetting { DPINone, DPI96, DPI120 };
+ AASetting useAA, useAA_original;
+ DPISetting dpi_original;
+ QComboBox *cbAA;
+ QComboBox* comboForceDpi;
+ QPushButton *aaSettingsButton;
+ QPtrList <FontUseItem> fontUseList;
+ FontAASettings *aaSettings;
+};
+
+#endif
+
diff --git a/kcontrol/fonts/kxftconfig.cpp b/kcontrol/fonts/kxftconfig.cpp
new file mode 100644
index 000000000..833e31118
--- /dev/null
+++ b/kcontrol/fonts/kxftconfig.cpp
@@ -0,0 +1,1544 @@
+/*
+ Copyright (c) 2002 Craig Drummond <craig@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "kxftconfig.h"
+#include <math.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <qregexp.h>
+#include <qfile.h>
+#include <qpaintdevice.h>
+#include <klocale.h>
+#include <klargefile.h>
+#include <qdir.h>
+#include <qsettings.h>
+#include <qfont.h>
+
+#ifdef HAVE_FONTCONFIG
+#include <stdarg.h>
+#include <stdio.h>
+#include <fontconfig/fontconfig.h>
+#include <kdebug.h>
+#endif
+
+using namespace std;
+
+QString KXftConfig::contractHome(QString path)
+{
+ if (!path.isEmpty() && '/'==path[0])
+ {
+ QString home(QDir::homeDirPath());
+
+ if(path.startsWith(home))
+ {
+ unsigned int len = home.length();
+
+ if(path.length() == len || path[len] == '/')
+ return path.replace(0, len, QString::fromLatin1("~"));
+ }
+ }
+
+ return path;
+}
+
+QString KXftConfig::expandHome(QString path)
+{
+ if(!path.isEmpty() && '~'==path[0])
+ return 1==path.length() ? QDir::homeDirPath() : path.replace(0, 1, QDir::homeDirPath());
+
+ return path;
+}
+
+static int point2Pixel(double point)
+{
+ return (int)(((point*QPaintDevice::x11AppDpiY())/72.0)+0.5);
+}
+
+static int pixel2Point(double pixel)
+{
+ return (int)(((pixel*72.0)/(double)QPaintDevice::x11AppDpiY())+0.5);
+}
+
+static bool equal(double d1, double d2)
+{
+ return (fabs(d1 - d2) < 0.0001);
+}
+
+static QString dirSyntax(const QString &d)
+{
+ if(!d.isNull())
+ {
+ QString ds(d);
+
+ ds.replace("//", "/");
+
+ int slashPos=ds.findRev('/');
+
+ if(slashPos!=(((int)ds.length())-1))
+ ds.append('/');
+
+ return ds;
+ }
+
+ return d;
+}
+
+static QString xDirSyntax(const QString &d)
+{
+ if(!d.isNull())
+ {
+ QString ds(d);
+ int slashPos=ds.findRev('/');
+
+ if(slashPos==(((int)ds.length())-1))
+ ds.remove(slashPos, 1);
+ return ds;
+ }
+
+ return d;
+}
+
+static bool check(const QString &path, unsigned int fmt, bool checkW=false)
+{
+ KDE_struct_stat info;
+ QCString pathC(QFile::encodeName(path));
+
+ return 0==KDE_lstat(pathC, &info) && (info.st_mode&S_IFMT)==fmt && (!checkW || 0==::access(pathC, W_OK));
+}
+
+inline bool fExists(const QString &p)
+{
+ return check(p, S_IFREG, false);
+}
+
+inline bool dWritable(const QString &p)
+{
+ return check(p, S_IFDIR, true);
+}
+
+inline bool dExists(const QString &p)
+{
+ return check(p, S_IFDIR, false);
+}
+
+static QString getDir(const QString &f)
+{
+ QString d(f);
+
+ int slashPos=d.findRev('/');
+
+ if(-1!=slashPos)
+ d.remove(slashPos+1, d.length());
+
+ return dirSyntax(d);
+}
+
+static time_t getTimeStamp(const QString &item)
+{
+ KDE_struct_stat info;
+
+ return !item.isNull() && 0==KDE_lstat(QFile::encodeName(item), &info) ? info.st_mtime : 0;
+}
+
+#ifdef HAVE_FONTCONFIG
+
+inline QString fileSyntax(const QString &f) { return xDirSyntax(f); }
+//
+// Obtain location of config file to use.
+//
+// For system, prefer the following:
+//
+// <...>/config.d/00kde.conf = preferred method from FontConfig >= 2.3
+// <...>/local.conf
+//
+// Non-system, prefer:
+//
+// $HOME/<...>/.fonts.conf
+// $HOME/<...>/fonts.conf
+//
+QString getConfigFile(bool system)
+{
+#if (FC_VERSION>=20300)
+ static const char * constKdeRootFcFile="00kde.conf";
+#endif
+
+ FcStrList *list=FcConfigGetConfigFiles(FcConfigGetCurrent());
+ QStringList files;
+ FcChar8 *file;
+ QString home(dirSyntax(QDir::homeDirPath()));
+
+ while((file=FcStrListNext(list)))
+ {
+ QString f((const char *)file);
+
+ if(fExists(f))
+ {
+ if(system || 0==fileSyntax(f).find(home)) // For nonsystem, only consider file within $HOME
+ files.append(f);
+ }
+#if (FC_VERSION>=20300)
+ if(system && dExists(f) && (-1!=f.find(QRegExp("/conf\\.d/?$")) || -1!=f.find(QRegExp("/conf\\.d?$"))) )
+ return dirSyntax(f)+constKdeRootFcFile; // This ones good enough for me!
+#endif
+ }
+
+ //
+ // Go through list of files, looking for the preferred one...
+ if(files.count())
+ {
+ QStringList::Iterator it(files.begin()),
+ end(files.end());
+
+ for(; it!=end; ++it)
+ if(-1!=(*it).find(QRegExp(system ? "/local\\.conf$" : "/\\.?fonts\\.conf$")))
+ return *it;
+ return files.front(); // Just return the 1st one...
+ }
+ else
+ return system ? "/etc/fonts/local.conf" : fileSyntax(home+"/.fonts.conf"); // Hmmm... no known files?
+}
+
+static QString getEntry(QDomElement element, const char *type, unsigned int numAttributes, ...)
+{
+ if(numAttributes==element.attributes().length())
+ {
+ va_list args;
+ unsigned int arg;
+ bool ok=true;
+
+ va_start(args, numAttributes);
+
+ for(arg=0; arg<numAttributes && ok; ++arg)
+ {
+ const char *attr=va_arg(args, const char *);
+ const char *val =va_arg(args, const char *);
+
+ if(!attr || !val || val!=element.attribute(attr))
+ ok=false;
+ }
+
+ va_end(args);
+
+ if(ok)
+ {
+ QDomNode n=element.firstChild();
+
+ if(!n.isNull())
+ {
+ QDomElement e = n.toElement();
+
+ if(!e.isNull() && type==e.tagName())
+ return e.text();
+ }
+ }
+ }
+
+ return QString::null;
+}
+
+static KXftConfig::SubPixel::Type strToType(const char *str)
+{
+ if(0==strcmp(str, "rgb"))
+ return KXftConfig::SubPixel::Rgb;
+ else if(0==strcmp(str, "bgr"))
+ return KXftConfig::SubPixel::Bgr;
+ else if(0==strcmp(str, "vrgb"))
+ return KXftConfig::SubPixel::Vrgb;
+ else if(0==strcmp(str, "vbgr"))
+ return KXftConfig::SubPixel::Vbgr;
+ else
+ return KXftConfig::SubPixel::None;
+}
+
+static KXftConfig::Hint::Style strToStyle(const char *str)
+{
+ if(0==strcmp(str, "hintslight"))
+ return KXftConfig::Hint::Slight;
+ else if(0==strcmp(str, "hintmedium"))
+ return KXftConfig::Hint::Medium;
+ else if(0==strcmp(str, "hintfull"))
+ return KXftConfig::Hint::Full;
+ else
+ return KXftConfig::Hint::None;
+}
+
+#else
+static bool strToType(const char *str, KXftConfig::SubPixel::Type &type)
+{
+ if(0==memcmp(str, "rgb", 3))
+ type=KXftConfig::SubPixel::Rgb;
+ else if(0==memcmp(str, "bgr", 3))
+ type=KXftConfig::SubPixel::Bgr;
+ else if(0==memcmp(str, "vrgb", 4))
+ type=KXftConfig::SubPixel::Vrgb;
+ else if(0==memcmp(str, "vbgr", 4))
+ type=KXftConfig::SubPixel::Vbgr;
+ else if(0==memcmp(str, "none", 4))
+ type=KXftConfig::SubPixel::None;
+ else
+ return false;
+ return true;
+}
+
+static inline bool isWhiteSpace(char c)
+{
+ return c==' ' || c=='\n' || c== '\t';
+}
+
+static bool ok(char *data, char *entry)
+{
+ char *e=entry;
+
+ for(;;)
+ {
+ e--;
+ if(e==data || *e=='\n')
+ return true;
+ else
+ if(!isWhiteSpace(*e))
+ return false;
+ }
+ return false;
+}
+
+static char * getKey(char *data, const char *key)
+{
+ char *entry,
+ *start=data;
+
+ while(start &&start && (entry=strstr(start, key)))
+ if(entry==data || ok(data, entry) && isWhiteSpace(entry[strlen(key)]))
+ return entry;
+ else
+ start=entry+strlen(key);
+
+ return NULL;
+}
+
+static bool skipToken(char **ptr, const char *token)
+{
+ while(isWhiteSpace(**ptr))
+ (*ptr)++;
+ if(0!=memcmp(*ptr, token, strlen(token)))
+ return false;
+ (*ptr)+=strlen(token);
+ return true;
+}
+
+static bool readNum(char **ptr, double *num)
+{
+ static const int constMaxNumLen=64;
+
+ char n[constMaxNumLen+1];
+ bool foundNum=false,
+ foundPoint=false,
+ foundE=false;
+ int numChars=0;
+
+ while(isWhiteSpace(**ptr))
+ (*ptr)++;
+
+ while(numChars<constMaxNumLen && (isdigit(**ptr) ||
+ ('.'==**ptr && foundNum && !foundPoint && !foundE) || ('e'==**ptr && foundNum && !foundE)))
+ {
+ n[numChars++]=**ptr;
+ if('.'==**ptr)
+ foundPoint=true;
+ else if('e'==**ptr)
+ foundE=true;
+ else
+ foundNum=true;
+ (*ptr)++;
+ }
+
+ if(numChars)
+ {
+ n[numChars]='\0';
+ *num=atof(n);
+ return true;
+ }
+
+ return false;
+}
+
+static KXftConfig::ListItem * getFirstItem(QPtrList<KXftConfig::ListItem> &list)
+{
+ KXftConfig::ListItem *cur;
+
+ for(cur=list.first(); cur; cur=list.next())
+ if(!cur->added())
+ return cur;
+ return NULL;
+}
+#endif
+
+static KXftConfig::ListItem * getLastItem(QPtrList<KXftConfig::ListItem> &list)
+{
+ KXftConfig::ListItem *cur;
+
+ for(cur=list.last(); cur; cur=list.prev())
+ if(!cur->added())
+ return cur;
+ return NULL;
+}
+
+#ifndef HAVE_FONTCONFIG
+static const QString defaultPath("/usr/X11R6/lib/X11/XftConfig");
+static const QString defaultUserFile(".xftconfig");
+static const char * constSymEnc="\"glyphs-fontspecific\"";
+
+static const QString constConfigFiles[]=
+{
+ defaultPath,
+
+ "/etc/X11/XftConfig",
+ QString::null
+};
+#endif
+
+KXftConfig::KXftConfig(int required, bool system)
+ : m_required(required),
+#ifdef HAVE_FONTCONFIG
+ m_doc("fontconfig"),
+#else
+ m_size(0),
+ m_data(NULL),
+#endif
+ m_system(system)
+{
+#ifdef HAVE_FONTCONFIG
+ m_file=getConfigFile(system);
+ kdDebug(1208) << "Using fontconfig file:" << m_file << endl;
+ m_antiAliasing = aliasingEnabled();
+#else
+ if(system)
+ {
+ int f;
+
+ for(f=0; !constConfigFiles[f].isNull(); ++f)
+ if(fExists(constConfigFiles[f]))
+ m_file=constConfigFiles[f];
+
+ if(m_file.isNull())
+ m_file=defaultPath;
+ }
+ else
+ m_file= QString(QDir::homeDirPath()+"/"+defaultUserFile);
+#endif
+#ifndef HAVE_FONTCONFIG
+ m_symbolFamilies.setAutoDelete(true);
+#endif
+ m_dirs.setAutoDelete(true);
+ reset();
+}
+
+KXftConfig::~KXftConfig()
+{
+#ifndef HAVE_FONTCONFIG
+ delete [] m_data;
+ m_data=NULL;
+#endif
+}
+
+bool KXftConfig::reset()
+{
+ bool ok=false;
+
+ m_madeChanges=false;
+#ifdef HAVE_FONTCONFIG
+ m_hint.reset();
+ m_hinting.reset();
+#else
+ m_symbolFamilies.clear();
+#endif
+ m_dirs.clear();
+ m_excludeRange.reset();
+ m_excludePixelRange.reset();
+ m_subPixel.reset();
+
+#ifdef HAVE_FONTCONFIG
+ QFile f(m_file);
+
+ if(f.open(IO_ReadOnly))
+ {
+ m_time=getTimeStamp(m_file);
+ ok=true;
+ m_doc.clear();
+
+ if(m_doc.setContent(&f))
+ readContents();
+ f.close();
+ }
+ else
+ ok=!fExists(m_file) && dWritable(getDir(m_file));
+
+ if(m_doc.documentElement().isNull())
+ m_doc.appendChild(m_doc.createElement("fontconfig"));
+#else
+ QFile f(m_file);
+
+ m_size=0;
+ delete [] m_data;
+ m_data=NULL;
+
+ if(f.open(IO_Raw|IO_ReadOnly))
+ {
+ m_time=getTimeStamp(m_file);
+ m_size=f.size();
+ ok=true;
+
+ if(m_size>0)
+ {
+ m_data=new char [m_size+1];
+
+ if(m_data)
+ {
+ f.readBlock(m_data, m_size);
+ m_data[m_size]='\0';
+ readContents();
+ }
+ }
+ f.close();
+ }
+ else
+ ok=!fExists(m_file) && dWritable(getDir(m_file));
+#endif
+
+ if(ok && m_required&ExcludeRange)
+ {
+ //
+ // Check exclude range values - i.e. size and pixel size...
+ if(!equal(0, m_excludeRange.from) || !equal(0, m_excludeRange.to)) // If "size" range is set, ensure "pixelsize" matches...
+ {
+ double pFrom=(double)point2Pixel(m_excludeRange.from),
+ pTo=(double)point2Pixel(m_excludeRange.to);
+
+ if(!equal(pFrom, m_excludePixelRange.from) || !equal(pTo, m_excludePixelRange.to))
+ {
+ m_excludePixelRange.from=pFrom;
+ m_excludePixelRange.to=pTo;
+ m_madeChanges=true;
+ apply();
+ }
+ }
+ else if(!equal(0, m_excludePixelRange.from) || !equal(0, m_excludePixelRange.to)) // "pixelsize" set, but not "size" !!!
+ {
+ m_excludeRange.from=(int)pixel2Point(m_excludePixelRange.from);
+ m_excludeRange.to=(int)pixel2Point(m_excludePixelRange.to);
+ m_madeChanges=true;
+ apply();
+ }
+ }
+
+ return ok;
+}
+
+bool KXftConfig::apply()
+{
+ bool ok=true;
+
+ if(m_madeChanges)
+ {
+ //
+ // Check if file has been written since we last read it. If it has, then re-read and add any
+ // of our changes...
+ if(fExists(m_file) && getTimeStamp(m_file)!=m_time)
+ {
+ KXftConfig newConfig(m_required, m_system);
+ QStringList list;
+ QStringList::Iterator it;
+
+ if(m_required&Dirs)
+ {
+ list=getDirs();
+ for(it=list.begin(); it!=list.end(); ++it)
+ newConfig.addDir(*it);
+ }
+
+ if(m_required&ExcludeRange)
+ newConfig.setExcludeRange(m_excludeRange.from, m_excludeRange.to);
+ if(m_required&SubPixelType)
+ newConfig.setSubPixelType(m_subPixel.type);
+#ifdef HAVE_FONTCONFIG
+ if(m_required&HintStyle)
+ newConfig.setHintStyle(m_hint.style);
+ if(m_required&AntiAlias)
+ newConfig.setAntiAliasing(m_antiAliasing.set);
+#else
+ if(m_required&SymbolFamilies)
+ {
+ list=getSymbolFamilies();
+ for(it=list.begin(); it!=list.end(); ++it)
+ newConfig.addSymbolFamily(*it);
+ }
+#endif
+
+ ok=newConfig.changed() ? newConfig.apply() : true;
+ if(ok)
+ reset();
+ else
+ m_time=getTimeStamp(m_file);
+ }
+ else
+ {
+ if(m_required&ExcludeRange)
+ {
+ // Ensure these are always equal...
+ m_excludePixelRange.from=(int)point2Pixel(m_excludeRange.from);
+ m_excludePixelRange.to=(int)point2Pixel(m_excludeRange.to);
+ }
+
+#ifdef HAVE_FONTCONFIG
+ FcAtomic *atomic=FcAtomicCreate((const unsigned char *)((const char *)(QFile::encodeName(m_file))));
+
+ ok=false;
+ if(atomic)
+ {
+ if(FcAtomicLock(atomic))
+ {
+ FILE *f=fopen((char *)FcAtomicNewFile(atomic), "w");
+
+ if(f)
+ {
+ if(m_required&Dirs)
+ {
+ applyDirs();
+ removeItems(m_dirs);
+ }
+ if(m_required&SubPixelType)
+ applySubPixelType();
+ if(m_required&HintStyle)
+ applyHintStyle();
+ if(m_required&AntiAlias)
+ applyAntiAliasing();
+ if(m_required&ExcludeRange)
+ {
+ applyExcludeRange(false);
+ applyExcludeRange(true);
+ }
+
+ //
+ // Check document syntax...
+ const char qtXmlHeader[] = "<?xml version = '1.0'?>";
+ const char xmlHeader[] = "<?xml version=\"1.0\"?>";
+ const char qtDocTypeLine[] = "<!DOCTYPE fontconfig>";
+ const char docTypeLine[] = "<!DOCTYPE fontconfig SYSTEM \"fonts.dtd\">";
+
+ QString str(m_doc.toString());
+ int idx;
+
+ if(0!=str.find("<?xml"))
+ str.insert(0, xmlHeader);
+ else if(0==str.find(qtXmlHeader))
+ str.replace(0, strlen(qtXmlHeader), xmlHeader);
+
+ if(-1!=(idx=str.find(qtDocTypeLine)))
+ str.replace(idx, strlen(qtDocTypeLine), docTypeLine);
+
+ //
+ // Write to file...
+ fputs(str.utf8(), f);
+ fclose(f);
+
+ if(FcAtomicReplaceOrig(atomic))
+ {
+ ok=true;
+ reset(); // Re-read contents..
+ }
+ else
+ FcAtomicDeleteNew(atomic);
+ }
+ FcAtomicUnlock(atomic);
+ }
+ FcAtomicDestroy(atomic);
+ }
+#else
+ std::ofstream f(QFile::encodeName(m_file));
+
+ if(f)
+ {
+ ListItem *ldi=m_required&Dirs ? getLastItem(m_dirs) : NULL,
+ *lfi=m_required&SymbolFamilies ? getLastItem(m_symbolFamilies) : NULL;
+ char *pos=m_data;
+ bool finished=false,
+ pixel=false;
+
+ while(!finished)
+ {
+ int type=0;
+ ListItem *fdi=NULL,
+ *ffi=NULL;
+ Item *first=NULL;
+
+ if(m_required&Dirs && NULL!=(fdi=getFirstItem(m_dirs)) && (NULL==first || fdi->start < first->start))
+ {
+ first=fdi;
+ type=Dirs;
+ }
+ if(m_required&SymbolFamilies && NULL!=(ffi=getFirstItem(m_symbolFamilies)) && (NULL==first || ffi->start < first->start))
+ {
+ first=ffi;
+ type=SymbolFamilies;
+ }
+ if(m_required&SubPixelType && NULL!=m_subPixel.start && (NULL==first || m_subPixel.start < first->start))
+ {
+ first=&m_subPixel;
+ type=SubPixelType;
+ }
+ if(m_required&ExcludeRange)
+ if(NULL!=m_excludeRange.start && (NULL==first || m_excludeRange.start < first->start))
+ {
+ first=&m_excludeRange;
+ type=ExcludeRange;
+ pixel=false;
+ }
+ else if(NULL!=m_excludePixelRange.start && (NULL==first || m_excludePixelRange.start < first->start))
+ {
+ first=&m_excludePixelRange;
+ type=ExcludeRange;
+ pixel=true;
+ }
+
+ if(first && first->start!=pos)
+ f.write(pos, first->start-pos);
+
+ if(0!=type)
+ pos=first->end+1;
+
+ switch(type)
+ {
+ case Dirs:
+ if(!first->toBeRemoved)
+ outputDir(f, fdi->str);
+ m_dirs.remove(fdi);
+ if(fdi==ldi)
+ outputNewDirs(f);
+ break;
+ case SymbolFamilies:
+ if(!first->toBeRemoved)
+ outputSymbolFamily(f, ffi->str);
+ m_symbolFamilies.remove(ffi);
+ if(ffi==lfi)
+ outputNewSymbolFamilies(f);
+ break;
+ case SubPixelType:
+ if(!first->toBeRemoved)
+ outputSubPixelType(f, false);
+ m_subPixel.start=NULL;
+ break;
+ case ExcludeRange:
+ if(!first->toBeRemoved)
+ outputExcludeRange(f, false, pixel);
+ m_excludeRange.start=NULL;
+ break;
+ case 0: // 0 => All read in entries written...
+ if(m_size && (pos < m_data+m_size))
+ f.write(pos, (m_data+m_size)-pos);
+ default:
+ finished=true;
+ break;
+ }
+ };
+
+ outputNewDirs(f);
+ outputNewSymbolFamilies(f);
+ outputSubPixelType(f, true);
+ outputExcludeRange(f, true, false);
+ outputExcludeRange(f, true, true);
+ f.close();
+ reset(); // Re-read contents...
+ }
+ else
+ ok=false;
+#endif
+ }
+ }
+
+ return ok;
+}
+
+bool KXftConfig::getSubPixelType(SubPixel::Type &type)
+{
+ type=m_subPixel.type;
+ return SubPixel::None!=m_subPixel.type;
+}
+
+void KXftConfig::setSubPixelType(SubPixel::Type type)
+{
+ if(type!=m_subPixel.type)
+ {
+ m_subPixel.type=type;
+ m_madeChanges=true;
+ }
+}
+
+#ifdef HAVE_FONTCONFIG
+bool KXftConfig::getHintStyle(Hint::Style &style)
+{
+ if(Hint::NotSet!=m_hint.style && !m_hint.toBeRemoved)
+ {
+ style=m_hint.style;
+ return true;
+ }
+ else
+ return false;
+}
+
+void KXftConfig::setHintStyle(Hint::Style style)
+{
+ if((Hint::NotSet==style && Hint::NotSet!=m_hint.style && !m_hint.toBeRemoved) ||
+ (Hint::NotSet!=style && (style!=m_hint.style || m_hint.toBeRemoved)) )
+ {
+ m_hint.toBeRemoved=(Hint::NotSet==style);
+ m_hint.style=style;
+ m_madeChanges=true;
+ }
+
+ if(Hint::NotSet!=style)
+ setHinting(Hint::None!=m_hint.style);
+}
+
+void KXftConfig::setHinting(bool set)
+{
+ if(set!=m_hinting.set)
+ {
+ m_hinting.set=set;
+ m_madeChanges=true;
+ }
+}
+#endif
+
+bool KXftConfig::getExcludeRange(double &from, double &to)
+{
+ if(!equal(0, m_excludeRange.from) || !equal(0,m_excludeRange.to))
+ {
+ from=m_excludeRange.from;
+ to=m_excludeRange.to;
+ return true;
+ }
+ else
+ return false;
+}
+
+
+void KXftConfig::setExcludeRange(double from, double to)
+{
+ double f=from<to ? from : to,
+ t=from<to ? to : from;
+
+ if(!equal(f, m_excludeRange.from) || !equal(t,m_excludeRange.to))
+ {
+ m_excludeRange.from=f;
+ m_excludeRange.to=t;
+ m_madeChanges=true;
+ }
+}
+
+void KXftConfig::addDir(const QString &d)
+{
+ QString dir(dirSyntax(d));
+
+ if(dExists(dir) && !hasDir(dir))
+ addItem(m_dirs, dir);
+}
+
+void KXftConfig::removeDir(const QString &d)
+{
+ QString dir(dirSyntax(d));
+
+ removeItem(m_dirs, dir);
+}
+
+QString KXftConfig::description(SubPixel::Type t)
+{
+ switch(t)
+ {
+ default:
+ case SubPixel::None:
+ return i18n("None");
+ case SubPixel::Rgb:
+ return i18n("RGB");
+ case SubPixel::Bgr:
+ return i18n("BGR");
+ case SubPixel::Vrgb:
+ return i18n("Vertical RGB");
+ case SubPixel::Vbgr:
+ return i18n("Vertical BGR");
+ }
+}
+
+const char * KXftConfig::toStr(SubPixel::Type t)
+{
+ switch(t)
+ {
+ default:
+ case SubPixel::None:
+ return "none";
+ case SubPixel::Rgb:
+ return "rgb";
+ case SubPixel::Bgr:
+ return "bgr";
+ case SubPixel::Vrgb:
+ return "vrgb";
+ case SubPixel::Vbgr:
+ return "vbgr";
+ }
+}
+
+#ifdef HAVE_FONTCONFIG
+QString KXftConfig::description(Hint::Style s)
+{
+ switch(s)
+ {
+ default:
+ case Hint::Medium:
+ return i18n("Medium");
+ case Hint::NotSet:
+ return "";
+ case Hint::None:
+ return i18n("None");
+ case Hint::Slight:
+ return i18n("Slight");
+ case Hint::Full:
+ return i18n("Full");
+ }
+}
+
+const char * KXftConfig::toStr(Hint::Style s)
+{
+ switch(s)
+ {
+ default:
+ case Hint::Medium:
+ return "hintmedium";
+ case Hint::None:
+ return "hintnone";
+ case Hint::Slight:
+ return "hintslight";
+ case Hint::Full:
+ return "hintfull";
+ }
+}
+#endif
+
+bool KXftConfig::hasDir(const QString &d)
+{
+ QString dir(dirSyntax(d));
+
+#ifdef HAVE_FONTCONFIG
+ ListItem *item;
+
+ for(item=m_dirs.first(); item; item=m_dirs.next())
+ if(0==dir.find(item->str))
+ return true;
+
+ return false;
+#else
+ return NULL!=findItem(m_dirs, dir);
+#endif
+}
+
+KXftConfig::ListItem * KXftConfig::findItem(QPtrList<ListItem> &list, const QString &i)
+{
+ ListItem *item;
+
+ for(item=list.first(); item; item=list.next())
+ if(item->str==i)
+ break;
+
+ return item;
+}
+
+void KXftConfig::clearList(QPtrList<ListItem> &list)
+{
+ ListItem *item;
+
+ for(item=list.first(); item; item=list.next())
+ removeItem(list, item);
+}
+
+QStringList KXftConfig::getList(QPtrList<ListItem> &list)
+{
+ QStringList res;
+ ListItem *item;
+
+ for(item=list.first(); item; item=list.next())
+ if(!item->toBeRemoved)
+ res.append(item->str);
+
+ return res;
+}
+
+void KXftConfig::addItem(QPtrList<ListItem> &list, const QString &i)
+{
+ ListItem *item=findItem(list, i);
+
+ if(!item)
+ {
+ list.append(new ListItem(i
+#ifndef HAVE_FONTCONFIG
+ , NULL, NULL
+#endif
+ ));
+ m_madeChanges=true;
+ }
+ else
+ item->toBeRemoved=false;
+}
+
+void KXftConfig::removeItem(QPtrList<ListItem> &list, ListItem *item)
+{
+ if(item)
+ {
+ if(item->added())
+ list.remove(item);
+ else
+ item->toBeRemoved=true;
+ m_madeChanges=true;
+ }
+}
+
+void KXftConfig::readContents()
+{
+#ifdef HAVE_FONTCONFIG
+ QDomNode n = m_doc.documentElement().firstChild();
+
+ while(!n.isNull())
+ {
+ QDomElement e = n.toElement();
+
+ if(!e.isNull())
+ if("dir"==e.tagName())
+ {
+ if(m_required&Dirs)
+ m_dirs.append(new ListItem(expandHome(dirSyntax(e.text())), n));
+ }
+ else if("match"==e.tagName())
+ {
+ QString str;
+
+ switch(e.childNodes().count())
+ {
+ case 1:
+ if(m_required&SubPixelType && "font"==e.attribute("target"))
+ {
+ QDomElement ene=e.firstChild().toElement();
+
+ if(!ene.isNull() && "edit"==ene.tagName())
+ if(!(str=getEntry(ene, "const", 2, "name", "rgba", "mode", "assign")).isNull())
+ {
+ m_subPixel.node=n;
+ m_subPixel.type=strToType(str.latin1());
+ }
+ else if(!(str=getEntry(ene, "const", 2, "name", "hintstyle", "mode", "assign")).isNull())
+ {
+ m_hint.node=n;
+ m_hint.style=strToStyle(str.latin1());
+ }
+ else if(!(str=getEntry(ene, "bool", 2, "name", "hinting", "mode", "assign")).isNull())
+ {
+ m_hinting.node=n;
+ m_hinting.set=str.lower()!="false";
+ }
+ else if(!(str=getEntry(ene, "bool", 2, "name", "antialias", "mode", "assign")).isNull())
+ {
+ m_antiAliasing.node=n;
+ m_antiAliasing.set=str.lower()!="false";
+ }
+ }
+ break;
+ case 3:
+ if(m_required&ExcludeRange && "font"==e.attribute("target")) // CPD: Is target "font" or "pattern" ????
+ {
+ bool foundFalse=false;
+ QDomNode en=e.firstChild();
+ QString family;
+ double from=-1.0,
+ to=-1.0,
+ pixelFrom=-1.0,
+ pixelTo=-1.0;
+
+ while(!en.isNull())
+ {
+ QDomElement ene=en.toElement();
+
+ if(!ene.isNull())
+ if("test"==ene.tagName())
+ {
+ // kcmfonts used to write incorrectly more or less instead of more_eq and less_eq, so read both,
+ // first the old (wrong) one then the right one
+ if(!(str=getEntry(ene, "double", 3, "qual", "any", "name", "size", "compare", "more")).isNull())
+ from=str.toDouble();
+ if(!(str=getEntry(ene, "double", 3, "qual", "any", "name", "size", "compare", "more_eq")).isNull())
+ from=str.toDouble();
+ if(!(str=getEntry(ene, "double", 3, "qual", "any", "name", "size", "compare", "less")).isNull())
+ to=str.toDouble();
+ if(!(str=getEntry(ene, "double", 3, "qual", "any", "name", "size", "compare", "less_eq")).isNull())
+ to=str.toDouble();
+ if(!(str=getEntry(ene, "double", 3, "qual", "any", "name", "pixelsize", "compare", "more")).isNull())
+ pixelFrom=str.toDouble();
+ if(!(str=getEntry(ene, "double", 3, "qual", "any", "name", "pixelsize", "compare", "more_eq")).isNull())
+ pixelFrom=str.toDouble();
+ if(!(str=getEntry(ene, "double", 3, "qual", "any", "name", "pixelsize", "compare", "less")).isNull())
+ pixelTo=str.toDouble();
+ if(!(str=getEntry(ene, "double", 3, "qual", "any", "name", "pixelsize", "compare", "less_eq")).isNull())
+ pixelTo=str.toDouble();
+ }
+ else if("edit"==ene.tagName() && "false"==getEntry(ene, "bool", 2, "name", "antialias", "mode", "assign"))
+ foundFalse=true;
+
+ en=en.nextSibling();
+ }
+
+ if((from>=0 || to>=0) && foundFalse)
+ {
+ m_excludeRange.from=from < to ? from : to;
+ m_excludeRange.to =from < to ? to : from;
+ m_excludeRange.node=n;
+ }
+ else if((pixelFrom>=0 || pixelTo>=0) && foundFalse)
+ {
+ m_excludePixelRange.from=pixelFrom < pixelTo ? pixelFrom : pixelTo;
+ m_excludePixelRange.to =pixelFrom < pixelTo ? pixelTo : pixelFrom;
+ m_excludePixelRange.node=n;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ n=n.nextSibling();
+ }
+#else
+ static const int constMaxDataLen=2048;
+
+ char *from=NULL,
+ *ptr=m_data,
+ *eostr=NULL,
+ data[constMaxDataLen];
+
+ if(m_required&Dirs)
+ while((ptr=getKey(ptr, "dir")))
+ {
+ from=ptr;
+ ptr+=4;
+ while(isWhiteSpace(*ptr))
+ ptr++;
+
+ if(*ptr=='\"')
+ {
+ ptr++;
+ if(NULL!=(eostr=strchr(ptr, '\"')) && eostr-ptr<constMaxDataLen)
+ {
+ memcpy(data, ptr, eostr-ptr);
+ data[eostr-ptr]='\0';
+ if(NULL==strchr(data, '\n'))
+ {
+ ptr=eostr+1;
+
+ while(*ptr!='\n' && *ptr!='\0' && isWhiteSpace(*ptr))
+ ptr++;
+ m_dirs.append(new ListItem(expandHome(dirSyntax(data)), from, ptr));
+ }
+ }
+ }
+ }
+
+ if(m_required&SymbolFamilies || m_required&SubPixelType || m_required&ExcludeRange)
+ {
+ double efrom,
+ eto;
+
+ ptr=m_data;
+
+ while((ptr=getKey(ptr, "match")))
+ {
+ from=ptr;
+ ptr+=6;
+ if((m_required&SymbolFamilies || m_required&ExcludeRange) && skipToken(&ptr, "any"))
+ {
+ if(m_required&SymbolFamilies && skipToken(&ptr, "family") && skipToken(&ptr, "=="))
+ {
+ while(isWhiteSpace(*ptr))
+ ptr++;
+ if(*ptr=='\"')
+ {
+ ptr++;
+ if(NULL!=(eostr=strchr(ptr, '\"')) && eostr-ptr<constMaxDataLen)
+ {
+ memcpy(data, ptr, eostr-ptr);
+ data[eostr-ptr]='\0';
+ if(NULL==strchr(data, '\n'))
+ {
+ ptr=eostr+1;
+
+ if(skipToken(&ptr, "edit") && skipToken(&ptr, "encoding") && skipToken(&ptr, "=") &&
+ skipToken(&ptr, constSymEnc) && skipToken(&ptr, ";"))
+ {
+ while(*ptr!='\n' && *ptr!='\0' && isWhiteSpace(*ptr))
+ ptr++;
+
+ m_symbolFamilies.append(new ListItem(data, from, ptr));
+ }
+ }
+ }
+ }
+ }
+ else if(m_required&ExcludeRange && skipToken(&ptr, "size") && (skipToken(&ptr, ">")||skipToken(&ptr, "<")) &&
+ readNum(&ptr, &efrom) && skipToken(&ptr, "any") && skipToken(&ptr, "size") &&
+ (skipToken(&ptr, "<")||skipToken(&ptr, ">")) && readNum(&ptr, &eto) && skipToken(&ptr, "edit") &&
+ skipToken(&ptr, "antialias") && skipToken(&ptr, "=") && skipToken(&ptr, "false") && skipToken(&ptr, ";"))
+ {
+ while(*ptr!='\n' && *ptr!='\0' && isWhiteSpace(*ptr))
+ ptr++;
+ m_excludeRange.from=efrom<eto ? efrom : eto;
+ m_excludeRange.to=efrom<eto ? eto : efrom;
+ m_excludeRange.start=from;
+ m_excludeRange.end=ptr;
+ }
+ else if(m_required&ExcludeRange && skipToken(&ptr, "pixelsize") && (skipToken(&ptr, ">")||skipToken(&ptr, "<")) &&
+ readNum(&ptr, &efrom) && skipToken(&ptr, "any") && skipToken(&ptr, "pixelsize") &&
+ (skipToken(&ptr, "<")||skipToken(&ptr, ">")) && readNum(&ptr, &eto) && skipToken(&ptr, "edit") &&
+ skipToken(&ptr, "antialias") && skipToken(&ptr, "=") && skipToken(&ptr, "false") && skipToken(&ptr, ";"))
+ {
+ while(*ptr!='\n' && *ptr!='\0' && isWhiteSpace(*ptr))
+ ptr++;
+ m_excludePixelRange.from=efrom<eto ? efrom : eto;
+ m_excludePixelRange.to=efrom<eto ? eto : efrom;
+ m_excludePixelRange.start=from;
+ m_excludePixelRange.end=ptr;
+ }
+ }
+ else if(m_required&SubPixelType && skipToken(&ptr, "edit") && skipToken(&ptr, "rgba") && skipToken(&ptr, "="))
+ {
+ SubPixel::Type type=SubPixel::None;
+
+ while(isWhiteSpace(*ptr))
+ ptr++;
+
+ if(!strToType(ptr, type))
+ continue;
+
+ ptr+=SubPixel::Rgb==type || SubPixel::Bgr==type ? 3 : 4;
+
+ if(skipToken(&ptr, ";"))
+ {
+ while(*ptr!='\n' && *ptr!='\0' && isWhiteSpace(*ptr))
+ ptr++;
+ m_subPixel.type=type;
+ m_subPixel.start=from;
+ m_subPixel.end=ptr;
+ }
+ }
+ }
+ }
+#endif
+}
+
+#ifdef HAVE_FONTCONFIG
+void KXftConfig::applyDirs()
+{
+ ListItem *item,
+ *last=getLastItem(m_dirs);
+
+ for(item=m_dirs.first(); item; item=m_dirs.next())
+ if(!item->toBeRemoved && item->node.isNull())
+ {
+ QDomElement newNode = m_doc.createElement("dir");
+ QDomText text = m_doc.createTextNode(contractHome(xDirSyntax(item->str)));
+
+ newNode.appendChild(text);
+
+ if(last)
+ m_doc.documentElement().insertAfter(newNode, last->node);
+ else
+ m_doc.documentElement().appendChild(newNode);
+ }
+}
+
+void KXftConfig::applySubPixelType()
+{
+ QDomElement matchNode = m_doc.createElement("match"),
+ typeNode = m_doc.createElement("const"),
+ editNode = m_doc.createElement("edit");
+ QDomText typeText = m_doc.createTextNode(toStr(m_subPixel.type));
+
+ matchNode.setAttribute("target", "font");
+ editNode.setAttribute("mode", "assign");
+ editNode.setAttribute("name", "rgba");
+ editNode.appendChild(typeNode);
+ typeNode.appendChild(typeText);
+ matchNode.appendChild(editNode);
+ if(m_subPixel.node.isNull())
+ m_doc.documentElement().appendChild(matchNode);
+ else
+ m_doc.documentElement().replaceChild(matchNode, m_subPixel.node);
+ m_subPixel.node=matchNode;
+}
+
+void KXftConfig::applyHintStyle()
+{
+ applyHinting();
+
+ if(Hint::NotSet==m_hint.style || m_hint.toBeRemoved)
+ {
+ if(!m_hint.node.isNull())
+ {
+ m_doc.documentElement().removeChild(m_hint.node);
+ m_hint.node.clear();
+ }
+ }
+ else
+ {
+ QDomElement matchNode = m_doc.createElement("match"),
+ typeNode = m_doc.createElement("const"),
+ editNode = m_doc.createElement("edit");
+ QDomText typeText = m_doc.createTextNode(toStr(m_hint.style));
+
+ matchNode.setAttribute("target", "font");
+ editNode.setAttribute("mode", "assign");
+ editNode.setAttribute("name", "hintstyle");
+ editNode.appendChild(typeNode);
+ typeNode.appendChild(typeText);
+ matchNode.appendChild(editNode);
+ if(m_hint.node.isNull())
+ m_doc.documentElement().appendChild(matchNode);
+ else
+ m_doc.documentElement().replaceChild(matchNode, m_hint.node);
+ m_hint.node=matchNode;
+ }
+}
+
+void KXftConfig::applyHinting()
+{
+ QDomElement matchNode = m_doc.createElement("match"),
+ typeNode = m_doc.createElement("bool"),
+ editNode = m_doc.createElement("edit");
+ QDomText typeText = m_doc.createTextNode(m_hinting.set ? "true" : "false");
+
+ matchNode.setAttribute("target", "font");
+ editNode.setAttribute("mode", "assign");
+ editNode.setAttribute("name", "hinting");
+ editNode.appendChild(typeNode);
+ typeNode.appendChild(typeText);
+ matchNode.appendChild(editNode);
+ if(m_hinting.node.isNull())
+ m_doc.documentElement().appendChild(matchNode);
+ else
+ m_doc.documentElement().replaceChild(matchNode, m_hinting.node);
+ m_hinting.node=matchNode;
+}
+
+void KXftConfig::applyExcludeRange(bool pixel)
+{
+ Exclude &range=pixel ? m_excludePixelRange : m_excludeRange;
+
+ if(equal(range.from, 0) && equal(range.to, 0))
+ {
+ if(!range.node.isNull())
+ {
+ m_doc.documentElement().removeChild(range.node);
+ range.node.clear();
+ }
+ }
+ else
+ {
+ QString fromString,
+ toString;
+
+ fromString.setNum(range.from);
+ toString.setNum(range.to);
+
+ QDomElement matchNode = m_doc.createElement("match"),
+ fromTestNode = m_doc.createElement("test"),
+ fromNode = m_doc.createElement("double"),
+ toTestNode = m_doc.createElement("test"),
+ toNode = m_doc.createElement("double"),
+ editNode = m_doc.createElement("edit"),
+ boolNode = m_doc.createElement("bool");
+ QDomText fromText = m_doc.createTextNode(fromString),
+ toText = m_doc.createTextNode(toString),
+ boolText = m_doc.createTextNode("false");
+
+ matchNode.setAttribute("target", "font"); // CPD: Is target "font" or "pattern" ????
+ fromTestNode.setAttribute("qual", "any");
+ fromTestNode.setAttribute("name", pixel ? "pixelsize" : "size");
+ fromTestNode.setAttribute("compare", "more_eq");
+ fromTestNode.appendChild(fromNode);
+ fromNode.appendChild(fromText);
+ toTestNode.setAttribute("qual", "any");
+ toTestNode.setAttribute("name", pixel ? "pixelsize" : "size");
+ toTestNode.setAttribute("compare", "less_eq");
+ toTestNode.appendChild(toNode);
+ toNode.appendChild(toText);
+ editNode.setAttribute("mode", "assign");
+ editNode.setAttribute("name", "antialias");
+ editNode.appendChild(boolNode);
+ boolNode.appendChild(boolText);
+ matchNode.appendChild(fromTestNode);
+ matchNode.appendChild(toTestNode);
+ matchNode.appendChild(editNode);
+
+ if(!m_antiAliasing.node.isNull())
+ m_doc.documentElement().removeChild(range.node);
+ m_doc.documentElement().appendChild(matchNode);
+ range.node=matchNode;
+ }
+}
+
+void KXftConfig::removeItems(QPtrList<ListItem> &list)
+{
+ ListItem *item;
+ QDomElement docElem = m_doc.documentElement();
+
+ for(item=list.first(); item; item=list.next())
+ if(item->toBeRemoved && !item->node.isNull())
+ docElem.removeChild(item->node);
+}
+#else
+void KXftConfig::outputDir(std::ofstream &f, const QString &str)
+{
+ f << "dir \"" << contractHome(xDirSyntax(str)).local8Bit() << "\"" << endl;
+}
+
+void KXftConfig::outputNewDirs(std::ofstream &f)
+{
+ ListItem *item;
+
+ for(item=m_dirs.first(); item; item=m_dirs.next())
+ if(!item->toBeRemoved && NULL==item->start)
+ outputDir(f, item->str);
+ m_dirs.clear();
+}
+
+void KXftConfig::outputSymbolFamily(std::ofstream &f, const QString &str)
+{
+ f << "match any family == \"" << str.local8Bit() << "\" edit encoding = " << constSymEnc << ';' << endl;
+}
+
+void KXftConfig::outputNewSymbolFamilies(std::ofstream &f)
+{
+ ListItem *item;
+
+ for(item=m_symbolFamilies.first(); item; item=m_symbolFamilies.next())
+ if(!item->toBeRemoved && NULL==item->start)
+ outputSymbolFamily(f, item->str);
+ m_symbolFamilies.clear();
+}
+
+void KXftConfig::outputSubPixelType(std::ofstream &f, bool ifNew)
+{
+ if((ifNew && NULL==m_subPixel.end) || (!ifNew && NULL!=m_subPixel.end))
+ f << "match edit rgba = " << toStr(m_subPixel.type) << ';' << endl;
+}
+
+void KXftConfig::outputExcludeRange(std::ofstream &f, bool ifNew, bool pixel)
+{
+ Exclude &range=pixel ? m_excludePixelRange : m_excludeRange;
+
+ if(((ifNew && NULL==range.end) || (!ifNew && NULL!=range.end)) &&
+ (!equal(range.from,0) || !equal(range.to,0)))
+ {
+ if(pixel)
+ f << "match any pixelsize > ";
+ else
+ f << "match any size > ";
+
+ f << range.from;
+ if(pixel)
+ f << " any pixelsize < ";
+ else
+ f << " any size < ";
+ f << range.to << " edit antialias = false;" << endl;
+}
+}
+
+#endif
+
+#ifdef HAVE_FONTCONFIG
+bool KXftConfig::getAntiAliasing() const
+{
+ return m_antiAliasing.set;
+}
+
+void KXftConfig::setAntiAliasing( bool set )
+{
+ if ((set && !m_antiAliasing.set) || (!set && m_antiAliasing.set))
+ {
+ m_antiAliasing.set = set;
+ m_madeChanges = true;
+ }
+}
+
+void KXftConfig::applyAntiAliasing()
+{
+ QDomElement matchNode = m_doc.createElement("match"),
+ typeNode = m_doc.createElement("bool"),
+ editNode = m_doc.createElement("edit");
+ QDomText typeText = m_doc.createTextNode(m_antiAliasing.set ? "true" : "false");
+
+ matchNode.setAttribute("target", "font");
+ editNode.setAttribute("mode", "assign");
+ editNode.setAttribute("name", "antialias");
+ editNode.appendChild(typeNode);
+ typeNode.appendChild(typeText);
+ matchNode.appendChild(editNode);
+ if(!m_antiAliasing.node.isNull())
+ m_doc.documentElement().removeChild(m_antiAliasing.node);
+ m_doc.documentElement().appendChild(matchNode);
+ m_antiAliasing.node=matchNode;
+}
+
+// KXftConfig only parses one config file, user's .fonts.conf usually.
+// If that one doesn't exist, then KXftConfig doesn't know if antialiasing
+// is enabled or not. So try to find out the default value from the default font.
+// Maybe there's a better way *shrug*.
+bool KXftConfig::aliasingEnabled()
+{
+ FcPattern *pattern = FcPatternCreate();
+ FcConfigSubstitute(0, pattern, FcMatchPattern);
+ FcDefaultSubstitute(pattern);
+ FcResult result;
+ FcPattern *f = FcFontMatch( 0, pattern, &result );
+ FcBool antialiased = FcTrue;
+ FcPatternGetBool( f, FC_ANTIALIAS, 0, &antialiased );
+ FcPatternDestroy( f );
+ FcPatternDestroy( pattern );
+ return antialiased == FcTrue;
+}
+
+#else
+
+void KXftConfig::setAntiAliasing( bool set )
+{
+ QSettings().writeEntry("/qt/useXft", set);
+ if (set)
+ QSettings().writeEntry("/qt/enableXft", set);
+}
+
+bool KXftConfig::getAntiAliasing() const
+{
+ return QSettings().readBoolEntry("/qt/useXft");
+}
+
+
+#endif
diff --git a/kcontrol/fonts/kxftconfig.h b/kcontrol/fonts/kxftconfig.h
new file mode 100644
index 000000000..6828f1d88
--- /dev/null
+++ b/kcontrol/fonts/kxftconfig.h
@@ -0,0 +1,277 @@
+#ifndef __KXFTCONFIG_H__
+#define __KXFTCONFIG_H__
+
+/*
+ Copyright (c) 2002 Craig Drummond <craig@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <qstringlist.h>
+#include <qstring.h>
+#include <qptrlist.h>
+#include <stdio.h>
+#include <fstream>
+#include <time.h>
+
+#ifdef HAVE_FONTCONFIG
+#include <qdom.h>
+#endif
+
+class KXftConfig
+{
+ public:
+
+ enum RequiredData
+ {
+ Dirs = 0x01,
+ SubPixelType = 0x02,
+ ExcludeRange = 0x04,
+ AntiAlias = 0x08,
+#ifdef HAVE_FONTCONFIG
+ HintStyle = 0x10
+#else
+ SymbolFamilies = 0x10
+#endif
+ };
+
+#ifdef HAVE_FONTCONFIG
+ static const int constStyleSettings=SubPixelType|ExcludeRange|AntiAlias|HintStyle;
+#else
+ static const int constStyleSettings=SubPixelType|ExcludeRange|AntiAlias|SymbolFamilies;
+#endif
+
+ struct Item
+ {
+#ifdef HAVE_FONTCONFIG
+ Item(QDomNode &n) : node(n), toBeRemoved(false) {}
+ Item() : toBeRemoved(false) {}
+ virtual void reset() { node.clear(); toBeRemoved=false; }
+ bool added() { return node.isNull(); }
+
+ QDomNode node;
+#else
+ Item(char *s, char *e) : start(s), end(e), toBeRemoved(false) {}
+ virtual void reset() { start=end=NULL; toBeRemoved=false; }
+ bool added() { return NULL==start; }
+
+ char *start,
+ *end;
+#endif
+ virtual ~Item() {};
+ bool toBeRemoved;
+ };
+
+ struct ListItem : public Item
+ {
+#ifdef HAVE_FONTCONFIG
+ ListItem(const QString &st, QDomNode &n) : Item(n), str(st) {}
+ ListItem(const QString &st) : str(st) {}
+#else
+ ListItem(const QString &st, char *s=NULL, char *e=NULL) : Item(s, e), str(st) {}
+#endif
+
+ QString str;
+ };
+
+ struct SubPixel : public Item
+ {
+ enum Type
+ {
+ None,
+ Rgb,
+ Bgr,
+ Vrgb,
+ Vbgr
+ };
+
+#ifdef HAVE_FONTCONFIG
+ SubPixel(Type t, QDomNode &n) : Item(n), type(t) {}
+ SubPixel(Type t=None) : type(t) {}
+#else
+ SubPixel(Type t=None, char *s=NULL, char *e=NULL) : Item(s, e), type(t) {}
+#endif
+ void reset() { Item::reset(); type=None; }
+
+ Type type;
+ };
+
+ struct Exclude : public Item
+ {
+#ifdef HAVE_FONTCONFIG
+ Exclude(double f, double t, QDomNode &n) : Item(n), from(f), to(t) {}
+ Exclude(double f=0, double t=0) : from(f), to(t) {}
+#else
+ Exclude(double f=0, double t=0, char *s=NULL, char *e=NULL) : Item(s, e), from(f), to(t) {}
+#endif
+ void reset() { Item::reset(); from=to=0; }
+
+ double from,
+ to;
+ };
+
+#ifdef HAVE_FONTCONFIG
+ struct Hint : public Item
+ {
+ enum Style
+ {
+ NotSet,
+ None,
+ Slight,
+ Medium,
+ Full
+ };
+
+ Hint(Style s, QDomNode &n) : Item(n), style(s) {}
+ Hint(Style s=NotSet) : style(s) {}
+
+ void reset() { Item::reset(); style=NotSet; }
+
+ Style style;
+ };
+
+ struct Hinting : public Item
+ {
+ Hinting(bool s, QDomNode &n) : Item(n), set(s) {}
+ Hinting(bool s=true) : set(s) {}
+
+ void reset() { Item::reset(); set=true; }
+
+ bool set;
+ };
+
+ struct AntiAliasing : public Item
+ {
+ AntiAliasing(bool s, QDomNode &n) : Item(n), set(s) {}
+ AntiAliasing(bool s=true) : set(s) {}
+
+ void reset() { Item::reset(); set=true; }
+
+ bool set;
+ };
+#endif
+
+ public:
+
+ static QString contractHome(QString path);
+ static QString expandHome(QString path);
+
+ //
+ // Constructor
+ // required - This should be a bitmask of 'RequiredData', and indicates the data to be
+ // read/written to the config file. It is intended that the 'fonts' KControl
+ // module will use KXftConfig::SubPixelType|KXftConfig::ExcludeRange, and the
+ // font installer will use KXftConfig::Dirs|KXftConfig::SymbolFamilies.
+ //
+ // system - Indicates if the system-wide config file, or the users ~/.xftconfig file
+ // should be used. Only the font-installer should access the system file (and then
+ // only if run as root.
+ KXftConfig(int required, bool system=false);
+
+ virtual ~KXftConfig();
+
+ bool reset();
+ bool apply();
+ bool getSubPixelType(SubPixel::Type &type);
+ void setSubPixelType(SubPixel::Type type); // SubPixel::None => turn off sub-pixel hinting
+ bool getExcludeRange(double &from, double &to);
+ void setExcludeRange(double from, double to); // from:0, to:0 => turn off exclude range
+ void addDir(const QString &d);
+ void removeDir(const QString &d);
+ void clearDirs() { clearList(m_dirs); }
+ QStringList getDirs() { return getList(m_dirs); }
+#ifdef HAVE_FONTCONFIG
+ bool getHintStyle(Hint::Style &style);
+ void setHintStyle(Hint::Style style);
+#else
+ void addSymbolFamily(const QString &f) { addItem(m_symbolFamilies, f); }
+ void removeSymbolFamily(const QString &f) { removeItem(m_symbolFamilies, f); }
+ void clearSymbolFamilies() { clearList(m_symbolFamilies); }
+ QStringList getSymbolFamilies() { return getList(m_symbolFamilies); }
+#endif
+ void setAntiAliasing(bool set);
+ bool getAntiAliasing() const;
+ bool changed() { return m_madeChanges; }
+ static QString description(SubPixel::Type t);
+ static const char * toStr(SubPixel::Type t);
+#ifdef HAVE_FONTCONFIG
+ static QString description(Hint::Style s);
+ static const char * toStr(Hint::Style s);
+#endif
+ bool hasDir(const QString &d);
+
+ private:
+
+ ListItem * findItem(QPtrList<ListItem> &list, const QString &i);
+ void clearList(QPtrList<ListItem> &list);
+ static QStringList getList(QPtrList<ListItem> &list);
+ void addItem(QPtrList<ListItem> &list, const QString &i);
+ void removeItem(QPtrList<ListItem> &list, ListItem *item);
+ void removeItem(QPtrList<ListItem> &list, const QString &i) { removeItem(list, findItem(list, i)); }
+ void readContents();
+#ifdef HAVE_FONTCONFIG
+ void applyDirs();
+#if 0
+ void applySymbolFamilies();
+#endif
+ void applySubPixelType();
+ void applyHintStyle();
+ void applyAntiAliasing();
+ void setHinting(bool set);
+ void applyHinting();
+ void applyExcludeRange(bool pixel);
+ void removeItems(QPtrList<ListItem> &list);
+#else
+ void outputDir(std::ofstream &f, const QString &str);
+ void outputNewDirs(std::ofstream &f);
+ void outputSymbolFamily(std::ofstream &f, const QString &str);
+ void outputNewSymbolFamilies(std::ofstream &f);
+ void outputSubPixelType(std::ofstream &f, bool ifNew);
+ void outputExcludeRange(std::ofstream &f, bool ifNew, bool pixel);
+#endif
+
+ private:
+
+ SubPixel m_subPixel;
+ Exclude m_excludeRange,
+ m_excludePixelRange;
+#ifdef HAVE_FONTCONFIG
+ Hint m_hint;
+ Hinting m_hinting;
+ AntiAliasing m_antiAliasing;
+ bool aliasingEnabled();
+#else
+ QPtrList<ListItem> m_symbolFamilies;
+#endif
+ QPtrList<ListItem> m_dirs;
+ QString m_file;
+ int m_required;
+#ifdef HAVE_FONTCONFIG
+ QDomDocument m_doc;
+#else
+ int m_size;
+ char *m_data;
+#endif
+ bool m_madeChanges,
+ m_system;
+ time_t m_time;
+};
+
+#endif
diff --git a/kcontrol/icons/Makefile.am b/kcontrol/icons/Makefile.am
new file mode 100644
index 000000000..4e00a730c
--- /dev/null
+++ b/kcontrol/icons/Makefile.am
@@ -0,0 +1,25 @@
+AM_CPPFLAGS = $(all_includes)
+
+kde_module_LTLIBRARIES = kcm_icons.la
+
+kcm_icons_la_SOURCES = iconthemes.cpp icons.cpp main.cpp
+kcm_icons_la_LDFLAGS = -module -avoid-version $(all_libraries) -no-undefined
+kcm_icons_la_LIBADD = $(LIB_KIO)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = icons.h iconthemes.h main.h
+
+check_PROGRAMS = testicons
+testicons_SOURCES = testicons.cpp
+testicons_LDFLAGS = $(all_libraries)
+testicons_LDADD = $(LIB_KDEUI) icons.lo
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/kcmicons.pot
+
+xdg_apps_DATA = icons.desktop
+
+install-data-local: uninstall.desktop
+ $(mkinstalldirs) $(DESTDIR)$(kde_appsdir)/Settings/LookNFeel/Themes
+ $(INSTALL_DATA) $(srcdir)/uninstall.desktop $(DESTDIR)$(kde_appsdir)/Settings/LookNFeel/Themes/iconthemes.desktop
diff --git a/kcontrol/icons/icons.cpp b/kcontrol/icons/icons.cpp
new file mode 100644
index 000000000..85a72e075
--- /dev/null
+++ b/kcontrol/icons/icons.cpp
@@ -0,0 +1,666 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * This file is part of the KDE project, module kcmdisplay.
+ * Copyright (C) 2000 Geert Jansen <jansen@kde.org>
+ * with minor additions and based on ideas from
+ * Torsten Rahn <torsten@kde.org> *
+ *
+ * You can Freely distribute this program under the GNU General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ */
+
+#include <stdlib.h>
+
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qslider.h>
+
+#include <kcolorbutton.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kiconeffect.h>
+#include <kiconloader.h>
+#include <kipc.h>
+#include <klocale.h>
+#include <kseparator.h>
+
+#include "icons.h"
+
+/**** KIconConfig ****/
+
+KIconConfig::KIconConfig(QWidget *parent, const char *name)
+ : KCModule(parent, name)
+{
+
+ QGridLayout *top = new QGridLayout(this, 2, 2,
+ KDialog::marginHint(),
+ KDialog::spacingHint());
+ top->setColStretch(0, 1);
+ top->setColStretch(1, 1);
+
+ // Use of Icon at (0,0) - (1, 0)
+ QGroupBox *gbox = new QGroupBox(i18n("Use of Icon"), this);
+ top->addMultiCellWidget(gbox, 0, 1, 0, 0);
+ QBoxLayout *g_vlay = new QVBoxLayout(gbox,
+ KDialog::marginHint(),
+ KDialog::spacingHint());
+ g_vlay->addSpacing(fontMetrics().lineSpacing());
+ mpUsageList = new QListBox(gbox);
+ connect(mpUsageList, SIGNAL(highlighted(int)), SLOT(slotUsage(int)));
+ g_vlay->addWidget(mpUsageList);
+
+ KSeparator *sep = new KSeparator( KSeparator::HLine, this );
+ top->addWidget(sep, 1, 1);
+ // Preview at (2,0) - (2, 1)
+ QGridLayout *g_lay = new QGridLayout(4, 3, KDialog::marginHint(), 0);
+ top->addMultiCellLayout(g_lay, 2, 2, 0, 1);
+ g_lay->addRowSpacing(0, fontMetrics().lineSpacing());
+
+ QPushButton *push;
+
+ push = addPreviewIcon(0, i18n("Default"), this, g_lay);
+ connect(push, SIGNAL(clicked()), SLOT(slotEffectSetup0()));
+ push = addPreviewIcon(1, i18n("Active"), this, g_lay);
+ connect(push, SIGNAL(clicked()), SLOT(slotEffectSetup1()));
+ push = addPreviewIcon(2, i18n("Disabled"), this, g_lay);
+ connect(push, SIGNAL(clicked()), SLOT(slotEffectSetup2()));
+
+ m_pTab1 = new QWidget(this, "General Tab");
+ top->addWidget(m_pTab1, 0, 1);
+
+ QGridLayout *grid = new QGridLayout(m_pTab1, 4, 3, 10, 10);
+ grid->setColStretch(1, 1);
+ grid->setColStretch(2, 1);
+
+
+ // Size
+ QLabel *lbl = new QLabel(i18n("Size:"), m_pTab1);
+ lbl->setFixedSize(lbl->sizeHint());
+ grid->addWidget(lbl, 0, 0, Qt::AlignLeft);
+ mpSizeBox = new QComboBox(m_pTab1);
+ connect(mpSizeBox, SIGNAL(activated(int)), SLOT(slotSize(int)));
+ lbl->setBuddy(mpSizeBox);
+ grid->addWidget(mpSizeBox, 0, 1, Qt::AlignLeft);
+
+ mpDPCheck = new QCheckBox(i18n("Double-sized pixels"), m_pTab1);
+ connect(mpDPCheck, SIGNAL(toggled(bool)), SLOT(slotDPCheck(bool)));
+ grid->addMultiCellWidget(mpDPCheck, 1, 1, 0, 1, Qt::AlignLeft);
+
+ mpAnimatedCheck = new QCheckBox(i18n("Animate icons"), m_pTab1);
+ connect(mpAnimatedCheck, SIGNAL(toggled(bool)), SLOT(slotAnimatedCheck(bool)));
+ grid->addMultiCellWidget(mpAnimatedCheck, 2, 2, 0, 1, Qt::AlignLeft);
+
+ top->activate();
+
+ init();
+ read();
+ apply();
+ preview();
+}
+
+KIconConfig::~KIconConfig()
+{
+ delete mpEffect;
+}
+
+QPushButton *KIconConfig::addPreviewIcon(int i, const QString &str, QWidget *parent, QGridLayout *lay)
+{
+ QLabel *lab = new QLabel(str, parent);
+ lay->addWidget(lab, 1, i, AlignCenter);
+ mpPreview[i] = new QLabel(parent);
+ mpPreview[i]->setAlignment(AlignCenter);
+ mpPreview[i]->setMinimumSize(105, 105);
+ lay->addWidget(mpPreview[i], 2, i);
+ QPushButton *push = new QPushButton(i18n("Set Effect..."), parent);
+ lay->addWidget(push, 3, i, AlignCenter);
+ return push;
+}
+
+void KIconConfig::init()
+{
+ mpLoader = KGlobal::iconLoader();
+ mpConfig = KGlobal::config();
+ mpEffect = new KIconEffect;
+ mpTheme = mpLoader->theme();
+ mUsage = 0;
+ for (int i=0; i<KIcon::LastGroup; i++)
+ mbChanged[i] = false;
+
+ // Fill list/checkboxen
+ mpUsageList->insertItem(i18n("Desktop/File Manager"));
+ mpUsageList->insertItem(i18n("Toolbar"));
+ mpUsageList->insertItem(i18n("Main Toolbar"));
+ mpUsageList->insertItem(i18n("Small Icons"));
+ mpUsageList->insertItem(i18n("Panel"));
+ mpUsageList->insertItem(i18n("All Icons"));
+
+ // For reading the configuration
+ mGroups += "Desktop";
+ mGroups += "Toolbar";
+ mGroups += "MainToolbar";
+ mGroups += "Small";
+ mGroups += "Panel";
+
+ mStates += "Default";
+ mStates += "Active";
+ mStates += "Disabled";
+}
+
+void KIconConfig::initDefaults()
+{
+ mDefaultEffect[0].type = KIconEffect::NoEffect;
+ mDefaultEffect[1].type = KIconEffect::NoEffect;
+ mDefaultEffect[2].type = KIconEffect::ToGray;
+ mDefaultEffect[0].transparant = false;
+ mDefaultEffect[1].transparant = false;
+ mDefaultEffect[2].transparant = true;
+ mDefaultEffect[0].value = 1.0;
+ mDefaultEffect[1].value = 1.0;
+ mDefaultEffect[2].value = 1.0;
+ mDefaultEffect[0].color = QColor(144,128,248);
+ mDefaultEffect[1].color = QColor(169,156,255);
+ mDefaultEffect[2].color = QColor(34,202,0);
+ mDefaultEffect[0].color2 = QColor(0,0,0);
+ mDefaultEffect[1].color2 = QColor(0,0,0);
+ mDefaultEffect[2].color2 = QColor(0,0,0);
+
+ const int defDefSizes[] = { 32, 22, 22, 16, 32 };
+
+ KIcon::Group i;
+ QStringList::ConstIterator it;
+ for(it=mGroups.begin(), i=KIcon::FirstGroup; it!=mGroups.end(); ++it, i++)
+ {
+ mbDP[i] = false;
+ mbChanged[i] = true;
+ mbAnimated[i] = false;
+ if (mpTheme)
+ mSizes[i] = mpTheme->defaultSize(i);
+ else
+ mSizes[i] = defDefSizes[i];
+
+ mEffects[i][0] = mDefaultEffect[0];
+ mEffects[i][1] = mDefaultEffect[1];
+ mEffects[i][2] = mDefaultEffect[2];
+ }
+ // Animate desktop icons by default
+ int group = mGroups.findIndex( "Desktop" );
+ if ( group != -1 )
+ mbAnimated[group] = true;
+
+ // This is the new default in KDE 2.2, in sync with the kiconeffect of kdelibs Nolden 2001/06/11
+ int activeState = mStates.findIndex( "Active" );
+ if ( activeState != -1 )
+ {
+ int group = mGroups.findIndex( "Desktop" );
+ if ( group != -1 )
+ {
+ mEffects[ group ][ activeState ].type = KIconEffect::ToGamma;
+ mEffects[ group ][ activeState ].value = 0.7;
+ }
+
+ group = mGroups.findIndex( "Panel" );
+ if ( group != -1 )
+ {
+ mEffects[ group ][ activeState ].type = KIconEffect::ToGamma;
+ mEffects[ group ][ activeState ].value = 0.7;
+ }
+ }
+}
+
+void KIconConfig::read()
+{
+ if (mpTheme)
+ {
+ for (KIcon::Group i=KIcon::FirstGroup; i<KIcon::LastGroup; i++)
+ mAvSizes[i] = mpTheme->querySizes(i);
+
+ mTheme = mpTheme->current();
+ mExample = mpTheme->example();
+ }
+ else
+ {
+ for (KIcon::Group i=KIcon::FirstGroup; i<KIcon::LastGroup; i++)
+ mAvSizes[i] = QValueList<int>();
+
+ mTheme = QString::null;
+ mExample = QString::null;
+ }
+
+ initDefaults();
+
+ int i, j, effect;
+ QStringList::ConstIterator it, it2;
+ for (it=mGroups.begin(), i=0; it!=mGroups.end(); ++it, i++)
+ {
+ mbChanged[i] = false;
+
+ mpConfig->setGroup(*it + "Icons");
+ mSizes[i] = mpConfig->readNumEntry("Size", mSizes[i]);
+ mbDP[i] = mpConfig->readBoolEntry("DoublePixels", mbDP[i]);
+ mbAnimated[i] = mpConfig->readBoolEntry("Animated", mbAnimated[i]);
+
+ for (it2=mStates.begin(), j=0; it2!=mStates.end(); ++it2, j++)
+ {
+ QString tmp = mpConfig->readEntry(*it2 + "Effect");
+ if (tmp == "togray")
+ effect = KIconEffect::ToGray;
+ else if (tmp == "colorize")
+ effect = KIconEffect::Colorize;
+ else if (tmp == "togamma")
+ effect = KIconEffect::ToGamma;
+ else if (tmp == "desaturate")
+ effect = KIconEffect::DeSaturate;
+ else if (tmp == "tomonochrome")
+ effect = KIconEffect::ToMonochrome;
+ else if (tmp == "none")
+ effect = KIconEffect::NoEffect;
+ else continue;
+ mEffects[i][j].type = effect;
+ mEffects[i][j].value = mpConfig->readDoubleNumEntry(*it2 + "Value");
+ mEffects[i][j].color = mpConfig->readColorEntry(*it2 + "Color");
+ mEffects[i][j].color2 = mpConfig->readColorEntry(*it2 + "Color2");
+ mEffects[i][j].transparant = mpConfig->readBoolEntry(*it2 + "SemiTransparent");
+ }
+ }
+}
+
+void KIconConfig::apply()
+{
+ mpUsageList->setCurrentItem(mUsage);
+
+ int delta = 1000, dw, index = -1, size = 0, i;
+ QValueList<int>::Iterator it;
+ mpSizeBox->clear();
+ if (mUsage < KIcon::LastGroup) {
+ for (it=mAvSizes[mUsage].begin(), i=0; it!=mAvSizes[mUsage].end(); ++it, i++)
+ {
+ mpSizeBox->insertItem(QString().setNum(*it));
+ dw = abs(mSizes[mUsage] - *it);
+ if (dw < delta)
+ {
+ delta = dw;
+ index = i;
+ size = *it;
+ }
+
+ }
+ if (index != -1)
+ {
+ mpSizeBox->setCurrentItem(index);
+ mSizes[mUsage] = size; // best or exact match
+ }
+ mpDPCheck->setChecked(mbDP[mUsage]);
+ mpAnimatedCheck->setChecked(mbAnimated[mUsage]);
+ }
+}
+
+void KIconConfig::preview(int i)
+{
+ // Apply effects ourselves because we don't want to sync
+ // the configuration every preview.
+
+ int viewedGroup = (mUsage == KIcon::LastGroup) ? KIcon::FirstGroup : mUsage;
+
+ QPixmap pm = mpLoader->loadIcon(mExample, KIcon::NoGroup, mSizes[viewedGroup]);
+ QImage img = pm.convertToImage();
+ if (mbDP[viewedGroup])
+ {
+ int w = img.width() * 2;
+ img = img.smoothScale(w, w);
+ }
+
+ Effect &effect = mEffects[viewedGroup][i];
+
+ img = mpEffect->apply(img, effect.type,
+ effect.value, effect.color, effect.color2, effect.transparant);
+ pm.convertFromImage(img);
+ mpPreview[i]->setPixmap(pm);
+}
+
+void KIconConfig::preview()
+{
+ preview(0);
+ preview(1);
+ preview(2);
+}
+
+void KIconConfig::load()
+{
+ load( false );
+}
+
+void KIconConfig::load( bool useDefaults )
+{
+ mpConfig = KGlobal::config();
+ mpConfig->setReadDefaults( useDefaults );
+ read();
+ apply();
+ for (int i=0; i<KIcon::LastGroup; i++)
+ mbChanged[i] = false;
+ preview();
+ emit changed( useDefaults );
+}
+
+
+void KIconConfig::save()
+{
+ int i, j;
+ QStringList::ConstIterator it, it2;
+ for (it=mGroups.begin(), i=0; it!=mGroups.end(); ++it, i++)
+ {
+ mpConfig->setGroup(*it + "Icons");
+ mpConfig->writeEntry("Size", mSizes[i], true, true);
+ mpConfig->writeEntry("DoublePixels", mbDP[i], true, true);
+ mpConfig->writeEntry("Animated", mbAnimated[i], true, true);
+ for (it2=mStates.begin(), j=0; it2!=mStates.end(); ++it2, j++)
+ {
+ QString tmp;
+ switch (mEffects[i][j].type)
+ {
+ case KIconEffect::ToGray:
+ tmp = "togray";
+ break;
+ case KIconEffect::ToGamma:
+ tmp = "togamma";
+ break;
+ case KIconEffect::Colorize:
+ tmp = "colorize";
+ break;
+ case KIconEffect::DeSaturate:
+ tmp = "desaturate";
+ break;
+ case KIconEffect::ToMonochrome:
+ tmp = "tomonochrome";
+ break;
+ default:
+ tmp = "none";
+ break;
+ }
+ mpConfig->writeEntry(*it2 + "Effect", tmp, true, true);
+ mpConfig->writeEntry(*it2 + "Value", mEffects[i][j].value, true, true);
+ mpConfig->writeEntry(*it2 + "Color", mEffects[i][j].color, true, true);
+ mpConfig->writeEntry(*it2 + "Color2", mEffects[i][j].color2, true, true);
+ mpConfig->writeEntry(*it2 + "SemiTransparent", mEffects[i][j].transparant, true, true);
+ }
+ }
+
+ mpConfig->sync();
+
+ emit changed(false);
+
+ // Emit KIPC change message.
+ for (int i=0; i<KIcon::LastGroup; i++)
+ {
+ if (mbChanged[i])
+ {
+ KIPC::sendMessageAll(KIPC::IconChanged, i);
+ mbChanged[i] = false;
+ }
+ }
+}
+
+void KIconConfig::defaults()
+{
+ load( true );
+}
+
+void KIconConfig::slotUsage(int index)
+{
+ mUsage = index;
+ if ( mUsage == KIcon::Panel || mUsage == KIcon::LastGroup )
+ {
+ mpSizeBox->setEnabled(false);
+ mpDPCheck->setEnabled(false);
+ mpAnimatedCheck->setEnabled( mUsage == KIcon::Panel );
+ }
+ else
+ {
+ mpSizeBox->setEnabled(true);
+ mpDPCheck->setEnabled(true);
+ mpAnimatedCheck->setEnabled( mUsage == KIcon::Desktop );
+ }
+
+ apply();
+ preview();
+}
+
+void KIconConfig::EffectSetup(int state)
+{
+ int viewedGroup = (mUsage == KIcon::LastGroup) ? KIcon::FirstGroup : mUsage;
+
+ QPixmap pm = mpLoader->loadIcon(mExample, KIcon::NoGroup, mSizes[viewedGroup]);
+ QImage img = pm.convertToImage();
+ if (mbDP[viewedGroup])
+ {
+ int w = img.width() * 2;
+ img = img.smoothScale(w, w);
+ }
+
+ QString caption;
+ switch (state)
+ {
+ case 0 : caption = i18n("Setup Default Icon Effect"); break;
+ case 1 : caption = i18n("Setup Active Icon Effect"); break;
+ case 2 : caption = i18n("Setup Disabled Icon Effect"); break;
+ }
+
+ KIconEffectSetupDialog dlg(mEffects[viewedGroup][state], mDefaultEffect[state], caption, img);
+
+ if (dlg.exec() == QDialog::Accepted)
+ {
+ if (mUsage == KIcon::LastGroup) {
+ for (int i=0; i<KIcon::LastGroup; i++)
+ mEffects[i][state] = dlg.effect();
+ } else {
+ mEffects[mUsage][state] = dlg.effect();
+ }
+
+ // AK - can this call be moved therefore removing
+ // code duplication?
+
+ emit changed(true);
+
+ if (mUsage == KIcon::LastGroup) {
+ for (int i=0; i<KIcon::LastGroup; i++)
+ mbChanged[i] = true;
+ } else {
+ mbChanged[mUsage] = true;
+ }
+ }
+ preview(state);
+}
+
+void KIconConfig::slotSize(int index)
+{
+ Q_ASSERT(mUsage < KIcon::LastGroup);
+ mSizes[mUsage] = mAvSizes[mUsage][index];
+ preview();
+ emit changed(true);
+ mbChanged[mUsage] = true;
+}
+
+void KIconConfig::slotDPCheck(bool check)
+{
+ Q_ASSERT(mUsage < KIcon::LastGroup);
+ if (mbDP[mUsage] != check)
+ {
+ mbDP[mUsage] = check;
+ emit changed(true);
+ mbChanged[mUsage] = true;
+ }
+ preview();
+
+}
+
+void KIconConfig::slotAnimatedCheck(bool check)
+{
+ Q_ASSERT(mUsage < KIcon::LastGroup);
+ if (mbAnimated[mUsage] != check)
+ {
+ mbAnimated[mUsage] = check;
+ emit changed(true);
+ mbChanged[mUsage] = true;
+ }
+}
+
+KIconEffectSetupDialog::KIconEffectSetupDialog(const Effect &effect,
+ const Effect &defaultEffect,
+ const QString &caption, const QImage &image,
+ QWidget *parent, char *name)
+ : KDialogBase(parent, name, true, caption,
+ Default|Ok|Cancel, Ok, true),
+ mEffect(effect),
+ mDefaultEffect(defaultEffect),
+ mExample(image)
+{
+ mpEffect = new KIconEffect;
+
+ QLabel *lbl;
+ QGroupBox *frame;
+ QGridLayout *grid;
+
+ QWidget *page = new QWidget(this);
+ setMainWidget(page);
+
+ QGridLayout *top = new QGridLayout(page, 4, 2, 0, spacingHint());
+ top->setColStretch(0,1);
+ top->addColSpacing(1,10);
+ top->setColStretch(2,2);
+ top->setRowStretch(1,1);
+
+ lbl = new QLabel(i18n("&Effect:"), page);
+ lbl->setFixedSize(lbl->sizeHint());
+ top->addWidget(lbl, 0, 0, Qt::AlignLeft);
+ mpEffectBox = new QListBox(page);
+ mpEffectBox->insertItem(i18n("No Effect"));
+ mpEffectBox->insertItem(i18n("To Gray"));
+ mpEffectBox->insertItem(i18n("Colorize"));
+ mpEffectBox->insertItem(i18n("Gamma"));
+ mpEffectBox->insertItem(i18n("Desaturate"));
+ mpEffectBox->insertItem(i18n("To Monochrome"));
+ mpEffectBox->setMinimumWidth( 100 );
+ connect(mpEffectBox, SIGNAL(highlighted(int)), SLOT(slotEffectType(int)));
+ top->addMultiCellWidget(mpEffectBox, 1, 2, 0, 0, Qt::AlignLeft);
+ lbl->setBuddy(mpEffectBox);
+
+ mpSTCheck = new QCheckBox(i18n("&Semi-transparent"), page);
+ connect(mpSTCheck, SIGNAL(toggled(bool)), SLOT(slotSTCheck(bool)));
+ top->addWidget(mpSTCheck, 3, 0, Qt::AlignLeft);
+
+ frame = new QGroupBox(i18n("Preview"), page);
+ top->addMultiCellWidget(frame, 0, 1, 1, 1);
+ grid = new QGridLayout(frame, 2, 1, marginHint(), spacingHint());
+ grid->addRowSpacing(0, fontMetrics().lineSpacing());
+ grid->setRowStretch(1, 1);
+
+ mpPreview = new QLabel(frame);
+ mpPreview->setAlignment(AlignCenter);
+ mpPreview->setMinimumSize(105, 105);
+ grid->addWidget(mpPreview, 1, 0);
+
+ mpEffectGroup = new QGroupBox(i18n("Effect Parameters"), page);
+ top->addMultiCellWidget(mpEffectGroup, 2, 3, 1, 1);
+ grid = new QGridLayout(mpEffectGroup, 3, 2, marginHint(), spacingHint());
+ grid->addRowSpacing(0, fontMetrics().lineSpacing());
+
+ mpEffectLabel = new QLabel(i18n("&Amount:"), mpEffectGroup);
+ grid->addWidget(mpEffectLabel, 1, 0);
+ mpEffectSlider = new QSlider(0, 100, 5, 10, QSlider::Horizontal, mpEffectGroup);
+ mpEffectLabel->setBuddy( mpEffectSlider );
+ connect(mpEffectSlider, SIGNAL(valueChanged(int)), SLOT(slotEffectValue(int)));
+ grid->addWidget(mpEffectSlider, 1, 1);
+
+ mpEffectColor = new QLabel(i18n("Co&lor:"), mpEffectGroup);
+ grid->addWidget(mpEffectColor, 2, 0);
+ mpEColButton = new KColorButton(mpEffectGroup);
+ mpEffectColor->setBuddy( mpEColButton );
+ connect(mpEColButton, SIGNAL(changed(const QColor &)),
+ SLOT(slotEffectColor(const QColor &)));
+ grid->addWidget(mpEColButton, 2, 1);
+
+ mpEffectColor2 = new QLabel(i18n("&Second color:"), mpEffectGroup);
+ grid->addWidget(mpEffectColor2, 3, 0);
+ mpECol2Button = new KColorButton(mpEffectGroup);
+ mpEffectColor2->setBuddy( mpECol2Button );
+ connect(mpECol2Button, SIGNAL(changed(const QColor &)),
+ SLOT(slotEffectColor2(const QColor &)));
+ grid->addWidget(mpECol2Button, 3, 1);
+
+ init();
+ preview();
+}
+
+KIconEffectSetupDialog::~KIconEffectSetupDialog()
+{
+ delete mpEffect;
+}
+
+void KIconEffectSetupDialog::init()
+{
+ mpEffectBox->setCurrentItem(mEffect.type);
+ mpEffectSlider->setEnabled(mEffect.type != KIconEffect::NoEffect);
+ mpEColButton->setEnabled(mEffect.type == KIconEffect::Colorize || mEffect.type == KIconEffect::ToMonochrome);
+ mpECol2Button->setEnabled(mEffect.type == KIconEffect::ToMonochrome);
+ mpEffectSlider->setValue((int) (100.0 * mEffect.value + 0.5));
+ mpEColButton->setColor(mEffect.color);
+ mpECol2Button->setColor(mEffect.color2);
+ mpSTCheck->setChecked(mEffect.transparant);
+}
+
+void KIconEffectSetupDialog::slotEffectValue(int value)
+{
+ mEffect.value = 0.01 * value;
+ preview();
+}
+
+void KIconEffectSetupDialog::slotEffectColor(const QColor &col)
+{
+ mEffect.color = col;
+ preview();
+}
+
+void KIconEffectSetupDialog::slotEffectColor2(const QColor &col)
+{
+ mEffect.color2 = col;
+ preview();
+}
+
+void KIconEffectSetupDialog::slotEffectType(int type)
+{
+ mEffect.type = type;
+ mpEffectGroup->setEnabled(mEffect.type != KIconEffect::NoEffect);
+ mpEffectSlider->setEnabled(mEffect.type != KIconEffect::NoEffect);
+ mpEffectColor->setEnabled(mEffect.type == KIconEffect::Colorize || mEffect.type == KIconEffect::ToMonochrome);
+ mpEColButton->setEnabled(mEffect.type == KIconEffect::Colorize || mEffect.type == KIconEffect::ToMonochrome);
+ mpEffectColor2->setEnabled(mEffect.type == KIconEffect::ToMonochrome);
+ mpECol2Button->setEnabled(mEffect.type == KIconEffect::ToMonochrome);
+ preview();
+}
+
+void KIconEffectSetupDialog::slotSTCheck(bool b)
+{
+ mEffect.transparant = b;
+ preview();
+}
+
+void KIconEffectSetupDialog::slotDefault()
+{
+ mEffect = mDefaultEffect;
+ init();
+ preview();
+}
+
+void KIconEffectSetupDialog::preview()
+{
+ QPixmap pm;
+ QImage img = mExample.copy();
+ img = mpEffect->apply(img, mEffect.type,
+ mEffect.value, mEffect.color, mEffect.color2, mEffect.transparant);
+ pm.convertFromImage(img);
+ mpPreview->setPixmap(pm);
+}
+
+#include "icons.moc"
diff --git a/kcontrol/icons/icons.desktop b/kcontrol/icons/icons.desktop
new file mode 100644
index 000000000..966b377b9
--- /dev/null
+++ b/kcontrol/icons/icons.desktop
@@ -0,0 +1,249 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/icons/index.html
+Icon=icons
+Exec=kcmshell icons
+
+
+X-KDE-Library=icons
+X-KDE-FactoryName=icons
+X-KDE-ParentApp=kcontrol
+
+Name=Icons
+Name[af]=Ikoone
+Name[ar]=الأيقونات
+Name[az]=Timsallar
+Name[be]=Значкі
+Name[bg]=Икони
+Name[bn]=আইকন
+Name[br]=Arlunioù
+Name[bs]=Ikone
+Name[ca]=Icones
+Name[cs]=Ikony
+Name[csb]=Ikònë
+Name[cy]=Eicon
+Name[da]=Ikoner
+Name[de]=Symbole
+Name[el]=Εικονίδια
+Name[eo]=Piktogramoj
+Name[es]=Iconos
+Name[et]=Ikoonid
+Name[eu]=Ikonoak
+Name[fa]=شمایلها
+Name[fi]=Kuvakkeet
+Name[fr]=Icônes
+Name[fy]=Byldkaikes
+Name[ga]=Deilbhíní
+Name[gl]=Iconas
+Name[he]=סמלים
+Name[hi]=प्रतीक
+Name[hr]=Ikone
+Name[hu]=Ikonok
+Name[id]=Ikon
+Name[is]=Táknmyndir
+Name[it]=Icone
+Name[ja]=アイコン
+Name[ka]=ხატულები
+Name[kk]=Таңбашалар
+Name[km]=រូបតំណាង
+Name[ko]=아이콘
+Name[lo]=ໄອຄອນ
+Name[lt]=Ženkliukai
+Name[lv]=Ikonas
+Name[mk]=Икони
+Name[mn]=Тэмдэг
+Name[ms]=Ikon
+Name[mt]=Ikoni
+Name[nb]=Ikoner
+Name[nds]=Lüttbiller
+Name[ne]=प्रतिमा
+Name[nl]=Pictogrammen
+Name[nn]=Ikon
+Name[nso]=Diemedi
+Name[oc]=Icones
+Name[pa]=ਆਈਕਾਨ
+Name[pl]=Ikony
+Name[pt]=Ícones
+Name[pt_BR]=Ícones
+Name[ro]=Iconițe
+Name[ru]=Значки
+Name[rw]=Agashushondanga
+Name[se]=Govažat
+Name[sk]=Ikony
+Name[sl]=Ikone
+Name[sr]=Иконе
+Name[sr@Latn]=Ikone
+Name[ss]=Timeleli
+Name[sv]=Ikoner
+Name[ta]=சின்னங்கள்
+Name[te]=ప్రతిమలు
+Name[tg]=Нишонаҳо
+Name[th]=ไอคอน
+Name[tr]=Simgeler
+Name[tt]=Tamğalar
+Name[uk]=Піктограми
+Name[uz]=Nishonchalar
+Name[uz@cyrillic]=Нишончалар
+Name[ven]=Aikhono
+Name[vi]=Biểu tượng
+Name[wa]=Imådjetes
+Name[xh]=Imphawu zemmifanekiso
+Name[zh_CN]=图标
+Name[zh_TW]=圖示
+Name[zu]=Izimpawu zezithombe
+
+Comment=Customize KDE Icons
+Comment[af]=Pasmaak Kde Ikoone
+Comment[ar]=تخصيص أيقونات KDE الإعتيادية
+Comment[az]=KDE Timsallarını Xüsusiləşdirir
+Comment[be]=Настаўленні значак KDE
+Comment[bg]=Настройване и избор на тема с икони
+Comment[bn]=কে.ডি.ই. আইকন বেছে নিন
+Comment[br]=Neuziañ arlunioù KDE
+Comment[bs]=Podesite KDE ikone
+Comment[ca]=Configura les icones del KDE
+Comment[cs]=Přizpůsobení ikon KDE
+Comment[csb]=Dopasëjë ikònë KDE
+Comment[cy]=Addasu Eiconau KDE
+Comment[da]=Brugerdefinér KDE-ikoner
+Comment[de]=KDE-Symbole einrichten
+Comment[el]=Προσαρμογή των εικονιδίων του KDE
+Comment[en_GB]=Customise KDE Icons
+Comment[eo]=Agordo de KDE-piktogramoj
+Comment[es]=Personaliza los iconos de KDE
+Comment[et]=KDE ikoonide kohandamine
+Comment[eu]=Pertsonalizatu KDEren ikonoak
+Comment[fa]=سفارشی‌سازی شمایلهای KDE
+Comment[fi]=Muokkaa KDE:n kuvakkeita
+Comment[fr]=Personnalisation des icônes de KDE
+Comment[fy]=KDE-byldkaikes oanpasse
+Comment[ga]=Saincheap Deilbhíní KDE
+Comment[gl]=Personaliza as Iconas de KDE
+Comment[he]=שינוי הגדרות הסמלים של KDE
+Comment[hi]=केडीई प्रतीक मनपसंद बनाएँ
+Comment[hr]=Prilagođavanje KDE ikona
+Comment[hu]=A KDE ikonok testreszabása
+Comment[id]=Customize Ikon KDE
+Comment[is]=Stilla táknmyndir KDE
+Comment[it]=Personalizza le icone di KDE
+Comment[ja]=KDE アイコンをカスタマイズ
+Comment[ka]=KDE–ს ხატულების კონფიგურაცია
+Comment[kk]=KDE таңбашаларын баптау
+Comment[km]=ប្ដូរ​រូបតំណាង KDE តាម​បំណង
+Comment[ko]=KDE 아이콘 사용자 정의
+Comment[lo]=ເລືອກໄອຄອນຂອງ KDE ເອງ
+Comment[lt]=KDE ženkliukų derinimas
+Comment[lv]=Pielāgot KDE Ikonas
+Comment[mk]=Прилагоди ги иконите на KDE
+Comment[mn]=КДЭ-Тэмдэг тохируулах
+Comment[ms]=Ikon KDE Langganan
+Comment[mt]=Agħżel ikoni ġodda għal KDE
+Comment[nb]=Tilpass ikonene i KDE
+Comment[nds]=Lüttbiller för KDE utsöken
+Comment[ne]=केडीई प्रतिमा अनुकूलन गर्नुहोस्
+Comment[nl]=KDE-pictogrammen aanpassen
+Comment[nn]=Tilpass KDE-ikon
+Comment[nso]=Amanya Diemedi tsa KDE
+Comment[oc]=Configura les icones KDE
+Comment[pa]=KDE ਆਈਕਾਨ ਪਸੰਦ
+Comment[pl]=Dostosuj ikony KDE
+Comment[pt]=Alterar os Ícones do KDE
+Comment[pt_BR]=Personalizar os ícones do KDE
+Comment[ro]=Personalizează iconițele KDE
+Comment[ru]=Настройка значков
+Comment[rw]=Kugena imiterere y'udushushondanga twa KDE
+Comment[se]=Heivet KDE-govažiid
+Comment[sk]=Zmena ikon v KDE
+Comment[sl]=Nastavitve ikon za KDE
+Comment[sr]=Прилагоди KDE иконе
+Comment[sr@Latn]=Prilagodi KDE ikone
+Comment[sv]=Anpassa KDE:s ikoner
+Comment[ta]=KDE சின்னங்களை தனதாக்கு
+Comment[tg]=Мизроб кардани нишонаҳои KDE
+Comment[th]=กำหนดไอคอนของ KDE
+Comment[tr]=KDE Simgelerini Özelleştirir
+Comment[tt]=KDE İkonnarın caylaw
+Comment[uk]=Налаштування піктограм KDE
+Comment[uz]=KDE nishonchalarini moslash
+Comment[uz@cyrillic]=KDE нишончаларини мослаш
+Comment[ven]=Customize dziaikhonu dza KDE
+Comment[vi]=Tuỳ chọn các Biểu tượng của KDE
+Comment[wa]=Imådjetes KDE da vosse
+Comment[xh]=Yenza Imphawu zomfanekiso ze KDE Ngokwemfuneko
+Comment[zh_CN]=定制 KDE 图标
+Comment[zh_TW]=自訂 KDE 圖示
+Comment[zu]=Yenza Izimpawu zezithombe ze-KDE ngokwemfuneko
+
+Keywords=icons,effects,size,hicolor,locolor
+Keywords[ar]=icons,effects,size,hicolor,locolor,أيقونات,تأثيرات,حجم لون عالي,لون مخفض,الحجم,التأثيرات,الأيقونات
+Keywords[az]=timsallar,effektlər,böyüklük,yüksək rəng,alçaq rəng
+Keywords[be]=значкі,эфекты,памер,кантраст,высокі кантраст,нізкі кантраст,icons,effects,size,hicolor,locolor
+Keywords[bg]=икона, икони, icons, effects, size, hicolor, locolor
+Keywords[br]=arlunioù,efedoù,ment,liv,liv izel
+Keywords[bs]=icons,effects,size,hicolor,locolor,ikone,efekti,veličina
+Keywords[ca]=icones,efectes,mida,hicolor,locolor
+Keywords[cs]=Ikony,Efekty,Velikost,HiColor,LoColor
+Keywords[csb]=ikònë,efektë,miara,wiele farwów,mało farwów
+Keywords[cy]=eicon,effeithiau,maint,lliw uchel,lliw isel
+Keywords[da]=ikoner,effekter,størrelse,højfarve,lavfarve
+Keywords[de]=Symbole,Icons,Effekte,Größe,64000-Farben,8-Bit-Farben
+Keywords[el]=εικονίδια,εφέ,μέγεθος,hicolor,locolor
+Keywords[en_GB]=icons,effects,size,hicolour,locolour
+Keywords[eo]=piktogramoj,efektoj,grandeco,koloro
+Keywords[es]=iconos,efectos,tamaño,alta profundidad,baja profundidad
+Keywords[et]=ikoonid,efektid,suurus,värv
+Keywords[eu]=ikonoak,efektuak,neurria,hicolor,locolor
+Keywords[fa]=شمایلها، جلوه‌ها، اندازه، پررنگ، کم‌رنگ
+Keywords[fi]=kuvakkeet,tehosteet,koko,korkeaväri,matalaväri
+Keywords[fr]=icônes,effets,taille,hicolor,locolor,coloré
+Keywords[fy]=iconen,byldkaikes,effekten,grutte,ôfmjiting,formaat,kleuren,hege,lege
+Keywords[gl]=iconas,efeitos,tamaño,moitas cores,poucas cores
+Keywords[he]=סמלים,אפקטים,גודל,צבע גבוה,צבע נמוך,icons,effects,size,hicolor,locolor
+Keywords[hi]=प्रतीक,प्रभाव,आकार,अधिक-रंग,कम-रंग
+Keywords[hr]=icons,effects,size,hicolor,locolor,ikone,efekti,veličina,boja
+Keywords[hu]=ikonok,effektek,méret,sokszínű,színszegény,színes
+Keywords[id]=ikon,efek,ukuran,hicolor,locolor
+Keywords[is]=táknmynd,tákn,teikn,áhrif,stærð,hágæði,lágæði,litur,litir
+Keywords[it]=icone,effetti,dimensione,molti colori,pochi colori
+Keywords[ja]=アイコン,効果,サイズ,ハイカラー,ローカラー
+Keywords[ka]=ხატულები,ეფექტები,ზომა,მაღალი გარჩევადობა,დაბალი გარჩევადობა
+Keywords[km]=រូបតំណាង,បែបបទ,ទំហំ,ពណ៌​ខ្ពស់,ពណ៌​ទាប
+Keywords[lo]=ໄອຄອນ,ເອຟເຟັກ,ຂະຫນາດ,ຄວາມລະອງດສີ ຫລາຍ,ຄວາມລະອງດສີຫນ້ອຍ
+Keywords[lt]=ženkliukai,piktogramos,efektai,dydis,hispalva,lospalva
+Keywords[lv]=ikonas,efekti,lielums,hicolor,locolor
+Keywords[mk]=icons,effects,size,hicolor,locolor,икони,ефекти,големина,високи бои,ниски бои
+Keywords[mn]=Тэмдэг,Icons,Нөлөө,Хэмжээ,64000-Өнгө,8бит-Өнгө
+Keywords[nb]=ikoner,effekter,størrelse,mange farger,få farger
+Keywords[nds]=Lüttbiller,Effekten,Grött,hicolor,locolor
+Keywords[ne]=प्रतिमा, प्रभाव, साइज, हाइकलर, लोकलर
+Keywords[nl]=iconen,pictogrammen,effecten,grootte,afmeting,formaat,kleuren
+Keywords[nn]=ikon,effektar,storleik,mange fargar,få fargar
+Keywords[nso]=diemedi,dikamego,bogolo,mmala wa godimo,mmala wa tlase
+Keywords[oc]=icones,efectes,talha,hicolor,locolor
+Keywords[pa]=icons,effects,size,hicolor,locolor,ਆਈਕਾਨ,ਪਰਭਾਵ,ਅਕਾਰ
+Keywords[pl]=ikony,efekty,rozmiar,wiele kolorów,mało kolorów
+Keywords[pt]=ícones,efeitos,tamanho,muitas cores,poucas cores
+Keywords[pt_BR]=ícones,efeitos,tamanho,alta resolução,baixa resolução
+Keywords[ro]=iconițe,efecte,mărime,culori multe,culori puține
+Keywords[rw]=Udushushondanga,ingaruka,ingano,ibara-hejuru,ibara-hasi
+Keywords[se]=govažat,effects,sturrodat,máŋga ivnni,unnan ivnnit
+Keywords[sk]=ikony,ikonky,veľkosť,hicolor,locolor
+Keywords[sl]=ikone,efekti,velikost,barve
+Keywords[sr]=icons,effects,size,hicolor,locolor,иконе,ефекти,величина,пуно боја,мало боја
+Keywords[sr@Latn]=icons,effects,size,hicolor,locolor,ikone,efekti,veličina,puno boja,malo boja
+Keywords[sv]=ikoner,effekter,storlek,många färger,få färger
+Keywords[ta]=சின்னங்கள்,விளைவுகள்,அளவு,அதிக வண்ணம்,குறைந்த வண்ணம்
+Keywords[th]=ไอคอน,เอฟเฟ็กต์,ขนาด,ความละเอียดสีมาก,ความละเอียดสีน้อย
+Keywords[tr]=simgeler,efektler,boyut,yüksek renk,düşük renk
+Keywords[uk]=піктограми,icons,ефекти,розмір,кольори
+Keywords[uz]=nishonchalar,effektlar,oʻlchami
+Keywords[uz@cyrillic]=нишончалар,эффектлар,ўлчами
+Keywords[ven]=dziaikhono,zwivhangi,saizi,muvhala wa ntha,muvhala wa fhasi
+Keywords[vi]=biểu tượng,hiệu ứng,cỡ,màu tươi,màu thẫm
+Keywords[wa]=imådjetes,efets,grandeu,hicolor,locolor
+Keywords[xh]=imphawu zomfanekiso,iziphumo,ubungakanani,hicolor,locolor
+Keywords[zh_CN]=icons,effects,size,hicolor,locolor,图标,效果,大小,高色彩,低色彩
+Keywords[zh_TW]=icons,effects,size,hicolor,locolor,圖示,效果,大小,高彩,低彩
+Keywords[zu]=izimpawu,imiphumela,usayizi,umbala ophezulu,umbala ophansi
+
+Categories=Qt;KDE;X-KDE-settings-looknfeel;
diff --git a/kcontrol/icons/icons.h b/kcontrol/icons/icons.h
new file mode 100644
index 000000000..93171f6d1
--- /dev/null
+++ b/kcontrol/icons/icons.h
@@ -0,0 +1,152 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * This file is part of the KDE project, module kcmdisplay.
+ * Copyright (C) 2000 Geert Jansen <jansen@kde.org>
+ * with minor additions and based on ideas from
+ * Torsten Rahn <torsten@kde.org>
+ *
+ * You can Freely distribute this program under the GNU General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ */
+
+#ifndef __icons_h__
+#define __icons_h__
+
+#include <qcolor.h>
+#include <qimage.h>
+#include <qvaluelist.h>
+
+#include <kcmodule.h>
+#include <kdialogbase.h>
+
+class QCheckBox;
+class QColor;
+class QComboBox;
+class QGridLayout;
+class QGroupBox;
+class QIconView;
+class QLabel;
+class QListBox;
+class QListView;
+class QPushButton;
+class QSlider;
+class QTabWidget;
+class QWidget;
+
+class KColorButton;
+class KConfig;
+class KIconEffect;
+class KIconLoader;
+class KIconTheme;
+
+struct Effect
+{
+ int type;
+ float value;
+ QColor color;
+ QColor color2;
+ bool transparant;
+};
+
+
+/**
+ * The General Icons tab in kcontrol.
+ */
+class KIconConfig: public KCModule
+{
+ Q_OBJECT
+
+public:
+ KIconConfig(QWidget *parent, const char *name=0);
+ ~KIconConfig();
+
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+ void preview();
+
+private slots:
+ void slotEffectSetup0() { EffectSetup(0); }
+ void slotEffectSetup1() { EffectSetup(1); }
+ void slotEffectSetup2() { EffectSetup(2); }
+
+ void slotUsage(int index);
+ void slotSize(int index);
+ void slotDPCheck(bool check);
+ void slotAnimatedCheck(bool check);
+
+private:
+ void preview(int i);
+ void EffectSetup(int state);
+ QPushButton *addPreviewIcon(int i, const QString &str, QWidget *parent, QGridLayout *lay);
+ void init();
+ void initDefaults();
+ void read();
+ void apply();
+
+
+ bool mbDP[6], mbChanged[6], mbAnimated[6];
+ int mSizes[6];
+ QValueList<int> mAvSizes[6];
+
+ Effect mEffects[6][3];
+ Effect mDefaultEffect[3];
+
+ int mUsage;
+ QString mTheme, mExample;
+ QStringList mGroups, mStates;
+
+ KIconEffect *mpEffect;
+ KIconTheme *mpTheme;
+ KIconLoader *mpLoader;
+ KConfig *mpConfig;
+
+ typedef QLabel *QLabelPtr;
+ QLabelPtr mpPreview[3];
+
+ QListBox *mpUsageList;
+ QComboBox *mpSizeBox;
+ QCheckBox *mpDPCheck, *wordWrapCB, *underlineCB, *mpAnimatedCheck;
+ QTabWidget *m_pTabWidget;
+ QWidget *m_pTab1;
+};
+
+class KIconEffectSetupDialog: public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ KIconEffectSetupDialog(const Effect &, const Effect &,
+ const QString &, const QImage &,
+ QWidget *parent=0L, char *name=0L);
+ ~KIconEffectSetupDialog();
+ Effect effect() { return mEffect; }
+
+protected:
+ void preview();
+ void init();
+
+protected slots:
+ void slotEffectValue(int value);
+ void slotEffectColor(const QColor &col);
+ void slotEffectColor2(const QColor &col);
+ void slotEffectType(int type);
+ void slotSTCheck(bool b);
+ void slotDefault();
+
+private:
+ KIconEffect *mpEffect;
+ QListBox *mpEffectBox;
+ QCheckBox *mpSTCheck;
+ QSlider *mpEffectSlider;
+ KColorButton *mpEColButton;
+ KColorButton *mpECol2Button;
+ Effect mEffect;
+ Effect mDefaultEffect;
+ QImage mExample;
+ QGroupBox *mpEffectGroup;
+ QLabel *mpPreview, *mpEffectLabel, *mpEffectColor, *mpEffectColor2;
+};
+
+#endif
diff --git a/kcontrol/icons/iconthemes.cpp b/kcontrol/icons/iconthemes.cpp
new file mode 100644
index 000000000..a79ad6ddf
--- /dev/null
+++ b/kcontrol/icons/iconthemes.cpp
@@ -0,0 +1,452 @@
+/**
+ * Copyright (c) 2000 Antonio Larrosa <larrosa@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <qfileinfo.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+
+#include <kdebug.h>
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include <kservice.h>
+#include <klocale.h>
+#include <ksimpleconfig.h>
+#undef Unsorted
+#include <kipc.h>
+
+#include <klistview.h>
+#include <kurlrequesterdlg.h>
+#include <kmessagebox.h>
+#include <kprogress.h>
+#include <kiconloader.h>
+
+#include <kio/job.h>
+#include <kio/netaccess.h>
+#include <ktar.h>
+
+#ifdef HAVE_LIBART
+#include <ksvgiconengine.h>
+#endif
+
+#include "iconthemes.h"
+
+IconThemesConfig::IconThemesConfig(QWidget *parent, const char *name)
+ : KCModule(parent, name)
+{
+ QVBoxLayout *topLayout = new QVBoxLayout(this, KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ QFrame *m_preview=new QFrame(this);
+ m_preview->setMinimumHeight(50);
+
+ QHBoxLayout *lh2=new QHBoxLayout( m_preview );
+ m_previewExec=new QLabel(m_preview);
+ m_previewExec->setPixmap(DesktopIcon("exec"));
+ m_previewFolder=new QLabel(m_preview);
+ m_previewFolder->setPixmap(DesktopIcon("folder"));
+ m_previewDocument=new QLabel(m_preview);
+ m_previewDocument->setPixmap(DesktopIcon("document"));
+
+ lh2->addStretch(10);
+ lh2->addWidget(m_previewExec);
+ lh2->addStretch(1);
+ lh2->addWidget(m_previewFolder);
+ lh2->addStretch(1);
+ lh2->addWidget(m_previewDocument);
+ lh2->addStretch(10);
+
+
+ m_iconThemes=new KListView(this,"IconThemeList");
+ m_iconThemes->addColumn(i18n("Name"));
+ m_iconThemes->addColumn(i18n("Description"));
+ m_iconThemes->setAllColumnsShowFocus( true );
+ m_iconThemes->setFullWidth(true);
+ connect(m_iconThemes,SIGNAL(selectionChanged(QListViewItem *)),
+ SLOT(themeSelected(QListViewItem *)));
+
+ QPushButton *installButton=new QPushButton( i18n("Install New Theme..."),
+ this, "InstallNewTheme");
+ connect(installButton,SIGNAL(clicked()),SLOT(installNewTheme()));
+ m_removeButton=new QPushButton( i18n("Remove Theme"),
+ this, "RemoveTheme");
+ connect(m_removeButton,SIGNAL(clicked()),SLOT(removeSelectedTheme()));
+
+ topLayout->addWidget(
+ new QLabel(i18n("Select the icon theme you want to use:"), this));
+ topLayout->addWidget(m_preview);
+ topLayout->addWidget(m_iconThemes);
+ QHBoxLayout *lg = new QHBoxLayout(topLayout, KDialog::spacingHint());
+ lg->addWidget(installButton);
+ lg->addWidget(m_removeButton);
+
+ loadThemes();
+
+ load();
+
+ m_iconThemes->setFocus();
+}
+
+IconThemesConfig::~IconThemesConfig()
+{
+}
+
+QListViewItem *IconThemesConfig::iconThemeItem(const QString &name)
+{
+ QListViewItem *item;
+ for ( item=m_iconThemes->firstChild(); item ; item=item->nextSibling() )
+ if (m_themeNames[item->text(0)]==name) return item;
+
+ return 0L;
+}
+
+void IconThemesConfig::loadThemes()
+{
+ m_iconThemes->clear();
+ m_themeNames.clear();
+ QStringList themelist(KIconTheme::list());
+ QString name;
+ QString tname;
+ QStringList::Iterator it;
+ for (it=themelist.begin(); it != themelist.end(); ++it)
+ {
+ KIconTheme icontheme(*it);
+ if (!icontheme.isValid()) kdDebug() << "notvalid\n";
+ if (icontheme.isHidden()) continue;
+
+ name=icontheme.name();
+ tname=name;
+
+ // Just in case we have duplicated icon theme names on separate directories
+ for (int i=2; m_themeNames.find(tname)!=m_themeNames.end() ; i++)
+ tname=QString("%1-%2").arg(name).arg(i);
+
+ m_iconThemes->insertItem(new QListViewItem(m_iconThemes,name,
+ icontheme.description()));
+
+ m_themeNames.insert(name,*it);
+
+ }
+}
+
+void IconThemesConfig::installNewTheme()
+{
+ KURL themeURL = KURLRequesterDlg::getURL(QString::null, this,
+ i18n("Drag or Type Theme URL"));
+ kdDebug() << themeURL.prettyURL() << endl;
+
+ if (themeURL.url().isEmpty()) return;
+
+ QString themeTmpFile;
+ // themeTmpFile contains the name of the downloaded file
+
+ if (!KIO::NetAccess::download(themeURL, themeTmpFile, this)) {
+ QString sorryText;
+ if (themeURL.isLocalFile())
+ sorryText = i18n("Unable to find the icon theme archive %1.");
+ else
+ sorryText = i18n("Unable to download the icon theme archive;\n"
+ "please check that address %1 is correct.");
+ KMessageBox::sorry(this, sorryText.arg(themeURL.prettyURL()));
+ return;
+ }
+
+ QStringList themesNames = findThemeDirs(themeTmpFile);
+ if (themesNames.isEmpty()) {
+ QString invalidArch(i18n("The file is not a valid icon theme archive."));
+ KMessageBox::error(this, invalidArch);
+
+ KIO::NetAccess::removeTempFile(themeTmpFile);
+ return;
+ }
+
+ if (!installThemes(themesNames, themeTmpFile)) {
+ //FIXME: make me able to know what is wrong....
+ // QStringList instead of bool?
+ QString somethingWrong =
+ i18n("A problem occurred during the installation process; "
+ "however, most of the themes in the archive have been installed");
+ KMessageBox::error(this, somethingWrong);
+ }
+
+ KIO::NetAccess::removeTempFile(themeTmpFile);
+
+ KGlobal::instance()->newIconLoader();
+ loadThemes();
+
+ QListViewItem *item=iconThemeItem(KIconTheme::current());
+ m_iconThemes->setSelected(item, true);
+ updateRemoveButton();
+}
+
+bool IconThemesConfig::installThemes(const QStringList &themes, const QString &archiveName)
+{
+ bool everythingOk = true;
+ QString localThemesDir(locateLocal("icon", "./"));
+
+ KProgressDialog progressDiag(this, "themeinstallprogress",
+ i18n("Installing icon themes"),
+ QString::null,
+ true);
+ progressDiag.setAutoClose(true);
+ progressDiag.progressBar()->setTotalSteps(themes.count());
+ progressDiag.show();
+
+ KTar archive(archiveName);
+ archive.open(IO_ReadOnly);
+ kapp->processEvents();
+
+ const KArchiveDirectory* rootDir = archive.directory();
+
+ KArchiveDirectory* currentTheme;
+ for (QStringList::ConstIterator it = themes.begin();
+ it != themes.end();
+ ++it) {
+ progressDiag.setLabel(
+ i18n("<qt>Installing <strong>%1</strong> theme</qt>")
+ .arg(*it));
+ kapp->processEvents();
+
+ if (progressDiag.wasCancelled())
+ break;
+
+ currentTheme = dynamic_cast<KArchiveDirectory*>(
+ const_cast<KArchiveEntry*>(
+ rootDir->entry(*it)));
+ if (currentTheme == NULL) {
+ // we tell back that something went wrong, but try to install as much
+ // as possible
+ everythingOk = false;
+ continue;
+ }
+
+ currentTheme->copyTo(localThemesDir + *it);
+ progressDiag.progressBar()->advance(1);
+ }
+
+ archive.close();
+ return everythingOk;
+}
+
+QStringList IconThemesConfig::findThemeDirs(const QString &archiveName)
+{
+ QStringList foundThemes;
+
+ KTar archive(archiveName);
+ archive.open(IO_ReadOnly);
+ const KArchiveDirectory* themeDir = archive.directory();
+
+ KArchiveEntry* possibleDir = 0L;
+ KArchiveDirectory* subDir = 0L;
+
+ // iterate all the dirs looking for an index.theme or index.desktop file
+ QStringList entries = themeDir->entries();
+ for (QStringList::Iterator it = entries.begin();
+ it != entries.end();
+ ++it) {
+ possibleDir = const_cast<KArchiveEntry*>(themeDir->entry(*it));
+ if (possibleDir->isDirectory()) {
+ subDir = dynamic_cast<KArchiveDirectory*>( possibleDir );
+ if (subDir && (subDir->entry("index.theme") != NULL ||
+ subDir->entry("index.desktop") != NULL))
+ foundThemes.append(subDir->name());
+ }
+ }
+
+ archive.close();
+ return foundThemes;
+}
+
+void IconThemesConfig::removeSelectedTheme()
+{
+ QListViewItem *selected = m_iconThemes->selectedItem();
+ if (!selected)
+ return;
+
+ QString question=i18n("<qt>Are you sure you want to remove the "
+ "<strong>%1</strong> icon theme?<br>"
+ "<br>"
+ "This will delete the files installed by this theme.</qt>").
+ arg(selected->text(0));
+
+ bool deletingCurrentTheme=(selected==iconThemeItem(KIconTheme::current()));
+
+ int r=KMessageBox::warningContinueCancel(this,question,i18n("Confirmation"),KStdGuiItem::del());
+ if (r!=KMessageBox::Continue) return;
+
+ KIconTheme icontheme(m_themeNames[selected->text(0)]);
+
+ // delete the index file before the async KIO::del so loadThemes() will
+ // ignore that dir.
+ unlink(QFile::encodeName(icontheme.dir()+"/index.theme").data());
+ unlink(QFile::encodeName(icontheme.dir()+"/index.desktop").data());
+ KIO::del(KURL( icontheme.dir() ));
+
+ KGlobal::instance()->newIconLoader();
+
+ loadThemes();
+
+ QListViewItem *item=0L;
+ //Fallback to the default if we've deleted the current theme
+ if (!deletingCurrentTheme)
+ item=iconThemeItem(KIconTheme::current());
+ if (!item)
+ item=iconThemeItem(KIconTheme::defaultThemeName());
+
+ m_iconThemes->setSelected(item, true);
+ updateRemoveButton();
+
+ if (deletingCurrentTheme) // Change the configuration
+ save();
+}
+
+void IconThemesConfig::updateRemoveButton()
+{
+ QListViewItem *selected = m_iconThemes->selectedItem();
+ bool enabled = false;
+ if (selected)
+ {
+ KIconTheme icontheme(m_themeNames[selected->text(0)]);
+ QFileInfo fi(icontheme.dir());
+ enabled = fi.isWritable();
+ // Don't let users remove the current theme.
+ if(m_themeNames[selected->text(0)] == KIconTheme::current() ||
+ m_themeNames[selected->text(0)] == KIconTheme::defaultThemeName())
+ enabled = false;
+ }
+ m_removeButton->setEnabled(enabled);
+}
+
+void IconThemesConfig::themeSelected(QListViewItem *item)
+{
+#ifdef HAVE_LIBART
+ KSVGIconEngine engine;
+#endif
+ QString dirName(m_themeNames[item->text(0)]);
+ KIconTheme icontheme(dirName);
+ if (!icontheme.isValid()) kdDebug() << "notvalid\n";
+
+ updateRemoveButton();
+ const int size = icontheme.defaultSize(KIcon::Desktop);
+
+ KIcon icon=icontheme.iconPath("exec.png", size, KIcon::MatchBest);
+ if (!icon.isValid()) {
+#ifdef HAVE_LIBART
+ icon=icontheme.iconPath("exec.svg", size, KIcon::MatchBest);
+ if(engine.load(size, size, icon.path))
+ m_previewExec->setPixmap(*engine.image());
+ else {
+ icon=icontheme.iconPath("exec.svgz", size, KIcon::MatchBest);
+ if(engine.load(size, size, icon.path))
+ m_previewExec->setPixmap(*engine.image());
+ }
+#endif
+ }
+ else
+ m_previewExec->setPixmap(QPixmap(icon.path));
+
+ icon=icontheme.iconPath("folder.png",size,KIcon::MatchBest);
+ if (!icon.isValid()) {
+#ifdef HAVE_LIBART
+ icon=icontheme.iconPath("folder.svg", size, KIcon::MatchBest);
+ if(engine.load(size, size, icon.path))
+ m_previewFolder->setPixmap(*engine.image());
+ else {
+ icon=icontheme.iconPath("folder.svgz", size, KIcon::MatchBest);
+ if(engine.load(size, size, icon.path))
+ m_previewFolder->setPixmap(*engine.image());
+ }
+#endif
+ }
+ else
+ m_previewFolder->setPixmap(QPixmap(icon.path));
+
+ icon=icontheme.iconPath("txt.png",size,KIcon::MatchBest);
+ if (!icon.isValid()) {
+#ifdef HAVE_LIBART
+ icon=icontheme.iconPath("txt.svg", size, KIcon::MatchBest);
+ if(engine.load(size, size, icon.path))
+ m_previewDocument->setPixmap(*engine.image());
+ else {
+ icon=icontheme.iconPath("txt.svgz", size, KIcon::MatchBest);
+ if(engine.load(size, size, icon.path))
+ m_previewDocument->setPixmap(*engine.image());
+ }
+#endif
+ }
+ else
+ m_previewDocument->setPixmap(QPixmap(icon.path));
+
+ emit changed(true);
+ m_bChanged = true;
+}
+
+void IconThemesConfig::load()
+{
+ m_defaultTheme=iconThemeItem(KIconTheme::current());
+ m_iconThemes->setSelected(m_defaultTheme, true);
+ updateRemoveButton();
+
+ emit changed(false);
+ m_bChanged = false;
+}
+
+void IconThemesConfig::save()
+{
+ if (!m_bChanged)
+ return;
+ QListViewItem *selected = m_iconThemes->selectedItem();
+ if (!selected)
+ return;
+
+ KSimpleConfig *config = new KSimpleConfig("kdeglobals", false);
+ config->setGroup("Icons");
+ config->writeEntry("Theme", m_themeNames[selected->text(0)]);
+ delete config;
+
+ KIconTheme::reconfigure();
+ emit changed(false);
+
+ for (int i=0; i<KIcon::LastGroup; i++)
+ {
+ KIPC::sendMessageAll(KIPC::IconChanged, i);
+ }
+
+ KService::rebuildKSycoca(this);
+
+ m_bChanged = false;
+ m_removeButton->setEnabled(false);
+}
+
+void IconThemesConfig::defaults()
+{
+ if (m_iconThemes->currentItem()==m_defaultTheme) return;
+
+ m_iconThemes->setSelected(m_defaultTheme, true);
+ updateRemoveButton();
+
+ emit changed(true);
+ m_bChanged = true;
+}
+
+#include "iconthemes.moc"
diff --git a/kcontrol/icons/iconthemes.h b/kcontrol/icons/iconthemes.h
new file mode 100644
index 000000000..d6d1a9e91
--- /dev/null
+++ b/kcontrol/icons/iconthemes.h
@@ -0,0 +1,72 @@
+/**
+ * Copyright (c) 2000 Antonio Larrosa <larrosa@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef ICONTHEMES_H
+#define ICONTHEMES_H
+
+#include <kcmodule.h>
+#include <qmap.h>
+#include <klistview.h>
+
+class QPushButton;
+class DeviceManager;
+class QCheckBox;
+class QStringList;
+
+
+class IconThemesConfig : public KCModule
+{
+ Q_OBJECT
+
+public:
+ IconThemesConfig(QWidget *parent = 0L, const char *name = 0L);
+ virtual ~IconThemesConfig();
+
+ void loadThemes();
+ bool installThemes(const QStringList &themes, const QString &archiveName);
+ QStringList findThemeDirs(const QString &archiveName);
+
+ void updateRemoveButton();
+
+ void load();
+ void save();
+ void defaults();
+
+ int buttons();
+
+protected slots:
+ void themeSelected(QListViewItem *item);
+ void installNewTheme();
+ void removeSelectedTheme();
+
+private:
+ QListViewItem *iconThemeItem(const QString &name);
+
+ KListView *m_iconThemes;
+ QPushButton *m_removeButton;
+
+ QLabel *m_previewExec;
+ QLabel *m_previewFolder;
+ QLabel *m_previewDocument;
+ QListViewItem *m_defaultTheme;
+ QMap <QString, QString>m_themeNames;
+ bool m_bChanged;
+};
+
+#endif // ICONTHEMES_H
+
diff --git a/kcontrol/icons/main.cpp b/kcontrol/icons/main.cpp
new file mode 100644
index 000000000..fe8c8c1b3
--- /dev/null
+++ b/kcontrol/icons/main.cpp
@@ -0,0 +1,105 @@
+/*
+ * main.cpp
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ *
+ * 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 <qlayout.h>
+
+#include <kgenericfactory.h>
+#include <kaboutdata.h>
+
+#include "icons.h"
+#include "iconthemes.h"
+#include "main.h"
+
+/**** DLL Interface ****/
+typedef KGenericFactory<IconModule, QWidget> IconsFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_icons, IconsFactory("kcmicons") )
+
+/**** IconModule ****/
+
+IconModule::IconModule(QWidget *parent, const char *name, const QStringList &)
+ : KCModule(IconsFactory::instance(), parent, name)
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ tab = new QTabWidget(this);
+ layout->addWidget(tab);
+
+ tab1 = new IconThemesConfig(this, "themes");
+ tab->addTab(tab1, i18n("&Theme"));
+ connect(tab1, SIGNAL(changed(bool)), this, SLOT(moduleChanged(bool)));
+
+ tab2 = new KIconConfig(this, "effects");
+ tab->addTab(tab2, i18n("Ad&vanced"));
+ connect(tab2, SIGNAL(changed(bool)), this, SLOT(moduleChanged(bool)));
+
+ KAboutData* about = new KAboutData("kcmicons", I18N_NOOP("Icons"), "3.0",
+ I18N_NOOP("Icons Control Panel Module"),
+ KAboutData::License_GPL,
+ I18N_NOOP("(c) 2000-2003 Geert Jansen"), 0, 0);
+ about->addAuthor("Geert Jansen", 0, "jansen@kde.org");
+ about->addAuthor("Antonio Larrosa Jimenez", 0, "larrosa@kde.org");
+ about->addCredit("Torsten Rahn", 0, "torsten@kde.org");
+ setAboutData( about );
+}
+
+
+void IconModule::load()
+{
+ tab1->load();
+ tab2->load();
+}
+
+
+void IconModule::save()
+{
+ tab1->save();
+ tab2->save();
+}
+
+
+void IconModule::defaults()
+{
+ tab1->defaults();
+ tab2->defaults();
+}
+
+
+void IconModule::moduleChanged(bool state)
+{
+ emit changed(state);
+}
+
+QString IconModule::quickHelp() const
+{
+ return i18n("<h1>Icons</h1>"
+ "This module allows you to choose the icons for your desktop.<p>"
+ "To choose an icon theme, click on its name and apply your choice by pressing the \"Apply\" button below. If you do not want to apply your choice you can press the \"Reset\" button to discard your changes.</p>"
+ "<p>By pressing the \"Install New Theme\" button you can install your new icon theme by writing its location in the box or browsing to the location."
+ " Press the \"OK\" button to finish the installation.</p>"
+ "<p>The \"Remove Theme\" button will only be activated if you select a theme that you installed using this module."
+ " You are not able to remove globally installed themes here.</p>"
+ "<p>You can also specify effects that should be applied to the icons.</p>");
+}
+
+
+
+#include "main.moc"
diff --git a/kcontrol/icons/main.h b/kcontrol/icons/main.h
new file mode 100644
index 000000000..90892351f
--- /dev/null
+++ b/kcontrol/icons/main.h
@@ -0,0 +1,55 @@
+/*
+ * main.h
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ *
+ * 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.
+ */
+
+
+#ifndef __MAIN_H__
+#define __MAIN_H__
+
+
+#include <qtabwidget.h>
+#include <kcmodule.h>
+
+class IconModule : public KCModule
+{
+ Q_OBJECT
+
+public:
+ IconModule(QWidget *parent, const char *name, const QStringList &);
+
+ void load();
+ void save();
+ void defaults();
+ QString quickHelp() const;
+
+protected slots:
+ void moduleChanged(bool state);
+
+private:
+ QTabWidget *tab;
+
+ KCModule *tab1;
+ KCModule *tab2;
+};
+
+
+#endif
diff --git a/kcontrol/icons/testicons.cpp b/kcontrol/icons/testicons.cpp
new file mode 100644
index 000000000..d47f8af72
--- /dev/null
+++ b/kcontrol/icons/testicons.cpp
@@ -0,0 +1,13 @@
+/* Test programme for icons setup module. */
+
+#include <kapplication.h>
+#include "icons.h"
+
+int main(int argc, char **argv)
+{
+ KApplication app(argc, argv, "testicons");
+ KIconConfig *w = new KIconConfig(0L, "testicons");
+ app.setMainWidget(w);
+ w->show();
+ return app.exec();
+}
diff --git a/kcontrol/icons/uninstall.desktop b/kcontrol/icons/uninstall.desktop
new file mode 100644
index 000000000..e1e3e1732
--- /dev/null
+++ b/kcontrol/icons/uninstall.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
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 <hoelzer@physik.uni-wuerzburg.de>
+
+
+Various authors contributed the code for non-Linux systems, among them:
+
+ David Brownlee <abs@NetBSD.org> [NetBSD]
+ Jaromir Dolecek <dolecek@ics.muni.cz> [NetBSD]
+ Paul Kendall <paul@orion.co.nz> [IRIX]
+ Vladimir Kushnir <kushn@olinet.isf.kiev.ua> [FreeBSD]
+ Aubert Pierre <paubert@laninsa.insa-lyon.fr> [HP-UX]
+ Alex Zepeda <zipzippy@sonic.net> [FreeBSD]
+ Sebestyen Zoltan <szoli@digo.inf.elte.hu> [FreeBSD]
+
+Conversion to kcontrol applet:
+
+ Matthias Hoelzer <hoelzer@physik.uni-wuerzburg.de>
+
+
+Added more informations for Linux and HP-UX (empty functions for the other systems):
+
+ Helge Deller <deller@gmx.de>
+ (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 <zipzippy@sonic.net>
+
+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 <alex@zippy.dyn.ml.org>
+
+ * 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 <deller@gmx.de>
+
+ * 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 <f.d.m.haldane@cwix.com>
+
+ * 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 <deller@kde.org>
+
+ ** main.cpp includes this file ! **
+
+ This source-file includes another system-dependet sourcefile called
+ info_<systemname>.cpp
+ which should define one or more of the following defines to
+ indicate, that this information is really available.
+
+ #define INFO_CPU_AVAILABLE
+ #define INFO_IRQ_AVAILABLE
+ #define INFO_DMA_AVAILABLE
+ #define INFO_PCI_AVAILABLE
+ #define INFO_IOPORTS_AVAILABLE
+ #define INFO_SOUND_AVAILABLE
+ #define INFO_DEVICES_AVAILABLE
+ #define INFO_SCSI_AVAILABLE
+ #define INFO_PARTITIONS_AVAILABLE
+ #define INFO_XSERVER_AVAILABLE
+
+ right now, there is the problem, that also the .desktop-files should
+ depend on the systemname, so that only available .desktop-files will
+ be copied to kde/applnk/Settings/Information !!
+*/
+
+#include <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, "deller@kde.org");
+ 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 <arbab@austin.ibm.com>
+ *
+ * GetInfo_Partitions() and its helpers (get_fs_usage, fs_adjust_blocks)
+ * taken from info_hpux.cpp.
+ *
+ */
+
+#include <cf.h>
+#define class _class
+#include <odmi.h>
+#include <sys/cfgodm.h>
+#include <sys/cfgdb.h>
+#undef class
+#include <nl_types.h>
+#include <string.h>
+#include <kdebug.h>
+#include <stdlib.h>
+
+#define INFO_DEVICES_AVAILABLE
+#define INFO_SCSI_AVAILABLE
+#define INFO_PCI_AVAILABLE
+
+#include <sys/statfs.h>
+#include <sys/statvfs.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fstab.h>
+
+#define INFO_PARTITIONS_AVAILABLE
+
+#include <errno.h>
+#include <sys/utsname.h>
+
+#define INFO_CPU_AVAILABLE
+
+#define INFO_IRQ_AVAILABLE
+#define INFO_DMA_AVAILABLE
+#define INFO_IOPORTS_AVAILABLE
+#define INFO_SOUND_AVAILABLE
+#define INFO_XSERVER_AVAILABLE
+
+char *
+device_description(struct CuDv *cudv)
+{
+ char *desc = NULL;
+ struct PdDv *pddv = cudv->PdDvLn; /* link to Predefined Devices database */
+ nl_catd cat;
+
+ cat = catopen("/usr/lib/methods/devices.cat", NL_CAT_LOCALE);
+ if ((int)cat == -1)
+ return NULL;
+
+ desc = strdup( catgets(cat, pddv->setno, pddv->msgno, "N/A") );
+ catclose(cat);
+
+ return desc;
+}
+
+bool
+list_devices(QListView *lBox, char *criteria)
+{
+ struct CuDv *cudv; /* Customized Devices */
+ struct listinfo info;
+ int i;
+ char *cudv_desc;
+ QString cudv_status;
+ QListViewItem *lastitem = NULL;
+
+ lBox->addColumn(i18n("Name"));
+ lBox->addColumn(i18n("Status"));
+ lBox->addColumn(i18n("Location"));
+ lBox->addColumn(i18n("Description"));
+
+ if (odm_initialize() == -1)
+ {
+ 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 - bhughes@trolltech.com
+
+ 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 (deller@gmx.de)
+ free source under GPL
+
+ !!!!! this file will be included by info.cpp !!!!!
+*/
+
+
+// Default for unsupportet systems
+
+// the following defines are not really ok here, but maybe we should show, what
+// Information could be displayed here....
+
+#define INFO_CPU_AVAILABLE
+#define INFO_IRQ_AVAILABLE
+#define INFO_DMA_AVAILABLE
+#define INFO_PCI_AVAILABLE
+#define INFO_IOPORTS_AVAILABLE
+#define INFO_SOUND_AVAILABLE
+#define INFO_DEVICES_AVAILABLE
+#define INFO_SCSI_AVAILABLE
+#define INFO_PARTITIONS_AVAILABLE
+#define INFO_XSERVER_AVAILABLE
+#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 (deller@gmx.de),
+ with some pieces of code from Aubert Pierre.
+
+ Last modified: done:
+ 1999-06-21 added more models to the lookup-table (deller)
+ 1999-06-18 added support for 64-Bit HP-UX in CPU-detection(deller)
+ 1999-05-04 added audio(alib)-support (deller)
+ 1999-04-27 [tested with HP-UX 10.20 (HP9000/715/64-EISA)]
+ added support for nearly all categories
+ (means: not finished!)
+ 1998-11-01 first, nearly empty version (deller)
+ with a little source for CPU from Aubert Pierre
+*/
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/pstat.h>
+#include <sys/utsname.h>
+#include <sys/statvfs.h>
+#include <sys/vfs.h>
+#include <fstab.h>
+#include <stdlib.h>
+#include <qfile.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 <deller@gmx.de>
+ (C) Copyright 2006 by Jahshan Bhatti <jabhatti91@gmail.com> (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 (f.d.m.haldane@cwix.com)
+
+*/
+
+#include <unistd.h>
+#include <syscall.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <linux/kernel.h>
+#include <ctype.h>
+#include <config.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 <dolecek@ics.muni.cz>. CPU info
+ * code has been imported from implementation of processor.cpp for KDE 1.0
+ * by David Brownlee <abs@NetBSD.org> as found in NetBSD packages collection.
+ * Hubert Feyer <hubertf@NetBSD.org> enhanced the sound information printing
+ * quite a lot, too.
+ *
+ * The code is placed into public domain. Do whatever you want with it.
+ */
+
+#define INFO_CPU_AVAILABLE
+#define INFO_IRQ_AVAILABLE
+#define INFO_DMA_AVAILABLE
+#define INFO_PCI_AVAILABLE
+#define INFO_IOPORTS_AVAILABLE
+#define INFO_SOUND_AVAILABLE
+#define INFO_DEVICES_AVAILABLE
+#define INFO_SCSI_AVAILABLE
+#define INFO_PARTITIONS_AVAILABLE
+#define INFO_XSERVER_AVAILABLE
+
+
+/*
+ * all following functions should return TRUE, when the Information
+ * was filled into the lBox-Widget. Returning FALSE indicates that
+ * information was not available.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <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 <dolecek@ics.muni.cz>. CPU info
+ * code has been imported from implementation of processor.cpp for KDE 1.0
+ * by David Brownlee <abs@NetBSD.org> as found in NetBSD packages collection.
+ * Hubert Feyer <hubertf@NetBSD.org> enhanced the sound information printing
+ * quite a lot, too.
+ *
+ * The code is placed into public domain. Do whatever you want with it.
+ */
+
+#define INFO_CPU_AVAILABLE
+#define INFO_IRQ_AVAILABLE
+#define INFO_DMA_AVAILABLE
+#define INFO_PCI_AVAILABLE
+#define INFO_IOPORTS_AVAILABLE
+#define INFO_SOUND_AVAILABLE
+#define INFO_DEVICES_AVAILABLE
+#define INFO_SCSI_AVAILABLE
+#define INFO_PARTITIONS_AVAILABLE
+#define INFO_XSERVER_AVAILABLE
+
+
+/*
+ * all following functions should return TRUE, when the Information
+ * was filled into the lBox-Widget. Returning FALSE indicates that
+ * information was not available.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <stdio.h> /* for NULL */
+#include <stdlib.h> /* for malloc(3) */
+
+#include <qfile.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 <ranger@befunk.com>
+ *
+ * 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 <tk@Genetik.Uni-Bielefeld.DE>
+ */
+
+#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 (rr@sco.com)
+ Initially based on info_sgi.cpp
+*/
+
+#define INFO_CPU_AVAILABLE
+#define INFO_IRQ_AVAILABLE
+#define INFO_DMA_AVAILABLE
+#define INFO_PCI_AVAILABLE
+#define INFO_IOPORTS_AVAILABLE
+#define INFO_SOUND_AVAILABLE
+#define INFO_DEVICES_AVAILABLE
+#define INFO_SCSI_AVAILABLE
+#define INFO_PARTITIONS_AVAILABLE
+#define INFO_XSERVER_AVAILABLE
+
+#define INFO_DEV_SNDSTAT "/dev/sndstat"
+
+#include <sys/systeminfo.h>
+
+/* all following functions should return true, when the Information
+ was filled into the lBox-Widget.
+ returning false indicates, that information was not available.
+*/
+
+bool GetInfo_ReadfromFile( QListView *lBox, char *Name, char splitchar )
+{
+ QString str;
+ char buf[512];
+
+ QFile *file = new QFile(Name);
+ QListViewItem* olditem = 0;
+
+ if(!file->open(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 <hoelzer@kde.org>
+ *
+ * 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 <deller@gmx.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ *
+ */
+
+#include <sys/param.h> /* for BSD */
+
+#include <qlayout.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, "deller@gmx.de");
+ setAboutData( about );
+
+ QString title, initial_str;
+ QLabel *Widget = 0;
+ int i, j;
+
+ ram_colors_initialized =
+ swap_colors_initialized =
+ all_colors_initialized = false;
+
+ setButtons(Help);
+
+ /* default string for no Information... */
+ Not_Available_Text = i18n("Not available.");
+
+ QVBoxLayout *top = new QVBoxLayout(this, 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 bhughes@trolltech.com
+ 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 (deller@gmx.de)
+ 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 ( romberg@fsl.noaa.gov )
+
+*/
+
+#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 <ranger@befunk.com>
+ *
+ * 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 <tk@Genetik.Uni-Bielefeld.DE>
+ */
+
+#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, Tom@radar.tu-graz.ac.at
+ *
+ * WARNING: This module requires linking with -lmach
+ *
+ * This routine is based on m_decosf1.c from the "top" program written by:
+ *
+ * AUTHOR: Anthony Baxter, <anthony@aaii.oz.au>
+ *
+ */
+
+#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 <k_ilya@ukr.net> *
+ * 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;
diff --git a/kcontrol/input/AUTHORS b/kcontrol/input/AUTHORS
new file mode 100644
index 000000000..525df4d20
--- /dev/null
+++ b/kcontrol/input/AUTHORS
@@ -0,0 +1,7 @@
+Mouse & Keyboard Configuration Modules:
+
+ Pat Dowler (dowler@pt1B1106.FSH.UVic.CA)
+
+Conversion to kcontrol applet:
+
+ Matthias Hoelzer (hoelzer@physik.uni-wuerzburg.de) \ No newline at end of file
diff --git a/kcontrol/input/ChangeLog b/kcontrol/input/ChangeLog
new file mode 100644
index 000000000..2d9b8d545
--- /dev/null
+++ b/kcontrol/input/ChangeLog
@@ -0,0 +1,11 @@
+2002-07-01 Fabian Wolf <fabianw@gmx.net>
+ * added option to select a white cursor
+
+2000-03-14 David Faure <faure@kde.org>
+
+ * mouse.cpp: Added global settings for SC/DC/AutoSelect/ChangeCursor
+ * mousedefaults.h: New file, to store default values
+
+1998-11-30 Alex Zepeda <garbanzo@hooked.net>
+
+ * Makefile.am: Move all the icons into pics/ && pics/mini/
diff --git a/kcontrol/input/Makefile.am b/kcontrol/input/Makefile.am
new file mode 100644
index 000000000..7a852aa3e
--- /dev/null
+++ b/kcontrol/input/Makefile.am
@@ -0,0 +1,47 @@
+if have_xcursor
+THEMEPAGE_SUBDIR = xcursor
+THEMEPAGE_INCLUDES = -I$(srcdir)/xcursor
+THEMEPAGE_LIB = xcursor/libthemepage.la
+else
+THEMEPAGE_SUBDIR = core
+THEMEPAGE_INCLUDES = -I$(srcdir)/core
+THEMEPAGE_LIB = core/libthemepage.la
+endif
+
+SUBDIRS = $(THEMEPAGE_SUBDIR) pics
+
+AM_CPPFLAGS = $(USB_CFLAGS) $(THEMEPAGE_INCLUDES) $(all_includes)
+
+bin_PROGRAMS = kapplymousetheme
+
+kapplymousetheme_SOURCES = kapplymousetheme.cpp
+kapplymousetheme_LDFLAGS = $(all_libraries)
+kapplymousetheme_LDADD = $(LIB_XCURSOR) $(LIB_X11)
+
+kde_module_LTLIBRARIES = kcm_input.la
+
+kcm_input_la_SOURCES = mouse.cpp kmousedlg.ui main.cpp logitechmouse.cpp logitechmouse_base.ui
+kcm_input_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_input_la_LIBADD = $(THEMEPAGE_LIB) $(XTESTLIB) $(LIB_KIO) $(LIB_XCURSOR) $(USB_LIBS)
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp */*.cpp -o $(podir)/kcminput.pot
+
+xdg_apps_DATA = mouse.desktop
+
+fontdir = $(kde_datadir)/kcminput
+font_DATA = cursor_large_black.pcf.gz cursor_large_white.pcf.gz cursor_small_white.pcf.gz
+EXTRA_DIST = $(font_DATA)
+
+update_DATA = mouse_cursor_theme.upd
+
+updatedir = $(kde_datadir)/kconf_update
+
+install-data-hook:
+ $(mkinstalldirs) $(DESTDIR)$(datadir)/fonts/override
+ -mkfontdir $(DESTDIR)$(datadir)/fonts/override
+##I'd like to install this automatically, but it only works on Linux, and I don't want to break things...
+## $(INSTALL_DATA) $(srcdir)/consoleUserPerms $(DESTDIR)/etc/hotplug/usb/consoleUserPerms
+## $(INSTALL_DATA) $(srcdir)/logitechmouse.usermap $(DESTDIR)/etc/hotplug/usb/logitechmouse.usermap
diff --git a/kcontrol/input/configure.in.bot b/kcontrol/input/configure.in.bot
new file mode 100644
index 000000000..08bf95ca5
--- /dev/null
+++ b/kcontrol/input/configure.in.bot
@@ -0,0 +1,5 @@
+if test "x$with_libusb" = xcheck && test "x$have_libusb" = xno; then
+ echo ""
+ echo "Logitech mouse support is disabled. Provide libusb to enable it."
+ echo ""
+fi
diff --git a/kcontrol/input/configure.in.in b/kcontrol/input/configure.in.in
new file mode 100644
index 000000000..0d656e2dc
--- /dev/null
+++ b/kcontrol/input/configure.in.in
@@ -0,0 +1,26 @@
+AC_ARG_WITH(libusb,
+ [AC_HELP_STRING(--with-libusb,
+ [enable control of some mouse models through libusb @<:@default=check@:>@])],
+ [], with_libusb=check)
+
+USB_LIBS=
+USB_CFLAGS=
+have_libusb=no
+if test "x$with_libusb" != xno; then
+ AC_PATH_PROG(LIBUSBCONFIG,libusb-config,no)
+ if test $LIBUSBCONFIG != "no"; then
+ USB_LIBS="$($LIBUSBCONFIG --libs)"
+ USB_CFLAGS="$($LIBUSBCONFIG --cflags)"
+
+ AC_CHECK_LIB(usb,main,
+ [have_libusb=yes
+ AC_DEFINE(HAVE_LIBUSB, 1, [Defined if you have libusb])],
+ [], [$USB_LIBS]
+ )
+ fi
+ if test "x$with_libusb" != xcheck && test "x$have_libusb" = xno; then
+ AC_MSG_ERROR([--with-libusb was given, but test for libusb failed])
+ fi
+fi
+AC_SUBST(USB_LIBS)
+AC_SUBST(USB_CFLAGS)
diff --git a/kcontrol/input/consoleUserPerms b/kcontrol/input/consoleUserPerms
new file mode 100755
index 000000000..015df642f
--- /dev/null
+++ b/kcontrol/input/consoleUserPerms
@@ -0,0 +1,42 @@
+#!/bin/bash
+#
+# /etc/hotplug/usb/consoleUserPerms
+#
+# Sets up newly plugged in USB device so that the user who owns
+# the console according to pam_console can access it from user space
+#
+# Note that for this script to work, you'll need all of the following:
+# a) a line in the file /etc/hotplug/usb.usermap or another usermap file
+# in /etc/hotplug/usb/ that corresponds to the device you are using.
+# b) a setup using pam_console creates the respective lock files
+# containing the name of the respective user. You can check for that
+# by executing "echo `cat /var/{run,lock}/console.lock`" and
+# verifying the appropriate user is mentioned somewhere there.
+# c) a Linux kernel supporting hotplug and usbdevfs
+# d) the hotplug package (http://linux-hotplug.sourceforge.net/)
+#
+# In the usermap file, the first field "usb module" should be named
+# "consoleUserPerms" to invoke this script.
+#
+
+if [ "${ACTION}" = "add" ] && [ -f "${DEVICE}" ]
+then
+ # New code, using lock files instead of copying /dev/console permissions
+ # This also works with non-kdm logins (e.g. on a virtual terminal)
+ # Idea and code from Nalin Dahyabhai <nalin@redhat.com>
+ if [ -f /var/run/console.lock ]
+ then
+ CONSOLEOWNER=`cat /var/run/console.lock`
+ elif [ -f /var/lock/console.lock ]
+ then
+ CONSOLEOWNER=`cat /var/lock/console.lock`
+ else
+ CONSOLEOWNER=
+ fi
+ if [ -n "$CONSOLEOWNER" ]
+ then
+ chmod 0000 "${DEVICE}"
+ chown "$CONSOLEOWNER" "${DEVICE}"
+ chmod 0600 "${DEVICE}"
+ fi
+fi
diff --git a/kcontrol/input/core/Makefile.am b/kcontrol/input/core/Makefile.am
new file mode 100644
index 000000000..3c73ba8b0
--- /dev/null
+++ b/kcontrol/input/core/Makefile.am
@@ -0,0 +1,7 @@
+AM_CPPFLAGS = $(all_includes)
+
+noinst_LTLIBRARIES = libthemepage.la
+libthemepage_la_SOURCES = themepage.cpp
+METASOURCES = AUTO
+noinst_HEADERS = themepage.h bitmaps.h
+
diff --git a/kcontrol/input/core/bitmaps.h b/kcontrol/input/core/bitmaps.h
new file mode 100644
index 000000000..9f44c3d5d
--- /dev/null
+++ b/kcontrol/input/core/bitmaps.h
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2003 Fredrik Hglund <fredrik@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __BITMAPS_H
+#define __BITMAPS_H
+
+
+static const char* const arrow_large_black_xpm[] = {
+"24 24 3 1",
+"# c None",
+"a c #000000",
+". c #ffffff",
+"#####..#################",
+"#####.a.################",
+"#####.aa.###############",
+"#####.aaa.##############",
+"#####.aaaa.#############",
+"#####.aaaaa.############",
+"#####.aaaaaa.###########",
+"#####.aaaaaaa.##########",
+"#####.aaaaaaaa.#########",
+"#####.aaaaaaaaa.########",
+"#####.aaaaaaaaaa.#######",
+"#####.aaaaaaaaaaa.######",
+"#####.aaaaaaaaaaaa.#####",
+"#####.aaaaaaaa....######",
+"#####.aaaaaaa.##########",
+"#####.aaa.aaaa.#########",
+"#####.aa.#.aaa.#########",
+"#####.a.##.aaaa.########",
+"#####..####.aaa.########",
+"###########.aaaa.#######",
+"############.aaa.#######",
+"############.aaa.#######",
+"#############...########",
+"########################"};
+
+
+static const char* const arrow_small_black_xpm[]={
+"24 24 3 1",
+"# c None",
+"a c #000000",
+". c #ffffff",
+"########################",
+"########################",
+"########################",
+"########################",
+"#######..###############",
+"#######.a.##############",
+"#######.aa.#############",
+"#######.aaa.############",
+"#######.aaaa.###########",
+"#######.aaaaa.##########",
+"#######.aaaaaa.#########",
+"#######.aaaaaaa.########",
+"#######.aaaaaaaa.#######",
+"#######.aaaaa....#######",
+"#######.aa.aa.##########",
+"#######.a.#.aa.#########",
+"#######..##.aa.#########",
+"############.aa.########",
+"############.aa.########",
+"#############..#########",
+"########################",
+"########################",
+"########################",
+"########################"};
+
+
+static const char* const arrow_large_white_xpm[] = {
+"24 24 3 1",
+"# c None",
+"a c #ffffff",
+". c #000000",
+"#####..#################",
+"#####.a.################",
+"#####.aa.###############",
+"#####.aaa.##############",
+"#####.aaaa.#############",
+"#####.aaaaa.############",
+"#####.aaaaaa.###########",
+"#####.aaaaaaa.##########",
+"#####.aaaaaaaa.#########",
+"#####.aaaaaaaaa.########",
+"#####.aaaaaaaaaa.#######",
+"#####.aaaaaaaaaaa.######",
+"#####.aaaaaaaaaaaa.#####",
+"#####.aaaaaaaa....######",
+"#####.aaaaaaa.##########",
+"#####.aaa.aaaa.#########",
+"#####.aa.#.aaa.#########",
+"#####.a.##.aaaa.########",
+"#####..####.aaa.########",
+"###########.aaaa.#######",
+"############.aaa.#######",
+"############.aaa.#######",
+"#############...########",
+"########################"};
+
+
+static const char* const arrow_small_white_xpm[]={
+"24 24 3 1",
+"# c None",
+"a c #ffffff",
+". c #000000",
+"########################",
+"########################",
+"########################",
+"########################",
+"#######..###############",
+"#######.a.##############",
+"#######.aa.#############",
+"#######.aaa.############",
+"#######.aaaa.###########",
+"#######.aaaaa.##########",
+"#######.aaaaaa.#########",
+"#######.aaaaaaa.########",
+"#######.aaaaaaaa.#######",
+"#######.aaaaa....#######",
+"#######.aa.aa.##########",
+"#######.a.#.aa.#########",
+"#######..##.aa.#########",
+"############.aa.########",
+"############.aa.########",
+"#############..#########",
+"########################",
+"########################",
+"########################",
+"########################"};
+
+#endif
diff --git a/kcontrol/input/core/themepage.cpp b/kcontrol/input/core/themepage.cpp
new file mode 100644
index 000000000..d83b28cb7
--- /dev/null
+++ b/kcontrol/input/core/themepage.cpp
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2003 Fredrik Hglund <fredrik@kde.org>
+ *
+ * Based on the large cursor code written by Rik Hemsley,
+ * Copyright (c) 2000 Rik Hemsley <rik@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kurl.h>
+#include <kprocess.h>
+#include <kio/job.h>
+#include <kio/netaccess.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <klistview.h>
+#include <kdialog.h>
+
+#include <qlayout.h>
+#include <qdir.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qlabel.h>
+
+#include "themepage.h"
+#include "themepage.moc"
+
+#include "bitmaps.h"
+
+
+namespace {
+ // Listview columns
+ enum Columns { NameColumn = 0, DescColumn, /* hidden */ DirColumn };
+}
+
+
+ThemePage::ThemePage( QWidget* parent, const char* name )
+ : QWidget( parent, name )
+{
+ QBoxLayout *layout = new QVBoxLayout( this );
+ layout->setAutoAdd( true );
+ layout->setMargin( KDialog::marginHint() );
+ layout->setSpacing( KDialog::spacingHint() );
+
+ new QLabel( i18n("Select the cursor theme you want to use:"), this );
+
+ // Create the theme list view
+ listview = new KListView( this );
+ listview->setFullWidth( true );
+ listview->setAllColumnsShowFocus( true );
+ listview->addColumn( i18n("Name") );
+ listview->addColumn( i18n("Description") );
+
+ connect( listview, SIGNAL(selectionChanged(QListViewItem*)),
+ SLOT(selectionChanged(QListViewItem*)) );
+
+ insertThemes();
+}
+
+
+ThemePage::~ThemePage()
+{
+}
+
+
+void ThemePage::selectionChanged( QListViewItem *item )
+{
+ selectedTheme = item->text( DirColumn );
+ emit changed( selectedTheme != currentTheme );
+}
+
+
+void ThemePage::save()
+{
+ if ( currentTheme == selectedTheme )
+ return;
+
+ bool whiteCursor = selectedTheme.right( 5 ) == "White";
+ bool largeCursor = selectedTheme.left( 5 ) == "Large";
+
+ KConfig c( "kcminputrc" );
+ c.setGroup( "Mouse" );
+ c.writeEntry( "LargeCursor", largeCursor );
+ c.writeEntry( "WhiteCursor", whiteCursor );
+
+ currentTheme = selectedTheme;
+
+ fixCursorFile();
+
+ KMessageBox::information( this, i18n("You have to restart KDE for these "
+ "changes to take effect."), i18n("Cursor Settings Changed"),
+ "CursorSettingsChanged" );
+}
+
+void ThemePage::load()
+{
+ load( false );
+}
+
+void ThemePage::load( bool useDefaults )
+{
+ bool largeCursor, whiteCursor;
+
+ KConfig c( "kcminputrc" );
+
+ c.setReadDefaults( useDefaults );
+
+ c.setGroup( "Mouse" );
+ largeCursor = c.readBoolEntry( "LargeCursor", false );
+ whiteCursor = c.readBoolEntry( "WhiteCursor", false );
+
+ if ( largeCursor )
+ currentTheme = whiteCursor ? "LargeWhite" : "LargeBlack";
+ else
+ currentTheme = whiteCursor ? "SmallWhite" : "SmallBlack";
+
+ selectedTheme = currentTheme;
+ QListViewItem *item = listview->findItem( currentTheme, DirColumn );
+ item->setSelected( true );
+}
+
+
+void ThemePage::defaults()
+{
+ load( true );
+}
+
+
+void ThemePage::insertThemes()
+{
+ KListViewItem *item;
+
+ item = new KListViewItem( listview, i18n("Small black"),
+ i18n("Small black cursors"), "SmallBlack" );
+ item->setPixmap( 0, QPixmap( arrow_small_black_xpm ) );
+ listview->insertItem( item );
+
+ item = new KListViewItem( listview, i18n("Large black"),
+ i18n("Large black cursors"), "LargeBlack" );
+ item->setPixmap( 0, QPixmap( arrow_large_black_xpm ) );
+ listview->insertItem( item );
+
+ item = new KListViewItem( listview, i18n("Small white"),
+ i18n("Small white cursors"), "SmallWhite" );
+ item->setPixmap( 0, QPixmap( arrow_small_white_xpm ) );
+ listview->insertItem( item );
+
+ item = new KListViewItem( listview, i18n("Large white"),
+ i18n("Large white cursors"), "LargeWhite" );
+ item->setPixmap( 0, QPixmap( arrow_large_white_xpm ) );
+ listview->insertItem( item );
+}
+
+
+void ThemePage::fixCursorFile()
+{
+ // Make sure we have the 'font' resource dir registered and can find the
+ // override dir.
+ //
+ // Next, if the user wants large cursors, copy the font
+ // cursor_large.pcf.gz to (localkdedir)/share/fonts/override/cursor.pcf.gz.
+ // Else remove the font cursor.pcf.gz from (localkdedir)/share/fonts/override.
+ //
+ // Run mkfontdir to update fonts.dir in that dir.
+
+ KGlobal::dirs()->addResourceType( "font", "share/fonts/" );
+ KIO::mkdir( KURL::fromPathOrURL(QDir::homeDirPath() + "/.fonts/kde-override") );
+ QString overrideDir = QDir::homeDirPath() + "/.fonts/kde-override/";
+
+ KURL installedFont;
+ installedFont.setPath( overrideDir + "cursor.pcf.gz" );
+
+ if ( currentTheme == "SmallBlack" )
+ KIO::NetAccess::del( installedFont, this );
+ else {
+ KURL source;
+
+ if ( currentTheme == "LargeBlack" )
+ source.setPath( locate("data", "kcminput/cursor_large_black.pcf.gz") );
+ else if ( currentTheme == "LargeWhite" )
+ source.setPath( locate("data", "kcminput/cursor_large_white.pcf.gz") );
+ else if ( currentTheme == "SmallWhite" )
+ source.setPath( locate("data", "kcminput/cursor_small_white.pcf.gz") );
+
+ KIO::NetAccess::file_copy( source, installedFont, -1, true );
+ }
+
+ QString cmd = KGlobal::dirs()->findExe( "mkfontdir" );
+ if ( !cmd.isEmpty() )
+ {
+ KProcess p;
+ p << cmd << overrideDir;
+ p.start(KProcess::Block);
+ }
+}
+
+// vim: set noet ts=4 sw=4:
diff --git a/kcontrol/input/core/themepage.h b/kcontrol/input/core/themepage.h
new file mode 100644
index 000000000..491c11f75
--- /dev/null
+++ b/kcontrol/input/core/themepage.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2003 Fredrik Hglund <fredrik@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __THEMEPAGE_H
+#define __THEMEPAGE_H
+
+class KListView;
+class QListViewItem;
+
+class ThemePage : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ ThemePage( QWidget* parent = 0, const char* name = 0 );
+ ~ThemePage();
+
+ // Called by the KCM
+ void save();
+ void load();
+ void load( bool useDefaults );
+ void defaults();
+
+ signals:
+ void changed( bool );
+
+ private slots:
+ void selectionChanged( QListViewItem * );
+
+ private:
+ void insertThemes();
+ void fixCursorFile();
+
+ KListView *listview;
+ QString currentTheme, selectedTheme;
+};
+
+#endif // __THEMEPAGE_H
+
+// vim: set noet ts=4 sw=4:
diff --git a/kcontrol/input/cursor_large.bdf b/kcontrol/input/cursor_large.bdf
new file mode 100644
index 000000000..241189286
--- /dev/null
+++ b/kcontrol/input/cursor_large.bdf
@@ -0,0 +1,4447 @@
+STARTFONT 2.1
+FONT cursor
+SIZE 47 78 78
+FONTBOUNDINGBOX 45 42 -21 -23
+STARTPROPERTIES 13
+COPYRIGHT "(C) 2000 Rik Hemsley <rik@kde.org>"
+POINT_SIZE 470
+FONT "cursor"
+WEIGHT 10
+RESOLUTION 107
+RESOLUTION_X 78
+RESOLUTION_Y 78
+X_HEIGHT -1
+QUAD_WIDTH 20
+DEFAULT_CHAR 0
+FONT_ASCENT 23
+FONT_DESCENT 24
+_XMBDFED_INFO "Edited with xmbdfed 4.3."
+ENDPROPERTIES
+CHARS 154
+STARTCHAR D
+ENCODING 0
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 1
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR C002
+ENCODING 2
+SWIDTH 1139 0
+DWIDTH 58 0
+BBX 12 21 -10 -22
+BITMAP
+0010
+0030
+0070
+00F0
+01F0
+03F0
+07F0
+0FF0
+1FF0
+3FF0
+7FF0
+FFF0
+0FF0
+07F0
+0F70
+0E30
+1E10
+1C00
+3C00
+3800
+3800
+ENDCHAR
+STARTCHAR C003
+ENCODING 3
+SWIDTH 1414 0
+DWIDTH 72 0
+BBX 14 23 -11 -23
+BITMAP
+000C
+001C
+003C
+007C
+00FC
+01FC
+03FC
+07FC
+0FFC
+1FFC
+3FFC
+7FFC
+FFFC
+7FFC
+07FC
+0FFC
+0FBC
+1F9C
+1F0C
+3F00
+3E00
+3E00
+1C00
+ENDCHAR
+STARTCHAR C004
+ENCODING 4
+SWIDTH 137 0
+DWIDTH 7 0
+BBX 11 15 -4 -2
+BITMAP
+FFE0
+FFE0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+FFE0
+7FC0
+3F80
+1F00
+0E00
+0400
+ENDCHAR
+STARTCHAR C004
+ENCODING 5
+SWIDTH 176 0
+DWIDTH 9 0
+BBX 15 17 -6 -3
+BITMAP
+3FF8
+7FFC
+7FFC
+7FFC
+3FF8
+07C0
+07C0
+07C0
+07C0
+FFFE
+7FFC
+3FF8
+1FF0
+0FE0
+07C0
+0380
+0100
+ENDCHAR
+STARTCHAR C004
+ENCODING 6
+SWIDTH 137 0
+DWIDTH 7 0
+BBX 11 15 -4 -16
+BITMAP
+0400
+0E00
+1F00
+3F80
+7FC0
+FFE0
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+FFE0
+FFE0
+FFE0
+ENDCHAR
+STARTCHAR C004
+ENCODING 7
+SWIDTH 176 0
+DWIDTH 9 0
+BBX 15 17 -6 -17
+BITMAP
+0100
+0380
+07C0
+0FE0
+1FF0
+3FF8
+7FFC
+FFFE
+07C0
+07C0
+07C0
+07C0
+3FF8
+7FFC
+7FFC
+7FFC
+3FF8
+ENDCHAR
+STARTCHAR D
+ENCODING 8
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 9
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 10
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 11
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR C014
+ENCODING 12
+SWIDTH 510 0
+DWIDTH 26 0
+BBX 21 21 0 -3
+BITMAP
+E00000
+E00000
+E00000
+E00100
+E00380
+E087C0
+E0CF80
+E0FF00
+E0FE00
+E0FC00
+E0FC00
+E0FE00
+E0FF00
+E00000
+E00000
+E00000
+E00000
+E00000
+FFFFF8
+FFFFF8
+FFFFF8
+ENDCHAR
+STARTCHAR C014
+ENCODING 13
+SWIDTH 432 0
+DWIDTH 22 0
+BBX 23 23 -1 -4
+BITMAP
+700000
+F80000
+F80000
+F80080
+F881C0
+F8C3E0
+F8E7F0
+F8FFE0
+F8FFC0
+F8FF80
+F8FF00
+F8FF00
+F8FF80
+F8FFC0
+F8FFE0
+F80000
+F80000
+F80000
+FFFFFC
+FFFFFE
+FFFFFE
+FFFFFE
+FFFFFC
+ENDCHAR
+STARTCHAR C014
+ENCODING 14
+SWIDTH 510 0
+DWIDTH 26 0
+BBX 21 21 -18 -3
+BITMAP
+000038
+000038
+000038
+040038
+0E0038
+1F0838
+0F9838
+07F838
+03F838
+01F838
+01F838
+03F838
+07F838
+000038
+000038
+000038
+000038
+000038
+FFFFF8
+FFFFF8
+FFFFF8
+ENDCHAR
+STARTCHAR C014
+ENCODING 15
+SWIDTH 432 0
+DWIDTH 22 0
+BBX 23 23 -19 -4
+BITMAP
+00001C
+00003E
+00003E
+02003E
+07023E
+0F863E
+1FCE3E
+0FFE3E
+07FE3E
+03FE3E
+01FE3E
+01FE3E
+03FE3E
+07FE3E
+0FFE3E
+00003E
+00003E
+00003E
+7FFFFE
+FFFFFE
+FFFFFE
+FFFFFE
+7FFFFE
+ENDCHAR
+STARTCHAR C020
+ENCODING 16
+SWIDTH 216 0
+DWIDTH 11 0
+BBX 19 20 -8 -3
+BITMAP
+00E000
+00E000
+00E000
+00E000
+00E000
+00E000
+00E000
+0FFE00
+07FC00
+03F800
+01F000
+00E000
+004000
+000000
+000000
+000000
+000000
+FFFFE0
+FFFFE0
+FFFFE0
+ENDCHAR
+STARTCHAR C020
+ENCODING 17
+SWIDTH 235 0
+DWIDTH 12 0
+BBX 21 22 -9 -4
+BITMAP
+007000
+00F800
+00F800
+00F800
+00F800
+00F800
+00F800
+1FFFC0
+0FFF80
+07FF00
+03FE00
+01FC00
+00F800
+007000
+002000
+000000
+000000
+7FFFF0
+FFFFF8
+FFFFF8
+FFFFF8
+7FFFF0
+ENDCHAR
+STARTCHAR D
+ENCODING 18
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 19
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 20
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 21
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR C026
+ENCODING 22
+SWIDTH 137 0
+DWIDTH 7 0
+BBX 11 20 -4 -21
+BITMAP
+0400
+0400
+0E00
+0E00
+1F00
+1F00
+3F80
+3F80
+7FC0
+7FC0
+FFE0
+CE60
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0400
+ENDCHAR
+STARTCHAR C026
+ENCODING 23
+SWIDTH 157 0
+DWIDTH 8 0
+BBX 13 22 -5 -22
+BITMAP
+0200
+0700
+0700
+0F80
+0F80
+1FC0
+1FC0
+3FE0
+3FE0
+7FF0
+7FF0
+FFF8
+FFF8
+6FB0
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0700
+0200
+ENDCHAR
+STARTCHAR D
+ENCODING 24
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 25
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 26
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 27
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 28
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 29
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR quotedbl
+ENCODING 30
+SWIDTH 510 0
+DWIDTH 26 0
+BBX 24 23 -10 -13
+BITMAP
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+002800
+FFC7FF
+FF83FF
+FFC7FF
+002800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+ENDCHAR
+STARTCHAR numbersign
+ENCODING 31
+SWIDTH 294 0
+DWIDTH 15 0
+BBX 26 25 -11 -14
+BITMAP
+001C0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+7FF7FF80
+FFE3FFC0
+FFC1FFC0
+FFE3FFC0
+7FF7FF80
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+001C0000
+ENDCHAR
+STARTCHAR D
+ENCODING 32
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 33
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR quotedbl
+ENCODING 34
+SWIDTH 510 0
+DWIDTH 26 0
+BBX 24 23 -10 -13
+BITMAP
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+002800
+FFC7FF
+FF83FF
+FFC7FF
+002800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+ENDCHAR
+STARTCHAR numbersign
+ENCODING 35
+SWIDTH 294 0
+DWIDTH 15 0
+BBX 26 25 -11 -14
+BITMAP
+001C0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+7FF7FF80
+FFE3FFC0
+FFC1FFC0
+FFE3FFC0
+7FF7FF80
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+001C0000
+ENDCHAR
+STARTCHAR D
+ENCODING 36
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 37
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 38
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 39
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 40
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 41
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR asterisk
+ENCODING 42
+SWIDTH 510 0
+DWIDTH 26 0
+BBX 15 23 -6 -13
+BITMAP
+0100
+0380
+07C0
+0FE0
+1FF0
+3FF8
+7BBC
+F39E
+638C
+0380
+0380
+0380
+0380
+0380
+E38C
+F39E
+7BBC
+3FF8
+1FF0
+0FE0
+07C0
+0380
+0100
+ENDCHAR
+STARTCHAR plus
+ENCODING 43
+SWIDTH 196 0
+DWIDTH 10 0
+BBX 17 25 -7 -14
+BITMAP
+008000
+01C000
+03E000
+07F000
+0FF800
+1FFC00
+3FFE00
+7FFF00
+FFFF80
+7BEF00
+33E600
+03E000
+03E000
+03E000
+33E600
+7BEF00
+FFFF80
+7FFF00
+3FFE00
+1FFC00
+0FF800
+07F000
+03E000
+01C000
+008000
+ENDCHAR
+STARTCHAR C002
+ENCODING 44
+SWIDTH 1139 0
+DWIDTH 58 0
+BBX 12 21 -10 -22
+BITMAP
+0010
+0030
+0070
+00F0
+01F0
+03F0
+07F0
+0FF0
+1FF0
+3FF0
+7FF0
+FFF0
+0FF0
+07F0
+0F70
+0E30
+1E10
+1C00
+3C00
+3800
+3800
+ENDCHAR
+STARTCHAR C003
+ENCODING 45
+SWIDTH 1414 0
+DWIDTH 72 0
+BBX 14 23 -11 -23
+BITMAP
+000C
+001C
+003C
+007C
+00FC
+01FC
+03FC
+07FC
+0FFC
+1FFC
+3FFC
+7FFC
+FFFC
+7FFC
+07FC
+0FFC
+0FBC
+1F9C
+1F0C
+3F00
+3E00
+3E00
+1C00
+ENDCHAR
+STARTCHAR C002
+ENCODING 46
+SWIDTH 1139 0
+DWIDTH 58 0
+BBX 12 21 -10 -22
+BITMAP
+0010
+0030
+0070
+00F0
+01F0
+03F0
+07F0
+0FF0
+1FF0
+3FF0
+7FF0
+FFF0
+0FF0
+07F0
+0F70
+0E30
+1E10
+1C00
+3C00
+3800
+3800
+ENDCHAR
+STARTCHAR C003
+ENCODING 47
+SWIDTH 1414 0
+DWIDTH 72 0
+BBX 14 23 -11 -23
+BITMAP
+000C
+001C
+003C
+007C
+00FC
+01FC
+03FC
+07FC
+0FFC
+1FFC
+3FFC
+7FFC
+FFFC
+7FFC
+07FC
+0FFC
+0FBC
+1F9C
+1F0C
+3F00
+3E00
+3E00
+1C00
+ENDCHAR
+STARTCHAR D
+ENCODING 48
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 49
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR 2
+ENCODING 50
+SWIDTH 510 0
+DWIDTH 26 0
+BBX 21 23 -9 -13
+BITMAP
+00F800
+C3FE00
+E7FF80
+FFC3C0
+DF00E0
+CE0060
+C60020
+C30000
+FF8000
+FF8000
+000000
+000000
+000000
+000FF8
+000FF8
+000618
+200318
+300398
+3C07D8
+1E1FF8
+0FFF38
+03FE18
+00F800
+ENDCHAR
+STARTCHAR 2
+ENCODING 51
+SWIDTH 510 0
+DWIDTH 26 0
+BBX 21 23 -9 -13
+BITMAP
+00F800
+C3FE00
+E7FF80
+FFC3C0
+FF00E0
+FE0060
+FE0020
+FF0000
+FF8000
+FF8000
+000000
+000000
+000000
+000FF8
+000FF8
+0007F8
+2003F8
+3003F8
+3C07F8
+1E1FF8
+0FFF38
+03FE18
+00F800
+ENDCHAR
+STARTCHAR 4
+ENCODING 52
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 27 27 -12 -15
+BITMAP
+00040000
+000E0000
+001F0000
+003F8000
+007FC000
+007FC000
+000E0000
+000E0000
+000E0000
+0C0E0600
+1C0E0700
+3C0E0780
+7FFFFFC0
+FFFFFFE0
+7FFFFFC0
+3C0E0780
+1C0E0700
+0C0E0600
+000E0000
+000E0000
+000E0000
+007FC000
+007FC000
+003F8000
+001F0000
+000E0000
+00040000
+ENDCHAR
+STARTCHAR 4
+ENCODING 53
+SWIDTH 314 0
+DWIDTH 16 0
+BBX 29 29 -13 -16
+BITMAP
+00020000
+00070000
+000F8000
+001FC000
+003FE000
+007FF000
+007FF000
+003FE000
+000F8000
+060F8300
+0F0F8780
+1F0F87C0
+3FFFFFE0
+7FFFFFF0
+FFFFFFF8
+7FFFFFF0
+3FFFFFE0
+1F0F87C0
+0F0F8780
+060F8300
+000F8000
+003FE000
+007FF000
+007FF000
+003FE000
+001FC000
+000F8000
+00070000
+00020000
+ENDCHAR
+STARTCHAR D
+ENCODING 54
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 55
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 56
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 57
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR less
+ENCODING 58
+SWIDTH 510 0
+DWIDTH 26 0
+BBX 23 21 -21 -21
+BITMAP
+001FFC
+00FFFE
+01E006
+0307FC
+060FF8
+0C0060
+0C07C0
+0C0FC0
+0C0060
+1E07C0
+330FC0
+6180C0
+C0C780
+C06F00
+603C00
+318C00
+199800
+0C3000
+066000
+03C000
+018000
+ENDCHAR
+STARTCHAR equal
+ENCODING 59
+SWIDTH 432 0
+DWIDTH 22 0
+BBX 23 21 -21 -21
+BITMAP
+001FFC
+00FFFE
+01FFFE
+03FFFC
+07FFF8
+0FFFE0
+0FFFC0
+0FFFC0
+0FFFE0
+1FFFC0
+3FFFC0
+7FFFC0
+FFFF80
+FFFF00
+7FFC00
+3FFC00
+1FF800
+0FF000
+07E000
+03C000
+018000
+ENDCHAR
+STARTCHAR less
+ENCODING 60
+SWIDTH 962 0
+DWIDTH 49 0
+BBX 23 21 1 -21
+BITMAP
+7FF000
+FFFE00
+C00F00
+7FC180
+3FE0C0
+0C0060
+07C060
+07E060
+0C0060
+07C0F0
+07E198
+06030C
+03C606
+01EC06
+00780C
+006318
+003330
+001860
+000CC0
+000780
+000300
+ENDCHAR
+STARTCHAR equal
+ENCODING 61
+SWIDTH 923 0
+DWIDTH 47 0
+BBX 23 21 1 -21
+BITMAP
+7FF000
+FFFE00
+FFFF00
+7FFF80
+3FFFC0
+0FFFE0
+07FFE0
+07FFE0
+0FFFE0
+07FFF0
+07FFF8
+07FFFC
+03FFFE
+01FFFE
+007FFC
+007FF8
+003FF0
+001FE0
+000FC0
+000780
+000300
+ENDCHAR
+STARTCHAR D
+ENCODING 62
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 63
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 64
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 65
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 66
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 67
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 68
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 69
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR C020
+ENCODING 70
+SWIDTH 216 0
+DWIDTH 11 0
+BBX 20 19 0 -11
+BITMAP
+E00000
+E00000
+E00000
+E00000
+E00800
+E01800
+E03800
+E07800
+E0FFF0
+E1FFF0
+E0FFF0
+E07800
+E03800
+E01800
+E00800
+E00000
+E00000
+E00000
+E00000
+ENDCHAR
+STARTCHAR C020
+ENCODING 71
+SWIDTH 235 0
+DWIDTH 12 0
+BBX 22 21 -1 -12
+BITMAP
+700000
+F80000
+F80000
+F80200
+F80600
+F80E00
+F81E00
+F83E00
+F87FF8
+F8FFFC
+F9FFFC
+F8FFFC
+F87FF8
+F83E00
+F81E00
+F80E00
+F80600
+F80200
+F80000
+F80000
+700000
+ENDCHAR
+STARTCHAR D
+ENCODING 72
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 73
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 74
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 75
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 76
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 77
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 78
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 79
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 80
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 81
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 82
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 83
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 84
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 85
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR V
+ENCODING 86
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+D800
+CC00
+CC00
+6600
+6600
+3300
+3300
+1980
+1980
+0CC0
+0CC0
+0660
+0660
+03F0
+0330
+01F0
+00E0
+ENDCHAR
+STARTCHAR W
+ENCODING 87
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FC00
+7E00
+7E00
+3F00
+3F00
+1F80
+1F80
+0FC0
+0FC0
+07E0
+07E0
+03F0
+03F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR X
+ENCODING 88
+SWIDTH 353 0
+DWIDTH 18 0
+BBX 17 17 1 -2
+BITMAP
+003F80
+007F00
+00FC00
+01F000
+03C000
+07FE00
+01FC00
+03F000
+07C000
+0F0000
+1FF000
+07E000
+0F8000
+1E0000
+380000
+600000
+800000
+ENDCHAR
+STARTCHAR X
+ENCODING 89
+SWIDTH 392 0
+DWIDTH 20 0
+BBX 20 19 0 -3
+BITMAP
+001FF0
+003FE0
+007FC0
+00FF80
+01FE00
+03FFC0
+07FF80
+0FFF00
+03FE00
+07F800
+0FFE00
+1FFC00
+3FF800
+0FF000
+0FC000
+3F0000
+7C0000
+F00000
+C00000
+ENDCHAR
+STARTCHAR Z
+ENCODING 90
+SWIDTH 510 0
+DWIDTH 26 0
+BBX 15 15 -6 -9
+BITMAP
+0380
+0380
+0380
+0380
+0380
+0380
+FFFE
+FFFE
+FFFE
+0380
+0380
+0380
+0380
+0380
+0380
+ENDCHAR
+STARTCHAR Z
+ENCODING 91
+SWIDTH 196 0
+DWIDTH 10 0
+BBX 17 17 -7 -10
+BITMAP
+01C000
+03E000
+03E000
+03E000
+03E000
+03E000
+7FFF00
+FFFF80
+FFFF80
+FFFF80
+7FFF00
+03E000
+03E000
+03E000
+03E000
+03E000
+01C000
+ENDCHAR
+STARTCHAR D
+ENCODING 92
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 93
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR C002
+ENCODING 94
+SWIDTH 1139 0
+DWIDTH 58 0
+BBX 12 21 -10 -22
+BITMAP
+0010
+0030
+0070
+00F0
+01F0
+03F0
+07F0
+0FF0
+1FF0
+3FF0
+7FF0
+FFF0
+0FF0
+07F0
+0F70
+0E30
+1E10
+1C00
+3C00
+3800
+3800
+ENDCHAR
+STARTCHAR C003
+ENCODING 95
+SWIDTH 1414 0
+DWIDTH 72 0
+BBX 14 23 -11 -23
+BITMAP
+000C
+001C
+003C
+007C
+00FC
+01FC
+03FC
+07FC
+0FFC
+1FFC
+3FFC
+7FFC
+FFFC
+7FFC
+07FC
+0FFC
+0FBC
+1F9C
+1F0C
+3F00
+3E00
+3E00
+1C00
+ENDCHAR
+STARTCHAR C020
+ENCODING 96
+SWIDTH 216 0
+DWIDTH 11 0
+BBX 20 19 -17 -11
+BITMAP
+000070
+000070
+000070
+000070
+010070
+018070
+01C070
+01E070
+FFF070
+FFF870
+FFF070
+01E070
+01C070
+018070
+010070
+000070
+000070
+000070
+000070
+ENDCHAR
+STARTCHAR C020
+ENCODING 97
+SWIDTH 235 0
+DWIDTH 12 0
+BBX 22 21 -18 -12
+BITMAP
+000038
+00007C
+00007C
+01007C
+01807C
+01C07C
+01E07C
+01F07C
+7FF87C
+FFFC7C
+FFFE7C
+FFFC7C
+7FF87C
+01F07C
+01E07C
+01C07C
+01807C
+01007C
+00007C
+00007C
+000038
+ENDCHAR
+STARTCHAR D
+ENCODING 98
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 99
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 100
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 101
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 102
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 103
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 104
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 105
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR j
+ENCODING 106
+SWIDTH 157 0
+DWIDTH 8 0
+BBX 13 20 -5 -2
+BITMAP
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+FFF8
+7FF0
+3FE0
+1FC0
+0F80
+0700
+0200
+ENDCHAR
+STARTCHAR k
+ENCODING 107
+SWIDTH 176 0
+DWIDTH 9 0
+BBX 15 22 -6 -3
+BITMAP
+06C0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+7FFC
+FFFE
+7FFC
+3FF8
+1FF0
+0FE0
+07C0
+0380
+0100
+ENDCHAR
+STARTCHAR l
+ENCODING 108
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 25 13 -12 -7
+BITMAP
+02002000
+06003000
+0E003800
+1E003C00
+3FFFFE00
+7FFFFF00
+FE003F80
+7FFFFF00
+3FFFFE00
+1E003C00
+0E003800
+06003000
+02002000
+ENDCHAR
+STARTCHAR m
+ENCODING 109
+SWIDTH 274 0
+DWIDTH 14 0
+BBX 27 15 -13 -8
+BITMAP
+01001000
+03803800
+07803C00
+0F803E00
+1FFFFF00
+3FFFFF80
+7FFFFFC0
+FFFFFFE0
+7FFFFFC0
+3FFFFF80
+1FFFFF00
+0F803E00
+07803C00
+03803800
+01001000
+ENDCHAR
+STARTCHAR n
+ENCODING 110
+SWIDTH 412 0
+DWIDTH 21 0
+BBX 20 13 1 -8
+BITMAP
+020000
+060000
+0E0000
+1E0000
+3FFFF0
+7FFFF0
+FE0000
+7FFFF0
+3FFFF0
+1E0000
+0E0000
+060000
+020000
+ENDCHAR
+STARTCHAR o
+ENCODING 111
+SWIDTH 432 0
+DWIDTH 22 0
+BBX 22 15 0 -9
+BITMAP
+010000
+038000
+078000
+0F8000
+1FFFF8
+3FFFFC
+7FFFFC
+FFFFF8
+7FFFFC
+3FFFFC
+1FFFF8
+0F8000
+078000
+038000
+010000
+ENDCHAR
+STARTCHAR n
+ENCODING 112
+SWIDTH 412 0
+DWIDTH 21 0
+BBX 20 13 -18 -8
+BITMAP
+000400
+000600
+000700
+000780
+FFFFC0
+FFFFE0
+0007F0
+FFFFE0
+FFFFC0
+000780
+000700
+000600
+000400
+ENDCHAR
+STARTCHAR o
+ENCODING 113
+SWIDTH 432 0
+DWIDTH 22 0
+BBX 22 15 -19 -9
+BITMAP
+000200
+000700
+000780
+0007C0
+7FFFE0
+FFFFF0
+FFFFF8
+7FFFFC
+FFFFF8
+FFFFF0
+7FFFE0
+0007C0
+000780
+000700
+000200
+ENDCHAR
+STARTCHAR j
+ENCODING 114
+SWIDTH 157 0
+DWIDTH 8 0
+BBX 13 20 -5 -21
+BITMAP
+0200
+0700
+0F80
+1FC0
+3FE0
+7FF0
+FFF8
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+ENDCHAR
+STARTCHAR k
+ENCODING 115
+SWIDTH 176 0
+DWIDTH 9 0
+BBX 15 22 -6 -22
+BITMAP
+0100
+0380
+07C0
+0FE0
+1FF0
+3FF8
+7FFC
+FFFE
+7FFC
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+06C0
+ENDCHAR
+STARTCHAR t
+ENCODING 116
+SWIDTH 137 0
+DWIDTH 7 0
+BBX 13 25 -5 -14
+BITMAP
+0200
+0700
+0F80
+1FC0
+3FE0
+7FF0
+FFF8
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+0D80
+FFF8
+7FF0
+3FE0
+1FC0
+0F80
+0700
+0200
+ENDCHAR
+STARTCHAR u
+ENCODING 117
+SWIDTH 157 0
+DWIDTH 8 0
+BBX 15 27 -6 -15
+BITMAP
+0100
+0380
+07C0
+0FE0
+1FF0
+3FF8
+7FFC
+FFFE
+7FFC
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+0FE0
+7FFC
+FFFE
+7FFC
+3FF8
+1FF0
+0FE0
+07C0
+0380
+0100
+ENDCHAR
+STARTCHAR D
+ENCODING 118
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 119
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 120
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 121
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 122
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 123
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR bar
+ENCODING 124
+SWIDTH 39 0
+DWIDTH 2 0
+BBX 15 26 -13 -22
+BITMAP
+000A
+0054
+00A0
+0000
+1CAA
+1D54
+1C00
+1C20
+3E14
+7F0A
+FF80
+C180
+C180
+C180
+C180
+C180
+C180
+C180
+FF80
+FF80
+FF80
+FF80
+C180
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR bar
+ENCODING 125
+SWIDTH 39 0
+DWIDTH 2 0
+BBX 15 26 -13 -22
+BITMAP
+000E
+007C
+00E0
+0000
+1CFE
+1DFE
+1C00
+1C60
+3E3C
+7F0E
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR D
+ENCODING 126
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 127
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 128
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 129
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR quotedbl
+ENCODING 130
+SWIDTH 510 0
+DWIDTH 26 0
+BBX 24 23 -10 -13
+BITMAP
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+002800
+FFC7FF
+FF83FF
+FFC7FF
+002800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+003800
+ENDCHAR
+STARTCHAR numbersign
+ENCODING 131
+SWIDTH 294 0
+DWIDTH 15 0
+BBX 26 25 -11 -14
+BITMAP
+001C0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+7FF7FF80
+FFE3FFC0
+FFC1FFC0
+FFE3FFC0
+7FF7FF80
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+003E0000
+001C0000
+ENDCHAR
+STARTCHAR D
+ENCODING 132
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 133
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR C014
+ENCODING 134
+SWIDTH 510 0
+DWIDTH 26 0
+BBX 21 21 0 -21
+BITMAP
+FFFFF8
+FFFFF8
+FFFFF8
+E00000
+E00000
+E00000
+E00000
+E00000
+E0FF00
+E0FE00
+E0FC00
+E0FC00
+E0FE00
+E0FF00
+E0CF80
+E087C0
+E00380
+E00100
+E00000
+E00000
+E00000
+ENDCHAR
+STARTCHAR C014
+ENCODING 135
+SWIDTH 432 0
+DWIDTH 22 0
+BBX 23 23 -1 -22
+BITMAP
+FFFFFC
+FFFFFE
+FFFFFE
+FFFFFE
+FFFFFC
+F80000
+F80000
+F80000
+F8FFE0
+F8FFC0
+F8FF80
+F8FF00
+F8FF00
+F8FF80
+F8FFC0
+F8FFE0
+F8E7F0
+F8C3E0
+F881C0
+F80080
+F80000
+F80000
+700000
+ENDCHAR
+STARTCHAR C014
+ENCODING 136
+SWIDTH 510 0
+DWIDTH 26 0
+BBX 21 21 -18 -21
+BITMAP
+FFFFF8
+FFFFF8
+FFFFF8
+000038
+000038
+000038
+000038
+000038
+07F838
+03F838
+01F838
+01F838
+03F838
+07F838
+0F9838
+1F0838
+0E0038
+040038
+000038
+000038
+000038
+ENDCHAR
+STARTCHAR C014
+ENCODING 137
+SWIDTH 432 0
+DWIDTH 22 0
+BBX 23 23 -19 -22
+BITMAP
+7FFFFE
+FFFFFE
+FFFFFE
+FFFFFE
+7FFFFE
+00003E
+00003E
+00003E
+0FFE3E
+07FE3E
+03FE3E
+01FE3E
+01FE3E
+03FE3E
+07FE3E
+0FFE3E
+1FCE3E
+0F863E
+07023E
+02003E
+00003E
+00003E
+00001C
+ENDCHAR
+STARTCHAR C020
+ENCODING 138
+SWIDTH 216 0
+DWIDTH 11 0
+BBX 19 20 -8 -20
+BITMAP
+FFFFE0
+FFFFE0
+FFFFE0
+000000
+000000
+000000
+000000
+004000
+00E000
+01F000
+03F800
+07FC00
+0FFE00
+00E000
+00E000
+00E000
+00E000
+00E000
+00E000
+00E000
+ENDCHAR
+STARTCHAR C020
+ENCODING 139
+SWIDTH 235 0
+DWIDTH 12 0
+BBX 21 22 -9 -21
+BITMAP
+7FFFF0
+FFFFF8
+FFFFF8
+FFFFF8
+7FFFF0
+000000
+000000
+002000
+007000
+00F800
+01FC00
+03FE00
+07FF00
+0FFF80
+1FFFC0
+00F800
+00F800
+00F800
+00F800
+00F800
+00F800
+007000
+ENDCHAR
+STARTCHAR D
+ENCODING 140
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 141
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 142
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 143
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 144
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 145
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 146
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 147
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR D
+ENCODING 148
+SWIDTH 255 0
+DWIDTH 13 0
+BBX 12 21 1 -22
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FF00
+FE00
+EF00
+C700
+8780
+0380
+03C0
+01C0
+01C0
+ENDCHAR
+STARTCHAR E
+ENCODING 149
+SWIDTH 530 0
+DWIDTH 27 0
+BBX 14 23 0 -23
+BITMAP
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+FFC0
+FFE0
+FFF0
+FFF8
+FFFC
+FFF8
+FF80
+FFC0
+F7C0
+E7E0
+C3E0
+03F0
+01F0
+01F0
+00E0
+ENDCHAR
+STARTCHAR C226
+ENCODING 150
+SWIDTH 235 0
+DWIDTH 12 0
+BBX 23 37 -10 -20
+BITMAP
+007C00
+00FE00
+00FE00
+00FE00
+00FE00
+00FE00
+00FE00
+00FE00
+03FF80
+0FFFE0
+1F01F0
+3C0078
+383838
+70381C
+70381C
+60380C
+E0380E
+E0380E
+E0380E
+E03C0E
+E01E0E
+600F0C
+70079C
+70031C
+380038
+3C0078
+1F01F0
+0FFFE0
+03FF80
+00FE00
+00FE00
+00FE00
+00FE00
+00FE00
+00FE00
+00FE00
+007C00
+ENDCHAR
+STARTCHAR C226
+ENCODING 151
+SWIDTH 235 0
+DWIDTH 12 0
+BBX 23 37 -10 -20
+BITMAP
+007C00
+00FE00
+00FE00
+00FE00
+00FE00
+00FE00
+00FE00
+00FE00
+03FF80
+0FFFE0
+1FFFF0
+3FFFF8
+3FFFF8
+7FFFFC
+7FFFFC
+7FFFFC
+FFFFFE
+FFFFFE
+FFFFFE
+FFFFFE
+FFFFFE
+7FFFFC
+7FFFFC
+7FFFFC
+3FFFF8
+3FFFF8
+1FFFF0
+0FFFE0
+03FF80
+00FE00
+00FE00
+00FE00
+00FE00
+00FE00
+00FE00
+00FE00
+007C00
+ENDCHAR
+STARTCHAR C230
+ENCODING 152
+SWIDTH 373 0
+DWIDTH 19 0
+BBX 11 21 -4 -12
+BITMAP
+FBE0
+FFE0
+1F00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+0E00
+1F00
+FFE0
+FBE0
+ENDCHAR
+STARTCHAR C231
+ENCODING 153
+SWIDTH 157 0
+DWIDTH 8 0
+BBX 13 23 -5 -13
+BITMAP
+7DF0
+FFF8
+FFF8
+7FF0
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+7FF0
+FFF8
+FFF8
+7DF0
+ENDCHAR
+ENDFONT
diff --git a/kcontrol/input/cursor_large_black.pcf.gz b/kcontrol/input/cursor_large_black.pcf.gz
new file mode 100644
index 000000000..900a1dd58
--- /dev/null
+++ b/kcontrol/input/cursor_large_black.pcf.gz
Binary files differ
diff --git a/kcontrol/input/cursor_large_white.pcf.gz b/kcontrol/input/cursor_large_white.pcf.gz
new file mode 100644
index 000000000..83935e1de
--- /dev/null
+++ b/kcontrol/input/cursor_large_white.pcf.gz
Binary files differ
diff --git a/kcontrol/input/cursor_small_white.pcf.gz b/kcontrol/input/cursor_small_white.pcf.gz
new file mode 100644
index 000000000..694cf5bfc
--- /dev/null
+++ b/kcontrol/input/cursor_small_white.pcf.gz
Binary files differ
diff --git a/kcontrol/input/kapplymousetheme.cpp b/kcontrol/input/kapplymousetheme.cpp
new file mode 100644
index 000000000..99d6d1077
--- /dev/null
+++ b/kcontrol/input/kapplymousetheme.cpp
@@ -0,0 +1,92 @@
+/*
+ * main.cpp
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ * Copyright (c) 2005 Lubos Lunak <l.lunak@kde.org>
+ *
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <X11/Xlib.h>
+
+#ifdef HAVE_XCURSOR
+# include <X11/Xcursor/Xcursor.h>
+#endif
+
+static Display* dpy;
+static Display* qt_xdisplay() { return dpy; }\
+static Window qt_xrootwin() { return DefaultRootWindow( dpy ); }
+
+bool isEmpty( const char* str )
+ {
+ if( str == NULL )
+ return true;
+ while( isspace( *str ))
+ ++str;
+ return *str == '\0';
+ }
+
+int main( int argc, char* argv[] )
+ {
+ if( argc != 3 )
+ return 1;
+ dpy = XOpenDisplay( NULL );
+ if( dpy == NULL )
+ return 2;
+ int ret = 0;
+#ifdef HAVE_XCURSOR
+ const char* theme = argv[ 1 ];
+ const char* size = argv[ 2 ];
+
+ // Note: If you update this code, update kapplymousetheme as well.
+
+ // use a default value for theme only if it's not configured at all, not even in X resources
+ if( isEmpty( theme )
+ && isEmpty( XGetDefault( qt_xdisplay(), "Xcursor", "theme" ))
+ && isEmpty( XcursorGetTheme( qt_xdisplay())))
+ {
+ theme = "default";
+ ret = 10; // means to switch to default
+ }
+
+ // Apply the KDE cursor theme to ourselves
+ if( !isEmpty( theme ))
+ XcursorSetTheme(qt_xdisplay(), theme );
+
+ if (!isEmpty( size ))
+ XcursorSetDefaultSize(qt_xdisplay(), atoi( size ));
+
+ // Load the default cursor from the theme and apply it to the root window.
+ Cursor handle = XcursorLibraryLoadCursor(qt_xdisplay(), "left_ptr");
+ XDefineCursor(qt_xdisplay(), qt_xrootwin(), handle);
+ XFreeCursor(qt_xdisplay(), handle); // Don't leak the cursor
+
+#else
+ ( void ) qt_xdisplay();
+ ( void ) qt_xrootwin();
+ ( void ) argv;
+#endif
+ XCloseDisplay( dpy );
+ return ret;
+ }
diff --git a/kcontrol/input/kmousedlg.ui b/kcontrol/input/kmousedlg.ui
new file mode 100644
index 000000000..01ba9966f
--- /dev/null
+++ b/kcontrol/input/kmousedlg.ui
@@ -0,0 +1,378 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KMouseDlg</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KMouseDlg</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>568</width>
+ <height>434</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>handedBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>GroupBoxPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="title">
+ <string>Button Order</string>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <property name="radioButtonExclusive">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>Spacer53</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>rightHanded</cstring>
+ </property>
+ <property name="text">
+ <string>Righ&amp;t handed</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>leftHanded</cstring>
+ </property>
+ <property name="text">
+ <string>Le&amp;ft handed</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>mousePix</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>150</width>
+ <height>115</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbScrollPolarity</cstring>
+ </property>
+ <property name="text">
+ <string>Re&amp;verse scroll direction</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Change the direction of scrolling for the mouse wheel or the 4th and 5th mouse buttons.</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Icons</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>doubleClick</cstring>
+ </property>
+ <property name="text">
+ <string>Dou&amp;ble-click to open files and folders (select icons on first click)</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="Line" row="5" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>Line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="6" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>cbVisualActivate</cstring>
+ </property>
+ <property name="text">
+ <string>Visual f&amp;eedback on activation</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>cb_pointershape</cstring>
+ </property>
+ <property name="text">
+ <string>Cha&amp;nge pointer shape over icons</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>cbAutoSelect</cstring>
+ </property>
+ <property name="text">
+ <string>A&amp;utomatically select icons</string>
+ </property>
+ </widget>
+ <spacer row="2" column="0" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>Spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>60</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="4" column="2">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>lb_short</cstring>
+ </property>
+ <property name="text">
+ <string>Short</string>
+ </property>
+ </widget>
+ <widget class="QSlider" row="0" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>slAutoSelect</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>250</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>2000</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <spacer row="0" column="3" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>Spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>230</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>lDelay</cstring>
+ </property>
+ <property name="text">
+ <string>Dela&amp;y:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>slAutoSelect</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="2">
+ <property name="name">
+ <cstring>lb_long</cstring>
+ </property>
+ <property name="text">
+ <string>Long</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QRadioButton" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>singleClick</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Single-click to open files and folders</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>singleClick</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>cb_pointershape</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>singleClick</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>cbAutoSelect</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbAutoSelect</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>slAutoSelect</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>rightHanded</tabstop>
+ <tabstop>leftHanded</tabstop>
+ <tabstop>singleClick</tabstop>
+ <tabstop>cb_pointershape</tabstop>
+ <tabstop>cbAutoSelect</tabstop>
+ <tabstop>slAutoSelect</tabstop>
+ <tabstop>doubleClick</tabstop>
+ <tabstop>cbVisualActivate</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/input/logitechmouse.cpp b/kcontrol/input/logitechmouse.cpp
new file mode 100644
index 000000000..1b8132a7e
--- /dev/null
+++ b/kcontrol/input/logitechmouse.cpp
@@ -0,0 +1,417 @@
+/*
+ * logitechmouse.cpp
+ *
+ * Copyright (C) 2004 Brad Hards <bradh@frogmouth.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 <qdialog.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+#include <qradiobutton.h>
+#include <qbuttongroup.h>
+#include <qwidget.h>
+#include <qlayout.h>
+#include <qprogressbar.h>
+#include <qtimer.h>
+
+#include <kdebug.h>
+#include <kdialog.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include <config.h>
+
+#ifdef HAVE_LIBUSB
+#include <usb.h>
+
+#include "logitechmouse.h"
+
+LogitechMouse::LogitechMouse( struct usb_device *usbDev, int mouseCapabilityFlags, QWidget* parent, const char* name )
+ : LogitechMouseBase( parent, name, 0 )
+{
+ if ( !name )
+ setName( "LogitechMouse" );
+
+ cordlessNameLabel->setText( i18n("Mouse type: %1").arg( this->name() ) );
+
+ m_mouseCapabilityFlags = mouseCapabilityFlags;
+
+ m_usbDeviceHandle = usb_open( usbDev );
+
+ if ( 0 == m_usbDeviceHandle ) {
+ kdWarning() << "Error opening usbfs file: " << usb_strerror() << endl;
+ return;
+ }
+
+ if ( mouseCapabilityFlags & USE_CH2 ) {
+ m_useSecondChannel = 0x0100;
+ } else {
+ m_useSecondChannel = 0x0000;
+ }
+
+ permissionProblemText->hide();
+
+ if ( mouseCapabilityFlags & HAS_RES ) {
+ updateResolution();
+ resolutionSelector->setEnabled( TRUE );
+
+ connect( button400cpi, SIGNAL( clicked() ), parent, SLOT( changed() ) );
+ connect( button800cpi, SIGNAL( clicked() ), parent, SLOT( changed() ) );
+
+ if ( 4 == resolution() ) {
+ button800cpi->setChecked( TRUE );
+ } else if ( 3 == resolution() ) {
+ button400cpi->setChecked( TRUE );
+ } else {
+ // it must have failed, try to help out
+ resolutionSelector->setEnabled(FALSE);
+ permissionProblemText->show();
+ }
+ }
+
+ if ( mouseCapabilityFlags & HAS_CSR ) {
+
+ initCordlessStatusReporting();
+
+ // Do a name
+ cordlessNameLabel->setText( i18n("Mouse type: %1").arg( cordlessName() ) );
+ cordlessNameLabel->setEnabled( TRUE );
+
+ // Display the battery power level - the level gets updated in updateGUI()
+ batteryBox->setEnabled( TRUE );
+
+ // Channel
+ channelSelector->setEnabled( TRUE );
+ // if the channel is changed, we need to turn off the timer, otherwise it
+ // just resets the button to reflect the current status. The timer is
+ // started again when we applyChanges()
+ connect( channel1, SIGNAL( clicked() ), this, SLOT( stopTimerForNow() ) );
+ connect( channel1, SIGNAL( clicked() ), parent, SLOT( changed() ) );
+ if ( isDualChannelCapable() ) {
+ channel2->setEnabled( TRUE );
+ connect( channel2, SIGNAL( clicked() ), this, SLOT( stopTimerForNow() ) );
+ connect( channel2, SIGNAL( clicked() ), parent, SLOT( changed() ) );
+ }
+
+ updateGUI();
+ }
+
+}
+
+LogitechMouse::~LogitechMouse()
+{
+ usb_close( m_usbDeviceHandle );
+}
+
+void LogitechMouse::initCordlessStatusReporting()
+{
+ updateCordlessStatus();
+ doUpdate = new QTimer( this ); // will be automatically deleted
+ connect( doUpdate, SIGNAL( timeout() ), this, SLOT( updateGUI() ) );
+ doUpdate->start( 20000 );
+}
+
+void LogitechMouse::updateCordlessStatus()
+{
+ QByteArray status(8);
+
+ int result = usb_control_msg( m_usbDeviceHandle,
+ USB_TYPE_VENDOR | USB_ENDPOINT_IN,0x09,
+ (0x0003 | m_useSecondChannel),
+ (0x0000 | m_useSecondChannel),
+ status.data(),
+ 0x0008,
+ 1000);
+
+ if (0 > result) {
+ // We probably have a permission problem
+ channelSelector->setEnabled( FALSE );
+ batteryBox->setEnabled( FALSE );
+ cordlessNameLabel->hide();
+ permissionProblemText->show();
+ } else {
+ // kdDebug() << "P6 (connect status): " << (status[0] & 0xFF) << endl;
+ if ( status[0] & 0x20 ) { // mouse is talking
+ m_connectStatus = ( status[0] & 0x80 );
+ m_mousePowerup = ( status[0] & 0x40 );
+ m_receiverUnlock = ( status[0] & 0x10 );
+ m_waitLock = ( status[0] & 0x08 );
+ }
+
+ // kdDebug() << "P0 (receiver type): " << (status[1] & 0xFF) << endl;
+ /*
+ 0x38 = pid C501
+ 0x39 = pid C502
+ 0x3B = pid C504
+ 0x3C = pid C508
+ 0x3D = pid C506
+ 0x3E = pid C505
+ */
+
+ m_cordlessNameIndex = (status[2] & 0xFF);
+
+ m_batteryLevel = (status[3] & 0x07 );
+ if ( status[3] & 0x08 ) {
+ m_channel = 2;
+ } else {
+ m_channel = 1;
+ }
+
+ m_cordlessSecurity = ( ( status[4] ) & ( status[5] << 8 ) );
+
+ m_caseShape = ( status[6] & 0x7F );
+
+ // kdDebug() << "PB1 (device Capabilities): " << (status[7] & 0xFF) << endl;
+ m_numberOfButtons = 2 + ( status[7] & 0x07 ); // 9 means something more than 8
+ m_twoChannelCapable = ( status[7] & 0x40 );
+ m_verticalRoller = ( status[7] & 0x08 );
+ m_horizontalRoller = ( status[7] & 0x10 );
+ m_has800cpi = ( status[7] & 0x20 );
+ }
+
+}
+
+void LogitechMouse::updateGUI()
+{
+ updateCordlessStatus();
+
+ batteryBar->setProgress( batteryLevel() );
+
+ if ( isDualChannelCapable() ) {
+ if ( 2 == channel() ) {
+ channel2->setChecked( TRUE );
+ } else if ( 1 == channel() ) {
+ channel1->setChecked( TRUE );
+ } // else it might have failed - we don't do anything
+ }
+}
+
+void LogitechMouse::stopTimerForNow()
+{
+ doUpdate->stop();
+}
+
+void LogitechMouse::applyChanges()
+{
+ if ( m_mouseCapabilityFlags & HAS_RES ) {
+ if ( ( resolution() == 4 ) && ( button400cpi->isChecked() ) ) {
+ // then we are in 800cpi mode, but want 400cpi
+ setLogitechTo400();
+ } else if ( ( resolution() == 3 ) && (button800cpi->isChecked() ) ) {
+ // then we are in 400 cpi mode, but want 800 cpi
+ setLogitechTo800();
+ }
+ }
+
+ if ( isDualChannelCapable() ) {
+ if ( ( channel() == 2 ) && ( channel1->isChecked() ) ) {
+ // we are on channel 2, but want channel 1
+ setChannel1();
+ KMessageBox::information(this, i18n("RF channel 1 has been set. Please press Connect button on mouse to re-establish link"), i18n("Press Connect Button") );
+ } else if ( ( channel() == 1 ) && ( channel2->isChecked() ) ) {
+ // we are on channel 1, but want channel 2
+ setChannel2();
+ KMessageBox::information(this, i18n("RF channel 2 has been set. Please press Connect button on mouse to re-establish link"), i18n("Press Connect Button") );
+ }
+
+ initCordlessStatusReporting();
+ }
+}
+
+void LogitechMouse::save(KConfig * /*config*/)
+{
+ kdDebug() << "Logitech mouse settings not saved - not implemented yet" << endl;
+}
+
+Q_UINT8 LogitechMouse::resolution()
+{
+ // kdDebug() << "resolution: " << m_resolution << endl;
+ if ( 0 == m_resolution ) {
+ updateResolution();
+ }
+ return m_resolution;
+}
+
+void LogitechMouse::updateResolution()
+{
+ char resolution;
+
+ int result = usb_control_msg( m_usbDeviceHandle,
+ USB_TYPE_VENDOR | USB_ENDPOINT_IN,
+ 0x01,
+ 0x000E,
+ 0x0000,
+ &resolution,
+ 0x0001,
+ 100);
+
+ // kdDebug() << "resolution is: " << resolution << endl;
+ if (0 > result) {
+ kdWarning() << "Error getting resolution from device : " << usb_strerror() << endl;
+ m_resolution = 0;
+ } else {
+ m_resolution = resolution;
+ }
+}
+
+void LogitechMouse::setLogitechTo800()
+{
+ int result = usb_control_msg( m_usbDeviceHandle,
+ USB_TYPE_VENDOR,
+ 0x02,
+ 0x000E,
+ 4,
+ NULL,
+ 0x0000,
+ 100);
+ if (0 > result) {
+ kdWarning() << "Error setting resolution on device: " << usb_strerror() << endl;
+ }
+}
+
+void LogitechMouse::setLogitechTo400()
+{
+ int result = usb_control_msg( m_usbDeviceHandle,
+ USB_TYPE_VENDOR,
+ 0x02,
+ 0x000E,
+ 3,
+ NULL,
+ 0x0000,
+ 100);
+ if (0 > result) {
+ kdWarning() << "Error setting resolution on device: " << usb_strerror() << endl;
+ }
+}
+
+Q_UINT8 LogitechMouse::batteryLevel()
+{
+ return m_batteryLevel;
+}
+
+
+Q_UINT8 LogitechMouse::channel()
+{
+ return m_channel;
+}
+
+bool LogitechMouse::isDualChannelCapable()
+{
+ return m_twoChannelCapable;
+}
+
+void LogitechMouse::setChannel1()
+{
+ int result = usb_control_msg( m_usbDeviceHandle,
+ USB_TYPE_VENDOR,
+ 0x02,
+ (0x0008 | m_useSecondChannel),
+ (0x0000 | m_useSecondChannel),
+ NULL,
+ 0x0000,
+ 1000);
+
+ if (0 > result) {
+ kdWarning() << "Error setting mouse to channel 1 : " << usb_strerror() << endl;
+ }
+
+}
+
+void LogitechMouse::setChannel2()
+{
+ int result = usb_control_msg( m_usbDeviceHandle,
+ USB_TYPE_VENDOR,
+ 0x02,
+ (0x0008 | m_useSecondChannel),
+ (0x0001 | m_useSecondChannel),
+ NULL,
+ 0x0000,
+ 1000);
+
+ if (0 > result) {
+ kdWarning() << "Error setting mouse to channel 2 : " << usb_strerror() << endl;
+ }
+
+}
+
+QString LogitechMouse::cordlessName()
+{
+ switch ( m_cordlessNameIndex ) {
+ case 0x00:
+ return i18n( "none" );
+ break;
+ case 0x04:
+ return i18n( "Cordless Mouse" );
+ break;
+ case 0x05:
+ return i18n( "Cordless Wheel Mouse" );
+ break;
+ case 0x06:
+ return i18n( "Cordless MouseMan Wheel" );
+ break;
+ case 0x07:
+ return i18n( "Cordless Wheel Mouse" );
+ break;
+ case 0x08:
+ return i18n( "Cordless Wheel Mouse" );
+ break;
+ case 0x09:
+ return i18n( "Cordless TrackMan Wheel" );
+ break;
+ case 0x0A:
+ return i18n( "TrackMan Live" );
+ break;
+ case 0x0C:
+ return i18n( "Cordless TrackMan FX" );
+ break;
+ case 0x0D:
+ return i18n( "Cordless MouseMan Optical" );
+ break;
+ case 0x0E:
+ return i18n( "Cordless Optical Mouse" );
+ break;
+ case 0x0F:
+ return i18n( "Cordless Mouse" );
+ break;
+ case 0x12:
+ return i18n( "Cordless MouseMan Optical (2ch)" );
+ break;
+ case 0x13:
+ return i18n( "Cordless Optical Mouse (2ch)" );
+ break;
+ case 0x14:
+ return i18n( "Cordless Mouse (2ch)" );
+ break;
+ case 0x82:
+ return i18n( "Cordless Optical TrackMan" );
+ break;
+ case 0x8A:
+ return i18n( "MX700 Cordless Optical Mouse" );
+ break;
+ case 0x8B:
+ return i18n( "MX700 Cordless Optical Mouse (2ch)" );
+ break;
+ default:
+ return i18n( "Unknown mouse");
+ }
+}
+
+#include "logitechmouse.moc"
+
+#endif
+
diff --git a/kcontrol/input/logitechmouse.h b/kcontrol/input/logitechmouse.h
new file mode 100644
index 000000000..8c7ef06d3
--- /dev/null
+++ b/kcontrol/input/logitechmouse.h
@@ -0,0 +1,102 @@
+/*
+ * logitechmouse.h
+ *
+ * Copyright (C) 2004 Brad Hards <bradh@frogmouth.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef __LOGITECHMOUSE_H__
+#define __LOGITECHMOUSE_H__
+
+#include <qdialog.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+#include <qradiobutton.h>
+#include <qbuttongroup.h>
+
+#include <kconfig.h>
+
+#include <config.h>
+
+#include "logitechmouse_base.h"
+
+#include <usb.h>
+
+#define VENDOR_LOGITECH 0x046D
+#define HAS_RES 0x01 /* mouse supports variable resolution */
+#define HAS_SS 0x02 /* mouse supports smart scroll control */
+#define HAS_CSR 0x04 /* mouse supports cordless status reporting and control */
+#define HAS_SSR 0x08 /* mouse supports smart scroll reporting */
+#define USE_CH2 0x10 /* mouse needs to use the second channel */
+
+
+class LogitechMouse : public LogitechMouseBase
+{
+ Q_OBJECT
+
+public:
+ LogitechMouse( struct usb_device *usbDev, int mouseCapabilityFlags, QWidget* parent = 0, const char* name = 0 );
+ ~LogitechMouse();
+ void applyChanges();
+ void save(KConfig *config);
+
+protected slots:
+ void setChannel1();
+ void setChannel2();
+ void updateGUI();
+ void stopTimerForNow();
+
+private:
+ void initCordlessStatusReporting();
+ void updateCordlessStatus();
+
+ void setLogitechTo400();
+ void setLogitechTo800();
+
+ QString cordlessName();
+ Q_UINT8 resolution();
+ void updateResolution();
+ Q_UINT8 batteryLevel();
+ Q_UINT8 channel();
+ bool isDualChannelCapable();
+
+ QTimer *doUpdate;
+
+ struct usb_dev_handle *m_usbDeviceHandle;
+ bool m_connectStatus; // true if the CONNECT button on the mouse is pressed
+ bool m_mousePowerup; // true if we are doing "just out of the box" auto-locking
+ bool m_receiverUnlock; // true if mouse has been disconnected by a long press
+ // of the receiver's CONNECT button
+ bool m_waitLock; // true if receiver searching for new mouse because the
+ // CONNECT button on the receiver was pressed
+ Q_UINT8 m_batteryLevel;
+ Q_UINT8 m_channel;
+ Q_UINT8 m_cordlessNameIndex; // this gets convered into a QString in cordlessName()
+ Q_UINT16 m_cordlessSecurity;
+ Q_UINT16 m_useSecondChannel;
+ Q_UINT8 m_caseShape;
+ Q_UINT8 m_numberOfButtons;
+ Q_UINT8 m_resolution;
+ bool m_twoChannelCapable; // true if the mouse supports dual channels
+ bool m_verticalRoller; // true if the mouse has a vertical roller (wheel)
+ bool m_horizontalRoller; // true if the mouse has a horizontal roller (wheel)
+ bool m_has800cpi; // true if the mouse does 800cpi resolution
+ int m_mouseCapabilityFlags;
+};
+
+#endif
+
diff --git a/kcontrol/input/logitechmouse.usermap b/kcontrol/input/logitechmouse.usermap
new file mode 100644
index 000000000..65da520c5
--- /dev/null
+++ b/kcontrol/input/logitechmouse.usermap
@@ -0,0 +1,35 @@
+# script match_flags idVendor idProduct bcdDevice_lo bcdDevice_hi bDeviceClass bDeviceSubClass bDeviceProtocol bInterfaceClass bInterfaceSubClass bInterfaceProtocol driver_info
+# Wheel Mouse Optical
+consoleUserPerms 0x0003 0x046d 0xc00e 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# MouseMan Traveler
+consoleUserPerms 0x0003 0x046d 0xc00f 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# MouseMan Dual Optical
+consoleUserPerms 0x0003 0x046d 0xc012 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# MX310 Optical Mouse
+consoleUserPerms 0x0003 0x046d 0xc01b 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# MX510 Optical Mouse
+consoleUserPerms 0x0003 0x046d 0xc01d 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# MX300 Optical Mouse
+consoleUserPerms 0x0003 0x046d 0xc024 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# MX500 Optical Mouse
+consoleUserPerms 0x0003 0x046d 0xc025 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# iFeel Mouse
+consoleUserPerms 0x0003 0x046d 0xc031 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# Mouse Receiver
+consoleUserPerms 0x0003 0x046d 0xc501 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# Dual Receiver
+consoleUserPerms 0x0003 0x046d 0xc502 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# Cordless Freedom Optical
+consoleUserPerms 0x0003 0x046d 0xc504 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# Cordless Elite Duo
+consoleUserPerms 0x0003 0x046d 0xc505 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# MX700 Optical Mouse
+consoleUserPerms 0x0003 0x046d 0xc506 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# Cordless Optical Trackman
+consoleUserPerms 0x0003 0x046d 0xc508 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# Cordless MX Duo Receiver
+consoleUserPerms 0x0003 0x046d 0xc50b 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# MX100 Laser Mouse
+consoleUserPerms 0x0003 0x046d 0xc50e 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+# Receiver for Cordless Presenter
+consoleUserPerms 0x0003 0x046d 0xc702 0x0000 0xffff 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
diff --git a/kcontrol/input/logitechmouse_base.ui b/kcontrol/input/logitechmouse_base.ui
new file mode 100644
index 000000000..5c9c1cd9a
--- /dev/null
+++ b/kcontrol/input/logitechmouse_base.ui
@@ -0,0 +1,153 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>LogitechMouseBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>LogitechMouseBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>458</width>
+ <height>383</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>cordlessNameLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Cordless Name</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>permissionProblemText</cstring>
+ </property>
+ <property name="text">
+ <string>You have a Logitech Mouse connected, and libusb was found at compile time, but it was not possible to access this mouse. This is probably caused by a permissions problem - you should consult the manual on how to fix this.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="0">
+ <property name="name">
+ <cstring>resolutionSelector</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>Sensor Resolution</string>
+ </property>
+ <property name="radioButtonExclusive">
+ <bool>true</bool>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>button400cpi</cstring>
+ </property>
+ <property name="text">
+ <string>400 counts per inch</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>button800cpi</cstring>
+ </property>
+ <property name="text">
+ <string>800 counts per inch</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>1</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0">
+ <property name="name">
+ <cstring>batteryBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>Battery Level</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QProgressBar">
+ <property name="name">
+ <cstring>batteryBar</cstring>
+ </property>
+ <property name="totalSteps">
+ <number>7</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup" row="3" column="0">
+ <property name="name">
+ <cstring>channelSelector</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>RF Channel</string>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>channel1</cstring>
+ </property>
+ <property name="text">
+ <string>Channel 1</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="buttonGroupId">
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>channel2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Channel 2</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>3</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kcontrol/input/main.cpp b/kcontrol/input/main.cpp
new file mode 100644
index 000000000..f0a464adc
--- /dev/null
+++ b/kcontrol/input/main.cpp
@@ -0,0 +1,96 @@
+/*
+ * main.cpp
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ *
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <dcopref.h>
+#include <qfile.h>
+
+#include <X11/Xlib.h>
+
+#ifdef HAVE_XCURSOR
+# include <X11/Xcursor/Xcursor.h>
+#endif
+
+#include "mouse.h"
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_mouse(QWidget *parent, const char *)
+ {
+ return new MouseConfig(parent, "kcminput");
+ }
+
+ KDE_EXPORT void init_mouse()
+ {
+ KConfig *config = new KConfig("kcminputrc", true, false); // Read-only, no globals
+ MouseSettings settings;
+ settings.load(config);
+ settings.apply(true); // force
+
+#ifdef HAVE_XCURSOR
+ config->setGroup("Mouse");
+ QCString theme = QFile::encodeName(config->readEntry("cursorTheme", QString()));
+ QCString size = config->readEntry("cursorSize", QString()).local8Bit();
+
+ // Note: If you update this code, update kapplymousetheme as well.
+
+ // use a default value for theme only if it's not configured at all, not even in X resources
+ if( theme.isEmpty()
+ && QCString( XGetDefault( qt_xdisplay(), "Xcursor", "theme" )).isEmpty()
+ && QCString( XcursorGetTheme( qt_xdisplay())).isEmpty())
+ {
+ theme = "default";
+ }
+
+ // Apply the KDE cursor theme to ourselves
+ if( !theme.isEmpty())
+ XcursorSetTheme(qt_xdisplay(), theme.data());
+
+ if (!size.isEmpty())
+ XcursorSetDefaultSize(qt_xdisplay(), size.toUInt());
+
+ // Load the default cursor from the theme and apply it to the root window.
+ Cursor handle = XcursorLibraryLoadCursor(qt_xdisplay(), "left_ptr");
+ XDefineCursor(qt_xdisplay(), qt_xrootwin(), handle);
+ XFreeCursor(qt_xdisplay(), handle); // Don't leak the cursor
+
+ // Tell klauncher to set the XCURSOR_THEME and XCURSOR_SIZE environment
+ // variables when launching applications.
+ DCOPRef klauncher("klauncher");
+ if( !theme.isEmpty())
+ klauncher.send("setLaunchEnv", QCString("XCURSOR_THEME"), theme);
+ if( !size.isEmpty())
+ klauncher.send("setLaunchEnv", QCString("XCURSOR_SIZE"), size);
+#endif
+
+ delete config;
+ }
+}
+
+
diff --git a/kcontrol/input/mouse.cpp b/kcontrol/input/mouse.cpp
new file mode 100644
index 000000000..56e737135
--- /dev/null
+++ b/kcontrol/input/mouse.cpp
@@ -0,0 +1,838 @@
+/*
+ * mouse.cpp
+ *
+ * Copyright (c) 1997 Patrick Dowler dowler@morgul.fsh.uvic.ca
+ *
+ * Layout management, enhancements:
+ * Copyright (c) 1999 Dirk A. Mueller <dmuell@gmx.net>
+ *
+ * SC/DC/AutoSelect/ChangeCursor:
+ * Copyright (c) 2000 David Faure <faure@kde.org>
+ *
+ * Double click interval, drag time & dist
+ * Copyright (c) 2000 Bernd Gehrmann
+ *
+ * Large cursor support
+ * Visual activation TODO: speed
+ * Copyright (c) 2000 Rik Hemsley <rik@kde.org>
+ *
+ * White cursor support
+ * TODO: give user the option to choose a certain cursor font
+ * -> Theming
+ *
+ * General/Advanced tabs
+ * Copyright (c) 2000 Brad Hughes <bhughes@trolltech.com>
+ *
+ * redesign for KDE 2.2
+ * Copyright (c) 2001 Ralf Nolden <nolden@kde.org>
+ *
+ * Logitech mouse support
+ * Copyright (C) 2004 Brad Hards <bradh@frogmouth.net>
+ *
+ * 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 <qlayout.h>
+#include <qcheckbox.h>
+#undef Below
+#undef Above
+#include <qslider.h>
+#include <qwhatsthis.h>
+#include <qtabwidget.h>
+#include <qradiobutton.h>
+
+#include <klocale.h>
+#include <kdialog.h>
+#include <kconfig.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+#include <kaboutdata.h>
+
+#include <config.h>
+
+#include "mouse.h"
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <kipc.h>
+
+#undef Below
+
+MouseConfig::MouseConfig (QWidget * parent, const char *name)
+ : KCModule(parent, name)
+{
+
+
+ setQuickHelp( i18n("<h1>Mouse</h1> This module allows you to choose various"
+ " options for the way in which your pointing device works. Your"
+ " pointing device may be a mouse, trackball, or some other hardware"
+ " that performs a similar function."));
+
+ QString wtstr;
+
+ QBoxLayout *top = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ tabwidget = new QTabWidget(this);
+ top->addWidget(tabwidget);
+
+ tab1 = new KMouseDlg(this);
+ QButtonGroup *group = new QButtonGroup( tab1 );
+ group->setExclusive( true );
+ group->hide();
+ group->insert( tab1->singleClick );
+ group->insert( tab1->doubleClick );
+
+ tabwidget->addTab(tab1, i18n("&General"));
+
+ connect(tab1->handedBox, SIGNAL(clicked(int)), this, SLOT(changed()));
+ connect(tab1->handedBox, SIGNAL(clicked(int)), this, SLOT(slotHandedChanged(int)));
+
+ wtstr = i18n("If you are left-handed, you may prefer to swap the"
+ " functions of the left and right buttons on your pointing device"
+ " by choosing the 'left-handed' option. If your pointing device"
+ " has more than two buttons, only those that function as the"
+ " left and right buttons are affected. For example, if you have"
+ " a three-button mouse, the middle button is unaffected.");
+ QWhatsThis::add( tab1->handedBox, wtstr );
+
+ connect(tab1->doubleClick, SIGNAL(clicked()), SLOT(changed()));
+
+ wtstr = i18n("The default behavior in KDE is to select and activate"
+ " icons with a single click of the left button on your pointing"
+ " device. This behavior is consistent with what you would expect"
+ " when you click links in most web browsers. If you would prefer"
+ " to select with a single click, and activate with a double click,"
+ " check this option.");
+ QWhatsThis::add( tab1->doubleClick, wtstr );
+
+ wtstr = i18n("Activates and opens a file or folder with a single click.");
+ QWhatsThis::add( tab1->singleClick, wtstr );
+
+
+ connect(tab1->cbAutoSelect, SIGNAL(clicked()), this, SLOT(changed()));
+
+ wtstr = i18n("If you check this option, pausing the mouse pointer"
+ " over an icon on the screen will automatically select that icon."
+ " This may be useful when single clicks activate icons, and you"
+ " want only to select the icon without activating it.");
+ QWhatsThis::add( tab1->cbAutoSelect, wtstr );
+
+// slAutoSelect = new QSlider(0, 2000, 10, 0, QSlider::Horizontal, tab1);
+ tab1->slAutoSelect->setSteps( 125, 125 );
+ tab1->slAutoSelect->setTickmarks( QSlider::Below );
+ tab1->slAutoSelect->setTickInterval( 250 );
+ tab1->slAutoSelect->setTracking( true );
+
+ wtstr = i18n("If you have checked the option to automatically select"
+ " icons, this slider allows you to select how long the mouse pointer"
+ " must be paused over the icon before it is selected.");
+ QWhatsThis::add( tab1->slAutoSelect, wtstr );
+
+ wtstr = i18n("Show feedback when clicking an icon");
+ QWhatsThis::add( tab1->cbVisualActivate, wtstr );
+
+ connect(tab1->slAutoSelect, SIGNAL(valueChanged(int)), this, SLOT(changed()));
+ connect(tab1->cbVisualActivate, SIGNAL(clicked()), this, SLOT(changed()));
+
+ connect(tab1->cb_pointershape, SIGNAL(clicked()), this, SLOT(changed()));
+
+ connect(tab1->singleClick, SIGNAL(clicked()), this, SLOT(changed()));
+ connect(tab1->singleClick, SIGNAL(clicked()), this, SLOT(slotClick()));
+
+ connect( tab1->doubleClick, SIGNAL( clicked() ), this, SLOT( slotClick() ) );
+ connect( tab1->cbAutoSelect, SIGNAL( clicked() ), this, SLOT( slotClick() ) );
+
+ // Only allow setting reversing scroll polarity if we have scroll buttons
+ unsigned char map[20];
+ if ( XGetPointerMapping(kapp->getDisplay(), map, 20) >= 5 )
+ {
+ tab1->cbScrollPolarity->setEnabled( true );
+ tab1->cbScrollPolarity->show();
+ }
+ else
+ {
+ tab1->cbScrollPolarity->setEnabled( false );
+ tab1->cbScrollPolarity->hide();
+ }
+ connect(tab1->cbScrollPolarity, SIGNAL(clicked()), this, SLOT(changed()));
+ connect(tab1->cbScrollPolarity, SIGNAL(clicked()), this, SLOT(slotScrollPolarityChanged()));
+
+ // Cursor theme tab
+ themetab = new ThemePage(this);
+ connect(themetab, SIGNAL(changed(bool)), SLOT(changed()));
+ tabwidget->addTab(themetab, i18n("&Cursor Theme"));
+
+ // Advanced tab
+ tab2 = new QWidget(0, "Advanced Tab");
+ tabwidget->addTab(tab2, i18n("Advanced"));
+
+ QBoxLayout *lay = new QVBoxLayout(tab2, KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ accel = new KDoubleNumInput(1, 20, 2, 0.1, 1, tab2);
+ accel->setLabel(i18n("Pointer acceleration:"));
+ accel->setSuffix("x");
+ lay->addWidget(accel);
+ connect(accel, SIGNAL(valueChanged(double)), this, SLOT(changed()));
+
+ wtstr = i18n("This option allows you to change the relationship"
+ " between the distance that the mouse pointer moves on the"
+ " screen and the relative movement of the physical device"
+ " itself (which may be a mouse, trackball, or some other"
+ " pointing device.)<p>"
+ " A high value for the acceleration will lead to large"
+ " movements of the mouse pointer on the screen even when"
+ " you only make a small movement with the physical device."
+ " Selecting very high values may result in the mouse pointer"
+ " flying across the screen, making it hard to control.");
+ QWhatsThis::add( accel, wtstr );
+
+ thresh = new KIntNumInput(accel, 20, tab2);
+ thresh->setLabel(i18n("Pointer threshold:"));
+ thresh->setRange(0,20,1);
+ thresh->setSteps(1,1);
+ lay->addWidget(thresh);
+ connect(thresh, SIGNAL(valueChanged(int)), this, SLOT(changed()));
+ connect(thresh, SIGNAL(valueChanged(int)), this, SLOT(slotThreshChanged(int)));
+ slotThreshChanged(thresh->value());
+
+ wtstr = i18n("The threshold is the smallest distance that the"
+ " mouse pointer must move on the screen before acceleration"
+ " has any effect. If the movement is smaller than the threshold,"
+ " the mouse pointer moves as if the acceleration was set to 1X;<p>"
+ " thus, when you make small movements with the physical device,"
+ " there is no acceleration at all, giving you a greater degree"
+ " of control over the mouse pointer. With larger movements of"
+ " the physical device, you can move the mouse pointer"
+ " rapidly to different areas on the screen.");
+ QWhatsThis::add( thresh, wtstr );
+
+ // It would be nice if the user had a test field.
+ // Selecting such values in milliseconds is not intuitive
+ doubleClickInterval = new KIntNumInput(thresh, 2000, tab2);
+ doubleClickInterval->setLabel(i18n("Double click interval:"));
+ doubleClickInterval->setRange(0, 2000, 100);
+ doubleClickInterval->setSuffix(i18n(" msec"));
+ doubleClickInterval->setSteps(100, 100);
+ lay->addWidget(doubleClickInterval);
+ connect(doubleClickInterval, SIGNAL(valueChanged(int)), this, SLOT(changed()));
+
+ wtstr = i18n("The double click interval is the maximal time"
+ " (in milliseconds) between two mouse clicks which"
+ " turns them into a double click. If the second"
+ " click happens later than this time interval after"
+ " the first click, they are recognized as two"
+ " separate clicks.");
+ QWhatsThis::add( doubleClickInterval, wtstr );
+
+ lay->addSpacing(15);
+
+ dragStartTime = new KIntNumInput(doubleClickInterval, 2000, tab2);
+ dragStartTime->setLabel(i18n("Drag start time:"));
+ dragStartTime->setRange(0, 2000, 100);
+ dragStartTime->setSuffix(i18n(" msec"));
+ dragStartTime->setSteps(100, 100);
+ lay->addWidget(dragStartTime);
+ connect(dragStartTime, SIGNAL(valueChanged(int)), this, SLOT(changed()));
+
+ wtstr = i18n("If you click with the mouse (e.g. in a multi-line"
+ " editor) and begin to move the mouse within the"
+ " drag start time, a drag operation will be initiated.");
+ QWhatsThis::add( dragStartTime, wtstr );
+
+ dragStartDist = new KIntNumInput(dragStartTime, 20, tab2);
+ dragStartDist->setLabel(i18n("Drag start distance:"));
+ dragStartDist->setRange(1, 20, 1);
+ dragStartDist->setSteps(1,1);
+ lay->addWidget(dragStartDist);
+ connect(dragStartDist, SIGNAL(valueChanged(int)), this, SLOT(changed()));
+ connect(dragStartDist, SIGNAL(valueChanged(int)), this, SLOT(slotDragStartDistChanged(int)));
+ slotDragStartDistChanged(dragStartDist->value());
+
+ wtstr = i18n("If you click with the mouse and begin to move the"
+ " mouse at least the drag start distance, a drag"
+ " operation will be initiated.");
+ QWhatsThis::add( dragStartDist, wtstr);
+
+ wheelScrollLines = new KIntNumInput(dragStartDist, 3, tab2);
+ wheelScrollLines->setLabel(i18n("Mouse wheel scrolls by:"));
+ wheelScrollLines->setRange(1, 12, 1);
+ wheelScrollLines->setSteps(1,1);
+ lay->addWidget(wheelScrollLines);
+ connect(wheelScrollLines, SIGNAL(valueChanged(int)), this, SLOT(changed()));
+ connect(wheelScrollLines, SIGNAL(valueChanged(int)), SLOT(slotWheelScrollLinesChanged(int)));
+ slotWheelScrollLinesChanged(wheelScrollLines->value());
+
+ wtstr = i18n("If you use the wheel of a mouse, this value determines the number of lines to scroll for each wheel movement. Note that if this number exceeds the number of visible lines, it will be ignored and the wheel movement will be handled as a page up/down movement.");
+ QWhatsThis::add( wheelScrollLines, wtstr);
+ lay->addStretch();
+
+{
+ QWidget *mouse = new QWidget(this, "Mouse Navigation");
+ tabwidget->addTab(mouse, i18n("Mouse Navigation"));
+
+
+ QBoxLayout *vbox = new QVBoxLayout(mouse, KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ QVBoxLayout *vvbox = new QVBoxLayout(mouse->layout(), KDialog::spacingHint());
+
+ mouseKeys = new QCheckBox(i18n("&Move pointer with keyboard (using the num pad)"), mouse);
+ vvbox->addWidget(mouseKeys);
+
+ QBoxLayout *hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ mk_delay = new KIntNumInput(mouse);
+ mk_delay->setLabel(i18n("&Acceleration delay:"), AlignVCenter);
+ mk_delay->setSuffix(i18n(" msec"));
+ mk_delay->setRange(1, 1000, 50);
+ hbox->addWidget(mk_delay);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ mk_interval = new KIntNumInput(mk_delay, 0, mouse);
+ mk_interval->setLabel(i18n("R&epeat interval:"), AlignVCenter);
+ mk_interval->setSuffix(i18n(" msec"));
+ mk_interval->setRange(1, 1000, 10);
+ hbox->addWidget(mk_interval);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ mk_time_to_max = new KIntNumInput(mk_interval, 0, mouse);
+ mk_time_to_max->setLabel(i18n("Acceleration &time:"), AlignVCenter);
+ mk_time_to_max->setRange(100, 10000, 200);
+ mk_time_to_max->setSuffix(i18n(" msec"));
+ hbox->addWidget(mk_time_to_max);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ mk_max_speed = new KIntNumInput(mk_time_to_max, 0, mouse);
+ mk_max_speed->setLabel(i18n("Ma&ximum speed:"), AlignVCenter);
+ mk_max_speed->setRange(1, 2000, 20);
+ mk_max_speed->setSuffix(i18n(" pixel/sec"));
+ hbox->addWidget(mk_max_speed);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ mk_curve = new KIntNumInput(mk_max_speed, 0, mouse);
+ mk_curve->setLabel(i18n("Acceleration &profile:"), AlignVCenter);
+ mk_curve->setRange(-1000, 1000, 100);
+ hbox->addWidget(mk_curve);
+
+ connect(mouseKeys, SIGNAL(clicked()), this, SLOT(checkAccess()));
+ connect(mouseKeys, SIGNAL(clicked()), this, SLOT(changed()));
+ connect(mk_delay, SIGNAL(valueChanged(int)), this, SLOT(changed()));
+ connect(mk_interval, SIGNAL(valueChanged(int)), this, SLOT(changed()));
+ connect(mk_time_to_max, SIGNAL(valueChanged(int)), this, SLOT(changed()));
+ connect(mk_max_speed, SIGNAL(valueChanged(int)), this, SLOT(changed()));
+ connect(mk_curve, SIGNAL(valueChanged(int)), this, SLOT(changed()));
+
+ vbox->addStretch();
+}
+
+ settings = new MouseSettings;
+
+ // This part is for handling features on Logitech USB mice.
+ // It only works if libusb is available.
+#ifdef HAVE_LIBUSB
+
+ struct device_table {
+ int idVendor;
+ int idProduct;
+ QString Model;
+ QString Name;
+ int flags;
+ } device_table[] = {
+ { VENDOR_LOGITECH, 0xC00E, "M-BJ58", "Wheel Mouse Optical", HAS_RES },
+ { VENDOR_LOGITECH, 0xC00F, "M-BJ79", "MouseMan Traveler", HAS_RES },
+ { VENDOR_LOGITECH, 0xC012, "M-BL63B", "MouseMan Dual Optical", HAS_RES },
+ { VENDOR_LOGITECH, 0xC01B, "M-BP86", "MX310 Optical Mouse", HAS_RES },
+ { VENDOR_LOGITECH, 0xC01D, "M-BS81A", "MX510 Optical Mouse", HAS_RES | HAS_SS | HAS_SSR },
+ { VENDOR_LOGITECH, 0xC024, "M-BP82", "MX300 Optical Mouse", HAS_RES },
+ { VENDOR_LOGITECH, 0xC025, "M-BP81A", "MX500 Optical Mouse", HAS_RES | HAS_SS | HAS_SSR },
+ { VENDOR_LOGITECH, 0xC031, "M-UT58A", "iFeel Mouse (silver)", HAS_RES },
+ { VENDOR_LOGITECH, 0xC501, "C-BA4-MSE", "Mouse Receiver", HAS_CSR },
+ { VENDOR_LOGITECH, 0xC502, "C-UA3-DUAL", "Dual Receiver", HAS_CSR | USE_CH2},
+ { VENDOR_LOGITECH, 0xC504, "C-BD9-DUAL", "Cordless Freedom Optical", HAS_CSR | USE_CH2 },
+ { VENDOR_LOGITECH, 0xC505, "C-BG17-DUAL", "Cordless Elite Duo", HAS_SS | HAS_SSR | HAS_CSR | USE_CH2},
+ { VENDOR_LOGITECH, 0xC506, "C-BF16-MSE", "MX700 Optical Mouse", HAS_SS | HAS_CSR },
+ { VENDOR_LOGITECH, 0xC508, "C-BA4-MSE", "Cordless Optical TrackMan", HAS_SS | HAS_CSR },
+ { VENDOR_LOGITECH, 0xC50B, "967300-0403", "Cordless MX Duo Receiver", HAS_SS|HAS_CSR },
+ { VENDOR_LOGITECH, 0xC50E, "M-RAG97", "MX1000 Laser Mouse", HAS_SS | HAS_CSR },
+ { VENDOR_LOGITECH, 0xC512, "M-RAK89B", "Cordless Desktop Pro LX700", HAS_CSR | USE_CH2 },
+ { VENDOR_LOGITECH, 0xC702, "C-UF15", "Receiver for Cordless Presenter", HAS_CSR },
+ { 0, 0, QString(), QString(), 0 }
+ };
+
+ usb_init();
+ usb_find_busses();
+ usb_find_devices();
+
+ struct usb_bus *bus;
+ struct usb_device *dev;
+
+ for (bus = usb_busses; bus; bus = bus->next) {
+ for (dev = bus->devices; dev; dev = dev->next) {
+ for (int n = 0; device_table[n].idVendor; n++)
+ if ( (device_table[n].idVendor == dev->descriptor.idVendor) &&
+ (device_table[n].idProduct == dev->descriptor.idProduct) ) {
+ // OK, we have a device that appears to be one of the ones we support
+ LogitechMouse *mouse = new LogitechMouse( dev, device_table[n].flags, this, device_table[n].Name.latin1() );
+ settings->logitechMouseList.append(mouse);
+ tabwidget->addTab( (QWidget*)mouse, device_table[n].Name );
+ }
+ }
+ }
+
+#endif
+
+ load();
+
+ KAboutData* about = new KAboutData("kcmmouse", I18N_NOOP("Mouse"), 0, 0,
+ KAboutData::License_GPL, I18N_NOOP("(c) 1997 - 2005 Mouse developers"));
+ about->addAuthor("Patrick Dowler", 0, 0);
+ about->addAuthor("Dirk A. Mueller", 0, 0);
+ about->addAuthor("David Faure", 0, 0);
+ about->addAuthor("Bernd Gehrmann", 0, 0);
+ about->addAuthor("Rik Hemsley", 0, 0);
+ about->addAuthor("Brad Hughes", 0, 0);
+ about->addAuthor("Ralf Nolden", 0, 0);
+ about->addAuthor("Brad Hards", 0, 0);
+ setAboutData( about );
+}
+
+void MouseConfig::checkAccess()
+{
+ mk_delay->setEnabled(mouseKeys->isChecked());
+ mk_interval->setEnabled(mouseKeys->isChecked());
+ mk_time_to_max->setEnabled(mouseKeys->isChecked());
+ mk_max_speed->setEnabled(mouseKeys->isChecked());
+ mk_curve->setEnabled(mouseKeys->isChecked());
+}
+
+
+MouseConfig::~MouseConfig()
+{
+ delete settings;
+}
+
+double MouseConfig::getAccel()
+{
+ return accel->value();
+}
+
+void MouseConfig::setAccel(double val)
+{
+ accel->setValue(val);
+}
+
+int MouseConfig::getThreshold()
+{
+ return thresh->value();
+}
+
+void MouseConfig::setThreshold(int val)
+{
+ thresh->setValue(val);
+}
+
+
+int MouseConfig::getHandedness()
+{
+ if (tab1->rightHanded->isChecked())
+ return RIGHT_HANDED;
+ else
+ return LEFT_HANDED;
+}
+
+void MouseConfig::setHandedness(int val)
+{
+ tab1->rightHanded->setChecked(false);
+ tab1->leftHanded->setChecked(false);
+ if (val == RIGHT_HANDED){
+ tab1->rightHanded->setChecked(true);
+ tab1->mousePix->setPixmap(locate("data", "kcminput/pics/mouse_rh.png"));
+ }
+ else{
+ tab1->leftHanded->setChecked(true);
+ tab1->mousePix->setPixmap(locate("data", "kcminput/pics/mouse_lh.png"));
+ }
+}
+
+void MouseConfig::load()
+{
+ load( false );
+}
+
+void MouseConfig::load( bool useDefaults )
+{
+
+ KConfig config( "kcminputrc", true );
+
+ config.setReadDefaults( useDefaults );
+
+ settings->load(&config);
+
+ tab1->rightHanded->setEnabled(settings->handedEnabled);
+ tab1->leftHanded->setEnabled(settings->handedEnabled);
+ if ( tab1->cbScrollPolarity->isEnabled() )
+ tab1->cbScrollPolarity->setEnabled(settings->handedEnabled);
+ tab1->cbScrollPolarity->setChecked( settings->reverseScrollPolarity );
+
+ setAccel(settings->accelRate);
+ setThreshold(settings->thresholdMove);
+ setHandedness(settings->handed);
+
+ doubleClickInterval->setValue(settings->doubleClickInterval);
+ dragStartTime->setValue(settings->dragStartTime);
+ dragStartDist->setValue(settings->dragStartDist);
+ wheelScrollLines->setValue(settings->wheelScrollLines);
+
+ tab1->singleClick->setChecked( settings->singleClick );
+ tab1->doubleClick->setChecked(!settings->singleClick);
+ tab1->cb_pointershape->setChecked(settings->changeCursor);
+ tab1->cbAutoSelect->setChecked( settings->autoSelectDelay >= 0 );
+ if ( settings->autoSelectDelay < 0 )
+ tab1->slAutoSelect->setValue( 0 );
+ else
+ tab1->slAutoSelect->setValue( settings->autoSelectDelay );
+ tab1->cbVisualActivate->setChecked( settings->visualActivate );
+ slotClick();
+
+
+ KConfig ac("kaccessrc", true);
+
+ ac.setGroup("Mouse");
+ mouseKeys->setChecked(ac.readBoolEntry("MouseKeys", false));
+ mk_delay->setValue(ac.readNumEntry("MKDelay", 160));
+
+ int interval = ac.readNumEntry("MKInterval", 5);
+ mk_interval->setValue(interval);
+
+ // Default time to reach maximum speed: 5000 msec
+ int time_to_max = ac.readNumEntry("MKTimeToMax",
+ (5000+interval/2)/interval);
+ time_to_max = ac.readNumEntry("MK-TimeToMax",
+ time_to_max*interval);
+ mk_time_to_max->setValue(time_to_max);
+
+ // Default maximum speed: 1000 pixels/sec
+ // (The old default maximum speed from KDE <= 3.4
+ // (100000 pixels/sec) was way too fast)
+ long max_speed = ac.readNumEntry("MKMaxSpeed", interval);
+ max_speed = max_speed * 1000 / interval;
+ if (max_speed > 2000)
+ max_speed = 2000;
+ max_speed = ac.readNumEntry("MK-MaxSpeed", max_speed);
+ mk_max_speed->setValue(max_speed);
+
+ mk_curve->setValue(ac.readNumEntry("MKCurve", 0));
+
+ themetab->load();
+
+ checkAccess();
+ changed( useDefaults );
+}
+
+void MouseConfig::save()
+{
+ settings->accelRate = getAccel();
+ settings->thresholdMove = getThreshold();
+ settings->handed = getHandedness();
+
+ settings->doubleClickInterval = doubleClickInterval->value();
+ settings->dragStartTime = dragStartTime->value();
+ settings->dragStartDist = dragStartDist->value();
+ settings->wheelScrollLines = wheelScrollLines->value();
+ settings->singleClick = !tab1->doubleClick->isChecked();
+ settings->autoSelectDelay = tab1->cbAutoSelect->isChecked()? tab1->slAutoSelect->value():-1;
+ settings->visualActivate = tab1->cbVisualActivate->isChecked();
+// settings->changeCursor = tab1->singleClick->isChecked();
+ settings->changeCursor = tab1->cb_pointershape->isChecked();
+ settings->reverseScrollPolarity = tab1->cbScrollPolarity->isChecked();
+
+ settings->apply();
+ KConfig config( "kcminputrc" );
+ settings->save(&config);
+
+ KConfig ac("kaccessrc", false);
+
+ ac.setGroup("Mouse");
+
+ int interval = mk_interval->value();
+ ac.writeEntry("MouseKeys", mouseKeys->isChecked());
+ ac.writeEntry("MKDelay", mk_delay->value());
+ ac.writeEntry("MKInterval", interval);
+ ac.writeEntry("MK-TimeToMax", mk_time_to_max->value());
+ ac.writeEntry("MKTimeToMax",
+ (mk_time_to_max->value() + interval/2)/interval);
+ ac.writeEntry("MK-MaxSpeed", mk_max_speed->value());
+ ac.writeEntry("MKMaxSpeed",
+ (mk_max_speed->value()*interval + 500)/1000);
+ ac.writeEntry("MKCurve", mk_curve->value());
+ ac.sync();
+
+ themetab->save();
+
+ // restart kaccess
+ kapp->startServiceByDesktopName("kaccess");
+
+ KCModule::changed(false);
+
+}
+
+void MouseConfig::defaults()
+{
+ load( true );
+}
+
+void MouseConfig::slotClick()
+{
+ // Autoselect has a meaning only in single-click mode
+ tab1->cbAutoSelect->setEnabled(!tab1->doubleClick->isChecked() || tab1->singleClick->isChecked());
+ // Delay has a meaning only for autoselect
+ bool bDelay = tab1->cbAutoSelect->isChecked() && ! tab1->doubleClick->isChecked();
+ tab1->slAutoSelect->setEnabled( bDelay );
+ tab1->lDelay->setEnabled( bDelay );
+ tab1->lb_short->setEnabled( bDelay );
+ tab1->lb_long->setEnabled( bDelay );
+
+}
+
+/** No descriptions */
+void MouseConfig::slotHandedChanged(int val){
+ if(val==RIGHT_HANDED)
+ tab1->mousePix->setPixmap(locate("data", "kcminput/pics/mouse_rh.png"));
+ else
+ tab1->mousePix->setPixmap(locate("data", "kcminput/pics/mouse_lh.png"));
+ settings->m_handedNeedsApply = true;
+}
+
+void MouseSettings::load(KConfig *config)
+{
+ int accel_num, accel_den, threshold;
+ double accel;
+ XGetPointerControl( kapp->getDisplay(),
+ &accel_num, &accel_den, &threshold );
+ accel = float(accel_num) / float(accel_den);
+
+ // get settings from X server
+ int h = RIGHT_HANDED;
+ unsigned char map[20];
+ num_buttons = XGetPointerMapping(kapp->getDisplay(), map, 20);
+
+ handedEnabled = true;
+
+ // ## keep this in sync with KGlobalSettings::mouseSettings
+ if( num_buttons == 1 )
+ {
+ /* disable button remapping */
+ handedEnabled = false;
+ }
+ else if( num_buttons == 2 )
+ {
+ if ( (int)map[0] == 1 && (int)map[1] == 2 )
+ h = RIGHT_HANDED;
+ else if ( (int)map[0] == 2 && (int)map[1] == 1 )
+ h = LEFT_HANDED;
+ else
+ /* custom button setup: disable button remapping */
+ handedEnabled = false;
+ }
+ else
+ {
+ middle_button = (int)map[1];
+ if ( (int)map[0] == 1 && (int)map[2] == 3 )
+ h = RIGHT_HANDED;
+ else if ( (int)map[0] == 3 && (int)map[2] == 1 )
+ h = LEFT_HANDED;
+ else
+ {
+ /* custom button setup: disable button remapping */
+ handedEnabled = false;
+ }
+ }
+
+ config->setGroup("Mouse");
+ double a = config->readDoubleNumEntry("Acceleration",-1);
+ if (a == -1)
+ accelRate = accel;
+ else
+ accelRate = a;
+
+ int t = config->readNumEntry("Threshold",-1);
+ if (t == -1)
+ thresholdMove = threshold;
+ else
+ thresholdMove = t;
+
+ QString key = config->readEntry("MouseButtonMapping");
+ if (key == "RightHanded")
+ handed = RIGHT_HANDED;
+ else if (key == "LeftHanded")
+ handed = LEFT_HANDED;
+ else if (key == NULL)
+ handed = h;
+ reverseScrollPolarity = config->readBoolEntry( "ReverseScrollPolarity", false );
+ m_handedNeedsApply = false;
+
+ // SC/DC/AutoSelect/ChangeCursor
+ config->setGroup("KDE");
+ doubleClickInterval = config->readNumEntry("DoubleClickInterval", 400);
+ dragStartTime = config->readNumEntry("StartDragTime", 500);
+ dragStartDist = config->readNumEntry("StartDragDist", 4);
+ wheelScrollLines = config->readNumEntry("WheelScrollLines", 3);
+
+ singleClick = config->readBoolEntry("SingleClick", KDE_DEFAULT_SINGLECLICK);
+ autoSelectDelay = config->readNumEntry("AutoSelectDelay", KDE_DEFAULT_AUTOSELECTDELAY);
+ visualActivate = config->readBoolEntry("VisualActivate", KDE_DEFAULT_VISUAL_ACTIVATE);
+ changeCursor = config->readBoolEntry("ChangeCursor", KDE_DEFAULT_CHANGECURSOR);
+}
+
+void MouseConfig::slotThreshChanged(int value)
+{
+ thresh->setSuffix(i18n(" pixel", " pixels", value));
+}
+
+void MouseConfig::slotDragStartDistChanged(int value)
+{
+ dragStartDist->setSuffix(i18n(" pixel", " pixels", value));
+}
+
+void MouseConfig::slotWheelScrollLinesChanged(int value)
+{
+ wheelScrollLines->setSuffix(i18n(" line", " lines", value));
+}
+
+void MouseSettings::apply(bool force)
+{
+ XChangePointerControl( kapp->getDisplay(),
+ true, true, int(qRound(accelRate*10)), 10, thresholdMove);
+
+ // 256 might seems extreme, but X has already been known to return 32,
+ // and we don't want to truncate things. Xlib limits the table to 256 bytes,
+ // so it's a good uper bound..
+ unsigned char map[256];
+ num_buttons = XGetPointerMapping(kapp->getDisplay(), map, 256);
+
+ int remap=(num_buttons>=1);
+ if (handedEnabled && (m_handedNeedsApply || force)) {
+ if( num_buttons == 1 )
+ {
+ map[0] = (unsigned char) 1;
+ }
+ else if( num_buttons == 2 )
+ {
+ if (handed == RIGHT_HANDED)
+ {
+ map[0] = (unsigned char) 1;
+ map[1] = (unsigned char) 3;
+ }
+ else
+ {
+ map[0] = (unsigned char) 3;
+ map[1] = (unsigned char) 1;
+ }
+ }
+ else // 3 buttons and more
+ {
+ if (handed == RIGHT_HANDED)
+ {
+ map[0] = (unsigned char) 1;
+ map[1] = (unsigned char) middle_button;
+ map[2] = (unsigned char) 3;
+ }
+ else
+ {
+ map[0] = (unsigned char) 3;
+ map[1] = (unsigned char) middle_button;
+ map[2] = (unsigned char) 1;
+ }
+ if( num_buttons >= 5 )
+ {
+ // Apps seem to expect logical buttons 4,5 are the vertical wheel.
+ // With mice with more than 3 buttons (not including wheel) the physical
+ // buttons mapped to logical 4,5 may not be physical 4,5 , so keep
+ // this mapping, only possibly reversing them.
+ int pos;
+ for( pos = 0; pos < num_buttons; ++pos )
+ if( map[pos] == 4 || map[pos] == 5 )
+ break;
+ if( pos < num_buttons - 1 )
+ {
+ map[pos] = reverseScrollPolarity ? (unsigned char) 5 : (unsigned char) 4;
+ map[pos+1] = reverseScrollPolarity ? (unsigned char) 4 : (unsigned char) 5;
+ }
+ }
+ }
+ int retval;
+ if (remap)
+ while ((retval=XSetPointerMapping(kapp->getDisplay(), map,
+ num_buttons)) == MappingBusy)
+ /* keep trying until the pointer is free */
+ { };
+ m_handedNeedsApply = false;
+ }
+
+ // This iterates through the various Logitech mice, if we have support.
+ #ifdef HAVE_LIBUSB
+ LogitechMouse *logitechMouse;
+ for (logitechMouse = logitechMouseList.first(); logitechMouse; logitechMouse = logitechMouseList.next() ) {
+ logitechMouse->applyChanges();
+ }
+ #endif
+}
+
+void MouseSettings::save(KConfig *config)
+{
+ config->setGroup("Mouse");
+ config->writeEntry("Acceleration",accelRate);
+ config->writeEntry("Threshold",thresholdMove);
+ if (handed == RIGHT_HANDED)
+ config->writeEntry("MouseButtonMapping",QString("RightHanded"));
+ else
+ config->writeEntry("MouseButtonMapping",QString("LeftHanded"));
+ config->writeEntry( "ReverseScrollPolarity", reverseScrollPolarity );
+
+ config->setGroup("KDE");
+ config->writeEntry("DoubleClickInterval", doubleClickInterval, true, true);
+ config->writeEntry("StartDragTime", dragStartTime, true, true);
+ config->writeEntry("StartDragDist", dragStartDist, true, true);
+ config->writeEntry("WheelScrollLines", wheelScrollLines, true, true);
+ config->writeEntry("SingleClick", singleClick, true, true);
+ config->writeEntry("AutoSelectDelay", autoSelectDelay, true, true );
+ config->writeEntry("VisualActivate", visualActivate, true, true);
+ config->writeEntry("ChangeCursor", changeCursor, true, true);
+ // This iterates through the various Logitech mice, if we have support.
+#ifdef HAVE_LIBUSB
+ LogitechMouse *logitechMouse;
+ for (logitechMouse = logitechMouseList.first(); logitechMouse; logitechMouse = logitechMouseList.next() ) {
+ logitechMouse->save(config);
+ }
+#endif
+ config->sync();
+ KIPC::sendMessageAll(KIPC::SettingsChanged, KApplication::SETTINGS_MOUSE);
+}
+
+void MouseConfig::slotScrollPolarityChanged()
+{
+ settings->m_handedNeedsApply = true;
+}
+
+#include "mouse.moc"
diff --git a/kcontrol/input/mouse.desktop b/kcontrol/input/mouse.desktop
new file mode 100644
index 000000000..fe0f30281
--- /dev/null
+++ b/kcontrol/input/mouse.desktop
@@ -0,0 +1,242 @@
+[Desktop Entry]
+Exec=kcmshell mouse
+Icon=mouse
+Type=Application
+DocPath=kcontrol/mouse/index.html
+
+
+X-KDE-Library=input
+X-KDE-FactoryName=mouse
+X-KDE-Init=mouse
+X-KDE-ParentApp=kcontrol
+
+Name=Mouse
+Name[af]=Muis
+Name[ar]=الفأرة
+Name[az]=Siçan
+Name[be]=Мыш
+Name[bg]=Мишка
+Name[bn]=মাউস
+Name[br]=Logodenn
+Name[bs]=Miš
+Name[ca]=Ratolí
+Name[cs]=Myš
+Name[csb]=Mësz
+Name[cy]=Llygoden
+Name[da]=Mus
+Name[de]=Maus
+Name[el]=Ποντίκι
+Name[eo]=Muso
+Name[es]=Ratón
+Name[et]=Hiir
+Name[eu]=Sagua
+Name[fa]=موشی
+Name[fi]=Hiiri
+Name[fr]=Souris
+Name[fy]=Mûs
+Name[ga]=Luch
+Name[gl]=Rato
+Name[he]=עכבר
+Name[hi]=माउस
+Name[hr]=Miš
+Name[hu]=Egér
+Name[is]=Mús
+Name[ja]=マウス
+Name[ka]=თაგვი
+Name[kk]=Тышқан
+Name[km]=កណ្ដុរ
+Name[ko]=마우스
+Name[lo]=ເມົາສ໌
+Name[lt]=Pelė
+Name[lv]=Pele
+Name[mk]=Глушец
+Name[mn]=Хулгана
+Name[ms]=Tetikus
+Name[mt]=Maws
+Name[nb]=Mus
+Name[nds]=Muus
+Name[ne]=माउस
+Name[nl]=Muis
+Name[nn]=Mus
+Name[nso]=Legotlo
+Name[oc]=Ratolí
+Name[pa]=ਮਾਊਸ
+Name[pl]=Mysz
+Name[pt]=Rato
+Name[ru]=Мышь
+Name[rw]=Imbeba
+Name[se]=Sáhpán
+Name[sk]=Myš
+Name[sl]=Miška
+Name[sr]=Миш
+Name[sr@Latn]=Miš
+Name[ss]=Ligundvwane
+Name[sv]=Mus
+Name[ta]=சுட்டி
+Name[te]=మౌస్
+Name[tg]=Муш
+Name[th]=เม้าส์
+Name[tr]=Fare
+Name[tt]=Küse
+Name[uk]=Мишка
+Name[uz]=Sichqoncha
+Name[uz@cyrillic]=Сичқонча
+Name[ven]=Mausu
+Name[vi]=Chuột
+Name[wa]=Sori
+Name[zh_CN]=鼠标
+Name[zh_TW]=滑鼠
+Name[zu]=i-Mouse
+
+Comment=Mouse settings
+Comment[af]=Muis instellings
+Comment[ar]=اعدادات الفأرة
+Comment[az]=Siçan qurğuları
+Comment[be]=Настаўленні мышы
+Comment[bg]=Настройване на мишката
+Comment[bn]=মাউস সেটিংস
+Comment[br]=Kefluniañ al logodenn
+Comment[bs]=Podešavanje miša
+Comment[ca]=Arranjament del ratolí
+Comment[cs]=Nastavení myši
+Comment[csb]=Nastôw mëszë
+Comment[cy]=Gosodiadau Llygoden
+Comment[da]=Opsætning af mus
+Comment[de]=Einstellung der Maus
+Comment[el]=Ρυθμίσεις Ποντικιού
+Comment[eo]=Agordo de la muso
+Comment[es]=Preferencias sobre el ratón
+Comment[et]=Hiire seadistused
+Comment[eu]=Saguaren konfigurazioa
+Comment[fa]=تنظیمات موشی
+Comment[fi]=Hiiriasetukset
+Comment[fr]=Configuration de la souris
+Comment[fy]=Mûsynstellings
+Comment[ga]=Socruithe luiche
+Comment[gl]=Configuración do rato
+Comment[he]=שינוי הגדרות העכבר
+Comment[hi]=माउस विन्यास
+Comment[hr]=Postavke miša
+Comment[hu]=Az egér beállításai
+Comment[id]=Seting Mouse
+Comment[is]=Stillingar músar
+Comment[it]=Impostazione del mouse
+Comment[ja]=マウスの設定
+Comment[ka]=თაგვის კონფიგურაცია
+Comment[kk]=Тышқан баптаулары
+Comment[km]=ការ​កំណត់​កណ្ដុរ
+Comment[ko]=마우스 설정
+Comment[lo]=ຂໍ້ມູນຄວາມສະແດງຕົວເຄື່ອງມືຂອງຜູ້ໃຊ້
+Comment[lt]=Pelės parametrai
+Comment[lv]=Peles parametri
+Comment[mk]=Поставувања на глушецот
+Comment[mn]=Хулгана тохируулга
+Comment[ms]=Seting tetikus
+Comment[mt]=Konfigurazzjoni tal-Maws
+Comment[nb]=Musinnstillinger
+Comment[nds]=Muus instellen
+Comment[ne]=माउस सेटिङ
+Comment[nl]=Muisinstellingen
+Comment[nn]=Musinnstillingar
+Comment[nso]=Dipeakanyo tsa Legotlo
+Comment[oc]=Arranjament dèu ratolí
+Comment[pa]=ਮਾਊਸ ਸੈਟਿੰਗ
+Comment[pl]=Ustawienia myszy
+Comment[pt]=Configuração do rato
+Comment[pt_BR]=Configurações do mouse
+Comment[ro]=Configurează mouse-ul
+Comment[ru]=Настройка мыши
+Comment[rw]=Amagenamiterere y'Imbeba
+Comment[se]=Sáhpánheivehusat
+Comment[sk]=Nastavenie myši
+Comment[sl]=Nastavitve miške
+Comment[sr]=Поставке миша
+Comment[sr@Latn]=Postavke miša
+Comment[ss]=Kuhlelwka kweligundvwane
+Comment[sv]=Anpassa mus
+Comment[ta]=சுட்டி அமைப்புகள்
+Comment[te]=మౌస్ అమరికలు
+Comment[tg]=Танзимоти муш
+Comment[th]=ตั้งค่าเม้าส์
+Comment[tr]=Fare ayarları
+Comment[tt]=Küse Caylaw
+Comment[uk]=Налаштування миші
+Comment[uz]=Sichqonchaning moslamalari
+Comment[uz@cyrillic]=Сичқончанинг мосламалари
+Comment[ven]=Mavhekanyele a Mausu
+Comment[vi]=Thiết lập chuột
+Comment[wa]=Apontiaedjes del sori
+Comment[xh]=Izicwangciso ze mouse
+Comment[zh_CN]=鼠标设置
+Comment[zh_TW]=滑鼠設定
+Comment[zu]=Izilungiselelo ze-Mouse
+
+Keywords=Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handed,left handed
+Keywords[af]=Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handig,left handig
+Keywords[ar]=Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handed,left handed,الفأرة,تسارع الفأرة,الحد الأقضى للفأرة,فأرة,.أزرار الفأرة, اختيار,مؤشر,الاختيار,المؤشر,أجهزة الادخال,.خريطة الأزرار,نقر,أبقونات,ارجاع,مؤشرات,سحب, نقر مزدوج,خريطة,أيمن,أعسر
+Keywords[az]=siçan,Siçan Sür'ətləndirmə,Siçan sərhədi,Siçan Düymələri,Seçim,ox şəkli,giriş avadanlıqları,Düymə Xəritəsi,Tıqlama,timsallar,əks təs'ir,İşarətçilər,Daşı,Cüt Tıqla,xəritələmə,sağ əlli,sol əlli
+Keywords[be]=Мыш,Паскарэнне мышы,Кнопкі мышы,Вылучэнне,Форма курсора,Прылады ўводу,Прызначэнне кнопак,Дзеянне кнопак,Націск,значкі,Указальнік,Курсор,Перацягваць,Двайны націск,для левай рукі,для правай рукі,Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handed,left handed
+Keywords[bg]=настройки, мишка, посочващо, устройство, Mouse, Mouse acceleration, Mouse threshold, Mouse buttons, Selection, Cursor Shape, Input Devices, Button Mapping, Click, icons, feedback, Pointers, Drag, DoubleClick, mapping, right handed, left handed
+Keywords[ca]=Ratolí,acceleració del ratolí,llindar del ratolí,botons del ratolí,selecció,forma del cursor,dispositius d'entrada,mapejat de botons,clic,icones,realimentació,apuntadors,arrossegar,clic doble,mapejat,dretà,esquerrà
+Keywords[cs]=Myš,Akcelerace myši,Práh myši,Tlačítka myši,Výběr,Tvar kurzoru,Vstupní zařízení,Mapování tlačítek,Kurzor,Kliknutí,Odezva,Dvojité kliknutí,Pravák,Levák
+Keywords[csb]=Mësz,przërëchlënié mëszë,Próg mëszë,Knąpë mëszë,Zaznaczenié,Sztôłt kùrsora,Ùrządzenia wéńdzeniô,mapòwanié knąpów,klëkniãce,ikònë,widzałé efektë,wskôzywôczë,przecyganié,podwójné klëkniãce,mapòwanié,prawòrãczny,lewòrãczny
+Keywords[cy]=Llygoden,Cyflymu Llygoden,Trothwy Llygoden,Botymau Llygoden,Dewis,Si?p Cyrchydd,Dyfeisiau Mewnbwn,Mapio Botymau, Clic,eiconau,adborth,Pwyntyddion,Llusgo,Clic Dwbl,mapio,llaw dde,llaw chwith
+Keywords[da]=Mus,Museacceleration,Musegrænse,Museknapper,Markering,Markørform,Inddataenheder,Knap-mapping,Klik,ikoner,feedback,Pegere, Træk,Dobbeltklik,mapping,højrehåndet,venstrehåndet
+Keywords[de]=Maus,Mausbeschleunigung,Mausschwellenwert,Maustasten,Auswahl,Cursor,Cursorform,Eingabegeräte,Knöpfe,Buttons,Zuordnungen,Klicks,Zeigegeräte,Doppelklick,Rechtshänder,Linkshänder
+Keywords[el]=Ποντίκι,Επιτάχυνση δρομέα,Κατώφλι ποντικιού,Πλήκτρα ποντικιού,Επιλογή,Σχήμα Δρομέα,Συσκευές Εισόδου,Χαρτογράφηση πλήκτρων,Κλικ,εικονίδια,ανάδραση,Δείκτες,Σύρσιμο,Διπλό κλικ,αντιστοίχηση,δεξιόχειρας,αριστερόχειρας
+Keywords[eo]=muso,akcelado,butonoj,elekto,montrilo,kursoro,enigo,aparatoj,butonsignifo,klako,piktogramoj,reago,montriloj,ŝovado,trenado,duklako,dekstrmanulo,maldekstramanulo
+Keywords[es]=Ratón,Aceleración del ratón,Umbral del ratón,Botones del ratón,Selección,Forma del cursor,Dispositivos de entrada,Asignaciones de botones,Pulsación,iconos,notificación,Punteros,Arrastrar,Doble pulsación,asignaciones,diestro,zurdo
+Keywords[et]=hiir,hiire kiirendus,hiire lävi,hiire nupud,valimine,kursori kuju,sisendseadmed,nuppude asetus,klikk,klõps,ikoonid,tagasiside,kursorid,lohistamine,topeltklikk,topeltklõps,asetus,paremakäeline,vasakukäeline
+Keywords[eu]=Sagua,Saguaren azelerazioa,Saguaren atalasea,Saguarenbotoiak,Hautespena,Kurtsorearen itxura,Sarrera dispositiboak,Botoien esleipena,Klika,ikonoak,atzeraelikadura,Geziak,Arrastatu,Klik bikoitza,esleipenak, eskuinak,ezkertiak
+Keywords[fa]=موشی، شتاب‌دهی موشی، آستانۀ موشی، دکمه‌های موشی، گزینش، شکل مکان‌نما، دستگاههای ورودی، نگاشت دکمه، فشار دادن، شمایلها، بازخورد، اشاره‌گرها، کشیدن، دو بار فشار دادن، نگاشت، راست‌دست، چپ‌دست
+Keywords[fi]=Hiiri,Hiiren kiihdytys,Hiiren raja-arvo,Hiiren painikkeet,Valinta,Osoittimen muoto,Syöttölaitteet,Painikkeiden järjestys,Napsautus,kuvakkeet,palaute,Osoittimet,Vedä,Tuplanapsautus,järjestys,oikeakätinen,vasenkätinen
+Keywords[fr]=souris,accélération de la souris,seuil de la souris,boutons de la souris,sélection,forme du curseur,périphériques d'entrée,curseur,clic,icônes,gaucher,droitier,double clic,simple clic,clic gauche,clic droit
+Keywords[fy]=Mûs,Mûs fluggens,Mûsknoppen,seleksje,rinnerke-úterlik,ynfier devices,ynfierapparaten,knopyndieling,klikken,Ikoanen,icons,Oanwizers,pointers,drag,slepe,dûbelklikken,loftshandich,rjochtshandich.râneapparaten
+Keywords[gl]=Rato,Aceleración do rato,Umbral do rato,botóns do rato,Selección,Forma do Cursores,Dispositivos de Entrada,Mapa do botón,Clic,iconas,indicador,Ponteiros,Arrastar,DobreClic,mapear,dereiteiro,esquerdeiro
+Keywords[he]=עכבר,תאוצת עכבר,סף עכבר,לחצני עכבר,בחירה,צורת מצביע,התקני קלט,לחיצה,סמלים,תגובה,מצביעים,גרירה,לחיצה כפולה,תצורה,ימני,שמאלי,תצורת לחצנים, Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handed,left handed
+Keywords[hi]=माउस,माउस त्वरण,माउस दहलीज,माउस बटन,चयन,संकेतक आकार,इनपुट औज़ार,बटन मैपिंग,क्लिक,प्रतीक,फ़ीडबैक,प्वाइंटर्स,खींचें,डबल-क्लिक,मैपिंग,दाहिने हाथ वाला, खब्बू(बाएँ हाथ वाला)
+Keywords[hr]=Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handed,left handed,Miš,Ubrzavanje miša,Prag miša,Tipke miša,Odabir,Oblik pokazivača,Ulazni uređaji,Mapiranje tipki,Klikanje,ikone,povratni podaci,Pokazivači,Prevlačenje,Dvostruki klik,mapiranje,desnoruk,ljevoruk
+Keywords[hu]=egér,egérgyorsítás,egérérzékenység,egérgombok,kiválasztás,kurzoralak,beviteli eszközök,gombhozzárendelés,kattintás,ikonok,visszajelzés,mutatók,húzás,dupla kattintás,hozzárendelés,jobbkezes,balkezes
+Keywords[id]=Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input DevicesButton Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handed,left handed
+Keywords[is]=Næmni músar,bendill,inntakstæki,hröðun,örvhentur,rétthentur,smella,tákn,bendill,tvísmella
+Keywords[it]=mouse,accelerazione del mouse,soglia del mouse,tasti del mouse,selezione,forma del cursore,dispositivi di input,mappatura dei tasti,clic,icone,puntatori,trascinamento,doppio clic,mouse per mancini,mancini
+Keywords[ja]=マウス,マウスの加速,マウスのしきい,マウスボタン,選択,カーソルの形,入力デバイス,入力デバイス,ボタンの割り当て,クリック,アイコン,フィードバック,ポインタ,ドラッグ,ダブルクリック,割り当て,右利き,左利き
+Keywords[km]=កណ្ដុរ,ការ​បង្កើន​ល្បឿង​កណ្ដុរ,កម្រិត​ពន្លឺ​កណ្ដុរ,ប៊ូតុង​កណ្ដុរ,ការ​ជ្រើស,រាង​ទស្សន៍​ទ្រនិច,ឧបករណ៍​បញ្ចូល,ប្លង់​ប៊ូតុង,ចុច,រូបតំណាង,មតិ​រិះគន់,ទ្រនិច,អូស,ចុច​ទ្វេដង,ធ្វើ​ប្លង់,ដៃ​ស្ដាំ,ដៃ​ឆ្វេង
+Keywords[lo]=ເມົາສ໌,ການເພີ້ມຄວາມໄວຂອງເມົາສ໌,ໄລຍະຕົວຊີ້ຂອງເມົາສ໌, ປຸ່ມເມົາສ໌,ການເລືອກ,ຮູບຮ່າງເຄີເຊີ,ອຸປະກອນນຳເຂົ້າ,ການຈັບຄູ່ປຸ່ມ,ຄລິກ,ໄອຄອນ,ຕົວຊີ້,ລາກ,ດັບເບີ້ນຄລິກ,ການແມບປຸ່ມ,ໃຊ້ມືຊ້າຍ, ໃຊ້ມືຂວາ
+Keywords[lt]=Mouse,pelė,Mouse acceleration,pelės pagreitinimas,Mouse threshold,Mouse buttons,pelės mygtukai,Selection,pažymėjimas,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,right handed,left handed,kairiarankė
+Keywords[lv]=Pele,Peles paātrinājums,Peles slieksnis,Peles taustiņi,Izvēle,Kursora Forma,Ievades Iekārtas,Pogu Sasaiste,Klikšķis,ikonas,atpakaļsaite,Rādītāji,Vilkt,Dubultklikšķis,sasaiste,labās rokas,kreisās rokas
+Keywords[mk]=Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handed,left handed,Глушец,Забрзување на глушец,Граница на глушец,Копчиња на глушец,Селекција,Избор,Форма на курсор,Влезни уреди,Мапирање на копче,Клик,икони,Покажувачи,Влечи,Двоен клик,мапирање,деснорак,леворак
+Keywords[mn]=Хулгана,Хулгана-хурдасгуур, Хулгана-хязгаар,Хулгана товшуур,Сонголт, Түүчээ,Түүчээний хэлбэр,Оролтын төхөөрөмж,Товч,Товшилуур,Холбоос,Товшилт, Зурах төхөөрөмж,Давхар товшилт,Баруун гарын, Зүүн гарын
+Keywords[mt]=Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handed,left handed,Maws,lemini,xellugi
+Keywords[nb]=Mus,musehastighet,museknapper,valg,merking,kursoregenskaper,pekeregenskaper,innenheter,inn-enheter,knappetilordning,trykk,klikk,pekere,dra,dobbeltklikk, høyrehendt,venstrehendt
+Keywords[nds]=Muus,Muus-Gauheit,Muus-Grenzweert,Muusknööp,Utwahl,Knooptoornen, Wieserform,Ingaavreedschappen,Klicken,Lüttbiller,Torüchmellen,Wieser,Dregen,Dubbelklick,Toornen,Rechtpoot,Linkpoot
+Keywords[ne]=माउस, माउस गतिवर्धन, माउस थ्रेसहोल्ड, माउस बटनहरू, चयन, कर्सर आकार, आगत यन्त्रहरू, बटन मिलाउने, क्लिक, प्रतिमा, पृष्ठपोषण, सूचक, तान्नुहोस्, डबल क्लिक गर्नुहोस्, मिलाउनुहोस्, दायाँ, बायाँ
+Keywords[nl]=muis,muissnelheid,muisknoppen,selectie,cursor-uiterlijk,input devices,invoerapparaten,knopindeling,klikken,iconen,pictogrammen,icons,aanwijzers,pointers,drag,verslepen,dubbelklikken,linkshandig,rechtshandig.randapparaten
+Keywords[nn]=mus,musakselerasjon,musterskel,musknappar,val,peikar,peikarform,inneiningar,knappar,klikk,ikon,tilbakemelding,dra,dobbeltklikk,høgrehendt,venstrehendt
+Keywords[nso]=Legotlo,Koketso ya legotlo,Threshold ya legotlo,Ditobetswa tsa legotlo, Kgetho,Sebopego sa Cursor,Maano a Tsenyo,Mapping Setobetswa,Tobetsa, diemedi,phetolo,Disupi,Topa,Tobetsopedi,mapping,swerwe ka lagoja,swerwe ka lanngele
+Keywords[pa]=ਮਾਊਸ,ਮਾਊਸ ਪ੍ਰਵੇਸ਼,ਮਾਊਸ threshold,ਮਾਊਸ buttons,Selection,CursorShape,Input ਜੰਤਰ,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,righthanded,left handed,ਕਲਿੱਕ,ਆਈਕਾਨ
+Keywords[pl]=Mysz,Akceleracja myszy,Próg myszy,Przyciski myszy,Zaznaczenie,Kształt kursora,Urządzenia wejściowe,mapowanie przycisków,kliknięcie,ikony,widoczne efekty,wskaźniki,przeciąganie,podwójne kliknięcie,mapowanie,praworęczny,leworęczny
+Keywords[pt]=rato,aceleração do rato,limite do rato,botões do rato,selecção,forma do cursor,dispositivos de entrada,atribuição de botões,click,ícones,feedback,cursores,arrastar,duplo 'click',atribuição,destro,esquerdino
+Keywords[pt_BR]=Mouse,aceleração do mouse,limiar do mouse, botões do mouse,Seleção,Formato do Cursor,Dispositivos de entrada,mapeamento de botões,clique,ícones,retorno,ponteiros,arrastar,clique duplo,mapeamento,destro,canhoto
+Keywords[ro]=mouse,accelerație mouse,prag mouse,butoane mouse,selecție,formă cursor,dispozitive de intrare,mapare butoane,clicuri,iconițe,răspuns,pointeri,indicatori,tragere,dublu clic,dreptaci,stîngaci,drag-and-drop
+Keywords[rw]=Imbeba,Ukwihutisha imbeba,Intambwe y'imbeba,Buto z'imbeba, Ihitamo,Imisusire y'inyoborayandika,Apareye z'Icyinjira,Guhuza buto,Gukanda,udushushondanga,inkurikizi,Mweretsi,Gukurura,GukandaKabiri,guhuza,kiganza iburyo, kiganza ibumoso.
+Keywords[se]=sáhpán,sáhpánaksellerašuvdna,sáhpánšielbma,sáhpánboalut, merken, njoallahápmi,sisaovttadagat,boalut,coahkkalit,govažat,feedback,geassit, duppalcoahkkaleapmi,olgešgiehtat,gurutgiehtat
+Keywords[sk]=Myš,rýchlosť myši,tlačidlá myši,Označenie,kurzor,Vstupné zariadenia,výber,tvar kurzoru,mapovanie tlačidiel,klik,kliknutie,ikony,ťahanie,dvojité kliknutie,dvojklik,mapovanie,praváci,ľaváci
+Keywords[sl]=miška,pospešitev miške,gumbi miške,izbira,oblika kazalca,vhodne enote,preslikava gumbov,klik,ikone,povratna informacija,kazalci,potegni,dvojni klik,preslikava,levičarji,desničarji
+Keywords[sr]=Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handed,left handed,миш,убрзавање миша,означавање,избор,облик показивача,показивач,мапирање дугмади,клик,иконе,показивачи,превуци,двоклик,мапирање,леворуки,десноруки
+Keywords[sr@Latn]=Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handed,left handed,miš,ubrzavanje miša,označavanje,izbor,oblik pokazivača,pokazivač,mapiranje dugmadi,klik,ikone,pokazivači,prevuci,dvoklik,mapiranje,levoruki,desnoruki
+Keywords[sv]=Mus,Musacceleration,Muströskel,Musknappar,Val,Markörutseende,Inmatningsenheter,Knapptolkning,klickning,ikoner,respons,Pekare,Drag,Dubbelklick,Tolkning,högerhänt,vänsterhänt
+Keywords[ta]=சுட்டி, முடுக்கப்பட்ட சுட்டி , சுட்டி பட்டன், தேர்வுகள், காட்டியின் வடிவம், உள்ளிடும் சாதனம், பட்டன் பொருத்தல், க்ளிக், சின்னம், கருத்து , காட்டிகள், இழு, இரண்டுமுறை க்ளிக், பொருத்து,வலதுகை பழக்கம், இடது கை பழக்கம்.
+Keywords[th]=เม้าส์,การเร่งความเร็วของเม้าส์,ระยะตัวชี้ของเม้าส์,ปุ่มเม้าส์,การเลือก,รูปร่างเคอร์เซอร์,อุปกรณ์นำเข้า,การจับคู่ปุ่ม,คลิ้ก,ไอคอน,ตัวชี้,ลาก,ดับเบิลคลิ้ก,การแมพปุ่ม,ใช้มือซ้าย,ใช้มือขวา
+Keywords[tr]=fare,Fare Hızlandırma,Fare eşiği,Fare Tuşları,Seçim,imleç şekli,girdi aygıtları,Tuş Haritası,Tıklama,simgeler,geri besleme,İşaretçiler,Taşı,Çift Tıkla,haritalama,sağ elli,sol elli
+Keywords[uk]=Миша,Mouse,прискорення миші,поріг миші,кнопки миші,вибір,форма курсора,вхідні пристрої,відповідність клавіш,клацання,піктограми,зворотній зв'язок,вказівники,перетягнути,подвійне клацання,відображення,лівша,правша
+Keywords[uz]=Sichqoncha,Sichqonchani tezlashtirish,Mouse threshold,Sichqonchaning tugmalari,Tanlash,Kursorning shakillari,Kiritish uskunasi,Tugmani aniqlash,Bosish,nishonchalar,feedback,Koʻrsatgichlar,Drag,Ikki marta bosish,mapping,chap qoʻl,oʻng qoʻl
+Keywords[uz@cyrillic]=Сичқонча,Сичқончани тезлаштириш,Mouse threshold,Сичқончанинг тугмалари,Танлаш,Курсорнинг шакиллари,Киритиш ускунаси,Тугмани аниқлаш,Босиш,нишончалар,feedback,Кўрсатгичлар,Drag,Икки марта босиш,mapping,чап қўл,ўнг қўл
+Keywords[ven]=Mausu,U gonyisa mausu,mausu,bathene ya mausu,nanga,tshivhumbeo tsha Cursor,maano a InputSedzulusa bathene,u putedza,aikhonoPhindulo,vhasumbedzi,kokodza,uputedza luvhili,utalulusa,tshaula,tshamonde
+Keywords[vi]=Chuột,Gia tốc chuột,Giới hạn chuột,Nút chuột,Chọn,Kiểu dáng Con trỏ,Thiết bị Nhập,Ánh xạ Nút,Nhấn,biểu tượng,phản hồi,Con trỏ,Kéo,Nhấn đúp,ánh xạ,thuận tay phải,thuận tay trái
+Keywords[wa]=Sori,botons del sori,foime del fletche,éndjins d' intrêye,clitche,clitchî,imådjetes,ritour,pondjeu,bodjî,dobe clitchî,dobe clitche,hintche mwin,gôchî,droetî
+Keywords[xh]=Mouse,Unyuso lwesantya seMouse,Ungeno lwe Mouse,Amaqhosha eMouse,Ukhetho,Ukumila kwesalathisi,Amacebo egalelo,Ukucetywa kwamaqhosha,Nqakraza,ii-icon, isiphumo,Izalathi,Tsala,Nqakraza kabini,iyaceba,isandla sokunene,isandla sasekhohlo
+Keywords[zh_CN]=Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handed,left handed,鼠标,鼠标加速,鼠标加速阈值,鼠标按钮,选择,光标形状,输入设备,按钮映射,单击,图标,反馈,拖放,双击,映射,右手习惯,左手习惯
+Keywords[zh_TW]=Mouse,Mouse acceleration,Mouse threshold,Mouse buttons,Selection,Cursor Shape,Input Devices,Button Mapping,Click,icons,feedback,Pointers,Drag,DoubleClick,mapping,right handed,left handed,滑鼠,滑鼠游標加速,滑鼠游標加速間距,滑鼠按鈕,選擇,指標外觀,輸入設備,按鍵對應,單擊,圖示,反饋,指標,拖放,雙擊,映射,習慣右手,習慣左手
+Keywords[zu]=i-Mouse,Ukugijimisa kwe-Mouse,i-Mouse threshold, Izinkinobho ze-Mouse,Ukhetho,Isimo senkomba,Amthuluzi Omphumela wangaphakathi,Ukuqondanisa Izinkinobho,Cofa,Izimpawu zezithombe, umphumela obuyayo,Izinkomba zendawo yokubhala,Hudula,Cofa-kabili, ukuqondanisa,okwesanadla sangakwesokudla,okwesandla sangakwesokunxele
+Categories=Qt;KDE;X-KDE-settings-hardware;
diff --git a/kcontrol/input/mouse.h b/kcontrol/input/mouse.h
new file mode 100644
index 000000000..005c7a2fc
--- /dev/null
+++ b/kcontrol/input/mouse.h
@@ -0,0 +1,156 @@
+/*
+ * mouse.h
+ *
+ * Copyright (c) 1997 Patrick Dowler dowler@morgul.fsh.uvic.ca
+ *
+ * Layout management, enhancements:
+ * Copyright (c) 1999 Dirk A. Mueller <dmuell@gmx.net>
+ *
+ * SC/DC/AutoSelect/ChangeCursor:
+ * Copyright (c) 2000 David Faure <faure@kde.org>
+ *
+ * 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.
+ */
+
+
+#ifndef __MOUSECONFIG_H__
+#define __MOUSECONFIG_H__
+
+#include <qbuttongroup.h>
+#include <qdialog.h>
+#include <qlabel.h>
+#include <qlcdnumber.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+
+#include <kapplication.h>
+
+#include <kglobalsettings.h>
+#include <knuminput.h>
+
+#include <config.h>
+#ifdef HAVE_LIBUSB
+#include "logitechmouse.h"
+#endif
+
+#include <kcmodule.h>
+#include "kmousedlg.h"
+#include "themepage.h"
+
+#define RIGHT_HANDED 0
+#define LEFT_HANDED 1
+
+class QCheckBox;
+class QSlider;
+class QTabWidget;
+
+class MouseSettings
+{
+public:
+ void save(KConfig *);
+ void load(KConfig *);
+ void apply(bool force=false);
+public:
+ int num_buttons;
+ int middle_button;
+ bool handedEnabled;
+ bool m_handedNeedsApply;
+ int handed;
+ double accelRate;
+ int thresholdMove;
+ int doubleClickInterval;
+ int dragStartTime;
+ int dragStartDist;
+ bool singleClick;
+ int autoSelectDelay;
+ int visualActivate;
+ bool changeCursor;
+ int wheelScrollLines;
+ bool reverseScrollPolarity;
+
+ #ifdef HAVE_LIBUSB
+ // TODO: In Qt4, replace with a better container.
+ QPtrList <LogitechMouse> logitechMouseList;
+ #endif
+};
+
+class MouseConfig : public KCModule
+{
+ Q_OBJECT
+public:
+ MouseConfig(QWidget *parent=0, const char* name=0);
+ ~MouseConfig();
+
+ void save();
+ void load();
+ void load( bool useDefaults );
+ void defaults();
+
+private slots:
+
+ void slotClick();
+ /** No descriptions */
+ void slotHandedChanged(int val);
+ void slotScrollPolarityChanged();
+ void checkAccess();
+ void slotThreshChanged(int value);
+ void slotDragStartDistChanged(int value);
+ void slotWheelScrollLinesChanged(int value);
+
+private:
+
+ double getAccel();
+ int getThreshold();
+ int getHandedness();
+
+ void setAccel(double);
+ void setThreshold(int);
+ void setHandedness(int);
+
+ KDoubleNumInput *accel;
+ KIntNumInput *thresh;
+ KIntNumInput *doubleClickInterval;
+ KIntNumInput *dragStartTime;
+ KIntNumInput *dragStartDist;
+ KIntNumInput *wheelScrollLines;
+
+ QButtonGroup *handedBox;
+// QRadioButton *leftHanded, *rightHanded;
+// QCheckBox *doubleClick;
+// QCheckBox *cbAutoSelect;
+ QLabel *lDelay;
+// QSlider *slAutoSelect;
+// QCheckBox *cbVisualActivate;
+// QCheckBox *cbCursor;
+// QCheckBox *cbLargeCursor;
+
+ QTabWidget *tabwidget;
+ QWidget *tab2;
+ KMouseDlg* tab1;
+ ThemePage* themetab;
+ MouseSettings *settings;
+
+ QCheckBox *mouseKeys;
+ KIntNumInput *mk_delay, *mk_interval, *mk_time_to_max, *mk_max_speed,
+ *mk_curve;
+
+
+};
+
+#endif
+
diff --git a/kcontrol/input/mouse_cursor_theme.upd b/kcontrol/input/mouse_cursor_theme.upd
new file mode 100644
index 000000000..da71abb19
--- /dev/null
+++ b/kcontrol/input/mouse_cursor_theme.upd
@@ -0,0 +1,5 @@
+Id=kde3.4.99
+File=kdeglobals,kcminputrc
+Group=KDE,Mouse
+Options=overwrite
+Key=cursorTheme
diff --git a/kcontrol/input/pics/Makefile.am b/kcontrol/input/pics/Makefile.am
new file mode 100644
index 000000000..fa9cd0d71
--- /dev/null
+++ b/kcontrol/input/pics/Makefile.am
@@ -0,0 +1,3 @@
+kcminput_pics_data_DATA = mouse_rh.png mouse_lh.png
+kcminput_pics_datadir = $(kde_datadir)/kcminput/pics
+
diff --git a/kcontrol/input/pics/mouse_lh.png b/kcontrol/input/pics/mouse_lh.png
new file mode 100644
index 000000000..acec7fe85
--- /dev/null
+++ b/kcontrol/input/pics/mouse_lh.png
Binary files differ
diff --git a/kcontrol/input/pics/mouse_lh.svgz b/kcontrol/input/pics/mouse_lh.svgz
new file mode 100644
index 000000000..9bf18f4f9
--- /dev/null
+++ b/kcontrol/input/pics/mouse_lh.svgz
Binary files differ
diff --git a/kcontrol/input/pics/mouse_rh.png b/kcontrol/input/pics/mouse_rh.png
new file mode 100644
index 000000000..de5cd8a86
--- /dev/null
+++ b/kcontrol/input/pics/mouse_rh.png
Binary files differ
diff --git a/kcontrol/input/pics/mouse_rh.svgz b/kcontrol/input/pics/mouse_rh.svgz
new file mode 100644
index 000000000..5597f588f
--- /dev/null
+++ b/kcontrol/input/pics/mouse_rh.svgz
Binary files differ
diff --git a/kcontrol/input/xcursor/Makefile.am b/kcontrol/input/xcursor/Makefile.am
new file mode 100644
index 000000000..9ef9c9bbf
--- /dev/null
+++ b/kcontrol/input/xcursor/Makefile.am
@@ -0,0 +1,7 @@
+AM_CPPFLAGS = $(all_includes)
+
+noinst_LTLIBRARIES = libthemepage.la
+libthemepage_la_SOURCES = themepage.cpp previewwidget.cpp
+METASOURCES = AUTO
+noinst_HEADERS = themepage.h previewwidget.h
+
diff --git a/kcontrol/input/xcursor/previewwidget.cpp b/kcontrol/input/xcursor/previewwidget.cpp
new file mode 100644
index 000000000..36108ef36
--- /dev/null
+++ b/kcontrol/input/xcursor/previewwidget.cpp
@@ -0,0 +1,353 @@
+/*
+ * Copyright (C) 2003 Fredrik Hglund <fredrik@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <kglobal.h>
+
+#include <qwidget.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qstring.h>
+#include <qcursor.h>
+
+#include <kglobal.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/extensions/Xrender.h>
+#include <X11/Xcursor/Xcursor.h>
+
+#include "previewwidget.h"
+
+
+extern bool qt_has_xft;
+extern bool qt_use_xrender;
+
+
+namespace {
+
+ // Preview cursors
+ const char *cursor_names[] =
+ {
+ "left_ptr",
+ "left_ptr_watch",
+ "watch",
+ "hand2",
+ "question_arrow",
+ "sb_h_double_arrow",
+ "sb_v_double_arrow",
+ "bottom_left_corner",
+ "bottom_right_corner",
+ "fleur",
+ "pirate",
+ "cross",
+ "X_cursor",
+ "right_ptr",
+ "right_side",
+ "right_tee",
+ "sb_right_arrow",
+ "sb_right_tee",
+ "base_arrow_down",
+ "base_arrow_up",
+ "bottom_side",
+ "bottom_tee",
+ "center_ptr",
+ "circle",
+ "dot",
+ "dot_box_mask",
+ "dot_box_mask",
+ "double_arrow",
+ "draped_box",
+ "left_side",
+ "left_tee",
+ "ll_angle",
+ "top_side",
+ "top_tee",
+ };
+
+ const int numCursors = 6; // The number of cursors in the above list to be previewed
+ const int previewSize = 24; // The cursor size to be used in the preview widget
+ const int cursorSpacing = 20;
+}
+
+
+class PreviewCursor
+{
+ public:
+ PreviewCursor();
+ ~PreviewCursor();
+
+ void load( const QString &, const QString & );
+ const Picture picture() const { return m_pict; }
+ const Cursor handle() const { return m_handle; }
+ const int width() const { return m_width; }
+ const int height() const { return m_height; }
+
+ private:
+ Picture createPicture( const XcursorImage* ) const;
+ void cropCursorImage( XcursorImage*& ) const;
+ Picture m_pict;
+ Cursor m_handle;
+ int m_width;
+ int m_height;
+}; // class PreviewCursor
+
+
+PreviewCursor::PreviewCursor() :
+ m_pict( 0 ), m_handle( 0 ), m_width( 0 ), m_height( 0 )
+{
+}
+
+
+void PreviewCursor::load( const QString &name, const QString &theme )
+{
+ Display *dpy = QPaintDevice::x11AppDisplay();
+
+ if ( m_pict ) XRenderFreePicture( dpy, m_pict );
+ if ( m_handle ) XFreeCursor( dpy, m_handle );
+ m_pict = 0;
+ m_handle = 0;
+ m_width = m_height = 0;
+
+ // Load the preview cursor image
+ XcursorImage *image =
+ XcursorLibraryLoadImage( name.latin1(), theme.latin1(), previewSize );
+
+ // If the theme doesn't have this cursor, load the default cursor for now
+ if ( !image )
+ image = XcursorLibraryLoadImage( "left_ptr", theme.latin1(), previewSize );
+
+ // TODO The old classic X cursors
+ if ( !image )
+ return;
+
+ // Auto-crop the image (some cursor themes use a fixed image size
+ // for all cursors, and doing this results in correctly centered images)
+ cropCursorImage( image );
+
+ m_pict = createPicture( image );
+ m_width = image->width;
+ m_height = image->height;
+
+ // Scale the image if its height is greater than 2x the requested size
+ if ( m_height > previewSize * 2.0 ) {
+ double factor = double( previewSize * 2.0 / m_height );
+ XTransform xform = {
+ {{ XDoubleToFixed(1.0), XDoubleToFixed(0), XDoubleToFixed(0) },
+ { XDoubleToFixed(0), XDoubleToFixed(1.0), XDoubleToFixed(0) },
+ { XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(factor) }}
+ };
+ XRenderSetPictureTransform( dpy, m_pict, &xform );
+ m_width = int( m_width * factor );
+ m_height = int( m_height * factor );
+ }
+
+ // We don't need this image anymore
+ XcursorImageDestroy( image );
+
+ // Load the actual cursor we will use
+ int size = XcursorGetDefaultSize( dpy );
+ XcursorImages *images = XcursorLibraryLoadImages( name.latin1(), theme.latin1(), size );
+
+ if ( images ) {
+ m_handle = XcursorImagesLoadCursor( dpy, images );
+ XcursorImagesDestroy( images );
+ } else {
+ images = XcursorLibraryLoadImages( "left_ptr", theme.latin1(), size );
+ m_handle = XcursorImagesLoadCursor( dpy, images );
+ XcursorImagesDestroy( images );
+ }
+}
+
+
+PreviewCursor::~PreviewCursor()
+{
+ if ( m_handle ) XFreeCursor( QPaintDevice::x11AppDisplay(), m_handle );
+ if ( m_pict ) XRenderFreePicture( QPaintDevice::x11AppDisplay(), m_pict );
+}
+
+
+Picture PreviewCursor::createPicture( const XcursorImage* image ) const
+{
+ Display *dpy = QPaintDevice::x11AppDisplay();
+
+ XImage ximage;
+ ximage.width = image->width;
+ ximage.height = image->height;
+ ximage.xoffset = 0;
+ ximage.format = ZPixmap;
+ ximage.data = reinterpret_cast<char*>( image->pixels );
+ ximage.byte_order = ImageByteOrder( dpy );
+ ximage.bitmap_unit = 32;
+ ximage.bitmap_bit_order = ximage.byte_order;
+ ximage.bitmap_pad = 32;
+ ximage.depth = 32;
+ ximage.bits_per_pixel = 32;
+ ximage.bytes_per_line = image->width * 4;
+ ximage.red_mask = 0x00ff0000;
+ ximage.green_mask = 0x0000ff00;
+ ximage.blue_mask = 0x000000ff;
+ ximage.obdata = 0;
+
+ XInitImage( &ximage );
+
+ Pixmap pix = XCreatePixmap( dpy, DefaultRootWindow(dpy), ximage.width, ximage.height, 32 );
+ GC gc = XCreateGC( dpy, pix, 0, NULL );
+ XPutImage( dpy, pix, gc, &ximage, 0, 0, 0, 0, ximage.width, ximage.height );
+ XFreeGC( dpy, gc );
+
+ XRenderPictFormat *fmt = XRenderFindStandardFormat( dpy, PictStandardARGB32 );
+ Picture pict = XRenderCreatePicture( dpy, pix, fmt, 0, NULL );
+ XFreePixmap( dpy, pix );
+
+ return pict;
+}
+
+
+void PreviewCursor::cropCursorImage( XcursorImage *&image ) const
+{
+ // Calculate the auto-crop rectangle
+ QRect r( QPoint( image->width, image->height ), QPoint() );
+ XcursorPixel *pixels = image->pixels;
+ for ( int y = 0; y < int(image->height); y++ ) {
+ for ( int x = 0; x < int(image->width); x++ ) {
+ if ( *(pixels++) >> 24 ) {
+ if ( x < r.left() ) r.setLeft( x );
+ if ( x > r.right() ) r.setRight( x );
+ if ( y < r.top() ) r.setTop( y );
+ if ( y > r.bottom() ) r.setBottom( y );
+ }
+ }
+ }
+
+ // Normalize the rectangle
+ r = r.normalize();
+
+ // Don't crop the image if the size isn't going to change
+ if ( r.width() == int( image->width ) && r.height() == int( image->height ) )
+ return;
+
+ // Create the new image
+ XcursorImage *cropped = XcursorImageCreate( r.width(), r.height() );
+ XcursorPixel *src = image->pixels + r.top() * image->width + r.left();
+ XcursorPixel *dst = cropped->pixels;
+ for ( int y = 0; y < r.height(); y++, src += (image->width - r.width()) ) {
+ for ( int x = 0; x < r.width(); x++ ) {
+ *(dst++) = *(src++);
+ }
+ }
+
+ // Destroy the original
+ XcursorImageDestroy( image );
+ image = cropped;
+}
+
+
+
+// ------------------------------------------------------------------------------------------------
+
+
+
+PreviewWidget::PreviewWidget( QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+ cursors = new PreviewCursor* [ numCursors ];
+ for ( int i = 0; i < numCursors; i++ )
+ cursors[i] = new PreviewCursor;
+
+ current = -1;
+ setMouseTracking( true );
+ setFixedHeight( previewSize + 20 );
+}
+
+
+PreviewWidget::~PreviewWidget()
+{
+ for ( int i = 0; i < numCursors; i++ )
+ delete cursors[i];
+
+ delete [] cursors;
+}
+
+
+void PreviewWidget::setTheme( const QString &theme )
+{
+ setUpdatesEnabled( false );
+
+ int minHeight = previewSize + 20; // Minimum height of the preview widget
+ int maxHeight = height(); // Tallest cursor height
+ int maxWidth = previewSize; // Widest cursor width
+
+ for ( int i = 0; i < numCursors; i++ ) {
+ cursors[i]->load( cursor_names[i], theme.latin1() );
+ if ( cursors[i]->width() > maxWidth )
+ maxWidth = cursors[i]->width();
+ if ( cursors[i]->height() > maxHeight )
+ maxHeight = cursors[i]->height();
+ }
+
+ current = -1;
+ setFixedSize( ( maxWidth + cursorSpacing ) * numCursors, kMax( maxHeight, minHeight ) );
+ setUpdatesEnabled( true );
+ repaint( false );
+}
+
+
+void PreviewWidget::paintEvent( QPaintEvent * )
+{
+ QPixmap buffer( size() );
+ QPainter p( &buffer );
+ p.fillRect( rect(), colorGroup().brush( QColorGroup::Background ) );
+ Picture dest;
+
+ if ( !qt_has_xft || !qt_use_xrender ) {
+ XRenderPictFormat *fmt = XRenderFindVisualFormat( x11Display(), (Visual*)buffer.x11Visual() );
+ dest = XRenderCreatePicture( x11Display(), buffer.handle(), fmt, 0, NULL );
+ } else
+ dest = buffer.x11RenderHandle();
+
+ int rwidth = width() / numCursors;
+
+ for ( int i = 0; i < numCursors; i++ ) {
+ if ( cursors[i]->picture() ) {
+ XRenderComposite( x11Display(), PictOpOver,
+ cursors[i]->picture(), 0, dest, 0, 0, 0, 0,
+ rwidth * i + (rwidth - cursors[i]->width()) / 2,
+ (height() - cursors[i]->height()) / 2,
+ cursors[i]->width(), cursors[i]->height() );
+ }
+ }
+
+ bitBlt( this, 0, 0, &buffer );
+
+ if ( !qt_has_xft || !qt_use_xrender )
+ XRenderFreePicture( x11Display(), dest );
+}
+
+
+void PreviewWidget::mouseMoveEvent( QMouseEvent *e )
+{
+ int pos = e->x() / ( width() / numCursors );
+
+ if ( pos != current && pos < numCursors ) {
+ XDefineCursor( x11Display(), winId(), cursors[pos]->handle() );
+ current = pos;
+ }
+}
+
+
+// vim: set noet ts=4 sw=4:
diff --git a/kcontrol/input/xcursor/previewwidget.h b/kcontrol/input/xcursor/previewwidget.h
new file mode 100644
index 000000000..1c1d12c0f
--- /dev/null
+++ b/kcontrol/input/xcursor/previewwidget.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2003 Fredrik Hglund <fredrik@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef __CURSORPREVIEW_H
+#define __CURSORPREVIEW_H
+
+
+class PreviewCursor;
+
+
+class PreviewWidget : public QWidget
+{
+ public:
+ PreviewWidget( QWidget *parent = NULL, const char *name = NULL );
+ ~PreviewWidget();
+
+ void setTheme( const QString & );
+
+ void paintEvent( QPaintEvent * );
+ void mouseMoveEvent( QMouseEvent * );
+
+ private:
+ PreviewCursor **cursors;
+ int current;
+}; // class CursorPreview
+
+
+
+#endif
+
+// vim: set noet ts=4 sw=4:
diff --git a/kcontrol/input/xcursor/themepage.cpp b/kcontrol/input/xcursor/themepage.cpp
new file mode 100644
index 000000000..96e3e6871
--- /dev/null
+++ b/kcontrol/input/xcursor/themepage.cpp
@@ -0,0 +1,637 @@
+/*
+ * Copyright (C) 2003 Fredrik H�lund <fredrik@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <klocale.h>
+#include <kaboutdata.h>
+#include <kstandarddirs.h>
+#include <klistview.h>
+#include <ksimpleconfig.h>
+#include <kglobalsettings.h>
+#include <kdialog.h>
+#include <kmessagebox.h>
+#include <kurlrequesterdlg.h>
+#include <kio/job.h>
+#include <kio/netaccess.h>
+#include <ktar.h>
+
+#include <qlayout.h>
+#include <qdir.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qlabel.h>
+#include <qhbox.h>
+#include <qpainter.h>
+#include <qfileinfo.h>
+#include <qpushbutton.h>
+
+#include <cstdlib> // for getenv()
+
+#include "themepage.h"
+#include "themepage.moc"
+
+#include "previewwidget.h"
+
+#include <X11/Xlib.h>
+#include <X11/Xcursor/Xcursor.h>
+
+// Check for older version
+#if !defined(XCURSOR_LIB_MAJOR) && defined(XCURSOR_MAJOR)
+# define XCURSOR_LIB_MAJOR XCURSOR_MAJOR
+# define XCURSOR_LIB_MINOR XCURSOR_MINOR
+#endif
+
+namespace {
+ // Listview icon size
+ const int iconSize = 24;
+
+ // Listview columns
+ enum Columns { NameColumn = 0, DescColumn, /* hidden */ DirColumn };
+}
+
+struct ThemeInfo {
+ QString path; // Path to the cursor theme
+ bool writable; // Theme directory is writable
+};
+
+
+ThemePage::ThemePage( QWidget* parent, const char* name )
+ : QWidget( parent, name ), selectedTheme( NULL ), currentTheme( NULL )
+{
+ QBoxLayout *layout = new QVBoxLayout( this );
+ layout->setAutoAdd( true );
+ layout->setMargin( KDialog::marginHint() );
+ layout->setSpacing( KDialog::spacingHint() );
+
+ new QLabel( i18n("Select the cursor theme you want to use (hover preview to test cursor):"), this );
+
+ // Create the preview widget
+ preview = new PreviewWidget( new QHBox( this ) );
+
+ // Create the theme list view
+ listview = new KListView( this );
+ listview->setFullWidth( true );
+ listview->setAllColumnsShowFocus( true );
+ listview->addColumn( i18n("Name") );
+ listview->addColumn( i18n("Description") );
+
+ connect( listview, SIGNAL(selectionChanged(QListViewItem*)),
+ SLOT(selectionChanged(QListViewItem*)) );
+
+ themeDirs = getThemeBaseDirs();
+ insertThemes();
+
+ QHBox *hbox = new QHBox( this );
+ hbox->setSpacing( KDialog::spacingHint() );
+ installButton = new QPushButton( i18n("Install New Theme..."), hbox );
+ removeButton = new QPushButton( i18n("Remove Theme"), hbox );
+
+ connect( installButton, SIGNAL( clicked() ), SLOT( installClicked() ) );
+ connect( removeButton, SIGNAL( clicked() ), SLOT( removeClicked() ) );
+
+ // Disable the install button if ~/.icons isn't writable
+ QString path = QDir::homeDirPath() + "/.icons";
+ QFileInfo icons = QFileInfo( path );
+
+ if ( ( icons.exists() && !icons.isWritable() ) ||
+ ( !icons.exists() && !QFileInfo( QDir::homeDirPath() ).isWritable() ) )
+ installButton->setEnabled( false );
+
+ if ( !themeDirs.contains( path ) )
+ installButton->setEnabled( false );
+
+ selectionChanged( listview->currentItem() );
+}
+
+
+ThemePage::~ThemePage()
+{
+}
+
+
+void ThemePage::save()
+{
+ if ( currentTheme == selectedTheme )
+ return;
+
+ KConfig c( "kcminputrc" );
+ c.setGroup( "Mouse" );
+ c.writeEntry( "cursorTheme", selectedTheme != "system" ? selectedTheme : QString::null );
+
+ KMessageBox::information( this, i18n("You have to restart KDE for these "
+ "changes to take effect."), i18n("Cursor Settings Changed"),
+ "CursorSettingsChanged" );
+
+ currentTheme = selectedTheme;
+}
+
+void ThemePage::load()
+{
+ load( false );
+}
+
+void ThemePage::load( bool useDefaults )
+{
+ // Get the name of the theme libXcursor currently uses
+ const char *theme = XcursorGetTheme( x11Display() );
+ currentTheme = theme;
+
+ // Get the name of the theme KDE is configured to use
+ KConfig c( "kcminputrc" );
+ c.setReadDefaults( useDefaults );
+ c.setGroup( "Mouse" );
+ currentTheme = c.readEntry( "cursorTheme", currentTheme );
+ if( currentTheme.isEmpty())
+ currentTheme = "system";
+
+ // Find the theme in the listview and select it
+ QListViewItem *item = listview->findItem( currentTheme, DirColumn );
+ if( !item )
+ item = listview->findItem( "system", DirColumn );
+ selectedTheme = item->text( DirColumn );
+ listview->setSelected( item, true );
+ listview->ensureItemVisible( item );
+
+ // Update the preview widget as well
+ if ( preview )
+ preview->setTheme( selectedTheme );
+
+ // Disable the listview if we're in kiosk mode
+ if ( c.entryIsImmutable( "cursorTheme" ) )
+ listview->setEnabled( false );
+}
+
+
+void ThemePage::defaults()
+{
+ load( true );
+}
+
+
+void ThemePage::selectionChanged( QListViewItem *item )
+{
+ if ( !item )
+ {
+ removeButton->setEnabled( false );
+ return;
+ }
+
+ selectedTheme = item->text( DirColumn );
+
+ // Update the preview widget
+ if ( preview )
+ preview->setTheme( selectedTheme );
+
+ removeButton->setEnabled( themeInfo[ selectedTheme ] && themeInfo[ selectedTheme ]->writable );
+
+ emit changed( currentTheme != selectedTheme );
+}
+
+
+void ThemePage::installClicked()
+{
+ // Get the URL for the theme we're going to install
+ KURL url = KURLRequesterDlg::getURL( QString::null, this, i18n( "Drag or Type Theme URL" ) );
+ if ( url.isEmpty() )
+ return;
+
+ QString tmpFile;
+ if ( !KIO::NetAccess::download( url, tmpFile, this ) ) {
+ QString text;
+
+ if ( url.isLocalFile() )
+ text = i18n( "Unable to find the cursor theme archive %1." );
+ else
+ text = i18n( "Unable to download the cursor theme archive; "
+ "please check that the address %1 is correct." );
+
+ KMessageBox::sorry( this, text.arg( url.prettyURL() ) );
+ return;
+ }
+
+ if ( !installThemes( tmpFile ) )
+ KMessageBox::error( this, i18n( "The file %1 does not appear to be a valid "
+ "cursor theme archive.").arg( url.fileName() ) );
+
+ KIO::NetAccess::removeTempFile( tmpFile );
+}
+
+
+void ThemePage::removeClicked()
+{
+ QString question = i18n( "<qt>Are you sure you want to remove the "
+ "<strong>%1</strong> cursor theme?<br>"
+ "This will delete all the files installed by this theme.</qt>")
+ .arg( listview->currentItem()->text( NameColumn ) );
+
+ // Get confirmation from the user
+ int answer = KMessageBox::warningContinueCancel( this, question, i18n( "Confirmation" ), KStdGuiItem::del() );
+ if ( answer != KMessageBox::Continue )
+ return;
+
+ // Delete the theme from the harddrive
+ KURL u;
+ u.setPath( themeInfo[ selectedTheme ]->path );
+ KIO::del( u );
+
+ // Remove the theme from the listview and from the themeinfo dict
+ delete listview->findItem( selectedTheme, DirColumn );
+ themeInfo.remove( selectedTheme );
+ listview->setSelected( listview->currentItem(), true );
+
+ // TODO:
+ // Since it's possible to substitute cursors in a system theme by adding a local
+ // theme with the same name, we shouldn't remove the theme from the list if it's
+ // still available elsewhere. This could be solved by calling insertThemes() here,
+ // but since KIO::del() is an asynchronos operation, the theme we're deleting will
+ // be readded to the list again before KIO has removed it.
+}
+
+
+bool ThemePage::installThemes( const QString &file )
+{
+ KTar archive( file );
+
+ if ( !archive.open( IO_ReadOnly ) )
+ return false;
+
+ const KArchiveDirectory *archiveDir = archive.directory();
+ QStringList themeDirs;
+
+ const QStringList entries = archiveDir->entries();
+ for ( QStringList::ConstIterator it = entries.begin(); it != entries.end(); ++it )
+ {
+ const KArchiveEntry *entry = archiveDir->entry( *it );
+ if ( entry->isDirectory() && entry->name().lower() != "default" ) {
+ const KArchiveDirectory *dir = static_cast< const KArchiveDirectory* >( entry );
+ if ( dir->entry( "index.theme" ) && dir->entry( "cursors" ) )
+ themeDirs << dir->name();
+ }
+ }
+
+ if ( themeDirs.count() < 1 )
+ return false;
+
+ const QString destDir = QDir::homeDirPath() + "/.icons/";
+ KStandardDirs::makeDir( destDir ); // Make sure the directory exists
+
+ for ( QStringList::ConstIterator it = themeDirs.begin(); it != themeDirs.end(); ++it )
+ {
+ // Check if a theme with that name already exists
+ if ( QDir( destDir ).exists( *it ) ) {
+ const QString question = i18n( "A theme named %1 already exists in your icon "
+ "theme folder. Do you want replace it with this one?" ).arg( *it );
+ int answer = KMessageBox::warningContinueCancel( this, question, i18n( "Overwrite Theme?"), i18n("Replace") );
+ if ( answer != KMessageBox::Continue )
+ continue;
+
+ // ### If the theme that's being replaced is the current theme, it
+ // will cause cursor inconsistencies in newly started apps.
+ }
+
+ // ### Should we check if a theme with the same name exists in a global theme dir?
+ // If that's the case it will effectively replace it, even though the global theme
+ // won't be deleted. Checking for this situation is easy, since the global theme
+ // will be in the listview. Maybe this should never be allowed since it might
+ // result in strange side effects (from the average users point of view). OTOH
+ // a user might want to do this 'upgrade' a global theme.
+
+ const QString dest = destDir + *it;
+ const KArchiveDirectory *dir = static_cast< const KArchiveDirectory* >( archiveDir->entry( *it ) );
+ dir->copyTo( dest );
+ insertTheme( dest );
+ }
+
+ listview->sort();
+
+ archive.close();
+ return true;
+}
+
+
+void ThemePage::insertTheme( const QString &path )
+{
+ QString dirName = QDir( path ).dirName();
+
+ // Defaults in case there's no name or comment field.
+ QString name = dirName;
+ QString desc = i18n( "No description available" );
+ QString sample = "left_ptr";
+
+ KSimpleConfig c( path + "/index.theme", true ); // Open read-only
+ c.setGroup( "Icon Theme" );
+
+ // Don't insert the theme if it's hidden.
+ if ( c.readBoolEntry( "Hidden", false ) )
+ return;
+
+ // ### If the theme is hidden, the user will probably find it strange that it
+ // doesn't appear in the list view. There also won't be a way for the user
+ // to delete the theme using the KCM. Perhaps a warning about this should
+ // be issued, and the user given a chance to undo the installation.
+
+ // Read the name, description and sample cursor
+ name = c.readEntry( "Name", name );
+ desc = c.readEntry( "Comment", desc );
+ sample = c.readEntry( "Example", sample );
+
+ // Create a ThemeInfo object if one doesn't already exist, and fill in the members
+ ThemeInfo *info = themeInfo[ dirName ];
+ if ( !info ) {
+ info = new ThemeInfo;
+ themeInfo.insert( dirName, info );
+ }
+
+ info->path = path;
+ info->writable = true;
+
+ // If an item with the same name already exists, remove it
+ delete listview->findItem( dirName, DirColumn );
+
+ // Create the listview item and insert it into the list.
+ KListViewItem *item = new KListViewItem( listview, name, desc, /*hidden*/ dirName );
+ item->setPixmap( NameColumn, createIcon( dirName, sample ) );
+ listview->insertItem( item );
+}
+
+
+const QStringList ThemePage::getThemeBaseDirs() const
+{
+#if XCURSOR_LIB_MAJOR == 1 && XCURSOR_LIB_MINOR < 1
+ // These are the default paths Xcursor will scan for cursor themes
+ QString path( "~/.icons:/usr/share/icons:/usr/share/pixmaps:/usr/X11R6/lib/X11/icons" );
+
+ // If XCURSOR_PATH is set, use that instead of the default path
+ char *xcursorPath = std::getenv( "XCURSOR_PATH" );
+ if ( xcursorPath )
+ path = xcursorPath;
+#else
+ // Get the search patch from Xcursor
+ QString path = XcursorLibraryPath();
+#endif
+ // Expand all occurences of ~ to the home dir
+ path.replace( "~/", QDir::homeDirPath() + '/' );
+ return QStringList::split( ':', path );
+}
+
+
+bool ThemePage::isCursorTheme( const QString &theme, const int depth ) const
+{
+ // Prevent infinate recursion
+ if ( depth > 10 )
+ return false;
+
+ // Search each icon theme directory for 'theme'
+ for ( QStringList::ConstIterator it = themeDirs.begin(); it != themeDirs.end(); ++it )
+ {
+ QDir dir( *it );
+ if ( !dir.exists() )
+ continue;
+
+ const QStringList subdirs( dir.entryList( QDir::Dirs ) );
+ if ( subdirs.contains( theme ) )
+ {
+ const QString path = *it + '/' + theme;
+ const QString indexfile = path + "/index.theme";
+ const bool haveIndexFile = dir.exists( indexfile );
+ const bool haveCursors = dir.exists( path + "/cursors" );
+ QStringList inherit;
+
+ // Return true if we have a cursors subdirectory
+ if ( haveCursors )
+ return true;
+
+ // Parse the index.theme file if one exists
+ if ( haveIndexFile )
+ {
+ KSimpleConfig c( indexfile, true ); // Open read-only
+ c.setGroup( "Icon Theme" );
+ inherit = c.readListEntry( "Inherits" );
+ }
+
+ // Recurse through the list of inherited themes
+ for ( QStringList::ConstIterator it2 = inherit.begin(); it2 != inherit.end(); ++it2 )
+ {
+ if ( *it2 == theme ) // Avoid possible DoS
+ continue;
+
+ if ( isCursorTheme( *it2, depth + 1 ) )
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+
+void ThemePage::insertThemes()
+{
+ // Scan each base dir for cursor themes and add them to the listview.
+ // An icon theme is considered to be a cursor theme if it contains
+ // a cursors subdirectory or if it inherits a cursor theme.
+ for ( QStringList::ConstIterator it = themeDirs.begin(); it != themeDirs.end(); ++it )
+ {
+ QDir dir( *it );
+ if ( !dir.exists() )
+ continue;
+
+ QStringList subdirs( dir.entryList( QDir::Dirs ) );
+ subdirs.remove( "." );
+ subdirs.remove( ".." );
+
+ for ( QStringList::ConstIterator it = subdirs.begin(); it != subdirs.end(); ++it )
+ {
+ // Only add the theme if we don't already have a theme with that name
+ // in the list. Xcursor will use the first theme it finds in that
+ // case, and since we use the same search order that should also be
+ // the theme we end up adding to the list.
+ if ( listview->findItem( *it, DirColumn ) )
+ continue;
+
+ const QString path = dir.path() + '/' + *it;
+ const QString indexfile = path + "/index.theme";
+ const bool haveIndexFile = dir.exists( *it + "/index.theme" );
+ const bool haveCursors = dir.exists( *it + "/cursors" );
+
+ // If the directory doesn't have a cursors subdir and lack an
+ // index.theme file it's definately not a cursor theme
+ if ( !haveIndexFile && !haveCursors )
+ continue;
+
+ // Defaults in case there's no index.theme file or it lacks
+ // a name and a comment field.
+ QString name = *it;
+ QString desc = i18n( "No description available" );
+ QString sample = "left_ptr";
+
+ // Parse the index.theme file if the theme has one.
+ if ( haveIndexFile )
+ {
+ KSimpleConfig c( indexfile, true );
+ c.setGroup( "Icon Theme" );
+
+ // Skip this theme if it's hidden.
+ if ( c.readBoolEntry( "Hidden", false ) )
+ continue;
+
+ // If there's no cursors subdirectory we'll do a recursive scan
+ // to check if the theme inherits a theme with one.
+ if ( !haveCursors )
+ {
+ bool result = false;
+ QStringList inherit = c.readListEntry( "Inherits" );
+ for ( QStringList::ConstIterator it2 = inherit.begin(); it2 != inherit.end(); ++it2 )
+ if ( result = isCursorTheme( *it2 ) )
+ break;
+
+ // If this theme doesn't inherit a cursor theme, proceed
+ // to the next theme in the list.
+ if ( !result )
+ continue;
+ }
+
+ // Read the name, description and sample cursor
+ name = c.readEntry( "Name", name );
+ desc = c.readEntry( "Comment", desc );
+ sample = c.readEntry( "Example", sample );
+ }
+
+ // Create a ThemeInfo object, and fill in the members
+ ThemeInfo *info = new ThemeInfo;
+ info->path = path;
+ info->writable = QFileInfo( path ).isWritable();
+ themeInfo.insert( *it, info );
+
+ // Create the listview item and insert it into the list.
+ KListViewItem *item = new KListViewItem( listview, name, desc, /*hidden*/ *it );
+ item->setPixmap( NameColumn, createIcon( *it, sample ) );
+ listview->insertItem( item );
+ }
+ }
+
+ // Note: If a default theme dir wasn't found in the above search, Xcursor will
+ // default to using the cursor font.
+
+ // Sort the theme list
+ listview->sort();
+
+ KListViewItem *item = new KListViewItem( listview, ' ' + i18n( "No theme" ), i18n( "The old classic X cursors") , /*hidden*/ "none" );
+ listview->insertItem( item );
+ item = new KListViewItem( listview, ' ' + i18n( "System theme" ), i18n( "Do not change cursor theme") , /*hidden*/ "system" );
+ listview->insertItem( item );
+ // no ThemeInfo object for this one
+}
+
+
+QPixmap ThemePage::createIcon( const QString &theme, const QString &sample ) const
+{
+ XcursorImage *xcur;
+ QPixmap pix;
+
+ xcur = XcursorLibraryLoadImage( sample.latin1(), theme.latin1(), iconSize );
+ if ( !xcur ) xcur = XcursorLibraryLoadImage( "left_ptr", theme.latin1(), iconSize );
+
+ if ( xcur ) {
+ // Calculate an auto-crop rectangle for the cursor image
+ // (helps with cursors converted from windows .cur or .ani files)
+ QRect r( QPoint( xcur->width, xcur->height ), QPoint() );
+ XcursorPixel *src = xcur->pixels;
+
+ for ( int y = 0; y < int( xcur->height ); y++ ) {
+ for ( int x = 0; x < int( xcur->width ); x++ ) {
+ if ( *(src++) >> 24 ) {
+ if ( x < r.left() ) r.setLeft( x );
+ if ( x > r.right() ) r.setRight( x );
+ if ( y < r.top() ) r.setTop( y );
+ if ( y > r.bottom() ) r.setBottom( y );
+ }
+ }
+ }
+
+ // Normalize the rectangle
+ r = r.normalize();
+
+ // Calculate the image size
+ int size = kMax( iconSize, kMax( r.width(), r.height() ) );
+
+ // Create the intermediate QImage
+ QImage image( size, size, 32 );
+ image.setAlphaBuffer( true );
+
+ // Clear the image
+ Q_UINT32 *dst = reinterpret_cast<Q_UINT32*>( image.bits() );
+ for ( int i = 0; i < image.width() * image.height(); i++ )
+ dst[i] = 0;
+
+ // Compute the source and destination offsets
+ QPoint dstOffset( (image.width() - r.width()) / 2, (image.height() - r.height()) / 2 );
+ QPoint srcOffset( r.topLeft() );
+
+ dst = reinterpret_cast<Q_UINT32*>( image.scanLine(dstOffset.y()) ) + dstOffset.x();
+ src = reinterpret_cast<Q_UINT32*>( xcur->pixels ) + srcOffset.y() * xcur->width + srcOffset.x();
+
+ // Copy the XcursorImage into the QImage, converting it from premultiplied
+ // to non-premultiplied alpha and cropping it if needed.
+ for ( int y = 0; y < r.height(); y++ )
+ {
+ for ( int x = 0; x < r.width(); x++, dst++, src++ ) {
+ const Q_UINT32 pixel = *src;
+
+ const Q_UINT8 a = qAlpha( pixel );
+ const Q_UINT8 r = qRed( pixel );
+ const Q_UINT8 g = qGreen( pixel );
+ const Q_UINT8 b = qBlue( pixel );
+
+ if ( !a || a == 255 ) {
+ *dst = pixel;
+ } else {
+ float alpha = a / 255.0;
+ *dst = qRgba( int(r / alpha), int(g / alpha), int(b / alpha), a );
+ }
+ }
+ dst += ( image.width() - r.width() );
+ src += ( xcur->width - r.width() );
+ }
+
+ // Scale down the image if we need to
+ if ( image.width() > iconSize || image.height() > iconSize )
+ image = image.smoothScale( iconSize, iconSize, QImage::ScaleMin );
+
+ pix.convertFromImage( image );
+ XcursorImageDestroy( xcur );
+ } else {
+
+ QImage image( iconSize, iconSize, 32 );
+ image.setAlphaBuffer( true );
+
+ Q_UINT32 *data = reinterpret_cast< Q_UINT32* >( image.bits() );
+ for ( int i = 0; i < image.width() * image.height(); i++ )
+ data[ i ] = 0;
+
+ pix.convertFromImage( image );
+ }
+
+ return pix;
+}
+
+
+// vim: set noet ts=4 sw=4:
diff --git a/kcontrol/input/xcursor/themepage.h b/kcontrol/input/xcursor/themepage.h
new file mode 100644
index 000000000..7d4dec675
--- /dev/null
+++ b/kcontrol/input/xcursor/themepage.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2003 Fredrik Hglund <fredrik@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __THEMEPAGE_H
+#define __THEMEPAGE_H
+
+#include <qdict.h>
+
+
+class KListView;
+class QString;
+class PreviewWidget;
+class QStringList;
+class QListViewItem;
+class QPushButton;
+
+struct ThemeInfo;
+
+
+class ThemePage : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ ThemePage( QWidget* parent = 0, const char* name = 0 );
+ ~ThemePage();
+
+ // Called by the KCM
+ void save();
+ void load();
+ void load( bool useDefaults );
+ void defaults();
+
+ signals:
+ void changed( bool );
+
+ private slots:
+ void selectionChanged( QListViewItem * );
+ void installClicked();
+ void removeClicked();
+
+ private:
+ bool installThemes( const QString &file );
+ void insertTheme( const QString & );
+ const QStringList getThemeBaseDirs() const;
+ bool isCursorTheme( const QString &theme, const int depth = 0 ) const;
+ void insertThemes();
+ QPixmap createIcon( const QString &, const QString & ) const;
+
+ KListView *listview;
+ PreviewWidget *preview;
+ QPushButton *installButton, *removeButton;
+ QString selectedTheme;
+ QString currentTheme;
+ QStringList themeDirs;
+ QDict<ThemeInfo> themeInfo;
+};
+
+#endif // __THEMEPAGE_H
+
+// vim: set noet ts=4 sw=4:
diff --git a/kcontrol/ioslaveinfo/Makefile.am b/kcontrol/ioslaveinfo/Makefile.am
new file mode 100644
index 000000000..14150d57c
--- /dev/null
+++ b/kcontrol/ioslaveinfo/Makefile.am
@@ -0,0 +1,21 @@
+kde_module_LTLIBRARIES = kcm_ioslaveinfo.la
+
+kcm_ioslaveinfo_la_SOURCES = kcmioslaveinfo.cpp
+
+kcm_ioslaveinfo_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_ioslaveinfo_la_LIBADD = -lkdeui $(LIB_KIO)
+
+AM_CPPFLAGS= $(all_includes)
+
+METASOURCES = AUTO
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/kcmioslaveinfo.pot
+
+xdg_apps_DATA = ioslaveinfo.desktop
+
+install-data-local: uninstall.desktop
+ $(mkinstalldirs) $(DESTDIR)$(kde_appsdir)/Settings/Information
+
+# $(INSTALL_DATA) $(srcdir)/uninstall.desktop $(DESTDIR)$(kde_appsdir)/Settings/Network/ioslaveinfo.desktop
+
diff --git a/kcontrol/ioslaveinfo/ioslaveinfo.desktop b/kcontrol/ioslaveinfo/ioslaveinfo.desktop
new file mode 100644
index 000000000..a9ece6f71
--- /dev/null
+++ b/kcontrol/ioslaveinfo/ioslaveinfo.desktop
@@ -0,0 +1,237 @@
+[Desktop Entry]
+Comment=Information about the available protocols
+Comment[af]=Informasie aangaande die beskikbaar protokolle
+Comment[ar]=معلومات عن الموافيق المتوفرة
+Comment[az]=Mövcud protokollar haqqında mə'lumat
+Comment[be]=Інфармацыя аб наяўных пратаколах
+Comment[bg]=Информация за поддържаните протоколи
+Comment[bn]=বিভিন্ন প্রোটোকল সম্বন্ধে তথ্য
+Comment[bs]=Informacije o dostupnim protokolima
+Comment[ca]=Informació sobre els protocols disponibles
+Comment[cs]=Informace o dostupných protokolech
+Comment[csb]=Wëdowiédzô ò przistãpnëch protokòłach
+Comment[cy]=Gwybodaeth am y protocolau sydd ar gael
+Comment[da]=Information om de tilgængelige protokoller
+Comment[de]=Information zu den verfügbaren Ein-/Ausgabemodulen
+Comment[el]=Πληροφορίες για τα διαθέσιμα πρωτόκολλα
+Comment[eo]=Informo pri la uzeblaj protokoloj
+Comment[es]=Información sobre los protocolos disponibles
+Comment[et]=Olemasolevate IO moodulite (ioslave) info
+Comment[eu]=Produktu eskuragarriei buruzko informazioa
+Comment[fa]=اطلاعاتی دربارۀ قراردادهای قابل دسترس
+Comment[fi]=Tietoja saatavilla olevista yhteyskäytännöistä
+Comment[fr]=Informations sur les protocoles disponibles
+Comment[fy]=Ynformaasje oer de beskikbere protokollen
+Comment[ga]=Eolas faoi na bprótacail atá ar fáil
+Comment[gl]=Información acerca dos protocolos diponíbeis
+Comment[he]=מידע על הפרוטוקולים הזמינים
+Comment[hi]=उपलब्ध प्रोटोकॉल्स के बारे में जानकारी
+Comment[hr]=Podaci o raspoloživim protokolima
+Comment[hu]=A rendelkezésre álló protokollok jellemzői
+Comment[id]=Informasi tentang protokol yang tersedia
+Comment[is]=Upplýsingar um nothæfar samskiptareglur
+Comment[it]=Informazioni sui protocolli disponibili
+Comment[ja]=利用可能なプロトコルの情報
+Comment[ka]=ინფორმაცია ხელმისაწვდომი პროტოკოების შესახებ
+Comment[kk]=Енгізу-шығару протоколдар туралы мәлімет
+Comment[km]=ព័ត៌មាន​អំពី​ពិធីការ​ដែល​អាច​រក​បាន
+Comment[ko]=사용 가능한 프로토콜 정보
+Comment[lo]=ຂໍ້ມູນກ່ງວກັບໂປຣໂຕຄອນທີ່ມີຢູ່
+Comment[lt]=Informacija apie esamus protokolus
+Comment[lv]=Informācija par pieejamajiem protokoliem
+Comment[mk]=Информации за достапните протоколи
+Comment[mn]=Бэлэн байгаа оролт/гаралтын-модулын мэдээлэл
+Comment[ms]=Maklumat tentang protokol yang boleh didapatkan
+Comment[mt]=Informazzjoni dwar il-protokolli li hawn
+Comment[nb]=Informasjon om de tilgjengelige protokollene
+Comment[nds]=Informatschoon över de verföögboren Protokollen
+Comment[ne]=उपलब्ध प्रोटोकलका बारेमा सूचना
+Comment[nl]=Informatie over de beschikbare protocollen
+Comment[nn]=Informasjon om dei tilgjengelege protokollane
+Comment[nso]=Tshedimoso kaga melao yeo elego gona
+Comment[pa]=ਉਪਲੱਬਧ ਪਰੋਟੋਕਾਲ ਬਾਰੇ ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o dostępnych protokołach
+Comment[pt]=Informações sobre os protocolos disponíveis
+Comment[pt_BR]=Informações sobre os protocolos disponíveis
+Comment[ro]=Informații despre protocoalele disponibile
+Comment[ru]=Сведения о протоколах ввода-вывода
+Comment[rw]=Ibisobanuro birebana na porotokole ziboneka
+Comment[se]=Dieđut olamuttus protokollaid birra
+Comment[sk]=Informácia o dostupných protokoloch
+Comment[sl]=Podatki o razpoložljivih protokolih
+Comment[sr]=Информације о доступним протоколима
+Comment[sr@Latn]=Informacije o dostupnim protokolima
+Comment[sv]=Information om tillgängliga protokoll
+Comment[ta]=கிடைக்கக்கூடிய நெறிமுறைகள் பற்றிய தகவல்
+Comment[tg]=Иттилооти дар мавриди қарордодҳои мавҷуд буда
+Comment[th]=ข้อมูลเกี่ยวกับโปรโตคอลที่มีอยู่
+Comment[tr]=Mevcut protokoller hakkında bilgi
+Comment[tt]=Bar bulğan protokollar turında
+Comment[uk]=Інформація про наявні протоколи
+Comment[uz]=Mavjud protokollar haqida maʼlumot
+Comment[uz@cyrillic]=Мавжуд протоколлар ҳақида маълумот
+Comment[ven]=Mafhungo ngaha purotokolo ire hone
+Comment[vi]=Thông tin về các giao thức có thể dùng
+Comment[wa]=Informåcion so les protocoles k' i gn a
+Comment[xh]=Ulwazi malunga nemithetho elandelwayo ekhoyo
+Comment[zh_CN]=可用协议的信息
+Comment[zh_TW]=可用協定的資訊
+Comment[zu]=Ulwazi mayelana nemithetho elandelwayo ekhona
+DocPath=kinfocenter/protocols/index.html
+Exec=kcmshell ioslaveinfo
+Icon=history
+Keywords=Protocol,IO slaves,Slaves,Network,Information,Timeout
+Keywords[ar]=الميفاق,IO Slaves,Slaves,الشبكة,معلومات نفاذ الوقت
+Keywords[az]=Protokol, IO Kölələri, Kölələr, Şəbəkə,Mə'lumat, Vaxt Dolması
+Keywords[be]=Пратакол,Сетка,Інфармацыя,Тэрмін чакання,Protocol,IO slaves,Slaves,Network,Information,Timeout
+Keywords[bg]=информация, система, системна, протокол, протоколи, наличен, поддържан, Protocol, IO slaves, Slaves, Network, Information, Timeout
+Keywords[ca]=Protocol,esclaus IO,Esclaus,Xarxa,Informació,Temps d'expiració
+Keywords[cs]=Protokol,Vstupně/výstupní moduly,Síť,Informace,Časový limit
+Keywords[csb]=Protokół,procedurë wé/wi,wëkonëjący dzéjaniô wé/wi,Séc,wëdowiédzô,Limit czasu
+Keywords[cy]=Protocol,Gweision IO,Gweision,Rhwydwaith,Gwybodaeth,Goramser
+Keywords[da]=Protokol,IO-slaver,Slaver,Netværk,Information,Tid,Udløb,Timeout
+Keywords[de]=Protokolle,Information,Ein/Ausgabe,Ein-/Ausgabemodule,IO-Slaves,Netzwerk,Zeitlimit,Timeout
+Keywords[el]=Πρωτόκολλο,slaves ΕΕ,Slaves,Δίκτυο,Πληροφορίες,Χρονικό όριο
+Keywords[eo]=Protokolo,Enel-sklavoj,sklavoj,reto,informo,tempolimo
+Keywords[es]=Protocolo,Slaves de E/S,Slaves,Red,Información,Tiempo de expiración
+Keywords[et]=protokoll,IO moodulid,moodulid,võrk,info,taimaut,aegumine
+Keywords[eu]=Protocol,IO morroiak,Morroiak,Sarea,Informazioa,Denbora-muga
+Keywords[fa]=قرارداد، IO slaves، Slaves، شبکه، اطلاعات، اتمام وقت
+Keywords[fi]=Protokolla,Yhteyskäytäntö,KIO,KIO-palvelu,Verkko,Aikavalvonta,aikakatkaisu
+Keywords[fr]=protocole,modules,entrées/sorties,réseau,informations,délai
+Keywords[fy]=protocol,IO slaves,slaves,network,ynformaasje,timeout,netwurk,tiidslimyt
+Keywords[gl]=Protocolo,escravos IO,Escravos,Rede,Información,Tempo de agarda,Timeout
+Keywords[he]=פרוטוקול,עבדי קלט־פלט,רשת,מידע,זמן מוקצב, Protocol,IO slaves,Slaves,Network,Information,Timeout
+Keywords[hi]=प्रोटोकॉल,आईओ स्लैव्स,स्लैव्स,नेटवर्क,जानकारी,टाइमआउट
+Keywords[hr]=Protocol,IO slaves,Slaves,Network,Information,Timeout,Protokol,IO podčinjeni,Podčinjeni,Mreža,Podaci,Istek
+Keywords[hu]=protokoll,KDE protokollok,protokoll,hálózat,információ,időtúllépés
+Keywords[is]=Samskiptareglur,IO þrælar,þrælar,staðarnet,net,upplýsingar,útrunninn tími
+Keywords[it]=protocollo,IO slave,slave,rete,informazioni,tempo massimo
+Keywords[ja]=プロトコル,IO,スレイブ,スレーブ,ネットワーク,情報,タイムアウト
+Keywords[km]=ពិធីការ,IO កូនចៅ,កូនចៅ,បណ្ដាញ,ព័ត៌មាន,អស់​ពេល
+Keywords[lo]=ໂປຣໂຕຄອນ,IO slaves,Slaves,ລະບົບເຄືອຂ່າຍ,ຂໍ້ມູນ,ຫມົດເວລາ
+Keywords[lt]=Protocol,IO slaves,Slaves,Network,Information,Timeout,protokolas,tinklas,informacija,laiko pasibaigimas
+Keywords[lv]=Protokols,IO vergi,Vergi,Tīkls,Informācija,Noildze
+Keywords[mk]=Protocol,IO slaves,Slaves,Network,Information,Timeout,Протокол,Мрежа,Информации,Истек на време
+Keywords[mn]=Протокол,Мэдээлэл,Оролт/Гаралт,IO-Slaves,Сүлжээ, Хугацааны хязгаар,Хугацаа хэтрэлт
+Keywords[nb]=Protokoll,IO-slaver,Slaver,Nettverk,Informasjon,Ventetid
+Keywords[nds]=Protokoll,In-/Utgaavdeensten,IO,Deensten,Nettwark,Informatschoon,Timeout,Tietgrenz
+Keywords[ne]=प्रोटोकल, IO स्लेभ, स्लेभहरू, सञ्जाल, सूचना, समय समाप्त
+Keywords[nl]=protocol,IO slaves,slaves,network,informatie,timeout,netwerk,tijdslimiet
+Keywords[nn]=protokoll,IU-slavar,slavar,nettverk,informasjon,tidsgrense
+Keywords[nso]=Molao,Makgoba a IO,Makgoba,Kgokagano,Tshedimoso, Nako e fedile
+Keywords[pa]=Protocol,IO slaves,Slaves,Network,Information,Timeout,ਪਰੋਟੋਕਾਲ,ਨੈਟਵਰਕ
+Keywords[pl]=Protokół,procedury we/wy,wykonujący operacje we/wy,Sieć,Informacje,Limit czasu
+Keywords[pt]=Protocolo,IO slaves,Slaves,Rede,Informações,Timeout,Tempo-limite
+Keywords[pt_BR]=Protocolos,escravos de ES,Escravos,Rede,Informações,Timeout
+Keywords[ro]=samba,dispozitive I/O,sclavi,rețea,informații
+Keywords[rw]=Porotokole,Abagaragu IO,Abagaragu,Urusobemiyoboro,Amakuru, Igihecyarenze
+Keywords[se]=protokolla,SO-slávat,slávat,fierbmi,diehtu,dieđut,áigemearri
+Keywords[sk]=Protokol,Klienti IO,klienti,Sieť,Informácie
+Keywords[sl]=protokol,podrejeni V/I,podrejeni,omrežje,podatki,zakasnitev
+Keywords[sr]=Protocol,IO slaves,Slaves,Network,Information,Timeout,протокол,мрежа,информације,прекорачење времена
+Keywords[sr@Latn]=Protocol,IO slaves,Slaves,Network,Information,Timeout,protokol,mreža,informacije,prekoračenje vremena
+Keywords[sv]=Protokoll,I/O-slavar,Slavar,Nätverk,Information,Timeout,Tidsgräns
+Keywords[ta]=நெறிமுறை,IO சேவகன்,சேவகன்கள்,வலைப்பின்னல்,தகவல்,நேரம் முடிந்தது
+Keywords[th]=โปรโตคอล,IO slaves,Slaves,ระบบเครือข่าย,ข้อมูล,หมดเวลา
+Keywords[tr]=protokol,G/Ç aracısı,aracı,Ağ,Bilgi,zaman aşımı
+Keywords[uk]=протокол,підлеглі В/В,підлеглі,мережа,інформація,тайм-аут
+Keywords[uz]=Protokol,KCH-sleyvlar,Sleyvlar,Tarmoq,Maʼlumot,Taymaut
+Keywords[uz@cyrillic]=Протокол,КЧ-слейвлар,Слейвлар,Тармоқ,Маълумот,Таймаут
+Keywords[ven]=Purotokolo,dziphuli dza IO,Dziphuli,Vhudavhidzani,mafhungo,u fhela ha tshifhinga
+Keywords[vi]=Giao thức,Đầy tớ Vào ra (VR),Đầy tớ,Mạng,Thông tin,Hạn định thời gian
+Keywords[wa]=Protocole,IO slaves,Slaves,rantoele,Informåcion,Timeout
+Keywords[xh]=Imithetho elandelwayo,IO izicaka,Izicaka,Umsebenzi womtya,Ulwazi, Ixesha lokuphuma
+Keywords[zh_CN]=Protocol,IO slaves,Slaves,Network,Information,Timeout,协议,网络,信息,超时
+Keywords[zh_TW]=Protocol,IO slaves,Slaves,Network,Information,Timeout,協定,網路,資訊,作業逾時
+Keywords[zu]=Umthetho olandelwayo,IO slaves,Izigqila,Uxhumano olusakazekile, Ulwazi,Isikhathi sokuphuma
+Name=Protocols
+Name[af]=Protokolle
+Name[ar]=الموافيق
+Name[az]=Protokollar
+Name[be]=Пратаколы
+Name[bg]=Протоколи
+Name[bn]=প্রোটোকল
+Name[br]=Komenadoù
+Name[bs]=Protokoli
+Name[cs]=Protokoly
+Name[csb]=Protokòłë
+Name[cy]=Protocolau
+Name[da]=Protokoller
+Name[de]=Ein-/Ausgabemodule
+Name[el]=Πρωτόκολλα
+Name[eo]=Protokoloj
+Name[es]=Protocolos
+Name[et]=IO moodulid
+Name[eu]=Protokoloak
+Name[fa]=قراردادها
+Name[fi]=Yhteyskäytännöt
+Name[fr]=Protocoles
+Name[fy]=Protokollen
+Name[ga]=Prótacail
+Name[gl]=Protocolos
+Name[he]=פרוטוקולים
+Name[hi]=प्रोटोकॉल्स
+Name[hr]=Protokoli
+Name[hu]=Protokollok
+Name[id]=Protokol
+Name[is]=Samskiptareglur
+Name[it]=Protocolli
+Name[ja]=プロトコル
+Name[ka]=პროტოკოლები
+Name[kk]=Протоколдар
+Name[km]=ពិធីការ
+Name[ko]=프로토콜
+Name[lo]=ໂປຣໂຕຄອລ
+Name[lt]=Protokolai
+Name[lv]=Protokoli
+Name[mk]=Протоколи
+Name[mn]=Оролт/Гаралт-модул
+Name[ms]=Protokol
+Name[mt]=Protokolli
+Name[nb]=Protokoller
+Name[nds]=Protokollen
+Name[ne]=प्रोटोकल
+Name[nl]=Protocollen
+Name[nn]=Protokollar
+Name[nso]=Melao
+Name[pa]=ਪਰੋਟੋਕਾਲ
+Name[pl]=Protokoły
+Name[pt]=Protocolos
+Name[pt_BR]=Protocolos
+Name[ro]=Protocoale
+Name[ru]=Протоколы
+Name[rw]=Amaporotocole
+Name[se]=Protokollat
+Name[sk]=Protokoly
+Name[sl]=Protokoli
+Name[sr]=Протоколи
+Name[sr@Latn]=Protokoli
+Name[ss]=Imitsetfo yekutfumela
+Name[sv]=Protokoll
+Name[ta]=நெறிமுறைகள்
+Name[te]=ప్రొటొకాల్లు
+Name[tg]=Қарордодҳо
+Name[th]=โปรโตคอล
+Name[tr]=Protokoller
+Name[tt]=Protokollar
+Name[uk]=Протоколи
+Name[uz]=Protokollar
+Name[uz@cyrillic]=Протоколлар
+Name[ven]=Purotokolo
+Name[vi]=Giao thức
+Name[wa]=Protocoles
+Name[xh]=Umthetho olandelwayo
+Name[zh_CN]=协议
+Name[zh_TW]=協定
+Name[zu]=Imithetho elandelwayo
+SwallowExec=
+SwallowTitle=
+Terminal=false
+Type=Application
+X-KDE-FactoryName=ioslaveinfo
+X-KDE-Library=ioslaveinfo
+
+X-KDE-ParentApp=kinfocenter
+
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/ioslaveinfo/kcmioslaveinfo.cpp b/kcontrol/ioslaveinfo/kcmioslaveinfo.cpp
new file mode 100644
index 000000000..cb4cfdaea
--- /dev/null
+++ b/kcontrol/ioslaveinfo/kcmioslaveinfo.cpp
@@ -0,0 +1,148 @@
+/*
+ * kcmioslaveinfo.cpp
+ *
+ * Copyright 2001 Alexander Neundorf <neundorf@kde.org>
+ * Copyright 2001 George Staikos <staikos@kde.org>
+ *
+ * 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 <qfile.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qspinbox.h>
+#include <qtabwidget.h>
+#include <qtextcodec.h>
+#include <qvbox.h>
+#include <qwhatsthis.h>
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kgenericfactory.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kio/job.h>
+#include <klocale.h>
+#include <kprotocolinfo.h>
+#include <kstandarddirs.h>
+
+#include "kcmioslaveinfo.h"
+
+typedef KGenericFactory<KCMIOSlaveInfo, QWidget> SlaveFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_ioslaveinfo, SlaveFactory("kcmioslaveinfo") )
+
+KCMIOSlaveInfo::KCMIOSlaveInfo(QWidget *parent, const char *name, const QStringList &)
+ :KCModule(SlaveFactory::instance(), parent,name),m_ioslavesLb(0),m_tfj(0)
+{
+ QVBoxLayout *layout=new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ setQuickHelp( i18n("<h1>IO slaves</h1> Gives you an overview of the installed ioslaves."));
+ setButtons( KCModule::Help );
+
+ QLabel* label=new QLabel(i18n("Available IO slaves:"),this);
+ QHBox *hbox=new QHBox(this);
+ m_ioslavesLb=new KListBox(hbox);
+ m_ioslavesLb->setMinimumSize(fontMetrics().width("blahfaselwhatever----"),10);
+ connect( m_ioslavesLb, SIGNAL( selectionChanged( QListBoxItem * ) ), SLOT( showInfo( QListBoxItem * ) ) );
+ //TODO make something useful after 2.1 is released
+ m_info=new KTextBrowser(hbox);
+ hbox->setSpacing(KDialog::spacingHint());
+
+ layout->addWidget(label);
+ layout->addWidget(hbox);
+ hbox->setStretchFactor(m_ioslavesLb,1);
+ hbox->setStretchFactor(m_info,5);
+
+ QStringList protocols=KProtocolInfo::protocols();
+ for (QStringList::Iterator it=protocols.begin(); it!=protocols.end(); ++it)
+ {
+ QString proto = *it;
+ m_ioslavesLb->insertItem( SmallIcon( KProtocolInfo::icon( proto )),
+ proto );
+ };
+ m_ioslavesLb->sort();
+ m_ioslavesLb->setSelected(0, true);
+
+ setButtons(KCModule::Help);
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmioslaveinfo"),
+ I18N_NOOP("KDE Panel System Information Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2001 - 2002 Alexander Neundorf"));
+
+ about->addAuthor("Alexander Neundorf", 0, "neundorf@kde.org");
+ about->addAuthor("George Staikos", 0, "staikos@kde.org");
+ setAboutData( about );
+
+}
+
+void KCMIOSlaveInfo::slaveHelp( KIO::Job *, const QByteArray &data)
+{
+ if ( data.size() == 0 ) { // EOF
+ int index = helpData.find( "<meta http-equiv=\"Content-Type\"" );
+ index = helpData.find( "charset=", index ) + 8;
+ QString charset = helpData.mid( index, helpData.find( '\"', index ) - index );
+ QString text = QTextCodec::codecForName(charset.latin1())->toUnicode( helpData );
+ index = text.find( "<div class=\"titlepage\">" );
+ text = text.mid( index );
+ index = text.find( "<table width=\"100%\" class=\"bottom-nav\"" );
+ text = text.left( index );
+ m_info->setText(text);
+ return;
+ }
+ helpData += data;
+}
+
+void KCMIOSlaveInfo::slotResult(KIO::Job *)
+{
+ m_tfj = 0;
+}
+
+void KCMIOSlaveInfo::showInfo(const QString& protocol)
+{
+ QString file = QString("kioslave/%1.docbook").arg( protocol );
+ file = KGlobal::locale()->langLookup( file );
+ if (m_tfj)
+ {
+ m_tfj->kill();
+ m_tfj = 0;
+ }
+
+ if (!file.isEmpty())
+ {
+ helpData.truncate( 0 );
+ m_tfj = KIO::get( KURL( QString("help:/kioslave/%1.html").arg( protocol ) ), true, false );
+ connect( m_tfj, SIGNAL( data( KIO::Job *, const QByteArray &) ), SLOT( slaveHelp( KIO::Job *, const QByteArray &) ) );
+ connect( m_tfj, SIGNAL( result( KIO::Job * ) ), SLOT( slotResult( KIO::Job * ) ) );
+ return;
+ }
+ m_info->setText(i18n("Some info about protocol %1:/ ...").arg(protocol));
+}
+
+void KCMIOSlaveInfo::showInfo(QListBoxItem *item)
+{
+ if (item==0)
+ return;
+ showInfo( item->text() );
+}
+
+#include "kcmioslaveinfo.moc"
+
diff --git a/kcontrol/ioslaveinfo/kcmioslaveinfo.h b/kcontrol/ioslaveinfo/kcmioslaveinfo.h
new file mode 100644
index 000000000..87eda14b4
--- /dev/null
+++ b/kcontrol/ioslaveinfo/kcmioslaveinfo.h
@@ -0,0 +1,61 @@
+/*
+ * kcmioslaveinfo.h
+ *
+ * Copyright 2001 Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>
+ * Copyright 2001 George Staikos <staikos@kde.org>
+ *
+ * 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.
+ */
+#ifndef kcmioslaveinfo_h_included
+#define kcmioslaveinfo_h_included
+
+#include <qlistbox.h>
+#include <qstring.h>
+
+#include <kaboutdata.h>
+#include <kcmodule.h>
+#include <kio/job.h>
+#include <klistbox.h>
+#include <ktextbrowser.h>
+
+class KIOTimeoutControl;
+class QTabWidget;
+class QSpinBox;
+class KConfig;
+
+class KCMIOSlaveInfo : public KCModule
+{
+ Q_OBJECT
+public:
+ KCMIOSlaveInfo(QWidget *parent = 0L, const char *name = 0L, const QStringList &lits=QStringList() );
+
+protected:
+ KListBox *m_ioslavesLb;
+ KTextBrowser *m_info;
+ QCString helpData;
+ KIO::Job *m_tfj;
+
+protected slots:
+
+ void showInfo(const QString& protocol);
+ void showInfo(QListBoxItem *item);
+ void slaveHelp( KIO::Job *, const QByteArray &data);
+ void slotResult( KIO::Job * );
+
+};
+#endif
diff --git a/kcontrol/ioslaveinfo/uninstall.desktop b/kcontrol/ioslaveinfo/uninstall.desktop
new file mode 100644
index 000000000..e1e3e1732
--- /dev/null
+++ b/kcontrol/ioslaveinfo/uninstall.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
diff --git a/kcontrol/joystick/Makefile.am b/kcontrol/joystick/Makefile.am
new file mode 100644
index 000000000..269dec101
--- /dev/null
+++ b/kcontrol/joystick/Makefile.am
@@ -0,0 +1,17 @@
+AM_CPPFLAGS = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = kcm_joystick.la
+
+kcm_joystick_la_SOURCES = joystick.cpp joywidget.cpp poswidget.cpp joydevice.cpp caldialog.cpp
+kcm_joystick_la_LIBADD = $(LIB_KDEUI)
+kcm_joystick_la_LDFLAGS = -module -avoid-version $(all_libraries) -no-undefined
+
+xdg_apps_DATA = joystick.desktop
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/joystick.pot
+
+noinst_HEADERS = joywidget.h joywidget.h poswidget.h joydevice.h caldialog.h
+
diff --git a/kcontrol/joystick/caldialog.cpp b/kcontrol/joystick/caldialog.cpp
new file mode 100644
index 000000000..f8340d03c
--- /dev/null
+++ b/kcontrol/joystick/caldialog.cpp
@@ -0,0 +1,193 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Martin Koller *
+ * m.koller@surfeu.at *
+ * This file is part of the KDE Control Center Module for Joysticks *
+ * *
+ * 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 "caldialog.h"
+#include "joydevice.h"
+
+#include <qlabel.h>
+#include <qtimer.h>
+#include <qapplication.h>
+#include <qvbox.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+
+//--------------------------------------------------------------
+
+CalDialog::CalDialog(QWidget *parent, JoyDevice *joy)
+ : KDialogBase(parent, "calibrateDialog", true,
+ i18n("Calibration"),
+ KDialogBase::Cancel|KDialogBase::User1, KDialogBase::User1, true, KGuiItem(i18n("Next"))),
+ joydev(joy)
+{
+ QVBox *main = makeVBoxMainWidget();
+
+ text = new QLabel(main);
+ text->setMinimumHeight(200);
+ valueLbl = new QLabel(main);
+}
+
+//--------------------------------------------------------------
+
+void CalDialog::calibrate()
+{
+ text->setText(i18n("Please wait a moment to calculate the precision"));
+ setResult(-1);
+ show();
+
+ // calibrate precision (which min,max delivers the joystick in its center position)
+ // get values through the normal idle procedure
+ QTimer ti;
+ ti.start(2000, true); // single shot in 2 seconds
+
+ // normally I'd like to hide the 'Next' button in this step,
+ // but it does not work - which means: in the steps after the first,
+ // the 'Next' button does not have the focus (to be the default button)
+
+ do
+ {
+ qApp->processEvents(2000);
+ }
+ while ( ti.isActive() && (result() != QDialog::Rejected) );
+
+ if ( result() == QDialog::Rejected ) return; // user cancelled the dialog
+
+ joydev->calcPrecision();
+
+ int i, lastVal;
+ int min[2], center[2], max[2];
+ QString hint;
+
+ for (i = 0; i < joydev->numAxes(); i++)
+ {
+ if ( i == 0 )
+ hint = i18n("(usually X)");
+ else if ( i == 1 )
+ hint = i18n("(usually Y)");
+ else
+ hint = "";
+
+ // minimum position
+ text->setText(i18n("<qt>Calibration is about to check the value range your device delivers.<br><br>"
+ "Please move <b>axis %1 %2</b> on your device to the <b>minimum</b> position.<br><br>"
+ "Press any button on the device or click on the 'Next' button "
+ "to continue with the next step.</qt>").arg(i+1).arg(hint));
+ waitButton(i, true, lastVal);
+
+ if ( result() == QDialog::Rejected ) return; // user cancelled the dialog
+
+ joydev->resetMinMax(i, lastVal);
+ if ( result() != -2 ) waitButton(i, false, lastVal);
+
+ if ( result() == QDialog::Rejected ) return; // user cancelled the dialog
+
+ min[0] = joydev->axisMin(i);
+ min[1] = joydev->axisMax(i);
+
+ // center position
+ text->setText(i18n("<qt>Calibration is about to check the value range your device delivers.<br><br>"
+ "Please move <b>axis %1 %2</b> on your device to the <b>center</b> position.<br><br>"
+ "Press any button on the device or click on the 'Next' button "
+ "to continue with the next step.</qt>").arg(i+1).arg(hint));
+ waitButton(i, true, lastVal);
+
+ if ( result() == QDialog::Rejected ) return; // user cancelled the dialog
+
+ joydev->resetMinMax(i, lastVal);
+ if ( result() != -2 ) waitButton(i, false, lastVal);
+
+ if ( result() == QDialog::Rejected ) return; // user cancelled the dialog
+
+ center[0] = joydev->axisMin(i);
+ center[1] = joydev->axisMax(i);
+
+ // maximum position
+ text->setText(i18n("<qt>Calibration is about to check the value range your device delivers.<br><br>"
+ "Please move <b>axis %1 %2</b> on your device to the <b>maximum</b> position.<br><br>"
+ "Press any button on the device or click on the 'Next' button "
+ "to continue with the next step.</qt>").arg(i+1).arg(hint));
+ waitButton(i, true, lastVal);
+
+ if ( result() == QDialog::Rejected ) return; // user cancelled the dialog
+
+ joydev->resetMinMax(i, lastVal);
+ if ( result() != -2 ) waitButton(i, false, lastVal);
+
+ if ( result() == QDialog::Rejected ) return; // user cancelled the dialog
+
+ max[0] = joydev->axisMin(i);
+ max[1] = joydev->axisMax(i);
+
+ joydev->calcCorrection(i, min, center, max);
+ }
+
+ JoyDevice::ErrorCode ret = joydev->applyCalibration();
+
+ if ( ret != JoyDevice::SUCCESS )
+ {
+ KMessageBox::error(this, joydev->errText(ret), i18n("Communication Error"));
+ reject();
+ }
+
+ KMessageBox::information(this, i18n("You have successfully calibrated your device"), i18n("Calibration Success"));
+ accept();
+}
+
+//--------------------------------------------------------------
+
+void CalDialog::waitButton(int axis, bool press, int &lastVal)
+{
+ JoyDevice::EventType type;
+ int number, value;
+ bool button = false;
+ lastVal = 0;
+
+ setResult(-1);
+ // loop until the user presses a button on the device or on the dialog
+ do
+ {
+ qApp->processEvents(100);
+
+ if ( joydev->getEvent(type, number, value) )
+ {
+ button = ( (type == JoyDevice::BUTTON) && (press ? (value == 1) : (value == 0)) );
+
+ if ( (type == JoyDevice::AXIS) && (number == axis) )
+ valueLbl->setText(i18n("Value Axis %1: %2").arg(axis+1).arg(lastVal = value));
+ }
+ }
+ while ( !button && (result() == -1) );
+}
+
+//--------------------------------------------------------------
+// Next button
+
+void CalDialog::slotUser1()
+{
+ setResult(-2);
+}
+
+//--------------------------------------------------------------
+
+#include "caldialog.moc"
+
+//--------------------------------------------------------------
diff --git a/kcontrol/joystick/caldialog.h b/kcontrol/joystick/caldialog.h
new file mode 100644
index 000000000..678a0a2d1
--- /dev/null
+++ b/kcontrol/joystick/caldialog.h
@@ -0,0 +1,54 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Martin Koller *
+ * m.koller@surfeu.at *
+ * This file is part of the KDE Control Center Module for Joysticks *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#ifndef _CALDIALOG_H_
+#define _CALDIALOG_H_
+
+#include <kdialogbase.h>
+
+class QLabel;
+
+class JoyDevice;
+
+// the dialog which tells the user all steps to calibrate the device
+
+class CalDialog : public KDialogBase
+{
+ Q_OBJECT
+
+ public:
+ CalDialog(QWidget *parent, JoyDevice *joy);
+
+ void calibrate();
+
+ private:
+ void waitButton(int axis, bool press, int &lastVal);
+
+ private slots:
+ virtual void slotUser1();
+
+ private:
+ JoyDevice *joydev;
+
+ QLabel *text;
+ QLabel *valueLbl;
+};
+
+#endif
diff --git a/kcontrol/joystick/configure.in.in b/kcontrol/joystick/configure.in.in
new file mode 100644
index 000000000..a76ab434a
--- /dev/null
+++ b/kcontrol/joystick/configure.in.in
@@ -0,0 +1,7 @@
+case "$host" in
+ *-*-linux*)
+ FOUND_LINUX=yes
+ ;;
+esac
+
+AM_CONDITIONAL(include_kcontrol_joystick, test "$FOUND_LINUX" = "yes")
diff --git a/kcontrol/joystick/joydevice.cpp b/kcontrol/joystick/joydevice.cpp
new file mode 100644
index 000000000..2c1a16ce7
--- /dev/null
+++ b/kcontrol/joystick/joydevice.cpp
@@ -0,0 +1,397 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Martin Koller *
+ * m.koller@surfeu.at *
+ * This file is part of the KDE Control Center Module for Joysticks *
+ * *
+ * 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 "joydevice.h"
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/select.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <math.h>
+
+//--------------------------------------------------------------
+
+JoyDevice::JoyDevice(const QString &devicefile)
+ : devName(devicefile), joyFd(-1), buttons(0), axes(0),
+ amin(0), amax(0), corr(0), origCorr(0)
+{
+}
+
+//--------------------------------------------------------------
+
+QString JoyDevice::errText(ErrorCode code) const
+{
+ switch ( code )
+ {
+ case SUCCESS: return "";
+
+ case OPEN_FAILED:
+ {
+ return i18n("The given device %1 could not be opened: %2")
+ .arg(devName).arg(strerror(errno));
+ }
+
+ case NO_JOYSTICK:
+ {
+ return i18n("The given device %1 is not a joystick.").arg(devName);
+ }
+
+ case ERR_GET_VERSION:
+ {
+ return i18n("Could not get kernel driver version for joystick device %1: %2")
+ .arg(devName).arg(strerror(errno));
+ }
+
+ case WRONG_VERSION:
+ {
+ int version = 0;
+ int fd = ::open(devName.latin1(), O_RDONLY);
+ if ( fd != -1 )
+ {
+ ::ioctl(fd, JSIOCGVERSION, &version);
+ ::close(fd);
+ }
+
+ return i18n("The current running kernel driver version (%1.%2.%3) is not the one this module was compiled for (%4.%5.%6).")
+ .arg(version >> 16).arg((version >> 8) & 0xFF).arg(version & 0xFF)
+ .arg(JS_VERSION >> 16).arg((JS_VERSION >> 8) & 0xFF).arg(JS_VERSION & 0xFF);
+ }
+
+ case ERR_GET_BUTTONS:
+ {
+ return i18n("Could not get number of buttons for joystick device %1: %2")
+ .arg(devName).arg(strerror(errno));
+ }
+
+ case ERR_GET_AXES:
+ {
+ return i18n("Could not get number of axes for joystick device %1: %2")
+ .arg(devName).arg(strerror(errno));
+ }
+
+ case ERR_GET_CORR:
+ {
+ return i18n("Could not get calibration values for joystick device %1: %2")
+ .arg(devName).arg(strerror(errno));
+ }
+
+ case ERR_RESTORE_CORR:
+ {
+ return i18n("Could not restore calibration values for joystick device %1: %2")
+ .arg(devName).arg(strerror(errno));
+ }
+
+ case ERR_INIT_CAL:
+ {
+ return i18n("Could not initialize calibration values for joystick device %1: %2")
+ .arg(devName).arg(strerror(errno));
+ }
+
+ case ERR_APPLY_CAL:
+ {
+ return i18n("Could not apply calibration values for joystick device %1: %2")
+ .arg(devName).arg(strerror(errno));
+ }
+
+ default: return i18n("internal error - code %1 unknown").arg(int(code));
+ }
+}
+
+//--------------------------------------------------------------
+
+JoyDevice::ErrorCode JoyDevice::open()
+{
+ if ( joyFd != -1 ) return JoyDevice::SUCCESS; // already open
+
+ int fd = ::open(devName.latin1(), O_RDONLY);
+
+ if ( fd == -1 )
+ return JoyDevice::OPEN_FAILED;
+
+ // we could open the devicefile, now check if a joystick is attached
+ char name[128];
+
+ if ( ::ioctl(fd, JSIOCGNAME(sizeof(name)), &name) == -1 )
+ {
+ ::close(fd);
+ return JoyDevice::NO_JOYSTICK;
+ }
+
+ // check the kernel driver version
+ int version;
+ if ( ::ioctl(fd, JSIOCGVERSION, &version) == -1 )
+ {
+ ::close(fd);
+ return JoyDevice::ERR_GET_VERSION;
+ }
+
+ if ( version != JS_VERSION )
+ {
+ ::close(fd);
+ return JoyDevice::WRONG_VERSION;
+ }
+
+ char bt = 0, ax = 0;
+ if ( ::ioctl(fd, JSIOCGBUTTONS, &bt) == -1 )
+ {
+ ::close(fd);
+ return JoyDevice::ERR_GET_BUTTONS;
+ }
+
+ if ( ::ioctl(fd, JSIOCGAXES, &ax) == -1 )
+ {
+ ::close(fd);
+ return JoyDevice::ERR_GET_AXES;
+ }
+
+ struct js_corr *oldCorr = new struct js_corr[ax];
+
+ if ( ::ioctl(fd, JSIOCGCORR, oldCorr) == -1 )
+ {
+ ::close(fd);
+ delete [] oldCorr;
+ return JoyDevice::ERR_GET_CORR;
+ }
+
+ descr = name;
+ joyFd = fd;
+ axes = ax;
+ buttons = bt;
+ origCorr = oldCorr;
+ corr = new struct js_corr[axes];
+
+ amin = new int[axes];
+ amax = new int[axes];
+
+ int i;
+
+ for (i = 0; i < axes; i++)
+ resetMinMax(i);
+
+ return JoyDevice::SUCCESS;
+}
+
+//--------------------------------------------------------------
+
+void JoyDevice::close()
+{
+ if ( joyFd == -1 ) return;
+
+ ::close(joyFd);
+
+ joyFd = -1;
+ descr = "";
+
+ delete [] amin;
+ delete [] amax;
+ amin = 0;
+ amax = 0;
+
+ delete [] corr;
+ corr = 0;
+ delete [] origCorr;
+ origCorr = 0;
+}
+
+//--------------------------------------------------------------
+
+int JoyDevice::axisMin(int axis) const
+{
+ if ( (axis < 0) || (axis >= axes) ) return 0;
+
+ return amin[axis];
+}
+
+//--------------------------------------------------------------
+
+int JoyDevice::axisMax(int axis) const
+{
+ if ( (axis < 0) || (axis >= axes) ) return 0;
+
+ return amax[axis];
+}
+
+//--------------------------------------------------------------
+
+JoyDevice::ErrorCode JoyDevice::initCalibration()
+{
+ if ( joyFd == -1 ) return JoyDevice::ERR_INIT_CAL;
+
+ int i;
+
+ // Reset all current correction values
+ for (i = 0; i < axes; i++)
+ {
+ corr[i].type = JS_CORR_NONE;
+ corr[i].prec = 0;
+ }
+
+ if ( ::ioctl(joyFd, JSIOCSCORR, corr) == -1 )
+ return JoyDevice::ERR_INIT_CAL;
+
+ for (i = 0; i < axes; i++)
+ corr[i].type = JS_CORR_BROKEN;
+
+ return JoyDevice::SUCCESS;
+}
+
+//--------------------------------------------------------------
+
+JoyDevice::ErrorCode JoyDevice::applyCalibration()
+{
+ if ( joyFd == -1 ) return JoyDevice::ERR_APPLY_CAL;
+
+ if ( ::ioctl(joyFd, JSIOCSCORR, corr) == -1 )
+ return JoyDevice::ERR_APPLY_CAL;
+
+ return JoyDevice::SUCCESS;
+}
+
+//--------------------------------------------------------------
+
+void JoyDevice::resetMinMax(int axis, int value)
+{
+ amin[axis] = value;
+ amax[axis] = value;
+}
+
+//--------------------------------------------------------------
+
+void JoyDevice::calcPrecision()
+{
+ if ( !corr ) return;
+
+ int i;
+
+ for (i = 0; i < axes; i++)
+ {
+ corr[i].prec = amax[i] - amin[i];
+ kdDebug() << "Precision for axis: " << i << ": " << corr[i].prec << endl;
+ }
+}
+
+//--------------------------------------------------------------
+
+JoyDevice::ErrorCode JoyDevice::restoreCorr()
+{
+ if ( joyFd == -1 ) return JoyDevice::SUCCESS;
+
+ if ( ::ioctl(joyFd, JSIOCSCORR, origCorr) == -1 )
+ return JoyDevice::ERR_RESTORE_CORR;
+ else
+ return JoyDevice::SUCCESS;
+}
+
+//--------------------------------------------------------------
+
+JoyDevice::~JoyDevice()
+{
+ close();
+}
+
+//--------------------------------------------------------------
+
+bool JoyDevice::getEvent(JoyDevice::EventType &type, int &number, int &value)
+{
+ number = value = 0;
+
+ int ret;
+
+ fd_set readSet;
+
+ FD_ZERO(&readSet);
+ FD_SET(joyFd, &readSet);
+
+ struct timeval timeout;
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 100000;
+
+ ret = ::select(joyFd + 1, &readSet, 0, 0, &timeout);
+
+ if ( ret == 1 ) // got an event from the joystick
+ {
+ struct js_event e;
+
+ if ( ::read(joyFd, &e, sizeof(struct js_event)) == sizeof(struct js_event) )
+ {
+ if ( e.type & JS_EVENT_BUTTON )
+ {
+ type = JoyDevice::BUTTON;
+ value = e.value;
+ number = e.number;
+
+ return true;
+ }
+
+ if ( e.type & JS_EVENT_AXIS )
+ {
+ type = JoyDevice::AXIS;
+ value = e.value;
+ number = e.number;
+
+ // store min, max values
+ if ( e.value < amin[number] ) amin[number] = e.value;
+ if ( e.value > amax[number] ) amax[number] = e.value;
+
+ return true;
+ }
+ }
+ }
+
+ return false; // no event
+}
+
+//--------------------------------------------------------------
+
+void JoyDevice::calcCorrection(int axis, int *min, int *center, int *max)
+{
+ const int MIN = 0;
+ const int MAX = 1;
+
+ double a, b, c, d;
+
+ a = center[MIN]; // inputs.cmin[1];
+ b = center[MAX]; // inputs.cmax[1];
+ c = 32767.0 / (center[MIN] - min[MAX]); // (inputs.cmin[1] - inputs.cmax[0]);
+ d = 32767.0 / (max[MIN] - center[MAX]); // (inputs.cmin[2] - inputs.cmax[1]);
+
+ corr[axis].coef[0] = (int)rint(a);
+ corr[axis].coef[1] = (int)rint(b);
+ corr[axis].coef[2] = (int)rint(c*16384.0);
+ corr[axis].coef[3] = (int)rint(d*16384.0);
+
+ kdDebug() << "min min: " << min[0] << " max: " << min[1] << endl;
+ kdDebug() << "max min: " << max[0] << " max: " << max[1] << endl;
+ kdDebug() << "Correction values for axis: " << axis << ": "
+ << corr[axis].coef[0] << ", "
+ << corr[axis].coef[1] << ", "
+ << corr[axis].coef[2] << ", "
+ << corr[axis].coef[3] << endl;
+}
+
+//--------------------------------------------------------------
diff --git a/kcontrol/joystick/joydevice.h b/kcontrol/joystick/joydevice.h
new file mode 100644
index 000000000..b84464241
--- /dev/null
+++ b/kcontrol/joystick/joydevice.h
@@ -0,0 +1,110 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Martin Koller *
+ * m.koller@surfeu.at *
+ * This file is part of the KDE Control Center Module for Joysticks *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#ifndef _JOYDEVICE_H_
+#define _JOYDEVICE_H_
+
+#include <qstring.h>
+
+#include <sys/types.h>
+#undef __STRICT_ANSI__
+#include <linux/joystick.h>
+#define __STRICT_ANSI__
+
+// helper class which holds all current values, file descriptor, etc. for
+// one device
+class JoyDevice
+{
+ public:
+ enum ErrorCode
+ {
+ SUCCESS,
+ OPEN_FAILED,
+ NO_JOYSTICK,
+ WRONG_VERSION,
+ ERR_GET_VERSION,
+ ERR_GET_BUTTONS,
+ ERR_GET_AXES,
+ ERR_GET_CORR,
+ ERR_RESTORE_CORR,
+ ERR_INIT_CAL,
+ ERR_APPLY_CAL
+ };
+
+ enum EventType
+ {
+ BUTTON,
+ AXIS
+ };
+
+ // devicefile to use, e.g. "/dev/js0"
+ JoyDevice(const QString &devicefile);
+ ~JoyDevice();
+
+ // returns one of the error-codes from above
+ ErrorCode open();
+
+ // return descriptive error text for given error code
+ QString errText(ErrorCode code) const;
+
+ int fd() const { return joyFd; }
+ void close();
+ ErrorCode restoreCorr();
+
+ // return devicefilename from constructor
+ const QString &device() const { return devName; }
+
+ // descriptive text for this device read from the driver
+ QString text() const { return descr; }
+
+ int numButtons() const { return buttons; }
+ int numAxes() const { return axes; }
+ int axisMin(int axis) const;
+ int axisMax(int axis) const;
+
+ // read next event from device; returns true if there was an event during the short timeout
+ bool getEvent(JoyDevice::EventType &type, int &number, int &value);
+
+ // methods for calibration
+ ErrorCode initCalibration(); // must be called first
+ void calcPrecision();
+
+ void resetMinMax(int axis, int value = 0);
+
+ // calculate correction values
+ // min[2], center[2], max[2], index 0 == minimum, index 1 == maximum
+ void calcCorrection(int axis, int *min, int *center, int *max);
+ ErrorCode applyCalibration();
+
+ private:
+ QString devName; // device filename
+ QString descr; // descriptive text
+ int joyFd;
+
+ int buttons;
+ int axes;
+ int *amin; // axes min values
+ int *amax; // axes max values
+
+ struct js_corr *corr; // calibration values during the calib. steps
+ struct js_corr *origCorr; // original calibration correction values
+};
+
+#endif
diff --git a/kcontrol/joystick/joystick.cpp b/kcontrol/joystick/joystick.cpp
new file mode 100644
index 000000000..75115fcb7
--- /dev/null
+++ b/kcontrol/joystick/joystick.cpp
@@ -0,0 +1,123 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Martin Koller *
+ * m.koller@surfeu.at *
+ * This file is part of the KDE Control Center Module for Joysticks *
+ * *
+ * 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 <kaboutdata.h>
+#include <kgenericfactory.h>
+#include <kglobal.h>
+#include <klocale.h>
+
+#include "joystick.h"
+#include "joywidget.h"
+#include "joydevice.h"
+
+//---------------------------------------------------------------------------------------------
+
+typedef KGenericFactory<joystick, QWidget> JoystickFactory;
+K_EXPORT_COMPONENT_FACTORY(kcm_joystick, JoystickFactory("joystick"))
+
+extern "C"
+{
+ KDE_EXPORT bool test_joystick()
+ { /* Code stolen from JoyWidget::init() */
+ int i;
+ char dev[30];
+
+ for (i = 0; i < 5; i++) // check the first 5 devices
+ {
+ sprintf(dev, "/dev/js%d", i); // first look in /dev
+ JoyDevice *joy = new JoyDevice(dev);
+
+ if ( joy->open() != JoyDevice::SUCCESS )
+ {
+ delete joy;
+ sprintf(dev, "/dev/input/js%d", i); // then look in /dev/input
+ joy = new JoyDevice(dev);
+
+ if ( joy->open() != JoyDevice::SUCCESS )
+ {
+ delete joy;
+ continue; // try next number
+ }
+ }
+
+ return true; /* We have at least one joystick and should hence be shown */
+ }
+ return false;
+ }
+}
+
+//---------------------------------------------------------------------------------------------
+
+joystick::joystick(QWidget *parent, const char *name, const QStringList &)
+ : KCModule(JoystickFactory::instance(), parent, name)
+{
+ setAboutData( new KAboutData("kcmjoystick", I18N_NOOP("KDE Joystick Control Module"), "1.0",
+ I18N_NOOP("KDE Control Center Module to test Joysticks"),
+ KAboutData::License_GPL, "(c) 2004, Martin Koller",
+ 0, "m.koller@surfeu.at"));
+
+ setQuickHelp( i18n("<h1>Joystick</h1>"
+ "This module helps to check if your joystick is working correctly.<br>"
+ "If it delivers wrong values for the axes, you can try to solve this with "
+ "the calibration.<br>"
+ "This module tries to find all available joystick devices "
+ "by checking /dev/js[0-4] and /dev/input/js[0-4]<br>"
+ "If you have another device file, enter it in the combobox.<br>"
+ "The Buttons list shows the state of the buttons on your joystick, the Axes list "
+ "shows the current value for all axes.<br>"
+ "NOTE: the current Linux device driver (Kernel 2.4, 2.6) can only autodetect"
+ "<ul>"
+ "<li>2-axis, 4-button joystick</li>"
+ "<li>3-axis, 4-button joystick</li>"
+ "<li>4-axis, 4-button joystick</li>"
+ "<li>Saitek Cyborg 'digital' joysticks</li>"
+ "</ul>"
+ "(For details you can check your Linux source/Documentation/input/joystick.txt)"
+ ));
+
+ joyWidget = new JoyWidget(this);
+
+ setMinimumSize(joyWidget->minimumSize());
+
+ setButtons(KCModule::Default);
+}
+
+//---------------------------------------------------------------------------------------------
+
+void joystick::load()
+{
+ joyWidget->init();
+}
+
+//---------------------------------------------------------------------------------------------
+
+void joystick::defaults()
+{
+ joyWidget->resetCalibration();
+
+ emit changed(true);
+}
+
+//---------------------------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------------------------
+
+#include "joystick.moc"
diff --git a/kcontrol/joystick/joystick.desktop b/kcontrol/joystick/joystick.desktop
new file mode 100644
index 000000000..92166c544
--- /dev/null
+++ b/kcontrol/joystick/joystick.desktop
@@ -0,0 +1,177 @@
+[Desktop Entry]
+Comment=joystick - a kcontrol module to test joysticks
+Comment[af]=joystick - 'n beheer module om joysticks mee te toets
+Comment[be]=Модуль настаўлення джойстыка
+Comment[bg]=Настройване на джойстика
+Comment[bn]=joystick - জয়-স্টিক পরীক্ষা করার জন্য একটি নিয়ন্ত্রণ মডিউল
+Comment[bs]=joystick - KControl modul za testiranje džojstika
+Comment[ca]=Joystick - un mòdul de kcontrol per a provar palanques de control
+Comment[cs]=Ovládací modul pro testování joysticků
+Comment[csb]=joystick - mòduł Centróm kòntrolë dlô testowaniô joysticków
+Comment[cy]=joystick - modiwl kcontrol i brofi ffyn rheoli
+Comment[da]=joystick - et kcontrol modul til at test joystick
+Comment[de]=Joystick-Testmodul
+Comment[el]=χειριστήριο - ένα άρθρωμα ελέγχου χειριστηρίων
+Comment[eo]=stirstango - kontrola modulo por testi stirstangojn
+Comment[es]=joystick - un módulo de kcontrol para probar joysticks
+Comment[et]=juhtpult - KDE juhtimiskeskuse moodul juhtpultide testimiseks
+Comment[eu]=joystick - joystickak aztertzeko kontrol modulua
+Comment[fa]=اهرم کنترل - پیمانۀ kcontrol برای آزمایش اهرمهای کنترل
+Comment[fi]=peliohjain - KDE:n ohjauskeskuksen moduuli peliohjainta varten
+Comment[fr]=joystick - un module pour tester les joysticks
+Comment[fy]=joystick - in Konfiguraasjemodule foar it teste fan joysticks
+Comment[gl]=joystick - un módulo de kcontrol para probar joysticks
+Comment[he]=ג'ויסטיק - מודול לבדיקת ג'ויסטיקים
+Comment[hi]=जॉयस्टिक - जॉयस्टिक को जाँचने का एक के-कंट्रोल मॉड्यूल
+Comment[hr]=joystick - kcontrol modul za ispitivanje igraće palice
+Comment[hu]=Botkormányok tesztelése, kalibrálása
+Comment[is]=joystick - kcontrol stjórneining til að prófa stýripinna
+Comment[it]=joystick - un modulo di kcontrol per provare i joystick
+Comment[ja]=ジョイスティックをテストする kcontrol モジュール
+Comment[ka]=joystick - kcontrol მოდული ჯოისტიკის ტესტირებისთვის
+Comment[kk]=joystick - джойстикты сынау kcontrol модулі
+Comment[km]=យ៉យស្ទីក - ម៉ូឌុល kcontrol ដើម្បី​សាកល្បង​យ៉យស្ទីក
+Comment[ko]=joystick - 조이스틱을 테스트하기 위한 kcontrol 모듈
+Comment[lt]=valdymo svirtis - kcontrol modulis valdymo svirčių išbandymui
+Comment[lv]=kursorsvira - kkontroles modulis kursorsviru testēšanai
+Comment[mk]=joystick - модул на kcontrol за тестирање џојстици
+Comment[mt]=joystick - modulu ta' kcontrol biex tittestja joysticks
+Comment[nb]=Styrepinne – en kcontrolmodul for å prøve ut styrepinner
+Comment[nds]=joystick - Moduul för't Utproberen vun Joysticks
+Comment[ne]=जोयस्टिक - जोयस्टिक परीक्षण गर्ने के नियन्त्रण मोड्युल
+Comment[nl]=joystick - een configuratiemodule voor het testen van joysticks
+Comment[nn]=Styrespak – ein kontrollmodul for å prøva ut styrepinnar
+Comment[pa]=joystick - ਜਾਏਸਟਿੱਕ ਜਾਂਚ ਲਈ ਕੇਕੰਟਰੋਲ ਮੈਡੀਊਲ
+Comment[pl]=joystick - moduł Centrum sterowania do testowania joysticków
+Comment[pt]=joystick - um módulo do kcontrol para testar joysticks
+Comment[pt_BR]=joystick - um módulo de controle para testes de joysticks
+Comment[ro]=Un modul pentru testarea joystick-urilor
+Comment[ru]=joystick - модуль kcontrol для проверки джойстика
+Comment[rw]=Agakoreshamukino - igice cya k-igenzura mu gusuzuma udukoreshamikino
+Comment[se]=Stivrensággi – stivrenmoduvla mainna geahččala stivrensákkiid
+Comment[sk]=Ovládací modul pre test joysticku
+Comment[sl]=joystick - modul Nadzornega središča za preizkus igralnih palic
+Comment[sr]=џојстик - модул контролног центра за тестирање џојстика
+Comment[sr@Latn]=džojstik - modul kontrolnog centra za testiranje džojstika
+Comment[sv]=Styrspak: en inställningsmodul för att testa styrspakar
+Comment[ta]=இயக்கும் கருவி - கேகண்ட்ரோல் கூறு இயக்கும் கருவியை பரிசோதிக்கிறது
+Comment[tg]=ҷостик - модули kидора барои санҷиши ҷостикҳо
+Comment[th]=จอยสติก - โมดูลของศูนย์ควบคุม KDE สำหรับตรวจสอบจอยสติก
+Comment[tr]=oyun kumandası - oyun kumandalarını denemek için bir kcontrol modülü
+Comment[tt]=Joystik sınaw öçen kcontrol modulı
+Comment[uk]=Джойстик - модуль центру керування для тестування джойстиків
+Comment[uz]=Joystik uchun boshqaruv moduli
+Comment[uz@cyrillic]=Жойстик учун бошқарув модули
+Comment[vi]=cần điều khiển - một mô đun điều khiển KDE đêr kiểm tra cần lái
+Comment[wa]=djîsse di djeu - on module di kcontrol po sayî les djîsses di djeu
+Comment[zh_CN]=joystick - 测试游戏杆的 kcontrol 模块
+Comment[zh_TW]=搖桿 - 用來測試搖桿的 kcontrol 模組
+Exec=kcmshell joystick
+Keywords=joystick,gamepad
+Keywords[be]=Джойстык,joystick,gamepad
+Keywords[bg]=джойстик, игра, игри, управление, joystick, gamepad
+Keywords[bs]=joystick,gamepad,džojstik
+Keywords[csb]=joystick,gamepad,dżojstik
+Keywords[cy]=ffôn reoli,pad gêm
+Keywords[da]=joystick,spilleplade
+Keywords[de]=Joystick,Gamepad,Spiele
+Keywords[el]=χειριστήριο,χειριστήριο κονσόλας παιχνιδιών
+Keywords[eo]=stirstango,stirstangoj,ludotabuleto
+Keywords[et]=juhtpult,mängupult
+Keywords[fa]=اهرم کنترل، صفحه بازی
+Keywords[fi]=joystick,peliohjain
+Keywords[fr]=joystick,gamepad,manette de jeu
+Keywords[ga]=luamhán stiúrtha,ceap cluiche
+Keywords[he]=joystick,gamepad,ג'ויסטיק,גויסטיק
+Keywords[hi]=जॉयस्टिक,गेमपेड
+Keywords[hr]=joystick,gamepad,igraća palica,igraća konzola
+Keywords[hu]=botkormány,joystick,gamepad
+Keywords[is]=joystick,gamepad,stýripinni
+Keywords[ja]=joystick,gamepad,ジョイスティック,ゲームパッド
+Keywords[km]=យ៉យស្ទីក,បន្ទះ​ល្បែង
+Keywords[lt]=valdymo svirtis, joystick,gamepad
+Keywords[lv]=kursorsvira,spēļu pults
+Keywords[nb]=styrepinne,spillkontroll
+Keywords[ne]=जोयस्टिक, गेमप्याड
+Keywords[nn]=styrespak,spelkontroll
+Keywords[pa]=joystick,gamepad,ਜਾਏਸਟਿੱਕ
+Keywords[pl]=joystick,gamepad,dżojstik
+Keywords[pt_BR]=joystick,gamepad, jogos
+Keywords[rw]=agakoreshamukino, umwanyaumukino
+Keywords[se]=stivrensággi,speallanstivrran
+Keywords[sl]=joystick,gamepad,igralna palica,igralni plošček
+Keywords[sr]=joystick,gamepad,џојстик
+Keywords[sr@Latn]=joystick,gamepad,džojstik
+Keywords[sv]=styrspak,spelkonsol
+Keywords[ta]=இயக்கும் கருவி, விளையாட்டு பலகை
+Keywords[te]=జాయ్ స్టిక్, గేమ్ పాడ్
+Keywords[th]=จอยสติก,แป้นคุมเกม,gamepad
+Keywords[tr]=oyun çubuğu
+Keywords[uk]=джойстик,gamepad
+Keywords[uz]=joystik,geympad
+Keywords[uz@cyrillic]=жойстик,геймпад
+Keywords[vi]=cần điều khiển,bàn điều khiển trò chơi
+Keywords[wa]=joystick,gamepad,djîsse,djîsse di djeu
+Keywords[zh_CN]=joystick,gamepad,游戏杆,手柄
+Keywords[zh_TW]=joystick,gamepad,搖桿,遊戲台
+Name=Joystick
+Name[be]=Джойстык
+Name[bg]=Джойстик
+Name[bn]=জয়-স্টিক
+Name[br]=Lanker-c'hoari
+Name[ca]=Palanca de control
+Name[cy]=Ffôn reoli
+Name[el]=Χειριστήριο
+Name[eo]=Stirstango
+Name[et]=Juhtpult
+Name[fa]=اهرم کنترل
+Name[fi]=Peliohjain
+Name[ga]=Luamhán Stiúrtha
+Name[he]=ג'ויסטיק
+Name[hi]=जॉयस्टिक
+Name[hr]=Igraća palica
+Name[hu]=Botkormány
+Name[is]=Stýripinnar
+Name[ja]=ジョイスティック
+Name[ka]=ჯოისტიკი
+Name[kk]=Джойстик
+Name[km]=យ៉យស្ទីក
+Name[ko]=조이스틱
+Name[lo]=จอยสติ๊ก
+Name[lt]=Valdymo svirtis
+Name[lv]=Kursorsvira
+Name[ms]=Kayu Bidik
+Name[nb]=Styrepinne
+Name[ne]=जोयस्टिक
+Name[nn]=Styrespak
+Name[oc]=Palanca de jogs
+Name[pa]=ਜਾਏਸਟਿੱਕ
+Name[ru]=Джойстик
+Name[rw]=Agakoreshamukino
+Name[se]=Stivrensággi
+Name[sl]=Igralna palica
+Name[sr]=Џојстик
+Name[sr@Latn]=Džojstik
+Name[sv]=Styrspak
+Name[ta]=இயக்கு கருவி
+Name[te]=జాయ్ స్టిక్
+Name[th]=จอยสติก
+Name[tr]=Oyun Çubuğu
+Name[tt]=Joystik
+Name[uk]=Джойстик
+Name[uz]=Joystik
+Name[uz@cyrillic]=Жойстик
+Name[ven]=Thambo dzau tumanya na tshishumiswa
+Name[vi]=Cần điều khiển
+Name[wa]=Djîsse di djeu
+Name[xh]=Uvuyo
+Name[zh_CN]=游戏杆
+Name[zh_TW]=玩具
+Name[zu]=Induku yenjabulo
+Terminal=false
+Type=Application
+X-KDE-FactoryName=kcm_joystick
+X-KDE-Library=joystick
+X-KDE-Test-Module=true
+Icon=joystick
+Categories=Qt;KDE;X-KDE-settings-hardware;
diff --git a/kcontrol/joystick/joystick.h b/kcontrol/joystick/joystick.h
new file mode 100644
index 000000000..819a5f70d
--- /dev/null
+++ b/kcontrol/joystick/joystick.h
@@ -0,0 +1,42 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Martin Koller *
+ * m.koller@surfeu.at *
+ * This file is part of the KDE Control Center Module for Joysticks *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#ifndef _JOYSTICK_H_
+#define _JOYSTICK_H_
+
+#include <kcmodule.h>
+
+class JoyWidget;
+
+class joystick: public KCModule
+{
+ Q_OBJECT
+
+ public:
+ joystick(QWidget *parent = 0, const char *name = 0, const QStringList &list = QStringList());
+
+ virtual void load();
+ virtual void defaults();
+
+ private:
+ JoyWidget *joyWidget;
+};
+
+#endif
diff --git a/kcontrol/joystick/joywidget.cpp b/kcontrol/joystick/joywidget.cpp
new file mode 100644
index 000000000..a4d42e3f1
--- /dev/null
+++ b/kcontrol/joystick/joywidget.cpp
@@ -0,0 +1,379 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Martin Koller *
+ * m.koller@surfeu.at *
+ * This file is part of the KDE Control Center Module for Joysticks *
+ * *
+ * 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 "joywidget.h"
+#include "joydevice.h"
+#include "poswidget.h"
+#include "caldialog.h"
+
+#include <qhbox.h>
+#include <qvbox.h>
+#include <qtable.h>
+#include <qlabel.h>
+#include <qcombobox.h>
+#include <qlistbox.h>
+#include <qcheckbox.h>
+#include <qtimer.h>
+#include <qfontmetrics.h>
+#include <qpushbutton.h>
+
+#include <klocale.h>
+#include <kdialog.h>
+#include <kmessagebox.h>
+#include <kiconloader.h>
+
+//--------------------------------------------------------------
+static QString PRESSED = I18N_NOOP("PRESSED");
+//--------------------------------------------------------------
+
+JoyWidget::JoyWidget(QWidget *parent, const char *name)
+ : QWidget(parent, name), idle(0), joydev(0)
+{
+ QVBox *mainVbox = new QVBox(parent);
+ mainVbox->setSpacing(KDialog::spacingHint());
+
+ // create area to show an icon + message if no joystick was detected
+ {
+ messageBox = new QHBox(mainVbox);
+ messageBox->setSpacing(KDialog::spacingHint());
+ QLabel *icon = new QLabel(messageBox);
+ icon->setPixmap(KGlobal::iconLoader()->loadIcon("messagebox_warning", KIcon::NoGroup,
+ KIcon::SizeMedium, KIcon::DefaultState, 0, true));
+ icon->setFixedSize(icon->sizeHint());
+ message = new QLabel(messageBox);
+ messageBox->hide();
+ }
+
+ QHBox *devHbox = new QHBox(mainVbox);
+ new QLabel(i18n("Device:"), devHbox);
+ device = new QComboBox(true, devHbox);
+ device->setInsertionPolicy(QComboBox::NoInsertion);
+ connect(device, SIGNAL(activated(const QString &)), this, SLOT(deviceChanged(const QString &)));
+ devHbox->setStretchFactor(device, 3);
+
+ QHBox *hbox = new QHBox(mainVbox);
+ hbox->setSpacing(KDialog::spacingHint());
+
+ QVBox *vboxLeft = new QVBox(hbox);
+ vboxLeft->setSpacing(KDialog::spacingHint());
+
+ new QLabel(i18n("Position:"), vboxLeft);
+ xyPos = new PosWidget(vboxLeft);
+ trace = new QCheckBox(i18n("Show trace"), mainVbox);
+ connect(trace, SIGNAL(toggled(bool)), this, SLOT(traceChanged(bool)));
+
+ QVBox *vboxMid = new QVBox(hbox);
+ vboxMid->setSpacing(KDialog::spacingHint());
+
+ QVBox *vboxRight = new QVBox(hbox);
+ vboxRight->setSpacing(KDialog::spacingHint());
+
+ // calculate the column width we need
+ QFontMetrics fm(font());
+ int colWidth = QMAX(fm.width(PRESSED), fm.width("-32767")) + 10; // -32767 largest string
+
+ new QLabel(i18n("Buttons:"), vboxMid);
+ buttonTbl = new QTable(0, 1, vboxMid);
+ buttonTbl->setReadOnly(true);
+ buttonTbl->horizontalHeader()->setLabel(0, i18n("State"));
+ buttonTbl->horizontalHeader()->setClickEnabled(false);
+ buttonTbl->horizontalHeader()->setResizeEnabled(false);
+ buttonTbl->verticalHeader()->setClickEnabled(false);
+ buttonTbl->verticalHeader()->setResizeEnabled(false);
+ buttonTbl->setColumnWidth(0, colWidth);
+
+ new QLabel(i18n("Axes:"), vboxRight);
+ axesTbl = new QTable(0, 1, vboxRight);
+ axesTbl->setReadOnly(true);
+ axesTbl->horizontalHeader()->setLabel(0, i18n("Value"));
+ axesTbl->horizontalHeader()->setClickEnabled(false);
+ axesTbl->horizontalHeader()->setResizeEnabled(false);
+ axesTbl->verticalHeader()->setClickEnabled(false);
+ axesTbl->verticalHeader()->setResizeEnabled(false);
+ axesTbl->setColumnWidth(0, colWidth);
+
+ // calibrate button
+ calibrate = new QPushButton(i18n("Calibrate"), mainVbox);
+ connect(calibrate, SIGNAL(clicked()), this, SLOT(calibrateDevice()));
+ calibrate->setEnabled(false);
+
+ // set up a timer for idle processing of joystick events
+ idle = new QTimer(this);
+ connect(idle, SIGNAL(timeout()), this, SLOT(checkDevice()));
+
+ // check which devicefiles we have
+ init();
+
+ vboxLeft->adjustSize();
+ vboxMid->adjustSize();
+ vboxRight->adjustSize();
+ hbox->adjustSize();
+ mainVbox->adjustSize();
+
+ setMinimumSize(mainVbox->size());
+}
+
+//--------------------------------------------------------------
+
+JoyWidget::~JoyWidget()
+{
+ delete joydev;
+}
+
+//--------------------------------------------------------------
+
+void JoyWidget::init()
+{
+ // check which devicefiles we have
+ int i;
+ bool first = true;
+ char dev[30];
+
+ device->clear();
+ buttonTbl->setNumRows(0);
+ axesTbl->setNumRows(0);
+
+ for (i = 0; i < 5; i++) // check the first 5 devices
+ {
+ sprintf(dev, "/dev/js%d", i); // first look in /dev
+ JoyDevice *joy = new JoyDevice(dev);
+
+ if ( joy->open() != JoyDevice::SUCCESS )
+ {
+ delete joy;
+ sprintf(dev, "/dev/input/js%d", i); // then look in /dev/input
+ joy = new JoyDevice(dev);
+
+ if ( joy->open() != JoyDevice::SUCCESS )
+ {
+ delete joy;
+ continue; // try next number
+ }
+ }
+
+ // we found one
+
+ device->insertItem(QString("%1 (%2)").arg(joy->text()).arg(joy->device()));
+
+ // display values for first device
+ if ( first )
+ {
+ showDeviceProps(joy); // this sets the joy object into this->joydev
+ first = false;
+ }
+ else
+ delete joy;
+ }
+
+ /* KDE 4: Remove this check(and i18n) when all KCM wrappers properly test modules */
+ if ( device->count() == 0 )
+ {
+ messageBox->show();
+ message->setText(QString("<qt><b>%1</b></qt>").arg(
+ i18n("No joystick device automatically found on this computer.<br>"
+ "Checks were done in /dev/js[0-4] and /dev/input/js[0-4]<br>"
+ "If you know that there is one attached, please enter the correct device file.")));
+ }
+}
+
+//--------------------------------------------------------------
+
+void JoyWidget::traceChanged(bool state)
+{
+ xyPos->showTrace(state);
+}
+
+//--------------------------------------------------------------
+
+void JoyWidget::restoreCurrDev()
+{
+ if ( !joydev ) // no device open
+ {
+ device->setCurrentText("");
+ calibrate->setEnabled(false);
+ }
+ else
+ {
+ // try to find the current open device in the combobox list
+ QListBoxItem *item;
+ item = device->listBox()->findItem(joydev->device(), Qt::Contains);
+
+ if ( !item ) // the current open device is one the user entered (not in the list)
+ device->setCurrentText(joydev->device());
+ else
+ device->setCurrentText(item->text());
+ }
+}
+
+//--------------------------------------------------------------
+
+void JoyWidget::deviceChanged(const QString &dev)
+{
+ // find "/dev" in given string
+ int start, stop;
+ QString devName;
+
+ if ( (start = dev.find("/dev")) == -1 )
+ {
+ KMessageBox::sorry(this,
+ i18n("The given device name is invalid (does not contain /dev).\n"
+ "Please select a device from the list or\n"
+ "enter a device file, like /dev/js0."), i18n("Unknown Device"));
+
+ restoreCurrDev();
+ return;
+ }
+
+ if ( (stop = dev.find(")", start)) != -1 ) // seems to be text selected from our list
+ devName = dev.mid(start, stop - start);
+ else
+ devName = dev.mid(start);
+
+ if ( joydev && (devName == joydev->device()) ) return; // user selected the current device; ignore it
+
+ JoyDevice *joy = new JoyDevice(devName);
+ JoyDevice::ErrorCode ret = joy->open();
+
+ if ( ret != JoyDevice::SUCCESS )
+ {
+ KMessageBox::error(this, joy->errText(ret), i18n("Device Error"));
+
+ delete joy;
+ restoreCurrDev();
+ return;
+ }
+
+ showDeviceProps(joy);
+}
+
+//--------------------------------------------------------------
+
+void JoyWidget::showDeviceProps(JoyDevice *joy)
+{
+ joydev = joy;
+
+ buttonTbl->setNumRows(joydev->numButtons());
+
+ axesTbl->setNumRows(joydev->numAxes());
+ if ( joydev->numAxes() >= 2 )
+ {
+ axesTbl->verticalHeader()->setLabel(0, "1(x)");
+ axesTbl->verticalHeader()->setLabel(1, "2(y)");
+ }
+
+ calibrate->setEnabled(true);
+ idle->start(0);
+
+ // make both tables use the same space for header; this looks nicer
+ buttonTbl->setLeftMargin(QMAX(buttonTbl->verticalHeader()->width(),
+ axesTbl->verticalHeader()->width()));
+ axesTbl->setLeftMargin(buttonTbl->verticalHeader()->width());
+}
+
+//--------------------------------------------------------------
+
+void JoyWidget::checkDevice()
+{
+ if ( !joydev ) return; // no open device yet
+
+ JoyDevice::EventType type;
+ int number, value;
+
+ if ( !joydev->getEvent(type, number, value) )
+ return;
+
+ if ( type == JoyDevice::BUTTON )
+ {
+ if ( value == 0 ) // button release
+ buttonTbl->setText(number, 0, "-");
+ else
+ buttonTbl->setText(number, 0, PRESSED);
+ }
+
+ if ( type == JoyDevice::AXIS )
+ {
+ if ( number == 0 ) // x-axis
+ xyPos->changeX(value);
+
+ if ( number == 1 ) // y-axis
+ xyPos->changeY(value);
+
+ axesTbl->setText(number, 0, QString("%1").arg(int(value)));
+ }
+}
+
+//--------------------------------------------------------------
+
+void JoyWidget::calibrateDevice()
+{
+ if ( !joydev ) return; // just to be save
+
+ JoyDevice::ErrorCode ret = joydev->initCalibration();
+
+ if ( ret != JoyDevice::SUCCESS )
+ {
+ KMessageBox::error(this, joydev->errText(ret), i18n("Communication Error"));
+ return;
+ }
+
+ if ( KMessageBox::messageBox(this, KMessageBox::Information,
+ i18n("<qt>Calibration is about to check the precision.<br><br>"
+ "<b>Please move all axes to their center position and then "
+ "do not touch the joystick anymore.</b><br><br>"
+ "Click OK to start the calibration.</qt>"),
+ i18n("Calibration"),
+ KStdGuiItem::ok(), KStdGuiItem::cancel()) != KMessageBox::Ok )
+ return;
+
+ idle->stop(); // stop the joystick event getting; this must be done inside the calibrate dialog
+
+ CalDialog dlg(this, joydev);
+ dlg.calibrate();
+
+ // user cancelled somewhere during calibration, therefore the device is in a bad state
+ if ( dlg.result() == QDialog::Rejected )
+ joydev->restoreCorr();
+
+ idle->start(0); // continue with event getting
+}
+
+//--------------------------------------------------------------
+
+void JoyWidget::resetCalibration()
+{
+ if ( !joydev ) return; // just to be save
+
+ JoyDevice::ErrorCode ret = joydev->restoreCorr();
+
+ if ( ret != JoyDevice::SUCCESS )
+ {
+ KMessageBox::error(this, joydev->errText(ret), i18n("Communication Error"));
+ }
+ else
+ {
+ KMessageBox::information(this,
+ i18n("Restored all calibration values for joystick device %1.").arg(joydev->device()),
+ i18n("Calibration Success"));
+ }
+}
+
+//--------------------------------------------------------------
+
+#include "joywidget.moc"
diff --git a/kcontrol/joystick/joywidget.h b/kcontrol/joystick/joywidget.h
new file mode 100644
index 000000000..5f561c0e5
--- /dev/null
+++ b/kcontrol/joystick/joywidget.h
@@ -0,0 +1,79 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Martin Koller *
+ * m.koller@surfeu.at *
+ * This file is part of the KDE Control Center Module for Joysticks *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#ifndef _JOYWIDGET_H_
+#define _JOYWIDGET_H_
+
+#include <qwidget.h>
+
+class JoyDevice;
+
+class PosWidget;
+class QLabel;
+class QTable;
+class QTimer;
+class QComboBox;
+class QPushButton;
+class QCheckBox;
+class QHBox;
+
+// the widget which displays all buttons, values, etc.
+class JoyWidget : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ JoyWidget(QWidget *parent = 0, const char *name = 0);
+
+ ~JoyWidget();
+
+ // initialize list of possible devices and open the first available
+ void init();
+
+ public slots:
+ // reset calibration values to their value when this KCM was started
+ void resetCalibration();
+
+ private slots:
+ void checkDevice();
+ void deviceChanged(const QString &dev);
+ void traceChanged(bool);
+ void calibrateDevice();
+
+ private:
+ void showDeviceProps(JoyDevice *joy); // fill widgets with given device parameters
+ void restoreCurrDev(); // restores the content of the combobox to reflect the current open device
+
+ private:
+ QHBox *messageBox;
+ QLabel *message; // in case of no device, show here a message rather than in a dialog
+ QComboBox *device;
+ PosWidget *xyPos;
+ QTable *buttonTbl;
+ QTable *axesTbl;
+ QCheckBox *trace;
+ QPushButton *calibrate;
+
+ QTimer *idle;
+
+ JoyDevice *joydev;
+};
+
+#endif
diff --git a/kcontrol/joystick/poswidget.cpp b/kcontrol/joystick/poswidget.cpp
new file mode 100644
index 000000000..54e619d7a
--- /dev/null
+++ b/kcontrol/joystick/poswidget.cpp
@@ -0,0 +1,138 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Martin Koller *
+ * m.koller@surfeu.at *
+ * This file is part of the KDE Control Center Module for Joysticks *
+ * *
+ * 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 "poswidget.h"
+
+#include <qpainter.h>
+
+#define XY_WIDTH 220
+#define MARK_WIDTH 10
+
+//-----------------------------------------------------------------
+
+PosWidget::PosWidget(QWidget *parent, const char *name)
+ : QWidget(parent, name, WRepaintNoErase), x(0), y(0), trace(false)
+{
+ setMinimumSize(XY_WIDTH, XY_WIDTH);
+ setMaximumSize(XY_WIDTH, XY_WIDTH);
+ setPaletteBackgroundColor(Qt::white);
+}
+
+//-----------------------------------------------------------------
+
+void PosWidget::paintEvent(QPaintEvent *)
+{
+ QPainter paint(this);
+
+ paint.drawRect(0, 0, width(), height());
+ paint.setPen(Qt::gray);
+
+ // draw a center grid
+ paint.drawLine(XY_WIDTH/2, 1,
+ XY_WIDTH/2, XY_WIDTH - 2);
+
+ paint.drawLine(1, XY_WIDTH/2,
+ XY_WIDTH - 2, XY_WIDTH/2);
+
+ // draw the current position marker
+ paint.setPen(Qt::blue);
+
+ paint.drawLine(x - MARK_WIDTH/2, y - MARK_WIDTH/2,
+ x + MARK_WIDTH/2, y + MARK_WIDTH/2);
+
+ paint.drawLine(x - MARK_WIDTH/2, y + MARK_WIDTH/2,
+ x + MARK_WIDTH/2, y - MARK_WIDTH/2);
+}
+
+//-----------------------------------------------------------------
+
+void PosWidget::changeX(int newX)
+{
+ // transform coordinates from joystick to widget coordinates
+ newX = int((newX/65535.0)*XY_WIDTH + XY_WIDTH/2);
+
+ if ( x == newX ) return; // avoid unnecessary redraw
+
+ eraseOld();
+
+ x = newX;
+}
+
+//-----------------------------------------------------------------
+
+void PosWidget::changeY(int newY)
+{
+ // transform coordinates from joystick to widget coordinates
+ newY = int((newY/65535.0)*XY_WIDTH + XY_WIDTH/2);
+
+ if ( y == newY ) return; // avoid unnecessary redraw
+
+ eraseOld();
+
+ y = newY;
+}
+
+//-----------------------------------------------------------------
+
+void PosWidget::showTrace(bool t)
+{
+ trace = t;
+
+ if ( !trace )
+ {
+ erase();
+ update();
+ }
+}
+
+//-----------------------------------------------------------------
+
+void PosWidget::eraseOld()
+{
+ QPainter paint(this);
+
+ //paint.eraseRect(x - MARK_WIDTH/2, y - MARK_WIDTH/2, MARK_WIDTH + 1, MARK_WIDTH + 1);
+
+ // erase previous cross (don't use eraseRect() so that trace flags will be not destroyed so much)
+ paint.setPen(Qt::white);
+
+ paint.drawLine(x - MARK_WIDTH/2, y - MARK_WIDTH/2,
+ x + MARK_WIDTH/2, y + MARK_WIDTH/2);
+
+ paint.drawLine(x - MARK_WIDTH/2, y + MARK_WIDTH/2,
+ x + MARK_WIDTH/2, y - MARK_WIDTH/2);
+
+ if ( trace ) // show previous position with a smaller black cross
+ {
+ paint.setPen(Qt::black);
+
+ paint.drawLine(x - 2, y - 2,
+ x + 2, y + 2);
+
+ paint.drawLine(x - 2, y + 2,
+ x + 2, y - 2);
+ }
+
+ update();
+}
+
+//-----------------------------------------------------------------
+
+#include "poswidget.moc"
diff --git a/kcontrol/joystick/poswidget.h b/kcontrol/joystick/poswidget.h
new file mode 100644
index 000000000..9151da57f
--- /dev/null
+++ b/kcontrol/joystick/poswidget.h
@@ -0,0 +1,55 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Martin Koller *
+ * m.koller@surfeu.at *
+ * This file is part of the KDE Control Center Module for Joysticks *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#ifndef _POSWIDGET_H_
+#define _POSWIDGET_H_
+
+#include <qwidget.h>
+
+/**
+ Widget to display the joystick-selected (x,y) position
+*/
+class PosWidget : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ PosWidget(QWidget *parent = 0, const char *name = 0);
+
+ void changeX(int x);
+ void changeY(int y);
+
+ // define if a trace of the moving joystick shall be displayed
+ // setting it to false will erase all previous marks from the widget
+ // NOTE: the traced positions are not stored and will be erased if the widget is covered/redisplayed
+ void showTrace(bool t);
+
+ protected:
+ virtual void paintEvent(QPaintEvent *);
+
+ private:
+ void eraseOld();
+
+ private:
+ int x, y;
+ bool trace;
+};
+
+#endif
diff --git a/kcontrol/kcontrol/KControl.desktop b/kcontrol/kcontrol/KControl.desktop
new file mode 100644
index 000000000..c174a867a
--- /dev/null
+++ b/kcontrol/kcontrol/KControl.desktop
@@ -0,0 +1,93 @@
+[Desktop Entry]
+Exec=kcontrol -caption "%c" %i %m
+Icon=kcontrol
+Type=Application
+DocPath=kcontrol/index.html
+X-KDE-StartupNotify=true
+
+Name=Control Center
+Name[af]=Beheer Sentrum
+Name[ar]=مركز التحكم
+Name[az]=İdarə Mərkəzi
+Name[be]=Цэнтр кіравання
+Name[bg]=Контролен център
+Name[bn]=নিয়ন্ত্রণ কেন্দ্র
+Name[br]=Kreizenn ren
+Name[bs]=Kontrolni centar
+Name[ca]=Centre de control
+Name[cs]=Ovládací centrum
+Name[csb]=Centróm kòntrolë
+Name[cy]=Canolfan Rheoli
+Name[da]=Kontrolcenter
+Name[de]=Kontrollzentrum
+Name[el]=Κέντρο ελέγχου
+Name[en_GB]=Control Centre
+Name[eo]=Stircentro
+Name[es]=Centro de control
+Name[et]=Juhtimiskeskus
+Name[eu]=Kontrol gunea
+Name[fa]=مرکز کنترل
+Name[fi]=Ohjauskeskus
+Name[fr]=Centre de configuration de KDE
+Name[fy]=Konfiguraasjesintrum
+Name[ga]=Lárionad Rialaithe
+Name[gl]=Centro de Control
+Name[he]=מרכז הבקרה
+Name[hi]=नियंत्रण केंद्र
+Name[hr]=Upravljačko središte
+Name[hu]=Vezérlőpult
+Name[id]=Pusat Kontrol
+Name[is]=Stjórnborð
+Name[it]=Centro di controllo
+Name[ja]=コントロールセンター
+Name[ka]=საკონტროლო ცენტრი
+Name[kk]=Басқару орталығы
+Name[km]=មជ្ឈមណ្ឌល​បញ្ជា
+Name[ko]=제어판 모듈
+Name[lo]=ສູນຄວບຄຸມ
+Name[lt]=Valdymo centras
+Name[lv]=Vadības Centrs
+Name[mk]=Контролен центар
+Name[mn]=Удирдах төв
+Name[ms]=Pusat Kawalan
+Name[mt]=Ċentru tal-Kontroll
+Name[nb]=Kontrollpanel
+Name[nds]=Kuntrullzentrum
+Name[ne]=नियन्त्रण केन्द्र
+Name[nl]=Configuratiecentrum
+Name[nn]=Kontrollsenter
+Name[nso]=Bogare bja Taolo
+Name[oc]=Centre de control
+Name[pa]=ਕੰਟਰੋਲ ਕੇਂਦਰ
+Name[pl]=Centrum sterowania
+Name[pt]=Centro de Controlo
+Name[pt_BR]=Centro de Controle
+Name[ro]=Centrul de control
+Name[ru]=Центр управления
+Name[rw]=Kugenzura Hagati
+Name[se]=Stivrenguovddáš
+Name[sk]=Ovládacie Centrum
+Name[sl]=Nadzorno središče
+Name[sr]=Контролни центар
+Name[sr@Latn]=Kontrolni centar
+Name[ss]=Sikhungo sekulawula
+Name[sv]=Inställningscentralen
+Name[ta]=கட்டுப்பாட்டு மையம்
+Name[te]=అధికార కేంద్రం
+Name[tg]=Маркази контрол
+Name[th]=ศูนย์ควบคุม
+Name[tr]=Kontrol Merkezi
+Name[tt]=İdärä Üzäge
+Name[uk]=Центр керування
+Name[uz]=Boshqaruv markazi
+Name[uz@cyrillic]=Бошқарув маркази
+Name[ven]=Senthara ya vhulanguli
+Name[vi]=Trung tâm Điều khiển
+Name[wa]=Cinte di contrôle
+Name[xh]=Umbindi Wolawulo
+Name[zh_CN]=控制中心
+Name[zh_TW]=控制中心
+Name[zu]=Indawo Yokulawula
+
+X-DCOP-ServiceType=Unique
+Categories=Qt;KDE;Core;
diff --git a/kcontrol/kcontrol/KControl_NoDisplay.desktop b/kcontrol/kcontrol/KControl_NoDisplay.desktop
new file mode 100644
index 000000000..f19e757f0
--- /dev/null
+++ b/kcontrol/kcontrol/KControl_NoDisplay.desktop
@@ -0,0 +1,93 @@
+[Desktop Entry]
+Exec=kcontrol -caption "%c" %i %m
+Icon=kcontrol
+Type=Application
+DocPath=kcontrol/index.html
+X-KDE-StartupNotify=true
+
+Name=Control Center
+Name[af]=Beheer Sentrum
+Name[ar]=مركز التحكم
+Name[az]=İdarə Mərkəzi
+Name[be]=Цэнтр кіравання
+Name[bg]=Контролен център
+Name[bn]=নিয়ন্ত্রণ কেন্দ্র
+Name[br]=Kreizenn ren
+Name[bs]=Kontrolni centar
+Name[ca]=Centre de control
+Name[cs]=Ovládací centrum
+Name[csb]=Centróm kòntrolë
+Name[cy]=Canolfan Rheoli
+Name[da]=Kontrolcenter
+Name[de]=Kontrollzentrum
+Name[el]=Κέντρο ελέγχου
+Name[en_GB]=Control Centre
+Name[eo]=Stircentro
+Name[es]=Centro de control
+Name[et]=Juhtimiskeskus
+Name[eu]=Kontrol gunea
+Name[fa]=مرکز کنترل
+Name[fi]=Ohjauskeskus
+Name[fr]=Centre de configuration de KDE
+Name[fy]=Konfiguraasjesintrum
+Name[ga]=Lárionad Rialaithe
+Name[gl]=Centro de Control
+Name[he]=מרכז הבקרה
+Name[hi]=नियंत्रण केंद्र
+Name[hr]=Upravljačko središte
+Name[hu]=Vezérlőpult
+Name[id]=Pusat Kontrol
+Name[is]=Stjórnborð
+Name[it]=Centro di controllo
+Name[ja]=コントロールセンター
+Name[ka]=საკონტროლო ცენტრი
+Name[kk]=Басқару орталығы
+Name[km]=មជ្ឈមណ្ឌល​បញ្ជា
+Name[ko]=제어판 모듈
+Name[lo]=ສູນຄວບຄຸມ
+Name[lt]=Valdymo centras
+Name[lv]=Vadības Centrs
+Name[mk]=Контролен центар
+Name[mn]=Удирдах төв
+Name[ms]=Pusat Kawalan
+Name[mt]=Ċentru tal-Kontroll
+Name[nb]=Kontrollpanel
+Name[nds]=Kuntrullzentrum
+Name[ne]=नियन्त्रण केन्द्र
+Name[nl]=Configuratiecentrum
+Name[nn]=Kontrollsenter
+Name[nso]=Bogare bja Taolo
+Name[oc]=Centre de control
+Name[pa]=ਕੰਟਰੋਲ ਕੇਂਦਰ
+Name[pl]=Centrum sterowania
+Name[pt]=Centro de Controlo
+Name[pt_BR]=Centro de Controle
+Name[ro]=Centrul de control
+Name[ru]=Центр управления
+Name[rw]=Kugenzura Hagati
+Name[se]=Stivrenguovddáš
+Name[sk]=Ovládacie Centrum
+Name[sl]=Nadzorno središče
+Name[sr]=Контролни центар
+Name[sr@Latn]=Kontrolni centar
+Name[ss]=Sikhungo sekulawula
+Name[sv]=Inställningscentralen
+Name[ta]=கட்டுப்பாட்டு மையம்
+Name[te]=అధికార కేంద్రం
+Name[tg]=Маркази контрол
+Name[th]=ศูนย์ควบคุม
+Name[tr]=Kontrol Merkezi
+Name[tt]=İdärä Üzäge
+Name[uk]=Центр керування
+Name[uz]=Boshqaruv markazi
+Name[uz@cyrillic]=Бошқарув маркази
+Name[ven]=Senthara ya vhulanguli
+Name[vi]=Trung tâm Điều khiển
+Name[wa]=Cinte di contrôle
+Name[xh]=Umbindi Wolawulo
+Name[zh_CN]=控制中心
+Name[zh_TW]=控制中心
+Name[zu]=Indawo Yokulawula
+
+X-DCOP-ServiceType=Unique
+NoDisplay=true
diff --git a/kcontrol/kcontrol/Makefile.am b/kcontrol/kcontrol/Makefile.am
new file mode 100644
index 000000000..2f2c3a6bc
--- /dev/null
+++ b/kcontrol/kcontrol/Makefile.am
@@ -0,0 +1,53 @@
+#
+# Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+# Copyright (c) 2000 Matthias Elter <elter@kde.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+
+AM_CPPFLAGS= $(all_includes)
+METASOURCES = AUTO
+
+SUBDIRS = . about
+
+bin_PROGRAMS =
+lib_LTLIBRARIES =
+kdeinit_LTLIBRARIES = kcontrol.la
+
+kcontrol_la_SOURCES = main.cpp toplevel.cpp indexwidget.cpp \
+ helpwidget.cpp dockcontainer.cpp aboutwidget.cpp \
+ moduletreeview.cpp moduleiconview.cpp \
+ moduleIface.cpp moduleIface.skel global.cpp modules.cpp \
+ proxywidget.cpp kcrootonly.cpp searchwidget.cpp
+
+kcontrol_la_LIBADD = $(LIB_KDEUI) $(LIB_KUTILS) $(LIB_KHTML)
+kcontrol_la_LDFLAGS = $(all_libraries) -module -avoid-version
+
+rccontroldir = $(kde_datadir)/kcontrol
+rccontrol_DATA = kcontrolui.rc
+rcinfodir = $(kde_datadir)/kinfocenter
+rcinfo_DATA = kinfocenterui.rc
+
+xdg_apps_DATA = KControl.desktop kinfocenter.desktop
+
+install-data-local:
+ @-rm -f $(DESTDIR)$(kde_bindir)/kinfocenter
+ $(mkinstalldirs) $(DESTDIR)$(kde_bindir)
+ @$(LN_S) kcontrol $(DESTDIR)$(kde_bindir)/kinfocenter
+
+KDE_ICON=AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcontrol.pot
diff --git a/kcontrol/kcontrol/about/Makefile.am b/kcontrol/kcontrol/about/Makefile.am
new file mode 100644
index 000000000..14e035db7
--- /dev/null
+++ b/kcontrol/kcontrol/about/Makefile.am
@@ -0,0 +1,6 @@
+about_DATA = \
+ top-right-kcontrol.png \
+ main.html \
+ kcontrol.css
+
+aboutdir = $(kde_datadir)/kcontrol/about
diff --git a/kcontrol/kcontrol/about/kcontrol.css b/kcontrol/kcontrol/about/kcontrol.css
new file mode 100644
index 000000000..7e17e6a0d
--- /dev/null
+++ b/kcontrol/kcontrol/about/kcontrol.css
@@ -0,0 +1,54 @@
+
+#headerR {
+ position: absolute;
+ right: 0px;
+ width: 430px;
+ height: 131px;
+ background-image: url(top-right-kcontrol.png);
+}
+
+#title {
+ right: 80px;
+ font-size: x-large;
+}
+
+#tagline {
+ right: 80px;
+ font-size: x-small;
+ text-shadow: #c8c8c8 0px 0px 3px;
+
+}
+
+#barCenter {
+ font-size: x-small;
+}
+
+#tableTitle {
+ font-weight: bold;
+ padding-bottom: 1ex;
+}
+
+.kc_table {
+ font-size: x-small;
+ width: 100%;
+}
+
+.kc_leftcol {
+ width: 30%;
+}
+
+.kc_rightcol {
+ font-weight: bold;
+}
+
+.kc_use_text {
+ margin-bottom: 0;
+ font-size: xx-small;
+}
+
+.kcm_link {
+ color: #000;
+}
+
+/* vim:set sw=2 et nocindent smartindent: */
+
diff --git a/kcontrol/kcontrol/about/main.html b/kcontrol/kcontrol/about/main.html
new file mode 100644
index 000000000..65a0a4c02
--- /dev/null
+++ b/kcontrol/kcontrol/about/main.html
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta name="generator" content=
+ "HTML Tidy for Linux/x86 (vers 1st August 2004), see www.w3.org" />
+
+ <style type="text/css">
+ /*<![CDATA[*/
+ @import "%1"; /* kde_infopage.css */
+ %1 /* maybe @import "kde_infopage_rtl.css"; */
+ @import "kcontrol.css";
+ /*body {font-size: px;}*/
+ /*]]>*/
+ </style>
+</head>
+
+<body>
+ <div id="header">
+ <div id="headerL"/>
+ <div id="headerR"/>
+
+ <div id="title">
+ %2 <!-- Title -->
+ </div>
+
+ <div id="tagline">
+ %3 <!-- Catchphrase -->
+ </div>
+ </div>
+
+ <!-- the bar -->
+ <div id="bar">
+ <div id="barT"><div id="barTL"/><div id="barTR"/><div id="barTC"/></div>
+ <div id="barL">
+ <div id="barR">
+ <div id="barCenter" class="bar_text">
+ %4<!-- Summary -->
+ </div>
+ </div>
+ </div>
+ <div id="barB"><div id="barBL"/><div id="barBR"/><div id="barBC"/></div>
+ </div>
+
+ <!-- the main text box -->
+ <div id="box">
+ <div id="boxT"><div id="boxTL"/><div id="boxTR"/><div id="boxTC"/></div>
+ <div id="boxL">
+ <div id="boxR">
+ <div id="boxCenter">
+ <!--Content-->
+ %5
+ </div>
+ </div>
+ </div>
+ <div id="boxB"><div id="boxBL"/><div id="boxBR"/><div id="boxBC"/></div>
+ </div>
+
+ <div id="footer"><div id="footerL"/><div id="footerR"/></div>
+</body>
+</html>
+<!-- vim:set sw=2 et nocindent smartindent: -->
diff --git a/kcontrol/kcontrol/about/top-right-kcontrol.png b/kcontrol/kcontrol/about/top-right-kcontrol.png
new file mode 100644
index 000000000..bad44f089
--- /dev/null
+++ b/kcontrol/kcontrol/about/top-right-kcontrol.png
Binary files differ
diff --git a/kcontrol/kcontrol/aboutwidget.cpp b/kcontrol/kcontrol/aboutwidget.cpp
new file mode 100644
index 000000000..209b264ec
--- /dev/null
+++ b/kcontrol/kcontrol/aboutwidget.cpp
@@ -0,0 +1,204 @@
+/*
+ Copyright (c) 2000,2001 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <qpainter.h>
+#include <qwhatsthis.h>
+#include <qregexp.h>
+#include <qlayout.h>
+#include <qfile.h>
+
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kpixmap.h>
+#include <kpixmapeffect.h>
+#include <kcursor.h>
+#include <kglobalsettings.h>
+#include <khtml_part.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+
+#include "global.h"
+#include "aboutwidget.h"
+#include "aboutwidget.moc"
+#include "modules.h"
+#include "moduletreeview.h"
+
+static const char kcc_text[] = I18N_NOOP("KDE Control Center");
+
+static const char title_text[] = I18N_NOOP("Configure your desktop environment.");
+
+static const char intro_text[] = I18N_NOOP("Welcome to the \"KDE Control Center\", "
+ "a central place to configure your "
+ "desktop environment. "
+ "Select an item from the index on the left "
+ "to load a configuration module.");
+
+static const char kcc_infotext[] = I18N_NOOP("KDE Info Center");
+
+static const char title_infotext[] = I18N_NOOP("Get system and desktop environment information");
+
+static const char intro_infotext[] = I18N_NOOP("Welcome to the \"KDE Info Center\", "
+ "a central place to find information about your "
+ "computer system.");
+
+static const char use_text[] = I18N_NOOP("Use the \"Search\" field if you are unsure "
+ "where to look for a particular configuration option.");
+
+static const char version_text[] = I18N_NOOP("KDE version:");
+static const char user_text[] = I18N_NOOP("User:");
+static const char host_text[] = I18N_NOOP("Hostname:");
+static const char system_text[] = I18N_NOOP("System:");
+static const char release_text[] = I18N_NOOP("Release:");
+static const char machine_text[] = I18N_NOOP("Machine:");
+
+AboutWidget::AboutWidget(QWidget *parent , const char *name, QListViewItem* category, const QString &caption)
+ : QHBox(parent, name),
+ _moduleList(false),
+ _category(category),
+ _caption(caption)
+{
+ if (_category)
+ _moduleList = true;
+
+ setMinimumSize(400, 400);
+
+ // set qwhatsthis help
+ QWhatsThis::add(this, i18n(intro_text));
+ _viewer = new KHTMLPart( this, "_viewer" );
+ _viewer->widget()->setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored );
+ connect( _viewer->browserExtension(),
+ SIGNAL(openURLRequest(const KURL&, const KParts::URLArgs&)),
+ this, SLOT(slotModuleLinkClicked(const KURL&)) );
+ updatePixmap();
+}
+
+void AboutWidget::setCategory( QListViewItem* category, const QString& icon, const QString &caption )
+{
+ _icon = icon;
+ _caption = caption;
+ _category = category;
+ if ( _category )
+ _moduleList = true;
+ else
+ _moduleList = true;
+
+ // Update the pixmap to be shown:
+ updatePixmap();
+}
+
+void AboutWidget::updatePixmap()
+{
+ QString file = locate( "data", "kcontrol/about/main.html" );
+ QFile f( file );
+ f.open( IO_ReadOnly );
+ QTextStream t( &f );
+ QString res = t.read();
+
+ res = res.arg( locate( "data", "kdeui/about/kde_infopage.css" ) );
+ if ( kapp->reverseLayout() )
+ res = res.arg( "@import \"%1\";" ).arg( locate( "data", "kdeui/about/kde_infopage_rtl.css" ) );
+ else
+ res = res.arg( "" );
+
+
+ QString title, intro, caption;
+ if (KCGlobal::isInfoCenter())
+ {
+ res = res.arg(i18n(kcc_infotext))
+ .arg(i18n(title_infotext))
+ .arg(i18n(intro_infotext));
+ }
+ else
+ {
+ res = res.arg(i18n(kcc_text))
+ .arg(i18n(title_text))
+ .arg(i18n(intro_text));
+ }
+
+ QString content;
+
+ if (!_moduleList)
+ {
+ content += "<table class=\"kc_table\">\n";
+#define KC_HTMLROW( a, b ) "<tr><td class=\"kc_leftcol\">" + i18n( a ) + "</td><td class=\"kc_rightcol\">" + b + "</tr>\n"
+ content += KC_HTMLROW( version_text, KCGlobal::kdeVersion() );
+ content += KC_HTMLROW( user_text, KCGlobal::userName() );
+ content += KC_HTMLROW( host_text, KCGlobal::hostName() );
+ content += KC_HTMLROW( system_text, KCGlobal::systemName() );
+ content += KC_HTMLROW( release_text, KCGlobal::systemRelease() );
+ content += KC_HTMLROW( machine_text, KCGlobal::systemMachine() );
+#undef KC_HTMLROW
+ content += "</table>\n";
+ content += "<p class=\"kc_use_text\">" + i18n( use_text ) + "</p>\n";
+ }
+ else
+ {
+ KIconLoader *loader = KGlobal::instance()->iconLoader();
+ QString iconPath;
+ if (!_icon.isEmpty()) {
+ iconPath = loader->iconPath( _icon, KIcon::Toolbar );
+ content += "<div id=\"tableTitle\"><img src=\"" + iconPath +" \"</a>&nbsp;" + _caption + "</div>";
+ }
+
+ content += "<table class=\"kc_table\">\n";
+ // traverse the list
+ QListViewItem* pEntry = _category;
+ while (pEntry != NULL)
+ {
+ QString szName;
+ QString szComment;
+ ConfigModule *module = static_cast<ModuleTreeItem*>(pEntry)->module();
+ /* TODO: work out link */
+ content += "<tr><td class=\"kc_leftcol\">";
+ if (module)
+ {
+ szName = module->moduleName();
+ szComment = module->comment();
+ iconPath = loader->iconPath( module->icon(), KIcon::Small );
+
+ content += "<img src=\"" + iconPath +" \"</a>&nbsp;<a href=\"%1\" class=\"kcm_link\">" + szName + "</a></td><td class=\"kc_rightcol\">" + szComment;
+ KURL moduleURL( QString("kcm://%1").arg(QString().sprintf("%p",module)) );
+ QString linkURL( moduleURL.url() );
+ content = content.arg( linkURL );
+ _moduleMap.insert( linkURL, module );
+ }
+ else
+ {
+ szName = static_cast<ModuleTreeItem*>(pEntry)->caption();
+ content += szName + "</td><td class=\"kc_rightcol\">" + szName;
+ }
+ content += "</td></tr>\n";
+ pEntry = pEntry->nextSibling();
+ }
+ content += "</table>";
+ }
+ _viewer->begin(KURL( file ));
+ _viewer->write( res.arg( content ) );
+ _viewer->end();
+}
+
+void AboutWidget::slotModuleLinkClicked( const KURL& url )
+{
+ ConfigModule* module;
+ module = _moduleMap[url.url()];
+ if ( module )
+ emit moduleSelected( module );
+}
+
diff --git a/kcontrol/kcontrol/aboutwidget.h b/kcontrol/kcontrol/aboutwidget.h
new file mode 100644
index 000000000..e0b51fd54
--- /dev/null
+++ b/kcontrol/kcontrol/aboutwidget.h
@@ -0,0 +1,68 @@
+/*
+ Copyright (c) 2000,2001 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __aboutwidget_h__
+#define __aboutwidget_h__
+
+#include <qwidget.h>
+#include <qlistview.h>
+#include <qhbox.h>
+
+class KCModuleInfo;
+class QPixmap;
+class KPixmap;
+class ConfigModule;
+class KHTMLPart;
+class KURL;
+
+class AboutWidget : public QHBox
+{
+ Q_OBJECT
+
+public:
+ AboutWidget(QWidget *parent, const char *name=0, QListViewItem* category=0, const QString &caption=QString::null);
+
+ /**
+ * Set a new category without creating a new AboutWidget if there is
+ * one visible already (reduces flicker)
+ */
+ void setCategory( QListViewItem* category, const QString& icon, const QString& caption);
+
+signals:
+ void moduleSelected(ConfigModule *);
+
+private slots:
+ void slotModuleLinkClicked( const KURL& );
+
+private:
+ /**
+ * Update the pixmap to be shown. Called from resizeEvent and from
+ * setCategory.
+ */
+ void updatePixmap();
+
+ bool _moduleList;
+ QListViewItem* _category;
+ QString _icon;
+ QString _caption;
+ KHTMLPart *_viewer;
+ QMap<QString,ConfigModule*> _moduleMap;
+};
+
+#endif
diff --git a/kcontrol/kcontrol/cr128-app-kcontrol.png b/kcontrol/kcontrol/cr128-app-kcontrol.png
new file mode 100644
index 000000000..99a89e323
--- /dev/null
+++ b/kcontrol/kcontrol/cr128-app-kcontrol.png
Binary files differ
diff --git a/kcontrol/kcontrol/cr16-app-kcontrol.png b/kcontrol/kcontrol/cr16-app-kcontrol.png
new file mode 100644
index 000000000..64bf8b71d
--- /dev/null
+++ b/kcontrol/kcontrol/cr16-app-kcontrol.png
Binary files differ
diff --git a/kcontrol/kcontrol/cr32-app-kcontrol.png b/kcontrol/kcontrol/cr32-app-kcontrol.png
new file mode 100644
index 000000000..6537ba75e
--- /dev/null
+++ b/kcontrol/kcontrol/cr32-app-kcontrol.png
Binary files differ
diff --git a/kcontrol/kcontrol/cr48-app-kcontrol.png b/kcontrol/kcontrol/cr48-app-kcontrol.png
new file mode 100644
index 000000000..bde85be5f
--- /dev/null
+++ b/kcontrol/kcontrol/cr48-app-kcontrol.png
Binary files differ
diff --git a/kcontrol/kcontrol/cr64-app-kcontrol.png b/kcontrol/kcontrol/cr64-app-kcontrol.png
new file mode 100644
index 000000000..4d4db5d65
--- /dev/null
+++ b/kcontrol/kcontrol/cr64-app-kcontrol.png
Binary files differ
diff --git a/kcontrol/kcontrol/dockcontainer.cpp b/kcontrol/kcontrol/dockcontainer.cpp
new file mode 100644
index 000000000..be2587114
--- /dev/null
+++ b/kcontrol/kcontrol/dockcontainer.cpp
@@ -0,0 +1,257 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <qlabel.h>
+#include <qvbox.h>
+#include <qpixmap.h>
+#include <qfont.h>
+#include <qwhatsthis.h>
+#include <qapplication.h>
+#include <qpushbutton.h>
+
+#include <kapplication.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kiconloader.h>
+
+#include "dockcontainer.h"
+#include "dockcontainer.moc"
+
+#include "global.h"
+#include "modules.h"
+#include "proxywidget.h"
+
+class ModuleTitle : public QHBox
+{
+ public:
+ ModuleTitle( QWidget *parent, const char *name=0 );
+ ~ModuleTitle() {}
+
+ void showTitleFor( ConfigModule *module );
+ void clear();
+
+ protected:
+ QLabel *m_icon;
+ QLabel *m_name;
+};
+
+ModuleTitle::ModuleTitle( QWidget *parent, const char *name )
+ : QHBox( parent, name )
+{
+ QWidget *spacer = new QWidget( this );
+ spacer->setFixedWidth( KDialog::marginHint()-KDialog::spacingHint() );
+ m_icon = new QLabel( this );
+ m_name = new QLabel( this );
+
+ QFont font = m_name->font();
+ font.setPointSize( font.pointSize()+1 );
+ font.setBold( true );
+ m_name->setFont( font );
+
+ setSpacing( KDialog::spacingHint() );
+ if ( QApplication::reverseLayout() )
+ {
+ spacer = new QWidget( this );
+ setStretchFactor( spacer, 10 );
+ }
+ else
+ setStretchFactor( m_name, 10 );
+}
+
+void ModuleTitle::showTitleFor( ConfigModule *config )
+{
+ if ( !config )
+ return;
+
+ QWhatsThis::remove( this );
+ QWhatsThis::add( this, config->comment() );
+ KIconLoader *loader = KGlobal::instance()->iconLoader();
+ QPixmap icon = loader->loadIcon( config->icon(), KIcon::NoGroup, 22 );
+ m_icon->setPixmap( icon );
+ m_name->setText( config->moduleName() );
+
+ show();
+}
+
+void ModuleTitle::clear()
+{
+ m_icon->setPixmap( QPixmap() );
+ m_name->setText( QString::null );
+ kapp->processEvents();
+}
+
+ModuleWidget::ModuleWidget( QWidget *parent, const char *name )
+ : QVBox( parent, name )
+{
+ QHBox* titleLine = new QHBox( this, "titleLine");
+ m_title = new ModuleTitle( titleLine, "m_title" );
+ QPushButton *helpButton = new QPushButton( titleLine );
+ helpButton->setIconSet( SmallIconSet("help") );
+ connect (helpButton, SIGNAL( clicked() ), this, SIGNAL( helpRequest() ) );
+ m_body = new QVBox( this, "m_body" );
+ setStretchFactor( m_body, 10 );
+}
+
+ProxyWidget *ModuleWidget::load( ConfigModule *module )
+{
+ m_title->clear();
+ ProxyWidget *proxy = module->module();
+
+ if ( proxy )
+ {
+ proxy->reparent(m_body, 0, QPoint(0,0), false);
+ proxy->show();
+ m_title->showTitleFor( module );
+ }
+
+ return proxy;
+}
+
+DockContainer::DockContainer(QWidget *parent)
+ : QWidgetStack(parent, "DockContainer")
+ , _basew(0L)
+ , _module(0L)
+{
+ _busyw = new QLabel(i18n("<big><b>Loading...</b></big>"), this);
+ _busyw->setAlignment(AlignCenter);
+ _busyw->setTextFormat(RichText);
+ _busyw->setGeometry(0,0, width(), height());
+ addWidget( _busyw );
+
+ _modulew = new ModuleWidget( this, "_modulew" );
+ connect (_modulew, SIGNAL( helpRequest() ), SLOT( slotHelpRequest() ) );
+ addWidget( _modulew );
+}
+
+DockContainer::~DockContainer()
+{
+ deleteModule();
+}
+
+void DockContainer::setBaseWidget(QWidget *widget)
+{
+ removeWidget( _basew );
+ delete _basew;
+ _basew = 0;
+ if (!widget) return;
+
+ _basew = widget;
+
+ addWidget( _basew );
+ raiseWidget( _basew );
+
+ emit newModule(widget->caption(), "", "");
+}
+
+ProxyWidget* DockContainer::loadModule( ConfigModule *module )
+{
+ QApplication::setOverrideCursor( waitCursor );
+
+ ProxyWidget *widget = _modulew->load( module );
+
+ if (widget)
+ {
+ _module = module;
+ connect(_module, SIGNAL(childClosed()), SLOT(removeModule()));
+ connect(_module, SIGNAL(changed(ConfigModule *)),
+ SIGNAL(changedModule(ConfigModule *)));
+ connect(widget, SIGNAL(quickHelpChanged()), SLOT(quickHelpChanged()));
+
+ raiseWidget( _modulew );
+ emit newModule(widget->caption(), module->docPath(), widget->quickHelp());
+ }
+ else
+ {
+ raiseWidget( _basew );
+ emit newModule(_basew->caption(), "", "");
+ }
+
+ QApplication::restoreOverrideCursor();
+
+ return widget;
+}
+
+bool DockContainer::dockModule(ConfigModule *module)
+{
+ if (module == _module) return true;
+
+ if (_module && _module->isChanged())
+ {
+
+ int res = KMessageBox::warningYesNoCancel(this,
+module ?
+i18n("There are unsaved changes in the active module.\n"
+ "Do you want to apply the changes before running "
+ "the new module or discard the changes?") :
+i18n("There are unsaved changes in the active module.\n"
+ "Do you want to apply the changes before exiting "
+ "the Control Center or discard the changes?"),
+ i18n("Unsaved Changes"),
+ KStdGuiItem::apply(),
+ KStdGuiItem::discard());
+ if (res == KMessageBox::Yes)
+ _module->module()->applyClicked();
+ if (res == KMessageBox::Cancel)
+ return false;
+ }
+
+ raiseWidget( _busyw );
+ kapp->processEvents();
+
+ deleteModule();
+ if (!module) return true;
+
+ ProxyWidget *widget = loadModule( module );
+
+ KCGlobal::repairAccels( topLevelWidget() );
+ return ( widget!=0 );
+}
+
+void DockContainer::removeModule()
+{
+ raiseWidget( _basew );
+ deleteModule();
+
+ if (_basew)
+ emit newModule(_basew->caption(), "", "");
+ else
+ emit newModule("", "", "");
+}
+
+void DockContainer::deleteModule()
+{
+ if(_module) {
+ _module->deleteClient();
+ _module = 0;
+ }
+}
+
+void DockContainer::quickHelpChanged()
+{
+ if (_module && _module->module())
+ emit newModule(_module->module()->caption(), _module->docPath(), _module->module()->quickHelp());
+}
+
+void DockContainer::slotHelpRequest()
+{
+ if (_module && _module->module())
+ _module->module()->helpClicked();
+}
diff --git a/kcontrol/kcontrol/dockcontainer.h b/kcontrol/kcontrol/dockcontainer.h
new file mode 100644
index 000000000..94494cac5
--- /dev/null
+++ b/kcontrol/kcontrol/dockcontainer.h
@@ -0,0 +1,86 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __dockcontainer_h__
+#define __dockcontainer_h__
+
+#include <qwidgetstack.h>
+#include <qvbox.h>
+
+class ConfigModule;
+class ModuleTitle;
+class ProxyWidget;
+class QLabel;
+
+class ModuleWidget : public QVBox
+{
+ Q_OBJECT
+
+ public:
+ ModuleWidget( QWidget *parent, const char *name );
+ ~ModuleWidget() {}
+
+ ProxyWidget* load( ConfigModule *module );
+
+ signals:
+ void helpRequest();
+
+ protected:
+ ModuleTitle *m_title;
+ QVBox *m_body;
+};
+
+class DockContainer : public QWidgetStack
+{
+ Q_OBJECT
+
+public:
+ DockContainer(QWidget *parent=0);
+ virtual ~DockContainer();
+
+ void setBaseWidget(QWidget *widget);
+ QWidget *baseWidget() { return _basew; }
+
+ bool dockModule(ConfigModule *module);
+ ConfigModule *module() { return _module; }
+
+public slots:
+ void removeModule();
+
+protected slots:
+ void quickHelpChanged();
+ void slotHelpRequest();
+
+protected:
+ void deleteModule();
+ ProxyWidget* loadModule( ConfigModule *module );
+
+signals:
+ void newModule(const QString &name, const QString& docPath, const QString &quickhelp);
+ void changedModule(ConfigModule *module);
+
+private:
+ QWidget *_basew;
+ QLabel *_busyw;
+ ModuleWidget *_modulew;
+ ConfigModule *_module;
+
+};
+
+#endif
diff --git a/kcontrol/kcontrol/global.cpp b/kcontrol/kcontrol/global.cpp
new file mode 100644
index 000000000..83d2052b2
--- /dev/null
+++ b/kcontrol/kcontrol/global.cpp
@@ -0,0 +1,116 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/utsname.h>
+#include <kservicegroup.h>
+#include <kdebug.h>
+#include <kapplication.h>
+#include <kuser.h>
+
+#include <qobjectlist.h>
+#include <qaccel.h>
+
+#include "global.h"
+
+bool KCGlobal::_root = false;
+bool KCGlobal::_infocenter = false;
+QStringList KCGlobal::_types;
+QString KCGlobal::_uname = "";
+QString KCGlobal::_hname = "";
+QString KCGlobal::_kdeversion = "";
+QString KCGlobal::_isystem = "";
+QString KCGlobal::_irelease = "";
+QString KCGlobal::_iversion = "";
+QString KCGlobal::_imachine = "";
+IndexViewMode KCGlobal::_viewmode = Icon;
+KIcon::StdSizes KCGlobal::_iconsize = KIcon::SizeMedium;
+QString KCGlobal::_baseGroup = "";
+
+void KCGlobal::init()
+{
+ char buf[256];
+ buf[0] = '\0';
+ if (!gethostname(buf, sizeof(buf)))
+ buf[sizeof(buf)-1] ='\0';
+ QString hostname(buf);
+
+ setHostName(hostname);
+ setUserName(KUser().loginName());
+ setRoot(getuid() == 0);
+
+ setKDEVersion(KDE::versionString());
+
+ struct utsname info;
+ uname(&info);
+
+ setSystemName(info.sysname);
+ setSystemRelease(info.release);
+ setSystemVersion(info.version);
+ setSystemMachine(info.machine);
+}
+
+void KCGlobal::setType(const QCString& s)
+{
+ QString string = s.lower();
+ _types = QStringList::split(',', string);
+}
+
+QString KCGlobal::baseGroup()
+{
+ if ( _baseGroup.isEmpty() )
+ {
+ KServiceGroup::Ptr group = KServiceGroup::baseGroup( _infocenter ? "info" : "settings" );
+ if (group)
+ {
+ _baseGroup = group->relPath();
+ kdDebug(1208) << "Found basegroup = " << _baseGroup << endl;
+ return _baseGroup;
+ }
+ // Compatibility with old behaviour, in case of missing .directory files.
+ if (_baseGroup.isEmpty())
+ {
+ if (_infocenter)
+ {
+ kdWarning() << "No K menu group with X-KDE-BaseGroup=info found ! Defaulting to Settings/Information/" << endl;
+ _baseGroup = QString::fromLatin1("Settings/Information/");
+ }
+ else
+ {
+ kdWarning() << "No K menu group with X-KDE-BaseGroup=settings found ! Defaulting to Settings/" << endl;
+ _baseGroup = QString::fromLatin1("Settings/");
+ }
+ }
+ }
+ return _baseGroup;
+}
+
+void KCGlobal::repairAccels( QWidget * tw )
+{
+ QObjectList * l = tw->queryList( "QAccel" );
+ QObjectListIt it( *l ); // iterate over the buttons
+ QObject * obj;
+ while ( (obj=it.current()) != 0 ) { // for each found object...
+ ++it;
+ ((QAccel*)obj)->repairEventFilter();
+ }
+ delete l; // delete the list, not the objects
+}
diff --git a/kcontrol/kcontrol/global.h b/kcontrol/kcontrol/global.h
new file mode 100644
index 000000000..71fbb55c3
--- /dev/null
+++ b/kcontrol/kcontrol/global.h
@@ -0,0 +1,76 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __global_h__
+#define __global_h__
+
+#include <kicontheme.h>
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qcstring.h>
+
+enum IndexViewMode {Icon, Tree};
+
+class KCGlobal
+{
+public:
+
+ static void init();
+
+ static bool isInfoCenter() { return _infocenter; }
+ static bool root() { return _root; }
+ static QStringList types() { return _types; }
+ static QString userName() { return _uname; }
+ static QString hostName() { return _hname; }
+ static QString kdeVersion() { return _kdeversion; }
+ static QString systemName() { return _isystem; }
+ static QString systemRelease() { return _irelease; }
+ static QString systemVersion() { return _iversion; }
+ static QString systemMachine() { return _imachine; }
+ static IndexViewMode viewMode() { return _viewmode; }
+ static KIcon::StdSizes iconSize() { return _iconsize; }
+ static QString baseGroup();
+
+ static void setIsInfoCenter(bool b) { _infocenter = b; }
+ static void setRoot(bool r) { _root = r; }
+ static void setType(const QCString& s);
+ static void setUserName(const QString& n){ _uname = n; }
+ static void setHostName(const QString& n){ _hname = n; }
+ static void setKDEVersion(const QString& n){ _kdeversion = n; }
+ static void setSystemName(const QString& n){ _isystem = n; }
+ static void setSystemRelease(const QString& n){ _irelease = n; }
+ static void setSystemVersion(const QString& n){ _iversion = n; }
+ static void setSystemMachine(const QString& n){ _imachine = n; }
+ static void setViewMode(IndexViewMode m) { _viewmode = m; }
+ static void setIconSize(KIcon::StdSizes s) { _iconsize = s; }
+
+ static void repairAccels( QWidget * tw );
+
+private:
+ static bool _root;
+ static bool _infocenter;
+ static QStringList _types;
+ static QString _uname, _hname, _isystem, _irelease, _iversion, _imachine, _kdeversion;
+ static IndexViewMode _viewmode;
+ static KIcon::StdSizes _iconsize;
+ static QString _baseGroup;
+};
+
+#endif
diff --git a/kcontrol/kcontrol/helpwidget.cpp b/kcontrol/kcontrol/helpwidget.cpp
new file mode 100644
index 000000000..b53fbc8a9
--- /dev/null
+++ b/kcontrol/kcontrol/helpwidget.cpp
@@ -0,0 +1,96 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kprocess.h>
+#include <kapplication.h>
+#include <krun.h>
+
+#include "global.h"
+#include "helpwidget.h"
+
+HelpWidget::HelpWidget(QWidget *parent) : QWhatsThis(parent)
+{
+ setBaseText();
+}
+
+void HelpWidget::setText(const QString& docPath, const QString& text)
+{
+ docpath = docPath;
+ if (text.isEmpty() && docPath.isEmpty())
+ setBaseText();
+ else if (docPath.isEmpty())
+ helptext = text;
+ else
+ helptext = (text + i18n("<p>Use the \"What's This?\" (Shift+F1) to get help on specific options.</p><p>To read the full manual click <a href=\"%1\">here</a>.</p>")
+ .arg(docPath.local8Bit()));
+}
+
+void HelpWidget::setBaseText()
+{
+ if (KCGlobal::isInfoCenter())
+ helptext = (i18n("<h1>KDE Info Center</h1>"
+ "There is no quick help available for the active info module."
+ "<br><br>"
+ "Click <a href = \"kinfocenter/index.html\">here</a> to read the general Info Center manual.") );
+ else
+ helptext = (i18n("<h1>KDE Control Center</h1>"
+ "There is no quick help available for the active control module."
+ "<br><br>"
+ "Click <a href = \"kcontrol/index.html\">here</a> to read the general Control Center manual.") );
+}
+
+QString HelpWidget::text() const
+{
+ return helptext;
+}
+
+bool HelpWidget::clicked(const QString & _url)
+{
+ if ( _url.isNull() )
+ return true;
+
+ if ( _url.find('@') > -1 ) {
+ kapp->invokeMailer(_url);
+ return true;
+ }
+
+ KProcess process;
+ KURL url(KURL("help:/"), _url);
+
+ if (url.protocol() == "help" || url.protocol() == "man" || url.protocol() == "info") {
+ process << "khelpcenter"
+ << url.url();
+ process.start(KProcess::DontCare);
+ } else {
+ new KRun(url);
+ }
+ return true;
+}
+
+void HelpWidget::handbookRequest()
+{
+ if (docpath.isEmpty())
+ kdWarning() << "No handbook defined" << endl;
+
+ clicked(docpath);
+}
diff --git a/kcontrol/kcontrol/helpwidget.h b/kcontrol/kcontrol/helpwidget.h
new file mode 100644
index 000000000..08e495096
--- /dev/null
+++ b/kcontrol/kcontrol/helpwidget.h
@@ -0,0 +1,43 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __helpwidget_h__
+#define __helpwidget_h__
+
+class QWidget;
+class QWhatsThis;
+
+class HelpWidget : public QWhatsThis
+{
+public:
+ HelpWidget(QWidget *parent);
+
+ void setText( const QString& docPath, const QString& text);
+ void setBaseText();
+ QString text() const;
+
+ bool clicked(const QString &);
+ void handbookRequest();
+
+private:
+ QString docpath;
+ QString helptext;
+};
+
+#endif
diff --git a/kcontrol/kcontrol/indexwidget.cpp b/kcontrol/kcontrol/indexwidget.cpp
new file mode 100644
index 000000000..d427b5707
--- /dev/null
+++ b/kcontrol/kcontrol/indexwidget.cpp
@@ -0,0 +1,142 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ Copyright (c) 2003 Frauke Oster <frauke.oster@t-online.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <qlistview.h>
+
+
+#include "indexwidget.h"
+#include "indexwidget.moc"
+#include "moduletreeview.h"
+#include "moduleiconview.h"
+
+IndexWidget::IndexWidget(ConfigModuleList *modules, QWidget *parent ,const char *name)
+ : QWidgetStack(parent, name)
+ , _tree(0L)
+ , _icon(0L)
+ , _modules(modules)
+ , viewMode(Icon)
+{
+ activateView(Icon);
+}
+
+IndexWidget::~IndexWidget() {}
+
+void IndexWidget::reload()
+{
+ if (_icon)
+ _icon->fill();
+}
+
+QListViewItem *IndexWidget::firstTreeViewItem()
+{
+ if (_tree)
+ return _tree->firstChild();
+ else
+ return 0L;
+}
+
+
+void IndexWidget::resizeEvent(QResizeEvent *e)
+{
+ QWidgetStack::resizeEvent( e );
+}
+
+void IndexWidget::moduleSelected(ConfigModule *m)
+{
+ const QObject *obj = sender();
+ if(!m) return;
+
+ emit moduleActivated(m);
+
+ if (obj->inherits("ModuleIconView") && _tree)
+ {
+ _tree->makeVisible(m);
+
+ _tree->disconnect(SIGNAL(moduleSelected(ConfigModule*)));
+ _tree->makeSelected(m);
+ connect(_tree, SIGNAL(moduleSelected(ConfigModule*)),
+ this, SLOT(moduleSelected(ConfigModule*)));
+ }
+ else if (obj->inherits("ModuleTreeView") && _icon)
+ {
+ _icon->makeVisible(m);
+
+ _icon->disconnect(SIGNAL(moduleSelected(ConfigModule*)));
+ _icon->makeSelected(m);
+ connect(_icon, SIGNAL(moduleSelected(ConfigModule*)),
+ this, SLOT(moduleSelected(ConfigModule*)));
+ }
+}
+
+void IndexWidget::makeSelected(ConfigModule *module)
+{
+ if (_icon)
+ {
+ _icon->disconnect(SIGNAL(moduleSelected(ConfigModule*)));
+ _icon->makeSelected(module);
+ connect(_icon, SIGNAL(moduleSelected(ConfigModule*)),
+ this, SLOT(moduleSelected(ConfigModule*)));
+ }
+ if (_tree)
+ {
+ _tree->disconnect(SIGNAL(moduleSelected(ConfigModule*)));
+ _tree->makeSelected(module);
+ connect(_tree, SIGNAL(moduleSelected(ConfigModule*)),
+ this, SLOT(moduleSelected(ConfigModule*)));
+ }
+}
+
+void IndexWidget::makeVisible(ConfigModule *module)
+{
+ if (_icon)
+ _icon->makeVisible(module);
+ if (_tree)
+ _tree->makeVisible(module);
+}
+
+void IndexWidget::activateView(IndexViewMode mode)
+{
+ viewMode = mode;
+
+ if (mode == Icon)
+ {
+ if (!_icon)
+ {
+ _icon=new ModuleIconView(_modules, this);
+ _icon->fill();
+ connect(_icon, SIGNAL(moduleSelected(ConfigModule*)),
+ this, SLOT(moduleSelected(ConfigModule*)));
+ }
+ raiseWidget( _icon );
+ }
+ else
+ {
+ if (!_tree)
+ {
+ _tree=new ModuleTreeView(_modules, this);
+ _tree->fill();
+ connect(_tree, SIGNAL(moduleSelected(ConfigModule*)),
+ this, SLOT(moduleSelected(ConfigModule*)));
+ connect(_tree, SIGNAL(categorySelected(QListViewItem*)),
+ this, SIGNAL(categorySelected(QListViewItem*)));
+ }
+ raiseWidget( _tree );
+ }
+}
diff --git a/kcontrol/kcontrol/indexwidget.h b/kcontrol/kcontrol/indexwidget.h
new file mode 100644
index 000000000..0a358aa2e
--- /dev/null
+++ b/kcontrol/kcontrol/indexwidget.h
@@ -0,0 +1,64 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __indexwidget_h__
+#define __indexwidget_h__
+
+#include <qwidgetstack.h>
+
+#include "global.h"
+
+class ConfigModuleList;
+class ConfigModule;
+class ModuleTreeView;
+class ModuleIconView;
+
+class IndexWidget : public QWidgetStack
+{
+ Q_OBJECT
+
+public:
+ IndexWidget(ConfigModuleList *list, QWidget *parent, const char *name=0);
+ virtual ~IndexWidget();
+
+ QListViewItem *firstTreeViewItem();
+public slots:
+ void makeVisible(ConfigModule *module);
+ void makeSelected(ConfigModule *module);
+ void activateView(IndexViewMode);
+ void reload();
+
+protected slots:
+ void moduleSelected(ConfigModule *);
+
+signals:
+ void moduleActivated(ConfigModule *module);
+ void categorySelected(QListViewItem *);
+
+protected:
+ void resizeEvent(QResizeEvent *e);
+
+private:
+ ModuleTreeView *_tree;
+ ModuleIconView *_icon;
+ ConfigModuleList *_modules;
+ IndexViewMode viewMode;
+};
+
+#endif
diff --git a/kcontrol/kcontrol/kcontrolui.rc b/kcontrol/kcontrol/kcontrolui.rc
new file mode 100644
index 000000000..92867beb3
--- /dev/null
+++ b/kcontrol/kcontrol/kcontrolui.rc
@@ -0,0 +1,20 @@
+<!DOCTYPE kpartgui>
+<kpartgui name="kcontrol" version="2">
+<MenuBar>
+ <Menu name="view"><text>&amp;View</text>
+ <Menu name="view_mode"><text>&amp;Mode</text>
+ <Action name="activate_iconview"/>
+ <Action name="activate_treeview"/>
+ </Menu>
+ <Menu name="view_iconsize"><text>Icon &amp;Size</text>
+ <Action name="activate_smallicons"/>
+ <Action name="activate_mediumicons"/>
+ <Action name="activate_largeicons"/>
+ <Action name="activate_hugeicons"/>
+ </Menu>
+ </Menu>
+ <Menu name="help">
+ <Action name="help_about_module" append="about_merge"/>
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/kcontrol/kcontrol/kcrootonly.cpp b/kcontrol/kcontrol/kcrootonly.cpp
new file mode 100644
index 000000000..5d3a0ce27
--- /dev/null
+++ b/kcontrol/kcontrol/kcrootonly.cpp
@@ -0,0 +1,38 @@
+/*
+ Copyright (c) 2001 Waldo Bastian <bastian@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <qlayout.h>
+#include <qlabel.h>
+
+#include <klocale.h>
+
+#include "kcrootonly.h"
+
+KCRootOnly::KCRootOnly(QWidget *parent, const char *name)
+ : KCModule(parent, name)
+{
+ QVBoxLayout *layout=new QVBoxLayout(this);
+ QLabel *label = new QLabel(i18n("<big>You need super user privileges to run this control module.</big><br>"
+ "Click on the \"Administrator Mode\" button below."), this);
+ layout->addWidget(label);
+ label->setAlignment(AlignCenter);
+ label->setTextFormat(RichText);
+ label->setMinimumSize(label->sizeHint());
+}
+
+
diff --git a/kcontrol/kcontrol/kcrootonly.h b/kcontrol/kcontrol/kcrootonly.h
new file mode 100644
index 000000000..e04df7c80
--- /dev/null
+++ b/kcontrol/kcontrol/kcrootonly.h
@@ -0,0 +1,12 @@
+
+#ifndef _kcontrol_kcrootonly_
+#define _kcontrol_kcrootonly_
+
+#include <kcmodule.h>
+
+class KCRootOnly: public KCModule {
+public:
+ KCRootOnly(QWidget *parent, const char *name);
+};
+
+#endif
diff --git a/kcontrol/kcontrol/kinfocenter.desktop b/kcontrol/kcontrol/kinfocenter.desktop
new file mode 100644
index 000000000..cd3e27f0a
--- /dev/null
+++ b/kcontrol/kcontrol/kinfocenter.desktop
@@ -0,0 +1,109 @@
+[Desktop Entry]
+Exec=kinfocenter -caption "%c" %i %m
+Icon=hwinfo
+Type=Application
+DocPath=kinfocenter/index.html
+X-KDE-StartupNotify=true
+OnlyShowIn=KDE;
+
+Name=KInfoCenter
+Name[af]=Inligting Sentrum
+Name[be]=Цэнтр інфармацыі
+Name[bn]=কে-ইনফো-সেন্টার
+Name[csb]=Centróm wëdowiédzë
+Name[de]=Infozentrum
+Name[el]=Κέντρο πληροφοριών
+Name[et]=KDE infokeskus
+Name[he]=מרכז המידע
+Name[ja]=インフォセンター
+Name[mk]=КИнфоцентар
+Name[nds]=KDE-Infozentrum
+Name[ne]=के सूचना केन्द्र
+Name[pa]=ਜਾਣਕਾਰੀ ਕੇਂਦਰ
+Name[pl]=Centrum informacyjne
+Name[pt_BR]=Centro de Informações do KDE
+Name[ro]=Centrul de informații KDE
+Name[rw]=K-AmakuruHagati
+Name[sk]=KDE Informačné centrum
+Name[sv]=Informationscentralen
+Name[ta]=கேதகவல் மையம்
+Name[te]=కెఇన్ఫొసెంటర్
+Name[tg]=КМаркази иттилоот
+Name[th]=ศูนย์ข้อมูล K
+Name[tr]=KDE Bilgi Merkezi
+Name[uz]=Maʼlumot markazi
+Name[uz@cyrillic]=Маълумот маркази
+Name[vi]=Trung tâm Thông tin KDE
+Name[wa]=Cinte d' informåcion KInfo
+GenericName=Info Center
+GenericName[af]=Inligting Sentrum
+GenericName[be]=Цэнтр інфармацыі
+GenericName[bg]=Информационен център
+GenericName[bn]=তথ্য কেন্দ্র
+GenericName[br]=Kreizenn Titouroù
+GenericName[bs]=Info centar
+GenericName[ca]=Centre d'informació
+GenericName[cs]=Informační centrum
+GenericName[csb]=Centróm wëdowiédzë
+GenericName[cy]=Canolfan Gwybodaeth
+GenericName[da]=Infocenter
+GenericName[de]=Infozentrum
+GenericName[el]=Κέντρο πληροφοριών
+GenericName[en_GB]=Info Centre
+GenericName[eo]=Infocentro
+GenericName[es]=Centro de información
+GenericName[et]=Infokeskus
+GenericName[eu]=Info gunea
+GenericName[fa]=مرکز اطلاعات
+GenericName[fi]=Infokeskus
+GenericName[fr]=Centre d'informations
+GenericName[fy]=Ynformaasjesintrum
+GenericName[ga]=Lárionad Eolais
+GenericName[gl]=Centro de Información
+GenericName[he]=מרכז המידע
+GenericName[hr]=Info središte
+GenericName[hu]=Rendszerinformáció
+GenericName[is]=Upplýsingaborð
+GenericName[it]=Centro informazioni
+GenericName[ja]=インフォセンター
+GenericName[ka]=საინფორმაციო ცენტრი
+GenericName[kk]=Мәлімет орталығы
+GenericName[km]=មជ្ឈមណ្ឌល​ព័ត៌មាន
+GenericName[ko]=정보 센터
+GenericName[lt]=Info centras
+GenericName[mk]=Информативен центар
+GenericName[ms]=Pusat Maklumat
+GenericName[nb]=KDEs informasjonssenter
+GenericName[nds]=Infozentrum
+GenericName[ne]=सूचना केन्द्र
+GenericName[nl]=Informatiecentrum
+GenericName[nn]=KDEs informasjonssenter
+GenericName[pa]=ਜਾਣਕਾਰੀ ਕੇਂਦਰ
+GenericName[pl]=Centrum informacyjne
+GenericName[pt]=Centro de Informações
+GenericName[pt_BR]=Centro de Informações
+GenericName[ro]=Centru de informații
+GenericName[ru]=Центр информации
+GenericName[rw]=Amakuru Hagati
+GenericName[se]=Diehtoguovddáš
+GenericName[sk]=Informačné centrum
+GenericName[sl]=Informacijsko središče
+GenericName[sr]=Информациони центар
+GenericName[sr@Latn]=Informacioni centar
+GenericName[sv]=Informationscentralen
+GenericName[ta]=தகவல் மையம்
+GenericName[te]=సమాచార కేంద్రం
+GenericName[tg]=Маркази иттилоот
+GenericName[th]=ศูนย์ข้อมูล
+GenericName[tr]=Bilgi Merkezi
+GenericName[tt]=Beleşmä Üzäge
+GenericName[uk]=Центр інформації
+GenericName[uz]=Maʼlumot markazi
+GenericName[uz@cyrillic]=Маълумот маркази
+GenericName[vi]=Trung tâm Thông tin
+GenericName[wa]=Cinte di contrôle
+GenericName[zh_CN]=信息中心
+GenericName[zh_TW]=資訊中心
+
+X-DCOP-ServiceType=Unique
+Categories=Qt;KDE;System;
diff --git a/kcontrol/kcontrol/kinfocenterui.rc b/kcontrol/kcontrol/kinfocenterui.rc
new file mode 100644
index 000000000..92867beb3
--- /dev/null
+++ b/kcontrol/kcontrol/kinfocenterui.rc
@@ -0,0 +1,20 @@
+<!DOCTYPE kpartgui>
+<kpartgui name="kcontrol" version="2">
+<MenuBar>
+ <Menu name="view"><text>&amp;View</text>
+ <Menu name="view_mode"><text>&amp;Mode</text>
+ <Action name="activate_iconview"/>
+ <Action name="activate_treeview"/>
+ </Menu>
+ <Menu name="view_iconsize"><text>Icon &amp;Size</text>
+ <Action name="activate_smallicons"/>
+ <Action name="activate_mediumicons"/>
+ <Action name="activate_largeicons"/>
+ <Action name="activate_hugeicons"/>
+ </Menu>
+ </Menu>
+ <Menu name="help">
+ <Action name="help_about_module" append="about_merge"/>
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/kcontrol/kcontrol/main.cpp b/kcontrol/kcontrol/main.cpp
new file mode 100644
index 000000000..90e63583c
--- /dev/null
+++ b/kcontrol/kcontrol/main.cpp
@@ -0,0 +1,153 @@
+/*
+ Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+
+/**
+ * Howto debug:
+ * start "kcontrol --nofork" in a debugger.
+ *
+ * If you want to test with command line arguments you need
+ * -after you have started kcontrol in the debugger-
+ * open another shell and run kcontrol with the desired
+ * command line arguments.
+ *
+ * The command line arguments will be passed to the version of
+ * kcontrol in the debugger via DCOP and will cause a call
+ * to newInstance().
+ */
+
+#include <qpaintdevicemetrics.h>
+
+#include <kcmdlineargs.h>
+#include <dcopclient.h>
+#include <kaboutdata.h>
+#include <kglobalsettings.h>
+#include <kconfig.h>
+#include <kdebug.h>
+
+#include "main.h"
+#include "main.moc"
+#include "toplevel.h"
+#include "global.h"
+#include "moduleIface.h"
+
+#include "version.h"
+
+KControlApp::KControlApp()
+ : KUniqueApplication()
+ , toplevel(0)
+{
+ toplevel = new TopLevel();
+
+ setMainWidget(toplevel);
+ KGlobal::setActiveInstance(this);
+
+ // KUniqueApplication does dcop regitration for us
+ ModuleIface *modIface = new ModuleIface(toplevel, "moduleIface");
+
+ connect (modIface, SIGNAL(helpClicked()), toplevel, SLOT(slotHelpRequest()));
+ connect (modIface, SIGNAL(handbookClicked()), toplevel, SLOT(slotHandbookRequest()));
+
+ QRect desk = KGlobalSettings::desktopGeometry(toplevel);
+ KConfig *config = KGlobal::config();
+ config->setGroup("General");
+ // Initial size is:
+ // never bigger than workspace as reported by desk
+ // 940x700 on 96 dpi, 12 pt font
+ // 800x600 on 72 dpi, 12 pt font
+ // --> 368 + 6 x dpiX, 312 + 4 x dpiY
+ // Adjusted for font size
+ QPaintDeviceMetrics pdm(toplevel);
+ int fontSize = toplevel->fontInfo().pointSize();
+ if (fontSize == 0)
+ fontSize = (toplevel->fontInfo().pixelSize() * 72) / pdm.logicalDpiX();
+ int x = config->readNumEntry(QString::fromLatin1("InitialWidth %1").arg(desk.width()),
+ QMIN( desk.width(), 368 + (6*pdm.logicalDpiX()*fontSize)/12 ) );
+ int y = config->readNumEntry(QString::fromLatin1("InitialHeight %1").arg(desk.height()),
+ QMIN( desk.height(), 312 + (4*pdm.logicalDpiX()*fontSize)/12 ) );
+ toplevel->resize(x,y);
+}
+
+KControlApp::~KControlApp()
+{
+ if (toplevel)
+ {
+ KConfig *config = KGlobal::config();
+ config->setGroup("General");
+ QWidget *desk = QApplication::desktop();
+ config->writeEntry(QString::fromLatin1("InitialWidth %1").arg(desk->width()), toplevel->width());
+ config->writeEntry(QString::fromLatin1("InitialHeight %1").arg(desk->height()), toplevel->height());
+ config->sync();
+ }
+ delete toplevel;
+}
+
+extern "C" KDE_EXPORT int kdemain(int argc, char *argv[])
+{
+ KLocale::setMainCatalogue("kcontrol");
+ KAboutData aboutKControl( "kcontrol", I18N_NOOP("KDE Control Center"),
+ KCONTROL_VERSION, I18N_NOOP("The KDE Control Center"), KAboutData::License_GPL,
+ I18N_NOOP("(c) 1998-2004, The KDE Control Center Developers"));
+
+ KAboutData aboutKInfoCenter( "kinfocenter", I18N_NOOP("KDE Info Center"),
+ KCONTROL_VERSION, I18N_NOOP("The KDE Info Center"), KAboutData::License_GPL,
+ I18N_NOOP("(c) 1998-2004, The KDE Control Center Developers"));
+
+ QCString argv_0 = argv[0];
+ KAboutData *aboutData;
+ if (argv_0.right(11) == "kinfocenter")
+ {
+ aboutData = &aboutKInfoCenter;
+ KCGlobal::setIsInfoCenter(true);
+ kdDebug(1208) << "Running as KInfoCenter!\n" << endl;
+ }
+ else
+ {
+ aboutData = &aboutKControl;
+ KCGlobal::setIsInfoCenter(false);
+ }
+
+
+ if (argv_0.right(11) == "kinfocenter")
+ aboutData->addAuthor("Helge Deller", I18N_NOOP("Current Maintainer"), "deller@kde.org");
+ else
+ aboutData->addAuthor("Daniel Molkentin", I18N_NOOP("Current Maintainer"), "molkentin@kde.org");
+
+ aboutData->addAuthor("Matthias Hoelzer-Kluepfel",0, "hoelzer@kde.org");
+ aboutData->addAuthor("Matthias Elter",0, "elter@kde.org");
+ aboutData->addAuthor("Matthias Ettrich",0, "ettrich@kde.org");
+ aboutData->addAuthor("Waldo Bastian",0, "bastian@kde.org");
+
+ KCmdLineArgs::init( argc, argv, aboutData );
+ KUniqueApplication::addCmdLineOptions();
+
+ KCGlobal::init();
+
+ if (!KControlApp::start()) {
+ kdDebug(1208) << "kcontrol is already running!\n" << endl;
+ return (0);
+ }
+
+ KControlApp app;
+
+ // show the whole stuff
+ app.mainWidget()->show();
+
+ return app.exec();
+}
diff --git a/kcontrol/kcontrol/main.h b/kcontrol/kcontrol/main.h
new file mode 100644
index 000000000..783e10001
--- /dev/null
+++ b/kcontrol/kcontrol/main.h
@@ -0,0 +1,42 @@
+/*
+ Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __main_h__
+#define __main_h__
+
+#include <kuniqueapplication.h>
+
+class TopLevel;
+
+class KControlApp : public KUniqueApplication
+{
+ Q_OBJECT
+
+public:
+ KControlApp();
+ virtual ~KControlApp();
+
+private:
+
+ TopLevel *toplevel;
+
+};
+
+#endif
diff --git a/kcontrol/kcontrol/moduleIface.cpp b/kcontrol/kcontrol/moduleIface.cpp
new file mode 100644
index 000000000..b58f06c26
--- /dev/null
+++ b/kcontrol/kcontrol/moduleIface.cpp
@@ -0,0 +1,58 @@
+/*
+ Copyright (c) 2001 Daniel Molkentin <molkentin@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include "moduleIface.h"
+#include "moduleIface.moc"
+
+#include <kdebug.h>
+#include <kconfig.h>
+
+ModuleIface::ModuleIface(QObject *parent, const char *name)
+ : QObject(parent, name), DCOPObject(name) {
+
+ _parent = static_cast<QWidget *>(parent);
+
+}
+
+ModuleIface::~ModuleIface() {
+}
+
+QFont ModuleIface::getFont() {
+ return _parent->font();
+}
+
+QPalette ModuleIface::getPalette(){
+ kdDebug(1208) << "Returned Palette" << endl;
+ return _parent->palette();
+}
+
+QString ModuleIface::getStyle() {
+ KConfig config( "kdeglobals" );
+ config.setGroup( "General" );
+ return config.readEntry("widgetStyle");
+}
+
+void ModuleIface::invokeHandbook() {
+ emit handbookClicked();
+}
+
+void ModuleIface::invokeHelp() {
+ emit helpClicked();
+}
+
diff --git a/kcontrol/kcontrol/moduleIface.h b/kcontrol/kcontrol/moduleIface.h
new file mode 100644
index 000000000..8c034d5cd
--- /dev/null
+++ b/kcontrol/kcontrol/moduleIface.h
@@ -0,0 +1,54 @@
+/*
+ Copyright (c) 2001 Daniel Molkentin <molkentin@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __moduleIface_h__
+#define __moduleIface_h__
+
+#include <dcopobject.h>
+
+#include <qfont.h>
+#include <qpalette.h>
+#include <qwidget.h>
+
+class ModuleIface : public QObject, public DCOPObject {
+
+Q_OBJECT
+K_DCOP
+
+public:
+ ModuleIface(QObject *parent, const char *name);
+ ~ModuleIface();
+
+k_dcop:
+ QFont getFont();
+ QPalette getPalette();
+ QString getStyle();
+ void invokeHandbook();
+ void invokeHelp();
+
+signals:
+ void handbookClicked();
+ void helpClicked();
+
+private:
+ QWidget *_parent;
+
+};
+
+#endif
diff --git a/kcontrol/kcontrol/moduleiconview.cpp b/kcontrol/kcontrol/moduleiconview.cpp
new file mode 100644
index 000000000..041e6709c
--- /dev/null
+++ b/kcontrol/kcontrol/moduleiconview.cpp
@@ -0,0 +1,170 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ Copyright (c) 2003 Daniel Molkentin <molkentin@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <qheader.h>
+#include <qcursor.h>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kservicegroup.h>
+#include <kiconloader.h>
+
+#include <kdebug.h>
+
+#include "moduleiconview.h"
+#include "moduleiconview.moc"
+#include "modules.h"
+#include "global.h"
+
+
+ModuleIconView::ModuleIconView(ConfigModuleList *list, QWidget * parent, const char * name)
+ : KListView(parent, name)
+ , _path(KCGlobal::baseGroup())
+ , _modules(list)
+{
+ setSorting(1, true);
+ addColumn(QString::null);
+
+ // Needed to enforce a cut of the items label rather than
+ // showing a horizontal scrollbar
+ setResizeMode(LastColumn);
+
+ header()->hide();
+
+ // This is intentionally _not_ connected with executed(), since
+ // honoring doubleclick doesn't make any sense here (changed by
+ // large user demand)
+ connect(this, SIGNAL(clicked(QListViewItem*)),
+ this, SLOT(slotItemSelected(QListViewItem*)));
+}
+
+void ModuleIconView::makeSelected(ConfigModule *m)
+{
+ if (!m) return;
+
+ for (QListViewItem *i = firstChild(); i; i = i->nextSibling())
+ {
+ if(static_cast<ModuleIconItem*>(i)->module() == m)
+ {
+ setSelected(i, true);
+ break;
+ }
+ }
+}
+
+void ModuleIconView::makeVisible(ConfigModule *m)
+{
+ if (!m) return;
+ QString tmp = _modules->findModule(m);
+ if (tmp.isEmpty())
+ return;
+
+ _path = tmp;
+ fill();
+}
+
+void ModuleIconView::fill()
+{
+ clear();
+
+ QPixmap icon;
+ // add our "up" icon if we aren't top level
+ if (_path != KCGlobal::baseGroup())
+ {
+ icon = loadIcon( "back" );
+ // go-back node
+ ModuleIconItem *i = new ModuleIconItem(this, i18n("Back"), icon);
+ i->setOrderNo(0);
+ int last_slash = _path.findRev('/', -2);
+ if (last_slash == -1)
+ i->setTag(QString::null);
+ else
+ i->setTag(_path.left(last_slash+1));
+ }
+
+ int c = 0;
+ QStringList submenus = _modules->submenus(_path);
+ for (QStringList::Iterator it = submenus.begin(); it != submenus.end(); ++it )
+ {
+ QString path = (*it);
+
+ KServiceGroup::Ptr group = KServiceGroup::group(path);
+ if (!group || !group->isValid())
+ continue;
+
+ icon = loadIcon( group->icon() );
+
+ ModuleIconItem *i = new ModuleIconItem(this, group->caption(), icon);
+ i->setTag(path);
+ i->setOrderNo(++c);
+ }
+
+ c = 0;
+ QPtrList<ConfigModule> moduleList = _modules->modules(_path);
+ for (ConfigModule *module=moduleList.first(); module != 0; module=moduleList.next())
+ {
+ icon = loadIcon( module->icon() );
+
+ ModuleIconItem *i = new ModuleIconItem(this, module->moduleName(), icon, module);
+ i->setOrderNo(++c);
+ }
+}
+
+void ModuleIconView::slotItemSelected(QListViewItem* item)
+{
+ QApplication::restoreOverrideCursor();
+ if (!item) return;
+
+ if (static_cast<ModuleIconItem*>(item)->module())
+ {
+ emit moduleSelected(static_cast<ModuleIconItem*>(item)->module());
+ }
+ else
+ {
+ _path = static_cast<ModuleIconItem*>(item)->tag();
+ fill();
+ setCurrentItem(firstChild());
+ }
+}
+
+void ModuleIconView::keyPressEvent(QKeyEvent *e)
+{
+ if( e->key() == Key_Return
+ || e->key() == Key_Enter
+ || e->key() == Key_Space)
+ {
+ if (currentItem())
+ slotItemSelected(currentItem());
+ }
+ else
+ {
+ KListView::keyPressEvent(e);
+ }
+}
+
+QPixmap ModuleIconView::loadIcon( const QString &name )
+{
+ QPixmap icon = DesktopIcon( name, KCGlobal::iconSize() );
+
+ if(icon.isNull())
+ icon = DesktopIcon( "folder", KCGlobal::iconSize() );
+
+ return icon;
+}
diff --git a/kcontrol/kcontrol/moduleiconview.h b/kcontrol/kcontrol/moduleiconview.h
new file mode 100644
index 000000000..4f38a1cad
--- /dev/null
+++ b/kcontrol/kcontrol/moduleiconview.h
@@ -0,0 +1,86 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __moduleiconview_h__
+#define __moduleiconview_h__
+
+#include <klistview.h>
+
+class ConfigModule;
+class ConfigModuleList;
+
+class ModuleIconItem : public KListViewItem
+{
+
+public:
+ ModuleIconItem(QListView *parent, const QString& text, const QPixmap& pm, ConfigModule *m = 0)
+ : KListViewItem(parent, text)
+ , _tag(QString::null)
+ , _module(m)
+ {
+ setPixmap(0, pm);
+ }
+
+ void setConfigModule(ConfigModule* m) { _module = m; }
+ void setTag(const QString& t) { _tag = t; }
+ void setOrderNo(int order)
+ {
+ QString s;
+ setText(1, s.sprintf( "%02d", order ) );
+ }
+
+ ConfigModule* module() { return _module; }
+ QString tag() { return _tag; }
+
+
+private:
+ QString _tag;
+ ConfigModule *_module;
+};
+
+class ModuleIconView : public KListView
+{
+ Q_OBJECT
+
+public:
+ ModuleIconView(ConfigModuleList *list, QWidget * parent = 0, const char * name = 0);
+
+ void makeSelected(ConfigModule* module);
+ void makeVisible(ConfigModule *module);
+ void fill();
+
+signals:
+ void moduleSelected(ConfigModule*);
+
+protected slots:
+ void slotItemSelected(QListViewItem*);
+
+protected:
+ void keyPressEvent(QKeyEvent *);
+ QPixmap loadIcon( const QString &name );
+
+private:
+ QString _path;
+ ConfigModuleList *_modules;
+
+};
+
+
+
+#endif
diff --git a/kcontrol/kcontrol/modulemenu.cpp b/kcontrol/kcontrol/modulemenu.cpp
new file mode 100644
index 000000000..02becb29a
--- /dev/null
+++ b/kcontrol/kcontrol/modulemenu.cpp
@@ -0,0 +1,105 @@
+this file is currently not used.
+this message breaks compilation.
+that is intentional :-]
+
+/*
+ Copyright (c) 2000 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+
+#include <qheader.h>
+#include <qstring.h>
+#include <qptrlist.h>
+#include <qpoint.h>
+#include <qcursor.h>
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kiconloader.h>
+#include <kservicegroup.h>
+#include <kdebug.h>
+
+#include "modulemenu.h"
+#include "modulemenu.moc"
+#include "modules.h"
+#include "global.h"
+
+
+ModuleMenu::ModuleMenu(ConfigModuleList *list, QWidget * parent, const char * name)
+ : KPopupMenu(parent, name)
+ , _modules(list)
+{
+ // use large id's to start with...
+ id = 10000;
+
+ fill(this, KCGlobal::baseGroup());
+
+ connect(this, SIGNAL(activated(int)), this, SLOT(moduleSelected(int)));
+}
+
+void ModuleMenu::fill(KPopupMenu *parentMenu, const QString &parentPath)
+{
+ QStringList subMenus = _modules->submenus(parentPath);
+ for(QStringList::ConstIterator it = subMenus.begin();
+ it != subMenus.end(); ++it)
+ {
+ QString path = *it;
+ KServiceGroup::Ptr group = KServiceGroup::group(path);
+ if (!group)
+ continue;
+
+ // create new menu
+ KPopupMenu *menu = new KPopupMenu(parentMenu);
+ connect(menu, SIGNAL(activated(int)), this, SLOT(moduleSelected(int)));
+
+ // Item names may contain ampersands. To avoid them being converted to
+ // accelators, replace them with two ampersands.
+ QString name = group->caption();
+ name.replace("&", "&&");
+
+ parentMenu->insertItem(KGlobal::iconLoader()->loadIcon(group->icon(), KIcon::Desktop, KIcon::SizeSmall)
+ , name, menu);
+
+ fill(menu, path);
+ }
+
+ ConfigModule *module;
+ QPtrList<ConfigModule> moduleList = _modules->modules(parentPath);
+ for (module=moduleList.first(); module != 0; module=moduleList.next())
+ {
+ // Item names may contain ampersands. To avoid them being converted to
+ // accelators, replace them with two ampersands.
+ QString name = module->moduleName();
+ name.replace("&", "&&");
+
+ int realid = parentMenu->insertItem(KGlobal::iconLoader()->loadIcon(module->icon(), KIcon::Desktop, KIcon::SizeSmall)
+ , name, id);
+ _moduleDict.insert(realid, module);
+
+ id++;
+ }
+
+}
+
+void ModuleMenu::moduleSelected(int id)
+{
+ kdDebug(1208) << "Item " << id << " selected" << endl;
+ ConfigModule *module = _moduleDict[id];
+ if (module)
+ emit moduleActivated(module);
+}
diff --git a/kcontrol/kcontrol/modulemenu.h b/kcontrol/kcontrol/modulemenu.h
new file mode 100644
index 000000000..b08140bfc
--- /dev/null
+++ b/kcontrol/kcontrol/modulemenu.h
@@ -0,0 +1,65 @@
+this file is currently not used.
+this message breaks compilation.
+that is intentional :-]
+
+/*
+ Copyright (c) 2000 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __modulemenu_h__
+#define __modulemenu_h__
+
+
+#include <qptrlist.h>
+#include <qstringlist.h>
+#include <qintdict.h>
+#include <qstring.h>
+#include <qwidget.h>
+#include <qdict.h>
+
+#include <kpopupmenu.h>
+
+
+class ConfigModule;
+class ConfigModuleList;
+
+
+class ModuleMenu : public KPopupMenu
+{
+ Q_OBJECT
+
+public:
+ ModuleMenu(ConfigModuleList *list, QWidget * parent = 0, const char * name = 0);
+
+signals:
+ void moduleActivated(ConfigModule*);
+
+private slots:
+ void moduleSelected(int id);
+
+protected:
+ void fill(KPopupMenu *parentMenu, const QString &parentPath);
+
+private:
+ int id;
+
+ ConfigModuleList *_modules;
+ QIntDict<ConfigModule> _moduleDict;
+};
+
+
+#endif
diff --git a/kcontrol/kcontrol/modules.cpp b/kcontrol/kcontrol/modules.cpp
new file mode 100644
index 000000000..b6d8a2693
--- /dev/null
+++ b/kcontrol/kcontrol/modules.cpp
@@ -0,0 +1,345 @@
+/*
+ Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <unistd.h>
+#include <sys/types.h>
+
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qvbox.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kservicegroup.h>
+#include <kprocess.h>
+#include <qxembed.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+
+#include "modules.h"
+#include "modules.moc"
+#include "global.h"
+#include "proxywidget.h"
+#include <kcmoduleloader.h>
+#include "kcrootonly.h"
+
+#include <X11/Xlib.h>
+
+
+template class QPtrList<ConfigModule>;
+
+
+ConfigModule::ConfigModule(const KService::Ptr &s)
+ : KCModuleInfo(s), _changed(false), _module(0), _embedWidget(0),
+ _rootProcess(0), _embedLayout(0), _embedFrame(0), _embedStack(0)
+{
+}
+
+ConfigModule::~ConfigModule()
+{
+ deleteClient();
+}
+
+ProxyWidget *ConfigModule::module()
+{
+ if (_module)
+ return _module;
+
+ bool run_as_root = needsRootPrivileges() && (getuid() != 0);
+
+ KCModule *modWidget = 0;
+
+ if (run_as_root && isHiddenByDefault())
+ modWidget = new KCRootOnly(0, "root_only");
+ else
+ modWidget = KCModuleLoader::loadModule(*this);
+
+ if (modWidget)
+ {
+
+ _module = new ProxyWidget(modWidget, moduleName(), "", run_as_root);
+ connect(_module, SIGNAL(changed(bool)), this, SLOT(clientChanged(bool)));
+ connect(_module, SIGNAL(closed()), this, SLOT(clientClosed()));
+ connect(_module, SIGNAL(handbookRequest()), this, SIGNAL(handbookRequest()));
+ connect(_module, SIGNAL(helpRequest()), this, SIGNAL(helpRequest()));
+ connect(_module, SIGNAL(runAsRoot()), this, SLOT(runAsRoot()));
+
+ return _module;
+ }
+
+ return 0;
+}
+
+void ConfigModule::deleteClient()
+{
+ if (_embedWidget)
+ XKillClient(qt_xdisplay(), _embedWidget->embeddedWinId());
+
+ delete _rootProcess;
+ _rootProcess = 0;
+
+ delete _embedWidget;
+ _embedWidget = 0;
+ delete _embedStack;
+ _embedStack = 0;
+ delete _embedFrame;
+ _embedFrame = 0;
+ kapp->syncX();
+
+ if(_module)
+ _module->close(true);
+ _module = 0;
+
+ delete _embedLayout;
+ _embedLayout = 0;
+
+ KCModuleLoader::unloadModule(*this);
+ _changed = false;
+}
+
+void ConfigModule::clientClosed()
+{
+ deleteClient();
+
+ emit changed(this);
+ emit childClosed();
+}
+
+
+void ConfigModule::clientChanged(bool state)
+{
+ setChanged(state);
+ emit changed(this);
+}
+
+
+void ConfigModule::runAsRoot()
+{
+ if (!_module)
+ return;
+
+ delete _rootProcess;
+ delete _embedWidget;
+ delete _embedLayout;
+ delete _embedStack;
+
+ // create an embed widget that will embed the
+ // kcmshell running as root
+ _embedLayout = new QVBoxLayout(_module->parentWidget());
+ _embedFrame = new QVBox( _module->parentWidget() );
+ _embedFrame->setFrameStyle( QFrame::Box | QFrame::Raised );
+ QPalette pal( red );
+ pal.setColor( QColorGroup::Background,
+ _module->parentWidget()->colorGroup().background() );
+ _embedFrame->setPalette( pal );
+ _embedFrame->setLineWidth( 2 );
+ _embedFrame->setMidLineWidth( 2 );
+ _embedLayout->addWidget(_embedFrame,1);
+ // cannot reparent anything else inside QXEmbed, so put the busy label separately
+ _embedStack = new QWidgetStack(_embedFrame);
+ _embedWidget = new KControlEmbed(_embedStack);
+ _module->hide();
+ _embedFrame->show();
+ QLabel *_busy = new QLabel(i18n("<big>Loading...</big>"), _embedStack);
+ _busy->setAlignment(AlignCenter);
+ _busy->setTextFormat(RichText);
+ _busy->setGeometry(0,0, _module->width(), _module->height());
+ _busy->show();
+ _embedStack->raiseWidget(_busy);
+ connect(_embedWidget, SIGNAL( windowEmbedded(WId)), SLOT( embedded()));
+
+ // prepare the process to run the kcmshell
+ QString cmd = service()->exec().stripWhiteSpace();
+ bool kdeshell = false;
+ if (cmd.left(5) == "kdesu")
+ {
+ cmd = cmd.remove(0,5).stripWhiteSpace();
+ // remove all kdesu switches
+ while( cmd.length() > 1 && cmd[ 0 ] == '-' )
+ {
+ int pos = cmd.find( ' ' );
+ cmd = cmd.remove( 0, pos ).stripWhiteSpace();
+ }
+ }
+
+ if (cmd.left(8) == "kcmshell")
+ {
+ cmd = cmd.remove(0,8).stripWhiteSpace();
+ kdeshell = true;
+ }
+
+ // run the process
+ QString kdesu = KStandardDirs::findExe("kdesu");
+ if (!kdesu.isEmpty())
+ {
+ _rootProcess = new KProcess;
+ *_rootProcess << kdesu;
+ *_rootProcess << "--nonewdcop";
+ // We have to disable the keep-password feature because
+ // in that case the modules is started through kdesud and kdesu
+ // returns before the module is running and that doesn't work.
+ // We also don't have a way to close the module in that case.
+ *_rootProcess << "--n"; // Don't keep password.
+ if (kdeshell) {
+ *_rootProcess << QString("%1 %2 --embed %3 --lang %4").arg(locate("exe", "kcmshell")).arg(cmd).arg(_embedWidget->winId()).arg(KGlobal::locale()->language());
+ }
+ else {
+ *_rootProcess << QString("%1 --embed %2 --lang %3").arg(cmd).arg(_embedWidget->winId()).arg( KGlobal::locale()->language() );
+ }
+
+ connect(_rootProcess, SIGNAL(processExited(KProcess*)), this, SLOT(rootExited(KProcess*)));
+
+ if ( !_rootProcess->start(KProcess::NotifyOnExit) )
+ {
+ delete _rootProcess;
+ _rootProcess = 0L;
+ }
+
+ return;
+ }
+
+ // clean up in case of failure
+ delete _embedStack;
+ _embedStack = 0;
+ delete _embedFrame;
+ _embedWidget = 0;
+ delete _embedLayout;
+ _embedLayout = 0;
+ _module->show();
+}
+
+
+void ConfigModule::rootExited(KProcess *)
+{
+ if (_embedWidget->embeddedWinId())
+ XDestroyWindow(qt_xdisplay(), _embedWidget->embeddedWinId());
+
+ delete _embedWidget;
+ _embedWidget = 0;
+
+ delete _rootProcess;
+ _rootProcess = 0;
+
+ delete _embedLayout;
+ _embedLayout = 0;
+
+ delete _module;
+ _module=0;
+
+ _changed = false;
+ emit changed(this);
+ emit childClosed();
+}
+
+void ConfigModule::embedded()
+{
+ _embedStack->raiseWidget(_embedWidget); // put it above the busy label
+}
+
+const KAboutData *ConfigModule::aboutData() const
+{
+ if (!_module) return 0;
+ return _module->aboutData();
+}
+
+
+ConfigModuleList::ConfigModuleList()
+{
+ setAutoDelete(true);
+ subMenus.setAutoDelete(true);
+}
+
+void ConfigModuleList::readDesktopEntries()
+{
+ readDesktopEntriesRecursive( KCGlobal::baseGroup() );
+}
+
+bool ConfigModuleList::readDesktopEntriesRecursive(const QString &path)
+{
+
+ KServiceGroup::Ptr group = KServiceGroup::group(path);
+
+ if (!group || !group->isValid()) return false;
+
+ KServiceGroup::List list = group->entries(true, true);
+
+ if( list.isEmpty() )
+ return false;
+
+ Menu *menu = new Menu;
+ subMenus.insert(path, menu);
+
+ for( KServiceGroup::List::ConstIterator it = list.begin();
+ it != list.end(); it++)
+ {
+ KSycocaEntry *p = (*it);
+ if (p->isType(KST_KService))
+ {
+ KService *s = static_cast<KService*>(p);
+ if (!kapp->authorizeControlModule(s->menuId()))
+ continue;
+
+ ConfigModule *module = new ConfigModule(s);
+ if (module->library().isEmpty())
+ {
+ delete module;
+ continue;
+ }
+
+ append(module);
+ menu->modules.append(module);
+ }
+ else if (p->isType(KST_KServiceGroup) &&
+ readDesktopEntriesRecursive(p->entryPath()) )
+ menu->submenus.append(p->entryPath());
+
+ }
+ return true;
+}
+
+QPtrList<ConfigModule> ConfigModuleList::modules(const QString &path)
+{
+ Menu *menu = subMenus.find(path);
+ if (menu)
+ return menu->modules;
+
+ return QPtrList<ConfigModule>();
+}
+
+QStringList ConfigModuleList::submenus(const QString &path)
+{
+ Menu *menu = subMenus.find(path);
+ if (menu)
+ return menu->submenus;
+
+ return QStringList();
+}
+
+QString ConfigModuleList::findModule(ConfigModule *module)
+{
+ QDictIterator<Menu> it(subMenus);
+ Menu *menu;
+ for(;(menu = it.current());++it)
+ {
+ if (menu->modules.containsRef(module))
+ return it.currentKey();
+ }
+ return QString::null;
+}
diff --git a/kcontrol/kcontrol/modules.h b/kcontrol/kcontrol/modules.h
new file mode 100644
index 000000000..f2364698d
--- /dev/null
+++ b/kcontrol/kcontrol/modules.h
@@ -0,0 +1,136 @@
+/*
+ Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef MODULES_H
+#define MODULES_H
+
+#include <kcmoduleinfo.h>
+#include <qobject.h>
+#include <qdict.h>
+#include <qxembed.h>
+
+template<class ConfigModule> class QPtrList;
+class QStringList;
+class KAboutData;
+class KCModule;
+class ProxyWidget;
+class KProcess;
+class QXEmbed;
+class QVBoxLayout;
+class QVBox;
+class QWidgetStack;
+
+class ConfigModule : public QObject, public KCModuleInfo
+{
+ Q_OBJECT
+
+public:
+
+ ConfigModule(const KService::Ptr &s);
+ ~ConfigModule();
+
+ bool isChanged() { return _changed; };
+ void setChanged(bool changed) { _changed = changed; };
+
+ bool isActive() { return _module != 0; };
+ ProxyWidget *module();
+ const KAboutData *aboutData() const;
+
+
+public slots:
+
+ void deleteClient();
+
+
+private slots:
+
+ void clientClosed();
+ void clientChanged(bool state);
+ void runAsRoot();
+ void rootExited(KProcess *proc);
+ void embedded();
+
+
+signals:
+
+ void changed(ConfigModule *module);
+ void childClosed();
+ void handbookRequest();
+ void helpRequest();
+
+
+private:
+
+ bool _changed;
+ ProxyWidget *_module;
+ QXEmbed *_embedWidget;
+ KProcess *_rootProcess;
+ QVBoxLayout *_embedLayout;
+ QVBox *_embedFrame;
+ QWidgetStack *_embedStack;
+
+};
+
+class ConfigModuleList : public QPtrList<ConfigModule>
+{
+public:
+
+ ConfigModuleList();
+
+ void readDesktopEntries();
+ bool readDesktopEntriesRecursive(const QString &path);
+
+ /**
+ * Returns all submenus of the submenu identified by path
+ */
+ QPtrList<ConfigModule> modules(const QString &path);
+
+ /**
+ * Returns all modules of the submenu identified by path
+ */
+ QStringList submenus(const QString &path);
+
+ /**
+ * Returns the path of the submenu the module is in
+ */
+ QString findModule(ConfigModule *module);
+
+protected:
+
+ class Menu
+ {
+ public:
+ QPtrList<ConfigModule> modules;
+ QStringList submenus;
+ };
+
+ QDict<Menu> subMenus;
+};
+
+class KControlEmbed : public QXEmbed
+ {
+ Q_OBJECT
+ public:
+ KControlEmbed( QWidget* w ) : QXEmbed( w ) {}
+ virtual void windowChanged( WId w ) { if( w ) emit windowEmbedded( w ); }
+ signals:
+ void windowEmbedded( WId w );
+ };
+
+#endif
diff --git a/kcontrol/kcontrol/moduletreeview.cpp b/kcontrol/kcontrol/moduletreeview.cpp
new file mode 100644
index 000000000..f933cfcef
--- /dev/null
+++ b/kcontrol/kcontrol/moduletreeview.cpp
@@ -0,0 +1,377 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <qheader.h>
+#include <qimage.h>
+#include <qpainter.h>
+#include <qbitmap.h>
+
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kservicegroup.h>
+#include <kdebug.h>
+#include <qwhatsthis.h>
+#include <qbitmap.h>
+
+#include "moduletreeview.h"
+#include "moduletreeview.moc"
+#include "modules.h"
+#include "global.h"
+
+static QPixmap appIcon(const QString &iconName)
+{
+ QString path;
+ QPixmap normal = KGlobal::iconLoader()->loadIcon(iconName, KIcon::Small, 0, KIcon::DefaultState, &path, true);
+ // make sure they are not larger than KIcon::SizeSmall
+ if (normal.width() > KIcon::SizeSmall || normal.height() > KIcon::SizeSmall)
+ {
+ QImage tmp = normal.convertToImage();
+ tmp = tmp.smoothScale(KIcon::SizeSmall, KIcon::SizeSmall);
+ normal.convertFromImage(tmp);
+ }
+ return normal;
+}
+
+class ModuleTreeWhatsThis : public QWhatsThis
+{
+public:
+ ModuleTreeWhatsThis( ModuleTreeView* tree)
+ : QWhatsThis( tree ), treeView( tree ) {}
+ ~ModuleTreeWhatsThis(){};
+
+
+ QString text( const QPoint & p) {
+ ModuleTreeItem* i = (ModuleTreeItem*) treeView->itemAt( p );
+ if ( i && i->module() ) {
+ return i->module()->comment();
+ } else if ( i ) {
+ return i18n("The %1 configuration group. Click to open it.").arg( i->text(0) );
+ }
+ return i18n("This treeview displays all available control modules. Click on one of the modules to receive more detailed information.");
+ }
+
+private:
+ ModuleTreeView* treeView;
+};
+
+ModuleTreeView::ModuleTreeView(ConfigModuleList *list, QWidget * parent, const char * name)
+ : KListView(parent, name)
+ , _modules(list)
+{
+ addColumn(QString::null);
+ setColumnWidthMode (0, QListView::Maximum);
+ setAllColumnsShowFocus(true);
+ setResizeMode(QListView::AllColumns);
+ setRootIsDecorated(true);
+ setHScrollBarMode(AlwaysOff);
+ header()->hide();
+
+ new ModuleTreeWhatsThis( this );
+
+ connect(this, SIGNAL(clicked(QListViewItem*)),
+ this, SLOT(slotItemSelected(QListViewItem*)));
+}
+
+void ModuleTreeView::fill()
+{
+ clear();
+
+ QStringList subMenus = _modules->submenus(KCGlobal::baseGroup());
+ for(QStringList::ConstIterator it = subMenus.begin();
+ it != subMenus.end(); ++it)
+ {
+ QString path = *it;
+ ModuleTreeItem* menu = new ModuleTreeItem(this);
+ menu->setGroup(path);
+ fill(menu, path);
+ }
+
+ ConfigModule *module;
+ QPtrList<ConfigModule> moduleList = _modules->modules(KCGlobal::baseGroup());
+ for (module=moduleList.first(); module != 0; module=moduleList.next())
+ {
+ new ModuleTreeItem(this, module);
+ }
+}
+
+void ModuleTreeView::fill(ModuleTreeItem *parent, const QString &parentPath)
+{
+ QStringList subMenus = _modules->submenus(parentPath);
+ for(QStringList::ConstIterator it = subMenus.begin();
+ it != subMenus.end(); ++it)
+ {
+ QString path = *it;
+ ModuleTreeItem* menu = new ModuleTreeItem(parent);
+ menu->setGroup(path);
+ fill(menu, path);
+ }
+
+ ConfigModule *module;
+ QPtrList<ConfigModule> moduleList = _modules->modules(parentPath);
+ for (module=moduleList.first(); module != 0; module=moduleList.next())
+ {
+ new ModuleTreeItem(parent, module);
+ }
+}
+
+
+
+QSize ModuleTreeView::sizeHint() const
+{
+ return QListView::sizeHint().boundedTo(
+ QSize( fontMetrics().maxWidth()*35, QWIDGETSIZE_MAX) );
+}
+
+void ModuleTreeView::makeSelected(ConfigModule *module)
+{
+ ModuleTreeItem *item = static_cast<ModuleTreeItem*>(firstChild());
+
+ updateItem(item, module);
+}
+
+void ModuleTreeView::updateItem(ModuleTreeItem *item, ConfigModule *module)
+{
+ while (item)
+ {
+ if (item->childCount() != 0)
+ updateItem(static_cast<ModuleTreeItem*>(item->firstChild()), module);
+ if (item->module() == module)
+ {
+ setSelected(item, true);
+ break;
+ }
+ item = static_cast<ModuleTreeItem*>(item->nextSibling());
+ }
+}
+
+/*
+void ModuleTreeView::expandItem(QListViewItem *item, QPtrList<QListViewItem> *parentList)
+{
+ while (item)
+ {
+ setOpen(item, parentList->contains(item));
+
+ if (item->childCount() != 0)
+ expandItem(item->firstChild(), parentList);
+ item = item->nextSibling();
+ }
+}
+*/
+void ModuleTreeView::makeVisible(ConfigModule *module)
+{
+ QString path = _modules->findModule(module);
+ if (path.startsWith(KCGlobal::baseGroup()))
+ path = path.mid(KCGlobal::baseGroup().length());
+
+ QStringList groups = QStringList::split('/', path);
+
+ ModuleTreeItem *item = 0;
+ QStringList::ConstIterator it;
+ for (it=groups.begin(); it != groups.end(); ++it)
+ {
+ if (item)
+ item = static_cast<ModuleTreeItem*>(item->firstChild());
+ else
+ item = static_cast<ModuleTreeItem*>(firstChild());
+
+ while (item)
+ {
+ if (item->tag() == *it)
+ {
+ setOpen(item, true);
+ break;
+ }
+ item = static_cast<ModuleTreeItem*>(item->nextSibling());
+ }
+ if (!item)
+ break; // Not found (?)
+ }
+
+ // make the item visible
+ if (item)
+ ensureItemVisible(item);
+}
+
+void ModuleTreeView::slotItemSelected(QListViewItem* item)
+{
+ if (!item) return;
+
+ if (static_cast<ModuleTreeItem*>(item)->module())
+ {
+ emit moduleSelected(static_cast<ModuleTreeItem*>(item)->module());
+ return;
+ }
+ else
+ {
+ emit categorySelected(item);
+ }
+
+ setOpen(item, !item->isOpen());
+
+ /*
+ else
+ {
+ QPtrList<QListViewItem> parents;
+
+ QListViewItem* i = item;
+ while(i)
+ {
+ parents.append(i);
+ i = i->parent();
+ }
+
+ //int oy1 = item->itemPos();
+ //int oy2 = mapFromGlobal(QCursor::pos()).y();
+ //int offset = oy2 - oy1;
+
+ expandItem(firstChild(), &parents);
+
+ //int x =mapFromGlobal(QCursor::pos()).x();
+ //int y = item->itemPos() + offset;
+ //QCursor::setPos(mapToGlobal(QPoint(x, y)));
+ }
+ */
+}
+
+void ModuleTreeView::keyPressEvent(QKeyEvent *e)
+{
+ if (!currentItem()) return;
+
+ if(e->key() == Key_Return
+ || e->key() == Key_Enter
+ || e->key() == Key_Space)
+ {
+ //QCursor::setPos(mapToGlobal(QPoint(10, currentItem()->itemPos()+5)));
+ slotItemSelected(currentItem());
+ }
+ else
+ KListView::keyPressEvent(e);
+}
+
+
+ModuleTreeItem::ModuleTreeItem(QListViewItem *parent, ConfigModule *module)
+ : QListViewItem(parent)
+ , _module(module)
+ , _tag(QString::null)
+ , _maxChildIconWidth(0)
+{
+ if (_module)
+ {
+ setText(0, " " + module->moduleName());
+ _icon = module->icon();
+ setPixmap(0, appIcon(_icon));
+ }
+}
+
+ModuleTreeItem::ModuleTreeItem(QListView *parent, ConfigModule *module)
+ : QListViewItem(parent)
+ , _module(module)
+ , _tag(QString::null)
+ , _maxChildIconWidth(0)
+{
+ if (_module)
+ {
+ setText(0, " " + module->moduleName());
+ _icon = module->icon();
+ setPixmap(0, appIcon(_icon));
+ }
+}
+
+ModuleTreeItem::ModuleTreeItem(QListViewItem *parent, const QString& text)
+ : QListViewItem(parent, " " + text)
+ , _module(0)
+ , _tag(QString::null)
+ , _maxChildIconWidth(0)
+ {}
+
+ModuleTreeItem::ModuleTreeItem(QListView *parent, const QString& text)
+ : QListViewItem(parent, " " + text)
+ , _module(0)
+ , _tag(QString::null)
+ , _maxChildIconWidth(0)
+ {}
+
+void ModuleTreeItem::setPixmap(int column, const QPixmap& pm)
+{
+ if (!pm.isNull())
+ {
+ ModuleTreeItem* p = dynamic_cast<ModuleTreeItem*>(parent());
+ if (p)
+ p->regChildIconWidth(pm.width());
+ }
+
+ QListViewItem::setPixmap(column, pm);
+}
+
+void ModuleTreeItem::regChildIconWidth(int width)
+{
+ if (width > _maxChildIconWidth)
+ _maxChildIconWidth = width;
+}
+
+void ModuleTreeItem::paintCell( QPainter * p, const QColorGroup & cg, int column, int width, int align )
+{
+ if (!pixmap(0))
+ {
+ int offset = 0;
+ ModuleTreeItem* parentItem = dynamic_cast<ModuleTreeItem*>(parent());
+ if (parentItem)
+ {
+ offset = parentItem->maxChildIconWidth();
+ }
+
+ if (offset > 0)
+ {
+ QPixmap pixmap(offset, offset);
+ pixmap.fill(Qt::color0);
+ pixmap.setMask(pixmap.createHeuristicMask());
+ QBitmap mask( pixmap.size(), true );
+ pixmap.setMask( mask );
+ QListViewItem::setPixmap(0, pixmap);
+ }
+ }
+
+ QListViewItem::paintCell( p, cg, column, width, align );
+}
+
+
+void ModuleTreeItem::setGroup(const QString &path)
+{
+ KServiceGroup::Ptr group = KServiceGroup::group(path);
+ QString defName = path.left(path.length()-1);
+ int pos = defName.findRev('/');
+ if (pos >= 0)
+ defName = defName.mid(pos+1);
+ if (group && group->isValid())
+ {
+ _icon = group->icon();
+ setPixmap(0, appIcon(_icon));
+ setText(0, " " + group->caption());
+ setTag(defName);
+ setCaption(group->caption());
+ }
+ else
+ {
+ // Should not happen: Installation problem
+ // Let's try to fail softly.
+ setText(0, " " + defName);
+ setTag(defName);
+ }
+}
diff --git a/kcontrol/kcontrol/moduletreeview.h b/kcontrol/kcontrol/moduletreeview.h
new file mode 100644
index 000000000..ecdd2d938
--- /dev/null
+++ b/kcontrol/kcontrol/moduletreeview.h
@@ -0,0 +1,95 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __moduletreeview_h__
+#define __moduletreeview_h__
+
+#include <qpalette.h>
+#include <qptrlist.h>
+#include <qlistview.h>
+#include <klistview.h>
+#include <qdict.h>
+
+
+class ConfigModule;
+class ConfigModuleList;
+class QPainter;
+
+class ModuleTreeItem : public QListViewItem
+{
+
+public:
+ ModuleTreeItem(QListViewItem *parent, ConfigModule *module = 0);
+ ModuleTreeItem(QListViewItem *parent, const QString& text);
+ ModuleTreeItem(QListView *parent, ConfigModule *module = 0);
+ ModuleTreeItem(QListView *parent, const QString& text);
+
+ void setTag(const QString& tag) { _tag = tag; }
+ void setCaption(const QString& caption) { _caption = caption; }
+ void setModule(ConfigModule *m) { _module = m; }
+ QString tag() const { return _tag; };
+ QString caption() const { return _caption; };
+ QString icon() const { return _icon; };
+ ConfigModule *module() { return _module; };
+ void regChildIconWidth(int width);
+ int maxChildIconWidth() { return _maxChildIconWidth; }
+
+ void setPixmap(int column, const QPixmap& pm);
+ void setGroup(const QString &path);
+
+protected:
+ void paintCell( QPainter * p, const QColorGroup & cg, int column, int width, int align );
+
+private:
+ ConfigModule *_module;
+ QString _tag;
+ QString _caption;
+ int _maxChildIconWidth;
+ QString _icon;
+};
+
+class ModuleTreeView : public KListView
+{
+ Q_OBJECT
+
+public:
+ ModuleTreeView(ConfigModuleList *list, QWidget * parent = 0, const char * name = 0);
+
+ void makeSelected(ConfigModule* module);
+ void makeVisible(ConfigModule *module);
+ void fill();
+ QSize sizeHint() const;
+
+signals:
+ void moduleSelected(ConfigModule*);
+ void categorySelected(QListViewItem*);
+
+protected slots:
+ void slotItemSelected(QListViewItem*);
+
+protected:
+ void updateItem(ModuleTreeItem *item, ConfigModule* module);
+ void keyPressEvent(QKeyEvent *);
+ void fill(ModuleTreeItem *parent, const QString &parentPath);
+
+private:
+ ConfigModuleList *_modules;
+};
+
+#endif
diff --git a/kcontrol/kcontrol/proxywidget.cpp b/kcontrol/kcontrol/proxywidget.cpp
new file mode 100644
index 000000000..6654bfe14
--- /dev/null
+++ b/kcontrol/kcontrol/proxywidget.cpp
@@ -0,0 +1,323 @@
+/*
+ Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <unistd.h> // for getuid()
+
+#include <kpushbutton.h>
+#include <qlayout.h>
+#include <klocale.h>
+#include <kapplication.h>
+#include <kcmodule.h>
+#include <kseparator.h>
+#include <kdialog.h>
+#include <kstdguiitem.h>
+#include <dcopclient.h>
+
+#include <qwhatsthis.h>
+#include <qlabel.h>
+
+#include "global.h"
+#include "proxywidget.h"
+#include "proxywidget.moc"
+
+#include <kdebug.h>
+#include <qtimer.h>
+
+class WhatsThis : public QWhatsThis
+{
+public:
+ WhatsThis( ProxyWidget* parent )
+ : QWhatsThis( parent ), proxy( parent ) {}
+ ~WhatsThis(){};
+
+
+ QString text( const QPoint & ) {
+ if ( !proxy->quickHelp().isEmpty() )
+ return proxy->quickHelp();
+ else
+ return i18n("The currently loaded configuration module.");
+ }
+
+private:
+ ProxyWidget* proxy;
+};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void setVisible(QPushButton *btn, bool vis)
+{
+ if (vis)
+ btn->show();
+ else
+ btn->hide();
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+class RootInfoWidget : public QLabel
+{
+public:
+ RootInfoWidget(QWidget *parent, const char *name);
+ void setRootMsg(const QString& s) { setText(s); }
+};
+
+RootInfoWidget::RootInfoWidget(QWidget *parent, const char *name = 0)
+ : QLabel(parent, name)
+{
+ setFrameShape(QFrame::Box);
+ setFrameShadow(QFrame::Raised);
+
+ setText(i18n("<b>Changes in this module require root access.</b><br>"
+ "Click the \"Administrator Mode\" button to "
+ "allow modifications in this module."));
+
+ QWhatsThis::add(this, i18n("This module requires special permissions, probably "
+ "for system-wide modifications; therefore, it is "
+ "required that you provide the root password to be "
+ "able to change the module's properties. If you "
+ "do not provide the password, the module will be "
+ "disabled."));
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+class ProxyView : public QScrollView
+{
+public:
+ ProxyView(KCModule *client, const QString& title, QWidget *parent, bool run_as_root, const char *name);
+
+private:
+ virtual void resizeEvent(QResizeEvent *);
+
+ QWidget *contentWidget;
+ KCModule *client;
+ bool scroll;
+};
+
+class ProxyContentWidget : public QWidget
+{
+public:
+ ProxyContentWidget( QWidget* parent ) : QWidget( parent ) {}
+ ~ProxyContentWidget(){}
+
+ // this should be really done by qscrollview in AutoOneFit mode!
+ QSize sizeHint() const { return minimumSizeHint(); }
+};
+
+
+ProxyView::ProxyView(KCModule *_client, const QString&, QWidget *parent, bool run_as_root, const char *name)
+ : QScrollView(parent, name), client(_client)
+{
+ setResizePolicy(QScrollView::AutoOneFit);
+ setFrameStyle( NoFrame );
+ contentWidget = new ProxyContentWidget( viewport() );
+
+ QVBoxLayout* vbox = new QVBoxLayout( contentWidget );
+
+ if (run_as_root && _client->useRootOnlyMsg()) // notify the user
+ {
+ RootInfoWidget *infoBox = new RootInfoWidget(contentWidget);
+ vbox->addWidget( infoBox );
+ QString msg = _client->rootOnlyMsg();
+ if (!msg.isEmpty())
+ infoBox->setRootMsg(msg);
+ vbox->setSpacing(KDialog::spacingHint());
+ }
+ client->reparent(contentWidget,0,QPoint(0,0),true);
+ vbox->addWidget( client );
+ vbox->activate(); // make sure we have a proper minimumSizeHint
+ addChild(contentWidget);
+}
+
+void ProxyView::resizeEvent(QResizeEvent *e)
+{
+ QScrollView::resizeEvent(e);
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+ProxyWidget::ProxyWidget(KCModule *client, QString title, const char *name,
+ bool run_as_root)
+ : QWidget(0, name)
+ , _client(client)
+{
+ setCaption(title);
+
+ if (getuid()==0 ) {
+ // Make root modules look as similar as possible...
+ QCString replyType;
+ QByteArray replyData;
+
+ if (kapp->dcopClient()->call("kcontrol", "moduleIface", "getPalette()", QByteArray(),
+ replyType, replyData))
+ if ( replyType == "QPalette") {
+ QDataStream reply( replyData, IO_ReadOnly );
+ QPalette pal;
+ reply >> pal;
+ setPalette(pal);
+ }
+/* // Doesn't work ...
+ if (kapp->dcopClient()->call("kcontrol", "moduleIface", "getStyle()", QByteArray(),
+ replyType, replyData))
+ if ( replyType == "QString") {
+ QDataStream reply( replyData, IO_ReadOnly );
+ QString style;
+ reply >> style;
+ setStyle(style);
+ }
+*/
+ if (kapp->dcopClient()->call("kcontrol", "moduleIface", "getFont()", QByteArray(),
+ replyType, replyData))
+ if ( replyType == "QFont") {
+ QDataStream reply( replyData, IO_ReadOnly );
+ QFont font;
+ reply >> font;
+ setFont(font);
+ }
+ }
+
+ view = new ProxyView(client, title, this, run_as_root, "proxyview");
+ (void) new WhatsThis( this );
+
+ connect(_client, SIGNAL(changed(bool)), SLOT(clientChanged(bool)));
+ connect(_client, SIGNAL(quickHelpChanged()), SIGNAL(quickHelpChanged()));
+
+ _sep = new KSeparator(KSeparator::HLine, this);
+
+ _handbook= new KPushButton( KGuiItem(KStdGuiItem::help().text(),"contents"), this );
+ _default = new KPushButton( KStdGuiItem::defaults(), this );
+ _apply = new KPushButton( KStdGuiItem::apply(), this );
+ _reset = new KPushButton( KGuiItem( i18n( "&Reset" ), "undo" ), this );
+ _root = new KPushButton( KGuiItem(i18n( "&Administrator Mode" )), this );
+
+ bool mayModify = (!run_as_root || !_client->useRootOnlyMsg()) && !KCGlobal::isInfoCenter();
+
+ // only enable the requested buttons
+ int b = _client->buttons();
+ setVisible(_handbook, (b & KCModule::Help));
+ setVisible(_default, mayModify && (b & KCModule::Default));
+ setVisible(_apply, mayModify && (b & KCModule::Apply));
+ setVisible(_reset, mayModify && (b & KCModule::Apply));
+ setVisible(_root, run_as_root);
+
+ // disable initial buttons
+ _apply->setEnabled( false );
+ _reset->setEnabled( false );
+
+ connect(_handbook, SIGNAL(clicked()), SLOT(handbookClicked()));
+ connect(_default, SIGNAL(clicked()), SLOT(defaultClicked()));
+ connect(_apply, SIGNAL(clicked()), SLOT(applyClicked()));
+ connect(_reset, SIGNAL(clicked()), SLOT(resetClicked()));
+ connect(_root, SIGNAL(clicked()), SLOT(rootClicked()));
+
+ QVBoxLayout *top = new QVBoxLayout(this, KDialog::marginHint(),
+ KDialog::spacingHint());
+ top->addWidget(view);
+ top->addWidget(_sep);
+
+ QHBoxLayout *buttons = new QHBoxLayout(top, 4);
+ buttons->addWidget(_handbook);
+ buttons->addWidget(_default);
+ if (run_as_root)
+ {
+ buttons->addWidget(_root);
+ }
+
+ buttons->addStretch(1);
+ if (mayModify)
+ {
+ buttons->addWidget(_apply);
+ buttons->addWidget(_reset);
+ }
+
+ top->activate();
+}
+
+ProxyWidget::~ProxyWidget()
+{
+ delete _client;
+}
+
+QString ProxyWidget::quickHelp() const
+{
+ if (_client)
+ return _client->quickHelp();
+ else
+ return "";
+}
+
+void ProxyWidget::handbookClicked()
+{
+ if (getuid()!=0)
+ emit handbookRequest();
+ else
+ kapp->dcopClient()->send("kcontrol", "moduleIface", "invokeHandbook()", QByteArray());
+}
+
+void ProxyWidget::helpClicked()
+{
+ if (getuid()!=0)
+ emit helpRequest();
+ else
+ kapp->dcopClient()->send("kcontrol", "moduleIface", "invokeHelp()", QByteArray());
+}
+
+void ProxyWidget::defaultClicked()
+{
+ clientChanged(true);
+ _client->defaults();
+}
+
+void ProxyWidget::applyClicked()
+{
+ _client->save();
+ clientChanged(false);
+}
+
+void ProxyWidget::resetClicked()
+{
+ _client->load();
+ clientChanged(false);
+}
+
+void ProxyWidget::rootClicked()
+{
+ emit runAsRoot();
+}
+
+void ProxyWidget::clientChanged(bool state)
+{
+ _apply->setEnabled(state);
+ _reset->setEnabled(state);
+
+ // forward the signal
+ emit changed(state);
+}
+
+const KAboutData *ProxyWidget::aboutData() const
+{
+ return _client->aboutData();
+}
+
+// vim: sw=2 sts=2 et
diff --git a/kcontrol/kcontrol/proxywidget.h b/kcontrol/kcontrol/proxywidget.h
new file mode 100644
index 000000000..a06e571de
--- /dev/null
+++ b/kcontrol/kcontrol/proxywidget.h
@@ -0,0 +1,82 @@
+/*
+
+ Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+
+
+#ifndef __PROXYWIDGET_H__
+#define __PROXYWIDGET_H__
+
+
+class QWidget;
+class QPushButton;
+class QFrame;
+
+class KCModule;
+class KAboutData;
+
+#include "dockcontainer.h"
+#include <qscrollview.h>
+
+class ProxyView;
+
+class ProxyWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+
+ ProxyWidget(KCModule *client, QString title, const char *name=0, bool run_as_root = false);
+ ~ProxyWidget();
+
+ QString quickHelp() const;
+ const KAboutData *aboutData() const;
+
+public slots:
+
+ void handbookClicked();
+ void helpClicked();
+ void defaultClicked();
+ void applyClicked();
+ void resetClicked();
+ void rootClicked();
+
+ void clientChanged(bool state);
+
+
+signals:
+
+ void closed();
+ void handbookRequest();
+ void helpRequest();
+ void changed(bool state);
+ void runAsRoot();
+ void quickHelpChanged();
+
+private:
+
+ QPushButton *_handbook, *_default, *_apply, *_reset, *_root;
+ QFrame *_sep;
+ KCModule *_client;
+ ProxyView *view;
+
+};
+
+
+#endif
diff --git a/kcontrol/kcontrol/searchwidget.cpp b/kcontrol/kcontrol/searchwidget.cpp
new file mode 100644
index 000000000..9701d2d20
--- /dev/null
+++ b/kcontrol/kcontrol/searchwidget.cpp
@@ -0,0 +1,205 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ Copyright (c) 2004 Daniel Molkentin <molkentin@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qsortedlist.h>
+#include <qregexp.h>
+
+#include <klineedit.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <klistbox.h>
+
+#include "searchwidget.h"
+#include "searchwidget.moc"
+
+/**
+ * Helper class for sorting icon modules by name without losing the fileName ID
+ */
+class ModuleItem : public QListBoxPixmap
+{
+public:
+ ModuleItem(ConfigModule *module, QListBox * listbox = 0) :
+ QListBoxPixmap(listbox,
+ KGlobal::iconLoader()->loadIcon(module->icon(), KIcon::Desktop, KIcon::SizeSmall),
+ module->moduleName())
+ , m_module(module)
+ {
+
+ }
+
+ ConfigModule *module() const { return m_module; };
+
+protected:
+ ConfigModule *m_module;
+
+};
+
+KeywordListEntry::KeywordListEntry(const QString& name, ConfigModule* module)
+ : _name(name)
+{
+ if(module)
+ _modules.append(module);
+}
+
+void KeywordListEntry::addModule(ConfigModule* module)
+{
+ if(module)
+ _modules.append(module);
+}
+
+SearchWidget::SearchWidget(QWidget *parent , const char *name)
+ : QWidget(parent, name)
+{
+ _keywords.setAutoDelete(true);
+
+ QVBoxLayout * l = new QVBoxLayout(this, 0, 2);
+
+ // keyword list
+ _keyList = new KListBox(this);
+ QLabel *keyl = new QLabel(_keyList, i18n("&Keywords:"), this);
+
+ l->addWidget(keyl);
+ l->addWidget(_keyList);
+
+ // result list
+ _resultList = new KListBox(this);
+ QLabel *resultl = new QLabel(_resultList, i18n("&Results:"), this);
+
+ l->addWidget(resultl);
+ l->addWidget(_resultList);
+
+
+ connect(_keyList, SIGNAL(highlighted(const QString&)),
+ this, SLOT(slotKeywordSelected(const QString&)));
+
+ connect(_resultList, SIGNAL(selected(QListBoxItem*)),
+ this, SLOT(slotModuleSelected(QListBoxItem *)));
+ connect(_resultList, SIGNAL(clicked(QListBoxItem *)),
+ this, SLOT(slotModuleClicked(QListBoxItem *)));
+}
+
+void SearchWidget::populateKeywordList(ConfigModuleList *list)
+{
+ ConfigModule *module;
+
+ // loop through all control modules
+ for (module=list->first(); module != 0; module=list->next())
+ {
+ if (module->library().isEmpty())
+ continue;
+
+ // get the modules keyword list
+ QStringList kw = module->keywords();
+ kw << module->moduleName();
+
+ // loop through the keyword list to populate _keywords
+ for(QStringList::ConstIterator it = kw.begin(); it != kw.end(); ++it)
+ {
+ QString name = (*it).lower();
+ bool found = false;
+
+ // look if _keywords already has an entry for this keyword
+ for(KeywordListEntry *k = _keywords.first(); k != 0; k = _keywords.next())
+ {
+ // if there is an entry for this keyword, add the module to the entries modul list
+ if (k->moduleName() == name)
+ {
+ k->addModule(module);
+ found = true;
+ break;
+ }
+ }
+
+ // if there is entry for this keyword, create a new one
+ if (!found)
+ {
+ KeywordListEntry *k = new KeywordListEntry(name, module);
+ _keywords.append(k);
+ }
+ }
+ }
+ populateKeyListBox("*");
+}
+
+void SearchWidget::populateKeyListBox(const QString& s)
+{
+ _keyList->clear();
+
+ QStringList matches;
+
+ for(KeywordListEntry *k = _keywords.first(); k != 0; k = _keywords.next())
+ {
+ if ( QRegExp(s, false, true).search(k->moduleName()) >= 0)
+ matches.append(k->moduleName().stripWhiteSpace());
+ }
+
+ for(QStringList::ConstIterator it = matches.begin(); it != matches.end(); it++)
+ _keyList->insertItem(*it);
+
+ _keyList->sort();
+}
+
+void SearchWidget::populateResultListBox(const QString& s)
+{
+ _resultList->clear();
+
+ QPtrList<ModuleItem> results;
+
+ for(KeywordListEntry *k = _keywords.first(); k != 0; k = _keywords.next())
+ {
+ if (k->moduleName() == s)
+ {
+ QPtrList<ConfigModule> modules = k->modules();
+
+ for(ConfigModule *m = modules.first(); m != 0; m = modules.next())
+ new ModuleItem(m, _resultList);
+ }
+ }
+
+ _resultList->sort();
+}
+
+void SearchWidget::searchTextChanged(const QString & s)
+{
+ QString regexp = s;
+ regexp += "*";
+ populateKeyListBox(regexp);
+ if (_keyList->count()==1)
+ _keyList->setSelected(0,true);
+}
+
+void SearchWidget::slotKeywordSelected(const QString & s)
+{
+ populateResultListBox(s);
+}
+
+void SearchWidget::slotModuleSelected(QListBoxItem *item)
+{
+ if (item)
+ emit moduleSelected( static_cast<ModuleItem*>(item)->module() );
+}
+
+void SearchWidget::slotModuleClicked(QListBoxItem *item)
+{
+ if (item)
+ emit moduleSelected( static_cast<ModuleItem*>(item)->module() );
+}
diff --git a/kcontrol/kcontrol/searchwidget.h b/kcontrol/kcontrol/searchwidget.h
new file mode 100644
index 000000000..99aceb7e8
--- /dev/null
+++ b/kcontrol/kcontrol/searchwidget.h
@@ -0,0 +1,78 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ Copyright (c) 2004 Daniel Molkentin <molkentin@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __searchwidget_h__
+#define __searchwidget_h__
+
+#include <qwidget.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+#include "modules.h"
+
+class KListBox;
+class KLineEdit;
+class QListBoxItem;
+
+class KeywordListEntry
+{
+ public:
+ KeywordListEntry(const QString& name, ConfigModule* module);
+
+ void addModule(ConfigModule* module);
+
+ QString moduleName() { return _name; }
+ QPtrList<ConfigModule> modules() { return _modules; }
+
+ private:
+ QString _name;
+ QPtrList<ConfigModule> _modules;
+
+};
+
+class SearchWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ SearchWidget(QWidget *parent, const char *name=0);
+
+ void populateKeywordList(ConfigModuleList *list);
+ void searchTextChanged(const QString &);
+
+signals:
+ void moduleSelected(ConfigModule *);
+
+protected:
+ void populateKeyListBox(const QString& regexp);
+ void populateResultListBox(const QString& keyword);
+
+protected slots:
+ void slotKeywordSelected(const QString &);
+ void slotModuleSelected(QListBoxItem *item);
+ void slotModuleClicked(QListBoxItem *item);
+
+private:
+ KListBox *_keyList, *_resultList;
+ QPtrList<KeywordListEntry> _keywords;
+};
+
+#endif
diff --git a/kcontrol/kcontrol/toplevel.cpp b/kcontrol/kcontrol/toplevel.cpp
new file mode 100644
index 000000000..c7a47e372
--- /dev/null
+++ b/kcontrol/kcontrol/toplevel.cpp
@@ -0,0 +1,526 @@
+/*
+ Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ MA 02110-1301, USA.
+*/
+
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include <kconfig.h>
+#include <kbugreport.h>
+#include <kaboutapplication.h>
+#include <kmessagebox.h>
+#include <kinstance.h>
+#include <kaction.h>
+#include <kwin.h>
+#include <kiconloader.h>
+#include <klineedit.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qtabwidget.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+
+#include "indexwidget.h"
+#include "searchwidget.h"
+#include "helpwidget.h"
+#include "aboutwidget.h"
+#include "proxywidget.h"
+#include "moduletreeview.h"
+#include <stdio.h>
+
+#include "toplevel.h"
+#include "toplevel.moc"
+
+TopLevel::TopLevel(const char* name)
+ : KMainWindow( 0, name, WStyle_ContextHelp )
+ , _active(0), dummyAbout(0)
+{
+ setCaption(QString::null);
+
+ report_bug = 0;
+
+ // read settings
+ KConfig *config = KGlobal::config();
+ config->setGroup("Index");
+ QString viewmode = config->readEntry("ViewMode", "Tree");
+
+ if (viewmode == "Tree")
+ KCGlobal::setViewMode(Tree);
+ else
+ KCGlobal::setViewMode(Icon);
+
+ QString size = config->readEntry("IconSize", "Medium");
+ if (size == "Small")
+ KCGlobal::setIconSize(KIcon::SizeSmall);
+ else if (size == "Large")
+ KCGlobal::setIconSize(KIcon::SizeLarge);
+ else if (size == "Huge")
+ KCGlobal::setIconSize(KIcon::SizeHuge);
+ else
+ KCGlobal::setIconSize(KIcon::SizeMedium);
+
+ // initialize the entries
+ _modules = new ConfigModuleList();
+ _modules->readDesktopEntries();
+
+ for ( ConfigModule* m = _modules->first(); m; m = _modules->next() ) {
+ connect( m, SIGNAL( handbookRequest() ), this, SLOT( slotHandbookRequest() ) );
+ connect( m, SIGNAL( helpRequest() ), this, SLOT( slotHelpRequest() ) );
+ }
+
+ // create the layout box
+ _splitter = new QSplitter( QSplitter::Horizontal, this );
+
+ QFrame* leftFrame = new QFrame ( _splitter );
+ QBoxLayout *leftFrameLayout = new QVBoxLayout( leftFrame );
+
+ QFrame* mSearchFrame = new QFrame( leftFrame );
+ leftFrameLayout->addWidget( mSearchFrame );
+
+ QBoxLayout *searchLayout = new QHBoxLayout( mSearchFrame );
+ searchLayout->setSpacing( KDialog::spacingHint() );
+ searchLayout->setMargin( 6 );
+
+ QPushButton *clearButton = new QPushButton( mSearchFrame );
+ clearButton->setIconSet( KApplication::reverseLayout() ?
+ SmallIconSet( "clear_left" ) : SmallIconSet("locationbar_erase") );
+ searchLayout->addWidget( clearButton );
+ QToolTip::add( clearButton, i18n("Clear search") );
+
+ QLabel *label = new QLabel(i18n("Search:"), mSearchFrame );
+ searchLayout->addWidget( label );
+
+ KLineEdit *searchEdit = new KLineEdit( mSearchFrame );
+ clearButton->setFixedHeight( searchEdit->height() );
+ connect( clearButton, SIGNAL( clicked() ), searchEdit, SLOT( clear() ) );
+ label->setBuddy( searchEdit );
+ searchLayout->addWidget( searchEdit );
+ connect( searchEdit, SIGNAL( textChanged( const QString & ) ),
+ SLOT( slotSearchChanged(const QString &) ) );
+
+ // create the left hand side under search
+ _stack = new QWidgetStack( leftFrame );
+ leftFrameLayout->addWidget( _stack );
+
+ // index tab
+ _index = new IndexWidget(_modules, this);
+ connect(_index, SIGNAL(moduleActivated(ConfigModule*)),
+ this, SLOT(activateModule(ConfigModule*)));
+ _stack->addWidget( _index );
+
+ connect(_index, SIGNAL(categorySelected(QListViewItem*)),
+ this, SLOT(categorySelected(QListViewItem*)));
+
+ // search tab
+ _search = new SearchWidget(this);
+ _search->populateKeywordList(_modules);
+ connect(_search, SIGNAL(moduleSelected(ConfigModule *)),
+ this, SLOT(activateModule(ConfigModule *)));
+
+ _stack->addWidget( _search );
+
+ // set up the right hand side (the docking area)
+ _dock = new DockContainer( _splitter );
+
+ // help widget
+ _help = new HelpWidget(_dock);
+
+ _stack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
+
+ // Restore sizes
+ config->setGroup("General");
+ QValueList<int> sizes = config->readIntListEntry( "SplitterSizes" );
+ if (!sizes.isEmpty())
+ _splitter->setSizes(sizes);
+
+ // That one does the trick ...
+ _splitter->setResizeMode( leftFrame, QSplitter::KeepSize );
+
+ connect(_dock, SIGNAL(newModule(const QString&, const QString&, const QString&)),
+ this, SLOT(newModule(const QString&, const QString&, const QString&)));
+ connect(_dock, SIGNAL(changedModule(ConfigModule*)),
+ SLOT(changedModule(ConfigModule*)));
+
+ // set the main view
+ setCentralWidget( _splitter );
+
+ // initialize the GUI actions
+ setupActions();
+
+ // activate defaults
+ if (KCGlobal::viewMode() == Tree) {
+ activateTreeView();
+ tree_view->setChecked(true);
+ }
+ else {
+ activateIconView();
+ icon_view->setChecked(true);
+ }
+
+ // insert the about widget
+ if (KCGlobal::isInfoCenter())
+ {
+ AboutWidget *aw = new AboutWidget( this, 0, _index->firstTreeViewItem());
+ connect( aw, SIGNAL( moduleSelected( ConfigModule * ) ),
+ SLOT( activateModule( ConfigModule * ) ) );
+ _dock->setBaseWidget( aw );
+ KWin::setIcons( winId(),
+ KGlobal::iconLoader()->loadIcon("hwinfo", KIcon::NoGroup, 32 ),
+ KGlobal::iconLoader()->loadIcon("hwinfo", KIcon::NoGroup, 16 ) );
+ }
+ else
+ {
+ AboutWidget *aw = new AboutWidget(this);
+ connect( aw, SIGNAL( moduleSelected( ConfigModule * ) ),
+ SLOT( activateModule( ConfigModule * ) ) );
+ _dock->setBaseWidget(aw);
+ }
+}
+
+TopLevel::~TopLevel()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup("Index");
+ if (KCGlobal::viewMode() == Tree)
+ config->writeEntry("ViewMode", "Tree");
+ else
+ config->writeEntry("ViewMode", "Icon");
+
+ switch (KCGlobal::iconSize())
+ {
+ case KIcon::SizeSmall:
+ config->writeEntry("IconSize", "Small");
+ break;
+ case KIcon::SizeLarge:
+ config->writeEntry("IconSize", "Large");
+ break;
+ case KIcon::SizeHuge:
+ config->writeEntry("IconSize", "Huge");
+ break;
+ default:
+ config->writeEntry("IconSize", "Medium");
+ break;
+ }
+
+ config->setGroup("General");
+ config->writeEntry("SplitterSizes", _splitter->sizes());
+
+ config->sync();
+
+ delete _modules;
+}
+
+bool TopLevel::queryClose()
+{
+ return _dock->dockModule(0);
+}
+
+void TopLevel::setupActions()
+{
+ KStdAction::quit(this, SLOT(close()), actionCollection());
+ KStdAction::keyBindings(guiFactory(), SLOT(configureShortcuts()),
+actionCollection());
+ icon_view = new KRadioAction
+ (i18n("&Icon View"), 0, this, SLOT(activateIconView()),
+ actionCollection(), "activate_iconview");
+ icon_view->setExclusiveGroup( "viewmode" );
+
+ tree_view = new KRadioAction
+ (i18n("&Tree View"), 0, this, SLOT(activateTreeView()),
+ actionCollection(), "activate_treeview");
+ tree_view->setExclusiveGroup( "viewmode" );
+
+ icon_small = new KRadioAction
+ (i18n("&Small"), 0, this, SLOT(activateSmallIcons()),
+ actionCollection(), "activate_smallicons");
+ icon_small->setExclusiveGroup( "iconsize" );
+
+ icon_medium = new KRadioAction
+ (i18n("&Medium"), 0, this, SLOT(activateMediumIcons()),
+ actionCollection(), "activate_mediumicons");
+ icon_medium->setExclusiveGroup( "iconsize" );
+
+ icon_large = new KRadioAction
+ (i18n("&Large"), 0, this, SLOT(activateLargeIcons()),
+ actionCollection(), "activate_largeicons");
+ icon_large->setExclusiveGroup( "iconsize" );
+
+ icon_huge = new KRadioAction
+ (i18n("&Huge"), 0, this, SLOT(activateHugeIcons()),
+ actionCollection(), "activate_hugeicons");
+ icon_huge->setExclusiveGroup( "iconsize" );
+
+ about_module = new KAction(i18n("About Current Module"), 0, this, SLOT(aboutModule()), actionCollection(), "help_about_module");
+ about_module->setEnabled(false);
+
+ // I need to add this so that each module can get a bug reported,
+ // and not just KControl
+ if (KCGlobal::isInfoCenter())
+ createGUI("kinfocenterui.rc");
+ else
+ createGUI("kcontrolui.rc");
+
+ report_bug = actionCollection()->action("help_report_bug");
+ report_bug->setText(i18n("&Report Bug..."));
+ report_bug->disconnect();
+ connect(report_bug, SIGNAL(activated()), SLOT(reportBug()));
+}
+
+void TopLevel::activateIconView()
+{
+ KCGlobal::setViewMode(Icon);
+ _index->activateView(Icon);
+
+ icon_small->setEnabled(true);
+ icon_medium->setEnabled(true);
+ icon_large->setEnabled(true);
+ icon_huge->setEnabled(true);
+
+ switch(KCGlobal::iconSize())
+ {
+ case KIcon::SizeSmall:
+ icon_small->setChecked(true);
+ break;
+ case KIcon::SizeLarge:
+ icon_large->setChecked(true);
+ break;
+ case KIcon::SizeHuge:
+ icon_huge->setChecked(true);
+ break;
+ default:
+ icon_medium->setChecked(true);
+ break;
+ }
+}
+
+void TopLevel::activateTreeView()
+{
+ KCGlobal::setViewMode(Tree);
+ _index->activateView(Tree);
+
+ icon_small->setEnabled(false);
+ icon_medium->setEnabled(false);
+ icon_large->setEnabled(false);
+ icon_huge->setEnabled(false);
+}
+
+void TopLevel::activateSmallIcons()
+{
+ KCGlobal::setIconSize(KIcon::SizeSmall);
+ _index->reload();
+}
+
+void TopLevel::activateMediumIcons()
+{
+ KCGlobal::setIconSize(KIcon::SizeMedium);
+ _index->reload();
+}
+
+void TopLevel::activateLargeIcons()
+{
+ KCGlobal::setIconSize(KIcon::SizeLarge);
+ _index->reload();
+}
+
+void TopLevel::activateHugeIcons()
+{
+ KCGlobal::setIconSize(KIcon::SizeHuge);
+ _index->reload();
+}
+
+void TopLevel::newModule(const QString &name, const QString& docPath, const QString &quickhelp)
+{
+ setCaption(name, false);
+
+ _help->setText( docPath, quickhelp );
+
+ if (!report_bug) return;
+
+ if(name.isEmpty())
+ report_bug->setText(i18n("&Report Bug..."));
+ else
+ report_bug->setText(i18n("Report Bug on Module %1...").arg( handleAmpersand( name)));
+}
+
+void TopLevel::changedModule(ConfigModule *changed)
+{
+ if (!changed)
+ return;
+ setCaption(changed->moduleName(), changed->isChanged() );
+}
+
+void TopLevel::categorySelected(QListViewItem *category)
+{
+ if (_active)
+ {
+ if (_active->isChanged())
+ {
+ int res = KMessageBox::warningYesNoCancel(this, _active ?
+ i18n("There are unsaved changes in the active module.\n"
+ "Do you want to apply the changes before running "
+ "the new module or discard the changes?") :
+ i18n("There are unsaved changes in the active module.\n"
+ "Do you want to apply the changes before exiting "
+ "the Control Center or discard the changes?"),
+ i18n("Unsaved Changes"),
+ KStdGuiItem::apply(),
+ KStdGuiItem::discard());
+ if (res == KMessageBox::Yes)
+ _active->module()->applyClicked();
+ else if (res == KMessageBox::Cancel)
+ return;
+ }
+ }
+ _dock->removeModule();
+ about_module->setText( i18n( "About Current Module" ) );
+ about_module->setIconSet( QIconSet() );
+ about_module->setEnabled( false );
+
+ // insert the about widget
+ QListViewItem *firstItem = category->firstChild();
+ QString caption = static_cast<ModuleTreeItem*>(category)->caption();
+ QString icon = static_cast<ModuleTreeItem*>(category)->icon();
+ if( _dock->baseWidget()->isA( "AboutWidget" ) )
+ {
+ static_cast<AboutWidget *>( _dock->baseWidget() )->setCategory( firstItem, icon, caption);
+ }
+ else
+ {
+ AboutWidget *aw = new AboutWidget( this, 0, firstItem, caption );
+ connect( aw, SIGNAL( moduleSelected( ConfigModule * ) ),
+ SLOT( activateModule( ConfigModule * ) ) );
+ _dock->setBaseWidget( aw );
+ }
+}
+
+
+void TopLevel::activateModule(ConfigModule *mod)
+{
+ if ( _dock->module() == mod )
+ return;
+
+ // tell the index to display the module
+ _index->makeVisible(mod);
+
+ // tell the index to mark this module as loaded
+ _index->makeSelected(mod);
+
+ // dock it
+ if (!_dock->dockModule(mod))
+ {
+ if ( _dock->module() )
+ {
+ _index->makeVisible(_active);
+ _index->makeSelected(_active);
+ }
+ return;
+ }
+
+ _active=mod;
+
+ if (mod->aboutData())
+ {
+ about_module->setText(i18n("Help menu->about <modulename>", "About %1").arg(
+ handleAmpersand( mod->moduleName())));
+ about_module->setIcon(mod->icon());
+ about_module->setEnabled(true);
+ }
+ else
+ {
+ about_module->setText(i18n("About Current Module"));
+ about_module->setIconSet(QIconSet());
+ about_module->setEnabled(false);
+ }
+}
+
+void TopLevel::deleteDummyAbout()
+{
+ delete dummyAbout;
+ dummyAbout = 0;
+}
+
+void TopLevel::slotSearchChanged(const QString& search)
+{
+ if (search.isEmpty())
+ _stack->raiseWidget(_index);
+ else
+ {
+ _stack->raiseWidget(_search);
+ _search->searchTextChanged(search);
+ }
+}
+
+void TopLevel::slotHelpRequest()
+{
+ _help->display(_help->text(), QCursor::pos ( ), _dock);
+}
+
+void TopLevel::slotHandbookRequest()
+{
+ _help->handbookRequest();
+}
+
+void TopLevel::reportBug()
+{
+ // this assumes the user only opens one bug report at a time
+ static char buffer[128];
+
+ dummyAbout = 0;
+ bool deleteit = false;
+
+ if (!_active) // report against kcontrol
+ dummyAbout = const_cast<KAboutData*>(KGlobal::instance()->aboutData());
+ else
+ {
+ if (_active->aboutData())
+ dummyAbout = const_cast<KAboutData*>(_active->aboutData());
+ else
+ {
+ snprintf(buffer, sizeof(buffer), "kcm%s", _active->library().latin1());
+ dummyAbout = new KAboutData(buffer, _active->moduleName().utf8(), "2.0");
+ deleteit = true;
+ }
+ }
+ KBugReport *br = new KBugReport(this, false, dummyAbout);
+ if (deleteit)
+ connect(br, SIGNAL(finished()), SLOT(deleteDummyAbout()));
+ else
+ dummyAbout = 0;
+ br->show();
+}
+
+void TopLevel::aboutModule()
+{
+ KAboutApplication dlg(_active->aboutData());
+ dlg.exec();
+}
+
+QString TopLevel::handleAmpersand( QString modulename ) const
+{
+ if( modulename.contains( '&' )) // double it
+ {
+ for( int i = modulename.length();
+ i >= 0;
+ --i )
+ if( modulename[ i ] == '&' )
+ modulename.insert( i, "&" );
+ }
+ return modulename;
+}
diff --git a/kcontrol/kcontrol/toplevel.h b/kcontrol/kcontrol/toplevel.h
new file mode 100644
index 000000000..02e42a49e
--- /dev/null
+++ b/kcontrol/kcontrol/toplevel.h
@@ -0,0 +1,106 @@
+/*
+ Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __TOPLEVEL_H__
+#define __TOPLEVEL_H__
+
+#include <kmainwindow.h>
+#include <qlistview.h>
+
+
+class QSplitter;
+class QWidgetStack;
+
+class KToggleAction;
+class KAction;
+
+class DockContainer;
+class IndexWidget;
+class SearchWidget;
+class HelpWidget;
+class ConfigModule;
+class ConfigModuleList;
+class ModuleTitle;
+
+class TopLevel : public KMainWindow
+{
+ Q_OBJECT
+
+public:
+ TopLevel( const char* name=0 );
+ ~TopLevel();
+
+protected:
+ void setupActions();
+
+protected slots:
+ void activateModule(ConfigModule *);
+ void categorySelected(QListViewItem *category);
+ void newModule(const QString &name, const QString& docPath, const QString &quickhelp);
+ void activateIconView();
+ void activateTreeView();
+
+ void reportBug();
+ void aboutModule();
+
+ void activateSmallIcons();
+ void activateMediumIcons();
+ void activateLargeIcons();
+ void activateHugeIcons();
+
+ void deleteDummyAbout();
+
+ void slotSearchChanged(const QString &);
+ void slotHandbookRequest();
+ void slotHelpRequest();
+
+ void changedModule(ConfigModule *changed);
+
+ bool queryClose();
+
+private:
+
+ QString handleAmpersand( QString ) const;
+
+ QSplitter *_splitter;
+ QWidgetStack *_stack;
+ DockContainer *_dock;
+ ModuleTitle *_title;
+
+ KToggleAction *tree_view, *icon_view;
+ KToggleAction *icon_small, *icon_medium, *icon_large, *icon_huge;
+ KAction *report_bug, *about_module;
+
+ IndexWidget *_index;
+ SearchWidget *_search;
+ HelpWidget *_help;
+
+ ConfigModule *_active;
+ ConfigModuleList *_modules;
+
+ /**
+ * if someone wants to report a bug
+ * against a module with no about data
+ * we construct one for him
+ **/
+ KAboutData *dummyAbout;
+};
+
+#endif
diff --git a/kcontrol/kcontrol/version.h b/kcontrol/kcontrol/version.h
new file mode 100644
index 000000000..f35192739
--- /dev/null
+++ b/kcontrol/kcontrol/version.h
@@ -0,0 +1,2 @@
+#include <kapplication.h>
+#define KCONTROL_VERSION KDE_VERSION_STRING
diff --git a/kcontrol/kded/Makefile.am b/kcontrol/kded/Makefile.am
new file mode 100644
index 000000000..af2d54142
--- /dev/null
+++ b/kcontrol/kded/Makefile.am
@@ -0,0 +1,15 @@
+kde_module_LTLIBRARIES = kcm_kded.la
+
+kcm_kded_la_SOURCES = kcmkded.cpp
+
+kcm_kded_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_kded_la_LIBADD = $(LIB_KIO)
+
+AM_CPPFLAGS= $(all_includes)
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmkded.pot
+
+xdg_apps_DATA = kcmkded.desktop
diff --git a/kcontrol/kded/kcmkded.cpp b/kcontrol/kded/kcmkded.cpp
new file mode 100644
index 000000000..e30d73b6f
--- /dev/null
+++ b/kcontrol/kded/kcmkded.cpp
@@ -0,0 +1,363 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Daniel Molkentin <molkentin@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qheader.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qtimer.h>
+#include <qvgroupbox.h>
+#include <qwhatsthis.h>
+
+#include <dcopclient.h>
+#include <dcopref.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kbuttonbox.h>
+#include <kdebug.h>
+#include <kdesktopfile.h>
+#include <kdialog.h>
+#include <kgenericfactory.h>
+#include <klistview.h>
+#include <kmessagebox.h>
+#include <kservice.h>
+#include <kstandarddirs.h>
+
+#include "kcmkded.h"
+#include "kcmkded.moc"
+
+typedef KGenericFactory<KDEDConfig, QWidget> KDEDFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_kded, KDEDFactory( "kcmkded" ) )
+
+
+KDEDConfig::KDEDConfig(QWidget* parent, const char* name, const QStringList &) :
+ KCModule( KDEDFactory::instance(), parent, name )
+{
+ KAboutData *about =
+ new KAboutData( I18N_NOOP( "kcmkded" ), I18N_NOOP( "KDE Service Manager" ),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP( "(c) 2002 Daniel Molkentin" ) );
+ about->addAuthor("Daniel Molkentin",0,"molkentin@kde.org");
+ setAboutData( about );
+
+ setQuickHelp( i18n("<h1>Service Manager</h1><p>This module allows you to have an overview of all plugins of the "
+ "KDE Daemon, also referred to as KDE Services. Generally, there are two types of service:</p>"
+ "<ul><li>Services invoked at startup</li><li>Services called on demand</li></ul>"
+ "<p>The latter are only listed for convenience. The startup services can be started and stopped. "
+ "In Administrator mode, you can also define whether services should be loaded at startup.</p>"
+ "<p><b> Use this with care: some services are vital for KDE; do not deactivate services if you"
+ " do not know what you are doing.</b></p>"));
+
+ RUNNING = i18n("Running")+" ";
+ NOT_RUNNING = i18n("Not running")+" ";
+
+ QVBoxLayout *lay = new QVBoxLayout( this, 0, KDialog::spacingHint() );
+
+ QGroupBox *gb = new QVGroupBox(i18n("Load-on-Demand Services"), this );
+ QWhatsThis::add(gb, i18n("This is a list of available KDE services which will "
+ "be started on demand. They are only listed for convenience, as you "
+ "cannot manipulate these services."));
+ lay->addWidget( gb );
+
+ _lvLoD = new KListView( gb );
+ _lvLoD->addColumn(i18n("Service"));
+ _lvLoD->addColumn(i18n("Description"));
+ _lvLoD->addColumn(i18n("Status"));
+ _lvLoD->setAllColumnsShowFocus(true);
+ _lvLoD->header()->setStretchEnabled(true, 1);
+
+ gb = new QVGroupBox(i18n("Startup Services"), this );
+ QWhatsThis::add(gb, i18n("This shows all KDE services that can be loaded "
+ "on KDE startup. Checked services will be invoked on next startup. "
+ "Be careful with deactivation of unknown services."));
+ lay->addWidget( gb );
+
+ _lvStartup = new KListView( gb );
+ _lvStartup->addColumn(i18n("Use"));
+ _lvStartup->addColumn(i18n("Service"));
+ _lvStartup->addColumn(i18n("Description"));
+ _lvStartup->addColumn(i18n("Status"));
+ _lvStartup->setAllColumnsShowFocus(true);
+ _lvStartup->header()->setStretchEnabled(true, 2);
+
+ KButtonBox *buttonBox = new KButtonBox( gb, Horizontal);
+ _pbStart = buttonBox->addButton( i18n("Start"));
+ _pbStop = buttonBox->addButton( i18n("Stop"));
+
+ _pbStart->setEnabled( false );
+ _pbStop->setEnabled( false );
+
+ connect(_pbStart, SIGNAL(clicked()), SLOT(slotStartService()));
+ connect(_pbStop, SIGNAL(clicked()), SLOT(slotStopService()));
+ connect(_lvStartup, SIGNAL(selectionChanged(QListViewItem*)), SLOT(slotEvalItem(QListViewItem*)) );
+
+ load();
+}
+
+void setModuleGroup(KConfig *config, const QString &filename)
+{
+ QString module = filename;
+ int i = module.findRev('/');
+ if (i != -1)
+ module = module.mid(i+1);
+ i = module.findRev('.');
+ if (i != -1)
+ module = module.left(i);
+
+ config->setGroup(QString("Module-%1").arg(module));
+}
+
+bool KDEDConfig::autoloadEnabled(KConfig *config, const QString &filename)
+{
+ setModuleGroup(config, filename);
+ return config->readBoolEntry("autoload", true);
+}
+
+void KDEDConfig::setAutoloadEnabled(KConfig *config, const QString &filename, bool b)
+{
+ setModuleGroup(config, filename);
+ return config->writeEntry("autoload", b);
+}
+
+void KDEDConfig::load() {
+ load ( false );
+}
+
+
+void KDEDConfig::load( bool useDefaults ) {
+ KConfig kdedrc("kdedrc", true, false);
+ kdedrc.setReadDefaults( useDefaults );
+
+ _lvStartup->clear();
+ _lvLoD->clear();
+
+ QStringList files;
+ KGlobal::dirs()->findAllResources( "services",
+ QString::fromLatin1( "kded/*.desktop" ),
+ true, true, files );
+
+ QListViewItem* item = 0L;
+ CheckListItem* clitem;
+ for ( QStringList::ConstIterator it = files.begin(); it != files.end(); ++it ) {
+
+ if ( KDesktopFile::isDesktopFile( *it ) ) {
+ KDesktopFile file( *it, true, "services" );
+
+ if ( file.readBoolEntry("X-KDE-Kded-autoload") ) {
+ clitem = new CheckListItem(_lvStartup, QString::null);
+ connect(clitem, SIGNAL(changed(QCheckListItem*)), SLOT(slotItemChecked(QCheckListItem*)));
+ clitem->setOn(autoloadEnabled(&kdedrc, *it));
+ item = clitem;
+ item->setText(1, file.readName());
+ item->setText(2, file.readComment());
+ item->setText(3, NOT_RUNNING);
+ item->setText(4, file.readEntry("X-KDE-Library"));
+ }
+ else if ( file.readBoolEntry("X-KDE-Kded-load-on-demand") ) {
+ item = new QListViewItem(_lvLoD, file.readName());
+ item->setText(1, file.readComment());
+ item->setText(2, NOT_RUNNING);
+ item->setText(4, file.readEntry("X-KDE-Library"));
+ }
+ }
+ }
+
+ getServiceStatus();
+ emit changed( useDefaults );
+}
+
+void KDEDConfig::save() {
+ QCheckListItem* item = 0L;
+
+ QStringList files;
+ KGlobal::dirs()->findAllResources( "services",
+ QString::fromLatin1( "kded/*.desktop" ),
+ true, true, files );
+
+ KConfig kdedrc("kdedrc", false, false);
+
+ for ( QStringList::ConstIterator it = files.begin(); it != files.end(); ++it ) {
+
+ if ( KDesktopFile::isDesktopFile( *it ) ) {
+
+ KConfig file( *it, false, false, "services" );
+ file.setGroup("Desktop Entry");
+
+ if (file.readBoolEntry("X-KDE-Kded-autoload")){
+
+ item = static_cast<QCheckListItem *>(_lvStartup->findItem(file.readEntry("X-KDE-Library"),4));
+ if (item) {
+ // we found a match, now compare and see what changed
+ setAutoloadEnabled(&kdedrc, *it, item->isOn());
+ }
+ }
+ }
+ }
+ kdedrc.sync();
+
+ DCOPRef( "kded", "kded" ).call( "reconfigure" );
+ QTimer::singleShot(0, this, SLOT(slotServiceRunningToggled()));
+}
+
+
+void KDEDConfig::defaults()
+{
+ load( true );
+}
+
+
+void KDEDConfig::getServiceStatus()
+{
+ QCStringList modules;
+ QCString replyType;
+ QByteArray replyData;
+
+
+ if (!kapp->dcopClient()->call( "kded", "kded", "loadedModules()", QByteArray(),
+ replyType, replyData ) ) {
+
+ _lvLoD->setEnabled( false );
+ _lvStartup->setEnabled( false );
+ KMessageBox::error(this, i18n("Unable to contact KDED."));
+ return;
+ }
+ else {
+
+ if ( replyType == "QCStringList" ) {
+ QDataStream reply(replyData, IO_ReadOnly);
+ reply >> modules;
+ }
+ }
+
+ for( QListViewItemIterator it( _lvLoD); it.current() != 0; ++it )
+ it.current()->setText(2, NOT_RUNNING);
+ for( QListViewItemIterator it( _lvStartup); it.current() != 0; ++it )
+ it.current()->setText(3, NOT_RUNNING);
+ for ( QCStringList::Iterator it = modules.begin(); it != modules.end(); ++it )
+ {
+ QListViewItem *item = _lvLoD->findItem(*it, 4);
+ if ( item )
+ {
+ item->setText(2, RUNNING);
+ }
+
+ item = _lvStartup->findItem(*it, 4);
+ if ( item )
+ {
+ item->setText(3, RUNNING);
+ }
+ }
+}
+
+void KDEDConfig::slotReload()
+{
+ QString current = _lvStartup->currentItem()->text(4);
+ load();
+ QListViewItem *item = _lvStartup->findItem(current, 4);
+ if (item)
+ _lvStartup->setCurrentItem(item);
+}
+
+void KDEDConfig::slotEvalItem(QListViewItem * item)
+{
+ if (!item)
+ return;
+
+ if ( item->text(3) == RUNNING ) {
+ _pbStart->setEnabled( false );
+ _pbStop->setEnabled( true );
+ }
+ else if ( item->text(3) == NOT_RUNNING ) {
+ _pbStart->setEnabled( true );
+ _pbStop->setEnabled( false );
+ }
+ else // Error handling, better do nothing
+ {
+ _pbStart->setEnabled( false );
+ _pbStop->setEnabled( false );
+ }
+
+ getServiceStatus();
+}
+
+void KDEDConfig::slotServiceRunningToggled()
+{
+ getServiceStatus();
+ slotEvalItem(_lvStartup->currentItem());
+}
+
+void KDEDConfig::slotStartService()
+{
+ QCString service = _lvStartup->currentItem()->text(4).latin1();
+
+ QByteArray data, replyData;
+ QCString replyType;
+ QDataStream arg( data, IO_WriteOnly );
+ arg << service;
+ if (kapp->dcopClient()->call( "kded", "kded", "loadModule(QCString)", data, replyType, replyData ) ) {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if ( replyType == "bool" )
+ {
+ bool result;
+ reply >> result;
+ if ( result )
+ slotServiceRunningToggled();
+ else
+ KMessageBox::error(this, i18n("Unable to start service."));
+ } else {
+ kdDebug() << "loadModule() on kded returned an unexpected type of reply: " << replyType << endl;
+ }
+ }
+ else {
+ KMessageBox::error(this, i18n("Unable to contact KDED."));
+ }
+}
+
+void KDEDConfig::slotStopService()
+{
+ QCString service = _lvStartup->currentItem()->text(4).latin1();
+ kdDebug() << "Stopping: " << service << endl;
+ QByteArray data;
+ QDataStream arg( data, IO_WriteOnly );
+
+ arg << service;
+ if (kapp->dcopClient()->send( "kded", "kded", "unloadModule(QCString)", data ) ) {
+ slotServiceRunningToggled();
+ }
+ else {
+ KMessageBox::error(this, i18n("Unable to stop service."));
+ }
+
+}
+
+void KDEDConfig::slotItemChecked(QCheckListItem*)
+{
+ emit changed(true);
+}
+
+CheckListItem::CheckListItem(QListView *parent, const QString &text)
+ : QObject(parent),
+ QCheckListItem(parent, text, CheckBox)
+{ }
+
+void CheckListItem::stateChange(bool on)
+{
+ QCheckListItem::stateChange(on);
+ emit changed(this);
+}
diff --git a/kcontrol/kded/kcmkded.desktop b/kcontrol/kded/kcmkded.desktop
new file mode 100644
index 000000000..fe45333a3
--- /dev/null
+++ b/kcontrol/kded/kcmkded.desktop
@@ -0,0 +1,236 @@
+[Desktop Entry]
+Exec=kcmshell kcmkded
+Icon=services
+Type=Application
+
+
+X-KDE-Library=kded
+X-KDE-Factoryname=kded
+X-KDE-ParentApp=kcontrol
+
+Name=Service Manager
+Name[af]=Diens Bestuurder
+Name[ar]=مدبر الخدمات
+Name[az]=Xidmət İdarəçisi
+Name[be]=Кіраўнік сервісаў
+Name[bg]=Системни услуги
+Name[bn]=সার্ভিস ম্যানেজার
+Name[br]=Merour ar servijoù
+Name[bs]=Upravljač servisa
+Name[ca]=Gestor del servei
+Name[cs]=Správce služeb
+Name[csb]=Menedżer ùsłëżnotów
+Name[cy]=Rheolydd Gwasanaethau
+Name[da]=Service-håndtering
+Name[de]=Diensteverwaltung
+Name[el]=Διαχειριστής υπηρεσιών
+Name[eo]=Servo-Administrilo
+Name[es]=Gestor de servicios
+Name[et]=Teenuste haldur
+Name[eu]=Zerbitzu kudeatzailea
+Name[fa]=مدیر خدمت
+Name[fi]=Palvelunhallinta
+Name[fr]=Gestionnaire de services
+Name[fy]=KDE-systeemtsjinsten
+Name[ga]=Bainisteoir Seirbhíse
+Name[gl]=Xestor de Servizos
+Name[he]=מנהל השירותים
+Name[hi]=सेवा प्रबंधक
+Name[hr]=Upravljanje uslugama
+Name[hu]=Szolgáltatások
+Name[is]=Þjónustustjóri
+Name[it]=Gestione servizi
+Name[ja]=サービスマネージャ
+Name[ka]=სერვის მენეჯერი
+Name[kk]=Қызметтерді басқару
+Name[km]=កម្មវិធី​គ្រប់គ្រង​សេវា
+Name[ko]=서비스 관리자
+Name[lo]=ຕົວຈັດການ Dhcp
+Name[lt]=Tarnybų tvarkyklė
+Name[lv]=Servisu Menedžeris
+Name[mk]=Менаџер на сервиси
+Name[mn]=Үйлчилгээ удирдагч
+Name[ms]=Pengurus Servis
+Name[mt]=Manager tas-servizzi
+Name[nb]=Tjenestebehandler
+Name[nds]=Deenstpleger
+Name[ne]=सेवा प्रबन्धक
+Name[nl]=KDE-systeemdiensten
+Name[nn]=Tenestehandsamar
+Name[nso]=Molaodi wa Tirelo
+Name[pa]=ਸੇਵਾਵਾਂ ਮੈਨੇਜਰ
+Name[pl]=Menedżer usług
+Name[pt]=Gestor de Serviços
+Name[pt_BR]=Gerenciador de Serviços
+Name[ro]=Managerul de servicii
+Name[ru]=Управление службами
+Name[rw]=MugengaSerivise
+Name[se]=Bálvalusgieđahalli
+Name[sk]=Správca služieb
+Name[sl]=Upravitelj storitev
+Name[sr]=Менаџер сервиса
+Name[sr@Latn]=Menadžer servisa
+Name[sv]=Tjänsthanterare
+Name[ta]=சேவை மேலாளர்
+Name[tg]=Мудири хидмат
+Name[th]=ตัวจัดการรบริการ
+Name[tr]=Servis Yöneticisi
+Name[tt]=Xezmät İdäräçe
+Name[uk]=Менеджер служб
+Name[uz]=Xizmat boshqaruvchisi
+Name[uz@cyrillic]=Хизмат бошқарувчиси
+Name[ven]=Mulanguli wa tshumelo
+Name[vi]=Trình quản lý Dịch vụ
+Name[wa]=Manaedjeu di siervices
+Name[xh]=Umphathi Wenkonzo
+Name[zh_CN]=服务管理器
+Name[zh_TW]=服務管理程式
+Name[zu]=Imenenja Yomsebenzi
+Comment=System Services Configuration
+Comment[af]=Stelsel Dienste Opstelling
+Comment[ar]=تهيئة خدمات النظام
+Comment[az]=Sistem Xidmətləri Qurğuları
+Comment[be]=Настаўленні сістэмных сервісаў
+Comment[bg]=Настройване на системните услуги
+Comment[bn]=সিস্টেম সার্ভিস কনফিগারেশন
+Comment[br]=Kefluniadur servijerien ar reiziad
+Comment[bs]=Postavke sistemskih servisa
+Comment[ca]=Configura els serveis del sistema
+Comment[cs]=Nastavení systémových služeb
+Comment[csb]=Kònfigùracëjô systemòwëch ùsłëżnotów
+Comment[cy]=Ffurfweddu Gwasanaethau Cysawd
+Comment[da]=Opsætning af systemtjenester
+Comment[de]=Einrichtung von Systemdiensten
+Comment[el]=Ρύθμιση των υπηρεσιών συστήματος
+Comment[eo]=Agordo de la sistemservoj
+Comment[es]=Configuración de los servicios del sistema
+Comment[et]=Süsteemsete teenuste seadistamine
+Comment[eu]=Sistemaren zerbitzuen konfigurazioa
+Comment[fa]=پیکربندی خدمات سیستم
+Comment[fi]=Järjestelmän palveluiden asetus
+Comment[fr]=Configuration des services du système
+Comment[fy]=KDE-systeemtsjinsten ynstelle
+Comment[ga]=Cumraíocht seirbhísí an chórais
+Comment[gl]=Configuración dos Servizos do Sistema
+Comment[he]=שינוי הגדרות שירותי המערכת
+Comment[hi]=तंत्र सेवा कॉन्फ़िगरेशन
+Comment[hr]=Konfiguracija usluga sustava
+Comment[hu]=A rendszerszolgáltatások beállításai
+Comment[is]=Stillingar kerfisþjónusta
+Comment[it]=Configurazione dei servizi di sistema
+Comment[ja]=システムサービスの設定
+Comment[ka]=სისტემური სერვისების კონფიგურაცია
+Comment[kk]=Жүйелік қызметтерді баптау
+Comment[km]=ការ​កំណត់​រចនាសម្ព័ន្ធ​សេវា​ប្រព័ន្ធ
+Comment[ko]=KDE 서비스 설정
+Comment[lo]=ປັບແຕ່ງອອດລະບົບ
+Comment[lt]=Sistemos tarnybų konfigūravimas
+Comment[lv]=Sistēmas Servisu Konfigurācija
+Comment[mk]=Конфигурација на системските сервиси
+Comment[mn]=Системийн үйлчилгээний тохируулга
+Comment[ms]=Konfigurasi Servis Sistem
+Comment[mt]=Konfigurazzjoni tas-servizzi tas-sistema
+Comment[nb]=Systemtjenesteinnstillinger
+Comment[nds]=Systeemdeensten instellen
+Comment[ne]=प्रणाली सेवा कन्फिगरेसन
+Comment[nl]=KDE-systeemdiensten instellen
+Comment[nn]=Oppsett av systemtenester
+Comment[nso]=Peakanyo ya Ditirelo tsa System
+Comment[pa]=ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja usług systemowych
+Comment[pt]=Configuração dos Serviços do Sistema
+Comment[pt_BR]=Configuração de Serviços do Sistema
+Comment[ro]=Configurează serviciile de sistem
+Comment[ru]=Настройка системных служб
+Comment[rw]=Iboneza rya Serivise Sisitemu
+Comment[se]=Vuogádatbálvalusaid heiveheapmi
+Comment[sk]=Nastavenie systémových služieb
+Comment[sl]=Nastavitve sistemskih storitev
+Comment[sr]=Подешавање системских сервиса
+Comment[sr@Latn]=Podešavanje sistemskih servisa
+Comment[sv]=Anpassa systemets tjänster
+Comment[ta]=சாதன சேவை அமைப்பு
+Comment[tg]=Танзими хидматҳои система
+Comment[th]=ปรับแต่งบริการของระบบ
+Comment[tr]=Sistem Servisleri Yapılandırması
+Comment[tt]=Sistem Xezmätlären Caylawçı
+Comment[uk]=Конфігурація служб систем
+Comment[uz]=Tizimning xizmatlarini moslash
+Comment[uz@cyrillic]=Тизимнинг хизматларини мослаш
+Comment[ven]=Bzudzanyo ya tshumelo ya sisitemu
+Comment[vi]=Cấu hình Dịch vụ Hệ thống
+Comment[wa]=Apontiaedje des siervices do sistinme
+Comment[xh]=Uqwalaselo Lweenkonzo Zendlela zokuseneza
+Comment[zh_CN]=系统服务配置
+Comment[zh_TW]=系統服務組態
+Comment[zu]=Inhlanganisela Yemisebenzi Yesistimu
+Keywords=KDED,Daemon,Services
+Keywords[ar]=KDED,Daemon,Services,مراقب,خدمات
+Keywords[az]=KDED,Demon,Xidmətlər
+Keywords[be]=Дэман,Сервісы,KDED,Daemon,Services
+Keywords[bg]=услуга, обслужване, сървър, демон, KDED, Daemon, Services
+Keywords[br]=KDED,Diaoul,Servijoù
+Keywords[ca]=KDED,Dimoni,Serveis
+Keywords[cs]=KDED,démon,služby
+Keywords[csb]=KDED,demóna,ùsłëżnotë
+Keywords[cy]=KDED,Daemon,Gwasanaethau
+Keywords[da]=KDED,Dæmon,Tjenester
+Keywords[de]=KDED,Dämon,Dienst,Daemon,Services,Dienste
+Keywords[el]=KDED,Δαίμονας,Υπηρεσίες
+Keywords[eo]=KDED,demono,servoj
+Keywords[es]=KDED,Demonio,servicios
+Keywords[et]=KDED,deemon,teenused
+Keywords[eu]=KDED,Daemon-a,Zerbitzuak
+Keywords[fa]=KDED،شبح، خدمات
+Keywords[fi]=KDED,Palvelin,Palvelut
+Keywords[fr]=KDED,Daemon,Démon,Services
+Keywords[fy]=KDED,Daemon,services,tsjinsten,systeemtsjinsten,systeem
+Keywords[ga]=KDED,Deamhan,Seirbhísí
+Keywords[gl]=KDED,Demo,Servizos
+Keywords[he]=KDED,תהליך רקע,שירותים,Daemon,Services
+Keywords[hi]=केडीईडी,डेमन,सेवाएँ
+Keywords[hr]=KDED,Daemon,Services,Demon,Usluge
+Keywords[hu]=KDED,démon,szolgáltatás
+Keywords[is]=KDED,þjónn,Þjónustur,púki,þræll
+Keywords[it]=KDED,demone,servizi
+Keywords[ja]=KDED,デーモン,サービス
+Keywords[km]=KDED,Daemon,សេវា
+Keywords[lt]=KDED,Daemon,Services, demonas,tarnybos
+Keywords[lv]=KDED,Dēmoni,Servisi
+Keywords[mn]=КДЭХ,Хэвтүүл,Services,Үйлчилгээ
+Keywords[ms]=KDED,Daemon,Servis
+Keywords[mt]=KDED,Daemon,Services,servizzi
+Keywords[nb]=KDED,nisse,tjenester,daemon
+Keywords[nds]=KDED,Daemon,Services,Dämoon,Deenst,Deensten
+Keywords[ne]=KDED, डेइमन, सेवा
+Keywords[nl]=KDED,Daemon,services,diensten,systeemdiensten,systeem
+Keywords[nn]=KDED,daemon,nisse,tenester
+Keywords[nso]=KDED,Daemon,Ditirelo
+Keywords[pa]=KDED,Daemon,Services,ਸੇਵਾਵਾਂ
+Keywords[pl]=KDED,demon,usługi
+Keywords[pt]=KDED,Servidor,Serviços
+Keywords[pt_BR]=KDED,Servidor,Serviços
+Keywords[ro]=KDED,demon,servicii
+Keywords[ru]=KDED,Daemon,Services,службы,служба
+Keywords[rw]=KDED, Dayimoni,Serivise
+Keywords[se]=KDED,daemon,bálvalusat
+Keywords[sk]=KDED,Daemon,služby
+Keywords[sl]=KDED,demon,storitve
+Keywords[sr]=KDED, Демон, Сервиси
+Keywords[sr@Latn]=KDED, Demon, Servisi
+Keywords[sv]=KDED,Demon,Tjänster
+Keywords[ta]=KDED,டேமான்,சேவைகள்
+Keywords[th]=KDED,เดมอน,บริการ
+Keywords[tr]=KDED,program,servisler
+Keywords[uk]=KDED,демон,служби
+Keywords[uz]=KDED,xizmat,xizmatlar
+Keywords[uz@cyrillic]=KDED,хизмат,хизматлар
+Keywords[ven]=KDED,Daemon,Dzitshumelo
+Keywords[vi]=KDED,Trình nền,Dịch vụ
+Keywords[wa]=KDED,Daemon,Services,demon,siervices
+Keywords[xh]=KDED,Daemon,Iinkonzo
+Keywords[zh_CN]=KDED,Daemon,Services,守护程序,服务
+Keywords[zh_TW]=KDED,Daemon,Services,伺服程式,服務
+Keywords[zu]=KDED,Daemon,Imisebenzi
+
+Categories=Qt;KDE;X-KDE-settings-components;
diff --git a/kcontrol/kded/kcmkded.h b/kcontrol/kded/kcmkded.h
new file mode 100644
index 000000000..b945ff52f
--- /dev/null
+++ b/kcontrol/kded/kcmkded.h
@@ -0,0 +1,78 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Daniel Molkentin <molkentin@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+#ifndef KCMKDED_H
+#define KCMKDED_H
+
+#include <qlistview.h>
+
+#include <kcmodule.h>
+
+class KListView;
+
+class QStringList;
+class QPushButton;
+
+class KDEDConfig : public KCModule
+{
+Q_OBJECT
+public:
+ KDEDConfig(QWidget* parent, const char* name= 0L, const QStringList& foo = QStringList());
+ ~KDEDConfig() {};
+
+ void load();
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+
+protected slots:
+ void slotReload();
+ void slotStartService();
+ void slotStopService();
+ void slotServiceRunningToggled();
+ void slotEvalItem(QListViewItem *item);
+ void slotItemChecked(QCheckListItem *item);
+ void getServiceStatus();
+
+ bool autoloadEnabled(KConfig *config, const QString &filename);
+ void setAutoloadEnabled(KConfig *config, const QString &filename, bool b);
+
+private:
+ KListView *_lvLoD;
+ KListView *_lvStartup;
+ QPushButton *_pbStart;
+ QPushButton *_pbStop;
+
+ QString RUNNING;
+ QString NOT_RUNNING;
+};
+
+class CheckListItem : public QObject, public QCheckListItem
+{
+ Q_OBJECT
+public:
+ CheckListItem(QListView* parent, const QString &text);
+ ~CheckListItem() { }
+signals:
+ void changed(QCheckListItem*);
+protected:
+ virtual void stateChange(bool);
+};
+
+#endif // KCMKDED_H
+
diff --git a/kcontrol/kdm/AUTHORS b/kcontrol/kdm/AUTHORS
new file mode 100644
index 000000000..61d720a4d
--- /dev/null
+++ b/kcontrol/kdm/AUTHORS
@@ -0,0 +1,6 @@
+KDM - The KDE Display Manager - written by Steffen Hansen <hansen@kde.org>
+
+The KDE Display Manager Configuration module -
+written by Thomas Tanghus <tanghus@earthling.net>
+
+Currently maintend by Oswald Buddenhagen <ossi@kde.org>
diff --git a/kcontrol/kdm/ChangeLog b/kcontrol/kdm/ChangeLog
new file mode 100644
index 000000000..d49bb2548
--- /dev/null
+++ b/kcontrol/kdm/ChangeLog
@@ -0,0 +1,16 @@
+2002-07-11 Oswald Buddenhagen <ossi@kde.org>
+ * Reworked "Users" and "Convenience" tabs
+
+2001-01-15 Oswald Buddenhagen <ossi@kde.org>
+ * Several new fields in different tabs for some new features
+
+2000-12-06 Oswald Buddenhagen <ossi@kde.org>
+ * New "Convenience" tab supporting the new automation features
+ * Some changes to the "Users" tab
+ * Few bug fixes
+
+1998-04-28 Thomas Tanghus <tanghus@earthling.net>
+ * Improved geometry management.
+
+1998-05-14 Thomas Tanghus <tanghus@earthling.net>
+ * Fixed bug with "ShutDownButton=...".
diff --git a/kcontrol/kdm/Makefile.am b/kcontrol/kdm/Makefile.am
new file mode 100644
index 000000000..2a210a1b9
--- /dev/null
+++ b/kcontrol/kdm/Makefile.am
@@ -0,0 +1,19 @@
+kde_module_LTLIBRARIES = kcm_kdm.la
+
+# _don't_ add a theme configurator!!
+kcm_kdm_la_SOURCES = background.cpp kdm-appear.cpp kdm-font.cpp kdm-shut.cpp \
+ kdm-users.cpp kdm-conv.cpp main.cpp kbackedcombobox.cpp
+
+kcm_kdm_la_LDFLAGS = $(KDE_RPATH) $(all_libraries) -module -avoid-version -no-undefined
+kcm_kdm_la_LIBADD = $(top_builddir)/kcontrol/background/libkcmbgnd.la $(top_builddir)/kcontrol/background/libbgnd.la $(LIB_KIO) $(LIB_KNEWSTUFF)
+
+AM_CPPFLAGS= -I$(top_builddir)/kcontrol/background \
+ -I$(top_srcdir)/kcontrol/background \
+ -I$(top_srcdir)/kdesktop $(all_includes)
+
+METASOURCES = AUTO
+
+messages:
+ $(XGETTEXT) $(kcm_kdm_la_SOURCES) -o $(podir)/kdmconfig.pot
+
+xdg_apps_DATA = kdm.desktop
diff --git a/kcontrol/kdm/background.cpp b/kcontrol/kdm/background.cpp
new file mode 100644
index 000000000..19c962a1d
--- /dev/null
+++ b/kcontrol/kdm/background.cpp
@@ -0,0 +1,111 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * This file is part of the KDE project, module kcmdisplay.
+ * Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ *
+ * Modified 2000.07.14 by Brad Hughes <bhughes@trolltech.com>
+ * Improve layout and consistency with KDesktop's background selection
+ *
+ * Based on old backgnd.cpp:
+ *
+ * Copyright (c) Martin R. Jones 1996
+ * Converted to a kcc module by Matthias Hoelzer 1997
+ * Gradient backgrounds by Mark Donohoe 1997
+ * Pattern backgrounds by Stephan Kulow 1998
+ * Randomizing & dnd & new display modes by Matej Koss 1998
+ *
+ * You can Freely distribute this program under the GNU General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ */
+
+#include <config.h>
+
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <qgroupbox.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <dcopclient.h>
+#include "../background/bgsettings.h"
+#include "../background/bgdialog.h"
+#include "background.h"
+#include <qcheckbox.h>
+#include <ksimpleconfig.h>
+#include <kdialog.h>
+
+extern KSimpleConfig *config;
+
+KBackground::KBackground(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+
+ // Enabling checkbox
+ m_pCBEnable = new QCheckBox( i18n("E&nable background"), this );
+ QWhatsThis::add( m_pCBEnable,
+ i18n("If this is checked, KDM will use the settings below for the background."
+ " If it is disabled, you have to look after the background yourself."
+ " This is done by running some program (possibly xsetroot) in the script"
+ " specified in the Setup= option in kdmrc (usually Xsetup).") );
+ config->setGroup( "X-*-Greeter" );
+ m_simpleConf=new KSimpleConfig(config->readEntry( "BackgroundCfg",KDE_CONFDIR "/kdm/backgroundrc" ) );
+ m_background = new BGDialog( this, m_simpleConf, false );
+
+ connect(m_background, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+
+ // Top layout
+ QVBoxLayout *top = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint() );
+ top->addWidget(m_pCBEnable);
+ top->addWidget(m_background);
+ top->addStretch();
+ connect( m_pCBEnable, SIGNAL(toggled( bool )), SLOT(slotEnableChanged()) );
+}
+
+KBackground::~KBackground()
+{
+ delete m_simpleConf;
+}
+
+void KBackground::slotEnableChanged()
+{
+ bool en = m_pCBEnable->isChecked();
+ m_background->setEnabled( en );
+ emit changed ( true );
+}
+
+void KBackground::makeReadOnly()
+{
+ m_pCBEnable->setEnabled(false);
+ m_background->makeReadOnly();
+}
+
+void KBackground::load()
+{
+ m_pCBEnable->setChecked( config->readBoolEntry( "UseBackground", true ) );
+ m_background->load(false);
+ slotEnableChanged();
+ emit changed(false);
+}
+
+
+void KBackground::save()
+{
+ kdDebug() << "Saving stuff..." << endl;
+ config->writeEntry( "UseBackground", m_pCBEnable->isChecked() );
+ m_background->save();
+ emit changed(false);
+}
+
+
+void KBackground::defaults()
+{
+ m_pCBEnable->setChecked( true );
+ slotEnableChanged();
+ m_background->defaults();
+ emit changed(true);
+}
+
+#include "background.moc"
diff --git a/kcontrol/kdm/background.h b/kcontrol/kdm/background.h
new file mode 100644
index 000000000..bc1e48213
--- /dev/null
+++ b/kcontrol/kdm/background.h
@@ -0,0 +1,50 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * This file is part of the KDE project, module kcmdisplay.
+ * Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ *
+ * You can Freely distribute this program under the GNU General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ */
+
+#ifndef __Bgnd_h_Included__
+#define __Bgnd_h_Included__
+
+#include <qobject.h>
+#include <qwidget.h>
+
+
+class KSimpleConfig;
+class BGDialog;
+class KGlobalBackgroundSettings;
+class QCheckBox;
+class QLabel;
+
+class KBackground: public QWidget
+{
+ Q_OBJECT
+public:
+ KBackground(QWidget *parent=0, const char *name=0);
+ ~KBackground();
+
+ void load();
+ void save();
+ void defaults();
+ void makeReadOnly();
+signals:
+ void changed(bool);
+
+private slots:
+ void slotEnableChanged();
+private:
+ void init();
+ void apply();
+
+ QCheckBox *m_pCBEnable;
+ QLabel *m_pMLabel;
+ KSimpleConfig *m_simpleConf;
+ BGDialog *m_background;
+};
+
+
+#endif // __Bgnd_h_Included__
diff --git a/kcontrol/kdm/kbackedcombobox.cpp b/kcontrol/kdm/kbackedcombobox.cpp
new file mode 100644
index 000000000..97759db5a
--- /dev/null
+++ b/kcontrol/kdm/kbackedcombobox.cpp
@@ -0,0 +1,40 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 2004-2005 Oswald Buddenhagen <ossi@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "kbackedcombobox.h"
+
+void KBackedComboBox::insertItem( const QString &id, const QString &name )
+{
+ id2name[id] = name;
+ name2id[name] = id;
+ KComboBox::insertItem( name );
+}
+
+void KBackedComboBox::setCurrentId( const QString &id )
+{
+ if (id2name.contains( id ))
+ setCurrentItem( id2name[id] );
+ else
+ setCurrentItem( 0 );
+}
+
+const QString &KBackedComboBox::currentId() const
+{
+ return name2id[currentText()];
+}
diff --git a/kcontrol/kdm/kbackedcombobox.h b/kcontrol/kdm/kbackedcombobox.h
new file mode 100644
index 000000000..3b006f23f
--- /dev/null
+++ b/kcontrol/kdm/kbackedcombobox.h
@@ -0,0 +1,38 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 2004-2005 Oswald Buddenhagen <ossi@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KBACKEDCOMBOBOX_H
+#define KBACKEDCOMBOBOX_H
+
+#include <kcombobox.h>
+
+class KBackedComboBox : public KComboBox {
+
+public:
+ KBackedComboBox( QWidget *parent ) : KComboBox( false, parent ) {}
+ void insertItem( const QString &id, const QString &name );
+ void setCurrentId( const QString &id );
+ const QString &currentId() const;
+
+private:
+ QMap<QString,QString> id2name, name2id;
+
+};
+
+#endif // KBACKEDCOMBOBOX_H
diff --git a/kcontrol/kdm/kdm-appear.cpp b/kcontrol/kdm/kdm-appear.cpp
new file mode 100644
index 000000000..684371d74
--- /dev/null
+++ b/kcontrol/kdm/kdm-appear.cpp
@@ -0,0 +1,516 @@
+/*
+ This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997-1998 Thomas Tanghus (tanghus@earthling.net)
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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 Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+
+#include <unistd.h>
+#include <sys/types.h>
+
+
+#include <qbuttongroup.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qwhatsthis.h>
+#include <qvalidator.h>
+#include <qstylefactory.h>
+#include <qstyle.h>
+
+#include <klocale.h>
+#include <klineedit.h>
+#include <kimageio.h>
+#include <kcombobox.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <kio/netaccess.h>
+#include <kiconloader.h>
+#include <kurldrag.h>
+#include <kimagefilepreview.h>
+
+#include "kdm-appear.h"
+#include "kbackedcombobox.h"
+
+extern KSimpleConfig *config;
+
+
+KDMAppearanceWidget::KDMAppearanceWidget(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ QString wtstr;
+
+ QVBoxLayout *vbox = new QVBoxLayout(this, KDialog::marginHint(),
+ KDialog::spacingHint(), "vbox");
+ QGroupBox *group = new QGroupBox(i18n("Appearance"), this);
+ vbox->addWidget(group);
+
+ QGridLayout *grid = new QGridLayout( group, 5, 2, KDialog::marginHint(),
+ KDialog::spacingHint(), "grid");
+ grid->addRowSpacing(0, group->fontMetrics().height());
+ grid->setColStretch(0, 1);
+ grid->setColStretch(1, 1);
+
+ QHBoxLayout *hlay = new QHBoxLayout( KDialog::spacingHint() );
+ grid->addMultiCellLayout(hlay, 1,1, 0,1);
+ greetstr_lined = new KLineEdit(group);
+ QLabel *label = new QLabel(greetstr_lined, i18n("&Greeting:"), group);
+ hlay->addWidget(label);
+ connect(greetstr_lined, SIGNAL(textChanged(const QString&)),
+ SLOT(changed()));
+ hlay->addWidget(greetstr_lined);
+ wtstr = i18n("This is the \"headline\" for KDM's login window. You may want to "
+ "put some nice greeting or information about the operating system here.<p>"
+ "KDM will substitute the following character pairs with the "
+ "respective contents:<br><ul>"
+ "<li>%d -> current display</li>"
+ "<li>%h -> host name, possibly with domain name</li>"
+ "<li>%n -> node name, most probably the host name without domain name</li>"
+ "<li>%s -> the operating system</li>"
+ "<li>%r -> the operating system's version</li>"
+ "<li>%m -> the machine (hardware) type</li>"
+ "<li>%% -> a single %</li>"
+ "</ul>" );
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( greetstr_lined, wtstr );
+
+
+ QGridLayout *hglay = new QGridLayout( 3, 4, KDialog::spacingHint() );
+ grid->addMultiCellLayout(hglay, 2,4, 0,0);
+
+ label = new QLabel(i18n("Logo area:"), group);
+ hglay->addWidget(label, 0, 0);
+ QVBoxLayout *vlay = new QVBoxLayout( KDialog::spacingHint() );
+ hglay->addMultiCellLayout(vlay, 0,0, 1,2);
+ noneRadio = new QRadioButton( i18n("logo area", "&None"), group );
+ clockRadio = new QRadioButton( i18n("Show cloc&k"), group );
+ logoRadio = new QRadioButton( i18n("Sho&w logo"), group );
+ QButtonGroup *buttonGroup = new QButtonGroup( group );
+ label->setBuddy( buttonGroup );
+ connect( buttonGroup, SIGNAL(clicked(int)), SLOT(slotAreaRadioClicked(int)) );
+ connect( buttonGroup, SIGNAL(clicked(int)), SLOT(changed()) );
+ buttonGroup->hide();
+ buttonGroup->insert(noneRadio, KdmNone);
+ buttonGroup->insert(clockRadio, KdmClock);
+ buttonGroup->insert(logoRadio, KdmLogo);
+ vlay->addWidget(noneRadio);
+ vlay->addWidget(clockRadio);
+ vlay->addWidget(logoRadio);
+ wtstr = i18n("You can choose to display a custom logo (see below), a clock or no logo at all.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( noneRadio, wtstr );
+ QWhatsThis::add( logoRadio, wtstr );
+ QWhatsThis::add( clockRadio, wtstr );
+
+ logoLabel = new QLabel(i18n("&Logo:"), group);
+ logobutton = new QPushButton(group);
+ logoLabel->setBuddy( logobutton );
+ logobutton->setAutoDefault(false);
+ logobutton->setAcceptDrops(true);
+ logobutton->installEventFilter(this); // for drag and drop
+ connect(logobutton, SIGNAL(clicked()), SLOT(slotLogoButtonClicked()));
+ hglay->addWidget(logoLabel, 1, 0);
+ hglay->addWidget(logobutton, 1, 1, AlignCenter);
+ hglay->addRowSpacing(1, 110);
+ wtstr = i18n("Click here to choose an image that KDM will display. "
+ "You can also drag and drop an image onto this button "
+ "(e.g. from Konqueror).");
+ QWhatsThis::add( logoLabel, wtstr );
+ QWhatsThis::add( logobutton, wtstr );
+ hglay->addRowSpacing( 2, KDialog::spacingHint());
+ hglay->setColStretch( 3, 1);
+
+
+ hglay = new QGridLayout( 2, 3, KDialog::spacingHint() );
+ grid->addLayout(hglay, 2, 1);
+
+ label = new QLabel(i18n("Position:"), group);
+ hglay->addMultiCellWidget(label, 0,1, 0,0, AlignVCenter);
+ QValidator *posValidator = new QIntValidator(0, 100, group);
+ QLabel *xLineLabel = new QLabel(i18n("&X:"), group);
+ hglay->addWidget(xLineLabel, 0, 1);
+ xLineEdit = new QLineEdit (group);
+ connect( xLineEdit, SIGNAL( textChanged(const QString&) ), SLOT( changed() ));
+ hglay->addWidget(xLineEdit, 0, 2);
+ xLineLabel->setBuddy(xLineEdit);
+ xLineEdit->setValidator(posValidator);
+ QLabel *yLineLabel = new QLabel(i18n("&Y:"), group);
+ hglay->addWidget(yLineLabel, 1, 1);
+ yLineEdit = new QLineEdit (group);
+ connect( yLineEdit, SIGNAL( textChanged(const QString&) ), SLOT( changed() ));
+ hglay->addWidget(yLineEdit, 1, 2);
+ yLineLabel->setBuddy(yLineEdit);
+ yLineEdit->setValidator(posValidator);
+ wtstr = i18n("Here you specify the relative coordinates (in percent) of the login dialog's <em>center</em>.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( xLineLabel, wtstr );
+ QWhatsThis::add( xLineEdit, wtstr );
+ QWhatsThis::add( yLineLabel, wtstr );
+ QWhatsThis::add( yLineEdit, wtstr );
+ hglay->setColStretch( 3, 1);
+ hglay->setRowStretch( 2, 1);
+
+
+ hglay = new QGridLayout( 2, 3, KDialog::spacingHint() );
+ grid->addLayout(hglay, 3, 1);
+ hglay->setColStretch(3, 1);
+
+ guicombo = new KBackedComboBox(group);
+ guicombo->insertItem( "", i18n("<default>") );
+ loadGuiStyles(guicombo);
+ guicombo->listBox()->sort();
+ label = new QLabel(guicombo, i18n("GUI s&tyle:"), group);
+ connect(guicombo, SIGNAL(activated(int)), SLOT(changed()));
+ hglay->addWidget(label, 0, 0);
+ hglay->addWidget(guicombo, 0, 1);
+ wtstr = i18n("You can choose a basic GUI style here that will be "
+ "used by KDM only.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( guicombo, wtstr );
+
+ colcombo = new KBackedComboBox(group);
+ colcombo->insertItem( "", i18n("<default>") );
+ loadColorSchemes(colcombo);
+ colcombo->listBox()->sort();
+ label = new QLabel(colcombo, i18n("&Color scheme:"), group);
+ connect(colcombo, SIGNAL(activated(int)), SLOT(changed()));
+ hglay->addWidget(label, 1, 0);
+ hglay->addWidget(colcombo, 1, 1);
+ wtstr = i18n("You can choose a basic Color Scheme here that will be "
+ "used by KDM only.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( colcombo, wtstr );
+
+ echocombo = new KBackedComboBox(group);
+ echocombo->insertItem("NoEcho", i18n("No Echo"));
+ echocombo->insertItem("OneStar", i18n("One Star"));
+ echocombo->insertItem("ThreeStars", i18n("Three Stars"));
+ label = new QLabel(echocombo, i18n("Echo &mode:"), group);
+ connect(echocombo, SIGNAL(activated(int)), SLOT(changed()));
+ hglay->addWidget(label, 2, 0);
+ hglay->addWidget(echocombo, 2, 1);
+ wtstr = i18n("You can choose whether and how KDM shows your password when you type it.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( echocombo, wtstr );
+
+
+ // The Language group box
+ group = new QGroupBox(0, Vertical, i18n("Locale"), this);
+ vbox->addWidget(group);
+
+ langcombo = new KLanguageButton(group);
+ loadLanguageList(langcombo);
+ connect(langcombo, SIGNAL(activated(const QString &)), SLOT(changed()));
+ label = new QLabel(langcombo, i18n("Languag&e:"), group);
+ QGridLayout *hbox = new QGridLayout( group->layout(), 2, 2, KDialog::spacingHint() );
+ hbox->setColStretch(1, 1);
+ hbox->addWidget(label, 1, 0);
+ hbox->addWidget(langcombo, 1, 1);
+ wtstr = i18n("Here you can choose the language used by KDM. This setting does not affect"
+ " a user's personal settings; that will take effect after login.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( langcombo, wtstr );
+
+
+ vbox->addStretch(1);
+
+}
+
+void KDMAppearanceWidget::makeReadOnly()
+{
+ disconnect( logobutton, SIGNAL(clicked()),
+ this, SLOT(slotLogoButtonClicked()) );
+ logobutton->setAcceptDrops(false);
+ greetstr_lined->setReadOnly(true);
+ noneRadio->setEnabled(false);
+ clockRadio->setEnabled(false);
+ logoRadio->setEnabled(false);
+ xLineEdit->setEnabled(false);
+ yLineEdit->setEnabled(false);
+ guicombo->setEnabled(false);
+ colcombo->setEnabled(false);
+ echocombo->setEnabled(false);
+ langcombo->setEnabled(false);
+}
+
+void KDMAppearanceWidget::loadLanguageList(KLanguageButton *combo)
+{
+ QStringList langlist = KGlobal::dirs()->findAllResources("locale",
+ QString::fromLatin1("*/entry.desktop"));
+ langlist.sort();
+ for ( QStringList::ConstIterator it = langlist.begin();
+ it != langlist.end(); ++it )
+ {
+ QString fpath = (*it).left((*it).length() - 14);
+ int index = fpath.findRev('/');
+ QString nid = fpath.mid(index + 1);
+
+ KSimpleConfig entry(*it);
+ entry.setGroup(QString::fromLatin1("KCM Locale"));
+ QString name = entry.readEntry(QString::fromLatin1("Name"), i18n("without name"));
+ combo->insertLanguage(nid, name, QString::fromLatin1("l10n/"), QString::null);
+ }
+}
+
+void KDMAppearanceWidget::loadColorSchemes(KBackedComboBox *combo)
+{
+ // XXX: Global + local schemes
+ QStringList list = KGlobal::dirs()->
+ findAllResources("data", "kdisplay/color-schemes/*.kcsrc", false, true);
+ for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it)
+ {
+ KSimpleConfig config(*it, true);
+ config.setGroup("Color Scheme");
+
+ QString str;
+ if (!(str = config.readEntry("Name")).isEmpty() ||
+ !(str = config.readEntry("name")).isEmpty())
+ {
+ QString str2 = (*it).mid( (*it).findRev( '/' ) + 1 ); // strip off path
+ str2.setLength( str2.length() - 6 ); // strip off ".kcsrc
+ combo->insertItem( str2, str );
+ }
+ }
+}
+
+void KDMAppearanceWidget::loadGuiStyles(KBackedComboBox *combo)
+{
+ // XXX: Global + local schemes
+ QStringList list = KGlobal::dirs()->
+ findAllResources("data", "kstyle/themes/*.themerc", false, true);
+ for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it)
+ {
+ KSimpleConfig config(*it, true);
+
+ if (!(config.hasGroup("KDE") && config.hasGroup("Misc")))
+ continue;
+
+ config.setGroup("Desktop Entry");
+ if (config.readBoolEntry("Hidden", false))
+ continue;
+
+ config.setGroup("KDE");
+ QString str2 = config.readEntry("WidgetStyle");
+ if (str2.isNull())
+ continue;
+
+ config.setGroup("Misc");
+ combo->insertItem( str2, config.readEntry("Name") );
+ }
+}
+
+bool KDMAppearanceWidget::setLogo(QString logo)
+{
+ QString flogo = logo.isEmpty() ?
+ locate("data", QString::fromLatin1("kdm/pics/kdelogo.png") ) :
+ logo;
+ QImage p(flogo);
+ if (p.isNull())
+ return false;
+ if (p.width() > 100 || p.height() > 100)
+ p = p.smoothScale(100, 100, QImage::ScaleMin);
+ logobutton->setPixmap(p);
+ uint bd = style().pixelMetric( QStyle::PM_ButtonMargin ) * 2;
+ logobutton->setFixedSize(p.width() + bd, p.height() + bd);
+ logopath = logo;
+ return true;
+}
+
+
+void KDMAppearanceWidget::slotLogoButtonClicked()
+{
+ KImageIO::registerFormats();
+ KFileDialog dialogue(locate("data", QString::fromLatin1("kdm/pics/")),
+ KImageIO::pattern( KImageIO::Reading ),
+ this, 0, true);
+ dialogue.setOperationMode( KFileDialog::Opening );
+ dialogue.setMode( KFile::File | KFile::LocalOnly );
+
+ KImageFilePreview* imagePreview = new KImageFilePreview( &dialogue );
+ dialogue.setPreviewWidget( imagePreview );
+ if (dialogue.exec() == QDialog::Accepted) {
+ if ( setLogo(dialogue.selectedFile()) ) {
+ changed();
+ }
+ }
+}
+
+
+void KDMAppearanceWidget::slotAreaRadioClicked(int id)
+{
+ logobutton->setEnabled( id == KdmLogo );
+ logoLabel->setEnabled( id == KdmLogo );
+}
+
+
+bool KDMAppearanceWidget::eventFilter(QObject *, QEvent *e)
+{
+ if (e->type() == QEvent::DragEnter) {
+ iconLoaderDragEnterEvent((QDragEnterEvent *) e);
+ return true;
+ }
+
+ if (e->type() == QEvent::Drop) {
+ iconLoaderDropEvent((QDropEvent *) e);
+ return true;
+ }
+
+ return false;
+}
+
+void KDMAppearanceWidget::iconLoaderDragEnterEvent(QDragEnterEvent *e)
+{
+ e->accept(KURLDrag::canDecode(e));
+}
+
+
+KURL *decodeImgDrop(QDropEvent *e, QWidget *wdg);
+
+void KDMAppearanceWidget::iconLoaderDropEvent(QDropEvent *e)
+{
+ KURL pixurl;
+ bool istmp;
+
+ KURL *url = decodeImgDrop(e, this);
+ if (url) {
+
+ // we gotta check if it is a non-local file and make a tmp copy at the hd.
+ if(!url->isLocalFile()) {
+ pixurl.setPath(KGlobal::dirs()->resourceDirs("data").last() +
+ "kdm/pics/" + url->fileName());
+ KIO::NetAccess::copy(*url, pixurl, parentWidget());
+ istmp = true;
+ } else {
+ pixurl = *url;
+ istmp = false;
+ }
+
+ // By now url should be "file:/..."
+ if (!setLogo(pixurl.path())) {
+ KIO::NetAccess::del(pixurl, parentWidget());
+ QString msg = i18n("There was an error loading the image:\n"
+ "%1\n"
+ "It will not be saved.")
+ .arg(pixurl.path());
+ KMessageBox::sorry(this, msg);
+ }
+
+ delete url;
+ }
+}
+
+
+void KDMAppearanceWidget::save()
+{
+ config->setGroup("X-*-Greeter");
+
+ config->writeEntry("GreetString", greetstr_lined->text());
+
+ config->writeEntry("LogoArea", noneRadio->isChecked() ? "None" :
+ logoRadio->isChecked() ? "Logo" : "Clock" );
+
+ config->writeEntry("LogoPixmap", KGlobal::iconLoader()->iconPath(logopath, KIcon::Desktop, true));
+
+ config->writeEntry("GUIStyle", guicombo->currentId());
+
+ config->writeEntry("ColorScheme", colcombo->currentId());
+
+ config->writeEntry("EchoMode", echocombo->currentId());
+
+ config->writeEntry("GreeterPos", xLineEdit->text() + ',' + yLineEdit->text());
+
+ config->writeEntry("Language", langcombo->current());
+}
+
+
+void KDMAppearanceWidget::load()
+{
+ config->setGroup("X-*-Greeter");
+
+ // Read the greeting string
+ greetstr_lined->setText(config->readEntry("GreetString", i18n("Welcome to %s at %n")));
+
+ // Regular logo or clock
+ QString logoArea = config->readEntry("LogoArea", "Logo" );
+ if (logoArea == "Clock") {
+ clockRadio->setChecked(true);
+ slotAreaRadioClicked(KdmClock);
+ } else if (logoArea == "Logo") {
+ logoRadio->setChecked(true);
+ slotAreaRadioClicked(KdmLogo);
+ } else {
+ noneRadio->setChecked(true);
+ slotAreaRadioClicked(KdmNone);
+ }
+
+ // See if we use alternate logo
+ setLogo(config->readEntry("LogoPixmap"));
+
+ // Check the GUI type
+ guicombo->setCurrentId(config->readEntry("GUIStyle"));
+
+ // Check the Color Scheme
+ colcombo->setCurrentId(config->readEntry("ColorScheme"));
+
+ // Check the echo mode
+ echocombo->setCurrentId(config->readEntry("EchoMode", "OneStar"));
+
+ QStringList sl = config->readListEntry( "GreeterPos" );
+ if (sl.count() != 2) {
+ xLineEdit->setText( "50" );
+ yLineEdit->setText( "50" );
+ } else {
+ xLineEdit->setText( sl.first() );
+ yLineEdit->setText( sl.last() );
+ }
+
+ // get the language
+ langcombo->setCurrentItem(config->readEntry("Language", "C"));
+}
+
+
+void KDMAppearanceWidget::defaults()
+{
+ greetstr_lined->setText( i18n("Welcome to %s at %n") );
+ logoRadio->setChecked( true );
+ slotAreaRadioClicked( KdmLogo );
+ setLogo( "" );
+ guicombo->setCurrentId( "" );
+ colcombo->setCurrentId( "" );
+ echocombo->setCurrentItem( "OneStar" );
+
+ xLineEdit->setText( "50" );
+ yLineEdit->setText( "50" );
+
+ langcombo->setCurrentItem( "en_US" );
+}
+
+QString KDMAppearanceWidget::quickHelp() const
+{
+ return i18n("<h1>KDM - Appearance</h1> Here you can configure the basic appearance"
+ " of the KDM login manager, i.e. a greeting string, an icon etc.<p>"
+ " For further refinement of KDM's appearance, see the \"Font\" and \"Background\" "
+ " tabs.");
+}
+
+
+void KDMAppearanceWidget::changed()
+{
+ emit changed(true);
+}
+
+#include "kdm-appear.moc"
diff --git a/kcontrol/kdm/kdm-appear.h b/kcontrol/kdm/kdm-appear.h
new file mode 100644
index 000000000..991b6e4e0
--- /dev/null
+++ b/kcontrol/kdm/kdm-appear.h
@@ -0,0 +1,95 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997 Thomas Tanghus (tanghus@earthling.net)
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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 Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+
+#ifndef __KDMAPPEAR_H__
+#define __KDMAPPEAR_H__
+
+
+#include <qdir.h>
+#include <qimage.h>
+#include <qfileinfo.h>
+#include <qpushbutton.h>
+
+#include <kcolorbutton.h>
+#include <kurl.h>
+#include <kfiledialog.h>
+
+
+#include "klanguagebutton.h"
+
+class QComboBox;
+class KBackedComboBox;
+class QLabel;
+class QRadioButton;
+class QLineEdit;
+class KLineEdit;
+
+
+class KDMAppearanceWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ KDMAppearanceWidget(QWidget *parent, const char *name=0);
+
+ void load();
+ void save();
+ void defaults();
+ void makeReadOnly();
+ QString quickHelp() const;
+
+ void loadColorSchemes(KBackedComboBox *combo);
+ void loadGuiStyles(KBackedComboBox *combo);
+ void loadLanguageList(KLanguageButton *combo);
+
+ bool eventFilter(QObject *, QEvent *);
+
+signals:
+ void changed( bool state );
+
+protected:
+ void iconLoaderDragEnterEvent(QDragEnterEvent *event);
+ void iconLoaderDropEvent(QDropEvent *event);
+ bool setLogo(QString logo);
+
+private slots:
+ void slotAreaRadioClicked(int id);
+ void slotLogoButtonClicked();
+ void changed();
+
+private:
+ enum { KdmNone, KdmClock, KdmLogo };
+ QLabel *logoLabel;
+ QPushButton *logobutton;
+ KLineEdit *greetstr_lined;
+ QString logopath;
+ QRadioButton *noneRadio;
+ QRadioButton *clockRadio;
+ QRadioButton *logoRadio;
+ QLineEdit *xLineEdit;
+ QLineEdit *yLineEdit;
+ KBackedComboBox *guicombo;
+ KBackedComboBox *colcombo;
+ KBackedComboBox *echocombo;
+ KLanguageButton *langcombo;
+
+};
+
+#endif
diff --git a/kcontrol/kdm/kdm-conv.cpp b/kcontrol/kdm/kdm-conv.cpp
new file mode 100644
index 000000000..71d292c5f
--- /dev/null
+++ b/kcontrol/kdm/kdm-conv.cpp
@@ -0,0 +1,362 @@
+/* This file is part of the KDE Display Manager Configuration package
+
+ Copyright (C) 2000 Oswald Buddenhagen <ossi@kde.org>
+ Based on several other files.
+
+ 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 Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <unistd.h>
+#include <sys/types.h>
+
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qhgroupbox.h>
+#include <qvgroupbox.h>
+#include <qvbuttongroup.h>
+#include <qwhatsthis.h>
+#include <qheader.h>
+
+#include <kdialog.h>
+#include <ksimpleconfig.h>
+#include <klocale.h>
+
+#include "kdm-conv.h"
+
+extern KSimpleConfig *config;
+
+KDMConvenienceWidget::KDMConvenienceWidget(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ QString wtstr;
+
+ QLabel *paranoia = new QLabel( i18n("<qt><center><font color=red><big><b>Attention!<br>Read help!</b></big></font></center></qt>"), this );
+
+ QSizePolicy vpref( QSizePolicy::Minimum, QSizePolicy::Fixed );
+
+ alGroup = new QVGroupBox( i18n("Enable Au&to-Login"), this );
+ alGroup->setCheckable( true );
+ alGroup->setSizePolicy( vpref );
+
+ QWhatsThis::add( alGroup, i18n("Turn on the auto-login feature."
+ " This applies only to KDM's graphical login."
+ " Think twice before enabling this!") );
+ connect(alGroup, SIGNAL(toggled(bool)), SLOT(slotChanged()));
+
+ QWidget *hlpw1 = new QWidget( alGroup );
+ userlb = new KComboBox( hlpw1 );
+ u_label = new QLabel( userlb, i18n("Use&r:"), hlpw1 );
+ QGridLayout *hlpl1 = new QGridLayout(hlpw1, 2, 2, 0, KDialog::spacingHint());
+ hlpl1->setColStretch(2, 1);
+ hlpl1->addWidget(u_label, 0, 0);
+ hlpl1->addWidget(userlb, 0, 1);
+ connect(userlb, SIGNAL(highlighted(int)), SLOT(slotChanged()));
+ wtstr = i18n("Select the user to be logged in automatically.");
+ QWhatsThis::add( u_label, wtstr );
+ QWhatsThis::add( userlb, wtstr );
+ delaysb = new QSpinBox( 0, 3600, 5, hlpw1 );
+ delaysb->setSpecialValueText( i18n("delay", "none") );
+ delaysb->setSuffix( i18n("seconds", " s") );
+ d_label = new QLabel( delaysb, i18n("D&elay:"), hlpw1 );
+ hlpl1->addWidget(d_label, 1, 0);
+ hlpl1->addWidget(delaysb, 1, 1);
+ connect(delaysb, SIGNAL(valueChanged(int)), SLOT(slotChanged()));
+ wtstr = i18n("The delay (in seconds) before the automatic login kicks in. "
+ "This feature is also known as \"timed login\".");
+ QWhatsThis::add( d_label, wtstr );
+ QWhatsThis::add( delaysb, wtstr );
+ againcb = new QCheckBox( i18n("P&ersistent"), alGroup );
+ connect( againcb, SIGNAL(toggled(bool)), SLOT(slotChanged()) );
+ QWhatsThis::add( againcb, i18n("Normally, automatic login is performed only "
+ "when KDM starts up. If this is checked, automatic login will kick in "
+ "after finishing a session as well.") );
+ autoLockCheck = new QCheckBox( i18n("Loc&k session"), alGroup );
+ connect( autoLockCheck, SIGNAL(toggled(bool)), SLOT(slotChanged()) );
+ QWhatsThis::add( autoLockCheck, i18n("If checked, the automatically started session "
+ "will be locked immediately (provided it is a KDE session). This can "
+ "be used to obtain a super-fast login restricted to one user.") );
+
+
+ puGroup = new QVButtonGroup(i18n("Preselect User"), this );
+ puGroup->setSizePolicy( vpref );
+
+ connect(puGroup, SIGNAL(clicked(int)), SLOT(slotPresChanged()));
+ connect(puGroup, SIGNAL(clicked(int)), SLOT(slotChanged()));
+ npRadio = new QRadioButton(i18n("preselected user", "&None"), puGroup);
+ ppRadio = new QRadioButton(i18n("Prev&ious"), puGroup);
+ QWhatsThis::add( ppRadio, i18n("Preselect the user that logged in previously. "
+ "Use this if this computer is usually used several consecutive times by one user.") );
+ spRadio = new QRadioButton(i18n("Specif&y"), puGroup);
+ QWhatsThis::add( spRadio, i18n("Preselect the user specified in the combo box below. "
+ "Use this if this computer is predominantly used by a certain user.") );
+ QWidget *hlpw = new QWidget(puGroup);
+ puserlb = new KComboBox(true, hlpw);
+ pu_label = new QLabel(puserlb, i18n("Us&er:"), hlpw);
+ connect(puserlb, SIGNAL(textChanged(const QString &)), SLOT(slotChanged()));
+ wtstr = i18n("Select the user to be preselected for login. "
+ "This box is editable, so you can specify an arbitrary non-existent "
+ "user to mislead possible attackers.");
+ QWhatsThis::add( pu_label, wtstr );
+ QWhatsThis::add( puserlb, wtstr );
+ QBoxLayout *hlpl = new QHBoxLayout(hlpw, 0, KDialog::spacingHint());
+ hlpl->addWidget(pu_label);
+ hlpl->addWidget(puserlb);
+ hlpl->addStretch( 1 );
+ cbjumppw = new QCheckBox(i18n("Focus pass&word"), puGroup);
+ QWhatsThis::add( cbjumppw, i18n("When this option is on, KDM will place the cursor "
+ "in the password field instead of the user field after preselecting a user. "
+ "Use this to save one key press per login, if the preselection usually does not need to "
+ "be changed.") );
+ connect(cbjumppw, SIGNAL(toggled(bool)), SLOT(slotChanged()));
+
+ npGroup = new QVGroupBox(i18n("Enable Password-&Less Logins"), this );
+ npGroup->setCheckable( true );
+
+ QWhatsThis::add( npGroup, i18n("When this option is checked, the checked users from"
+ " the list below will be allowed to log in without entering their"
+ " password. This applies only to KDM's graphical login."
+ " Think twice before enabling this!") );
+
+ connect(npGroup, SIGNAL(toggled(bool)), SLOT(slotChanged()));
+
+ pl_label = new QLabel(i18n("No password re&quired for:"), npGroup);
+ npuserlv = new KListView(npGroup);
+ pl_label->setBuddy(npuserlv);
+ npuserlv->addColumn(QString::null);
+ npuserlv->header()->hide();
+ npuserlv->setResizeMode(QListView::LastColumn);
+ QWhatsThis::add(npuserlv, i18n("Check all users you want to allow a password-less login for."
+ " Entries denoted with '@' are user groups. Checking a group is like checking all users in that group."));
+ connect( npuserlv, SIGNAL(clicked( QListViewItem * )),
+ SLOT(slotChanged()) );
+
+ btGroup = new QVGroupBox( i18n("Miscellaneous"), this );
+
+ cbarlen = new QCheckBox(i18n("Automatically log in again after &X server crash"), btGroup);
+ QWhatsThis::add( cbarlen, i18n("When this option is on, a user will be"
+ " logged in again automatically when their session is interrupted by an"
+ " X server crash; note that this can open a security hole: if you use"
+ " a screen locker than KDE's integrated one, this will make"
+ " circumventing a password-secured screen lock possible.") );
+ connect(cbarlen, SIGNAL(toggled(bool)), SLOT(slotChanged()));
+
+ QGridLayout *main = new QGridLayout(this, 5, 2, 10);
+ main->addWidget(paranoia, 0, 0);
+ main->addWidget(alGroup, 1, 0);
+ main->addWidget(puGroup, 2, 0);
+ main->addMultiCellWidget(npGroup, 0,3, 1,1);
+ main->addMultiCellWidget(btGroup, 4,4, 0,1);
+ main->setColStretch(0, 1);
+ main->setColStretch(1, 2);
+ main->setRowStretch(3, 1);
+
+ connect( userlb, SIGNAL(activated( const QString & )),
+ SLOT(slotSetAutoUser( const QString & )) );
+ connect( puserlb, SIGNAL(textChanged( const QString & )),
+ SLOT(slotSetPreselUser( const QString & )) );
+ connect( npuserlv, SIGNAL(clicked( QListViewItem * )),
+ SLOT(slotUpdateNoPassUser( QListViewItem * )) );
+
+}
+
+void KDMConvenienceWidget::makeReadOnly()
+{
+ ((QWidget*)alGroup->child("qt_groupbox_checkbox"))->setEnabled(false);
+ userlb->setEnabled(false);
+ delaysb->setEnabled(false);
+ againcb->setEnabled(false);
+ autoLockCheck->setEnabled(false);
+ ((QWidget*)npGroup->child("qt_groupbox_checkbox"))->setEnabled(false);
+ npuserlv->setEnabled(false);
+ cbarlen->setEnabled(false);
+ npRadio->setEnabled(false);
+ ppRadio->setEnabled(false);
+ spRadio->setEnabled(false);
+ puserlb->setEnabled(false);
+ cbjumppw->setEnabled(false);
+}
+
+void KDMConvenienceWidget::slotPresChanged()
+{
+ bool en = spRadio->isChecked();
+ pu_label->setEnabled(en);
+ puserlb->setEnabled(en);
+ cbjumppw->setEnabled(!npRadio->isChecked());
+}
+
+void KDMConvenienceWidget::save()
+{
+ config->setGroup("X-:0-Core");
+ config->writeEntry( "AutoLoginEnable", alGroup->isChecked() );
+ config->writeEntry( "AutoLoginUser", userlb->currentText() );
+ config->writeEntry( "AutoLoginDelay", delaysb->value() );
+ config->writeEntry( "AutoLoginAgain", againcb->isChecked() );
+ config->writeEntry( "AutoLoginLocked", autoLockCheck->isChecked() );
+
+ config->setGroup("X-:*-Core");
+ config->writeEntry( "NoPassEnable", npGroup->isChecked() );
+ config->writeEntry( "NoPassUsers", noPassUsers );
+
+ config->setGroup("X-*-Core");
+ config->writeEntry( "AutoReLogin", cbarlen->isChecked() );
+
+ config->setGroup("X-:*-Greeter");
+ config->writeEntry( "PreselectUser", npRadio->isChecked() ? "None" :
+ ppRadio->isChecked() ? "Previous" :
+ "Default" );
+ config->writeEntry( "DefaultUser", puserlb->currentText() );
+ config->writeEntry( "FocusPasswd", cbjumppw->isChecked() );
+}
+
+
+void KDMConvenienceWidget::load()
+{
+ config->setGroup("X-:0-Core");
+ bool alenable = config->readBoolEntry( "AutoLoginEnable", false);
+ autoUser = config->readEntry( "AutoLoginUser" );
+ delaysb->setValue( config->readNumEntry( "AutoLoginDelay", 0 ) );
+ againcb->setChecked( config->readBoolEntry( "AutoLoginAgain", false ) );
+ autoLockCheck->setChecked( config->readBoolEntry( "AutoLoginLocked", false ) );
+ if (autoUser.isEmpty())
+ alenable=false;
+ alGroup->setChecked( alenable );
+
+ config->setGroup("X-:*-Core");
+ npGroup->setChecked(config->readBoolEntry( "NoPassEnable", false) );
+ noPassUsers = config->readListEntry( "NoPassUsers");
+
+ config->setGroup("X-*-Core");
+ cbarlen->setChecked(config->readBoolEntry( "AutoReLogin", false) );
+
+ config->setGroup("X-:*-Greeter");
+ QString presstr = config->readEntry( "PreselectUser", "None" );
+ if (presstr == "Previous")
+ ppRadio->setChecked(true);
+ else if (presstr == "Default")
+ spRadio->setChecked(true);
+ else
+ npRadio->setChecked(true);
+ preselUser = config->readEntry( "DefaultUser" );
+ cbjumppw->setChecked(config->readBoolEntry( "FocusPasswd", false) );
+
+ slotPresChanged();
+}
+
+
+void KDMConvenienceWidget::defaults()
+{
+ alGroup->setChecked(false);
+ delaysb->setValue(0);
+ againcb->setChecked(false);
+ autoLockCheck->setChecked(false);
+ npRadio->setChecked(true);
+ npGroup->setChecked(false);
+ cbarlen->setChecked(false);
+ cbjumppw->setChecked(false);
+ autoUser = "";
+ preselUser = "";
+ noPassUsers.clear();
+
+ slotPresChanged();
+}
+
+
+void KDMConvenienceWidget::slotChanged()
+{
+ emit changed(true);
+}
+
+void KDMConvenienceWidget::slotSetAutoUser( const QString &user )
+{
+ autoUser = user;
+}
+
+void KDMConvenienceWidget::slotSetPreselUser( const QString &user )
+{
+ preselUser = user;
+}
+
+void KDMConvenienceWidget::slotUpdateNoPassUser( QListViewItem *item )
+{
+ if ( !item )
+ return;
+ QCheckListItem *itm = (QCheckListItem *)item;
+ QStringList::iterator it = noPassUsers.find( itm->text() );
+ if (itm->isOn()) {
+ if (it == noPassUsers.end())
+ noPassUsers.append( itm->text() );
+ } else {
+ if (it != noPassUsers.end())
+ noPassUsers.remove( it );
+ }
+}
+
+void KDMConvenienceWidget::slotClearUsers()
+{
+ userlb->clear();
+ puserlb->clear();
+ npuserlv->clear();
+ if (!autoUser.isEmpty())
+ userlb->insertItem(autoUser);
+ if (!preselUser.isEmpty())
+ puserlb->insertItem(preselUser);
+}
+
+void KDMConvenienceWidget::slotAddUsers(const QMap<QString,int> &users)
+{
+ QMapConstIterator<QString,int> it;
+ for (it = users.begin(); it != users.end(); ++it) {
+ if (it.data() > 0) {
+ if (it.key() != autoUser)
+ userlb->insertItem(it.key());
+ if (it.key() != preselUser)
+ puserlb->insertItem(it.key());
+ }
+ if (it.data() != 0)
+ (new QCheckListItem(npuserlv, it.key(), QCheckListItem::CheckBox))->
+ setOn(noPassUsers.find(it.key()) != noPassUsers.end());
+ }
+
+ if (userlb->listBox())
+ userlb->listBox()->sort();
+
+ if (puserlb->listBox())
+ puserlb->listBox()->sort();
+
+ npuserlv->sort();
+ userlb->setCurrentItem(autoUser);
+ puserlb->setCurrentItem(preselUser);
+}
+
+void KDMConvenienceWidget::slotDelUsers(const QMap<QString,int> &users)
+{
+ QMapConstIterator<QString,int> it;
+ for (it = users.begin(); it != users.end(); ++it) {
+ if (it.data() > 0) {
+ if (it.key() != autoUser && userlb->listBox())
+ delete userlb->listBox()->
+ findItem( it.key(), ExactMatch | CaseSensitive );
+ if (it.key() != preselUser && puserlb->listBox())
+ delete puserlb->listBox()->
+ findItem( it.key(), ExactMatch | CaseSensitive );
+ }
+ if (it.data() != 0)
+ delete npuserlv->findItem( it.key(), 0 );
+ }
+}
+
+#include "kdm-conv.moc"
diff --git a/kcontrol/kdm/kdm-conv.h b/kcontrol/kdm/kdm-conv.h
new file mode 100644
index 000000000..c00128629
--- /dev/null
+++ b/kcontrol/kdm/kdm-conv.h
@@ -0,0 +1,84 @@
+/* This file is part of the KDE Display Manager Configuration package
+
+ Copyright (C) 2000 Oswald Buddenhagen <ossi@kde.org>
+ Based on several other files.
+
+ 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 Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __KDMCONV_H__
+#define __KDMCONV_H__
+
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qimage.h>
+#include <qgroupbox.h>
+#include <qradiobutton.h>
+#include <qcheckbox.h>
+#include <qspinbox.h>
+
+#include <klistbox.h>
+#include <kcombobox.h>
+#include <kcolorbutton.h>
+#include <klistview.h>
+#include <kurl.h>
+
+#include <pwd.h>
+
+
+class KDMConvenienceWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ KDMConvenienceWidget(QWidget *parent=0, const char *name=0);
+
+ void load();
+ void save();
+ void defaults();
+ void makeReadOnly();
+
+public slots:
+ void slotClearUsers();
+ void slotAddUsers(const QMap<QString,int> &);
+ void slotDelUsers(const QMap<QString,int> &);
+
+
+signals:
+ void changed( bool state );
+
+private slots:
+ void slotPresChanged();
+ void slotChanged();
+ void slotSetAutoUser( const QString &user );
+ void slotSetPreselUser( const QString &user );
+ void slotUpdateNoPassUser( QListViewItem *item );
+
+private:
+ QGroupBox *alGroup, *puGroup, *npGroup, *btGroup;
+ QCheckBox *againcb, *cbarlen, *cbjumppw, *autoLockCheck;
+ QRadioButton *npRadio, *ppRadio, *spRadio;
+ KComboBox *userlb, *puserlb;
+ QSpinBox *delaysb;
+ KListView *npuserlv;
+ QLabel *u_label, *d_label, *pu_label, *w_label, *n_label, *pl_label;
+ QString autoUser, preselUser;
+ QStringList noPassUsers;
+};
+
+#endif
+
+
diff --git a/kcontrol/kdm/kdm-font.cpp b/kcontrol/kdm/kdm-font.cpp
new file mode 100644
index 000000000..da67e5eaa
--- /dev/null
+++ b/kcontrol/kdm/kdm-font.cpp
@@ -0,0 +1,134 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997 Thomas Tanghus (tanghus@earthling.net)
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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 Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <unistd.h>
+#include <sys/types.h>
+
+
+#include <qapplication.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qwhatsthis.h>
+
+#include <kdialog.h>
+#include <ksimpleconfig.h>
+#include <kfontrequester.h>
+#include <klocale.h>
+
+#include "kdm-font.h"
+
+
+extern KSimpleConfig *config;
+
+KDMFontWidget::KDMFontWidget(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ QGridLayout *ml = new QGridLayout(this, 5, 2, KDialog::marginHint(), KDialog::spacingHint());
+ QLabel *label = new QLabel(i18n("&General:"), this);
+ stdFontChooser = new KFontRequester(this);
+ label->setBuddy(stdFontChooser);
+ QWhatsThis::add( stdFontChooser, i18n("This changes the font which is used for all the text in the login manager except for the greeting and failure messages.") );
+ connect(stdFontChooser, SIGNAL(fontSelected(const QFont&)),this,SLOT(configChanged()));
+ ml->addWidget(label, 1, 0);
+ ml->addWidget(stdFontChooser, 1, 1);
+
+ label = new QLabel(i18n("&Failures:"), this);
+ failFontChooser = new KFontRequester(this);
+ label->setBuddy(failFontChooser);
+ QWhatsThis::add( failFontChooser, i18n("This changes the font which is used for failure messages in the login manager.") );
+ connect(failFontChooser, SIGNAL(fontSelected(const QFont&)),this,SLOT(configChanged()));
+ ml->addWidget(label, 2, 0);
+ ml->addWidget(failFontChooser, 2, 1);
+
+ label = new QLabel(i18n("Gree&ting:"), this);
+ greetingFontChooser = new KFontRequester(this);
+ label->setBuddy(greetingFontChooser);
+ QWhatsThis::add( greetingFontChooser, i18n("This changes the font which is used for the login manager's greeting.") );
+ connect(greetingFontChooser, SIGNAL(fontSelected(const QFont&)),this,SLOT(configChanged()));
+ ml->addWidget(label, 3, 0);
+ ml->addWidget(greetingFontChooser, 3, 1);
+
+ aacb = new QCheckBox (i18n("Use anti-aliasing for fonts"), this);
+ QWhatsThis::add( aacb, i18n("If you check this box and your X-Server has the Xft extension, "
+ "fonts will be antialiased (smoothed) in the login dialog.") );
+ connect(aacb, SIGNAL(toggled ( bool )),this,SLOT(configChanged()));
+ ml->addMultiCellWidget(aacb, 4, 4, 0, 1);
+ ml->setRowStretch(5, 10);
+}
+
+void KDMFontWidget::makeReadOnly()
+{
+ stdFontChooser->button()->setEnabled(false);
+ failFontChooser->button()->setEnabled(false);
+ greetingFontChooser->button()->setEnabled(false);
+ aacb->setEnabled(false);
+}
+
+void KDMFontWidget::configChanged()
+{
+ emit changed(true);
+}
+
+void KDMFontWidget::set_def()
+{
+ stdFontChooser->setFont(QFont("Sans Serif", 10));
+ failFontChooser->setFont(QFont("Sans Serif", 10, QFont::Bold));
+ greetingFontChooser->setFont(QFont("Serif", 20));
+}
+
+void KDMFontWidget::save()
+{
+ config->setGroup("X-*-Greeter");
+
+ // write font
+ config->writeEntry("StdFont", stdFontChooser->font());
+ config->writeEntry("GreetFont", greetingFontChooser->font());
+ config->writeEntry("FailFont", failFontChooser->font());
+ config->writeEntry("AntiAliasing", aacb->isChecked());
+}
+
+
+void KDMFontWidget::load()
+{
+ set_def();
+
+ config->setGroup("X-*-Greeter");
+
+ // Read the fonts
+ QFont font = stdFontChooser->font();
+ stdFontChooser->setFont(config->readFontEntry("StdFont", &font));
+ font = failFontChooser->font();
+ failFontChooser->setFont(config->readFontEntry("FailFont", &font));
+ font = greetingFontChooser->font();
+ greetingFontChooser->setFont(config->readFontEntry("GreetFont", &font));
+
+ aacb->setChecked(config->readBoolEntry("AntiAliasing"));
+}
+
+
+void KDMFontWidget::defaults()
+{
+ set_def();
+ aacb->setChecked(false);
+}
+
+#include "kdm-font.moc"
diff --git a/kcontrol/kdm/kdm-font.h b/kcontrol/kdm/kdm-font.h
new file mode 100644
index 000000000..232db3cb4
--- /dev/null
+++ b/kcontrol/kdm/kdm-font.h
@@ -0,0 +1,57 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997 Thomas Tanghus (tanghus@earthling.net)
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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 Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __KDMFONT_H__
+#define __KDMFONT_H__
+
+#include <qwidget.h>
+
+class KFontRequester;
+class QCheckBox;
+
+class KDMFontWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ KDMFontWidget(QWidget *parent=0, const char *name=0);
+
+ void load();
+ void save();
+ void defaults();
+ void makeReadOnly();
+
+signals:
+ void changed( bool state );
+
+protected slots:
+ void configChanged();
+ void set_def();
+
+private:
+ QCheckBox *aacb;
+ KFontRequester *greetingFontChooser;
+ KFontRequester *failFontChooser;
+ KFontRequester *stdFontChooser;
+};
+
+
+#endif
+
+
diff --git a/kcontrol/kdm/kdm-shut.cpp b/kcontrol/kdm/kdm-shut.cpp
new file mode 100644
index 000000000..c958e1464
--- /dev/null
+++ b/kcontrol/kdm/kdm-shut.cpp
@@ -0,0 +1,227 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997-1998 Thomas Tanghus (tanghus@earthling.net)
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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 Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <unistd.h>
+#include <sys/types.h>
+
+
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <ksimpleconfig.h>
+#include <karrowbutton.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kdialog.h>
+#include <kurlrequester.h>
+
+#include "kdm-shut.h"
+#include "kbackedcombobox.h"
+
+extern KSimpleConfig *config;
+
+
+KDMSessionsWidget::KDMSessionsWidget(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ QString wtstr;
+
+
+ QGroupBox *group0 = new QGroupBox( i18n("Allow Shutdown"), this );
+
+ sdlcombo = new QComboBox( FALSE, group0 );
+ sdllabel = new QLabel (sdlcombo, i18n ("&Local:"), group0);
+ sdlcombo->insertItem(i18n("Everybody"), SdAll);
+ sdlcombo->insertItem(i18n("Only Root"), SdRoot);
+ sdlcombo->insertItem(i18n("Nobody"), SdNone);
+ connect(sdlcombo, SIGNAL(activated(int)), SLOT(changed()));
+ sdrcombo = new QComboBox( FALSE, group0 );
+ sdrlabel = new QLabel (sdrcombo, i18n ("&Remote:"), group0);
+ sdrcombo->insertItem(i18n("Everybody"), SdAll);
+ sdrcombo->insertItem(i18n("Only Root"), SdRoot);
+ sdrcombo->insertItem(i18n("Nobody"), SdNone);
+ connect(sdrcombo, SIGNAL(activated(int)), SLOT(changed()));
+ QWhatsThis::add( group0, i18n("Here you can select who is allowed to shutdown"
+ " the computer using KDM. You can specify different values for local (console) and remote displays. "
+ "Possible values are:<ul>"
+ " <li><em>Everybody:</em> everybody can shutdown the computer using KDM</li>"
+ " <li><em>Only root:</em> KDM will only allow shutdown after the user has entered the root password</li>"
+ " <li><em>Nobody:</em> nobody can shutdown the computer using KDM</li></ul>") );
+
+
+ QGroupBox *group1 = new QGroupBox( i18n("Commands"), this );
+
+ shutdown_lined = new KURLRequester(group1);
+ QLabel *shutdown_label = new QLabel(shutdown_lined, i18n("H&alt:"), group1);
+ connect(shutdown_lined, SIGNAL(textChanged(const QString&)),
+ SLOT(changed()));
+ wtstr = i18n("Command to initiate the system halt. Typical value: /sbin/halt");
+ QWhatsThis::add( shutdown_label, wtstr );
+ QWhatsThis::add( shutdown_lined, wtstr );
+
+ restart_lined = new KURLRequester(group1);
+ QLabel *restart_label = new QLabel(restart_lined, i18n("Reb&oot:"), group1);
+ connect(restart_lined, SIGNAL(textChanged(const QString&)),
+ SLOT(changed()));
+ wtstr = i18n("Command to initiate the system reboot. Typical value: /sbin/reboot");
+ QWhatsThis::add( restart_label, wtstr );
+ QWhatsThis::add( restart_lined, wtstr );
+
+
+ QGroupBox *group4 = new QGroupBox( i18n("Miscellaneous"), this );
+
+ bm_combo = new KBackedComboBox( group4 );
+ bm_combo->insertItem("None", i18n("boot manager", "None"));
+ bm_combo->insertItem("Grub", i18n("Grub"));
+#if defined(__linux__) && ( defined(__i386__) || defined(__amd64__) )
+ bm_combo->insertItem("Lilo", i18n("Lilo"));
+#endif
+ QLabel *bm_label = new QLabel( bm_combo, i18n("Boot manager:"), group4 );
+ connect(bm_combo, SIGNAL(activated(int)), SLOT(changed()));
+ wtstr = i18n("Enable boot options in the \"Shutdown...\" dialog.");
+ QWhatsThis::add( bm_label, wtstr );
+ QWhatsThis::add( bm_combo, wtstr );
+
+ QBoxLayout *main = new QVBoxLayout( this, 10 );
+ QGridLayout *lgroup0 = new QGridLayout( group0, 1, 1, 10);
+ QGridLayout *lgroup1 = new QGridLayout( group1, 1, 1, 10);
+ QGridLayout *lgroup4 = new QGridLayout( group4, 1, 1, 10);
+
+ main->addWidget(group0);
+ main->addWidget(group1);
+ main->addWidget(group4);
+ main->addStretch();
+
+ lgroup0->addRowSpacing(0, group0->fontMetrics().height()/2);
+ lgroup0->addColSpacing(2, KDialog::spacingHint() * 2);
+ lgroup0->setColStretch(1, 1);
+ lgroup0->setColStretch(4, 1);
+ lgroup0->addWidget(sdllabel, 1, 0);
+ lgroup0->addWidget(sdlcombo, 1, 1);
+ lgroup0->addWidget(sdrlabel, 1, 3);
+ lgroup0->addWidget(sdrcombo, 1, 4);
+
+ lgroup1->addRowSpacing(0, group1->fontMetrics().height()/2);
+ lgroup1->addColSpacing(2, KDialog::spacingHint() * 2);
+ lgroup1->setColStretch(1, 1);
+ lgroup1->setColStretch(4, 1);
+ lgroup1->addWidget(shutdown_label, 1, 0);
+ lgroup1->addWidget(shutdown_lined, 1, 1);
+ lgroup1->addWidget(restart_label, 1, 3);
+ lgroup1->addWidget(restart_lined, 1, 4);
+
+ lgroup4->addRowSpacing(0, group4->fontMetrics().height()/2);
+ lgroup4->addWidget(bm_label, 1, 0);
+ lgroup4->addWidget(bm_combo, 1, 1);
+ lgroup4->setColStretch(2, 1);
+
+ main->activate();
+
+}
+
+void KDMSessionsWidget::makeReadOnly()
+{
+ sdlcombo->setEnabled(false);
+ sdrcombo->setEnabled(false);
+
+ restart_lined->lineEdit()->setReadOnly(true);
+ restart_lined->button()->setEnabled(false);
+ shutdown_lined->lineEdit()->setReadOnly(true);
+ shutdown_lined->button()->setEnabled(false);
+
+ bm_combo->setEnabled(false);
+}
+
+void KDMSessionsWidget::writeSD(QComboBox *combo)
+{
+ QString what;
+ switch (combo->currentItem()) {
+ case SdAll: what = "All"; break;
+ case SdRoot: what = "Root"; break;
+ default: what = "None"; break;
+ }
+ config->writeEntry( "AllowShutdown", what);
+}
+
+void KDMSessionsWidget::save()
+{
+ config->setGroup("X-:*-Core");
+ writeSD(sdlcombo);
+
+ config->setGroup("X-*-Core");
+ writeSD(sdrcombo);
+
+ config->setGroup("Shutdown");
+ config->writeEntry("HaltCmd", shutdown_lined->url(), true);
+ config->writeEntry("RebootCmd", restart_lined->url(), true);
+
+ config->writeEntry("BootManager", bm_combo->currentId());
+}
+
+void KDMSessionsWidget::readSD(QComboBox *combo, QString def)
+{
+ QString str = config->readEntry("AllowShutdown", def);
+ SdModes sdMode;
+ if(str == "All")
+ sdMode = SdAll;
+ else if(str == "Root")
+ sdMode = SdRoot;
+ else
+ sdMode = SdNone;
+ combo->setCurrentItem(sdMode);
+}
+
+void KDMSessionsWidget::load()
+{
+ config->setGroup("X-:*-Core");
+ readSD(sdlcombo, "All");
+
+ config->setGroup("X-*-Core");
+ readSD(sdrcombo, "Root");
+
+ config->setGroup("Shutdown");
+ restart_lined->setURL(config->readEntry("RebootCmd", "/sbin/reboot"));
+ shutdown_lined->setURL(config->readEntry("HaltCmd", "/sbin/halt"));
+
+ bm_combo->setCurrentId(config->readEntry("BootManager", "None"));
+}
+
+
+
+void KDMSessionsWidget::defaults()
+{
+ restart_lined->setURL("/sbin/reboot");
+ shutdown_lined->setURL("/sbin/halt");
+
+ sdlcombo->setCurrentItem(SdAll);
+ sdrcombo->setCurrentItem(SdRoot);
+
+ bm_combo->setCurrentId("None");
+}
+
+
+void KDMSessionsWidget::changed()
+{
+ emit changed(true);
+}
+
+#include "kdm-shut.moc"
diff --git a/kcontrol/kdm/kdm-shut.h b/kcontrol/kdm/kdm-shut.h
new file mode 100644
index 000000000..8bad7d5a0
--- /dev/null
+++ b/kcontrol/kdm/kdm-shut.h
@@ -0,0 +1,64 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997 Thomas Tanghus (tanghus@earthling.net)
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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 Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __KDMSESS_H__
+#define __KDMSESS_H__
+
+
+#include <qstring.h>
+
+class QComboBox;
+class QCheckBox;
+class KURLRequester;
+class KBackedComboBox;
+
+class KDMSessionsWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ KDMSessionsWidget(QWidget *parent=0, const char *name=0);
+
+ void load();
+ void save();
+ void defaults();
+ void makeReadOnly();
+
+ enum SdModes { SdAll, SdRoot, SdNone };
+
+signals:
+ void changed( bool state );
+
+protected slots:
+ void changed();
+
+private:
+ void readSD (QComboBox *, QString);
+ void writeSD (QComboBox *);
+
+ QComboBox *sdlcombo, *sdrcombo;
+ QLabel *sdllabel, *sdrlabel;
+ KURLRequester *restart_lined, *shutdown_lined;
+ KBackedComboBox *bm_combo;
+};
+
+
+#endif
+
+
diff --git a/kcontrol/kdm/kdm-users.cpp b/kcontrol/kdm/kdm-users.cpp
new file mode 100644
index 000000000..d8a540bd3
--- /dev/null
+++ b/kcontrol/kdm/kdm-users.cpp
@@ -0,0 +1,500 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997 Thomas Tanghus (tanghus@earthling.net)
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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 Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <qstyle.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qtooltip.h>
+#include <qvalidator.h>
+#include <qwhatsthis.h>
+#include <qvgroupbox.h>
+#include <qpushbutton.h>
+
+#include <kfiledialog.h>
+#include <kimageio.h>
+#include <kimagefilepreview.h>
+#include <kio/netaccess.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kmessagebox.h>
+#include <kurldrag.h>
+
+#include "kdm-users.h"
+
+#include <sys/stat.h>
+
+
+extern KSimpleConfig *config;
+
+KDMUsersWidget::KDMUsersWidget(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+#ifdef __linux__
+ struct stat st;
+ if (!stat( "/etc/debian_version", &st )) { /* debian */
+ defminuid = "1000";
+ defmaxuid = "29999";
+ } else if (!stat( "/usr/portage", &st )) { /* gentoo */
+ defminuid = "1000";
+ defmaxuid = "65000";
+ } else if (!stat( "/etc/mandrake-release", &st )) { /* mandrake - check before redhat! */
+ defminuid = "500";
+ defmaxuid = "65000";
+ } else if (!stat( "/etc/redhat-release", &st )) { /* redhat */
+ defminuid = "100";
+ defmaxuid = "65000";
+ } else /* if (!stat( "/etc/SuSE-release", &st )) */ { /* suse */
+ defminuid = "500";
+ defmaxuid = "65000";
+ }
+#else
+ defminuid = "1000";
+ defmaxuid = "65000";
+#endif
+
+ // We assume that $kde_datadir/kdm exists, but better check for pics/ and pics/users,
+ // and create them if necessary.
+ config->setGroup( "X-*-Greeter" );
+ m_userPixDir = config->readEntry( "FaceDir", KGlobal::dirs()->resourceDirs("data").last() + "kdm/faces" ) + '/';
+ m_notFirst = false;
+ QDir testDir( m_userPixDir );
+ if ( !testDir.exists() && !testDir.mkdir( testDir.absPath() ) && !geteuid() )
+ KMessageBox::sorry( this, i18n("Unable to create folder %1").arg( testDir.absPath() ) );
+ chmod( QFile::encodeName( m_userPixDir ), 0755 );
+
+ m_defaultText = i18n("<default>");
+
+ QString wtstr;
+
+ minGroup = new QGroupBox( 2, Horizontal, i18n("System U&IDs"), this );
+ QWhatsThis::add( minGroup, i18n("Users with a UID (numerical user identification) outside this range will not be listed by KDM and this setup dialog."
+ " Note that users with the UID 0 (typically root) are not affected by this and must be"
+ " explicitly hidden in \"Not hidden\" mode."));
+ QSizePolicy sp_ign_fix( QSizePolicy::Ignored, QSizePolicy::Fixed );
+ QValidator *valid = new QIntValidator( 0, 999999, minGroup );
+ QLabel *minlab = new QLabel( i18n("Below:"), minGroup );
+ leminuid = new KLineEdit( minGroup );
+ minlab->setBuddy( leminuid );
+ leminuid->setSizePolicy( sp_ign_fix );
+ leminuid->setValidator( valid );
+ connect( leminuid, SIGNAL(textChanged( const QString & )), SLOT(slotChanged()) );
+ connect( leminuid, SIGNAL(textChanged( const QString & )), SLOT(slotMinMaxChanged()) );
+ QLabel *maxlab = new QLabel( i18n("Above:"), minGroup );
+ lemaxuid = new KLineEdit( minGroup );
+ maxlab->setBuddy( lemaxuid );
+ lemaxuid->setSizePolicy( sp_ign_fix );
+ lemaxuid->setValidator( valid );
+ connect(lemaxuid, SIGNAL(textChanged( const QString & )), SLOT(slotChanged()) );
+ connect(lemaxuid, SIGNAL(textChanged( const QString & )), SLOT(slotMinMaxChanged()) );
+
+ usrGroup = new QButtonGroup( 5, Qt::Vertical, i18n("Users"), this );
+ connect( usrGroup, SIGNAL(clicked( int )), SLOT(slotShowOpts()) );
+ connect( usrGroup, SIGNAL(clicked( int )), SLOT(slotChanged()) );
+ cbshowlist = new QCheckBox( i18n("Show list"), usrGroup );
+ QWhatsThis::add( cbshowlist, i18n("If this option is checked, KDM will show a list of users,"
+ " so users can click on their name or image rather than typing in their login.") );
+ cbcomplete = new QCheckBox( i18n("Autocompletion"), usrGroup );
+ QWhatsThis::add( cbcomplete, i18n("If this option is checked, KDM will automatically complete"
+ " user names while they are typed in the line edit.") );
+ cbinverted = new QCheckBox( i18n("Inverse selection"), usrGroup );
+ QWhatsThis::add( cbinverted, i18n("This option specifies how the users for \"Show list\" and \"Autocompletion\""
+ " are selected in the \"Select users and groups\" list: "
+ "If not checked, select only the checked users. "
+ "If checked, select all non-system users, except the checked ones."));
+ cbusrsrt = new QCheckBox( i18n("Sor&t users"), usrGroup );
+ connect( cbusrsrt, SIGNAL(toggled( bool )), SLOT(slotChanged()) );
+ QWhatsThis::add( cbusrsrt, i18n("If this is checked, KDM will alphabetically sort the user list."
+ " Otherwise users are listed in the order they appear in the password file.") );
+
+ wstack = new QWidgetStack( this );
+ s_label = new QLabel( wstack, i18n("S&elect users and groups:"), this );
+ optinlv = new KListView( this );
+ optinlv->addColumn( i18n("Selected Users") );
+ optinlv->setResizeMode( QListView::LastColumn );
+ QWhatsThis::add( optinlv, i18n("KDM will show all checked users. Entries denoted with '@' are user groups. Checking a group is like checking all users in that group.") );
+ wstack->addWidget( optinlv );
+ connect( optinlv, SIGNAL(clicked( QListViewItem * )),
+ SLOT(slotUpdateOptIn( QListViewItem * )) );
+ connect( optinlv, SIGNAL(clicked( QListViewItem * )),
+ SLOT(slotChanged()) );
+ optoutlv = new KListView( this );
+ optoutlv->addColumn( i18n("Hidden Users") );
+ optoutlv->setResizeMode( QListView::LastColumn );
+ QWhatsThis::add( optoutlv, i18n("KDM will show all non-checked non-system users. Entries denoted with '@' are user groups. Checking a group is like checking all users in that group.") );
+ wstack->addWidget( optoutlv );
+ connect( optoutlv, SIGNAL(clicked( QListViewItem * )),
+ SLOT(slotUpdateOptOut( QListViewItem * )) );
+ connect( optoutlv, SIGNAL(clicked( QListViewItem * )),
+ SLOT(slotChanged()) );
+
+ faceGroup = new QButtonGroup( 5, Qt::Vertical, i18n("User Image Source"), this );
+ QWhatsThis::add( faceGroup, i18n("Here you can specify where KDM will obtain the images that represent users."
+ " \"Admin\" represents the global folder; these are the pictures you can set below."
+ " \"User\" means that KDM should read the user's $HOME/.face.icon file."
+ " The two selections in the middle define the order of preference if both sources are available.") );
+ connect( faceGroup, SIGNAL(clicked( int )), SLOT(slotFaceOpts()) );
+ connect( faceGroup, SIGNAL(clicked( int )), SLOT(slotChanged()) );
+ rbadmonly = new QRadioButton( i18n("Admin"), faceGroup );
+ rbprefadm = new QRadioButton( i18n("Admin, user"), faceGroup );
+ rbprefusr = new QRadioButton( i18n("User, admin"), faceGroup );
+ rbusronly = new QRadioButton( i18n("User"), faceGroup );
+
+ QGroupBox *picGroup = new QVGroupBox( i18n("User Images"), this );
+ QWidget *hlpw = new QWidget( picGroup );
+ usercombo = new KComboBox( hlpw );
+ QWhatsThis::add( usercombo, i18n("The user the image below belongs to.") );
+ connect( usercombo, SIGNAL(activated( int )),
+ SLOT(slotUserSelected()) );
+ QLabel *userlabel = new QLabel( usercombo, i18n("User:"), hlpw );
+ userbutton = new QPushButton( hlpw );
+ userbutton->setAcceptDrops( true );
+ userbutton->installEventFilter( this ); // for drag and drop
+ uint sz = style().pixelMetric( QStyle::PM_ButtonMargin ) * 2 + 48;
+ userbutton->setFixedSize( sz, sz );
+ connect( userbutton, SIGNAL(clicked()),
+ SLOT(slotUserButtonClicked()) );
+ QToolTip::add( userbutton, i18n("Click or drop an image here") );
+ QWhatsThis::add( userbutton, i18n("Here you can see the image assigned to the user selected in the combo box above. Click on the image button to select from a list"
+ " of images or drag and drop your own image on to the button (e.g. from Konqueror).") );
+ rstuserbutton = new QPushButton( i18n("Unset"), hlpw );
+ QWhatsThis::add( rstuserbutton, i18n("Click this button to make KDM use the default image for the selected user.") );
+ connect( rstuserbutton, SIGNAL(clicked()),
+ SLOT(slotUnsetUserPix()) );
+ QGridLayout *hlpl = new QGridLayout( hlpw, 3, 2, 0, KDialog::spacingHint() );
+ hlpl->addWidget( userlabel, 0, 0 );
+// hlpl->addSpacing( KDialog::spacingHint() );
+ hlpl->addWidget( usercombo, 0, 1 );
+ hlpl->addMultiCellWidget( userbutton, 1,1, 0,1, AlignHCenter );
+ hlpl->addMultiCellWidget( rstuserbutton, 2,2, 0,1, AlignHCenter );
+
+ QHBoxLayout *main = new QHBoxLayout( this, 10 );
+
+ QVBoxLayout *lLayout = new QVBoxLayout( main, 10 );
+ lLayout->addWidget( minGroup );
+ lLayout->addWidget( usrGroup );
+ lLayout->addStretch( 1 );
+
+ QVBoxLayout *mLayout = new QVBoxLayout( main, 10 );
+ mLayout->addWidget( s_label );
+ mLayout->addWidget( wstack );
+ mLayout->setStretchFactor( wstack, 1 );
+ main->setStretchFactor( mLayout, 1 );
+
+ QVBoxLayout *rLayout = new QVBoxLayout( main, 10 );
+ rLayout->addWidget( faceGroup );
+ rLayout->addWidget( picGroup );
+ rLayout->addStretch( 1 );
+
+}
+
+void KDMUsersWidget::makeReadOnly()
+{
+ leminuid->setReadOnly(true);
+ lemaxuid->setReadOnly(true);
+ cbshowlist->setEnabled(false);
+ cbcomplete->setEnabled(false);
+ cbinverted->setEnabled(false);
+ cbusrsrt->setEnabled(false);
+ rbadmonly->setEnabled(false);
+ rbprefadm->setEnabled(false);
+ rbprefusr->setEnabled(false);
+ rbusronly->setEnabled(false);
+ wstack->setEnabled(false);
+ disconnect( userbutton, SIGNAL(clicked()), this, SLOT(slotUserButtonClicked()) );
+ userbutton->setAcceptDrops(false);
+ rstuserbutton->setEnabled(false);
+}
+
+void KDMUsersWidget::slotShowOpts()
+{
+ bool en = cbshowlist->isChecked() || cbcomplete->isChecked();
+ cbinverted->setEnabled( en );
+ cbusrsrt->setEnabled( en );
+ wstack->setEnabled( en );
+ wstack->raiseWidget( cbinverted->isChecked() ? optoutlv : optinlv );
+ en = cbshowlist->isChecked();
+ faceGroup->setEnabled( en );
+ if (!en) {
+ usercombo->setEnabled( false );
+ userbutton->setEnabled( false );
+ rstuserbutton->setEnabled( false );
+ } else
+ slotFaceOpts();
+}
+
+void KDMUsersWidget::slotFaceOpts()
+{
+ bool en = !rbusronly->isChecked();
+ usercombo->setEnabled( en );
+ userbutton->setEnabled( en );
+ if (en)
+ slotUserSelected();
+ else
+ rstuserbutton->setEnabled( false );
+}
+
+void KDMUsersWidget::slotUserSelected()
+{
+ QString user = usercombo->currentText();
+ QImage p;
+ if (user != m_defaultText &&
+ p.load( m_userPixDir + user + ".face.icon" )) {
+ rstuserbutton->setEnabled( !getuid() );
+ } else {
+ p.load( m_userPixDir + ".default.face.icon" );
+ rstuserbutton->setEnabled( false );
+ }
+ userbutton->setPixmap( p.smoothScale( 48, 48, QImage::ScaleMin ) );
+}
+
+
+void KDMUsersWidget::changeUserPix(const QString &pix)
+{
+ QString user( usercombo->currentText() );
+ if (user == m_defaultText)
+ {
+ user = ".default";
+ if (KMessageBox::questionYesNo(this, i18n("Save image as default image?"),QString::null,KStdGuiItem::save(),KStdGuiItem::cancel())
+ != KMessageBox::Yes)
+ return;
+ }
+
+ QImage p( pix );
+ if (p.isNull()) {
+ KMessageBox::sorry( this,
+ i18n("There was an error loading the image\n"
+ "%1").arg( pix ) );
+ return;
+ }
+
+ p = p.smoothScale( 48, 48, QImage::ScaleMin );
+ QString userpix = m_userPixDir + user + ".face.icon";
+ if (!p.save( userpix, "PNG" ))
+ KMessageBox::sorry(this,
+ i18n("There was an error saving the image:\n%1")
+ .arg( userpix ) );
+ else
+ chmod( QFile::encodeName( userpix ), 0644 );
+
+ slotUserSelected();
+}
+
+void KDMUsersWidget::slotUserButtonClicked()
+{
+ KFileDialog dlg(m_notFirst ? QString::null :
+ KGlobal::dirs()->resourceDirs("data").last() + "kdm/pics/users",
+ KImageIO::pattern( KImageIO::Reading ),
+ this, 0, true);
+ dlg.setOperationMode( KFileDialog::Opening );
+ dlg.setCaption( i18n("Choose Image") );
+ dlg.setMode( KFile::File | KFile::LocalOnly );
+
+ KImageFilePreview *ip = new KImageFilePreview( &dlg );
+ dlg.setPreviewWidget( ip );
+ if (dlg.exec() != QDialog::Accepted)
+ return;
+ m_notFirst = true;
+
+ changeUserPix( dlg.selectedFile() );
+}
+
+void KDMUsersWidget::slotUnsetUserPix()
+{
+ QFile::remove( m_userPixDir + usercombo->currentText() + ".face.icon" );
+ slotUserSelected();
+}
+
+bool KDMUsersWidget::eventFilter(QObject *, QEvent *e)
+{
+ if (e->type() == QEvent::DragEnter) {
+ QDragEnterEvent *ee = (QDragEnterEvent *) e;
+ ee->accept( KURLDrag::canDecode(ee) );
+ return true;
+ }
+
+ if (e->type() == QEvent::Drop) {
+ userButtonDropEvent((QDropEvent *) e);
+ return true;
+ }
+
+ return false;
+}
+
+KURL *decodeImgDrop(QDropEvent *e, QWidget *wdg);
+
+void KDMUsersWidget::userButtonDropEvent(QDropEvent *e)
+{
+ KURL *url = decodeImgDrop(e, this);
+ if (url) {
+ QString pixpath;
+ KIO::NetAccess::download(*url, pixpath, parentWidget());
+ changeUserPix( pixpath );
+ KIO::NetAccess::removeTempFile(pixpath);
+ delete url;
+ }
+}
+
+void KDMUsersWidget::save()
+{
+ config->setGroup( "X-*-Greeter" );
+
+ config->writeEntry( "MinShowUID", leminuid->text() );
+ config->writeEntry( "MaxShowUID", lemaxuid->text() );
+
+ config->writeEntry( "UserList", cbshowlist->isChecked() );
+ config->writeEntry( "UserCompletion", cbcomplete->isChecked() );
+ config->writeEntry( "ShowUsers",
+ cbinverted->isChecked() ? "NotHidden" : "Selected" );
+ config->writeEntry( "SortUsers", cbusrsrt->isChecked() );
+
+ config->writeEntry( "HiddenUsers", hiddenUsers );
+ config->writeEntry( "SelectedUsers", selectedUsers );
+
+ config->writeEntry( "FaceSource",
+ rbadmonly->isChecked() ? "AdminOnly" :
+ rbprefadm->isChecked() ? "PreferAdmin" :
+ rbprefusr->isChecked() ? "PreferUser" : "UserOnly" );
+}
+
+
+void KDMUsersWidget::updateOptList( QListViewItem *item, QStringList &list )
+{
+ if ( !item )
+ return;
+ QCheckListItem *itm = (QCheckListItem *)item;
+ QStringList::iterator it = list.find( itm->text() );
+ if (itm->isOn()) {
+ if (it == list.end())
+ list.append( itm->text() );
+ } else {
+ if (it != list.end())
+ list.remove( it );
+ }
+}
+
+void KDMUsersWidget::slotUpdateOptIn( QListViewItem *item )
+{
+ updateOptList( item, selectedUsers );
+}
+
+void KDMUsersWidget::slotUpdateOptOut( QListViewItem *item )
+{
+ updateOptList( item, hiddenUsers );
+}
+
+void KDMUsersWidget::slotClearUsers()
+{
+ optinlv->clear();
+ optoutlv->clear();
+ usercombo->clear();
+ usercombo->insertItem( m_defaultText );
+}
+
+void KDMUsersWidget::slotAddUsers(const QMap<QString,int> &users)
+{
+ QMapConstIterator<QString,int> it;
+ for (it = users.begin(); it != users.end(); ++it) {
+ const QString *name = &it.key();
+ (new QCheckListItem(optinlv, *name, QCheckListItem::CheckBox))->
+ setOn(selectedUsers.find(*name) != selectedUsers.end());
+ (new QCheckListItem(optoutlv, *name, QCheckListItem::CheckBox))->
+ setOn(hiddenUsers.find(*name) != hiddenUsers.end());
+ if ((*name)[0] != '@')
+ usercombo->insertItem(*name);
+ }
+ optinlv->sort();
+ optoutlv->sort();
+ if (usercombo->listBox())
+ usercombo->listBox()->sort();
+}
+
+void KDMUsersWidget::slotDelUsers(const QMap<QString,int> &users)
+{
+ QMapConstIterator<QString,int> it;
+ for (it = users.begin(); it != users.end(); ++it) {
+ const QString *name = &it.key();
+ if (usercombo->listBox())
+ delete usercombo->listBox()->findItem( *name, ExactMatch | CaseSensitive );
+ delete optinlv->findItem( *name, 0 );
+ delete optoutlv->findItem( *name, 0 );
+ }
+}
+
+void KDMUsersWidget::load()
+{
+ QString str;
+
+ config->setGroup("X-*-Greeter");
+
+ selectedUsers = config->readListEntry( "SelectedUsers");
+ hiddenUsers = config->readListEntry( "HiddenUsers");
+
+ leminuid->setText(config->readEntry("MinShowUID", defminuid));
+ lemaxuid->setText(config->readEntry("MaxShowUID", defmaxuid));
+
+ cbshowlist->setChecked( config->readBoolEntry( "UserList", true ) );
+ cbcomplete->setChecked( config->readBoolEntry( "UserCompletion", false ) );
+ cbinverted->setChecked( config->readEntry( "ShowUsers" ) != "Selected" );
+ cbusrsrt->setChecked(config->readBoolEntry("SortUsers", true));
+
+ QString ps = config->readEntry( "FaceSource" );
+ if (ps == QString::fromLatin1("UserOnly"))
+ rbusronly->setChecked(true);
+ else if (ps == QString::fromLatin1("PreferUser"))
+ rbprefusr->setChecked(true);
+ else if (ps == QString::fromLatin1("PreferAdmin"))
+ rbprefadm->setChecked(true);
+ else
+ rbadmonly->setChecked(true);
+
+ slotUserSelected();
+
+ slotShowOpts();
+ slotFaceOpts();
+}
+
+void KDMUsersWidget::defaults()
+{
+ leminuid->setText( defminuid );
+ lemaxuid->setText( defmaxuid );
+ cbshowlist->setChecked( true );
+ cbcomplete->setChecked( false );
+ cbinverted->setChecked( true );
+ cbusrsrt->setChecked( true );
+ rbadmonly->setChecked( true );
+ hiddenUsers.clear();
+ selectedUsers.clear();
+ slotShowOpts();
+ slotFaceOpts();
+}
+
+void KDMUsersWidget::slotMinMaxChanged()
+{
+ emit setMinMaxUID( leminuid->text().toInt(), lemaxuid->text().toInt() );
+}
+
+void KDMUsersWidget::slotChanged()
+{
+ emit changed(true);
+}
+
+#include "kdm-users.moc"
diff --git a/kcontrol/kdm/kdm-users.h b/kcontrol/kdm/kdm-users.h
new file mode 100644
index 000000000..b54d96ff8
--- /dev/null
+++ b/kcontrol/kdm/kdm-users.h
@@ -0,0 +1,106 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997 Thomas Tanghus (tanghus@earthling.net)
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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 Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __KDMUSERS_H__
+#define __KDMUSERS_H__
+
+#include <qwidget.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qimage.h>
+#include <qbuttongroup.h>
+#include <qradiobutton.h>
+#include <qcheckbox.h>
+#include <qwidgetstack.h>
+
+#include <klineedit.h>
+#include <klistview.h>
+#include <kcombobox.h>
+#include <kurl.h>
+
+#include <pwd.h>
+
+
+class KDMUsersWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ KDMUsersWidget( QWidget *parent = 0, const char *name = 0 );
+
+ void load();
+ void save();
+ void defaults();
+ void makeReadOnly();
+
+ bool eventFilter( QObject *o, QEvent *e );
+
+public slots:
+ void slotClearUsers();
+ void slotAddUsers( const QMap<QString,int> & );
+ void slotDelUsers( const QMap<QString,int> & );
+
+signals:
+ void changed( bool state );
+ void setMinMaxUID( int, int );
+
+private slots:
+ void slotMinMaxChanged();
+ void slotShowOpts();
+ void slotUpdateOptIn( QListViewItem *item );
+ void slotUpdateOptOut( QListViewItem *item );
+ void slotUserSelected();
+ void slotUnsetUserPix();
+ void slotFaceOpts();
+ void slotUserButtonClicked();
+ void slotChanged();
+
+private:
+ void updateOptList( QListViewItem *item, QStringList &list );
+ void userButtonDropEvent( QDropEvent *e );
+ void changeUserPix( const QString & );
+
+ QGroupBox *minGroup; // top left
+ QLineEdit *leminuid, *lemaxuid;
+
+ QButtonGroup *usrGroup; // right below
+ QCheckBox *cbshowlist, *cbcomplete, *cbinverted, *cbusrsrt;
+
+ QLabel *s_label; // middle
+ QWidgetStack *wstack;
+ KListView *optoutlv, *optinlv;
+
+ QButtonGroup *faceGroup; // right
+ QRadioButton *rbadmonly, *rbprefadm, *rbprefusr, *rbusronly;
+
+ KComboBox *usercombo; // right below
+ QPushButton *userbutton;
+ QPushButton *rstuserbutton;
+
+ QString m_userPixDir;
+ QString m_defaultText;
+ QStringList hiddenUsers, selectedUsers;
+ QString defminuid, defmaxuid;
+
+ bool m_notFirst;
+};
+
+#endif
+
+
diff --git a/kcontrol/kdm/kdm.desktop b/kcontrol/kdm/kdm.desktop
new file mode 100644
index 000000000..c3f85d4b7
--- /dev/null
+++ b/kcontrol/kdm/kdm.desktop
@@ -0,0 +1,243 @@
+[Desktop Entry]
+Exec=kcmshell kdm
+Icon=kdmconfig
+Type=Application
+DocPath=kdm/index.html#configuring-kdm
+
+X-KDE-SubstituteUID=true
+
+X-KDE-Library=kdm
+X-KDE-RootOnly=true
+
+X-KDE-ParentApp=kcontrol
+
+Name=Login Manager
+Name[af]=Aanteken Bestuurder
+Name[ar]=مسيير تسجيل الدخول
+Name[az]=İclas Açma İdarəcisi
+Name[be]=Кіраўнік уваходу
+Name[bg]=Вход в системата
+Name[bn]=লগ-ইন ম্যানেজার
+Name[br]=Merour ereañ
+Name[bs]=Login menadžer
+Name[ca]=Gestor d'accés
+Name[cs]=Správce přihlášení
+Name[csb]=Menedżer logòwaniô
+Name[cy]=Rheolydd Mewngofnodi
+Name[da]=Login-håndtering
+Name[de]=Anmeldungsmanager
+Name[el]=Διαχειριστής σύνδεσης
+Name[eo]=Salutilo
+Name[es]=Gestor de acceso
+Name[et]=Sisselogimise haldur
+Name[eu]=Saio-hasieraren kudeatzailea
+Name[fa]=مدیر ورود
+Name[fi]=Sisäänkirjautumisasetukset
+Name[fr]=Gestionnaire de connexion
+Name[fy]=Oanmeldskerm
+Name[ga]=Bainisteoir Logála Isteach
+Name[gl]=Xestor de Login
+Name[he]=מנהל הכניסה למערכת
+Name[hi]=लॉगइन प्रबंधक
+Name[hr]=Upravljanje prijavljivanjem
+Name[hu]=Bejelentkező felület (KDM)
+Name[id]=Manajer Login
+Name[is]=Innstimplunarstjóri
+Name[it]=Gestione degli accessi
+Name[ja]=ログインマネージャ
+Name[ka]=შესვლის მენეჯერი
+Name[kk]=Жүйеге кіруді басқару
+Name[km]=កម្មវិធី​គ្រប់គ្រង​ការ​ចូល
+Name[ko]=로그인 관리자
+Name[lo]=ຈັດການລັອກອິນ
+Name[lt]=Registravimosi tvarkyklė
+Name[lv]=Pieteikšanās Menedžeris
+Name[mk]=Менаџер на најави
+Name[mn]=Нэвтрэлт удирдагч
+Name[ms]=Pengurus Login
+Name[mt]=Manager tal-Login
+Name[nb]=Innloggingsbehandler
+Name[nds]=Anmellen-Schirm
+Name[ne]=लगइन प्रबन्धक
+Name[nl]=Aanmeldscherm
+Name[nn]=Innloggingshandsamar
+Name[nso]=Molaodi wa Tseno
+Name[oc]=Gestionari de connexion
+Name[pa]=ਲਾਗ ਮੈਨੇਜਰ
+Name[pl]=Menedżer logowania
+Name[pt]=Gestor de Autenticação
+Name[pt_BR]=Gerenciador de Login
+Name[ro]=Managerul de logare
+Name[ru]=Менеджер входа в систему
+Name[rw]=Mugenga w'Ifashayinjira
+Name[se]=Sisačálihangieđahalli
+Name[sk]=Správca prihlásenia
+Name[sl]=Upravitelj prijav
+Name[sr]=Менаџер пријављивања
+Name[sr@Latn]=Menadžer prijavljivanja
+Name[sv]=Inloggningshanterare
+Name[ta]=நுழைவு மேலாளர்
+Name[te]=లాగిన్ అభికర్త
+Name[tg]=Мудири вуруд
+Name[th]=ตัวจัดการการล็อกอิน
+Name[tr]=Giriş Yöneticisi
+Name[tt]=Kerü İdäçese
+Name[uk]=Менеджер реєстрації
+Name[uz]=Kirish boshqaruvchisi
+Name[uz@cyrillic]=Кириш бошқарувчиси
+Name[ven]=Mulanguli wa u loga
+Name[vi]=Trình quản lí Đăng nhập
+Name[wa]=Manaedjeu d' elodjaedje
+Name[xh]=Umphathi Wegama elithile
+Name[zh_CN]=登录管理器
+Name[zh_TW]=登錄管理程式
+Name[zu]=Imenenja yokungena ngaphakathi
+
+Comment=Configure the login manager (KDM)
+Comment[af]=Konfigureer die aanteken bestuurder (Kdm)
+Comment[ar]=إعداد مسيير الدخول (KDM)
+Comment[az]=Giriş İdarəçisi (KDM) Qurğuları
+Comment[be]=Настаўленні кіраўніка ўваходу (KDM)
+Comment[bg]=Настройване на графичната системата за вход
+Comment[bn]=লগ-ইন ম্যানেজার কনফিগার করুন
+Comment[br]=Kefluniañ ar merour ereañ (KDM)
+Comment[bs]=Podesite menadžer prijavom (KDM)
+Comment[ca]=Configura el gestor d'accés (KDM)
+Comment[cs]=Nastavení správce přihlášení (KDM)
+Comment[csb]=Kònfigùracëjô menedżera logòwaniô (KDM)
+Comment[cy]=Ffurfweddu y rheolydd mewngofnodi (KDM)
+Comment[da]=Indstil indlogningshåndtering (KDM)
+Comment[de]=Anmeldungsmanager KDM einrichten
+Comment[el]=Ρυθμίστε το διαχειριστή σύνδεσης (KDM)
+Comment[eo]=Agordu la salutadminstrilon (KDM)
+Comment[es]=Configura el gestor de acceso (KDM)
+Comment[et]=Sisselogimise halduri seadistamine (KDM)
+Comment[eu]=Konfiguratu saio-hasieraren kudeatzailea (KDM)
+Comment[fa]=پیکربندی مدیر ورود (KDM)
+Comment[fi]=Sisäänkirjautumisasetukset
+Comment[fr]=Configuration du gestionnaire de connexion (KDM)
+Comment[fy]=Hjir kinne jo it oanmeldskerm ynstelle (KDM)
+Comment[ga]=Cumraigh an bainisteoir logála isteach (KDM)
+Comment[gl]=Configurar o xestor de início (KDM)
+Comment[he]=שינוי הגדרות מנהל הכניסה למערכת (KDM)
+Comment[hi]=लॉगइन प्रबंधक कॉन्फ़िगर करें (केडीएम)
+Comment[hr]=Konfiguriranje upravljanja prijavljivanja (KDM)
+Comment[hu]=A KDE grafikus bejelentkező felületének beállításai
+Comment[is]=Stilla innstimplunarstjórann (KDM)
+Comment[it]=Configurazione della gestione degli accessi (KDM)
+Comment[ja]=ログインマネージャ (KDM) の設定
+Comment[ka]=შევლის მენეჯერის კონფიგურირება (KDM)
+Comment[kk]=Жүйеге кіруді басқаруын (KDM) баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​កម្មវិធី​គ្រប់គ្រង​ការ​ចូល (KDM)
+Comment[ko]=로그인 관리자 KDM 설정
+Comment[lo]=ປັບແຕ່ງປລັກອິນແລະການເຊື່ອມ ຕໍ່ສຳລັບລະບົບ KDB
+Comment[lt]=Konfigūruoti registravimos tvarkyklę (KDM)
+Comment[lv]=Konfigure pieteiksanās menedžeri KDM
+Comment[mk]=Конфигурирајте го менаџерот на најави (KDM)
+Comment[mn]=Нэвтрэлт удирдагч KDM тохируулах
+Comment[ms]=Konfigur pengurus login (KDM)
+Comment[mt]=Ikkonfigura l-manager tal-logins (KDM)
+Comment[nb]=Tilpass innlogin­gsbehandler (KDM)
+Comment[nds]=Den Anmellen-Schirm instellen (KDM)
+Comment[ne]=लगइन प्रबन्धक (KDM) कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u het aanmeldscherm (KDM) instellen
+Comment[nn]=Set opp innloggingshandsamaren (KDM)
+Comment[nso]=Beakanya molaodoi wa tseno (KDM)
+Comment[pa]=ਲਾਗਆਨ ਮੈਨੇਜਰ ਸੰਰਚਨਾ(KDM)
+Comment[pl]=Konfiguracja menedżera logowania (KDM)
+Comment[pt]=Configuração do gestor de autenticação (KDM)
+Comment[pt_BR]=Configura o gerenciador de login (KDM)
+Comment[ro]=Configurează managerul de logare grafică (KDM)
+Comment[ru]=Настройка менеджера входа в систему (KDM)
+Comment[rw]=Kuboneza mugenga w'ifashayinjira (KDM)
+Comment[se]=Heivet sisačálihangieđahalli (KDM)
+Comment[sk]=Nastavenie správcu prihlásenia (KDM)
+Comment[sl]=Nastavitve upravitelja prijav (KDM)
+Comment[sr]=Подешавање менаџера за пријављивање (KDM)
+Comment[sr@Latn]=Podešavanje menadžera za prijavljivanje (KDM)
+Comment[sv]=Anpassa inloggningshanteraren (KDM)
+Comment[ta]=புகுபதிகை மேலாளரை அமை (KDM)
+Comment[tg]=Танзими мудири вуруд (KDM)
+Comment[th]=ปรับแต่งเครื่องมือจัดการการล็อกอิน (KDM)
+Comment[tr]=Giriş yöneticisini yapılandır (KDM)
+Comment[tt]=Kerü idäräçen caylaw urını (KDM)
+Comment[uk]=Налаштування менеджера реєстрації (KDM)
+Comment[uz]=Tizimga kirish boshqaruvchisini (KDM) moslash
+Comment[uz@cyrillic]=Тизимга кириш бошқарувчисини (KDM) мослаш
+Comment[ven]=Ni nga dzudzanya mulanguli wau loga (KDM)
+Comment[vi]=Cấu hình trình đăng nhập (KDM)
+Comment[wa]=Apontyî l' manaedjeu d' elodjaedje (KDM)
+Comment[xh]=Qwalasela umphathi wegama elithile (KDM)
+Comment[zh_CN]=配置登录管理器(KDM)
+Comment[zh_TW]=設定登入管理程式 (KDM)
+Comment[zu]=Hlanganisela imenenja yokungena ngaphakathi (KDM)
+
+Keywords=kdm,display manager,xdm,users,login,greeting,Logo,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart
+Keywords[ar]=kdm,display manager,xdm,users,login,greeting,Logo,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart,مدير العرض,المستخدمون مستخدمون,المستخدمين,مستخدمين,دخول,الدخول,تحية,التحية,اللغة,المظهر, البلد,الخطوط,الخط,خطوط,خط,خلفية,ورق حائط,جلسات,اغلاق,اعادة تشغيل
+Keywords[az]=kdm,görünüş idarəçi,xdm,istifadəçilər,iclas açma,qarşılama,loqo,tərzlər,dil,ölkə,yazı növləri,arxa plan,divar kağızları,iclaslar,qapat,təkrar başlat
+Keywords[be]=кіраўнік дысплея,кіраўнік уваходу,карыстальнікі,уваход,запрашэнне,лагатып,стылі,стыль,мова,краіна,шрыфты,фон,шпалеры,сесіі,сесія,выключэнне,перазагрузка,kdm,display manager,xdm,users,login,greeting,Logo,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart
+Keywords[bg]=графична, система, вход, влизане, включване, потребител, kdm, display manager, xdm, users, login, greeting, Logo, styles, language, country, fonts, background, wallpapers, sessions, shutdown, restart
+Keywords[ca]=kdm,administrador de la pantalla,xdm,usuaris,accés,salutació,Logo,estils,llengua,país,lletres,fons,tapissos,sessions,apagar,reiniciar
+Keywords[cs]=kdm,Správce obrazovky,xdm,Uživatelé,Přihlášení,Uvítání,Logo,Styly,Jazyk,Země,Písma,pozadí,Tapety,Relace,Sezení,Vypnutí,Restart
+Keywords[csb]=kdm,menedżer ekranu,xdm,brëkòwnicë,logòwanié,przëwitanié,Logò,sztéle,jãzëk,kraj,fòntë,spódk,tapetë,spòdlë,sesëje,zamkniãce systemë,resztart,zôczãce robòtë
+Keywords[cy]=kdm,rheolydd y dangosydd,xdm,defnyddwyr,mewngofnodi,cyfarchiad,Logo,arddulliau,iaith,gwlad,ffontiau,cefndir,papurau wal,sesiynau,cau,ailgychwyn
+Keywords[da]=kdm,skærmhåndtering,xdm,brugere,login,hilsen,Logo,stil, sprog,land,skrifttyper,baggrund,tapeter,sessioner,luk ned,genstart
+Keywords[de]=Kdm,Display Manager,Xdm,Benutzer,Login,Logo,Stile,Sprachen,Länder,Schriften,Hintergründe,Hintergrundbilder,Beenden,Neustart
+Keywords[el]=kdm,διαχειριστής οθόνης,xdm,χρήστες,σύνδεση,χαιρετισμός,Λογότυπο,στυλ,γλώσσα,χώρα,γραμματοσειρές,φόντο,ταπετσαρίες,συνεδρίες,τερματισμός,επανεκκίνηση
+Keywords[eo]=kdm,ekrano,,xdm,uzantoj,saluto,emblemo,stilo,lingvo,lando,tiparo,fono,tapeto,seanco,adaiaŭo,relanĉo
+Keywords[es]=kdm,gestor de pantalla,xdm,usuarios,entrada,acceso,saludo,Logo,estilos,idioma,país,tipos de letra,fondo,tapices,sesiones,apagar,reiniciar
+Keywords[et]=kdm,ekraanihaldur,xdm,kasutajad,sisselogimine,tervitus,logo,stiil,keel,riik,fondid,taust,taustapilt,seansid,töö lõpetamine,taaskäivitamine
+Keywords[eu]=kdm,pantaila kudeatzailea,xdm,erabiltzaileak,Saio hasiera,agurra,Logoa,estiloak,hizkuntza, herrialdea,letra-tipoak,atzeko planoa,horma-irudiak,saioak,itzali,berrabiarazi
+Keywords[fa]=kdm، مدیر نمایش، xdm، کاربران، ورود، تبریک، آرمِ، سبک، زبان، کشور، قلمها، زمینه، کاغذهای دیواری، نشستها، تعطیل، بازآغازی
+Keywords[fi]=kdm,näytönhallinta ,xdm,käyttäjät,sisäänkirjautuminen,tervehdys,Logo,tyylit,kieli,maa,kirjasimet,tausta,istunnot,sammutus,uudelleenkäynnistys
+Keywords[fr]=kdm,gestionnaire d'affichage,xdm,utilisateurs,login,connexion,bienvenue,message de bienvenue,Logo,styles,langue,pays,style,police,fond d'écran,papier peint,session,arrêt,logout,redémarrage,reboot
+Keywords[fy]=kdm,display manager,xdm,users,login,begroeting,oanmelde,brûkers,Oanmeldbehearder,logo,stylen,taal,language,country,lân,fonts,lettertypen,eftergrûn,wallpapers,behang,sesjes,shutdown,restart,ôfslute,opnij begjinne,oanmelde
+Keywords[ga]=kdm,bainisteoir scáileáin,xdm,úsáideoirí,logáil isteach,fáilte,Lógó,stíleanna,teanga,tír,clónna,clófhoirne,cúlra,cúlbhrait,seisiúin,múchadh,atosú
+Keywords[gl]=kdm,xestor de entrada,xdm,usuarios,identificación,Logo,estilos,lingua,país,fontes,fondo,papeis tapiz,sesións,apagado,reinício
+Keywords[he]=משתמשים,כניסה למערכת,כניסה,לוגו,סגנונות,שפה,מדינה,גופנים,רקע,טפטים,הפעלות,כיבוי,הפעלה,מחדש,מנהל,תצוגה,display,manager,xdm,users,login,greeting,Logo,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart
+Keywords[hi]=केडीएम,प्रकटन प्रबंधक,एक्स-डीएम,उपयोक्ता,लॉगइन,शुभकामनाएँ,लोगो,पृष्ठभूमि,वालपेपर्स,सत्र,बन्द, फिर से चालू
+Keywords[hr]=kdm,display manager,xdm,users,login,greeting,Logo,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart,upravljanje zaslona,korisnici,prijava,pozdrav,stilovi,jezik,država,zemlja,fontovi,pozadina,pozadina radne površine,sesije,gašenje,ponovno pokretanje
+Keywords[hu]=kdm,képernyőkezelő,xdm,felhasználók,bejelentkezés,üdvözlés,embléma,stílusok,nyelv,ország,betűtípusok,háttér,tapéták,munkafolyamatok,leállítás,újraindítás
+Keywords[is]=kdm,skjár,gluggastjóri,innskráning,innstimplun,snið,tungumál,land,letur,bakgrunnur,bakgrunnar,veggfóður,setur,slökkva,endurræsa
+Keywords[it]=kdm,display manager,gestione degli utenti,xdm,utenti,login,accesso,benvenuto,logo,stile,lingua,stato,paese,tipi di carattere,sfondo,immagine di sfondo,sessioni,riavvio,spegnimento,gestione degli accessi
+Keywords[ja]=kdm,ディスプレイマネージャ,xdm,ユーザ,ログイン,あいさつ,ロゴ,スタイル,言語,国,フォント,背景,壁紙,セッション,シャットダウン,再起動
+Keywords[km]=kdm,កម្មវិធី​គ្រប់គ្រង​ការ​បង្ហាញ,xdm,អ្នក​ប្រើ,ចូល,ស្វាគមន៍,រូបសញ្ញា,រចនាប័ទ្ម,ភាសា,ប្រទេស,ពុម្ពអក្សរ,ផ្ទៃ​ខាង​ក្រោយ,ក្រដាស​បិទ​ជញ្ជាំង,សម័យ,បិទ,ចាប់ផ្ដើម​ឡើង​វិញ
+Keywords[lt]=kdm,display manager,ekrano tvarkyklė,xdm,users,naudotojai,login,registracija,greeting,pasveikinimas,Logo, styles,stiliai,language,country,fonts,background,wallpapers,sessions, shutdown,restart
+Keywords[lv]=kdm,displeja menedžeris,xdm,lietotāji,pieteikšanās,apsveikums,Logo,stili,valoda,valsts,fonti,fons,tapetes,sesijas,nošaut,pārstartēt
+Keywords[mk]=kdm,display manager,xdm,users,login,greeting,Logo,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart,менаџер на екран,корисници,најава,поздрав,Лого,стилови,јазик,земја,фонтови,подлога,позадина,сесии,исклучување,рестартирање
+Keywords[mn]=Kdm,Display Manager,Xdm,Хэрэглэгч,Login,Logo,Хэлбэр,Хэл,Улс,Бичиг,Дэвсгэр,Дэвсгэр зураг,Дуусгах,Шинээр эхлүүлэх
+Keywords[mt]=kdm,display manager,xdm,users,login,greeting,Logo,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart,merħba,lingwa,pajjiż,sfond,itfi,irristartja
+Keywords[nb]=kdm,skjermbehandler,xdm,brukere,innlogging,velkomst,logo,stiler,språk,land,skrifttyper,bakgrunn,bakgrunnsbilde,økter,skru av,slå av,omstart
+Keywords[nds]=kdm,Startschirm,xdm,Bruker,anmellen,greeting,Logo,Stilen,Spraak,Land,Schriftoorden,Achtergrund,Tapeten,Törns,Utmaken,Nieg starten
+Keywords[ne]=kdm, प्रदर्शन प्रबन्धक, xdm, प्रयोगकर्ताहरू, लगइन, अभिवादन, परिचायक चिन्ह, शैलीहरू, भाषा, देश, फन्टहरू, पृष्ठभूमि,वालपेपरहरू, सत्र, बन्द गर्नुहोस्, फेरि सुरु गर्नुहोस्
+Keywords[nl]=kdm,display manager,xdm,users,login,begroeting,inloggen,gebruikers,loginbeheerder,logo,stijlen,taal,language,country,land,fonts,lettertypen,achtergrond,wallpapers,behang,sessies,shutdown,restart,afsluiten,herstarten,aanmelden,opstarten
+Keywords[nn]=kdm,xdm,brukarar,innlogging,helsing,logo,stil,språk,land,skrifttypar,bakgrunn,bakgrunnsbilete,økt,avslutt,slå av,omstart
+Keywords[nso]=kdm,molaodi wa pontsho,xdm,badirisi,tseno,madume,Logo,mekgwa,leleme,naga,difonto,bokamorago,di-wallpaper,ditiragalo,timo,thomaleswa
+Keywords[pa]=kdm,display manager,xdm,users,login,greeting,Logo,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart, ਲੋਗੋ, ਭਾਸ਼ਾ, ਦੇਸ਼, ਫੋਂਟ, ਲਾਗਿੰਨ, ਉਪਭੋਗੀ,ਸ਼ੈਸ਼ਨ
+Keywords[pl]=kdm,menedżer ekranu,xdm,użytkownicy,logowanie,powitanie,Logo,style,jezyk,kraj,czcionki,tło,tapety,sesje,zamknięcie systemu,restart,rozpoczęcie pracy
+Keywords[pt]=kdm,gestor de 'logins',xdm,utilizadores,saudação,logótipo,estilos,língua,país,tipos de letra,fundo,papéis de parede,sessões,terminar,reiniciar
+Keywords[pt_BR]=kdm,gerenciador de tela, xdm,usuários,login,saudação,Logo,estilos,linguagem,país,fontes, papéis de parede,sessões,desligar,reiniciar
+Keywords[ro]=kdm,manager de ecran,xdm,utilizatori,logare,întîmpinare,logo,stiluri,limbaj,țară,fonturi,fundal,imagini de fundal,sesiuni,oprire,restartare
+Keywords[ru]=kdm,display manager,xdm,users,login,greeting,Logo,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart,перезагрузка,сеанс,шрифты,страна,фон,стили,обои
+Keywords[rw]=kdm,kwerekana umuyobozi,xdm,abakoresha,ifashayinjira,gusuhuza,ikirango,imisusire,ururimi,igihugu,imyandikire,mbuganyuma,impapurorukuta,imikoro,kuzimya,kongera gutangiza
+Keywords[se]=kdm,xdm,geavaheaddjit,sisačáliheapmi,dearvvuođat,logo,stiila,giella,riika, fonttat,duogáš,duogášgovva,bargovuorut,heaittihit,časkit eret,ođđasit álggahit
+Keywords[sk]=kdm,správca obrazovky,Login manažér,správca prihlásenia,xdm,používatelia,prihlásenie,login,privítanie,logo,štýly,jazyk,krajina,pozadie,tapety,sedenia,vypnutie,reset,reštart
+Keywords[sl]=kdm,upravitelj zaslona,upravljalnik,xdm,uporabniki,prijava,login,pozdrav,logo,slogi,jezik,država,pisave,ozadje,tapete,seje,ugasnitev,vnovičen zagon
+Keywords[sr]=kdm,display manager,xdm,users,login,greeting,Лого,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart,менаџер,пријављивање,стил,језик,земља,фонтови,позадина,сесије,гашење
+Keywords[sr@Latn]=kdm,display manager,xdm,users,login,greeting,Logo,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart,menadžer,prijavljivanje,stil,jezik,zemlja,fontovi,pozadina,sesije,gašenje
+Keywords[sv]=kdm,display manager,xdm,användare,inloggning,välkomsttext,Logo,stilar,språk,land,teckensnitt,bakgrund,skrivbordsunderlägg,sessioner,stäng av,starta om
+Keywords[ta]=கேடிஎம்,காட்சி மேலாளர்,xdm,பயன்படுத்துபவர்,உள்நுழை,வாழ்த்து,சின்னம்,பாணிகள்,மொழி,நாடு,எழுத்துருக்கள்,பின்னணி,வால்பேப்பர்கள்,பகுதிகள்,முடித்தல்,தொடங்குதல்
+Keywords[th]=kdm,ตัวจัดการจอแสดงผล,xdm,ผู้ใช้,ล็อกอิน, ทักทาย,โลโก้,รูปแบบ,ภาษา,ประเทศ,แบบอักษร,พื้นหลัง, วอลล์เปเปอร์,วาระ,ปิด,เริ่มการทำงานใหม่
+Keywords[tr]=kdm,görüntü yönetici,xdm,kullanıcılar,oturum açma,karşılama,logo,stiller,dil,ülke,yazı tipleri,artalan,duvar kağıtları,oturumlar,kapat,tekrar başlat
+Keywords[uk]=kdm,менеджер дисплеїв,xdm,користувачі,реєстрація,привітання,логотип,стилі,мова,країна,шрифти,тло,шпалери,сеанси,вимикання,перезапуск
+Keywords[uz]=kdm,kirish boshqaruvchisi,xdm,foydalanuvchilar,kirish,salomlashish,Belgi,uslublar,til,davlat,shriftlar,orqa fon,seanslar,oʻchirish,oʻchirib-yoqish
+Keywords[uz@cyrillic]=kdm,кириш бошқарувчиси,xdm,фойдаланувчилар,кириш,саломлашиш,Белги,услублар,тил,давлат,шрифтлар,орқа фон,сеанслар,ўчириш,ўчириб-ёқиш
+Keywords[ven]=kdm,mulanguli wau vhonisa,xdm,vhashumisi,u loga,dzindumeliso,logo,zwitaela,luambo,shango,fontu,murahu,mabammbiri a luvhondoni,tshitenwa,thutha,thomolosa
+Keywords[vi]=kdm,quản lý hiển thị,xdm,người dùng,đăng nhập,chào hỏi,Biểu trưng,kiểu,ngôn ngữ,quốc gia,phông chữ,nền,ảnh nền,phiên đăng nhập,tắt máy,khởi động lại
+Keywords[wa]=kdm,manaedjeu d' håynaedje,xdm,uzeus,login,wilikom,greeting,Logo,styles,stîles,lingaedje,payi,fontes,fond,fond del waitroûle,sessions,distinde,dislodjî,elodjî,s' elodjî,renonder
+Keywords[xh]=kdm,umphathi womboniso,xdm,abasebenzisi,igama elithile,umbuliso,ilogo,iintlobo,ulwimi,ilizwe,ubungakanani bamagama, imvelaphi,amaphepha odonga,iintlanganiso,vala,qala kwakhona
+Keywords[zh_CN]=kdm,display manager,xdm,users,login,greeting,Logo,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart,显示管理器,用户,登录,欢迎辞,标志,风格,语言,国家,字体,背景,墙纸,会话,关机,重启动
+Keywords[zh_TW]=kdm,display manager,xdm,users,login,greeting,Logo,styles,language,country,fonts,background,wallpapers,sessions,shutdown,restart,顯示管理程式,使用者,登入,歡迎,風格,語言,國家,字型,背景,底圖,工作階段,關機,重新啟動
+Keywords[zu]=kdm,Imenenja yokuveza,xdm,abasebenzisi,ukungena ngaphakathi,isibingelelo,Isiqubulo,izitayela,ulimi,izwe,izinhlobo zamagama, inkundla yangemuva,emaphepha ezindonga,iziqendu,vala,phinda uqale
+
+Categories=Qt;KDE;X-KDE-settings-system;
diff --git a/kcontrol/kdm/main.cpp b/kcontrol/kdm/main.cpp
new file mode 100644
index 000000000..12c356e5c
--- /dev/null
+++ b/kcontrol/kdm/main.cpp
@@ -0,0 +1,336 @@
+/*
+ * main.cpp
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ *
+ * 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 <config.h>
+
+#include <qlayout.h>
+
+#include <kaboutdata.h>
+#include <kgenericfactory.h>
+#include <kimageio.h>
+#include <kmessagebox.h>
+#include <kurldrag.h>
+
+#include "kdm-appear.h"
+#include "kdm-font.h"
+#include "kdm-users.h"
+#include "kdm-shut.h"
+#include "kdm-conv.h"
+
+#include "main.h"
+#include "background.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <locale.h>
+#include <pwd.h>
+#include <grp.h>
+
+typedef KGenericFactory<KDModule, QWidget> KDMFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_kdm, KDMFactory("kdmconfig") )
+
+KURL *decodeImgDrop(QDropEvent *e, QWidget *wdg)
+{
+ KURL::List uris;
+
+ if (KURLDrag::decode(e, uris) && (uris.count() > 0)) {
+ KURL *url = new KURL(uris.first());
+
+ KImageIO::registerFormats();
+ if( KImageIO::canRead(KImageIO::type(url->fileName())) )
+ return url;
+
+ QStringList qs = QStringList::split('\n', KImageIO::pattern());
+ qs.remove(qs.begin());
+
+ QString msg = i18n( "%1 "
+ "does not appear to be an image file.\n"
+ "Please use files with these extensions:\n"
+ "%2")
+ .arg(url->fileName())
+ .arg(qs.join("\n"));
+ KMessageBox::sorry( wdg, msg);
+ delete url;
+ }
+ return 0;
+}
+
+KSimpleConfig *config;
+
+KDModule::KDModule(QWidget *parent, const char *name, const QStringList &)
+ : KCModule(KDMFactory::instance(), parent, name)
+ , minshowuid(0)
+ , maxshowuid(0)
+ , updateOK(false)
+{
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmkdm"), I18N_NOOP("KDE Login Manager Config Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 1996 - 2005 The KDM Authors"));
+
+ about->addAuthor("Thomas Tanghus", I18N_NOOP("Original author"), "tanghus@earthling.net");
+ about->addAuthor("Steffen Hansen", 0, "hansen@kde.org");
+ about->addAuthor("Oswald Buddenhagen", I18N_NOOP("Current maintainer"), "ossi@kde.org");
+
+ setQuickHelp( i18n( "<h1>Login Manager</h1> In this module you can configure the "
+ "various aspects of the KDE Login Manager. This includes "
+ "the look and feel as well as the users that can be "
+ "selected for login. Note that you can only make changes "
+ "if you run the module with superuser rights. If you have not started the KDE "
+ "Control Center with superuser rights (which is absolutely the right thing to "
+ "do, by the way), click on the <em>Modify</em> button to acquire "
+ "superuser rights. You will be asked for the superuser password."
+ "<h2>Appearance</h2> On this tab page, you can configure how "
+ "the Login Manager should look, which language it should use, and which "
+ "GUI style it should use. The language settings made here have no influence on "
+ "the user's language settings."
+ "<h2>Font</h2>Here you can choose the fonts that the Login Manager should use "
+ "for various purposes like greetings and user names. "
+ "<h2>Background</h2>If you want to set a special background for the login "
+ "screen, this is where to do it."
+ "<h2>Shutdown</h2> Here you can specify who is allowed to shutdown/reboot the machine "
+ "and whether a boot manager should be used."
+ "<h2>Users</h2>On this tab page, you can select which users the Login Manager "
+ "will offer you for logging in."
+ "<h2>Convenience</h2> Here you can specify a user to be logged in automatically, "
+ "users not needing to provide a password to log in, and other convenience features.<br>"
+ "Note, that these settings are security holes by their nature, so use them very carefully."));
+
+ setAboutData( about );
+
+ setlocale( LC_COLLATE, "C" );
+
+ KGlobal::locale()->insertCatalogue("kcmbackground");
+
+ QStringList sl;
+ QMap<gid_t,QStringList> tgmap;
+ QMap<gid_t,QStringList>::Iterator tgmapi;
+ QMap<gid_t,QStringList>::ConstIterator tgmapci;
+ QMap<QString, QPair<int,QStringList> >::Iterator umapi;
+
+ struct passwd *ps;
+ for (setpwent(); (ps = getpwent()); ) {
+ QString un( QFile::decodeName( ps->pw_name ) );
+ if (usermap.find( un ) == usermap.end()) {
+ usermap.insert( un, QPair<int,QStringList>( ps->pw_uid, sl ) );
+ if ((tgmapi = tgmap.find( ps->pw_gid )) != tgmap.end())
+ (*tgmapi).append( un );
+ else
+ tgmap[ps->pw_gid] = un;
+ }
+ }
+ endpwent();
+
+ struct group *grp;
+ for (setgrent(); (grp = getgrent()); ) {
+ QString gn( QFile::decodeName( grp->gr_name ) );
+ bool delme = false;
+ if ((tgmapi = tgmap.find( grp->gr_gid )) != tgmap.end()) {
+ if ((*tgmapi).count() == 1 && (*tgmapi).first() == gn)
+ delme = true;
+ else
+ for (QStringList::ConstIterator it = (*tgmapi).begin();
+ it != (*tgmapi).end(); ++it)
+ usermap[*it].second.append( gn );
+ tgmap.remove( tgmapi );
+ }
+ if (!*grp->gr_mem ||
+ (delme && !grp->gr_mem[1] && gn == QFile::decodeName( *grp->gr_mem )))
+ continue;
+ do {
+ QString un( QFile::decodeName( *grp->gr_mem ) );
+ if ((umapi = usermap.find( un )) != usermap.end()) {
+ if ((*umapi).second.find( gn ) == (*umapi).second.end())
+ (*umapi).second.append( gn );
+ } else
+ kdWarning() << "group '" << gn << "' contains unknown user '" << un << "'" << endl;
+ } while (*++grp->gr_mem);
+ }
+ endgrent();
+
+ for (tgmapci = tgmap.begin(); tgmapci != tgmap.end(); ++tgmapci)
+ kdWarning() << "user(s) '" << tgmapci.data().join(",")
+ << "' have unknown GID " << tgmapci.key() << endl;
+
+ config = new KSimpleConfig( QString::fromLatin1( KDE_CONFDIR "/kdm/kdmrc" ));
+
+ QVBoxLayout *top = new QVBoxLayout(this);
+ tab = new QTabWidget(this);
+
+ // *****
+ // _don't_ add a theme configurator until the theming engine is _really_ done!!
+ // *****
+
+ appearance = new KDMAppearanceWidget(this);
+ tab->addTab(appearance, i18n("A&ppearance"));
+ connect(appearance, SIGNAL(changed(bool)), SIGNAL( changed(bool)));
+
+ font = new KDMFontWidget(this);
+ tab->addTab(font, i18n("&Font"));
+ connect(font, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+
+ background = new KBackground(this);
+ tab->addTab(background, i18n("&Background"));
+ connect(background, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+
+ sessions = new KDMSessionsWidget(this);
+ tab->addTab(sessions, i18n("&Shutdown"));
+ connect(sessions, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+
+ users = new KDMUsersWidget(this, 0);
+ tab->addTab(users, i18n("&Users"));
+ connect(users, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+ connect(users, SIGNAL(setMinMaxUID(int,int)), SLOT(slotMinMaxUID(int,int)));
+ connect(this, SIGNAL(addUsers(const QMap<QString,int> &)), users, SLOT(slotAddUsers(const QMap<QString,int> &)));
+ connect(this, SIGNAL(delUsers(const QMap<QString,int> &)), users, SLOT(slotDelUsers(const QMap<QString,int> &)));
+ connect(this, SIGNAL(clearUsers()), users, SLOT(slotClearUsers()));
+
+ convenience = new KDMConvenienceWidget(this, 0);
+ tab->addTab(convenience, i18n("Con&venience"));
+ connect(convenience, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+ connect(this, SIGNAL(addUsers(const QMap<QString,int> &)), convenience, SLOT(slotAddUsers(const QMap<QString,int> &)));
+ connect(this, SIGNAL(delUsers(const QMap<QString,int> &)), convenience, SLOT(slotDelUsers(const QMap<QString,int> &)));
+ connect(this, SIGNAL(clearUsers()), convenience, SLOT(slotClearUsers()));
+
+ load();
+ if (getuid() != 0 || !config->checkConfigFilesWritable( true )) {
+ appearance->makeReadOnly();
+ font->makeReadOnly();
+ background->makeReadOnly();
+ users->makeReadOnly();
+ sessions->makeReadOnly();
+ convenience->makeReadOnly();
+ }
+ top->addWidget(tab);
+}
+
+KDModule::~KDModule()
+{
+ delete config;
+}
+
+void KDModule::load()
+{
+ appearance->load();
+ font->load();
+ background->load();
+ users->load();
+ sessions->load();
+ convenience->load();
+ propagateUsers();
+}
+
+
+void KDModule::save()
+{
+ appearance->save();
+ font->save();
+ background->save();
+ users->save();
+ sessions->save();
+ convenience->save();
+ config->sync();
+}
+
+
+void KDModule::defaults()
+{
+ if ( getuid() == 0 )
+ {
+ appearance->defaults();
+ font->defaults();
+ background->defaults();
+ users->defaults();
+ sessions->defaults();
+ convenience->defaults();
+ propagateUsers();
+ }
+}
+
+void KDModule::propagateUsers()
+{
+ groupmap.clear();
+ emit clearUsers();
+ QMap<QString,int> lusers;
+ QMapConstIterator<QString, QPair<int,QStringList> > it;
+ QStringList::ConstIterator jt;
+ QMap<QString,int>::Iterator gmapi;
+ for (it = usermap.begin(); it != usermap.end(); ++it) {
+ int uid = it.data().first;
+ if (!uid || (uid >= minshowuid && uid <= maxshowuid)) {
+ lusers[it.key()] = uid;
+ for (jt = it.data().second.begin(); jt != it.data().second.end(); ++jt)
+ if ((gmapi = groupmap.find( *jt )) == groupmap.end()) {
+ groupmap[*jt] = 1;
+ lusers['@' + *jt] = -uid;
+ } else
+ (*gmapi)++;
+ }
+ }
+ emit addUsers(lusers);
+ updateOK = true;
+}
+
+void KDModule::slotMinMaxUID(int min, int max)
+{
+ if (updateOK) {
+ QMap<QString,int> alusers, dlusers;
+ QMapConstIterator<QString, QPair<int,QStringList> > it;
+ QStringList::ConstIterator jt;
+ QMap<QString,int>::Iterator gmapi;
+ for (it = usermap.begin(); it != usermap.end(); ++it) {
+ int uid = it.data().first;
+ if (!uid) continue;
+ if ((uid >= minshowuid && uid <= maxshowuid) &&
+ !(uid >= min && uid <= max)) {
+ dlusers[it.key()] = uid;
+ for (jt = it.data().second.begin();
+ jt != it.data().second.end(); ++jt) {
+ gmapi = groupmap.find( *jt );
+ if (!--(*gmapi)) {
+ groupmap.remove( gmapi );
+ dlusers['@' + *jt] = -uid;
+ }
+ }
+ } else
+ if ((uid >= min && uid <= max) &&
+ !(uid >= minshowuid && uid <= maxshowuid)) {
+ alusers[it.key()] = uid;
+ for (jt = it.data().second.begin();
+ jt != it.data().second.end(); ++jt)
+ if ((gmapi = groupmap.find( *jt )) == groupmap.end()) {
+ groupmap[*jt] = 1;
+ alusers['@' + *jt] = -uid;
+ } else
+ (*gmapi)++;
+ }
+ }
+ emit delUsers(dlusers);
+ emit addUsers(alusers);
+ }
+ minshowuid = min;
+ maxshowuid = max;
+}
+
+#include "main.moc"
diff --git a/kcontrol/kdm/main.h b/kcontrol/kdm/main.h
new file mode 100644
index 000000000..5e8da66b8
--- /dev/null
+++ b/kcontrol/kdm/main.h
@@ -0,0 +1,83 @@
+/*
+ * main.h
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ *
+ * 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.
+ */
+
+#ifndef __kdm_main_h
+#define __kdm_main_h
+
+#include <qtabwidget.h>
+#include <qmap.h>
+
+#include <kcmodule.h>
+
+class KDMAppearanceWidget;
+class KDMFontWidget;
+class KDMSessionsWidget;
+class KDMUsersWidget;
+class KDMConvenienceWidget;
+class KBackground;
+
+class KDModule : public KCModule
+{
+ Q_OBJECT
+
+public:
+
+ KDModule(QWidget *parent, const char *name, const QStringList &);
+ ~KDModule();
+
+ void load();
+ void save();
+ void defaults();
+
+public slots:
+
+ void slotMinMaxUID(int min, int max);
+
+signals:
+
+ void clearUsers();
+ void addUsers(const QMap<QString,int> &);
+ void delUsers(const QMap<QString,int> &);
+
+private:
+
+ QTabWidget *tab;
+
+ KDMAppearanceWidget *appearance;
+ KBackground *background;
+ KDMFontWidget *font;
+ KDMSessionsWidget *sessions;
+ KDMUsersWidget *users;
+ KDMConvenienceWidget *convenience;
+
+ QMap<QString, QPair<int,QStringList> > usermap;
+ QMap<QString,int> groupmap;
+ int minshowuid, maxshowuid;
+ bool updateOK;
+
+ void propagateUsers();
+
+};
+
+#endif
+
diff --git a/kcontrol/keys/ChangeLog b/kcontrol/keys/ChangeLog
new file mode 100644
index 000000000..b8ef570df
--- /dev/null
+++ b/kcontrol/keys/ChangeLog
@@ -0,0 +1,26 @@
+1999-08-19 Duncan Haldane <duncan@kde.org>
+ * removed left-over commented out code from change
+ decribed below, and adjusted help doc names to
+ index-1.html
+
+1999-02-28 Duncan Haldane <duncan@kde.org>
+ * commented out those unnecessary debug calls.
+ in keyconfig.cpp
+
+1998-12-19 Duncan Haldane <f.d.m.haldane@cwix.com>
+ * Converted global.cpp, global.h to keyconfig.cpp,
+ keyconfig.h, that can now be used to configure both
+ the standard keys and the global keys
+ in the same sophisticated manner as
+ global.cpp did for just the global keys.
+ * converted main.cpp to use keyconfig.cpp rather than
+ global.cpp and standard.cpp for standard and globall
+ key configuration. KGlobalConfig and KStdConfig disappear.
+ (KGlobalConfig is renamed to KKeyConfig)
+ * appropriate changes to Makefile.am.
+ * standard key binding are now #include'd from
+ stdbindings.cpp
+ * standard.cpp, standard.h are left here for now.
+ The entries that used to use them in main.cpp and
+ Makefile.am are just commented out for now.
+ \ No newline at end of file
diff --git a/kcontrol/keys/Makefile.am b/kcontrol/keys/Makefile.am
new file mode 100644
index 000000000..ec706a7b1
--- /dev/null
+++ b/kcontrol/keys/Makefile.am
@@ -0,0 +1,22 @@
+kde_module_LTLIBRARIES = kcm_keys.la
+
+kcm_keys_la_SOURCES = shortcuts.cpp modifiers.cpp main.cpp khotkeys.cpp treeview.cpp commandShortcuts.cpp
+kcm_keys_la_LIBADD = -lkdeui -lkio
+kcm_keys_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+
+AM_CPPFLAGS= $(all_includes)
+
+METASOURCES = AUTO
+
+messages:
+ customkeys=`grep "^.include .\.\." keyconfig.cpp | sed -e "s#.*\"\(.*\)\"#\1#"` ;\
+ $(XGETTEXT) $(kcm_keys_la_SOURCES) $$customkeys -o $(podir)/kcmkeys.pot
+
+update_DATA = kaccel.upd
+update_SCRIPTS = convertShortcuts.pl
+updatedir = $(kde_datadir)/kconf_update
+
+xdg_apps_DATA = keys.desktop
+
+scheme_DATA = wm3.kksrc kde3.kksrc kde4.kksrc win3.kksrc win4.kksrc mac4.kksrc unix3.kksrc
+schemedir = $(kde_datadir)/kcmkeys
diff --git a/kcontrol/keys/README b/kcontrol/keys/README
new file mode 100644
index 000000000..14e09f73e
--- /dev/null
+++ b/kcontrol/keys/README
@@ -0,0 +1,7 @@
+CHANGES V0.2
+- Global keys stored by default in ~/.kde/share/config/kdeglobals
+ [Global Keys] group
+- KKeyDialog checks new key choices against exising bindings for the widget
+and against entries in .kderc [Global Keys]
+- kcmkeys now has two standard kcontrol pages - one for standard desktop
+accelerators and one for global keybindings.
diff --git a/kcontrol/keys/commandShortcuts.cpp b/kcontrol/keys/commandShortcuts.cpp
new file mode 100644
index 000000000..446cd24ac
--- /dev/null
+++ b/kcontrol/keys/commandShortcuts.cpp
@@ -0,0 +1,243 @@
+/*
+ * commandShortcuts.h
+ *
+ * Copyright (c) 2003 Aaron J. Seigo
+ *
+ * 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 "commandShortcuts.h"
+#include "treeview.h"
+
+#include <qbuttongroup.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qwhatsthis.h>
+
+#include <kactivelabel.h>
+#include <kapplication.h>
+#include <kmessagebox.h>
+#include <kdialog.h>
+#include <khotkeys.h>
+#include <kkeybutton.h>
+#include <klocale.h>
+
+static bool treeFilled = false;
+CommandShortcutsModule::CommandShortcutsModule( QWidget *parent, const char *name )
+: QWidget( parent, name )
+{
+ treeFilled = false;
+ initGUI();
+}
+
+CommandShortcutsModule::~CommandShortcutsModule()
+{
+}
+
+// Called when [Reset] is pressed
+void CommandShortcutsModule::load()
+{
+ defaults();
+}
+
+void CommandShortcutsModule::save()
+{
+ for (treeItemListIterator it(m_changedItems); it.current(); ++it)
+ {
+ KHotKeys::changeMenuEntryShortcut(it.current()->storageId(), it.current()->accel());
+ }
+ m_changedItems.clear();
+}
+
+void CommandShortcutsModule::defaults()
+{
+ m_tree->clear();
+ m_tree->fill();
+}
+
+QString CommandShortcutsModule::quickHelp() const
+{
+ return i18n("<h1>Command Shortcuts</h1> Using key bindings you can configure applications "
+ "and commands to be triggered when you press a key or a combination of keys.");
+}
+
+void CommandShortcutsModule::initGUI()
+{
+ QVBoxLayout* mainLayout = new QVBoxLayout(this, KDialog::marginHint());
+ mainLayout->addSpacing( KDialog::marginHint() );
+
+ KActiveLabel* label = new KActiveLabel(this);
+ label->setText(i18n("<qt>Below is a list of known commands which you may assign keyboard shortcuts to. "
+ "To edit, add or remove entries from this list use the "
+ "<a href=\"launchMenuEditor\">KDE menu editor</a>.</qt>"));
+ label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
+ disconnect(label, SIGNAL(linkClicked(const QString &)), label, SLOT(openLink(const QString &)));
+ connect(label, SIGNAL(linkClicked(const QString &)), this, SLOT(launchMenuEditor()));
+ mainLayout->addWidget(label);
+
+ m_tree = new AppTreeView(this, "appTreeView");
+ m_tree->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+ mainLayout->setStretchFactor(m_tree, 10);
+ mainLayout->addWidget(m_tree);
+ QWhatsThis::add(m_tree,
+ i18n("This is a list of all the desktop applications and commands "
+ "currently defined on this system. Click to select a command to "
+ "assign a keyboard shortcut to. Complete management of these "
+ "entries can be done via the menu editor program."));
+ connect(m_tree, SIGNAL(entrySelected(const QString&, const QString &, bool)),
+ this, SLOT(commandSelected(const QString&, const QString &, bool)));
+ connect(m_tree, SIGNAL(doubleClicked(QListViewItem *, const QPoint &, int)),
+ this, SLOT(commandDoubleClicked(QListViewItem *, const QPoint &, int)));
+ m_shortcutBox = new QButtonGroup(i18n("Shortcut for Selected Command"), this);
+ mainLayout->addWidget(m_shortcutBox);
+ QHBoxLayout* buttonLayout = new QHBoxLayout(m_shortcutBox, KDialog::marginHint() * 2);
+ buttonLayout->addSpacing( KDialog::marginHint() );
+
+ m_noneRadio = new QRadioButton(i18n("no key", "&None"), m_shortcutBox);
+ QWhatsThis::add(m_noneRadio, i18n("The selected command will not be associated with any key."));
+ buttonLayout->addWidget(m_noneRadio);
+ m_customRadio = new QRadioButton(i18n("C&ustom"), m_shortcutBox);
+ QWhatsThis::add(m_customRadio,
+ i18n("If this option is selected you can create a customized key binding for the"
+ " selected command using the button to the right.") );
+ buttonLayout->addWidget(m_customRadio);
+ m_shortcutButton = new KKeyButton(m_shortcutBox);
+ QWhatsThis::add(m_shortcutButton,
+ i18n("Use this button to choose a new shortcut key. Once you click it, "
+ "you can press the key-combination which you would like to be assigned "
+ "to the currently selected command."));
+ buttonLayout->addSpacing(KDialog::spacingHint() * 2);
+ buttonLayout->addWidget(m_shortcutButton);
+ connect(m_shortcutButton, SIGNAL(capturedShortcut(const KShortcut&)),
+ this, SLOT(shortcutChanged(const KShortcut&)));
+ connect(m_customRadio, SIGNAL(toggled(bool)), m_shortcutButton, SLOT(setEnabled(bool)));
+ connect(m_noneRadio, SIGNAL(toggled(bool)), this, SLOT(shortcutRadioToggled(bool)));
+ buttonLayout->addStretch(1);
+}
+
+void CommandShortcutsModule::launchMenuEditor()
+{
+ if ( KApplication::startServiceByDesktopName( "kmenuedit",
+ QString::null /*url*/,
+ 0 /*error*/,
+ 0 /*dcopservice*/,
+ 0 /*pid*/,
+ "" /*startup_id*/,
+ true /*nowait*/ ) != 0 )
+ {
+ KMessageBox::error(this,
+ i18n("The KDE menu editor (kmenuedit) could not be launched.\n"
+ "Perhaps it is not installed or not in your path."),
+ i18n("Application Missing"));
+ }
+}
+
+
+void CommandShortcutsModule::shortcutRadioToggled(bool remove)
+{
+ AppTreeItem *item = static_cast<AppTreeItem*>(m_tree->currentItem());
+ if (!item || item->isDirectory())
+ {
+ return;
+ }
+
+ if (remove)
+ {
+ m_shortcutButton->setShortcut(QString::null, false);
+ item->setAccel(QString::null);
+ if (m_changedItems.findRef(item) == -1)
+ {
+ m_changedItems.append(item);
+ }
+ emit changed(true);
+ }
+ else
+ {
+ m_shortcutButton->captureShortcut();
+ }
+}
+
+void CommandShortcutsModule::shortcutChanged(const KShortcut& shortcut)
+{
+ AppTreeItem *item = static_cast<AppTreeItem*>(m_tree->currentItem());
+ if (!item || item->isDirectory())
+ {
+ return;
+ }
+
+ QString accel = shortcut.toString();
+ bool hasAccel = !accel.isEmpty();
+ m_noneRadio->blockSignals(true);
+ m_noneRadio->setChecked(!hasAccel);
+ m_customRadio->setChecked(hasAccel);
+ m_shortcutButton->setShortcut(accel, false);
+ item->setAccel(accel);
+ m_noneRadio->blockSignals(false);
+ if (m_changedItems.findRef(item) == -1)
+ {
+ m_changedItems.append(item);
+ }
+
+ emit changed( true );
+}
+
+void CommandShortcutsModule::showing(QWidget* w)
+{
+ if (w != this || treeFilled)
+ {
+ return;
+ }
+
+ m_tree->fill();
+ if (m_tree->firstChild())
+ {
+ m_tree->setSelected(m_tree->firstChild(), true);
+ }
+ else
+ {
+ m_shortcutBox->setEnabled(false);
+ }
+ treeFilled = true;
+}
+
+void CommandShortcutsModule::commandSelected(const QString& /* path */, const QString & accel, bool isDirectory)
+{
+ m_noneRadio->blockSignals(true);
+ m_shortcutBox->setEnabled(!isDirectory);
+ if (!isDirectory)
+ {
+ bool hasAccel = !accel.isEmpty();
+ m_noneRadio->setChecked(!hasAccel);
+ m_customRadio->setChecked(hasAccel);
+ m_shortcutButton->setShortcut(accel, false);
+ }
+ m_noneRadio->blockSignals(false);
+}
+
+void CommandShortcutsModule::commandDoubleClicked(QListViewItem *item, const QPoint &, int)
+{
+ if (!item)
+ {
+ return;
+ }
+ AppTreeItem *rl_item = static_cast<AppTreeItem*>(item);
+ if ( rl_item->isDirectory())
+ return;
+
+ m_shortcutButton->captureShortcut();
+}
+
+#include "commandShortcuts.moc"
diff --git a/kcontrol/keys/commandShortcuts.h b/kcontrol/keys/commandShortcuts.h
new file mode 100644
index 000000000..3bc492f17
--- /dev/null
+++ b/kcontrol/keys/commandShortcuts.h
@@ -0,0 +1,75 @@
+/*
+ * commandShortcuts.h
+ *
+ * Copyright (c) 2003 Aaron J. Seigo
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __COMMAND_SHORTCUTS_MODULE_H
+#define __COMMAND_SHORTCUTS_MODULE_H
+
+#include <qtabwidget.h>
+#include <kshortcut.h>
+#include <qptrlist.h>
+
+class AppTreeView;
+class AppTreeItem;
+class QButtonGroup;
+class QRadioButton;
+class KKeyButton;
+class QListViewItem;
+
+typedef QPtrList<AppTreeItem> treeItemList;
+typedef QPtrListIterator<AppTreeItem> treeItemListIterator;
+
+class CommandShortcutsModule : public QWidget
+{
+ Q_OBJECT
+ public:
+ CommandShortcutsModule( QWidget *parent = 0, const char *name = 0 );
+ ~CommandShortcutsModule();
+
+ void load();
+ void save();
+ void defaults();
+ QString quickHelp() const;
+
+ signals:
+ void changed( bool );
+
+ public slots:
+ void showing(QWidget*);
+
+ protected slots:
+ void commandSelected(const QString&, const QString &, bool);
+ void shortcutChanged(const KShortcut& shortcut);
+ void shortcutRadioToggled(bool remove);
+ void commandDoubleClicked(QListViewItem *item, const QPoint &, int);
+ void launchMenuEditor();
+
+ protected:
+ void initGUI();
+
+ private:
+ AppTreeView* m_tree;
+ QButtonGroup* m_shortcutBox;
+ QRadioButton* m_noneRadio;
+ QRadioButton* m_customRadio;
+ KKeyButton* m_shortcutButton;
+ treeItemList m_changedItems;
+};
+
+#endif // __COMMAND_SHORTCUTS_MODULE_H
diff --git a/kcontrol/keys/convertShortcuts.pl b/kcontrol/keys/convertShortcuts.pl
new file mode 100755
index 000000000..9dc216ac6
--- /dev/null
+++ b/kcontrol/keys/convertShortcuts.pl
@@ -0,0 +1,58 @@
+#!/usr/bin/perl
+$keys=0;
+foreach (<>) {
+ if(/^\[.*\]/) { $keys=0; }
+ if($keys==1) {
+ ($oldkey) = ($_ =~ /([^=]*)=.*/);
+ s/^Execute Command/Run Command/;
+ s/^Execute command/Run Command/;
+ s/^Lock screen/Lock Session/;
+ s/^Lock Screen/Lock Session/;
+ s/^Mouse emulation/Mouse Emulation/;
+ s/^Next keyboard layout/Switch to Next Keyboard Layout/;
+ s/Switch To Next Keyboard Layout/Switch to Next Keyboard Layout/;
+ s/^Screenshot of desktop/Desktop Screenshot/;
+ s/^Pop-up window operations menu/Window Operations Menu/;
+ s/^toggle-clipboard-actions/Enable\/Disable Clipboard Actions/;
+ s/^Screenshot of active window/Window Screenshot/;
+ s/^Show taskmanager/Show Taskmanager/;
+ s/^Show window list/Show Window List/;
+ s/^show-klipper-popupmenu/Show Klipper Popup-Menu/;
+ s/^Switch desktop left/Switch One Desktop to the Left/;
+ s/^Switch desktop right/Switch One Desktop to the Right/;
+ s/^Switch desktop down/Switch One Desktop Down/;
+ s/^Switch desktop up/Switch One Desktop Up/;
+ s/^Switch to desktop /Switch to Desktop /;
+ s/^Switch desktop next/Switch to Next Desktop/;
+ s/^Switch desktop previous/Switch to Previous Desktop/;
+ s/^Toggle Show Desktop/Toggle Showing Desktop/;
+ s/^Toggle raise and lower/Toggle Window Raise\/Lower/;
+ s/^Walk back through desktop list/Walk Through Desktop List \(Reverse\)/;
+ s/^Walk back through desktops/Walk Through Desktops \(Reverse\)/;
+ s/^Walk back through windows/Walk Through Windows \(Reverse\)/;
+ s/^Walk through desktop list/Walk Through Desktop List/;
+ s/^Walk through desktops/Walk Through Desktops/;
+ s/^Walk through windows/Walk Through Windows/;
+ s/^Window close/Window Close/;
+ s/^Window iconify/Window Iconify/;
+ s/^Window lower/Window Lower/;
+ s/^Window maximize/Window Maximize/;
+ s/^Window maximize horizontal/Window Maximize Horizontal/;
+ s/^Window maximize vertical/Window Maximize Vertical/;
+ s/^Window move/Window Move/;
+ s/^Window raise/Window Raise/;
+ s/^Window resize/Window Resize/;
+ s/^Window shade/Window Shade/;
+ s/^Window to Desktop /Window to Desktop /;
+ s/^Window to next desktop/Window to Next Desktop/;
+ s/^Window to previous desktop/Window to Previous Desktop/;
+ s/^repeat-last-klipper-action/Show Klipper Popup-Menu/;
+ ($newkey) = ($_ =~ /([^=]*)=.*/);
+ if ($oldkey ne $newkey) {
+ print "# DELETE " . $oldkey . "\n";
+ print $_
+ }
+ }
+ if(/\[Global Keys\]/) { $keys=1; print $_; }
+ if(/\[Global Shortcuts\]/) { $keys=1; print $_; }
+}
diff --git a/kcontrol/keys/kaccel.upd b/kcontrol/keys/kaccel.upd
new file mode 100644
index 000000000..711919cdb
--- /dev/null
+++ b/kcontrol/keys/kaccel.upd
@@ -0,0 +1,3 @@
+Id=kde3.3/r1
+File=kdeglobals
+Script=convertShortcuts.pl,perl
diff --git a/kcontrol/keys/kaccelaction.h b/kcontrol/keys/kaccelaction.h
new file mode 100644
index 000000000..2e1f78643
--- /dev/null
+++ b/kcontrol/keys/kaccelaction.h
@@ -0,0 +1,205 @@
+// THIS FILE IS A COPY OF kdelibs/kdecore/kaccelaction.h AND MUST BE KEPT
+// IN SYNC WITH THAT FILE.
+
+/* This file is part of the KDE libraries
+ Copyright (C) 2001,2002 Ellis Whitehead <ellis@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _KACCELACTION_H
+#define _KACCELACTION_H
+
+#include <qmap.h>
+#include <qptrvector.h>
+#include <qstring.h>
+#include <qvaluevector.h>
+
+#include <kshortcut.h>
+
+class KAccelBase;
+
+class QObject;
+class KConfig;
+class KConfigBase;
+
+/*
+ KAccelAction holds information an a given action, such as "Run Command"
+
+ 1) KAccelAction = "Run Command"
+ Default3 = "Alt+F2"
+ Default4 = "Meta+Enter;Alt+F2"
+ 1) KShortcut = "Meta+Enter"
+ 1) KKeySequence = "Meta+Enter"
+ 1) KKey = "Meta+Enter"
+ 1) Meta+Enter
+ 2) Meta+Keypad_Enter
+ 2) KShortcut = "Alt+F2"
+ 1) KKeySequence = "Alt+F2"
+ 1) Alt+F2
+ 2) KAccelAction = "Something"
+ Default3 = ""
+ Default4 = ""
+ 1) KShortcut = "Meta+X,Asterisk"
+ 1) KKeySequence = "Meta+X,Asterisk"
+ 1) KKey = "Meta+X"
+ 1) Meta+X
+ 2) KKey = "Asterisk"
+ 1) Shift+8 (English layout)
+ 2) Keypad_Asterisk
+*/
+
+//---------------------------------------------------------------------
+// KAccelAction
+//---------------------------------------------------------------------
+
+class KAccelAction
+{
+ public:
+ KAccelAction();
+ KAccelAction( const KAccelAction& );
+ KAccelAction( const QString& sName, const QString& sLabel, const QString& sWhatsThis,
+ const KShortcut& cutDef3, const KShortcut& cutDef4,
+ const QObject* pObjSlot, const char* psMethodSlot,
+ bool bConfigurable, bool bEnabled );
+ ~KAccelAction();
+
+ void clear();
+ bool init( const QString& sName, const QString& sLabel, const QString& sWhatsThis,
+ const KShortcut& cutDef3, const KShortcut& cutDef4,
+ const QObject* pObjSlot, const char* psMethodSlot,
+ bool bConfigurable, bool bEnabled );
+
+ KAccelAction& operator=( const KAccelAction& );
+
+ const QString& name() const { return m_sName; }
+ const QString& label() const { return m_sLabel; }
+ const QString& whatsThis() const { return m_sWhatsThis; }
+ const KShortcut& shortcut() const { return m_cut; }
+ const KShortcut& shortcutDefault() const;
+ const KShortcut& shortcutDefault3() const { return m_cutDefault3; }
+ const KShortcut& shortcutDefault4() const { return m_cutDefault4; }
+ const QObject* objSlotPtr() const { return m_pObjSlot; }
+ const char* methodSlotPtr() const { return m_psMethodSlot; }
+ bool isConfigurable() const { return m_bConfigurable; }
+ bool isEnabled() const { return m_bEnabled; }
+
+ void setName( const QString& );
+ void setLabel( const QString& );
+ void setWhatsThis( const QString& );
+ bool setShortcut( const KShortcut& rgCuts );
+ void setSlot( const QObject* pObjSlot, const char* psMethodSlot );
+ void setConfigurable( bool );
+ void setEnabled( bool );
+
+ int getID() const { return m_nIDAccel; }
+ void setID( int n ) { m_nIDAccel = n; }
+ bool isConnected() const;
+
+ bool setKeySequence( uint i, const KKeySequence& );
+ void clearShortcut();
+ bool contains( const KKeySequence& );
+
+ QString toString() const;
+ QString toStringInternal() const;
+
+ static bool useFourModifierKeys();
+ static void useFourModifierKeys( bool );
+
+ protected:
+ QString m_sName,
+ m_sLabel,
+ m_sWhatsThis;
+ KShortcut m_cut;
+ KShortcut m_cutDefault3, m_cutDefault4;
+ const QObject* m_pObjSlot;
+ const char* m_psMethodSlot;
+ bool m_bConfigurable,
+ m_bEnabled;
+ int m_nIDAccel;
+ uint m_nConnections;
+
+ void incConnections();
+ void decConnections();
+
+ private:
+ static int g_bUseFourModifierKeys;
+ class KAccelActionPrivate* d;
+
+ friend class KAccelActions;
+ friend class KAccelBase;
+};
+
+//---------------------------------------------------------------------
+// KAccelActions
+//---------------------------------------------------------------------
+
+class KAccelActions
+{
+ public:
+ KAccelActions();
+ KAccelActions( const KAccelActions& );
+ virtual ~KAccelActions();
+
+ void clear();
+ bool init( const KAccelActions& );
+ bool init( KConfigBase& config, const QString& sGroup );
+
+ void updateShortcuts( KAccelActions& );
+
+ int actionIndex( const QString& sAction ) const;
+ KAccelAction* actionPtr( uint );
+ const KAccelAction* actionPtr( uint ) const;
+ KAccelAction* actionPtr( const QString& sAction );
+ const KAccelAction* actionPtr( const QString& sAction ) const;
+ KAccelAction* actionPtr( KKeySequence cut );
+ KAccelAction& operator []( uint );
+ const KAccelAction& operator []( uint ) const;
+
+ KAccelAction* insert( const QString& sAction, const QString& sLabel, const QString& sWhatsThis,
+ const KShortcut& rgCutDefaults3, const KShortcut& rgCutDefaults4,
+ const QObject* pObjSlot = 0, const char* psMethodSlot = 0,
+ bool bConfigurable = true, bool bEnabled = true );
+ KAccelAction* insert( const QString& sName, const QString& sLabel );
+ bool remove( const QString& sAction );
+
+ bool readActions( const QString& sConfigGroup = "Shortcuts", KConfigBase* pConfig = 0 );
+ bool writeActions( const QString& sConfigGroup = "Shortcuts", KConfigBase* pConfig = 0,
+ bool bWriteAll = false, bool bGlobal = false ) const;
+
+ void emitKeycodeChanged();
+
+ uint count() const;
+
+ protected:
+ KAccelBase* m_pKAccelBase;
+ KAccelAction** m_prgActions;
+ uint m_nSizeAllocated, m_nSize;
+
+ void resize( uint );
+ void insertPtr( KAccelAction* );
+
+ private:
+ class KAccelActionsPrivate* d;
+
+ KAccelActions( KAccelBase* );
+ void initPrivate( KAccelBase* );
+ KAccelActions& operator =( KAccelActions& );
+
+ friend class KAccelBase;
+};
+
+#endif // _KACCELACTION_H
diff --git a/kcontrol/keys/kde3.kksrc b/kcontrol/keys/kde3.kksrc
new file mode 100644
index 000000000..b42508a78
--- /dev/null
+++ b/kcontrol/keys/kde3.kksrc
@@ -0,0 +1,192 @@
+[Settings]
+Name=KDE Default for 3 Modifier Keys
+Name[af]=Standaard KDE vir 3 verandering sleutels
+Name[be]=Стандартны для KDE з трыма клавішамі мадыфікацыі
+Name[bg]=KDE (с 3 модификационни клавиша)
+Name[bs]=KDE standardno za 3 modifikatorske tipke
+Name[ca]=Omissió KDE per a 3 tecles modificadores
+Name[cs]=Výchozí pro KDE (3 modifikátory)
+Name[csb]=Domëslny nastôw KDE dlô 3 klawiszów zjinaczi
+Name[cy]=Rhagosodion KDE i 3 Bysell Addasu
+Name[da]=KDE-standard med 3 modifikatortaster
+Name[de]=KDE-Standard für 3 Sondertasten
+Name[el]=Προεπιλογή KDE με 3 πλήκτρα αλλαγής
+Name[eo]=KDE-defaŭlto por 3 modifaj klavoj
+Name[es]=Predeterminado de KDE de 3 modificadores de teclado
+Name[et]=KDE vaikeskeem 3 muuteklahviga
+Name[eu]=KDE lehenetsia 3 tekla modifikatzailekin
+Name[fa]=پیش‌فرض KDE برای ۳ کلید تغییردهندۀ
+Name[fi]=KDE oletus 3:lle muokkausnäppäimelle
+Name[fr]=KDE par défaut pour 3 touches de modifications
+Name[fy]=KDE-standert foar 3 modifikaasjetoetsen
+Name[gl]=Predeterminado de KDE para 3 Teclas Modificadoras
+Name[he]=ברירת המחדל של KDE עבור 3 כפתורים
+Name[hr]=KDE zadano za 3 modifikatorske tipke
+Name[hu]=KDE-s alapértelmezés (3 módosító billentyűvel)
+Name[is]=Sjálfgefið KDE fyrir 3 breytilykla
+Name[it]=Predefinito di KDE per 3 tasti modificatori
+Name[ja]=KDE 標準 (3 モディファイアキー)
+Name[kk]=3 түрлендіру перне үшін KDE-нің әдетті баптауы
+Name[km]=KDE លំនាំដើម​សម្រាប់​គ្រាប់ចុច​កែប្រែ ៣
+Name[ko]=세 개의 수정자 키를 사용하는 KDE 기본값
+Name[lo]=ຄ່າປະລິຍາຍຂອງ KDE ສຳລັບປຸ່ມໃຊ້ຮ່ວມ 3 ປຸ່ມ
+Name[lt]=KDE numatytoji 3 klavišams - modifikatoriams
+Name[mk]=KDE-стандардно за 3 копчиња-модификатори
+Name[mn]=3 сэлгүүр товчилуурын КДЭ-Стандарт
+Name[ms]=Piawai KDE untuk 3 Kekunci Pengubah Suai
+Name[nb]=KDE-standard for tre valgtaster
+Name[nds]=KDE-Standard för 3 Sünnertasten
+Name[ne]=३ परिमार्जक कुञ्जीका लागि पूर्वनिर्धारित KDE
+Name[nl]=KDE-standaard voor 3 modificatietoetsen
+Name[nn]=KDE-standard med tre valtastar
+Name[nso]=Thuso ya Tshoganetso ya KDE ya Dinotlelo tse 3 tsa Kaonafatso
+Name[pa]=3 ਮੋਡੀਫਾਇਰ ਸਵਿੱਚਾਂ ਲਈ KDE ਮੂਲ
+Name[pl]=Ustawienia domyślne KDE dla 3 klawiszy modyfikatorów
+Name[pt]=Predefinição do KDE para 3 Teclas Modificadoras
+Name[pt_BR]=Padrão do KDE para 3 Teclas Modificadoras
+Name[ro]=KDE implicit pentru 3 taste modificator
+Name[ru]=KDE с тремя клавишами-модификаторами
+Name[rw]=Mburabuzi KDE ya Buto 3 Muhindura
+Name[se]=KDE-standárda mas leat golbma válljeboalu
+Name[sk]=KDE nastavenia pre 3 modifikačné klávesy
+Name[sl]=Privzeto za 3 spremenilne tipke
+Name[sr]=KDE подразумевано за 3 модификаторска тастера
+Name[sr@Latn]=KDE podrazumevano za 3 modifikatorska tastera
+Name[sv]=KDE-förinställt med 3 väljartangenter
+Name[tg]=Пешфарзи KDE барои 3 калидҳои ислоҳӣ
+Name[th]=ค่าปริยายของ KDE สำหรับปุ่มเปลี่ยนหน้าที่ 3 ปุ่ม
+Name[tr]=3 Değiştirici Anahtar için KDE Varsayılan
+Name[tt]=KDE üzeneken, 3 Üzgärtkeç Töymä öçen
+Name[uk]=Типова для KDE з 3 модифікаторами
+Name[ven]=Default ya KDE ya khii tharu dzau lugisela
+Name[vi]=Mặc định KDE cho 3 Phím Bổ trợ
+Name[wa]=Pémetou KDE po 3 tapes di candjmints
+Name[xh]=KDE Engagqibekanga ye 3 Izitsixo Mofifier
+Name[zh_CN]=三个修饰键的 KDE 默认值
+Name[zh_TW]=KDE 預設使用 3 個輔助按鍵 (Alt/Ctrl/Shift)
+Name[zu]=Okwendalo kwe-KDE okusetshenziselwa okhiye bokulungisa abangu-3
+Uses Win Modifier=false
+
+[Global Shortcuts]
+Desktop Screenshot=Ctrl+Print
+Enable/Disable Clipboard Actions=Alt+Ctrl+X
+Run Command=Alt+F2
+Halt Computer=none
+Halt without Confirmation=none
+Kill Window=Alt+Ctrl+Escape
+Lock Session=Alt+Ctrl+L
+Logout=Alt+Ctrl+Delete
+Logout without Confirmation=none
+Manually Invoke Action on Current Clipboard=Alt+Ctrl+R
+Mouse Emulation=Alt+F12
+Popup Launch Menu=Alt+F1
+Reboot Computer=none
+Reboot without Confirmation=none
+Show Klipper Popup-Menu=Alt+Ctrl+V
+Show Taskmanager=Ctrl+Escape
+Show Window List=Alt+F5
+Switch One Desktop Down=none
+Switch One Desktop to the Left=none
+Switch One Desktop to the Right=none
+Switch One Desktop Up=none
+Switch to Next Keyboard Layout=Alt+Ctrl+K
+Switch to Desktop 1=Ctrl+F1
+Switch to Desktop 10=Ctrl+F10
+Switch to Desktop 11=Ctrl+F11
+Switch to Desktop 12=Ctrl+F12
+Switch to Desktop 13=Ctrl+Shift+F1
+Switch to Desktop 14=Ctrl+Shift+F2
+Switch to Desktop 15=Ctrl+Shift+F3
+Switch to Desktop 16=Ctrl+Shift+F4
+Switch to Desktop 2=Ctrl+F2
+Switch to Desktop 3=Ctrl+F3
+Switch to Desktop 4=Ctrl+F4
+Switch to Desktop 5=Ctrl+F5
+Switch to Desktop 6=Ctrl+F6
+Switch to Desktop 7=Ctrl+F7
+Switch to Desktop 8=Ctrl+F8
+Switch to Desktop 9=Ctrl+F9
+Switch to Next Desktop=none
+Switch to Previous Desktop=none
+Toggle Showing Desktop=Alt+Ctrl+D
+Toggle Window Raise/Lower=none
+Walk Through Desktop List=Ctrl+Tab
+Walk Through Desktop List (Reverse)=Ctrl+Shift+Tab
+Walk Through Desktops=none
+Walk Through Desktops (Reverse)=none
+Walk Through Windows=Alt+Tab
+Walk Through Windows (Reverse)=Alt+Shift+Tab
+Window Close=Alt+F4
+Window Iconify=none
+Window Lower=none
+Window Maximize=none
+Window Maximize Horizontal=none
+Window Maximize Vertical=none
+Window Move=none
+Window Operations Menu=Alt+F3
+Window Raise=none
+Window Resize=none
+Window Screenshot=Alt+Print
+Window Shade=none
+Window to Desktop 1=none
+Window to Desktop 10=none
+Window to Desktop 11=none
+Window to Desktop 12=none
+Window to Desktop 13=none
+Window to Desktop 14=none
+Window to Desktop 15=none
+Window to Desktop 16=none
+Window to Desktop 2=none
+Window to Desktop 3=none
+Window to Desktop 4=none
+Window to Desktop 5=none
+Window to Desktop 6=none
+Window to Desktop 7=none
+Window to Desktop 8=none
+Window to Desktop 9=none
+Window to Next Desktop=none
+Window to Previous Desktop=none
+
+[Shortcuts]
+AddBookmark=Ctrl+B
+Back=Alt+Left
+Close=Ctrl+W
+Copy=Ctrl+C;Ctrl+Insert
+Cut=Ctrl+X;Shift+Delete
+DeleteWordBack=Ctrl+Backspace
+DeleteWordForward=Ctrl+Delete
+Deselect=Ctrl+Shift+A
+End=Ctrl+End
+Find=Ctrl+F
+FindNext=F3
+FindPrev=Shift+F3
+Forward=Alt+Right
+GotoLine=Ctrl+G
+Help=F1
+Home=Ctrl+Home
+Insert=Ctrl+Insert
+New=Ctrl+N
+Next=Next
+NextCompletion=Ctrl+Down
+Open=Ctrl+O
+Paste=Ctrl+V;Shift+Insert
+PopupMenuContext=Menu
+PrevCompletion=Ctrl+Up
+Print=Ctrl+P
+Prior=Prior
+Quit=Ctrl+Q
+Redo=Ctrl+Shift+Z
+Reload=F5
+Replace=Ctrl+R
+RotateDown=Down
+RotateUp=Up
+Save=Ctrl+S
+SelectAll=Ctrl+A
+ShowMenubar=Ctrl+M
+SubstringCompletion=Ctrl+T
+TextCompletion=Ctrl+E
+Undo=Ctrl+Z
+Up=Alt+Up
+WhatsThis=Shift+F1
+ZoomIn=Ctrl+Plus
+ZoomOut=Ctrl+Minus
diff --git a/kcontrol/keys/kde4.kksrc b/kcontrol/keys/kde4.kksrc
new file mode 100644
index 000000000..367bc41d6
--- /dev/null
+++ b/kcontrol/keys/kde4.kksrc
@@ -0,0 +1,192 @@
+[Settings]
+Name=KDE Default for 4 Modifier Keys
+Name[af]=Standaard KDE vir 4 verandering sleutels
+Name[be]=Стандартны для KDE з чатырма клавішамі мадыфікацыі
+Name[bg]=KDE (с 4 модификационни клавиша)
+Name[bs]=KDE standardno za 4 modifikatorske tipke
+Name[ca]=Omissió KDE per a 4 tecles modificadores
+Name[cs]=Výchozí pro KDE (4 modifikátory)
+Name[csb]=Domëslny nastôw KDE dlô 4 klawiszów zjinaczi
+Name[cy]=Rhagosodion KDE i 4 Bysell Addasu
+Name[da]=KDE-standard med 4 modifikatortaster
+Name[de]=KDE-Standard für 4 Sondertasten
+Name[el]=Προεπιλογή KDE με 4 πλήκτρα αλλαγής
+Name[eo]=KDE-defaŭlto por 4 modifaj klavoj
+Name[es]=Predeterminado de KDE de 4 modificadores de teclado
+Name[et]=KDE vaikeskeem 4 muuteklahviga
+Name[eu]=KDE lehenetsia 4 tekla modifikatzailekin
+Name[fa]=پیش‌فرض KDE برای ۴ کلید تغییردهندۀ
+Name[fi]=KDE oletus 4:lle muokkausnäppäimelle
+Name[fr]=KDE par défaut pour 4 touches de modifications
+Name[fy]=KDE-standert foar 4 modifikaasjetoetsen
+Name[gl]=Predeterminado de KDE para 4 Teclas Modificadoras
+Name[he]=ברירת המחדל של KDE עבור 4 כפתורים
+Name[hr]=KDE zadano za 4 modifikatorske tipke
+Name[hu]=KDE-s alapértelmezés (4 módosító billentyűvel)
+Name[is]=Sjálfgefið KDE fyrir 4 breytilykla
+Name[it]=Predefinito di KDE per 4 tasti modificatori
+Name[ja]=KDE 標準 (4 モディファイアキー)
+Name[kk]=4 түрлендіру перне үшін KDE-нің әдетті баптауы
+Name[km]=KDE លំនាំដើម​សម្រាប់​គ្រាប់ចុច​កែប្រែ ៤
+Name[ko]=네 개의 수정자 키를 사용하는 KDE 기본값
+Name[lo]=ຄ່າປະລິຍາຍຂອງ KDE ສຳລັບປຸ່ມໃຊ້ຮ່ວມ 4 ປຸ່່ມ
+Name[lt]=KDE numatytoji 4 klavišams - modifikatoriams
+Name[mk]=KDE-стандардно за 4 копчиња-модификатори
+Name[mn]=4 сэлгүүр товчилуурын КДЭ-Стандарт
+Name[ms]=Piawai KDE untuk 4 Kekunci Pengubah Suai
+Name[nb]=KDE-standard for fire valgtaster
+Name[nds]=KDE-Standard för 4 Sünnertasten
+Name[ne]=४ परिमार्जक कुञ्जीका लागि पूर्वनिर्धारित KDE
+Name[nl]=KDE-standaard voor 4 modificatietoetsen
+Name[nn]=KDE-standard med fire valtastar
+Name[nso]=Thuso ya Tshoganetso ya KDE ya Dinotlelo tse 4 tsa Kaonafatso
+Name[pa]=4 ਮੋਡੀਫਾਇਰ ਸਵਿੱਚਾਂ ਲਈ KDE ਮੂਲ
+Name[pl]=Ustawienia domyślne KDE dla 4 klawiszy modyfikatorów
+Name[pt]=Predefinição do KDE para 4 Teclas Modificadoras
+Name[pt_BR]=Padrão do KDE para 4 Teclas Modificadoras
+Name[ro]=KDE implicit pentru 4 taste modificator
+Name[ru]=KDE с четырьмя клавишами-модификаторами
+Name[rw]=Mburabuzi KDE ya Buto 4 Muhindura
+Name[se]=KDE-standárda mas leat njeallje válljenboalu
+Name[sk]=KDE nastavenia pre 4 modifikačné klávesy
+Name[sl]=Privzeto za 4 spremenilne tipke
+Name[sr]=KDE подразумевано за 4 модификаторска тастера
+Name[sr@Latn]=KDE podrazumevano za 4 modifikatorska tastera
+Name[sv]=KDE-förinställt med 4 väljartangenter
+Name[tg]=Пешфарзи KDE барои 4 калидҳои ислоҳӣ
+Name[th]=ค่าปริยายของ KDE สำหรับปุ่มเปลี่ยนหน้าที่ 4 ปุ่ม
+Name[tr]=4 Değiştirici Anahtar için KDE Varsayılan
+Name[tt]=KDE üzeneken, 4 Üzgärtkeç Töymä öçen
+Name[uk]=Типова для KDE з 4 модифікаторами
+Name[ven]=Default ya KDE ya khii nna dzau lugisela
+Name[vi]=Mặc định KDE cho 4 Phím Bổ trợ
+Name[wa]=Pémetou KDE po 4 tapes di candjmints
+Name[xh]=KDE Engagqibekanga ye 4 Izitsixo Mofifier
+Name[zh_CN]=四个修饰键的 KDE 默认值
+Name[zh_TW]=KDE 預設使用 4 個輔助按鍵 (Meta/Alt/Ctrl/Shift)
+Name[zu]=Okwendalo kwe-KDE okusetshenziselwa okhiye bokulungisa abangu-4
+Uses Win Modifier=true
+
+[Global Shortcuts]
+Desktop Screenshot=Win+Print
+Enable/Disable Clipboard Actions=Win+Ctrl+X
+Run Command=Win+Return;Alt+F2
+Halt Computer=none
+Halt without Confirmation=none
+Kill Window=Win+Ctrl+Delete
+Lock Session=Win+ScrollLock
+Logout=Win+Escape
+Logout without Confirmation=none
+Manually Invoke Action on Current Clipboard=Win+Ctrl+R
+Mouse Emulation=none
+Popup Launch Menu=Win+Menu
+Reboot Computer=none
+Reboot without Confirmation=none
+Show Klipper Popup-Menu=Win+Ctrl+V
+Show Taskmanager=Win+Ctrl+Pause
+Show Window List=Win+0
+Switch One Desktop Down=none
+Switch One Desktop to the Left=none
+Switch One Desktop to the Right=none
+Switch One Desktop Up=none
+Switch to Next Keyboard Layout=Win+Ctrl+K
+Switch to Desktop 1=Win+F1
+Switch to Desktop 10=Win+F10
+Switch to Desktop 11=none
+Switch to Desktop 12=none
+Switch to Desktop 13=none
+Switch to Desktop 14=none
+Switch to Desktop 15=none
+Switch to Desktop 16=none
+Switch to Desktop 2=Win+F2
+Switch to Desktop 3=Win+F3
+Switch to Desktop 4=Win+F4
+Switch to Desktop 5=Win+F5
+Switch to Desktop 6=Win+F6
+Switch to Desktop 7=Win+F7
+Switch to Desktop 8=Win+F8
+Switch to Desktop 9=Win+F9
+Switch to Next Desktop=none
+Switch to Previous Desktop=none
+Toggle Showing Desktop=Win+Ctrl+D
+Toggle Window Raise/Lower=none
+Walk Through Desktop List=none
+Walk Through Desktop List (Reverse)=none
+Walk Through Desktops=Win+Tab
+Walk Through Desktops (Reverse)=Win+Shift+Tab
+Walk Through Windows=Alt+Tab
+Walk Through Windows (Reverse)=Alt+Shift+Tab
+Window Close=Alt+Escape;Alt+F4
+Window Iconify=Win+Minus
+Window Lower=none
+Window Maximize=Win+Plus
+Window Maximize Horizontal=Win+Equal
+Window Maximize Vertical=Win+Bar
+Window Move=none
+Window Operations Menu=Alt+Menu
+Window Raise=none
+Window Resize=none
+Window Screenshot=Alt+Print
+Window Shade=Win+Underscore
+Window to Desktop 1=Win+Alt+F1
+Window to Desktop 10=Win+Alt+F10
+Window to Desktop 11=none
+Window to Desktop 12=none
+Window to Desktop 13=none
+Window to Desktop 14=none
+Window to Desktop 15=none
+Window to Desktop 16=none
+Window to Desktop 2=Win+Alt+F2
+Window to Desktop 3=Win+Alt+F3
+Window to Desktop 4=Win+Alt+F4
+Window to Desktop 5=Win+Alt+F5
+Window to Desktop 6=Win+Alt+F6
+Window to Desktop 7=Win+Alt+F7
+Window to Desktop 8=Win+Alt+F8
+Window to Desktop 9=Win+Alt+F9
+Window to Next Desktop=none
+Window to Previous Desktop=none
+
+[Shortcuts]
+AddBookmark=Ctrl+B
+Back=Alt+Left
+Close=Ctrl+Escape;Ctrl+W
+Copy=Ctrl+C;Ctrl+Insert
+Cut=Ctrl+X;Shift+Delete
+DeleteWordBack=Ctrl+Backspace
+DeleteWordForward=Ctrl+Delete
+Deselect=Ctrl+Shift+A
+End=Ctrl+End
+Find=Ctrl+F
+FindNext=F3
+FindPrev=Shift+F3
+Forward=Alt+Right
+GotoLine=Ctrl+G
+Help=F1
+Home=Ctrl+Home
+Insert=Ctrl+Insert
+New=Ctrl+N
+Next=Next
+NextCompletion=Ctrl+Down
+Open=Ctrl+O
+Paste=Ctrl+V;Shift+Insert
+PopupMenuContext=Menu
+PrevCompletion=Ctrl+Up
+Print=Ctrl+P
+Prior=Prior
+Quit=Ctrl+Q
+Redo=Ctrl+Shift+Z
+Reload=F5
+Replace=Ctrl+R
+RotateDown=Down
+RotateUp=Up
+Save=Ctrl+S
+SelectAll=Ctrl+A
+ShowMenubar=Ctrl+M
+SubstringCompletion=Ctrl+T
+TextCompletion=Ctrl+E
+Undo=Ctrl+Z
+Up=Alt+Up
+WhatsThis=Shift+F1
+ZoomIn=Ctrl+Plus
+ZoomOut=Ctrl+Minus
diff --git a/kcontrol/keys/keyconfig.cpp b/kcontrol/keys/keyconfig.cpp
new file mode 100644
index 000000000..89a32cf5e
--- /dev/null
+++ b/kcontrol/keys/keyconfig.cpp
@@ -0,0 +1,545 @@
+//
+// KDE Shortcut config module
+//
+// Copyright (c) Mark Donohoe 1998
+// Copyright (c) Matthias Ettrich 1998
+// Converted to generic key configuration module, Duncan Haldane 1998.
+// Layout fixes copyright (c) 2000 Preston Brown <pbrown@kde.org>
+
+#include <config.h>
+#include <stdlib.h>
+
+#include <unistd.h>
+
+#include <qlabel.h>
+#include <qdir.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+#include <qcheckbox.h>
+#include <qregexp.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <ksimpleconfig.h>
+#include <kmessagebox.h>
+#include <kseparator.h>
+#include <dcopclient.h>
+#include <kapplication.h>
+#include <kkey_x11.h> // Used in KKeyModule::init()
+
+#include "keyconfig.h"
+#include "keyconfig.moc"
+
+#define KICKER_ALL_BINDINGS
+
+//----------------------------------------------------------------------------
+
+KKeyModule::KKeyModule( QWidget *parent, bool isGlobal, bool bSeriesOnly, bool bSeriesNone, const char *name )
+ : QWidget( parent, name )
+{
+ init( isGlobal, bSeriesOnly, bSeriesNone );
+}
+
+KKeyModule::KKeyModule( QWidget *parent, bool isGlobal, const char *name )
+ : QWidget( parent, name )
+{
+ init( isGlobal, false, false );
+}
+
+void KKeyModule::init( bool isGlobal, bool _bSeriesOnly, bool bSeriesNone )
+{
+ QString wtstr;
+
+ KeyType = isGlobal ? "global" : "standard";
+
+ bSeriesOnly = _bSeriesOnly;
+
+ kdDebug(125) << "KKeyModule::init() - Get default key bindings." << endl;
+ if ( KeyType == "global" ) {
+ KAccelActions* keys = &actions;
+// see also KKeyModule::init() below !!!
+#define NOSLOTS
+#define KShortcuts KAccelShortcuts
+#include "../../kwin/kwinbindings.cpp"
+#include "../../kicker/kicker/core/kickerbindings.cpp"
+#include "../../kicker/taskbar/taskbarbindings.cpp"
+#include "../../kdesktop/kdesktopbindings.cpp"
+#include "../../klipper/klipperbindings.cpp"
+#include "../../kxkb/kxkbbindings.cpp"
+#undef KShortcuts
+ KeyScheme = "Global Key Scheme";
+ KeySet = "Global Keys";
+ // Sorting Hack: I'll re-write the module once feature-adding begins again.
+ if( bSeriesOnly || bSeriesNone ) {
+ for( uint i = 0; i < actions.size(); i++ ) {
+ QString sConfigKey = actions[i].m_sName;
+ //kdDebug(125) << "sConfigKey: " << sConfigKey << endl;
+ int iLastSpace = sConfigKey.findRev( ' ' );
+ bool bIsNum = false;
+ if( iLastSpace >= 0 )
+ sConfigKey.mid( iLastSpace+1 ).toInt( &bIsNum );
+
+ kdDebug(125) << "sConfigKey: " << sConfigKey
+ << " bIsNum: " << bIsNum
+ << " bSeriesOnly: " << bSeriesOnly << endl;
+ if( ((bSeriesOnly && !bIsNum) || (bSeriesNone && bIsNum)) && !sConfigKey.contains( ':' ) ) {
+ actions.removeAction( sConfigKey );
+ i--;
+ }
+ }
+ }
+ }
+
+ if ( KeyType == "standard" ) {
+ for(uint i=0; i<KStdAccel::NB_STD_ACCELS; i++) {
+ KStdAccel::StdAccel id = (KStdAccel::StdAccel)i;
+ actions.insertAction( KStdAccel::action(id),
+ KStdAccel::description(id),
+ KStdAccel::defaultKey3(id),
+ KStdAccel::defaultKey4(id) );
+ }
+
+ KeyScheme = "Standard Key Scheme";
+ KeySet = "Keys";
+ }
+
+ //kdDebug(125) << "KKeyModule::init() - Read current key bindings from config." << endl;
+ //actions.readActions( KeySet );
+
+ sFileList = new QStringList();
+ sList = new QListBox( this );
+
+ //readSchemeNames();
+ sList->setCurrentItem( 0 );
+ connect( sList, SIGNAL( highlighted( int ) ),
+ SLOT( slotPreviewScheme( int ) ) );
+
+ QLabel *label = new QLabel( sList, i18n("&Key Scheme"), this );
+
+ wtstr = i18n("Here you can see a list of the existing key binding schemes with 'Current scheme'"
+ " referring to the settings you are using right now. Select a scheme to use, remove or"
+ " change it.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( sList, wtstr );
+
+ addBt = new QPushButton( i18n("&Save Scheme..."), this );
+ connect( addBt, SIGNAL( clicked() ), SLOT( slotAdd() ) );
+ QWhatsThis::add(addBt, i18n("Click here to add a new key bindings scheme. You will be prompted for a name."));
+
+ removeBt = new QPushButton( i18n("&Remove Scheme"), this );
+ removeBt->setEnabled(FALSE);
+ connect( removeBt, SIGNAL( clicked() ), SLOT( slotRemove() ) );
+ QWhatsThis::add( removeBt, i18n("Click here to remove the selected key bindings scheme. You can not"
+ " remove the standard system wide schemes, 'Current scheme' and 'KDE default'.") );
+
+ // Hack to get this setting only displayed once. It belongs in main.cpp instead.
+ // That move will take a lot of UI redesigning, though, so i'll do it once CVS
+ // opens up for feature commits again. -- ellis
+ /* Needed to remove because this depended upon non-BC changes in KeyEntry.*/
+ // If this is the "Global Keys" section of the KDE Control Center:
+ if( isGlobal && !bSeriesOnly ) {
+ preferMetaBt = new QCheckBox( i18n("Prefer 4-modifier defaults"), this );
+ if( !KKeySequence::keyboardHasMetaKey() )
+ preferMetaBt->setEnabled( false );
+ preferMetaBt->setChecked( KKeySequence::useFourModifierKeys() );
+ connect( preferMetaBt, SIGNAL(clicked()), SLOT(slotPreferMeta()) );
+ QWhatsThis::add( preferMetaBt, i18n("If your keyboard has a Meta key, but you would "
+ "like KDE to prefer the 3-modifier configuration defaults, then this option "
+ "should be unchecked.") );
+ } else
+ preferMetaBt = 0;
+
+ KSeparator* line = new KSeparator( KSeparator::HLine, this );
+
+ kc = new KeyChooserSpec( actions, this, isGlobal );
+ connect( kc, SIGNAL(keyChange()), this, SLOT(slotKeyChange()) );
+
+ readScheme();
+
+ QGridLayout *topLayout = new QGridLayout( this, 6, 2,
+ KDialog::marginHint(),
+ KDialog::spacingHint());
+ topLayout->addWidget(label, 0, 0);
+ topLayout->addMultiCellWidget(sList, 1, 2, 0, 0);
+ topLayout->addWidget(addBt, 1, 1);
+ topLayout->addWidget(removeBt, 2, 1);
+ if( preferMetaBt )
+ topLayout->addWidget(preferMetaBt, 3, 0);
+ topLayout->addMultiCellWidget(line, 4, 4, 0, 1);
+ topLayout->addRowSpacing(3, 15);
+ topLayout->addMultiCellWidget(kc, 5, 5, 0, 1);
+
+ setMinimumSize(topLayout->sizeHint());
+}
+
+KKeyModule::~KKeyModule (){
+ //kdDebug() << "KKeyModule destructor" << endl;
+ delete kc;
+ delete sFileList;
+}
+
+bool KKeyModule::writeSettings( const QString& sGroup, KConfig* pConfig )
+{
+ kc->commitChanges();
+ actions.writeActions( sGroup, pConfig, true, false );
+ return true;
+}
+
+bool KKeyModule::writeSettingsGlobal( const QString& sGroup )
+{
+ kc->commitChanges();
+ actions.writeActions( sGroup, 0, true, true );
+ return true;
+}
+
+void KKeyModule::load()
+{
+ kc->listSync();
+}
+
+/*void KKeyModule::save()
+{
+ if( preferMetaBt )
+ KKeySequence::useFourModifierKeys( preferMetaBt->isChecked() );
+
+ kc->commitChanges();
+ actions.writeActions( KeySet, 0, true, true );
+ if ( KeyType == "global" ) {
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ // TODO: create a reconfigureKeys() method.
+ kapp->dcopClient()->send("kwin", "", "reconfigure()", "");
+ kapp->dcopClient()->send("kdesktop", "", "configure()", "");
+ kapp->dcopClient()->send("kicker", "Panel", "configure()", "");
+ }
+}*/
+
+void KKeyModule::defaults()
+{
+ if( preferMetaBt )
+ preferMetaBt->setChecked( false );
+ KKeySequence::useFourModifierKeys( false );
+ kc->allDefault();
+}
+
+/*void KKeyModule::slotRemove()
+{
+ QString kksPath =
+ KGlobal::dirs()->saveLocation("data", "kcmkeys/" + KeyType);
+
+ QDir d( kksPath );
+ if (!d.exists()) // what can we do?
+ return;
+
+ d.setFilter( QDir::Files );
+ d.setSorting( QDir::Name );
+ d.setNameFilter("*.kksrc");
+
+ uint ind = sList->currentItem();
+
+ if ( !d.remove( *sFileList->at( ind ) ) ) {
+ KMessageBox::sorry( 0,
+ i18n("This key scheme could not be removed.\n"
+ "Perhaps you do not have permission to alter the file "
+ "system where the key scheme is stored." ));
+ return;
+ }
+
+ sList->removeItem( ind );
+ sFileList->remove( sFileList->at(ind) );
+}*/
+
+void KKeyModule::slotKeyChange()
+{
+ emit keyChange();
+ //emit keysChanged( &dict );
+}
+
+/*void KKeyModule::slotSave( )
+{
+ KSimpleConfig config(*sFileList->at( sList->currentItem() ) );
+ // global=true is necessary in order to
+ // let both 'Global Shortcuts' and 'Shortcut Sequences' be
+ // written to the same scheme file.
+ kc->commitChanges();
+ actions.writeActions( KeyScheme, &config, KeyType == "global", KeyType == "global" );
+}*/
+
+void KKeyModule::slotPreferMeta()
+{
+ kc->setPreferFourModifierKeys( preferMetaBt->isChecked() );
+}
+
+void KKeyModule::readScheme( int index )
+{
+ kdDebug(125) << "readScheme( " << index << " )\n";
+ if( index == 1 )
+ kc->allDefault( false );
+ //else if( index == 2 )
+ // kc->allDefault( true );
+ else {
+ KConfigBase* config = 0;
+ if( index == 0 ) config = new KConfig( "kdeglobals" );
+ //else config = new KSimpleConfig( *sFileList->at( index ), true );
+
+ actions.readActions( (index == 0) ? KeySet : KeyScheme, config );
+ kc->listSync();
+ delete config;
+ }
+}
+
+/*void KKeyModule::slotAdd()
+{
+ QString sName;
+
+ if ( sList->currentItem() >= nSysSchemes )
+ sName = sList->currentText();
+ SaveScm ss( 0, "save scheme", sName );
+
+ bool nameValid;
+ QString sFile;
+ int exists = -1;
+
+ do {
+
+ nameValid = TRUE;
+
+ if ( ss.exec() ) {
+ sName = ss.nameLine->text();
+ if ( sName.stripWhiteSpace().isEmpty() )
+ return;
+
+ sName = sName.simplifyWhiteSpace();
+ sFile = sName;
+
+ int ind = 0;
+ while ( ind < (int) sFile.length() ) {
+
+ // parse the string for first white space
+
+ ind = sFile.find(" ");
+ if (ind == -1) {
+ ind = sFile.length();
+ break;
+ }
+
+ // remove from string
+
+ sFile.remove( ind, 1);
+
+ // Make the next letter upper case
+
+ QString s = sFile.mid( ind, 1 );
+ s = s.upper();
+ sFile.replace( ind, 1, s );
+
+ }
+
+ exists = -1;
+ for ( int i = 0; i < (int) sList->count(); i++ ) {
+ if ( sName.lower() == (sList->text(i)).lower() ) {
+ exists = i;
+
+ int result = KMessageBox::warningContinueCancel( 0,
+ i18n("A key scheme with the name '%1' already exists.\n"
+ "Do you want to overwrite it?\n").arg(sName),
+ i18n("Save Key Scheme"),
+ i18n("Overwrite"));
+ if (result == KMessageBox::Continue)
+ nameValid = true;
+ else
+ nameValid = false;
+ }
+ }
+ } else return;
+
+ } while ( nameValid == FALSE );
+
+ disconnect( sList, SIGNAL( highlighted( int ) ), this,
+ SLOT( slotPreviewScheme( int ) ) );
+
+
+ QString kksPath = KGlobal::dirs()->saveLocation("data", "kcmkeys/");
+
+ QDir d( kksPath );
+ if ( !d.exists() )
+ if ( !d.mkdir( kksPath ) ) {
+ qWarning("KKeyModule: Could not make directory to store user info.");
+ return;
+ }
+
+ kksPath += KeyType ;
+ kksPath += "/";
+
+ d.setPath( kksPath );
+ if ( !d.exists() )
+ if ( !d.mkdir( kksPath ) ) {
+ qWarning("KKeyModule: Could not make directory to store user info.");
+ return;
+ }
+
+ sFile.prepend( kksPath );
+ sFile += ".kksrc";
+ if (exists == -1)
+ {
+ sList->insertItem( sName );
+ sList->setFocus();
+ sList->setCurrentItem( sList->count()-1 );
+ sFileList->append( sFile );
+ }
+ else
+ {
+ sList->setFocus();
+ sList->setCurrentItem( exists );
+ }
+
+ KSimpleConfig *config =
+ new KSimpleConfig( sFile );
+
+ config->setGroup( KeyScheme );
+ config->writeEntry( "Name", sName );
+ delete config;
+
+ slotSave();
+
+ connect( sList, SIGNAL( highlighted( int ) ), this,
+ SLOT( slotPreviewScheme( int ) ) );
+
+ slotPreviewScheme( sList->currentItem() );
+}*/
+
+/*void KKeyModule::slotPreviewScheme( int indx )
+{
+ readScheme( indx );
+
+ // Set various appropriate for the scheme
+
+ if ( indx < nSysSchemes ||
+ (*sFileList->at(indx)).contains( "/global-" ) ||
+ (*sFileList->at(indx)).contains( "/app-" ) ) {
+ removeBt->setEnabled( FALSE );
+ } else {
+ removeBt->setEnabled( TRUE );
+ }
+}*/
+
+/*void KKeyModule::readSchemeNames( )
+{
+ QStringList schemes = KGlobal::dirs()->findAllResources("data", "kcmkeys/" + KeyType + "/*.kksrc");
+ //QRegExp r( "-kde[34].kksrc$" );
+ QRegExp r( "-kde3.kksrc$" );
+
+ sList->clear();
+ sFileList->clear();
+ sList->insertItem( i18n("Current Scheme"), 0 );
+ sFileList->append( "Not a kcsrc file" );
+ sList->insertItem( i18n("KDE Traditional"), 1 );
+ sFileList->append( "Not a kcsrc file" );
+ //sList->insertItem( i18n("KDE Extended (With 'Win' Key)"), 2 );
+ //sList->insertItem( i18n("KDE Default for 4 Modifiers (Meta/Alt/Ctrl/Shift)"), 2 );
+ //sFileList->append( "Not a kcsrc file" );
+ nSysSchemes = 2;
+
+ // This for system files
+ for ( QStringList::ConstIterator it = schemes.begin(); it != schemes.end(); ++it) {
+ // KPersonalizer relies on .kksrc files containing all the keyboard shortcut
+ // schemes for various setups. It also requires the KDE defaults to be in
+ // a .kksrc file. The KDE defaults shouldn't be listed here.
+ //if( r.search( *it ) != -1 )
+ // continue;
+
+ KSimpleConfig config( *it, true );
+ // TODO: Put 'Name' in "Settings" group
+ config.setGroup( KeyScheme );
+ QString str = config.readEntry( "Name" );
+
+ sList->insertItem( str );
+ sFileList->append( *it );
+ }
+}*/
+
+/*void KKeyModule::updateKeys( const KAccelActions* map_P )
+ {
+ kc->updateKeys( map_P );
+ }*/
+
+// write all the global keys to kdeglobals
+// this is needed to be able to check for conflicts with global keys in app's keyconfig
+// dialogs, kdeglobals is empty as long as you don't apply any change in controlcenter/keys
+void KKeyModule::init()
+{
+ kdDebug(125) << "KKeyModule::init()\n";
+
+ /*kdDebug(125) << "KKeyModule::init() - Initialize # Modifier Keys Settings\n";
+ KConfigGroupSaver cgs( KGlobal::config(), "Keyboard" );
+ QString fourMods = KGlobal::config()->readEntry( "Use Four Modifier Keys", KAccel::keyboardHasMetaKey() ? "true" : "false" );
+ KAccel::useFourModifierKeys( fourMods == "true" );
+ bool bUseFourModifierKeys = KAccel::useFourModifierKeys();
+ KGlobal::config()->writeEntry( "User Four Modifier Keys", bUseFourModifierKeys ? "true" : "false", true, true );
+ */
+ KAccelActions* keys = new KAccelActions();
+
+ kdDebug(125) << "KKeyModule::init() - Load Included Bindings\n";
+// this should match the included files above
+#define NOSLOTS
+#define KShortcuts KAccelShortcuts
+#include "../../klipper/klipperbindings.cpp"
+#include "../../kwin/kwinbindings.cpp"
+#include "../../kicker/kicker/core/kickerbindings.cpp"
+#include "../../kicker/taskbar/taskbarbindings.cpp"
+#include "../../kdesktop/kdesktopbindings.cpp"
+#include "../../kxkb/kxkbbindings.cpp"
+#undef KShortcuts
+
+ kdDebug(125) << "KKeyModule::init() - Read Config Bindings\n";
+ keys->readActions( "Global Keys" );
+
+ {
+ KSimpleConfig cfg( "kdeglobals" );
+ cfg.deleteGroup( "Global Keys" );
+ }
+
+ kdDebug(125) << "KKeyModule::init() - Write Config Bindings\n";
+ keys->writeActions( "Global Keys", 0, true, true );
+}
+
+//-----------------------------------------------------------------
+// KeyChooserSpec
+//-----------------------------------------------------------------
+
+KeyChooserSpec::KeyChooserSpec( KAccelActions& actions, QWidget* parent, bool bGlobal )
+ : KKeyChooser( actions, parent, bGlobal, false, true ), m_bGlobal( bGlobal )
+ {
+ //if( global )
+ // globalDict()->clear(); // don't check against global keys twice
+ }
+
+/*void KeyChooserSpec::updateKeys( const KAccelActions* map_P )
+ {
+ if( global )
+ {
+ stdDict()->clear();
+ for( KAccelActions::ConstIterator gIt( map_P->begin());
+ gIt != map_P->end();
+ ++gIt )
+ {
+ int* keyCode = new int;
+ *keyCode = ( *gIt ).aConfigKeyCode;
+ stdDict()->insert( gIt.key(), keyCode);
+ }
+ }
+ else
+ {
+ globalDict()->clear();
+ for( KAccelActions::ConstIterator gIt( map_P->begin());
+ gIt != map_P->end();
+ ++gIt )
+ {
+ int* keyCode = new int;
+ *keyCode = ( *gIt ).aConfigKeyCode;
+ globalDict()->insert( gIt.key(), keyCode);
+ }
+ }
+ }
+*/
diff --git a/kcontrol/keys/keyconfig.h b/kcontrol/keys/keyconfig.h
new file mode 100644
index 000000000..cba853e4d
--- /dev/null
+++ b/kcontrol/keys/keyconfig.h
@@ -0,0 +1,90 @@
+//
+// KDE Shortcut config module
+//
+// Copyright (c) Mark Donohoe 1998
+// Copyright (c) Matthias Ettrich 1998
+// Converted to generic key configuration module, Duncan Haldane 1998.
+
+#ifndef __KEYCONFIG_H__
+#define __KEYCONFIG_H__
+
+#include <qpushbutton.h>
+#include <qlistbox.h>
+
+#include <kaccel.h>
+#include <kkeydialog.h>
+//#include <kcmodule.h>
+#include <qdict.h>
+
+class QCheckBox;
+
+class KeyChooserSpec;
+
+class KKeyModule : public QWidget
+{
+ Q_OBJECT
+public:
+ KAccelActions actions;
+ //KAccelActions dict;
+ KeyChooserSpec *kc;
+
+ KKeyModule( QWidget *parent, bool isGlobal, bool bSeriesOnly, bool bSeriesNone, const char *name = 0 );
+ KKeyModule( QWidget *parent, bool isGlobal, const char *name = 0 );
+ ~KKeyModule ();
+
+protected:
+ void init( bool isGlobal, bool bSeriesOnly, bool bSeriesNone );
+
+public:
+ virtual void load();
+ //virtual void save();
+ virtual void defaults();
+ static void init();
+
+ bool writeSettings( const QString& sGroup, KConfig* pConfig );
+ bool writeSettingsGlobal( const QString& sGroup );
+
+public slots:
+ //void slotPreviewScheme( int );
+ //void slotAdd();
+ //void slotSave();
+ //void slotRemove();
+ void slotKeyChange();
+ void slotPreferMeta();
+ //void updateKeys( const KAccelActions* map_P );
+ //void readSchemeNames();
+
+signals:
+ void keyChange();
+ //void keysChanged( const KAccelActions* map_P );
+
+protected:
+ QListBox *sList;
+ QStringList *sFileList;
+ QPushButton *addBt;
+ QPushButton *removeBt;
+ QCheckBox *preferMetaBt;
+ int nSysSchemes;
+ bool bSeriesOnly;
+
+ void readScheme( int index=0 );
+
+ QString KeyType;
+ QString KeyScheme;
+ QString KeySet;
+
+};
+
+class KeyChooserSpec : public KKeyChooser
+{
+ Q_OBJECT
+public:
+ KeyChooserSpec( KAccelActions& actions, QWidget* parent,
+ bool bGlobal );
+ //void updateKeys( const KAccelActions* map_P );
+protected:
+ bool m_bGlobal;
+};
+
+#endif
+
diff --git a/kcontrol/keys/keys.desktop b/kcontrol/keys/keys.desktop
new file mode 100644
index 000000000..b39bab385
--- /dev/null
+++ b/kcontrol/keys/keys.desktop
@@ -0,0 +1,239 @@
+[Desktop Entry]
+Exec=kcmshell keys
+Icon=key_bindings
+Type=Application
+DocPath=kcontrol/keys/index.html
+
+
+X-KDE-Library=keys
+X-KDE-Init=keys
+X-KDE-ParentApp=kcontrol
+
+Name=Keyboard Shortcuts
+Name[af]=Sleutelbord Kortpaaie
+Name[ar]=إختصارات لوحة المفاتيح
+Name[az]=Klaviatura Qısa Yolları
+Name[be]=Клавіятурныя скароты
+Name[bg]=Бързи клавиши
+Name[bn]=কীবোর্ড শর্টকাট
+Name[br]=Berradennoù ar stokellaoueg
+Name[bs]=Prečice tastature
+Name[ca]=Dreceres de teclat
+Name[cs]=Klávesové zkratky
+Name[csb]=Klawiszowé skrodzënë
+Name[cy]=Llwybrau Byr Bysellfwrdd
+Name[da]=Tastaturgenveje
+Name[de]=Tastenkürzel
+Name[el]=Συντομεύσεις πληκτρολογίου
+Name[eo]=Klavkombinoj
+Name[es]=Accesos rápidos de teclado
+Name[et]=Kiirklahvid
+Name[eu]=Laster-teklak
+Name[fa]=میان‌برهای صفحه‌ کلید
+Name[fi]=Näppäimistön pikavalinnat
+Name[fr]=Raccourcis clavier
+Name[fy]=Fluchtoetsen
+Name[ga]=Aicearraí Méarchláir
+Name[gl]=Atallos de Teclado
+Name[he]=קיצורי מקשים
+Name[hi]=कुंजीपट शॉर्टकट
+Name[hr]=Prečaci tipkovnice
+Name[hu]=Billentyűparancsok
+Name[is]=Flýtilyklar
+Name[it]=Scorciatoie della tastiera
+Name[ja]=キーボードショートカット
+Name[ka]=კლავიშების მალსახმობი
+Name[kk]=Перне тіркесімдер
+Name[km]=ផ្លូវកាត់​ក្ដារចុច
+Name[ko]=키보드 단축키
+Name[lo]=ການຈັດວາງແປ້ນພິມ
+Name[lt]=Spartieji klavišai
+Name[lv]=Tastatūras saīsnes
+Name[mk]=Кратенки на тастатурата
+Name[mn]=Гарын богино товчилуур
+Name[ms]=Jalan Pintas Papan Kekunci
+Name[mt]=Taqsiriet tat-tastiera
+Name[nb]=Hurtigtaster
+Name[nds]=Tastkombinatschonen
+Name[ne]=कुञ्जीपाटी सर्टकट
+Name[nl]=Sneltoetsen
+Name[nn]=Snøggtastar
+Name[nso]=Ditselakopana tsa Keyboard
+Name[pa]=ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ
+Name[pl]=Skróty klawiszowe
+Name[pt]=Atalhos do Teclado
+Name[pt_BR]=Atalhos de teclado
+Name[ro]=Acceleratori de tastatură
+Name[ru]=Комбинации клавиш
+Name[rw]=Amahinanzira ya Mwandikisho
+Name[se]=Jođánisboalut
+Name[sk]=Klávesové skratky
+Name[sl]=Bližnjice na tipkovnici
+Name[sr]=Пречице са тастатуре
+Name[sr@Latn]=Prečice sa tastature
+Name[sv]=Snabbtangenter
+Name[ta]=விசைப்பலகை குறுக்கு வழிகள்
+Name[te]=కీబొర్డ్ శీఘ్రమార్గాలు
+Name[tg]=Забонаки кнопкаҳои тез
+Name[th]=ปุ่มพิมพ์ลัด
+Name[tr]=Klavye Kısayolları
+Name[tt]=Töylek Qısqartmaları
+Name[uk]=Скорочення клавіатури
+Name[uz]=Tugmalar birikmasi
+Name[uz@cyrillic]=Тугмалар бирикмаси
+Name[ven]=Tshikhau tsha khiibodo
+Name[vi]=Gõ tắt trên Bàn phím
+Name[wa]=Rascourtis taprece
+Name[xh]=Indlela ezimfutshane Zebhodi yezitshixo
+Name[zh_CN]=键盘快捷键
+Name[zh_TW]=鍵盤捷徑
+Name[zu]=Izindlela Ezimfushane zebhodi yokhiye
+
+Comment=Configuration of keybindings
+Comment[af]=Opstelling van sleutel bindinge
+Comment[az]=Düymə bağlarının quraşdırılması
+Comment[be]=Настаўленні клавішных скаротаў
+Comment[bg]=Настройване на бързите клавиши
+Comment[bn]=কী-বাইন্ডিং কনফিগারেশন
+Comment[br]=Kefluniañ ereoù stokell
+Comment[bs]=Podešavanje značenja tipki
+Comment[ca]=Configuració dels lligams de tecles
+Comment[cs]=Nastavení klávesových zkratek
+Comment[csb]=Nastôw klawiszowëch skrodzënów
+Comment[cy]=Furfweddiad o rwymiadau bysell
+Comment[da]=Indstilling af tastebindinger
+Comment[de]=Einrichtung von Tastenzuordnungen
+Comment[el]=Ρύθμιση συνδυασμών πλήκτρων
+Comment[eo]=Agordo de klavsignifoj, klavkombinoj
+Comment[es]=Configuración de las asociaciones de las teclas
+Comment[et]=Kiirklahvide seadistamine
+Comment[eu]=Tekla elkarketen konfigurazioa
+Comment[fa]=پیکربندی مقیدسازیهای کلید
+Comment[fi]=Näppäinsidosten asetukset
+Comment[fr]=Configuration des raccourcis clavier
+Comment[fy]=Ynstellings foar fluchtoetsen
+Comment[gl]=Configuración dos atallos de teclado
+Comment[he]=שינוי הגדרות מיפוי המקשים
+Comment[hi]=की-बाइंडिंग का कॉन्फ़िगरेशन
+Comment[hr]=Konfiguriranje prečaca tipkovnice
+Comment[hu]=A billentyűparancsok beállításai
+Comment[id]=Konfigurasi keybindings
+Comment[is]=Stillingar altækra flýtihnappa
+Comment[it]=Configurazione delle associazioni di tasti
+Comment[ja]=キーバインディングの設定
+Comment[ka]=კლავიშთა წყვილების კონფიგურაცია
+Comment[kk]=Перне тіркесімдерді баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ការ​ចង​គ្រាប់ចុច
+Comment[ko]=키 바인딩 설정
+Comment[lo]=ປັບແຕ່ງການຈັບຄູ່ປຸ່ມພິມ
+Comment[lt]=Klavišų siečių derinimas
+Comment[lv]=Taustiņsasaistes konfigurēšana
+Comment[mk]=Конфигурација на врски меѓу копчиња и акции
+Comment[mn]=Товчилуур холболтын тохируулга
+Comment[ms]=Konfigurasi untuk pengikatan kekunci
+Comment[mt]=Konfigurazzjoni ta' assoċjazzjonijiet tat-tasti
+Comment[nb]=Oppsett av hurtigtaster
+Comment[nds]=Instellen vun Tastkombinatschonen
+Comment[ne]=कुञ्जी बाइन्डिङहरूको कन्फिगरेसन
+Comment[nl]=Instellingen voor sneltoetsen
+Comment[nn]=Oppsett av snøggtastar
+Comment[nso]=Peakanyo ya ditlemaganyo tsa dinotlelo
+Comment[oc]=Configuracion dèus lligams de tecles
+Comment[pa]=ਕੀਬਾਇਡ ਦੀ ਸੰਰਚਨਾ
+Comment[pl]=Ustawienia skrótów klawiszowych
+Comment[pt]=Configuração das teclas
+Comment[pt_BR]=Configuração dos atalhos de teclado
+Comment[ro]=Configurează asocierile de taste
+Comment[ru]=Настройка комбинаций клавиш
+Comment[rw]=Iboneza ry'amahuza-buto
+Comment[se]=Jođánisboaluid heiveheapmi
+Comment[sk]=Konfigurácia globálnych klávesových skratiek
+Comment[sl]=Nastavitve tipkovnih vezi
+Comment[sr]=Подешавање пречица са тастатуре
+Comment[sr@Latn]=Podešavanje prečica sa tastature
+Comment[sv]=Anpassa kortkommandon
+Comment[ta]=விசைசேர்வுகளுக்கான வடிவமைப்பு
+Comment[tg]=Танзими аъмоли калидҳо
+Comment[th]=ปรับแต่งปุ่มพิมพ์ลัด
+Comment[tr]=Tuş bağıntılarının yapılandırılması
+Comment[tt]=Töymä berläşmälären caylaw
+Comment[uk]=Налаштування прив'язок клавіш
+Comment[uz]=Tugmalar birikmasini moslash
+Comment[uz@cyrillic]=Тугмалар бирикмасини мослаш
+Comment[ven]=Nzudzanyo yau tanganyisa dzikhii
+Comment[vi]=Cấu hình các tổ hợp phím
+Comment[wa]=Apontiaedje des rascourtis di tapes
+Comment[xh]=Uqwalaselo lwezibopheleo zesitshixo
+Comment[zh_CN]=键绑定配置
+Comment[zh_TW]=按鍵關聯設定
+Comment[zu]=Inhlanganiselo yezibopho zokhiye
+
+Keywords=Keys,Global key bindings,Key scheme,Key bindings,shortcuts,application shortcuts
+Keywords[af]=Keys,Global sleutel bindings,sleutel scheme,sleutel bindings,kortpaaie,application kortpaaie
+Keywords[ar]=مفايتح، مفاتيح الاختصارات العامّة، خريطة المفاتيح، مفاتيح الاختصارات، اختصارات، اختصارات تطبيقات
+Keywords[az]=düymələr,Qlobal Düymə bağlantıları,Düymə planı,düymə bağlamaları,qısa yollar,proqram qısa yolları
+Keywords[be]=Клавішы,Глабальныя скароты,Схема клавішаў,Скароты,Скароты праграмы,Keys,Global key bindings,Key scheme,Key bindings,shortcuts,application shortcuts
+Keywords[bg]=бърз, клавиш, бързи, достъп, клавишна, комбинация, Keys, Global key bindings, Key scheme, Key bindings, shortcuts, application shortcuts
+Keywords[ca]=Tecles,lligams de tecles globals,Esquema de tecla,Lligams de tecles,dreceres,dreceres d'aplicació
+Keywords[cs]=Klávesy,Globální klávesové zkratky,Schéma kláves,Klávesové zkratky,Zkratky,Aplikační zkratky,Vazby,Klávesové vazby
+Keywords[csb]=Klawisze,globalné klawiszowé skrodzënë,schematë skrodzënów,sparłączenia klawiszów,skrodzënë dlô programów
+Keywords[cy]=Bysell,Rhwymiadau bysell eang,Cynllun bysell,Llwybrau byr,Llwybrau byr y rhaglen
+Keywords[da]=Taster,Globale tastebindinger,Tastesystem,Tastebindinger,genveje,programgenveje
+Keywords[de]=Tasten,Tastenzuordnung,Tastenkürzel,Kurzbefehle,Tastenschema,Tastaturlayout
+Keywords[el]=Πλήκτρα,Καθολικοί συνδυασμοί πλήκτρων,Θέμα πλήκτρων,Συνδυασμοί πλήκτρων,συντομεύσεις,συντομεύσεις εφαρμογών
+Keywords[eo]=klavoj,malloka,signifoj,asocioj,kombinoj,klavkombinoj
+Keywords[es]=Teclas,Asociaciones de teclas globales,Esquema de teclas,Asociaciones de teclas,accesos directos,accesos directos de aplicaciones
+Keywords[et]=klahvid,globaalsed kiirklahvid,klahviskeem,kiirklahvid,klahvide seosed,rakenduste kiirklahvid
+Keywords[eu]=Teklak,tekla elkarketa globalak,teklen eskema,tekla elkarketak lasterbideak,aplikazio lasterbideak
+Keywords[fa]=کلیدها، مقیدسازیهای کلید سراسری، طرحوارۀ کلید، مقیدسازیهای کلید، میان‌برها، میان‌برهای کاربرد
+Keywords[fi]=Näppäimet,Yleiset näppäinsidokset,Näppäinteema,Näppäinsidokset,pikavalinnat,sovellusten pikavalinnat
+Keywords[fr]=touches,raccourcis globaux,modèle de raccourcis,raccourcis clavier,clavier,raccourcis d'applications,applications,raccourcis communs
+Keywords[fy]=keys,toetsen,toetsyndielingen,toetsbiningen,key bindings,fluchtoetsen,globaal
+Keywords[gl]=Teclas,Atallos de teclado globais,Esquema de teclas,Atallos de teclado,combinacións de teclas,atallos de aplicacións
+Keywords[he]=מקשים,מיפוי מקשים גלובליים,תצורת מקשים,מיפוי מקשים,קיצורי דרך,קיצורי דרך של יישומים, Keys,Global key bindings,Key scheme,Key bindings,shortcuts,application shortcuts
+Keywords[hi]=कुंजियाँ,ग्लोबल की-बाइंडिंग्स,कुंजी योजना,की-बाइंडिंग्स,शॉर्टकट्स,अनुप्रयोग शॉर्टकट्स
+Keywords[hr]=Keys,Global key bindings,Key scheme,Key bindings,shortcuts,application shortcuts,Tipke,Prečaci tipkovnice,Raspored tipki,prečaci,prečaci aplikacija
+Keywords[hu]=billentyűk,globális billentyűhozzárendelés,billentyűkiosztás,billentyűparancsok,gyorsbillentyűk
+Keywords[id]=Keys,Key bindings Global,Key sheme,Key bindings,shortcuts,application shortcuts
+Keywords[is]=Lyklar,Hnappar,Flýtihnappar,Flýtilyklar,Lyklabindingar
+Keywords[it]=tasti,associazioni globali di tasti,schema di tasti,associazioni di tasti,scorciatoie,scorciatoie delle applicazioni
+Keywords[ja]=キー,グローバルキー,キーバインド,Key sheme,キーバインド,ショートカット,アプリケーションショートカット
+Keywords[km]=គ្រាប់ចុច,ការ​ចង​គ្រាប់ចុច​សកល,គំនូរ​បំព្រួញ​គ្រាប់ចុច,ការ​ចង​គ្រាប់ចុច,ផ្លូវកាត់,ផ្លូវកាត់​កម្មវិធី
+Keywords[lo]=ປຸ່ມພິມ,ປຸ່ມພິມສ່ວນກາງູ,ຊຸດປຸ່ມພິມ,ການຈັບຄູ່ປຸ່ມພິມ,ປຸ່ມພິມລັດ,ແປ້ນພິມລັດ,ປຸ່ມພິມລັດອະພລິເຄຊັນ
+Keywords[lt]=Keys,klavišai,Global key bindings,klavišų sietis,Key scheme,klavišų schema,klavišų išdėstymas,Key bindings,shortcuts,spartieji klavišai,application shortcuts,programų spartieji klavišai
+Keywords[lv]=Taustiņi,Globālās taustiņu sasaistes,Taustiņu shēma,Taustiņu sasaistes,īsinājumikonas,aplikāciju īsinājumikonas
+Keywords[mk]=Keys,Global key bindings,Key scheme,Key bindings,shortcuts,application shortcuts,Копчиња,Глобални врски на копчиња,Шема на копчиња,Врски на копчиња,кратенки,апликациони кратенки
+Keywords[mn]=Товчилуур,Товчилуур холболт,Богино товчилуур, Богино тушаал,Товчилуурын схем,Гарын байрлал
+Keywords[nb]=taster,generelle hurtigtaster,hurtigtaster,snarveier,programsnarveier
+Keywords[nds]=Tasten,Globale Tastkombinatschonen,Tastschema,Tastkombinatschonen,Programmtasten
+Keywords[ne]=कुञ्जी, विश्वब्यापी कुञ्जी बाइन्डिङ, कुञ्जी योजना, कुञ्जी बाइन्डिङ, सर्टकट, अनुप्रयोग सर्टकट
+Keywords[nl]=keys,toetsen,toetsenindeling,toetsenbindingen,key bindings,sneltoetsen,globale toetsenbindingen
+Keywords[nn]=tastar,globale snøggtastar,tasteoppsett,snøggtastar,snarvegar,programsnarvegar
+Keywords[nso]=Dinotlelo,Ditlemo tsa dinotlelo tsa boditshabatshaba,Leano la dinotlelo, Ditselakopana,ditselakopana tsa tshomiso
+Keywords[pl]=Klawisze,globalne skróty klawiszowe,schematy skrótów,powiązania klawiszów,skróty dla programów
+Keywords[pt]=teclas,teclas globais,esquema de teclas,atribuições de teclas,atalhos,atalhos da aplicação
+Keywords[pt_BR]=Teclas,Teclas de atalho globais,esquema de teclado,teclas de atalho,atalhos de aplicativos
+Keywords[ro]=taste,asocieri globale de taste,schemă taste,asocieri taste,acceleratori,acceleratori aplicații,scurtături
+Keywords[ru]=Keys,Global key bindings,Key scheme,Key bindings,shortcuts,application shortcuts,клавиши,комбинации клавиш
+Keywords[rw]=Buto,Amahuza buto rusange,Igishushanyombonera cya buto,Amahuza buto,amahinanzira, amahinanzira ya porogaramu
+Keywords[se]=boalut,oppalaš jođánisboalut,boalločoahkádusat,boalločatnasat,njuolgobálgát,prográmmanjuolgabálgát
+Keywords[sk]=Klávesy,Globálne klávesové skratky,schéma kláves,klávesové skratky
+Keywords[sl]=tipke,globalne vezi tipk,razporeditev tipk,vezi tipk,tipkovne vezi
+Keywords[sr]=Keys,Global key bindings,Key scheme,Key bindings,shortcuts,application shortcuts,тастери,глобални тастери,пречица,шема тастера,пречице,програмске пречице
+Keywords[sr@Latn]=Keys,Global key bindings,Key scheme,Key bindings,shortcuts,application shortcuts,tasteri,globalni tasteri,prečica,šema tastera,prečice,programske prečice
+Keywords[sv]=Tangenter,Globala kortkommandon,bindningar,Tangentbindningar,genvägar,programgenvägar
+Keywords[ta]=விசைகள்,உலகலாவிய விசை பிணைப்புகள்,விசை திட்டம்,விசை பிணைப்புகள்,குறுக்குவழிகள்,பயன்பாட்டுக் குறுக்குவழிகள்
+Keywords[th]=ปุ่มพิมพ์,ปุ่มพิมพ์ส่วนกลาง,ชุดปุ่มพิมพ์,การจับคู่ปุ่มพิมพ์,ปุ่มพิมพ์ลัด,แป้นพิมพ์ลัด,ปุ่มพิมพ์ลัดแอพพลิเคชัน
+Keywords[tr]=tuşlar,Küresel Tuş bağlantıları,Tuş planı,tuş bağlamaları,kısayollar,uygulama kısayolları
+Keywords[uk]=клавіші,глобальні прив'язки клавіш,схема клавіш,прив'язка клавіш
+Keywords[uz]=Tugmalar,Umumiy tugmalar birikmasi,Tugma qolipi,Tugmalar birikmasi,tugma va dastur birikmasi
+Keywords[uz@cyrillic]=Тугмалар,Умумий тугмалар бирикмаси,Тугма қолипи,Тугмалар бирикмаси,тугма ва дастур бирикмаси
+Keywords[ven]=Dzikhii,u badekanywa ha khii dzothe,tshikimu tsha khii,u badekanywa ha khii,tshikhau,tshikhau tsha apulifikhesheni
+Keywords[vi]=Phím,tổ hợp phím toàn cục,phối hợp phím,gõ tắt với tổ hợp phím,gõ tắt cho ứng dụng
+Keywords[wa]=tapes,globås rascourtis di tapes,adjinçmint del taprece,rascourtis di tapes,rascourtis,rascourtis d' programes
+Keywords[xh]=Izitshixo,Izibophelelo zesitshixo esiNgqukuva,Udweliso lwesitshixo,Izibophelelo zesitshixo,iindlela ezimfutshane,izicelo zeendlela ezimfutshane
+Keywords[zh_CN]=Keys,Global key bindings,Key scheme,Key bindings,shortcuts,application shortcuts,键,全局键绑定,键盘布局,键绑定,快捷键,程序快捷键
+Keywords[zh_TW]=Keys,Global key bindings,Key scheme,Key bindings,shortcuts,application shortcuts,按鍵,全域按建連結,鍵盤配置,按鍵連結,快速鍵,應用程式捷徑
+Keywords[zu]=Okhiye,Izibopho zokhiye zezizwe,Iplani lokhiye,Izibopho zokhiye,izindlela ezimfushane,izindlela ezimfushane zomyaleli
+
+Categories=Qt;KDE;X-KDE-settings-accessibility;
diff --git a/kcontrol/keys/khotkeys.cpp b/kcontrol/keys/khotkeys.cpp
new file mode 100644
index 000000000..869cab71a
--- /dev/null
+++ b/kcontrol/keys/khotkeys.cpp
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2000 Matthias Elter <elter@kde.org>
+ * Lubos Lunak <l.lunak@email.cz>
+ *
+ * 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 <klibloader.h>
+#include "khotkeys.h"
+
+extern "C"
+{
+ static void (*khotkeys_init_2)( void );
+ static void (*khotkeys_cleanup_2)( void );
+ static QString (*khotkeys_get_menu_entry_shortcut_2)( const QString& entry_P );
+ static QString (*khotkeys_change_menu_entry_shortcut_2)( const QString& entry_P,
+ const QString& shortcut_P );
+ static bool (*khotkeys_menu_entry_moved_2)( const QString& new_P, const QString& old_P );
+ static void (*khotkeys_menu_entry_deleted_2)( const QString& entry_P );
+}
+
+static bool khotkeys_present = false;
+static bool khotkeys_inited = false;
+
+bool KHotKeys::init()
+{
+ khotkeys_inited = true;
+ KLibrary* lib = KLibLoader::self()->library( "kcm_khotkeys.la" );
+ if( lib == NULL ) return false;
+
+ khotkeys_init_2 = ( void (*)(void)) ( lib->symbol( "khotkeys_init" ));
+ khotkeys_cleanup_2 = ( void (*)(void)) ( lib->symbol( "khotkeys_cleanup" ));
+ khotkeys_get_menu_entry_shortcut_2 =
+ ( QString (*)( const QString& ))
+ ( lib->symbol( "khotkeys_get_menu_entry_shortcut" ));
+ khotkeys_change_menu_entry_shortcut_2 =
+ ( QString (*)( const QString&, const QString& ))
+ ( lib->symbol( "khotkeys_change_menu_entry_shortcut" ));
+ khotkeys_menu_entry_moved_2 =
+ ( bool (*)( const QString&, const QString& ))
+ ( lib->symbol( "khotkeys_menu_entry_moved" ));
+ khotkeys_menu_entry_deleted_2 =
+ ( void (*)( const QString& ))
+ ( lib->symbol( "khotkeys_menu_entry_deleted" ));
+ if( khotkeys_init_2
+ && khotkeys_cleanup_2
+ && khotkeys_get_menu_entry_shortcut_2
+ && khotkeys_change_menu_entry_shortcut_2
+ && khotkeys_menu_entry_moved_2
+ && khotkeys_menu_entry_deleted_2 )
+ {
+ khotkeys_init_2();
+ khotkeys_present = true;
+ return true;
+ }
+ return false;
+}
+
+void KHotKeys::cleanup()
+{
+ if( khotkeys_inited )
+ khotkeys_cleanup_2();
+ khotkeys_inited = false;
+}
+
+bool KHotKeys::present()
+{
+ if( !khotkeys_inited )
+ init();
+ return khotkeys_present;
+}
+
+QString KHotKeys::getMenuEntryShortcut( const QString& entry_P )
+{
+ if( !khotkeys_inited )
+ init();
+ if( !khotkeys_present )
+ return "";
+ return khotkeys_get_menu_entry_shortcut_2( entry_P );
+}
+
+QString KHotKeys::changeMenuEntryShortcut( const QString& entry_P,
+ const QString shortcut_P )
+ {
+ if( !khotkeys_inited )
+ init();
+ if( !khotkeys_present )
+ return "";
+ return khotkeys_change_menu_entry_shortcut_2( entry_P, shortcut_P );
+ }
+
+bool KHotKeys::menuEntryMoved( const QString& new_P, const QString& old_P )
+{
+ if( !khotkeys_inited )
+ init();
+ if( !khotkeys_present )
+ return "";
+ return khotkeys_menu_entry_moved_2( new_P, old_P );
+}
+
+void KHotKeys::menuEntryDeleted( const QString& entry_P )
+{
+ if( !khotkeys_inited )
+ init();
+ if( !khotkeys_present )
+ return;
+ khotkeys_menu_entry_deleted_2( entry_P );
+}
diff --git a/kcontrol/keys/khotkeys.h b/kcontrol/keys/khotkeys.h
new file mode 100644
index 000000000..90ea17985
--- /dev/null
+++ b/kcontrol/keys/khotkeys.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2000 Matthias Elter <elter@kde.org>
+ * Lubos Lunak <l.lunak@email.cz>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef __khotkeys_public_h__
+#define __khotkeys_public_h__
+
+#include <qstring.h>
+
+// see kdebase/khotkeys/kcontrol for info on these
+
+class KHotKeys
+{
+public:
+ static bool init();
+ static void cleanup();
+ static bool present();
+ static QString getMenuEntryShortcut( const QString& entry_P );
+ static QString changeMenuEntryShortcut( const QString& entry_P,
+ const QString shortcut_P );
+ static bool menuEntryMoved( const QString& new_P, const QString& old_P );
+ static void menuEntryDeleted( const QString& entry_P );
+};
+
+#endif
diff --git a/kcontrol/keys/mac4.kksrc b/kcontrol/keys/mac4.kksrc
new file mode 100644
index 000000000..0968a2472
--- /dev/null
+++ b/kcontrol/keys/mac4.kksrc
@@ -0,0 +1,197 @@
+[Settings]
+Name=Mac Scheme
+Name[af]=Mac Tema
+Name[be]=Схема Mac
+Name[bg]=Mac
+Name[bn]=ম্যাক্ স্কীম
+Name[br]=Steuñv Mac
+Name[bs]=Mac šema
+Name[ca]=Esquema Mac
+Name[cs]=Mac schéma
+Name[csb]=Mòtiw Mac-a
+Name[cy]=Cynllun Mac
+Name[da]=Mac-system
+Name[de]=Mac-Design
+Name[el]=Μορφή Mac
+Name[eo]=Makintoŝa aranĝo
+Name[es]=Tema Mac
+Name[et]=Maci skeem
+Name[eu]=Mac eskema
+Name[fa]=طرحوارۀ مکینتاش
+Name[fi]=Mac-skeema
+Name[fr]=Thème Mac
+Name[fy]=Mac-skema
+Name[ga]=Scéim Mac
+Name[gl]=Esquema Mac
+Name[he]=ערכת Mac
+Name[hr]=Mac shema
+Name[hu]=Mac
+Name[id]=Skema Mac
+Name[is]=Mac þema
+Name[it]=Schema Mac
+Name[ja]=Macintosh スキーマ
+Name[ka]=Mac სქემა
+Name[kk]=Mac сұлбасы
+Name[km]=គំនូរ​បំព្រួញ Mac
+Name[ko]=Mac 배열
+Name[lo]=ຊຸດຮູບແບບ Mac
+Name[lt]=Mac schema
+Name[mk]=Mac-шема
+Name[mn]=Mac-Схем
+Name[nb]=Mac-oppsett
+Name[nds]=Mac-Vörbild
+Name[ne]=म्याक योजना
+Name[nl]=Mac-schema
+Name[nn]=Mac-oppsett
+Name[nso]=Leano la Mac
+Name[pa]=Mac ਸਰੂਪ
+Name[pl]=Motyw Mac-a
+Name[pt]=Esquema do Mac
+Name[pt_BR]=Esquema Mac
+Name[ro]=Schemă Mac
+Name[ru]=Mac
+Name[rw]=Igishushanyombonera Mac
+Name[se]=Mac-coakkáldat
+Name[sk]=Mac schéma
+Name[sl]=Shema Mac
+Name[sr]=Mac-ова шема
+Name[sr@Latn]=Mac-ova šema
+Name[sv]=Mac schema
+Name[th]=ใช้แบบของ MAC
+Name[tr]=Mac Şeması
+Name[tt]=Mac buyınça
+Name[uk]=Схема Макінтошу
+Name[uz]=Mac mavzusi
+Name[uz@cyrillic]=Mac мавзуси
+Name[ven]=Tshikimu tsha Mac
+Name[vi]=Phối hợp của Mac
+Name[wa]=Tinme Mac
+Name[xh]=Udweliso lwe Mac
+Name[zh_CN]=Mac 方案
+Name[zh_TW]=Mac 按鍵配置
+Name[zu]=Iplani le-Mac
+Uses Win Modifier=true
+
+[Global Shortcuts]
+Desktop Screenshot=Ctrl+Shift+3
+Enable/Disable Clipboard Actions=Alt+Ctrl+X
+Run Command=Alt+F2
+Halt Computer=none
+Halt without Confirmation=none
+Kill Window=Alt+Ctrl+Escape
+Lock Session=Alt+Ctrl+L
+Logout=Alt+Ctrl+Delete
+Logout without Confirmation=none
+Manually Invoke Action on Current Clipboard=Alt+Ctrl+R
+Mouse Emulation=none
+Popup Launch Menu=Alt+F1
+Reboot Computer=none
+Reboot without Confirmation=none
+Show Klipper Popup-Menu=Alt+Ctrl+V
+Show Taskmanager=Ctrl+Escape
+Show Window List=Alt+F5
+Switch One Desktop Down=none
+Switch One Desktop to the Left=none
+Switch One Desktop to the Right=none
+Switch One Desktop Up=none
+Switch to Next Keyboard Layout=Alt+Ctrl+K
+Switch to Desktop 1=Ctrl+F1
+Switch to Desktop 10=Ctrl+F10
+Switch to Desktop 11=Ctrl+F11
+Switch to Desktop 12=Ctrl+F12
+Switch to Desktop 13=Ctrl+Shift+F1
+Switch to Desktop 14=Ctrl+Shift+F2
+Switch to Desktop 15=Ctrl+Shift+F3
+Switch to Desktop 16=Ctrl+Shift+F4
+Switch to Desktop 2=Ctrl+F2
+Switch to Desktop 3=Ctrl+F3
+Switch to Desktop 4=Ctrl+F4
+Switch to Desktop 5=Ctrl+F5
+Switch to Desktop 6=Ctrl+F6
+Switch to Desktop 7=Ctrl+F7
+Switch to Desktop 8=Ctrl+F8
+Switch to Desktop 9=Ctrl+F9
+Switch to Next Desktop=none
+Switch to Previous Desktop=none
+Toggle Showing Desktop=Alt+Ctrl+D
+Toggle Window Raise/Lower=Ctrl+E
+Walk Through Desktop List=none
+Walk Through Desktop List (Reverse)=none
+Walk Through Desktops=Alt+Tab
+Walk Through Desktops (Reverse)=Alt+Shift+Tab
+Walk Through Windows=Ctrl+Tab
+Walk Through Windows (Reverse)=Ctrl+Shift+Tab
+Window Close=Alt+F4
+Window Iconify=none
+Window Lower=none
+Window Maximize=none
+Window Maximize Horizontal=none
+Window Maximize Vertical=none
+Window Move=none
+Window Operations Menu=Alt+F3
+Window Raise=none
+Window Resize=none
+Window Screenshot=Ctrl+Shift+4
+Window Shade=none
+Window to Desktop 1=none
+Window to Desktop 10=none
+Window to Desktop 11=none
+Window to Desktop 12=none
+Window to Desktop 13=none
+Window to Desktop 14=none
+Window to Desktop 15=none
+Window to Desktop 16=none
+Window to Desktop 2=none
+Window to Desktop 3=none
+Window to Desktop 4=none
+Window to Desktop 5=none
+Window to Desktop 6=none
+Window to Desktop 7=none
+Window to Desktop 8=none
+Window to Desktop 9=none
+Window to Next Desktop=none
+Window to Previous Desktop=none
+
+[Shortcuts]
+AddBookmark=Ctrl+B
+Back=Alt+Left
+Close=Ctrl+W
+Copy=Ctrl+C
+Cut=Ctrl+X
+DeleteWordBack=Ctrl+Backspace
+DeleteWordForward=Ctrl+Delete
+Deselect=Ctrl+Shift+A
+End=Ctrl+End
+Find=Ctrl+F
+FindNext=Ctrl+G
+FindPrev=Ctrl+Shift+G
+Forward=Alt+Right
+GotoLine=none
+Help=F1
+Home=Ctrl+Home
+Insert=Ctrl+Insert
+New=Ctrl+N
+Next=Next
+NextCompletion=Ctrl+Down
+Open=Ctrl+O
+Paste=Ctrl+V
+PopupMenuContext=Menu
+PrevCompletion=Ctrl+Up
+Print=Ctrl+P
+Prior=Prior
+Quit=Ctrl+Q
+Redo=Ctrl+Shift+Z
+Reload=F5
+Replace=Ctrl+R
+RotateDown=Down
+RotateUp=Up
+Save=Ctrl+S
+SelectAll=Ctrl+A
+ShowMenubar=Ctrl+M
+SubstringCompletion=Ctrl+T
+TextCompletion=Ctrl+E
+Undo=Ctrl+Z
+Up=Alt+Up
+WhatsThis=Shift+F1
+ZoomIn=Ctrl+Plus
+ZoomOut=Ctrl+Minus
diff --git a/kcontrol/keys/main.cpp b/kcontrol/keys/main.cpp
new file mode 100644
index 000000000..c03c26f91
--- /dev/null
+++ b/kcontrol/keys/main.cpp
@@ -0,0 +1,203 @@
+/*
+ * main.cpp
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ *
+ * 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 <qlayout.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <ksimpleconfig.h>
+
+#include "commandShortcuts.h"
+#include "main.h"
+#include "modifiers.h"
+#include "shortcuts.h"
+#include "khotkeys.h"
+
+/*
+| Shortcut Schemes | Modifier Keys |
+
+o Current scheme o New scheme o Pre-set scheme
+| KDE Traditional |v|| <Save Scheme...> <Remove Scheme>
+[] Prefer 4-modifier defaults
+
+o Current scheme
+o New scheme <Save Scheme>
+o Pre-set scheme <Remove Scheme>
+ | KDE Traditional |v||
+[] Prefer 4-modifier defaults
+
+Global Shortcuts
+*/
+KeyModule::KeyModule( QWidget *parent, const char *name )
+: KCModule( parent, name )
+{
+ setQuickHelp( i18n("<h1>Keyboard Shortcuts</h1> Using shortcuts you can configure certain actions to be"
+ " triggered when you press a key or a combination of keys, e.g. Ctrl+C is normally bound to"
+ " 'Copy'. KDE allows you to store more than one 'scheme' of shortcuts, so you might want"
+ " to experiment a little setting up your own scheme, although you can still change back to the"
+ " KDE defaults.<p> In the 'Global Shortcuts' tab you can configure non-application-specific"
+ " bindings, like how to switch desktops or maximize a window; in the 'Application Shortcuts' tab"
+ " you will find bindings typically used in applications, such as copy and paste."));
+
+ initGUI();
+}
+
+KeyModule::~KeyModule()
+{
+ KHotKeys::cleanup();
+}
+
+void KeyModule::initGUI()
+{
+ m_pTab = new QTabWidget( this );
+ QVBoxLayout *l = new QVBoxLayout(this);
+ l->addWidget(m_pTab);
+
+ m_pShortcuts = new ShortcutsModule( this );
+ m_pTab->addTab( m_pShortcuts, i18n("Shortcut Schemes") );
+ connect( m_pShortcuts, SIGNAL(changed(bool)), SIGNAL(changed(bool)) );
+
+ m_pCommandShortcuts = new CommandShortcutsModule ( this );
+ m_pTab->addTab( m_pCommandShortcuts, i18n("Command Shortcuts") );
+ connect( m_pCommandShortcuts, SIGNAL(changed(bool)), SIGNAL(changed(bool)) );
+ connect( m_pTab, SIGNAL(currentChanged(QWidget*)), m_pCommandShortcuts, SLOT(showing(QWidget*)) );
+
+ m_pModifiers = new ModifiersModule( this );
+ m_pTab->addTab( m_pModifiers, i18n("Modifier Keys") );
+ connect( m_pModifiers, SIGNAL(changed(bool)), SIGNAL(changed(bool)) );
+}
+
+void KeyModule::load()
+{
+ load( false );
+}
+
+// Called when [Reset] is pressed
+void KeyModule::load( bool useDefaults )
+{
+ kdDebug(125) << "KeyModule::load()" << endl;
+ m_pShortcuts->load();
+ m_pCommandShortcuts->load();
+ m_pModifiers->load( useDefaults );
+
+ emit changed( useDefaults );
+}
+
+// When [Apply] or [OK] are clicked.
+void KeyModule::save()
+{
+ kdDebug(125) << "KeyModule::save()" << endl;
+ m_pShortcuts->save();
+ m_pCommandShortcuts->save();
+ m_pModifiers->save();
+}
+
+void KeyModule::defaults()
+{
+ kdDebug(125) << "KeyModule::defaults()" << endl;
+ m_pShortcuts->defaults();
+ m_pCommandShortcuts->defaults();
+ m_pModifiers->defaults();
+}
+
+void KeyModule::resizeEvent( QResizeEvent * )
+{
+ m_pTab->setGeometry( 0, 0, width(), height() );
+}
+
+//----------------------------------------------------
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_keys(QWidget *parent, const char * /*name*/)
+ {
+ // What does this do? Why not insert klipper and kxkb, too? --ellis, 2002/01/15
+ KGlobal::locale()->insertCatalogue("kwin");
+ KGlobal::locale()->insertCatalogue("kdesktop");
+ KGlobal::locale()->insertCatalogue("kicker");
+ return new KeyModule(parent, "kcmkeys");
+ }
+
+ KDE_EXPORT void initModifiers()
+ {
+ kdDebug(125) << "KeyModule::initModifiers()" << endl;
+
+ KConfigGroupSaver cgs( KGlobal::config(), "Keyboard" );
+ bool bMacSwap = KGlobal::config()->readBoolEntry( "Mac Modifier Swap", false );
+ if( bMacSwap )
+ ModifiersModule::setupMacModifierKeys();
+ }
+
+ KDE_EXPORT void init_keys()
+ {
+ kdDebug(125) << "KeyModule::init()\n";
+
+ /*kdDebug(125) << "KKeyModule::init() - Initialize # Modifier Keys Settings\n";
+ KConfigGroupSaver cgs( KGlobal::config(), "Keyboard" );
+ QString fourMods = KGlobal::config()->readEntry( "Use Four Modifier Keys", KAccel::keyboardHasMetaKey() ? "true" : "false" );
+ KAccel::useFourModifierKeys( fourMods == "true" );
+ bool bUseFourModifierKeys = KAccel::useFourModifierKeys();
+ KGlobal::config()->writeEntry( "User Four Modifier Keys", bUseFourModifierKeys ? "true" : "false", true, true );
+ */
+ KAccelActions* keys = new KAccelActions();
+
+ kdDebug(125) << "KeyModule::init() - Load Included Bindings\n";
+// this should match the included files above
+#define NOSLOTS
+#define SHIFT Qt::SHIFT
+#define CTRL Qt::CTRL
+#define ALT Qt::ALT
+#include "../../klipper/klipperbindings.cpp"
+#include "../../kwin/kwinbindings.cpp"
+#define KICKER_ALL_BINDINGS
+#include "../../kicker/kicker/core/kickerbindings.cpp"
+#include "../../kicker/taskbar/taskbarbindings.cpp"
+#include "../../kdesktop/kdesktopbindings.cpp"
+#include "../../kxkb/kxkbbindings.cpp"
+
+ // Write all the global keys to kdeglobals.
+ // This is needed to be able to check for conflicts with global keys in app's keyconfig
+ // dialogs, kdeglobals is empty as long as you don't apply any change in controlcenter/keys.
+ // However, avoid writing at every KDE startup, just update them after every rebuild of this file.
+ KConfigGroup group( KGlobal::config(), "Global Shortcuts" );
+ if( group.readEntry( "Defaults timestamp" ) != __DATE__ __TIME__ ) {
+ kdDebug(125) << "KeyModule::init() - Read Config Bindings\n";
+ // Check for old group,
+ if( KGlobal::config()->hasGroup( "Global Keys" ) ) {
+ keys->readActions( "Global Keys" );
+ KGlobal::config()->deleteGroup( "Global Keys", true, true );
+ }
+ keys->readActions( "Global Shortcuts" );
+ KGlobal::config()->deleteGroup( "Global Shortcuts", true, true );
+
+ kdDebug(125) << "KeyModule::init() - Write Config Bindings\n";
+ keys->writeActions( "Global Shortcuts", 0, true, true );
+ group.writeEntry( "Defaults timestamp", __DATE__ __TIME__, true, true );
+ }
+ delete keys;
+
+ initModifiers();
+ }
+}
+
+#include "main.moc"
diff --git a/kcontrol/keys/main.h b/kcontrol/keys/main.h
new file mode 100644
index 000000000..5cabba122
--- /dev/null
+++ b/kcontrol/keys/main.h
@@ -0,0 +1,57 @@
+/*
+ * main.h
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ *
+ * 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.
+ */
+
+#ifndef __keys_main_h
+#define __keys_main_h
+
+#include <qtabwidget.h>
+#include <kcmodule.h>
+
+class CommandShortcutsModule;
+class ShortcutsModule;
+class ModifiersModule;
+
+class KeyModule : public KCModule
+{
+ Q_OBJECT
+ public:
+ KeyModule( QWidget *parent, const char *name );
+ ~KeyModule();
+
+ void load();
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+
+ protected:
+ void initGUI();
+ void resizeEvent( QResizeEvent* );
+
+ private:
+ QTabWidget* m_pTab;
+ CommandShortcutsModule* m_pCommandShortcuts;
+ ShortcutsModule* m_pShortcuts;
+ ModifiersModule* m_pModifiers;
+};
+
+#endif
diff --git a/kcontrol/keys/modifiers.cpp b/kcontrol/keys/modifiers.cpp
new file mode 100644
index 000000000..8391c7938
--- /dev/null
+++ b/kcontrol/keys/modifiers.cpp
@@ -0,0 +1,354 @@
+#include "modifiers.h"
+
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kkeynative.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#define XK_MISCELLANY
+#define XK_XKB_KEYS
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/keysymdef.h>
+#include <ctype.h>
+#undef NONE
+
+/*Modifier Scheme
+ PC: Shift/Ctrl/Alt/Win
+ Mac: Shift/Command/Apple/Alt
+ Custom
+
+X11
+Modifier XMod Label
+Shift Shift [Shift]
+Ctrl Control [Ctrl] Ctrl|Apple
+Alt [Mod1] [Alt] Alt|Command
+Win [Mod4] [Win] Win|Alt|Meta|Super|Hyper
+Extra1 [] [] User definable
+
+ Shift
+ Lock Caps_Lock
+ Control Control_L, Control_R
+ Mod1 Alt_L, Alt_R
+ Mod2 Num_Lock
+ Mod3 Mode_switch
+ Mod4 Super_L, Super_R
+ Mod5 Scroll_Lock
+*/
+
+//For Mac keyboards:
+//1) labels: Shift | Ctrl | Option | Command
+//2) swap Ctrl & Command
+
+ModifiersModule::ModifiersModule( QWidget *parent, const char *name )
+: QWidget( parent, name )
+{
+ initGUI();
+ load( false );
+}
+
+void ModifiersModule::load( bool useDefaults )
+{
+ KConfig *c = KGlobal::config();
+
+ c->setReadDefaults( useDefaults );
+
+ c->setGroup( "Keyboard" );
+
+ m_sLabelCtrlOrig = c->readEntry( "Label Ctrl", "Ctrl" );
+ m_sLabelAltOrig = c->readEntry( "Label Alt", "Alt" );
+ m_sLabelWinOrig = c->readEntry( "Label Win", "Win" );
+
+ m_bMacKeyboardOrig = c->readBoolEntry( "Mac Keyboard", false );
+ m_bMacSwapOrig = m_bMacKeyboardOrig && c->readBoolEntry( "Mac Modifier Swap", false );
+
+ updateWidgetData();
+}
+
+// When [Apply] or [OK] are clicked.
+void ModifiersModule::save()
+{
+ kdDebug(125) << "ModifiersModule::save()" << endl;
+
+ KConfigGroupSaver cgs( KGlobal::config(), "Keyboard" );
+
+ if( m_plblCtrl->text() != "Ctrl" )
+ KGlobal::config()->writeEntry( "Label Ctrl", m_plblCtrl->text(), true, true );
+ else
+ KGlobal::config()->deleteEntry( "Label Ctrl", false, true );
+
+ if( m_plblAlt->text() != "Alt" )
+ KGlobal::config()->writeEntry( "Label Alt", m_plblAlt->text(), true, true );
+ else
+ KGlobal::config()->deleteEntry( "Label Alt", false, true );
+
+ if( m_plblWin->text() != "Win" )
+ KGlobal::config()->writeEntry( "Label Win", m_plblWin->text(), true, true );
+ else
+ KGlobal::config()->deleteEntry( "Label Win", false, true );
+
+ if( m_pchkMacKeyboard->isChecked() )
+ KGlobal::config()->writeEntry( "Mac Keyboard", true, true, true );
+ else
+ KGlobal::config()->deleteEntry( "Mac Keyboard", false, true );
+
+ bool bMacSwap = m_pchkMacKeyboard->isChecked() && m_pchkMacSwap->isChecked();
+ if( bMacSwap )
+ KGlobal::config()->writeEntry( "Mac Modifier Swap", true, true, true );
+ else
+ KGlobal::config()->deleteEntry( "Mac Modifier Swap", false, true );
+
+ KGlobal::config()->sync();
+
+ if( m_bMacSwapOrig != bMacSwap ) {
+ if( bMacSwap )
+ setupMacModifierKeys();
+ else
+ kapp->kdeinitExec("kxkb");
+ m_bMacSwapOrig = bMacSwap;
+ updateWidgets();
+ }
+}
+
+void ModifiersModule::defaults()
+{
+ load( true );
+}
+
+#define SET_CODE_SYM( iCode, sym ) \
+ if( iCode >= keyCodeMin && iCode <= keyCodeMax ) \
+ rgKeySyms[(iCode-keyCodeMin) * nSymsPerCode] = sym;
+#define SET_MOD_CODE( iMod, code1, code2 ) \
+ xmk->modifiermap[iMod * xmk->max_keypermod + 0] = code1; \
+ xmk->modifiermap[iMod * xmk->max_keypermod + 1] = code2;
+void ModifiersModule::setupMacModifierKeys()
+{
+ const int CODE_Ctrl_L = 0x25, CODE_Ctrl_R = 0x6d;
+ const int CODE_Win_L = 0x73, CODE_Win_R = 0x74;
+ //const int CODE_Alt_L = 0x40, CODE_Alt_R = 0x71;
+ int keyCodeMin, keyCodeMax, nKeyCodes, nSymsPerCode;
+
+ XDisplayKeycodes( qt_xdisplay(), &keyCodeMin, &keyCodeMax );
+ nKeyCodes = keyCodeMax - keyCodeMin + 1;
+ KeySym* rgKeySyms = XGetKeyboardMapping( qt_xdisplay(), keyCodeMin, nKeyCodes, &nSymsPerCode );
+ XModifierKeymap* xmk = XGetModifierMapping( qt_xdisplay() );
+
+ SET_CODE_SYM( CODE_Ctrl_L, XK_Super_L )
+ SET_CODE_SYM( CODE_Ctrl_R, XK_Super_R )
+ SET_CODE_SYM( CODE_Win_L, XK_Control_L )
+ SET_CODE_SYM( CODE_Win_R, XK_Control_R )
+ //SET_CODE_SYM( CODE_Win_L, XK_Alt_L )
+ //SET_CODE_SYM( CODE_Win_R, XK_Alt_R )
+ //SET_CODE_SYM( CODE_Alt_L, XK_Control_L )
+ //SET_CODE_SYM( CODE_Alt_R, XK_Control_R )
+
+ SET_MOD_CODE( ControlMapIndex, CODE_Win_L, CODE_Win_R );
+ SET_MOD_CODE( Mod4MapIndex, CODE_Ctrl_L, CODE_Ctrl_R );
+ //SET_MOD_CODE( ControlMapIndex, CODE_Alt_L, CODE_Alt_R );
+ //SET_MOD_CODE( Mod1MapIndex, CODE_Win_L, CODE_Win_R );
+ //SET_MOD_CODE( Mod4MapIndex, CODE_Ctrl_L, CODE_Ctrl_R );
+
+ XSetModifierMapping( qt_xdisplay(), xmk );
+ XChangeKeyboardMapping( qt_xdisplay(), keyCodeMin, nSymsPerCode, rgKeySyms, nKeyCodes );
+ XFree( rgKeySyms );
+ XFreeModifiermap( xmk );
+}
+#undef SET_CODE_SYM
+
+void ModifiersModule::initGUI()
+{
+ QGridLayout* pLayoutTop = new QGridLayout( this, 6, 2, KDialog::marginHint() );
+ pLayoutTop->setColStretch( 1, 1 );
+
+ QGroupBox* pGroup = new QGroupBox( 2, Qt::Horizontal, i18n("KDE Modifiers"), this );
+ pLayoutTop->addWidget( pGroup, 0, 0 );
+
+ QLabel* plbl = new QLabel( i18n("Modifier"), pGroup );
+ QFont font = plbl->font();
+ font.setUnderline( true );
+ font.setWeight( QFont::Bold );
+ plbl->setFont( font );
+ plbl = new QLabel( i18n("X11-Mod"), pGroup );
+ plbl->setFont( font );
+
+ new QLabel( i18n("QAccel", "Shift"), pGroup );
+ new QLabel( "shift", pGroup );
+
+ m_plblCtrl = new QLabel( i18n("QAccel", "Ctrl"), pGroup );
+ new QLabel( "control", pGroup );
+
+ m_plblAlt = new QLabel( i18n("QAccel", "Alt"), pGroup );
+ new QLabel( "mod1", pGroup );
+
+ m_plblWin = new QLabel( i18n("Win"), pGroup );
+ m_plblWinModX = new QLabel( "", pGroup );
+ /*m_pcbWinX = newModXComboBox( pGroup );
+ int i;
+ switch( KKeyNative::modX(KKey::WIN) ) {
+ case Mod2Mask: i = 1; break;
+ case Mod3Mask: i = 2; break;
+ case Mod4Mask: i = 3; break;
+ case Mod5Mask: i = 5; break;
+ default: i = 0;
+ }
+ m_pcbWinX->setCurrentItem( i );*/
+
+ m_pchkMacKeyboard = new QCheckBox( i18n("Macintosh keyboard"), this );
+ m_pchkMacKeyboard->setChecked( m_bMacKeyboardOrig );
+ connect( m_pchkMacKeyboard, SIGNAL(clicked()), SLOT(slotMacKeyboardClicked()) );
+ pLayoutTop->addWidget( m_pchkMacKeyboard, 1, 0 );
+
+ m_pchkMacSwap = new QCheckBox( i18n("MacOS-style modifier usage"), this );
+ m_pchkMacSwap->setChecked( m_bMacSwapOrig );
+ QWhatsThis::add( m_pchkMacSwap,
+ i18n("Checking this box will change your X Modifier Mapping to "
+ "better reflect the standard MacOS modifier key usage. "
+ "It allows you to use <i>Command+C</i> for <i>Copy</i>, for instance, "
+ "instead of the PC standard of <i>Ctrl+C</I>. "
+ "<b>Command</b> will be used for application and console commands, "
+ "<b>Option</b> as a command modifier and for navigating menus and dialogs, "
+ "and <b>Control</b> for window manager commands.") );
+ connect( m_pchkMacSwap, SIGNAL(clicked()), SLOT(slotMacSwapClicked()) );
+ pLayoutTop->addWidget( m_pchkMacSwap, 2, 0 );
+
+ //------------------
+ pLayoutTop->addRowSpacing( 3, KDialog::spacingHint() * 3 );
+
+ pGroup = new QGroupBox( 1, Qt::Horizontal, i18n("X Modifier Mapping"), this );
+ pLayoutTop->addWidget( pGroup, 4, 0 );
+
+ m_plstXMods = new KListView( pGroup );
+ m_plstXMods->setSorting( -1 );
+ m_plstXMods->setSelectionMode( QListView::NoSelection );
+ m_plstXMods->setAllColumnsShowFocus( true );
+ m_plstXMods->addColumn( i18n("X11-Mod") );
+
+ new KListViewItem( m_plstXMods, "mod5" );
+ new KListViewItem( m_plstXMods, "mod4" );
+ new KListViewItem( m_plstXMods, "mod3" );
+ new KListViewItem( m_plstXMods, "mod2" );
+ new KListViewItem( m_plstXMods, "mod1" );
+ new KListViewItem( m_plstXMods, "control" );
+ new KListViewItem( m_plstXMods, "lock" );
+ new KListViewItem( m_plstXMods, "shift" );
+
+ //------------------
+ pLayoutTop->setRowStretch( 5, 1 );
+
+ updateWidgets();
+}
+
+/*KComboBox* ModifiersModule::newModXComboBox( QWidget* parent )
+{
+ KComboBox* pcb = new KComboBox( parent );
+ pcb->insertItem( "" );
+ pcb->insertItem( "mod2" );
+ pcb->insertItem( "mod3" );
+ pcb->insertItem( "mod4" );
+ pcb->insertItem( "mod5" );
+ return pcb;
+}*/
+
+void ModifiersModule::updateWidgetData()
+{
+ m_plblCtrl->setText( m_sLabelCtrlOrig );
+ m_plblAlt->setText( m_sLabelAltOrig );
+ m_plblWin->setText( m_sLabelWinOrig );
+ m_pchkMacKeyboard->setChecked( m_bMacKeyboardOrig );
+ m_pchkMacSwap->setChecked( m_bMacSwapOrig );
+ m_pchkMacSwap->setEnabled( m_bMacKeyboardOrig );
+}
+
+void ModifiersModule::updateWidgets()
+{
+ if( m_pchkMacKeyboard->isChecked() ) {
+ // If keys are swapped around to reflect MacOS norms:
+ if( m_pchkMacSwap->isChecked() ) {
+ m_plblCtrl->setText( i18n("Command") ); // Ctrl in Alt's place
+ m_plblAlt->setText( i18n("Option") ); // Alt in Win's place
+ m_plblWin->setText( i18n("Control") ); // Win in Ctrl's place
+ } else {
+ m_plblCtrl->setText( i18n("Control") ); // Ctrl labeled Control
+ m_plblAlt->setText( i18n("Option") ); // Alt labeled Command
+ m_plblWin->setText( i18n("Command") ); // Win labeled Option
+ }
+ m_pchkMacSwap->setEnabled( true );
+ } else {
+ m_plblCtrl->setText( i18n("QAccel", "Ctrl") );
+ m_plblAlt->setText( i18n("QAccel", "Alt") );
+ m_plblWin->setText( i18n("Win") );
+ m_pchkMacSwap->setEnabled( false );
+ }
+
+ XModifierKeymap* xmk = XGetModifierMapping( qt_xdisplay() );
+
+ for( int iKey = m_plstXMods->columns()-1; iKey < xmk->max_keypermod; iKey++ )
+ m_plstXMods->addColumn( i18n("Key %1").arg(iKey+1) );
+
+ //int iModWinDef = -1;
+ for( int iMod = 0; iMod < 8; iMod++ ) {
+ // Find the default modifier index for the Win key.
+ /*if( iMod > Mod2Index ) {
+ uint symX = XKeycodeToKeysym( qt_xdisplay(), xmk->modifiermap[xmk->max_keypermod * iMod], 0 );
+ if( symX == XK_Super_L || symX == XK_Super_R )
+ iModWinDef = iMod;
+ else if( iModWinDef == -1 && (symX == XK_Meta_L || symX == XK_Meta_R) )
+ iModWinDef = iMod;
+ }*/
+
+ // Insert items into X modifier map list
+ for( int iKey = 0; iKey < xmk->max_keypermod; iKey++ ) {
+ uint symX = XKeycodeToKeysym( qt_xdisplay(), xmk->modifiermap[xmk->max_keypermod * iMod + iKey], 0 );
+ m_plstXMods->itemAtIndex( iMod )->setText( 1 + iKey, XKeysymToString( symX ) );
+ }
+ }
+
+ XFreeModifiermap( xmk );
+
+ int i;
+ switch( KKeyNative::modX(KKey::WIN) ) {
+ case Mod2Mask: i = 2; break;
+ case Mod3Mask: i = 3; break;
+ case Mod4Mask: i = 4; break;
+ case Mod5Mask: i = 5; break;
+ default: i = 0;
+ }
+ if( i != 0 )
+ m_plblWinModX->setText( "mod" + QString::number(i) );
+ else
+ m_plblWinModX->setText( "<" + i18n("None") + ">" );
+}
+
+void ModifiersModule::slotMacKeyboardClicked()
+{
+ updateWidgets();
+ emit changed( true );
+}
+
+void ModifiersModule::slotMacSwapClicked()
+{
+ if( m_pchkMacKeyboard->isChecked() && !KKeyNative::keyboardHasWinKey() ) {
+ KMessageBox::sorry( this,
+ i18n("You can only activate this option if your "
+ "X keyboard layout has the 'Super' or 'Meta' keys "
+ "properly configured as modifier keys."),
+ "Incompatibility" );
+ m_pchkMacSwap->setChecked( false );
+ } else {
+ updateWidgets();
+ emit changed( true );
+ }
+}
+
+#include "modifiers.moc"
diff --git a/kcontrol/keys/modifiers.h b/kcontrol/keys/modifiers.h
new file mode 100644
index 000000000..60ce76ae9
--- /dev/null
+++ b/kcontrol/keys/modifiers.h
@@ -0,0 +1,49 @@
+#ifndef __MODIFIERS_MODULE_H
+#define __MODIFIERS_MODULE_H
+
+#include <qwidget.h>
+
+class QCheckBox;
+class QLabel;
+class KComboBox;
+class KListView;
+
+class ModifiersModule : public QWidget
+{
+ Q_OBJECT
+ public:
+ ModifiersModule( QWidget *parent = 0, const char *name = 0 );
+
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+
+ static void setupMacModifierKeys();
+
+ signals:
+ void changed( bool );
+
+ protected:
+ bool m_bMacKeyboardOrig, m_bMacSwapOrig;
+ QString m_sLabelCtrlOrig, m_sLabelAltOrig, m_sLabelWinOrig;
+
+ QLabel* m_plblCtrl, * m_plblAlt, * m_plblWin;
+ QLabel* m_plblWinModX;
+ QCheckBox* m_pchkMacKeyboard;
+ KListView* m_plstXMods;
+ QCheckBox* m_pchkMacSwap;
+
+ void initGUI();
+ // Places the values in the *Orig variables into their
+ // respective widgets.
+ void updateWidgetData();
+ // Updates the labels according to the check-box settings
+ // and also reads in the X modifier map.
+ void updateWidgets();
+
+ protected slots:
+ void slotMacKeyboardClicked();
+ void slotMacSwapClicked();
+};
+
+#endif
diff --git a/kcontrol/keys/shortcuts.cpp b/kcontrol/keys/shortcuts.cpp
new file mode 100644
index 000000000..e65364f4c
--- /dev/null
+++ b/kcontrol/keys/shortcuts.cpp
@@ -0,0 +1,435 @@
+/*
+ * shortcuts.cpp
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ * Copyright (c) 2001 Ellis Whitehead <ellis@kde.org>
+ *
+ * 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 "shortcuts.h"
+
+#include <qdir.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kipc.h>
+#include <kkeynative.h>
+#include <kinputdialog.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kshortcutlist.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+
+ShortcutsModule::ShortcutsModule( QWidget *parent, const char *name )
+: QWidget( parent, name )
+{
+ initGUI();
+}
+
+ShortcutsModule::~ShortcutsModule()
+{
+ delete m_pListGeneral;
+ delete m_pListSequence;
+ delete m_pListApplication;
+}
+
+// Called when [Reset] is pressed
+void ShortcutsModule::load()
+{
+ kdDebug(125) << "ShortcutsModule::load()" << endl;
+ slotSchemeCur();
+}
+
+// When [Apply] or [OK] are clicked.
+void ShortcutsModule::save()
+{
+ kdDebug(125) << "ShortcutsModule::save()" << endl;
+
+ // FIXME: This isn't working. Why? -- ellis, 2002/01/27
+ // Check for old group,
+ if( KGlobal::config()->hasGroup( "Keys" ) ) {
+ KGlobal::config()->deleteGroup( "Keys", true, true );
+ }
+ KGlobal::config()->sync();
+
+ m_pkcGeneral->commitChanges();
+ m_pkcSequence->commitChanges();
+ m_pkcApplication->save();
+
+ m_actionsGeneral.writeActions( "Global Shortcuts", 0, true, true );
+ m_actionsSequence.writeActions( "Global Shortcuts", 0, true, true );
+
+ KIPC::sendMessageAll( KIPC::SettingsChanged, KApplication::SETTINGS_SHORTCUTS );
+}
+
+void ShortcutsModule::defaults()
+{
+ m_pkcGeneral->allDefault();
+ m_pkcSequence->allDefault();
+ m_pkcApplication->allDefault();
+}
+
+QString ShortcutsModule::quickHelp() const
+{
+ return i18n("<h1>Key Bindings</h1> Using key bindings you can configure certain actions to be"
+ " triggered when you press a key or a combination of keys, e.g. Ctrl+C is normally bound to"
+ " 'Copy'. KDE allows you to store more than one 'scheme' of key bindings, so you might want"
+ " to experiment a little setting up your own scheme while you can still change back to the"
+ " KDE defaults.<p> In the tab 'Global Shortcuts' you can configure non-application specific"
+ " bindings like how to switch desktops or maximize a window. In the tab 'Application Shortcuts'"
+ " you will find bindings typically used in applications, such as copy and paste.");
+}
+
+void ShortcutsModule::initGUI()
+{
+ kdDebug(125) << "A-----------" << endl;
+ KAccelActions* keys = &m_actionsGeneral;
+// see also KShortcutsModule::init() below !!!
+#define NOSLOTS
+#define KICKER_ALL_BINDINGS
+#include "../../kwin/kwinbindings.cpp"
+#include "../../kicker/kicker/core/kickerbindings.cpp"
+#include "../../kicker/taskbar/taskbarbindings.cpp"
+#include "../../kdesktop/kdesktopbindings.cpp"
+#include "../../klipper/klipperbindings.cpp"
+#include "../../kxkb/kxkbbindings.cpp"
+
+ kdDebug(125) << "B-----------" << endl;
+ m_actionsSequence.init( m_actionsGeneral );
+
+ kdDebug(125) << "C-----------" << endl;
+ createActionsGeneral();
+ kdDebug(125) << "D-----------" << endl;
+ createActionsSequence();
+ kdDebug(125) << "E-----------" << endl;
+
+ kdDebug(125) << "F-----------" << endl;
+ QVBoxLayout* pVLayout = new QVBoxLayout( this, KDialog::marginHint() );
+
+ pVLayout->addSpacing( KDialog::marginHint() );
+
+ // (o) [Current ] <Remove> ( ) New <Save>
+
+ QHBoxLayout *pHLayout = new QHBoxLayout( pVLayout, KDialog::spacingHint() );
+ QButtonGroup* pGroup = new QButtonGroup( this );
+ pGroup->hide();
+
+ m_prbPre = new QRadioButton( "", this );
+ connect( m_prbPre, SIGNAL(clicked()), SLOT(slotSchemeCur()) );
+ pGroup->insert( m_prbPre );
+ pHLayout->addWidget( m_prbPre );
+
+ m_pcbSchemes = new KComboBox( this );
+ m_pcbSchemes->setMinimumWidth( 100 );
+ m_pcbSchemes->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
+ connect( m_pcbSchemes, SIGNAL(activated(int)), SLOT(slotSelectScheme(int)) );
+ pHLayout->addWidget( m_pcbSchemes );
+
+ pHLayout->addSpacing( KDialog::marginHint() );
+
+ m_pbtnRemove = new QPushButton( i18n("&Remove"), this );
+ m_pbtnRemove->setEnabled( false );
+ connect( m_pbtnRemove, SIGNAL(clicked()), SLOT(slotRemoveScheme()) );
+ QWhatsThis::add( m_pbtnRemove, i18n("Click here to remove the selected key bindings scheme. You cannot"
+ " remove the standard system-wide schemes 'Current scheme' and 'KDE default'.") );
+ pHLayout->addWidget( m_pbtnRemove );
+
+ pHLayout->addSpacing( KDialog::marginHint() * 3 );
+
+ m_prbNew = new QRadioButton( i18n("New scheme"), this );
+ m_prbNew->setEnabled( false );
+ pGroup->insert( m_prbNew );
+ pHLayout->addWidget( m_prbNew );
+
+ m_pbtnSave = new QPushButton( i18n("&Save..."), this );
+ m_pbtnSave->setEnabled( false );
+ QWhatsThis::add( m_pbtnSave, i18n("Click here to add a new key bindings scheme. You will be prompted for a name.") );
+ connect( m_pbtnSave, SIGNAL(clicked()), SLOT(slotSaveSchemeAs()) );
+ pHLayout->addWidget( m_pbtnSave );
+
+ pHLayout->addStretch( 1 );
+
+ m_pTab = new QTabWidget( this );
+ m_pTab->setMargin( KDialog::marginHint() );
+ pVLayout->addWidget( m_pTab );
+
+ m_pListGeneral = new KAccelShortcutList( m_actionsGeneral, true );
+ m_pkcGeneral = new KKeyChooser( m_pListGeneral, this, KKeyChooser::Global, false );
+ m_pTab->addTab( m_pkcGeneral, i18n("&Global Shortcuts") );
+ connect( m_pkcGeneral, SIGNAL(keyChange()), SLOT(slotKeyChange()) );
+
+ m_pListSequence = new KAccelShortcutList( m_actionsSequence, true );
+ m_pkcSequence = new KKeyChooser( m_pListSequence, this, KKeyChooser::Global, false );
+ m_pTab->addTab( m_pkcSequence, i18n("Shortcut Se&quences") );
+ connect( m_pkcSequence, SIGNAL(keyChange()), SLOT(slotKeyChange()) );
+
+ m_pListApplication = new KStdAccel::ShortcutList;
+ m_pkcApplication = new KKeyChooser( m_pListApplication, this, KKeyChooser::Standard, false );
+ m_pTab->addTab( m_pkcApplication, i18n("App&lication Shortcuts") );
+ connect( m_pkcApplication, SIGNAL(keyChange()), SLOT(slotKeyChange()) );
+
+ kdDebug(125) << "G-----------" << endl;
+ readSchemeNames();
+
+ kdDebug(125) << "I-----------" << endl;
+ slotSchemeCur();
+
+ kdDebug(125) << "J-----------" << endl;
+}
+
+void ShortcutsModule::createActionsGeneral()
+{
+ KAccelActions& actions = m_actionsGeneral;
+
+ for( uint i = 0; i < actions.count(); i++ ) {
+ QString sConfigKey = actions[i].name();
+ //kdDebug(125) << "sConfigKey: " << sConfigKey << endl;
+ int iLastSpace = sConfigKey.findRev( ' ' );
+ bool bIsNum = false;
+ if( iLastSpace >= 0 )
+ sConfigKey.mid( iLastSpace+1 ).toInt( &bIsNum );
+
+ //kdDebug(125) << "sConfigKey: " << sConfigKey
+ // << " bIsNum: " << bIsNum << endl;
+ if( bIsNum && !sConfigKey.contains( ':' ) ) {
+ actions[i].setConfigurable( false );
+ actions[i].setName( QString::null );
+ }
+ }
+}
+
+void ShortcutsModule::createActionsSequence()
+{
+ KAccelActions& actions = m_actionsSequence;
+
+ for( uint i = 0; i < actions.count(); i++ ) {
+ QString sConfigKey = actions[i].name();
+ //kdDebug(125) << "sConfigKey: " << sConfigKey << endl;
+ int iLastSpace = sConfigKey.findRev( ' ' );
+ bool bIsNum = false;
+ if( iLastSpace >= 0 )
+ sConfigKey.mid( iLastSpace+1 ).toInt( &bIsNum );
+
+ //kdDebug(125) << "sConfigKey: " << sConfigKey
+ // << " bIsNum: " << bIsNum << endl;
+ if( !bIsNum && !sConfigKey.contains( ':' ) ) {
+ actions[i].setConfigurable( false );
+ actions[i].setName( QString::null );
+ }
+ }
+}
+
+void ShortcutsModule::readSchemeNames()
+{
+ QStringList schemes = KGlobal::dirs()->findAllResources("data", "kcmkeys/*.kksrc");
+
+ m_pcbSchemes->clear();
+ m_rgsSchemeFiles.clear();
+
+ i18n("User-Defined Scheme");
+ m_pcbSchemes->insertItem( i18n("Current Scheme") );
+ m_rgsSchemeFiles.append( "cur" );
+
+ // This for system files
+ for ( QStringList::ConstIterator it = schemes.begin(); it != schemes.end(); ++it) {
+ // KPersonalizer relies on .kksrc files containing all the keyboard shortcut
+ // schemes for various setups. It also requires the KDE defaults to be in
+ // a .kksrc file. The KDE defaults shouldn't be listed here.
+ //if( r.search( *it ) != -1 )
+ // continue;
+
+ KSimpleConfig config( *it, true );
+ config.setGroup( "Settings" );
+ QString str = config.readEntry( "Name" );
+
+ m_pcbSchemes->insertItem( str );
+ m_rgsSchemeFiles.append( *it );
+ }
+}
+
+void ShortcutsModule::resizeEvent( QResizeEvent * )
+{
+ //m_pTab->setGeometry(0,0,width(),height());
+}
+
+void ShortcutsModule::slotSchemeCur()
+{
+ kdDebug(125) << "ShortcutsModule::slotSchemeCur()" << endl;
+ //m_pcbSchemes->setCurrentItem( 0 );
+ slotSelectScheme();
+}
+
+void ShortcutsModule::slotKeyChange()
+{
+ kdDebug(125) << "ShortcutsModule::slotKeyChange()" << endl;
+ m_prbNew->setEnabled( true );
+ m_prbNew->setChecked( true );
+ m_pbtnSave->setEnabled( true );
+ emit changed( true );
+}
+
+void ShortcutsModule::slotSelectScheme( int )
+{
+ i18n("Your current changes will be lost if you load another scheme before saving this one.");
+ kdDebug(125) << "ShortcutsModule::slotSelectScheme( " << m_pcbSchemes->currentItem() << " )" << endl;
+ QString sFilename = m_rgsSchemeFiles[ m_pcbSchemes->currentItem() ];
+
+ if( sFilename == "cur" ) {
+ // TODO: remove nulls params
+ m_pkcGeneral->syncToConfig( "Global Shortcuts", 0, true );
+ m_pkcSequence->syncToConfig( "Global Shortcuts", 0, true );
+ m_pkcApplication->syncToConfig( "Shortcuts", 0, false );
+ } else {
+ KSimpleConfig config( sFilename );
+ config.setGroup( "Settings" );
+ //m_sBaseSchemeFile = config.readEntry( "Name" );
+
+ // If the user's keyboard layout doesn't support the Win key,
+ // but this layout scheme requires it,
+ if( !KKeyNative::keyboardHasWinKey()
+ && config.readBoolEntry( "Uses Win Modifier", false ) ) {
+ // TODO: change "Win" to Win's label.
+ int ret = KMessageBox::warningContinueCancel( this,
+ i18n("This scheme requires the \"%1\" modifier key, which is not "
+ "available on your keyboard layout. Do you wish to view it anyway?" )
+ .arg(i18n("Win")) );
+ if( ret == KMessageBox::Cancel )
+ return;
+ }
+
+ m_pkcGeneral->syncToConfig( "Global Shortcuts", &config, true );
+ m_pkcSequence->syncToConfig( "Global Shortcuts", &config, true );
+ m_pkcApplication->syncToConfig( "Shortcuts", &config, false );
+ }
+
+ m_prbPre->setChecked( true );
+ m_prbNew->setEnabled( false );
+ m_pbtnSave->setEnabled( false );
+ emit changed(true);
+}
+
+void ShortcutsModule::slotSaveSchemeAs()
+{
+ QString sName, sFile;
+ bool bNameValid, ok;
+ int iScheme = -1;
+
+ sName = m_pcbSchemes->currentText();
+
+ do {
+ bNameValid = true;
+
+ sName = KInputDialog::getText( i18n( "Save Key Scheme" ),
+ i18n( "Enter a name for the key scheme:" ), sName, &ok, this );
+
+ if( ok ) {
+ sName = sName.simplifyWhiteSpace();
+ sFile = sName;
+
+ int ind = 0;
+ while( ind < (int) sFile.length() ) {
+ // parse the string for first white space
+ ind = sFile.find(" ");
+ if( ind == -1 ) {
+ ind = sFile.length();
+ break;
+ }
+
+ // remove from string
+ sFile.remove( ind, 1 );
+
+ // Make the next letter upper case
+ QString s = sFile.mid( ind, 1 );
+ s = s.upper();
+ sFile.replace( ind, 1, s );
+ }
+
+ iScheme = -1;
+ for( int i = 0; i < (int) m_pcbSchemes->count(); i++ ) {
+ if( sName.lower() == (m_pcbSchemes->text(i)).lower() ) {
+ iScheme = i;
+
+ int result = KMessageBox::warningContinueCancel( 0,
+ i18n("A key scheme with the name '%1' already exists;\n"
+ "do you want to overwrite it?\n").arg(sName),
+ i18n("Save Key Scheme"),
+ i18n("Overwrite"));
+ bNameValid = (result == KMessageBox::Continue);
+ }
+ }
+ } else
+ return;
+ } while( !bNameValid );
+
+ disconnect( m_pcbSchemes, SIGNAL(activated(int)), this, SLOT(slotSelectScheme(int)) );
+
+ QString kksPath = KGlobal::dirs()->saveLocation( "data", "kcmkeys/" );
+
+ QDir dir( kksPath );
+ if( !dir.exists() && !dir.mkdir( kksPath ) ) {
+ qWarning("KShortcutsModule: Could not make directory to store user info.");
+ return;
+ }
+
+ sFile.prepend( kksPath );
+ sFile += ".kksrc";
+ if( iScheme == -1 ) {
+ m_pcbSchemes->insertItem( sName );
+ //m_pcbSchemes->setFocus();
+ m_pcbSchemes->setCurrentItem( m_pcbSchemes->count()-1 );
+ m_rgsSchemeFiles.append( sFile );
+ } else {
+ //m_pcbSchemes->setFocus();
+ m_pcbSchemes->setCurrentItem( iScheme );
+ }
+
+ KSimpleConfig *config = new KSimpleConfig( sFile );
+
+ config->setGroup( "Settings" );
+ config->writeEntry( "Name", sName );
+ delete config;
+
+ saveScheme();
+
+ connect( m_pcbSchemes, SIGNAL(activated(int)), SLOT(slotSelectScheme(int)) );
+ slotSelectScheme();
+}
+
+void ShortcutsModule::saveScheme()
+{
+ QString sFilename = m_rgsSchemeFiles[ m_pcbSchemes->currentItem() ];
+ KSimpleConfig config( sFilename );
+
+ m_pkcGeneral->commitChanges();
+ m_pkcSequence->commitChanges();
+ m_pkcApplication->commitChanges();
+
+ m_pListGeneral->writeSettings( "Global Shortcuts", &config, true );
+ m_pListSequence->writeSettings( "Global Shortcuts", &config, true );
+ m_pListApplication->writeSettings( "Shortcuts", &config, true );
+}
+
+void ShortcutsModule::slotRemoveScheme()
+{
+}
+
+#include "shortcuts.moc"
diff --git a/kcontrol/keys/shortcuts.h b/kcontrol/keys/shortcuts.h
new file mode 100644
index 000000000..a16a619e3
--- /dev/null
+++ b/kcontrol/keys/shortcuts.h
@@ -0,0 +1,77 @@
+/*
+ * shortcuts.h
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ *
+ * 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.
+ */
+
+#ifndef __SHORTCUTS_MODULE_H
+#define __SHORTCUTS_MODULE_H
+
+#include <qbuttongroup.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qtabwidget.h>
+#include "kaccelaction.h"
+#include <kcombobox.h>
+#include <kkeydialog.h>
+
+class ShortcutsModule : public QWidget
+{
+ Q_OBJECT
+ public:
+ ShortcutsModule( QWidget *parent = 0, const char *name = 0 );
+ ~ShortcutsModule();
+
+ void load();
+ void save();
+ void defaults();
+ QString quickHelp() const;
+
+ protected:
+ void initGUI();
+ void createActionsGeneral();
+ void createActionsSequence();
+ void readSchemeNames();
+ void saveScheme();
+ void resizeEvent(QResizeEvent *e);
+
+ signals:
+ void changed( bool );
+
+ protected slots:
+ void slotSchemeCur();
+ void slotKeyChange();
+ void slotSelectScheme( int = 0 );
+ void slotSaveSchemeAs();
+ void slotRemoveScheme();
+
+ private:
+ QTabWidget* m_pTab;
+ QRadioButton *m_prbPre, *m_prbNew;
+ KComboBox* m_pcbSchemes;
+ QPushButton* m_pbtnSave, * m_pbtnRemove;
+ int m_nSysSchemes;
+ QStringList m_rgsSchemeFiles;
+ KAccelActions m_actionsGeneral, m_actionsSequence;//, m_actionsApplication;
+ KShortcutList* m_pListGeneral, * m_pListSequence, * m_pListApplication;
+ KKeyChooser* m_pkcGeneral, * m_pkcSequence, * m_pkcApplication;
+};
+
+#endif // __SHORTCUTS_MODULE_H
diff --git a/kcontrol/keys/treeview.cpp b/kcontrol/keys/treeview.cpp
new file mode 100644
index 000000000..0c2056766
--- /dev/null
+++ b/kcontrol/keys/treeview.cpp
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2000 Matthias Elter <elter@kde.org>
+ * Copyright (C) 2001-2002 Raffaele Sandrini <sandrini@kde.org)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <unistd.h>
+
+#include <qdir.h>
+#include <qimage.h>
+#include <qstringlist.h>
+#include <qcursor.h>
+
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kservicegroup.h>
+
+#include "treeview.h"
+#include "treeview.moc"
+#include "khotkeys.h"
+
+AppTreeItem::AppTreeItem(QListViewItem *parent, const QString& storageId)
+ : KListViewItem(parent), m_init(false), m_storageId(storageId) {}
+
+AppTreeItem::AppTreeItem(QListViewItem *parent, QListViewItem *after, const QString& storageId)
+ : KListViewItem(parent, after), m_init(false), m_storageId(storageId) {}
+
+AppTreeItem::AppTreeItem(QListView *parent, const QString& storageId)
+ : KListViewItem(parent), m_init(false), m_storageId(storageId) {}
+
+AppTreeItem::AppTreeItem(QListView *parent, QListViewItem *after, const QString& storageId)
+ : KListViewItem(parent, after), m_init(false), m_storageId(storageId) {}
+
+void AppTreeItem::setName(const QString &name)
+{
+ m_name = name;
+ setText(0, m_name);
+}
+
+void AppTreeItem::setAccel(const QString &accel)
+{
+ m_accel = accel;
+ int temp = accel.find(';');
+ if (temp != -1)
+ {
+ setText(1, accel.left(temp));
+ setText(2, accel.right(accel.length() - temp - 1));
+ }
+ else
+ {
+ setText(1, m_accel);
+ setText(2, QString::null);
+ }
+}
+
+void AppTreeItem::setOpen(bool o)
+{
+ if (o && !m_directoryPath.isEmpty() && !m_init)
+ {
+ m_init = true;
+ AppTreeView *tv = static_cast<AppTreeView *>(listView());
+ tv->fillBranch(m_directoryPath, this);
+ }
+ QListViewItem::setOpen(o);
+}
+
+static QPixmap appIcon(const QString &iconName)
+{
+ QPixmap normal = SmallIcon( iconName );
+ // make sure they are not larger than 20x20
+ if (normal.width() > 20 || normal.height() > 20)
+ {
+ QImage tmp = normal.convertToImage();
+ tmp = tmp.smoothScale(20, 20);
+ normal.convertFromImage(tmp);
+ }
+ return normal;
+}
+
+
+AppTreeView::AppTreeView( QWidget *parent, const char *name )
+ : KListView(parent, name)
+{
+ setFrameStyle(QFrame::WinPanel | QFrame::Sunken);
+ setAllColumnsShowFocus(true);
+ setRootIsDecorated(true);
+ setSorting(-1);
+ setAcceptDrops(false);
+ setDragEnabled(false);
+ setMinimumWidth(240);
+ setResizeMode(AllColumns);
+
+ addColumn(i18n("Command"));
+ addColumn(i18n("Shortcut"));
+ addColumn(i18n("Alternate"));
+
+ connect(this, SIGNAL(clicked( QListViewItem* )),
+ SLOT(itemSelected( QListViewItem* )));
+
+ connect(this,SIGNAL(selectionChanged ( QListViewItem * )),
+ SLOT(itemSelected( QListViewItem* )));
+}
+
+AppTreeView::~AppTreeView()
+{
+}
+
+void AppTreeView::fill()
+{
+ QApplication::setOverrideCursor(Qt::WaitCursor);
+ clear();
+ fillBranch(QString::null, 0);
+ QApplication::restoreOverrideCursor();
+}
+
+void AppTreeView::fillBranch(const QString& rPath, AppTreeItem *parent)
+{
+ // get rid of leading slash in the relative path
+ QString relPath = rPath;
+ if(relPath[0] == '/')
+ relPath = relPath.mid(1, relPath.length());
+
+ // We ask KSycoca to give us all services (sorted).
+ KServiceGroup::Ptr root = KServiceGroup::group(relPath);
+
+ if (!root || !root->isValid())
+ return;
+
+ KServiceGroup::List list = root->entries(true);
+
+ QListViewItem *after = 0;
+
+ for(KServiceGroup::List::ConstIterator it = list.begin();
+ it != list.end(); ++it)
+ {
+ KSycocaEntry * e = *it;
+
+ if (e->isType(KST_KServiceGroup))
+ {
+ KServiceGroup::Ptr g(static_cast<KServiceGroup *>(e));
+ QString groupCaption = g->caption();
+
+ // Item names may contain ampersands. To avoid them being converted
+ // to accelerators, replace them with two ampersands.
+ groupCaption.replace("&", "&&");
+
+ AppTreeItem *item;
+ if (parent == 0)
+ item = new AppTreeItem(this, after, QString::null);
+ else
+ item = new AppTreeItem(parent, after, QString::null);
+
+ item->setName(groupCaption);
+ item->setPixmap(0, appIcon(g->icon()));
+ item->setDirectoryPath(g->relPath());
+ item->setExpandable(true);
+ after = item;
+ }
+ else if (e->isType(KST_KService))
+ {
+ KService::Ptr s(static_cast<KService *>(e));
+ QString serviceCaption = s->name();
+
+ // Item names may contain ampersands. To avoid them being converted
+ // to accelerators, replace them with two ampersands.
+ serviceCaption.replace("&", "&&");
+
+ AppTreeItem* item;
+ if (parent == 0)
+ item = new AppTreeItem(this, after, s->storageId());
+ else
+ item = new AppTreeItem(parent, after, s->storageId());
+
+ item->setName(serviceCaption);
+ item->setAccel(KHotKeys::getMenuEntryShortcut(s->storageId()));
+ item->setPixmap(0, appIcon(s->icon()));
+
+ after = item;
+ }
+ }
+}
+
+void AppTreeView::itemSelected(QListViewItem *item)
+{
+ AppTreeItem *_item = static_cast<AppTreeItem*>(item);
+
+ if(!item) return;
+
+ emit entrySelected(_item->storageId(), _item->accel(), _item->isDirectory());
+}
+
+QStringList AppTreeView::fileList(const QString& rPath)
+{
+ QString relativePath = rPath;
+
+ // truncate "/.directory"
+ int pos = relativePath.findRev("/.directory");
+ if (pos > 0) relativePath.truncate(pos);
+
+ QStringList filelist;
+
+ // loop through all resource dirs and build a file list
+ QStringList resdirlist = KGlobal::dirs()->resourceDirs("apps");
+ for (QStringList::ConstIterator it = resdirlist.begin(); it != resdirlist.end(); ++it)
+ {
+ QDir dir((*it) + "/" + relativePath);
+ if(!dir.exists()) continue;
+
+ dir.setFilter(QDir::Files);
+ dir.setNameFilter("*.desktop;*.kdelnk");
+
+ // build a list of files
+ QStringList files = dir.entryList();
+ for (QStringList::ConstIterator it = files.begin(); it != files.end(); ++it) {
+ // does not work?!
+ //if (filelist.contains(*it)) continue;
+
+ if (relativePath.isEmpty()) {
+ filelist.remove(*it); // hack
+ filelist.append(*it);
+ }
+ else {
+ filelist.remove(relativePath + "/" + *it); //hack
+ filelist.append(relativePath + "/" + *it);
+ }
+ }
+ }
+ return filelist;
+}
+
+QStringList AppTreeView::dirList(const QString& rPath)
+{
+ QString relativePath = rPath;
+
+ // truncate "/.directory"
+ int pos = relativePath.findRev("/.directory");
+ if (pos > 0) relativePath.truncate(pos);
+
+ QStringList dirlist;
+
+ // loop through all resource dirs and build a subdir list
+ QStringList resdirlist = KGlobal::dirs()->resourceDirs("apps");
+ for (QStringList::ConstIterator it = resdirlist.begin(); it != resdirlist.end(); ++it)
+ {
+ QDir dir((*it) + "/" + relativePath);
+ if(!dir.exists()) continue;
+ dir.setFilter(QDir::Dirs);
+
+ // build a list of subdirs
+ QStringList subdirs = dir.entryList();
+ for (QStringList::ConstIterator it = subdirs.begin(); it != subdirs.end(); ++it) {
+ if ((*it) == "." || (*it) == "..") continue;
+ // does not work?!
+ // if (dirlist.contains(*it)) continue;
+
+ if (relativePath.isEmpty()) {
+ dirlist.remove(*it); //hack
+ dirlist.append(*it);
+ }
+ else {
+ dirlist.remove(relativePath + "/" + *it); //hack
+ dirlist.append(relativePath + "/" + *it);
+ }
+ }
+ }
+ return dirlist;
+}
diff --git a/kcontrol/keys/treeview.h b/kcontrol/keys/treeview.h
new file mode 100644
index 000000000..d376bc00d
--- /dev/null
+++ b/kcontrol/keys/treeview.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2000 Matthias Elter <elter@kde.org>
+ * Copyright (C) 2001-2002 Raffaele Sandrini <sandrini@kde.org)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef __treeview_h__
+#define __treeview_h__
+
+#include <qstring.h>
+#include <klistview.h>
+
+class QPopupMenu;
+class KActionCollection;
+class KDesktopFile;
+
+class AppTreeItem : public KListViewItem
+{
+
+public:
+ AppTreeItem(QListViewItem *parent, const QString& storageId);
+ AppTreeItem(QListViewItem *parent, QListViewItem *after, const QString& storageId);
+ AppTreeItem(QListView *parent, const QString& storageId);
+ AppTreeItem(QListView *parent, QListViewItem* after, const QString& storageId);
+
+ QString storageId() const { return m_storageId; }
+ void setDirectoryPath(const QString& path) { m_directoryPath = path; }
+
+ QString name() const { return m_name; }
+ void setName(const QString &name);
+
+ QString accel() const { return m_accel; }
+ void setAccel(const QString &accel);
+
+ bool isDirectory() const { return !m_directoryPath.isEmpty(); }
+
+ virtual void setOpen(bool o);
+
+private:
+ bool m_init : 1;
+ QString m_storageId;
+ QString m_name;
+ QString m_directoryPath;
+ QString m_accel;
+};
+
+class AppTreeView : public KListView
+{
+ friend class AppTreeItem;
+ Q_OBJECT
+public:
+ AppTreeView(QWidget *parent=0, const char *name=0);
+ ~AppTreeView();
+ void fill();
+
+signals:
+ void entrySelected(const QString&, const QString &, bool);
+
+protected slots:
+ void itemSelected(QListViewItem *);
+
+protected:
+ void fillBranch(const QString& relPath, AppTreeItem* parent);
+
+ QStringList fileList(const QString& relativePath);
+ QStringList dirList(const QString& relativePath);
+};
+
+
+#endif
diff --git a/kcontrol/keys/unix3.kksrc b/kcontrol/keys/unix3.kksrc
new file mode 100644
index 000000000..8ac722ec6
--- /dev/null
+++ b/kcontrol/keys/unix3.kksrc
@@ -0,0 +1,198 @@
+[Settings]
+Name=UNIX Scheme
+Name[af]=UNIX Tema
+Name[be]=Схема UNIX
+Name[bg]=UNIX
+Name[bn]=ইউনিক্স স্কীম
+Name[br]=Steuñv UNIX
+Name[bs]=UNIX šema
+Name[ca]=Esquema UNIX
+Name[cs]=Unixové schéma
+Name[csb]=Mòtiw Uniksa
+Name[cy]=Cynllun UNIX
+Name[da]=UNIX-system
+Name[de]=UNIX-Design
+Name[el]=UNIX Μορφή
+Name[eo]=Uniksa aranĝo
+Name[es]=Esquema UNIX
+Name[et]=UNIX-i skeem
+Name[eu]=UNIX eskema
+Name[fa]=طرحوارۀ یونیکس
+Name[fi]=UNIX-skeema
+Name[fr]=Thème UNIX
+Name[fy]=UNIX-skema
+Name[ga]=Scéim UNIX
+Name[gl]=Esquema UNIX
+Name[he]=ערכת UNIX
+Name[hr]=UNIX shema
+Name[hu]=UNIX
+Name[id]=Skema UNIX
+Name[is]=UNIX þema
+Name[it]=Schema UNIX
+Name[ja]=UNIX スキーマ
+Name[ka]=UNIX სქემა
+Name[kk]=UNIX сұлбасы
+Name[km]=គំនូរ​បំព្រួញ UNIX
+Name[ko]=UNIX 배열
+Name[lo]=ຊຸດຮູບແບບ KWM
+Name[lt]=UNIX schema
+Name[mk]=UNIX-шема
+Name[mn]=UNIX-Схем
+Name[nb]=UNIX-oppsett
+Name[nds]=UNIX-Vörbild
+Name[ne]=यूनिक्स योजना
+Name[nl]=UNIX-schema
+Name[nn]=UNIX-oppsett
+Name[nso]=Leano la UNIX
+Name[pa]=UNIX ਸਰੂਪ
+Name[pl]=Motyw Uniksa
+Name[pt]=Esquema do UNIX
+Name[pt_BR]=Esquema UNIX
+Name[ro]=Schemă UNIX
+Name[ru]=UNIX
+Name[rw]=Igishushanyombonera UNIX
+Name[se]=UNIX-čoahkkáldat
+Name[sk]=UNIX schéma
+Name[sl]=Shema UNIX
+Name[sr]=UNIX-овска шема
+Name[sr@Latn]=UNIX-ovska šema
+Name[sv]=Unix schema
+Name[tg]=Нақшаи UNIX
+Name[th]=ใช้แบบของ UNIX
+Name[tr]=UNIX Şeması
+Name[tt]=UNIX buyınça
+Name[uk]=Схема UNIX
+Name[uz]=UNIX mavzusi
+Name[uz@cyrillic]=UNIX мавзуси
+Name[ven]=Tshikimu tsha UNIX
+Name[vi]=Phối hợp của Unix
+Name[wa]=Tinme UNIX
+Name[xh]=Udweliso lwe UNIX
+Name[zh_CN]=Unix 方案
+Name[zh_TW]=UNIX 按鍵配置
+Name[zu]=iplani le-UNIX
+Uses Win Modifier=false
+
+[Global Shortcuts]
+Desktop Screenshot=none
+Enable/Disable Clipboard Actions=none
+Run Command=Alt+F2
+Halt Computer=none
+Halt without Confirmation=none
+Kill Window=Alt+F9
+Lock Session=Alt+Ctrl+L
+Logout=Alt+Ctrl+Delete
+Logout without Confirmation=none
+Manually Invoke Action on Current Clipboard=Alt+Ctrl+R
+Mouse Emulation=Alt+F12
+Popup Launch Menu=Alt+F1
+Reboot Computer=none
+Reboot without Confirmation=none
+Show Klipper Popup-Menu=none
+Show Taskmanager=Ctrl+Escape
+Show Window List=none
+Switch One Desktop Down=none
+Switch One Desktop to the Left=none
+Switch One Desktop to the Right=none
+Switch One Desktop Up=none
+Switch to Next Keyboard Layout=Alt+Ctrl+K
+Switch to Desktop 1=Ctrl+F1
+Switch to Desktop 10=Ctrl+F10
+Switch to Desktop 11=Ctrl+F11
+Switch to Desktop 12=Ctrl+F12
+Switch to Desktop 13=Ctrl+Shift+F1
+Switch to Desktop 14=Ctrl+Shift+F2
+Switch to Desktop 15=Ctrl+Shift+F3
+Switch to Desktop 16=Ctrl+Shift+F4
+Switch to Desktop 2=Ctrl+F2
+Switch to Desktop 3=Ctrl+F3
+Switch to Desktop 4=Ctrl+F4
+Switch to Desktop 5=Ctrl+F5
+Switch to Desktop 6=Ctrl+F6
+Switch to Desktop 7=Ctrl+F7
+Switch to Desktop 8=Ctrl+F8
+Switch to Desktop 9=Ctrl+F9
+Switch to Next Desktop=none
+Switch to Previous Desktop=none
+Toggle Showing Desktop=Alt+Ctrl+D
+Toggle Window Raise/Lower=none
+Walk Through Desktop List=none
+Walk Through Desktop List (Reverse)=Ctrl+Shift+Tab
+Walk Through Desktops=Ctrl+Tab
+Walk Through Desktops (Reverse)=none
+Walk Through Windows=Alt+F11
+Walk Through Windows (Reverse)=Alt+Shift+Tab
+Window Close=none
+Window Iconify=Alt+F4
+Window Lower=none
+Window Maximize=Alt+Shift+F3
+Window Maximize Horizontal=none
+Window Maximize Vertical=none
+Window Move=Alt+F5
+Window Operations Menu=none
+Window Raise=none
+Window Resize=Alt+F6
+Window Screenshot=none
+Window Shade=none
+Window to Desktop 1=none
+Window to Desktop 10=none
+Window to Desktop 11=none
+Window to Desktop 12=none
+Window to Desktop 13=none
+Window to Desktop 14=none
+Window to Desktop 15=none
+Window to Desktop 16=none
+Window to Desktop 2=none
+Window to Desktop 3=none
+Window to Desktop 4=none
+Window to Desktop 5=none
+Window to Desktop 6=none
+Window to Desktop 7=none
+Window to Desktop 8=none
+Window to Desktop 9=none
+Window to Next Desktop=none
+Window to Previous Desktop=none
+
+[Shortcuts]
+AddBookmark=Ctrl+B
+Back=Alt+Left
+Close=Ctrl+W
+Copy=Ctrl+C
+Cut=Ctrl+X
+DeleteWordBack=Ctrl+Backspace
+DeleteWordForward=Ctrl+Delete
+Deselect=Ctrl+Shift+A
+End=Ctrl+End
+Find=Ctrl+S
+FindNext=F3
+FindPrev=Shift+F3
+Forward=Alt+Right
+GotoLine=Ctrl+G
+Help=F1
+Home=Ctrl+Home
+Insert=Ctrl+Insert
+New=Ctrl+N
+Next=Next
+NextCompletion=Ctrl+Down
+Open=Ctrl+O
+Paste=Ctrl+V
+PopupMenuContext=Menu
+PrevCompletion=Ctrl+Up
+Print=Ctrl+P
+Prior=Prior
+Quit=Ctrl+Q
+Redo=Ctrl+Shift+Z
+Reload=F5
+Replace=Ctrl+R
+RotateDown=Down
+RotateUp=Up
+Save=Ctrl+S
+SelectAll=
+ShowMenubar=Ctrl+M
+SubstringCompletion=Ctrl+T
+TextCompletion=Ctrl+E
+Undo=Ctrl+Z
+Up=Alt+Up
+WhatsThis=Shift+F1
+ZoomIn=Ctrl+Plus
+ZoomOut=Ctrl+Minus
diff --git a/kcontrol/keys/win3.kksrc b/kcontrol/keys/win3.kksrc
new file mode 100644
index 000000000..926f83670
--- /dev/null
+++ b/kcontrol/keys/win3.kksrc
@@ -0,0 +1,198 @@
+[Settings]
+Name=Windows Scheme (Without Win Key)
+Name[af]=Venster Skema (Sonder Win Sleutel)
+Name[be]=Схема Windows (без клавішы "Win")
+Name[bg]=Windows (без клавиша Win)
+Name[bn]=উইণ্ডোস্ স্কীম (উইন্ কী ব্যতীত)
+Name[br]=Steuñv Windows (hep stokell Win)
+Name[bs]=Windows šema (bez Win tipke)
+Name[ca]=Esquema Windows (sense la tecla Win)
+Name[cs]=Schéma Windows (bez klávesy Win)
+Name[csb]=Mòtiw Windows (bez klawiszë Win)
+Name[cy]=Cynllun Windows (Heb Allwedd Win)
+Name[da]=Windows-system (uden Win-tast)
+Name[de]=Windows-Design (ohne Windows-Taste)
+Name[el]=Μορφή Windows (Δίχως Win Πλήκτρο)
+Name[eo]=Vindoza aranĝo (sen Vindozoklavo)
+Name[es]=Esquema Windows (Sin tecla Win)
+Name[et]=Windowsi skeem (ilma Win-klahvita)
+Name[eu]=Windows eskema (Win teklarik gabe)
+Name[fa]=طرحوارۀ ویندوز( بدون کلید پنجره)
+Name[fi]=Windows-skeema (ilman Win-näppäintä)
+Name[fr]=Thème Windows (sans la touche « Win »)
+Name[fy]=Windows-skema (sûnder Win-toets)
+Name[ga]=Scéim Windows (Gan Eochair Win)
+Name[gl]=Esquema Windows (Sen Tecla de Windows)
+Name[he]=ערכת חלונות (ללא מקש Win)
+Name[hr]=Windows shema (bez Windows tipki)
+Name[hu]=Windows (Win billentyű nélkül)
+Name[id]=Skema Windows (Tanpa Tombol Win)
+Name[is]=Windowsþema (án Win lykils)
+Name[it]=Schema Windows (senza tasto Win)
+Name[ja]=Windows スキーマ (Win キーなし)
+Name[kk]=Windows сұлбасы (Win пернесіз)
+Name[km]=គំនូរ​បំព្រួញ Windows (គ្មាន​គ្រាប់ចុច​រូប​បង្អួច)
+Name[ko]=윈도 배열 (윈도 키 사용 안함)
+Name[lo]=ຊຸດຮູບແບບວິນໂດ (ບໍ່ມີປຸ່ມ Win)
+Name[lt]=Windows schema (be Win klavišo)
+Name[mk]=Windows-шема (без копчето Win)
+Name[mn]=Windows-Схем (Win-товчгүй)
+Name[ms]=Skim Tetingkap (Tanpa Kekunci Win)
+Name[nb]=Windows-oppsett (uten Windows-tast)
+Name[nds]=Windows-Vörbild (ahn Windows-Tast)
+Name[ne]=विण्डोज योजना (विन कुञ्जी बाहेक)
+Name[nl]=Windows-schema (zonder Win-toets)
+Name[nn]=Windows-oppsett (utan Windows-tast)
+Name[nso]=Leano la Window (Kantle le Senotlelo sa Phenyo)
+Name[pa]=Windows ਸਕੀਮ (ਬਿਨਾਂ Win ਸਵਿੱਚ)
+Name[pl]=Motyw Windows (bez klawisza Win)
+Name[pt]=Esquema do Windows (Sem Tecla Win)
+Name[pt_BR]=Esquema Windows (sem a tecla Win)
+Name[ro]=Schemă Windows (fără tasta Win)
+Name[ru]=Windows (без клавиши Win)
+Name[rw]=Igishushanyombonera cy'Amadirishya (Nta Buto Win)
+Name[se]=Windows-čoakkáldat (Windows-boalu haga)
+Name[sk]=Windows schéma (bez klávesu Win)
+Name[sl]=Shema Windows (brez tipke Win)
+Name[sr]=Windows-ова шема (без тастера Win)
+Name[sr@Latn]=Windows-ova šema (bez tastera Win)
+Name[sv]=Windows schema (utan Win-tangent)
+Name[tg]=Нақшаи тирезаҳо (Бе калиди Win)
+Name[th]=ใช้แบบของวินโดวส์ (ไม่มีปุ่ม Win)
+Name[tr]=Windows Şeması (Win Key'siz)
+Name[tt]=Windows buyınça (Win-töymäsez)
+Name[uk]=Схема Windows (без клавіші Win)
+Name[uz]=Windows qolipi (Win tugmasi bilan)
+Name[uz@cyrillic]=Windows қолипи (Win тугмаси билан)
+Name[ven]=Tshikimu tsha dziWindo (isina Meta/Win-Key)
+Name[vi]=Phối hợp của Windows (không có phím Cửa sổ)
+Name[wa]=Tinme Windows (sins l' tape Win)
+Name[xh]=Window Yodweliso (Ngaphandle kwe Win key)
+Name[zh_CN]=Windows 方案(无 Win 键)
+Name[zh_TW]=Windows 按鍵配置 (無 Win 鍵)
+Name[zu]=Iplani lama-Window (Ngaphandle kukakhiye we-Win)
+Uses Win Modifier=false
+
+[Global Shortcuts]
+Desktop Screenshot=Ctrl+Print
+Enable/Disable Clipboard Actions=none
+Run Command=none
+Halt Computer=none
+Halt without Confirmation=none
+Kill Window=none
+Lock Session=none
+Logout=none
+Logout without Confirmation=none
+Manually Invoke Action on Current Clipboard=none
+Mouse Emulation=none
+Popup Launch Menu=Ctrl+Escape
+Reboot Computer=none
+Reboot without Confirmation=none
+Show Klipper Popup-Menu=none
+Show Taskmanager=Alt+Ctrl+Delete
+Show Window List=none
+Switch One Desktop Down=none
+Switch One Desktop to the Left=none
+Switch One Desktop to the Right=none
+Switch One Desktop Up=none
+Switch to Next Keyboard Layout=Alt+Ctrl+K
+Switch to Desktop 1=none
+Switch to Desktop 10=none
+Switch to Desktop 11=none
+Switch to Desktop 12=none
+Switch to Desktop 13=none
+Switch to Desktop 14=none
+Switch to Desktop 15=none
+Switch to Desktop 16=none
+Switch to Desktop 2=none
+Switch to Desktop 3=none
+Switch to Desktop 4=none
+Switch to Desktop 5=none
+Switch to Desktop 6=none
+Switch to Desktop 7=none
+Switch to Desktop 8=none
+Switch to Desktop 9=none
+Switch to Next Desktop=Alt+Shift+Tab
+Switch to Previous Desktop=none
+Toggle Showing Desktop=Alt+Ctrl+D
+Toggle Window Raise/Lower=none
+Walk Through Desktop List=none
+Walk Through Desktop List (Reverse)=none
+Walk Through Desktops=Alt+Ctrl+Tab
+Walk Through Desktops (Reverse)=Alt+Ctrl+Shift+Tab
+Walk Through Windows=Alt+Tab
+Walk Through Windows (Reverse)=Alt+Shift+Tab
+Window Close=Alt+F4
+Window Iconify=none
+Window Lower=none
+Window Maximize=none
+Window Maximize Horizontal=none
+Window Maximize Vertical=none
+Window Move=none
+Window Operations Menu=Alt+Space
+Window Raise=none
+Window Resize=none
+Window Screenshot=Alt+Print
+Window Shade=none
+Window to Desktop 1=none
+Window to Desktop 10=none
+Window to Desktop 11=none
+Window to Desktop 12=none
+Window to Desktop 13=none
+Window to Desktop 14=none
+Window to Desktop 15=none
+Window to Desktop 16=none
+Window to Desktop 2=none
+Window to Desktop 3=none
+Window to Desktop 4=none
+Window to Desktop 5=none
+Window to Desktop 6=none
+Window to Desktop 7=none
+Window to Desktop 8=none
+Window to Desktop 9=none
+Window to Next Desktop=none
+Window to Previous Desktop=none
+
+[Shortcuts]
+AddBookmark=Ctrl+D
+Back=Alt+Left
+Close=Ctrl+F4;Ctrl+W
+Copy=Ctrl+C;Ctrl+Insert
+Cut=Ctrl+X;Shift+Delete
+DeleteWordBack=Ctrl+Backspace
+DeleteWordForward=Ctrl+Delete
+Deselect=Ctrl+Shift+A
+End=Ctrl+End
+Find=Ctrl+F
+FindNext=F3
+FindPrev=Shift+F3
+Forward=Alt+Right
+GotoLine=Ctrl+G
+Help=F1
+Home=Ctrl+Home
+Insert=Ctrl+Insert
+New=Ctrl+N
+Next=Next
+NextCompletion=Ctrl+Down
+Open=Ctrl+O
+Paste=Ctrl+V;Shift+Insert
+PopupMenuContext=F10
+PrevCompletion=Ctrl+Up
+Print=Ctrl+P
+Prior=Prior
+Quit=
+Redo=Ctrl+Shift+Z
+Reload=F5
+Replace=Ctrl+R
+RotateDown=Down
+RotateUp=Up
+Save=Ctrl+S
+SelectAll=Ctrl+A
+ShowMenubar=Ctrl+M
+SubstringCompletion=Ctrl+T
+TextCompletion=Ctrl+E
+Undo=Ctrl+Z
+Up=Alt+Up
+WhatsThis=Shift+F1
+ZoomIn=Ctrl+Plus
+ZoomOut=Ctrl+Minus
diff --git a/kcontrol/keys/win4.kksrc b/kcontrol/keys/win4.kksrc
new file mode 100644
index 000000000..1abb69313
--- /dev/null
+++ b/kcontrol/keys/win4.kksrc
@@ -0,0 +1,198 @@
+[Settings]
+Name=Windows Scheme (With Win Key)
+Name[af]=Windows Skema (Met Win Sleutel)
+Name[be]=Схема Windows (з клавішай "Win")
+Name[bg]=Windows (с клавиша Win)
+Name[bn]=উইণ্ডোস্ স্কীম (উইন্ কী সমেত)
+Name[br]=Steuñv Windows (gant stokell Win)
+Name[bs]=Windows šema (sa Win tipkom)
+Name[ca]=Esquema Windows (amb la tecla Win)
+Name[cs]=Schéma Windows (s klávesou Win)
+Name[csb]=Mòtiw Windows (z klawiszą Win)
+Name[cy]=Cynllun Windows (Gyda'r Allwedd Win)
+Name[da]=Windows-system (med Win-tast)
+Name[de]=Windows-Design (mit Windows-Taste)
+Name[el]=Μορφή Windows (Με Win Πλήκτρο)
+Name[eo]=Vindoza aranĝo (kun Vindozoklavo)
+Name[es]=Esquema Windows (Con tecla Win)
+Name[et]=Windowsi skeem (Win-klahviga)
+Name[eu]=Windows eskema (Win teklarekin)
+Name[fa]=طرحوارۀ پنجره( با کلید پنجره)
+Name[fi]=Windows-skeema (Win-näppäimellä)
+Name[fr]=Thème Windows (avec la touche « Win »)
+Name[fy]=Windows-skema (mei Win-toets)
+Name[ga]=Scéim Windows (Le hEochair Win)
+Name[gl]=Esquema de Windows (Con Tecla de Windows)
+Name[he]=ערכת חלונות (עם מקש Win)
+Name[hr]=Windows shema (s Windows tipkama)
+Name[hu]=Windows (Win billentyűvel)
+Name[id]=Skema Windows (Dengan Tombol Win)
+Name[is]=Windowsþema (með Win lykli)
+Name[it]=Schema Windows (con tasto Win)
+Name[ja]=Windows スキーマ (Win キーあり)
+Name[ka]=Windows სქემა (Win კლავიშით)
+Name[kk]=Windows сұлбасы (Win пернемен)
+Name[km]=គំនូរ​បំព្រួញ Windows (មាន​គ្រាប់ចុច​រូប​បង្អួច)
+Name[ko]=윈도 배열 (윈도 키 사용)
+Name[lo]=ຊຸດຮູບແບບວິນໂດ (ມີປຸ່ມ Win)
+Name[lt]=Windows schema (su Win klavišu)
+Name[mk]=Windows-шема (со копчето Win)
+Name[mn]=Windows-Схем (Win-Товчтой)
+Name[nb]=Windows-oppsett (med Windows-tast)
+Name[nds]=Windows-Vörbild (mit Windows-Tast)
+Name[ne]=विण्डोज योजना (विन कुञ्जीसँग)
+Name[nl]=Windows-schema (met Win-toets)
+Name[nn]=Windows-oppsett (med Windows-tast)
+Name[nso]=Leano la Window (Le Senotlelo sa Phenyo)
+Name[pa]=Windows ਸਕੀਮ (Win ਸਵਿੱਚ ਨਾਲ)
+Name[pl]=Motyw Windows (z klawiszem Win)
+Name[pt]=Esquema do Windows (Sem Tecla Win)
+Name[pt_BR]=Esquema Windows (com a tecla Win)
+Name[ro]=Schemă Windows (cu tasta Win)
+Name[ru]=Windows (поддержка клавиши Win)
+Name[rw]=Igishushanyombonera cy'Amadirishya (Na Buto Win)
+Name[se]=Windows-čoakkáldat (Windows-boaluin)
+Name[sk]=Windows schéma (s klávesom Win)
+Name[sl]=Shema Windows (s tipko Win)
+Name[sr]=Windows-ова шема (са тастером Win)
+Name[sr@Latn]=Windows-ova šema (sa tasterom Win)
+Name[sv]=Windows schema (med Win-tangent)
+Name[tg]=Нақшаи тирезаҳо (Бо калиди Win)
+Name[th]=ใช้แบบของวินโดวส์ (มีปุ่ม Win)
+Name[tr]=Windows Şeması (Win Key İle)
+Name[tt]=Windows buyınça (Win-töymäle)
+Name[uk]=Схема Windows (з клавішею Win)
+Name[uz]=Windows qolipi (Win tugmasiz)
+Name[uz@cyrillic]=Windows қолипи (Win тугмасиз)
+Name[ven]=TShikimu tsha dziwindo (irena Meta/Win-Key)
+Name[vi]=Phối hợp của Windows (có phím Cửa sổ)
+Name[wa]=Tinme Windows (avou l' tape Win)
+Name[xh]=Windows Ezingagqibekanga (Nge Win-key)
+Name[zh_CN]=Windows 方案(有 Win 键)
+Name[zh_TW]=Windows 按鍵配置 (有 Win 鍵)
+Name[zu]=Iplani lama-Window (Kukhona ukhiye we-Win)
+Uses Win Modifier=true
+
+[Global Shortcuts]
+Desktop Screenshot=Print
+Enable/Disable Clipboard Actions=none
+Run Command=Win+R
+Halt Computer=none
+Halt without Confirmation=none
+Kill Window=none
+Lock Session=none
+Logout=none
+Logout without Confirmation=none
+Manually Invoke Action on Current Clipboard=none
+Mouse Emulation=none
+Popup Launch Menu=Ctrl+Escape
+Reboot Computer=none
+Reboot without Confirmation=none
+Show Klipper Popup-Menu=none
+Show Taskmanager=Alt+Ctrl+Delete
+Show Window List=none
+Switch One Desktop Down=none
+Switch One Desktop to the Left=none
+Switch One Desktop to the Right=none
+Switch One Desktop Up=none
+Switch to Next Keyboard Layout=Alt+Ctrl+K
+Switch to Desktop 1=Win+F1
+Switch to Desktop 10=Win+F10
+Switch to Desktop 11=none
+Switch to Desktop 12=none
+Switch to Desktop 13=none
+Switch to Desktop 14=none
+Switch to Desktop 15=none
+Switch to Desktop 16=none
+Switch to Desktop 2=Win+F2
+Switch to Desktop 3=Win+F3
+Switch to Desktop 4=Win+F4
+Switch to Desktop 5=Win+F5
+Switch to Desktop 6=Win+F6
+Switch to Desktop 7=Win+F7
+Switch to Desktop 8=Win+F8
+Switch to Desktop 9=Win+F9
+Switch to Next Desktop=none
+Switch to Previous Desktop=none
+Toggle Showing Desktop=Win+D;Win+M
+Toggle Window Raise/Lower=none
+Walk Through Desktop List=none
+Walk Through Desktop List (Reverse)=none
+Walk Through Desktops=Win+Tab
+Walk Through Desktops (Reverse)=Win+Shift+Tab
+Walk Through Windows=Alt+Tab
+Walk Through Windows (Reverse)=Alt+Shift+Tab
+Window Close=Alt+F4
+Window Iconify=none
+Window Lower=none
+Window Maximize=none
+Window Maximize Horizontal=none
+Window Maximize Vertical=none
+Window Move=none
+Window Operations Menu=Alt+Space
+Window Raise=none
+Window Resize=none
+Window Screenshot=Alt+Print
+Window Shade=none
+Window to Desktop 1=none
+Window to Desktop 10=none
+Window to Desktop 11=none
+Window to Desktop 12=none
+Window to Desktop 13=none
+Window to Desktop 14=none
+Window to Desktop 15=none
+Window to Desktop 16=none
+Window to Desktop 2=none
+Window to Desktop 3=none
+Window to Desktop 4=none
+Window to Desktop 5=none
+Window to Desktop 6=none
+Window to Desktop 7=none
+Window to Desktop 8=none
+Window to Desktop 9=none
+Window to Next Desktop=none
+Window to Previous Desktop=none
+
+[Shortcuts]
+AddBookmark=Ctrl+D
+Back=Alt+Left
+Close=Ctrl+F4;Ctrl+W
+Copy=Ctrl+C;Ctrl+Insert
+Cut=Ctrl+X;Shift+Delete
+DeleteWordBack=Ctrl+Backspace
+DeleteWordForward=Ctrl+Delete
+Deselect=Ctrl+Shift+A
+End=Ctrl+End
+Find=Ctrl+F
+FindNext=F3
+FindPrev=Shift+F3
+Forward=Alt+Right
+GotoLine=Ctrl+G
+Help=F1
+Home=Ctrl+Home
+Insert=Ctrl+Insert
+New=Ctrl+N
+Next=Next
+NextCompletion=Ctrl+Down
+Open=Ctrl+O
+Paste=Ctrl+V;Shift+Insert
+PopupMenuContext=F10
+PrevCompletion=Ctrl+Up
+Print=Ctrl+P
+Prior=Prior
+Quit=
+Redo=Ctrl+Shift+Z
+Reload=F5
+Replace=Ctrl+R
+RotateDown=Down
+RotateUp=Up
+Save=Ctrl+S
+SelectAll=Ctrl+A
+ShowMenubar=Ctrl+M
+SubstringCompletion=Ctrl+T
+TextCompletion=Ctrl+E
+Undo=Ctrl+Z
+Up=Alt+Up
+WhatsThis=Shift+F1
+ZoomIn=Ctrl+Plus
+ZoomOut=Ctrl+Minus
diff --git a/kcontrol/keys/wm3.kksrc b/kcontrol/keys/wm3.kksrc
new file mode 100644
index 000000000..6c6ef61e5
--- /dev/null
+++ b/kcontrol/keys/wm3.kksrc
@@ -0,0 +1,188 @@
+[Settings]
+Name=WindowMaker (3 Modifier Keys)
+Name[af]=WindowMaker (3 verandering sleutels)
+Name[be]=WindowMaker (тры клавішы мадыфікацыі)
+Name[bg]=WindowMaker (с 3 модификационни клавиша)
+Name[bn]=উইণ্ডো-মেকার (৩-টি মডিফায়ার কী)
+Name[bs]=WindowMaker (3 modificirajuće tipke)
+Name[ca]=WindowMaker (3 tecles modificadores)
+Name[cs]=WindowMaker (3 modifikátory)
+Name[csb]=WindowMaker (3 klawisze zjinaczi)
+Name[cy]=WindowMaker (3 Bysell Addasu)
+Name[da]=Windowmaker (3 modifikatortaster)
+Name[de]=WindowMaker (3 Sondertasten)
+Name[el]=WindowMaker (3 πλήκτρα αλλαγής)
+Name[eo]=WindoMaker (3 modifaj klavoj)
+Name[es]=WindowMaker (3 teclas de modificación)
+Name[et]=WindowMaker (3 muuteklahviga)
+Name[eu]=WindowMaker (3 tekla modifikatzailekin)
+Name[fa]=WindowMaker (۳کلید تغییردهندۀ)
+Name[fi]=WindowMaker (3 muokkausnäppäintä)
+Name[fr]=WindowMaker (3 touches de modifications)
+Name[fy]=WindowMaker (3 modifikaasjetoetsen)
+Name[ga]=WindowMaker (3 Eochair Mhionathraithe)
+Name[gl]=WindowMaker (3 Teclas Modificadoras)
+Name[he]=WindowMaker (עם שלושה מצבים)
+Name[hr]=WindowMaker (3 modifikatorske tipke)
+Name[hu]=WindowMaker (3 módosító billentyű)
+Name[is]=WindowMaker (3 breytilyklar)
+Name[it]=WindowMaker (3 tasti modificatori)
+Name[ja]=WindowMaker (3 モディファイアキー)
+Name[ka]=WindowMaker (3 ცვლადი კლავიში)
+Name[kk]=WindowMaker (3 түрлендіру перне)
+Name[km]=WindowMaker (គ្រាប់ចុច​កែប្រែ ៣)
+Name[ko]=WindowMaker (수정자 키 세 개)
+Name[lt]=WindowMaker (3 klavišai - modifikatoriai)
+Name[mk]=WindowMaker (3 копчиња-модификатори)
+Name[mn]=WindowMaker (3 сэлгүүр товчилуур)
+Name[nb]=WindowMaker (tre valgtaster)
+Name[nds]=WindowMaker (3 Sünnertasten)
+Name[ne]=विण्डोज निर्माता (३ परिमार्जक कुञ्जीहरू)
+Name[nl]=WindowMaker (3 modificatietoetsen)
+Name[nn]=WindowMaker (tre valtastar)
+Name[pa]=WindowMaker (3 ਸੋਧ ਸਵਿੱਚਾਂ)
+Name[pl]=WindowMaker (3 klawisze modyfikatorów)
+Name[pt]=WindowMaker (3 Teclas Modificadoras)
+Name[pt_BR]=WindowMaker (3 teclas modificadoras)
+Name[ro]=WindowMaker (3 taste modificator)
+Name[ru]=WindowMaker (3 клавиши-модификатора)
+Name[rw]=MukoraDirishya (Muhindura Buto 3)
+Name[se]=WindowMaker (golbma válljenboaluiguin)
+Name[sk]=WindowMaker (3 modifikačné klávesy)
+Name[sl]=WindowMaker (3 spremenilne tipke)
+Name[sr]=WindowMaker (3 модификаторска тастера)
+Name[sr@Latn]=WindowMaker (3 modifikatorska tastera)
+Name[sv]=Windowmaker (3 väljartangenter)
+Name[tg]=СозандаиТиреза (3 калиди ислоҳ)
+Name[th]=วินโดวเมคเกอร์ (ใช้ปุ่มเปลี่ยนหน้าที่ 3ปุ่ม)
+Name[tr]=WindowMaker (3 Değiştirici Anahtar)
+Name[tt]=WindowMaker (3 Üzgärtkeç Töymä)
+Name[uk]=WindowMaker (3 модифікатори)
+Name[vi]=WindowMaker (3 Phím Bổ trợ)
+Name[wa]=WindowMaker (3 tapes di candjmint)
+Name[zh_CN]=WindowMaker (三个修饰键)
+Name[zh_TW]=WindowMaker (3 個輔助按鍵)
+
+[Global Shortcuts]
+Desktop Screenshot=Ctrl+Print
+Enable/Disable Clipboard Actions=Alt+Ctrl+X
+Run Command=Alt+F2
+Halt Computer=none
+Halt without Confirmation=none
+Kill Window=Alt+Ctrl+Escape
+Lock Session=Alt+Ctrl+L
+Logout=Alt+Ctrl+Delete
+Logout without Confirmation=none
+Manually Invoke Action on Current Clipboard=Alt+Ctrl+R
+Mouse Emulation=Alt+F12
+Popup Launch Menu=Alt+F1
+Reboot Computer=none
+Reboot without Confirmation=none
+Show Klipper Popup-Menu=Alt+Ctrl+V
+Show Taskmanager=Ctrl+Escape
+Show Window List=Alt+F5
+Switch One Desktop Down=none
+Switch One Desktop to the Left=none
+Switch One Desktop to the Right=none
+Switch One Desktop Up=none
+Switch to Next Keyboard Layout=Alt+Ctrl+K
+Switch to Desktop 1=Alt+1
+Switch to Desktop 10=Alt+Shift+1
+Switch to Desktop 11=Alt+Shift+2
+Switch to Desktop 12=Alt+Shift+3
+Switch to Desktop 13=Alt+Shift+4
+Switch to Desktop 14=Alt+Shift+5
+Switch to Desktop 15=Alt+Shift+6
+Switch to Desktop 16=Alt+Shift+7
+Switch to Desktop 2=Alt+2
+Switch to Desktop 3=Alt+3
+Switch to Desktop 4=Alt+4
+Switch to Desktop 5=Alt+5
+Switch to Desktop 6=Alt+6
+Switch to Desktop 7=Alt+7
+Switch to Desktop 8=Alt+8
+Switch to Desktop 9=Alt+9
+Switch to Next Desktop=none
+Switch to Previous Desktop=none
+Toggle Showing Desktop=Alt+Ctrl+D
+Toggle Window Raise/Lower=none
+Walk Through Desktop List=Ctrl+Tab
+Walk Through Desktop List (Reverse)=Ctrl+Shift+Tab
+Walk Through Desktops=none
+Walk Through Desktops (Reverse)=none
+Walk Through Windows=Alt+Tab
+Walk Through Windows (Reverse)=Alt+Shift+Tab
+Window Close=Alt+Escape
+Window Iconify=none
+Window Lower=none
+Window Maximize=none
+Window Maximize Horizontal=none
+Window Maximize Vertical=none
+Window Move=none
+Window Operations Menu=Alt+F3
+Window Raise=none
+Window Resize=none
+Window Screenshot=Alt+Print
+Window Shade=none
+Window to Desktop 1=Alt+Ctrl+1
+Window to Desktop 10=Alt+Ctrl+Shift+1
+Window to Desktop 11=Alt+Ctrl+Shift+2
+Window to Desktop 12=Alt+Ctrl+Shift+3
+Window to Desktop 13=Alt+Ctrl+Shift+4
+Window to Desktop 14=Alt+Ctrl+Shift+5
+Window to Desktop 15=Alt+Ctrl+Shift+6
+Window to Desktop 16=Alt+Ctrl+Shift+7
+Window to Desktop 2=Alt+Ctrl+2
+Window to Desktop 3=Alt+Ctrl+3
+Window to Desktop 4=Alt+Ctrl+4
+Window to Desktop 5=Alt+Ctrl+5
+Window to Desktop 6=Alt+Ctrl+6
+Window to Desktop 7=Alt+Ctrl+7
+Window to Desktop 8=Alt+Ctrl+8
+Window to Desktop 9=Alt+Ctrl+9
+Window to Next Desktop=none
+Window to Previous Desktop=none
+
+[Shortcuts]
+AddBookmark=Ctrl+B
+Back=Alt+Left
+Close=Ctrl+W
+Copy=Ctrl+C;Ctrl+Insert
+Cut=Ctrl+X;Shift+Delete
+DeleteWordBack=Ctrl+Backspace
+DeleteWordForward=Ctrl+Delete
+Deselect=Ctrl+Shift+A
+End=Ctrl+End
+Find=Ctrl+F
+FindNext=F3
+FindPrev=Shift+F3
+Forward=Alt+Right
+GotoLine=Ctrl+G
+Help=F1
+Home=Ctrl+Home
+Insert=Ctrl+Insert
+New=Ctrl+N
+Next=Next
+NextCompletion=Ctrl+Down
+Open=Ctrl+O
+Paste=Ctrl+V;Shift+Insert
+PopupMenuContext=Menu
+PrevCompletion=Ctrl+Up
+Print=Ctrl+P
+Prior=Prior
+Quit=Ctrl+Q
+Redo=Ctrl+Shift+Z
+Reload=F5
+Replace=Ctrl+R
+RotateDown=Down
+RotateUp=Up
+Save=Ctrl+S
+SelectAll=Ctrl+A
+ShowMenubar=Ctrl+M
+SubstringCompletion=Ctrl+T
+TextCompletion=Ctrl+E
+Undo=Ctrl+Z
+Up=Alt+Up
+WhatsThis=Shift+F1
+ZoomIn=Ctrl+Plus
+ZoomOut=Ctrl+Minus
diff --git a/kcontrol/kfontinst/AUTHORS b/kcontrol/kfontinst/AUTHORS
new file mode 100644
index 000000000..afabc4a80
--- /dev/null
+++ b/kcontrol/kfontinst/AUTHORS
@@ -0,0 +1 @@
+Craig Drummond <craig@kde.org>
diff --git a/kcontrol/kfontinst/ChangeLog b/kcontrol/kfontinst/ChangeLog
new file mode 100644
index 000000000..b00a53f1e
--- /dev/null
+++ b/kcontrol/kfontinst/ChangeLog
@@ -0,0 +1,490 @@
+KDE3.4 -> KDE3.5
+================
+1. When copying a file out of fonts sub-system, copy as filename, or <fontname>.fonts.tar.gz
+ in the case of multiple font files mapped to the same font name.
+
+ e.g. Times New Roman -> times.ttf
+ Helvetica, Bold Oblique-> Hevetica, Bold Oblique.fonts.tar.gz
+ Which contains:
+ 75dpi_helvBO10.pcf.gz
+ 75dpi_helvBO12.pcf.gz
+ 100dpi_helvBO10.pcf.gz
+ 100dpi_helvBO12.pcf.gz
+ ...etc
+
+2. New mimetype: fonts/package - to cater for the above.
+3. Add settings to enable/disable configuring fonts for legacy X, and Ghostscript
+ (X defaults to true, and Ghostscript defaults to false)
+4. Show mime-type in detailed view.
+5. Simple font sample printing - but only of installed fonts!
+6. Add toggle button to control display of bitmap fonts.
+
+KDE3.3 -> KDE3.4
+================
+1. Font listing comes from fontconfig. This means that fonts will be grouped, i.e.
+ previously each size of a bitmap font was shown seperately, now only 1 font
+ will be displayed which represents all sizes.
+2. Only fonts, and not folders (except System and Personal), are now shown.
+3. Creation of afms from pfa/pfb and a pfm file.
+4. Previews are drawn via Xft - previously FreeType was called directly.
+5. New font preview look.
+6. No longer dependant upon file extension.
+7. Check for FPE of "fontconfig" -> if set, then no need to configure X core fonts.
+
+KDE3.2 -> KDE3.3
+================
+1. List fonts as "Full Name" -> i.e. "Times New Roman".
+2. Preview of bitmap fonts.
+3. No fontname-title in thumbnails - as fonts:/ lists the fontnames!
+4. When copying to fonts:/ (as non-root) only ask for destination if more than 5 seconds
+ since previously asked.
+5. Add a konqueror service menu "Install"
+6. Use FreeType2 for reading Type1 - instead of parsing the pfa/pfb header.
+7. FamilyName is now the fonts *real* family name - no adding of style information.
+8. Add extra style information (which was previously added to FamilyName) into the XLFD.
+9. Consider regular weight to be medium (same as mkfontscale).
+10. Default to width=normal, weight=medium if not set.
+11. Allow change of preview string.
+12. Allow zooming in/out of preview.
+13. Waterfall font preview.
+14. Use font preview part in the KControl module - less code duplication.
+15. Include simple fontviwer app - basically just an application wrapper for the viewpart.
+
+KDE3.1 -> KDE3.2
+================
+1. Re-designed (yet again...) to be a kio slave. As a user, starting fonts:/ will display
+
+ Personal Lists contents of $HOME/.fonts and $KDEHOME/share/fonts (where previous installer installed to)
+ Fonts are installed to $HOME/.fonts
+
+ System Lists contents of /usr/local/share/fonts, /usr/share/fonts, and /usr/X11R6/lib/X11/fonts
+ Fonts are installed to /usr/local/share/fonts (as per FHS)
+
+ To install fonts system wide, just drop onto "System" and root's password will be asked
+ for.
+
+ As root, fonts:/ will show the same as fonts:/System (but without the System part...)
+
+2. New kcontrol module that uses fonts:/
+3. Removed:
+ AFM creation -- only really required (TTF wise) for SO <6.0
+ StarOffice configuration (S0 6.0 / OO.o is *much* better anyway)
+4. X font server (xfs) - if used - is refreshed by seding a SIGUSR1 instead of
+ relying on a /etc/init.d/xfs script. This is much more portable.
+5. Simple FontView part for konqueror - this is basically a big re-sizable preview of the font.
+6. Speed up creation of fonts.dir and fonts.scale - by reading in any existing files, and using the
+ entries from these instead of loading and testing the font (if listed).
+7. Better font preview and thumbnails.
+8. Only add a dir to fontpath if fonts.dir has greater than 0 entries!
+9. Use /etc/fonts/local.conf as root fontconfig file.
+10. Only add dirs to fontconfig if *not* a sub-dir of an existing dir.
+11. Ensure that top-level fonts dir is always in fontpath.
+12. A Fontmap file is created in each sub dir, which is then combined into 1 top level Fontmap file.
+ ~/.fonts/Fontmap for normal users, and /etc/fonts/Fontmap for root.
+13. Modify <ghostscript dir><sub-dir>/Fontmap to contain:
+ (/etc/fonts/Fontmap) .runlibfile
+ ...as this is the system-wide Fontmap file created. As for the per-user, one, hmmm...
+14. When a folder is configured, ensure fonts.dir/fonts.scale/Fontmap/.fonts-config-timestamp (SuSE
+ specific) all have the same timestamp (if they exist). Helps to discover if a folder has been
+ modified - in which case it needs to be reconfigured (and should happen automatically).
+15. Add support for TrueType Collections (.ttc), and OpenType (.otf) fonts. Currently TTC's are only
+ configured for X - need to also configure GS to see other faces.
+16. CID fonts are *not* handled - therefore don't list the X11 CID directory, and don't let users
+ try to create this.
+17. Don't list "encodings" in fonts:/System - and don't allow users to create this.
+18. Use XFree86's libfontenc (if found) to read font-encodings.
+19. Handle 1bpp glyphs in thumbnail code.
+20. Ensure X fontpaths *never* end in "/" - i.e. when write XF86Config, xfs/config,
+ or fontpaths remove any trailing "/"
+21. When adding/removing an unscaled dir from X font path, ensure ":unscaled" is
+ part of the path!
+22. Call fc-cache on top-level dir, not on each dir.
+23. Use "~" in Xft config and user X config files -> e.g. /home/user/.fonts -> ~/.fonts
+24. Remove top-level dir spec from top-level fontmap, e.g.
+
+ TimesNewRomanPSMT (/home/user/.fonts/wibble/times.ttf);
+
+ ...becomes...
+
+ TimesNewRomanPSMT (wibble/times.ttf);
+
+25. Add meta-data for AFM files to KFile plugin.
+
+0.11-> KDE3.1
+=============
+1. Re-design of UI - removed "Install From" view.
+2. Created a KIO/thumbnail font preview class.
+3. Fonts are installed/uninstalled on "Apply".
+4. Settings are saved on "Apply".
+5. Settings tab simplified - some uneccesary settings removed.
+6. Removal of Anti-Alias tab - relevant settings moved to kcmfonts.
+7. Add kfile-plugin to display Meta data for fonts.
+8. Remove settings wizard.
+9. Drop use of internal version numbering - not tagging CVS anyway, so whats the point?
+10. DCOP interface.
+11. Remember size of main window when run via kcmshell.
+
+0.10->0.11 (KDE3.0)
+===================
+1. Port to KDE3/Qt3.
+2. Add support for CUPS's Fontmap.
+3. Create backups of system files.
+4. When install symbol encoding fonts, set encoding to "glyphs-fontspecific" in XftConfig.
+5. When install monospaced fonts, set spacing to mono in XftConfig.
+6. When first run (as root) - checks XFree86 config file to see if a font server is being used, if
+ so then fs/config is used as the config file, and "/etc/rc.d/init.d/xfs restart" is selected as
+ as the X refresh command.
+7. Only install fonts that are useable.
+8. Add checkbox to enable overwriting of existing AFMs.
+9. Remember open directories in advanced mode.
+10. Add support for .Z compressed Bitmap fonts.
+11. Read Type1 encodings from .afm files if listed as "array" in pfa/pfb.
+
+0.10b11->0.10
+=============
+1. Version added to KDE CVS.
+2. Modified some keyboard shortcuts to remove conflicts.
+3. Disable "Touch" and "Delete" folder if top-level X fonts dir is selected.
+
+0.10b10->0.10b11 (Test version...)
+================
+1. Removed "root"/"Modify" and "Help" buttons - this gives more space to font lists, plus when using "root"/"Modify" root's
+ config files are not being saved.
+2. "IsFixedPitch" flag in AFMs produced incorrectly - was outputing "false" for monospaced fonts!
+3. Added rounding to AFM metric scaling.
+4. When creating AFMs, check that each characters' BBox is within the main BBox - this is a quick fix for wingdings.afm,
+ which seems to be giving incorrect results.
+5. StarOffice 6 / OpenOffice only need AFM files for Type1 fonts - plus no config files need to be altered. Therefore, added the ability to
+ select which font types AFMs should be created for.
+6. Output *all* characters from a font into the AFM file.
+7. Fixed a bug with Full/Family name in Speedo fonts.
+8. For TrueType, Type1, and Speedo fonts - family name is obtained by using the fonts' FullName, remove FamilyName (read from file), remove
+ any weight, width, or italic designation, and re-add FamilyName. (This is because some fonts are named
+ <family><weight><italic><something else>, and <something else> was previously being lost).
+9. When adding encodings to lists, check that they aren't alredy inserted.
+
+0.10b9->0.10b10 (Test version...)
+===============
+1. Fixed a problem with non-enabled install button in basic mode - again, thanks to Hardy Griech for spotting this.
+
+0.10b8->0.10b9 (Test version...)
+==============
+
+*** NOTE
+*** Please remove any Kfontinst generated StarOffice psstd.fonts and Ghostscript Fontmap output before using this version
+
+1. StarOffice psstd.fonts generated output is no longer marked line-by line, instead it is marked as a section, e.g.
+
+ # kfontinst <user, if not root> /usr/X11R6/lib/X11/fonts/TrueType
+ <fonts...>
+ # kfontinst <user, if not root> /usr/X11R6/lib/X11/fonts/TrueType
+
+ ...Likewise for Ghostscript's Fontmap
+
+2. Limited generated StarOffice psstd.fonts lines to 126 characters, and lines longher than this will not be output. It appears
+ as if this is the max line len StarOffice will accept - thanks to Hardy Griech for discovering this.
+3. Fixed a bug where a static pointer was not reset to NULL when module was unloaded.
+4. When chekcing ps-fonts, I was looking for the string "%!PS-Adbobe", however the hershey fonts just has "%!FontType" - therefore
+ I've change the code to just look for "%!"
+5. For pcf fonts, look for FAMILY as well as FAMILY_NAME
+6. Construct name from xlfd for bitmap fonts where can't get seperate components
+
+0.10b7->0.10b8 (Test version...)
+==============
+
+*** NOTE
+*** Please remove any Kfontinst generated Ghostscript and/or StarOffice output before using this version
+
+1. Forgot to extract foundry from bitmap fonts - however, changed bitmap Xlfd creation, see below.
+2. Extract Xlfd from Bitmap fonts directly - not all fonts have each seperate component available. Thanks to Claudio Bandaloukas
+ for helping me discover the various bugs with Bitmap output.
+3. When displaying bitmap details, if individual entries (family, point size, etc) can't be read, then the
+ Xlfd will be displayed.
+4. Ghostscript & StarOffice include guards changed from "kfontinst" to "kfi" -- this will *require" removing of any previous output!
+5. Shortened generated TrueType foundry fields - to help with StarOffice
+
+0.10b6->0.10b7 (Test version...)
+==============
+1. Fixed a bug with string-to-width conversion for Type1 and bitmap fonts
+2. Fixed some compile bugs if no Xft.h found
+3. Remove any fonts.alias when deleting a dir
+4. When try to open Type1 or Speedo fonts, check magic numbers - for Speedo check char[0]=='D' or 'd', char[1]==num, char[2]=='.', and char[3]==num
+
+0.10b5->0.10b6 (Test version...)
+==============
+1. Fonts with "Normal" weight now installed as "Medium"
+2. Added support for "Oblique" in xlfd
+3. Check is performed to see if destination is writeable before enabling "Install" button, likewise for the "Remove" button.
+
+0.10b4->0.10b5 (Test version...)
+==============
+1. Forgot to reset the made-changes state of XftConfig when saved!
+2. Add a validator to math & edit line-edits to disallow usage of double-quotes & tabs
+3. Select correct default entries for field-name combos when adding an XftRule.
+4. Removed check for number of items in match list, as these are not always required (such as for the sub-pixel hinting
+ rule.)
+5. When setting rgba - use symbolic name - previously always setting to 0!
+6. Modified help a little
+7. Reduced Advanced mode list-view treeStepSize to 10 pixels (from default of 20), this makes it easier for browsing
+ /usr/X11R6/lib/X11/fonts/etc...
+8. Fixed bug where could not remove Xft exclude range!
+9. Fixed a bug where uninstalled items could cause duplicates in "Install from" list.
+10. Renamed the "Configure System" button to "Apply" - this should make the neccessity of the option more obvious.
+11. Fixed display of uninstall folder.
+12. Added "include" and "includeif" directives from XftConfig to editor.
+
+0.10b3->0.10b4 (Test version...)
+==============
+
+*** NOTE
+*** Please delete your existing ~/.kde/share/config/kfontinstrc -or- ~/.kde2/share/config/kfontinstrc file
+*** before using this version
+
+1. Added support for X font server config files.
+2. Show "unscaled" directories in italic.
+3. Abilty to set directories as scaled/unscaled.
+4. Modified GUI slightly so that it works beter with Liquid style.
+5. Added chack to make sure XftConfig file exists before trying to parse.
+6. Advanced editing of XftConfig.
+7. Added help on XftConfig - from Danny Tholen (obiwan@mailmij.org)
+8. Removed some memory leaks
+10. Default folders changed for non-root users. KFontinst will now (upon initial start-up) select the following:
+
+ X fonts dir: $KDEHOME/share/fonts
+ XConfig file: $KDEHOME/share/fonts/fontpaths
+ XftConfig file: $HOME/.xftconfig
+ Fontmap file: $KDEHOME/share/fonts/Fontmap
+
+ ...This should make it possible for users to install fonts without being root. However, problems may arrise when
+ configuring StarOffice - as this requires some other files to be modified, which won't be possible if SO has been installed
+ by root.
+
+ ...Also to accomplish this, some changes are needed to 'startkde' - see file README.startkde
+
+11. Because of the above, when started as non-root, KFontinst will create Type1 and TrueType sub-folders in
+ $KDEHOME/share/fonts - if they do not already exist.
+12. Moved XftConfig stuff from a sub-page of settings tab into its own tab.
+13. Added question dialog if module is unloaded before system has been configured.
+14. Added ability to "touch" a X font folder - marking it as being modified, so that a re-configure of the that folder
+ can be done in order to create AFMs, modify encoding, etc.
+
+0.10b2->0.10b3 (Test version...)
+==============
+1. When locating Ghostscript's Fontmap file, sub-directories (up to a level of 4) are searched - this allows
+ for the possiblity of users using a different version of Ghostscript.
+2. Create a fonts.scale as well as fonts.dir - just incase another program runs mkfontdir.
+3. Fixed an error when creating AFMs for some symbol-encoded fonts.
+4. Re-worded SettingsWizard "Folders/Files" tab.
+5. Added a checkbox to Ghostscript configuration.
+6. Added support for XftConfig.
+7. Added/fixed support of Type1 fonts with no FullName or FamilyName fields - such as the hershey fonts.
+8. Fixed some bugs when configuring with --enable-final.
+9. Basic html help added.
+
+0.10b1->0.10b2 (Test version...)
+==============
+1. Minor compile error (struct declared as private, but used elsewhere!)
+
+0.9.2->0.10b1 (Test version...)
+=============
+1. Almost a complete re-write,
+2. Handles Speedo, and Bitmap fonts
+3. fonts.dir & encodings.dir are now created internally - no need for ttmkfdir
+4. Re-design of GUI.
+5. Advanced mode where X11 folder structure is displayed and all font types may be installed - and a Basic
+ mode where the X11 folder structure is hidden, and only TrueType and Type1 fonts may be installed.
+6. Settings wizard.
+7. Application is now a kcontrol module.
+8. Complete X11 fonts directory structure is now managed - no need for seperate 'Managed' directory.
+9. X11.PS is no longer created, instead the StarOffice printer file (*.PS) is now modified.
+10. Ported to FreeType2.
+11. Support more encodings - encodings combos now list standard encodings as well as those read from
+ .enc(.gz) files.
+12. Internal AMF creator for Type1 and TrueType fonts - ttf2pt1 and pf2afm.ps are no longer used/supplied.
+13. Removed the 'Process AFMs' & 'Delete AFMs' options - all AFMs are created be KFontinst, therefore they
+ should be OK for StarOffice and AbiWord.
+14. If a writable XF86Config file is found - then complete folders may be installed, and folders in the X11
+ directory may be uninstalled or disabled (i.e. the folder is not deleted, but it's entry is removed from
+ the XF86Config file).
+15. No longer supply .enc files with KFontinst - they should be provided by the distro.
+
+0.9.1->0.9.2
+============
+1. Removed a bug where the "Configure System" menu entry was always disabled!
+2. Spelling error in Settings dialog.
+3. t1lib has problems with some of the fonts supplied with Adobe acrobat - therefore, if t1lib fails to load the
+ font, then KFontinst itself will try to read the header information (although no preview will be available,
+ everything else should still work).
+4. Fixed multiple installing of programs in other/ directory. For instance KFontinst's version of ttmkfdir
+ was being installed into $(PREFIX) (usually /usr/bin) as well as $(KDE_DATADIR)/kfontinst - this was incorrect
+ as KFontinst will only use the version in $(KDE_DATADIR)/kfontinst, and it was possible that a previous version
+ of ttmkfdir (such as that supplied with XFree86) would have been overwritten.
+5. Fixed bug where the user was allowed to select (and subsequently install) fonts which could not be loaded correctly.
+6. Added the ability to enter a custom preview string.
+
+0.9->0.9.1
+==========
+1. Fixed a few compile errors.
+2. Fix to html formatting error.
+3. Fixed a ./configure error if t1lib was not found (the string NO was being used as the
+ librarary name, instead of an empty string!)
+4. Modified the reading of Type1 header information.
+
+0.8.3->0.9
+==========
+1. Converted to KDE2.
+2. Rearranged this file!
+3. Removed command line interface - KDE2's command line stuff is way different!
+4. Re-created dialogs with Qt designer.
+5. Removed ProgressDialog, and replaced with a progress bar on a new statusbar.
+6. Modified configure script to check for FreeType & t1lib.
+7. If an encoding (not unicode) is selected, then the .enc file is copied to the X11 fonts directory.
+8. As with the .enc files, the StarOffice .xpp files are also copied, and no longer just sym linked.
+9. Removed enabling/disabing of Configure System button.
+10. Fontmap.X11 is no longer created, instead the real Fontmap file itself is modified.
+
+0.8.2->0.8.3
+============
+1. Modified 'kfontinst.kdelnk' so that kdesu is now used - so that a user will automatically be prompted
+ for the root password.
+2. Modified dialogs to use the KDE caption ("Font Installer") instead of the app name ("kfontinst")
+3. Corrected size of Configure dialog.
+4. Fixed a minor bug where if all fonts were uninstalled, the 'Configure System' button was disabled - therefore not
+ allowing you to activate the changes!
+5. Added a command line interface. (type 'kfontinst --help' for details)
+6. Added option to automatically fix TTF postscript names upon install.
+
+0.8.1->0.8.2
+============
+1. Fixed a bug which always had SO configuration disabled!
+2. Fixed a bug when selecting Unicode encoding.
+3. Changed "Fonts/Uninstalled" menu entry to "Fonts/Disk"
+4. Added keyboard short-cuts to dialogs
+
+0.8->0.8.1
+==========
+1. Fixed a bug where X configuration would fail if no TT fonts present.
+2. If no fonts are installed, then the system configuration button/menu-entry is now disabled.
+3. Changed menu structure to add 'Fonts' menu.
+
+0.7.4->0.8
+==========
+1. Changed location of StarOffice stuf from <dir on settings dialog>/xp3 to just
+ <dir on settings dialog> -- As StarOffice 5.2 has 'xp3' within a 'share' sub-dir.
+2. Changed structure of config file to be more modular.
+3. Modified internal code structure to allow easier additon of extra apps to be configured. (NOTE: If any
+ apps need to be configured, then I'll also [later on] modify the Settings & Configure dialogs to
+ accomodate these.)
+4. Because of 3, added a 'StarOffice' check to the settings dialog. If this is not seleted, then no check
+ is performed to make sure the SO dir is OK - and the option to config SO is diabled on the config dialog.
+5. Added check when installing font to make sure that it's not already installed.
+
+0.7.3->0.7.4
+============
+1. Changed location of Fontmap.X11 -- from <directory on settings dialog>/lib/Fontmap.X11 to
+ <directory on settings dialog>/Fontmap.X11. As it seems some ghostscript installations don't
+ have the 'lib' sub directory.
+2. Improved the documentation a little - added a FAQ section
+
+0.7.2->0.7.3
+============
+1. Very minor bug fix.
+
+0.7.1->0.7.2
+============
+1. Added more detailed error messages when system configuration fails.
+
+0.7->0.7.1
+==========
+1. Removed lots of debug info from ttf2pt1, and afm.pl -- this should drastically speed up afm creation.
+2. Modified ttf2pt1 to accept a parameter to just create .afm files
+3. Added option to modify a .afm file when installing.
+4. Added "Unicode" to list of encodings that can be used.
+5. Removed kfontinst-cp1252.enc, kfontinst-cp1252.xpp -- these were hacks anyway, and seing as Qt2 is going to
+ support cp1252 by a hard-coded codec, there's no real point...
+6. Rearranged the Configure System dialog - so that Force AFM regeneration is grouped next to the Generate AFMs option.
+7. Encoding files now stored in <KDEDIR>/share/apps/kfontinst/Encodings
+
+0.6.1->0.7
+==========
+1. Modified ttmkfdir & ttf2pt1 to allow usage of X11 style font re-encoding files.
+2. Because .enc files are now used by kfontinst, removed the possibility of using gzipped encodings.
+3. Added the ability to delete an installed font's .afm file.
+4. Fixed a bug in the TtfPsNameFixer class - this would cause ttf2pt1 to creash when accessing a modified font!
+5. Font encodings are now stored in <KDEDir>/share/x11encodings
+6. Removed the reencode shell script, as the encodng is all done by ttmkfdir.
+7. Removed xfinst shell script - handled internally.
+8. Supplied a kfontinst-cp1252 encoding - with the ugly single-quotes normaly found in .ttf files remapped to
+ the nice looking ones.
+9. Added functionality, when configuring StarOffice, to select an appropriate xprinter.prolog for the selected
+ encoding (if one exists)...
+
+0.6->0.6.1
+==========
+1. Fixed a display bug in the 'Un/Exclude from StarOffice" options.
+
+0.5->0.6
+========
+1. Added the ability to 'fix' the postscript names in a ttf file.
+2. Fixed some missing changes to help files.
+
+0.4->0.5
+========
+1. Discovered a patch that modifies StarOffice's xprinter.prolog so that font's don't need to be modified
+ to use the microsoft cp1252 enocding scheme. (Previosuly the PS output from StarOffice would not print
+ OK with ghostscript - when using extra characters - unless the .ttf file was modified.)
+2. Because of 1, removed the abilty to modify a TrueType font's internal charactermap - this was a hack anyway.
+3. xfinst now uses mkfontdir to create encodings.dir - instead of kfontinst's install procedure copying a standard
+ one in (this didn't actually work...)
+4. As kfontinst no longer reads the .enc files themselves, added the ability to use .enc.gz files as well
+ when selecting an encoding for X.
+5. Re-wrote xfinst & reencode to be plain 'sh' scripts, as opposed to 'tcsh' scripts.
+
+0.3->0.4
+========
+1. All X fonts will now be placed with in a directory - "Managed" - this makes things easier for
+ AbiWord, and maybe others.
+2. encodings.dir & Encodings/ will now be placed within this new "Managed" dir.
+3. Only 1 StarOffice .PS file will be created - X11.PS
+4. Only 1 Fontmap will be created - Fontmap.X11 - and this will be placed within
+ <Ghostscript>/lib
+5. Because of 4, an option has been added to the Settings dialog to specify the location of
+ Ghostscript.
+6. Because of 1, removed the font option from the Configure dialog.
+7. Fixed an error with getting PS name from TT font - PS names are not allowed to have spaces, but in
+ fences.ttf it does. FontEngine.cpp will now check for, and fix, this - using the same 'algorithm' as that
+ of ttf2pt1 (which means the names will tie up with those in the .afm files).
+8. Added some improvements to control of dialogs.
+
+0.2.1->0.3
+==========
+1. Reverted back to naming .afm files <fontname>.afm - and renaming any conflicting fonts.
+2. Speeded up copying of files - by copying preview bitmap as opposed to regenerating it!
+3. Removed need for FontMetrics directory - .afm files now placed within TrueType or Type1 dir,
+ and sym links are produced for StarOffice.
+
+ 1. & 3. should now make things easier for AbiWord.
+
+4. Fixed output of Fontmap so that "URW Gothic" will be aliased as "UrwGothic-Roman" (etc.) as
+ this is what Qt will output.
+5. Added more processing of .afm files - this makes them OK for AbiWord.
+
+0.2->0.2.1
+==========
+1. Modified start-up progress dailog, and added progress dialogs to main window when scanning
+ fonts. These will only appear if numTTfonts>X || numT1fonts>Y
+
+0.1->0.2
+========
+1. Combined views of installed TrueType and Type1 fonts into 1 list.
+2. When uninstalling a font, can now move the font to another directory - or delete.
+3. Used t1lib so that Type1 fonts can also be previewed.
+4. Changed Fontmap creator to dynamically allocate memory for each font-category.
+5. .afm files are now named as <fontname>.<fontextension>.afm - this removes the need
+ for renaming the .afm file if there exists Type1 and TrueType fonts with the same
+ fontname.
+6. Removed the re-scanning of the install directories whenever a font is added.
+7. Added support for extra Type1 font weights.
+8. Added a start-up screen to inform the user that the installed/disk fonts are being scanned.
+9. When exiting, confirmation is now only asked if the system has been changed and not
+ reconfigured.
diff --git a/kcontrol/kfontinst/Makefile.am b/kcontrol/kfontinst/Makefile.am
new file mode 100644
index 000000000..963ec3c93
--- /dev/null
+++ b/kcontrol/kfontinst/Makefile.am
@@ -0,0 +1,14 @@
+if include_fontinst_tn
+FONTINST_TN_SUBDIR=thumbnail
+FONTINST_VP_SUBDIR=viewpart
+endif
+
+SUBDIRS = lib $(FONTINST_TN_SUBDIR) $(FONTINST_VP_SUBDIR) kcmfontinst kfile-plugin kfontinst kio
+
+EXTRA_DIST = TODO
+
+konqservicedir = $(kde_datadir)/konqueror/servicemenus
+konqservice_DATA = installfont.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) rc.cpp */*.cpp */*.h -o $(podir)/kfontinst.pot
diff --git a/kcontrol/kfontinst/TODO b/kcontrol/kfontinst/TODO
new file mode 100644
index 000000000..94466e61c
--- /dev/null
+++ b/kcontrol/kfontinst/TODO
@@ -0,0 +1 @@
+1. Support other X server config file types - if there are any other types...
diff --git a/kcontrol/kfontinst/configure.in.bot b/kcontrol/kfontinst/configure.in.bot
new file mode 100644
index 000000000..99042cbdb
--- /dev/null
+++ b/kcontrol/kfontinst/configure.in.bot
@@ -0,0 +1,12 @@
+dnl put here things which have to be done as very last part of configure
+
+if test -z "$FONTINST_SUBDIR"; then
+ echo ""
+ echo "KFontInstall control module got disabled from compilation"
+ echo "because of missing FreeType 2.x libraries/headers."
+ echo "You can download the freetype library from http://www.freetype.org/."
+ echo ""
+ all_tests=bad
+fi
+
+
diff --git a/kcontrol/kfontinst/configure.in.in b/kcontrol/kfontinst/configure.in.in
new file mode 100644
index 000000000..df6d3d34c
--- /dev/null
+++ b/kcontrol/kfontinst/configure.in.in
@@ -0,0 +1,155 @@
+FONTINST_SUBDIR=""
+FONTINST_TN=""
+
+# Check for FreeType...
+KFI_FOUND_FREETYPE=0
+
+KDE_FIND_PATH(freetype-config, FREETYPE_CONFIG, [${prefix}/bin ${exec_prefix}/bin /usr/bin /usr/local/bin /opt/local/bin], [
+ AC_MSG_WARN([Could not find libfreetype anywhere, check http://www.freetype.org/])
+ ])
+
+if test -n "$FREETYPE_CONFIG"; then
+ vers=`$FREETYPE_CONFIG --version 2>/dev/null | sed -e 's/libfreetype //' | awk 'BEGIN { FS = "."; } { printf "%d", ($1 * 1000 + $2) * 1000 + $3;}'`
+ if test -n "$vers" && test "$vers" -ge 9002003
+ then
+ LIBFREETYPE_LIBS="`$FREETYPE_CONFIG --libs`"
+ LIBFREETYPE_RPATH=
+ for args in $LIBFREETYPE_LIBS; do
+ case $args in
+ -L*)
+ LIBFREETYPE_RPATH="$LIBFREETYPE_RPATH $args"
+ ;;
+ esac
+ done
+ LIBFREETYPE_RPATH=`echo $LIBFREETYPE_RPATH | sed -e "s/-L/-R/g"`
+ LIBFREETYPE_CFLAGS="`$FREETYPE_CONFIG --cflags`"
+ KFI_FOUND_FREETYPE=1
+ else
+ AC_MSG_WARN([You need at least FreeType 2.1.3])
+ fi
+fi
+
+if test "$KFI_FOUND_FREETYPE" -eq 1; then
+ AC_SUBST(LIBFREETYPE_LIBS)
+ AC_SUBST(LIBFREETYPE_CFLAGS)
+ AC_SUBST(LIBFREETYPE_RPATH)
+
+ KFI_FOUND_FONTCONFIG=0
+ # check for fontconfig...
+ KDE_FIND_PATH(fontconfig-config, FONTCONFIG_CONFIG, [${prefix}/bin ${exec_prefix}/bin /usr/bin /usr/local/bin /opt/local/bin], [
+ KDE_FIND_PATH(pkg-config, PKGCONFIG, [${prefix}/bin ${exec_prefix}/bin /usr/bin /usr/local/bin /opt/local/bin], [
+ AC_MSG_WARN([Could not find neither pkg-config nor fontconfig-config, check http://www.fontconfig.org/ ])
+ ])
+ ])
+
+ if test -n "$PKGCONFIG"; then
+ vers=`$PKGCONFIG fontconfig --modversion 2>/dev/null | sed -e 's/libfontconfig //' | awk 'BEGIN { FS = "."; } { printf "%d", ($1 * 1000 + $2) * 1000 + $3;}'`
+ if test -n "$vers" && test "$vers" -ge 2000000 ; then
+ LIBFONTCONFIG_LIBS="`$PKGCONFIG fontconfig --libs`"
+ LIBFONTCONFIG_RPATH=
+ for args in $LIBFONTCONFIG_LIBS; do
+ case $args in
+ -L*)
+ LIBFONTCONFIG_RPATH="$LIBFONTCONFIG_RPATH $args"
+ ;;
+ esac
+ done
+ LIBFONTCONFIG_RPATH=`echo $LIBFONTCONFIG_RPATH | sed -e "s/-L/-R/g"`
+ LIBFONTCONFIG_CFLAGS="`$PKGCONFIG fontconfig --cflags`"
+ KFI_FOUND_FONTCONFIG=1
+ fi
+ fi
+
+ if test -n "$FONTCONFIG_CONFIG"; then
+ vers=`$FONTCONFIG_CONFIG --version 2>/dev/null | sed -e 's/libfontconfig //' | awk 'BEGIN { FS = "."; } { printf "%d", ($1 * 1000 + $2) * 1000 + $3;}'`
+ if test -n "$vers" && test "$vers" -ge 2000000 ; then
+ LIBFONTCONFIG_LIBS="`$FONTCONFIG_CONFIG --libs`"
+ LIBFONTCONFIG_RPATH=
+ for args in $LIBFONTCONFIG_LIBS; do
+ case $args in
+ -L*)
+ LIBFONTCONFIG_RPATH="$LIBFONTCONFIG_RPATH $args"
+ ;;
+ esac
+ done
+ LIBFONTCONFIG_RPATH=`echo $LIBFONTCONFIG_RPATH | sed -e "s/-L/-R/g"`
+ LIBFONTCONFIG_CFLAGS="`$FONTCONFIG_CONFIG --cflags`"
+ KFI_FOUND_FONTCONFIG=1
+ fi
+ fi
+
+ if test "$KFI_FOUND_FONTCONFIG" -eq 1; then
+ AC_SUBST(LIBFONTCONFIG_LIBS)
+ AC_SUBST(LIBFONTCONFIG_CFLAGS)
+ AC_SUBST(LIBFONTCONFIG_RPATH)
+
+ # Check OS...
+ AC_MSG_CHECKING([OS])
+ case "$host" in
+ *-*-linux*) UNAME='Linux' ;;
+ *-*-freebsd*) UNAME='FreeBSD' ;;
+ *-*-kfreebsd-gnu*) UNAME='GNU/kFreeBSD' ;;
+ *-*-netbsd*) UNAME='NetBSD' ;;
+ *-*-solaris*) UNAME='Solaris' ;;
+ *-*-irix*) UNAME='Irix' ;;
+ *-*-aix*) UNAME='AIX' ;;
+ *-*-hpux*) UNAME='HPUX' ;;
+ *-*-darwin*) UNAME='Darwin' ;;
+ *) UNAME='Unknown' ;;
+ esac
+ AC_MSG_RESULT($UNAME)
+ AC_SUBST(UNAME)
+
+ # Check for fontenc...
+ ac_font_enc_headers=0
+ KDE_CHECK_HEADER(X11/fonts/fontenc.h,[ac_font_enc_headers=1])
+ if test "$ac_font_enc_headers" = "0"; then
+ AC_MSG_WARN(FontEnc headers not found. FontEnc support disabled)
+ else
+ ac_LDFLAGS_save="$LDFLAGS"
+ ld_shared_flag=
+ KDE_CHECK_COMPILER_FLAG(shared, [ld_shared_flag="-shared"])
+ LDFLAGS="$LDFLAGS $ld_shared_flag $all_libraries -lz"
+ KDE_CHECK_LIB(fontenc,FontEncDirectory,ac_font_enc_lib=1,ac_font_enc_lib=0)
+ if test "$ac_font_enc_lib" = "1"; then
+ LIB_FONT_ENC="-lfontenc"
+ AC_DEFINE(HAVE_FONT_ENC, 1, [Defines if you have FontEnc])
+ fi
+ LDFLAGS="$ac_LDFLAGS_save"
+ fi
+ AC_SUBST(LIB_FONT_ENC)
+
+ FONTINST_SUBDIR="kfontinst"
+ # Check for Xft...
+ ac_xft_headers=0
+ ac_CXXFLAGS_save="$CXXFLAGS"
+ ac_CFLAGS_save="$CFLAGS"
+ ac_CPPFLAGS_save="$CPPFLAGS"
+ CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES $LIBFREETYPE_CFLAGS"
+ CFLAGS="$CXXFLAGS"
+ CPPFLAGS="$CXXFLAGS"
+
+ AC_CHECK_HEADER(X11/Xft/Xft.h, [ac_xft_headers=1])
+ if test "$ac_xft_headers" -eq 1 ; then
+ LIBXFT_LIB=-lXft
+ AC_SUBST(LIBXFT_LIB)
+ else
+ AC_MSG_WARN([Missing Xft headers - disabling font previews!])
+ fi
+ CXXFLAGS="$ac_CXXFLAGS_save"
+ CFLAGS="$ac_CFLAGS_save"
+ CPPFLAGS="$ac_CPPFLAGS_save"
+ else
+ AC_MSG_WARN([Missing FontConfig - disabling kfontinst!])
+ fi
+else
+ AC_MSG_WARN([Missing FreeType2 - disabling kfontinst!])
+fi
+
+AM_CONDITIONAL(include_fontinst_tn, test "$ac_xft_headers" -eq 1)
+
+if test "$ac_xft_headers" -eq 1 ; then
+ AC_DEFINE(HAVE_XFT, 1, [Defines if you have Xft])
+fi
+
+AM_CONDITIONAL(include_kcontrol_kfontinst, test -n "$FONTINST_SUBDIR")
diff --git a/kcontrol/kfontinst/installfont.desktop b/kcontrol/kfontinst/installfont.desktop
new file mode 100644
index 000000000..5286ce4ec
--- /dev/null
+++ b/kcontrol/kfontinst/installfont.desktop
@@ -0,0 +1,79 @@
+[Desktop Entry]
+ServiceTypes=application/x-font-ttf,application/x-font-type1,application/x-font-speedo,application/x-font-bdf,application/x-font-pcf,application/x-font-snf,application/x-font-otf,application/x-font-ttc,application/x-afm
+Actions=installFont;
+
+[Desktop Action installFont]
+Name=Install
+Name[af]=Installeer
+Name[ar]=ثبت
+Name[be]=Устанавіць
+Name[bg]=Инсталиране
+Name[bn]=ইনস্টল
+Name[br]=Staliañ
+Name[bs]=Instaliraj
+Name[ca]=Instal·la
+Name[cs]=Instalovat
+Name[csb]=Instalëjë
+Name[cy]=Gosod
+Name[da]=Installér
+Name[de]=Installieren
+Name[el]=Εγκατάσταση
+Name[eo]=Instali
+Name[es]=Instalar
+Name[et]=Paigaldamine
+Name[eu]=Instalatu
+Name[fa]=نصب
+Name[fi]=Asenna
+Name[fr]=Installer
+Name[fy]=Ynstallearje
+Name[ga]=Suiteáil
+Name[gl]=Instalar
+Name[he]=התקנה
+Name[hi]=संस्थापित
+Name[hr]=Instaliraj
+Name[hu]=Telepítő
+Name[is]=Setja upp
+Name[it]=Installa
+Name[ja]=インストール
+Name[ka]=ინსტალაცია
+Name[kk]=Орнату
+Name[km]=ដំឡើង
+Name[ko]=설치...
+Name[lt]=Įdiegti
+Name[lv]=Instalēt
+Name[mk]=Инсталирај
+Name[ms]=Pasang
+Name[mt]=Installa
+Name[nb]=Installer
+Name[nds]=Installeren
+Name[ne]=स्थापना गर्नुहोस्
+Name[nl]=Installeren
+Name[nn]=Installer
+Name[pa]=ਇੰਸਟਾਲ
+Name[pl]=Instaluj
+Name[pt]=Instalar
+Name[pt_BR]=Instalar
+Name[ro]=Instalare
+Name[ru]=Установка
+Name[rw]=Kwinjizaporogaramu
+Name[se]=Sajáiduhte
+Name[sk]=Inštalácia
+Name[sl]=Namesti
+Name[sr]=Инсталирај
+Name[sr@Latn]=Instaliraj
+Name[sv]=Installera
+Name[ta]=நிறுவி
+Name[te]=స్థాపించు
+Name[tg]=Гузоштан
+Name[th]=ติดตั้ง
+Name[tr]=Kur
+Name[tt]=Quyu
+Name[uk]=Встановлення
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[vi]=Cài đặt
+Name[wa]=Astaler
+Name[zh_CN]=安装
+Name[zh_TW]=安裝
+Icon=fonts
+Exec=kfmclient copy %U fonts:/
diff --git a/kcontrol/kfontinst/kcmfontinst/KCmFontInst.cpp b/kcontrol/kfontinst/kcmfontinst/KCmFontInst.cpp
new file mode 100644
index 000000000..4a6b0b3ee
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/KCmFontInst.cpp
@@ -0,0 +1,647 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CKCmFontInst
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 26/04/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include "KCmFontInst.h"
+#include "KfiConstants.h"
+#include "PrintDialog.h"
+#include "SettingsDialog.h"
+#ifdef HAVE_XFT
+#include "KfiPrint.h"
+#include "FcEngine.h"
+#endif
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+#include <qsettings.h>
+#include <kaboutdata.h>
+#include <kgenericfactory.h>
+#include <kdiroperator.h>
+#include <kprinter.h>
+#include "Misc.h"
+#include "KFileFontIconView.h"
+#include "KFileFontView.h"
+#include <kpopupmenu.h>
+#include <ktoolbar.h>
+#include <ktoolbarbutton.h>
+#include <kstdaccel.h>
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+#include <kcmdlineargs.h>
+#include <kapplication.h>
+#include <kio/job.h>
+#include <kio/netaccess.h>
+#include <kdirlister.h>
+#include <kpushbutton.h>
+#include <kguiitem.h>
+#include <qsplitter.h>
+
+#define CFG_GROUP "Main Settings"
+#define CFG_LISTVIEW "ListView"
+#define CFG_PATH "Path"
+#define CFG_SPLITTER_SIZES "SplitterSizes"
+#define CFG_SHOW_BITMAP "ShowBitmap"
+#define CFG_FONT_SIZE "FontSize"
+
+typedef KGenericFactory<KFI::CKCmFontInst, QWidget> FontInstallFactory;
+K_EXPORT_COMPONENT_FACTORY(kcm_fontinst, FontInstallFactory("kcmfontinst"))
+
+namespace KFI
+{
+
+CKCmFontInst::CKCmFontInst(QWidget *parent, const char *, const QStringList&)
+ : KCModule(parent, "kfontinst"),
+#ifdef HAVE_XFT
+ itsPreview(NULL),
+#endif
+ itsConfig(KFI_UI_CFG_FILE)
+{
+ KGlobal::locale()->insertCatalogue(KFI_CATALOGUE);
+
+ KAboutData* about = new KAboutData("kcmfontinst",
+ I18N_NOOP("KDE Font Installer"),
+ 0, 0,
+ KAboutData::License_GPL,
+ I18N_NOOP("GUI front end to the fonts:/ ioslave.\n"
+ "(c) Craig Drummond, 2000 - 2004"));
+ about->addAuthor("Craig Drummond", I18N_NOOP("Developer and maintainer"), "craig@kde.org");
+ setAboutData(about);
+
+ const char *appName=KCmdLineArgs::appName();
+
+ itsEmbeddedAdmin=Misc::root() && (NULL==appName || strcmp("kcontrol", appName) &&
+ KCmdLineArgs::parsedArgs()->isSet("embed"));
+
+ itsStatusLabel = new QLabel(this);
+ itsStatusLabel->setFrameShape(QFrame::Panel);
+ itsStatusLabel->setFrameShadow(QFrame::Sunken);
+ itsStatusLabel->setLineWidth(1);
+
+ itsConfig.setGroup(CFG_GROUP);
+
+ QFrame *fontsFrame;
+#ifdef HAVE_XFT
+ KLibFactory *factory=KLibLoader::self()->factory("libkfontviewpart");
+
+ if(factory)
+ {
+ itsSplitter=new QSplitter(this);
+ fontsFrame=new QFrame(itsSplitter),
+ itsPreview=(KParts::ReadOnlyPart *)factory->create(itsSplitter, "kcmfontinst", "KParts::ReadOnlyPart");
+ itsSplitter->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+
+ QValueList<int> sizes(itsConfig.readIntListEntry(CFG_SPLITTER_SIZES));
+
+ if(2!=sizes.count())
+ {
+ sizes.clear();
+ sizes+=250;
+ sizes+=150;
+ }
+ itsSplitter->setSizes(sizes);
+ }
+ else
+ {
+#endif
+ fontsFrame=new QFrame(this);
+ fontsFrame->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+#ifdef HAVE_XFT
+ }
+#endif
+
+ QGridLayout *fontsLayout=new QGridLayout(fontsFrame, 1, 1, 0, 1);
+ QVBoxLayout *layout=new QVBoxLayout(this, 0, KDialog::spacingHint());
+ KToolBar *toolbar=new KToolBar(this);
+ bool showBitmap(itsConfig.readBoolEntry(CFG_SHOW_BITMAP, false));
+
+ fontsFrame->setLineWidth(0);
+ toolbar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
+ toolbar->setMovingEnabled(false);
+
+ QString previousPath=itsConfig.readEntry(CFG_PATH);
+
+ itsDirOp = new KDirOperator(Misc::root() ? QString("fonts:/") : QString("fonts:/")+i18n(KFI_KIO_FONTS_USER),
+ fontsFrame);
+ itsDirOp->setViewConfig(&itsConfig, "ListView Settings");
+ itsDirOp->setMinimumSize(QSize(96, 64));
+ setMimeTypes(showBitmap);
+ itsDirOp->dirLister()->setMainWindow(this);
+ itsDirOp->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+ fontsLayout->addMultiCellWidget(itsDirOp, 0, 0, 0, 1);
+
+ KPushButton *button=new KPushButton(KGuiItem(i18n("Add Fonts..."), "newfont"), fontsFrame);
+ connect(button, SIGNAL(clicked()), SLOT(addFonts()));
+ button->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+ fontsLayout->addWidget(button, 1, 0);
+ fontsLayout->addItem(new QSpacerItem(4, 4, QSizePolicy::Expanding, QSizePolicy::Minimum));
+
+ layout->addWidget(toolbar);
+#ifdef HAVE_XFT
+ layout->addWidget(itsPreview ? itsSplitter : fontsFrame);
+#else
+ layout->addWidget(fontsFrame);
+#endif
+ layout->addWidget(itsStatusLabel);
+
+ setButtons(0);
+ setRootOnlyMsg(i18n("<b>The fonts shown are your personal fonts.</b><br>To see (and install) "
+ "system-wide fonts, click on the \"Administrator Mode\" button below."));
+ setUseRootOnlyMsg(true);
+ itsDirOp->setMode(KFile::Files);
+
+ //
+ // Now for the hack!
+ KAction *act;
+ KActionMenu *topMnu=dynamic_cast<KActionMenu *>(itsDirOp->actionCollection()->action("popupMenu"));
+
+ itsViewMenuAct=dynamic_cast<KActionMenu *>(itsDirOp->actionCollection()->action("view menu"));
+ topMnu->popupMenu()->clear();
+ connect(topMnu->popupMenu(), SIGNAL(aboutToShow()), SLOT(setupMenu()));
+ if((act=itsDirOp->actionCollection()->action("up")))
+ act->disconnect(SIGNAL(activated()), itsDirOp, SLOT(cdUp()));
+ if((act=itsDirOp->actionCollection()->action("home")))
+ act->disconnect(SIGNAL(activated()), itsDirOp, SLOT(home()));
+ if((act=itsDirOp->actionCollection()->action("back")))
+ act->disconnect(SIGNAL(activated()), itsDirOp, SLOT(back()));
+ if((act=itsDirOp->actionCollection()->action("forward")))
+ act->disconnect(SIGNAL(activated()), itsDirOp, SLOT(forward()));
+
+ if((act=itsDirOp->actionCollection()->action("reload")))
+ act->plug(toolbar);
+
+ topMnu->insert(itsViewMenuAct);
+
+ if((itsIconAct=dynamic_cast<KRadioAction *>(itsDirOp->actionCollection()->action("short view"))))
+ {
+ disconnect(itsIconAct, SIGNAL(activated()), itsDirOp, SLOT(slotSimpleView()));
+ connect(itsIconAct, SIGNAL(activated()), SLOT(iconView()));
+ itsIconAct->plug(toolbar);
+ }
+
+ if((itsListAct=dynamic_cast<KRadioAction *>(itsDirOp->actionCollection()->action("detailed view"))))
+ {
+ disconnect(itsListAct, SIGNAL(activated()), itsDirOp, SLOT(slotDetailedView()));
+ connect(itsListAct, SIGNAL(activated()), SLOT(listView()));
+ itsListAct->plug(toolbar);
+ }
+
+ itsShowBitmapAct=new KToggleAction(i18n("Show Bitmap Fonts"), "font_bitmap", 0, this, SLOT(filterFonts()),
+ itsDirOp->actionCollection(), "showbitmap");
+ itsShowBitmapAct->setChecked(showBitmap);
+ itsShowBitmapAct->plug(toolbar);
+
+ toolbar->insertLineSeparator();
+
+ act=new KAction(i18n("Add Fonts..."), "newfont", 0, this, SLOT(addFonts()), itsDirOp->actionCollection(), "addfonts");
+ act->plug(toolbar);
+ topMnu->insert(act);
+
+ if((itsDeleteAct=itsDirOp->actionCollection()->action("delete")))
+ {
+ itsDeleteAct->plug(toolbar);
+ itsDeleteAct->setEnabled(false);
+ topMnu->insert(itsDeleteAct);
+ disconnect(itsDeleteAct, SIGNAL(activated()), itsDirOp, SLOT(deleteSelected()));
+ connect(itsDeleteAct, SIGNAL(activated()), this, SLOT(removeFonts()));
+ }
+
+ toolbar->insertLineSeparator();
+ act=new KAction(i18n("Configure..."), "configure", 0, this, SLOT(configure()), itsDirOp->actionCollection(), "configure");
+ act->plug(toolbar);
+#ifdef HAVE_XFT
+ toolbar->insertLineSeparator();
+ act=new KAction(i18n("Print..."), "fileprint", 0, this, SLOT(print()), itsDirOp->actionCollection(), "print");
+ act->plug(toolbar);
+#endif
+
+ if( (itsSepDirsAct=itsDirOp->actionCollection()->action("separate dirs")) &&
+ (itsShowHiddenAct=itsDirOp->actionCollection()->action("show hidden")))
+ {
+ //disconnect(itsViewMenuAct->popupMenu(), SIGNAL(aboutToShow()), itsDirOp, SLOT(insertViewDependentActions()));
+ connect(itsViewMenuAct->popupMenu(), SIGNAL(aboutToShow()), SLOT(setupViewMenu()));
+ setupViewMenu();
+ }
+
+#ifdef HAVE_XFT
+ if(itsPreview)
+ {
+ KActionCollection *previewCol=itsPreview->actionCollection();
+
+ if(previewCol && previewCol->count()>0 && (act=previewCol->action("changeText")))
+ act->plug(toolbar);
+ }
+#endif
+
+ //
+ // Set view...
+ if(itsConfig.readBoolEntry(CFG_LISTVIEW, true))
+ listView();
+ else
+ iconView();
+
+ itsDirOp->dirLister()->setShowingDotFiles(true);
+
+ connect(itsDirOp, SIGNAL(fileHighlighted(const KFileItem *)), SLOT(fileHighlighted(const KFileItem *)));
+ connect(itsDirOp, SIGNAL(finishedLoading()), SLOT(loadingFinished()));
+ connect(itsDirOp, SIGNAL(dropped(const KFileItem *, QDropEvent *, const KURL::List &)),
+ SLOT(dropped(const KFileItem *, QDropEvent *, const KURL::List &)));
+ connect(itsDirOp->dirLister(), SIGNAL(infoMessage(const QString &)), SLOT(infoMessage(const QString &)));
+ connect(itsDirOp, SIGNAL(updateInformation(int, int)), SLOT(updateInformation(int, int)));
+}
+
+CKCmFontInst::~CKCmFontInst()
+{
+#ifdef HAVE_XFT
+ if(itsPreview)
+ {
+ itsConfig.setGroup(CFG_GROUP);
+ itsConfig.writeEntry(CFG_SPLITTER_SIZES, itsSplitter->sizes());
+ }
+#endif
+ delete itsDirOp;
+}
+
+void CKCmFontInst::setMimeTypes(bool showBitmap)
+{
+ QStringList mimeTypes;
+
+ mimeTypes << "application/x-font-ttf"
+ << "application/x-font-otf"
+ << "application/x-font-ttc"
+ << "application/x-font-type1";
+ if(showBitmap)
+ mimeTypes << "application/x-font-pcf"
+ << "application/x-font-bdf";
+
+ itsDirOp->setMimeFilter(mimeTypes);
+}
+
+void CKCmFontInst::filterFonts()
+{
+ setMimeTypes(itsShowBitmapAct->isChecked());
+ itsDirOp->rereadDir();
+ itsConfig.setGroup(CFG_GROUP);
+ itsConfig.writeEntry(CFG_SHOW_BITMAP, itsShowBitmapAct->isChecked());
+ if(itsEmbeddedAdmin)
+ itsConfig.sync();
+}
+
+QString CKCmFontInst::quickHelp() const
+{
+ return Misc::root()
+ ? i18n("<h1>Font Installer</h1><p> This module allows you to"
+ //" install TrueType, Type1, Speedo, and Bitmap"
+ " install TrueType, Type1, and Bitmap"
+ " fonts.</p><p>You may also install fonts using Konqueror:"
+ " type fonts:/ into Konqueror's location bar"
+ " and this will display your installed fonts. To install a"
+ " font, simply copy one into the folder.</p>")
+ : i18n("<h1>Font Installer</h1><p> This module allows you to"
+ //" install TrueType, Type1, Speedo, and Bitmap"
+ " install TrueType, Type1, and Bitmap"
+ " fonts.</p><p>You may also install fonts using Konqueror:"
+ " type fonts:/ into Konqueror's location bar"
+ " and this will display your installed fonts. To install a"
+ " font, simply copy it into the appropriate folder - "
+ " \"Personal\" for fonts available to just yourself, or "
+ " \"System\" for system-wide fonts (available to all).</p>"
+ "<p><b>NOTE:</b> As you are not logged in as \"root\", any"
+ " fonts installed will only be available to you. To install"
+ " fonts system-wide, use the \"Administrator Mode\""
+ " button to run this module as \"root\".</p>");
+}
+
+void CKCmFontInst::listView()
+{
+ CKFileFontView *newView=new CKFileFontView(itsDirOp, "detailed view");
+
+ itsDirOp->setView(newView);
+ itsListAct->setChecked(true);
+ itsConfig.setGroup(CFG_GROUP);
+ itsConfig.writeEntry(CFG_LISTVIEW, true);
+ if(itsEmbeddedAdmin)
+ itsConfig.sync();
+ itsDirOp->setAcceptDrops(true);
+}
+
+void CKCmFontInst::iconView()
+{
+ CKFileFontIconView *newView=new CKFileFontIconView(itsDirOp, "simple view");
+
+ itsDirOp->setView(newView);
+ itsIconAct->setChecked(true);
+ itsConfig.setGroup(CFG_GROUP);
+ itsConfig.writeEntry(CFG_LISTVIEW, false);
+ if(itsEmbeddedAdmin)
+ itsConfig.sync();
+ itsDirOp->setAcceptDrops(true);
+}
+
+void CKCmFontInst::setupMenu()
+{
+ itsDirOp->setupMenu(KDirOperator::SortActions|/*KDirOperator::FileActions|*/KDirOperator::ViewActions);
+}
+
+void CKCmFontInst::setupViewMenu()
+{
+ itsViewMenuAct->remove(itsSepDirsAct);
+ itsViewMenuAct->remove(itsShowHiddenAct);
+}
+
+void CKCmFontInst::fileHighlighted(const KFileItem *item)
+{
+ const KFileItemList *list=itsDirOp->selectedItems();
+
+ itsDeleteAct->setEnabled(list && list->count());
+
+#ifdef HAVE_XFT
+ if(itsPreview)
+ {
+ //
+ // Generate preview...
+ const KFileItem *previewItem=item
+ ? item
+ : list && 1==list->count()
+ ? list->getFirst()
+ : NULL;
+
+ if(previewItem && list && list->contains(previewItem)) // OK, check its been selected - not deselected!!!
+ itsPreview->openURL(previewItem->url());
+ }
+#endif
+}
+
+void CKCmFontInst::loadingFinished()
+{
+ QListView *lView=dynamic_cast<QListView *>(itsDirOp->view());
+
+ if(lView)
+ lView->sort();
+ else
+ {
+ QIconView *iView=dynamic_cast<QIconView *>(itsDirOp->view());
+
+ if(iView)
+ iView->sort();
+ }
+ fileHighlighted(NULL);
+}
+
+void CKCmFontInst::addFonts()
+{
+ KURL::List list=KFileDialog::getOpenURLs(QString::null, "application/x-font-ttf application/x-font-otf "
+ "application/x-font-ttc application/x-font-type1 "
+ "application/x-font-pcf application/x-font-bdf",
+ //"application/x-font-snf application/x-font-speedo",
+ this, i18n("Add Fonts"));
+
+ if(list.count())
+ addFonts(list, itsDirOp->url());
+}
+
+void CKCmFontInst::removeFonts()
+{
+ if(itsDirOp->selectedItems()->isEmpty())
+ KMessageBox::information(this, i18n("You did not select anything to delete."), i18n("Nothing to Delete"));
+ else
+ {
+ KURL::List urls;
+ QStringList files;
+ KFileItemListIterator it(*(itsDirOp->selectedItems()));
+
+ for(; it.current(); ++it)
+ {
+ KURL url((*it)->url());
+
+ url.setQuery(KFI_KIO_NO_CLEAR);
+ files.append((*it)->text());
+ urls.append(url);
+ }
+
+ bool doIt=false;
+
+ switch(files.count())
+ {
+ case 0:
+ break;
+ case 1:
+ doIt = KMessageBox::Continue==KMessageBox::warningContinueCancel(this,
+ i18n("<qt>Do you really want to delete\n <b>'%1'</b>?</qt>").arg(files.first()),
+ i18n("Delete Font"), KStdGuiItem::del());
+ break;
+ default:
+ doIt = KMessageBox::Continue==KMessageBox::warningContinueCancelList(this,
+ i18n("Do you really want to delete this font?", "Do you really want to delete these %n fonts?",
+ files.count()),
+ files, i18n("Delete Fonts"), KStdGuiItem::del());
+ }
+
+ if(doIt)
+ {
+ KIO::DeleteJob *job = KIO::del(urls, false, true);
+ connect(job, SIGNAL(result(KIO::Job *)), this, SLOT(delResult(KIO::Job *)));
+ job->setWindow(this);
+ job->setAutoErrorHandlingEnabled(true, this);
+ }
+ }
+}
+
+void CKCmFontInst::configure()
+{
+ CSettingsDialog(this).exec();
+}
+
+void CKCmFontInst::print()
+{
+#ifdef HAVE_XFT
+ KFileItemList list;
+ bool ok=false;
+
+ for (KFileItem *item=itsDirOp->view()->firstFileItem(); item && !ok; item=itsDirOp->view()->nextItem(item))
+ if(Print::printable(item->mimetype()))
+ ok=true;
+
+ if(ok)
+ {
+ const KFileItemList *list=itsDirOp->selectedItems();
+ bool select=false;
+
+ if(list)
+ {
+ KFileItemList::Iterator it(list->begin()),
+ end(list->end());
+
+ for(; it!=end && !select; ++it)
+ if(Print::printable((*it)->mimetype()))
+ select=true;
+ }
+
+ CPrintDialog dlg(this);
+
+ itsConfig.setGroup(CFG_GROUP);
+ if(dlg.exec(select, itsConfig.readNumEntry(CFG_FONT_SIZE, 1)))
+ {
+ static const int constSizes[]={0, 12, 18, 24, 36, 48};
+
+ QStringList items;
+ QValueVector<int> sizes;
+ CFcEngine engine;
+
+ if(dlg.outputAll())
+ {
+ for (KFileItem *item=itsDirOp->view()->firstFileItem(); item; item=itsDirOp->view()->nextItem(item))
+ items.append(item->name());
+ }
+ else
+ {
+ KFileItemList::Iterator it(list->begin()),
+ end(list->end());
+
+ for(; it!=end; ++it)
+ items.append((*it)->name());
+ }
+ Print::printItems(items, constSizes[dlg.chosenSize()], this, engine);
+ itsConfig.writeEntry(CFG_FONT_SIZE, dlg.chosenSize());
+ if(itsEmbeddedAdmin)
+ itsConfig.sync();
+ }
+ }
+ else
+ KMessageBox::information(this, i18n("There are no printable fonts.\nYou can only print non-bitmap fonts."),
+ i18n("Cannot Print"));
+#endif
+}
+
+void CKCmFontInst::dropped(const KFileItem *i, QDropEvent *, const KURL::List &urls)
+{
+ if(urls.count())
+ addFonts(urls, i && i->isDir() ? i->url() : itsDirOp->url());
+}
+
+void CKCmFontInst::infoMessage(const QString &msg)
+{
+ itsStatusLabel->setText(msg);
+}
+
+static QString family(const QString &name)
+{
+ int commaPos=name.find(',');
+
+ return -1==commaPos ? name : name.left(commaPos);
+}
+
+void CKCmFontInst::updateInformation(int, int fonts)
+{
+ KIO::filesize_t size=0;
+ QString text(i18n("One Font", "%n Fonts", fonts));
+ QStringList families;
+
+ if(fonts>0)
+ {
+ KFileItem *item=NULL;
+
+ for (item=itsDirOp->view()->firstFileItem(); item; item=itsDirOp->view()->nextItem(item))
+ {
+ QString fam(family(item->text()));
+
+ size+=item->size();
+ if(-1==families.findIndex(fam))
+ families+=fam;
+ }
+ }
+
+ if(fonts>0)
+ {
+ text+=" ";
+ text+=i18n("(%1 Total)").arg(KIO::convertSize(size));
+ }
+ text+=" - ";
+ text+=i18n("One Family", "%n Families", families.count());
+ itsStatusLabel->setText(text);
+}
+
+void CKCmFontInst::delResult(KIO::Job *job)
+{
+ //
+ // To speed up font deletion, we dont rescan font list each time - so after this has completed, we need
+ // to refresh font list before updating the directory listing...
+ QByteArray packedArgs;
+ QDataStream stream(packedArgs, IO_WriteOnly);
+
+ stream << KFI::SPECIAL_RESCAN;
+
+ KIO::NetAccess::synchronousRun(KIO::special(KFI_KIO_FONTS_PROTOCOL ":/", packedArgs), this);
+ jobResult(job);
+}
+
+void CKCmFontInst::jobResult(KIO::Job *job)
+{
+ //
+ // Force an update of the view. For some reason the view is not automatically updated when
+ // run in embedded mode - e.g. from the "Admin" mode button on KControl.
+ itsDirOp->dirLister()->updateDirectory(itsDirOp->url());
+ if(job && 0==job->error())
+ KMessageBox::information(this,
+#ifdef HAVE_XFT
+ i18n("<p>Please note that any open applications will need to be restarted in order "
+ "for any changes to be noticed.<p><p>(You will also have to restart this application "
+ "in order to use its print function on any newly installed fonts.)</p>"),
+#else
+ i18n("Please note that any open applications will need to be restarted in order "
+ "for any changes to be noticed."),
+#endif
+ i18n("Success"), "KFontinst_WarnAboutFontChangesAndOpenApps");
+}
+
+void CKCmFontInst::addFonts(const KURL::List &src, const KURL &dest)
+{
+ if(src.count())
+ {
+ KURL::List copy(src);
+ KURL::List::ConstIterator it;
+
+ //
+ // Check if font has any associated AFM or PFM file...
+ for(it=src.begin(); it!=src.end(); ++it)
+ {
+ KURL::List associatedUrls;
+
+ Misc::getAssociatedUrls(*it, associatedUrls, false, this);
+ copy+=associatedUrls;
+ }
+
+ KIO::CopyJob *job=KIO::copy(copy, dest, true);
+ connect(job, SIGNAL(result(KIO::Job *)), this, SLOT(jobResult(KIO::Job *)));
+ job->setWindow(this);
+ job->setAutoErrorHandlingEnabled(true, this);
+ }
+}
+
+}
+
+#include "KCmFontInst.moc"
diff --git a/kcontrol/kfontinst/kcmfontinst/KCmFontInst.h b/kcontrol/kfontinst/kcmfontinst/KCmFontInst.h
new file mode 100644
index 000000000..add6c4c36
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/KCmFontInst.h
@@ -0,0 +1,116 @@
+#ifndef __KCM_FONT_INST_H__
+#define __KCM_FONT_INST_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CKCmFontInst
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 26/04/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <qstringlist.h>
+#include <kcmodule.h>
+#include <kurl.h>
+#include <kconfig.h>
+#include <kio/job.h>
+#ifdef HAVE_XFT
+#include <kparts/part.h>
+#endif
+
+class KDirOperator;
+class KAction;
+class KRadioAction;
+class KActionMenu;
+class KToggleAction;
+class KFileItem;
+class QLabel;
+class QSplitter;
+class QDropEvent;
+class KFileItem;
+
+namespace KFI
+{
+
+class CKCmFontInst : public KCModule
+{
+ Q_OBJECT
+
+ public:
+
+ CKCmFontInst(QWidget *parent=NULL, const char *name=NULL, const QStringList &list=QStringList());
+ virtual ~CKCmFontInst();
+
+ void setMimeTypes(bool showBitmap);
+
+ public slots:
+
+ void filterFonts();
+ QString quickHelp() const;
+ void listView();
+ void iconView();
+ void setupMenu();
+ void setupViewMenu();
+ void fileHighlighted(const KFileItem *item);
+ void loadingFinished();
+ void addFonts();
+ void removeFonts();
+ void configure();
+ void print();
+ void dropped(const KFileItem *i, QDropEvent *e, const KURL::List &urls);
+ void infoMessage(const QString &msg);
+ void updateInformation(int dirs, int fonts);
+ void delResult(KIO::Job *job);
+ void jobResult(KIO::Job *job);
+
+ private:
+
+ void addFonts(const KURL::List &src, const KURL &dest);
+
+ private:
+
+ KDirOperator *itsDirOp;
+ KURL itsTop;
+ KToggleAction *itsShowBitmapAct;
+ KAction *itsSepDirsAct,
+ *itsShowHiddenAct,
+ *itsDeleteAct;
+ KRadioAction *itsListAct,
+ *itsIconAct;
+ KActionMenu *itsViewMenuAct;
+#ifdef HAVE_XFT
+ KParts::ReadOnlyPart *itsPreview;
+#endif
+ QSplitter *itsSplitter;
+ KConfig itsConfig;
+ bool itsEmbeddedAdmin;
+ QLabel *itsStatusLabel;
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/kcmfontinst/KFileFontIconView.cpp b/kcontrol/kfontinst/kcmfontinst/KFileFontIconView.cpp
new file mode 100644
index 000000000..d814d0c6b
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/KFileFontIconView.cpp
@@ -0,0 +1,88 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CKFileFontIconView
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 31/05/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include <qevent.h>
+#include <kfileitem.h>
+#include <kurldrag.h>
+#include "KFileFontIconView.h"
+
+namespace KFI
+{
+
+// CPD: KDE4 should make acceptDrag() virtual there fore can get rid of all these ::contentsX functions...
+void CKFileFontIconView::contentsDragEnterEvent(QDragEnterEvent *e)
+{
+ if(acceptDrag(e))
+ KFileIconView::contentsDragEnterEvent(e);
+ else
+ e->ignore();
+}
+
+void CKFileFontIconView::contentsDragMoveEvent(QDragMoveEvent *e)
+{
+ if(acceptDrag(e))
+ KFileIconView::contentsDragMoveEvent(e);
+ else
+ e->ignore();
+}
+
+void CKFileFontIconView::contentsDropEvent(QDropEvent *e)
+{
+ contentsDragLeaveEvent(NULL);
+
+ if(acceptDrag(e))
+ KFileIconView::contentsDropEvent(e);
+ else
+ e->ignore();
+}
+
+bool CKFileFontIconView::acceptDrag(QDropEvent *e) const
+{
+#if 0 // Crashes - seems to be called to quick???
+ bool ok=false;
+ KURL::List urls;
+
+ if(KURLDrag::canDecode(e) && (e->source()!=const_cast<CKFileFontIconView *>(this)) &&
+ (QDropEvent::Copy==e->action() || QDropEvent::Move==e->action()) &&
+ KURLDrag::decode(e, urls) && !urls.isEmpty())
+ {
+ KURL::List::Iterator it;
+
+ ok=true;
+ for(it=urls.begin(); ok && it!=urls.end(); ++it)
+ if(!CFontEngine::isAFontOrAfm(QFile::encodeName((*it).path())))
+ ok=false;
+ }
+
+ return ok;
+#endif
+ return KURLDrag::canDecode(e) && (e->source()!= const_cast<CKFileFontIconView*>(this)) &&
+ (QDropEvent::Copy==e->action() || QDropEvent::Move==e->action());
+}
+
+}
diff --git a/kcontrol/kfontinst/kcmfontinst/KFileFontIconView.h b/kcontrol/kfontinst/kcmfontinst/KFileFontIconView.h
new file mode 100644
index 000000000..936bb5bca
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/KFileFontIconView.h
@@ -0,0 +1,55 @@
+#ifndef __KFILE_FONT_ICON_VIEW_H__
+#define __KFILE_FONT_ICON_VIEW_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CKFileFontIconView
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 01/08/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include <kfileiconview.h>
+
+namespace KFI
+{
+
+class CKFileFontIconView : public KFileIconView
+{
+ public:
+
+ CKFileFontIconView(QWidget *parent, const char *name) : KFileIconView(parent, name) {}
+ virtual ~CKFileFontIconView() {}
+
+ protected:
+
+ // DND support
+ void contentsDragEnterEvent(QDragEnterEvent *e);
+ void contentsDragMoveEvent(QDragMoveEvent *e);
+ void contentsDropEvent(QDropEvent *e);
+ bool acceptDrag(QDropEvent *e) const;
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/kcmfontinst/KFileFontView.cpp b/kcontrol/kfontinst/kcmfontinst/KFileFontView.cpp
new file mode 100644
index 000000000..7346ca6c8
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/KFileFontView.cpp
@@ -0,0 +1,645 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : CKFileFontView
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 31/05/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// NOTE: HEAVILY copied from kfiledetailview.cpp...
+//
+// Copyright (C) 1997 Stephan Kulow <coolo@kde.org>
+// 2000, 2001 Carsten Pfeiffer <pfeiffer@kde.org>
+//
+
+#include <qevent.h>
+#include <qkeycode.h>
+#include <qheader.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <kapplication.h>
+#include <kfileitem.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <kicontheme.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <kurldrag.h>
+#include "KFileFontView.h"
+
+#define COL_NAME 0
+#define COL_SIZE 1
+#define COL_TYPE 2
+
+class CKFileFontView::CKFileFontViewPrivate
+{
+ public:
+
+ CKFileFontViewPrivate() : itsDropItem(0) {}
+
+ CFontListViewItem *itsDropItem;
+ QTimer itsAutoOpenTimer;
+};
+
+CKFileFontView::CKFileFontView(QWidget *parent, const char *name)
+ : KListView(parent, name),
+ KFileView(),
+ d(new CKFileFontViewPrivate())
+{
+ itsSortingCol = COL_NAME;
+ itsBlockSortingSignal = false;
+ setViewName(i18n("Detailed View"));
+
+ addColumn(i18n("Name"));
+ addColumn(i18n("Size"));
+ addColumn(i18n("Type"));
+ setShowSortIndicator(true);
+ setAllColumnsShowFocus(true);
+ setDragEnabled(false);
+
+ connect(header(), SIGNAL(sectionClicked(int)), SLOT(slotSortingChanged(int)));
+ connect(this, SIGNAL(returnPressed(QListViewItem *)), SLOT(slotActivate(QListViewItem *)));
+ connect(this, SIGNAL(clicked(QListViewItem *, const QPoint&, int)), SLOT(selected( QListViewItem *)));
+ connect(this, SIGNAL(doubleClicked(QListViewItem *, const QPoint &, int)), SLOT(slotActivate(QListViewItem *)));
+ connect(this, SIGNAL(contextMenuRequested(QListViewItem *, const QPoint &, int)),
+ this, SLOT(slotActivateMenu(QListViewItem *, const QPoint &)));
+
+ // DND
+ connect(&(d->itsAutoOpenTimer), SIGNAL(timeout()), this, SLOT(slotAutoOpen()));
+ setSelectionMode(KFileView::selectionMode());
+ itsResolver = new KMimeTypeResolver<CFontListViewItem, CKFileFontView>(this);
+}
+
+CKFileFontView::~CKFileFontView()
+{
+ delete itsResolver;
+ delete d;
+}
+
+void CKFileFontView::setSelected(const KFileItem *info, bool enable)
+{
+ if (info)
+ {
+ // we can only hope that this casts works
+ CFontListViewItem *item = (CFontListViewItem*)info->extraData(this);
+
+ if (item)
+ KListView::setSelected(item, enable);
+ }
+}
+
+void CKFileFontView::setCurrentItem(const KFileItem *item)
+{
+ if (item)
+ {
+ CFontListViewItem *it = (CFontListViewItem*) item->extraData(this);
+
+ if (it)
+ KListView::setCurrentItem(it);
+ }
+}
+
+KFileItem * CKFileFontView::currentFileItem() const
+{
+ CFontListViewItem *current = static_cast<CFontListViewItem*>(currentItem());
+
+ return current ? current->fileInfo() : NULL;
+}
+
+void CKFileFontView::clearSelection()
+{
+ KListView::clearSelection();
+}
+
+void CKFileFontView::selectAll()
+{
+ if (KFile::NoSelection!=KFileView::selectionMode() && KFile::Single!=KFileView::selectionMode())
+ KListView::selectAll(true);
+}
+
+void CKFileFontView::invertSelection()
+{
+ KListView::invertSelection();
+}
+
+void CKFileFontView::slotActivateMenu(QListViewItem *item,const QPoint& pos)
+{
+ if (!item)
+ sig->activateMenu(0, pos);
+ else
+ {
+ CFontListViewItem *i = (CFontListViewItem*) item;
+ sig->activateMenu(i->fileInfo(), pos);
+ }
+}
+
+void CKFileFontView::clearView()
+{
+ itsResolver->m_lstPendingMimeIconItems.clear();
+ KListView::clear();
+}
+
+void CKFileFontView::insertItem(KFileItem *i)
+{
+ KFileView::insertItem(i);
+
+ CFontListViewItem *item = new CFontListViewItem((QListView*) this, i);
+
+ setSortingKey(item, i);
+
+ i->setExtraData(this, item);
+
+ if (!i->isMimeTypeKnown())
+ itsResolver->m_lstPendingMimeIconItems.append(item);
+}
+
+void CKFileFontView::slotActivate(QListViewItem *item)
+{
+ if (item)
+ {
+ const KFileItem *fi = ((CFontListViewItem*)item)->fileInfo();
+
+ if (fi)
+ sig->activate(fi);
+ }
+}
+
+void CKFileFontView::selected(QListViewItem *item)
+{
+ if (item && !(KApplication::keyboardMouseState() & (ShiftButton|ControlButton)) &&
+ KGlobalSettings::singleClick())
+ {
+ const KFileItem *fi = ((CFontListViewItem*)item)->fileInfo();
+
+ if (fi && (fi->isDir() || !onlyDoubleClickSelectsFiles()))
+ sig->activate(fi);
+ }
+}
+
+void CKFileFontView::highlighted( QListViewItem *item )
+{
+ if (item)
+ {
+ const KFileItem *fi = ((CFontListViewItem*)item)->fileInfo();
+
+ if (fi)
+ sig->highlightFile(fi);
+ }
+}
+
+void CKFileFontView::setSelectionMode(KFile::SelectionMode sm)
+{
+ disconnect(SIGNAL(selectionChanged()), this);
+ disconnect(SIGNAL(selectionChanged(QListViewItem *)), this);
+
+ switch (sm)
+ {
+ case KFile::Multi:
+ QListView::setSelectionMode(QListView::Multi);
+ break;
+ case KFile::Extended:
+ QListView::setSelectionMode(QListView::Extended);
+ break;
+ case KFile::NoSelection:
+ QListView::setSelectionMode(QListView::NoSelection);
+ break;
+ default: // fall through
+ case KFile::Single:
+ QListView::setSelectionMode(QListView::Single);
+ break;
+ }
+
+ // for highlighting
+ if (KFile::Multi==sm || KFile::Extended==sm)
+ connect(this, SIGNAL(selectionChanged()), SLOT(slotSelectionChanged()));
+ else
+ connect(this, SIGNAL(selectionChanged(QListViewItem *)), SLOT(highlighted(QListViewItem * )));
+}
+
+bool CKFileFontView::isSelected(const KFileItem *i) const
+{
+ if (!i)
+ return false;
+ else
+ {
+ CFontListViewItem *item = (CFontListViewItem*) i->extraData(this);
+
+ return (item && item->isSelected());
+ }
+}
+
+void CKFileFontView::updateView(bool b)
+{
+ if (b)
+ {
+ QListViewItemIterator it((QListView*)this);
+
+ for (; it.current(); ++it)
+ {
+ CFontListViewItem *item=static_cast<CFontListViewItem *>(it.current());
+
+ item->setPixmap(0, item->fileInfo()->pixmap(KIcon::SizeSmall));
+ }
+ }
+}
+
+void CKFileFontView::updateView(const KFileItem *i)
+{
+ if (i)
+ {
+ CFontListViewItem *item = (CFontListViewItem*) i->extraData(this);
+
+ if (item)
+ {
+ item->init();
+ setSortingKey(item, i);
+ }
+ }
+}
+
+void CKFileFontView::setSortingKey(CFontListViewItem *item, const KFileItem *i)
+{
+ QDir::SortSpec spec = KFileView::sorting();
+
+ if (spec&QDir::Size)
+ item->setKey(sortingKey(i->size(), i->isDir(), spec));
+ else
+ item->setKey(sortingKey(i->text(), i->isDir(), spec));
+}
+
+void CKFileFontView::removeItem(const KFileItem *i)
+{
+ if (i)
+ {
+ CFontListViewItem *item = (CFontListViewItem*) i->extraData(this);
+
+ itsResolver->m_lstPendingMimeIconItems.remove(item);
+ delete item;
+
+ KFileView::removeItem(i);
+ }
+}
+
+void CKFileFontView::slotSortingChanged(int col)
+{
+ QDir::SortSpec sort = sorting();
+ int sortSpec = -1;
+ bool reversed = col == itsSortingCol && (sort & QDir::Reversed) == 0;
+ itsSortingCol = col;
+
+ switch(col)
+ {
+ case COL_NAME:
+ sortSpec = (sort & ~QDir::SortByMask | QDir::Name);
+ break;
+ case COL_SIZE:
+ sortSpec = (sort & ~QDir::SortByMask | QDir::Size);
+ break;
+ // the following columns have no equivalent in QDir, so we set it
+ // to QDir::Unsorted and remember the column (itsSortingCol)
+ case COL_TYPE:
+ sortSpec = (sort & ~QDir::SortByMask | QDir::Time);
+ break;
+ default:
+ break;
+ }
+
+ if (reversed)
+ sortSpec|=QDir::Reversed;
+ else
+ sortSpec&=~QDir::Reversed;
+
+ if (sort & QDir::IgnoreCase)
+ sortSpec|=QDir::IgnoreCase;
+ else
+ sortSpec&=~QDir::IgnoreCase;
+
+ KFileView::setSorting(static_cast<QDir::SortSpec>(sortSpec));
+
+ KFileItem *item;
+ KFileItemListIterator it(*items());
+
+ if ( sortSpec & QDir::Size )
+ {
+ for (; (item = it.current()); ++it )
+ {
+ CFontListViewItem *i = viewItem(item);
+ i->setKey(sortingKey(item->size(), item->isDir(), sortSpec));
+ }
+ }
+ else
+ for (; (item = it.current()); ++it )
+ {
+ CFontListViewItem *i = viewItem(item);
+
+ i->setKey(sortingKey(i->text(itsSortingCol), item->isDir(), sortSpec));
+ }
+
+ KListView::setSorting(itsSortingCol, !reversed);
+ KListView::sort();
+
+ if (!itsBlockSortingSignal)
+ sig->changeSorting( static_cast<QDir::SortSpec>( sortSpec ) );
+}
+
+void CKFileFontView::setSorting(QDir::SortSpec spec)
+{
+ if (spec & QDir::Size)
+ itsSortingCol=COL_SIZE;
+ else
+ itsSortingCol=COL_NAME;
+
+ // inversed, because slotSortingChanged will reverse it
+ if (spec & QDir::Reversed)
+ spec = (QDir::SortSpec) (spec & ~QDir::Reversed);
+ else
+ spec = (QDir::SortSpec) (spec | QDir::Reversed);
+
+ KFileView::setSorting((QDir::SortSpec) spec);
+
+ // don't emit sortingChanged() when called via setSorting()
+ itsBlockSortingSignal = true; // can't use blockSignals()
+ slotSortingChanged(itsSortingCol);
+ itsBlockSortingSignal = false;
+}
+
+void CKFileFontView::ensureItemVisible(const KFileItem *i)
+{
+ if (i)
+ {
+ CFontListViewItem *item = (CFontListViewItem*) i->extraData(this);
+
+ if ( item )
+ KListView::ensureItemVisible(item);
+ }
+}
+
+// we're in multiselection mode
+void CKFileFontView::slotSelectionChanged()
+{
+ sig->highlightFile(NULL);
+}
+
+KFileItem * CKFileFontView::firstFileItem() const
+{
+ CFontListViewItem *item = static_cast<CFontListViewItem*>(firstChild());
+
+ return item ? item->fileInfo() : NULL;
+}
+
+KFileItem * CKFileFontView::nextItem(const KFileItem *fileItem) const
+{
+ if (fileItem)
+ {
+ CFontListViewItem *item = viewItem(fileItem);
+
+ return item && item->itemBelow() ? ((CFontListViewItem*) item->itemBelow())->fileInfo() : NULL;
+ }
+
+ return firstFileItem();
+}
+
+KFileItem * CKFileFontView::prevItem(const KFileItem *fileItem) const
+{
+ if (fileItem)
+ {
+ CFontListViewItem *item = viewItem(fileItem);
+
+ return item && item->itemAbove() ? ((CFontListViewItem*) item->itemAbove())->fileInfo() : NULL;
+ }
+
+ return firstFileItem();
+}
+
+void CKFileFontView::keyPressEvent(QKeyEvent *e)
+{
+ KListView::keyPressEvent(e);
+
+ if (Key_Return==e->key() || Key_Enter==e->key())
+ if (e->state() & ControlButton)
+ e->ignore();
+ else
+ e->accept();
+}
+
+//
+// mimetype determination on demand
+//
+void CKFileFontView::mimeTypeDeterminationFinished()
+{
+ // anything to do?
+}
+
+void CKFileFontView::determineIcon(CFontListViewItem *item)
+{
+ item->fileInfo()->determineMimeType();
+ updateView(item->fileInfo());
+}
+
+void CKFileFontView::listingCompleted()
+{
+ itsResolver->start();
+}
+
+QDragObject *CKFileFontView::dragObject()
+{
+ // create a list of the URL:s that we want to drag
+ KURL::List urls;
+ KFileItemListIterator it(* KFileView::selectedItems());
+ QPixmap pixmap;
+ QPoint hotspot;
+
+ for ( ; it.current(); ++it )
+ urls.append( (*it)->url() );
+
+ if(urls.count()> 1)
+ pixmap = DesktopIcon("kmultiple", KIcon::SizeSmall);
+ if(pixmap.isNull())
+ pixmap = currentFileItem()->pixmap(KIcon::SizeSmall);
+
+ hotspot.setX(pixmap.width() / 2);
+ hotspot.setY(pixmap.height() / 2);
+
+ QDragObject *dragObject=new KURLDrag(urls, widget());
+
+ if(dragObject)
+ dragObject->setPixmap(pixmap, hotspot);
+
+ return dragObject;
+}
+
+void CKFileFontView::slotAutoOpen()
+{
+ d->itsAutoOpenTimer.stop();
+
+ if(d->itsDropItem)
+ {
+ KFileItem *fileItem = d->itsDropItem->fileInfo();
+
+ if (fileItem && !fileItem->isFile() && (fileItem->isDir() || fileItem->isLink()))
+ sig->activate(fileItem);
+ }
+}
+
+bool CKFileFontView::acceptDrag(QDropEvent *e) const
+{
+#if 0 // Following doesn't seem to work, why???
+ bool ok=false;
+ KURL::List urls;
+
+
+ if((e->source()!=const_cast<CKFileFontView *>(this)) &&
+ (QDropEvent::Copy==e->action() || QDropEvent::Move==e->action()) &&
+ KURLDrag::decode(e, urls) && !urls.isEmpty())
+ {
+ KURL::List::Iterator it;
+
+ ok=true;
+ for(it=urls.begin(); ok && it!=urls.end(); ++it)
+ if(!CFontEngine::isAFontOrAfm(QFile::encodeName((*it).path())))
+ ok=false;
+ }
+
+ return ok;
+#endif
+
+ return KURLDrag::canDecode(e) && (e->source()!= const_cast<CKFileFontView*>(this)) &&
+ (QDropEvent::Copy==e->action() || QDropEvent::Move==e->action());
+}
+
+void CKFileFontView::contentsDragEnterEvent(QDragEnterEvent *e)
+{
+ if (!acceptDrag(e)) // can we decode this ?
+ e->ignore(); // No
+ else
+ {
+ e->acceptAction(); // Yes
+
+ if((dropOptions() & AutoOpenDirs))
+ {
+ CFontListViewItem *item = dynamic_cast<CFontListViewItem*>(itemAt(contentsToViewport(e->pos())));
+ if (item) // are we over an item ?
+ {
+ d->itsDropItem = item;
+ d->itsAutoOpenTimer.start(autoOpenDelay()); // restart timer
+ }
+ else
+ {
+ d->itsDropItem = 0;
+ d->itsAutoOpenTimer.stop();
+ }
+ }
+ }
+}
+
+void CKFileFontView::contentsDragMoveEvent(QDragMoveEvent *e)
+{
+ if (!acceptDrag(e)) // can we decode this ?
+ e->ignore(); // No
+ else
+ {
+ e->acceptAction(); // Yes
+
+ if ((dropOptions() & AutoOpenDirs))
+ {
+ CFontListViewItem *item = dynamic_cast<CFontListViewItem*>(itemAt(contentsToViewport(e->pos())));
+
+ if (item) // are we over an item ?
+ {
+ if (d->itsDropItem != item)
+ {
+ d->itsDropItem = item;
+ d->itsAutoOpenTimer.start(autoOpenDelay()); // restart timer
+ }
+ }
+ else
+ {
+ d->itsDropItem = 0;
+ d->itsAutoOpenTimer.stop();
+ }
+ }
+ }
+}
+
+void CKFileFontView::contentsDragLeaveEvent(QDragLeaveEvent *)
+{
+ d->itsDropItem = 0;
+ d->itsAutoOpenTimer.stop();
+}
+
+void CKFileFontView::contentsDropEvent(QDropEvent *e)
+{
+ d->itsDropItem = 0;
+ d->itsAutoOpenTimer.stop();
+
+ if (!acceptDrag(e)) // can we decode this ?
+ e->ignore(); // No
+ else
+ {
+ e->acceptAction(); // Yes
+
+ CFontListViewItem *item = dynamic_cast<CFontListViewItem*>(itemAt(contentsToViewport(e->pos())));
+ KFileItem *fileItem = item ? item->fileInfo() : 0;
+ KURL::List urls;
+
+ emit dropped(e, fileItem);
+
+ if(KURLDrag::decode(e, urls) && !urls.isEmpty())
+ {
+ emit dropped(e, urls, fileItem ? fileItem->url() : KURL());
+ sig->dropURLs(fileItem, e, urls);
+ }
+ }
+}
+
+void CKFileFontView::readConfig(KConfig *kc, const QString &group)
+{
+ restoreLayout(kc, group.isEmpty() ? QString("CFileFontView") : group);
+ slotSortingChanged(sortColumn());
+}
+
+void CKFileFontView::writeConfig(KConfig *kc, const QString &group)
+{
+ saveLayout(kc, group.isEmpty() ? QString("CFileFontView") : group);
+}
+
+/////////////////////////////////////////////////////////////////
+
+void CFontListViewItem::init()
+{
+ CFontListViewItem::setPixmap(COL_NAME, itsInf->pixmap(KIcon::SizeSmall));
+
+ setText(COL_NAME, itsInf->text());
+ setText(COL_SIZE, itsInf->isDir() ? "" : KGlobal::locale()->formatNumber(itsInf->size(), 0));
+ setText(COL_TYPE, itsInf->mimeComment());
+}
+
+void CKFileFontView::virtual_hook(int id, void *data)
+{
+ KListView::virtual_hook(id, data);
+ KFileView::virtual_hook(id, data);
+}
+
+#include "KFileFontView.moc"
diff --git a/kcontrol/kfontinst/kcmfontinst/KFileFontView.h b/kcontrol/kfontinst/kcmfontinst/KFileFontView.h
new file mode 100644
index 000000000..a58f9d908
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/KFileFontView.h
@@ -0,0 +1,219 @@
+#ifndef __KFILE_FONT_VIEW_H__
+#define __KFILE_FONT_VIEW_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : CKFileFontView
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 31/05/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// NOTE: HEAVILY copied from kfiledetailview.cpp...
+//
+// Copyright (C) 1997 Stephan Kulow <coolo@kde.org>
+// 2000, 2001 Carste
+
+class KFileItem;
+class QWidget;
+class QKeyEvent;
+
+#include <klistview.h>
+#include <kmimetyperesolver.h>
+
+#include "kfileview.h"
+
+/**
+ * An item for the listiew, that has a reference to its corresponding
+ * @ref KFileItem.
+ */
+class CFontListViewItem : public KListViewItem
+{
+ public:
+
+ CFontListViewItem(QListView *parent, const QString &text, const QPixmap &icon, KFileItem *fi)
+ : KListViewItem(parent, text),
+ itsInf(fi)
+ {
+ setPixmap(0, icon);
+ setText(0, text);
+ }
+
+ CFontListViewItem(QListView *parent, KFileItem *fi)
+ : KListViewItem(parent),
+ itsInf(fi)
+ {
+ init();
+ }
+
+ CFontListViewItem(QListView *parent, const QString &text, const QPixmap &icon, KFileItem *fi, QListViewItem *after)
+ : KListViewItem(parent, after),
+ itsInf(fi)
+ {
+ setPixmap(0, icon);
+ setText(0, text);
+ }
+
+ ~CFontListViewItem() { itsInf->removeExtraData(listView()); }
+
+ /**
+ * @returns the corresponding KFileItem
+ */
+ KFileItem *fileInfo() const { return itsInf; }
+
+ virtual QString key( int /*column*/, bool /*ascending*/ ) const { return itsKey; }
+
+ void setKey( const QString& key ) { itsKey = key; }
+
+ QRect rect() const
+ {
+ QRect r = listView()->itemRect(this);
+
+ return QRect(listView()->viewportToContents(r.topLeft()), QSize(r.width(), r.height()));
+ }
+
+ void init();
+
+ private:
+
+ KFileItem *itsInf;
+ QString itsKey;
+
+ class CFontListViewItemPrivate;
+
+ CFontListViewItemPrivate *d;
+};
+
+/**
+ * A list-view capable of showing @ref KFileItem'. Used in the filedialog
+ * for example. Most of the documentation is in @ref KFileView class.
+ *
+ * @see KDirOperator
+ * @see KCombiView
+ * @see KFileIconView
+ */
+class CKFileFontView : public KListView, public KFileView
+{
+ Q_OBJECT
+
+ public:
+
+ CKFileFontView(QWidget *parent, const char *name);
+ virtual ~CKFileFontView();
+
+ virtual QWidget * widget() { return this; }
+ virtual void clearView();
+ virtual void setAutoUpdate(bool) {} // ### unused. remove in KDE4
+ virtual void setSelectionMode( KFile::SelectionMode sm );
+ virtual void updateView(bool b);
+ virtual void updateView(const KFileItem *i);
+ virtual void removeItem(const KFileItem *i);
+ virtual void listingCompleted();
+ virtual void setSelected(const KFileItem *i, bool b);
+ virtual bool isSelected(const KFileItem *i) const;
+ virtual void clearSelection();
+ virtual void selectAll();
+ virtual void invertSelection();
+ virtual void setCurrentItem( const KFileItem *i);
+ virtual KFileItem * currentFileItem() const;
+ virtual KFileItem * firstFileItem() const;
+ virtual KFileItem * nextItem(const KFileItem *i) const;
+ virtual KFileItem * prevItem(const KFileItem *i) const;
+ virtual void insertItem( KFileItem *i);
+
+ void readConfig(KConfig *kc, const QString &group);
+ void writeConfig(KConfig *kc, const QString &group);
+
+ // implemented to get noticed about sorting changes (for sortingIndicator)
+ virtual void setSorting(QDir::SortSpec s);
+ void ensureItemVisible(const KFileItem *i);
+
+ // for KMimeTypeResolver
+ void mimeTypeDeterminationFinished();
+ void determineIcon(CFontListViewItem *item);
+ QScrollView * scrollWidget() const { return (QScrollView*) this; }
+
+ signals:
+ // The user dropped something.
+ // fileItem points to the item dropped on or can be 0 if the
+ // user dropped on empty space.
+ void dropped(QDropEvent *event, KFileItem *fileItem);
+ // The user dropped the URLs urls.
+ // url points to the item dropped on or can be empty if the
+ // user dropped on empty space.
+ void dropped(QDropEvent *event, const KURL::List &urls, const KURL &url);
+
+ protected:
+
+ virtual void keyPressEvent(QKeyEvent *e);
+ // DND support
+ QDragObject * dragObject();
+ void contentsDragEnterEvent(QDragEnterEvent *e);
+ void contentsDragMoveEvent(QDragMoveEvent *e);
+ void contentsDragLeaveEvent(QDragLeaveEvent *e);
+ void contentsDropEvent(QDropEvent *e);
+ bool acceptDrag(QDropEvent *e) const;
+
+ int itsSortingCol;
+
+ protected slots:
+
+ void slotSelectionChanged();
+
+ private slots:
+
+ void slotSortingChanged(int c);
+ void selected(QListViewItem *item);
+ void slotActivate(QListViewItem *item);
+ void highlighted(QListViewItem *item);
+ void slotActivateMenu(QListViewItem *item, const QPoint& pos);
+ void slotAutoOpen();
+
+ private:
+
+ virtual void insertItem(QListViewItem *i) { KListView::insertItem(i); }
+ virtual void setSorting(int i, bool b) { KListView::setSorting(i, b); }
+ virtual void setSelected(QListViewItem *i, bool b) { KListView::setSelected(i, b); }
+
+ inline CFontListViewItem * viewItem( const KFileItem *item ) const
+ {
+ return item ? (CFontListViewItem *) item->extraData(this) : NULL;
+ }
+
+ void setSortingKey( CFontListViewItem *item, const KFileItem *i);
+
+ bool itsBlockSortingSignal;
+ KMimeTypeResolver<CFontListViewItem,CKFileFontView> *itsResolver;
+
+ protected:
+
+ virtual void virtual_hook(int id, void *data);
+
+ private:
+
+ class CKFileFontViewPrivate;
+ CKFileFontViewPrivate *d;
+};
+
+#endif
diff --git a/kcontrol/kfontinst/kcmfontinst/Makefile.am b/kcontrol/kfontinst/kcmfontinst/Makefile.am
new file mode 100644
index 000000000..7a4c78920
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/Makefile.am
@@ -0,0 +1,31 @@
+if include_fontinst_tn
+FONTINST_PRINT_INC=-I$(srcdir)/../viewpart
+FONTINST_PRINT_LIB=../viewpart/libkfontinstprint.la
+endif
+
+kde_module_LTLIBRARIES = kcm_fontinst.la
+kcm_fontinst_la_LIBADD = $(LIB_KIO) $(FONTINST_PRINT_LIB) $(LIBFREETYPE_LIBS) $(LIBFONTCONFIG_LIBS) ../lib/libkfontinst.la
+METASOURCES = AUTO
+kcm_fontinst_la_LDFLAGS = $(KDE_PLUGIN) $(all_libraries) $(KDE_RPATH) -module -avoid-version -no-undefined
+AM_CPPFLAGS = -I$(srcdir)/../lib $(FONTINST_PRINT_INC) -I$(srcdir)/../../fonts $(all_includes) $(LIBFREETYPE_CFLAGS) $(LIBFONTCONFIG_CFLAGS)
+
+xdg_apps_DATA = kcmfontinst.desktop
+
+kcm_fontinst_la_SOURCES = \
+ KCmFontInst.cpp \
+ KFileFontIconView.cpp \
+ KFileFontView.cpp \
+ PrintDialog.cpp \
+ SettingsDialog.cpp
+
+EXTRA_DIST = \
+ $(xdg_apps_DATA) \
+ KCmFontInst.h \
+ KFileFontIconView.h \
+ KFileFontView.h \
+ PrintDialog.h \
+ SettingsDialog.h
+
+noinst_HEADERS = $(EXTRA_DIST)
+
+KDE_ICON = AUTO
diff --git a/kcontrol/kfontinst/kcmfontinst/PrintDialog.cpp b/kcontrol/kfontinst/kcmfontinst/PrintDialog.cpp
new file mode 100644
index 000000000..e902fa1e1
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/PrintDialog.cpp
@@ -0,0 +1,74 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CPrintDialog
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 12/05/2005
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2005
+////////////////////////////////////////////////////////////////////////////////
+
+#include "PrintDialog.h"
+#include <qlayout.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <klocale.h>
+
+namespace KFI
+{
+
+CPrintDialog::CPrintDialog(QWidget *parent)
+ : KDialogBase(Plain, i18n("Print Font Samples"), Ok|Cancel, Ok, parent, NULL, true, false)
+{
+ QFrame *page=plainPage();
+ QGridLayout *layout=new QGridLayout(page, 1, 1, 0, spacingHint());
+
+ layout->addWidget(new QLabel(i18n("Output:"), page), 0, 0);
+ itsOutput=new QComboBox(page);
+ itsOutput->insertItem(i18n("All Fonts"), 0);
+ itsOutput->insertItem(i18n("Selected Fonts"), 1);
+ layout->addWidget(itsOutput, 0, 1);
+ layout->addWidget(new QLabel(i18n("Font size:"), page), 1, 0);
+ itsSize=new QComboBox(page);
+ itsSize->insertItem(i18n("Waterfall"), 0);
+ itsSize->insertItem(i18n("12pt"), 1);
+ itsSize->insertItem(i18n("18pt"), 2);
+ itsSize->insertItem(i18n("24pt"), 3);
+ itsSize->insertItem(i18n("36pt"), 4);
+ itsSize->insertItem(i18n("48pt"), 5);
+ layout->addWidget(itsSize, 1, 1);
+ layout->addItem(new QSpacerItem(2, 2), 2, 1);
+}
+
+bool CPrintDialog::exec(bool select, int size)
+{
+ if(!select)
+ {
+ itsOutput->setCurrentItem(0);
+ itsOutput->setEnabled(false);
+ }
+ else
+ itsOutput->setCurrentItem(1);
+ itsSize->setCurrentItem(size);
+ return QDialog::Accepted==QDialog::exec();
+}
+
+}
diff --git a/kcontrol/kfontinst/kcmfontinst/PrintDialog.h b/kcontrol/kfontinst/kcmfontinst/PrintDialog.h
new file mode 100644
index 000000000..9be67f6d4
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/PrintDialog.h
@@ -0,0 +1,56 @@
+#ifndef __PRINT_DIALOG_H__
+#define __PRINT_DIALOG_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CPrintDialog
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 12/05/2005
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2005
+////////////////////////////////////////////////////////////////////////////////
+
+#include <kdialogbase.h>
+#include <qcombobox.h>
+
+namespace KFI
+{
+
+class CPrintDialog : public KDialogBase
+{
+ public:
+
+ CPrintDialog(QWidget *parent);
+
+ bool exec(bool select, int size);
+ int chosenSize() { return itsSize->currentItem(); }
+ bool outputAll() { return 0==itsOutput->currentItem(); }
+
+ private:
+
+ QComboBox *itsOutput,
+ *itsSize;
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/kcmfontinst/SettingsDialog.cpp b/kcontrol/kfontinst/kcmfontinst/SettingsDialog.cpp
new file mode 100644
index 000000000..255fca709
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/SettingsDialog.cpp
@@ -0,0 +1,99 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CSettingsDialog
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 10/05/2005
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2005
+////////////////////////////////////////////////////////////////////////////////
+
+#include "SettingsDialog.h"
+#include "KfiConstants.h"
+#include "Misc.h"
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qvbox.h>
+#include <qwhatsthis.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kmessagebox.h>
+#include <kio/job.h>
+#include <kio/netaccess.h>
+
+namespace KFI
+{
+
+CSettingsDialog::CSettingsDialog(QWidget *parent)
+ : KDialogBase(parent, "settingsdialog", true, i18n("Settings"),
+ KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true)
+{
+ QVBox *page = makeVBoxMainWidget();
+
+ itsDoX=new QCheckBox(i18n("Configure fonts for legacy X applications"), page);
+ QWhatsThis::add(itsDoX, i18n("<p>Modern applications use a system called \"FontConfig\" to obtain the list of fonts. "
+ "Older applications, such as OpenOffice 1.x, GIMP 1.x, etc. use the previous \"core X fonts\" mechanism for "
+ "this.</p><p>Selecting this option will inform the installer to create the necessary files so that these "
+ "older applications can use the fonts you install.</p><p>Please note, however, that this will slow down "
+ "the installation process.<p>"));
+ itsDoGs=new QCheckBox(i18n("Configure fonts for Ghostscript"), page);
+ QWhatsThis::add(itsDoGs, i18n("<p>When printing, most applications create what is know as PostScript. This is then sent to a special "
+ "application, named Ghostscript, which can interpret the PostScript and send the appropriate instructions "
+ "to your printer. If your application does not embed whatever fonts it uses into the PostScript, then "
+ "Ghostscript needs to be informed as to which fonts you have installed, and where they are located.</p>"
+ "<p>Selecting this option will create the necessary Ghostscript config files.</p><p>Please note, however, "
+ "that this will also slow down the installation process.</p><p>As most applications can, and do, embed "
+ "the fonts into the PostScript before sending this to Ghostscript, this option can safely be disabled."));
+
+ KConfig cfg(Misc::root() ? KFI_ROOT_CFG_FILE : KFI_CFG_FILE);
+
+ itsDoX->setChecked(cfg.readBoolEntry(KFI_CFG_X_KEY, KFI_DEFAULT_CFG_X));
+ itsDoGs->setChecked(cfg.readBoolEntry(KFI_CFG_GS_KEY, KFI_DEFAULT_CFG_GS));
+}
+
+void CSettingsDialog::slotOk()
+{
+ KConfig cfg(Misc::root() ? KFI_ROOT_CFG_FILE : KFI_CFG_FILE);
+
+ bool oldDoX=cfg.readBoolEntry(KFI_CFG_X_KEY, KFI_DEFAULT_CFG_X),
+ oldDoGs=cfg.readBoolEntry(KFI_CFG_GS_KEY, KFI_DEFAULT_CFG_GS);
+
+ cfg.writeEntry(KFI_CFG_X_KEY, itsDoX->isChecked());
+ cfg.writeEntry(KFI_CFG_GS_KEY, itsDoGs->isChecked());
+ cfg.sync();
+
+ if( ((!oldDoX && itsDoX->isChecked()) || (!oldDoGs && itsDoGs->isChecked())) &&
+ KMessageBox::Yes==KMessageBox::questionYesNo(this, i18n("You have enabled a previously disabled option. Would you like the config "
+ "files updated now? (Normally they are only updated upon installing, or "
+ "removing, a font.)"), QString::null, i18n("Update"),i18n("Do Not Update")))
+ {
+ QByteArray packedArgs;
+ QDataStream stream(packedArgs, IO_WriteOnly);
+
+ stream << KFI::SPECIAL_RECONFIG;
+
+ KIO::NetAccess::synchronousRun(KIO::special(KFI_KIO_FONTS_PROTOCOL ":/", packedArgs), this);
+ }
+
+ hide();
+}
+
+}
diff --git a/kcontrol/kfontinst/kcmfontinst/SettingsDialog.h b/kcontrol/kfontinst/kcmfontinst/SettingsDialog.h
new file mode 100644
index 000000000..b41820e38
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/SettingsDialog.h
@@ -0,0 +1,57 @@
+#ifndef __SETTINGS_DIALOG_H__
+#define __SETTINGS_DIALOG_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CSettingsDialog
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 10/05/2005
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2005
+////////////////////////////////////////////////////////////////////////////////
+
+#include <kdialogbase.h>
+
+class QCheckBox;
+
+namespace KFI
+{
+
+class CSettingsDialog : public KDialogBase
+{
+ public:
+
+ CSettingsDialog(QWidget *parent);
+
+ private slots:
+
+ void slotOk();
+
+ private:
+
+ QCheckBox *itsDoX,
+ *itsDoGs;
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/kcmfontinst/cr16-action-newfont.png b/kcontrol/kfontinst/kcmfontinst/cr16-action-newfont.png
new file mode 100644
index 000000000..61eef357e
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/cr16-action-newfont.png
Binary files differ
diff --git a/kcontrol/kfontinst/kcmfontinst/cr22-action-newfont.png b/kcontrol/kfontinst/kcmfontinst/cr22-action-newfont.png
new file mode 100644
index 000000000..049197a35
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/cr22-action-newfont.png
Binary files differ
diff --git a/kcontrol/kfontinst/kcmfontinst/cr32-action-newfont.png b/kcontrol/kfontinst/kcmfontinst/cr32-action-newfont.png
new file mode 100644
index 000000000..9cd3d57bc
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/cr32-action-newfont.png
Binary files differ
diff --git a/kcontrol/kfontinst/kcmfontinst/kcmfontinst.desktop b/kcontrol/kfontinst/kcmfontinst/kcmfontinst.desktop
new file mode 100644
index 000000000..e8460ab49
--- /dev/null
+++ b/kcontrol/kfontinst/kcmfontinst/kcmfontinst.desktop
@@ -0,0 +1,235 @@
+[Desktop Entry]
+Exec=kcmshell kcmfontinst
+Icon=fonts
+Type=Application
+DocPath=kcontrol/kcmfontinst/index.html
+
+
+X-KDE-Library=fontinst
+X-KDE-FactoryName=fontinst
+X-KDE-RootOnly=true
+
+X-KDE-ParentApp=kcontrol
+
+Name=Font Installer
+Name[af]=Skrif tipe Installeerder
+Name[ar]=مثبت المحارف
+Name[az]=Yazı Növü Qurucusu
+Name[be]=Устаноўка шрыфтоў
+Name[bg]=Шрифтове
+Name[bn]=ফন্ট ইনস্টলার
+Name[br]=Stalianer an nodrezhoù
+Name[bs]=Dodavanje fontova
+Name[ca]=Instal·lador de lletres
+Name[cs]=Instalátor písem
+Name[csb]=Instalownik fòntów
+Name[cy]=Gosodydd Ffontiau
+Name[da]=Skrifttype-installering
+Name[de]=Schriftarteninstallation
+Name[el]=Εγκαταστάτης γραμματοσειρών
+Name[eo]=Tiparinstalilo
+Name[es]=Instalador de tipos de letra
+Name[et]=Fontide paigaldaja
+Name[eu]=Letra tipoak instalatzeko tresna
+Name[fa]=نصب‌کنندۀ قلم
+Name[fi]=Kirjasinasentaja
+Name[fr]=Installateur de polices
+Name[fy]=Lettertype-Ynstalaasje
+Name[ga]=Suiteálaí Clófhoirne
+Name[gl]=Instalador de Fontes
+Name[he]=מתקין הגופנים
+Name[hi]=फ़ॉन्ट संस्थापक
+Name[hr]=Instaliranje fontova
+Name[hu]=Betűtípus-telepítő
+Name[is]=KDE letursækir
+Name[it]=Installatore dei tipi di carattere
+Name[ja]=フォントインストーラ
+Name[ka]=ფონტების დაყენება
+Name[kk]=Қаріптерді орнату
+Name[km]=កម្មវិធី​ដំឡើង​ពុម្ពអក្សរ
+Name[ko]=글꼴 설치기
+Name[lo]=ຕິດຕັ້ງຮູບແບບຕົວອັກສອນ
+Name[lt]=Šriftų diegiklis
+Name[lv]=Fontu Instalators
+Name[mk]=Инсталатор на фонтови
+Name[mn]=Бичиг-Суулгалт
+Name[ms]=Pemasang Fon
+Name[mt]=Installatur ta' fonts
+Name[nb]=Skriftinstallering
+Name[nds]=Schriftoorden installeren
+Name[ne]=फन्ट स्थापक
+Name[nl]=Lettertype-installatie
+Name[nn]=Skriftinstallering
+Name[nso]=Motsenyi wa Fonto
+Name[pa]=ਫੋਂਟ ਇੰਸਟਾਲਰ
+Name[pl]=Instalator czcionek
+Name[pt]=Instalador de Tipos de Letra
+Name[pt_BR]=Instalador de Fontes
+Name[ro]=Instalare fonturi
+Name[ru]=Установка шрифтов
+Name[rw]=Mwinjizaporogaramu Imyandikire
+Name[se]=Fontasajáiduhttejeaddji
+Name[sk]=Inštalátor písiem
+Name[sl]=Namestilnik pisav
+Name[sr]=Инсталатор фонтова
+Name[sr@Latn]=Instalator fontova
+Name[sv]=Installation av teckensnitt
+Name[ta]=எழுத்துரு நிறுவுதல்
+Name[tg]=Барпо кардани ҳарфҳо
+Name[th]=ตัวติดตั้งแบบอักษร
+Name[tr]=Yazıtipi Kurucusu
+Name[tt]=Yazu Quydırğıç
+Name[uk]=Встановлення шрифтів
+Name[uz]=Shrift oʻrnatgich
+Name[uz@cyrillic]=Шрифт ўрнатгич
+Name[ven]=Mudzhenisi wa Fontu
+Name[vi]=Cài đặt Phông chữ
+Name[wa]=Astaleu di fontes
+Name[xh]=Umfaki Wohlobo lwegama
+Name[zh_CN]=字体安装程序
+Name[zh_TW]=字型安裝程式
+Name[zu]=Umfakeli Wohlobo lwamagama
+
+Comment=Install & preview fonts
+Comment[af]=Installeer & voorskou skriftipes
+Comment[ar]=تثبيت و معاينة المحارف
+Comment[az]=Yazı növü qur & nümayiş et
+Comment[be]=Устаноўка і прагляд шрыфтоў
+Comment[bg]=Инсталиране и преглед на шрифтове
+Comment[bn]=ফন্ট ইনস্টল এবং প্রাক্‌দর্শন করুন
+Comment[br]=Staliañ ha rakgwel an nodrezhoù
+Comment[bs]=Dodavanje i pregledanje fontova
+Comment[ca]=Instal·la i previsualitza lletres
+Comment[cs]=Instalace a náhled písem
+Comment[csb]=Instalacëjô ë pòdzérk fòntów
+Comment[cy]=Gosod a rhagolygu ffontiau
+Comment[da]=Installér og forhåndsvis skrifttyper
+Comment[de]=Schriftarten installieren und betrachten
+Comment[el]=Εγκατάσταση & προεπισκόπηση γραμματοσειρών
+Comment[eo]=Instalas kaj prezentas tiparojn
+Comment[es]=Instalar y previsualizar tipos de letra
+Comment[et]=Fontide paigaldamine ja eelvaatlus
+Comment[eu]=Instalatu eta aurreikusi letra tipoak
+Comment[fa]=نصب و پیش‌نمایش قلمها
+Comment[fi]=Asenna ja esikatsele kirjasimia
+Comment[fr]=Pour installer et afficher des polices de caractères
+Comment[fy]=Lettertypen ynstallearje en besjen
+Comment[ga]=Suiteáil & Réamhamharc na gClónna
+Comment[gl]=Instalar e antever fontes
+Comment[he]=התקנה ותצוגה מקדימה של גופנים
+Comment[hi]=फ़ॉन्ट्स संस्थापित व पूर्वावलोकन करें
+Comment[hr]=Instaliranje i pregled fontova
+Comment[hu]=Betűtípusok telepítése, áttekintése
+Comment[is]=Setja inn & forskoða letur
+Comment[it]=Installa e mostra anteprime dei caratteri
+Comment[ja]=フォントのインストールとプレビュー
+Comment[ka]=ფონტების დაყენება და დათვალიერება
+Comment[kk]=Қаріптерді орнату және қарап-шығу
+Comment[km]=ដំឡើង & មើល​ពុម្ពអក្សរ​ជា​មុន
+Comment[ko]=글꼴 설치, 미리보기, 관리
+Comment[lo]=ຕິດຕັ້ງແລະສະແດງຕົວຢ່າງຮູບແບບຕົວອັກສອນ
+Comment[lt]=Instaliuoja ir peržiūri šriftus
+Comment[lv]=Instalē un apskata fontus
+Comment[mk]=Инсталирај и прегледај фонтови
+Comment[mn]=Бичиг суулгах ба харах
+Comment[ms]=Pasang & prapapar fon
+Comment[mt]=Installa u ara fonts
+Comment[nb]=Installer og forhåndsvis skrifttyper
+Comment[nds]=Schriftoorden installeren & ankieken
+Comment[ne]=फन्ट स्थापना र पूर्वावलोकन गर्नुहोस्
+Comment[nl]=Lettertypen installeren en bekijken
+Comment[nn]=Installer og vis skrifter
+Comment[nso]=Tsenya & Bonelapele difonto
+Comment[pa]=ਫੋਂਟ ਝਲਕ ਤੇ ਇੰਸਟਾਲ
+Comment[pl]=Instalacja i podgląd czcionek
+Comment[pt]=Instalar e antever tipos de letra
+Comment[pt_BR]=Instalar & pré-visualizar fontes
+Comment[ro]=Instalează și previzualizează fonturi
+Comment[ru]=Установка и просмотр шрифтов
+Comment[rw]=Kwinjiza & kugaragazambere imyandikire
+Comment[se]=Sajáiduhtte ja čájet fonttaid
+Comment[sk]=Inštaluje a zobrazuje písma
+Comment[sl]=Namesti in prikaže pisave
+Comment[sr]=Инсталација и преглед фонтова
+Comment[sr@Latn]=Instalacija i pregled fontova
+Comment[sv]=Installera och förhandsgranska teckensnitt
+Comment[ta]=எழுத்துருக்களை நிறுவி காட்டு
+Comment[tg]=Барпо кардан ва тамошои ҳарфҳо
+Comment[th]=ติดตั้งและแสดงตัวอย่างแบบอักษร
+Comment[tr]=Yazıtiplerini kur ve önizle
+Comment[tt]=Yazu şäkellären quyu/tikşerü urını
+Comment[uk]=Встановлення та перегляд шрифтів
+Comment[uz]=Shriftlarni oʻrnatish va koʻrib chiqish
+Comment[uz@cyrillic]=Шрифтларни ўрнатиш ва кўриб чиқиш
+Comment[ven]=Dzhenisani & vhonelani phanda dzifontu
+Comment[vi]=Cài đặt & xem trước phông chữ
+Comment[wa]=Astalaedje et håynaedje des fontes
+Comment[xh]=Faka & yenza imboniso yohlobo lwamagama
+Comment[zh_CN]=安装和预览字体
+Comment[zh_TW]=安裝並預覽字型
+Comment[zu]=Fakela & buka ngaphambili izinhlobo zamagama
+
+Keywords=font,fonts,installer,truetype,type1,speedo,bitmap
+Keywords[be]=Шрыфт,Шрыфты,Устаноўка,font,fonts,installer,truetype,type1,speedo,bitmap
+Keywords[bg]=шрифт, шрифтове, преглед, печат, font, fonts, installer, truetype, type1, speedo, bitmap
+Keywords[br]=nodrezh,nodrezhoù,stalier,truetype,type1,speedo,bitmap
+Keywords[bs]=font,fonts,installer,truetype,type1,speedo,bitmap,fontovi,instalacija
+Keywords[ca]=lletra,lletres,instal·lador,truetype,type1,speedo,bitmap
+Keywords[cs]=písmo,písma,instalátor,truetype,type1,speedo,bitmap
+Keywords[csb]=fòntë,font,instalownik,truetype,type1,speedo
+Keywords[cy]=ffont,ffontiau,wynebfath, wynebfathau,arsefydlydd,truetype,type1,math 1,speedo,didfap
+Keywords[da]=skrifttype,skrifttyper,installatør,truetype,type1,speedo,bitmap
+Keywords[de]=Fonts,Schriftarten,Installation,TrueType,Type1,Speedo,Bitmapschriften
+Keywords[el]=γραμματοσειρά,γραμματοσειρές,εγκαταστάτης,truetype,type1,speedo,bitmap
+Keywords[eo]=tiparo,tiparoj,instalilo,ŝangebla,neŝangebla
+Keywords[es]=tipo de letra,tipos de letra,instalador,truetype,type1,speedo,bitmap
+Keywords[et]=font,fondid,paigaldaja,truetype,type1,speedo,bitmap
+Keywords[eu]=letra-tipoa,letra-tipoak,instalatzailea,truetype,type1,speedo,bitmap
+Keywords[fa]=قلم، قلمها، نصب‌کننده، قلم حقیقی، نوع۱ ،speedo، نگاشت بیت،
+Keywords[fi]=kirjasin,kirjasimet,fontti,fontit,asentaja,truetype,type1,speedo,bitmap
+Keywords[fr]=police,polices,installeur,installateur,truetype,type1,speedo,bitmap
+Keywords[fy]=letters,lettertypen,fonts,Ynstalaasje,truetype,type1,speedo,bitmap
+Keywords[ga]=cló,clónna,clófhoirne,suiteálaí,truetype,type1,speedo,mapa giotán,giotánmhapach
+Keywords[gl]=fonte,fontes,instalador,truetype,type1,speedo,bitmap
+Keywords[he]=גופנים,גופן, מתקין, TrueType, Type1, speedo, מפת סיביות, bitmap, font,fonts,installer,truetype,type1,speedo,bitmap
+Keywords[hi]=फ़ॉन्ट,फ़ॉन्ट्स,संस्थापक,ट्रू-टाइप,टाइप-1,स्पीडो,बिटमैप
+Keywords[hr]=font,fonts,installer,truetype,type1,speedo,bitmap,fontovi,instaliranje,TTF
+Keywords[hu]=betűtípus,betűtípusok,telepítő,TrueType,Type1,Speedo,bittérkép
+Keywords[is]=font,fonts,installer,truetype,type1,speedo,bitmap,letur
+Keywords[it]=font,caratteri,installatore,truetype,type1,speedo,bitmap,tipi di carattere
+Keywords[ja]=フォント,インストーラ,truetype,type1,speedo,bitmap,ビットマップ
+Keywords[ka]=ფონტი,ფონტები,დასაყენებელი,truetype,type1,speedo,bitmap
+Keywords[km]=ពុម្ពអក្សរ,កម្មវិធី​ដំឡើង,truetype,type1,speedo,bitmap
+Keywords[lt]=šriftas,šriftai,įdiegimas,truetype,type1,speedo,bitmap
+Keywords[lv]=fonti,fonts,instalēt,truetype,type1,speedo,bitmap
+Keywords[mk]=font,fonts,installer,truetype,type1,speedo,bitmap,фонт,фонтови,инсталатор
+Keywords[nb]=skrift,skrifter,skrifttype,skrifttyper,installer,truetype,type1,speedo,bitmap
+Keywords[nds]=Schriftoort,Schriftoorden,Installeren,TrueType,Type1,Speedo,Bitmap
+Keywords[ne]=फन्ट, फन्टहरू, स्थापक, ट्रु टाइप, टाइप १, स्पेडो, बिटम्याप
+Keywords[nl]=letters,lettertypen,fonts,installatie,truetype,type1,speedo,bitmap
+Keywords[nn]=skrift,skrifter,installering,truetype,type1,speedo,bitmap
+Keywords[pa]=font,fonts,installer,truetype,type1,speedo,bitmap, ਫੋਂਟ, ਇੰਸਟਾਲਰ
+Keywords[pl]=czcionka,czcionki,font,instalator,truetype,type1,speedo
+Keywords[pt]=tipo de letra,tipos de letra,instalador,truetype,type1,speedo,imagem
+Keywords[pt_BR]=fonte,fontes,instalador,truetype,type1,speedo,bitmap
+Keywords[ro]=font,fonturi,instalator,truetype,type1,speedo,bitmap
+Keywords[ru]=font,fonts,installer,truetype,type1,speedo,bitmap,шрифты
+Keywords[rw]=Imyandikire,imyandikire,mwinjiza,ubwokonyabwo,ubwoko1,umuvuduko,bitimapu
+Keywords[se]=fonta,fonttat,sajáiduhttejeaddji,truetype,type1,speedo,bitmap
+Keywords[sk]=písmo,písma,inštalátor,truetype,type1,speedo,bitmap
+Keywords[sl]=pisava,pisave,namestilnik,truetype,type1,speedo,bitmap
+Keywords[sr]=font,fonts,installer,truetype,type1,speedo,bitmap,фонт,фонтови,инсталер,битмапа
+Keywords[sr@Latn]=font,fonts,installer,truetype,type1,speedo,bitmap,font,fontovi,instaler,bitmapa
+Keywords[sv]=teckensnitt,installation,truetype,type1,speedo,bitmap
+Keywords[ta]=எழுத்துரு,எழுத்துருக்கள்,அமர்வர்,மெய்வகை,வகை1,speedo,பிட்படம்
+Keywords[th]=แบบอักษร,ตัวติดตั้ง,ทรูไทป์,ไทป์1,speedo,บิตแมป
+Keywords[tr]=yazıtipi,yazıtipleri,kurucu,truetype,type1,speedo,bitmap
+Keywords[uk]=шрифт, шрифти,встановлення,векторний,растровий,truetype,type1,speedo
+Keywords[uz]=shrift,shriftlar,oʻrnatuvchi,bitmap,truetype,type1,speedo
+Keywords[uz@cyrillic]=шрифт,шрифтлар,ўрнатувчи,битмап,truetype,type1,speedo
+Keywords[vi]=phông chữ,các phông chữ,trình cài đặt,truetype,kiểu 1,tốc độ gõ,mảng ảnh
+Keywords[wa]=fonte,fontes,astaleu,truetype,type1,speedo,bitmap
+Keywords[zh_CN]=font,fonts,installer,truetype,type1,speedo,bitmap,字体,安装程序,位图字体
+Keywords[zh_TW]=font,fonts,installer,truetype,type1,speedo,bitmap,字型,安裝程式,點陣
+
+Categories=Qt;KDE;X-KDE-settings-system;
diff --git a/kcontrol/kfontinst/kfile-plugin/KFileFont.cpp b/kcontrol/kfontinst/kfile-plugin/KFileFont.cpp
new file mode 100644
index 000000000..31fbaa83e
--- /dev/null
+++ b/kcontrol/kfontinst/kfile-plugin/KFileFont.cpp
@@ -0,0 +1,422 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::KFileFont
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 20/03/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include "KFileFont.h"
+#include "KfiConstants.h"
+#include <qfile.h>
+#include <qtextstream.h>
+#include <kgenericfactory.h>
+#include <kio/netaccess.h>
+
+static void addEntry(int face, QString &existing, const QString &add)
+{
+ if(face>0)
+ existing.append(", ");
+ existing.append(add);
+}
+
+static int strToWeight(const QString &str)
+{
+ if(NULL==str)
+ return FC_WEIGHT_MEDIUM;
+ else if(str.contains("Bold", false))
+ return FC_WEIGHT_BOLD;
+ else if(str.contains("Heavy", false))
+ return FC_WEIGHT_HEAVY;
+ else if(str.contains("Black", false))
+ return FC_WEIGHT_BLACK;
+ else if(str.contains("ExtraBold", false))
+ return FC_WEIGHT_EXTRABOLD;
+ else if(str.contains("UltraBold", false))
+ return FC_WEIGHT_ULTRABOLD;
+ else if(str.contains("ExtraLight", false))
+ return FC_WEIGHT_EXTRALIGHT;
+ else if(str.contains("UltraLight", false))
+ return FC_WEIGHT_ULTRALIGHT;
+ else if(str.contains("Light", false))
+ return FC_WEIGHT_LIGHT;
+ else if(str.contains("Medium", false) || str.contains("Normal", false) || str.contains("Roman", false))
+ return FC_WEIGHT_MEDIUM;
+ else if(str.contains("Regular", false))
+ return FC_WEIGHT_REGULAR;
+ else if(str.contains("SemiBold", false))
+ return FC_WEIGHT_SEMIBOLD;
+ else if(str.contains("DemiBold", false))
+ return FC_WEIGHT_DEMIBOLD;
+ else if(str.contains("Thin", false))
+ return FC_WEIGHT_THIN;
+ else if(str.contains("Book", false))
+ return FC_WEIGHT_NORMAL;
+ else if(str.contains("Demi", false))
+ return FC_WEIGHT_NORMAL;
+ else
+ return FC_WEIGHT_MEDIUM;
+}
+
+#ifndef KFI_FC_NO_WIDTHS
+static int strToWidth(const QString &str)
+{
+ if(str.isEmpty())
+ return FC_WIDTH_NORMAL;
+ else if(str.contains("UltraCondensed", false))
+ return FC_WIDTH_ULTRACONDENSED;
+ else if(str.contains("ExtraCondensed", false))
+ return FC_WIDTH_EXTRACONDENSED;
+ else if(str.contains("SemiCondensed", false))
+ return FC_WIDTH_SEMICONDENSED;
+ else if(str.contains("Condensed", false))
+ return FC_WIDTH_CONDENSED;
+ else if(str.contains("SemiExpanded", false))
+ return FC_WIDTH_SEMIEXPANDED;
+ else if(str.contains("UltraExpanded", false))
+ return FC_WIDTH_ULTRAEXPANDED;
+ else if(str.contains("ExtraExpanded", false))
+ return FC_WIDTH_EXTRAEXPANDED;
+ else if(str.contains("Expanded", false))
+ return FC_WIDTH_EXPANDED;
+ else
+ return FC_WIDTH_NORMAL;
+}
+#endif
+
+struct FoundryMap
+{
+ const char *noticeStr,
+ *foundry;
+ unsigned short len;
+};
+
+static const FoundryMap map[]= // These are (mainly) taken from type1inst
+{
+ { "Bigelow", "B&H", 3},
+ { "Adobe", "Adobe", 5},
+ { "Bitstream", "Bitstream", 9},
+ { "Monotype", "Monotype", 8},
+ { "Linotype", "Linotype", 8},
+ { "LINOTYPE-HELL", "Linotype", 0},
+ { "IBM", "IBM", 3},
+ { "URW", "URW", 3},
+ { "International Typeface Corporation", "ITC", 3},
+ { "Tiro Typeworks", "Tiro", 4},
+ { "XFree86", "XFree86", 7},
+ { "Microsoft", "Microsoft", 9},
+ { "Omega", "Omega", 5},
+ { "Font21", "Hwan", 4},
+ { "HanYang System", "Hanyang", 7},
+ { "Richard Mitchell", "Mitchell", 8},
+ { "Doug Miles", "Miles", 5},
+ { "Hank Gillette", "Gillette", 8},
+ { "Three Islands Press", "3ip", 3},
+ { "MacroMind", "Macromind", 9},
+ { "MWSoft", "MWSoft", 6},
+ { "Digiteyes Multimedia", "DigitEyes", 9},
+ { "ZSoft", "ZSoft", 5},
+ { "Title Wave", "Titlewave", 9},
+ { "Southern Software", "Southern", 8},
+ { "Reasonable Solutions", "Reasonable", 10},
+ { "David Rakowski", "Rakowski", 8},
+ { "D. Rakowski", "Rakowski", 0},
+ { "S. G. Moye", "Moye", 4},
+ { "S.G. Moye", "Moye", 0},
+ { "Andrew s. Meit", "Meit", 4},
+ { "A.S.Meit", "Meit", 0},
+ { "Hershey", "Hershey", 7},
+ { "FontBank", "FontBank", 8},
+ { "A. Carr", "Carr", 4},
+ { "Brendel Informatik", "Brendel", 7},
+ { "Jonathan Brecher", "Brecher", 7},
+ { "SoftMaker", "Softmaker", 9},
+ { "LETRASET", "Letraset", 8},
+ { "Corel Corp", "Corel", 5},
+ { "PUBLISHERS PARADISE", "Paradise", 8},
+ { "Publishers Paradise", "Paradise", 0},
+ { "Allied Corporation", "Allied", 6},
+ { NULL, NULL, 0}
+};
+
+static const char * getFoundry(const char *notice)
+{
+ const FoundryMap *entry;
+
+ if(notice)
+ for(entry=map; NULL!=entry->foundry; entry++)
+ if(NULL!=strstr(notice, entry->noticeStr))
+ return entry->foundry;
+
+ return NULL;
+}
+
+static bool readAfm(const QString &file, QString &full, QString &family, QString &foundry, QString &weight,
+#ifndef KFI_FC_NO_WIDTHS
+ QString &width,
+#endif
+ QString &spacing, QString &slant)
+{
+ QFile f(file);
+ bool foundName=false,
+ foundFamily=false;
+ int intSpacing=FC_PROPORTIONAL,
+#ifndef KFI_FC_NO_WIDTHS
+ intWidth=FC_WIDTH_NORMAL,
+#endif
+ intWeight=FC_WEIGHT_NORMAL,
+ intSlant=FC_SLANT_ROMAN,
+ intItalic=FC_SLANT_ROMAN;
+
+ if(f.open(IO_ReadOnly))
+ {
+ QTextStream stream(&f);
+ QString line;
+ bool inMetrics=false;
+
+ while(!stream.atEnd())
+ {
+ line=stream.readLine();
+ line=line.simplifyWhiteSpace();
+
+ if(inMetrics)
+ {
+ if(0==line.find("FullName "))
+ {
+ full=line.mid(9);
+#ifndef KFI_FC_NO_WIDTHS
+ intWidth=strToWidth(full);
+#endif
+ foundName=true;
+ }
+ else if(0==line.find("FamilyName "))
+ {
+ family=line.mid(11);
+ foundFamily=true;
+ }
+ else if(0==line.find("Weight "))
+ intWeight=strToWeight(line.mid(7));
+ else if(0==line.find("ItalicAngle "))
+ intSlant=0.0f==line.mid(12).toFloat() ? FC_SLANT_ROMAN : FC_SLANT_ITALIC;
+ else if(0==line.find("IsFixedPitch "))
+ intSpacing=0==line.mid(13).find("false", 0, false) ? FC_PROPORTIONAL : FC_MONO;
+ else if(0==line.find("Notice "))
+ foundry=getFoundry(line.mid(7).latin1());
+ else if(0==line.find("StartCharMetrics"))
+ break;
+ }
+ else
+ if(0==line.find("StartFontMetrics"))
+ inMetrics=true;
+ };
+ f.close();
+
+ if(!foundFamily && foundName)
+ {
+ family=full;
+ foundFamily=true;
+ }
+
+ if(foundName && FC_SLANT_ITALIC==intItalic && (-1!=full.find("Oblique") || -1!=full.find("Slanted")))
+ intItalic=FC_SLANT_OBLIQUE;
+ }
+
+ if(foundName && foundFamily)
+ {
+ weight=KFI::CFcEngine::weightStr(intWeight, false);
+#ifndef KFI_FC_NO_WIDTHS
+ width=KFI::CFcEngine::widthStr(intWidth, false);
+#endif
+ slant=KFI::CFcEngine::slantStr(intSlant, false);
+ spacing=KFI::CFcEngine::spacingStr(intSpacing);
+
+ if(foundry.isEmpty())
+ foundry=i18n(KFI_UNKNOWN_FOUNDRY);
+
+ return true;
+ }
+
+ return false;
+}
+
+typedef KGenericFactory<KFI::KFileFontPlugin> KFileFontPluginFactory;
+K_EXPORT_COMPONENT_FACTORY(kfile_font, KFileFontPluginFactory("kfontinst"))
+
+namespace KFI
+{
+
+KFileFontPlugin::KFileFontPlugin(QObject *parent, const char *name, const QStringList& args)
+ : KFilePlugin(parent, name, args)
+{
+ KGlobal::locale()->insertCatalogue(KFI_CATALOGUE);
+
+ addMimeType("application/x-font-ttf"),
+ addMimeType("application/x-font-type1");
+ //addMimeType("application/x-font-speedo");
+ addMimeType("application/x-font-bdf");
+ addMimeType("application/x-font-pcf");
+ //addMimeType("application/x-font-snf");
+ addMimeType("application/x-font-otf");
+ addMimeType("application/x-font-ttc");
+ addMimeType("application/x-afm");
+}
+
+void KFileFontPlugin::addMimeType(const char *mime)
+{
+ KFileMimeTypeInfo *info=addMimeTypeInfo(mime);
+ KFileMimeTypeInfo::GroupInfo *group=addGroupInfo(info, "General", i18n("General"));
+
+ addItemInfo(group, "Full", i18n("Full Name"), QVariant::String);
+ addItemInfo(group, "Family", i18n("Family"), QVariant::String);
+ addItemInfo(group, "Foundry", i18n("Foundry"), QVariant::String);
+ addItemInfo(group, "Weight", i18n("Weight"), QVariant::String);
+#ifndef KFI_FC_NO_WIDTHS
+ addItemInfo(group, "Width", i18n("Width"), QVariant::String);
+#endif
+ addItemInfo(group, "Spacing", i18n("Spacing"), QVariant::String);
+ addItemInfo(group, "Slant", i18n("Slant"), QVariant::String);
+}
+
+bool KFileFontPlugin::readInfo(KFileMetaInfo& info, uint what)
+{
+ QString full,
+ lastFull,
+ family,
+ foundry,
+ weight,
+#ifndef KFI_FC_NO_WIDTHS
+ width,
+#endif
+ spacing,
+ slant,
+ fullAll,
+ familyAll,
+ foundryAll,
+ weightAll,
+#ifndef KFI_FC_NO_WIDTHS
+ widthAll,
+#endif
+ spacingAll,
+ slantAll;
+ KURL url(info.url());
+ QString fName;
+ bool fontsProt = KFI_KIO_FONTS_PROTOCOL == url.protocol(),
+ fileProt = "file" == url.protocol(),
+ downloaded = false,
+ status = false;
+
+ what=0;
+
+ if(!fontsProt && !fileProt && KIO::NetAccess::download(url, fName, NULL))
+ {
+ downloaded=true;
+ url=KURL(fName);
+ }
+
+ if(downloaded || fontsProt || fileProt)
+ {
+ if("application/x-afm"==info.mimeType()) // Then fontconfig can't give us the data :-(
+ status=readAfm(url.path(), fullAll, familyAll, foundryAll, weightAll,
+#ifndef KFI_FC_NO_WIDTHS
+ widthAll,
+#endif
+ spacingAll, slantAll);
+ else
+ for(int face=0; face<10; ++face) // How to get num faces from fontconfig? don't know - so just try 1st 10...
+ {
+ if(itsEngine.getInfo(url, face, full, family, foundry, weight,
+#ifndef KFI_FC_NO_WIDTHS
+ width,
+#endif
+ spacing, slant) &&
+ !full.isEmpty() && full!=lastFull)
+ {
+ addEntry(face, fullAll, full);
+ lastFull=full;
+
+ if(KFileMetaInfo::Fastest!=what)
+ {
+ addEntry(face, familyAll, family);
+ if(0==face)
+ {
+ foundryAll=foundry;
+
+ if(foundryAll.isEmpty())
+ foundryAll=i18n(KFI_UNKNOWN_FOUNDRY);
+ else
+ {
+ // Try to make sure foundry is capitalised, and looks the same as that of
+ // any AFM.
+ foundryAll[0]=foundryAll[0].upper();
+
+ const FoundryMap *entry;
+
+ for(entry=map; NULL!=entry->foundry; entry++)
+ if(foundryAll.length()==entry->len && foundryAll.contains(entry->foundry, false))
+ {
+ foundryAll=entry->foundry;
+ break;
+ }
+ }
+ }
+ addEntry(face, weightAll, weight);
+#ifndef KFI_FC_NO_WIDTHS
+ addEntry(face, widthAll, width);
+#endif
+ addEntry(face, spacingAll, spacing);
+ addEntry(face, slantAll, slant);
+ }
+ status=true;
+ }
+ else
+ break;
+ }
+
+ if(status)
+ {
+ KFileMetaInfoGroup group;
+
+ group=appendGroup(info, "General");
+ appendItem(group, "Full", fullAll);
+
+ if(KFileMetaInfo::Fastest!=what)
+ {
+ appendItem(group, "Family", familyAll);
+ appendItem(group, "Foundry", foundryAll);
+ appendItem(group, "Weight", weightAll);
+#ifndef KFI_FC_NO_WIDTHS
+ appendItem(group, "Width", widthAll);
+#endif
+ appendItem(group, "Spacing", spacingAll);
+ appendItem(group, "Slant", slantAll);
+ }
+ }
+
+ if(downloaded)
+ KIO::NetAccess::removeTempFile(fName);
+ }
+
+ return status;
+}
+
+}
diff --git a/kcontrol/kfontinst/kfile-plugin/KFileFont.h b/kcontrol/kfontinst/kfile-plugin/KFileFont.h
new file mode 100644
index 000000000..b06ab2a57
--- /dev/null
+++ b/kcontrol/kfontinst/kfile-plugin/KFileFont.h
@@ -0,0 +1,58 @@
+#ifndef __KFILE_FONT_H__
+#define __KFILE_FONT_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFileFont
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 20/03/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include <kfilemetainfo.h>
+#include "FcEngine.h"
+
+namespace KFI
+{
+
+class KFileFontPlugin : public KFilePlugin
+{
+ public:
+
+ KFileFontPlugin(QObject *parent, const char *name, const QStringList& args);
+ virtual ~KFileFontPlugin() {}
+
+ bool readInfo(KFileMetaInfo& info, uint what = KFileMetaInfo::Fastest);
+
+ private:
+
+ void addMimeType(const char *mime);
+
+ private:
+
+ CFcEngine itsEngine;
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/kfile-plugin/Makefile.am b/kcontrol/kfontinst/kfile-plugin/Makefile.am
new file mode 100644
index 000000000..7f136357f
--- /dev/null
+++ b/kcontrol/kfontinst/kfile-plugin/Makefile.am
@@ -0,0 +1,13 @@
+kde_module_LTLIBRARIES = kfile_font.la
+
+kfile_font_la_SOURCES = KFileFont.cpp
+kfile_font_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIBFREETYPE_RPATH) -module $(KDE_PLUGIN)
+kfile_font_la_LIBADD = $(LIB_KIO) $(LIBFREETYPE_LIBS) ../lib/libkfontinst.la
+
+kdelnkdir = $(kde_servicesdir)
+kde_services_DATA = kfile_font.desktop
+
+AM_CPPFLAGS = -I$(srcdir)/../lib -I$(srcdir)/../../fonts $(all_includes) $(LIBFREETYPE_CFLAGS)
+
+METASOURCES = AUTO
+noinst_HEADERS = KFileFont.h
diff --git a/kcontrol/kfontinst/kfile-plugin/kfile_font.desktop b/kcontrol/kfontinst/kfile-plugin/kfile_font.desktop
new file mode 100644
index 000000000..7ac0a499f
--- /dev/null
+++ b/kcontrol/kfontinst/kfile-plugin/kfile_font.desktop
@@ -0,0 +1,86 @@
+[Desktop Entry]
+Type=Service
+Name=Font Information
+Name[af]=Skrif tipe Informasie
+Name[ar]=معلومات المحرف
+Name[az]=Yazı Növü Mə'lumatı
+Name[be]=Інфармацыя аб шрыфце
+Name[bg]=Информация за шрифт
+Name[bn]=ফন্ট তথ্য
+Name[br]=Titouroù diwar-benn ar font
+Name[bs]=Informacije o fontu
+Name[ca]=Informació de la lletra
+Name[cs]=Informace o písmu
+Name[csb]=Wëdowiédzô ò fòntach
+Name[cy]=Gwybodaeth Ffont
+Name[da]=Skrifttypeinformation
+Name[de]=Schriftarteninformation
+Name[el]=Πληροφορίες γραμματοσειράς
+Name[eo]=Tiparinformo
+Name[es]=Información del tipo de letra
+Name[et]=Fondi info
+Name[eu]=Letra-tipoei buruzko informazioa
+Name[fa]=اطلاعات قلم
+Name[fi]=Kirjasintiedot
+Name[fr]=Informations sur les polices
+Name[fy]=Lettertype-Ynformaasje
+Name[ga]=Eolas Clófhoirne
+Name[gl]=Información da Fonte
+Name[he]=מידע גופנים
+Name[hi]=फ़ॉन्ट जानकारी
+Name[hr]=Podaci o fontu
+Name[hu]=Betűtípus-jellemzők
+Name[id]=Informasi Font
+Name[is]=Leturupplýsingar
+Name[it]=Informazioni caratteri
+Name[ja]=フォント情報
+Name[ka]=ინფორმაცია ფონტის შესახებ
+Name[kk]=Қаріп мәліметі
+Name[km]=ព័ត៌មាន​ពុម្ពអក្សរ
+Name[ko]=연락처 정보
+Name[lo]=ຂໍ້ມູນຕ່າງໆ
+Name[lt]=Šrifto(-ų) informacija
+Name[lv]=Fontu Informācija
+Name[mk]=Информации за фонтовите
+Name[mn]=Бичиг-Мэдээлэл
+Name[ms]=Maklumat Fon
+Name[mt]=Informazzjoni dwar font
+Name[nb]=Skriftinformasjon
+Name[nds]=Schriftoort-Informatschoon
+Name[ne]=फन्ट सूचना
+Name[nl]=Lettertype-informatie
+Name[nn]=Skriftinformasjon
+Name[nso]=Tshedimoso ya Fonto
+Name[pa]=ਫੋਂਟ ਜਾਣਕਾਰੀ
+Name[pl]=Informacje o czcionkach
+Name[pt]=Informação do Tipo de Letra
+Name[pt_BR]=Informações sobre a Fonte
+Name[ro]=Informații font
+Name[ru]=Сведения о шрифте
+Name[rw]=Amakuru y'Imyandikire
+Name[se]=Fontadieđut
+Name[sk]=Informácie o písmach
+Name[sl]=Informacije o pisavi
+Name[sr]=Информације о фонту
+Name[sr@Latn]=Informacije o fontu
+Name[sv]=Teckensnittsinformation
+Name[ta]=எழுத்துரு தகவல்
+Name[tg]=Иттилооти ҳарфҳо
+Name[th]=ข้อมูลแบบอักษร
+Name[tr]=Yazıtipi Bilgisi
+Name[tt]=Yazu Turında
+Name[uk]=Інформація про шрифти
+Name[uz]=Shrift haqida maʼlumot
+Name[uz@cyrillic]=Шрифт ҳақида маълумот
+Name[ven]=Mafhungo a fontu
+Name[vi]=Thông tin về Phông chữ
+Name[wa]=Informåcion sol fonte
+Name[xh]=Ulwazi Lohlobo lwamagama
+Name[zh_CN]=字体信息
+Name[zh_TW]=字型資訊
+Name[zu]=Ulwazi lohlobo lwamagama
+ServiceTypes=KFilePlugin
+X-KDE-Library=kfile_font
+MimeType=application/x-font-ttf;application/x-font-type1;application/x-font-bdf;application/x-font-pcf;application/x-font-otf;application/x-font-ttc;application/x-afm
+PreferredGroups=General
+PreferredItems=Full,Family,Foundry,Weight,Width,Spacing,Slant
diff --git a/kcontrol/kfontinst/kfontinst/FontEngine.cpp b/kcontrol/kfontinst/kfontinst/FontEngine.cpp
new file mode 100644
index 000000000..ff5dcd623
--- /dev/null
+++ b/kcontrol/kfontinst/kfontinst/FontEngine.cpp
@@ -0,0 +1,376 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CFontEngine
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 29/04/2001
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2001, 2002, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+
+#include "FontEngine.h"
+#include "Misc.h"
+#include <kglobal.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include <iostream>
+#include <stdio.h>
+#include <qregexp.h>
+#include <qfile.h>
+#include <ft2build.h>
+#include FT_SFNT_NAMES_H
+#include FT_TRUETYPE_IDS_H
+#include FT_TRUETYPE_TABLES_H
+#include FT_TYPE1_TABLES_H
+
+namespace KFI
+{
+
+bool CFontEngine::openFont(const QString &file, int face)
+{
+ bool ok=false;
+
+ if(file==itsPath && face==itsFaceIndex)
+ {
+ ok=NONE!=itsType;
+ }
+ else
+ {
+ closeFont();
+
+ itsWeight=WEIGHT_MEDIUM;
+ itsItalic=ITALIC_NONE;
+ itsPath=file;
+ itsFaceIndex=face;
+ itsPsName=QString();
+
+ if(!openFontFt(file) && !itsPsName.isEmpty())
+ itsType=NONE;
+ }
+
+ return NONE!=itsType;
+}
+
+void CFontEngine::closeFont()
+{
+ closeFaceFt();
+ itsPath=QString::null;
+ itsFaceIndex=-1;
+ itsType=NONE;
+}
+
+QString CFontEngine::weightStr(enum EWeight w)
+{
+ switch(w)
+ {
+ case WEIGHT_THIN:
+ return "Thin";
+ case WEIGHT_ULTRA_LIGHT:
+ return "UltraLight";
+ case WEIGHT_EXTRA_LIGHT:
+ return "ExtraLight";
+ case WEIGHT_DEMI:
+ return "Demi";
+ case WEIGHT_LIGHT:
+ return "Light";
+ case WEIGHT_BOOK:
+ return "Book";
+ case WEIGHT_MEDIUM:
+ return "Medium";
+ case WEIGHT_REGULAR:
+ return "Regular";
+ case WEIGHT_SEMI_BOLD:
+ return "SemiBold";
+ case WEIGHT_DEMI_BOLD:
+ return "DemiBold";
+ case WEIGHT_BOLD:
+ return "Bold";
+ case WEIGHT_EXTRA_BOLD:
+ return "ExtraBold";
+ case WEIGHT_ULTRA_BOLD:
+ return "UltraBold";
+ case WEIGHT_HEAVY:
+ return "Heavy";
+ case WEIGHT_BLACK:
+ return "Black";
+ case WEIGHT_UNKNOWN:
+ default:
+ return "Medium";
+ }
+}
+
+CFontEngine::EWeight CFontEngine::strToWeight(const char *str)
+{
+ if(NULL==str)
+ return WEIGHT_MEDIUM; // WEIGHT_UNKNOWN;
+ else if(kasciistricmp(str, "Bold")==0)
+ return WEIGHT_BOLD;
+ else if(kasciistricmp(str, "Black")==0)
+ return WEIGHT_BLACK;
+ else if(kasciistricmp(str, "ExtraBold")==0)
+ return WEIGHT_EXTRA_BOLD;
+ else if(kasciistricmp(str, "UltraBold")==0)
+ return WEIGHT_ULTRA_BOLD;
+ else if(kasciistricmp(str, "ExtraLight")==0)
+ return WEIGHT_EXTRA_LIGHT;
+ else if(kasciistricmp(str, "UltraLight")==0)
+ return WEIGHT_ULTRA_LIGHT;
+ else if(kasciistricmp(str, "Light")==0)
+ return WEIGHT_LIGHT;
+ else if(kasciistricmp(str, "Medium")==0 || kasciistricmp(str, "Normal")==0 || kasciistricmp(str, "Roman")==0)
+ return WEIGHT_MEDIUM;
+ else if(kasciistricmp(str, "Regular")==0)
+ return WEIGHT_MEDIUM; // WEIGHT_REGULAR;
+ else if(kasciistricmp(str, "Demi")==0)
+ return WEIGHT_DEMI;
+ else if(kasciistricmp(str, "SemiBold")==0)
+ return WEIGHT_SEMI_BOLD;
+ else if(kasciistricmp(str, "DemiBold")==0)
+ return WEIGHT_DEMI_BOLD;
+ else if(kasciistricmp(str, "Thin")==0)
+ return WEIGHT_THIN;
+ else if(kasciistricmp(str, "Book")==0)
+ return WEIGHT_BOOK;
+ else
+ return WEIGHT_MEDIUM; // WEIGHT_UNKNOWN;
+}
+
+static void removeSymbols(QString &str)
+{
+ str.replace(QRegExp("[\\-\\[\\]()]"), " ");
+
+ int len=str.length();
+ QChar space(' ');
+
+ for(int c=0; c<len; ++c)
+ if(str[c].unicode()<0x20 || str[c].unicode()>0x7E)
+ str[c]=space;
+
+ str=str.simplifyWhiteSpace();
+ str=str.stripWhiteSpace();
+}
+
+static bool lookupName(FT_Face face, int nid, int pid, int eid, FT_SfntName *nameReturn)
+{
+ int n = FT_Get_Sfnt_Name_Count(face);
+
+ if(n>0)
+ {
+ int i;
+ FT_SfntName name;
+
+ for(i=0; i<n; i++)
+ if(0==FT_Get_Sfnt_Name(face, i, &name) && name.name_id == nid && name.platform_id == pid &&
+ (eid < 0 || name.encoding_id == eid))
+ {
+ switch(name.platform_id)
+ {
+ case TT_PLATFORM_APPLE_UNICODE:
+ case TT_PLATFORM_MACINTOSH:
+ if(name.language_id != TT_MAC_LANGID_ENGLISH)
+ continue;
+ break;
+ case TT_PLATFORM_MICROSOFT:
+ if(name.language_id != TT_MS_LANGID_ENGLISH_UNITED_STATES &&
+ name.language_id != TT_MS_LANGID_ENGLISH_UNITED_KINGDOM)
+ continue;
+ break;
+ default:
+ continue;
+ }
+
+ if(name.string_len > 0)
+ {
+ *nameReturn = name;
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+static QCString getName(FT_Face face, int nid)
+{
+ FT_SfntName name;
+ QCString str;
+
+ if(lookupName(face, nid, TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, &name) ||
+ lookupName(face, nid, TT_PLATFORM_APPLE_UNICODE, -1, &name))
+ for(unsigned int i=0; i < name.string_len / 2; i++)
+ str+=0 == name.string[2*i] ? name.string[(2*i)+1] : '_';
+ else if(lookupName(face, nid, TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, &name)) // Pretend that Apple Roman is ISO 8859-1
+ for(unsigned int i=0; i < name.string_len; i++)
+ str+=name.string[i];
+
+ return str;
+}
+
+bool CFontEngine::openFontFt(const QString &file)
+{
+ enum ETtfWeight
+ {
+ TTF_WEIGHT_UNKNOWN = 0,
+ TTF_WEIGHT_THIN = 100 +50,
+ TTF_WEIGHT_EXTRALIGHT = 200 +50,
+ TTF_WEIGHT_LIGHT = 300 +50,
+ TTF_WEIGHT_NORMAL = 400 +50,
+ TTF_WEIGHT_MEDIUM = 500 +50,
+ TTF_WEIGHT_SEMIBOLD = 600 +50,
+ TTF_WEIGHT_BOLD = 700 +50,
+ TTF_WEIGHT_EXTRABOLD = 800 +50,
+ TTF_WEIGHT_BLACK = 900 +50
+ };
+
+ bool status=FT_New_Face(itsFt.library, QFile::encodeName(file), 0, &itsFt.face) ? false : true;
+
+ if(status)
+ itsFt.open=true;
+
+ PS_FontInfoRec t1info;
+
+ if(0==FT_Get_PS_Font_Info(itsFt.face, &t1info))
+ {
+ itsFamily=t1info.family_name;
+ itsType=TYPE_1;
+ }
+ else
+ {
+ itsFamily=getName(itsFt.face, TT_NAME_ID_FONT_FAMILY);
+ itsType=TRUE_TYPE;
+ }
+
+ if(itsFamily.isEmpty())
+ itsFamily=FT_Get_Postscript_Name(itsFt.face);
+
+ if(itsFamily.isEmpty())
+ status=false; // Hmm... couldn't find any of the names!
+
+ if(status)
+ {
+ removeSymbols(itsFamily);
+ itsPsName=(FT_Get_Postscript_Name(itsFt.face));
+
+ if(TYPE_1==itsType)
+ {
+ itsWeight=strToWeight(t1info.weight);
+ itsItalic=t1info.italic_angle <= -4 || t1info.italic_angle >= 4 ? ITALIC_ITALIC : ITALIC_NONE;
+ }
+ else // TrueType...
+ {
+ TT_Postscript *post=NULL;
+ TT_OS2 *os2=NULL;
+ TT_Header *head=NULL;
+ bool gotItalic=false;
+
+ if(NULL==(os2=(TT_OS2 *)FT_Get_Sfnt_Table(itsFt.face, ft_sfnt_os2)) || 0xFFFF==os2->version)
+ itsWeight=WEIGHT_UNKNOWN;
+ else
+ {
+ FT_UShort weight=(os2->usWeightClass>0 && os2->usWeightClass<100) ? os2->usWeightClass*100 : os2->usWeightClass;
+
+ if(weight<TTF_WEIGHT_THIN)
+ itsWeight=WEIGHT_THIN;
+ else if(weight<TTF_WEIGHT_EXTRALIGHT)
+ itsWeight=WEIGHT_EXTRA_LIGHT;
+ else if(weight<TTF_WEIGHT_LIGHT)
+ itsWeight=WEIGHT_LIGHT;
+ else if(/*weight<TTF_WEIGHT_NORMAL || */ weight<TTF_WEIGHT_MEDIUM)
+ itsWeight=WEIGHT_MEDIUM;
+ else if(weight<TTF_WEIGHT_SEMIBOLD)
+ itsWeight=WEIGHT_SEMI_BOLD;
+ else if(weight<TTF_WEIGHT_BOLD)
+ itsWeight=WEIGHT_BOLD;
+ else if(weight<TTF_WEIGHT_EXTRABOLD)
+ itsWeight=WEIGHT_EXTRA_BOLD;
+ else if(weight<TTF_WEIGHT_BLACK)
+ itsWeight=WEIGHT_BLACK;
+ else if(os2->fsSelection&(1 << 5))
+ itsWeight=WEIGHT_BOLD;
+ else
+ itsWeight=WEIGHT_UNKNOWN;
+
+ itsItalic=os2->fsSelection&(1 << 0) ? ITALIC_ITALIC : ITALIC_NONE;
+ gotItalic=true;
+ }
+
+ if(WEIGHT_UNKNOWN==itsWeight)
+ itsWeight=NULL!=(head=(TT_Header *)FT_Get_Sfnt_Table(itsFt.face, ft_sfnt_head)) && head->Mac_Style & 1
+ ? WEIGHT_BOLD
+ : WEIGHT_MEDIUM;
+
+ if(!gotItalic && (head!=NULL || NULL!=(head=(TT_Header *)FT_Get_Sfnt_Table(itsFt.face, ft_sfnt_head))))
+ {
+ gotItalic=true;
+ itsItalic=head->Mac_Style & 2 ? ITALIC_ITALIC: ITALIC_NONE;
+ }
+
+ if(!gotItalic && NULL!=(post=(TT_Postscript *)FT_Get_Sfnt_Table(itsFt.face, ft_sfnt_post)))
+ {
+ struct TFixed
+ {
+ TFixed(unsigned long v) : upper(v>>16), lower(v&0xFFFF) {}
+
+ short upper,
+ lower;
+
+ float value() { return upper+(lower/65536.0); }
+ };
+
+ gotItalic=true;
+ itsItalic=0.0f==((TFixed)post->italicAngle).value() ? ITALIC_NONE : ITALIC_ITALIC;
+ }
+ }
+ }
+
+ if(!status)
+ closeFaceFt();
+
+ return status;
+}
+
+void CFontEngine::closeFaceFt()
+{
+ if(itsFt.open)
+ {
+ FT_Done_Face(itsFt.face);
+ itsFt.open=false;
+ }
+}
+
+CFontEngine::TFtData::TFtData()
+ : open(false)
+{
+ if(FT_Init_FreeType(&library))
+ {
+ std::cerr << "ERROR: FreeType2 failed to initialise\n";
+ exit(0);
+ }
+}
+
+CFontEngine::TFtData::~TFtData()
+{
+ FT_Done_FreeType(library);
+}
+
+}
diff --git a/kcontrol/kfontinst/kfontinst/FontEngine.h b/kcontrol/kfontinst/kfontinst/FontEngine.h
new file mode 100644
index 000000000..06218c0ae
--- /dev/null
+++ b/kcontrol/kfontinst/kfontinst/FontEngine.h
@@ -0,0 +1,142 @@
+#ifndef __FONT_ENGINE_H__
+#define __FONT_ENGINE_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CFontEngine
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 29/04/2001
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2001, 2002, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include <qstring.h>
+#include <qstringlist.h>
+
+namespace KFI
+{
+
+class CFontEngine
+{
+ public:
+
+ enum EType
+ {
+ // These have PS Info / support AFM stuff...
+ TRUE_TYPE,
+ TT_COLLECTION,
+ TYPE_1,
+ NONE
+ };
+
+ enum EWeight
+ {
+ WEIGHT_UNKNOWN=0,
+ WEIGHT_THIN,
+ WEIGHT_ULTRA_LIGHT,
+ WEIGHT_EXTRA_LIGHT,
+ WEIGHT_DEMI,
+ WEIGHT_LIGHT,
+ WEIGHT_BOOK,
+ WEIGHT_MEDIUM,
+ WEIGHT_REGULAR,
+ WEIGHT_SEMI_BOLD,
+ WEIGHT_DEMI_BOLD,
+ WEIGHT_BOLD,
+ WEIGHT_EXTRA_BOLD,
+ WEIGHT_ULTRA_BOLD,
+ WEIGHT_HEAVY,
+ WEIGHT_BLACK
+ };
+
+ enum EItalic
+ {
+ ITALIC_NONE,
+ ITALIC_ITALIC,
+ ITALIC_OBLIQUE
+ };
+
+ private:
+
+ struct TFtData
+ {
+ TFtData();
+ ~TFtData();
+
+ FT_Library library;
+ FT_Face face;
+ bool open;
+ };
+
+ public:
+
+ CFontEngine() : itsType(NONE) { }
+ ~CFontEngine() { closeFont(); }
+
+ static EType getType(const char *fname);
+ static QString weightStr(EWeight w);
+ static QString italicStr(EItalic i) { return ITALIC_NONE==i ? "r" : ITALIC_ITALIC==i ? "i" : "o"; }
+
+ //
+ // General functions - these should be used instead of specfic ones below...
+ //
+ bool openFont(const QString &file, int face=0);
+ void closeFont();
+
+ //
+ const QString & getFamilyName() { return itsFamily; }
+ const QString & getPsName() { return itsPsName; }
+ EWeight getWeight() { return itsWeight; }
+ EItalic getItalic() { return itsItalic; }
+ EType getType() { return itsType; }
+ int getNumFaces() { return itsFt.open ? itsFt.face->num_faces : 1; }
+ bool hasPsInfo() { return itsType!=NONE; }
+
+ static EWeight strToWeight(const char *str);
+
+ private:
+
+ bool openFontFt(const QString &file);
+ void closeFaceFt();
+
+ private:
+
+ EWeight itsWeight;
+ EType itsType;
+ EItalic itsItalic;
+ QString itsFamily,
+ itsPsName,
+ itsPath;
+ int itsNumFaces,
+ itsFaceIndex; // Only for TTC fonts - at the moment...
+ TFtData itsFt;
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/kfontinst/Fontmap.cpp b/kcontrol/kfontinst/kfontinst/Fontmap.cpp
new file mode 100644
index 000000000..0f8178dee
--- /dev/null
+++ b/kcontrol/kfontinst/kfontinst/Fontmap.cpp
@@ -0,0 +1,596 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Namespae : KFI::Fontmap
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 06/06/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include "Fontmap.h"
+#include "FontEngine.h"
+#include "XConfig.h"
+#include "FcEngine.h"
+#include "KfiConstants.h"
+#include <ksavefile.h>
+#include <qtextstream.h>
+#include <qdir.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <qregexp.h>
+#include <fstream>
+#include <unistd.h>
+
+using namespace std;
+
+static const char * findSpace(const char *str)
+{
+ while(str && *str!=' ' && *str!='\t')
+ str++;
+
+ return str;
+}
+
+static bool parseLine(const char *line, QString &ps, QString &fname, bool &isAlias)
+{
+ static const int constMaxLen = 127;
+ static const int constFileMaxLen = 1023;
+
+ //
+ // Format:
+ // "/<psname> (<filename>) ; "
+ // "/<psname> /real ; "
+
+ char a[constMaxLen+1],
+ b[constFileMaxLen+1];
+
+ const char *slash1=strchr(line, '/'),
+ *space1=slash1 ? findSpace(slash1) : NULL, //strchr(slash1, ' ') : NULL,
+ *ob=slash1 ? strchr(slash1, '(') : NULL,
+ *cb=ob ? strchr(ob, ')') : NULL,
+ *slash2=space1 && !ob && !cb ? strchr(space1, '/') : NULL,
+ *space2=slash2 ? findSpace(slash2) : NULL, // strchr(slash2, ' ') : NULL,
+ *semic=cb || space2 ? strchr(cb ? cb : space2, ';') : NULL;
+
+ if(semic && space1-slash1<constMaxLen)
+ {
+ slash1++;
+ memcpy(a, slash1, space1-slash1);
+ a[space1-slash1]='\0';
+
+ if(cb && cb-ob<constFileMaxLen) // Then found a file entry...
+ {
+ ob++;
+ memcpy(b, ob, cb-ob);
+ b[cb-ob]='\0';
+ ps=a;
+ fname=b;
+ isAlias=false;
+ return true;
+ }
+ else if(space2 && space2-slash2<constMaxLen) // Then found an alias...
+ {
+ slash2++;
+ memcpy(b, slash2, space2-slash2);
+ b[space2-slash2]='\0';
+ ps=a;
+ fname=b;
+ isAlias=true;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+//
+// Returns a PS name from an X family name...
+// e.g. "Times New Roman" -> "TimesNewRoman"
+static QString createX11PsName(const QString &font)
+{
+ QString newName(font);
+ unsigned int ch;
+ bool newWord=true;
+
+ newName.replace(QRegExp("\\-"), "_");
+
+ for(ch=0; ch<newName.length(); ++ch)
+ {
+ if(newName[ch].isSpace())
+ newWord=true;
+ else
+ {
+ if(newName[ch]==newName[ch].upper())
+ {
+ if(!newWord)
+ newName[ch]=newName[ch].lower();
+ }
+ else
+ if(newName[ch]==newName[ch].lower())
+ {
+ if(newWord)
+ newName[ch]=newName[ch].upper();
+ }
+ newWord=false;
+ }
+ }
+
+ newName.replace(" ", QString::null);
+ return newName;
+}
+
+static const char * getItalicStr(KFI::CFontEngine::EItalic it)
+{
+ switch(it)
+ {
+ default:
+ case KFI::CFontEngine::ITALIC_NONE:
+ return NULL;
+ case KFI::CFontEngine::ITALIC_ITALIC:
+ return "Italic";
+ case KFI::CFontEngine::ITALIC_OBLIQUE:
+ return "Oblique";
+ }
+}
+
+//
+// Create a full Ps name
+static QString createName(const QString &family, const QString &weight, const char *italic)
+{
+ QString name;
+ QTextOStream str(&name);
+
+ str << family;
+ if(!weight.isEmpty() || NULL!=italic)
+ {
+ str << '-';
+ if(!weight.isEmpty())
+ str << weight;
+ if(NULL!=italic)
+ str << italic;
+ }
+
+ return name;
+}
+
+static QString getEntry(QStringList &list, const QString &name)
+{
+ QStringList::Iterator it(list.begin()),
+ end(list.end());
+
+ for( ; it!=end; ++it)
+ if(0==(*it).find('/'+name+' '))
+ return *it;
+
+ return QString::null;
+}
+
+inline bool isAlias(const QString &entry)
+{
+ return -1==entry.findRev(QRegExp(")\\s*;\\s*$"));
+}
+
+static void addEntry(QStringList &list, const QString &name, const QString &file, const QString &fmapDir)
+{
+ QString existing(getEntry(list, name));
+ bool insert=true;
+
+ if(!existing.isEmpty())
+ if(isAlias(existing))
+ list.remove(existing);
+ else
+ insert=false;
+
+ if(insert)
+ {
+ QString entry;
+ QTextOStream str(&entry);
+
+ str << '/' << name << " (";
+
+ if(0==file.find(fmapDir))
+ str << file.mid(fmapDir.length());
+ else
+ str << file;
+
+ str << ") ;";
+ list.append(entry);
+ }
+}
+
+static void addAliasEntry(QStringList &list, const QString &x11Name, const QString &psName)
+{
+ if(x11Name!=psName)
+ {
+ QString existing(getEntry(list, x11Name));
+
+ if(existing.isEmpty())
+ {
+ QString entry;
+ QTextOStream str(&entry);
+
+ str << '/' << x11Name << " /" << psName << " ;";
+ list.append(entry);
+ }
+ }
+}
+
+static QString locateFile(const char *dir, const char *file, int level=0)
+{
+ if(level<5)
+ {
+ QDir d(dir);
+
+ if(d.isReadable())
+ {
+ const QFileInfoList *fList=d.entryInfoList();
+
+ if(fList)
+ {
+ QFileInfoListIterator it(*fList);
+ QFileInfo *fInfo;
+ QString str;
+
+ for(; NULL!=(fInfo=it.current()); ++it)
+ if("."!=fInfo->fileName() && ".."!=fInfo->fileName())
+ if(fInfo->isDir())
+ {
+ if(!(str=locateFile(QFile::encodeName(fInfo->filePath()+"/"), file, level+1)).isEmpty())
+ return str;
+ }
+ else
+ if(fInfo->fileName()==file)
+ return fInfo->filePath();
+ }
+ }
+ }
+
+ return QString::null;
+}
+
+static QString locateFile(const char *file, const char **dirs)
+{
+ int d;
+ QString str;
+
+ for(d=0; dirs[d]; ++d)
+ if(!(str=locateFile(dirs[d], file)).isEmpty())
+ return str;
+
+ return QString::null;
+}
+
+#define FONTMAP "Fontmap"
+
+namespace KFI
+{
+
+namespace Fontmap
+{
+
+bool create(const QString &dir, CFontEngine &fe)
+{
+ bool root(Misc::root()),
+ added=false;
+ QString fmapDir(Misc::dirSyntax(root ? KFI_ROOT_CFG_DIR : dir));
+ CFile old(fmapDir);
+ QStringList entries;
+ int i;
+ FcPattern *pat = FcPatternCreate();
+ FcObjectSet *os = FcObjectSetBuild(FC_FILE, FC_SCALABLE, (void*)0);
+ FcFontSet *fs = FcFontList(0, pat, os);
+
+ FcPatternDestroy(pat);
+ FcObjectSetDestroy(os);
+
+ for (i = 0; i<fs->nfont; i++)
+ {
+ QString fName(Misc::fileSyntax(CFcEngine::getFcString(fs->fonts[i], FC_FILE)));
+ FcBool scalable=FcFalse;
+
+ if(!fName.isEmpty() && (root || dir.isEmpty() || 0==fName.find(dir)) &&
+ FcResultMatch==FcPatternGetBool(fs->fonts[i], FC_SCALABLE, 0, &scalable) && scalable)
+ {
+ const QStringList *existing=old.getEntries(fName);
+
+ if(existing && existing->count())
+ entries+=(*existing);
+ else
+ {
+ int face=0,
+ numFaces=0;
+
+ do
+ {
+ if(fe.openFont(fName, face))
+ {
+ if(fe.hasPsInfo())
+ {
+ if(0==numFaces)
+ numFaces=fe.getNumFaces(); // Only really for TTC files...
+
+ //
+ // Add real
+ addEntry(entries, fe.getPsName(), fName, fmapDir);
+ added=true;
+
+ //
+ // Add fake entries for X11 generated names
+ switch(fe.getWeight())
+ {
+ case CFontEngine::WEIGHT_MEDIUM:
+ case CFontEngine::WEIGHT_REGULAR:
+ {
+ QString x11Ps(createX11PsName(fe.getFamilyName()));
+
+ if(CFontEngine::ITALIC_ITALIC!=fe.getItalic() &&
+ CFontEngine::ITALIC_OBLIQUE!=fe.getItalic())
+ addAliasEntry(entries,
+ createName(x11Ps, "Roman",
+ getItalicStr(fe.getItalic())),
+ fe.getPsName());
+ addAliasEntry(entries,
+ createName(x11Ps, NULL, getItalicStr(fe.getItalic())),
+ fe.getPsName());
+ break;
+ }
+ case CFontEngine::WEIGHT_UNKNOWN:
+ break;
+ default:
+ addAliasEntry(entries,
+ createName(createX11PsName(fe.getFamilyName()),
+ CFontEngine::weightStr(fe.getWeight()),
+ getItalicStr(fe.getItalic())),
+ fe.getPsName());
+ }
+ }
+ fe.closeFont();
+ }
+ }
+ while(++face<numFaces);
+ }
+ }
+ }
+
+ bool status=true;
+
+ if(added || entries.count()!=old.getLineCount())
+ {
+ KSaveFile out(fmapDir+FONTMAP);
+ QTextStream *stream=out.textStream();
+
+ if(stream)
+ {
+ QStringList::Iterator it;
+
+ for(it=entries.begin(); it!=entries.end(); ++it)
+ *stream << *it << endl;
+ }
+ else
+ status=false;
+ }
+
+ //
+ // Ensure GS's main Fontmap references our file...
+ if(root && status)
+ {
+ static const char * constGhostscriptDirs[]=
+ {
+ "/usr/share/ghostscript/",
+ "/usr/local/share/ghostscript/",
+ "/usr/share/gs-esp/",
+ NULL
+ };
+
+ QString gsFile=locateFile(FONTMAP, constGhostscriptDirs);
+
+ if(!gsFile.isEmpty())
+ {
+ const int constMaxLineLen=1024;
+ const char *constRLF=".runlibfile";
+
+ char line[constMaxLineLen];
+ ifstream in(QFile::encodeName(gsFile));
+
+ if(in)
+ {
+ QCString fmap(QFile::encodeName(fmapDir+FONTMAP));
+ int lineNum=0,
+ kfiLine=-1,
+ gsLine=-1,
+ ncLine=-1;
+
+ do
+ {
+ in.getline(line, constMaxLineLen);
+
+ if(in.good())
+ {
+ line[constMaxLineLen-1]='\0';
+
+ if(strstr(line, fmap.data())!=NULL && strstr(line, constRLF)!=NULL)
+ kfiLine=lineNum;
+ else if(strstr(line, FONTMAP".GS")!=NULL && strstr(line, constRLF)!=NULL)
+ gsLine=lineNum;
+ if(-1==ncLine && '%'!=line[0])
+ ncLine=lineNum;
+ lineNum++;
+ }
+ }
+ while(!in.eof() && (-1==kfiLine || -1==gsLine));
+
+ //
+ // If the file doesn't already say to use our Fontmap file, then tell it to!
+ // Also, ensure ours is .runlibfile'd before the main GS one - else problems can occur
+ if(-1==kfiLine || kfiLine>gsLine)
+ {
+ in.clear();
+ in.seekg(0, ios::end);
+ int size= (streamoff) in.tellg();
+ in.seekg(0, ios::beg);
+
+ char *buffer=new char[size+strlen(fmap)+strlen(constRLF)+5];
+
+ if(buffer)
+ {
+ bool added=false;
+
+ buffer[0]='\0';
+ lineNum=0;
+
+ do
+ {
+ in.getline(line, constMaxLineLen);
+
+ if(in.good())
+ {
+ line[constMaxLineLen-1]='\0';
+
+ if(lineNum>=ncLine && !added)
+ {
+ strcat(buffer, "(");
+ strcat(buffer, fmap);
+ strcat(buffer, ") ");
+ strcat(buffer, constRLF);
+ strcat(buffer, "\n");
+ added=true;
+ }
+
+ if(lineNum!=kfiLine)
+ {
+ strcat(buffer, line);
+ strcat(buffer, "\n");
+ }
+ lineNum++;
+ }
+ }
+ while(!in.eof());
+
+ in.close();
+
+ if(added) // Don't re-write GS's Fontmap unless we've actually added something...
+ {
+ KSaveFile out(gsFile);
+ QTextStream *stream=out.textStream();
+
+ if(stream)
+ *stream << buffer;
+ }
+ delete [] buffer;
+ }
+ }
+ }
+ }
+ }
+
+ return status;
+}
+
+CFile::CFile(const QString &dir)
+ : itsDir(dir),
+ itsLineCount(0)
+{
+ ifstream f(QFile::encodeName(dir+FONTMAP));
+
+ itsEntries.setAutoDelete(true);
+
+ if(f)
+ {
+ static const int constMaxLine=512;
+
+ char line[constMaxLine+1];
+ TEntry *current=NULL;
+
+ while(!f.eof())
+ {
+ f.getline(line, constMaxLine);
+
+ if(!f.eof())
+ {
+ QString ps,
+ fname;
+ bool isAlias;
+
+ if(parseLine(line, ps, fname, isAlias))
+ {
+ itsLineCount++;
+
+ TEntry *entry=getEntry(&current, fname, isAlias);
+
+ if(!isAlias && entry && entry->psName.isEmpty())
+ entry->psName=ps;
+
+ if(entry)
+ entry->entries.append(line);
+ }
+ }
+ }
+ f.close();
+ }
+}
+
+const QStringList * CFile::getEntries(const QString &fname)
+{
+ TEntry *entry=findEntry(0==fname.find(itsDir) ? fname.mid(itsDir.length()) : fname, false);
+
+ return entry ? &entry->entries : NULL;
+}
+
+CFile::TEntry * CFile::findEntry(const QString &fname, bool isAlias)
+{
+ TEntry *entry=NULL;
+
+ for(entry=itsEntries.first(); entry; entry=itsEntries.next())
+ if(isAlias ? entry->psName==fname : entry->filename==fname)
+ break;
+
+ return entry;
+}
+
+CFile::TEntry * CFile::getEntry(TEntry **current, const QString &fname, bool isAlias)
+{
+ //
+ // See if its the current one...
+ if(*current && (isAlias ? (*current)->psName==fname : (*current)->filename==fname))
+ return *current;
+
+ //
+ // See if its already known...
+ TEntry *entry=findEntry(fname, isAlias);
+
+ //
+ // If not found, then create a new entry
+ if(!entry)
+ {
+ entry=new TEntry(fname);
+ itsEntries.append(entry);
+ }
+
+ *current=entry;
+ return entry;
+}
+
+}
+
+}
diff --git a/kcontrol/kfontinst/kfontinst/Fontmap.h b/kcontrol/kfontinst/kfontinst/Fontmap.h
new file mode 100644
index 000000000..28d5c9d7e
--- /dev/null
+++ b/kcontrol/kfontinst/kfontinst/Fontmap.h
@@ -0,0 +1,79 @@
+#ifndef __FONTMAP_H__
+#define __FONTMAP_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Namespace : KFI::Fontmap
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 06/06/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include <qstring.h>
+#include <qstringlist.h>
+
+namespace KFI
+{
+
+class CFontEngine;
+
+namespace Fontmap
+{
+ class CFile
+ {
+ private:
+
+ struct TEntry
+ {
+ TEntry(const QString &fname) : filename(fname) {}
+
+ QString filename,
+ psName;
+ QStringList entries;
+ };
+
+ public:
+
+ CFile(const QString &dir);
+
+ const QStringList * getEntries(const QString &fname);
+ unsigned int getLineCount() { return itsLineCount; }
+
+ private:
+
+ TEntry * findEntry(const QString &fname, bool isAlias=false);
+ TEntry * getEntry(TEntry **current, const QString &fname, bool isAlias=false);
+
+ private:
+
+ QString itsDir;
+ QPtrList<TEntry> itsEntries;
+ unsigned int itsLineCount;
+ };
+
+ extern bool create(const QString &dir, CFontEngine &fe);
+}
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/kfontinst/GetPid.c b/kcontrol/kfontinst/kfontinst/GetPid.c
new file mode 100644
index 000000000..015ea7ce9
--- /dev/null
+++ b/kcontrol/kfontinst/kfontinst/GetPid.c
@@ -0,0 +1,519 @@
+/*
+////////////////////////////////////////////////////////////////////////////////
+//
+// File Name : GetPid.c
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 19/03/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003
+////////////////////////////////////////////////////////////////////////////////
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(__DragonFly__)
+#include <sys/param.h>
+#endif
+
+#include <sys/types.h>
+
+#ifndef __cplusplus
+#define bool unsigned int
+#define false 0
+#define true (!false)
+#endif
+
+#define BUFSIZE 1024
+#define PROCDIR "/proc"
+
+/*
+ Get process ID - using name of exe and parent process ID
+
+ Implemented for:
+
+ Linux Tested on Linux 2.4
+ FreeBSD Tested on FreeBSD 5.1 by Brian Ledbetter <brian@shadowcom.net>
+ NetBSD
+ Irix
+ Solaris Tested on Solaris 8 x86 by Torsten Kasch <tk@Genetik.Uni-Bielefeld.DE>
+ HP-UX Tested on HP-UX B.11.11 U 9000/800
+ AIX
+ ...else parse output of "ps -eaf"
+
+
+ Some sections of this code are copied from / inspired by ksysguard,
+ Copyright (c) 1999 - 2001 Chris Schlaeger <cs@kde.org>
+
+ To test this file, do the following:
+
+ 1. Compile this file as follows:
+
+ gcc GetPid.c -DTEST_GETPID -DOS_Linux -o tst
+
+ ...replace OS_Linux with your particular OS type: OS_FreeBSD, OS_NetBSD, OS_Irix, OS_Solaris,
+ OS_HPUX, or OS_AIX
+
+ 2. Start a program - such as "vi"
+ 3. Do a "ps -eaf" to ensure there is *only one* process called "vi"
+ 4. Get the parent process ID of your "vi" above
+ 5. Call tst with that value -e.g. vi ppid=23 then ./tst vi 23
+ ...this should then print out the process ID of "vi"
+ 6. Email me and let me know if it works!
+*/
+
+#if defined OS_Linux || defined __Linux__
+
+#include <dirent.h>
+#include <ctype.h>
+
+#define FOUND_NAME 1
+#define FOUND_PPID 2
+#define FOUND_ALL (FOUND_NAME+FOUND_PPID)
+
+unsigned int kfi_getPid(const char *proc, unsigned int ppid)
+{
+ bool error=false;
+ unsigned int pid=0;
+ DIR *dir;
+ struct dirent *entry;
+
+ /* read in current process list via the /proc filesystem entry */
+ if(NULL!=(dir=opendir(PROCDIR)))
+ {
+ while((entry=readdir(dir)) && !error)
+ if(isdigit(entry->d_name[0]))
+ {
+ char buf[BUFSIZE];
+ FILE *fd;
+
+ snprintf(buf, BUFSIZE-1, PROCDIR"/%d/status", atoi(entry->d_name));
+
+ if(NULL!=(fd=fopen(buf, "r")))
+ {
+ char format[32],
+ tagformat[32],
+ tag[32],
+ name[64];
+ int found=0;
+
+ found=0;
+ sprintf(format, "%%%d[^\n]\n", (int) sizeof(buf) - 1);
+ sprintf(tagformat, "%%%ds", (int) sizeof(tag) - 1);
+ for(;found<FOUND_ALL;)
+ {
+ if (fscanf(fd, format, buf)!=1)
+ break;
+ buf[sizeof(buf)-1]='\0';
+ sscanf(buf, tagformat, tag);
+ tag[sizeof(tag) - 1] = '\0';
+ if(0==strcmp(tag, "Name:"))
+ {
+ sscanf(buf, "%*s %63s", name);
+ if(NULL==name || 0!=strcmp(name, proc))
+ break;
+ found|=FOUND_NAME;
+ }
+ else if(0==strcmp(tag, "PPid:"))
+ {
+ unsigned int proc_ppid;
+
+ sscanf(buf, "%*s %u", &proc_ppid);
+ if(ppid!=proc_ppid)
+ break;
+ found|=FOUND_PPID;
+ }
+ }
+ if(FOUND_ALL==found)
+ {
+ if(pid)
+ error=true;
+ else
+ pid=atoi(entry->d_name);
+ }
+ fclose(fd);
+ }
+ }
+ closedir(dir);
+ }
+
+ return error ? 0 : pid;
+}
+
+#elif defined OS_FreeBSD || defined OS_NetBSD || defined __FreeBSD__ || defined __NetBSD__ || defined OS_Darwin
+
+#include <ctype.h>
+#include <dirent.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <sys/param.h>
+#if __FreeBSD_version > 500015
+#include <sys/priority.h>
+#endif
+#include <sys/sysctl.h>
+#include <sys/time.h>
+#include <sys/user.h>
+#include <unistd.h>
+unsigned int kfi_getPid(const char *proc, unsigned int ppid)
+{
+ bool error=false;
+ unsigned int pid=0;
+ int mib[4];
+ size_t len,
+ num;
+ struct kinfo_proc *p;
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_ALL;
+ sysctl(mib, 3, NULL, &len, NULL, 0);
+ p=(struct kinfo_proc*)malloc(len);
+ sysctl(mib, 3, p, &len, NULL, 0);
+
+ for(num=0; num < len / sizeof(struct kinfo_proc) && !error; num++)
+ {
+ struct kinfo_proc proc_p;
+ size_t len;
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PID;
+#if __FreeBSD_version >= 500015
+ mib[3] = p[num].ki_pid;
+#elif defined(__DragonFly__) && __DragonFly_version >= 190000
+ mib[3] = p[num].kp_pid;
+#else
+ mib[3] = p[num].kp_proc.p_pid;
+#endif
+
+ len=sizeof(proc_p);
+ if(-1==sysctl(mib, 4, &proc_p, &len, NULL, 0) || !len)
+ break;
+ else
+ {
+#if __FreeBSD_version >= 500015
+ if(proc_p.ki_ppid==ppid && p[num].ki_comm && 0==strcmp(p[num].ki_comm, proc))
+ if(pid)
+ error=true;
+ else
+ pid=p[num].ki_pid;
+#elif defined (__DragonFly__) && __DragonFly_version >= 190000
+ if(proc_p.kp_ppid==ppid && p[num].kp_comm && 0==strcmp(p[num].kp_comm, proc))
+ if(pid)
+ error=true;
+ else
+ pid=p[num].kp_pid;
+#else
+#if defined(__DragonFly__)
+ if(proc_p.kp_eproc.e_ppid==ppid && p[num].kp_thread.td_comm && 0==strcmp(p[num].kp_thread.td_comm, proc))
+#else
+ if(proc_p.kp_eproc.e_ppid==ppid && p[num].kp_proc.p_comm && 0==strcmp(p[num].kp_proc.p_comm, proc))
+#endif
+ if(pid)
+ error=true;
+ else
+ pid=p[num].kp_proc.p_pid;
+#endif
+ }
+ }
+ free(p);
+
+ return error ? 0 : pid;
+}
+
+#elif defined OS_Irix || defined OS_Solaris
+
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <dirent.h>
+#include <pwd.h>
+#include <sys/resource.h>
+#ifdef OS_Solaris
+
+#if (!defined(_LP64)) && (_FILE_OFFSET_BITS - 0 == 64)
+#define PROCFS_FILE_OFFSET_BITS_HACK 1
+#undef _FILE_OFFSET_BITS
+#else
+#define PROCFS_FILE_OFFSET_BITS_HACK 0
+#endif
+
+#include <procfs.h>
+
+#if (PROCFS_FILE_OFFSET_BITS_HACK - 0 == 1)
+#define _FILE_OFFSET_BITS 64
+#endif
+
+#else
+#include <sys/procfs.h>
+#include <sys/sysmp.h>
+#endif
+#include <sys/sysinfo.h>
+
+unsigned int kfi_getPid(const char *proc, pid_t ppid)
+{
+ DIR *procdir;
+ bool error=false;
+ pid_t pid=(pid_t)0;
+
+ if(NULL!=(procdir=opendir(PROCDIR)))
+ {
+ struct dirent *de;
+
+ rewinddir(procdir);
+ while((de=readdir(procdir)) && !error)
+ if('.'==de->d_name[0])
+ continue;
+ else
+ {
+ int fd;
+ char buf[BUFSIZE];
+#ifdef OS_Solaris
+ psinfo_t psinfo;
+
+ snprintf(buf, BUFSIZE - 1, "%s/%s/psinfo", PROCDIR, de->d_name);
+#else
+ prpsinfo_t psinfo;
+
+ sprintf(buf, PROCDIR"/pinfo/%ld", pid);
+#endif
+
+ if((fd=open(buf, O_RDONLY))<0)
+ continue;
+
+#ifdef OS_Solaris
+ if(sizeof(psinfo_t)!=read(fd, &psinfo, sizeof(psinfo_t)))
+#else
+ if(ioctl(fd, PIOCPSINFO, &psinfo)<0)
+#endif
+ {
+ close(fd);
+ continue;
+ }
+ close(fd);
+
+ if(psinfo.pr_ppid==ppid && psinfo.pr_fname && 0==strcmp(psinfo.pr_fname, proc))
+ if(pid)
+ error=true;
+ else
+ pid=psinfo.pr_pid;
+ }
+ closedir(procdir);
+ }
+
+ return error ? 0 : pid;
+}
+
+#elif defined OS_HPUX
+
+#include <sys/pstat.h>
+#define MAX_PROCS 50
+
+unsigned int kfi_getPid(const char *proc, unsigned int ppid)
+{
+ bool error=false;
+ unsigned int pid=0;
+ int i,
+ count,
+ idx=0;
+ struct pst_status pst[MAX_PROCS];
+
+ while((count=pstat_getproc(&pst[0], sizeof(pst[0]), MAX_PROCS, idx)) > 0 && !error)
+ {
+ for (i = 0; i<count && !error; i++)
+ if(pst[i].pst_ppid==ppid && pst[i].pst_ucomm && 0==strcmp(pst[i].pst_ucomm, proc))
+ if(pid)
+ error=true;
+ else
+ pid=pst[i].pst_pid;
+
+ idx=pst[count-1].pst_idx+1;
+ }
+
+ return error ? 0 : pid;
+}
+
+#elif defined OS_AIX
+
+#include <procinfo.h>
+#define MAX_PROCS 50
+
+unsigned int kfi_getPid(const char *proc, unsigned int ppid)
+{
+ bool error=false;
+ unsigned int pid=0;
+ int i,
+ count,
+ idx=0;
+ struct procsinfo pi[MAX_PROCS];
+
+ while((count=getprocs(&pi, sizeof(pi[0]), 0, 0, &pid, 1)) >0 && !error)
+ {
+ for (i = 0; i<count && !error; i++)
+ if(pi[i].pi_ppid==ppid && pi[i].pi_comm && 0==strcmp(pi[i].pi_comm, proc))
+ if(pid)
+ error=true;
+ else
+ pid=pi[i].pi_pid;
+
+ idx=pi[count-1].pi_idx+1;
+ }
+
+ return error ? 0 : pid;
+}
+
+#else
+#warning "Unable to determine operating system version! This may cause the getPid() function to fail at random!"
+
+/* Default to reading "ps -eaf" output */
+
+#include <pwd.h>
+#include <limits.h>
+#include <ctype.h>
+
+#define FOUND_PID 1
+#define FOUND_PPID 2
+#define FOUND_CMD 4
+#define FOUND_ALL (FOUND_PID+FOUND_PPID+FOUND_CMD)
+
+static int checkCmd(const char *proc, const char *cmd)
+{
+ int len=(int)strlen(cmd),
+ ch;
+
+ if(len>1)
+ for(ch=len-2; ch>=0; --ch)
+ if('/'==cmd[ch])
+ return strcmp(proc, &cmd[ch+1]);
+
+ return strcmp(proc, cmd);
+}
+
+unsigned int kfi_getPid(const char *proc, unsigned int ppid)
+{
+ bool error=false;
+ unsigned int pid=0;
+ static int pid_c=-1,
+ ppid_c=-1,
+ time_c=-1,
+ cmd_c=-1;
+
+ char cmd[BUFSIZE+1];
+ FILE *p;
+
+ /* If this function has been run before, and we know the column positions, then we can grep for just our command */
+ if(-1!=pid_c && -1!=ppid_c && -1!=time_c && -1!=cmd_c)
+ snprintf(cmd, BUFSIZE, "ps -eaf | grep %s", proc);
+ else
+ strcpy(cmd, "ps -eaf");
+
+ if(NULL!=(p=popen(cmd, "r")))
+ {
+ char line[BUFSIZE+1];
+ int c=0;
+ char *linep=NULL,
+ *token=NULL;
+
+ /* Read 1st line to determine columns... */
+ if((-1==pid_c || -1==ppid_c || -1==time_c || -1==cmd_c) && NULL!=fgets(line, BUFSIZE, p))
+ {
+ for(linep=line; -1==pid_c || -1==ppid_c || -1==time_c || -1==cmd_c; linep=NULL)
+ if(NULL!=(token=strtok(linep, " \t\n")))
+ {
+ if(0==strcmp("PID", token))
+ pid_c=c;
+ else if(0==strcmp("PPID", token))
+ ppid_c=c;
+ else if(NULL!=strstr("TIME", token))
+ time_c=c;
+ else if(0==strcmp("COMMAND", token) || 0==strcmp("CMD", token))
+ cmd_c=c;
+ c++;
+ }
+ else
+ break;
+ }
+
+ /* If all column headings read, then look for details... */
+ if(-1!=pid_c && -1!=ppid_c && -1!=time_c && -1!=cmd_c)
+ while(NULL!=fgets(line, BUFSIZE, p) && !error)
+ {
+ int found=0,
+ ps_pid=0,
+ offset=0;
+
+ c=0;
+ for(linep=line; FOUND_ALL!=found; linep=NULL)
+ if(NULL!=(token=strtok(linep, " \t\n")))
+ {
+ if(c==pid_c)
+ {
+ found|=FOUND_PID;
+ ps_pid=atoi(token);
+ }
+ else if(c==ppid_c)
+ {
+ if(((unsigned int)atoi(token))!=ppid)
+ break;
+ found|=FOUND_PPID;
+ }
+ else if(c==time_c)
+ offset=isdigit(token[0]) ? 0 : 1;
+ else if(c==(cmd_c+offset))
+ {
+ if(0!=checkCmd(proc, token))
+ break;
+ found|=FOUND_CMD;
+ }
+ c++;
+ }
+ else
+ break;
+
+ if(FOUND_ALL==found)
+ {
+ if(pid)
+ error=true;
+ else
+ pid=ps_pid;
+ }
+ }
+ pclose(p);
+ }
+
+ return error ? 0 : pid;
+}
+
+#endif
+
+#ifdef TEST_GETPID
+int main(int argc, char *argv[])
+{
+ if(3==argc)
+ printf("PID %u\n", kfi_getPid(argv[1], atoi(argv[2])));
+ else
+ printf("Usage: %s <process> <parent-process-id>\n", argv[0]);
+ return 0;
+}
+#endif
diff --git a/kcontrol/kfontinst/kfontinst/Main.cpp b/kcontrol/kfontinst/kfontinst/Main.cpp
new file mode 100644
index 000000000..2da9a8997
--- /dev/null
+++ b/kcontrol/kfontinst/kfontinst/Main.cpp
@@ -0,0 +1,335 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// File Name : Main.cpp
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 20/03/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "Misc.h"
+#include "FontEngine.h"
+#include "Fontmap.h"
+#include "XConfig.h"
+#include "kxftconfig.h"
+#include <fontconfig/fontconfig.h>
+#include <qfile.h>
+#include <stdio.h>
+
+//
+// Bug#99335 Solaris 2.6 does not have getopt.h :-(
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#else
+#include <unistd.h>
+#endif
+#include <iostream>
+
+#define KFI_XF86CFG "XF86Config"
+#define KFI_XORGCFG "xorg.conf"
+
+static const char * getFile(const char *entry, const char **posibilities)
+{
+ if(KFI::Misc::fExists(entry))
+ return entry;
+ else
+ {
+ int f;
+
+ for(f=0; posibilities[f]; ++f)
+ if(KFI::Misc::fExists(posibilities[f]))
+ break;
+
+ return posibilities[f];
+ }
+}
+
+static const char * constXConfigFiles[]=
+{
+ "/etc/X11/"KFI_XORGCFG,
+ "/etc/X11/"KFI_XORGCFG"-4",
+ "/etc/"KFI_XORGCFG,
+ "/usr/X11R6/etc/X11/"KFI_XORGCFG,
+ "/usr/X11R6/etc/X11/"KFI_XORGCFG"-4",
+ "/usr/X11R6/lib/X11/"KFI_XORGCFG,
+ "/usr/X11R6/lib/X11/"KFI_XORGCFG"-4",
+
+ "/etc/X11/"KFI_XF86CFG"-4",
+ "/etc/X11/"KFI_XF86CFG,
+ "/etc/"KFI_XF86CFG"-4",
+ "/etc/"KFI_XF86CFG,
+ "/usr/X11R6/etc/X11/"KFI_XF86CFG"-4",
+ "/usr/X11R6/etc/X11/"KFI_XF86CFG,
+ "/usr/X11R6/lib/X11/"KFI_XF86CFG"-4",
+ "/usr/X11R6/lib/X11/"KFI_XF86CFG,
+
+ NULL
+};
+
+static const char * constXfsConfigFiles[]=
+{
+ "/etc/X11/fs/config",
+ "/usr/openwin/lib/X11/fonts/fontserver.cfg",
+ NULL
+};
+
+KFI::CXConfig * getXCfg(bool root)
+{
+ if(root)
+ {
+ //
+ // Try to determine location for X and xfs config files...
+ // ...note on some systems (Solaris and HP-UX) only the xfs file will be found
+ bool xfs=false;
+ KFI::CXConfig *xcfg=NULL;
+ QString xConfigFile=getFile(QFile::encodeName(constXConfigFiles[0]), constXConfigFiles),
+ xfsConfigFile=getFile(QFile::encodeName(constXfsConfigFiles[0]), constXfsConfigFiles);
+
+ // If found xfs, but not X - then assume that xfs is being used...
+ if(!xfsConfigFile.isEmpty() && xConfigFile.isEmpty())
+ xfs=true;
+ else if(!xConfigFile.isEmpty()) // Read xConfig file to determine which one...
+ {
+ xcfg=new KFI::CXConfig(KFI::CXConfig::X11, xConfigFile);
+
+ if(!xfsConfigFile.isEmpty() && xcfg->xfsInPath())
+ {
+ delete xcfg;
+ xfs=true;
+ }
+ }
+
+ // OK, if still set to X11 config, but this mentions fontconfig FPE, then delete - as we're not interested
+ // anymore...
+ if(xcfg && xcfg->fcInPath())
+ delete xcfg;
+
+ return xfs ? new KFI::CXConfig(KFI::CXConfig::XFS, xfsConfigFile) : xcfg;
+ }
+
+ return NULL;
+}
+
+static void usage(char *app)
+{
+ std::cerr << "Usage: " << app << " [OPTIONS]... [FOLDER]..." << std::endl
+ << std::endl
+ << " Helper application for KDE's fonts:/ ioslave." << std::endl
+ << std::endl
+#ifdef HAVE_GETOPT_H
+ << " -x, --configure_x Configure FOLDER for regular x - i.e." << std::endl
+ << " create fonts.dir, fonts.scale and encodngs.dir" << std::endl
+ << std::endl
+ << " -g, --configure_gs Create Fontmap file. If run as root, then " << std::endl
+ << " no paramter is required as all fonts are " << std::endl
+ << " configured, and Fontmap placed in /etc/fonts" << std::endl
+ << " For non-root, fonts located in FOLDER are" << std::endl
+ << " configured, and Fontmap placed there." << std::endl
+ << std::endl
+ << " -f, --add_to_fc_cfg Add FOLDER to fontconfig config files." << std::endl
+ << std::endl
+ << " -a, --add_to_x_cfg Add FOLDER to X config files only when run as root.," << std::endl
+ << std::endl
+ << " -r, --refresh_x Refresh X." << std::endl
+ << std::endl
+ << " -s, --refresh_xfs Refresh Xfs." << std::endl
+#else
+ << " -x Configure FOLDER for regular x - i.e." << std::endl
+ << " create fonts.dir, fonts.scale and encodngs.dir" << std::endl
+ << std::endl
+ << " -g Create Fontmap file. If run as root, then " << std::endl
+ << " no paramter is required as all fonts are " << std::endl
+ << " configured, and Fontmap placed in /etc/fonts" << std::endl
+ << " For non-root, fonts located in FOLDER are" << std::endl
+ << " configured, and Fontmap placed there." << std::endl
+ << std::endl
+ << " -f Add FOLDER to fontconfig config files." << std::endl
+ << std::endl
+ << " -a Add FOLDER to X config files only when run as root.," << std::endl
+ << std::endl
+ << " -r Refresh X." << std::endl
+ << std::endl
+ << " -s Refresh Xfs." << std::endl
+#endif
+ << std::endl
+ << std::endl
+ << " (C) Craig Drummond, 2003, 2004." << std::endl
+ << std::endl;
+
+ exit(-1);
+}
+
+void refresh(bool refreshX, bool refreshXfs, bool root)
+{
+ if(refreshX)
+ KFI::CXConfig::refreshPaths(false);
+ if(refreshXfs && root)
+ KFI::CXConfig::refreshPaths(true);
+}
+
+int main(int argc, char *argv[])
+{
+#ifdef HAVE_GETOPT_H
+ static struct option options[]=
+ {
+ { "configure_x", 0, 0, 'x' },
+ { "configure_gs", 0, 0, 'g' },
+ { "add_to_fc_cfg", 0, 0, 'f' },
+ { "add_to_x_cfg", 0, 0, 'a' },
+ { "refresh_x", 0, 0, 'r' },
+ { "refresh_xfs", 0, 0, 's' },
+ { 0, 0, 0, 0 }
+ };
+#endif
+
+ int c=0,
+ rv=0;
+ bool doX=false,
+ doGs=false,
+ addToX=false,
+ addToFc=false,
+ refreshX=false,
+ refreshXfs=false,
+ root=KFI::Misc::root();
+
+#ifdef HAVE_GETOPT_H
+ int optIndex;
+ while(-1!=(c=getopt_long(argc, argv, "xgfars", options, &optIndex)))
+#else
+ while(-1!=(c=getopt(argc, argv, "xgfars")))
+#endif
+ switch(c)
+ {
+ case 'x':
+ doX=true;
+ break;
+ case 'g':
+ doGs=true;
+ break;
+ case 'f':
+ addToFc=true;
+ break;
+ case 'a':
+ addToX=true;
+ break;
+ case 'r':
+ refreshX=true;
+ break;
+ case 's':
+ refreshXfs=true;
+ break;
+ case '?':
+ usage(argv[0]);
+ break;
+ }
+
+ int left=argc-optind;
+ bool folderRequired=doX || addToX || addToFc || (!root && doGs);
+
+ if (left>1 || (0==left && folderRequired) || (!doX && !doGs && !addToX && !addToFc))
+ usage(argv[0]);
+ else
+ {
+ QString folder;
+
+ if(folderRequired)
+ {
+ folder=argv[optind];
+ unsigned int len=folder.length();
+
+ // Remove quotes...
+ if( (folder[0]==QChar('\'') || folder[0]==QChar('\"')) &&
+ (folder[len-1]==QChar('\'') || folder[len-1]==QChar('\"')))
+ folder=folder.mid(1, len-2);
+ folder=KFI::Misc::dirSyntax(folder);
+ }
+
+ if(folderRequired && !KFI::Misc::dExists(folder))
+ {
+ std::cerr << "ERROR: " << QFile::encodeName(folder) << " does not exist!" << std::endl;
+ rv=-2;
+ }
+ else
+ {
+ if(!folder.isEmpty())
+ {
+ if(0==rv && addToFc)
+ {
+ //
+ // Only add folder to fontconfig's config if its not already there...
+ FcStrList *list=FcConfigGetFontDirs(FcConfigGetCurrent());
+ FcChar8 *dir;
+ bool found=false;
+
+ while((dir=FcStrListNext(list)))
+ if(0==KFI::Misc::dirSyntax((const char *)dir).find(folder))
+ found=true;
+
+ if(!found)
+ {
+ KXftConfig *xft=new KXftConfig(KXftConfig::Dirs, root);
+
+ xft->addDir(folder);
+ rv=xft->apply() ? 0 : -3;
+ delete xft;
+ }
+ }
+
+ if(0==rv && addToX && root)
+ {
+ KFI::CXConfig *x=NULL;
+
+ if((x=getXCfg(true)))
+ {
+ x->addPath(folder);
+ rv=x->writeConfig() ? 0 : -4;
+ delete x;
+ }
+ else
+ rv=-5;
+ }
+ }
+
+ if(0==rv && (doX || doGs))
+ {
+ if(0==rv && doX)
+ rv=KFI::CXConfig::configureDir(folder) ? 0 : -5;
+
+ refresh(refreshX, refreshXfs, root);
+
+ if(0==rv && doGs)
+ {
+ KFI::CFontEngine fe;
+ rv=KFI::Fontmap::create(root ? QString::null : folder, fe) ? 0 : -6;
+ }
+ }
+ else if(0==rv)
+ refresh(refreshX, refreshXfs, root);
+ }
+ }
+
+ return rv;
+}
diff --git a/kcontrol/kfontinst/kfontinst/Makefile.am b/kcontrol/kfontinst/kfontinst/Makefile.am
new file mode 100644
index 000000000..3cfcfa689
--- /dev/null
+++ b/kcontrol/kfontinst/kfontinst/Makefile.am
@@ -0,0 +1,16 @@
+bin_PROGRAMS = kfontinst
+kfontinst_SOURCES = \
+Main.cpp \
+FontEngine.cpp \
+Fontmap.cpp \
+GetPid.c \
+XConfig.cpp
+
+noinst_HEADERS= \
+FontEngine.h \
+Fontmap.h \
+XConfig.h
+
+kfontinst_LDADD = ../../fonts/libkxftconfig.la $(LIBFONTCONFIG_LIBS) $(LIBFREETYPE_LIBS) $(LIBZ) $(LIB_KIO) ../lib/libkfontinst.la
+kfontinst_LDFLAGS = $(all_libraries) $(LIBFONTCONFIG_RPATH) $(LIBFREETYPE_RPATH) $(KDE_RPATH)
+AM_CPPFLAGS= -DOS_$(UNAME) -I$(srcdir)/../lib -I$(srcdir)/../../fonts $(all_includes) $(LIBFREETYPE_CFLAGS) $(LIBFONTCONFIG_CFLAGS)
diff --git a/kcontrol/kfontinst/kfontinst/XConfig.cpp b/kcontrol/kfontinst/kfontinst/XConfig.cpp
new file mode 100644
index 000000000..490c8dfe5
--- /dev/null
+++ b/kcontrol/kfontinst/kfontinst/XConfig.cpp
@@ -0,0 +1,760 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CXConfig
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 05/05/2001
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2001, 2002, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include "XConfig.h"
+#include "FontEngine.h"
+#include "kxftconfig.h"
+#include <ksavefile.h>
+#include <qtextstream.h>
+#include <fstream>
+#include <string.h>
+#include <qdir.h>
+#include <qregexp.h>
+#include <klocale.h>
+#include <sys/types.h>
+#include <signal.h>
+
+#if defined OS_Irix || defined OS_Solaris
+extern "C" unsigned int kfi_getPid(const char *proc, pid_t ppid);
+#else
+extern "C" unsigned int kfi_getPid(const char *proc, unsigned int ppid);
+#endif
+
+#define UNSCALED ":unscaled"
+
+namespace KFI
+{
+
+CXConfig::CXConfig(EType type, const QString &file)
+ : itsType(type),
+ itsFileName(file),
+ itsOk(false),
+ itsWritable(false)
+{
+ itsPaths.setAutoDelete(true);
+ readConfig();
+}
+
+bool CXConfig::configureDir(const QString &dir)
+{
+ //
+ // On systems without mkfontscale, the following will fail, so cant base
+ // return value upon that - hence only check return value of mkfontdir
+ Misc::doCmd("mkfontscale", QFile::encodeName(dir));
+ return Misc::doCmd("mkfontdir", QFile::encodeName(dir));
+}
+
+bool CXConfig::readConfig()
+{
+ itsOk=false;
+
+ switch(itsType)
+ {
+ case XFS:
+ itsOk=processXfs(true);
+ break;
+ case X11:
+ itsOk=processX11(true);
+ break;
+ }
+
+ if(itsOk)
+ itsWritable=Misc::fExists(itsFileName) ? Misc::fWritable(itsFileName)
+ : Misc::dWritable(Misc::getDir(itsFileName));
+ else
+ itsWritable=false;
+
+ return itsOk;
+}
+
+bool CXConfig::writeConfig()
+{
+ bool written=false;
+
+ //
+ // Check if file has been written since we last read it. If so, then re-read
+ // and add any new paths that we've added...
+ if(Misc::fExists(itsFileName) && Misc::getTimeStamp(itsFileName)!=itsTime)
+ {
+ CXConfig newConfig(itsType, itsFileName);
+
+ if(newConfig.ok())
+ {
+ TPath *path;
+
+ for(path=itsPaths.first(); path; path=itsPaths.next())
+ if(TPath::DIR==path->type && !path->orig)
+ newConfig.addPath(path->dir, path->unscaled);
+
+ written=newConfig.madeChanges() ? newConfig.writeConfig() : true;
+ }
+ }
+ else
+ switch(itsType)
+ {
+ case XFS:
+ written=processXfs(false);
+ break;
+ case X11:
+ written=processX11(false);
+ break;
+ }
+ if(written)
+ readConfig();
+
+ return written;
+}
+
+bool CXConfig::madeChanges()
+{
+ if(itsOk && itsWritable)
+ {
+ TPath *path;
+
+ for(path=itsPaths.first(); path; path=itsPaths.next())
+ if(!path->orig)
+ return true;
+ }
+
+ return false;
+}
+
+void CXConfig::addPath(const QString &dir, bool unscaled)
+{
+ if(itsWritable)
+ {
+ QString ds(Misc::dirSyntax(dir));
+
+ if(Misc::dExists(dir))
+ {
+ TPath *path=findPath(ds);
+
+ if(NULL==path)
+ itsPaths.append(new TPath(ds, unscaled, TPath::DIR, false));
+ }
+ }
+}
+
+bool CXConfig::inPath(TPath::EType type)
+{
+ if(itsOk && X11==itsType)
+ {
+ TPath *path=NULL;
+
+ for(path=itsPaths.first(); path; path=itsPaths.next())
+ if(type==path->type)
+ return true;
+ }
+
+ return false;
+}
+
+void CXConfig::refreshPaths(bool xfs)
+{
+ if(xfs)
+ {
+ if(Misc::root())
+ {
+ unsigned int xfsPid=kfi_getPid("xfs", 1);
+
+ if(xfsPid)
+ {
+ QString pid;
+
+ kill(xfsPid, SIGUSR1);
+ }
+ }
+ }
+ else
+ Misc::doCmd("xset", "fp", "rehash");
+}
+
+CXConfig::TPath * CXConfig::findPath(const QString &dir)
+{
+ TPath *path=NULL;
+ QString ds(Misc::dirSyntax(dir));
+
+ for(path=itsPaths.first(); path; path=itsPaths.next())
+ if(path->dir==ds)
+ return path;
+
+ return NULL;
+}
+
+static void processPath(char *str, QString &path, bool &unscaled)
+{
+ char *unsc=NULL;
+
+ unscaled=false;
+
+ if(NULL!=(unsc=strstr(str, UNSCALED)))
+ {
+ *unsc='\0';
+ unscaled=true;
+ }
+
+ path=str;
+
+ if(str[strlen(str)-1]!='/')
+ path+="/";
+}
+
+inline bool isWhitespace(char ch)
+{
+ return (' '==ch || '\t'==ch || '\n'==ch) ? true : false;
+}
+
+static unsigned int commentChars(char *buffer)
+{
+ unsigned int num=0;
+
+ if(buffer[0]=='#')
+ for(num=1; num<strlen(buffer)+1; ++num)
+ if(buffer[num]=='\n' || buffer[num]=='\0')
+ break;
+
+ return num;
+}
+
+static bool commentedOut(char *buffer, char *sect)
+{
+ if(sect!=buffer && '\n'!=*(sect-1))
+ {
+ char *ch;
+
+ for(ch=sect-1; ch>=buffer; ch--)
+ if(*ch=='\n')
+ break;
+ else if(*ch=='#')
+ return true;
+ }
+
+ return false;
+}
+
+static char * locateSection(char *buffer, const char *section)
+{
+ const char *sectionMarker ="Section";
+ const int sectionMarkerLen=7;
+
+ char *s=NULL,
+ *buf=buffer;
+
+ do
+ {
+ s=strstr(buf, sectionMarker);
+
+ if(s)
+ {
+ bool com=commentedOut(buffer, s);
+
+ buf=s+sectionMarkerLen;
+ if(com)
+ s=NULL;
+ else
+ {
+ // Skip any whitespace
+ for(s+=sectionMarkerLen; s && isWhitespace(*s); s++)
+ ;
+
+ // Now check section type
+ if(s && s==strstr(s, section)) // If found, then again skip past whitespace
+ for(s+=strlen(section); s && isWhitespace(*s); s++)
+ ;
+ else
+ s=NULL;
+ }
+ }
+ else
+ break;
+ }
+ while(!s);
+
+ return s;
+}
+
+static const char *endSectionMarker ="EndSection";
+static const int endSectionMarkerLen=10;
+
+static char *locateEndSection(char *buffer)
+{
+ char *s=NULL,
+ *buf=buffer;
+
+ do
+ {
+ s=strstr(buf, endSectionMarker);
+
+ if(s)
+ {
+ bool com=commentedOut(buffer, s);
+
+ buf=s+endSectionMarkerLen;
+ if(com)
+ s=NULL;
+ }
+ else
+ break;
+ }
+ while(!s);
+
+ return s;
+}
+
+static char * getItem(char **start, char **end, const char *key, unsigned int &size, bool remove, char *buffer)
+{
+ static const int constMaxItemLen = 1024;
+ static char item[constMaxItemLen+1];
+
+ unsigned int keyLen=strlen(key);
+
+ char *s=NULL,
+ *buf=*start;
+
+ do
+ {
+ s=strstr(buf, key);
+
+ if(s && s<*end)
+ {
+ bool com=commentedOut(buf, s);
+
+ buf=s+keyLen;
+ if(com)
+ s=NULL;
+ else
+ {
+ char *beg=s;
+ // Skip any whitespace
+ for(s+=keyLen; s && isWhitespace(*s); s++)
+ ;
+
+ if(s && *s=='\"' && s<*end)
+ {
+ char *e=strchr(s+1, '\"'),
+ *nl=strchr(s+1, '\n');
+
+ if(e && e<*end && (!nl || nl>e) && e-s<=constMaxItemLen)
+ {
+ memcpy(item, s+1, (e-s)-1);
+ item[(e-s)-1]='\0';
+
+ if(remove)
+ {
+ for(beg--; beg>=buffer && *beg!='\n' && *beg !='\"'; beg--)
+ ;
+ if(!nl)
+ nl=e+1;
+ memmove(beg, nl, ((buffer+size)-nl)+1);
+ size-=nl-beg;
+ *end-=nl-beg;
+ }
+ else
+ *start=e+1;
+
+ return item;
+ }
+ else
+ s=NULL;
+ }
+ else
+ s=NULL;
+ }
+ }
+ else
+ break;
+ }
+ while(!s);
+
+ return NULL;
+}
+
+bool CXConfig::processX11(bool read)
+{
+ std::ifstream x11(QFile::encodeName(itsFileName));
+ bool ok=false;
+
+ if(x11)
+ {
+ itsTime=Misc::getTimeStamp(itsFileName);
+
+ bool closed=false;
+
+ x11.seekg(0, std::ios::end);
+ unsigned int size=(std::streamoff) x11.tellg();
+
+ if(read)
+ itsPaths.clear();
+
+ if(size<65536) // Just incase...
+ {
+ char *buffer=new char [size+1];
+
+ if(buffer)
+ {
+ x11.seekg(0, std::ios::beg);
+ x11.read(buffer, size);
+
+ if(x11.good())
+ {
+ char *filesStart=NULL,
+ *filesEnd=NULL;
+
+ closed=true;
+ x11.close();
+ buffer[size]='\0';
+
+ if(NULL!=(filesStart=locateSection(buffer, "\"Files\"")) && NULL!=(filesEnd=locateEndSection(filesStart)))
+ {
+ char *pos=filesStart,
+ *item;
+
+ while(NULL!=(item=getItem(&pos, &filesEnd, "FontPath", size, !read, buffer)))
+ if(read) // Then save paths...
+ {
+ QString path;
+ bool unscaled;
+
+ processPath(item, path, unscaled);
+
+ if(NULL==findPath(path))
+ itsPaths.append(new TPath(path, unscaled, TPath::getType(path)));
+ }
+
+ if(read)
+ ok=true;
+ else
+ {
+ Misc::createBackup(itsFileName);
+
+ KSaveFile out(itsFileName);
+ FILE *fstream=out.fstream();
+
+ if(fstream)
+ {
+ char *from=buffer,
+ *modStart=NULL,
+ *modEnd=NULL;
+ bool foundFt=false;
+ TPath *path;
+
+ // Check if "freetype" OR "xtt" is loaded for usage of TTF's
+ if(NULL!=(modStart=locateSection(buffer, "\"Module\"")) && NULL!=(modEnd=locateEndSection(modStart)))
+ {
+ pos=modStart;
+
+ while(NULL!=(item=getItem(&pos, &modEnd, "Load", size, false, buffer)) && !foundFt)
+ if(0==strcmp(item, "freetype") || 0==strcmp(item, "xtt"))
+ foundFt=true;
+ }
+
+ if(!foundFt && modStart && modEnd && modStart<filesStart) // Then write mod section first...
+ {
+ fwrite(from, 1, modEnd-from, fstream);
+ if(!foundFt)
+ fputs(" Load \"freetype\"\n", fstream); // CPD TODO: Which is better xtt of freetype? Perhaps check locale?
+ fwrite(modEnd, 1, endSectionMarkerLen, fstream);
+ from=modEnd+endSectionMarkerLen;
+ }
+
+ fwrite(from, 1, filesEnd-from, fstream);
+
+ for(path=itsPaths.first(); path; path=itsPaths.next())
+ if(TPath::DIR!=path->type || Misc::dExists(path->dir))
+ {
+ QCString cPath(QFile::encodeName(Misc::xDirSyntax(path->dir)));
+
+ fputs(" FontPath \t\"", fstream);
+ fwrite(cPath.data(), 1, cPath.length(), fstream);
+ if(path->unscaled)
+ fputs(UNSCALED, fstream);
+ fputs("\"\n", fstream);
+ }
+
+ fwrite(filesEnd, 1, endSectionMarkerLen, fstream);
+ from=filesEnd+endSectionMarkerLen;
+
+ if(!foundFt && modStart && modEnd && modStart>filesStart) // Then write mod section last...
+ {
+ fwrite(from, 1, modEnd-from, fstream);
+ if(!foundFt)
+ fputs(" Load \"freetype\"\n", fstream);
+ fwrite(modEnd, 1, endSectionMarkerLen, fstream);
+ from=modEnd+endSectionMarkerLen;
+ }
+ if(((unsigned int)(from-buffer))<size)
+ fwrite(from, 1, size-(from-buffer), fstream);
+ ok=true;
+ }
+ }
+ }
+ }
+ delete [] buffer;
+ }
+ }
+ if(!closed)
+ x11.close();
+ }
+
+ return ok;
+}
+
+static bool isXfsKey(const char *str)
+{
+ static const char *constKeys[]=
+ {
+ "alternate-servers",
+ "cache-balance",
+ "cache-hi-mark",
+ "cache-low-mark",
+ "catalogue",
+ "client-limit",
+ "clone-self",
+ "default-point-size",
+ "default-resolutions",
+ "deferglyphs",
+ "error-file",
+ "no-listen",
+ "port",
+ "server-number",
+ "snf-format",
+ "trusted-clients",
+ "use-syslog",
+ NULL
+ };
+
+ for(unsigned int key=0; NULL!=constKeys[key]; ++key)
+ if(strstr(str, constKeys[key])==str)
+ {
+ unsigned int sLen=strlen(str),
+ kLen=strlen(constKeys[key]);
+
+ if(sLen>kLen && isWhitespace(str[kLen]) || '\0'==str[kLen] || '#'==str[kLen] || '='==str[kLen])
+ return true;
+ }
+
+ return false;
+}
+
+static char * getXfsPath(char *buffer, unsigned int &totalSize, unsigned int offsetSize)
+{
+ // Remove & return a path from the buffer
+ const unsigned int constMaxPathLen=8192;
+
+ static char path[constMaxPathLen];
+ bool found=false;
+
+ if(offsetSize<totalSize) // Just to make sure soething hasn't gone horribly wrong!
+ {
+ unsigned int i;
+
+ for(i=0; i<offsetSize && !found; i++)
+ if(!isWhitespace(buffer[i]) && ','!=buffer[i])
+ {
+ unsigned int comChars=commentChars(&buffer[i]);
+
+ if(comChars)
+ i+=comChars;
+ else
+ if(isXfsKey(&buffer[i]))
+ break;
+ else
+ {
+ // A path is terminated by either a comma, another key, or eof...
+
+ unsigned int j=0;
+
+ for(j=1; j<offsetSize-i && !found; j++)
+ if(buffer[i+j]==',' || buffer[i+j]=='\n' || buffer[i+j]=='\0' || isXfsKey(&buffer[i+j]))
+ {
+ if(j>0 && j<constMaxPathLen)
+ {
+ memcpy(path, &buffer[i], j);
+ path[j]='\0';
+ if(buffer[i+j]==',')
+ j++;
+ memmove(buffer, &buffer[i+j], (offsetSize-(i+j))+1);
+ totalSize-=(i+j);
+ found=true;
+ }
+ }
+ }
+ }
+ }
+
+ return found ? path : NULL;
+}
+
+bool CXConfig::processXfs(bool read)
+{
+ std::ifstream xfs(QFile::encodeName(itsFileName));
+ bool ok=false;
+
+ if(xfs)
+ {
+ itsTime=Misc::getTimeStamp(itsFileName);
+
+ bool closed=false;
+
+ xfs.seekg(0, std::ios::end);
+ unsigned int size= (std::streamoff) xfs.tellg();
+
+ if(read)
+ itsPaths.clear();
+
+ if(size<32768) // Just incase...
+ {
+ char *buffer=new char [size+1];
+
+ if(buffer)
+ {
+ xfs.seekg(0, std::ios::beg);
+ xfs.read(buffer, size);
+
+ if(xfs.good())
+ {
+ const char *constCatalogueStr="catalogue";
+ char *cat=NULL;
+ bool found=false,
+ formatError=false;
+
+ closed=true;
+ xfs.close();
+ buffer[size]='\0';
+
+ // Now remove the directory lists from the buffer...
+ do
+ if(NULL!=(cat=strstr(buffer, constCatalogueStr)))
+ {
+ cat+=strlen(constCatalogueStr);
+
+ if(!isWhitespace(*(cat-1)))
+ {
+ // Check it's not been commented out - by searching back until we get to the start of the buffer,
+ // a carriage-return, or a hash...
+
+ if(!commentedOut(buffer, cat))
+ {
+ // Look for '='
+ unsigned int i;
+
+ for(i=1; i<size-(cat-buffer) && !found && !formatError; ++i)
+ if(!isWhitespace(cat[i]))
+ {
+ unsigned int comChars=commentChars(&cat[i]);
+
+ if(comChars)
+ i+=comChars;
+ else
+ if(cat[i]!='=' || i+1>=size-(cat-buffer))
+ formatError=true;
+ else
+ {
+ char *path;
+
+ cat=&cat[i+1]; // skip equals sign
+ while(NULL!=(path=getXfsPath(cat, size, size-(cat-buffer))))
+ if(read)
+ {
+ QString str;
+ bool unscaled;
+ processPath(path, str, unscaled);
+
+ if(NULL==findPath(path))
+ itsPaths.append(new TPath(str, unscaled));
+ }
+
+ if(!read) // then must be write...
+ {
+ Misc::createBackup(itsFileName);
+
+ KSaveFile out(itsFileName);
+ FILE *fstream=out.fstream();
+
+ if(fstream)
+ {
+ bool first=true;
+ TPath *p=NULL;
+
+ fwrite(buffer, 1, cat-buffer, fstream);
+ fputc(' ', fstream);
+ for(p=itsPaths.first(); p; p=itsPaths.next())
+ if(Misc::dExists(p->dir))
+ {
+ QCString cPath(QFile::encodeName(Misc::xDirSyntax(p->dir)));
+
+ if(!first)
+ {
+ fputc(',', fstream);
+ fputc('\n', fstream);
+ }
+ fwrite(cPath.data(), 1, cPath.length(), fstream);
+ if(p->unscaled)
+ fputs(UNSCALED, fstream);
+ first=false;
+ }
+ fwrite(cat, 1, size-(cat-buffer), fstream);
+ ok=true;
+ }
+ }
+ else
+ ok=true;
+
+ found=true;
+ }
+ }
+ }
+ }
+ }
+ while(NULL!=cat && !found && !formatError);
+ }
+ delete [] buffer;
+ }
+ }
+ if(!closed)
+ xfs.close();
+ }
+
+ return ok;
+}
+
+
+CXConfig::TPath::EType CXConfig::TPath::getType(const QString &d)
+{
+ QString str(d);
+
+ str.replace(QRegExp("\\s*"), "");
+
+ return 0==str.find("unix/:")
+ ? FONT_SERVER
+ : "fontconfig"==str
+ ? FONT_CONFIG
+ : DIR;
+}
+
+}
diff --git a/kcontrol/kfontinst/kfontinst/XConfig.h b/kcontrol/kfontinst/kfontinst/XConfig.h
new file mode 100644
index 000000000..5a8ed1624
--- /dev/null
+++ b/kcontrol/kfontinst/kfontinst/XConfig.h
@@ -0,0 +1,114 @@
+#ifndef __X_CONFIG_H__
+#define __X_CONFIG_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CXConfig
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 05/05/2001
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2001, 2002, 2003, 2004
+///////////////////////////////////////////////////////////////////////////////
+
+#include "Misc.h"
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <time.h>
+
+namespace KFI
+{
+
+class CFontEngine;
+
+class CXConfig
+{
+ public:
+
+ struct TPath
+ {
+ enum EType
+ {
+ DIR,
+ FONT_SERVER,
+ FONT_CONFIG
+ };
+
+ TPath(const QString &d, bool u=false, EType t=DIR, bool o=true)
+ : dir(DIR==t ? Misc::dirSyntax(d) : d), unscaled(u), orig(o), type(t) {}
+
+ static EType getType(const QString &d);
+
+ QString dir;
+ bool unscaled,
+ orig; // Was dir in file when read?
+ EType type;
+ };
+
+ enum EType
+ {
+ XFS,
+ X11
+ };
+
+ public:
+
+ CXConfig(EType type, const QString &file);
+
+ static bool configureDir(const QString &dir);
+
+ bool ok() { return itsOk; }
+ bool writable() { return itsWritable; }
+ bool readConfig();
+ bool writeConfig();
+ bool madeChanges();
+ void addPath(const QString &dir, bool unscaled=false);
+ bool inPath(TPath::EType type);
+ bool xfsInPath() { return inPath(TPath::FONT_SERVER); }
+ bool fcInPath() { return inPath(TPath::FONT_CONFIG); }
+ void refreshPaths() { refreshPaths(XFS==itsType); }
+ void restart();
+ EType getType() { return itsType; }
+
+ static void refreshPaths(bool xfs);
+
+ private:
+
+ bool processX11(bool read);
+ bool processXfs(bool read);
+
+ TPath * findPath(const QString &dir);
+
+ private:
+
+ EType itsType;
+ QPtrList<TPath> itsPaths;
+ QString itsFileName,
+ itsInsertPos;
+ bool itsOk,
+ itsWritable;
+ time_t itsTime;
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/kio/KioFonts.cpp b/kcontrol/kfontinst/kio/KioFonts.cpp
new file mode 100644
index 000000000..e5bc2d6af
--- /dev/null
+++ b/kcontrol/kfontinst/kio/KioFonts.cpp
@@ -0,0 +1,2534 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CKioFonts
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 05/03/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+/***************************************************************************
+
+ NOTE: Large sections of this code are copied from kio_file
+ -- can't just inherit from kio_file as kio_file uses "error(...);
+ return;" So there is no way to know if an error occured!
+
+ ***************************************************************************/
+
+#include "KioFonts.h"
+#include <stdlib.h>
+#include <pwd.h>
+#include <grp.h>
+#include <sys/types.h>
+#include <utime.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <kio/global.h>
+#include <kio/ioslave_defaults.h>
+#include <kio/netaccess.h>
+#include <kio/slaveinterface.h>
+#include <kio/connection.h>
+#include <qtextstream.h>
+#include <kmimetype.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <qdir.h>
+#include <qdatastream.h>
+#include <qregexp.h>
+#include <kinstance.h>
+#include <klargefile.h>
+#include <ktempfile.h>
+#include <kdesu/su.h>
+#include <kprocess.h>
+#include <kdebug.h>
+#include <ktar.h>
+#include <kxftconfig.h>
+#include <fontconfig/fontconfig.h>
+#include "KfiConstants.h"
+#include "FcEngine.h"
+#include "Misc.h"
+#include <X11/Xlib.h>
+#include <fixx11h.h>
+#include <ctype.h>
+
+//#define KFI_FORCE_DEBUG_TO_STDERR
+
+#ifdef KFI_FORCE_DEBUG_TO_STDERR
+
+#include <qtextstream.h>
+QTextOStream ostr(stderr);
+#define KFI_DBUG ostr << "[" << (int)(getpid()) << "] "
+
+#else
+
+#define KFI_DBUG kdDebug() << "[" << (int)(getpid()) << "] "
+
+#endif
+
+#define MAX_IPC_SIZE (1024*32)
+#define TIMEOUT 2 // Time between last mod and writing files...
+#define MAX_NEW_FONTS 50 // #fonts that can be installed before automatically configuring (related to above)
+#define FC_CACHE_CMD "fc-cache"
+
+static const char * constMultipleExtension=".fonts.tar.gz"; // Fonts that have multiple files are returned as a .tar.gz!
+static const int constMaxLastDestTime=5;
+static const int constMaxFcCheckTime=10;
+
+extern "C"
+{
+ KDE_EXPORT int kdemain(int argc, char **argv);
+}
+
+int kdemain(int argc, char **argv)
+{
+ if (argc != 4)
+ {
+ fprintf(stderr, "Usage: kio_" KFI_KIO_FONTS_PROTOCOL " protocol domain-socket1 domain-socket2\n");
+ exit(-1);
+ }
+
+ KLocale::setMainCatalogue(KFI_CATALOGUE);
+
+ KInstance instance("kio_" KFI_KIO_FONTS_PROTOCOL);
+ KFI::CKioFonts slave(argv[2], argv[3]);
+
+ slave.dispatchLoop();
+
+ return 0;
+}
+
+namespace KFI
+{
+
+inline bool isSysFolder(const QString &sect)
+{
+ return i18n(KFI_KIO_FONTS_SYS)==sect || KFI_KIO_FONTS_SYS==sect;
+}
+
+inline bool isUserFolder(const QString &sect)
+{
+ return i18n(KFI_KIO_FONTS_USER)==sect || KFI_KIO_FONTS_USER==sect;
+}
+
+static QString removeMultipleExtension(const KURL &url)
+{
+ QString fname(url.fileName());
+ int pos;
+
+ if(-1!=(pos=fname.findRev(QString::fromLatin1(constMultipleExtension))))
+ fname=fname.left(pos);
+
+ return fname;
+}
+
+static QString modifyName(const QString &fname)
+{
+ static const char constSymbols[]={ '-', ' ', ':', 0 };
+
+ QString rv(fname);
+ int dotPos=rv.findRev('.');
+
+ if(-1!=dotPos)
+ {
+ unsigned int rvLen=rv.length();
+
+ for(unsigned int i=dotPos+1; i<rvLen; ++i)
+ rv[i]=rv[i].lower();
+ }
+
+ for(int s=0; constSymbols[s]; ++s)
+ rv=rv.replace(constSymbols[s], '_');
+
+ return rv;
+}
+
+static int getSize(const QCString &file)
+{
+ KDE_struct_stat buff;
+
+ if(-1!=KDE_lstat(file, &buff))
+ {
+ if (S_ISLNK(buff.st_mode))
+ {
+ char buffer2[1000];
+ int n=readlink(file, buffer2, 1000);
+ if(n!= -1)
+ buffer2[n]='\0';
+
+ if(-1==KDE_stat(file, &buff))
+ return -1;
+ }
+ return buff.st_size;
+ }
+
+ return -1;
+}
+
+static int getFontSize(const QString &file)
+{
+ int size=0;
+
+ KURL::List urls;
+ QStringList files;
+
+ Misc::getAssociatedUrls(KURL(file), urls);
+
+ files.append(file);
+
+ if(urls.count())
+ {
+ KURL::List::Iterator uIt,
+ uEnd=urls.end();
+
+ for(uIt=urls.begin(); uIt!=uEnd; ++uIt)
+ files.append((*uIt).path());
+ }
+
+ QStringList::Iterator it(files.begin()),
+ end(files.end());
+
+ for(; it!=end; ++it)
+ {
+ int s=getSize(QFile::encodeName(*it));
+
+ if(s>-1)
+ size+=s;
+ }
+
+ return size;
+}
+
+static int getSize(QValueList<FcPattern *> &patterns)
+{
+ QValueList<FcPattern *>::Iterator it,
+ end=patterns.end();
+ int size=0;
+
+ for(it=patterns.begin(); it!=end; ++it)
+ size+=getFontSize(CFcEngine::getFcString(*it, FC_FILE));
+
+ return size;
+}
+
+static void addAtom(KIO::UDSEntry &entry, unsigned int ID, long l, const QString &s=QString::null)
+{
+ KIO::UDSAtom atom;
+ atom.m_uds = ID;
+ atom.m_long = l;
+ atom.m_str = s;
+ entry.append(atom);
+}
+
+static bool createFolderUDSEntry(KIO::UDSEntry &entry, const QString &name, const QString &path, bool sys)
+{
+ KFI_DBUG << "createFolderUDSEntry " << name << ' ' << path << ' ' << sys << ' ' << endl;
+
+ KDE_struct_stat buff;
+ QCString cPath(QFile::encodeName(path));
+
+ entry.clear();
+
+ if(-1!=KDE_lstat(cPath, &buff))
+ {
+ addAtom(entry, KIO::UDS_NAME, 0, name);
+
+ if (S_ISLNK(buff.st_mode))
+ {
+ KFI_DBUG << path << " is a link" << endl;
+
+ char buffer2[1000];
+ int n=readlink(cPath, buffer2, 1000);
+ if(n!= -1)
+ buffer2[n]='\0';
+
+ addAtom(entry, KIO::UDS_LINK_DEST, 0, QString::fromLocal8Bit(buffer2));
+
+ if(-1==KDE_stat(cPath, &buff))
+ {
+ // It is a link pointing to nowhere
+ addAtom(entry, KIO::UDS_FILE_TYPE, S_IFMT - 1);
+ addAtom(entry, KIO::UDS_ACCESS, S_IRWXU | S_IRWXG | S_IRWXO);
+ addAtom(entry, KIO::UDS_SIZE, 0);
+ goto notype;
+ }
+ }
+
+ addAtom(entry, KIO::UDS_FILE_TYPE, buff.st_mode&S_IFMT);
+ addAtom(entry, KIO::UDS_ACCESS, buff.st_mode&07777);
+ addAtom(entry, KIO::UDS_SIZE, buff.st_size);
+
+ notype:
+ addAtom(entry, KIO::UDS_MODIFICATION_TIME, buff.st_mtime);
+
+ struct passwd *user = getpwuid(buff.st_uid);
+ addAtom(entry, KIO::UDS_USER, 0, user ? user->pw_name : QString::number(buff.st_uid).latin1());
+
+ struct group *grp = getgrgid(buff.st_gid);
+ addAtom(entry, KIO::UDS_GROUP, 0, grp ? grp->gr_name : QString::number(buff.st_gid).latin1());
+
+ addAtom(entry, KIO::UDS_ACCESS_TIME, buff.st_atime);
+ addAtom(entry, KIO::UDS_MIME_TYPE, 0, sys
+ ? KFI_KIO_FONTS_PROTOCOL"/system-folder"
+ : KFI_KIO_FONTS_PROTOCOL"/folder");
+ addAtom(entry, KIO::UDS_GUESSED_MIME_TYPE, 0, "application/octet-stream");
+ QString url(KFI_KIO_FONTS_PROTOCOL+QString::fromLatin1(":/"));
+ return true;
+ }
+ else if (sys && !Misc::root()) // Default system fonts folder does not actually exist yet!
+ {
+ KFI_DBUG << "Default system folder (" << path << ") does not yet exist, so create dummy entry" << endl;
+ addAtom(entry, KIO::UDS_NAME, 0, name);
+ addAtom(entry, KIO::UDS_FILE_TYPE, S_IFDIR);
+ addAtom(entry, KIO::UDS_ACCESS, 0744);
+ addAtom(entry, KIO::UDS_USER, 0, "root");
+ addAtom(entry, KIO::UDS_GROUP, 0, "root");
+ addAtom(entry, KIO::UDS_MIME_TYPE, 0, KFI_KIO_FONTS_PROTOCOL"/system-folder");
+ addAtom(entry, KIO::UDS_GUESSED_MIME_TYPE, 0, "application/octet-stream");
+
+ return true;
+ }
+
+
+ return false;
+}
+
+static bool createFontUDSEntry(KIO::UDSEntry &entry, const QString &name, QValueList<FcPattern *> &patterns, bool sys)
+{
+ KFI_DBUG << "createFontUDSEntry " << name << ' ' << patterns.count() << endl;
+
+ bool multiple=true;
+
+ if(1==patterns.count()) // Only one font file, but are there any .pfm or .afm files?
+ {
+ KURL::List urls;
+
+ Misc::getAssociatedUrls(KURL(CFcEngine::getFcString(patterns.first(), FC_FILE)), urls);
+
+ if(0==urls.count())
+ multiple=false;
+ }
+
+ //
+ // In case of mixed bitmap/scalable - prefer scalable
+ QValueList<FcPattern *> sortedPatterns;
+ QValueList<FcPattern *>::Iterator it,
+ end(patterns.end());
+ FcBool b=FcFalse;
+
+ for(it=patterns.begin(); it!=end; ++it)
+ if(FcResultMatch==FcPatternGetBool(*it, FC_SCALABLE, 0, &b) && b)
+ sortedPatterns.prepend(*it);
+ else
+ sortedPatterns.append(*it);
+
+ end=sortedPatterns.end();
+ entry.clear();
+ addAtom(entry, KIO::UDS_SIZE, getSize(patterns));
+
+ for(it=sortedPatterns.begin(); it!=end; ++it)
+ {
+ QString path(CFcEngine::getFcString(*it, FC_FILE));
+ QCString cPath(QFile::encodeName(path));
+ KDE_struct_stat buff;
+
+ if(-1!=KDE_lstat(cPath, &buff))
+ {
+ addAtom(entry, KIO::UDS_NAME, 0, name);
+
+ if (S_ISLNK(buff.st_mode))
+ {
+ KFI_DBUG << path << " is a link" << endl;
+
+ char buffer2[1000];
+ int n=readlink(cPath, buffer2, 1000);
+
+ if(n!= -1)
+ buffer2[n]='\0';
+
+ addAtom(entry, KIO::UDS_LINK_DEST, 0, QString::fromLocal8Bit(buffer2));
+
+ if(-1==KDE_stat(cPath, &buff))
+ {
+ // It is a link pointing to nowhere
+ addAtom(entry, KIO::UDS_FILE_TYPE, S_IFMT - 1);
+ addAtom(entry, KIO::UDS_ACCESS, S_IRWXU | S_IRWXG | S_IRWXO);
+ goto notype;
+ }
+ }
+
+ addAtom(entry, KIO::UDS_FILE_TYPE, buff.st_mode&S_IFMT);
+ addAtom(entry, KIO::UDS_ACCESS, buff.st_mode&07777);
+
+ notype:
+ addAtom(entry, KIO::UDS_MODIFICATION_TIME, buff.st_mtime);
+
+ struct passwd *user = getpwuid(buff.st_uid);
+ addAtom(entry, KIO::UDS_USER, 0, user ? user->pw_name : QString::number(buff.st_uid).latin1());
+
+ struct group *grp = getgrgid(buff.st_gid);
+ addAtom(entry, KIO::UDS_GROUP, 0, grp ? grp->gr_name : QString::number(buff.st_gid).latin1());
+
+ addAtom(entry, KIO::UDS_ACCESS_TIME, buff.st_atime);
+ addAtom(entry, KIO::UDS_MIME_TYPE, 0, KMimeType::findByPath(path, 0, true)->name());
+ addAtom(entry, KIO::UDS_GUESSED_MIME_TYPE, 0, "application/octet-stream");
+
+ QString url(KFI_KIO_FONTS_PROTOCOL+QString::fromLatin1(":/"));
+
+ if(!Misc::root())
+ {
+ url+=sys ? i18n(KFI_KIO_FONTS_SYS) : i18n(KFI_KIO_FONTS_USER);
+ url+=QString::fromLatin1("/");
+ }
+ if(multiple)
+ url+=name+QString::fromLatin1(constMultipleExtension);
+ else
+ url+=Misc::getFile(path);
+ addAtom(entry, KIO::UDS_URL, 0, url);
+ return true; // This file was OK, so use its values...
+ }
+ }
+ return false;
+}
+
+enum EUrlStatus
+{
+ BAD_URL,
+ URL_OK,
+ REDIRECT_URL
+};
+
+static KURL getRedirect(const KURL &u)
+{
+ // Go from fonts:/System to fonts:/
+
+ KURL redirect(u);
+ QString path(u.path()),
+ sect(CKioFonts::getSect(path));
+
+ path.remove(sect);
+ path.replace("//", "/");
+ redirect.setPath(path);
+
+ KFI_DBUG << "Redirect from " << u.path() << " to " << redirect.path() << endl;
+ return redirect;
+}
+
+static bool nonRootSys(const KURL &u)
+{
+ return !Misc::root() && isSysFolder(CKioFonts::getSect(u.path()));
+}
+
+static QString getFontFolder(const QString &defaultDir, const QString &root, QStringList &dirs)
+{
+ if(dirs.contains(defaultDir))
+ return defaultDir;
+ else
+ {
+ QStringList::Iterator it,
+ end=dirs.end();
+ bool found=false;
+
+ for(it=dirs.begin(); it!=end && !found; ++it)
+ if(0==(*it).find(root))
+ return *it;
+ }
+
+ return QString::null;
+}
+
+static bool writeAll(int fd, const char *buf, size_t len)
+{
+ while(len>0)
+ {
+ ssize_t written=write(fd, buf, len);
+ if (written<0 && EINTR!=errno)
+ return false;
+ buf+=written;
+ len-=written;
+ }
+ return true;
+}
+
+static bool checkExt(const char *fname, const char *ext)
+{
+ unsigned int len=strlen(fname);
+
+ return len>4 ? (fname[len-4]=='.' && tolower(fname[len-3])==ext[0] && tolower(fname[len-2])==ext[1] &&
+ tolower(fname[len-1])==ext[2])
+ : false;
+}
+
+static bool isAAfm(const QString &fname)
+{
+ if(checkExt(QFile::encodeName(fname), "afm")) // CPD? Is this a necessary check?
+ {
+ QFile file(fname);
+
+ if(file.open(IO_ReadOnly))
+ {
+ QTextStream stream(&file);
+ QString line;
+
+ for(int lc=0; lc<30 && !stream.atEnd(); ++lc)
+ {
+ line=stream.readLine();
+
+ if(line.contains("StartFontMetrics"))
+ {
+ file.close();
+ return true;
+ }
+ }
+
+ file.close();
+ }
+ }
+
+ return false;
+}
+
+static bool isAPfm(const QString &fname)
+{
+ bool ok=false;
+
+ // I know extension checking is bad, but Ghostscript's pf2afm requires the pfm file to
+ // have the .pfm extension...
+ if(checkExt(QFile::encodeName(fname), "pfm"))
+ {
+ //
+ // OK, the extension matches, so perform a little contents checking...
+ FILE *f=fopen(QFile::encodeName(fname).data(), "r");
+
+ if(f)
+ {
+ static const unsigned long constCopyrightLen = 60;
+ static const unsigned long constTypeToExt = 49;
+ static const unsigned long constExtToFname = 20;
+ static const unsigned long constExtLen = 30;
+ static const unsigned long constFontnameMin = 75;
+ static const unsigned long constFontnameMax = 512;
+
+ unsigned short version=0,
+ type=0,
+ extlen=0;
+ unsigned long length=0,
+ fontname=0,
+ fLength=0;
+
+ fseek(f, 0, SEEK_END);
+ fLength=ftell(f);
+ fseek(f, 0, SEEK_SET);
+
+ if(2==fread(&version, 1, 2, f) && // Read version
+ 4==fread(&length, 1, 4, f) && // length...
+ length==fLength &&
+ 0==fseek(f, constCopyrightLen, SEEK_CUR) && // Skip copyright notice...
+ 2==fread(&type, 1, 2, f) &&
+ 0==fseek(f, constTypeToExt, SEEK_CUR) &&
+ 2==fread(&extlen, 1, 2, f) &&
+ extlen==constExtLen &&
+ 0==fseek(f, constExtToFname, SEEK_CUR) &&
+ 4==fread(&fontname, 1, 4, f) &&
+ fontname>constFontnameMin && fontname<constFontnameMax)
+ ok=true;
+ fclose(f);
+ }
+ }
+
+ return ok;
+}
+
+//
+// This function is *only* used for the generation of AFMs from PFMs.
+static bool isAType1(const QString &fname)
+{
+ static const char * constStr="%!PS-AdobeFont-";
+ static const unsigned int constStrLen=15;
+ static const unsigned int constPfbOffset=6;
+ static const unsigned int constPfbLen=constStrLen+constPfbOffset;
+
+ QCString name(QFile::encodeName(fname));
+ char buffer[constPfbLen];
+ bool match=false;
+
+ if(checkExt(name, "pfa"))
+ {
+ FILE *f=fopen(name.data(), "r");
+
+ if(f)
+ {
+ if(constStrLen==fread(buffer, 1, constStrLen, f))
+ match=0==memcmp(buffer, constStr, constStrLen);
+ fclose(f);
+ }
+ }
+ else if(checkExt(name, "pfb"))
+ {
+ static const char constPfbMarker=0x80;
+
+ FILE *f=fopen(name.data(), "r");
+
+ if(f)
+ {
+ if(constPfbLen==fread(buffer, 1, constPfbLen, f))
+ match=buffer[0]==constPfbMarker && 0==memcmp(&buffer[constPfbOffset], constStr, constStrLen);
+ fclose(f);
+ }
+ }
+
+ return match;
+}
+
+static QString getMatch(const QString &file, const char *extension)
+{
+ QString f(Misc::changeExt(file, extension));
+
+ return Misc::fExists(f) ? f : QString::null;
+}
+
+inline bool isHidden(const KURL &u)
+{
+ return QChar('.')==u.fileName()[0];
+}
+
+struct FontList
+{
+ struct Path
+ {
+ Path(const QString &p=QString::null) : orig(p) { }
+
+ QString orig,
+ modified;
+
+ bool operator==(const Path &p) const { return p.orig==orig; }
+ };
+
+ FontList(const QString &n=QString::null, const QString &p=QString::null) : name(n) { if(!p.isEmpty()) paths.append(Path(p)); }
+
+ QString name;
+ QValueList<Path> paths;
+
+ bool operator==(const FontList &f) const { return f.name==name; }
+};
+
+//
+// This function returns a set of maping of from -> to for copy/move operations
+static bool getFontList(const QStringList &files, QMap<QString, QString> &map)
+{
+ //
+ // First of all create a list of font files, and their paths
+ QStringList::ConstIterator it=files.begin(),
+ end=files.end();
+ QValueList<FontList> list;
+
+ for(;it!=end; ++it)
+ {
+ QString name(Misc::getFile(*it)),
+ path(Misc::getDir(*it));
+ QValueList<FontList>::Iterator entry=list.find(FontList(name));
+
+ if(entry!=list.end())
+ {
+ if(!(*entry).paths.contains(path))
+ (*entry).paths.append(path);
+ }
+ else
+ list.append(FontList(name, path));
+ }
+
+ QValueList<FontList>::Iterator fIt(list.begin()),
+ fEnd(list.end());
+
+ for(; fIt!=fEnd; ++fIt)
+ {
+ QValueList<FontList::Path>::Iterator pBegin((*fIt).paths.begin()),
+ pIt(++pBegin),
+ pEnd((*fIt).paths.end());
+ --pBegin;
+
+ if((*fIt).paths.count()>1)
+ {
+ // There's more than 1 file with the same name, but in a different locations
+ // therefore, take the unique part of the path, and replace / with _
+ // e.g.
+ // /usr/X11R6/lib/X11/fonts/75dpi/times.pcf.gz
+ // /usr/X11R6/lib/X11/fonts/100dpi/times.pcf.gz
+ //
+ // Will produce:
+ // 75dpi_times.pcf.gz
+ // 100dpi_times.pcf.gz
+ unsigned int beginLen((*pBegin).orig.length());
+
+ for(; pIt!=pEnd; ++pIt)
+ {
+ unsigned int len=QMIN((*pIt).orig.length(), beginLen);
+
+ for(unsigned int i=0; i<len; ++i)
+ if((*pIt).orig[i]!=(*pBegin).orig[i])
+ {
+ (*pIt).modified=(*pIt).orig.mid(i);
+ (*pIt).modified=(*pIt).modified.replace('/', '_');
+ if((*pBegin).modified.isEmpty())
+ {
+ (*pBegin).modified=(*pBegin).orig.mid(i);
+ (*pBegin).modified=(*pBegin).modified.replace('/', '_');
+ }
+ break;
+ }
+ }
+ }
+ for(pIt=(*fIt).paths.begin(); pIt!=pEnd; ++pIt)
+ map[(*pIt).orig+(*fIt).name]=(*pIt).modified+(*fIt).name;
+ }
+
+ return list.count() ? true : false;
+}
+
+CKioFonts::CKioFonts(const QCString &pool, const QCString &app)
+ : KIO::SlaveBase(KFI_KIO_FONTS_PROTOCOL, pool, app),
+ itsRoot(Misc::root()),
+ itsUsingFcFpe(false),
+ itsUsingXfsFpe(false),
+ itsHasSys(false),
+ itsAddToSysFc(false),
+ itsFontChanges(0),
+ itsLastDest(DEST_UNCHANGED),
+ itsLastDestTime(0),
+ itsLastFcCheckTime(0),
+ itsFontList(NULL)
+{
+ KFI_DBUG << "Constructor" << endl;
+
+ // Set core dump size to 0 because we will have
+ // root's password in memory.
+ struct rlimit rlim;
+ rlim.rlim_cur=rlim.rlim_max=0;
+ itsCanStorePasswd=setrlimit(RLIMIT_CORE, &rlim) ? false : true;
+
+ //
+ // Check with fontconfig for folder locations...
+ //
+ // 1. Get list of fontconfig dirs
+ // 2. For user, look for any starting with $HOME - but prefer $HOME/.fonts
+ // 3. For system, look for any starting with /usr/local/share - but prefer /usr/local/share/fonts
+ // 4. If either are not found, then add to local.conf / .fonts.conf
+
+ FcStrList *list=FcConfigGetFontDirs(FcInitLoadConfigAndFonts());
+ QStringList dirs;
+ FcChar8 *dir;
+
+ while((dir=FcStrListNext(list)))
+ dirs.append(Misc::dirSyntax((const char *)dir));
+
+ EFolder mainFolder=FOLDER_SYS;
+
+ if(!itsRoot)
+ {
+ QString home(Misc::dirSyntax(QDir::homeDirPath())),
+ defaultDir(Misc::dirSyntax(QDir::homeDirPath()+"/.fonts/")),
+ dir(getFontFolder(defaultDir, home, dirs));
+
+ if(dir.isEmpty()) // Then no $HOME/ was found in fontconfigs dirs!
+ {
+ KXftConfig xft(KXftConfig::Dirs, false);
+ xft.addDir(defaultDir);
+ xft.apply();
+ dir=defaultDir;
+ }
+ mainFolder=FOLDER_USER;
+ itsFolders[FOLDER_USER].location=dir;
+ }
+
+ QString sysDefault("/usr/local/share/fonts/"),
+ sysDir(getFontFolder(sysDefault, "/usr/local/share/", dirs));
+
+ if(sysDir.isEmpty())
+ {
+ if(itsRoot)
+ {
+ KXftConfig xft(KXftConfig::Dirs, true);
+ xft.addDir(sysDefault);
+ xft.apply();
+ }
+ else
+ itsAddToSysFc=true;
+
+ sysDir=sysDefault;
+ }
+
+ itsFolders[FOLDER_SYS].location=sysDir;
+
+ //
+ // Ensure exists
+ if(!Misc::dExists(itsFolders[mainFolder].location))
+ Misc::createDir(itsFolders[mainFolder].location);
+
+ //
+ // Work out best params to send to kfontinst
+
+ // ...determine if X already knows about the system font path...
+ Display *xDisplay=XOpenDisplay(NULL);
+
+ if(xDisplay)
+ {
+ int numPaths=0;
+ char **paths=XGetFontPath(xDisplay, &numPaths);
+
+ if(numPaths>0)
+ for(int path=0; path<numPaths && !itsUsingFcFpe; ++path)
+ if(paths[path][0]=='/')
+ {
+ if(Misc::dirSyntax(paths[path])==itsFolders[FOLDER_SYS].location)
+ itsHasSys=true;
+ }
+ else
+ {
+ QString str(paths[path]);
+
+ str.replace(QRegExp("\\s*"), "");
+
+ if(0==str.find("unix/:"))
+ itsUsingXfsFpe=true;
+ else if("fontconfig"==str)
+ itsUsingFcFpe=true;
+ }
+ XFreeFontPath(paths);
+ XCloseDisplay(xDisplay);
+ }
+}
+
+CKioFonts::~CKioFonts()
+{
+ KFI_DBUG << "Destructor" << endl;
+ doModified();
+}
+
+void CKioFonts::listDir(const KURL &url)
+{
+ KFI_DBUG << "listDir " << url.path() << endl;
+
+ if(updateFontList() && checkUrl(url, true))
+ {
+ KIO::UDSEntry entry;
+ int size=0;
+
+ if(itsRoot || QStringList::split('/', url.path(), false).count()!=0)
+ {
+ EFolder folder=getFolder(url);
+
+ totalSize(itsFolders[folder].fontMap.count());
+ if(itsFolders[folder].fontMap.count())
+ {
+ QMap<QString, QValueList<FcPattern *> >::Iterator it=itsFolders[folder].fontMap.begin(),
+ end=itsFolders[folder].fontMap.end();
+
+ for ( ; it != end; ++it)
+ {
+ entry.clear();
+ if(createFontUDSEntry(entry, it.key(), it.data(), FOLDER_SYS==folder))
+ listEntry(entry, false);
+ }
+ }
+ }
+ else
+ {
+ size=2;
+ totalSize(size);
+ createFolderUDSEntry(entry, i18n(KFI_KIO_FONTS_USER), itsFolders[FOLDER_USER].location, false);
+ listEntry(entry, false);
+ createFolderUDSEntry(entry, i18n(KFI_KIO_FONTS_SYS), itsFolders[FOLDER_SYS].location, true);
+ listEntry(entry, false);
+ }
+
+ listEntry(size ? entry : KIO::UDSEntry(), true);
+ finished();
+ }
+
+ KFI_DBUG << "listDir - finished!" << endl;
+}
+
+void CKioFonts::stat(const KURL &url)
+{
+ KFI_DBUG << "stat " << url.prettyURL() << endl;
+
+ if(updateFontList() && checkUrl(url, true))
+ {
+ QString path(url.path(-1));
+
+ if(path.isEmpty())
+ {
+ error(KIO::ERR_COULD_NOT_STAT, url.prettyURL());
+ return;
+ }
+
+ QStringList pathList(QStringList::split('/', path, false));
+ KIO::UDSEntry entry;
+ bool err=false;
+
+ switch(pathList.count())
+ {
+ case 0:
+ err=!createFolderUDSEntry(entry, i18n("Fonts"), itsFolders[itsRoot ? FOLDER_SYS : FOLDER_USER].location, false);
+ break;
+ case 1:
+ if(itsRoot)
+ err=!createStatEntry(entry, url, FOLDER_SYS);
+ else
+ if(isUserFolder(pathList[0]))
+ err=!createFolderUDSEntry(entry, i18n(KFI_KIO_FONTS_USER), itsFolders[FOLDER_USER].location, false);
+ else if(isSysFolder(pathList[0]))
+ err=!createFolderUDSEntry(entry, i18n(KFI_KIO_FONTS_SYS), itsFolders[FOLDER_USER].location, true);
+ else
+ {
+ error(KIO::ERR_SLAVE_DEFINED,
+ i18n("Please specify \"%1\" or \"%2\".").arg(i18n(KFI_KIO_FONTS_USER)).arg(i18n(KFI_KIO_FONTS_SYS)));
+ return;
+ }
+ break;
+ default:
+ err=!createStatEntry(entry, url, getFolder(url));
+ }
+
+ if(err)
+ {
+ error(KIO::ERR_DOES_NOT_EXIST, url.prettyURL());
+ return;
+ }
+
+ statEntry(entry);
+ finished();
+ }
+}
+
+bool CKioFonts::createStatEntry(KIO::UDSEntry &entry, const KURL &url, EFolder folder)
+{
+ KFI_DBUG << "createStatEntry " << url.path() << endl;
+
+ QMap<QString, QValueList<FcPattern *> >::Iterator it=getMap(url);
+
+ if(it!=itsFolders[folder].fontMap.end())
+ return createFontUDSEntry(entry, it.key(), it.data(), FOLDER_SYS==folder);
+ return false;
+}
+
+void CKioFonts::get(const KURL &url)
+{
+ KFI_DBUG << "get " << url.path() << " query:" << url.query() << endl;
+
+ bool thumb="1"==metaData("thumbnail");
+ QStringList srcFiles;
+
+ if(updateFontList() && checkUrl(url) && getSourceFiles(url, srcFiles)) // Any error will be logged in getSourceFiles
+ {
+ //
+ // The thumbnail job always donwloads non-local files to /tmp/... and passes this file name to the thumbnail
+ // creator. However, in the case of fonts which are split among many files, this wont work. Therefore, when the
+ // thumbnail code asks for the font to donwload, just return the URL used. This way the font-thumbnail creator can
+ // read this and just ask Xft/fontconfig for the font data.
+ if(thumb)
+ {
+ QByteArray array;
+ QTextOStream stream(array);
+
+ emit mimeType("text/plain");
+
+ KFI_DBUG << "hasMetaData(\"thumbnail\"), so return: " << url.prettyURL() << endl;
+
+ stream << url.prettyURL();
+ totalSize(array.size());
+ data(array);
+ processedSize(array.size());
+ data(QByteArray());
+ processedSize(array.size());
+ finished();
+ return;
+ }
+
+ QString realPath,
+ useMime;
+ KDE_struct_stat buff;
+ bool multiple=false;
+
+ if(1==srcFiles.count())
+ realPath=srcFiles.first();
+ else // Font is made up of multiple files - so create .tar.gz of them all!
+ {
+ KTempFile tmpFile;
+ KTar tar(tmpFile.name(), "application/x-gzip");
+
+ tmpFile.setAutoDelete(false);
+ realPath=tmpFile.name();
+
+ if(tar.open(IO_WriteOnly))
+ {
+ QMap<QString, QString> map;
+
+ getFontList(srcFiles, map);
+
+ QMap<QString, QString>::Iterator fIt(map.begin()),
+ fEnd(map.end());
+
+ //
+ // Iterate through created list, and add to tar archive
+ for(; fIt!=fEnd; ++fIt)
+ tar.addLocalFile(fIt.key(), fIt.data());
+
+ multiple=true;
+ tar.close();
+ }
+ }
+
+ QCString realPathC(QFile::encodeName(realPath));
+ KFI_DBUG << "real: " << realPathC << endl;
+
+ if (-2==KDE_stat(realPathC.data(), &buff))
+ error(EACCES==errno ? KIO::ERR_ACCESS_DENIED : KIO::ERR_DOES_NOT_EXIST, url.prettyURL());
+ else if (S_ISDIR(buff.st_mode))
+ error(KIO::ERR_IS_DIRECTORY, url.prettyURL());
+ else if (!S_ISREG(buff.st_mode))
+ error(KIO::ERR_CANNOT_OPEN_FOR_READING, url.prettyURL());
+ else
+ {
+ int fd = KDE_open(realPathC.data(), O_RDONLY);
+
+ if (fd < 0)
+ error(KIO::ERR_CANNOT_OPEN_FOR_READING, url.prettyURL());
+ else
+ {
+ // Determine the mimetype of the file to be retrieved, and emit it.
+ // This is mandatory in all slaves (for KRun/BrowserRun to work).
+ emit mimeType(useMime.isEmpty() ? KMimeType::findByPath(realPathC, buff.st_mode, true)->name() : useMime);
+
+ totalSize(buff.st_size);
+
+ KIO::filesize_t processed=0;
+ char buffer[MAX_IPC_SIZE];
+ QByteArray array;
+
+ while(1)
+ {
+ int n=::read(fd, buffer, MAX_IPC_SIZE);
+ if (-1==n)
+ {
+ if (errno == EINTR)
+ continue;
+ error(KIO::ERR_COULD_NOT_READ, url.prettyURL());
+ close(fd);
+ if(multiple)
+ ::unlink(realPathC);
+ return;
+ }
+ if (0==n)
+ break; // Finished
+
+ array.setRawData(buffer, n);
+ data(array);
+ array.resetRawData(buffer, n);
+
+ processed+=n;
+ processedSize(processed);
+ }
+
+ data(QByteArray());
+ close(fd);
+
+ processedSize(buff.st_size);
+ finished();
+ }
+ }
+ if(multiple)
+ ::unlink(realPathC);
+ }
+}
+
+void CKioFonts::put(const KURL &u, int mode, bool overwrite, bool resume)
+{
+ KFI_DBUG << "put " << u.path() << endl;
+
+ if(isHidden(u))
+ {
+ error(KIO::ERR_WRITE_ACCESS_DENIED, u.prettyURL());
+ return;
+ }
+
+ // updateFontList(); // CPD: dont update font list upon a put - is too slow. Just stat on filename!
+
+ //checkUrl(u) // CPD: Don't need to check URL, as the call to "confirmUrl()" below will sort out any probs!
+
+ KURL url(u);
+ bool changed=confirmUrl(url),
+ nrs=nonRootSys(url);
+ EFolder destFolder(getFolder(url));
+ QString dest=itsFolders[destFolder].location+modifyName(url.fileName()),
+ passwd;
+ QCString destC=QFile::encodeName(dest);
+ KDE_struct_stat buffDest;
+ bool destExists=(KDE_lstat(destC.data(), &buffDest)!= -1);
+
+ if (destExists && !overwrite && !resume)
+ {
+ error(KIO::ERR_FILE_ALREADY_EXIST, url.prettyURL());
+ return;
+ }
+
+ if(nrs) // Need to check can get root passwd before start download...
+ {
+ passwd=getRootPasswd();
+
+ if(passwd.isEmpty())
+ {
+ error(KIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS)));
+ return;
+ }
+ }
+
+ //
+ // As we don't get passed a mime-type the following needs to happen:
+ //
+ // 1. Download to a temporary file
+ // 2. Check with FreeType that the file is a font, or that it is
+ // an AFM or PFM file
+ // 3. If its OK, then get the fonts "name" from
+ KTempFile tmpFile;
+ QCString tmpFileC(QFile::encodeName(tmpFile.name()));
+
+ tmpFile.setAutoDelete(true);
+
+ if(putReal(tmpFile.name(), tmpFileC, destExists, mode, resume))
+ {
+ if(!checkFile(tmpFile.name())) // error logged in checkFile
+ return;
+
+ if(nrs) // Ask root to copy the font...
+ {
+ QCString cmd;
+
+ if(!Misc::dExists(itsFolders[destFolder].location))
+ {
+ cmd+="mkdir ";
+ cmd+=QFile::encodeName(KProcess::quote(itsFolders[destFolder].location));
+ cmd+=" && chmod 0755 ";
+ cmd+=QFile::encodeName(KProcess::quote(itsFolders[destFolder].location));
+ cmd+=" && ";
+ }
+ cmd+="cp -f ";
+ cmd+=QFile::encodeName(KProcess::quote(tmpFileC));
+ cmd+=" ";
+ cmd+=QFile::encodeName(KProcess::quote(destC));
+ cmd+=" && chmod 0644 ";
+ cmd+=destC;
+
+ if(!itsCanStorePasswd)
+ createRootRefreshCmd(cmd);
+
+ // Get root to move this to fonts folder...
+ if(doRootCmd(cmd, passwd))
+ {
+ modified(FOLDER_SYS);
+ createAfm(dest, true, passwd);
+ }
+ else
+ {
+ error(KIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS)));
+ return;
+ }
+ }
+ else // Move it to our font folder...
+ {
+ tmpFile.setAutoDelete(false);
+ if(Misc::doCmd("mv", "-f", tmpFileC, destC))
+ {
+ ::chmod(destC.data(), Misc::FILE_PERMS);
+ modified(FOLDER_USER);
+ createAfm(dest);
+ }
+ else
+ {
+ error(KIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_USER)));
+ return;
+ }
+ }
+
+ finished();
+
+ if(changed)
+ itsLastDestTime=time(NULL);
+ }
+}
+
+bool CKioFonts::putReal(const QString &destOrig, const QCString &destOrigC, bool origExists,
+ int mode, bool resume)
+{
+ bool markPartial=config()->readBoolEntry("MarkPartial", true);
+ QString dest;
+
+ if (markPartial)
+ {
+ QString destPart(destOrig+QString::fromLatin1(".part"));
+ QCString destPartC(QFile::encodeName(destPart));
+
+ dest = destPart;
+
+ KDE_struct_stat buffPart;
+ bool partExists=(-1!=KDE_stat(destPartC.data(), &buffPart));
+
+ if (partExists && !resume && buffPart.st_size>0)
+ {
+ // Maybe we can use this partial file for resuming
+ // Tell about the size we have, and the app will tell us
+ // if it's ok to resume or not.
+ resume=canResume(buffPart.st_size);
+
+ if (!resume)
+ if (!::remove(destPartC.data()))
+ partExists = false;
+ else
+ {
+ error(KIO::ERR_CANNOT_DELETE_PARTIAL, destPart);
+ return false;
+ }
+ }
+ }
+ else
+ {
+ dest = destOrig;
+ if (origExists && !resume)
+ ::remove(destOrigC.data());
+ // Catch errors when we try to open the file.
+ }
+
+ QCString destC(QFile::encodeName(dest));
+
+ int fd;
+
+ if (resume)
+ {
+ fd = KDE_open(destC.data(), O_RDWR); // append if resuming
+ KDE_lseek(fd, 0, SEEK_END); // Seek to end
+ }
+ else
+ {
+ // WABA: Make sure that we keep writing permissions ourselves,
+ // otherwise we can be in for a surprise on NFS.
+ fd = KDE_open(destC.data(), O_CREAT | O_TRUNC | O_WRONLY, -1==mode ? 0666 : mode | S_IWUSR | S_IRUSR);
+ }
+
+ if (fd < 0)
+ {
+ error(EACCES==errno ? KIO::ERR_WRITE_ACCESS_DENIED : KIO::ERR_CANNOT_OPEN_FOR_WRITING, dest);
+ return false;
+ }
+
+ int result;
+ // Loop until we got 0 (end of data)
+ do
+ {
+ QByteArray buffer;
+
+ dataReq(); // Request for data
+ result = readData(buffer);
+ if(result > 0 && !writeAll(fd, buffer.data(), buffer.size()))
+ {
+ if(ENOSPC==errno) // disk full
+ {
+ error(KIO::ERR_DISK_FULL, destOrig);
+ result = -2; // means: remove dest file
+ }
+ else
+ {
+ error(KIO::ERR_COULD_NOT_WRITE, destOrig);
+ result = -1;
+ }
+ }
+ }
+ while(result>0);
+
+ if (result<0)
+ {
+ close(fd);
+ if (-1==result)
+ ::remove(destC.data());
+ else if (markPartial)
+ {
+ KDE_struct_stat buff;
+
+ if ((-1==KDE_stat(destC.data(), &buff)) ||
+ (buff.st_size<config()->readNumEntry("MinimumKeepSize", DEFAULT_MINIMUM_KEEP_SIZE)))
+ ::remove(destC.data());
+ }
+ ::exit(255);
+ }
+
+ if (-1==fd) // we got nothing to write out, so we never opened the file
+ {
+ finished();
+ return false;
+ }
+
+ if (close(fd))
+ {
+ error(KIO::ERR_COULD_NOT_WRITE, destOrig);
+ return false;
+ }
+
+ // after full download rename the file back to original name
+ if (markPartial && ::rename(destC.data(), destOrigC.data()))
+ {
+ error(KIO::ERR_CANNOT_RENAME_PARTIAL, destOrig);
+ return false;
+ }
+
+ return true;
+}
+
+void CKioFonts::copy(const KURL &src, const KURL &d, int mode, bool overwrite)
+{
+ //
+ // Support:
+ // Copying to fonts:/
+ // Copying from fonts:/ and file:/
+ //
+ KFI_DBUG << "copy " << src.prettyURL() << " - " << d.prettyURL() << endl;
+
+ if(isHidden(d))
+ {
+ error(KIO::ERR_WRITE_ACCESS_DENIED, d.prettyURL());
+ return;
+ }
+
+ bool fromFonts=KFI_KIO_FONTS_PROTOCOL==src.protocol();
+
+ if((!fromFonts || updateFontList()) // CPD: dont update font list upon a copy from file - is too slow. Just stat on filename!
+ && checkUrl(src) && checkAllowed(src))
+ {
+ //checkUrl(u) // CPD as per comment in ::put()
+
+ QStringList srcFiles;
+
+ if(getSourceFiles(src, srcFiles)) // Any error will be logged in getSourceFiles
+ {
+ KURL dest(d);
+ bool changed=confirmUrl(dest);
+ EFolder destFolder(getFolder(dest));
+ QMap<QString, QString> map;
+
+ if(!fromFonts)
+ map[src.path()]=src.fileName();
+
+ // As above, if copying from file, then only stat on dest filename, but if from fonts to fonts need to
+ // get the list of possible source files, etc.
+ if(fromFonts ? confirmMultiple(src, srcFiles, FOLDER_SYS==destFolder ? FOLDER_USER : FOLDER_SYS, OP_COPY) &&
+ getFontList(srcFiles, map) &&
+ checkDestFiles(src, map, dest, destFolder, overwrite)
+ : checkDestFile(src, dest, destFolder, overwrite) )
+ {
+ if(nonRootSys(dest))
+ {
+ QCString cmd;
+ int size=0;
+
+ if(!Misc::dExists(itsFolders[destFolder].location))
+ {
+ cmd+="mkdir ";
+ cmd+=QFile::encodeName(KProcess::quote(itsFolders[destFolder].location));
+ cmd+=" && chmod 0755 ";
+ cmd+=QFile::encodeName(KProcess::quote(itsFolders[destFolder].location));
+ cmd+=" && ";
+ }
+
+ QMap<QString, QString>::Iterator fIt(map.begin()),
+ fEnd(map.end());
+
+ for(; fIt!=fEnd; ++fIt)
+ {
+ cmd+="cp -f ";
+ cmd+=QFile::encodeName(KProcess::quote(fIt.key()));
+ cmd+=" ";
+ cmd+=QFile::encodeName(KProcess::quote(itsFolders[destFolder].location+modifyName(fIt.data())));
+ int s=getSize(QFile::encodeName(fIt.key()));
+ if(s>0)
+ size+=s;
+ if(++fIt!=fEnd)
+ cmd+=" && ";
+ --fIt;
+ }
+
+ if(!itsCanStorePasswd)
+ createRootRefreshCmd(cmd);
+
+ totalSize(size);
+
+ QString passwd=getRootPasswd();
+
+ if(doRootCmd(cmd, passwd))
+ {
+ modified(destFolder);
+ processedSize(size);
+ if(src.isLocalFile() && 1==srcFiles.count())
+ createAfm(itsFolders[destFolder].location+modifyName(map.begin().data()), true, passwd);
+ }
+ else
+ {
+ error(KIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS)));
+ return;
+ }
+ }
+ else
+ {
+ QMap<QString, QString>::Iterator fIt(map.begin()),
+ fEnd(map.end());
+
+ for(; fIt!=fEnd; ++fIt)
+ {
+ QCString realSrc(QFile::encodeName(fIt.key())),
+ realDest(QFile::encodeName(itsFolders[destFolder].location+modifyName(fIt.data())));
+ KDE_struct_stat buffSrc;
+
+ if(-1==KDE_stat(realSrc.data(), &buffSrc))
+ {
+ error(EACCES==errno ? KIO::ERR_ACCESS_DENIED : KIO::ERR_DOES_NOT_EXIST, src.prettyURL());
+ return;
+ }
+
+ int srcFd=KDE_open(realSrc.data(), O_RDONLY);
+
+ if (srcFd<0)
+ {
+ error(KIO::ERR_CANNOT_OPEN_FOR_READING, src.prettyURL());
+ return;
+ }
+
+ if(!Misc::dExists(itsFolders[destFolder].location))
+ Misc::createDir(itsFolders[destFolder].location);
+
+ // WABA: Make sure that we keep writing permissions ourselves,
+ // otherwise we can be in for a surprise on NFS.
+ int destFd=KDE_open(realDest.data(), O_CREAT | O_TRUNC | O_WRONLY, -1==mode ? 0666 : mode | S_IWUSR);
+
+ if (destFd<0)
+ {
+ error(EACCES==errno ? KIO::ERR_WRITE_ACCESS_DENIED : KIO::ERR_CANNOT_OPEN_FOR_WRITING, dest.prettyURL());
+ close(srcFd);
+ return;
+ }
+
+ totalSize(buffSrc.st_size);
+
+ KIO::filesize_t processed = 0;
+ char buffer[MAX_IPC_SIZE];
+ QByteArray array;
+
+ while(1)
+ {
+ int n=::read(srcFd, buffer, MAX_IPC_SIZE);
+
+ if(-1==n)
+ {
+ if (errno == EINTR)
+ continue;
+ error(KIO::ERR_COULD_NOT_READ, src.prettyURL());
+ close(srcFd);
+ close(destFd);
+ return;
+ }
+ if(0==n)
+ break; // Finished
+
+ if(!writeAll(destFd, buffer, n))
+ {
+ close(srcFd);
+ close(destFd);
+ if (ENOSPC==errno) // disk full
+ {
+ error(KIO::ERR_DISK_FULL, dest.prettyURL());
+ remove(realDest.data());
+ }
+ else
+ error(KIO::ERR_COULD_NOT_WRITE, dest.prettyURL());
+ return;
+ }
+
+ processed += n;
+ processedSize(processed);
+ }
+
+ close(srcFd);
+
+ if(close(destFd))
+ {
+ error(KIO::ERR_COULD_NOT_WRITE, dest.prettyURL());
+ return;
+ }
+
+ ::chmod(realDest.data(), Misc::FILE_PERMS);
+
+ // copy access and modification time
+ struct utimbuf ut;
+
+ ut.actime = buffSrc.st_atime;
+ ut.modtime = buffSrc.st_mtime;
+ ::utime(realDest.data(), &ut);
+
+ processedSize(buffSrc.st_size);
+ modified(destFolder);
+ }
+
+ if(src.isLocalFile() && 1==srcFiles.count())
+ createAfm(itsFolders[destFolder].location+modifyName(map.begin().data()));
+ }
+
+ finished();
+
+ if(changed)
+ itsLastDestTime=time(NULL);
+ }
+ }
+ }
+}
+
+void CKioFonts::rename(const KURL &src, const KURL &d, bool overwrite)
+{
+ KFI_DBUG << "rename " << src.prettyURL() << " - " << d.prettyURL() << ", " << overwrite << endl;
+
+ if(src.directory()==d.directory())
+ error(KIO::ERR_SLAVE_DEFINED, i18n("Sorry, fonts cannot be renamed."));
+ else if(itsRoot) // Should never happen...
+ error(KIO::ERR_UNSUPPORTED_ACTION, unsupportedActionErrorString(mProtocol, KIO::CMD_RENAME));
+ else
+ {
+ //
+ // Can't rename from/to file:/ -> therefore rename can only be from fonts:/System to fonts:/Personal,
+ // or vice versa.
+
+ QStringList srcFiles;
+
+ if(getSourceFiles(src, srcFiles)) // Any error will be logged in getSourceFiles
+ {
+ KURL dest(d);
+ bool changed=confirmUrl(dest);
+ EFolder destFolder(getFolder(dest));
+ QMap<QString, QString> map;
+
+ if(confirmMultiple(src, srcFiles, FOLDER_SYS==destFolder ? FOLDER_USER : FOLDER_SYS, OP_MOVE) &&
+ getFontList(srcFiles, map) &&
+ checkDestFiles(src, map, dest, destFolder, overwrite))
+ {
+ QMap<QString, QString>::Iterator fIt(map.begin()),
+ fEnd(map.end());
+ bool askPasswd=true,
+ toSys=FOLDER_SYS==destFolder;
+ QCString userId,
+ groupId,
+ destDir(QFile::encodeName(KProcess::quote(itsFolders[destFolder].location)));
+
+ userId.setNum(toSys ? 0 : getuid());
+ groupId.setNum(toSys ? 0 : getgid());
+
+ for(; fIt!=fEnd; ++fIt)
+ {
+ QCString cmd,
+ destFile(QFile::encodeName(KProcess::quote(itsFolders[destFolder].location+fIt.data())));
+
+ if(toSys && !Misc::dExists(itsFolders[destFolder].location))
+ {
+ cmd+="mkdir ";
+ cmd+=destDir;
+ cmd+=" && ";
+ }
+
+ cmd+="mv -f ";
+ cmd+=QFile::encodeName(KProcess::quote(fIt.key()));
+ cmd+=" ";
+ cmd+=destFile;
+ cmd+=" && chmod -f 0644 ";
+ cmd+=destFile;
+ cmd+=" && chown -f ";
+ cmd+=userId;
+ cmd+=":";
+ cmd+=groupId;
+ cmd+=" ";
+ cmd+=destFile;
+
+ QString sysDir,
+ userDir;
+
+ if(FOLDER_SYS==destFolder)
+ {
+ sysDir=itsFolders[destFolder].location;
+ userDir=Misc::getDir(fIt.key());
+ }
+ else
+ {
+ userDir=itsFolders[destFolder].location;
+ sysDir=Misc::getDir(fIt.key());
+ }
+
+ if(!itsCanStorePasswd)
+ createRootRefreshCmd(cmd, sysDir);
+
+ if(doRootCmd(cmd, askPasswd))
+ {
+ modified(FOLDER_SYS, true, sysDir);
+ modified(FOLDER_USER, true, userDir);
+ askPasswd=false; // Don't keep on asking for password...
+ }
+ else
+ {
+ error(KIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS)));
+ return;
+ }
+ }
+ if(changed)
+ itsLastDestTime=time(NULL);
+ }
+ }
+ }
+}
+
+void CKioFonts::del(const KURL &url, bool)
+{
+ KFI_DBUG << "del " << url.path() << endl;
+
+ QValueList<FcPattern *> *entries;
+
+ if(checkUrl(url) && checkAllowed(url) &&
+ updateFontList() && (entries=getEntries(url)) && entries->count() &&
+ confirmMultiple(url, entries, getFolder(url), OP_DELETE))
+ {
+ QValueList<FcPattern *>::Iterator it,
+ end=entries->end();
+ CDirList modifiedDirs;
+ bool clearList=KFI_KIO_NO_CLEAR!=url.query();
+
+ if(nonRootSys(url))
+ {
+ QCString cmd("rm -f");
+
+ for(it=entries->begin(); it!=end; ++it)
+ {
+ QString file(CFcEngine::getFcString(*it, FC_FILE));
+
+ modifiedDirs.add(Misc::getDir(file));
+ cmd+=" ";
+ cmd+=QFile::encodeName(KProcess::quote(file));
+
+ KURL::List urls;
+
+ Misc::getAssociatedUrls(KURL(file), urls);
+
+ if(urls.count())
+ {
+ KURL::List::Iterator uIt,
+ uEnd=urls.end();
+
+ for(uIt=urls.begin(); uIt!=uEnd; ++uIt)
+ {
+ cmd+=" ";
+ cmd+=QFile::encodeName(KProcess::quote((*uIt).path()));
+ }
+ }
+ }
+
+ if(!itsCanStorePasswd)
+ createRootRefreshCmd(cmd, modifiedDirs);
+
+ if(doRootCmd(cmd))
+ modified(FOLDER_SYS, clearList, modifiedDirs);
+ else
+ error(KIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\" folder.").arg(i18n(KFI_KIO_FONTS_SYS)));
+ }
+ else
+ {
+ for(it=entries->begin(); it!=end; ++it)
+ {
+ QString file(CFcEngine::getFcString(*it, FC_FILE));
+
+ if (0!=unlink(QFile::encodeName(file).data()))
+ error(EACCES==errno || EPERM==errno
+ ? KIO::ERR_ACCESS_DENIED
+ : EISDIR==errno
+ ? KIO::ERR_IS_DIRECTORY
+ : KIO::ERR_CANNOT_DELETE,
+ file);
+ else
+ {
+ modifiedDirs.add(Misc::getDir(file));
+
+ KURL::List urls;
+
+ Misc::getAssociatedUrls(KURL(file), urls);
+
+ if(urls.count())
+ {
+ KURL::List::Iterator uIt,
+ uEnd=urls.end();
+
+ for(uIt=urls.begin(); uIt!=uEnd; ++uIt)
+ unlink(QFile::encodeName((*uIt).path()).data());
+ }
+ }
+ }
+ modified(itsRoot ? FOLDER_SYS : FOLDER_USER, clearList, modifiedDirs);
+ }
+ finished();
+ }
+}
+
+void CKioFonts::modified(EFolder folder, bool clearList, const CDirList &dirs)
+{
+ KFI_DBUG << "modified(" << (int)folder << ")\n";
+
+ if(FOLDER_SYS!=folder || itsCanStorePasswd || itsRoot)
+ {
+ if(dirs.count())
+ {
+ CDirList::ConstIterator it(dirs.begin()),
+ end(dirs.end());
+
+ for(; it!=end; ++it)
+ itsFolders[folder].modified.add(*it);
+ }
+ else
+ itsFolders[folder].modified.add(itsFolders[folder].location);
+
+ if(++itsFontChanges>MAX_NEW_FONTS)
+ {
+ setTimeoutSpecialCommand(0); // Cancel timer
+ doModified();
+ }
+ else
+ setTimeoutSpecialCommand(TIMEOUT);
+ }
+
+ if(FOLDER_SYS==folder && !itsRoot && !itsCanStorePasswd)
+ {
+ // If we modified sys, we're not root, and couldn't store the passwd, then kfontinst has already been called
+ // so no need to ask it to add folder to fontconfig and X's config files...
+ itsHasSys=true;
+ itsAddToSysFc=false;
+ }
+ if(clearList)
+ clearFontList(); // List of fonts has changed.../
+}
+
+void CKioFonts::special(const QByteArray &a)
+{
+ KFI_DBUG << "special" << endl;
+
+ if(a.size())
+ {
+ QDataStream stream(a, IO_ReadOnly);
+ int cmd;
+
+ stream >> cmd;
+
+ switch (cmd)
+ {
+ case SPECIAL_RESCAN:
+ clearFontList();
+ updateFontList();
+ finished();
+ break;
+ case SPECIAL_RECONFIG: // Only itended to be called from kcmfontinst - when a user has re-enabled doX or doGs
+ if(itsRoot && !itsFolders[FOLDER_SYS].modified.contains(itsFolders[FOLDER_SYS].location))
+ itsFolders[FOLDER_SYS].modified.add(itsFolders[FOLDER_SYS].location);
+ else if(!itsRoot && !itsFolders[FOLDER_USER].modified.contains(itsFolders[FOLDER_USER].location))
+ itsFolders[FOLDER_USER].modified.add(itsFolders[FOLDER_USER].location);
+
+ doModified();
+ finished();
+ break;
+ default:
+ error( KIO::ERR_UNSUPPORTED_ACTION, QString::number(cmd));
+ }
+ }
+ else
+ doModified();
+}
+
+void CKioFonts::createRootRefreshCmd(QCString &cmd, const CDirList &dirs, bool reparseCfg)
+{
+ if(reparseCfg)
+ reparseConfig();
+
+ if(!cmd.isEmpty())
+ cmd+=" && ";
+
+ cmd+=FC_CACHE_CMD;
+
+ if(dirs.count())
+ {
+ CDirList::ConstIterator it(dirs.begin()),
+ end(dirs.end());
+
+ for(; it!=end; ++it)
+ {
+ QCString tmpCmd;
+
+ if(*it==itsFolders[FOLDER_SYS].location)
+ {
+ if(0!=itsNrsKfiParams[0])
+ tmpCmd+=itsNrsKfiParams;
+ }
+ else
+ if(0!=itsNrsNonMainKfiParams[0])
+ tmpCmd+=itsNrsNonMainKfiParams;
+
+ if(!tmpCmd.isEmpty())
+ {
+ cmd+=" && kfontinst ";
+ cmd+=tmpCmd;
+ cmd+=" ";
+ cmd+=QFile::encodeName(KProcess::quote(*it));
+ }
+ }
+ }
+ else if (0!=itsNrsKfiParams[0])
+ {
+ cmd+=" && kfontinst ";
+ cmd+=itsNrsKfiParams;
+ cmd+=" ";
+ cmd+=QFile::encodeName(KProcess::quote(itsFolders[FOLDER_SYS].location));
+ }
+}
+
+void CKioFonts::doModified()
+{
+ KFI_DBUG << "doModified" << endl;
+
+ if(itsFolders[FOLDER_SYS].modified.count() || itsFolders[FOLDER_USER].modified.count())
+ reparseConfig();
+
+ itsFontChanges=0;
+ if(itsFolders[FOLDER_SYS].modified.count())
+ {
+ if(itsRoot)
+ {
+ Misc::doCmd(FC_CACHE_CMD);
+ KFI_DBUG << "RUN(root): " << FC_CACHE_CMD << endl;
+
+ //
+ // If a non-default folder has been modified, always configure X
+ if(NULL==strchr(itsKfiParams, 'x') &&
+ (itsFolders[FOLDER_SYS].modified.count()>1 || !itsFolders[FOLDER_SYS].modified.contains(itsFolders[FOLDER_SYS].location)))
+ {
+ if(0==itsKfiParams[0])
+ strcpy(itsKfiParams, "-x");
+ else
+ strcat(itsKfiParams, "x");
+ }
+
+ if(0!=itsKfiParams[0])
+ {
+ CDirList::ConstIterator it(itsFolders[FOLDER_SYS].modified.begin()),
+ end(itsFolders[FOLDER_SYS].modified.end());
+
+ for(; it!=end; ++it)
+ {
+ Misc::doCmd("kfontinst", itsKfiParams, QFile::encodeName(*it));
+ KFI_DBUG << "RUN(root): kfontinst " << itsKfiParams << ' ' << *it << endl;
+ }
+
+ if(itsFolders[FOLDER_SYS].modified.contains(itsFolders[FOLDER_SYS].location))
+ {
+ itsHasSys=true;
+ itsAddToSysFc=false;
+ }
+ }
+ }
+ else
+ {
+ QCString cmd;
+
+ createRootRefreshCmd(cmd, itsFolders[FOLDER_SYS].modified, false);
+ if(doRootCmd(cmd, false) && itsFolders[FOLDER_SYS].modified.contains(itsFolders[FOLDER_SYS].location))
+ {
+ itsHasSys=true;
+ itsAddToSysFc=false;
+ }
+ if(NULL==strstr(itsNrsKfiParams, "s"))
+ Misc::doCmd("xset", "fp", "rehash"); // doRootCmd can only refresh if xfs is being used, so try here anyway...
+ }
+ itsFolders[FOLDER_SYS].modified.clear();
+ }
+
+ if(!itsRoot && itsFolders[FOLDER_USER].modified.count())
+ {
+ Misc::doCmd(FC_CACHE_CMD);
+ KFI_DBUG << "RUN(non-root): " << FC_CACHE_CMD << endl;
+
+ if(0!=itsKfiParams[0])
+ {
+ CDirList::ConstIterator it(itsFolders[FOLDER_USER].modified.begin()),
+ end(itsFolders[FOLDER_USER].modified.end());
+
+ for(; it!=end; ++it)
+ {
+ Misc::doCmd("kfontinst", itsKfiParams, QFile::encodeName(*it));
+ KFI_DBUG << "RUN(non-root): kfontinst " << itsKfiParams << ' ' << *it << endl;
+ }
+ }
+ itsFolders[FOLDER_USER].modified.clear();
+ }
+
+ KFI_DBUG << "finished ModifiedDirs" << endl;
+}
+
+#define SYS_USER "root"
+QString CKioFonts::getRootPasswd(bool askPasswd)
+{
+ KFI_DBUG << "getRootPasswd" << endl;
+ KIO::AuthInfo authInfo;
+ SuProcess proc(SYS_USER);
+ bool error=false;
+ int attempts=0;
+ QString errorMsg;
+
+ authInfo.url=KURL(KFI_KIO_FONTS_PROTOCOL ":///");
+ authInfo.username=SYS_USER;
+ authInfo.keepPassword=true;
+
+ if(!checkCachedAuthentication(authInfo) && !askPasswd)
+ authInfo.password=itsPasswd;
+
+ if(askPasswd)
+ while(!error && 0!=proc.checkInstall(authInfo.password.local8Bit()))
+ {
+ KFI_DBUG << "ATTEMPT : " << attempts << endl;
+ if(1==attempts)
+ errorMsg=i18n("Incorrect password.\n");
+ if((!openPassDlg(authInfo, errorMsg) && attempts) || ++attempts>4 || SYS_USER!=authInfo.username)
+ error=true;
+ }
+ else
+ error=proc.checkInstall(authInfo.password.local8Bit()) ? true : false;
+ return error ? QString::null : authInfo.password;
+}
+
+bool CKioFonts::doRootCmd(const char *cmd, const QString &passwd)
+{
+ KFI_DBUG << "doRootCmd " << cmd << endl;
+
+ if(!passwd.isEmpty())
+ {
+ SuProcess proc(SYS_USER);
+
+ if(itsCanStorePasswd)
+ itsPasswd=passwd;
+
+ KFI_DBUG << "Try to run command" << endl;
+ proc.setCommand(cmd);
+ return proc.exec(passwd.local8Bit()) ? false : true;
+ }
+
+ return false;
+}
+
+bool CKioFonts::confirmUrl(KURL &url)
+{
+ KFI_DBUG << "confirmUrl " << url.path() << endl;
+ if(!itsRoot)
+ {
+ QString sect(getSect(url.path()));
+
+ if(!isSysFolder(sect) && !isUserFolder(sect))
+ {
+ bool changeToSystem=false;
+
+ if(DEST_UNCHANGED!=itsLastDest && itsLastDestTime && (abs(time(NULL)-itsLastDestTime) < constMaxLastDestTime))
+ changeToSystem=DEST_SYS==itsLastDest;
+ else
+ changeToSystem=KMessageBox::No==messageBox(QuestionYesNo,
+ i18n("Do you wish to install the font into \"%1\" (in which "
+ "case the font will only be usable by you), or \"%2\" ("
+ "the font will be usable by all users - but you will "
+ "need to know the administrator's password)?")
+ .arg(i18n(KFI_KIO_FONTS_USER)).arg(i18n(KFI_KIO_FONTS_SYS)),
+ i18n("Where to Install"), i18n(KFI_KIO_FONTS_USER),
+ i18n(KFI_KIO_FONTS_SYS));
+
+ if(changeToSystem)
+ {
+ itsLastDest=DEST_SYS;
+ url.setPath(QChar('/')+i18n(KFI_KIO_FONTS_SYS)+QChar('/')+url.fileName());
+ }
+ else
+ {
+ itsLastDest=DEST_USER;
+ url.setPath(QChar('/')+i18n(KFI_KIO_FONTS_USER)+QChar('/')+url.fileName());
+ }
+
+ KFI_DBUG << "Changed URL to:" << url.path() << endl;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void CKioFonts::clearFontList()
+{
+ KFI_DBUG << "clearFontList" << endl;
+
+ if(itsFontList)
+ FcFontSetDestroy(itsFontList);
+
+ itsFontList=NULL;
+ itsFolders[FOLDER_SYS].fontMap.clear();
+ itsFolders[FOLDER_USER].fontMap.clear();
+}
+
+bool CKioFonts::updateFontList()
+{
+ KFI_DBUG << "updateFontList" << endl;
+
+ if(!itsFontList || !FcConfigUptoDate(0) || // For some reason just the "!FcConfigUptoDate(0)" check does not always work :-(
+ (abs(time(NULL)-itsLastFcCheckTime)>constMaxFcCheckTime))
+ {
+ FcInitReinitialize();
+ clearFontList();
+ }
+
+ if(!itsFontList)
+ {
+ KFI_DBUG << "updateFontList - update list of fonts " << endl;
+
+ itsLastFcCheckTime=time(NULL);
+
+ FcPattern *pat = FcPatternCreate();
+ FcObjectSet *os = FcObjectSetBuild(FC_FILE, FC_FAMILY, FC_WEIGHT, FC_SCALABLE,
+#ifdef KFI_FC_HAS_WIDTHS
+ FC_WIDTH,
+#endif
+ FC_SLANT, (void*)0);
+
+ itsFontList=FcFontList(0, pat, os);
+
+ FcPatternDestroy(pat);
+ FcObjectSetDestroy(os);
+
+ if (itsFontList)
+ {
+ QString home(Misc::dirSyntax(QDir::homeDirPath()));
+
+ for (int i = 0; i < itsFontList->nfont; i++)
+ {
+ EFolder folder=FOLDER_SYS;
+ QString file(Misc::fileSyntax(CFcEngine::getFcString(itsFontList->fonts[i], FC_FILE)));
+
+ if(!file.isEmpty())
+ {
+ if(!itsRoot && 0==file.find(home))
+ folder=FOLDER_USER;
+
+ QValueList<FcPattern *> &patterns=
+ itsFolders[folder].fontMap[CFcEngine::createName(itsFontList->fonts[i])];
+ bool use=true;
+
+ if(patterns.count()) // Check for duplicates...
+ {
+ QValueList<FcPattern *>::Iterator it,
+ end=patterns.end();
+
+ for(it=patterns.begin(); use && it!=end; ++it)
+ if(file==(Misc::fileSyntax(CFcEngine::getFcString(*it, FC_FILE))))
+ use=false;
+ }
+ if(use)
+ patterns.append(itsFontList->fonts[i]);
+ }
+ }
+ }
+ }
+
+ if(NULL==itsFontList)
+ {
+ error(KIO::ERR_SLAVE_DEFINED, i18n("Internal fontconfig error."));
+ return false;
+ }
+
+ return true;
+}
+
+CKioFonts::EFolder CKioFonts::getFolder(const KURL &url)
+{
+ return itsRoot || isSysFolder(getSect(url.path())) ? FOLDER_SYS : FOLDER_USER;
+}
+
+QMap<QString, QValueList<FcPattern *> >::Iterator CKioFonts::getMap(const KURL &url)
+{
+ EFolder folder(getFolder(url));
+ QMap<QString, QValueList<FcPattern *> >::Iterator it=itsFolders[folder].fontMap.find(removeMultipleExtension(url));
+
+ if(it==itsFolders[folder].fontMap.end()) // Perhaps it was fonts:/System/times.ttf ???
+ {
+ FcPattern *pat=getEntry(folder, url.fileName(), false);
+
+ if(pat)
+ it=itsFolders[folder].fontMap.find(CFcEngine::createName(pat));
+ }
+
+ return it;
+}
+
+QValueList<FcPattern *> * CKioFonts::getEntries(const KURL &url)
+{
+ QMap<QString, QValueList<FcPattern *> >::Iterator it=getMap(url);
+
+ if(it!=itsFolders[getFolder(url)].fontMap.end())
+ return &(it.data());
+
+ error(KIO::ERR_SLAVE_DEFINED, i18n("Could not access \"%1\".").arg(url.prettyURL()));
+ return NULL;
+}
+
+FcPattern * CKioFonts::getEntry(EFolder folder, const QString &file, bool full)
+{
+ QMap<QString, QValueList<FcPattern *> >::Iterator it,
+ end=itsFolders[folder].fontMap.end();
+
+ for(it=itsFolders[folder].fontMap.begin(); it!=end; ++it)
+ {
+ QValueList<FcPattern *>::Iterator patIt,
+ patEnd=it.data().end();
+
+ for(patIt=it.data().begin(); patIt!=patEnd; ++patIt)
+ if( (full && CFcEngine::getFcString(*patIt, FC_FILE)==file) ||
+ (!full && Misc::getFile(CFcEngine::getFcString(*patIt, FC_FILE))==file))
+ return *patIt;
+ }
+
+ return NULL;
+}
+
+bool CKioFonts::checkFile(const QString &file)
+{
+ QCString cFile(QFile::encodeName(file));
+
+ //
+ // To speed things up, check the files extension 1st...
+ if(checkExt(cFile, "ttf") || checkExt(cFile, "otf") || checkExt(cFile, "ttc") || checkExt(cFile, "pfa") || checkExt(cFile, "pfb") ||
+ isAAfm(file) || isAPfm(file))
+ return true;
+
+ //
+ // No exension match, so try querying with FreeType...
+ int count=0;
+ FcPattern *pat=FcFreeTypeQuery((const FcChar8 *)(QFile::encodeName(file).data()), 0, NULL, &count);
+
+ if(pat)
+ {
+ FcPatternDestroy(pat);
+ return true;
+ }
+
+ error(KIO::ERR_SLAVE_DEFINED, i18n("<p>Only fonts may be installed.</p><p>If installing a fonts package (*%1), then "
+ "extract the components, and install individually.</p>").arg(constMultipleExtension));
+ return false;
+}
+
+bool CKioFonts::getSourceFiles(const KURL &src, QStringList &files)
+{
+ if(KFI_KIO_FONTS_PROTOCOL==src.protocol())
+ {
+ QValueList<FcPattern *> *entries=getEntries(src);
+
+ if(entries && entries->count())
+ {
+ QValueList<FcPattern *>::Iterator it,
+ end=entries->end();
+
+ for(it=entries->begin(); it!=end; ++it)
+ files.append(CFcEngine::getFcString(*it, FC_FILE));
+ }
+
+ if(files.count())
+ {
+ QStringList::Iterator sIt,
+ sEnd=files.end();
+
+ for(sIt=files.begin(); sIt!=sEnd; ++sIt)
+ {
+ KURL::List urls;
+
+ Misc::getAssociatedUrls(KURL(*sIt), urls);
+
+ if(urls.count())
+ {
+ KURL::List::Iterator uIt,
+ uEnd=urls.end();
+
+ for(uIt=urls.begin(); uIt!=uEnd; ++uIt)
+ if(-1==files.findIndex((*uIt).path()))
+ files.append((*uIt).path());
+ }
+ }
+ }
+ }
+ else
+ if(src.isLocalFile())
+ if(checkFile(src.path()))
+ files.append(src.path());
+ else
+ return false; // error logged in checkFile...
+
+ if(files.count())
+ {
+ QStringList::Iterator it,
+ end=files.end();
+
+ for(it=files.begin(); it!=end; ++it)
+ {
+ QCString realSrc=QFile::encodeName(*it);
+ KDE_struct_stat buffSrc;
+
+ if (-1==KDE_stat(realSrc.data(), &buffSrc))
+ {
+ error(EACCES==errno ? KIO::ERR_ACCESS_DENIED : KIO::ERR_DOES_NOT_EXIST, src.prettyURL());
+ return false;
+ }
+ if(S_ISDIR(buffSrc.st_mode))
+ {
+ error(KIO::ERR_IS_DIRECTORY, src.prettyURL());
+ return false;
+ }
+ if(S_ISFIFO(buffSrc.st_mode) || S_ISSOCK(buffSrc.st_mode))
+ {
+ error(KIO::ERR_CANNOT_OPEN_FOR_READING, src.prettyURL());
+ return false;
+ }
+ }
+ }
+ else
+ {
+ error(KIO::ERR_DOES_NOT_EXIST, src.prettyURL());
+ return false;
+ }
+
+ return true;
+}
+
+bool CKioFonts::checkDestFile(const KURL &src, const KURL &dest, EFolder destFolder, bool overwrite)
+{
+ if(!overwrite && (Misc::fExists(itsFolders[destFolder].location+src.fileName()) ||
+ Misc::fExists(itsFolders[destFolder].location+modifyName(src.fileName())) ) )
+ {
+ error(KIO::ERR_FILE_ALREADY_EXIST, dest.prettyURL());
+ return false;
+ }
+
+ return true;
+}
+
+bool CKioFonts::checkDestFiles(const KURL &src, QMap<QString, QString> &map, const KURL &dest, EFolder destFolder, bool overwrite)
+{
+ //
+ // Check whether files exist at destination...
+ //
+ if(dest.protocol()==src.protocol() &&
+ dest.directory()==src.directory()) // Check whether confirmUrl changed a "cp fonts:/System fonts:/"
+ // to "cp fonts:/System fonts:/System"
+ {
+ error(KIO::ERR_FILE_ALREADY_EXIST, dest.prettyURL());
+ return false;
+ }
+
+ if(!overwrite)
+ {
+ QMap<QString, QString>::Iterator fIt(map.begin()),
+ fEnd(map.end());
+
+ for(; fIt!=fEnd; ++fIt)
+ if(NULL!=getEntry(destFolder, fIt.data()) || NULL!=getEntry(destFolder, modifyName(fIt.data())))
+ {
+ error(KIO::ERR_FILE_ALREADY_EXIST, dest.prettyURL());
+ return false;
+ }
+ }
+
+ return true;
+}
+
+//
+// Gather the number and names of the font faces located in "files". If there is more than 1 face
+// (such as there would be for a TTC font), then ask the user for confirmation of the action.
+bool CKioFonts::confirmMultiple(const KURL &url, const QStringList &files, EFolder folder, EOp op)
+{
+ if(KFI_KIO_FONTS_PROTOCOL!=url.protocol())
+ return true;
+
+ QStringList::ConstIterator it,
+ end=files.end();
+ QStringList fonts;
+
+ for(it=files.begin(); it!=files.end(); ++it)
+ {
+ FcPattern *pat=getEntry(folder, *it, false);
+
+ if(pat)
+ {
+ QString name(CFcEngine::createName(pat));
+
+ if(-1==fonts.findIndex(name))
+ fonts.append(name);
+ }
+ }
+
+ if(fonts.count()>1)
+ {
+ QString out;
+ QStringList::Iterator it,
+ end=fonts.end();
+
+ for(it=fonts.begin(); it!=end; ++it)
+ out+=QString("<li>")+*it+QString("</li>");
+
+ if(KMessageBox::No==messageBox(QuestionYesNo,
+ OP_MOVE==op
+ ? i18n("<p>This font is located in a file alongside other fonts; in order "
+ "to proceed with the moving they will all have to be moved. "
+ "The other affected fonts are:</p><ul>%1</ul><p>\n Do you wish to "
+ "move all of these?</p>").arg(out)
+ : OP_COPY==op
+ ? i18n("<p>This font is located in a file alongside other fonts; in order "
+ "to proceed with the copying they will all have to be copied. "
+ "The other affected fonts are:</p><ul>%1</ul><p>\n Do you wish to "
+ "copy all of these?</p>").arg(out)
+ : i18n("<p>This font is located in a file alongside other fonts; in order "
+ "to proceed with the deleting they will all have to be deleted. "
+ "The other affected fonts are:</p><ul>%1</ul><p>\n Do you wish to "
+ "delete all of these?</p>").arg(out)))
+ {
+ error(KIO::ERR_USER_CANCELED, url.prettyURL());
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool CKioFonts::confirmMultiple(const KURL &url, QValueList<FcPattern *> *patterns, EFolder folder, EOp op)
+{
+ if(KFI_KIO_FONTS_PROTOCOL!=url.protocol())
+ return true;
+
+ QStringList files;
+
+ if(patterns && patterns->count())
+ {
+ QValueList<FcPattern *>::Iterator it,
+ end=patterns->end();
+
+ for(it=patterns->begin(); it!=end; ++it)
+ files.append(CFcEngine::getFcString(*it, FC_FILE));
+ }
+
+ return confirmMultiple(url, files, folder, op);
+}
+
+bool CKioFonts::checkUrl(const KURL &u, bool rootOk)
+{
+ if(KFI_KIO_FONTS_PROTOCOL==u.protocol() && (!rootOk || (rootOk && "/"!=u.path())))
+ {
+ QString sect(getSect(u.path()));
+
+ if(itsRoot)
+ {
+ if((isSysFolder(sect) || isUserFolder(sect)) &&
+ (itsFolders[FOLDER_SYS].fontMap.end()==itsFolders[FOLDER_SYS].fontMap.find(sect)))
+//CPD: TODO: || it has a font specified! e.g. fonts:/System/Times -> even in have a fonts:/System font, redirect
+//should still happen
+ {
+ redirection(getRedirect(u));
+ finished();
+ return false;
+ }
+ }
+ else
+ if(!isSysFolder(sect) && !isUserFolder(sect))
+ {
+ error(KIO::ERR_SLAVE_DEFINED, i18n("Please specify \"%1\" or \"%2\".")
+ .arg(i18n(KFI_KIO_FONTS_USER)).arg(i18n(KFI_KIO_FONTS_SYS)));
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool CKioFonts::checkAllowed(const KURL &u)
+{
+ if (KFI_KIO_FONTS_PROTOCOL==u.protocol())
+ {
+ QString ds(Misc::dirSyntax(u.path()));
+
+ if(ds==QString(QChar('/')+i18n(KFI_KIO_FONTS_USER)+QChar('/')) ||
+ ds==QString(QChar('/')+i18n(KFI_KIO_FONTS_SYS)+QChar('/')) ||
+ ds==QString(QChar('/')+QString::fromLatin1(KFI_KIO_FONTS_USER)+QChar('/')) ||
+ ds==QString(QChar('/')+QString::fromLatin1(KFI_KIO_FONTS_SYS)+QChar('/')))
+ {
+ error(KIO::ERR_SLAVE_DEFINED, i18n("Sorry, you cannot rename, move, copy, or delete either \"%1\" or \"%2\".")
+ .arg(i18n(KFI_KIO_FONTS_USER)).arg(i18n(KFI_KIO_FONTS_SYS))); \
+ return false;
+ }
+ }
+
+ return true;
+}
+
+//
+// Create an AFM from a Type 1 (pfa/pfb) font and its PFM file...
+void CKioFonts::createAfm(const QString &file, bool nrs, const QString &passwd)
+{
+ if(nrs && passwd.isEmpty())
+ return;
+
+ bool type1=isAType1(file),
+ pfm=!type1 && isAPfm(file); // No point checking if is pfm if its a type1
+
+ if(type1 || pfm)
+ {
+ QString afm=getMatch(file, "afm"); // pf2afm wants files with lowercase extension, so just check for lowercase!
+ // -- when a font is installed, the extensio is converted to lowercase anyway...
+
+ if(afm.isEmpty()) // No point creating if AFM already exists!
+ {
+ QString pfm,
+ t1;
+
+ if(type1) // Its a Type1, so look for existing PFM
+ {
+ pfm=getMatch(file, "pfm");
+ t1=file;
+ }
+ else // Its a PFM, so look for existing Type1
+ {
+ t1=getMatch(file, "pfa");
+ if(t1.isEmpty())
+ t1=getMatch(file, "pfb");
+ pfm=file;
+ }
+
+ if(!t1.isEmpty() && !pfm.isEmpty()) // Do we have both Type1 and PFM?
+ {
+ QString name(t1.left(t1.length()-4)); // pf2afm wants name without extension...
+
+ if(nrs)
+ {
+ QCString cmd("pf2afm ");
+ cmd+=QFile::encodeName(KProcess::quote(name));
+ doRootCmd(cmd, passwd);
+ }
+ else
+ Misc::doCmd("pf2afm", QFile::encodeName(name));
+ }
+ }
+ }
+}
+
+void CKioFonts::reparseConfig()
+{
+ KFI_DBUG << "reparseConfig" << endl;
+
+ itsKfiParams[0]=0;
+ if(!itsRoot)
+ {
+ itsNrsKfiParams[0]=0;
+ itsNrsNonMainKfiParams[0]=0;
+ }
+
+ if(itsRoot)
+ {
+ KConfig cfg(KFI_ROOT_CFG_FILE);
+ bool doX=cfg.readBoolEntry(KFI_CFG_X_KEY, KFI_DEFAULT_CFG_X),
+ doGs=cfg.readBoolEntry(KFI_CFG_GS_KEY, KFI_DEFAULT_CFG_GS);
+
+ if(doX || !doGs)
+ {
+ strcpy(itsKfiParams, doGs ? "-g" : "-");
+ if(doX)
+ {
+ if(!itsUsingXfsFpe)
+ strcat(itsKfiParams, "r");
+
+ if(!itsUsingFcFpe)
+ {
+ strcat(itsKfiParams, itsUsingXfsFpe ? "sx" : "x");
+ if(!itsHasSys)
+ strcat(itsKfiParams, "a");
+ }
+ }
+ }
+ }
+ else
+ {
+ KConfig rootCfg(KFI_ROOT_CFG_FILE);
+ bool rootDoX=rootCfg.readBoolEntry(KFI_CFG_X_KEY, KFI_DEFAULT_CFG_X),
+ rootDoGs=rootCfg.readBoolEntry(KFI_CFG_GS_KEY, KFI_DEFAULT_CFG_GS);
+
+ strcpy(itsNrsKfiParams, "-");
+
+ if(rootDoX || rootDoGs)
+ {
+ strcpy(itsNrsKfiParams, "-");
+ strcpy(itsNrsNonMainKfiParams, "-");
+
+ if(rootDoGs)
+ {
+ strcpy(itsNrsKfiParams, "g");
+ strcpy(itsNrsNonMainKfiParams, "g");
+ }
+
+ if(rootDoX && !itsUsingFcFpe)
+ {
+ strcat(itsNrsKfiParams, itsUsingXfsFpe ? "sx" : "x"); // Can't get root to refresh X, only xfs!
+ strcat(itsNrsNonMainKfiParams, itsUsingXfsFpe ? "sx" : "x");
+ if(!itsHasSys)
+ strcat(itsNrsKfiParams, "a");
+ }
+ if(0==itsNrsNonMainKfiParams[1])
+ itsNrsNonMainKfiParams[0]=0;
+ }
+
+ if(itsAddToSysFc)
+ strcpy(itsNrsKfiParams, "f");
+
+ if(0==itsNrsKfiParams[1])
+ itsNrsKfiParams[0]=0;
+
+ KConfig cfg(KFI_CFG_FILE);
+ bool doX=cfg.readBoolEntry(KFI_CFG_X_KEY, KFI_DEFAULT_CFG_X),
+ doGs=cfg.readBoolEntry(KFI_CFG_GS_KEY, KFI_DEFAULT_CFG_GS);
+
+ strcpy(itsKfiParams, doGs ? "-g" : "-");
+
+ if(doX)
+ strcat(itsKfiParams, itsUsingFcFpe ? "r" : "rx");
+ }
+
+ if(0==itsKfiParams[1])
+ itsKfiParams[0]=0;
+}
+
+}
diff --git a/kcontrol/kfontinst/kio/KioFonts.h b/kcontrol/kfontinst/kio/KioFonts.h
new file mode 100644
index 000000000..abfd6b042
--- /dev/null
+++ b/kcontrol/kfontinst/kio/KioFonts.h
@@ -0,0 +1,161 @@
+#ifndef __KIO_FONTS_H__
+#define __KIO_FONTS_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CKioFonts
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 05/03/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include <fontconfig/fontconfig.h>
+#include <time.h>
+#include <kio/slavebase.h>
+#include <kurl.h>
+#include <klocale.h>
+#include <qstring.h>
+#include <qcstring.h>
+#include <qmap.h>
+#include <qvaluelist.h>
+#include "Misc.h"
+#include "KfiConstants.h"
+
+namespace KFI
+{
+
+class CKioFonts : public KIO::SlaveBase
+{
+ private:
+
+ enum EConstants
+ {
+ KFI_PARAMS = 8
+ };
+
+ enum EDest
+ {
+ DEST_UNCHANGED,
+ DEST_SYS,
+ DEST_USER
+ };
+
+ enum EFolder
+ {
+ FOLDER_SYS,
+ FOLDER_USER,
+
+ FOLDER_COUNT
+ };
+
+ enum EOp
+ {
+ OP_COPY,
+ OP_MOVE,
+ OP_DELETE
+ };
+
+ class CDirList : public QStringList
+ {
+ public:
+
+ CDirList() { }
+ CDirList(const QString &str) : QStringList(str) { }
+
+ void add(const QString &d) { if (!contains(d)) append(d); }
+ };
+
+ struct TFolder
+ {
+ QString location;
+ CDirList modified;
+ QMap<QString, QValueList<FcPattern *> > fontMap; // Maps from "Times New Roman" -> $HOME/.fonts/times.ttf
+ };
+
+ public:
+
+ CKioFonts(const QCString &pool, const QCString &app);
+ virtual ~CKioFonts();
+
+ static QString getSect(const QString &f) { return f.section('/', 1, 1); }
+
+ void listDir(const KURL &url);
+ void stat(const KURL &url);
+ bool createStatEntry(KIO::UDSEntry &entry, const KURL &url, EFolder folder);
+ void get(const KURL &url);
+ void put(const KURL &url, int mode, bool overwrite, bool resume);
+ void copy(const KURL &src, const KURL &dest, int mode, bool overwrite);
+ void rename(const KURL &src, const KURL &dest, bool overwrite);
+ void del(const KURL &url, bool isFile);
+
+ private:
+
+ bool putReal(const QString &destOrig, const QCString &destOrigC, bool origExists, int mode, bool resume);
+ void modified(EFolder folder, bool clearList=true, const CDirList &dirs=CDirList());
+ void special(const QByteArray &a);
+ void createRootRefreshCmd(QCString &cmd, const CDirList &dirs=CDirList(), bool reparseCfg=true);
+ void doModified();
+ QString getRootPasswd(bool askPasswd=true);
+ bool doRootCmd(const char *cmd, const QString &passwd);
+ bool doRootCmd(const char *cmd, bool askPasswd=true) { return doRootCmd(cmd, getRootPasswd(askPasswd)); }
+ bool confirmUrl(KURL &url);
+ void clearFontList();
+ bool updateFontList();
+ EFolder getFolder(const KURL &url);
+ QMap<QString, QValueList<FcPattern *> >::Iterator getMap(const KURL &url);
+ QValueList<FcPattern *> * getEntries(const KURL &url);
+ FcPattern * getEntry(EFolder folder, const QString &file, bool full=false);
+ bool checkFile(const QString &file);
+ bool getSourceFiles(const KURL &src, QStringList &files);
+ bool checkDestFile(const KURL &src, const KURL &dest, EFolder destFolder, bool overwrite);
+ bool checkDestFiles(const KURL &src, QMap<QString, QString> &map, const KURL &dest, EFolder destFolder, bool overwrite);
+ bool confirmMultiple(const KURL &url, const QStringList &files, EFolder folder, EOp op);
+ bool confirmMultiple(const KURL &url, QValueList<FcPattern *> *patterns, EFolder folder, EOp op);
+ bool checkUrl(const KURL &u, bool rootOk=false);
+ bool checkAllowed(const KURL &u);
+ void createAfm(const QString &file, bool nrs=false, const QString &passwd=QString::null);
+ void reparseConfig();
+
+ private:
+
+ bool itsRoot,
+ itsCanStorePasswd,
+ itsUsingFcFpe,
+ itsUsingXfsFpe,
+ itsHasSys,
+ itsAddToSysFc;
+ QString itsPasswd;
+ unsigned int itsFontChanges;
+ EDest itsLastDest;
+ time_t itsLastDestTime,
+ itsLastFcCheckTime;
+ FcFontSet *itsFontList;
+ TFolder itsFolders[FOLDER_COUNT];
+ char itsNrsKfiParams[KFI_PARAMS],
+ itsNrsNonMainKfiParams[KFI_PARAMS],
+ itsKfiParams[KFI_PARAMS];
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/kio/Makefile.am b/kcontrol/kfontinst/kio/Makefile.am
new file mode 100644
index 000000000..ad0f2ea8e
--- /dev/null
+++ b/kcontrol/kfontinst/kio/Makefile.am
@@ -0,0 +1,20 @@
+kde_module_LTLIBRARIES = kio_fonts.la
+kio_fonts_la_SOURCES = \
+KioFonts.cpp
+
+kio_fonts_la_LIBADD = ../../fonts/libkxftconfig.la $(LIBFONTCONFIG_LIBS) $(LIBFREETYPE_LIBS) $(LIB_KIO) -lkdesu ../lib/libkfontinst.la
+kio_fonts_la_LDFLAGS = $(KDE_PLUGIN) $(all_libraries) $(KDE_RPATH) $(LIBFONTCONFIG_RPATH) $(LIBFREETYPE_RPATH) -module -avoid-version -no-undefined
+AM_CPPFLAGS= -I$(srcdir)/../lib -I$(srcdir)/../../fonts $(all_includes) $(LIBFREETYPE_CFLAGS) $(LIBFONTCONFIG_CFLAGS) -D_LARGEFILE64_SOURCE
+
+# The kxftconfig stuf really belongs to kdebase/kcontrol/fonts - here only so that can distribute this as an archive.
+noinst_HEADERS = \
+KioFonts.h
+
+servicesdir = $(kde_servicesdir)
+services_DATA = fonts.protocol
+
+vfsdata_DATA = fonts.desktop
+vfsdatadir = $(kde_datadir)/konqsidebartng/virtual_folders/services
+
+mimetype_DATA = folder.desktop system-folder.desktop package.desktop
+mimetypedir = $(kde_mimedir)/fonts
diff --git a/kcontrol/kfontinst/kio/folder.desktop b/kcontrol/kfontinst/kio/folder.desktop
new file mode 100644
index 000000000..24e328ae8
--- /dev/null
+++ b/kcontrol/kfontinst/kio/folder.desktop
@@ -0,0 +1,80 @@
+[Desktop Entry]
+Comment=Fonts Folder
+Comment[af]=Skrif tipe Gids
+Comment[ar]=مجلد المحارف
+Comment[be]=Тэчка шрыфтоў
+Comment[bg]=Директория за шрифтове
+Comment[bn]=ফন্ট ফোল্ডার
+Comment[br]=Renkell ar fontoù
+Comment[bs]=Direktorij sa fontovima
+Comment[ca]=Carpeta de lletres
+Comment[cs]=Složka písem
+Comment[csb]=Katalog fòntów
+Comment[da]=Skrifttypemappe
+Comment[de]=Ordner für Schriftarten
+Comment[el]=Φάκελος γραμματοσειρών
+Comment[eo]=Tipardosierujo
+Comment[es]=Carpeta de tipos de letra
+Comment[et]=Fontide kataloog
+Comment[eu]=Letra-tipoen karpeta
+Comment[fa]=پوشۀ قلم
+Comment[fi]=Kirjasinkansio
+Comment[fr]=Dossier de polices de caractères
+Comment[fy]=Lettertypenmap
+Comment[ga]=Fillteán na gClónna
+Comment[gl]=Cartafol das Fontes
+Comment[he]=תיקיית גופנים
+Comment[hi]=फ़ॉन्ट्स फ़ोल्डर
+Comment[hr]=Mapa fontova
+Comment[hu]=Betűtípuskönyvtár
+Comment[id]=Folder Fonts
+Comment[is]=Leturmappa
+Comment[it]=Cartella dei caratteri
+Comment[ja]=フォントフォルダ
+Comment[ka]=ფონტების საქაღალდე
+Comment[kk]=Қаріп қапшығы
+Comment[km]=ថត​ពុម្ពអក្សរ
+Comment[ko]=홈 폴더
+Comment[lt]=Šriftų aplankas
+Comment[lv]=Fontu mape
+Comment[mk]=Папка со фонтови
+Comment[ms]=Folder Fon
+Comment[mt]=Direttorju tal-fonts
+Comment[nb]=Mappe for skrifttyper
+Comment[nds]=Schriftoorden-Orner
+Comment[ne]=फन्ट फोल्डर
+Comment[nl]=Lettertypenmap
+Comment[nn]=Skriftmappe
+Comment[pa]=ਫੋਂਟ ਫੋਲਡਰ
+Comment[pl]=Katalog czcionek
+Comment[pt]=Pasta de Tipos de Letra
+Comment[pt_BR]=Pasta de Fontes
+Comment[ro]=Folder de fonturi
+Comment[ru]=Папка шрифтов
+Comment[rw]=Ububiko bw'Imyandikire
+Comment[se]=Fontamáhppa
+Comment[sk]=Priečinok písiem
+Comment[sl]=Mapa za pisave
+Comment[sr]=Фасцикла за фонтове
+Comment[sr@Latn]=Fascikla za fontove
+Comment[sv]=Teckensnittskatalog
+Comment[ta]=எழுத்துருக்கள் அடைவு
+Comment[tg]=Феҳристи ҳарфҳо
+Comment[th]=โฟลเดอร์แฟ้มแบบอักษร
+Comment[tr]=Yazıtipi Klasörü
+Comment[tt]=Yazu lar Törgäge
+Comment[uk]=Тека шрифтів
+Comment[uz]=Shriftlarning jildi
+Comment[uz@cyrillic]=Шрифтларнинг жилди
+Comment[vi]=Thư mục Phông chữ
+Comment[wa]=Ridant di fontes
+Comment[zh_CN]=字体文件夹
+Comment[zh_TW]=字型資料夾
+Icon=folder
+Type=MimeType
+MimeType=fonts/folder
+Patterns=
+
+X-KDE-AutoEmbed=true
+X-KDE-IsAlso=inode/directory
+
diff --git a/kcontrol/kfontinst/kio/fonts.desktop b/kcontrol/kfontinst/kio/fonts.desktop
new file mode 100644
index 000000000..0095f49d2
--- /dev/null
+++ b/kcontrol/kfontinst/kio/fonts.desktop
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Link
+URL=fonts:/
+Icon=fonts
+Name=Fonts
+Name[af]=Skriftipes
+Name[ar]=المحارف
+Name[az]=Yazı növləri
+Name[be]=Шрыфты
+Name[bg]=Шрифтове
+Name[bn]=ফন্ট
+Name[br]=Fontoù
+Name[bs]=Fontovi
+Name[ca]=Lletres
+Name[cs]=Písma
+Name[csb]=Fòntë
+Name[cy]=Ffontiau
+Name[da]=Skrifttyper
+Name[de]=Schriftarten
+Name[el]=Γραμματοσειρές
+Name[eo]=Tiparoj
+Name[es]=Tipos de letra
+Name[et]=Fondid
+Name[eu]=Letra-tipoak
+Name[fa]=قلمها
+Name[fi]=Kirjasimet
+Name[fr]=Polices
+Name[fy]=Lettertypen
+Name[ga]=Clónna
+Name[gl]=Fontes
+Name[he]=גופנים
+Name[hi]=फ़ॉन्ट्स
+Name[hr]=Fontovi
+Name[hu]=Betűtípusok
+Name[is]=Letur
+Name[it]=Tipi di carattere
+Name[ja]=フォント
+Name[ka]=ფონტები
+Name[kk]=Қаріптер
+Name[km]=ពុម្ពអក្សរ
+Name[ko]=글꼴
+Name[lo]=ຮູບແບບຕົວອັກສອນ
+Name[lt]=Šriftai
+Name[lv]=Fonti
+Name[mk]=Фонтови
+Name[mn]=Бичгүүд
+Name[ms]=Fon
+Name[nb]=Skrifttype
+Name[nds]=Schriftoorden
+Name[ne]=फन्ट
+Name[nl]=Lettertypen
+Name[nn]=Skrifttypar
+Name[nso]=Difonto
+Name[pa]=ਫੋਂਟ
+Name[pl]=Czcionki
+Name[pt]=Tipos de Letra
+Name[pt_BR]=Fontes
+Name[ro]=Fonturi
+Name[ru]=Шрифты
+Name[rw]=Imyandikire
+Name[se]=Fonttat
+Name[sk]=Písma
+Name[sl]=Pisave
+Name[sr]=Фонтови
+Name[sr@Latn]=Fontovi
+Name[ss]=Timo tetinhlamvu temagama
+Name[sv]=Teckensnitt
+Name[ta]=எழுத்துருக்கள்
+Name[tg]=Ҳарфҳо
+Name[th]=แบบอักษร
+Name[tr]=Yazıtipleri
+Name[tt]=Yazu
+Name[uk]=Шрифти
+Name[uz]=Shriftlar
+Name[uz@cyrillic]=Шрифтлар
+Name[ven]=Fontu
+Name[vi]=Phông chữ
+Name[wa]=Fontes
+Name[xh]=Uhlobo lwamagama
+Name[zh_CN]=字体
+Name[zh_TW]=字型
+Name[zu]=Izinhlobo zamagama
+Open=false
+X-KDE-TreeModule=Directory
+X-KDE-KonqSidebarModule=konqsidebar_tree
diff --git a/kcontrol/kfontinst/kio/fonts.protocol b/kcontrol/kfontinst/kio/fonts.protocol
new file mode 100644
index 000000000..7f54dd0cc
--- /dev/null
+++ b/kcontrol/kfontinst/kio/fonts.protocol
@@ -0,0 +1,18 @@
+[Protocol]
+exec=kio_fonts
+protocol=fonts
+input=none
+output=filesystem
+listing=Name,Type,Size,Date,AccessDate,Access,Owner,Group,Link
+reading=true
+writing=true
+makedir=false
+deleting=true
+moving=true
+linking=false
+copyToFile=false
+copyFromFile=true
+Icon=fonts
+defaultMimetype=application/octet-stream
+maxInstances=1
+Class=:local
diff --git a/kcontrol/kfontinst/kio/package.desktop b/kcontrol/kfontinst/kio/package.desktop
new file mode 100644
index 000000000..4ee3543de
--- /dev/null
+++ b/kcontrol/kfontinst/kio/package.desktop
@@ -0,0 +1,74 @@
+[Desktop Entry]
+Type=MimeType
+MimeType=fonts/package
+Icon=font
+Patterns=*.fonts.tar.gz
+Comment=Fonts Package
+Comment[af]=Skriftipes Paket
+Comment[ar]=حزمة المحارف
+Comment[be]=Пакет шрыфтоў
+Comment[bg]=Пакет с шрифтове
+Comment[bn]=ফন্ট প্যাকেজ
+Comment[bs]=Paket fontova
+Comment[ca]=Paquet de lletres
+Comment[cs]=Balík písem
+Comment[csb]=Paczét fòntów
+Comment[da]=Skrifttypepakke
+Comment[de]=Schriftartenpaket
+Comment[el]=Πακέτο γραμματοσειρών
+Comment[eo]=Tiparpakaĵo
+Comment[es]=Paquete de tipos de letra
+Comment[et]=Fondipakett
+Comment[eu]=Letra-tipoen paketea
+Comment[fa]=بستۀ قلمها
+Comment[fi]=Kirjasinpaketti
+Comment[fr]=Paquet de polices
+Comment[fy]=Lettertypenpakket
+Comment[ga]=Pacáiste na gClónna
+Comment[gl]=Pacote das Fontes
+Comment[he]=חבילת גופנים
+Comment[hr]=Paket fontova
+Comment[hu]=Betűtípuscsomag
+Comment[id]=Paket Font
+Comment[is]=Leturpakki
+Comment[it]=Pacchetto tipi di caratteri
+Comment[ja]=フォントパッケージ
+Comment[ka]=შრიფტების პაკეტი
+Comment[kk]=Қаріп дестесі
+Comment[km]=កញ្ចប់​ពុម្ពអក្សរ
+Comment[lt]=Šriftų paketas
+Comment[mk]=Пакет со фонтови
+Comment[ms]=Pakej Fon
+Comment[nb]=Pakke for skrifttyper
+Comment[nds]=Schriftoorden-Paket
+Comment[ne]=फन्ट प्याकेज
+Comment[nl]=Lettertypenpakket
+Comment[nn]=Pakke for skrifter
+Comment[pa]=ਫੋਂਟ ਪੈਕੇਜ
+Comment[pl]=Pakiet czcionek
+Comment[pt]=Pacote de Tipos de Letra
+Comment[pt_BR]=Pacote de Fontes
+Comment[ro]=Pachet de fonturi
+Comment[ru]=Пакет шрифтов
+Comment[rw]=Rukomatanya y'Imyandikire
+Comment[se]=Fontapáhkka
+Comment[sk]=Balík písiem
+Comment[sl]=Paket pisav
+Comment[sr]=Пакет фонтова
+Comment[sr@Latn]=Paket fontova
+Comment[sv]=Teckensnittspaket
+Comment[tg]=Бастаи ҳарфҳо
+Comment[th]=แพคเกจแบบอักษร
+Comment[tr]=Yazıtipi Paketi
+Comment[tt]=Yazular Tuplaması
+Comment[uk]=Пакунок шрифтів
+Comment[uz]=Shrift
+Comment[uz@cyrillic]=Шрифт
+Comment[vi]=Gói Phông chữ
+Comment[wa]=Paket di fontes
+Comment[zh_CN]=字体包
+Comment[zh_TW]=字型套件
+
+[Property::X-KDE-LocalProtocol]
+Type=QString
+Value=tar
diff --git a/kcontrol/kfontinst/kio/system-folder.desktop b/kcontrol/kfontinst/kio/system-folder.desktop
new file mode 100644
index 000000000..07bf9d703
--- /dev/null
+++ b/kcontrol/kfontinst/kio/system-folder.desktop
@@ -0,0 +1,79 @@
+[Desktop Entry]
+Comment=System Fonts Folder
+Comment[af]=Stelsel Skrif tipe Gids
+Comment[ar]=مجلد محارف النظام
+Comment[be]=Тэчка сістэмных шрыфтоў
+Comment[bg]=Директория за системните шрифтове
+Comment[bn]=সিস্টেম ফন্ট ফোল্ডার
+Comment[br]=Renkell fontoù ar reizhiad
+Comment[bs]=Sistemski direktorij sa fontovima
+Comment[ca]=Carpeta de lletres del sistema
+Comment[cs]=Složka se systémovými písmy
+Comment[csb]=Katalog systemòwëch fòntów
+Comment[da]=Mappe til systemets skrifttyper
+Comment[de]=Ordner für Systemschriften
+Comment[el]=Φάκελος γραμματοσειρών συστήματος
+Comment[eo]=Sistema tipardosierujo
+Comment[es]=Carpeta de tipos de letra del sistema
+Comment[et]=Süsteemi fontide kataloog
+Comment[eu]=Sistemaren letra-tipoen karpeta
+Comment[fa]=پوشۀ قلمهای سیستم
+Comment[fi]=Järjestelmän kirjasinkansio
+Comment[fr]=Dossier système de polices de caractères
+Comment[fy]=Systeemlettertypenmap
+Comment[ga]=Fillteán Clónna an Chórais
+Comment[gl]=Cartafol das Fontes do Sistema
+Comment[he]=תיקיית גופני מערכת
+Comment[hi]=तंत्र फ़ॉन्ट्स फ़ोल्डर
+Comment[hr]=Mapa sistemskih fontova
+Comment[hu]=A rendszer betűtípusainak könyvtára
+Comment[id]=Folder Font Sistem
+Comment[is]=Kerfisleturmappa
+Comment[it]=Cartella dei caratteri di sistema
+Comment[ja]=システムフォントフォルダ
+Comment[ka]=სისტემური ფონტების საქაღალდე
+Comment[kk]=Жүйелік қаріптер қапшығы
+Comment[km]=ថត​ពុម្ពអក្សរ​ប្រព័ន្ធ
+Comment[lt]=Sistemos šriftų aplankas
+Comment[lv]=Sistēmas fontu mape
+Comment[mk]=Папка со системски фонтови
+Comment[ms]=Folder Fon Sistem
+Comment[mt]=Direttorju tal-fonts tas-sistema
+Comment[nb]=Mappe for systemskrifttyper
+Comment[nds]=Orner för de Systeemschriftoorden
+Comment[ne]=फन्ट फोल्डर प्रणाली
+Comment[nl]=Systeemlettertypenmap
+Comment[nn]=Systemskriftmappe
+Comment[pa]=ਸਿਸਟਮ ਫੋਂਟ ਫੋਲਡਰ
+Comment[pl]=Katalog czcionek systemowych
+Comment[pt]=Pasta de Tipos de Letra do Sistema
+Comment[pt_BR]=Pasta de Fontes do Sistema
+Comment[ro]=Folder fonturi de sistem
+Comment[ru]=Папка системных шрифтов
+Comment[rw]=Ububiko bw'Imyandikire Sisitemu
+Comment[se]=Vuogádatfontamáhppa
+Comment[sk]=Priečinok systémových písiem
+Comment[sl]=Mapa za sistemske pisave
+Comment[sr]=Фасцикла за системске фонтове
+Comment[sr@Latn]=Fascikla za sistemske fontove
+Comment[sv]=Systemteckensnittskatalog
+Comment[ta]=அமைப்பு எழுத்துருக்கள் அடைவு
+Comment[tg]=Системаи феҳристи ҳарфҳо
+Comment[th]=โฟลเดอร์แฟ้มแบบอักษรของระบบ
+Comment[tr]=Sistem Yazı Tipi Klasörü
+Comment[tt]=Sistem Yazular Törgäge
+Comment[uk]=Тека системних шрифтів
+Comment[uz]=Tizim shriftlarining jildi
+Comment[uz@cyrillic]=Тизим шрифтларининг жилди
+Comment[vi]=Thư mục Phông chữ Hệ thống
+Comment[wa]=Ridant di fontes do sistinme
+Comment[zh_CN]=系统字体文件夹
+Comment[zh_TW]=系統字型資料夾
+Icon=folder_red
+Type=MimeType
+MimeType=fonts/system-folder
+Patterns=
+
+X-KDE-AutoEmbed=true
+X-KDE-IsAlso=inode/directory
+
diff --git a/kcontrol/kfontinst/lib/FcEngine.cpp b/kcontrol/kfontinst/lib/FcEngine.cpp
new file mode 100644
index 000000000..0b3e51767
--- /dev/null
+++ b/kcontrol/kfontinst/lib/FcEngine.cpp
@@ -0,0 +1,1179 @@
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qfontmetrics.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <kurl.h>
+#include <kconfig.h>
+#include <kglobalsettings.h>
+#include <kio/netaccess.h>
+#include <math.h>
+#include "FcEngine.h"
+#include "KfiConstants.h"
+#ifdef HAVE_XFT
+#include <X11/Xlib.h>
+#include <X11/Xft/Xft.h>
+#include <fixx11h.h>
+#endif
+
+#define KFI_HAVE_OBLIQUE // Do we differentiate between Italic and Oblique?
+#define KFI_HAVE_MEDIUM_WEIGHT // Do we differentiate between Medium and Normal weights?
+
+#define KFI_PREVIEW_GROUP "Preview Settings"
+#define KFI_PREVIEW_STRING_KEY "String"
+
+#ifdef HAVE_XFT
+#define KFI_DISPLAY(pix) (pix ? pix->x11Display() : QPaintDevice::x11AppDisplay())
+#endif
+
+namespace KFI
+{
+
+const int CFcEngine::constScalableSizes[]={8, 10, 12, 24, 36, 48, 64, 72, 96, 0 };
+const int CFcEngine::constDefaultAlphaSize=24;
+
+static int fcWeight(int weight)
+{
+ if(weight<FC_WEIGHT_ULTRALIGHT)
+ return FC_WEIGHT_THIN;
+
+ if(weight<(FC_WEIGHT_ULTRALIGHT+FC_WEIGHT_LIGHT)/2)
+ return FC_WEIGHT_ULTRALIGHT;
+
+ if(weight<(FC_WEIGHT_LIGHT+FC_WEIGHT_NORMAL)/2)
+ return FC_WEIGHT_LIGHT;
+
+#ifdef KFI_HAVE_MEDIUM_WEIGHT
+ if(weight<(FC_WEIGHT_NORMAL+FC_WEIGHT_MEDIUM)/2)
+ return FC_WEIGHT_NORMAL;
+
+ if(weight<(FC_WEIGHT_MEDIUM+FC_WEIGHT_SEMIBOLD)/2)
+ return FC_WEIGHT_MEDIUM;
+#else
+ if(weight<(FC_WEIGHT_NORMAL+FC_WEIGHT_SEMIBOLD)/2)
+ return FC_WEIGHT_NORMAL;
+#endif
+
+ if(weight<(FC_WEIGHT_SEMIBOLD+FC_WEIGHT_BOLD)/2)
+ return FC_WEIGHT_SEMIBOLD;
+
+ if(weight<(FC_WEIGHT_BOLD+FC_WEIGHT_ULTRABOLD)/2)
+ return FC_WEIGHT_BOLD;
+
+ if(weight<(FC_WEIGHT_ULTRABOLD+FC_WEIGHT_HEAVY)/2)
+ return FC_WEIGHT_ULTRABOLD;
+
+ return FC_WEIGHT_HEAVY;
+}
+
+static int fcToQtWeight(int weight)
+{
+ switch(weight)
+ {
+ case FC_WEIGHT_THIN:
+ return 0;
+ case FC_WEIGHT_ULTRALIGHT:
+ return QFont::Light>>1;
+ case FC_WEIGHT_LIGHT:
+ return QFont::Light;
+ default:
+ case FC_WEIGHT_NORMAL:
+ return QFont::Normal;
+ case FC_WEIGHT_MEDIUM:
+#ifdef KFI_HAVE_MEDIUM_WEIGHT
+ return (QFont::Normal+QFont::DemiBold)>>1;
+#endif
+ return QFont::Normal;
+ case FC_WEIGHT_SEMIBOLD:
+ return QFont::DemiBold;
+ case FC_WEIGHT_BOLD:
+ return QFont::Bold;
+ case FC_WEIGHT_ULTRABOLD:
+ return (QFont::Bold+QFont::Black)>>1;
+ case FC_WEIGHT_HEAVY:
+ return QFont::Black;
+ }
+}
+
+#ifndef KFI_FC_NO_WIDTHS
+static int fcWidth(int width)
+{
+ if(width<FC_WIDTH_EXTRACONDENSED)
+ return FC_WIDTH_ULTRACONDENSED;
+
+ if(width<(FC_WIDTH_EXTRACONDENSED+FC_WIDTH_CONDENSED)/2)
+ return FC_WIDTH_EXTRACONDENSED;
+
+ if(width<(FC_WIDTH_CONDENSED+FC_WIDTH_SEMICONDENSED)/2)
+ return FC_WIDTH_CONDENSED;
+
+ if(width<(FC_WIDTH_SEMICONDENSED+FC_WIDTH_NORMAL)/2)
+ return FC_WIDTH_SEMICONDENSED;
+
+ if(width<(FC_WIDTH_NORMAL+FC_WIDTH_SEMIEXPANDED)/2)
+ return FC_WIDTH_NORMAL;
+
+ if(width<(FC_WIDTH_SEMIEXPANDED+FC_WIDTH_EXPANDED)/2)
+ return FC_WIDTH_SEMIEXPANDED;
+
+ if(width<(FC_WIDTH_EXPANDED+FC_WIDTH_EXTRAEXPANDED)/2)
+ return FC_WIDTH_EXPANDED;
+
+ if(width<(FC_WIDTH_EXTRAEXPANDED+FC_WIDTH_ULTRAEXPANDED)/2)
+ return FC_WIDTH_EXTRAEXPANDED;
+
+ return FC_WIDTH_ULTRAEXPANDED;
+}
+
+static int fcToQtWidth(int weight)
+{
+ switch(weight)
+ {
+ case FC_WIDTH_ULTRACONDENSED:
+ return QFont::UltraCondensed;
+ case FC_WIDTH_EXTRACONDENSED:
+ return QFont::ExtraCondensed;
+ case FC_WIDTH_CONDENSED:
+ return QFont::Condensed;
+ case FC_WIDTH_SEMICONDENSED:
+ return QFont::SemiCondensed;
+ default:
+ case FC_WIDTH_NORMAL:
+ return QFont::Unstretched;
+ case FC_WIDTH_SEMIEXPANDED:
+ return QFont::SemiExpanded;
+ case FC_WIDTH_EXPANDED:
+ return QFont::Expanded;
+ case FC_WIDTH_EXTRAEXPANDED:
+ return QFont::ExtraExpanded;
+ case FC_WIDTH_ULTRAEXPANDED:
+ return QFont::UltraExpanded;
+ }
+}
+#endif
+
+static int fcSlant(int slant)
+{
+ if(slant<FC_SLANT_ITALIC)
+ return FC_SLANT_ROMAN;
+
+#ifdef KFI_HAVE_OBLIQUE
+ if(slant<(FC_SLANT_ITALIC+FC_SLANT_OBLIQUE)/2)
+ return FC_SLANT_ITALIC;
+
+ return FC_SLANT_OBLIQUE;
+#else
+ return FC_SLANT_ITALIC;
+#endif
+}
+
+static bool fcToQtSlant(int slant)
+{
+ return FC_SLANT_ROMAN==slant ? false : true;
+}
+
+static int fcSpacing(int spacing)
+{
+ if(spacing<FC_MONO)
+ return FC_PROPORTIONAL;
+
+ if(spacing<(FC_MONO+FC_CHARCELL)/2)
+ return FC_MONO;
+
+ return FC_CHARCELL;
+}
+
+static int strToWeight(const QString &str, QString &newStr)
+{
+ if(0==str.find(i18n(KFI_WEIGHT_THIN), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_THIN).length());
+ return FC_WEIGHT_THIN;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_EXTRALIGHT), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_EXTRALIGHT).length());
+ return FC_WEIGHT_EXTRALIGHT;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_ULTRALIGHT), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_ULTRALIGHT).length());
+ return FC_WEIGHT_ULTRALIGHT;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_LIGHT), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_LIGHT).length());
+ return FC_WEIGHT_LIGHT;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_REGULAR), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_REGULAR).length());
+ return FC_WEIGHT_REGULAR;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_NORMAL), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_NORMAL).length());
+ return FC_WEIGHT_NORMAL;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_MEDIUM), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_MEDIUM).length());
+ return FC_WEIGHT_MEDIUM;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_DEMIBOLD), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_DEMIBOLD).length());
+ return FC_WEIGHT_SEMIBOLD;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_SEMIBOLD), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_SEMIBOLD).length());
+ return FC_WEIGHT_SEMIBOLD;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_BOLD), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_BOLD).length());
+ return FC_WEIGHT_BOLD;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_EXTRABOLD), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_EXTRABOLD).length());
+ return FC_WEIGHT_EXTRABOLD;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_ULTRABOLD), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_ULTRABOLD).length());
+ return FC_WEIGHT_ULTRABOLD;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_BLACK), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_BLACK).length());
+ return FC_WEIGHT_BLACK;
+ }
+ if(0==str.find(i18n(KFI_WEIGHT_HEAVY), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WEIGHT_HEAVY).length());
+ return FC_WEIGHT_HEAVY;
+ }
+
+ newStr=str;
+ return FC_WEIGHT_REGULAR;
+}
+
+#ifndef KFI_FC_NO_WIDTHS
+static int strToWidth(const QString &str, QString &newStr)
+{
+ if(0==str.find(i18n(KFI_WIDTH_ULTRACONDENSED), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WIDTH_ULTRACONDENSED).length());
+ return FC_WIDTH_ULTRACONDENSED;
+ }
+ if(0==str.find(i18n(KFI_WIDTH_EXTRACONDENSED), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WIDTH_EXTRACONDENSED).length());
+ return FC_WIDTH_EXTRACONDENSED;
+ }
+ if(0==str.find(i18n(KFI_WIDTH_CONDENSED), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WIDTH_CONDENSED).length());
+ return FC_WIDTH_CONDENSED;
+ }
+ if(0==str.find(i18n(KFI_WIDTH_SEMICONDENSED), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WIDTH_SEMICONDENSED).length());
+ return FC_WIDTH_SEMICONDENSED;
+ }
+ if(0==str.find(i18n(KFI_WIDTH_NORMAL), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WIDTH_NORMAL).length());
+ return FC_WIDTH_NORMAL;
+ }
+ if(0==str.find(i18n(KFI_WIDTH_SEMIEXPANDED), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WIDTH_SEMIEXPANDED).length());
+ return FC_WIDTH_SEMIEXPANDED;
+ }
+ if(0==str.find(i18n(KFI_WIDTH_EXPANDED), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WIDTH_EXPANDED).length());
+ return FC_WIDTH_EXPANDED;
+ }
+ if(0==str.find(i18n(KFI_WIDTH_EXTRAEXPANDED), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WIDTH_EXTRAEXPANDED).length());
+ return FC_WIDTH_EXTRAEXPANDED;
+ }
+ if(0==str.find(i18n(KFI_WIDTH_ULTRAEXPANDED), 0, false))
+ {
+ newStr=str.mid(i18n(KFI_WIDTH_ULTRAEXPANDED).length());
+ return FC_WIDTH_ULTRAEXPANDED;
+ }
+
+ newStr=str;
+ return FC_WIDTH_NORMAL;
+}
+#endif
+
+static int strToSlant(const QString &str)
+{
+ if(-1!=str.find(i18n(KFI_SLANT_ITALIC)))
+ return FC_SLANT_ITALIC;
+ if(-1!=str.find(i18n(KFI_SLANT_OBLIQUE)))
+ return FC_SLANT_OBLIQUE;
+ return FC_SLANT_ROMAN;
+}
+
+static void drawText(QPainter &painter, int x, int y, int width, const QString &str)
+{
+ QString s(str);
+ bool addedElipses=false;
+
+ width-=x*2;
+ while(s.length()>3 && painter.fontMetrics().size(0, s).width()>width)
+ {
+ if(!addedElipses)
+ {
+ s.remove(s.length()-2, 2);
+ s.append("...");
+ addedElipses=true;
+ }
+ else
+ s.remove(s.length()-4, 1);
+ }
+ painter.drawText(x, y, s);
+}
+
+inline bool equal(double d1, double d2)
+{
+ return (fabs(d1 - d2) < 0.0001);
+}
+
+inline bool equalWeight(int a, int b)
+{
+ return a==b || fcWeight(a)==fcWeight(b);
+}
+
+#ifndef KFI_FC_NO_WIDTHS
+inline bool equalWidth(int a, int b)
+{
+ return a==b || fcWidth(a)==fcWidth(b);
+}
+#endif
+
+inline bool equalSlant(int a, int b)
+{
+ return a==b || fcSlant(a)==fcSlant(b);
+}
+
+#ifdef HAVE_XFT
+static bool drawChar(QPixmap &pix, XftDraw *xftDraw, XftFont *xftFont, XftColor *xftCol, const QString &text, int pos,
+ int &x, int &y, int w, int h, int fSize, int offset)
+{
+ XGlyphInfo extents;
+ const FcChar16 *str=(FcChar16 *)(&(text.ucs2()[pos]));
+
+ XftTextExtents16(pix.x11Display(), xftFont, str, 1, &extents);
+
+ if(x+extents.width+2>w)
+ {
+ x=offset;
+ y+=fSize;
+ }
+
+ if(y+offset<h)
+ {
+ XftDrawString16(xftDraw, xftCol, xftFont, x, y, str, 1);
+ x+=extents.width+2;
+ return true;
+ }
+ return false;
+}
+
+static bool drawString(QPixmap &pix, XftDraw *xftDraw, XftFont *xftFont, XftColor *xftCol, const QString &text,
+ int x, int &y, int h, int offset)
+{
+ XGlyphInfo extents;
+ const FcChar16 *str=(FcChar16 *)(text.ucs2());
+
+ XftTextExtents16(pix.x11Display(), xftFont, str, text.length(), &extents);
+ if(y+extents.height<h)
+ XftDrawString16(xftDraw, xftCol, xftFont, x, y+extents.y, str, text.length());
+ if(extents.height>0)
+ {
+ y+=extents.height+offset;
+ return true;
+ }
+ return false;
+}
+
+static bool drawGlyph(QPixmap &pix, XftDraw *xftDraw, XftFont *xftFont, XftColor *xftCol, FT_UInt i,
+ int &x, int &y, int &w, int &h, int fSize, int offset)
+{
+ XGlyphInfo extents;
+
+ XftGlyphExtents(pix.x11Display(), xftFont, &i, 1, &extents);
+
+ if(x+extents.width+2>w)
+ {
+ x=offset;
+ y+=fSize;
+ }
+
+ if(y+offset<h)
+ {
+ XftDrawGlyphs(xftDraw, xftCol, xftFont, x, y, &i, 1);
+ x+=extents.width+2;
+ return true;
+ }
+ return false;
+}
+
+inline int point2Pixel(int point)
+{
+ return (point*QPaintDevice::x11AppDpiX()+36)/72;
+}
+
+static bool hasStr(XftFont *font, QString &str)
+{
+ unsigned int slen=str.length(),
+ ch;
+
+ for(ch=0; ch<slen; ++ch)
+ if(!FcCharSetHasChar(font->charset, str[ch].unicode()))
+ return false;
+ return true;
+}
+#endif
+
+CFcEngine::CFcEngine()
+ : itsIndex(-1),
+ itsIndexCount(1)
+{
+}
+
+CFcEngine::~CFcEngine()
+{
+ // Clear any fonts that may have been added...
+ FcConfigAppFontClear(FcConfigGetCurrent());
+}
+
+QString CFcEngine::getName(const KURL &url, int faceNo)
+{
+ if(url!=itsLastUrl || faceNo!=itsIndex)
+ parseUrl(url, faceNo);
+
+ return itsDescriptiveName;
+}
+
+#ifdef HAVE_XFT
+bool CFcEngine::draw(const KURL &url, int w, int h, QPixmap &pix, int faceNo, bool thumb)
+{
+ bool rv=false;
+
+ if((url==itsLastUrl && faceNo==itsIndex) || parseUrl(url, faceNo))
+ {
+ rv=true;
+
+ if(!itsInstalled) // Then add to fontconfig's list, so that Xft can display it...
+ {
+ FcInitReinitialize();
+ FcConfigAppFontAddFile(FcConfigGetCurrent(), (const FcChar8 *)(itsName.utf8().data()));
+ }
+
+ if(thumb && (w!=h || h>128))
+ thumb=false;
+
+ int offset=thumb
+ ? h<=32
+ ? 2
+ : 3
+ : 4,
+ x=offset, y=offset;
+
+ pix.resize(w, h);
+ pix.fill(Qt::white);
+
+ QPainter painter(&pix);
+
+ getSizes(&pix);
+
+ if(itsSizes.size())
+ {
+ XRenderColor xrenderCol;
+ XftColor xftCol;
+
+ xrenderCol.red=xrenderCol.green=xrenderCol.blue=0;
+ xrenderCol.alpha=0xffff;
+ XftColorAllocValue(pix.x11Display(), DefaultVisual(pix.x11Display(),
+ pix.x11Screen()),
+ DefaultColormap(pix.x11Display(), pix.x11Screen()),
+ &xrenderCol, &xftCol);
+
+ XftDraw *xftDraw=XftDrawCreate(pix.x11Display(), (Pixmap)(pix.handle()),
+ (Visual*)(pix.x11Visual()), pix.x11Colormap());
+
+ if(xftDraw)
+ {
+ XftFont *xftFont=NULL;
+ bool drawGlyphs=false;
+
+ if(thumb)
+ {
+ QString text(i18n("AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789"));
+
+ //
+ // Calculate size of text...
+ int fSize= h <= 32
+ ? h-(offset*2) // 1 line of chars...
+ : h <= 64
+ ? (h-(offset*3))/2 // 2 lines...
+ : (h-(offset*4))/3; // 3 lines or more
+
+ if(!itsScalable) // Then need to get nearest size...
+ {
+ int bSize=fSize;
+
+ for(unsigned int s=0; s<itsSizes.size(); ++s)
+ if (itsSizes[s]<=fSize)
+ bSize=itsSizes[s];
+ fSize=bSize;
+ }
+
+ unsigned int ch;
+
+ xftFont=getFont(fSize, &pix);
+
+ y=fSize;
+ if(xftFont)
+ {
+ drawGlyphs=!hasStr(xftFont, text);
+
+ if(!drawGlyphs)
+ for(ch=0; ch<text.length(); ++ch) // Display char by char so that it wraps...
+ if(!drawChar(pix, xftDraw, xftFont, &xftCol, text, ch, x, y, w, h, fSize, offset))
+ break;
+ if(drawGlyphs)
+ {
+ FT_Face face=XftLockFace(xftFont);
+
+ if(face)
+ {
+ for(int i=1; i<face->num_glyphs && y<w; ++i) // Glyph 0 is the NULL glyph
+ if(!drawGlyph(pix, xftDraw, xftFont, &xftCol, i, x, y, w, h, fSize, offset))
+ break;
+
+ XftUnlockFace(xftFont);
+ }
+ }
+ }
+ }
+ else
+ {
+ QString lowercase(getLowercaseLetters()),
+ uppercase(getUppercaseLetters()),
+ punctuation(getPunctuation()),
+ title(itsDescriptiveName.isEmpty()
+ ? i18n("ERROR: Could not determine font's name.")
+ : itsDescriptiveName);
+
+ if(1==itsSizes.size())
+ title=i18n("%1 [1 pixel]", "%1 [%n pixels]", itsSizes[0]).arg(title);
+
+ painter.setFont(KGlobalSettings::generalFont());
+ painter.setPen(Qt::black);
+ y=painter.fontMetrics().height();
+ drawText(painter, x, y, w-offset, title);
+ y+=4;
+ painter.drawLine(offset, y, w-(offset+1), y);
+ y+=8;
+
+ bool lc=true,
+ uc=true,
+ punc=true;
+
+ xftFont=getFont(itsAlphaSize, &pix);
+ if(xftFont)
+ {
+ lc=hasStr(xftFont, lowercase);
+ uc=hasStr(xftFont, uppercase);
+ punc=hasStr(xftFont, punctuation);
+
+ drawGlyphs=!lc && !uc;
+
+ if(!drawGlyphs)
+ {
+ if(lc)
+ drawString(pix, xftDraw, xftFont, &xftCol, lowercase, x, y, h, offset);
+ if(uc)
+ drawString(pix, xftDraw, xftFont, &xftCol, uppercase, x, y, h, offset);
+ if(punc)
+ drawString(pix, xftDraw, xftFont, &xftCol, punctuation, x, y, h, offset);
+ XftFontClose(pix.x11Display(), xftFont);
+ if(lc || uc || punc)
+ painter.drawLine(offset, y, w-(offset+1), y);
+ y+=8;
+ }
+
+ QString previewString(getPreviewString());
+ bool stop=false;
+
+ if(!drawGlyphs)
+ {
+ if(!lc && uc)
+ previewString=previewString.upper();
+ if(!uc && lc)
+ previewString=previewString.lower();
+ }
+
+ for(unsigned int s=0; s<itsSizes.size(); ++s)
+ {
+ xftFont=getFont(itsSizes[s], &pix);
+
+ if(xftFont)
+ {
+ if(drawGlyphs)
+ {
+ FT_Face face=XftLockFace(xftFont);
+
+ if(face)
+ {
+ int space=itsSizes[s]/10;
+ XGlyphInfo extents;
+
+ if(!space)
+ space=1;
+
+ for(int i=1; i<face->num_glyphs && y<w && !stop; ++i)
+ {
+ XftGlyphExtents(pix.x11Display(), xftFont, (const FT_UInt *)&i, 1, &extents);
+
+ if(y+extents.height>h)
+ stop=true;
+ else
+ {
+ if(x+extents.width<w)
+ XftDrawGlyphs(xftDraw, &xftCol, xftFont, x, y+extents.y,
+ (const FT_UInt *)&i, 1);
+ if(extents.width>0)
+ x+=extents.width+space;
+ }
+ if(x>=w || i==face->num_glyphs-1)
+ {
+ y+=itsSizes[s]+offset;
+ x=offset;
+ break;
+ }
+ }
+
+ XftUnlockFace(xftFont);
+ }
+ }
+ else
+ drawString(pix, xftDraw, xftFont, &xftCol, previewString, x, y, h, offset);
+ XftFontClose(pix.x11Display(), xftFont);
+ }
+ }
+ }
+ }
+
+ XftDrawDestroy(xftDraw);
+ }
+ }
+ }
+
+ return rv;
+}
+#endif
+
+QString CFcEngine::getPreviewString()
+{
+ KConfig cfg(KFI_UI_CFG_FILE);
+
+ cfg.setGroup(KFI_PREVIEW_GROUP);
+
+ QString str(cfg.readEntry(KFI_PREVIEW_STRING_KEY));
+
+ return str.isEmpty() ? i18n("A sentence that uses all of the letters of the alphabet",
+ "The quick brown fox jumps over the lazy dog")
+ : str;
+}
+
+void CFcEngine::setPreviewString(const QString &str)
+{
+ KConfig cfg(KFI_UI_CFG_FILE);
+
+ cfg.setGroup(KFI_PREVIEW_GROUP);
+ cfg.writeEntry(KFI_PREVIEW_STRING_KEY, str);
+}
+
+QString CFcEngine::getUppercaseLetters()
+{
+ return i18n("All of the letters of the alphabet, uppercase", "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+}
+
+QString CFcEngine::getLowercaseLetters()
+{
+ return i18n("All of the letters of the alphabet, lowercase", "abcdefghijklmnopqrstuvwxyz");
+}
+
+QString CFcEngine::getPunctuation()
+{
+ return i18n("Numbers and characters", "0123456789.:,;(*!?'/\\\")£$€%^&-+@~#<>{}[]");
+}
+
+QString CFcEngine::getFcString(FcPattern *pat, const char *val, int faceNo)
+{
+ QString rv;
+ FcChar8 *fcStr;
+
+ if(FcResultMatch==FcPatternGetString(pat, val, faceNo, &fcStr))
+ rv=QString::fromUtf8((char *)fcStr);
+
+ return rv;
+}
+
+QString CFcEngine::createName(FcPattern *pat, int faceNo)
+{
+//CPD: TODO: the names *need* to match up with kfontchooser's...
+ QString name(getFcString(pat, FC_FAMILY, faceNo)),
+ str;
+ int intVal;
+ bool comma=false;
+
+ if (FcResultMatch==FcPatternGetInteger(pat, FC_WEIGHT, faceNo, &intVal))
+ {
+ str=weightStr(intVal);
+ if(!str.isEmpty())
+ {
+ name+=QString(", ")+str;
+ comma=true;
+ }
+ }
+
+ if (FcResultMatch==FcPatternGetInteger(pat, FC_SLANT, faceNo, &intVal))
+ {
+ str=slantStr(intVal);
+ if(!str.isEmpty())
+ {
+ if(!comma)
+ {
+ name+=QChar(',');
+ comma=true;
+ }
+ name+=QChar(' ')+str;
+ }
+ }
+
+#ifndef KFI_FC_NO_WIDTHS
+ if (FcResultMatch==FcPatternGetInteger(pat, FC_WIDTH, faceNo, &intVal))
+ {
+ str=widthStr(intVal);
+ if(!str.isEmpty())
+ name+=QChar(' ')+str;
+ }
+#endif
+
+ return name;
+}
+
+QString CFcEngine::weightStr(int weight, bool emptyNormal)
+{
+ switch(fcWeight(weight))
+ {
+ case FC_WEIGHT_THIN:
+ return i18n(KFI_WEIGHT_THIN);
+ case FC_WEIGHT_ULTRALIGHT:
+ return i18n(KFI_WEIGHT_ULTRALIGHT);
+ case FC_WEIGHT_LIGHT:
+ return i18n(KFI_WEIGHT_LIGHT);
+ case FC_WEIGHT_NORMAL:
+ return emptyNormal ? QString::null : i18n(KFI_WEIGHT_NORMAL);
+ case FC_WEIGHT_MEDIUM:
+ return i18n(KFI_WEIGHT_MEDIUM);
+ case FC_WEIGHT_DEMIBOLD:
+ return i18n(KFI_WEIGHT_SEMIBOLD);
+ case FC_WEIGHT_BOLD:
+ return i18n(KFI_WEIGHT_BOLD);
+ case FC_WEIGHT_ULTRABOLD:
+ return i18n(KFI_WEIGHT_ULTRABOLD);
+ default:
+ return i18n(KFI_WEIGHT_HEAVY);
+ }
+}
+
+#ifndef KFI_FC_NO_WIDTHS
+QString CFcEngine::widthStr(int width, bool emptyNormal)
+{
+ switch(fcWidth(width))
+ {
+ case FC_WIDTH_ULTRACONDENSED:
+ return i18n(KFI_WIDTH_ULTRACONDENSED);
+ case FC_WIDTH_EXTRACONDENSED:
+ return i18n(KFI_WIDTH_EXTRACONDENSED);
+ case FC_WIDTH_CONDENSED:
+ return i18n(KFI_WIDTH_CONDENSED);
+ case FC_WIDTH_SEMICONDENSED:
+ return i18n(KFI_WIDTH_SEMICONDENSED);
+ case FC_WIDTH_NORMAL:
+ return emptyNormal ? QString::null : i18n(KFI_WIDTH_NORMAL);
+ case FC_WIDTH_SEMIEXPANDED:
+ return i18n(KFI_WIDTH_SEMIEXPANDED);
+ case FC_WIDTH_EXPANDED:
+ return i18n(KFI_WIDTH_EXPANDED);
+ case FC_WIDTH_EXTRAEXPANDED:
+ return i18n(KFI_WIDTH_EXTRAEXPANDED);
+ default:
+ return i18n(KFI_WIDTH_ULTRAEXPANDED);
+ }
+}
+#endif
+
+QString CFcEngine::slantStr(int slant, bool emptyNormal)
+{
+ switch(fcSlant(slant))
+ {
+ case FC_SLANT_OBLIQUE:
+ return i18n(KFI_SLANT_OBLIQUE);
+ case FC_SLANT_ITALIC:
+ return i18n(KFI_SLANT_ITALIC);
+ default:
+ return emptyNormal ? QString::null : i18n(KFI_SLANT_ROMAN);
+ }
+}
+
+QString CFcEngine::spacingStr(int spacing)
+{
+ switch(fcSpacing(spacing))
+ {
+ case FC_MONO:
+ return i18n(KFI_SPACING_MONO);
+ case FC_CHARCELL:
+ return i18n(KFI_SPACING_CHARCELL);
+ default:
+ return i18n(KFI_SPACING_PROPORTIONAL);
+ }
+}
+
+bool CFcEngine::getInfo(const KURL &url, int faceNo, QString &full, QString &family, QString &foundry, QString &weight,
+#ifndef KFI_FC_NO_WIDTHS
+ QString &width,
+#endif
+ QString &spacing, QString &slant)
+{
+ if(parseUrl(url, faceNo, true))
+ {
+ full=itsDescriptiveName;
+ if(url.isLocalFile())
+ {
+ int pos;
+
+ if(-1==(pos=itsDescriptiveName.find(", "))) // No style information...
+ family=itsDescriptiveName;
+ else
+ family=itsDescriptiveName.left(pos);
+ }
+ else
+ family=itsName;
+ weight=weightStr(itsWeight, false);
+#ifndef KFI_FC_NO_WIDTHS
+ width=widthStr(itsWidth, false);
+#endif
+ slant=slantStr(itsSlant, false);
+ spacing=spacingStr(itsSpacing);
+ foundry=itsFoundry;
+ return true;
+ }
+
+ return false;
+}
+
+QFont CFcEngine::getQFont(const QString &name, int size)
+{
+ parseName(name, 0, false);
+
+ QFont font(itsName, size, fcToQtWeight(itsWeight), fcToQtSlant(itsSlant));
+
+#ifndef KFI_FC_NO_WIDTHS
+ font.setStretch(fcToQtWidth(itsWidth));
+#endif
+ return font;
+}
+
+bool CFcEngine::parseUrl(const KURL &url, int faceNo, bool all)
+{
+ FcInitLoadConfigAndFonts();
+
+ // Possible urls:
+ //
+ // fonts:/times.ttf
+ // fonts:/System/times.ttf
+ // file:/home/wibble/hmm.ttf
+ //
+ if(KFI_KIO_FONTS_PROTOCOL==url.protocol())
+ {
+ KIO::UDSEntry udsEntry;
+ QString name;
+
+ FcInitReinitialize();
+ if(KIO::NetAccess::stat(url, udsEntry, NULL)) // Need to stat the url to get its font name...
+ {
+ KIO::UDSEntry::Iterator it(udsEntry.begin()),
+ end(udsEntry.end());
+
+ for( ; it != end; ++it)
+ if (KIO::UDS_NAME==(*it).m_uds)
+ {
+ name=(*it).m_str;
+ break;
+ }
+ }
+
+ if(!name.isEmpty())
+ {
+ parseName(name, faceNo, all);
+ itsInstalled=true;
+ }
+ else
+ return false;
+ }
+ else if(url.isLocalFile())
+ {
+ // Now lets see if its from the thumbnail job! if so, then file will just contain the URL!
+ QFile file(url.path());
+ bool isThumbnailUrl=false;
+
+ if(file.size()<2048 && file.open(IO_ReadOnly)) // Urls should be less than 2k, and fonts usually above!
+ {
+ QString thumbUrl;
+ QTextStream stream(&file);
+
+ thumbUrl=stream.readLine();
+ isThumbnailUrl=0==thumbUrl.find(KFI_KIO_FONTS_PROTOCOL) && parseUrl(KURL(thumbUrl), faceNo, all);
+ file.close();
+ }
+
+ if(!isThumbnailUrl) // Its not a thumbnail, so read the real font file...
+ {
+ itsName=url.path();
+
+ int count;
+ FcPattern *pat=FcFreeTypeQuery((const FcChar8 *)(QFile::encodeName(itsName).data()), 0, NULL, &count);
+
+ itsWeight=FC_WEIGHT_NORMAL;
+#ifndef KFI_FC_NO_WIDTHS
+ itsWidth=FC_WIDTH_NORMAL;
+#endif
+ itsSlant=FC_SLANT_ROMAN;
+ itsSpacing=FC_PROPORTIONAL;
+
+ if(pat)
+ {
+ itsDescriptiveName=createName(pat, faceNo);
+
+ if(all)
+ {
+ FcPatternGetInteger(pat, FC_WEIGHT, faceNo, &itsWeight);
+ FcPatternGetInteger(pat, FC_SLANT, faceNo, &itsSlant);
+#ifndef KFI_FC_NO_WIDTHS
+ FcPatternGetInteger(pat, FC_WIDTH, faceNo, &itsWidth);
+#endif
+ FcPatternGetInteger(pat, FC_SPACING, faceNo, &itsSpacing);
+ itsFoundry=getFcString(pat, FC_FOUNDRY, faceNo);
+ }
+
+ FcPatternDestroy(pat);
+ }
+ else
+ itsDescriptiveName=QString::null;
+
+ itsInstalled=false;
+ itsIndex=faceNo;
+ }
+ }
+ else
+ return false;
+
+ itsLastUrl=url;
+ return true;
+}
+
+void CFcEngine::parseName(const QString &name, int faceNo, bool all)
+{
+ int pos;
+
+ itsDescriptiveName=name;
+ itsSpacing=FC_PROPORTIONAL;
+ if(-1==(pos=name.find(", "))) // No style information...
+ {
+ itsWeight=FC_WEIGHT_NORMAL;
+#ifndef KFI_FC_NO_WIDTHS
+ itsWidth=FC_WIDTH_NORMAL;
+#endif
+ itsSlant=FC_SLANT_ROMAN;
+ itsName=name;
+ }
+ else
+ {
+ QString style(name.mid(pos+2));
+
+ itsWeight=strToWeight(style, style);
+#ifndef KFI_FC_NO_WIDTHS
+ itsWidth=strToWidth(style, style);
+#endif
+ itsSlant=strToSlant(style);
+ itsName=name.left(pos);
+ }
+
+ if(all)
+ {
+ FcObjectSet *os = FcObjectSetBuild(FC_SPACING, FC_FOUNDRY, (void *)0);
+ FcPattern *pat = FcPatternBuild(NULL,
+ FC_FAMILY, FcTypeString, (const FcChar8 *)(itsName.utf8().data()),
+ FC_WEIGHT, FcTypeInteger, itsWeight,
+ FC_SLANT, FcTypeInteger, itsSlant,
+#ifndef KFI_FC_NO_WIDTHS
+ FC_WIDTH, FcTypeInteger, itsWidth,
+#endif
+ NULL);
+ FcFontSet *set = FcFontList(0, pat, os);
+
+ FcPatternDestroy(pat);
+ FcObjectSetDestroy(os);
+
+ if(set && set->nfont)
+ {
+ FcPatternGetInteger(set->fonts[0], FC_SPACING, faceNo, &itsSpacing);
+ itsFoundry=getFcString(set->fonts[0], FC_FOUNDRY, faceNo);
+ }
+ }
+
+ itsIndex=0; // Doesn't matter, as we're gonna use font name!
+ itsLastUrl=KURL();
+}
+
+#ifdef HAVE_XFT
+XftFont * CFcEngine::getFont(int size, QPixmap *pix)
+{
+ if(itsInstalled)
+ return XftFontOpen(KFI_DISPLAY(pix), 0,
+ FC_FAMILY, FcTypeString, (const FcChar8 *)(itsName.utf8().data()),
+ FC_WEIGHT, FcTypeInteger, itsWeight,
+ FC_SLANT, FcTypeInteger, itsSlant,
+#ifndef KFI_FC_NO_WIDTHS
+ FC_WIDTH, FcTypeInteger, itsWidth,
+#endif
+ FC_PIXEL_SIZE, FcTypeDouble, (double)size,
+ NULL);
+ else
+ {
+ FcPattern *pattern = FcPatternBuild(NULL,
+ FC_FILE, FcTypeString, QFile::encodeName(itsName).data(),
+ FC_INDEX, FcTypeInteger, itsIndex,
+ FC_PIXEL_SIZE, FcTypeDouble, (double)size,
+ NULL);
+ return XftFontOpenPattern(KFI_DISPLAY(pix), pattern);
+ }
+}
+
+void CFcEngine::getSizes(QPixmap *pix)
+{
+ static const int constNumSizes=11;
+ static const int constNumSizeRanges=2;
+ static const int constSizes[constNumSizeRanges][constNumSizes]= { {8, 10, 12, 14, 16, 18, 24, 36, 48, 72, 96},
+ {7, 9, 11, 13, 15, 17, 23, 35, 47, 71, 95} };
+ XftFont *f=getFont(8, pix);
+
+ itsScalable=FcTrue;
+
+ itsSizes.clear();
+ itsAlphaSize=0;
+
+ if(f)
+ {
+ bool gotSizes=false;
+
+ if(itsInstalled)
+ {
+ if(FcResultMatch!=FcPatternGetBool(f->pattern, FC_SCALABLE, 0, &itsScalable))
+ itsScalable=FcFalse;
+ }
+ else
+ {
+ FT_Face face=XftLockFace(f);
+
+ if(face)
+ {
+ itsIndexCount=face->num_faces;
+ if(!(itsScalable=FT_IS_SCALABLE(face)))
+ {
+ int numSizes=face->num_fixed_sizes,
+ size;
+
+ gotSizes=true;
+
+ itsSizes.reserve(numSizes);
+
+ for (size=0; size<numSizes; size++)
+ {
+ itsSizes.push_back(face->available_sizes[size].height);
+ if (face->available_sizes[size].height<=constDefaultAlphaSize)
+ itsAlphaSize=face->available_sizes[size].height;
+ }
+ }
+ XftUnlockFace(f);
+ }
+ }
+
+ XftFontClose(KFI_DISPLAY(pix), f);
+
+ //
+ // Hmm... its not a scalable font, and its installed. So to get list of sizes, iterate through a list of standard
+ // sizes, and ask fontconfig for a font of that sizes. Then check the retured size, family, etc is what was asked
+ // for!
+ if(!itsScalable && !gotSizes)
+ {
+ itsSizes.reserve(constNumSizes);
+
+ for(int l=0; l<constNumSizeRanges && !gotSizes; ++l)
+ for(int i=0; i<constNumSizes; ++i)
+ {
+ double px;
+ int iv;
+ FcChar8 *str;
+
+ f=getFont(constSizes[l][i], pix);
+
+ if(f)
+ {
+ if(FcResultMatch==FcPatternGetDouble(f->pattern, FC_PIXEL_SIZE, 0, &px) && equal(constSizes[l][i], px) &&
+ FcResultMatch==FcPatternGetInteger(f->pattern, FC_WEIGHT, 0, &iv) && equalWeight(iv,itsWeight) &&
+ FcResultMatch==FcPatternGetInteger(f->pattern, FC_SLANT, 0, &iv) && equalSlant(iv, itsSlant) &&
+#ifndef KFI_FC_NO_WIDTHS
+ FcResultMatch==FcPatternGetInteger(f->pattern, FC_WIDTH, 0, &iv) && equalWidth(iv, itsWidth) &&
+#endif
+ FcResultMatch==FcPatternGetString(f->pattern, FC_FAMILY, 0, &str) && str &&
+ QString::fromUtf8((char *)str)==itsName)
+ {
+ itsSizes.push_back(constSizes[l][i]);
+ gotSizes=true;
+ if(constSizes[l][i]<=constDefaultAlphaSize)
+ itsAlphaSize=constSizes[l][i];
+ }
+ XftFontClose(KFI_DISPLAY(pix), f);
+ }
+ }
+ }
+ }
+
+ if(itsScalable)
+ {
+ itsSizes.reserve(constNumSizes);
+
+ for (int i=0; constScalableSizes[i]; ++i)
+ itsSizes.push_back(point2Pixel(constScalableSizes[i]));
+ itsAlphaSize=constDefaultAlphaSize;
+ }
+}
+#endif
+
+}
diff --git a/kcontrol/kfontinst/lib/FcEngine.h b/kcontrol/kfontinst/lib/FcEngine.h
new file mode 100644
index 000000000..4a09b8a55
--- /dev/null
+++ b/kcontrol/kfontinst/lib/FcEngine.h
@@ -0,0 +1,118 @@
+#ifndef __FC_ENGINE_H__
+#define __FC_ENGINE_H__
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <qstring.h>
+#include <qvaluevector.h>
+#include <qfont.h>
+#include <kurl.h>
+#include <kdeversion.h>
+#include <fontconfig/fontconfig.h>
+
+#if (FC_VERSION<20200)
+
+#define KFI_FC_NO_WIDTHS
+#define KFI_FC_LIMITED_WEIGHTS
+
+#endif
+
+#ifdef KFI_FC_LIMITED_WEIGHTS
+
+#undef FC_WEIGHT_LIGHT
+#define FC_WEIGHT_THIN 0
+#define FC_WEIGHT_EXTRALIGHT 40
+#define FC_WEIGHT_ULTRALIGHT FC_WEIGHT_EXTRALIGHT
+#define FC_WEIGHT_LIGHT 50
+#define FC_WEIGHT_BOOK 75
+#define FC_WEIGHT_REGULAR 80
+#define FC_WEIGHT_NORMAL FC_WEIGHT_REGULAR
+#define FC_WEIGHT_SEMIBOLD FC_WEIGHT_DEMIBOLD
+#define FC_WEIGHT_EXTRABOLD 205
+#define FC_WEIGHT_ULTRABOLD FC_WEIGHT_EXTRABOLD
+#define FC_WEIGHT_HEAVY FC_WEIGHT_BLACK
+
+#endif
+
+class QPixmap;
+
+#ifdef HAVE_XFT
+typedef struct _XftFont XftFont;
+#endif
+
+namespace KFI
+{
+
+class KDE_EXPORT CFcEngine
+{
+ public:
+
+ CFcEngine();
+ ~CFcEngine();
+
+#ifdef HAVE_XFT
+ bool draw(const KURL &url, int w, int h, QPixmap &pix, int faceNo, bool thumb);
+#endif
+ int getNumIndexes() { return itsIndexCount; } // Only valid after draw has been called!
+ QString getName(const KURL &url, int faceNo=0);
+ bool getInfo(const KURL &url, int faceNo, QString &full, QString &family, QString &foundry, QString &weight,
+#ifndef KFI_FC_NO_WIDTHS
+ QString &width,
+#endif
+ QString &spacing, QString &slant);
+ QFont getQFont(const QString &name, int size);
+
+ const QValueVector<int> & sizes() const { return itsSizes; }
+ int alphaSize() const { return itsAlphaSize; }
+
+ static QString getPreviewString();
+ static void setPreviewString(const QString &str);
+ static QString getUppercaseLetters();
+ static QString getLowercaseLetters();
+ static QString getPunctuation();
+ static QString getFcString(FcPattern *pat, const char *val, int faceNo=0);
+ static QString createName(FcPattern *pat, int faceNo=0);
+ static QString weightStr(int weight, bool emptyNormal=true);
+#ifndef KFI_FC_NO_WIDTHS
+ static QString widthStr(int width, bool emptyNormal=true);
+#endif
+ static QString slantStr(int slant, bool emptyNormal=true);
+ static QString spacingStr(int spacing);
+
+ static const int constScalableSizes[];
+ static const int constDefaultAlphaSize;
+
+ private:
+
+ bool parseUrl(const KURL &url, int faceNo, bool all=false);
+ void parseName(const QString &name, int faceNo, bool all=false);
+#ifdef HAVE_XFT
+ XftFont * getFont(int size, QPixmap *pix=NULL);
+ void getSizes(QPixmap *pix=NULL);
+#endif
+
+ private:
+
+ bool itsInstalled;
+ QString itsName,
+ itsDescriptiveName,
+ itsFoundry;
+ int itsIndex,
+ itsIndexCount,
+ itsWeight,
+#ifndef KFI_FC_NO_WIDTHS
+ itsWidth,
+#endif
+ itsSlant,
+ itsSpacing,
+ itsAlphaSize;
+ QValueVector<int> itsSizes;
+ KURL itsLastUrl;
+ FcBool itsScalable;
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/lib/KfiConstants.h b/kcontrol/kfontinst/lib/KfiConstants.h
new file mode 100644
index 000000000..fa7f6f1a0
--- /dev/null
+++ b/kcontrol/kfontinst/lib/KfiConstants.h
@@ -0,0 +1,73 @@
+#ifndef __KFI_CONSTANTS_H__
+#define __KFI_CONSTANTS_H__
+
+#include <klocale.h>
+
+#define KFI_CATALOGUE "kfontinst"
+
+// io-slave
+#define KFI_KIO_FONTS_PROTOCOL "fonts"
+#define KFI_KIO_FONTS_USER I18N_NOOP("Personal")
+#define KFI_KIO_FONTS_SYS I18N_NOOP("System")
+#define KFI_KIO_NO_CLEAR "?noclear"
+
+// Config
+#define KFI_UI_CFG_FILE KFI_CATALOGUE"uirc"
+#define KFI_CFG_FILE KFI_CATALOGUE"rc"
+#define KFI_ROOT_CFG_DIR "/etc/fonts/"
+#define KFI_ROOT_CFG_FILE KFI_ROOT_CFG_DIR KFI_CFG_FILE
+#define KFI_CFG_X_KEY "ConfigureX"
+#define KFI_CFG_GS_KEY "ConfigureGS"
+#define KFI_DEFAULT_CFG_X true
+#define KFI_DEFAULT_CFG_GS false
+
+// KIO::special
+
+namespace KFI
+{
+
+enum ESpecial
+{
+ SPECIAL_RECONFIG = 0,
+ SPECIAL_RESCAN = 1
+};
+
+}
+
+// Font name...
+#define KFI_WEIGHT_THIN I18N_NOOP("Thin")
+#define KFI_WEIGHT_EXTRALIGHT I18N_NOOP("ExtraLight")
+#define KFI_WEIGHT_ULTRALIGHT I18N_NOOP("UltraLight")
+#define KFI_WEIGHT_LIGHT I18N_NOOP("Light")
+#define KFI_WEIGHT_REGULAR I18N_NOOP("Regular")
+#define KFI_WEIGHT_NORMAL I18N_NOOP("Normal")
+#define KFI_WEIGHT_MEDIUM I18N_NOOP("Medium")
+#define KFI_WEIGHT_DEMIBOLD I18N_NOOP("DemiBold")
+#define KFI_WEIGHT_SEMIBOLD I18N_NOOP("SemiBold")
+#define KFI_WEIGHT_BOLD I18N_NOOP("Bold")
+#define KFI_WEIGHT_EXTRABOLD I18N_NOOP("ExtraBold")
+#define KFI_WEIGHT_ULTRABOLD I18N_NOOP("UltraBold")
+#define KFI_WEIGHT_BLACK I18N_NOOP("Black")
+#define KFI_WEIGHT_HEAVY I18N_NOOP("Heavy")
+
+#define KFI_SLANT_ROMAN I18N_NOOP("Roman")
+#define KFI_SLANT_ITALIC I18N_NOOP("Italic")
+#define KFI_SLANT_OBLIQUE I18N_NOOP("Oblique")
+
+#define KFI_WIDTH_ULTRACONDENSED I18N_NOOP("UltraCondensed")
+#define KFI_WIDTH_EXTRACONDENSED I18N_NOOP("ExtraCondensed")
+#define KFI_WIDTH_CONDENSED I18N_NOOP("Condensed")
+#define KFI_WIDTH_SEMICONDENSED I18N_NOOP("SemiCondensed")
+#define KFI_WIDTH_NORMAL I18N_NOOP("Normal")
+#define KFI_WIDTH_SEMIEXPANDED I18N_NOOP("SemiExpanded")
+#define KFI_WIDTH_EXPANDED I18N_NOOP("Expanded")
+#define KFI_WIDTH_EXTRAEXPANDED I18N_NOOP("ExtraExpanded")
+#define KFI_WIDTH_ULTRAEXPANDED I18N_NOOP("UltraExpanded")
+
+#define KFI_SPACING_MONO I18N_NOOP("Monospaced")
+#define KFI_SPACING_CHARCELL I18N_NOOP("Charcell")
+#define KFI_SPACING_PROPORTIONAL I18N_NOOP("Proportional")
+
+#define KFI_UNKNOWN_FOUNDRY I18N_NOOP("Unknown")
+
+#endif
diff --git a/kcontrol/kfontinst/lib/Makefile.am b/kcontrol/kfontinst/lib/Makefile.am
new file mode 100644
index 000000000..55349b149
--- /dev/null
+++ b/kcontrol/kfontinst/lib/Makefile.am
@@ -0,0 +1,14 @@
+lib_LTLIBRARIES = libkfontinst.la
+
+libkfontinst_la_SOURCES = \
+Misc.cpp \
+FcEngine.cpp
+
+noinst_HEADERS = \
+Misc.h \
+FcEngine.h \
+KfiConstants.h
+
+libkfontinst_la_LIBADD = $(LIB_KDECORE) $(LIBFONTCONFIG_LIBS) $(LIBFREETYPE_LIBS) $(LIB_KIO) $(LIBXFT_LIB)
+libkfontinst_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIBFONTCONFIG_RPATH) $(LIBFREETYPE_RPATH) -no-undefined
+AM_CPPFLAGS= $(all_includes) $(LIBFREETYPE_CFLAGS) $(LIBFONTCONFIG_CFLAGS) -D_LARGEFILE64_SOURCE
diff --git a/kcontrol/kfontinst/lib/Misc.cpp b/kcontrol/kfontinst/lib/Misc.cpp
new file mode 100644
index 000000000..4606ad0ca
--- /dev/null
+++ b/kcontrol/kfontinst/lib/Misc.cpp
@@ -0,0 +1,238 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Namespace : KFI::Misc
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 01/05/2001
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2001, 2002, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include "Misc.h"
+#include <qfile.h>
+#include <kprocess.h>
+#include <kstandarddirs.h>
+#include <klargefile.h>
+#include <kio/netaccess.h>
+#include <unistd.h>
+
+namespace KFI
+{
+
+namespace Misc
+{
+
+QString linkedTo(const QString &i)
+{
+ QString d;
+
+ if(isLink(i))
+ {
+ char buffer[1000];
+ int n=readlink(QFile::encodeName(i), buffer, 1000);
+
+ if(n!=-1)
+ {
+ buffer[n]='\0';
+ d=buffer;
+ }
+ }
+
+ return d;
+}
+
+QString dirSyntax(const QString &d)
+{
+ if(!d.isEmpty())
+ {
+ QString ds(d);
+
+ ds.replace("//", "/");
+
+ int slashPos=ds.findRev('/');
+
+ if(slashPos!=(((int)ds.length())-1))
+ ds.append('/');
+
+ return ds;
+ }
+
+ return d;
+}
+
+QString xDirSyntax(const QString &d)
+{
+ if(!d.isEmpty())
+ {
+ QString ds(d);
+
+ ds.replace("//", "/");
+
+ int slashPos=ds.findRev('/');
+
+ if(slashPos==(((int)ds.length())-1))
+ ds.remove(slashPos, 1);
+ return ds;
+ }
+
+ return d;
+}
+
+QString getDir(const QString &f)
+{
+ QString d(f);
+
+ int slashPos=d.findRev('/');
+
+ if(slashPos!=-1)
+ d.remove(slashPos+1, d.length());
+
+ return dirSyntax(d);
+}
+
+QString getFile(const QString &f)
+{
+ QString d(f);
+
+ int slashPos=d.findRev('/');
+
+ if(slashPos!=-1)
+ d.remove(0, slashPos+1);
+
+ return d;
+}
+
+bool createDir(const QString &dir)
+{
+ //
+ // Clear any umask before dir is created
+ mode_t oldMask=umask(0000);
+ bool status=KStandardDirs::makeDir(dir, DIR_PERMS);
+ // Reset umask
+ ::umask(oldMask);
+ return status;
+}
+
+bool doCmd(const QString &cmd, const QString &p1, const QString &p2, const QString &p3)
+{
+ KProcess proc;
+
+ proc << cmd;
+
+ if(!p1.isEmpty())
+ proc << p1;
+ if(!p2.isEmpty())
+ proc << p2;
+ if(!p3.isEmpty())
+ proc << p3;
+
+ proc.start(KProcess::Block);
+
+ return proc.normalExit() && proc.exitStatus()==0;
+}
+
+QString changeExt(const QString &f, const QString &newExt)
+{
+ QString newStr(f);
+ int dotPos=newStr.findRev('.');
+
+ if(-1==dotPos)
+ newStr+=QChar('.')+newExt;
+ else
+ {
+ newStr.remove(dotPos+1, newStr.length());
+ newStr+=newExt;
+ }
+ return newStr;
+}
+
+void createBackup(const QString &f)
+{
+ const QString constExt(".bak");
+
+ if(!fExists(f+constExt) && fExists(f))
+ doCmd("cp", "-f", f, f+constExt);
+}
+
+//
+// Get a list of files associated with a file, e.g.:
+//
+// File: /home/a/courier.pfa
+//
+// Associated: /home/a/courier.afm /home/a/courier.pfm
+//
+void getAssociatedUrls(const KURL &url, KURL::List &list, bool afmAndPfm, QWidget *widget)
+{
+ const char *afm[]={"afm", "AFM", "Afm", "AFm", "AfM", "aFM", "aFm", "afM", NULL},
+ *pfm[]={"pfm", "PFM", "Pfm", "PFm", "PfM", "pFM", "pFm", "pfM", NULL};
+ bool gotAfm=false,
+ localFile=url.isLocalFile();
+ int e;
+
+ for(e=0; afm[e]; ++e)
+ {
+ KURL statUrl(url);
+ KIO::UDSEntry uds;
+
+ statUrl.setPath(changeExt(url.path(), afm[e]));
+
+ if(localFile ? fExists(statUrl.path()) : KIO::NetAccess::stat(statUrl, uds, widget))
+ {
+ list.append(statUrl);
+ gotAfm=true;
+ break;
+ }
+ }
+
+ if(afmAndPfm || !gotAfm)
+ for(e=0; pfm[e]; ++e)
+ {
+ KURL statUrl(url);
+ KIO::UDSEntry uds;
+
+ statUrl.setPath(changeExt(url.path(), pfm[e]));
+ if(localFile ? fExists(statUrl.path()) : KIO::NetAccess::stat(statUrl, uds, widget))
+ {
+ list.append(statUrl);
+ break;
+ }
+ }
+}
+
+time_t getTimeStamp(const QString &item)
+{
+ KDE_struct_stat info;
+
+ return !item.isEmpty() && 0==KDE_lstat(QFile::encodeName(item), &info) ? info.st_mtime : 0;
+}
+
+
+bool check(const QString &path, unsigned int fmt, bool checkW)
+{
+ KDE_struct_stat info;
+ QCString pathC(QFile::encodeName(path));
+
+ return 0==KDE_lstat(pathC, &info) && (info.st_mode&S_IFMT)==fmt && (!checkW || 0==::access(pathC, W_OK));
+}
+
+}
+
+}
diff --git a/kcontrol/kfontinst/lib/Misc.h b/kcontrol/kfontinst/lib/Misc.h
new file mode 100644
index 000000000..a624f44f9
--- /dev/null
+++ b/kcontrol/kfontinst/lib/Misc.h
@@ -0,0 +1,76 @@
+#ifndef __MISC_H__
+#define __MISC_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Namespace : KFI::Misc
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 01/05/2001
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2001, 2002, 2003
+////////////////////////////////////////////////////////////////////////////////
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <kurl.h>
+
+class QWidget;
+
+namespace KFI
+{
+
+namespace Misc
+{
+ enum EConstants
+ {
+ FILE_PERMS = 0644,
+ DIR_PERMS = 0755
+ };
+
+ extern KDE_EXPORT bool check(const QString &path, unsigned int fmt, bool checkW=false);
+ inline KDE_EXPORT bool fExists(const QString &p) { return check(p, S_IFREG, false); }
+ inline KDE_EXPORT bool dExists(const QString &p) { return check(p, S_IFDIR, false); }
+ inline KDE_EXPORT bool fWritable(const QString &p) { return check(p, S_IFREG, true); }
+ inline KDE_EXPORT bool dWritable(const QString &p) { return check(p, S_IFDIR, true); }
+ inline KDE_EXPORT bool isLink(const QString &i) { return check(i, S_IFLNK, false); }
+ extern KDE_EXPORT QString linkedTo(const QString &i);
+ extern KDE_EXPORT QString dirSyntax(const QString &d); // Has trailing slash: /file/path/
+ extern KDE_EXPORT QString xDirSyntax(const QString &d); // No trailing slash: /file/path
+ inline KDE_EXPORT QString fileSyntax(const QString &f) { return xDirSyntax(f); }
+ extern KDE_EXPORT QString getDir(const QString &f);
+ extern KDE_EXPORT QString getFile(const QString &f);
+ extern KDE_EXPORT bool createDir(const QString &dir);
+ extern KDE_EXPORT QString changeExt(const QString &f, const QString &newExt);
+ extern KDE_EXPORT bool doCmd(const QString &cmd, const QString &p1=QString::null, const QString &p2=QString::null, const QString &p3=QString::null);
+ inline KDE_EXPORT bool root() { return 0==getuid(); }
+ extern KDE_EXPORT void getAssociatedUrls(const KURL &url, KURL::List &list, bool afmAndPfm=true, QWidget *widget=NULL);
+ extern KDE_EXPORT void createBackup(const QString &f);
+ extern KDE_EXPORT time_t getTimeStamp(const QString &item);
+}
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/thumbnail/FontThumbnail.cpp b/kcontrol/kfontinst/thumbnail/FontThumbnail.cpp
new file mode 100644
index 000000000..86794377b
--- /dev/null
+++ b/kcontrol/kfontinst/thumbnail/FontThumbnail.cpp
@@ -0,0 +1,73 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CFontThumbnail
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 02/08/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include "FontThumbnail.h"
+#include "KfiConstants.h"
+#include <qimage.h>
+#include <qbitmap.h>
+#include <qpainter.h>
+#include <kiconloader.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <kurl.h>
+
+extern "C"
+{
+ KDE_EXPORT ThumbCreator *new_creator()
+ {
+ return new KFI::CFontThumbnail;
+ }
+}
+
+namespace KFI
+{
+
+CFontThumbnail::CFontThumbnail()
+{
+ KGlobal::locale()->insertCatalogue(KFI_CATALOGUE);
+}
+
+bool CFontThumbnail::create(const QString &path, int width, int height, QImage &img)
+{
+ QPixmap pix;
+
+ if(itsEngine.draw(KURL(path), width, height, pix, 0, true))
+ {
+ img=pix.convertToImage();
+ return true;
+ }
+
+ return false;
+}
+
+ThumbCreator::Flags CFontThumbnail::flags() const
+{
+ return DrawFrame;
+}
+
+}
diff --git a/kcontrol/kfontinst/thumbnail/FontThumbnail.h b/kcontrol/kfontinst/thumbnail/FontThumbnail.h
new file mode 100644
index 000000000..c2d1294e4
--- /dev/null
+++ b/kcontrol/kfontinst/thumbnail/FontThumbnail.h
@@ -0,0 +1,55 @@
+#ifndef __FONT_THUMBNAIL__H__
+#define __FONT_THUMBNAIL__H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CFontThumbnail
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 02/08/2003
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include <kio/thumbcreator.h>
+#include "FcEngine.h"
+
+namespace KFI
+{
+
+class CFontThumbnail : public ThumbCreator
+{
+ public:
+
+ CFontThumbnail();
+ ~CFontThumbnail() {}
+
+ bool create(const QString &path, int width, int height, QImage &img);
+ Flags flags() const;
+
+ private:
+
+ CFcEngine itsEngine;
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/thumbnail/Makefile.am b/kcontrol/kfontinst/thumbnail/Makefile.am
new file mode 100644
index 000000000..c7608e843
--- /dev/null
+++ b/kcontrol/kfontinst/thumbnail/Makefile.am
@@ -0,0 +1,14 @@
+kde_module_LTLIBRARIES = fontthumbnail.la
+
+fontthumbnail_la_SOURCES = FontThumbnail.cpp
+fontthumbnail_la_LIBADD = $(LIBFREETYPE_LIBS) $(LIB_KDECORE) $(LIB_KIO) ../lib/libkfontinst.la
+fontthumbnail_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIBFREETYPE_RPATH) -module $(KDE_PLUGIN)
+METASOURCES = AUTO
+
+noinst_HEADERS = FontThumbnail.h
+
+kdelnkdir = $(kde_servicesdir)
+
+kde_services_DATA = fontthumbnail.desktop
+
+AM_CPPFLAGS= -I$(srcdir)/../lib -I$(srcdir)/../../fonts $(all_includes) $(LIBFREETYPE_CFLAGS)
diff --git a/kcontrol/kfontinst/thumbnail/fontthumbnail.desktop b/kcontrol/kfontinst/thumbnail/fontthumbnail.desktop
new file mode 100644
index 000000000..cdda5c4d1
--- /dev/null
+++ b/kcontrol/kfontinst/thumbnail/fontthumbnail.desktop
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Name=Font Files
+Name[af]=Skrif tipe Lêers
+Name[ar]=ملفات المحرف
+Name[az]=Yazı Növü Faylları
+Name[be]=Файлы шрыфтоў
+Name[bg]=Файлове с шрифтове
+Name[bn]=ফন্ট ফাইল
+Name[br]=Restroù Nodrezhoù
+Name[bs]=Datoteke sa fontovima
+Name[ca]=Fitxers de lletres
+Name[cs]=Soubory s písmy
+Name[csb]=Lopczi fòntów
+Name[cy]=Ffeiliau Ffont
+Name[da]=Skrifttypefiler
+Name[de]=Schriftdatei
+Name[el]=Αρχεία γραμματοσειρών
+Name[eo]=Tipardosierojn
+Name[es]=Archivos de tipos de letra
+Name[et]=Fondifailid
+Name[eu]=Letra-tipo fitxategiak
+Name[fa]=پروندۀ قلمها
+Name[fi]=Kirjasintiedostot
+Name[fr]=Fichiers de polices
+Name[fy]=Lettertypetriemmen
+Name[ga]=Comhaid Chlófhoirne
+Name[gl]=Ficheiros de Tipografias
+Name[he]=קבצי גופנים
+Name[hi]=फ़ॉन्ट फ़ाइलें
+Name[hr]=Datoteke fontova
+Name[hu]=Betűtípusfájlok
+Name[id]=Berkas Font
+Name[is]=Leturskrár
+Name[it]=File dei tipi di carattere
+Name[ja]=フォントファイル
+Name[ka]=ფონტების ფაილები
+Name[kk]=Қаріп файлдары
+Name[km]=ឯកសារ​ពុម្ពអក្សរ
+Name[ko]=글꼴 파일
+Name[lo]=ຄົ້ນຫາແຟ້ມ
+Name[lt]=Šriftų bylos
+Name[lv]=Fontu faili
+Name[mk]=Датотеки со фонтови
+Name[mn]=Бичгийн файл
+Name[ms]=Fail Fon
+Name[mt]=Fajls tal-fonts
+Name[nb]=Skrifttypefiler
+Name[nds]=Schriftoortdateien
+Name[ne]=फन्ट फाइल
+Name[nl]=Lettertypebestanden
+Name[nn]=Skriftfiler
+Name[nso]=Difaele tsa Fonto
+Name[pa]=ਫੋਂਟ ਫਾਇਲਾਂ
+Name[pl]=Pliki czcionek
+Name[pt]=Ficheiros de Tipos de Letra
+Name[pt_BR]=Arquivos de fonte
+Name[ro]=Fișiere font
+Name[ru]=Файлы шрифтов
+Name[rw]=Amadosiye y'Imyandikire
+Name[se]=Fontafiillat
+Name[sk]=Súbory písiem
+Name[sl]=Datoteke s pisavami
+Name[sr]=Фајлови фонтова
+Name[sr@Latn]=Fajlovi fontova
+Name[sv]=Teckensnittsfiler
+Name[ta]=எழுத்துரு கோப்புகள்
+Name[tg]=Файлҳои ҳарф
+Name[th]=แฟ้มแบบอักษร
+Name[tr]=Yazıtipi Dosyaları
+Name[tt]=Yazu Biremnäre
+Name[uk]=Файли шрифтів
+Name[uz]=Shrift-fayllari
+Name[uz@cyrillic]=Шрифт-файллари
+Name[ven]=Dzifaela dza Fontu
+Name[vi]=Tập tin Phông chữ
+Name[wa]=Fitchîs fontes
+Name[xh]=Iifayile Zohlobo lwamagama
+Name[zh_CN]=字体文件
+Name[zh_TW]=字型檔案
+Name[zu]=Amafayela ohlobo lwamagama
+ServiceTypes=ThumbCreator
+MimeTypes=application/x-font-ttf,application/x-font-type1,application/x-font-bdf,application/x-font-pcf,application/x-font-otf,application/x-font-ttc
+X-KDE-Library=fontthumbnail
+CacheThumbnail=false
diff --git a/kcontrol/kfontinst/viewpart/FontPreview.cpp b/kcontrol/kfontinst/viewpart/FontPreview.cpp
new file mode 100644
index 000000000..ddd8171cb
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/FontPreview.cpp
@@ -0,0 +1,118 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CFontPreview
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 04/11/2001
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2001, 2002, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include "FontPreview.h"
+#include <kapplication.h>
+#include <klocale.h>
+#include <qpainter.h>
+#include <qimage.h>
+#include <stdlib.h>
+
+namespace KFI
+{
+
+CFontPreview::CFontPreview(QWidget *parent, const char *name)
+ : QWidget(parent, name),
+ itsCurrentFace(1),
+ itsLastWidth(0),
+ itsLastHeight(0),
+ itsBgndCol(eraseColor())
+{
+}
+
+void CFontPreview::showFont(const KURL &url)
+{
+ itsCurrentUrl=url;
+ showFace(1);
+}
+
+void CFontPreview::showFace(int face)
+{
+ itsCurrentFace=face;
+ showFont();
+}
+
+void CFontPreview::showFont()
+{
+ itsLastWidth=width();
+ itsLastHeight=height();
+
+ if(!itsCurrentUrl.isEmpty() &&
+ itsEngine.draw(itsCurrentUrl, itsLastWidth, itsLastHeight, itsPixmap, itsCurrentFace-1, false))
+ {
+ setEraseColor(Qt::white);
+ update();
+ emit status(true);
+ }
+ else
+ {
+ QPixmap nullPix;
+
+ setEraseColor(itsBgndCol);
+ itsPixmap=nullPix;
+ update();
+ emit status(false);
+ }
+}
+
+void CFontPreview::paintEvent(QPaintEvent *)
+{
+ QPainter paint(this);
+
+ if(itsPixmap.isNull())
+ {
+ if(!itsCurrentUrl.isEmpty())
+ {
+ paint.setPen(kapp->palette().active().text());
+ paint.drawText(rect(), AlignCenter, i18n(" No preview available"));
+ }
+ }
+ else
+ {
+ static const int constStepSize=16;
+
+ if(abs(width()-itsLastWidth)>constStepSize || abs(height()-itsLastHeight)>constStepSize)
+ showFont();
+ else
+ paint.drawPixmap(0, 0, itsPixmap);
+ }
+}
+
+QSize CFontPreview::sizeHint() const
+{
+ return QSize(132, 132);
+}
+
+QSize CFontPreview::minimumSizeHint() const
+{
+ return QSize(32, 32);
+}
+
+}
+
+#include "FontPreview.moc"
diff --git a/kcontrol/kfontinst/viewpart/FontPreview.h b/kcontrol/kfontinst/viewpart/FontPreview.h
new file mode 100644
index 000000000..673adeb2d
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/FontPreview.h
@@ -0,0 +1,83 @@
+#ifndef __FONT_PREVIEW_H__
+#define __FONT_PREVIEW_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CFontPreview
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 04/11/2001
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2001, 2002, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include <qstring.h>
+#include <qpixmap.h>
+#include <qsize.h>
+#include <qwidget.h>
+#include <qcolor.h>
+#include <kurl.h>
+#include "FcEngine.h"
+
+namespace KFI
+{
+
+class CFontPreview : public QWidget
+{
+ Q_OBJECT
+
+ public:
+
+ CFontPreview(QWidget *parent, const char *name=NULL);
+ virtual ~CFontPreview() {}
+
+ void paintEvent(QPaintEvent *);
+ QSize sizeHint() const;
+ QSize minimumSizeHint() const;
+
+ void showFont(const KURL &url);
+ void showFont();
+
+ CFcEngine & engine() { return itsEngine; }
+
+ public slots:
+
+ void showFace(int face);
+
+ signals:
+
+ void status(bool);
+
+ private:
+
+ CFcEngine itsEngine;
+ QPixmap itsPixmap;
+ KURL itsCurrentUrl;
+ int itsCurrentFace,
+ itsLastWidth,
+ itsLastHeight;
+ QColor itsBgndCol;
+ QString itsFontName;
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/viewpart/FontViewPart.cpp b/kcontrol/kfontinst/viewpart/FontViewPart.cpp
new file mode 100644
index 000000000..aaa3bc5ff
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/FontViewPart.cpp
@@ -0,0 +1,282 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CFontViewPart
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 03/08/2002
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2002, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include "FontViewPart.h"
+#include "FontPreview.h"
+#include "Misc.h"
+#include "KfiConstants.h"
+#include "KfiPrint.h"
+#include <klocale.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qframe.h>
+#include <qfile.h>
+#include <qlabel.h>
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+#include <qvalidator.h>
+#include <qregexp.h>
+#include <qsettings.h>
+#include <qstringlist.h>
+#include <qtimer.h>
+#include <kio/netaccess.h>
+#include <kinstance.h>
+#include <kmessagebox.h>
+#include <knuminput.h>
+#include <kstdaction.h>
+#include <kaction.h>
+#include <kinputdialog.h>
+#include <kdialog.h>
+#include <kprinter.h>
+#include <fontconfig/fontconfig.h>
+
+static KURL getDest(const KURL &url, bool system)
+{
+ return KURL(KFI::Misc::root()
+ ? QString("fonts:/") + url.fileName()
+ : QString("fonts:/") + QString(system ? i18n(KFI_KIO_FONTS_SYS) : i18n(KFI_KIO_FONTS_USER))
+ + QChar('/') + url.fileName());
+}
+
+namespace KFI
+{
+
+CFontViewPart::CFontViewPart(QWidget *parent, const char *name)
+{
+ bool kcm=0==strcmp(name, "kcmfontinst");
+
+ itsFrame=new QFrame(parent, "frame");
+
+ QFrame *previewFrame=new QFrame(itsFrame);
+
+ itsToolsFrame=new QFrame(itsFrame);
+
+ QVBoxLayout *layout=new QVBoxLayout(itsFrame, kcm ? 0 : KDialog::marginHint(), kcm ? 0 : KDialog::spacingHint());
+ QGridLayout *previewLayout=new QGridLayout(previewFrame, 1, 1, 1, 1);
+ QHBoxLayout *toolsLayout=new QHBoxLayout(itsToolsFrame, 0, KDialog::spacingHint());
+
+ itsFrame->setFrameShape(QFrame::NoFrame);
+ itsFrame->setFocusPolicy(QWidget::ClickFocus);
+ itsToolsFrame->setFrameShape(QFrame::NoFrame);
+ previewFrame->setFrameShadow(kcm ? QFrame::Sunken : QFrame::Raised);
+ previewFrame->setFrameShape(QFrame::Panel);
+ setInstance(new KInstance("kfontview"));
+
+ itsPreview=new CFontPreview(previewFrame, "FontViewPart::Preview");
+ itsPreview->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+ itsFaceLabel=new QLabel(i18n("Face:"), itsToolsFrame);
+ itsFaceSelector=new KIntNumInput(1, itsToolsFrame);
+ itsInstallButton=new QPushButton(i18n("Install..."), itsToolsFrame, "button");
+ itsInstallButton->hide();
+ previewLayout->addWidget(itsPreview, 0, 0);
+ layout->addWidget(previewFrame);
+ layout->addWidget(itsToolsFrame);
+ toolsLayout->addWidget(itsFaceLabel);
+ toolsLayout->addWidget(itsFaceSelector);
+ itsFaceLabel->hide();
+ itsFaceSelector->hide();
+ toolsLayout->addItem(new QSpacerItem(5, 5, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum));
+ toolsLayout->addWidget(itsInstallButton);
+ itsToolsFrame->hide();
+ connect(itsPreview, SIGNAL(status(bool)), SLOT(previewStatus(bool)));
+ connect(itsInstallButton, SIGNAL(clicked()), SLOT(install()));
+ connect(itsFaceSelector, SIGNAL(valueChanged(int)), itsPreview, SLOT(showFace(int)));
+
+ itsChangeTextAction=new KAction(i18n("Change Text..."), "text", KShortcut(),
+ this, SLOT(changeText()), actionCollection(), "changeText");
+ itsChangeTextAction->setEnabled(false);
+ itsPrintAction=KStdAction::print(this, SLOT(print()), actionCollection(), "print");
+ itsPrintAction->setEnabled(false);
+
+ setXMLFile("kfontviewpart.rc");
+ setWidget(itsFrame);
+}
+
+bool CFontViewPart::openURL(const KURL &url)
+{
+ if (!url.isValid() || !closeURL())
+ return false;
+
+ if(KFI_KIO_FONTS_PROTOCOL==url.protocol() || url.isLocalFile())
+ {
+ m_url=url;
+ emit started(0);
+ m_file = m_url.path();
+ bool ret=openFile();
+ if (ret)
+ {
+ emit completed();
+ emit setWindowCaption(m_url.prettyURL());
+ }
+ return ret;
+ }
+ else
+ return ReadOnlyPart::openURL(url);
+}
+
+bool CFontViewPart::openFile()
+{
+ // NOTE: Cant do the real open here, as dont seem to be able to use KIO::NetAccess functions during initial start-up.
+ // Bug report 111535 indicates that calling "konqueror <font>" crashes.
+ QTimer::singleShot(0, this, SLOT(timeout()));
+ return true;
+}
+
+void CFontViewPart::timeout()
+{
+ bool showFs=false,
+ isFonts=KFI_KIO_FONTS_PROTOCOL==m_url.protocol();
+
+ itsShowInstallButton=false;
+
+ if(isFonts)
+ FcInitReinitialize();
+ else
+ {
+ KURL destUrl;
+
+ //
+ // Not from fonts:/, so try to see if font is already installed...
+ if(Misc::root())
+ {
+ destUrl=QString("fonts:/")+itsPreview->engine().getName(m_url);
+ itsShowInstallButton=!KIO::NetAccess::exists(destUrl, true, itsFrame->parentWidget());
+ }
+ else
+ {
+ destUrl=QString("fonts:/")+i18n(KFI_KIO_FONTS_SYS)+QChar('/')+itsPreview->engine().getName(m_url);
+ if(KIO::NetAccess::exists(destUrl, true, itsFrame->parentWidget()))
+ itsShowInstallButton=false;
+ else
+ {
+ destUrl=QString("fonts:/")+i18n(KFI_KIO_FONTS_USER)+QChar('/')+itsPreview->engine().getName(m_url);
+ itsShowInstallButton=!KIO::NetAccess::exists(destUrl, true, itsFrame->parentWidget());
+ }
+ }
+ }
+
+ itsPreview->showFont(isFonts ? m_url : m_file);
+
+ if(!isFonts && itsPreview->engine().getNumIndexes()>1)
+ {
+ showFs=true;
+ itsFaceSelector->setRange(1, itsPreview->engine().getNumIndexes(), 1, false);
+ }
+
+ itsFaceLabel->setShown(showFs);
+ itsFaceSelector->setShown(showFs);
+ itsToolsFrame->hide();
+}
+
+void CFontViewPart::previewStatus(bool st)
+{
+ itsInstallButton->setShown(st && itsShowInstallButton);
+ itsToolsFrame->setShown(itsInstallButton->isShown()||itsFaceSelector->isShown());
+ itsChangeTextAction->setEnabled(st);
+ itsPrintAction->setEnabled(st && KFI_KIO_FONTS_PROTOCOL==m_url.protocol());
+}
+
+void CFontViewPart::install()
+{
+ int resp=Misc::root() ? KMessageBox::Yes
+ : KMessageBox::questionYesNoCancel(itsFrame,
+ i18n("Where do you wish to install \"%1\" (%2)?\n"
+ "\"%3\" - only accessible to you, or\n"
+ "\"%4\" - accessible to all (requires administrator "
+ "password)")
+ .arg(itsPreview->engine().getName(m_url))
+ .arg(m_url.fileName())
+ .arg(i18n(KFI_KIO_FONTS_USER))
+ .arg(i18n(KFI_KIO_FONTS_SYS)),
+ i18n("Install"), i18n(KFI_KIO_FONTS_USER),
+ i18n(KFI_KIO_FONTS_SYS));
+
+ if(KMessageBox::Cancel!=resp)
+ {
+ KURL destUrl(getDest(m_url, KMessageBox::No==resp));
+
+ if(KIO::NetAccess::copy(m_url, destUrl, itsFrame->parentWidget()))
+ {
+ //
+ // OK file copied, now look for any AFM or PFM file...
+ KURL::List urls;
+
+ Misc::getAssociatedUrls(m_url, urls);
+
+ if(urls.count())
+ {
+ KURL::List::Iterator it,
+ end=urls.end();
+
+ for(it=urls.begin(); it!=end; ++it)
+ {
+ destUrl=getDest(*it, KMessageBox::No==resp);
+ KIO::NetAccess::copy(*it, destUrl, itsFrame->parentWidget());
+ }
+ }
+
+ KMessageBox::information(itsFrame, i18n("%1:%2 successfully installed.").arg(m_url.protocol())
+ .arg(m_url.path()), i18n("Success"),
+ "FontViewPart_DisplayInstallationSuccess");
+ itsShowInstallButton=false;
+ itsInstallButton->setShown(itsShowInstallButton);
+ }
+ else
+ KMessageBox::error(itsFrame, i18n("Could not install %1:%2").arg(m_url.protocol()).arg(m_url.path()),
+ i18n("Error"));
+ }
+}
+
+void CFontViewPart::changeText()
+{
+ bool status;
+ QRegExpValidator validator(QRegExp(".*"), 0L);
+ QString oldStr(itsPreview->engine().getPreviewString()),
+ newStr(KInputDialog::getText(i18n("Preview String"), i18n("Please enter new string:"),
+ oldStr, &status, itsFrame,
+ "preview string dialog", &validator));
+
+ if(status && newStr!=oldStr)
+ {
+ itsPreview->engine().setPreviewString(newStr);
+ itsPreview->showFont();
+ }
+}
+
+void CFontViewPart::print()
+{
+ QStringList items;
+
+ items.append(itsPreview->engine().getName(m_url));
+
+ Print::printItems(items, 0, itsFrame->parentWidget(), itsPreview->engine());
+}
+
+}
+
+#include "FontViewPart.moc"
diff --git a/kcontrol/kfontinst/viewpart/FontViewPart.h b/kcontrol/kfontinst/viewpart/FontViewPart.h
new file mode 100644
index 000000000..7ffdbb8f4
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/FontViewPart.h
@@ -0,0 +1,85 @@
+#ifndef __FONT_VIEW_PART_H__
+#define __FONT_VIEW_PART_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CFontViewPart
+// Author : Craig Drummond
+// Project : K Font Installer (kfontinst-kcontrol)
+// Creation Date : 03/08/2002
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2002, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include <kparts/part.h>
+
+class QPushButton;
+class QFrame;
+class QLabel;
+class KIntNumInput;
+class KAction;
+class KURL;
+
+namespace KFI
+{
+
+class CFontPreview;
+
+class CFontViewPart : public KParts::ReadOnlyPart
+{
+ Q_OBJECT
+
+ public:
+
+ CFontViewPart(QWidget *parent=0, const char *name=0);
+ virtual ~CFontViewPart() {}
+
+ bool openURL(const KURL &url);
+
+ protected:
+
+ bool openFile();
+
+ private slots:
+
+ void previewStatus(bool st);
+ void timeout();
+ void install();
+ void changeText();
+ void print();
+
+ private:
+
+ CFontPreview *itsPreview;
+ QPushButton *itsInstallButton;
+ QFrame *itsFrame,
+ *itsToolsFrame;
+ QLabel *itsFaceLabel;
+ KIntNumInput *itsFaceSelector;
+ KAction *itsChangeTextAction,
+ *itsPrintAction;
+ bool itsShowInstallButton;
+ int itsFace;
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/viewpart/FontViewPartFactory.cpp b/kcontrol/kfontinst/viewpart/FontViewPartFactory.cpp
new file mode 100644
index 000000000..52783c1a7
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/FontViewPartFactory.cpp
@@ -0,0 +1,86 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CFontViewPartFactory
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 03/08/2002
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2002, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include "FontViewPartFactory.h"
+#include "FontViewPart.h"
+#include <kdebug.h>
+#include <kaboutdata.h>
+#include <kinstance.h>
+#include <assert.h>
+
+extern "C"
+{
+ KDE_EXPORT void* init_libkfontviewpart()
+ {
+ KGlobal::locale()->insertCatalogue("kfontinst");
+ return new KFI::CFontViewPartFactory;
+ }
+}
+
+namespace KFI
+{
+
+KInstance * CFontViewPartFactory::theirInstance=NULL;
+KAboutData * CFontViewPartFactory::theirAbout=NULL;
+
+CFontViewPartFactory::CFontViewPartFactory()
+{
+}
+
+CFontViewPartFactory::~CFontViewPartFactory()
+{
+ delete theirAbout;
+ theirAbout=0L;
+ delete theirInstance;
+ theirInstance=0L;
+}
+
+QObject * CFontViewPartFactory::createObject(QObject *parent, const char *name, const char *, const QStringList &)
+{
+ if(parent && !parent->isWidgetType())
+ {
+ kdDebug() << "CFontViewPartFactory: parent does not inherit QWidget" << endl;
+ return 0L;
+ }
+
+ return new CFontViewPart((QWidget*) parent, name);
+}
+
+KInstance* CFontViewPartFactory::instance()
+{
+ if(!theirInstance)
+ {
+ theirAbout = new KAboutData("fontviewpart", I18N_NOOP("CFontViewPart"), "0.1");
+ theirInstance = new KInstance(theirAbout);
+ }
+ return theirInstance;
+}
+
+}
+
+#include "FontViewPartFactory.moc"
diff --git a/kcontrol/kfontinst/viewpart/FontViewPartFactory.h b/kcontrol/kfontinst/viewpart/FontViewPartFactory.h
new file mode 100644
index 000000000..777d07ebe
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/FontViewPartFactory.h
@@ -0,0 +1,60 @@
+#ifndef __FONT_VIEW_PART_FACTORY_H__
+#define __FONT_VIEW_PART_FACTORY_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CFontViewPartFactory
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 03/08/2002
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2002, 2003, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include <klibloader.h>
+
+class KInstance;
+class KAboutData;
+
+namespace KFI
+{
+
+class CFontViewPartFactory : public KLibFactory
+{
+ Q_OBJECT
+
+ public:
+
+ CFontViewPartFactory();
+ virtual ~CFontViewPartFactory();
+ virtual QObject *createObject(QObject *parent = 0, const char *name = 0, const char *classname = "QObject", const QStringList &args = QStringList());
+
+ static KInstance * instance();
+
+ private:
+
+ static KInstance *theirInstance;
+ static KAboutData *theirAbout;
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/viewpart/FontViewerApp.cpp b/kcontrol/kfontinst/viewpart/FontViewerApp.cpp
new file mode 100644
index 000000000..5ed5cf455
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/FontViewerApp.cpp
@@ -0,0 +1,130 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Names : KFI::CFontViewerApp, KFI::CFontViewerAppMainWindow
+// Author : Craig Drummond
+// Project : K Font Installer (kfontinst-kcontrol)
+// Creation Date : 30/04/2004
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include "FontViewerApp.h"
+#include "KfiConstants.h"
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klibloader.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kfiledialog.h>
+#include <kconfig.h>
+
+#define CFG_GROUP "FontViewer Settings"
+#define CFG_SIZE_KEY "Window Size"
+
+namespace KFI
+{
+
+CFontViewerAppMainWindow::CFontViewerAppMainWindow()
+ : KParts::MainWindow((QWidget *)0L)
+{
+ KLibFactory *factory=KLibLoader::self()->factory("libkfontviewpart");
+
+ if(factory)
+ {
+ KStdAction::open(this, SLOT(fileOpen()), actionCollection());
+ KStdAction::quit(kapp, SLOT(quit()), actionCollection());
+
+ itsPreview=(KParts::ReadOnlyPart *)factory->create(this, "fontvier", "KParts::ReadOnlyPart");
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ KURL openURL;
+
+ if(args->count() > 0)
+ {
+ KURL url(args->url(args->count() - 1));
+
+ if(url.isValid())
+ openURL = url;
+ }
+
+ setCentralWidget(itsPreview->widget());
+ createGUI(itsPreview);
+
+ if(!openURL.isEmpty())
+ itsPreview->openURL(openURL);
+
+ QSize defSize(450, 380);
+ KConfigGroupSaver saver(kapp->config(), CFG_GROUP);
+
+ resize(kapp->config()->readSizeEntry(CFG_SIZE_KEY, &defSize));
+ show();
+ }
+ else
+ exit(0);
+}
+
+CFontViewerAppMainWindow::~CFontViewerAppMainWindow()
+{
+ KConfigGroupSaver saver(kapp->config(), CFG_GROUP);
+ kapp->config()->writeEntry(CFG_SIZE_KEY, size());
+ kapp->config()->sync();
+}
+
+void CFontViewerAppMainWindow::fileOpen()
+{
+ KURL url(KFileDialog::getOpenURL(QString::null, "application/x-font-ttf application/x-font-otf "
+ "application/x-font-ttc application/x-font-type1 "
+ "application/x-font-bdf application/x-font-pcf ",
+ this, i18n("Select Font to View")));
+ if(url.isValid())
+ itsPreview->openURL(url);
+}
+
+CFontViewerApp::CFontViewerApp()
+{
+ KGlobal::locale()->insertCatalogue(KFI_CATALOGUE);
+ setMainWidget(new CFontViewerAppMainWindow());
+}
+
+}
+
+static KCmdLineOptions options[] =
+{
+ { "+[URL]", I18N_NOOP("URL to open"), 0 },
+ KCmdLineLastOption
+};
+
+static KAboutData aboutData("kfontview", I18N_NOOP("Font Viewer"), 0, I18N_NOOP("Simple font viewer"),
+ KAboutData::License_GPL,
+ I18N_NOOP("(c) Craig Drummond, 2004"));
+
+int main(int argc, char **argv)
+{
+ KCmdLineArgs::init(argc, argv, &aboutData);
+ KCmdLineArgs::addCmdLineOptions(options);
+ KFI::CFontViewerApp::addCmdLineOptions();
+
+ KFI::CFontViewerApp app;
+
+ return app.exec();
+}
+
+#include "FontViewerApp.moc"
diff --git a/kcontrol/kfontinst/viewpart/FontViewerApp.h b/kcontrol/kfontinst/viewpart/FontViewerApp.h
new file mode 100644
index 000000000..70543a8f3
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/FontViewerApp.h
@@ -0,0 +1,68 @@
+#ifndef __FONT_VIEWER_APP_H__
+#define __FONT_VIEWER_APP_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Class Name : KFI::CFontViewerApp, KFI::CFontViewAppMainWindow
+// Author : Craig Drummond
+// Project : K Font Installer (kfontinst-kcontrol)
+// Creation Date : 30/04/2004
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2004
+////////////////////////////////////////////////////////////////////////////////
+
+#include <kapplication.h>
+#include <kparts/part.h>
+#include <kparts/mainwindow.h>
+
+namespace KFI
+{
+
+class CFontViewerAppMainWindow : public KParts::MainWindow
+{
+ Q_OBJECT
+
+ public:
+
+ CFontViewerAppMainWindow();
+ virtual ~CFontViewerAppMainWindow();
+
+ public slots:
+
+ void fileOpen();
+
+ private:
+
+ KParts::ReadOnlyPart *itsPreview;
+
+};
+
+class CFontViewerApp : public KApplication
+{
+ public:
+
+ CFontViewerApp();
+ virtual ~CFontViewerApp() {}
+};
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/viewpart/KfiPrint.cpp b/kcontrol/kfontinst/viewpart/KfiPrint.cpp
new file mode 100644
index 000000000..02366922a
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/KfiPrint.cpp
@@ -0,0 +1,193 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Namespace : KFI::Print
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 14/05/2005
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2005
+////////////////////////////////////////////////////////////////////////////////
+
+#include "KfiPrint.h"
+#include "FcEngine.h"
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+#include <qsettings.h>
+#include <qstringlist.h>
+#include <kprinter.h>
+#include <qapplication.h>
+#include <qeventloop.h>
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+namespace KFI
+{
+
+namespace Print
+{
+
+static const int constMarginLineBefore=1;
+static const int constMarginLineAfter=2;
+static const int constMarginFont=4;
+
+inline bool sufficientSpace(int y, int pageHeight, int size)
+{
+ return (y+constMarginFont+size)<pageHeight;
+}
+
+static bool sufficientSpace(int y, int titleFontHeight, const int *sizes, int pageHeight, int size)
+{
+ int required=titleFontHeight+constMarginLineBefore+constMarginLineAfter;
+
+ for(unsigned int s=0; sizes[s]; ++s)
+ {
+ required+=sizes[s];
+ if(sizes[s+1])
+ required+=constMarginFont;
+ }
+
+ if(0==size)
+ required+=(3*(constMarginFont+CFcEngine::constDefaultAlphaSize))+constMarginLineBefore+constMarginLineAfter;
+ return (y+required)<pageHeight;
+}
+
+bool printable(const QString &mime)
+{
+ return "application/x-font-type1"==mime || "application/x-font-ttf"==mime || "application/x-font-otf"==mime ||
+ "application/x-font-ttc"==mime || "application/x-font-ghostscript"==mime;
+}
+
+void printItems(const QStringList &items, int size, QWidget *parent, CFcEngine &engine)
+{
+#ifdef HAVE_LOCALE_H
+ char *oldLocale=setlocale(LC_NUMERIC, "C"),
+#endif
+
+ KPrinter printer;
+
+ printer.setFullPage(true);
+
+ if(printer.setup(parent))
+ {
+ QPainter painter;
+ QFont sans("sans", 12, QFont::Bold);
+ QSettings settings;
+ bool entryExists,
+ embedFonts,
+ set=false;
+ QString str(engine.getPreviewString());
+
+ //
+ // Cehck whether the user has enabled font embedding...
+ embedFonts=settings.readBoolEntry("/qt/embedFonts", false, &entryExists);
+
+ // ...if not, then turn on - we may have installed new fonts, without ghostscript being informed, etc.
+ if(!entryExists || !embedFonts)
+ settings.writeEntry("/qt/embedFonts", true);
+
+ printer.setResolution(72);
+ painter.begin(&printer);
+
+ QPaintDeviceMetrics metrics(painter.device());
+ int margin=(int)((2/2.54)*metrics.logicalDpiY()), // 2 cm margins
+ pageWidth=metrics.width()-(2*margin),
+ pageHeight=metrics.height()-(2*margin),
+ y=margin,
+ oneSize[2]={size, 0};
+ const int *sizes=oneSize;
+ bool firstFont(true);
+
+ if(0==size)
+ sizes=CFcEngine::constScalableSizes;
+
+ painter.setClipping(true);
+ painter.setClipRect(margin, margin, pageWidth, pageHeight);
+
+ QStringList::ConstIterator it(items.begin()),
+ end(items.end());
+
+ for(; it!=end; ++it)
+ {
+ unsigned int s=0;
+
+ painter.setFont(sans);
+ QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput, 0);
+
+ if(!firstFont && !sufficientSpace(y, painter.fontMetrics().height(), sizes, pageHeight, size))
+ {
+ printer.newPage();
+ y=margin;
+ }
+ painter.setFont(sans);
+ y+=painter.fontMetrics().height();
+ painter.drawText(margin, y, *it);
+ y+=constMarginLineBefore;
+ painter.drawLine(margin, y, margin+pageWidth, y);
+ y+=constMarginLineAfter;
+
+ if(0==size)
+ {
+ y+=CFcEngine::constDefaultAlphaSize;
+ painter.setFont(engine.getQFont(*it, CFcEngine::constDefaultAlphaSize));
+ painter.drawText(margin, y, CFcEngine::getLowercaseLetters());
+ y+=constMarginFont+CFcEngine::constDefaultAlphaSize;
+ painter.drawText(margin, y, CFcEngine::getUppercaseLetters());
+ y+=constMarginFont+CFcEngine::constDefaultAlphaSize;
+ painter.drawText(margin, y, CFcEngine::getPunctuation());
+ y+=constMarginFont+constMarginLineBefore;
+ painter.drawLine(margin, y, margin+pageWidth, y);
+ y+=constMarginLineAfter;
+ }
+ for(; sizes[s]; ++s)
+ {
+ y+=sizes[s];
+ painter.setFont(engine.getQFont(*it, sizes[s]));
+ if(sufficientSpace(y, pageHeight, sizes[s]))
+ {
+ painter.drawText(margin, y, str);
+ if(sizes[s+1])
+ y+=constMarginFont;
+ }
+ }
+ firstFont=false;
+ y+=(s<1 || sizes[s-1]<25 ? 14 : 28);
+ }
+
+ painter.end();
+
+ //
+ // Did we change the users font settings? If so, reset to their previous values...
+ if(set)
+ if(entryExists)
+ settings.writeEntry("/qt/embedFonts", false);
+ else
+ settings.removeEntry("/qt/embedFonts");
+ }
+#ifdef HAVE_LOCALE_H
+ if(oldLocale)
+ setlocale(LC_NUMERIC, oldLocale);
+#endif
+}
+
+}
+
+}
diff --git a/kcontrol/kfontinst/viewpart/KfiPrint.h b/kcontrol/kfontinst/viewpart/KfiPrint.h
new file mode 100644
index 000000000..5b927a57a
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/KfiPrint.h
@@ -0,0 +1,49 @@
+#ifndef __PRINT_H__
+#define __PRINT_H__
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Namespace : KFI::Print
+// Author : Craig Drummond
+// Project : K Font Installer
+// Creation Date : 14/05/2005
+// Version : $Revision$ $Date$
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+// (C) Craig Drummond, 2005
+////////////////////////////////////////////////////////////////////////////////
+
+class QStringList;
+class QString;
+class QWidget;
+
+namespace KFI
+{
+
+class CFcEngine;
+
+namespace Print
+{
+extern void printItems(const QStringList &items, int size, QWidget *parent, CFcEngine &engine);
+extern bool printable(const QString &mime);
+}
+
+}
+
+#endif
diff --git a/kcontrol/kfontinst/viewpart/Makefile.am b/kcontrol/kfontinst/viewpart/Makefile.am
new file mode 100644
index 000000000..bfa66c696
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/Makefile.am
@@ -0,0 +1,30 @@
+noinst_LTLIBRARIES = libkfontinstprint.la
+libkfontinstprint_la_SOURCES = KfiPrint.cpp
+libkfontinstprint_la_LDFLAGS = $(all_libraries)
+libkfontinstprint_la_LIBADD = $(LIB_KDEPRINT) ../lib/libkfontinst.la
+
+kde_module_LTLIBRARIES = libkfontviewpart.la
+
+libkfontviewpart_la_SOURCES = FontViewPart.cpp FontViewPartFactory.cpp FontPreview.cpp
+libkfontviewpart_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+libkfontviewpart_la_LIBADD = $(LIB_KPARTS) libkfontinstprint.la ../lib/libkfontinst.la
+
+noinst_HEADERS = FontViewPart.h FontViewPartFactory.h FontPreview.h FontViewerApp.h KfiPrint.h
+
+kde_services_DATA = kfontviewpart.desktop
+
+AM_CPPFLAGS = -I$(srcdir)/../lib -I$(srcdir)/../../fonts $(all_includes) $(LIBFREETYPE_CFLAGS) $(LIBFONTCONFIG_CFLAGS)
+METASOURCES = AUTO
+
+kfontview_LDADD = $(LIB_KPARTS)
+kfontview_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+
+bin_PROGRAMS = kfontview
+xdg_apps_DATA = kfontview.desktop
+
+appdata_DATA = kfontviewpart.rc kfontviewui.rc
+appdatadir = $(kde_datadir)/kfontview
+
+kfontview_SOURCES = FontViewerApp.cpp
+
+
diff --git a/kcontrol/kfontinst/viewpart/kfontview.desktop b/kcontrol/kfontinst/viewpart/kfontview.desktop
new file mode 100644
index 000000000..843213221
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/kfontview.desktop
@@ -0,0 +1,100 @@
+[Desktop Entry]
+Name=KFontView
+Name[be]=Прагляд шрыфтоў
+Name[bn]=কে-ফন্ট-ভিউ
+Name[cs]=Prohlížeč písem
+Name[eo]=Tiparorigardilo
+Name[eu]=KFontWiew
+Name[he]=מציג גופנים
+Name[hi]=के-फ़ॉन्ट-व्यू
+Name[mk]=КФонтПреглед
+Name[nb]=Skriftviser
+Name[nds]=Schriftoortkieker
+Name[ne]=K फन्ट दृश्य
+Name[nn]=Skriftvisar
+Name[rw]=K-IgaragazaImyandikire
+Name[se]=Fontačájeheaddji
+Name[sk]=Prehliadač písiem
+Name[sv]=Kfontview
+Name[tg]=Намоишгари КҲарф
+Name[vi]=Trình xem phông chữ KDE
+Name[wa]=Håyneu di fontes (KFontView)
+Name[zh_CN]=字体预览
+Exec=kfontview %i %u
+Icon=fonts
+X-KDE-StartupNotify=true
+Type=Application
+MimeType=application/x-font-ttf;application/x-font-type1;application/x-font-otf;application/x-font-ttc;application/x-font-pcf;application/x-font-bdf;fonts/package;
+GenericName=Font Viewer
+GenericName[af]=Skriftipe Besigter
+GenericName[ar]=معاين المحرف
+GenericName[be]=Праглядальнік шрыфтоў
+GenericName[bg]=Преглед на шрифтове
+GenericName[bn]=ফন্ট প্রদর্শক
+GenericName[br]=Gweler Nodrezhoù
+GenericName[bs]=Preglednik fontova
+GenericName[ca]=Visor de lletres
+GenericName[cs]=Prohlížeč písem
+GenericName[csb]=Przezérnik fòntów
+GenericName[cy]=Gwelydd Wynebfathau
+GenericName[da]=Skrifttype-fremviser
+GenericName[de]=Schriftartenbetrachter
+GenericName[el]=Προβολέας γραμματοσειρών
+GenericName[eo]=Tipara rigardilo
+GenericName[es]=Visor de tipos de letra
+GenericName[et]=Fontide vaataja
+GenericName[eu]=Letra-tipoen ikusgailua
+GenericName[fa]=مشاهده‌گر قلم
+GenericName[fi]=Kirjasinten näytin
+GenericName[fr]=Afficheur de polices
+GenericName[fy]=Lettertypewerjefte
+GenericName[ga]=Amharcán Clófhoirne
+GenericName[gl]=Visor de Fontes
+GenericName[he]=מציג גופנים
+GenericName[hr]=Preglednik fontova
+GenericName[hu]=Betűtípusböngésző
+GenericName[id]=Penampil Font
+GenericName[is]=Leturskoðari
+GenericName[it]=Visualizzatore di caratteri
+GenericName[ja]=フォントビューア
+GenericName[ka]=პროგრამა ფონტების სანახავად
+GenericName[kk]=Қаріпті қарап-шығу
+GenericName[km]=កម្មវិធី​មើល​ពុម្ពអក្សរ
+GenericName[ko]=글꼴 뷰어
+GenericName[lt]=Šriftų žiūryklė
+GenericName[lv]=Fontu Skatītājs
+GenericName[mk]=Прегледувач на фонтови
+GenericName[ms]=Pemapar Fon
+GenericName[mt]=Werrej tal-fonts
+GenericName[nb]=Skrifttypeviser
+GenericName[nds]=Schriftoortkieker
+GenericName[ne]=फन्ट दर्शक
+GenericName[nl]=Lettertypeweergave
+GenericName[nn]=Skriftvisar
+GenericName[pa]=ਫੋਂਟ ਦਰਸ਼ਕ
+GenericName[pl]=Przeglądarka czcionek
+GenericName[pt]=Visualizador de Tipos de Letra
+GenericName[pt_BR]=Visualizador de fontes
+GenericName[ro]=Vizualizor de fonturi
+GenericName[ru]=Программа просмотра шрифтов
+GenericName[rw]=Ikigaragaza Imyandikire
+GenericName[se]=Fontačájeheaddji
+GenericName[sk]=Prehliadač písiem
+GenericName[sl]=Pregledovalnik pisav
+GenericName[sr]=Приказивач фонтова
+GenericName[sr@Latn]=Prikazivač fontova
+GenericName[sv]=Teckensnittsvisning
+GenericName[tg]=Намоишгари ҳарфҳо
+GenericName[th]=โปรแกรมดูแบบอักษร
+GenericName[tr]=Yazıtipi Görüntüleyici
+GenericName[tt]=Yazu Kürsätkeç
+GenericName[uk]=Переглядач шрифтів
+GenericName[uz]=Shrift koʻruvchi
+GenericName[uz@cyrillic]=Шрифт кўрувчи
+GenericName[vi]=Trình xem Phông chữ
+GenericName[wa]=Håyneu di fontes
+GenericName[zh_CN]=字体查看器
+GenericName[zh_TW]=字型檢視器
+Terminal=false
+InitialPreference=1
+Categories=Qt;KDE;Utility;X-KDE-More;
diff --git a/kcontrol/kfontinst/viewpart/kfontviewpart.desktop b/kcontrol/kfontinst/viewpart/kfontviewpart.desktop
new file mode 100644
index 000000000..e1bcd6933
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/kfontviewpart.desktop
@@ -0,0 +1,86 @@
+[Desktop Entry]
+Name=Font Viewer
+Name[af]=Skriftipe Besigter
+Name[ar]=معاين المحرف
+Name[az]=Yazı Növü Nümayişçisi
+Name[be]=Праглядальнік шрыфтоў
+Name[bg]=Преглед на шрифт
+Name[bn]=ফন্ট প্রদর্শক
+Name[br]=Gweler Nodrezhoù
+Name[bs]=Preglednik fontova
+Name[ca]=Visor de lletres
+Name[cs]=Prohlížeč písem
+Name[csb]=Przezérnik fòntów
+Name[cy]=Gwelydd Ffont
+Name[da]=Skrifttypevisning
+Name[de]=Schriftartenbetrachter
+Name[el]=Προβολέας γραμματοσειρών
+Name[eo]=Tiparorigardilo
+Name[es]=Visor de tipos de letra
+Name[et]=Fontide vaataja
+Name[eu]=Letra-tipo ikustailea
+Name[fa]=مشاهده‌گر قلم
+Name[fi]=Kirjasinten näytin
+Name[fr]=Afficheur de polices
+Name[fy]=Lettertypewerjefteprogramma
+Name[ga]=Amharcán Clófhoirne
+Name[gl]=Visor de Fontes
+Name[he]=מציג גופנים
+Name[hi]=फ़ॉन्ट प्रदर्शक
+Name[hr]=Preglednik fontova
+Name[hu]=A betűtípusok áttekintése
+Name[id]=Penampil Font
+Name[is]=Leturskoðari
+Name[it]=Vista caratteri
+Name[ja]=フォントビューア
+Name[ka]=პროგრამა ფონტების სანახავად
+Name[kk]=Қаріпті қарап-шығу
+Name[km]=កម្មវិធី​មើល​ពុម្ពអក្សរ
+Name[ko]=글꼴 뷰어
+Name[lo]=ມຸມມອງແບບໄອຄອນ
+Name[lt]=Šrifto žiūriklis
+Name[lv]=Fontu Skatītājs
+Name[mk]=Прегледувач на фонтови
+Name[mn]=Бичиг харагч
+Name[ms]=Pemapar Fon
+Name[mt]=Werrej tal-fonts
+Name[nb]=Skrifttypeviser
+Name[nds]=Schriftoortkieker
+Name[ne]=फन्ट दर्शक
+Name[nl]=Lettertypeweergaveprogramma
+Name[nn]=Skriftvisar
+Name[nso]=Molebeledi wa Fonto
+Name[pa]=ਫੋਂਟ ਦਰਸ਼ਕ
+Name[pl]=Przeglądarka czcionek
+Name[pt]=Visualizador do Tipo de Letra
+Name[pt_BR]=Visualizador de Fontes
+Name[ro]=Vizualizor de fonturi
+Name[ru]=Просмотр шрифтов
+Name[rw]=Ikigaragaza Imyandikire
+Name[se]=Fontačájeheaddji
+Name[sk]=Prehliadač písiem
+Name[sl]=Prikazovalnik pisav
+Name[sr]=Приказивач фонтова
+Name[sr@Latn]=Prikazivač fontova
+Name[sv]=Teckensnittsvisning
+Name[ta]=எழுத்துரு காட்சி
+Name[tg]=Намоишгари ҳарф
+Name[th]=โปรแกรมดูแบบอักษร
+Name[tr]=Yazıtipi İzleyici
+Name[tt]=Yazu Kürsätkeç
+Name[uk]=Переглядач шрифтів
+Name[uz]=Shrift koʻruvchi
+Name[uz@cyrillic]=Шрифт кўрувчи
+Name[ven]=Muvhoni wa Fontu
+Name[vi]=Trình xem Phông chữ
+Name[wa]=Håyneu di fontes
+Name[xh]=Imboniselo Yohlobo lwegama
+Name[zh_CN]=字体查看器
+Name[zh_TW]=字型檢視器
+Name[zu]=Umbukisi Wohlobo lwamagama
+MimeType=application/x-font-ttf;application/x-font-type1;application/x-font-otf;application/x-font-ttc;application/x-font-pcf;application/x-font-bdf;fonts/package
+ServiceTypes=KParts/ReadOnlyPart,Browser/View
+X-KDE-Library=libkfontviewpart
+Type=Service
+InitialPreference=1
+Icon=fonts
diff --git a/kcontrol/kfontinst/viewpart/kfontviewpart.rc b/kcontrol/kfontinst/viewpart/kfontviewpart.rc
new file mode 100644
index 000000000..5df54a47c
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/kfontviewpart.rc
@@ -0,0 +1,9 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="kfontviewpart" version="1">
+<ToolBar name="mainToolBar">
+ <text>&amp;Main Toolbar</text>
+ <Action name="print"/>
+ <Action name="changeText"/>
+</ToolBar>
+</kpartgui>
+
diff --git a/kcontrol/kfontinst/viewpart/kfontviewui.rc b/kcontrol/kfontinst/viewpart/kfontviewui.rc
new file mode 100644
index 000000000..f2e4a86fa
--- /dev/null
+++ b/kcontrol/kfontinst/viewpart/kfontviewui.rc
@@ -0,0 +1,4 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="kfontviewui" version="1">
+</kpartgui>
+
diff --git a/kcontrol/kicker/Makefile.am b/kcontrol/kicker/Makefile.am
new file mode 100644
index 000000000..2fa9a2ad9
--- /dev/null
+++ b/kcontrol/kicker/Makefile.am
@@ -0,0 +1,40 @@
+kde_module_LTLIBRARIES = kcm_kicker.la
+
+kcm_kicker_la_SOURCES = positiontab.ui hidingtab.ui lookandfeeltab.ui menutab.ui \
+ positiontab_impl.cpp hidingtab_impl.cpp lookandfeeltab_impl.cpp \
+ menutab_impl.cpp extensionInfo.cpp main.cpp main.skel \
+ advancedOptions.ui advancedDialog.cpp \
+ positionconfig.cpp hidingconfig.cpp menuconfig.cpp lookandfeelconfig.cpp
+
+kcm_kicker_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_kicker_la_LIBADD = $(top_builddir)/kicker/libkicker/libkickermain.la ../background/libbgnd.la $(LIB_KIO) $(LIB_KUTILS)
+AM_CPPFLAGS = -I$(top_srcdir)/kicker/kicker/core -I$(top_srcdir)/kicker/libkicker \
+ -I$(top_builddir)/kicker/libkicker -I$(srcdir)/../background $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = positiontab_impl.h hidingtab_impl.h lookandfeeltab_impl.h menutab_impl.h \
+ extensionInfo.h main.h advancedDialog.h
+
+# Translation of tiles is used by lookandfeeltab_impl.cpp
+# Tile names are transformed to words with title case
+messages: rc.cpp
+ (cd ../../kicker/data/tiles ; ls *_tiny_up.png) | perl -p -e \
+ 's/(.*)_tiny_up\.png/i18n\(\"\u$$1\"\)\;/; s/[_ ]+(.)/ \u$$1/g' >> rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmkicker.pot
+
+xdg_apps_DATA = panel.desktop
+EXTRA_DIST = $(xdg_apps_DATA)
+
+kcmkicker_data3_DATA = kicker_config.desktop \
+ kicker_config_arrangement.desktop kicker_config_hiding.desktop \
+ kicker_config_menus.desktop kicker_config_appearance.desktop
+kcmkicker_data3dir = $(kde_appsdir)/.hidden
+
+install-data-local: uninstall.desktop
+ $(mkinstalldirs) $(DESTDIR)$(kde_appsdir)/Settings/LookNFeel
+ $(INSTALL_DATA) $(srcdir)/uninstall.desktop $(DESTDIR)$(kde_appsdir)/Settings/LookNFeel/panel.desktop
+ $(INSTALL_DATA) $(srcdir)/uninstall.desktop $(DESTDIR)$(kde_appsdir)/Settings/LookNFeel/panel_appearance.desktop
+ $(INSTALL_DATA) $(srcdir)/uninstall.desktop $(DESTDIR)$(xdg_appsdir)/panel_appearance.desktop
+
+extensionInfo.lo: ../../kicker/libkicker/kickerSettings.h
diff --git a/kcontrol/kicker/advancedDialog.cpp b/kcontrol/kicker/advancedDialog.cpp
new file mode 100644
index 000000000..4605cbb09
--- /dev/null
+++ b/kcontrol/kicker/advancedDialog.cpp
@@ -0,0 +1,163 @@
+/*
+ * advancedDialog.cpp
+ *
+ * Copyright (c) 2002 Aaron J. Seigo <aseigo@olympusproject.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qslider.h>
+
+#include <kcolorbutton.h>
+#include <klocale.h>
+
+#include "advancedDialog.h"
+#include "advancedOptions.h"
+#include "main.h"
+
+advancedDialog::advancedDialog(QWidget* parent, const char* name)
+ : KDialogBase(KDialogBase::Plain,
+ i18n("Advanced Options"),
+ Ok|Apply|Cancel,
+ Cancel,
+ parent,
+ name,
+ false, false)
+{
+ connect(this, SIGNAL(applyClicked()),
+ this, SLOT(save()));
+ connect(this, SIGNAL(okClicked()),
+ this, SLOT(save()));
+
+ QFrame* page = plainPage();
+ QVBoxLayout* layout = new QVBoxLayout(page);
+ m_advancedWidget = new advancedKickerOptions(page);
+ layout->addWidget(m_advancedWidget);
+ layout->addStretch();
+
+ setMinimumSize( sizeHint() );
+
+ connect(m_advancedWidget->handles, SIGNAL(clicked(int)),
+ this, SLOT(changed()));
+ connect(m_advancedWidget->hideButtonSize, SIGNAL(valueChanged(int)),
+ this, SLOT(changed()));
+ connect(m_advancedWidget->tintColorB, SIGNAL(clicked()),
+ this, SLOT(changed()));
+ connect(m_advancedWidget->tintSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(changed()));
+ connect(m_advancedWidget->menubarPanelTransparent, SIGNAL(clicked()),
+ this, SLOT(changed()));
+ load();
+}
+
+advancedDialog::~advancedDialog()
+{
+}
+
+void advancedDialog::load()
+{
+ KConfig c(KickerConfig::the()->configName(), false, false);
+ c.setGroup("General");
+
+ bool fadedOut = c.readBoolEntry("FadeOutAppletHandles", true);
+ bool hideHandles = c.readBoolEntry("HideAppletHandles", false);
+ if (hideHandles)
+ m_advancedWidget->hideHandles->setChecked(true);
+ else if (fadedOut)
+ m_advancedWidget->fadeOutHandles->setChecked(true);
+ else
+ m_advancedWidget->visibleHandles->setChecked(true);
+
+ int defaultHideButtonSize = c.readNumEntry("HideButtonSize", 14);
+ m_advancedWidget->hideButtonSize->setValue(defaultHideButtonSize);
+ QColor color = c.readColorEntry( "TintColor", &colorGroup().mid() );
+ m_advancedWidget->tintColorB->setColor( color );
+ int tintValue = c.readNumEntry( "TintValue", 33 );
+ m_advancedWidget->tintSlider->setValue( tintValue );
+
+ bool transparentMenubarPanel = c.readBoolEntry("MenubarPanelTransparent", false);
+ m_advancedWidget->menubarPanelTransparent->setChecked( transparentMenubarPanel );
+
+ enableButtonApply(false);
+}
+
+void advancedDialog::save()
+{
+ KConfig c(KickerConfig::the()->configName(), false, false);
+
+ c.setGroup("General");
+ c.writeEntry("FadeOutAppletHandles",
+ m_advancedWidget->fadeOutHandles->isChecked());
+ c.writeEntry("HideAppletHandles",
+ m_advancedWidget->hideHandles->isChecked());
+ c.writeEntry("HideButtonSize",
+ m_advancedWidget->hideButtonSize->value());
+ c.writeEntry("TintColor",
+ m_advancedWidget->tintColorB->color());
+ c.writeEntry("TintValue",
+ m_advancedWidget->tintSlider->value());
+ c.writeEntry("MenubarPanelTransparent",
+ m_advancedWidget->menubarPanelTransparent->isChecked());
+
+ QStringList elist = c.readListEntry("Extensions2");
+ for (QStringList::Iterator it = elist.begin(); it != elist.end(); ++it)
+ {
+ // extension id
+ QString group(*it);
+
+ // is there a config group for this extension?
+ if(!c.hasGroup(group) ||
+ group.contains("Extension") < 1)
+ {
+ continue;
+ }
+
+ // set config group
+ c.setGroup(group);
+ KConfig extConfig(c.readEntry("ConfigFile"));
+ extConfig.setGroup("General");
+ extConfig.writeEntry("FadeOutAppletHandles",
+ m_advancedWidget->fadeOutHandles->isChecked());
+ extConfig.writeEntry("HideAppletHandles",
+ m_advancedWidget->hideHandles->isChecked());
+ extConfig.writeEntry("HideButtonSize",
+ m_advancedWidget->hideButtonSize->value());
+ extConfig.writeEntry("TintColor",
+ m_advancedWidget->tintColorB->color());
+ extConfig.writeEntry("TintValue",
+ m_advancedWidget->tintSlider->value());
+ extConfig.writeEntry("MenubarPanelTransparent",
+ m_advancedWidget->menubarPanelTransparent->isChecked());
+
+ extConfig.sync();
+ }
+
+ c.sync();
+
+ KickerConfig::the()->notifyKicker();
+ enableButtonApply(false);
+}
+
+void advancedDialog::changed()
+{
+ enableButtonApply(true);
+}
+
+#include "advancedDialog.moc"
+
diff --git a/kcontrol/kicker/advancedDialog.h b/kcontrol/kicker/advancedDialog.h
new file mode 100644
index 000000000..bbbcdd109
--- /dev/null
+++ b/kcontrol/kicker/advancedDialog.h
@@ -0,0 +1,44 @@
+/*
+ * advancedDialog.h
+ *
+ * Copyright (c) 2002 Aaron J. Seigo <aseigo@olympusproject.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#ifndef __ADVANCEDDIALOG_H
+#define __ADVANCEDDIALOG_H
+
+#include <kdialogbase.h>
+
+class advancedKickerOptions;
+
+class advancedDialog : public KDialogBase
+{
+ Q_OBJECT
+
+ public:
+ advancedDialog(QWidget* parent, const char* name);
+ ~advancedDialog();
+
+ protected slots:
+ void load();
+ void save();
+ void changed();
+
+ protected:
+ advancedKickerOptions* m_advancedWidget;
+};
+
+#endif
diff --git a/kcontrol/kicker/advancedOptions.ui b/kcontrol/kicker/advancedOptions.ui
new file mode 100644
index 000000000..215ef7e8b
--- /dev/null
+++ b/kcontrol/kicker/advancedOptions.ui
@@ -0,0 +1,321 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>advancedKickerOptions</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>advancedKickerOptions</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>324</width>
+ <height>235</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Panel Dimensions</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Hide button size:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>hideButtonSize</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This setting defines how large the panel hide buttons will be if they are visible.</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>hideButtonSize</cstring>
+ </property>
+ <property name="suffix">
+ <string> pixels</string>
+ </property>
+ <property name="maxValue">
+ <number>24</number>
+ </property>
+ <property name="minValue">
+ <number>3</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This setting defines how large the panel hide buttons will be if they are visible.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>101</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>handles</cstring>
+ </property>
+ <property name="title">
+ <string>Applet Handles</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>visibleHandles</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Visible</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+&lt;p&gt;Select this option to always show the Applet Handles.&lt;/p&gt;
+&lt;p&gt;Applet Handles let you move, remove and configure applets in the panel.&lt;/p&gt;
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>fadeOutHandles</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Fade out</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+&lt;p&gt;Select this option to make Applet Handles visible only on mouse hover.&lt;/p&gt;
+&lt;p&gt;Applet Handles let you move, remove and configure applets in the panel.&lt;/p&gt;
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>hideHandles</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Hide</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+&lt;p&gt;&lt;p&gt;Select this option to always hide the Applet Handles. Beware that this option can disable removing, moving or configuring some applets.&lt;/p&gt;
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Transparency</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KColorButton" row="0" column="1">
+ <property name="name">
+ <cstring>tintColorB</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click on this button to set the color to use when tinting transparent panels.</string>
+ </property>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="2" column="1">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Min</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignLeft</set>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Use this slider to set how much transparent panels should be tinted using the tint color.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>81</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSlider" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>tintSlider</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Use this slider to set how much transparent panels should be tinted using the tint color.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="2">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Max</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Use this slider to set how much transparent panels should be tinted using the tint color.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Ti&amp;nt amount:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>tintSlider</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Use this slider to set how much transparent panels should be tinted using the tint color.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Tint c&amp;olor:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>tintColorB</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click on this button to set the color to use when tinting transparent panels.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>menubarPanelTransparent</cstring>
+ </property>
+ <property name="text">
+ <string>Also apply to panel with menu bar</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Normally if you have the desktop's or current application's menu bar displayed in a panel at the top of the screen (MacOS-style), transparency is disabled for this panel to avoid the desktop background clashing with the menu bar. Set this option to make it transparent anyways.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>hideButtonSize</tabstop>
+ <tabstop>visibleHandles</tabstop>
+ <tabstop>fadeOutHandles</tabstop>
+ <tabstop>hideHandles</tabstop>
+ <tabstop>tintColorB</tabstop>
+ <tabstop>tintSlider</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in declaration">knuminput.h</include>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/kicker/applettab.ui b/kcontrol/kicker/applettab.ui
new file mode 100644
index 000000000..6ebfa2c88
--- /dev/null
+++ b/kcontrol/kicker/applettab.ui
@@ -0,0 +1,227 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>AppletTabBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>AppletTabBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>732</width>
+ <height>764</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>level_group</cstring>
+ </property>
+ <property name="title">
+ <string>Security Level</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>trusted_rb</cstring>
+ </property>
+ <property name="text">
+ <string>Load only trusted applets internal</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>new_rb</cstring>
+ </property>
+ <property name="text">
+ <string>Load startup config applets internal</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>all_rb</cstring>
+ </property>
+ <property name="text">
+ <string>Load all applets internal</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>list_group</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="title">
+ <string>List of Trusted Applets</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Available Applets</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>lb_available</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout12</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>pb_add</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&gt;&gt;</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>pb_remove</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&lt;&lt;</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Trusted Applets</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>lb_trusted</cstring>
+ </property>
+ <property name="resizePolicy">
+ <enum>AutoOneFit</enum>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>qwidget.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/kicker/applettab_impl.cpp b/kcontrol/kicker/applettab_impl.cpp
new file mode 100644
index 000000000..700dbd9ca
--- /dev/null
+++ b/kcontrol/kicker/applettab_impl.cpp
@@ -0,0 +1,239 @@
+/*
+ * applettab.cpp
+ *
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qvbuttongroup.h>
+#include <qwhatsthis.h>
+#include <qradiobutton.h>
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+#include <qvbox.h>
+#include <qfileinfo.h>
+
+#include <kconfig.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kdialog.h>
+#include <kstandarddirs.h>
+#include <klistview.h>
+#include <kdebug.h>
+
+#include "applettab_impl.h"
+#include "applettab_impl.moc"
+
+AppletTab::AppletTab( QWidget *parent, const char* name )
+ : AppletTabBase (parent, name)
+{
+
+ connect(level_group, SIGNAL(clicked(int)), SLOT(level_changed(int)));
+
+ connect(lb_trusted, SIGNAL(selectionChanged(QListViewItem*)),
+ SLOT(trusted_selection_changed(QListViewItem*)));
+
+ connect(pb_add, SIGNAL(clicked()), SLOT(add_clicked()));
+ connect(pb_remove, SIGNAL(clicked()), SLOT(remove_clicked()));
+
+ connect(lb_available, SIGNAL(selectionChanged(QListViewItem*)),
+ SLOT(available_selection_changed(QListViewItem*)));
+
+ pb_add->setEnabled(false);
+ pb_remove->setEnabled(false);
+
+ QWhatsThis::add( level_group, i18n("Panel applets can be started in two different ways:"
+ " internally or externally. While 'internally' is the preferred way to load applets, this can"
+ " raise stability or security problems when you are using poorly-programmed third-party applets."
+ " To address these problems, applets can be marked 'trusted'. You might want to configure"
+ " Kicker to treat trusted applets differently to untrusted ones; your options are:"
+ " <ul><li><em>Load only trusted applets internally:</em> All applets but the ones marked 'trusted'"
+ " will be loaded using an external wrapper application.</li>"
+ " <li><em>Load startup config applets internally:</em> The applets shown on KDE startup"
+ " will be loaded internally, others will be loaded using an external wrapper application.</li>"
+ " <li><em>Load all applets internally</em></li></ul>") );
+
+ QWhatsThis::add( lb_trusted, i18n("Here you can see a list of applets that are marked"
+ " 'trusted', i.e. will be loaded internally by Kicker in any case. To move an applet"
+ " from the list of available applets to the trusted ones, or vice versa, select it and"
+ " press the left or right buttons.") );
+
+ QWhatsThis::add( pb_add, i18n("Click here to add the selected applet from the list of available,"
+ " untrusted applets to the list of trusted applets.") );
+
+ QWhatsThis::add( pb_remove, i18n("Click here to remove the selected applet from the list of trusted"
+ " applets to the list of available, untrusted applets.") );
+
+ QWhatsThis::add( lb_available, i18n("Here you can see a list of available applets that you"
+ " currently do not trust. This does not mean you cannot use those applets, but rather that"
+ " the panel's policy using them depends on your applet security level. To move an applet"
+ " from the list of available applets to the trusted ones or vice versa, select it and"
+ " press the left or right buttons.") );
+
+ load();
+}
+
+void AppletTab::load()
+{
+ load( false );
+}
+
+void AppletTab::load( bool useDefaults )
+{
+ KConfig c(KickerConfig::the()->configName(), false, false);
+ c.setReadDefaults( useDefaults );
+ c.setGroup("General");
+
+ available.clear();
+ l_available.clear();
+ l_trusted.clear();
+
+ int level = c.readNumEntry("SecurityLevel", 1);
+
+ switch(level)
+ {
+ case 0:
+ default:
+ trusted_rb->setChecked(true);
+ break;
+ case 1:
+ new_rb->setChecked(true);
+ break;
+ case 2:
+ all_rb->setChecked(true);
+ break;
+ }
+
+ list_group->setEnabled(trusted_rb->isChecked());
+
+ QStringList list = KGlobal::dirs()->findAllResources("applets", "*.desktop");
+ for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
+ {
+ QFileInfo fi(*it);
+ available << fi.baseName();
+ }
+
+ if(c.hasKey("TrustedApplets"))
+ {
+ QStringList list = c.readListEntry("TrustedApplets");
+ for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
+ {
+ if(available.contains(*it))
+ l_trusted << (*it);
+ }
+ }
+ else
+ l_trusted << "clockapplet" << "ksystemtrayapplet" << "krunapplet" << "quicklauncher"
+ << "kminipagerapplet" << "ktaskbarapplet" << "eyesapplet" << "kmixapplet";
+
+ for ( QStringList::Iterator it = available.begin(); it != available.end(); ++it )
+ {
+ if(!l_trusted.contains(*it))
+ l_available << (*it);
+ }
+
+ updateTrusted();
+ updateAvailable();
+ emit changed( useDefaults );
+}
+
+void AppletTab::save()
+{
+ KConfig c(KickerConfig::the()->configName(), false, false);
+ c.setGroup("General");
+
+ int level = 0;
+ if(new_rb->isChecked()) level = 1;
+ else if (all_rb->isChecked()) level = 2;
+
+ c.writeEntry("SecurityLevel", level);
+ c.writeEntry("TrustedApplets", l_trusted);
+ c.sync();
+}
+
+void AppletTab::defaults()
+{
+ load( true );
+}
+
+QString AppletTab::quickHelp() const
+{
+ return QString::null;
+}
+
+void AppletTab::level_changed(int)
+{
+ list_group->setEnabled(trusted_rb->isChecked());
+ setChanged();
+}
+
+void AppletTab::updateTrusted()
+{
+ lb_trusted->clear();
+ for ( QStringList::Iterator it = l_trusted.begin(); it != l_trusted.end(); ++it )
+ (void) new QListViewItem(lb_trusted, (*it));
+}
+
+void AppletTab::updateAvailable()
+{
+ lb_available->clear();
+ for ( QStringList::Iterator it = l_available.begin(); it != l_available.end(); ++it )
+ (void) new QListViewItem(lb_available, (*it));
+}
+
+void AppletTab::trusted_selection_changed(QListViewItem * item)
+{
+ pb_remove->setEnabled(item != 0);
+ setChanged();
+}
+
+void AppletTab::available_selection_changed(QListViewItem * item)
+{
+ pb_add->setEnabled(item != 0);
+ setChanged();
+}
+
+void AppletTab::add_clicked()
+{
+ QListViewItem *item = lb_available->selectedItem();
+ if (!item) return;
+ l_available.remove(item->text(0));
+ l_trusted.append(item->text(0));
+
+ updateTrusted();
+ updateAvailable();
+ updateAddRemoveButton();
+}
+
+void AppletTab::remove_clicked()
+{
+ QListViewItem *item = lb_trusted->selectedItem();
+ if (!item) return;
+ l_trusted.remove(item->text(0));
+ l_available.append(item->text(0));
+
+ updateTrusted();
+ updateAvailable();
+ updateAddRemoveButton();
+}
+
+
+void AppletTab::updateAddRemoveButton()
+{
+ pb_remove->setEnabled(l_trusted.count ()>0);
+ pb_add->setEnabled(l_available.count()>0);
+}
diff --git a/kcontrol/kicker/applettab_impl.h b/kcontrol/kicker/applettab_impl.h
new file mode 100644
index 000000000..76c071c1a
--- /dev/null
+++ b/kcontrol/kicker/applettab_impl.h
@@ -0,0 +1,68 @@
+/*
+ * applettab.h
+ *
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+
+#ifndef __applettab_impl_h__
+#define __applettab_impl_h__
+
+#include <qwidget.h>
+#include "applettab.h"
+
+class QGroupBox;
+class QButtonGroup;
+class QRadioButton;
+class QPushButton;
+class KListView;
+class QListViewItem;
+
+class AppletTab : public AppletTabBase
+{
+ Q_OBJECT
+
+ public:
+ AppletTab( QWidget *parent=0, const char* name=0 );
+
+ void load();
+ void load(bool useDefaults);
+ void save();
+ void defaults();
+
+ QString quickHelp() const;
+
+ signals:
+ void changed();
+
+ protected slots:
+ void level_changed(int level);
+ void trusted_selection_changed(QListViewItem *);
+ void available_selection_changed(QListViewItem *);
+ void add_clicked();
+ void remove_clicked();
+
+ protected:
+ void updateTrusted();
+ void updateAvailable();
+ void updateAddRemoveButton();
+
+ private:
+ QStringList available, l_available, l_trusted;
+};
+
+#endif
+
diff --git a/kcontrol/kicker/extensionInfo.cpp b/kcontrol/kicker/extensionInfo.cpp
new file mode 100644
index 000000000..54ce23937
--- /dev/null
+++ b/kcontrol/kicker/extensionInfo.cpp
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 2001 John Firebaugh <jfirebaugh@kde.org>
+ * Copyright (c) 2002 Aaron J. Seigo <aseigo@olympusproject.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <qapplication.h>
+
+#include <kdebug.h>
+#include <kdesktopfile.h>
+#include <klocale.h>
+
+#include "extensionInfo.h"
+
+
+ExtensionInfo::ExtensionInfo(const QString& desktopFile,
+ const QString& configFile,
+ const QString& configPath)
+ : _configFile(configFile),
+ _configPath(configPath),
+ _desktopFile(desktopFile)
+{
+ load();
+}
+
+void ExtensionInfo::load()
+{
+ setDefaults();
+
+ kdDebug() << "loading defaults for " << _desktopFile << endl;
+ if (_desktopFile.isNull())
+ {
+ _name = i18n("Main Panel");
+ _resizeable = true;
+ _useStdSizes = true;
+ _customSizeMin = 24;
+ _customSizeMax = 256;
+ _customSize = 56;
+ _showLeftHB = false;
+ _showRightHB = true;
+ for (int i=0;i<4;i++) _allowedPosition[i]=true;
+ }
+ else
+ {
+ KDesktopFile df(_desktopFile);
+ _name = df.readName();
+ _resizeable = df.readBoolEntry("X-KDE-PanelExt-Resizeable", _resizeable);
+
+ if (_resizeable)
+ {
+ _useStdSizes = df.readBoolEntry("X-KDE-PanelExt-StdSizes", _useStdSizes);
+ _size = df.readNumEntry("X-KDE-PanelExt-StdSizeDefault", _size);
+ _customSizeMin = df.readNumEntry("X-KDE-PanelExt-CustomSizeMin", _customSizeMin);
+ _customSizeMax = df.readNumEntry("X-KDE-PanelExt-CustomSizeMax", _customSizeMax);
+ _customSize = df.readNumEntry("X-KDE-PanelExt-CustomSizeDefault", _customSize);
+ }
+
+ for (int i = 0; i < 4; i++)
+ {
+ _allowedPosition[i]=false;
+ }
+
+ kdDebug()<<"BEFORE X-KDE-PanelExt-Positions parsing"<<endl;
+ QStringList allowedPos;
+ allowedPos << "BOTTOM" << "TOP" << "LEFT" << "RIGHT" << "BOTTOM";
+ allowedPos= df.readListEntry("X-KDE-PanelExt-Positions", allowedPos);
+
+ for (unsigned int i=0;i<allowedPos.count();i++)
+ {
+ QString pos = allowedPos[i].upper();
+ kdDebug() << pos << endl;
+ if (pos == "LEFT")
+ {
+ if (i == 0)
+ {
+ _position = KPanelExtension::Left;
+ }
+ _allowedPosition[KPanelExtension::Left] = true;
+ }
+ else if (pos == "RIGHT")
+ {
+ if (i == 0)
+ {
+ _position = KPanelExtension::Right;
+ }
+ _allowedPosition[KPanelExtension::Right]=true;
+ }
+ else if (pos =="TOP")
+ {
+ if (i == 0)
+ {
+ _position = KPanelExtension::Top;
+ }
+ _allowedPosition[KPanelExtension::Top]=true;
+ }
+ else if (pos == "BOTTOM")
+ {
+ if (i == 0)
+ {
+ _position = KPanelExtension::Bottom;
+ }
+ _allowedPosition[KPanelExtension::Bottom]=true;
+ }
+ }
+ }
+
+ // sanitize
+ if (_customSizeMin < 0) _customSizeMin = 0;
+ if (_customSizeMax < _customSizeMin) _customSizeMax = _customSizeMin;
+ if (_customSize < _customSizeMin) _customSize = _customSizeMin;
+
+ KConfig c(_configFile);
+ c.setGroup("General");
+
+ _position = c.readNumEntry ("Position", _position);
+ _alignment = c.readNumEntry ("Alignment", _alignment);
+ _xineramaScreen = c.readNumEntry ("XineramaScreen", _xineramaScreen);
+ _showLeftHB = c.readBoolEntry("ShowLeftHideButton", _showLeftHB);
+ _showRightHB = c.readBoolEntry("ShowRightHideButton", _showRightHB);
+ _hideButtonSize = c.readNumEntry ("HideButtonSize", _hideButtonSize);
+ _autohidePanel = c.readBoolEntry("AutoHidePanel", _autohidePanel);
+ _backgroundHide = c.readBoolEntry("BackgroundHide", _backgroundHide);
+ _autoHideSwitch = c.readBoolEntry("AutoHideSwitch", _autoHideSwitch);
+ _autoHideDelay = c.readNumEntry ("AutoHideDelay", _autoHideDelay);
+ _hideAnim = c.readBoolEntry("HideAnimation", _hideAnim);
+ _hideAnimSpeed = c.readNumEntry ("HideAnimationSpeed", _hideAnimSpeed);
+ _unhideLocation = c.readNumEntry ("UnhideLocation", _unhideLocation);
+ _sizePercentage = c.readNumEntry ("SizePercentage", _sizePercentage);
+ _expandSize = c.readBoolEntry("ExpandSize", _expandSize);
+
+ if (_resizeable)
+ {
+ _size = c.readNumEntry ("Size", _size);
+ _customSize = c.readNumEntry ("CustomSize", _customSize);
+ }
+
+ _orig_position = _position;
+ _orig_alignment = _alignment;
+ _orig_size = _size;
+ _orig_customSize = _customSize;
+
+ // sanitize
+ if (_sizePercentage < 1) _sizePercentage = 1;
+ if (_sizePercentage > 100) _sizePercentage = 100;
+}
+
+void ExtensionInfo::configChanged()
+{
+ KConfig c(_configFile);
+ c.setGroup("General");
+
+ // check to see if the new value is different from both
+ // the original value and the currently set value, then it
+ // must be a newly set value, external to the panel!
+ int position = c.readNumEntry ("Position", 3);
+ if (position != _position && position != _orig_position)
+ {
+ _orig_position = _position = position;
+ }
+
+ int alignment = c.readNumEntry ("Alignment", QApplication::reverseLayout() ? 2 : 0);
+ if (alignment != _alignment && alignment != _orig_alignment)
+ {
+ _orig_alignment = _alignment = alignment;
+ }
+
+ if (_resizeable)
+ {
+ int size = c.readNumEntry ("Size", 2);
+ if (size != _size && size != _orig_size)
+ {
+ _orig_size = _size = size;
+ }
+
+ int customSize = c.readNumEntry ("CustomSize", 0);
+ if (customSize != _customSize && customSize != _orig_customSize)
+ {
+ _orig_customSize = _customSize = customSize;
+ }
+
+ }
+}
+
+void ExtensionInfo::setDefaults()
+{
+ // defaults
+ _position = 3;
+ _alignment = QApplication::reverseLayout() ? 2 : 0;
+ _xineramaScreen = QApplication::desktop()->primaryScreen();
+ _size = 2;
+ _showLeftHB = false;
+ _showRightHB = true;
+ _hideButtonSize = 14;
+ _autohidePanel = false;
+ _backgroundHide = false;
+ _autoHideSwitch = false;
+ _autoHideDelay = 3;
+ _hideAnim = true;
+ _hideAnimSpeed = 40;
+ _unhideLocation = 0;
+ _sizePercentage = 100;
+ _expandSize = true;
+ _customSize = 0;
+ _resizeable = false;
+ _useStdSizes = false;
+ _customSizeMin = 0;
+ _customSizeMax = 0;
+}
+
+void ExtensionInfo::save()
+{
+ KConfig c(_configFile);
+ c.setGroup("General");
+
+ c.writeEntry("Position", _position);
+ c.writeEntry("Alignment", _alignment);
+ c.writeEntry("XineramaScreen", _xineramaScreen);
+ c.writeEntry("ShowLeftHideButton", _showLeftHB);
+ c.writeEntry("ShowRightHideButton", _showRightHB);
+ c.writeEntry("AutoHidePanel", _autohidePanel);
+ c.writeEntry("BackgroundHide", _backgroundHide);
+ c.writeEntry("AutoHideSwitch", _autoHideSwitch);
+ c.writeEntry("AutoHideDelay", _autoHideDelay);
+ c.writeEntry("HideAnimation", _hideAnim);
+ c.writeEntry("HideAnimationSpeed", _hideAnimSpeed);
+ c.writeEntry("UnhideLocation", _unhideLocation);
+ c.writeEntry("SizePercentage", _sizePercentage );
+ c.writeEntry("ExpandSize", _expandSize );
+
+ // FIXME: this is set only for the main panel and only in the
+ // look 'n feel (aka appearance) tab. so we can't save it here
+ // this should be implemented properly. - AJS
+ //c.writeEntry("HideButtonSize", _hideButtonSize);
+
+ if (_resizeable)
+ {
+ c.writeEntry("Size", _size);
+ c.writeEntry("CustomSize", _customSize);
+ }
+
+ _orig_position = _position;
+ _orig_alignment = _alignment;
+ _orig_size = _size;
+ _orig_customSize = _customSize;
+
+ c.sync();
+}
diff --git a/kcontrol/kicker/extensionInfo.h b/kcontrol/kicker/extensionInfo.h
new file mode 100644
index 000000000..a8885c651
--- /dev/null
+++ b/kcontrol/kicker/extensionInfo.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2001 John Firebaugh <jfirebaugh@kde.org>
+ * Copyright (c) 2002 Aaron J. Seigo <aseigo@olympusproject.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#ifndef __PANELINFO_H
+#define __PANELINFO_H
+
+#include <qvaluelist.h>
+#include <qlistview.h>
+#include <kpanelextension.h>
+
+class ExtensionInfo;
+
+typedef QValueList<ExtensionInfo*> ExtensionInfoList;
+
+class ExtensionInfo
+{
+ public:
+ ExtensionInfo(const QString& destopFile,
+ const QString& configFile,
+ const QString& configPath);
+ ~ExtensionInfo() {};
+
+ void setDefaults();
+ void save();
+ void load();
+ void configChanged();
+
+ QString _configFile;
+ QString _configPath;
+ QString _desktopFile;
+
+ // Configuration settings
+ QString _name;
+ int _position;
+ int _alignment;
+ int _xineramaScreen;
+ int _size;
+ int _customSize;
+ bool _showLeftHB;
+ bool _showRightHB;
+ int _hideButtonSize;
+ bool _autohidePanel;
+ bool _backgroundHide;
+ bool _autoHideSwitch;
+ int _autoHideDelay;
+ bool _hideAnim;
+ int _hideAnimSpeed;
+ int _unhideLocation;
+ int _sizePercentage;
+ bool _expandSize;
+
+ // Original settings to ensure that we can figure out
+ // what has changed externally to the panel vs within the panel
+ int _orig_position;
+ int _orig_alignment;
+ int _orig_size;
+ int _orig_customSize;
+
+ // Size info
+ bool _resizeable;
+ bool _useStdSizes;
+ int _customSizeMin;
+ int _customSizeMax;
+
+ // position handling
+ bool _allowedPosition[4];
+};
+
+#endif
+
diff --git a/kcontrol/kicker/hidingconfig.cpp b/kcontrol/kicker/hidingconfig.cpp
new file mode 100644
index 000000000..95899d9dc
--- /dev/null
+++ b/kcontrol/kicker/hidingconfig.cpp
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2005 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ */
+
+#include <qlayout.h>
+#include <qtimer.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include "hidingtab_impl.h"
+#include "kickerSettings.h"
+#include "main.h"
+
+#include "hidingconfig.h"
+#include "hidingconfig.moc"
+
+HidingConfig::HidingConfig(QWidget *parent, const char *name)
+ : KCModule(parent, name)
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ m_widget = new HidingTab(this);
+ layout->addWidget(m_widget);
+ layout->addStretch();
+
+ setQuickHelp(KickerConfig::the()->quickHelp());
+ setAboutData(KickerConfig::the()->aboutData());
+
+ //addConfig(KickerSettings::self(), m_widget);
+
+ connect(m_widget, SIGNAL(changed()),
+ this, SLOT(changed()));
+ connect(KickerConfig::the(), SIGNAL(aboutToNotifyKicker()),
+ this, SLOT(aboutToNotifyKicker()));
+
+ load();
+ QTimer::singleShot(0, this, SLOT(notChanged()));
+}
+
+void HidingConfig::notChanged()
+{
+ emit changed(false);
+}
+
+void HidingConfig::load()
+{
+ m_widget->load();
+ KCModule::load();
+}
+
+void HidingConfig::aboutToNotifyKicker()
+{
+ kdDebug() << "HidingConfig::aboutToNotifyKicker()" << endl;
+
+ // This slot is triggered by the signal,
+ // which is send before Kicker is notified.
+ // See comment in save().
+ m_widget->save();
+ KCModule::save();
+}
+
+void HidingConfig::save()
+{
+ // As we don't want to notify Kicker multiple times
+ // we do not save the settings here. Instead the
+ // KickerConfig object sends a signal before the
+ // notification. On this signal all existing modules,
+ // including this object, save their settings.
+ KickerConfig::the()->notifyKicker();
+}
+
+void HidingConfig::defaults()
+{
+ m_widget->defaults();
+ KCModule::defaults();
+
+ // KConfigDialogManager may queue an changed(false) signal,
+ // so we make sure, that the module is labeled as changed,
+ // while we manage some of the widgets ourselves
+ QTimer::singleShot(0, this, SLOT(changed()));
+}
diff --git a/kcontrol/kicker/hidingconfig.h b/kcontrol/kicker/hidingconfig.h
new file mode 100644
index 000000000..c5b3d66a8
--- /dev/null
+++ b/kcontrol/kicker/hidingconfig.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2005 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ */
+
+#ifndef __hidingconfig_h__
+#define __hidingconfig_h__
+
+#include <kcmodule.h>
+
+class HidingTab;
+
+class HidingConfig : public KCModule
+{
+ Q_OBJECT
+
+public:
+ HidingConfig(QWidget *parent = 0, const char *name = 0);
+
+ void load();
+ void save();
+ void defaults();
+
+public slots:
+ void notChanged();
+ void aboutToNotifyKicker();
+
+private:
+ HidingTab *m_widget;
+};
+
+#endif // __hidingconfig_h__
diff --git a/kcontrol/kicker/hidingtab.ui b/kcontrol/kicker/hidingtab.ui
new file mode 100644
index 000000000..8d7b0b254
--- /dev/null
+++ b/kcontrol/kicker/hidingtab.ui
@@ -0,0 +1,761 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>HidingTabBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>HidingTabBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>694</width>
+ <height>472</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>m_panelsGroupBox</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_panelListLabel</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;ettings for:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_panelList</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>m_panelList</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>342</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>m_modeGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Hide Mode</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>Spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QRadioButton" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_manual</cstring>
+ </property>
+ <property name="text">
+ <string>On&amp;ly hide when a panel-hiding button is clicked</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is selected, the only way to hide the panel will be to click on the hide buttons that appear on either end of it.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>m_delaySpinBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="maxValue">
+ <number>10</number>
+ </property>
+ <property name="suffix">
+ <string> sec</string>
+ </property>
+ <property name="specialValueText">
+ <string>Immediately</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can change the delay after which the panel will disappear if not used.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>DelayLabel_2_3_2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>after the &amp;cursor leaves the panel</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_delaySpinBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can change the delay after which the panel will disappear if not used.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer10</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QRadioButton" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_background</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Allow other &amp;windows to cover the panel</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is selected, the panel will allow itself to be covered by other windows.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_automatic</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Hide a&amp;utomatically</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is selected, the panel will automatically hide after a period of time and reappear when you move the mouse to the screen edge where the panel is hidden. This is particularly useful for small screen resolutions, such as on laptops.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="6" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_backgroundRaise</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Raise when the pointer touches the screen's:</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected, moving the pointer to the specified edge of the screen will cause the panel to appear on top of any windows that may be covering it.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Top Left Corner</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Top Edge</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Top Right Corner</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Right Edge</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Bottom Right Corner</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Bottom Edge</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Bottom Left Corner</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Left Edge</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_backgroundPos</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can set the location on the screen's edge that will bring the panel to the front.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer23</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="5" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_autoHideSwitch</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Show panel when switching &amp;desktops</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is enabled, the panel will automatically show itself for a brief period of time when the desktop is switched so you can see which desktop you are on.</string>
+ </property>
+ </widget>
+ <spacer row="4" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>50</width>
+ <height>10</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>m_manualGroup</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Panel-Hiding Buttons</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This option controls the panel-hiding buttons, which are buttons with a small triangle found at the ends of the panel. You can place a button at either end of the panel, or both. Clicking on one of these buttons will hide the panel.</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>m_lHB</cstring>
+ </property>
+ <property name="text">
+ <string>Show left panel-hiding bu&amp;tton</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected, a panel-hiding button appears on the left end of the panel.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>m_rHB</cstring>
+ </property>
+ <property name="text">
+ <string>Show right panel-hiding &amp;button</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected, a panel-hiding button appears on the right end of the panel.</string>
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>Spacer17</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>m_manualGroup_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Panel Animation</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>Spacer18</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_animateHiding</cstring>
+ </property>
+ <property name="text">
+ <string>A&amp;nimate panel hiding</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected the panel will "slide" off the screen when hiding. The speed of the animation is controlled by the slider directly below.</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>Spacer6_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSlider" row="0" column="0" rowspan="1" colspan="5">
+ <property name="name">
+ <cstring>m_hideSlider</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="maxValue">
+ <number>10</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>10</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>NoMarks</enum>
+ </property>
+ <property name="tickInterval">
+ <number>1</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Determines how quickly the panel hides if hiding animation is enabled.</string>
+ </property>
+ </widget>
+ <spacer row="1" column="3">
+ <property name="name">
+ <cstring>Spacer3_2_2_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="1" column="4">
+ <property name="name">
+ <cstring>TextLabel4_2_2_2_3</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Fast</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>Spacer3_3_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="1" column="2">
+ <property name="name">
+ <cstring>TextLabel5_2_2_2_3</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Medium</string>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel3_2_2_3_3</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Slow</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>m_automatic</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>DelayLabel_2_3_2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_automatic</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_autoHideSwitch</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_background</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_backgroundRaise</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_animateHiding</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>TextLabel3_2_2_3_3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_animateHiding</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>TextLabel5_2_2_2_3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_animateHiding</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>TextLabel4_2_2_2_3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_animateHiding</sender>
+ <signal>clicked()</signal>
+ <receiver>m_hideSlider</receiver>
+ <slot>setFocus()</slot>
+ </connection>
+ <connection>
+ <sender>m_animateHiding</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_hideSlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_backgroundRaise</sender>
+ <signal>clicked()</signal>
+ <receiver>m_backgroundPos</receiver>
+ <slot>setFocus()</slot>
+ </connection>
+ <connection>
+ <sender>m_backgroundRaise</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_backgroundPos</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_automatic</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_delaySpinBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_panelList</sender>
+ <signal>activated(int)</signal>
+ <receiver>HidingTabBase</receiver>
+ <slot>switchPanel(int)</slot>
+ </connection>
+ <connection>
+ <sender>m_automatic</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_backgroundRaise</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_background</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_autoHideSwitch</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>m_manual</tabstop>
+ <tabstop>m_delaySpinBox</tabstop>
+ <tabstop>m_autoHideSwitch</tabstop>
+ <tabstop>m_backgroundRaise</tabstop>
+ <tabstop>m_backgroundPos</tabstop>
+ <tabstop>m_lHB</tabstop>
+ <tabstop>m_rHB</tabstop>
+ <tabstop>m_animateHiding</tabstop>
+ <tabstop>m_hideSlider</tabstop>
+ <tabstop>m_automatic</tabstop>
+ <tabstop>m_background</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in declaration">klineedit.h</include>
+ <include location="global" impldecl="in implementation">knuminput.h</include>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot specifier="pure virtual">switchPanel(int)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/kicker/hidingtab_impl.cpp b/kcontrol/kicker/hidingtab_impl.cpp
new file mode 100644
index 000000000..e637b71c0
--- /dev/null
+++ b/kcontrol/kicker/hidingtab_impl.cpp
@@ -0,0 +1,280 @@
+/*
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ * Copyright (c) 2002 Aaron Seigo <aseigo@olympusproject.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qradiobutton.h>
+#include <qslider.h>
+
+#include <kcombobox.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <knuminput.h>
+
+#include "main.h"
+#include "positiontab_impl.h"
+
+#include "hidingtab_impl.h"
+#include "hidingtab_impl.moc"
+
+
+HidingTab::HidingTab(QWidget *parent, const char* name)
+ : HidingTabBase(parent, name),
+ m_panelInfo(0)
+{
+ // connections
+ connect(m_manual,SIGNAL(toggled(bool)), SIGNAL(changed()));
+ connect(m_automatic, SIGNAL(toggled(bool)), SIGNAL(changed()));
+ connect(m_automatic, SIGNAL(toggled(bool)), SLOT(backgroundModeClicked()));
+ connect(m_background,SIGNAL(toggled(bool)), SIGNAL(changed()));
+ connect(m_background, SIGNAL(toggled(bool)), SLOT(backgroundModeClicked()));
+ connect(m_hideSlider, SIGNAL(valueChanged(int)), SIGNAL(changed()));
+ connect(m_delaySpinBox, SIGNAL(valueChanged(int)), SIGNAL(changed()));
+ connect(m_animateHiding, SIGNAL(toggled(bool)), SIGNAL(changed()));
+ connect(m_delaySpinBox, SIGNAL(valueChanged(int)), SIGNAL(changed()));
+ connect(m_autoHideSwitch, SIGNAL(toggled(bool)), SIGNAL(changed()));
+ connect(m_backgroundRaise, SIGNAL(toggled(bool)), SIGNAL(changed()));
+ connect(m_backgroundPos, SIGNAL(activated(int)), SIGNAL(changed()));
+ connect(m_lHB, SIGNAL(toggled(bool)), SIGNAL(changed()));
+ connect(m_rHB, SIGNAL(toggled(bool)), SIGNAL(changed()));
+
+ connect(KickerConfig::the(), SIGNAL(extensionInfoChanged()),
+ SLOT(infoUpdated()));
+ connect(KickerConfig::the(), SIGNAL(extensionAdded(ExtensionInfo*)),
+ SLOT(extensionAdded(ExtensionInfo*)));
+ connect(KickerConfig::the(), SIGNAL(extensionRemoved(ExtensionInfo*)),
+ SLOT(extensionRemoved(ExtensionInfo*)));
+ // position tab tells hiding tab about extension selections and vice versa
+ connect(KickerConfig::the(), SIGNAL(positionPanelChanged(int)),
+ SLOT(switchPanel(int)));
+ connect(m_panelList, SIGNAL(activated(int)),
+ KickerConfig::the(), SIGNAL(hidingPanelChanged(int)));
+}
+
+void HidingTab::load()
+{
+ KickerConfig::the()->populateExtensionInfoList(m_panelList);
+ m_panelsGroupBox->setHidden(m_panelList->count() < 2);
+
+ switchPanel(KickerConfig::the()->currentPanelIndex());
+}
+
+void HidingTab::extensionAdded(ExtensionInfo* info)
+{
+ m_panelList->insertItem(info->_name);
+ m_panelsGroupBox->setHidden(m_panelList->count() < 2);
+}
+
+void HidingTab::extensionRemoved(ExtensionInfo* info)
+{
+ int count = m_panelList->count();
+ int extensionCount = KickerConfig::the()->extensionsInfo().count();
+ int index = 0;
+ for (; index < count && index < extensionCount; ++index)
+ {
+ if (KickerConfig::the()->extensionsInfo()[index] == info)
+ {
+ break;
+ }
+ }
+
+ bool isCurrentlySelected = index == m_panelList->currentItem();
+ m_panelList->removeItem(index);
+ m_panelsGroupBox->setHidden(m_panelList->count() < 2);
+
+ if (isCurrentlySelected)
+ {
+ m_panelList->setCurrentItem(0);
+ }
+}
+
+void HidingTab::switchPanel(int panelItem)
+{
+ blockSignals(true);
+ ExtensionInfo* panelInfo = (KickerConfig::the()->extensionsInfo())[panelItem];
+
+ if (!panelInfo)
+ {
+ m_panelList->setCurrentItem(0);
+ panelInfo = (KickerConfig::the()->extensionsInfo())[panelItem];
+
+ if (!panelInfo)
+ {
+ return;
+ }
+ }
+
+ if (m_panelInfo)
+ {
+ storeInfo();
+ }
+
+ m_panelList->setCurrentItem(panelItem);
+
+ m_panelInfo = panelInfo;
+
+ if(m_panelInfo->_autohidePanel)
+ {
+ m_automatic->setChecked(true);
+ }
+ else if(m_panelInfo->_backgroundHide)
+ {
+ m_background->setChecked(true);
+ }
+ else
+ {
+ m_manual->setChecked(true);
+ }
+
+ m_delaySpinBox->setValue(m_panelInfo->_autoHideDelay);
+ m_autoHideSwitch->setChecked(m_panelInfo->_autoHideSwitch);
+
+ m_lHB->setChecked( m_panelInfo->_showLeftHB );
+ m_rHB->setChecked( m_panelInfo->_showRightHB );
+
+ m_animateHiding->setChecked(m_panelInfo->_hideAnim);
+ m_hideSlider->setValue(m_panelInfo->_hideAnimSpeed/10);
+
+ if (m_panelInfo->_unhideLocation > 0)
+ {
+ m_backgroundRaise->setChecked(true);
+ m_backgroundPos->setCurrentItem(triggerConfigToCombo(m_panelInfo->_unhideLocation));
+ }
+ else
+ {
+ m_backgroundRaise->setChecked(false);
+ }
+
+ panelPositionChanged(m_panelInfo->_position);
+
+ backgroundModeClicked();
+ blockSignals(false);
+}
+
+void HidingTab::save()
+{
+ storeInfo();
+ KickerConfig::the()->saveExtentionInfo();
+}
+
+void HidingTab::storeInfo()
+{
+ if (!m_panelInfo)
+ {
+ return;
+ }
+
+ m_panelInfo->_autohidePanel = m_automatic->isChecked();
+ m_panelInfo->_backgroundHide = m_background->isChecked();
+
+ m_panelInfo->_showLeftHB = m_lHB->isChecked();
+ m_panelInfo->_showRightHB = m_rHB->isChecked();
+ m_panelInfo->_hideAnim = m_animateHiding->isChecked();
+ m_panelInfo->_hideAnimSpeed = m_hideSlider->value() * 10;
+
+ m_panelInfo->_autoHideDelay = m_delaySpinBox->value();
+ m_panelInfo->_autoHideSwitch = m_autoHideSwitch->isChecked();
+
+ m_panelInfo->_unhideLocation = m_backgroundRaise->isChecked() ?
+ triggerComboToConfig(m_backgroundPos->currentItem()) : 0;
+}
+
+void HidingTab::defaults()
+{
+ m_manual->setChecked( true );
+ m_delaySpinBox->setValue( 3 );
+ m_autoHideSwitch->setChecked( false );
+ m_lHB->setChecked( false );
+ m_rHB->setChecked( true );
+ m_animateHiding->setChecked( true );
+ m_hideSlider->setValue( 10 );
+ m_delaySpinBox->setValue( 3 );
+ m_backgroundPos->setCurrentItem( triggerConfigToCombo( BottomLeft ) );
+ m_backgroundRaise->setChecked( false );
+}
+
+void HidingTab::panelPositionChanged(int position)
+{
+ if (position == PositionTab::PosTop ||
+ position == PositionTab::PosBottom)
+ {
+ m_lHB->setText(i18n("Show left panel-hiding bu&tton"));
+ m_rHB->setText(i18n("Show right panel-hiding bu&tton"));
+ }
+ else
+ {
+ m_lHB->setText(i18n("Show top panel-hiding bu&tton"));
+ m_rHB->setText(i18n("Show bottom panel-hiding bu&tton"));
+ }
+}
+
+int HidingTab::triggerComboToConfig(int trigger)
+{
+ if (trigger == 0)
+ return TopLeft;
+ else if (trigger == 1)
+ return Top;
+ else if (trigger == 2)
+ return TopRight;
+ else if (trigger == 3)
+ return Right;
+ else if (trigger == 4)
+ return BottomRight;
+ else if (trigger == 5)
+ return Bottom;
+ else if (trigger == 6)
+ return BottomLeft;
+ else if (trigger == 7)
+ return Left;
+
+ return 0;
+}
+
+int HidingTab::triggerConfigToCombo(int trigger)
+{
+ if (trigger == TopLeft)
+ return 0;
+ else if (trigger == Top)
+ return 1;
+ else if (trigger == TopRight)
+ return 2;
+ else if (trigger == Right)
+ return 3;
+ else if (trigger == BottomRight)
+ return 4;
+ else if (trigger == Bottom)
+ return 5;
+ else if (trigger == BottomLeft)
+ return 6;
+ else if (trigger == Left)
+ return 7;
+
+ return 0;
+}
+
+void HidingTab::backgroundModeClicked()
+{
+ m_backgroundPos->setEnabled((m_automatic->isChecked() ||
+ m_background->isChecked()) &&
+ m_backgroundRaise->isChecked());
+}
+
+void HidingTab::infoUpdated()
+{
+ switchPanel(0);
+}
diff --git a/kcontrol/kicker/hidingtab_impl.h b/kcontrol/kicker/hidingtab_impl.h
new file mode 100644
index 000000000..69e39dea0
--- /dev/null
+++ b/kcontrol/kicker/hidingtab_impl.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ * Copyright (c) 2002 Aaron Seigo <aseigo@olympusproject.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#ifndef __hidingtab_impl_h__
+#define __hidingtab_impl_h__
+
+#include "hidingtab.h"
+
+class KickerConfig;
+class ExtensionInfo;
+
+class HidingTab : public HidingTabBase
+{
+ Q_OBJECT
+
+public:
+ HidingTab(QWidget *parent = 0, const char* name = 0);
+
+ void load();
+ void save();
+ void defaults();
+
+signals:
+ void changed();
+
+public slots:
+ void panelPositionChanged(int);
+
+protected slots:
+ void backgroundModeClicked();
+ void infoUpdated();
+ void storeInfo();
+ void extensionAdded(ExtensionInfo*);
+ void extensionRemoved(ExtensionInfo*);
+ void switchPanel(int);
+
+private:
+ enum Trigger { None = 0, Top, TopRight, Right, BottomRight, Bottom, BottomLeft, Left, TopLeft };
+
+ // these convert between the combobox and the config file for trigger
+ // this is why storing enums vs strings can be a BAD thing
+ int triggerComboToConfig(int trigger);
+ int triggerConfigToCombo(int trigger);
+
+ KickerConfig* m_kcm;
+ ExtensionInfo* m_panelInfo;
+};
+
+#endif
diff --git a/kcontrol/kicker/kicker_config.desktop b/kcontrol/kicker/kicker_config.desktop
new file mode 100644
index 000000000..85dab37e9
--- /dev/null
+++ b/kcontrol/kicker/kicker_config.desktop
@@ -0,0 +1,223 @@
+[Desktop Entry]
+Icon=kcmkicker
+Type=Application
+DocPath=kcontrol/panel/index.html
+Exec=kcmshell panel
+
+
+X-KDE-Library=kicker
+X-KDE-FactoryName=kicker
+X-KDE-ParentApp=kicker
+
+Name=Layout
+Name[af]=Uitleg
+Name[ar]=التصميم
+Name[az]=Düzülüş
+Name[be]=Расклад
+Name[bg]=Системен панел
+Name[bn]=বিন্যাস
+Name[br]=Doare
+Name[bs]=Izgled
+Name[ca]=Disposició
+Name[cs]=Rozvržení
+Name[csb]=Ùstôw
+Name[cy]=Cynllun
+Name[el]=Διάταξη
+Name[eo]=Aranĝo
+Name[es]=Disposición
+Name[et]=Paigutus
+Name[eu]=Diseinua
+Name[fa]=طرح‌بندی
+Name[fi]=Ulkonäkö
+Name[fr]=Disposition
+Name[fy]=Untwerp
+Name[ga]=Leagan Amach
+Name[gl]=Disposición
+Name[he]=סידור
+Name[hi]=ले-आउट
+Name[hr]=Raspored
+Name[hu]=Elrendezés
+Name[id]=Tata Letak
+Name[is]=Útlit
+Name[it]=Aspetto
+Name[ja]=配置
+Name[ka]=განლაგება
+Name[kk]=Орналасу
+Name[km]=ប្លង់
+Name[lo]=ລັອກເອົ້າ
+Name[lt]=Pavidalas
+Name[lv]=Izkārtojums
+Name[mk]=Распоред
+Name[ms]=Bentangan
+Name[mt]=Tqassim
+Name[nb]=Utseende
+Name[ne]=सजावट
+Name[nl]=Opmaak
+Name[nn]=Utsjånad
+Name[nso]=Peakanyo
+Name[pa]=ਖਾਕਾ
+Name[pl]=Układ
+Name[pt]=Disposição
+Name[ro]=Format
+Name[ru]=Расположение
+Name[rw]=Imboneko
+Name[se]=Ráhkadus
+Name[sk]=Rozloženie
+Name[sl]=Razpored
+Name[sr]=Изглед
+Name[sr@Latn]=Izgled
+Name[ta]=உருவரை
+Name[te]=కూర్పు
+Name[tg]=Тарҳбандӣ
+Name[th]=การจัดวาง
+Name[tr]=Düzen
+Name[tt]=Urnaşılu
+Name[uk]=Розкладка
+Name[uz]=Joylashishi
+Name[uz@cyrillic]=Жойлашиши
+Name[ven]=Tshivhumbeo
+Name[vi]=Xếp đặt
+Name[wa]=Adjinçmint
+Name[xh]=Ubeko
+Name[zh_CN]=布局
+Name[zh_TW]=配置
+Name[zu]=Isendlalelo
+
+Comment=You can configure the arrangement of the panel here
+Comment[af]=Jy kan die rangskikking van die paneel hier opstel
+Comment[ar]=يمكنك إعداد ترتيب اللوحة هنا
+Comment[az]=Panelin düzülüşünü buradan quraşdıra bilərsiniz
+Comment[be]=Тут вы можаце змяніць настаўленні раўнавання панэлі
+Comment[bg]=Настройване на системния панел
+Comment[bn]=আপনি এখানে প্যানেল-এর বিন্যাস কনফিগার করতে পারেন
+Comment[br]=Amañ e c'hellit kefluniañ doare ar banell
+Comment[bs]=Ovdje možete podesiti izgled panela
+Comment[ca]=Aquí podeu configurar l'arranjament del plafó
+Comment[cs]=Zde je možné nastavit uspořádání panelu
+Comment[csb]=Kònfigùracëjô pòłożeniô panelu
+Comment[cy]=Cewch ffurfweddu trefn y panel yma
+Comment[da]=Her kan du indstille panelets arrangement
+Comment[de]=Hier können Sie Einstellungen für die Kontrollleiste vornehmen
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε τη διάταξη του πίνακα
+Comment[eo]=Ĉi tie vi povas agordi la aranĝon de la panelo
+Comment[es]=Configuración de la apariencia del panel
+Comment[et]=Siin saad seadistada paneeli paigutust
+Comment[eu]=Panelaren kokapena konfigura dezakezu hemen
+Comment[fa]=می‌توانید ترتیب تابلو را اینجا پیکربندی کنید
+Comment[fi]=Muokkaa paneelin asettelua ja sisältöä
+Comment[fr]=Configuration de l'apparence du tableau de bord
+Comment[fy]=Hjir kinne jo it ûntwerp fan it paniel ynstelle
+Comment[gl]=Pode configurar aqui a disposición do painel
+Comment[he]=שינוי הגדרות הסידור של הלוח
+Comment[hi]=फलक की व्यवस्था को आप यहाँ कॉन्फ़िगर कर सकते हैं
+Comment[hr]=Konfiguriranje rasporeda ploče
+Comment[hu]=Itt lehet beállítani a panel elrendezését
+Comment[is]=Stilla viðmót spjaldsins
+Comment[it]=Configura la disposizione del pannello
+Comment[ja]=ここでパネルの配置を設定します
+Comment[ka]=აქ შეგიძლიათ პანელის თანმიმდევრულობის კონფიგურაცია
+Comment[kk]=Панельді орналастыру
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនាសម្ព័ន្ធ​ការ​រៀបចំ​បន្ទះ
+Comment[ko]=데스크톱의 행동 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງລັກສະນະ ທີ່ປະກົດຂອງພາແນວໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite konfigūruoti pulto pavidalą
+Comment[lv]=Šeit jūs varat konfigurēt paneļa izkārtojumu
+Comment[mk]=Тука може да го конфигурирате распоредот на панелот
+Comment[mn]=Энд та удирдах самбар тохируулж болно
+Comment[ms]=Anda boleh konfigur susunan panel di sini
+Comment[mt]=Tista' tbiddel it-tqassim tal-pannell hawnhekk
+Comment[nb]=Her kan du sette opp hvordan panelet skal se ut
+Comment[nds]=Hier kannst Du de Anornen vun't Paneel instellen
+Comment[ne]=तपाईँले यहाँ प्यानलको मिलान कन्फिगर गर्न सक्नुहुन्छ
+Comment[nl]=U kunt hier de opmaak van het paneel instellen
+Comment[nn]=Her kan du setja opp utsjånaden til panelet
+Comment[nso]=Oka beakanya kgobokanyo ya panel mo
+Comment[pa]=ਤੁਸੀਂ ਪੈਨਲ ਦੇ ਢਾਂਚੇ ਦੀ ਸੰਰਚਨਾ ਇੱਥੇ ਕਰ ਸਕਦੇ ਹੋ
+Comment[pl]=Konfiguracja położenia panelu
+Comment[pt]=Pode configurar o posicionamento do painel aqui
+Comment[pt_BR]=Você pode configurar a disposição do painel aqui
+Comment[ro]=Aici puteți configura modul de aranjare al panoului KDE
+Comment[ru]=Настройка выравнивания панели
+Comment[rw]=Ushobora kuboneza itunganya ry'umwanya hano
+Comment[se]=Dáppe sáhtát heivehit panela ráhkadusa
+Comment[sk]=Nastavenie vzhľadu panelu
+Comment[sl]=Tu lahko nastavite razpored pulta
+Comment[sr]=Овде можете подесити распоред панела
+Comment[sr@Latn]=Ovde možete podesiti raspored panela
+Comment[sv]=Du kan anpassa panelens utseende här
+Comment[ta]=பலகத்தின் தோற்றத்தை இங்கே அமைக்க முடியும்
+Comment[tg]= Дар инҷо шумо метавонед тоҳири сафҳотро танзим кунед
+Comment[th]=คุณสามารถปรับแต่งการจัดวางถาดพาเนลได้ที่นี่
+Comment[tr]=Panelin görünümünü buradan yapılandırabilirsiniz
+Comment[tt]=Taqta urnaşıluın köyläw urını
+Comment[uk]=Тут можна налаштувати вигляд панелі
+Comment[uz]=Bu yerda panelning tartibini moslashingiz mumkin
+Comment[uz@cyrillic]=Бу ерда панелнинг тартибини мослашингиз мумкин
+Comment[ven]=Ninga dzudzanya mavhekanyele a phanele hafhano
+Comment[vi]=Bạn có thể cấu hình sự sắp xếp các bảng điều khiển ở đây
+Comment[wa]=Vos ploz apontyî chal l' arindjimint do scriftôr
+Comment[xh]=Uyakwazi ukuqwalasela apha i window yenkcukacha
+Comment[zh_CN]=您可以在这里配置面板的排列
+Comment[zh_TW]=您可以在此設定面板的外觀
+Comment[zu]=Ungahlanganisela ukuhlelwa kwewindi lemininingwane lapha
+
+Keywords=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[be]=Панэль,Панэль заданняў,Панэль стартавання,Размяшчэнне,Пазіцыя,Памер,Аўтаматычна хаваць,Хаваць,Кнопкі,Анімацыя,Фон,Тэмы,Кэш меню,Кэш,Схаваная,Схаваць,Меню KDE,Закладкі,Ранейшыя,Нядаўнія,Дакументы,Хуткі прагляд,Меню вандроўніка,Меню вандравання,Меню,Значкі,Аплеты,Запуск,Падсвятленне,Апрацоўка,Апрацоўшчык,Маштабаванне значак,kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[bg]=системен, панел, подредба, подравняване, kicker, panel, kpanel, taskbar, startbar, launchbar, location, size, auto hide, hide, buttons, animation, background, themes, menu cache, cache, hidden, K-Menu, bookmarks, recent documents, quickbrowser, browser menu, menu, icons, tiles, applets, startup, highlight, handles, zooming icons
+Keywords[bs]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,veličina,automatsko sakrivanje,sakrivanje,dugmad,animacija,pozadina,teme,keš menija,meni,keš,skriven,zabilješke,skorašnji dokumenti,meni browsera,meni preglednika,ikone,appleti,pokretanje,uvećavanje
+Keywords[ca]=kicker,plafó,kpanel,barra de tasques,barra d'inici,barra de llançament,localització,mida,auto oculta,oculta,botons,animació,temes,fons,cau del menú,cau,ocult,Menú K,punts,documents recents,navegació ràpida,menú de navegació,menú,icones,mosaics,aplets,arrencada,ressaltat,nanses,ampliar les icones
+Keywords[cs]=kicker,panel,kpanel,pruh úloh,lišta úloh,umístění, velikost,skrývání,automatické skrývání,tlačítka,animace,pozadí, motivy,nabídka,menu,záložky,nedávné dokumenty,rychlé prohlížení, ikony,dlaždice,applety,spuštění,zvýraznění,úchytky,zvětšování ikon
+Keywords[csb]=kicker,panel,kpanel,lëstëw zadaniów,sztartowô lëstëw,lëstëw zrëszaniô,pòłożenié,miara,aùtomatno tacënié,tacë,knąpë,animacëjô,spódk,spòdlé,témë,cache menu,cache,zatacony,K-Menu,załóżczi,slédny dokùmentë,chùtczé przezéranié,menu,ikònë,kafelkòwané,programiczi,zrëszanié,pòdskrzënianié,ùchwëtë,zwikszanié ikònów
+Keywords[cy]=ciciwr,kicker,panel,kpanel,bar tasgau,bar cychwyn,bar lansio,lleoliad,maint,awto-guddio,hunan-guddio,cuddio,botymau,animeiddiad,cefndir,themâu,storfa dewislen, storfa,cache,celc,cudd,K-Menu,nodau tudalen,dogfenni diweddar,porydd cyflym,dewislen porydd,dewislen,eiconau,teiliau,rhaglenigion,ymcychwyn,amlygu,carnau,eiconau chwyddo
+Keywords[da]=kicker,panel,kpanel,opgavelinje,startlinje,sted,størrelse,autogem,gem,knapper,animering,baggrund,temaer,menucache,cache,skjult,K-Menu,bogmærker,nylige dokumenter,hurtigsøger,søgemenu,menu,ikoner,fliser,panelprogrammer,opstart,markér,håndterer,ikoner
+Keywords[de]=Kicker,Panel,Taskbar,Kontrollleiste,Startleiste,Klickstartleiste,Fensterleiste,Autom. ausblenden,Ausblenden, Knöpfe,Animation,Hintergründe,Stile,Design,Themes,Menü-Zwischenspeicher, K-Menü,Zwischenspeicher,Lesezeichen,Zuletzt geöffnete Dateien, Schnellanzeiger,Menüs,Symbole,Icons,Kacheln,Applets,Miniprogramme, Java-Miniprogramme,Hervorhebung,Anfasser,Sicherheitsstufen,Zoom für Symbole
+Keywords[el]=kicker,πίνακας,kpanel,γραμμή εργασιών,γραμμή έναρξης,γραμμή εκκίνησης,τοποθεσία,μέγεθος,αυτόματη απόκρυψη,απόκρυψη,κουμπιά,εφέ κίνησης,φόντο,θέματα,λανθάνουσα μνήμη μενού,λανθάνουσα μνήμη,κρυφό, K-Μενού,σελιδοδείκτες,πρόσφατα έγγραφα,γρήγορος εξερευνητής,μενού εξερευνητή,μενού,εικονίδια,tiles,μικροεφαρμογές,έναρξη,τονισμός,χειριστήρια, μεγέθυνση εικονιδίων
+Keywords[eo]=lanĉilo,panelo,tasklistelo,situo,grandeco,aŭtokaŝo,kaŝo,butono,fono,etoso,menubufro,K-Menuo,legosigno,lasta dokumento,rapidrigardilo,rigardmenuo,piktogramo,kahelo,aplikaĵo,lanĉo,emfazo,teniloj,pligrandigo,fidindaj aplikaĵetoj,sekurecnivelo
+Keywords[es]=kicker,panel,kpanel,barra de tareas,barra de inicio,barra de lanzamiento,dirección,tamaño,auto ocultar,ocultar,botones,animación,fondo,temas,caché de menú,caché,oculto,Menú K,marcadores,documentos recientes,navegador rápido,menú navegador,menú,iconos,mosaicos,miniaplicaciones,arranque,resaltado,asas,iconos ampliados
+Keywords[et]=kicker,paneel,kpanel,tegumiriba,käivitusriba,asukoht,suurus,terminal,automaatne peitmine,peitmine,nupud,animatsioon,taust,teemad,menüü vahemälu,vahemälu,peidetud,K-menüü,järjehoidjad,viimati kasutatud dokumendid, kiirbrauser,lehitsemise menüü,menüü,ikoonid,apletid,käivitamine,esiletõstmine,piirded,ikoonide suurendamine,usaldusväärsed apletid,turvatase
+Keywords[eu]=kicker,panela,kpanela,ataza-barra,hasiera-barra,abiarazte-barra,kokapena, neurria,auto ezkutatu,ezkutatu,botoiak,animazioa,atzeko planoa, gaiak,menu-katxea,katxea,ezkutatu,K-menua,laster-markak,oraintsuko dokumentuak, arakatzaile bizkorra,arakatzaile menua,menua,ikonoak,baldosak,appletak,abiatu,nabarmendu,heldulekuak,zooming icons
+Keywords[fa]=kicker، تابلو، kpanel، میله‌ تکلیف، میله آغاز، میله راه‌انداز، محل، اندازه، مخفی کردن خودکار، مخفی کردن، دکمه‌ها، پویانمایی، زمینه، چهره‌ها، نهانگاه گزینگان، نهانگاه، مخفی، گزینگان K، چوب ‌الفها، سندهای اخیر، مرورگر سریع، گزینگان، مرورگر، شمایلها، کاشیها، برنامکها، راه‌اندازی، مشخص، گرداننده‌ها، بزرگ‌نمایی شمایلها
+Keywords[fi]=kicker,paneeli,kpanel,tehtäväpalkki,käynnistyspalkki,paikka,koko,automaattipiilotus,piilotus,napit,animaatio,tausta,teemat,valikkovälimuisti,välimuisti,K-valikko,kirjanmerkit,viimeaikaiset asiakirjat,pikaselain,selausvalikko,valikko,kuvakkeet,sovelmat,käynnistys,korostus,kahvat,kuvakkeiden suurennus
+Keywords[fr]=kicker,tableau de bord,barre du bas,barre des tâches,barre de démarrage,barre de lancement,emplacement,taille,auto-masquage,cacher,masquer,boutons,animation,fond,arrière-plan,thème,cache de menu,cache,caché,menu K,K,signets,documents récents,document récent,navigateur rapide,navigateur,menu,icône,mosaïque,applet,démarrage,surbrillance,poignée,poignées,zoom,zoom sur les icônes
+Keywords[fy]=kicker,paniel,kpanel,taakbalke,takebalke,Startbalke,startmenu,applikaasje begjinner,lokaasje,ôfmjiting,terminaltapassing,auto hide,automatysk ferstopje,ferstopje,Ynklappe,knoppen,animaasje,eftergrûn,tema's,menu lyts ûnthâld,lyts ûnthâld,ferstoppe,K-Menu,bookmarks,blêdwizers,resinte dokuminten,quickbrowser,browser menu,menu,icons,ikoan,ikoanen,tegels,tiles,applets,begjinne,opljochtsje,handles,zoomen,knoppen,hanfetten,betroubere applets,feiligens nivo
+Keywords[gl]=kicker,painel,kpanel,barra de tarefas,barra de comezo,barra de lanzamento,localización,tamaño,auto agochamento,agochamento,botóns,animación,fondo,temas,cache de menú,caché,oculto,Menú K,marcadores,derradeiros documentos,navegador rápido,menú de navegación,menú,iconas,apliques,início,resaltado,xestión,aumento de iconas
+Keywords[he]=kicker, לוח, kpanel, שורת משימות, שורת הרצה, מיקום, גודל, הסתרה אוטומטית, הסתר, אנימציה, רקע, ערכות, תפריט, מטמון, מוסתר, תפריט K, מועדפים, מסמכים אחרונים, דפדוף מהיר, תפריט, סימנים, סמלים, כותרות, יישומונים, אתחול, הדגשה, ידיות, הגדלת סמלים, taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons, panel
+Keywords[hi]=किकर,फलक,के-पेनल,कार्यपट्टी,प्रारंभपट्टी,चालकपट्टी,स्थान,आकार,स्वतः छुपें,छुपें,बटन्स,एनिमेशन,पृष्ठभूमि,प्रसंग,मेनू कैश,कैश,छुपा,के-मेन्यू,पसंद,हाल ही के दस्तावेज़,क्विक-ब्राउज़र,ब्राउज़र मेन्यू,मेन्यू,प्रतीक,टाइल्स,ऐप्लेट्स,स्टार्टअप,उभारना,हैंडल्स,जूमिंग प्रतीक
+Keywords[hr]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,ploča,traka zadataka,traka pokretanja,lokacija,veličina,automatsko skrivanje,skrivanje,gumbi,animacija,pozadina,teme,pohrana izbornika,pohrana,skriven,oznake,nedavni dokumenti,brzi preglednik,izbornik preglednika,izbornik,ikone,popločeno,apleti,naglašavanje,rukovanje,uvećane ikone
+Keywords[hu]=Kicker,panel,kpanel,feladatlista,start menü,indítómenü,indítósáv,hely,méret,automatikus elrejtés,elrejtés,gombok,animáció,háttér,témák,menügyorstár,gyorstár,rejtett,K menü,könyvjelzők,legutóbbi dokumentumok,gyorsböngésző,böngészőmenü,menü,ikonok,mozaikszerű,kisalkalmazások,indulás,kiemelés,fogantyúk,nagyítóikonok
+Keywords[is]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,trusted applets,security level
+Keywords[it]=kicker,pannello,kpanel,barra delle applicazioni,taskbar,startbar,launchbar,barra di avvio,posizione,dimensione,scomparsa automatica,pulsanti,animazione,sfondo,temi,cache dei menu,nascosto,Menu K,segnalibri,documenti recenti,browser veloce,menu,icone,piastrelle,applet,avvio,evidenziazione,maniglie,ingrandimento icone
+Keywords[ja]=kicker,パネル,kpanel,タスクバー,スタートバー,ラウンチバー,場所,サイズ,自動的に隠す,隠す,ボタン,アニメーション,背景,テーマ,メニューキャッシュ,キャッシュ,隠れた,Kメニュー,ブックマーク,最近のドキュメント,クイックブラウザ,ブラウザメニュー,メニュー,アイコン,タイル,アプレット,スタートアップ,ハイライト,ハンドル,アイコンのズーム
+Keywords[km]=kicker,បន្ទះ,kpanel,របារ​ភារកិច្ច,របារ​បើក​ដំណើរការ,ទីតាំង,ទំហំ,លាក់​ស្វ័យប្រវត្តិ,លាក់,ប៊ូតុង,ចលនា,ផ្ទៃ​ខាង​ក្រោយ,ស្បែក,ឃ្លាំង​សម្ងាត់​ម៉ឺនុយ,ឃ្លាំង​សម្ងាត់,លាក់,ម៉ឺនុយ K,កន្លែង​ចំណាំ,ឯកសារ​ថ្មីៗ​នេះ,កម្មវិធី​រុករក​រហ័ស,ម៉ឺនុយ​កម្មវិធី​រុករក,ម៉ឺនុយ,រូបតំណាង,ក្បឿង,អាប់ភ្លេត,ចាប់ផ្ដើម,បន្លិច,ប្រើ,រូបតំណាង​ពង្រីក
+Keywords[lt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,skydelis,kskydelis,užduočių juosta,paleidimo juosta,slėpti,mygtukai,animacija,fonas,temos,meniu atmintinė,atmintinė,paslėptas,žymelės,neseniai naudoti dokumentai,peržiūra,meniu,ženkliukai,perdengti,įskiepiai,paleistis,pažymėti,rankenėlės,išdidinti ženkliukus
+Keywords[lv]=kicker,panelis,kpanel,uzdevumjosla,startbar,launchbar,location,size,izmērs,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,grāmatzīmes,recent documents,quickbrowser,browser menu,izvēlne,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[mk]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,панел,лента со програми,локација,големина,авто криење,криење,копчиња,анимација,подлога,позадина,теми,кеш на менито,кеш,скриен,K-Мени,обележувачи, последни документи,брз прелистувач,мени за прелистувачи,мени,икони,плочки,аплети,рачки,зумирање на икони
+Keywords[mt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,favoriti,pannell,post,daqs,lokazzjoni,ħabi,animazzjoni,buttuni
+Keywords[nb]=kicker,panel,kpanel,oppgavelinje,startlinje,plassering,størrelse, autoskjul,skjul,knapper,animasjon,bakgrunn,temaer,mellomlager for temaer, mellomlager,skjult,K-meny,bokmerker,nylig brukte dokumenter,hurtigviser, katalogmeny,meny,ikoner,fliser,miniprogrammer,panelprogrammer,oppstart, uthev,håndtak,forstørring av ikoner
+Keywords[nds]=Kicker,Paneel,kpanel,Taskbalken,Programmbalken,Startbalken,Adress,Grött,automaatsch versteken,versteken,Knööp,Knoop,Knööp,Animatschoon,Achtergrund,Muster,Menü-Twischenspieker,Twischenspieker,versteken,K-Menü,Leesteken,leste Dokmenten,Fixkieker,Nettkieker-Menü,Menü,Lüttbiller,Titel,Programmen,starten,markeren,handles,Grepen,Lüttbiller grötter maken
+Keywords[ne]=किकर, प्यानल, के प्यानल, कार्यपट्टी, सुरुपट्टी, सुरुआतपट्टी, स्थान, आकार, स्वत: लुकाउने, लुकाउनुहोस्, बटनहरू, एनिमेसन, पृष्ठभूमि, विषयवस्तुहरू, मेनु क्यास, क्यास, लुकेको, के-मेनु, पुस्तकचिनोहरू, हालको कागजातहरू, छिटो ब्राउजर, ब्राउजर मेनु, मेनु, प्रतिमा, टायलहरू, एप्लेटहरू, सुरु, हाइलाइट, ह्यान्डल गर्दछ, जुम प्रतिमा
+Keywords[nl]=kicker,paneel,kpanel,taakbalk,takenbalk,startbalk,startmenu,applicatie starter,locatie,afmeting,terminaltoepassing,auto hide,automatisch verbergen,verbergen,invouwen,knoppen,animatie,achtergrond,thema's,menu cache,cache,verborgen,K-Menu,bookmarks,bladwijzers,recente documenten,quickbrowser,browser menu,menu,icons,icoon,iconen,pictogrammen,tegels,tiles,applets,opstarten,highlight,accentuering,handles,zoomen,knoppen,handvatten,betrouwbare applets,security level,beveiligingsniveau
+Keywords[nn]=Kicker,panel,KPanel,oppgåvelinje,oppstartslinje,plassering,storleik,autogøym,gøym,knappar,animasjon,bakgrunn,tema,menymellomlager,mellomlager,gøymd,K-meny,bokmerke,nyleg bruka dokument,snøgglesar,katalogmeny,meny,ikon,brikker,applet,panelprogram,oppstart,merking,handtak,forstørring av ikon
+Keywords[pa]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons, ਪੈਨਲ, ਟਿਕਾਣਾ, ਬਰਾਊਜ਼ਰ, ਝਲਾਕਰਾ, ਕੈਂਚੇ, ਕੇ-ਮੇਨੂ, ਬੁੱਕਮਾਰਕ, ਤਾਜ਼ਾ, ਉਘੜੇ, ਹੈਂਡਲ, ਬਟਨ, ਸਰੂਪ, ਮੇਨੂ, ਓਹਲੇ, ਅਕਾਰ
+Keywords[pl]=kicker,panel,kpanel,pasek zadań,pasek startu,pasek uruchamiania,położenie,rozmiar,automatyczne ukrywanie,ukryj,przyciski,animacja,tło,motywy,bufor (cache) menu,bufor,cache,ukryty,K-Menu,zakładki,ostatnie dokumenty,szybkie przeglądanie,menu,ikony,kafelkowane,programiki,uruchomienie,podświetlanie,uchwyty,powiększanie ikon
+Keywords[pt]=kicker,painel,kpanel,barra de tarefas,barra de início,barra de lançamento,localização,tamanho,auto-esconder,esconder,botões,animação,fundo,temas,'cache' de menu,'cache',escondido,menu K,favoritos,documentos recentes,navegador rápido,menu de navegação,menu,ícones,mosaicos,'applets',inicio,realce,pegas,ícones aumentados
+Keywords[pt_BR]=kicker,painel,kpanel,barra de tarefas,lançar aplicativos,localização,tamanho,auto-ocultar,esconder,botões, animação,fundo,temas,cache de menu,cache,escondido,Menu K,favoritos,documentos recentes,navegador rápido, menu do navegador,menu,ícones,títulos,mini-aplicativos,iniciar,realçar, manipuladores, ícones de ampliação
+Keywords[ro]=kicker,panou,kpanel,bară de procese,bară de start,pornire,lansare,mărime,locație,ascundere automată,butoane,animație,fundal,tematică,meniu K,semne de carte,documente recente,navigator rapid,meniu navigare,meniu,iconițe,mozaic,miniaplicații,evidențiere,scalare
+Keywords[rw]=igitera,umwanya,k-umwanya,umurongogutangira,umurongogutangiza,indangahantu,ingano,kwihisha,guhisha,buto,iyega,mbuganyuma,insanganyamatsiko,ubwihisho bw'ibikubiyemo,ubwihisho,bihishe,K-Ibikubiyemo,utumenyetso,inyandiko zigezweho,mucukumbuzi yihuta,ibikubiyemo bya mucukumbuzi,ibikubiyemo,udushushondanga,udukaro,apuleti,gutangira,gushimangira,ibifashi,udushushondanga guhindura-ingano
+Keywords[se]=kicker,panela,kpanel,bargoholga,álggahanholga,báiki,sturrodat,autočiega,čiehkadit,boalut,animašuvdna,duogáš,fáddá,fálločiehkárájus,čiehkárájus,K-fállu,girjemearkkat,aiddo geavahuvvon dokumeantta,ohcofállu,fállu,govažat,prográmmažat,álggaheapmi,merken,geavjjat,luohttehahtti prográmmažat,sihkkarvuohtadássi
+Keywords[sk]=kicker,panel,kpanel,taskbar,startbar,launchbar,miesto,umiestnenie,veľkosť,terminálová aplikácia,skrývanie,automatické skrývanie,tlačidlá,animácia,pozadie,témy,cache,cache ponuky,skryté,K-Menu,záložky,posledné dokumenty,rýchly prehliadač,ponuka prehliadača,menu,ikony,applety,štart,zvýraznenie,handles,zväčšovanie ikon,overené applety,úroveň zabezpečenia
+Keywords[sl]=kicker,pult,kpanel,opravilna vrstica,zagonska vrstica,mesto,lokacija,velikost,terminalski program,skrij,samodejno skrivanje,skrivanje,gumbi,animacija,ozadje,teme,menijski predpomnilnik,predpomnilnik,skrit,K-Menu,zaznamki,nedavni dokumenti,hitro brskanje,brskalni meni,meni,tlakovci,ikone,vstavki,zagon,osvetlitev,ročice,ikone za povečavo
+Keywords[sr]=kicker,панел,kpanel,трака задатака,startbar,launchbar,локација,величина,Терминалски програм,аутоматско сакривање,сакривање,дугмићи,анимација,позадина,теме,мени кеш,кеш,скривен,K-Menu,маркери,скори документи,брзи прегледач,мени прегледача,мени,иконе,блокови,апплети,startup,истицање,хватаљке,увеличавање икона,аплети којима се верује,ниво безбедности
+Keywords[sr@Latn]=kicker,panel,kpanel,traka zadataka,startbar,launchbar,lokacija,veličina,Terminalski program,automatsko sakrivanje,sakrivanje,dugmići,animacija,pozadina,teme,meni keš,keš,skriven,K-Menu,markeri,skori dokumenti,brzi pregledač,meni pregledača,meni,ikone,blokovi,appleti,startup,isticanje,hvataljke,uveličavanje ikona,apleti kojima se veruje,nivo bezbednosti
+Keywords[sv]=kicker,panel,k-panel,aktivitetsfält,startfält,körningsfält,plats,storlek,dölj automatiskt,dölj,göm,knappar,animering,bakgrund,teman,menycache,cache,gömd,dold,K-meny,bokmärken,senaste dokument,snabbläddrare,bläddringsmeny,meny,ikoner,miniprogram,start,framhäv,grepp,zoomikoner
+Keywords[ta]=கிக்கர், பானல், கேபானல்,துவக்கப்பட்டி, துவங்கும்பட்டி,இடம்,அளவு, சத்தம் மறை, மறை,பட்டன், உயிர்சித்திரம்,பின்னனி,கருப்பொருள், தற்காலிக மெனு, மறைந்த,கே-மெனு,புத்தககுறிகள், தற்போதைய ஆவணம். வேக உலாவி, உலாவி மெனு, மெனு, சின்னம், சிறுநிரல், துவக்கம், கையாள், பெரிதாக்கும் சின்னங்கள்
+Keywords[th]=kicker,พาเนล,kpanel,taskbar,startbar,แถบเรียกโปรแกรม,ที่ตั้ง,ขนาด,ซ่อนอัตโนมัติ ,ซ่อน,ปุ่ม,อนิเมชั่น,พื้นหลัง,ชุดตกแต่ง,แคชของเมนู,แคช,ถูกซ่อน,K-Menu,ที่คั่นหน้า,เอกสารที่เพิ่งเปิดไป,quickbrowser,เมนูของบราวเซอร์,เมนู,ไอคอน,พื้นผิว,applets,startup,highlight,handles,ซูมไอคอน
+Keywords[tr]=kicker,panel,kpanel,görev çubuğu,başlangıç çubuğu,başlat çubuğu,konum,boyut,Uç birim uygulaması,otomatik gizle,gizle,tuşlar,animasyon,artalan,temalar,menü ön belleği,ön bellek,gizli,K-Menu,yer imleri,en son kullanılan belgeler,hızlı gözatıcı,göz atıcı menüsü,menü,simgeler,karo,programcıklar,Başlangıç,belirt,tutamaçlar,büyüyen simgeler,güvenilen programcıklar,güvenlik düzeyi
+Keywords[tt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser saylaq,saylaq,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[uk]=kicker,панель,смужка задач,kpanel,смужка запуску,розташування,розмір,консольна програма,автоматичне згортання,згортання,кнопки,анімація,тло,теми,кеш меню,кеш,схований,К-Меню,закладки,недавні документи,швидка навігація,меню навігатора,меню,піктограми,заголовки,аплети,запуск,підсвічування,маніпулятор,масштабування піктограм
+Keywords[uz]=panel,vazifalar paneli,bekitish,avto-bekitish,tugmalar,animatsiya,orqa fon,mavzular,K-menyu,kesh,yashirilgan,xatchoʻplar,yaqinda ochilgan hujjatlar,tez koʻruvchi,brauzer menyusi,menyuning keshi,menyu,nishonchalar,appletlar,nishonchalarni kattalashtirish,oʻlcham,kicker,kpanel,startbar,launchbar,joylashishi,tiles,startup,highlight,handles
+Keywords[uz@cyrillic]=панел,вазифалар панели,бекитиш,авто-бекитиш,тугмалар,анимация,орқа фон,мавзулар,К-меню,кэш,яширилган,хатчўплар,яқинда очилган ҳужжатлар,тез кўрувчи,браузер менюси,менюнинг кэши,меню,нишончалар,апплетлар,нишончаларни катталаштириш,ўлчам,kicker,kpanel,startbar,launchbar,жойлашиши,tiles,startup,highlight,handles
+Keywords[vi]=kích hoạt,bảng điều khiển,kpanel,thanh tác vụ,thanh khởi động,thanh phóng,vị trí,kích cỡ,tự ẩn,ẩn,nút,hoạt hình,mảnh nền,sắc thái,thực đơn đệm,đệm,giấu,Thực đơn K,số lưu liên kết,tài liệu gần đây,duyệt nhanh,thực đơn duyệt,thực đơn,biểu tượng,tiêu đề,tiểu ứng dụng,khởi động,nổi bật,cầm nắm,biểu tượng phóng đại,ứng dụng đáng tin,mức độ an ninh
+Keywords[wa]=kicker,panel,sicriftôr,scriftôr,kpanel,taskbar,bår des bouyes,startbar,launchbar,bår d' enondaedje,plaece,grandeu,catche tot seu,catchî,botons,animåvion,fond,tinmes,muchete menu,muchete,K-Menu,rimåkes,documints nén vî,betchteu rade,dresseŷe do betchteu,dressêye,menu,imådjetes,applets,apliketes,enonde tot seu,highlight,handles,zooming icons,zoumer les imådjetes
+Keywords[zh_CN]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons面板,任务栏,启动栏,位置,大小,自动隐藏,隐藏,按钮,动画,背景,主题,菜单缓存,缓存,书签,最近文档,快速浏览器,浏览器菜单,菜单,图标,平铺,启动,突出,句柄,缩放图标
+Keywords[zh_TW]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,面板,工作列,啟動列,快捷列,位置,大小,自動隱藏,隱藏,按鈕,動畫,背景,佈景主題,選單快取,快取,隱藏,K-選單,書籤,最近開啟的文件,快速瀏覽,瀏覽選單,選單,圖示,小圖塊,應用程式,啟動,高亮度,處理,縮放圖示
diff --git a/kcontrol/kicker/kicker_config_appearance.desktop b/kcontrol/kicker/kicker_config_appearance.desktop
new file mode 100644
index 000000000..fd35460a1
--- /dev/null
+++ b/kcontrol/kicker/kicker_config_appearance.desktop
@@ -0,0 +1,229 @@
+[Desktop Entry]
+Icon=kcmkicker
+Type=Application
+DocPath=kcontrol/panel/index.html#panel-looknfeel
+Exec=kcmshell kicker_appearance
+
+
+X-KDE-Library=kicker
+X-KDE-FactoryName=kicker_appearance
+X-KDE-ParentApp=kicker
+
+Name=Appearance
+Name[af]=Voorkoms
+Name[ar]=المظهر
+Name[az]=Görünüş
+Name[be]=Вонкавы выгляд
+Name[bg]=Системен панел
+Name[bn]=চেহারা
+Name[br]=Neuziadur
+Name[bs]=Izgled
+Name[ca]=Aparença
+Name[cs]=Vzhled
+Name[csb]=Wëzdrzatk
+Name[cy]=Golwg
+Name[da]=Udseende
+Name[de]=Erscheinungsbild
+Name[el]=Εμφάνιση
+Name[eo]=Aspekto
+Name[es]=Aspecto
+Name[et]=Välimus
+Name[eu]=Itxura
+Name[fa]=ظاهر
+Name[fi]=Ulkonäkö
+Name[fr]=Apparence
+Name[fy]=Uterlik
+Name[ga]=Cuma
+Name[gl]=Apariencia
+Name[he]=מראה
+Name[hi]=शक्ल-सूरत
+Name[hr]=Izgled
+Name[hu]=Megjelenés
+Name[id]=Penampilan
+Name[is]=Útlit
+Name[it]=Aspetto
+Name[ja]=外観
+Name[ka]=გარეგნობა
+Name[kk]=Көрініс
+Name[km]=រូបរាង
+Name[ko]=모양
+Name[lo]=ການປະກົດ
+Name[lt]=Išvaizda
+Name[lv]=Izskats
+Name[mk]=Изглед
+Name[mn]=Харагдалт
+Name[ms]=Rupa
+Name[mt]=Apparenza
+Name[nb]=Utseende
+Name[nds]=Utsehn
+Name[ne]=दृश्य
+Name[nl]=Uiterlijk
+Name[nn]=Utsjånad
+Name[nso]=Ponagalo
+Name[pa]=ਦਿੱਖ
+Name[pl]=Wygląd
+Name[pt]=Aparência
+Name[pt_BR]=Aparência
+Name[ro]=Aspect
+Name[ru]=Внешний вид
+Name[rw]=Imigaragarire
+Name[se]=Fárda
+Name[sk]=Vzhľad
+Name[sl]=Videz
+Name[sr]=Изглед
+Name[sr@Latn]=Izgled
+Name[sv]=Utseende
+Name[ta]=தோற்றம்
+Name[tg]=Намуди зоҳирӣ
+Name[th]=ลักษณะที่ปรากฎ
+Name[tr]=Görünüm
+Name[tt]=Küreneş
+Name[uk]=Вигляд
+Name[uz]=Tashqi koʻrinish
+Name[uz@cyrillic]=Ташқи кўриниш
+Name[ven]=Mbonalelo
+Name[vi]=Diện mạo
+Name[wa]=Rivnance
+Name[xh]=Inkangeleko
+Name[zh_CN]=外观
+Name[zh_TW]=外觀
+Name[zu]=Ukubukeka
+Comment=You can configure the appearance of the panel here
+Comment[af]=Jy kan die voorkoms van die paneel hier opstel
+Comment[ar]=تستطيع تغيير اعدادات لوحة المهام هنا
+Comment[az]=Panelin görünüşünü buradan quraşdıra bilərsiniz
+Comment[be]=Тут вы можаце змяніць вонкавы выгляд панэлі
+Comment[bg]=Настройване на системния панел
+Comment[bn]=আপনি এখানে প্যানেল-এর চেহারা কনফিগার করতে পারেন
+Comment[br]=Amañ e c'hellit kefluniañ neuziadur ar banell
+Comment[bs]=Ovdje možete podesiti izgled panela
+Comment[ca]=Aquí podeu configurar l'aspecte del plafó
+Comment[cs]=Zde je možné nastavit vzhled panelu
+Comment[csb]=Kònfigùracëjô wëzdrzatkù panelu
+Comment[cy]=Cewch ffurfweddu golwg y panel yma
+Comment[da]=Her kan du indstille panelets udseende
+Comment[de]=Hier können Sie das Erscheinungsbild der Kontrollleiste festlegen
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε την εμφάνιση του πίνακα
+Comment[eo]=Agordo de la panela aspekto
+Comment[es]=Configuración de la apariencia del panel
+Comment[et]=Paneeli välimuse seadistamine
+Comment[eu]=Panelaren itxura konfigura dezakezu hemen
+Comment[fa]=می‌توانید ظاهر تابلو را اینجا پیکربندی کنید
+Comment[fi]=Muokkaa paneelin ulkonäköä
+Comment[fr]=Configuration de l'apparence du tableau de bord
+Comment[fy]=Hjir kinne jo it uterlik fan it paniel ynstelle
+Comment[gl]=Pode configurar aquí a apariencia do panel
+Comment[he]=שינוי הגדרות המראה של הלוח
+Comment[hi]=फलक के शक्ल-सूरत को आप यहाँ कॉन्फ़िगर कर सकते हैं
+Comment[hr]=Konfiguriranje izgleda ploče
+Comment[hu]=Itt lehet beállítani a panel tulajdonságait
+Comment[id]=Anda dapat konfigurasi tampilan panel disini
+Comment[is]=Stilla viðmót spjaldsins
+Comment[it]=Configura l'aspetto del pannello
+Comment[ja]=ここでパネルの外観を設定します
+Comment[ka]=აქ შეგიძლიათ პანელის გარეგნობის კონფიგურაცია
+Comment[kk]=Панельдің көрінісін баптау
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនាសម្ព័ន្ធ​រូបរាង​របស់​បន្ទះ
+Comment[ko]=데스크톱의 행동 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງລັກສະນະທີ່ປະກົດຂອງ ຖາດພາແນວໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite konfigūruoti pulto išvaizdą
+Comment[lv]=Šeit jūs varat konfigurēt paneļa izskatu
+Comment[mk]=Тука може да го конфигурирате изгледот на панелот
+Comment[mn]=Энд та удирдах самбарын харагдалтыг тохируулж болно
+Comment[ms]=Anda boleh konfigur rupa panel di sini
+Comment[mt]=Tista' tbiddel id-dehra tal-pannell hawnhekk
+Comment[nb]=Her kan du sette opp hvordan panelet skal se ut
+Comment[nds]=Hier kannst Du instellen, woans dat Paneel utsüht
+Comment[ne]=तपाईँले यहाँ प्यानलको दृश्य कन्फिगर गर्न सक्नुहुन्छ
+Comment[nl]=U kunt hier de opmaak van het paneel instellen
+Comment[nn]=Her kan du setja opp utsjånaden til panelet
+Comment[nso]=Oka beakanya ponagalo ya panel mo
+Comment[oc]=Aqui podetz configurar l'aspecte dèu plafon
+Comment[pa]=ਇੱਥੇ ਤੁਸੀਂ ਪੈਨਲ ਦੀ ਦਿੱਖ ਦੀ ਸੰਰਚਨਾ ਕਰ ਸਕਦੇ ਹੋ
+Comment[pl]=Konfiguracja wyglądu panelu
+Comment[pt]=Pode configurar aqui a aparência do painel
+Comment[pt_BR]=Você pode configurar a aparência do painel aqui
+Comment[ro]=Aici puteți configura aspectul panoului KDE
+Comment[ru]=Внешний вид панели
+Comment[rw]=Ushobora kuboneza imigaragarire y'umwanya hano
+Comment[se]=Dás sáhtát heivehit panela fárdda
+Comment[sk]=Tu môžete nastaviť vlastnosti panelu
+Comment[sl]=Tu lahko nastavite videz pulta
+Comment[sr]=Овде можете подесити изглед панела
+Comment[sr@Latn]=Ovde možete podesiti izgled panela
+Comment[sv]=Du kan anpassa panelens utseende här
+Comment[ta]=பலகத்தின் தோற்றத்தை இங்கே அமைக்க முடியும்
+Comment[tg]=Шумо метавонед намуди зоҳири панел дар инҷо танзим кунед
+Comment[th]=คุณสามารถปรับแต่งลักษณะที่ปรากฎของถาดพาเนลได้ที่นี่
+Comment[tr]=Panelin görünümünü buradan yapılandırabilirsiniz
+Comment[tt]=Taqta küreneşen köyläw urını
+Comment[uk]=Тут можна налаштувати вигляд панелі
+Comment[uz]=Bu yerda panelning tashqi koʻrinishini moslash mumkin
+Comment[uz@cyrillic]=Бу ерда панелнинг ташқи кўринишини мослаш мумкин
+Comment[ven]=Ni nga khonifigara mbonalelo ya phanele fhano
+Comment[vi]=Bạn có thể cấu hình diện mạo các bảng điều khiển ở đây
+Comment[wa]=Vos ploz apontyî chal li rivnance do scriftôr
+Comment[xh]=Ungaqwalasela inkangeleko yeqela labantu benjongo ethile apha
+Comment[zh_CN]=配置面板的外观
+Comment[zh_TW]=在此設定面板的外觀
+Comment[zu]=Ungahlanganisela ukubukeka kwewindi lemininingwane lapha
+Keywords=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[be]=Панэль,Панэль заданняў,Панэль стартавання,Размяшчэнне,Пазіцыя,Памер,Аўтаматычна хаваць,Хаваць,Кнопкі,Анімацыя,Фон,Тэмы,Кэш меню,Кэш,Схаваная,Схаваць,Меню KDE,Закладкі,Ранейшыя,Нядаўнія,Дакументы,Хуткі прагляд,Меню вандроўніка,Меню вандравання,Меню,Значкі,Аплеты,Запуск,Падсвятленне,Апрацоўка,Апрацоўшчык,Маштабаванне значак,kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[bg]=системен, панел, подредба, подравняване, kicker, panel, kpanel, taskbar, startbar, launchbar, location, size, auto hide, hide, buttons, animation, background, themes, menu cache, cache, hidden, K-Menu, bookmarks, recent documents, quickbrowser, browser menu, menu, icons, tiles, applets, startup, highlight, handles, zooming icons
+Keywords[bs]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,veličina,automatsko sakrivanje,sakrivanje,dugmad,animacija,pozadina,teme,keš menija,meni,keš,skriven,zabilješke,skorašnji dokumenti,meni browsera,meni preglednika,ikone,appleti,pokretanje,uvećavanje
+Keywords[ca]=kicker,plafó,kpanel,barra de tasques,barra d'inici,barra de llançament,localització,mida,auto oculta,oculta,botons,animació,temes,fons,cau del menú,cau,ocult,Menú K,punts,documents recents,navegació ràpida,menú de navegació,menú,icones,mosaics,aplets,arrencada,ressaltat,nanses,ampliar les icones
+Keywords[cs]=kicker,panel,kpanel,pruh úloh,lišta úloh,umístění, velikost,skrývání,automatické skrývání,tlačítka,animace,pozadí, motivy,nabídka,menu,záložky,nedávné dokumenty,rychlé prohlížení, ikony,dlaždice,applety,spuštění,zvýraznění,úchytky,zvětšování ikon
+Keywords[csb]=kicker,panel,kpanel,lëstëw zadaniów,sztartowô lëstëw,lëstëw zrëszaniô,pòłożenié,miara,aùtomatno tacënié,tacë,knąpë,animacëjô,spódk,spòdlé,témë,cache menu,cache,zatacony,K-Menu,załóżczi,slédny dokùmentë,chùtczé przezéranié,menu,ikònë,kafelkòwané,programiczi,zrëszanié,pòdskrzënianié,ùchwëtë,zwikszanié ikònów
+Keywords[cy]=ciciwr,kicker,panel,kpanel,bar tasgau,bar cychwyn,bar lansio,lleoliad,maint,awto-guddio,hunan-guddio,cuddio,botymau,animeiddiad,cefndir,themâu,storfa dewislen, storfa,cache,celc,cudd,K-Menu,nodau tudalen,dogfenni diweddar,porydd cyflym,dewislen porydd,dewislen,eiconau,teiliau,rhaglenigion,ymcychwyn,amlygu,carnau,eiconau chwyddo
+Keywords[da]=kicker,panel,kpanel,opgavelinje,startlinje,sted,størrelse,autogem,gem,knapper,animering,baggrund,temaer,menucache,cache,skjult,K-Menu,bogmærker,nylige dokumenter,hurtigsøger,søgemenu,menu,ikoner,fliser,panelprogrammer,opstart,markér,håndterer,ikoner
+Keywords[de]=Kicker,Panel,Taskbar,Kontrollleiste,Startleiste,Klickstartleiste,Fensterleiste,Autom. ausblenden,Ausblenden, Knöpfe,Animation,Hintergründe,Stile,Design,Themes,Menü-Zwischenspeicher, K-Menü,Zwischenspeicher,Lesezeichen,Zuletzt geöffnete Dateien, Schnellanzeiger,Menüs,Symbole,Icons,Kacheln,Applets,Miniprogramme, Java-Miniprogramme,Hervorhebung,Anfasser,Sicherheitsstufen,Zoom für Symbole
+Keywords[el]=kicker,πίνακας,kpanel,γραμμή εργασιών,γραμμή έναρξης,γραμμή εκκίνησης,τοποθεσία,μέγεθος,αυτόματη απόκρυψη,απόκρυψη,κουμπιά,εφέ κίνησης,φόντο,θέματα,λανθάνουσα μνήμη μενού,λανθάνουσα μνήμη,κρυφό, K-Μενού,σελιδοδείκτες,πρόσφατα έγγραφα,γρήγορος εξερευνητής,μενού εξερευνητή,μενού,εικονίδια,tiles,μικροεφαρμογές,έναρξη,τονισμός,χειριστήρια, μεγέθυνση εικονιδίων
+Keywords[eo]=lanĉilo,panelo,tasklistelo,situo,grandeco,aŭtokaŝo,kaŝo,butono,fono,etoso,menubufro,K-Menuo,legosigno,lasta dokumento,rapidrigardilo,rigardmenuo,piktogramo,kahelo,aplikaĵo,lanĉo,emfazo,teniloj,pligrandigo,fidindaj aplikaĵetoj,sekurecnivelo
+Keywords[es]=kicker,panel,kpanel,barra de tareas,barra de inicio,barra de lanzamiento,dirección,tamaño,auto ocultar,ocultar,botones,animación,fondo,temas,caché de menú,caché,oculto,Menú K,marcadores,documentos recientes,navegador rápido,menú navegador,menú,iconos,mosaicos,miniaplicaciones,arranque,resaltado,asas,iconos ampliados
+Keywords[et]=kicker,paneel,kpanel,tegumiriba,käivitusriba,asukoht,suurus,terminal,automaatne peitmine,peitmine,nupud,animatsioon,taust,teemad,menüü vahemälu,vahemälu,peidetud,K-menüü,järjehoidjad,viimati kasutatud dokumendid, kiirbrauser,lehitsemise menüü,menüü,ikoonid,apletid,käivitamine,esiletõstmine,piirded,ikoonide suurendamine,usaldusväärsed apletid,turvatase
+Keywords[eu]=kicker,panela,kpanela,ataza-barra,hasiera-barra,abiarazte-barra,kokapena, neurria,auto ezkutatu,ezkutatu,botoiak,animazioa,atzeko planoa, gaiak,menu-katxea,katxea,ezkutatu,K-menua,laster-markak,oraintsuko dokumentuak, arakatzaile bizkorra,arakatzaile menua,menua,ikonoak,baldosak,appletak,abiatu,nabarmendu,heldulekuak,zooming icons
+Keywords[fa]=kicker، تابلو، kpanel، میله‌ تکلیف، میله آغاز، میله راه‌انداز، محل، اندازه، مخفی کردن خودکار، مخفی کردن، دکمه‌ها، پویانمایی، زمینه، چهره‌ها، نهانگاه گزینگان، نهانگاه، مخفی، گزینگان K، چوب ‌الفها، سندهای اخیر، مرورگر سریع، گزینگان، مرورگر، شمایلها، کاشیها، برنامکها، راه‌اندازی، مشخص، گرداننده‌ها، بزرگ‌نمایی شمایلها
+Keywords[fi]=kicker,paneeli,kpanel,tehtäväpalkki,käynnistyspalkki,paikka,koko,automaattipiilotus,piilotus,napit,animaatio,tausta,teemat,valikkovälimuisti,välimuisti,K-valikko,kirjanmerkit,viimeaikaiset asiakirjat,pikaselain,selausvalikko,valikko,kuvakkeet,sovelmat,käynnistys,korostus,kahvat,kuvakkeiden suurennus
+Keywords[fr]=kicker,tableau de bord,barre du bas,barre des tâches,barre de démarrage,barre de lancement,emplacement,taille,auto-masquage,cacher,masquer,boutons,animation,fond,arrière-plan,thème,cache de menu,cache,caché,menu K,K,signets,documents récents,document récent,navigateur rapide,navigateur,menu,icône,mosaïque,applet,démarrage,surbrillance,poignée,poignées,zoom,zoom sur les icônes
+Keywords[fy]=kicker,paniel,kpanel,taakbalke,takebalke,Startbalke,startmenu,applikaasje begjinner,lokaasje,ôfmjiting,terminaltapassing,auto hide,automatysk ferstopje,ferstopje,Ynklappe,knoppen,animaasje,eftergrûn,tema's,menu lyts ûnthâld,lyts ûnthâld,ferstoppe,K-Menu,bookmarks,blêdwizers,resinte dokuminten,quickbrowser,browser menu,menu,icons,ikoan,ikoanen,tegels,tiles,applets,begjinne,opljochtsje,handles,zoomen,knoppen,hanfetten,betroubere applets,feiligens nivo
+Keywords[gl]=kicker,painel,kpanel,barra de tarefas,barra de comezo,barra de lanzamento,localización,tamaño,auto agochamento,agochamento,botóns,animación,fondo,temas,cache de menú,caché,oculto,Menú K,marcadores,derradeiros documentos,navegador rápido,menú de navegación,menú,iconas,apliques,início,resaltado,xestión,aumento de iconas
+Keywords[he]=kicker, לוח, kpanel, שורת משימות, שורת הרצה, מיקום, גודל, הסתרה אוטומטית, הסתר, אנימציה, רקע, ערכות, תפריט, מטמון, מוסתר, תפריט K, מועדפים, מסמכים אחרונים, דפדוף מהיר, תפריט, סימנים, סמלים, כותרות, יישומונים, אתחול, הדגשה, ידיות, הגדלת סמלים, taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons, panel
+Keywords[hi]=किकर,फलक,के-पेनल,कार्यपट्टी,प्रारंभपट्टी,चालकपट्टी,स्थान,आकार,स्वतः छुपें,छुपें,बटन्स,एनिमेशन,पृष्ठभूमि,प्रसंग,मेनू कैश,कैश,छुपा,के-मेन्यू,पसंद,हाल ही के दस्तावेज़,क्विक-ब्राउज़र,ब्राउज़र मेन्यू,मेन्यू,प्रतीक,टाइल्स,ऐप्लेट्स,स्टार्टअप,उभारना,हैंडल्स,जूमिंग प्रतीक
+Keywords[hr]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,ploča,traka zadataka,traka pokretanja,lokacija,veličina,automatsko skrivanje,skrivanje,gumbi,animacija,pozadina,teme,pohrana izbornika,pohrana,skriven,oznake,nedavni dokumenti,brzi preglednik,izbornik preglednika,izbornik,ikone,popločeno,apleti,naglašavanje,rukovanje,uvećane ikone
+Keywords[hu]=Kicker,panel,kpanel,feladatlista,start menü,indítómenü,indítósáv,hely,méret,automatikus elrejtés,elrejtés,gombok,animáció,háttér,témák,menügyorstár,gyorstár,rejtett,K menü,könyvjelzők,legutóbbi dokumentumok,gyorsböngésző,böngészőmenü,menü,ikonok,mozaikszerű,kisalkalmazások,indulás,kiemelés,fogantyúk,nagyítóikonok
+Keywords[is]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,trusted applets,security level
+Keywords[it]=kicker,pannello,kpanel,barra delle applicazioni,taskbar,startbar,launchbar,barra di avvio,posizione,dimensione,scomparsa automatica,pulsanti,animazione,sfondo,temi,cache dei menu,nascosto,Menu K,segnalibri,documenti recenti,browser veloce,menu,icone,piastrelle,applet,avvio,evidenziazione,maniglie,ingrandimento icone
+Keywords[ja]=kicker,パネル,kpanel,タスクバー,スタートバー,ラウンチバー,場所,サイズ,自動的に隠す,隠す,ボタン,アニメーション,背景,テーマ,メニューキャッシュ,キャッシュ,隠れた,Kメニュー,ブックマーク,最近のドキュメント,クイックブラウザ,ブラウザメニュー,メニュー,アイコン,タイル,アプレット,スタートアップ,ハイライト,ハンドル,アイコンのズーム
+Keywords[km]=kicker,បន្ទះ,kpanel,របារ​ភារកិច្ច,របារ​បើក​ដំណើរការ,ទីតាំង,ទំហំ,លាក់​ស្វ័យប្រវត្តិ,លាក់,ប៊ូតុង,ចលនា,ផ្ទៃ​ខាង​ក្រោយ,ស្បែក,ឃ្លាំង​សម្ងាត់​ម៉ឺនុយ,ឃ្លាំង​សម្ងាត់,លាក់,ម៉ឺនុយ K,កន្លែង​ចំណាំ,ឯកសារ​ថ្មីៗ​នេះ,កម្មវិធី​រុករក​រហ័ស,ម៉ឺនុយ​កម្មវិធី​រុករក,ម៉ឺនុយ,រូបតំណាង,ក្បឿង,អាប់ភ្លេត,ចាប់ផ្ដើម,បន្លិច,ប្រើ,រូបតំណាង​ពង្រីក
+Keywords[lt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,skydelis,kskydelis,užduočių juosta,paleidimo juosta,slėpti,mygtukai,animacija,fonas,temos,meniu atmintinė,atmintinė,paslėptas,žymelės,neseniai naudoti dokumentai,peržiūra,meniu,ženkliukai,perdengti,įskiepiai,paleistis,pažymėti,rankenėlės,išdidinti ženkliukus
+Keywords[lv]=kicker,panelis,kpanel,uzdevumjosla,startbar,launchbar,location,size,izmērs,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,grāmatzīmes,recent documents,quickbrowser,browser menu,izvēlne,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[mk]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,панел,лента со програми,локација,големина,авто криење,криење,копчиња,анимација,подлога,позадина,теми,кеш на менито,кеш,скриен,K-Мени,обележувачи, последни документи,брз прелистувач,мени за прелистувачи,мени,икони,плочки,аплети,рачки,зумирање на икони
+Keywords[mt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,favoriti,pannell,post,daqs,lokazzjoni,ħabi,animazzjoni,buttuni
+Keywords[nb]=kicker,panel,kpanel,oppgavelinje,startlinje,plassering,størrelse, autoskjul,skjul,knapper,animasjon,bakgrunn,temaer,mellomlager for temaer, mellomlager,skjult,K-meny,bokmerker,nylig brukte dokumenter,hurtigviser, katalogmeny,meny,ikoner,fliser,miniprogrammer,panelprogrammer,oppstart, uthev,håndtak,forstørring av ikoner
+Keywords[nds]=Kicker,Paneel,kpanel,Taskbalken,Programmbalken,Startbalken,Adress,Grött,automaatsch versteken,versteken,Knööp,Knoop,Knööp,Animatschoon,Achtergrund,Muster,Menü-Twischenspieker,Twischenspieker,versteken,K-Menü,Leesteken,leste Dokmenten,Fixkieker,Nettkieker-Menü,Menü,Lüttbiller,Titel,Programmen,starten,markeren,handles,Grepen,Lüttbiller grötter maken
+Keywords[ne]=किकर, प्यानल, के प्यानल, कार्यपट्टी, सुरुपट्टी, सुरुआतपट्टी, स्थान, आकार, स्वत: लुकाउने, लुकाउनुहोस्, बटनहरू, एनिमेसन, पृष्ठभूमि, विषयवस्तुहरू, मेनु क्यास, क्यास, लुकेको, के-मेनु, पुस्तकचिनोहरू, हालको कागजातहरू, छिटो ब्राउजर, ब्राउजर मेनु, मेनु, प्रतिमा, टायलहरू, एप्लेटहरू, सुरु, हाइलाइट, ह्यान्डल गर्दछ, जुम प्रतिमा
+Keywords[nl]=kicker,paneel,kpanel,taakbalk,takenbalk,startbalk,startmenu,applicatie starter,locatie,afmeting,terminaltoepassing,auto hide,automatisch verbergen,verbergen,invouwen,knoppen,animatie,achtergrond,thema's,menu cache,cache,verborgen,K-Menu,bookmarks,bladwijzers,recente documenten,quickbrowser,browser menu,menu,icons,icoon,iconen,pictogrammen,tegels,tiles,applets,opstarten,highlight,accentuering,handles,zoomen,knoppen,handvatten,betrouwbare applets,security level,beveiligingsniveau
+Keywords[nn]=Kicker,panel,KPanel,oppgåvelinje,oppstartslinje,plassering,storleik,autogøym,gøym,knappar,animasjon,bakgrunn,tema,menymellomlager,mellomlager,gøymd,K-meny,bokmerke,nyleg bruka dokument,snøgglesar,katalogmeny,meny,ikon,brikker,applet,panelprogram,oppstart,merking,handtak,forstørring av ikon
+Keywords[pa]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons, ਪੈਨਲ, ਟਿਕਾਣਾ, ਬਰਾਊਜ਼ਰ, ਝਲਾਕਰਾ, ਕੈਂਚੇ, ਕੇ-ਮੇਨੂ, ਬੁੱਕਮਾਰਕ, ਤਾਜ਼ਾ, ਉਘੜੇ, ਹੈਂਡਲ, ਬਟਨ, ਸਰੂਪ, ਮੇਨੂ, ਓਹਲੇ, ਅਕਾਰ
+Keywords[pl]=kicker,panel,kpanel,pasek zadań,pasek startu,pasek uruchamiania,położenie,rozmiar,automatyczne ukrywanie,ukryj,przyciski,animacja,tło,motywy,bufor (cache) menu,bufor,cache,ukryty,K-Menu,zakładki,ostatnie dokumenty,szybkie przeglądanie,menu,ikony,kafelkowane,programiki,uruchomienie,podświetlanie,uchwyty,powiększanie ikon
+Keywords[pt]=kicker,painel,kpanel,barra de tarefas,barra de início,barra de lançamento,localização,tamanho,auto-esconder,esconder,botões,animação,fundo,temas,'cache' de menu,'cache',escondido,menu K,favoritos,documentos recentes,navegador rápido,menu de navegação,menu,ícones,mosaicos,'applets',inicio,realce,pegas,ícones aumentados
+Keywords[pt_BR]=kicker,painel,kpanel,barra de tarefas,lançar aplicativos,localização,tamanho,auto-ocultar,esconder,botões, animação,fundo,temas,cache de menu,cache,escondido,Menu K,favoritos,documentos recentes,navegador rápido, menu do navegador,menu,ícones,títulos,mini-aplicativos,iniciar,realçar, manipuladores, ícones de ampliação
+Keywords[ro]=kicker,panou,kpanel,bară de procese,bară de start,pornire,lansare,mărime,locație,ascundere automată,butoane,animație,fundal,tematică,meniu K,semne de carte,documente recente,navigator rapid,meniu navigare,meniu,iconițe,mozaic,miniaplicații,evidențiere,scalare
+Keywords[rw]=igitera,umwanya,k-umwanya,umurongogutangira,umurongogutangiza,indangahantu,ingano,kwihisha,guhisha,buto,iyega,mbuganyuma,insanganyamatsiko,ubwihisho bw'ibikubiyemo,ubwihisho,bihishe,K-Ibikubiyemo,utumenyetso,inyandiko zigezweho,mucukumbuzi yihuta,ibikubiyemo bya mucukumbuzi,ibikubiyemo,udushushondanga,udukaro,apuleti,gutangira,gushimangira,ibifashi,udushushondanga guhindura-ingano
+Keywords[se]=kicker,panela,kpanel,bargoholga,álggahanholga,báiki,sturrodat,autočiega,čiehkadit,boalut,animašuvdna,duogáš,fáddá,fálločiehkárájus,čiehkárájus,K-fállu,girjemearkkat,aiddo geavahuvvon dokumeantta,ohcofállu,fállu,govažat,prográmmažat,álggaheapmi,merken,geavjjat,luohttehahtti prográmmažat,sihkkarvuohtadássi
+Keywords[sk]=kicker,panel,kpanel,taskbar,startbar,launchbar,miesto,umiestnenie,veľkosť,terminálová aplikácia,skrývanie,automatické skrývanie,tlačidlá,animácia,pozadie,témy,cache,cache ponuky,skryté,K-Menu,záložky,posledné dokumenty,rýchly prehliadač,ponuka prehliadača,menu,ikony,applety,štart,zvýraznenie,handles,zväčšovanie ikon,overené applety,úroveň zabezpečenia
+Keywords[sl]=kicker,pult,kpanel,opravilna vrstica,zagonska vrstica,mesto,lokacija,velikost,terminalski program,skrij,samodejno skrivanje,skrivanje,gumbi,animacija,ozadje,teme,menijski predpomnilnik,predpomnilnik,skrit,K-Menu,zaznamki,nedavni dokumenti,hitro brskanje,brskalni meni,meni,tlakovci,ikone,vstavki,zagon,osvetlitev,ročice,ikone za povečavo
+Keywords[sr]=kicker,панел,kpanel,трака задатака,startbar,launchbar,локација,величина,Терминалски програм,аутоматско сакривање,сакривање,дугмићи,анимација,позадина,теме,мени кеш,кеш,скривен,K-Menu,маркери,скори документи,брзи прегледач,мени прегледача,мени,иконе,блокови,апплети,startup,истицање,хватаљке,увеличавање икона,аплети којима се верује,ниво безбедности
+Keywords[sr@Latn]=kicker,panel,kpanel,traka zadataka,startbar,launchbar,lokacija,veličina,Terminalski program,automatsko sakrivanje,sakrivanje,dugmići,animacija,pozadina,teme,meni keš,keš,skriven,K-Menu,markeri,skori dokumenti,brzi pregledač,meni pregledača,meni,ikone,blokovi,appleti,startup,isticanje,hvataljke,uveličavanje ikona,apleti kojima se veruje,nivo bezbednosti
+Keywords[sv]=kicker,panel,k-panel,aktivitetsfält,startfält,körningsfält,plats,storlek,dölj automatiskt,dölj,göm,knappar,animering,bakgrund,teman,menycache,cache,gömd,dold,K-meny,bokmärken,senaste dokument,snabbläddrare,bläddringsmeny,meny,ikoner,miniprogram,start,framhäv,grepp,zoomikoner
+Keywords[ta]=கிக்கர், பானல், கேபானல்,துவக்கப்பட்டி, துவங்கும்பட்டி,இடம்,அளவு, சத்தம் மறை, மறை,பட்டன், உயிர்சித்திரம்,பின்னனி,கருப்பொருள், தற்காலிக மெனு, மறைந்த,கே-மெனு,புத்தககுறிகள், தற்போதைய ஆவணம். வேக உலாவி, உலாவி மெனு, மெனு, சின்னம், சிறுநிரல், துவக்கம், கையாள், பெரிதாக்கும் சின்னங்கள்
+Keywords[th]=kicker,พาเนล,kpanel,taskbar,startbar,แถบเรียกโปรแกรม,ที่ตั้ง,ขนาด,ซ่อนอัตโนมัติ ,ซ่อน,ปุ่ม,อนิเมชั่น,พื้นหลัง,ชุดตกแต่ง,แคชของเมนู,แคช,ถูกซ่อน,K-Menu,ที่คั่นหน้า,เอกสารที่เพิ่งเปิดไป,quickbrowser,เมนูของบราวเซอร์,เมนู,ไอคอน,พื้นผิว,applets,startup,highlight,handles,ซูมไอคอน
+Keywords[tr]=kicker,panel,kpanel,görev çubuğu,başlangıç çubuğu,başlat çubuğu,konum,boyut,Uç birim uygulaması,otomatik gizle,gizle,tuşlar,animasyon,artalan,temalar,menü ön belleği,ön bellek,gizli,K-Menu,yer imleri,en son kullanılan belgeler,hızlı gözatıcı,göz atıcı menüsü,menü,simgeler,karo,programcıklar,Başlangıç,belirt,tutamaçlar,büyüyen simgeler,güvenilen programcıklar,güvenlik düzeyi
+Keywords[tt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser saylaq,saylaq,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[uk]=kicker,панель,смужка задач,kpanel,смужка запуску,розташування,розмір,консольна програма,автоматичне згортання,згортання,кнопки,анімація,тло,теми,кеш меню,кеш,схований,К-Меню,закладки,недавні документи,швидка навігація,меню навігатора,меню,піктограми,заголовки,аплети,запуск,підсвічування,маніпулятор,масштабування піктограм
+Keywords[uz]=panel,vazifalar paneli,bekitish,avto-bekitish,tugmalar,animatsiya,orqa fon,mavzular,K-menyu,kesh,yashirilgan,xatchoʻplar,yaqinda ochilgan hujjatlar,tez koʻruvchi,brauzer menyusi,menyuning keshi,menyu,nishonchalar,appletlar,nishonchalarni kattalashtirish,oʻlcham,kicker,kpanel,startbar,launchbar,joylashishi,tiles,startup,highlight,handles
+Keywords[uz@cyrillic]=панел,вазифалар панели,бекитиш,авто-бекитиш,тугмалар,анимация,орқа фон,мавзулар,К-меню,кэш,яширилган,хатчўплар,яқинда очилган ҳужжатлар,тез кўрувчи,браузер менюси,менюнинг кэши,меню,нишончалар,апплетлар,нишончаларни катталаштириш,ўлчам,kicker,kpanel,startbar,launchbar,жойлашиши,tiles,startup,highlight,handles
+Keywords[vi]=kích hoạt,bảng điều khiển,kpanel,thanh tác vụ,thanh khởi động,thanh phóng,vị trí,kích cỡ,tự ẩn,ẩn,nút,hoạt hình,mảnh nền,sắc thái,thực đơn đệm,đệm,giấu,Thực đơn K,số lưu liên kết,tài liệu gần đây,duyệt nhanh,thực đơn duyệt,thực đơn,biểu tượng,tiêu đề,tiểu ứng dụng,khởi động,nổi bật,cầm nắm,biểu tượng phóng đại,ứng dụng đáng tin,mức độ an ninh
+Keywords[wa]=kicker,panel,sicriftôr,scriftôr,kpanel,taskbar,bår des bouyes,startbar,launchbar,bår d' enondaedje,plaece,grandeu,catche tot seu,catchî,botons,animåvion,fond,tinmes,muchete menu,muchete,K-Menu,rimåkes,documints nén vî,betchteu rade,dresseŷe do betchteu,dressêye,menu,imådjetes,applets,apliketes,enonde tot seu,highlight,handles,zooming icons,zoumer les imådjetes
+Keywords[zh_CN]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons面板,任务栏,启动栏,位置,大小,自动隐藏,隐藏,按钮,动画,背景,主题,菜单缓存,缓存,书签,最近文档,快速浏览器,浏览器菜单,菜单,图标,平铺,启动,突出,句柄,缩放图标
+Keywords[zh_TW]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,面板,工作列,啟動列,快捷列,位置,大小,自動隱藏,隱藏,按鈕,動畫,背景,佈景主題,選單快取,快取,隱藏,K-選單,書籤,最近開啟的文件,快速瀏覽,瀏覽選單,選單,圖示,小圖塊,應用程式,啟動,高亮度,處理,縮放圖示
diff --git a/kcontrol/kicker/kicker_config_arrangement.desktop b/kcontrol/kicker/kicker_config_arrangement.desktop
new file mode 100644
index 000000000..bc2a8a445
--- /dev/null
+++ b/kcontrol/kicker/kicker_config_arrangement.desktop
@@ -0,0 +1,212 @@
+[Desktop Entry]
+Icon=kcmkicker
+Type=Application
+DocPath=kcontrol/panel/index.html#panel-position
+Exec=kcmshell kicker_arrangement
+
+X-KDE-Library=kicker
+X-KDE-FactoryName=kicker_arrangement
+X-KDE-ParentApp=kicker
+
+Name=Arrangement
+Name[af]=Rangskikking
+Name[ar]=الترتيب
+Name[be]=Раўнанне
+Name[bg]=Разпределение
+Name[bn]=বিন্যাস
+Name[br]=Doare
+Name[bs]=Raspored
+Name[ca]=Arranjament
+Name[cs]=Uspořádání
+Name[csb]=Ùstôw
+Name[cy]=Trefniad
+Name[de]=Layout
+Name[el]=Διάταξη
+Name[eo]=Agordo
+Name[es]=Acuerdo
+Name[et]=Paigutus
+Name[eu]=Antolakuntza
+Name[fa]=ترتیب
+Name[fi]=Järjestely
+Name[fy]=Yndieling
+Name[ga]=Leagan Amach
+Name[gl]=Disposición
+Name[he]=סידור
+Name[hr]=Raspored
+Name[hu]=Elrendezés
+Name[is]=Skipulag
+Name[it]=Disposizione
+Name[ja]=配置
+Name[ka]=განთავსება
+Name[kk]=Орналастыру
+Name[km]=ការរៀបចំ
+Name[lt]=Išdėstymas
+Name[mk]=Распоред
+Name[ms]=Susunan
+Name[nds]=Anornen
+Name[ne]=मिलान
+Name[nl]=Indeling
+Name[nn]=Oppsett
+Name[pa]=ਇਕਰਾਰਨਾਮਾ
+Name[pl]=Układ
+Name[pt]=Organização
+Name[pt_BR]=Disposição
+Name[ro]=Aranjament
+Name[ru]=Расстановка
+Name[rw]=Ugutunganya
+Name[se]=Ráhkadus
+Name[sk]=Usporiadanie
+Name[sl]=Postavitev
+Name[sr]=Распоред
+Name[sr@Latn]=Raspored
+Name[sv]=Arrangemang
+Name[ta]=ஏற்பாடு
+Name[te]=క్రమం
+Name[tg]=Созишнома
+Name[th]=การจัดเรียง
+Name[tr]=Düzenleme
+Name[tt]=Urınlaşu
+Name[uk]=Розташування
+Name[uz]=Joylashishi
+Name[uz@cyrillic]=Жойлашиши
+Name[vi]=Sắp đặt
+Name[wa]=Arindjmint
+Name[zh_CN]=排列
+Name[zh_TW]=對齊方式
+Comment=You can configure the arrangement of the panel here
+Comment[af]=Jy kan die rangskikking van die paneel hier opstel
+Comment[ar]=يمكنك إعداد ترتيب اللوحة هنا
+Comment[az]=Panelin düzülüşünü buradan quraşdıra bilərsiniz
+Comment[be]=Тут вы можаце змяніць настаўленні раўнавання панэлі
+Comment[bg]=Настройване на системния панел
+Comment[bn]=আপনি এখানে প্যানেল-এর বিন্যাস কনফিগার করতে পারেন
+Comment[br]=Amañ e c'hellit kefluniañ doare ar banell
+Comment[bs]=Ovdje možete podesiti izgled panela
+Comment[ca]=Aquí podeu configurar l'arranjament del plafó
+Comment[cs]=Zde je možné nastavit uspořádání panelu
+Comment[csb]=Kònfigùracëjô pòłożeniô panelu
+Comment[cy]=Cewch ffurfweddu trefn y panel yma
+Comment[da]=Her kan du indstille panelets arrangement
+Comment[de]=Hier können Sie Einstellungen für die Kontrollleiste vornehmen
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε τη διάταξη του πίνακα
+Comment[eo]=Ĉi tie vi povas agordi la aranĝon de la panelo
+Comment[es]=Configuración de la apariencia del panel
+Comment[et]=Siin saad seadistada paneeli paigutust
+Comment[eu]=Panelaren kokapena konfigura dezakezu hemen
+Comment[fa]=می‌توانید ترتیب تابلو را اینجا پیکربندی کنید
+Comment[fi]=Muokkaa paneelin asettelua ja sisältöä
+Comment[fr]=Configuration de l'apparence du tableau de bord
+Comment[fy]=Hjir kinne jo it ûntwerp fan it paniel ynstelle
+Comment[gl]=Pode configurar aqui a disposición do painel
+Comment[he]=שינוי הגדרות הסידור של הלוח
+Comment[hi]=फलक की व्यवस्था को आप यहाँ कॉन्फ़िगर कर सकते हैं
+Comment[hr]=Konfiguriranje rasporeda ploče
+Comment[hu]=Itt lehet beállítani a panel elrendezését
+Comment[is]=Stilla viðmót spjaldsins
+Comment[it]=Configura la disposizione del pannello
+Comment[ja]=ここでパネルの配置を設定します
+Comment[ka]=აქ შეგიძლიათ პანელის თანმიმდევრულობის კონფიგურაცია
+Comment[kk]=Панельді орналастыру
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនាសម្ព័ន្ធ​ការ​រៀបចំ​បន្ទះ
+Comment[ko]=데스크톱의 행동 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງລັກສະນະ ທີ່ປະກົດຂອງພາແນວໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite konfigūruoti pulto pavidalą
+Comment[lv]=Šeit jūs varat konfigurēt paneļa izkārtojumu
+Comment[mk]=Тука може да го конфигурирате распоредот на панелот
+Comment[mn]=Энд та удирдах самбар тохируулж болно
+Comment[ms]=Anda boleh konfigur susunan panel di sini
+Comment[mt]=Tista' tbiddel it-tqassim tal-pannell hawnhekk
+Comment[nb]=Her kan du sette opp hvordan panelet skal se ut
+Comment[nds]=Hier kannst Du de Anornen vun't Paneel instellen
+Comment[ne]=तपाईँले यहाँ प्यानलको मिलान कन्फिगर गर्न सक्नुहुन्छ
+Comment[nl]=U kunt hier de opmaak van het paneel instellen
+Comment[nn]=Her kan du setja opp utsjånaden til panelet
+Comment[nso]=Oka beakanya kgobokanyo ya panel mo
+Comment[pa]=ਤੁਸੀਂ ਪੈਨਲ ਦੇ ਢਾਂਚੇ ਦੀ ਸੰਰਚਨਾ ਇੱਥੇ ਕਰ ਸਕਦੇ ਹੋ
+Comment[pl]=Konfiguracja położenia panelu
+Comment[pt]=Pode configurar o posicionamento do painel aqui
+Comment[pt_BR]=Você pode configurar a disposição do painel aqui
+Comment[ro]=Aici puteți configura modul de aranjare al panoului KDE
+Comment[ru]=Настройка выравнивания панели
+Comment[rw]=Ushobora kuboneza itunganya ry'umwanya hano
+Comment[se]=Dáppe sáhtát heivehit panela ráhkadusa
+Comment[sk]=Nastavenie vzhľadu panelu
+Comment[sl]=Tu lahko nastavite razpored pulta
+Comment[sr]=Овде можете подесити распоред панела
+Comment[sr@Latn]=Ovde možete podesiti raspored panela
+Comment[sv]=Du kan anpassa panelens utseende här
+Comment[ta]=பலகத்தின் தோற்றத்தை இங்கே அமைக்க முடியும்
+Comment[tg]= Дар инҷо шумо метавонед тоҳири сафҳотро танзим кунед
+Comment[th]=คุณสามารถปรับแต่งการจัดวางถาดพาเนลได้ที่นี่
+Comment[tr]=Panelin görünümünü buradan yapılandırabilirsiniz
+Comment[tt]=Taqta urnaşıluın köyläw urını
+Comment[uk]=Тут можна налаштувати вигляд панелі
+Comment[uz]=Bu yerda panelning tartibini moslashingiz mumkin
+Comment[uz@cyrillic]=Бу ерда панелнинг тартибини мослашингиз мумкин
+Comment[ven]=Ninga dzudzanya mavhekanyele a phanele hafhano
+Comment[vi]=Bạn có thể cấu hình sự sắp xếp các bảng điều khiển ở đây
+Comment[wa]=Vos ploz apontyî chal l' arindjimint do scriftôr
+Comment[xh]=Uyakwazi ukuqwalasela apha i window yenkcukacha
+Comment[zh_CN]=您可以在这里配置面板的排列
+Comment[zh_TW]=您可以在此設定面板的外觀
+Comment[zu]=Ungahlanganisela ukuhlelwa kwewindi lemininingwane lapha
+Keywords=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[be]=Панэль,Панэль заданняў,Панэль стартавання,Размяшчэнне,Пазіцыя,Памер,Аўтаматычна хаваць,Хаваць,Кнопкі,Анімацыя,Фон,Тэмы,Кэш меню,Кэш,Схаваная,Схаваць,Меню KDE,Закладкі,Ранейшыя,Нядаўнія,Дакументы,Хуткі прагляд,Меню вандроўніка,Меню вандравання,Меню,Значкі,Аплеты,Запуск,Падсвятленне,Апрацоўка,Апрацоўшчык,Маштабаванне значак,kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[bg]=системен, панел, подредба, подравняване, kicker, panel, kpanel, taskbar, startbar, launchbar, location, size, auto hide, hide, buttons, animation, background, themes, menu cache, cache, hidden, K-Menu, bookmarks, recent documents, quickbrowser, browser menu, menu, icons, tiles, applets, startup, highlight, handles, zooming icons
+Keywords[bs]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,veličina,automatsko sakrivanje,sakrivanje,dugmad,animacija,pozadina,teme,keš menija,meni,keš,skriven,zabilješke,skorašnji dokumenti,meni browsera,meni preglednika,ikone,appleti,pokretanje,uvećavanje
+Keywords[ca]=kicker,plafó,kpanel,barra de tasques,barra d'inici,barra de llançament,localització,mida,auto oculta,oculta,botons,animació,temes,fons,cau del menú,cau,ocult,Menú K,punts,documents recents,navegació ràpida,menú de navegació,menú,icones,mosaics,aplets,arrencada,ressaltat,nanses,ampliar les icones
+Keywords[cs]=kicker,panel,kpanel,pruh úloh,lišta úloh,umístění, velikost,skrývání,automatické skrývání,tlačítka,animace,pozadí, motivy,nabídka,menu,záložky,nedávné dokumenty,rychlé prohlížení, ikony,dlaždice,applety,spuštění,zvýraznění,úchytky,zvětšování ikon
+Keywords[csb]=kicker,panel,kpanel,lëstëw zadaniów,sztartowô lëstëw,lëstëw zrëszaniô,pòłożenié,miara,aùtomatno tacënié,tacë,knąpë,animacëjô,spódk,spòdlé,témë,cache menu,cache,zatacony,K-Menu,załóżczi,slédny dokùmentë,chùtczé przezéranié,menu,ikònë,kafelkòwané,programiczi,zrëszanié,pòdskrzënianié,ùchwëtë,zwikszanié ikònów
+Keywords[cy]=ciciwr,kicker,panel,kpanel,bar tasgau,bar cychwyn,bar lansio,lleoliad,maint,awto-guddio,hunan-guddio,cuddio,botymau,animeiddiad,cefndir,themâu,storfa dewislen, storfa,cache,celc,cudd,K-Menu,nodau tudalen,dogfenni diweddar,porydd cyflym,dewislen porydd,dewislen,eiconau,teiliau,rhaglenigion,ymcychwyn,amlygu,carnau,eiconau chwyddo
+Keywords[da]=kicker,panel,kpanel,opgavelinje,startlinje,sted,størrelse,autogem,gem,knapper,animering,baggrund,temaer,menucache,cache,skjult,K-Menu,bogmærker,nylige dokumenter,hurtigsøger,søgemenu,menu,ikoner,fliser,panelprogrammer,opstart,markér,håndterer,ikoner
+Keywords[de]=Kicker,Panel,Taskbar,Kontrollleiste,Startleiste,Klickstartleiste,Fensterleiste,Autom. ausblenden,Ausblenden, Knöpfe,Animation,Hintergründe,Stile,Design,Themes,Menü-Zwischenspeicher, K-Menü,Zwischenspeicher,Lesezeichen,Zuletzt geöffnete Dateien, Schnellanzeiger,Menüs,Symbole,Icons,Kacheln,Applets,Miniprogramme, Java-Miniprogramme,Hervorhebung,Anfasser,Sicherheitsstufen,Zoom für Symbole
+Keywords[el]=kicker,πίνακας,kpanel,γραμμή εργασιών,γραμμή έναρξης,γραμμή εκκίνησης,τοποθεσία,μέγεθος,αυτόματη απόκρυψη,απόκρυψη,κουμπιά,εφέ κίνησης,φόντο,θέματα,λανθάνουσα μνήμη μενού,λανθάνουσα μνήμη,κρυφό, K-Μενού,σελιδοδείκτες,πρόσφατα έγγραφα,γρήγορος εξερευνητής,μενού εξερευνητή,μενού,εικονίδια,tiles,μικροεφαρμογές,έναρξη,τονισμός,χειριστήρια, μεγέθυνση εικονιδίων
+Keywords[eo]=lanĉilo,panelo,tasklistelo,situo,grandeco,aŭtokaŝo,kaŝo,butono,fono,etoso,menubufro,K-Menuo,legosigno,lasta dokumento,rapidrigardilo,rigardmenuo,piktogramo,kahelo,aplikaĵo,lanĉo,emfazo,teniloj,pligrandigo,fidindaj aplikaĵetoj,sekurecnivelo
+Keywords[es]=kicker,panel,kpanel,barra de tareas,barra de inicio,barra de lanzamiento,dirección,tamaño,auto ocultar,ocultar,botones,animación,fondo,temas,caché de menú,caché,oculto,Menú K,marcadores,documentos recientes,navegador rápido,menú navegador,menú,iconos,mosaicos,miniaplicaciones,arranque,resaltado,asas,iconos ampliados
+Keywords[et]=kicker,paneel,kpanel,tegumiriba,käivitusriba,asukoht,suurus,terminal,automaatne peitmine,peitmine,nupud,animatsioon,taust,teemad,menüü vahemälu,vahemälu,peidetud,K-menüü,järjehoidjad,viimati kasutatud dokumendid, kiirbrauser,lehitsemise menüü,menüü,ikoonid,apletid,käivitamine,esiletõstmine,piirded,ikoonide suurendamine,usaldusväärsed apletid,turvatase
+Keywords[eu]=kicker,panela,kpanela,ataza-barra,hasiera-barra,abiarazte-barra,kokapena, neurria,auto ezkutatu,ezkutatu,botoiak,animazioa,atzeko planoa, gaiak,menu-katxea,katxea,ezkutatu,K-menua,laster-markak,oraintsuko dokumentuak, arakatzaile bizkorra,arakatzaile menua,menua,ikonoak,baldosak,appletak,abiatu,nabarmendu,heldulekuak,zooming icons
+Keywords[fa]=kicker، تابلو، kpanel، میله‌ تکلیف، میله آغاز، میله راه‌انداز، محل، اندازه، مخفی کردن خودکار، مخفی کردن، دکمه‌ها، پویانمایی، زمینه، چهره‌ها، نهانگاه گزینگان، نهانگاه، مخفی، گزینگان K، چوب ‌الفها، سندهای اخیر، مرورگر سریع، گزینگان، مرورگر، شمایلها، کاشیها، برنامکها، راه‌اندازی، مشخص، گرداننده‌ها، بزرگ‌نمایی شمایلها
+Keywords[fi]=kicker,paneeli,kpanel,tehtäväpalkki,käynnistyspalkki,paikka,koko,automaattipiilotus,piilotus,napit,animaatio,tausta,teemat,valikkovälimuisti,välimuisti,K-valikko,kirjanmerkit,viimeaikaiset asiakirjat,pikaselain,selausvalikko,valikko,kuvakkeet,sovelmat,käynnistys,korostus,kahvat,kuvakkeiden suurennus
+Keywords[fr]=kicker,tableau de bord,barre du bas,barre des tâches,barre de démarrage,barre de lancement,emplacement,taille,auto-masquage,cacher,masquer,boutons,animation,fond,arrière-plan,thème,cache de menu,cache,caché,menu K,K,signets,documents récents,document récent,navigateur rapide,navigateur,menu,icône,mosaïque,applet,démarrage,surbrillance,poignée,poignées,zoom,zoom sur les icônes
+Keywords[fy]=kicker,paniel,kpanel,taakbalke,takebalke,Startbalke,startmenu,applikaasje begjinner,lokaasje,ôfmjiting,terminaltapassing,auto hide,automatysk ferstopje,ferstopje,Ynklappe,knoppen,animaasje,eftergrûn,tema's,menu lyts ûnthâld,lyts ûnthâld,ferstoppe,K-Menu,bookmarks,blêdwizers,resinte dokuminten,quickbrowser,browser menu,menu,icons,ikoan,ikoanen,tegels,tiles,applets,begjinne,opljochtsje,handles,zoomen,knoppen,hanfetten,betroubere applets,feiligens nivo
+Keywords[gl]=kicker,painel,kpanel,barra de tarefas,barra de comezo,barra de lanzamento,localización,tamaño,auto agochamento,agochamento,botóns,animación,fondo,temas,cache de menú,caché,oculto,Menú K,marcadores,derradeiros documentos,navegador rápido,menú de navegación,menú,iconas,apliques,início,resaltado,xestión,aumento de iconas
+Keywords[he]=kicker, לוח, kpanel, שורת משימות, שורת הרצה, מיקום, גודל, הסתרה אוטומטית, הסתר, אנימציה, רקע, ערכות, תפריט, מטמון, מוסתר, תפריט K, מועדפים, מסמכים אחרונים, דפדוף מהיר, תפריט, סימנים, סמלים, כותרות, יישומונים, אתחול, הדגשה, ידיות, הגדלת סמלים, taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons, panel
+Keywords[hi]=किकर,फलक,के-पेनल,कार्यपट्टी,प्रारंभपट्टी,चालकपट्टी,स्थान,आकार,स्वतः छुपें,छुपें,बटन्स,एनिमेशन,पृष्ठभूमि,प्रसंग,मेनू कैश,कैश,छुपा,के-मेन्यू,पसंद,हाल ही के दस्तावेज़,क्विक-ब्राउज़र,ब्राउज़र मेन्यू,मेन्यू,प्रतीक,टाइल्स,ऐप्लेट्स,स्टार्टअप,उभारना,हैंडल्स,जूमिंग प्रतीक
+Keywords[hr]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,ploča,traka zadataka,traka pokretanja,lokacija,veličina,automatsko skrivanje,skrivanje,gumbi,animacija,pozadina,teme,pohrana izbornika,pohrana,skriven,oznake,nedavni dokumenti,brzi preglednik,izbornik preglednika,izbornik,ikone,popločeno,apleti,naglašavanje,rukovanje,uvećane ikone
+Keywords[hu]=Kicker,panel,kpanel,feladatlista,start menü,indítómenü,indítósáv,hely,méret,automatikus elrejtés,elrejtés,gombok,animáció,háttér,témák,menügyorstár,gyorstár,rejtett,K menü,könyvjelzők,legutóbbi dokumentumok,gyorsböngésző,böngészőmenü,menü,ikonok,mozaikszerű,kisalkalmazások,indulás,kiemelés,fogantyúk,nagyítóikonok
+Keywords[is]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,trusted applets,security level
+Keywords[it]=kicker,pannello,kpanel,barra delle applicazioni,taskbar,startbar,launchbar,barra di avvio,posizione,dimensione,scomparsa automatica,pulsanti,animazione,sfondo,temi,cache dei menu,nascosto,Menu K,segnalibri,documenti recenti,browser veloce,menu,icone,piastrelle,applet,avvio,evidenziazione,maniglie,ingrandimento icone
+Keywords[ja]=kicker,パネル,kpanel,タスクバー,スタートバー,ラウンチバー,場所,サイズ,自動的に隠す,隠す,ボタン,アニメーション,背景,テーマ,メニューキャッシュ,キャッシュ,隠れた,Kメニュー,ブックマーク,最近のドキュメント,クイックブラウザ,ブラウザメニュー,メニュー,アイコン,タイル,アプレット,スタートアップ,ハイライト,ハンドル,アイコンのズーム
+Keywords[km]=kicker,បន្ទះ,kpanel,របារ​ភារកិច្ច,របារ​បើក​ដំណើរការ,ទីតាំង,ទំហំ,លាក់​ស្វ័យប្រវត្តិ,លាក់,ប៊ូតុង,ចលនា,ផ្ទៃ​ខាង​ក្រោយ,ស្បែក,ឃ្លាំង​សម្ងាត់​ម៉ឺនុយ,ឃ្លាំង​សម្ងាត់,លាក់,ម៉ឺនុយ K,កន្លែង​ចំណាំ,ឯកសារ​ថ្មីៗ​នេះ,កម្មវិធី​រុករក​រហ័ស,ម៉ឺនុយ​កម្មវិធី​រុករក,ម៉ឺនុយ,រូបតំណាង,ក្បឿង,អាប់ភ្លេត,ចាប់ផ្ដើម,បន្លិច,ប្រើ,រូបតំណាង​ពង្រីក
+Keywords[lt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,skydelis,kskydelis,užduočių juosta,paleidimo juosta,slėpti,mygtukai,animacija,fonas,temos,meniu atmintinė,atmintinė,paslėptas,žymelės,neseniai naudoti dokumentai,peržiūra,meniu,ženkliukai,perdengti,įskiepiai,paleistis,pažymėti,rankenėlės,išdidinti ženkliukus
+Keywords[lv]=kicker,panelis,kpanel,uzdevumjosla,startbar,launchbar,location,size,izmērs,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,grāmatzīmes,recent documents,quickbrowser,browser menu,izvēlne,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[mk]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,панел,лента со програми,локација,големина,авто криење,криење,копчиња,анимација,подлога,позадина,теми,кеш на менито,кеш,скриен,K-Мени,обележувачи, последни документи,брз прелистувач,мени за прелистувачи,мени,икони,плочки,аплети,рачки,зумирање на икони
+Keywords[mt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,favoriti,pannell,post,daqs,lokazzjoni,ħabi,animazzjoni,buttuni
+Keywords[nb]=kicker,panel,kpanel,oppgavelinje,startlinje,plassering,størrelse, autoskjul,skjul,knapper,animasjon,bakgrunn,temaer,mellomlager for temaer, mellomlager,skjult,K-meny,bokmerker,nylig brukte dokumenter,hurtigviser, katalogmeny,meny,ikoner,fliser,miniprogrammer,panelprogrammer,oppstart, uthev,håndtak,forstørring av ikoner
+Keywords[nds]=Kicker,Paneel,kpanel,Taskbalken,Programmbalken,Startbalken,Adress,Grött,automaatsch versteken,versteken,Knööp,Knoop,Knööp,Animatschoon,Achtergrund,Muster,Menü-Twischenspieker,Twischenspieker,versteken,K-Menü,Leesteken,leste Dokmenten,Fixkieker,Nettkieker-Menü,Menü,Lüttbiller,Titel,Programmen,starten,markeren,handles,Grepen,Lüttbiller grötter maken
+Keywords[ne]=किकर, प्यानल, के प्यानल, कार्यपट्टी, सुरुपट्टी, सुरुआतपट्टी, स्थान, आकार, स्वत: लुकाउने, लुकाउनुहोस्, बटनहरू, एनिमेसन, पृष्ठभूमि, विषयवस्तुहरू, मेनु क्यास, क्यास, लुकेको, के-मेनु, पुस्तकचिनोहरू, हालको कागजातहरू, छिटो ब्राउजर, ब्राउजर मेनु, मेनु, प्रतिमा, टायलहरू, एप्लेटहरू, सुरु, हाइलाइट, ह्यान्डल गर्दछ, जुम प्रतिमा
+Keywords[nl]=kicker,paneel,kpanel,taakbalk,takenbalk,startbalk,startmenu,applicatie starter,locatie,afmeting,terminaltoepassing,auto hide,automatisch verbergen,verbergen,invouwen,knoppen,animatie,achtergrond,thema's,menu cache,cache,verborgen,K-Menu,bookmarks,bladwijzers,recente documenten,quickbrowser,browser menu,menu,icons,icoon,iconen,pictogrammen,tegels,tiles,applets,opstarten,highlight,accentuering,handles,zoomen,knoppen,handvatten,betrouwbare applets,security level,beveiligingsniveau
+Keywords[nn]=Kicker,panel,KPanel,oppgåvelinje,oppstartslinje,plassering,storleik,autogøym,gøym,knappar,animasjon,bakgrunn,tema,menymellomlager,mellomlager,gøymd,K-meny,bokmerke,nyleg bruka dokument,snøgglesar,katalogmeny,meny,ikon,brikker,applet,panelprogram,oppstart,merking,handtak,forstørring av ikon
+Keywords[pa]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons, ਪੈਨਲ, ਟਿਕਾਣਾ, ਬਰਾਊਜ਼ਰ, ਝਲਾਕਰਾ, ਕੈਂਚੇ, ਕੇ-ਮੇਨੂ, ਬੁੱਕਮਾਰਕ, ਤਾਜ਼ਾ, ਉਘੜੇ, ਹੈਂਡਲ, ਬਟਨ, ਸਰੂਪ, ਮੇਨੂ, ਓਹਲੇ, ਅਕਾਰ
+Keywords[pl]=kicker,panel,kpanel,pasek zadań,pasek startu,pasek uruchamiania,położenie,rozmiar,automatyczne ukrywanie,ukryj,przyciski,animacja,tło,motywy,bufor (cache) menu,bufor,cache,ukryty,K-Menu,zakładki,ostatnie dokumenty,szybkie przeglądanie,menu,ikony,kafelkowane,programiki,uruchomienie,podświetlanie,uchwyty,powiększanie ikon
+Keywords[pt]=kicker,painel,kpanel,barra de tarefas,barra de início,barra de lançamento,localização,tamanho,auto-esconder,esconder,botões,animação,fundo,temas,'cache' de menu,'cache',escondido,menu K,favoritos,documentos recentes,navegador rápido,menu de navegação,menu,ícones,mosaicos,'applets',inicio,realce,pegas,ícones aumentados
+Keywords[pt_BR]=kicker,painel,kpanel,barra de tarefas,lançar aplicativos,localização,tamanho,auto-ocultar,esconder,botões, animação,fundo,temas,cache de menu,cache,escondido,Menu K,favoritos,documentos recentes,navegador rápido, menu do navegador,menu,ícones,títulos,mini-aplicativos,iniciar,realçar, manipuladores, ícones de ampliação
+Keywords[ro]=kicker,panou,kpanel,bară de procese,bară de start,pornire,lansare,mărime,locație,ascundere automată,butoane,animație,fundal,tematică,meniu K,semne de carte,documente recente,navigator rapid,meniu navigare,meniu,iconițe,mozaic,miniaplicații,evidențiere,scalare
+Keywords[rw]=igitera,umwanya,k-umwanya,umurongogutangira,umurongogutangiza,indangahantu,ingano,kwihisha,guhisha,buto,iyega,mbuganyuma,insanganyamatsiko,ubwihisho bw'ibikubiyemo,ubwihisho,bihishe,K-Ibikubiyemo,utumenyetso,inyandiko zigezweho,mucukumbuzi yihuta,ibikubiyemo bya mucukumbuzi,ibikubiyemo,udushushondanga,udukaro,apuleti,gutangira,gushimangira,ibifashi,udushushondanga guhindura-ingano
+Keywords[se]=kicker,panela,kpanel,bargoholga,álggahanholga,báiki,sturrodat,autočiega,čiehkadit,boalut,animašuvdna,duogáš,fáddá,fálločiehkárájus,čiehkárájus,K-fállu,girjemearkkat,aiddo geavahuvvon dokumeantta,ohcofállu,fállu,govažat,prográmmažat,álggaheapmi,merken,geavjjat,luohttehahtti prográmmažat,sihkkarvuohtadássi
+Keywords[sk]=kicker,panel,kpanel,taskbar,startbar,launchbar,miesto,umiestnenie,veľkosť,terminálová aplikácia,skrývanie,automatické skrývanie,tlačidlá,animácia,pozadie,témy,cache,cache ponuky,skryté,K-Menu,záložky,posledné dokumenty,rýchly prehliadač,ponuka prehliadača,menu,ikony,applety,štart,zvýraznenie,handles,zväčšovanie ikon,overené applety,úroveň zabezpečenia
+Keywords[sl]=kicker,pult,kpanel,opravilna vrstica,zagonska vrstica,mesto,lokacija,velikost,terminalski program,skrij,samodejno skrivanje,skrivanje,gumbi,animacija,ozadje,teme,menijski predpomnilnik,predpomnilnik,skrit,K-Menu,zaznamki,nedavni dokumenti,hitro brskanje,brskalni meni,meni,tlakovci,ikone,vstavki,zagon,osvetlitev,ročice,ikone za povečavo
+Keywords[sr]=kicker,панел,kpanel,трака задатака,startbar,launchbar,локација,величина,Терминалски програм,аутоматско сакривање,сакривање,дугмићи,анимација,позадина,теме,мени кеш,кеш,скривен,K-Menu,маркери,скори документи,брзи прегледач,мени прегледача,мени,иконе,блокови,апплети,startup,истицање,хватаљке,увеличавање икона,аплети којима се верује,ниво безбедности
+Keywords[sr@Latn]=kicker,panel,kpanel,traka zadataka,startbar,launchbar,lokacija,veličina,Terminalski program,automatsko sakrivanje,sakrivanje,dugmići,animacija,pozadina,teme,meni keš,keš,skriven,K-Menu,markeri,skori dokumenti,brzi pregledač,meni pregledača,meni,ikone,blokovi,appleti,startup,isticanje,hvataljke,uveličavanje ikona,apleti kojima se veruje,nivo bezbednosti
+Keywords[sv]=kicker,panel,k-panel,aktivitetsfält,startfält,körningsfält,plats,storlek,dölj automatiskt,dölj,göm,knappar,animering,bakgrund,teman,menycache,cache,gömd,dold,K-meny,bokmärken,senaste dokument,snabbläddrare,bläddringsmeny,meny,ikoner,miniprogram,start,framhäv,grepp,zoomikoner
+Keywords[ta]=கிக்கர், பானல், கேபானல்,துவக்கப்பட்டி, துவங்கும்பட்டி,இடம்,அளவு, சத்தம் மறை, மறை,பட்டன், உயிர்சித்திரம்,பின்னனி,கருப்பொருள், தற்காலிக மெனு, மறைந்த,கே-மெனு,புத்தககுறிகள், தற்போதைய ஆவணம். வேக உலாவி, உலாவி மெனு, மெனு, சின்னம், சிறுநிரல், துவக்கம், கையாள், பெரிதாக்கும் சின்னங்கள்
+Keywords[th]=kicker,พาเนล,kpanel,taskbar,startbar,แถบเรียกโปรแกรม,ที่ตั้ง,ขนาด,ซ่อนอัตโนมัติ ,ซ่อน,ปุ่ม,อนิเมชั่น,พื้นหลัง,ชุดตกแต่ง,แคชของเมนู,แคช,ถูกซ่อน,K-Menu,ที่คั่นหน้า,เอกสารที่เพิ่งเปิดไป,quickbrowser,เมนูของบราวเซอร์,เมนู,ไอคอน,พื้นผิว,applets,startup,highlight,handles,ซูมไอคอน
+Keywords[tr]=kicker,panel,kpanel,görev çubuğu,başlangıç çubuğu,başlat çubuğu,konum,boyut,Uç birim uygulaması,otomatik gizle,gizle,tuşlar,animasyon,artalan,temalar,menü ön belleği,ön bellek,gizli,K-Menu,yer imleri,en son kullanılan belgeler,hızlı gözatıcı,göz atıcı menüsü,menü,simgeler,karo,programcıklar,Başlangıç,belirt,tutamaçlar,büyüyen simgeler,güvenilen programcıklar,güvenlik düzeyi
+Keywords[tt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser saylaq,saylaq,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[uk]=kicker,панель,смужка задач,kpanel,смужка запуску,розташування,розмір,консольна програма,автоматичне згортання,згортання,кнопки,анімація,тло,теми,кеш меню,кеш,схований,К-Меню,закладки,недавні документи,швидка навігація,меню навігатора,меню,піктограми,заголовки,аплети,запуск,підсвічування,маніпулятор,масштабування піктограм
+Keywords[uz]=panel,vazifalar paneli,bekitish,avto-bekitish,tugmalar,animatsiya,orqa fon,mavzular,K-menyu,kesh,yashirilgan,xatchoʻplar,yaqinda ochilgan hujjatlar,tez koʻruvchi,brauzer menyusi,menyuning keshi,menyu,nishonchalar,appletlar,nishonchalarni kattalashtirish,oʻlcham,kicker,kpanel,startbar,launchbar,joylashishi,tiles,startup,highlight,handles
+Keywords[uz@cyrillic]=панел,вазифалар панели,бекитиш,авто-бекитиш,тугмалар,анимация,орқа фон,мавзулар,К-меню,кэш,яширилган,хатчўплар,яқинда очилган ҳужжатлар,тез кўрувчи,браузер менюси,менюнинг кэши,меню,нишончалар,апплетлар,нишончаларни катталаштириш,ўлчам,kicker,kpanel,startbar,launchbar,жойлашиши,tiles,startup,highlight,handles
+Keywords[vi]=kích hoạt,bảng điều khiển,kpanel,thanh tác vụ,thanh khởi động,thanh phóng,vị trí,kích cỡ,tự ẩn,ẩn,nút,hoạt hình,mảnh nền,sắc thái,thực đơn đệm,đệm,giấu,Thực đơn K,số lưu liên kết,tài liệu gần đây,duyệt nhanh,thực đơn duyệt,thực đơn,biểu tượng,tiêu đề,tiểu ứng dụng,khởi động,nổi bật,cầm nắm,biểu tượng phóng đại,ứng dụng đáng tin,mức độ an ninh
+Keywords[wa]=kicker,panel,sicriftôr,scriftôr,kpanel,taskbar,bår des bouyes,startbar,launchbar,bår d' enondaedje,plaece,grandeu,catche tot seu,catchî,botons,animåvion,fond,tinmes,muchete menu,muchete,K-Menu,rimåkes,documints nén vî,betchteu rade,dresseŷe do betchteu,dressêye,menu,imådjetes,applets,apliketes,enonde tot seu,highlight,handles,zooming icons,zoumer les imådjetes
+Keywords[zh_CN]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons面板,任务栏,启动栏,位置,大小,自动隐藏,隐藏,按钮,动画,背景,主题,菜单缓存,缓存,书签,最近文档,快速浏览器,浏览器菜单,菜单,图标,平铺,启动,突出,句柄,缩放图标
+Keywords[zh_TW]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,面板,工作列,啟動列,快捷列,位置,大小,自動隱藏,隱藏,按鈕,動畫,背景,佈景主題,選單快取,快取,隱藏,K-選單,書籤,最近開啟的文件,快速瀏覽,瀏覽選單,選單,圖示,小圖塊,應用程式,啟動,高亮度,處理,縮放圖示
diff --git a/kcontrol/kicker/kicker_config_hiding.desktop b/kcontrol/kicker/kicker_config_hiding.desktop
new file mode 100644
index 000000000..60c040264
--- /dev/null
+++ b/kcontrol/kicker/kicker_config_hiding.desktop
@@ -0,0 +1,202 @@
+[Desktop Entry]
+Icon=kcmkicker
+Type=Application
+DocPath=kcontrol/panel/index.html#panel-hiding
+Exec=kcmshell kicker_hiding
+
+X-KDE-Library=kicker
+X-KDE-FactoryName=kicker_hiding
+X-KDE-ParentApp=kicker
+
+Name=Hiding
+Name[af]=Wegsteking
+Name[ar]=الإخفاء
+Name[be]=Хаванне
+Name[bg]=Скриване
+Name[bn]=লুকানো
+Name[br]=K&uzhat
+Name[bs]=Skrivanje
+Name[ca]=Ocultació
+Name[cs]=Skrývání
+Name[csb]=Tacenié
+Name[da]=Skjul
+Name[de]=Ausblenden
+Name[el]=Απόκρυψη
+Name[eo]=Kaŝanta
+Name[es]=Ocultar
+Name[et]=Peitmine
+Name[eu]=Ezkutatzea
+Name[fa]=مخفی کردن
+Name[fi]=Piilotus
+Name[fr]=Masquage
+Name[fy]=Ferstopwize
+Name[ga]=Folach
+Name[gl]=Ocultamento
+Name[he]=הסתרה
+Name[hr]=Skrivanje
+Name[hu]=Elrejtés
+Name[is]=Felun
+Name[it]=Scomparsa
+Name[ja]=隠す
+Name[ka]=დამალვა
+Name[kk]=Жасыру
+Name[km]=ការ​លាក់
+Name[lt]=Slėpimas
+Name[mk]=Криење
+Name[ms]=Penyembunyian
+Name[nb]=Skjuling
+Name[nds]=Versteken
+Name[ne]=लुकाइ
+Name[nl]=Verbergwijze
+Name[nn]=Gøyming
+Name[pa]=ਓਹਲੇ
+Name[pl]=Ukrywanie
+Name[pt]=Esconder
+Name[pt_BR]=Ocultação
+Name[ro]=Ascundere
+Name[ru]=Скрытие панели
+Name[rw]=Guhisha
+Name[se]=Čiehkadeapmi
+Name[sk]=Skrytie
+Name[sl]=Skrivanje
+Name[sr]=Скривање
+Name[sr@Latn]=Skrivanje
+Name[sv]=Dölj
+Name[ta]=மறைத்தல்
+Name[te]=దాగిన
+Name[tg]=Пинҳонӣ
+Name[th]=ซ่อน
+Name[tr]=Gizlenme
+Name[tt]=Yäşerü
+Name[uk]=Приховування
+Name[uz]=Bekitish
+Name[uz@cyrillic]=Бекитиш
+Name[vi]=Giấu
+Name[wa]=Catchî
+Name[zh_CN]=隐藏
+Name[zh_TW]=隱藏
+Comment=You can configure the hiding of the panel here
+Comment[af]=Jy kan die wegsteek van die paneel hier opstel
+Comment[ar]=هنا يمكنك إعداد إخفاء اللوح
+Comment[be]=Тут вы можаце змяніць рэжым хавання панэлі
+Comment[bg]=Настройване скриването на системния панел
+Comment[bn]=আপনি এখানে প্যানেল লুকানো এবং দেখানোর নিয়মাবলী নির্দিষ্ট করতে পারেন
+Comment[bs]=Ovdje možete podesiti sakrivanje panela
+Comment[ca]=Aquí podeu configurar l'ocultació del plafó
+Comment[cs]=Zde je možné nastavit skrývání panelu
+Comment[csb]=Tuwò je mòżno nastôwic tacenié panelu
+Comment[da]=Her kan du indstille at skjule panelet
+Comment[de]=Hier können Sie Einstellungen zum Ausblenden der Kontrollleiste vornehmen
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε την απόκρυψη του πίνακα
+Comment[eo]=Ĉi tie vi povas agordi la kaŝon de la panelo
+Comment[es]=Aquí puede configurar el que el panel se oculte.
+Comment[et]=Siin saad seadistada paneeli peitmist
+Comment[eu]=Panela ezkutatzea konfigura dezakezu hemen
+Comment[fa]=می‌توانید مخفی‌کردن تابلو را اینجا پیکربندی کنید
+Comment[fi]=Voit muokata paneelin piilottamista tässä
+Comment[fr]=Configuration du masquage du tableau de bord
+Comment[fy]=Jo kinne hjir de wize fan ferstopjen fan in paniel ynstelle
+Comment[gl]=Pode configurar aqui o ocultamento do painel
+Comment[he]=באפשרותך לשנות את ההסתרה של הלוח כאן
+Comment[hr]=Konfiguriranje skrivanja ploče
+Comment[hu]=Itt lehet beállítani a panel elrejtését
+Comment[is]=Hér getur þú stillt felunarham spjaldsins
+Comment[it]=Configura qui la scomparsa del pannello
+Comment[ja]=ここでパネルを隠す方法を設定します
+Comment[ka]=აქ შეგიძლიათ პანელის დამალვის მითითება
+Comment[kk]=Панельді жасыруын баптау
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនាសម្ព័ន្ធ​លាក់​បន្ទះ
+Comment[ko]=데스크톱의 행동 설정
+Comment[lt]=Čia galite konfigūruoti pulto slėpimą
+Comment[mk]=Тука може да го конфигурирате криењето на панелот
+Comment[ms]=Anda boleh konfigur penyembunyian panel di sini
+Comment[nb]=Her kan du sette opp hvordan panelet skal skjules
+Comment[nds]=Hier kannst Du dat Utblenn-Bedregen vun't Paneel instellen
+Comment[ne]=तपाईँले यहाँ प्यानलको लुकाइ कन्फिगर गर्न सक्नुहुन्छ
+Comment[nl]=U kunt hier de verbergwijze van het paneel instellen
+Comment[nn]=Her kan du velja korleis panelet skal gøymast.
+Comment[pa]=ਤੁਸੀਂ ਪੈਨਲ ਨੂੰ ਓਹਲੇ ਰੱਖਣ ਦੀ ਸੰਰਚਨਾ ਇੱਥੇ ਕਰ ਸਕਦੇ ਹੋ
+Comment[pl]=Tutaj można skonfigurować ukrywanie panelu
+Comment[pt]=Pode configurar a forma como o painel se esconde aqui
+Comment[pt_BR]=Você pode configurar a ocultação do painel aqui
+Comment[ro]=Aici puteți configura modul de ascundere al panoului KDE
+Comment[ru]=Настройка скрытия панели
+Comment[rw]=Ushobora kuboneza uguhisha k'umwanya hano
+Comment[se]=Dáppe sáhtát heivehit panela čiehkadeami
+Comment[sk]=Tu mnôžte nastaviť skrývanie panelu.
+Comment[sl]=Tu lahko nastavite skrivanje pulta
+Comment[sr]=Овде можете подесити скривање панела
+Comment[sr@Latn]=Ovde možete podesiti skrivanje panela
+Comment[sv]=Du kan anpassa när panelen döljs här
+Comment[ta]=பலகத்தின் மறைப்பை இங்கே வடிவமைக்க முடியும்
+Comment[tg]=Шумо метавонед пинҳоншавии пайраҳа дар ин ҷо танзим кунед
+Comment[th]=คุณสามารถปรับแต่งการซ่อนถาดพาเนลได้ที่นี่
+Comment[tr]=Panelin gizlenmesini buradan yapılandırabilirsiniz
+Comment[tt]=Taqtanıñ yäşerelüen caylaw urını
+Comment[uk]=Тут можна налаштувати приховування панелі
+Comment[uz]=Bu yerda panelni bekitishni moslash mumkin
+Comment[uz@cyrillic]=Бу ерда панелни бекитишни мослаш мумкин
+Comment[vi]=Bạn có thể cấu hình việc giấu các bảng điều khiển ở đây
+Comment[wa]=Vos ploz apontyî chal comint catchî l' sicriftôr
+Comment[zh_CN]=您可以在这里配置面板的隐藏
+Comment[zh_TW]=您可以在此設定面板是否隱藏
+Keywords=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[be]=Панэль,Панэль заданняў,Панэль стартавання,Размяшчэнне,Пазіцыя,Памер,Аўтаматычна хаваць,Хаваць,Кнопкі,Анімацыя,Фон,Тэмы,Кэш меню,Кэш,Схаваная,Схаваць,Меню KDE,Закладкі,Ранейшыя,Нядаўнія,Дакументы,Хуткі прагляд,Меню вандроўніка,Меню вандравання,Меню,Значкі,Аплеты,Запуск,Падсвятленне,Апрацоўка,Апрацоўшчык,Маштабаванне значак,kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[bg]=системен, панел, подредба, подравняване, kicker, panel, kpanel, taskbar, startbar, launchbar, location, size, auto hide, hide, buttons, animation, background, themes, menu cache, cache, hidden, K-Menu, bookmarks, recent documents, quickbrowser, browser menu, menu, icons, tiles, applets, startup, highlight, handles, zooming icons
+Keywords[bs]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,veličina,automatsko sakrivanje,sakrivanje,dugmad,animacija,pozadina,teme,keš menija,meni,keš,skriven,zabilješke,skorašnji dokumenti,meni browsera,meni preglednika,ikone,appleti,pokretanje,uvećavanje
+Keywords[ca]=kicker,plafó,kpanel,barra de tasques,barra d'inici,barra de llançament,localització,mida,auto oculta,oculta,botons,animació,temes,fons,cau del menú,cau,ocult,Menú K,punts,documents recents,navegació ràpida,menú de navegació,menú,icones,mosaics,aplets,arrencada,ressaltat,nanses,ampliar les icones
+Keywords[cs]=kicker,panel,kpanel,pruh úloh,lišta úloh,umístění, velikost,skrývání,automatické skrývání,tlačítka,animace,pozadí, motivy,nabídka,menu,záložky,nedávné dokumenty,rychlé prohlížení, ikony,dlaždice,applety,spuštění,zvýraznění,úchytky,zvětšování ikon
+Keywords[csb]=kicker,panel,kpanel,lëstëw zadaniów,sztartowô lëstëw,lëstëw zrëszaniô,pòłożenié,miara,aùtomatno tacënié,tacë,knąpë,animacëjô,spódk,spòdlé,témë,cache menu,cache,zatacony,K-Menu,załóżczi,slédny dokùmentë,chùtczé przezéranié,menu,ikònë,kafelkòwané,programiczi,zrëszanié,pòdskrzënianié,ùchwëtë,zwikszanié ikònów
+Keywords[cy]=ciciwr,kicker,panel,kpanel,bar tasgau,bar cychwyn,bar lansio,lleoliad,maint,awto-guddio,hunan-guddio,cuddio,botymau,animeiddiad,cefndir,themâu,storfa dewislen, storfa,cache,celc,cudd,K-Menu,nodau tudalen,dogfenni diweddar,porydd cyflym,dewislen porydd,dewislen,eiconau,teiliau,rhaglenigion,ymcychwyn,amlygu,carnau,eiconau chwyddo
+Keywords[da]=kicker,panel,kpanel,opgavelinje,startlinje,sted,størrelse,autogem,gem,knapper,animering,baggrund,temaer,menucache,cache,skjult,K-Menu,bogmærker,nylige dokumenter,hurtigsøger,søgemenu,menu,ikoner,fliser,panelprogrammer,opstart,markér,håndterer,ikoner
+Keywords[de]=Kicker,Panel,Taskbar,Kontrollleiste,Startleiste,Klickstartleiste,Fensterleiste,Autom. ausblenden,Ausblenden, Knöpfe,Animation,Hintergründe,Stile,Design,Themes,Menü-Zwischenspeicher, K-Menü,Zwischenspeicher,Lesezeichen,Zuletzt geöffnete Dateien, Schnellanzeiger,Menüs,Symbole,Icons,Kacheln,Applets,Miniprogramme, Java-Miniprogramme,Hervorhebung,Anfasser,Sicherheitsstufen,Zoom für Symbole
+Keywords[el]=kicker,πίνακας,kpanel,γραμμή εργασιών,γραμμή έναρξης,γραμμή εκκίνησης,τοποθεσία,μέγεθος,αυτόματη απόκρυψη,απόκρυψη,κουμπιά,εφέ κίνησης,φόντο,θέματα,λανθάνουσα μνήμη μενού,λανθάνουσα μνήμη,κρυφό, K-Μενού,σελιδοδείκτες,πρόσφατα έγγραφα,γρήγορος εξερευνητής,μενού εξερευνητή,μενού,εικονίδια,tiles,μικροεφαρμογές,έναρξη,τονισμός,χειριστήρια, μεγέθυνση εικονιδίων
+Keywords[eo]=lanĉilo,panelo,tasklistelo,situo,grandeco,aŭtokaŝo,kaŝo,butono,fono,etoso,menubufro,K-Menuo,legosigno,lasta dokumento,rapidrigardilo,rigardmenuo,piktogramo,kahelo,aplikaĵo,lanĉo,emfazo,teniloj,pligrandigo,fidindaj aplikaĵetoj,sekurecnivelo
+Keywords[es]=kicker,panel,kpanel,barra de tareas,barra de inicio,barra de lanzamiento,dirección,tamaño,auto ocultar,ocultar,botones,animación,fondo,temas,caché de menú,caché,oculto,Menú K,marcadores,documentos recientes,navegador rápido,menú navegador,menú,iconos,mosaicos,miniaplicaciones,arranque,resaltado,asas,iconos ampliados
+Keywords[et]=kicker,paneel,kpanel,tegumiriba,käivitusriba,asukoht,suurus,terminal,automaatne peitmine,peitmine,nupud,animatsioon,taust,teemad,menüü vahemälu,vahemälu,peidetud,K-menüü,järjehoidjad,viimati kasutatud dokumendid, kiirbrauser,lehitsemise menüü,menüü,ikoonid,apletid,käivitamine,esiletõstmine,piirded,ikoonide suurendamine,usaldusväärsed apletid,turvatase
+Keywords[eu]=kicker,panela,kpanela,ataza-barra,hasiera-barra,abiarazte-barra,kokapena, neurria,auto ezkutatu,ezkutatu,botoiak,animazioa,atzeko planoa, gaiak,menu-katxea,katxea,ezkutatu,K-menua,laster-markak,oraintsuko dokumentuak, arakatzaile bizkorra,arakatzaile menua,menua,ikonoak,baldosak,appletak,abiatu,nabarmendu,heldulekuak,zooming icons
+Keywords[fa]=kicker، تابلو، kpanel، میله‌ تکلیف، میله آغاز، میله راه‌انداز، محل، اندازه، مخفی کردن خودکار، مخفی کردن، دکمه‌ها، پویانمایی، زمینه، چهره‌ها، نهانگاه گزینگان، نهانگاه، مخفی، گزینگان K، چوب ‌الفها، سندهای اخیر، مرورگر سریع، گزینگان، مرورگر، شمایلها، کاشیها، برنامکها، راه‌اندازی، مشخص، گرداننده‌ها، بزرگ‌نمایی شمایلها
+Keywords[fi]=kicker,paneeli,kpanel,tehtäväpalkki,käynnistyspalkki,paikka,koko,automaattipiilotus,piilotus,napit,animaatio,tausta,teemat,valikkovälimuisti,välimuisti,K-valikko,kirjanmerkit,viimeaikaiset asiakirjat,pikaselain,selausvalikko,valikko,kuvakkeet,sovelmat,käynnistys,korostus,kahvat,kuvakkeiden suurennus
+Keywords[fr]=kicker,tableau de bord,barre du bas,barre des tâches,barre de démarrage,barre de lancement,emplacement,taille,auto-masquage,cacher,masquer,boutons,animation,fond,arrière-plan,thème,cache de menu,cache,caché,menu K,K,signets,documents récents,document récent,navigateur rapide,navigateur,menu,icône,mosaïque,applet,démarrage,surbrillance,poignée,poignées,zoom,zoom sur les icônes
+Keywords[fy]=kicker,paniel,kpanel,taakbalke,takebalke,Startbalke,startmenu,applikaasje begjinner,lokaasje,ôfmjiting,terminaltapassing,auto hide,automatysk ferstopje,ferstopje,Ynklappe,knoppen,animaasje,eftergrûn,tema's,menu lyts ûnthâld,lyts ûnthâld,ferstoppe,K-Menu,bookmarks,blêdwizers,resinte dokuminten,quickbrowser,browser menu,menu,icons,ikoan,ikoanen,tegels,tiles,applets,begjinne,opljochtsje,handles,zoomen,knoppen,hanfetten,betroubere applets,feiligens nivo
+Keywords[gl]=kicker,painel,kpanel,barra de tarefas,barra de comezo,barra de lanzamento,localización,tamaño,auto agochamento,agochamento,botóns,animación,fondo,temas,cache de menú,caché,oculto,Menú K,marcadores,derradeiros documentos,navegador rápido,menú de navegación,menú,iconas,apliques,início,resaltado,xestión,aumento de iconas
+Keywords[he]=kicker, לוח, kpanel, שורת משימות, שורת הרצה, מיקום, גודל, הסתרה אוטומטית, הסתר, אנימציה, רקע, ערכות, תפריט, מטמון, מוסתר, תפריט K, מועדפים, מסמכים אחרונים, דפדוף מהיר, תפריט, סימנים, סמלים, כותרות, יישומונים, אתחול, הדגשה, ידיות, הגדלת סמלים, taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons, panel
+Keywords[hi]=किकर,फलक,के-पेनल,कार्यपट्टी,प्रारंभपट्टी,चालकपट्टी,स्थान,आकार,स्वतः छुपें,छुपें,बटन्स,एनिमेशन,पृष्ठभूमि,प्रसंग,मेनू कैश,कैश,छुपा,के-मेन्यू,पसंद,हाल ही के दस्तावेज़,क्विक-ब्राउज़र,ब्राउज़र मेन्यू,मेन्यू,प्रतीक,टाइल्स,ऐप्लेट्स,स्टार्टअप,उभारना,हैंडल्स,जूमिंग प्रतीक
+Keywords[hr]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,ploča,traka zadataka,traka pokretanja,lokacija,veličina,automatsko skrivanje,skrivanje,gumbi,animacija,pozadina,teme,pohrana izbornika,pohrana,skriven,oznake,nedavni dokumenti,brzi preglednik,izbornik preglednika,izbornik,ikone,popločeno,apleti,naglašavanje,rukovanje,uvećane ikone
+Keywords[hu]=Kicker,panel,kpanel,feladatlista,start menü,indítómenü,indítósáv,hely,méret,automatikus elrejtés,elrejtés,gombok,animáció,háttér,témák,menügyorstár,gyorstár,rejtett,K menü,könyvjelzők,legutóbbi dokumentumok,gyorsböngésző,böngészőmenü,menü,ikonok,mozaikszerű,kisalkalmazások,indulás,kiemelés,fogantyúk,nagyítóikonok
+Keywords[is]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,trusted applets,security level
+Keywords[it]=kicker,pannello,kpanel,barra delle applicazioni,taskbar,startbar,launchbar,barra di avvio,posizione,dimensione,scomparsa automatica,pulsanti,animazione,sfondo,temi,cache dei menu,nascosto,Menu K,segnalibri,documenti recenti,browser veloce,menu,icone,piastrelle,applet,avvio,evidenziazione,maniglie,ingrandimento icone
+Keywords[ja]=kicker,パネル,kpanel,タスクバー,スタートバー,ラウンチバー,場所,サイズ,自動的に隠す,隠す,ボタン,アニメーション,背景,テーマ,メニューキャッシュ,キャッシュ,隠れた,Kメニュー,ブックマーク,最近のドキュメント,クイックブラウザ,ブラウザメニュー,メニュー,アイコン,タイル,アプレット,スタートアップ,ハイライト,ハンドル,アイコンのズーム
+Keywords[km]=kicker,បន្ទះ,kpanel,របារ​ភារកិច្ច,របារ​បើក​ដំណើរការ,ទីតាំង,ទំហំ,លាក់​ស្វ័យប្រវត្តិ,លាក់,ប៊ូតុង,ចលនា,ផ្ទៃ​ខាង​ក្រោយ,ស្បែក,ឃ្លាំង​សម្ងាត់​ម៉ឺនុយ,ឃ្លាំង​សម្ងាត់,លាក់,ម៉ឺនុយ K,កន្លែង​ចំណាំ,ឯកសារ​ថ្មីៗ​នេះ,កម្មវិធី​រុករក​រហ័ស,ម៉ឺនុយ​កម្មវិធី​រុករក,ម៉ឺនុយ,រូបតំណាង,ក្បឿង,អាប់ភ្លេត,ចាប់ផ្ដើម,បន្លិច,ប្រើ,រូបតំណាង​ពង្រីក
+Keywords[lt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,skydelis,kskydelis,užduočių juosta,paleidimo juosta,slėpti,mygtukai,animacija,fonas,temos,meniu atmintinė,atmintinė,paslėptas,žymelės,neseniai naudoti dokumentai,peržiūra,meniu,ženkliukai,perdengti,įskiepiai,paleistis,pažymėti,rankenėlės,išdidinti ženkliukus
+Keywords[lv]=kicker,panelis,kpanel,uzdevumjosla,startbar,launchbar,location,size,izmērs,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,grāmatzīmes,recent documents,quickbrowser,browser menu,izvēlne,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[mk]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,панел,лента со програми,локација,големина,авто криење,криење,копчиња,анимација,подлога,позадина,теми,кеш на менито,кеш,скриен,K-Мени,обележувачи, последни документи,брз прелистувач,мени за прелистувачи,мени,икони,плочки,аплети,рачки,зумирање на икони
+Keywords[mt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,favoriti,pannell,post,daqs,lokazzjoni,ħabi,animazzjoni,buttuni
+Keywords[nb]=kicker,panel,kpanel,oppgavelinje,startlinje,plassering,størrelse, autoskjul,skjul,knapper,animasjon,bakgrunn,temaer,mellomlager for temaer, mellomlager,skjult,K-meny,bokmerker,nylig brukte dokumenter,hurtigviser, katalogmeny,meny,ikoner,fliser,miniprogrammer,panelprogrammer,oppstart, uthev,håndtak,forstørring av ikoner
+Keywords[nds]=Kicker,Paneel,kpanel,Taskbalken,Programmbalken,Startbalken,Adress,Grött,automaatsch versteken,versteken,Knööp,Knoop,Knööp,Animatschoon,Achtergrund,Muster,Menü-Twischenspieker,Twischenspieker,versteken,K-Menü,Leesteken,leste Dokmenten,Fixkieker,Nettkieker-Menü,Menü,Lüttbiller,Titel,Programmen,starten,markeren,handles,Grepen,Lüttbiller grötter maken
+Keywords[ne]=किकर, प्यानल, के प्यानल, कार्यपट्टी, सुरुपट्टी, सुरुआतपट्टी, स्थान, आकार, स्वत: लुकाउने, लुकाउनुहोस्, बटनहरू, एनिमेसन, पृष्ठभूमि, विषयवस्तुहरू, मेनु क्यास, क्यास, लुकेको, के-मेनु, पुस्तकचिनोहरू, हालको कागजातहरू, छिटो ब्राउजर, ब्राउजर मेनु, मेनु, प्रतिमा, टायलहरू, एप्लेटहरू, सुरु, हाइलाइट, ह्यान्डल गर्दछ, जुम प्रतिमा
+Keywords[nl]=kicker,paneel,kpanel,taakbalk,takenbalk,startbalk,startmenu,applicatie starter,locatie,afmeting,terminaltoepassing,auto hide,automatisch verbergen,verbergen,invouwen,knoppen,animatie,achtergrond,thema's,menu cache,cache,verborgen,K-Menu,bookmarks,bladwijzers,recente documenten,quickbrowser,browser menu,menu,icons,icoon,iconen,pictogrammen,tegels,tiles,applets,opstarten,highlight,accentuering,handles,zoomen,knoppen,handvatten,betrouwbare applets,security level,beveiligingsniveau
+Keywords[nn]=Kicker,panel,KPanel,oppgåvelinje,oppstartslinje,plassering,storleik,autogøym,gøym,knappar,animasjon,bakgrunn,tema,menymellomlager,mellomlager,gøymd,K-meny,bokmerke,nyleg bruka dokument,snøgglesar,katalogmeny,meny,ikon,brikker,applet,panelprogram,oppstart,merking,handtak,forstørring av ikon
+Keywords[pa]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons, ਪੈਨਲ, ਟਿਕਾਣਾ, ਬਰਾਊਜ਼ਰ, ਝਲਾਕਰਾ, ਕੈਂਚੇ, ਕੇ-ਮੇਨੂ, ਬੁੱਕਮਾਰਕ, ਤਾਜ਼ਾ, ਉਘੜੇ, ਹੈਂਡਲ, ਬਟਨ, ਸਰੂਪ, ਮੇਨੂ, ਓਹਲੇ, ਅਕਾਰ
+Keywords[pl]=kicker,panel,kpanel,pasek zadań,pasek startu,pasek uruchamiania,położenie,rozmiar,automatyczne ukrywanie,ukryj,przyciski,animacja,tło,motywy,bufor (cache) menu,bufor,cache,ukryty,K-Menu,zakładki,ostatnie dokumenty,szybkie przeglądanie,menu,ikony,kafelkowane,programiki,uruchomienie,podświetlanie,uchwyty,powiększanie ikon
+Keywords[pt]=kicker,painel,kpanel,barra de tarefas,barra de início,barra de lançamento,localização,tamanho,auto-esconder,esconder,botões,animação,fundo,temas,'cache' de menu,'cache',escondido,menu K,favoritos,documentos recentes,navegador rápido,menu de navegação,menu,ícones,mosaicos,'applets',inicio,realce,pegas,ícones aumentados
+Keywords[pt_BR]=kicker,painel,kpanel,barra de tarefas,lançar aplicativos,localização,tamanho,auto-ocultar,esconder,botões, animação,fundo,temas,cache de menu,cache,escondido,Menu K,favoritos,documentos recentes,navegador rápido, menu do navegador,menu,ícones,títulos,mini-aplicativos,iniciar,realçar, manipuladores, ícones de ampliação
+Keywords[ro]=kicker,panou,kpanel,bară de procese,bară de start,pornire,lansare,mărime,locație,ascundere automată,butoane,animație,fundal,tematică,meniu K,semne de carte,documente recente,navigator rapid,meniu navigare,meniu,iconițe,mozaic,miniaplicații,evidențiere,scalare
+Keywords[rw]=igitera,umwanya,k-umwanya,umurongogutangira,umurongogutangiza,indangahantu,ingano,kwihisha,guhisha,buto,iyega,mbuganyuma,insanganyamatsiko,ubwihisho bw'ibikubiyemo,ubwihisho,bihishe,K-Ibikubiyemo,utumenyetso,inyandiko zigezweho,mucukumbuzi yihuta,ibikubiyemo bya mucukumbuzi,ibikubiyemo,udushushondanga,udukaro,apuleti,gutangira,gushimangira,ibifashi,udushushondanga guhindura-ingano
+Keywords[se]=kicker,panela,kpanel,bargoholga,álggahanholga,báiki,sturrodat,autočiega,čiehkadit,boalut,animašuvdna,duogáš,fáddá,fálločiehkárájus,čiehkárájus,K-fállu,girjemearkkat,aiddo geavahuvvon dokumeantta,ohcofállu,fállu,govažat,prográmmažat,álggaheapmi,merken,geavjjat,luohttehahtti prográmmažat,sihkkarvuohtadássi
+Keywords[sk]=kicker,panel,kpanel,taskbar,startbar,launchbar,miesto,umiestnenie,veľkosť,terminálová aplikácia,skrývanie,automatické skrývanie,tlačidlá,animácia,pozadie,témy,cache,cache ponuky,skryté,K-Menu,záložky,posledné dokumenty,rýchly prehliadač,ponuka prehliadača,menu,ikony,applety,štart,zvýraznenie,handles,zväčšovanie ikon,overené applety,úroveň zabezpečenia
+Keywords[sl]=kicker,pult,kpanel,opravilna vrstica,zagonska vrstica,mesto,lokacija,velikost,terminalski program,skrij,samodejno skrivanje,skrivanje,gumbi,animacija,ozadje,teme,menijski predpomnilnik,predpomnilnik,skrit,K-Menu,zaznamki,nedavni dokumenti,hitro brskanje,brskalni meni,meni,tlakovci,ikone,vstavki,zagon,osvetlitev,ročice,ikone za povečavo
+Keywords[sr]=kicker,панел,kpanel,трака задатака,startbar,launchbar,локација,величина,Терминалски програм,аутоматско сакривање,сакривање,дугмићи,анимација,позадина,теме,мени кеш,кеш,скривен,K-Menu,маркери,скори документи,брзи прегледач,мени прегледача,мени,иконе,блокови,апплети,startup,истицање,хватаљке,увеличавање икона,аплети којима се верује,ниво безбедности
+Keywords[sr@Latn]=kicker,panel,kpanel,traka zadataka,startbar,launchbar,lokacija,veličina,Terminalski program,automatsko sakrivanje,sakrivanje,dugmići,animacija,pozadina,teme,meni keš,keš,skriven,K-Menu,markeri,skori dokumenti,brzi pregledač,meni pregledača,meni,ikone,blokovi,appleti,startup,isticanje,hvataljke,uveličavanje ikona,apleti kojima se veruje,nivo bezbednosti
+Keywords[sv]=kicker,panel,k-panel,aktivitetsfält,startfält,körningsfält,plats,storlek,dölj automatiskt,dölj,göm,knappar,animering,bakgrund,teman,menycache,cache,gömd,dold,K-meny,bokmärken,senaste dokument,snabbläddrare,bläddringsmeny,meny,ikoner,miniprogram,start,framhäv,grepp,zoomikoner
+Keywords[ta]=கிக்கர், பானல், கேபானல்,துவக்கப்பட்டி, துவங்கும்பட்டி,இடம்,அளவு, சத்தம் மறை, மறை,பட்டன், உயிர்சித்திரம்,பின்னனி,கருப்பொருள், தற்காலிக மெனு, மறைந்த,கே-மெனு,புத்தககுறிகள், தற்போதைய ஆவணம். வேக உலாவி, உலாவி மெனு, மெனு, சின்னம், சிறுநிரல், துவக்கம், கையாள், பெரிதாக்கும் சின்னங்கள்
+Keywords[th]=kicker,พาเนล,kpanel,taskbar,startbar,แถบเรียกโปรแกรม,ที่ตั้ง,ขนาด,ซ่อนอัตโนมัติ ,ซ่อน,ปุ่ม,อนิเมชั่น,พื้นหลัง,ชุดตกแต่ง,แคชของเมนู,แคช,ถูกซ่อน,K-Menu,ที่คั่นหน้า,เอกสารที่เพิ่งเปิดไป,quickbrowser,เมนูของบราวเซอร์,เมนู,ไอคอน,พื้นผิว,applets,startup,highlight,handles,ซูมไอคอน
+Keywords[tr]=kicker,panel,kpanel,görev çubuğu,başlangıç çubuğu,başlat çubuğu,konum,boyut,Uç birim uygulaması,otomatik gizle,gizle,tuşlar,animasyon,artalan,temalar,menü ön belleği,ön bellek,gizli,K-Menu,yer imleri,en son kullanılan belgeler,hızlı gözatıcı,göz atıcı menüsü,menü,simgeler,karo,programcıklar,Başlangıç,belirt,tutamaçlar,büyüyen simgeler,güvenilen programcıklar,güvenlik düzeyi
+Keywords[tt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser saylaq,saylaq,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[uk]=kicker,панель,смужка задач,kpanel,смужка запуску,розташування,розмір,консольна програма,автоматичне згортання,згортання,кнопки,анімація,тло,теми,кеш меню,кеш,схований,К-Меню,закладки,недавні документи,швидка навігація,меню навігатора,меню,піктограми,заголовки,аплети,запуск,підсвічування,маніпулятор,масштабування піктограм
+Keywords[uz]=panel,vazifalar paneli,bekitish,avto-bekitish,tugmalar,animatsiya,orqa fon,mavzular,K-menyu,kesh,yashirilgan,xatchoʻplar,yaqinda ochilgan hujjatlar,tez koʻruvchi,brauzer menyusi,menyuning keshi,menyu,nishonchalar,appletlar,nishonchalarni kattalashtirish,oʻlcham,kicker,kpanel,startbar,launchbar,joylashishi,tiles,startup,highlight,handles
+Keywords[uz@cyrillic]=панел,вазифалар панели,бекитиш,авто-бекитиш,тугмалар,анимация,орқа фон,мавзулар,К-меню,кэш,яширилган,хатчўплар,яқинда очилган ҳужжатлар,тез кўрувчи,браузер менюси,менюнинг кэши,меню,нишончалар,апплетлар,нишончаларни катталаштириш,ўлчам,kicker,kpanel,startbar,launchbar,жойлашиши,tiles,startup,highlight,handles
+Keywords[vi]=kích hoạt,bảng điều khiển,kpanel,thanh tác vụ,thanh khởi động,thanh phóng,vị trí,kích cỡ,tự ẩn,ẩn,nút,hoạt hình,mảnh nền,sắc thái,thực đơn đệm,đệm,giấu,Thực đơn K,số lưu liên kết,tài liệu gần đây,duyệt nhanh,thực đơn duyệt,thực đơn,biểu tượng,tiêu đề,tiểu ứng dụng,khởi động,nổi bật,cầm nắm,biểu tượng phóng đại,ứng dụng đáng tin,mức độ an ninh
+Keywords[wa]=kicker,panel,sicriftôr,scriftôr,kpanel,taskbar,bår des bouyes,startbar,launchbar,bår d' enondaedje,plaece,grandeu,catche tot seu,catchî,botons,animåvion,fond,tinmes,muchete menu,muchete,K-Menu,rimåkes,documints nén vî,betchteu rade,dresseŷe do betchteu,dressêye,menu,imådjetes,applets,apliketes,enonde tot seu,highlight,handles,zooming icons,zoumer les imådjetes
+Keywords[zh_CN]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons面板,任务栏,启动栏,位置,大小,自动隐藏,隐藏,按钮,动画,背景,主题,菜单缓存,缓存,书签,最近文档,快速浏览器,浏览器菜单,菜单,图标,平铺,启动,突出,句柄,缩放图标
+Keywords[zh_TW]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,面板,工作列,啟動列,快捷列,位置,大小,自動隱藏,隱藏,按鈕,動畫,背景,佈景主題,選單快取,快取,隱藏,K-選單,書籤,最近開啟的文件,快速瀏覽,瀏覽選單,選單,圖示,小圖塊,應用程式,啟動,高亮度,處理,縮放圖示
diff --git a/kcontrol/kicker/kicker_config_menus.desktop b/kcontrol/kicker/kicker_config_menus.desktop
new file mode 100644
index 000000000..3dbb52d48
--- /dev/null
+++ b/kcontrol/kicker/kicker_config_menus.desktop
@@ -0,0 +1,199 @@
+[Desktop Entry]
+Icon=kcmkicker
+Type=Application
+DocPath=kcontrol/panel/index.html#panel-menus
+Exec=kcmshell kicker_menus
+
+X-KDE-Library=kicker
+X-KDE-FactoryName=kicker_menus
+X-KDE-ParentApp=kicker
+
+Name=Menus
+Name[af]=Kieslyste
+Name[ar]=القوائم
+Name[be]=Меню
+Name[bg]=Менюта
+Name[bn]=মেনু
+Name[br]=Meuziadoù
+Name[bs]=Meniji
+Name[ca]=Menús
+Name[cs]=Nabídky
+Name[csb]=Menu
+Name[da]=Menuer
+Name[de]=Menüs
+Name[el]=Μενού
+Name[eo]=Menuoj
+Name[es]=Menús
+Name[et]=Menüüd
+Name[eu]=Menuak
+Name[fa]=گزینگان
+Name[fi]=Valikot
+Name[fy]=Menu's
+Name[ga]=Roghchláir
+Name[he]=תפריטים
+Name[hr]=Izbornici
+Name[hu]=Menük
+Name[id]=Menu
+Name[is]=Valmyndir
+Name[it]=Menu
+Name[ja]=メニュー
+Name[ka]=მენიუები
+Name[kk]=Мәзірлер
+Name[km]=ម៉ឺនុយ
+Name[lt]=Meniu
+Name[mk]=Менија
+Name[ms]=Menu
+Name[nb]=Menyer
+Name[nds]=Menüs
+Name[ne]=मेनु
+Name[nl]=Menu's
+Name[nn]=Menyar
+Name[pa]=ਮੇਨੂ
+Name[pl]=Menu
+Name[ro]=Meniuri
+Name[ru]=Меню
+Name[rw]=Ibikubiyemo
+Name[se]=Fálut
+Name[sk]=Menu
+Name[sl]=Meniji
+Name[sr]=Менији
+Name[sr@Latn]=Meniji
+Name[sv]=Menyer
+Name[ta]=பட்டியல்கள்
+Name[te]=పట్టిలు
+Name[tg]=Меню
+Name[th]=เมนู
+Name[tr]=Menüler
+Name[tt]=Saylaq
+Name[uk]=Меню
+Name[uz]=Menyular
+Name[uz@cyrillic]=Менюлар
+Name[vi]=Thực đơn
+Name[wa]=Dressêyes
+Name[zh_CN]=菜单
+Name[zh_TW]=選單
+Comment=You can configure the menus of the panel here
+Comment[af]=Jy kan die kieslyste van die paneel hier opstel
+Comment[ar]=هنا يمكنك إعداد قوائم اللوح
+Comment[be]=Тут вы можаце змяніць настаўленні меню панэлі
+Comment[bg]=Настройване менютата на системния панел
+Comment[bn]=আপনি এখানে প্যানেল-এর মেনুসমূহ কনফিগার করতে পারেন
+Comment[bs]=Ovdje možete podesiti menije na panelu
+Comment[ca]=Aquí podeu configurar els menús del plafó
+Comment[cs]=Zde je možné nastavit nabídky panelu
+Comment[csb]=Tuwò je mòżno nastôwic menu panelu
+Comment[da]=Her kan du indstille panelets menuer
+Comment[de]=Hier können Sie Einstellungen für die Kontrollleiste vornehmen
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε τα μενού του πίνακα
+Comment[eo]=Ĉi tie vi povas agordi la menuon de la panelo
+Comment[es]=Configuración de la apariencia del panel
+Comment[et]=Siin saad seadistada paneeli menüüsid
+Comment[eu]=Panelaren menuak konfigura ditzakezu hemen
+Comment[fa]=می‌توانید گزینگان تابلو را اینجا پیکربندی کنید
+Comment[fi]=Voit muokata paneelin valikkoja tässä
+Comment[fr]=Configuration des menus du tableau de bord
+Comment[fy]=Jo kinne hjir de menu's fan it paniel ynstelle
+Comment[gl]=Pode configurar aqui os menus do painel
+Comment[he]=באפשרותך להגדיר את התפריטים של הלוח כאן
+Comment[hr]=Konfiguriranje izbornika ploče
+Comment[hu]=Itt lehet beállítani a panel menüit
+Comment[is]=Hér getur þú stillt valmyndir spjaldsins
+Comment[it]=Configura i menu del pannello
+Comment[ja]=ここでパネルのメニューを設定します
+Comment[ka]=აქ შეგიძლიათ პანელის მენიუების გამართვა
+Comment[kk]=Панельдің мәзірін баптау
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនាសម្ព័ន្ធម៉ឺនុយ​របស់​បន្ទះ
+Comment[ko]=데스크톱의 행동 설정
+Comment[lt]=Čia galite konfigūruoti visus pulto meniu
+Comment[mk]=Тука може да ги конфигурирате менијата на панелот
+Comment[ms]=Anda boleh konfigur menu panel di sini
+Comment[nb]=Her kan du sette opp hvordan panelmenyene skal se ut
+Comment[nds]=Hier kannst Du de Menüs vun't Paneel instellen
+Comment[ne]=तपाईँले यहाँ प्यानलको मेनु कन्फिगर गर्न सक्नुहुन्छ
+Comment[nl]=U kunt hier de menu's van het paneel instellen
+Comment[nn]=Her kan du setja opp menyane i panelet.
+Comment[pa]=ਤੁਸੀਂ ਪੈਨਲ ਮੇਨੂ ਦੀ ਸੰਰਚਨਾ ਇੱਥੇ ਕਰ ਸਕਦੇ ਹੋ
+Comment[pl]=Tutaj można skonfigurować menu panelu
+Comment[pt]=Pode configurar os menus do painel aqui
+Comment[pt_BR]=Você pode configurar os menus do painel aqui
+Comment[ro]=Aici puteți configura meniurile panoului KDE
+Comment[ru]=Настройка меню
+Comment[rw]=Ushobora kugena ibikubiyemo by'umwanya hano
+Comment[se]=Dáppe sáhtát heivehit panela fáluid
+Comment[sk]=Tu môžte nastaviť menu panelu.
+Comment[sl]=Tu lahko nastavite menije pulta
+Comment[sr]=Овде можете подесити меније панела
+Comment[sr@Latn]=Ovde možete podesiti menije panela
+Comment[sv]=Du kan anpassa panelens menyer här
+Comment[ta]=பலகத்தின் பட்டியல்களை இங்கே வடிவமைக்க முடியும்
+Comment[tg]=Шумо метавонед менюҳои панел дар ин ҷо танзим кунед
+Comment[th]=คุณสามารถปรับแต่งเมนูของถาดพาเนลได้ที่นี่
+Comment[tr]=Panelin menülerini buradan yapılandırabilirsiniz
+Comment[tt]=Taqtanıñ saylaqların caylaw urını
+Comment[uk]=Тут можна налаштувати різні меню панелі
+Comment[uz]=Bu yerda panelning menyularini moslash mumkin
+Comment[uz@cyrillic]=Бу ерда панелнинг менюларини мослаш мумкин
+Comment[vi]=Bạn có thể cấu hình thực đơn của các bảng điều khiển ở đây
+Comment[wa]=Vos ploz apontyî chal les dressêyes do scriftôr
+Comment[zh_CN]=您可以在这里配置面板的菜单
+Comment[zh_TW]=您可以在此設定面板的選單
+Keywords=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[be]=Панэль,Панэль заданняў,Панэль стартавання,Размяшчэнне,Пазіцыя,Памер,Аўтаматычна хаваць,Хаваць,Кнопкі,Анімацыя,Фон,Тэмы,Кэш меню,Кэш,Схаваная,Схаваць,Меню KDE,Закладкі,Ранейшыя,Нядаўнія,Дакументы,Хуткі прагляд,Меню вандроўніка,Меню вандравання,Меню,Значкі,Аплеты,Запуск,Падсвятленне,Апрацоўка,Апрацоўшчык,Маштабаванне значак,kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[bg]=системен, панел, подредба, подравняване, kicker, panel, kpanel, taskbar, startbar, launchbar, location, size, auto hide, hide, buttons, animation, background, themes, menu cache, cache, hidden, K-Menu, bookmarks, recent documents, quickbrowser, browser menu, menu, icons, tiles, applets, startup, highlight, handles, zooming icons
+Keywords[bs]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,veličina,automatsko sakrivanje,sakrivanje,dugmad,animacija,pozadina,teme,keš menija,meni,keš,skriven,zabilješke,skorašnji dokumenti,meni browsera,meni preglednika,ikone,appleti,pokretanje,uvećavanje
+Keywords[ca]=kicker,plafó,kpanel,barra de tasques,barra d'inici,barra de llançament,localització,mida,auto oculta,oculta,botons,animació,temes,fons,cau del menú,cau,ocult,Menú K,punts,documents recents,navegació ràpida,menú de navegació,menú,icones,mosaics,aplets,arrencada,ressaltat,nanses,ampliar les icones
+Keywords[cs]=kicker,panel,kpanel,pruh úloh,lišta úloh,umístění, velikost,skrývání,automatické skrývání,tlačítka,animace,pozadí, motivy,nabídka,menu,záložky,nedávné dokumenty,rychlé prohlížení, ikony,dlaždice,applety,spuštění,zvýraznění,úchytky,zvětšování ikon
+Keywords[csb]=kicker,panel,kpanel,lëstëw zadaniów,sztartowô lëstëw,lëstëw zrëszaniô,pòłożenié,miara,aùtomatno tacënié,tacë,knąpë,animacëjô,spódk,spòdlé,témë,cache menu,cache,zatacony,K-Menu,załóżczi,slédny dokùmentë,chùtczé przezéranié,menu,ikònë,kafelkòwané,programiczi,zrëszanié,pòdskrzënianié,ùchwëtë,zwikszanié ikònów
+Keywords[cy]=ciciwr,kicker,panel,kpanel,bar tasgau,bar cychwyn,bar lansio,lleoliad,maint,awto-guddio,hunan-guddio,cuddio,botymau,animeiddiad,cefndir,themâu,storfa dewislen, storfa,cache,celc,cudd,K-Menu,nodau tudalen,dogfenni diweddar,porydd cyflym,dewislen porydd,dewislen,eiconau,teiliau,rhaglenigion,ymcychwyn,amlygu,carnau,eiconau chwyddo
+Keywords[da]=kicker,panel,kpanel,opgavelinje,startlinje,sted,størrelse,autogem,gem,knapper,animering,baggrund,temaer,menucache,cache,skjult,K-Menu,bogmærker,nylige dokumenter,hurtigsøger,søgemenu,menu,ikoner,fliser,panelprogrammer,opstart,markér,håndterer,ikoner
+Keywords[de]=Kicker,Panel,Taskbar,Kontrollleiste,Startleiste,Klickstartleiste,Fensterleiste,Autom. ausblenden,Ausblenden, Knöpfe,Animation,Hintergründe,Stile,Design,Themes,Menü-Zwischenspeicher, K-Menü,Zwischenspeicher,Lesezeichen,Zuletzt geöffnete Dateien, Schnellanzeiger,Menüs,Symbole,Icons,Kacheln,Applets,Miniprogramme, Java-Miniprogramme,Hervorhebung,Anfasser,Sicherheitsstufen,Zoom für Symbole
+Keywords[el]=kicker,πίνακας,kpanel,γραμμή εργασιών,γραμμή έναρξης,γραμμή εκκίνησης,τοποθεσία,μέγεθος,αυτόματη απόκρυψη,απόκρυψη,κουμπιά,εφέ κίνησης,φόντο,θέματα,λανθάνουσα μνήμη μενού,λανθάνουσα μνήμη,κρυφό, K-Μενού,σελιδοδείκτες,πρόσφατα έγγραφα,γρήγορος εξερευνητής,μενού εξερευνητή,μενού,εικονίδια,tiles,μικροεφαρμογές,έναρξη,τονισμός,χειριστήρια, μεγέθυνση εικονιδίων
+Keywords[eo]=lanĉilo,panelo,tasklistelo,situo,grandeco,aŭtokaŝo,kaŝo,butono,fono,etoso,menubufro,K-Menuo,legosigno,lasta dokumento,rapidrigardilo,rigardmenuo,piktogramo,kahelo,aplikaĵo,lanĉo,emfazo,teniloj,pligrandigo,fidindaj aplikaĵetoj,sekurecnivelo
+Keywords[es]=kicker,panel,kpanel,barra de tareas,barra de inicio,barra de lanzamiento,dirección,tamaño,auto ocultar,ocultar,botones,animación,fondo,temas,caché de menú,caché,oculto,Menú K,marcadores,documentos recientes,navegador rápido,menú navegador,menú,iconos,mosaicos,miniaplicaciones,arranque,resaltado,asas,iconos ampliados
+Keywords[et]=kicker,paneel,kpanel,tegumiriba,käivitusriba,asukoht,suurus,terminal,automaatne peitmine,peitmine,nupud,animatsioon,taust,teemad,menüü vahemälu,vahemälu,peidetud,K-menüü,järjehoidjad,viimati kasutatud dokumendid, kiirbrauser,lehitsemise menüü,menüü,ikoonid,apletid,käivitamine,esiletõstmine,piirded,ikoonide suurendamine,usaldusväärsed apletid,turvatase
+Keywords[eu]=kicker,panela,kpanela,ataza-barra,hasiera-barra,abiarazte-barra,kokapena, neurria,auto ezkutatu,ezkutatu,botoiak,animazioa,atzeko planoa, gaiak,menu-katxea,katxea,ezkutatu,K-menua,laster-markak,oraintsuko dokumentuak, arakatzaile bizkorra,arakatzaile menua,menua,ikonoak,baldosak,appletak,abiatu,nabarmendu,heldulekuak,zooming icons
+Keywords[fa]=kicker، تابلو، kpanel، میله‌ تکلیف، میله آغاز، میله راه‌انداز، محل، اندازه، مخفی کردن خودکار، مخفی کردن، دکمه‌ها، پویانمایی، زمینه، چهره‌ها، نهانگاه گزینگان، نهانگاه، مخفی، گزینگان K، چوب ‌الفها، سندهای اخیر، مرورگر سریع، گزینگان، مرورگر، شمایلها، کاشیها، برنامکها، راه‌اندازی، مشخص، گرداننده‌ها، بزرگ‌نمایی شمایلها
+Keywords[fi]=kicker,paneeli,kpanel,tehtäväpalkki,käynnistyspalkki,paikka,koko,automaattipiilotus,piilotus,napit,animaatio,tausta,teemat,valikkovälimuisti,välimuisti,K-valikko,kirjanmerkit,viimeaikaiset asiakirjat,pikaselain,selausvalikko,valikko,kuvakkeet,sovelmat,käynnistys,korostus,kahvat,kuvakkeiden suurennus
+Keywords[fr]=kicker,tableau de bord,barre du bas,barre des tâches,barre de démarrage,barre de lancement,emplacement,taille,auto-masquage,cacher,masquer,boutons,animation,fond,arrière-plan,thème,cache de menu,cache,caché,menu K,K,signets,documents récents,document récent,navigateur rapide,navigateur,menu,icône,mosaïque,applet,démarrage,surbrillance,poignée,poignées,zoom,zoom sur les icônes
+Keywords[fy]=kicker,paniel,kpanel,taakbalke,takebalke,Startbalke,startmenu,applikaasje begjinner,lokaasje,ôfmjiting,terminaltapassing,auto hide,automatysk ferstopje,ferstopje,Ynklappe,knoppen,animaasje,eftergrûn,tema's,menu lyts ûnthâld,lyts ûnthâld,ferstoppe,K-Menu,bookmarks,blêdwizers,resinte dokuminten,quickbrowser,browser menu,menu,icons,ikoan,ikoanen,tegels,tiles,applets,begjinne,opljochtsje,handles,zoomen,knoppen,hanfetten,betroubere applets,feiligens nivo
+Keywords[gl]=kicker,painel,kpanel,barra de tarefas,barra de comezo,barra de lanzamento,localización,tamaño,auto agochamento,agochamento,botóns,animación,fondo,temas,cache de menú,caché,oculto,Menú K,marcadores,derradeiros documentos,navegador rápido,menú de navegación,menú,iconas,apliques,início,resaltado,xestión,aumento de iconas
+Keywords[he]=kicker, לוח, kpanel, שורת משימות, שורת הרצה, מיקום, גודל, הסתרה אוטומטית, הסתר, אנימציה, רקע, ערכות, תפריט, מטמון, מוסתר, תפריט K, מועדפים, מסמכים אחרונים, דפדוף מהיר, תפריט, סימנים, סמלים, כותרות, יישומונים, אתחול, הדגשה, ידיות, הגדלת סמלים, taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons, panel
+Keywords[hi]=किकर,फलक,के-पेनल,कार्यपट्टी,प्रारंभपट्टी,चालकपट्टी,स्थान,आकार,स्वतः छुपें,छुपें,बटन्स,एनिमेशन,पृष्ठभूमि,प्रसंग,मेनू कैश,कैश,छुपा,के-मेन्यू,पसंद,हाल ही के दस्तावेज़,क्विक-ब्राउज़र,ब्राउज़र मेन्यू,मेन्यू,प्रतीक,टाइल्स,ऐप्लेट्स,स्टार्टअप,उभारना,हैंडल्स,जूमिंग प्रतीक
+Keywords[hr]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,ploča,traka zadataka,traka pokretanja,lokacija,veličina,automatsko skrivanje,skrivanje,gumbi,animacija,pozadina,teme,pohrana izbornika,pohrana,skriven,oznake,nedavni dokumenti,brzi preglednik,izbornik preglednika,izbornik,ikone,popločeno,apleti,naglašavanje,rukovanje,uvećane ikone
+Keywords[hu]=Kicker,panel,kpanel,feladatlista,start menü,indítómenü,indítósáv,hely,méret,automatikus elrejtés,elrejtés,gombok,animáció,háttér,témák,menügyorstár,gyorstár,rejtett,K menü,könyvjelzők,legutóbbi dokumentumok,gyorsböngésző,böngészőmenü,menü,ikonok,mozaikszerű,kisalkalmazások,indulás,kiemelés,fogantyúk,nagyítóikonok
+Keywords[is]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,trusted applets,security level
+Keywords[it]=kicker,pannello,kpanel,barra delle applicazioni,taskbar,startbar,launchbar,barra di avvio,posizione,dimensione,scomparsa automatica,pulsanti,animazione,sfondo,temi,cache dei menu,nascosto,Menu K,segnalibri,documenti recenti,browser veloce,menu,icone,piastrelle,applet,avvio,evidenziazione,maniglie,ingrandimento icone
+Keywords[ja]=kicker,パネル,kpanel,タスクバー,スタートバー,ラウンチバー,場所,サイズ,自動的に隠す,隠す,ボタン,アニメーション,背景,テーマ,メニューキャッシュ,キャッシュ,隠れた,Kメニュー,ブックマーク,最近のドキュメント,クイックブラウザ,ブラウザメニュー,メニュー,アイコン,タイル,アプレット,スタートアップ,ハイライト,ハンドル,アイコンのズーム
+Keywords[km]=kicker,បន្ទះ,kpanel,របារ​ភារកិច្ច,របារ​បើក​ដំណើរការ,ទីតាំង,ទំហំ,លាក់​ស្វ័យប្រវត្តិ,លាក់,ប៊ូតុង,ចលនា,ផ្ទៃ​ខាង​ក្រោយ,ស្បែក,ឃ្លាំង​សម្ងាត់​ម៉ឺនុយ,ឃ្លាំង​សម្ងាត់,លាក់,ម៉ឺនុយ K,កន្លែង​ចំណាំ,ឯកសារ​ថ្មីៗ​នេះ,កម្មវិធី​រុករក​រហ័ស,ម៉ឺនុយ​កម្មវិធី​រុករក,ម៉ឺនុយ,រូបតំណាង,ក្បឿង,អាប់ភ្លេត,ចាប់ផ្ដើម,បន្លិច,ប្រើ,រូបតំណាង​ពង្រីក
+Keywords[lt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,skydelis,kskydelis,užduočių juosta,paleidimo juosta,slėpti,mygtukai,animacija,fonas,temos,meniu atmintinė,atmintinė,paslėptas,žymelės,neseniai naudoti dokumentai,peržiūra,meniu,ženkliukai,perdengti,įskiepiai,paleistis,pažymėti,rankenėlės,išdidinti ženkliukus
+Keywords[lv]=kicker,panelis,kpanel,uzdevumjosla,startbar,launchbar,location,size,izmērs,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,grāmatzīmes,recent documents,quickbrowser,browser menu,izvēlne,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[mk]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,панел,лента со програми,локација,големина,авто криење,криење,копчиња,анимација,подлога,позадина,теми,кеш на менито,кеш,скриен,K-Мени,обележувачи, последни документи,брз прелистувач,мени за прелистувачи,мени,икони,плочки,аплети,рачки,зумирање на икони
+Keywords[mt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,favoriti,pannell,post,daqs,lokazzjoni,ħabi,animazzjoni,buttuni
+Keywords[nb]=kicker,panel,kpanel,oppgavelinje,startlinje,plassering,størrelse, autoskjul,skjul,knapper,animasjon,bakgrunn,temaer,mellomlager for temaer, mellomlager,skjult,K-meny,bokmerker,nylig brukte dokumenter,hurtigviser, katalogmeny,meny,ikoner,fliser,miniprogrammer,panelprogrammer,oppstart, uthev,håndtak,forstørring av ikoner
+Keywords[nds]=Kicker,Paneel,kpanel,Taskbalken,Programmbalken,Startbalken,Adress,Grött,automaatsch versteken,versteken,Knööp,Knoop,Knööp,Animatschoon,Achtergrund,Muster,Menü-Twischenspieker,Twischenspieker,versteken,K-Menü,Leesteken,leste Dokmenten,Fixkieker,Nettkieker-Menü,Menü,Lüttbiller,Titel,Programmen,starten,markeren,handles,Grepen,Lüttbiller grötter maken
+Keywords[ne]=किकर, प्यानल, के प्यानल, कार्यपट्टी, सुरुपट्टी, सुरुआतपट्टी, स्थान, आकार, स्वत: लुकाउने, लुकाउनुहोस्, बटनहरू, एनिमेसन, पृष्ठभूमि, विषयवस्तुहरू, मेनु क्यास, क्यास, लुकेको, के-मेनु, पुस्तकचिनोहरू, हालको कागजातहरू, छिटो ब्राउजर, ब्राउजर मेनु, मेनु, प्रतिमा, टायलहरू, एप्लेटहरू, सुरु, हाइलाइट, ह्यान्डल गर्दछ, जुम प्रतिमा
+Keywords[nl]=kicker,paneel,kpanel,taakbalk,takenbalk,startbalk,startmenu,applicatie starter,locatie,afmeting,terminaltoepassing,auto hide,automatisch verbergen,verbergen,invouwen,knoppen,animatie,achtergrond,thema's,menu cache,cache,verborgen,K-Menu,bookmarks,bladwijzers,recente documenten,quickbrowser,browser menu,menu,icons,icoon,iconen,pictogrammen,tegels,tiles,applets,opstarten,highlight,accentuering,handles,zoomen,knoppen,handvatten,betrouwbare applets,security level,beveiligingsniveau
+Keywords[nn]=Kicker,panel,KPanel,oppgåvelinje,oppstartslinje,plassering,storleik,autogøym,gøym,knappar,animasjon,bakgrunn,tema,menymellomlager,mellomlager,gøymd,K-meny,bokmerke,nyleg bruka dokument,snøgglesar,katalogmeny,meny,ikon,brikker,applet,panelprogram,oppstart,merking,handtak,forstørring av ikon
+Keywords[pa]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons, ਪੈਨਲ, ਟਿਕਾਣਾ, ਬਰਾਊਜ਼ਰ, ਝਲਾਕਰਾ, ਕੈਂਚੇ, ਕੇ-ਮੇਨੂ, ਬੁੱਕਮਾਰਕ, ਤਾਜ਼ਾ, ਉਘੜੇ, ਹੈਂਡਲ, ਬਟਨ, ਸਰੂਪ, ਮੇਨੂ, ਓਹਲੇ, ਅਕਾਰ
+Keywords[pl]=kicker,panel,kpanel,pasek zadań,pasek startu,pasek uruchamiania,położenie,rozmiar,automatyczne ukrywanie,ukryj,przyciski,animacja,tło,motywy,bufor (cache) menu,bufor,cache,ukryty,K-Menu,zakładki,ostatnie dokumenty,szybkie przeglądanie,menu,ikony,kafelkowane,programiki,uruchomienie,podświetlanie,uchwyty,powiększanie ikon
+Keywords[pt]=kicker,painel,kpanel,barra de tarefas,barra de início,barra de lançamento,localização,tamanho,auto-esconder,esconder,botões,animação,fundo,temas,'cache' de menu,'cache',escondido,menu K,favoritos,documentos recentes,navegador rápido,menu de navegação,menu,ícones,mosaicos,'applets',inicio,realce,pegas,ícones aumentados
+Keywords[pt_BR]=kicker,painel,kpanel,barra de tarefas,lançar aplicativos,localização,tamanho,auto-ocultar,esconder,botões, animação,fundo,temas,cache de menu,cache,escondido,Menu K,favoritos,documentos recentes,navegador rápido, menu do navegador,menu,ícones,títulos,mini-aplicativos,iniciar,realçar, manipuladores, ícones de ampliação
+Keywords[ro]=kicker,panou,kpanel,bară de procese,bară de start,pornire,lansare,mărime,locație,ascundere automată,butoane,animație,fundal,tematică,meniu K,semne de carte,documente recente,navigator rapid,meniu navigare,meniu,iconițe,mozaic,miniaplicații,evidențiere,scalare
+Keywords[rw]=igitera,umwanya,k-umwanya,umurongogutangira,umurongogutangiza,indangahantu,ingano,kwihisha,guhisha,buto,iyega,mbuganyuma,insanganyamatsiko,ubwihisho bw'ibikubiyemo,ubwihisho,bihishe,K-Ibikubiyemo,utumenyetso,inyandiko zigezweho,mucukumbuzi yihuta,ibikubiyemo bya mucukumbuzi,ibikubiyemo,udushushondanga,udukaro,apuleti,gutangira,gushimangira,ibifashi,udushushondanga guhindura-ingano
+Keywords[se]=kicker,panela,kpanel,bargoholga,álggahanholga,báiki,sturrodat,autočiega,čiehkadit,boalut,animašuvdna,duogáš,fáddá,fálločiehkárájus,čiehkárájus,K-fállu,girjemearkkat,aiddo geavahuvvon dokumeantta,ohcofállu,fállu,govažat,prográmmažat,álggaheapmi,merken,geavjjat,luohttehahtti prográmmažat,sihkkarvuohtadássi
+Keywords[sk]=kicker,panel,kpanel,taskbar,startbar,launchbar,miesto,umiestnenie,veľkosť,terminálová aplikácia,skrývanie,automatické skrývanie,tlačidlá,animácia,pozadie,témy,cache,cache ponuky,skryté,K-Menu,záložky,posledné dokumenty,rýchly prehliadač,ponuka prehliadača,menu,ikony,applety,štart,zvýraznenie,handles,zväčšovanie ikon,overené applety,úroveň zabezpečenia
+Keywords[sl]=kicker,pult,kpanel,opravilna vrstica,zagonska vrstica,mesto,lokacija,velikost,terminalski program,skrij,samodejno skrivanje,skrivanje,gumbi,animacija,ozadje,teme,menijski predpomnilnik,predpomnilnik,skrit,K-Menu,zaznamki,nedavni dokumenti,hitro brskanje,brskalni meni,meni,tlakovci,ikone,vstavki,zagon,osvetlitev,ročice,ikone za povečavo
+Keywords[sr]=kicker,панел,kpanel,трака задатака,startbar,launchbar,локација,величина,Терминалски програм,аутоматско сакривање,сакривање,дугмићи,анимација,позадина,теме,мени кеш,кеш,скривен,K-Menu,маркери,скори документи,брзи прегледач,мени прегледача,мени,иконе,блокови,апплети,startup,истицање,хватаљке,увеличавање икона,аплети којима се верује,ниво безбедности
+Keywords[sr@Latn]=kicker,panel,kpanel,traka zadataka,startbar,launchbar,lokacija,veličina,Terminalski program,automatsko sakrivanje,sakrivanje,dugmići,animacija,pozadina,teme,meni keš,keš,skriven,K-Menu,markeri,skori dokumenti,brzi pregledač,meni pregledača,meni,ikone,blokovi,appleti,startup,isticanje,hvataljke,uveličavanje ikona,apleti kojima se veruje,nivo bezbednosti
+Keywords[sv]=kicker,panel,k-panel,aktivitetsfält,startfält,körningsfält,plats,storlek,dölj automatiskt,dölj,göm,knappar,animering,bakgrund,teman,menycache,cache,gömd,dold,K-meny,bokmärken,senaste dokument,snabbläddrare,bläddringsmeny,meny,ikoner,miniprogram,start,framhäv,grepp,zoomikoner
+Keywords[ta]=கிக்கர், பானல், கேபானல்,துவக்கப்பட்டி, துவங்கும்பட்டி,இடம்,அளவு, சத்தம் மறை, மறை,பட்டன், உயிர்சித்திரம்,பின்னனி,கருப்பொருள், தற்காலிக மெனு, மறைந்த,கே-மெனு,புத்தககுறிகள், தற்போதைய ஆவணம். வேக உலாவி, உலாவி மெனு, மெனு, சின்னம், சிறுநிரல், துவக்கம், கையாள், பெரிதாக்கும் சின்னங்கள்
+Keywords[th]=kicker,พาเนล,kpanel,taskbar,startbar,แถบเรียกโปรแกรม,ที่ตั้ง,ขนาด,ซ่อนอัตโนมัติ ,ซ่อน,ปุ่ม,อนิเมชั่น,พื้นหลัง,ชุดตกแต่ง,แคชของเมนู,แคช,ถูกซ่อน,K-Menu,ที่คั่นหน้า,เอกสารที่เพิ่งเปิดไป,quickbrowser,เมนูของบราวเซอร์,เมนู,ไอคอน,พื้นผิว,applets,startup,highlight,handles,ซูมไอคอน
+Keywords[tr]=kicker,panel,kpanel,görev çubuğu,başlangıç çubuğu,başlat çubuğu,konum,boyut,Uç birim uygulaması,otomatik gizle,gizle,tuşlar,animasyon,artalan,temalar,menü ön belleği,ön bellek,gizli,K-Menu,yer imleri,en son kullanılan belgeler,hızlı gözatıcı,göz atıcı menüsü,menü,simgeler,karo,programcıklar,Başlangıç,belirt,tutamaçlar,büyüyen simgeler,güvenilen programcıklar,güvenlik düzeyi
+Keywords[tt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser saylaq,saylaq,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[uk]=kicker,панель,смужка задач,kpanel,смужка запуску,розташування,розмір,консольна програма,автоматичне згортання,згортання,кнопки,анімація,тло,теми,кеш меню,кеш,схований,К-Меню,закладки,недавні документи,швидка навігація,меню навігатора,меню,піктограми,заголовки,аплети,запуск,підсвічування,маніпулятор,масштабування піктограм
+Keywords[uz]=panel,vazifalar paneli,bekitish,avto-bekitish,tugmalar,animatsiya,orqa fon,mavzular,K-menyu,kesh,yashirilgan,xatchoʻplar,yaqinda ochilgan hujjatlar,tez koʻruvchi,brauzer menyusi,menyuning keshi,menyu,nishonchalar,appletlar,nishonchalarni kattalashtirish,oʻlcham,kicker,kpanel,startbar,launchbar,joylashishi,tiles,startup,highlight,handles
+Keywords[uz@cyrillic]=панел,вазифалар панели,бекитиш,авто-бекитиш,тугмалар,анимация,орқа фон,мавзулар,К-меню,кэш,яширилган,хатчўплар,яқинда очилган ҳужжатлар,тез кўрувчи,браузер менюси,менюнинг кэши,меню,нишончалар,апплетлар,нишончаларни катталаштириш,ўлчам,kicker,kpanel,startbar,launchbar,жойлашиши,tiles,startup,highlight,handles
+Keywords[vi]=kích hoạt,bảng điều khiển,kpanel,thanh tác vụ,thanh khởi động,thanh phóng,vị trí,kích cỡ,tự ẩn,ẩn,nút,hoạt hình,mảnh nền,sắc thái,thực đơn đệm,đệm,giấu,Thực đơn K,số lưu liên kết,tài liệu gần đây,duyệt nhanh,thực đơn duyệt,thực đơn,biểu tượng,tiêu đề,tiểu ứng dụng,khởi động,nổi bật,cầm nắm,biểu tượng phóng đại,ứng dụng đáng tin,mức độ an ninh
+Keywords[wa]=kicker,panel,sicriftôr,scriftôr,kpanel,taskbar,bår des bouyes,startbar,launchbar,bår d' enondaedje,plaece,grandeu,catche tot seu,catchî,botons,animåvion,fond,tinmes,muchete menu,muchete,K-Menu,rimåkes,documints nén vî,betchteu rade,dresseŷe do betchteu,dressêye,menu,imådjetes,applets,apliketes,enonde tot seu,highlight,handles,zooming icons,zoumer les imådjetes
+Keywords[zh_CN]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons面板,任务栏,启动栏,位置,大小,自动隐藏,隐藏,按钮,动画,背景,主题,菜单缓存,缓存,书签,最近文档,快速浏览器,浏览器菜单,菜单,图标,平铺,启动,突出,句柄,缩放图标
+Keywords[zh_TW]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,面板,工作列,啟動列,快捷列,位置,大小,自動隱藏,隱藏,按鈕,動畫,背景,佈景主題,選單快取,快取,隱藏,K-選單,書籤,最近開啟的文件,快速瀏覽,瀏覽選單,選單,圖示,小圖塊,應用程式,啟動,高亮度,處理,縮放圖示
diff --git a/kcontrol/kicker/lookandfeelconfig.cpp b/kcontrol/kicker/lookandfeelconfig.cpp
new file mode 100644
index 000000000..7f43f2c05
--- /dev/null
+++ b/kcontrol/kicker/lookandfeelconfig.cpp
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2005 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ */
+
+#include <qlayout.h>
+#include <qtimer.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include "lookandfeeltab_impl.h"
+#include "kickerSettings.h"
+#include "main.h"
+
+#include "lookandfeelconfig.h"
+#include "lookandfeelconfig.moc"
+
+LookAndFeelConfig::LookAndFeelConfig(QWidget *parent, const char *name)
+ : KCModule(parent, name)
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ m_widget = new LookAndFeelTab(this);
+ layout->addWidget(m_widget);
+ layout->addStretch();
+
+ setQuickHelp(KickerConfig::the()->quickHelp());
+ setAboutData(KickerConfig::the()->aboutData());
+
+ addConfig(KickerSettings::self(), m_widget);
+
+ connect(m_widget, SIGNAL(changed()),
+ this, SLOT(changed()));
+ connect(KickerConfig::the(), SIGNAL(aboutToNotifyKicker()),
+ this, SLOT(aboutToNotifyKicker()));
+
+ load();
+ QTimer::singleShot(0, this, SLOT(notChanged()));
+}
+
+void LookAndFeelConfig::notChanged()
+{
+ emit changed(false);
+}
+
+void LookAndFeelConfig::load()
+{
+ KCModule::load();
+ m_widget->load();
+}
+
+void LookAndFeelConfig::aboutToNotifyKicker()
+{
+ kdDebug() << "LookAndFeelConfig::aboutToNotifyKicker()" << endl;
+
+ // This slot is triggered by the signal,
+ // which is send before Kicker is notified.
+ // See comment in save().
+ KCModule::save();
+ m_widget->save();
+}
+
+void LookAndFeelConfig::save()
+{
+ // As we don't want to notify Kicker multiple times
+ // we do not save the settings here. Instead the
+ // KickerConfig object sends a signal before the
+ // notification. On this signal all existing modules,
+ // including this object, save their settings.
+ KickerConfig::the()->notifyKicker();
+}
+
+void LookAndFeelConfig::defaults()
+{
+ KCModule::defaults();
+ m_widget->defaults();
+
+ // KConfigDialogManager may queue an changed(false) signal,
+ // so we make sure, that the module is labeled as changed,
+ // while we manage some of the widgets ourselves
+ QTimer::singleShot(0, this, SLOT(changed()));
+}
diff --git a/kcontrol/kicker/lookandfeelconfig.h b/kcontrol/kicker/lookandfeelconfig.h
new file mode 100644
index 000000000..93b331432
--- /dev/null
+++ b/kcontrol/kicker/lookandfeelconfig.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2005 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ */
+
+#ifndef __lookandfeelconfig_h__
+#define __lookandfeelconfig_h__
+
+#include <kcmodule.h>
+
+class LookAndFeelTab;
+
+class LookAndFeelConfig : public KCModule
+{
+ Q_OBJECT
+
+public:
+ LookAndFeelConfig(QWidget *parent = 0, const char *name = 0);
+
+ void load();
+ void save();
+ void defaults();
+
+public slots:
+ void notChanged();
+ void aboutToNotifyKicker();
+
+private:
+ LookAndFeelTab *m_widget;
+};
+
+#endif // __lookandfeelconfig_h__
diff --git a/kcontrol/kicker/lookandfeeltab.ui b/kcontrol/kicker/lookandfeeltab.ui
new file mode 100644
index 000000000..675f5adb0
--- /dev/null
+++ b/kcontrol/kicker/lookandfeeltab.ui
@@ -0,0 +1,635 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>LookAndFeelTabBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>LookAndFeelTabBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>416</width>
+ <height>443</height>
+ </rect>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is selected, informational tooltips will appear when the mouse cursor moves over the icons, buttons and applets in the panel.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>general_group</cstring>
+ </property>
+ <property name="title">
+ <string>General</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_ShowMouseOverEffects</cstring>
+ </property>
+ <property name="text">
+ <string>Enable icon &amp;mouseover effects</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected a mouseover effect appears when the mouse cursor is moved over panel buttons</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_ShowToolTips</cstring>
+ </property>
+ <property name="text">
+ <string>Show too&amp;ltips</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected informational tooltips will appear when the mouse cursor moves over the icons, buttons and applets in the panel.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox9</cstring>
+ </property>
+ <property name="title">
+ <string>Button Backgrounds</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;K menu:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_kmenuTile</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a tile image for the K menu.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;QuickBrowser menus:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_browserTile</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a tile image for Quick Browser buttons.</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="3" column="1">
+ <item>
+ <property name="text">
+ <string>Default</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Custom Color</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_browserTile</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="insertionPolicy">
+ <enum>NoInsertion</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a tile image for Quick Browser buttons.</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>Default</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Custom Color</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_kmenuTile</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="insertionPolicy">
+ <enum>NoInsertion</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a tile image for the K menu.</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="3" column="2">
+ <property name="name">
+ <cstring>kcfg_BrowserTileColor</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When the Custom Color option is selected, use this button to pick a color for quick browser tile backgrounds</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="0" column="2">
+ <property name="name">
+ <cstring>kcfg_KMenuTileColor</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When the Custom Color option is selected, use this button to pick a color for the K menu tile background</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="4" column="1">
+ <item>
+ <property name="text">
+ <string>Default</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Custom Color</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_windowListTile</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="insertionPolicy">
+ <enum>NoInsertion</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a tile image for window list buttons.</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="4" column="2">
+ <property name="name">
+ <cstring>kcfg_WindowListTileColor</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When the Custom Color option is selected, use this button to pick a color for window list tile backgrounds</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>TextLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Window list:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_windowListTile</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a tile image for window list buttons.</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="2" column="1">
+ <item>
+ <property name="text">
+ <string>Default</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Custom Color</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_desktopTile</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="insertionPolicy">
+ <enum>NoInsertion</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a tile image for desktop access buttons.</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="2" column="2">
+ <property name="name">
+ <cstring>kcfg_DesktopButtonTileColor</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When the Custom Color option is selected, use this button to pick a color for the desktop tile background</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>De&amp;sktop access:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_desktopTile</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a tile image for desktop access buttons.</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="1" column="2">
+ <property name="name">
+ <cstring>kcfg_URLTileColor</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When the Custom Color option is selected, use this button to pick a color for application tile backgrounds</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Applicatio&amp;ns:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_urlTile</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a tile image for buttons that launch applications.</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="1" column="1">
+ <item>
+ <property name="text">
+ <string>Default</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Custom Color</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_urlTile</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="insertionPolicy">
+ <enum>NoInsertion</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose a tile image for buttons that launch applications.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="3" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>Spacer48</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>66</width>
+ <height>130</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Panel Background</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="2" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="3" column="1">
+ <property name="name">
+ <cstring>kcfg_ColorizeBackground</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Colorize to &amp;match the desktop color scheme</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is selected, the panel background image will be colored to match the default colors. To change the default colors, go to the 'Colors' control module.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>m_backgroundLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>50</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>50</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ <property name="vAlign" stdset="0">
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is a preview for the selected background image.</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="2" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>kcfg_BackgroundTheme</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can choose a theme to be displayed by the panel. Press the 'Browse' button to choose a theme using the file dialog.
+This option is only active if 'Enable background image' is selected.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>kcfg_UseBackgroundTheme</cstring>
+ </property>
+ <property name="text">
+ <string>Enable &amp;background image</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>kcfg_Transparent</cstring>
+ </property>
+ <property name="text">
+ <string>Enable &amp;transparency</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>advancedOptionsButton</cstring>
+ </property>
+ <property name="text">
+ <string>Advanc&amp;ed Options</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to open the Advanced Options dialog. You can configure the applet handles look and feel, the tint transparency color and more.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>289</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>kcfg_BackgroundTheme</sender>
+ <signal>urlSelected(const QString&amp;)</signal>
+ <receiver>LookAndFeelTabBase</receiver>
+ <slot>browseTheme(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>advancedOptionsButton</sender>
+ <signal>clicked()</signal>
+ <receiver>LookAndFeelTabBase</receiver>
+ <slot>launchAdvancedDialog()</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_BackgroundTheme</sender>
+ <signal>returnPressed(const QString&amp;)</signal>
+ <receiver>LookAndFeelTabBase</receiver>
+ <slot>browseTheme(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_Transparent</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>LookAndFeelTabBase</receiver>
+ <slot>enableTransparency(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_UseBackgroundTheme</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_backgroundLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_UseBackgroundTheme</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_ColorizeBackground</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>kcfg_UseBackgroundTheme</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_BackgroundTheme</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>kcfg_ShowMouseOverEffects</tabstop>
+ <tabstop>kcfg_ShowToolTips</tabstop>
+ <tabstop>m_kmenuTile</tabstop>
+ <tabstop>kcfg_KMenuTileColor</tabstop>
+ <tabstop>m_urlTile</tabstop>
+ <tabstop>kcfg_URLTileColor</tabstop>
+ <tabstop>m_desktopTile</tabstop>
+ <tabstop>kcfg_DesktopButtonTileColor</tabstop>
+ <tabstop>m_browserTile</tabstop>
+ <tabstop>kcfg_BrowserTileColor</tabstop>
+ <tabstop>m_windowListTile</tabstop>
+ <tabstop>kcfg_WindowListTileColor</tabstop>
+ <tabstop>kcfg_BackgroundTheme</tabstop>
+ <tabstop>kcfg_ColorizeBackground</tabstop>
+ <tabstop>advancedOptionsButton</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in declaration">kcombobox.h</include>
+ <include location="global" impldecl="in declaration">kurlrequester.h</include>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected" specifier="pure virtual">launchAdvancedDialog()</slot>
+ <slot access="protected" specifier="pure virtual">browseTheme(const QString&amp;)</slot>
+ <slot access="protected" specifier="pure virtual">enableTransparency(bool)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/kicker/lookandfeeltab_impl.cpp b/kcontrol/kicker/lookandfeeltab_impl.cpp
new file mode 100644
index 000000000..ad1c6a8d8
--- /dev/null
+++ b/kcontrol/kicker/lookandfeeltab_impl.cpp
@@ -0,0 +1,384 @@
+/*
+ * lookandfeeltab.cpp
+ *
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ * Copyright (c) 2000 Aaron J. Seigo <aseigo@olympusproject.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qradiobutton.h>
+#include <qregexp.h>
+
+#include <kcolorbutton.h>
+#include <kdebug.h>
+#include <kfiledialog.h>
+#include <kiconeffect.h>
+#include <kimageio.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+
+#include <kickerSettings.h>
+#include "advancedDialog.h"
+#include "global.h"
+#include "main.h"
+
+#include "lookandfeeltab_impl.h"
+#include "lookandfeeltab_impl.moc"
+
+#include <iostream>
+using namespace std;
+
+LookAndFeelTab::LookAndFeelTab( QWidget *parent, const char* name )
+ : LookAndFeelTabBase(parent, name),
+ m_advDialog(0)
+{
+ connect(m_kmenuTile, SIGNAL(activated(int)), SIGNAL(changed()));
+ connect(m_desktopTile, SIGNAL(activated(int)), SIGNAL(changed()));
+ connect(m_browserTile, SIGNAL(activated(int)), SIGNAL(changed()));
+ connect(m_urlTile, SIGNAL(activated(int)), SIGNAL(changed()));
+ connect(m_windowListTile, SIGNAL(activated(int)), SIGNAL(changed()));
+
+ connect(m_kmenuTile, SIGNAL(activated(int)), SLOT(kmenuTileChanged(int)));
+ connect(m_desktopTile, SIGNAL(activated(int)), SLOT(desktopTileChanged(int)));
+ connect(m_browserTile, SIGNAL(activated(int)), SLOT(browserTileChanged(int)));
+ connect(m_urlTile, SIGNAL(activated(int)), SLOT(urlTileChanged(int)));
+ connect(m_windowListTile, SIGNAL(activated(int)), SLOT(wlTileChanged(int)));
+
+ connect(kcfg_ColorizeBackground, SIGNAL(toggled(bool)), SLOT(browseTheme()));
+
+ connect(kcfg_BackgroundTheme->lineEdit(), SIGNAL(lostFocus()), SLOT(browseTheme()));
+ kcfg_BackgroundTheme->setFilter(KImageIO::pattern(KImageIO::Reading));
+ kcfg_BackgroundTheme->setCaption(i18n("Select Image File"));
+
+ fillTileCombos();
+}
+
+void LookAndFeelTab::browseTheme()
+{
+ browseTheme(kcfg_BackgroundTheme->url());
+}
+
+void LookAndFeelTab::browseTheme(const QString& newtheme)
+{
+ if (newtheme.isEmpty())
+ {
+ kcfg_BackgroundTheme->clear();
+ m_backgroundLabel->setPixmap(QPixmap());
+ emit changed();
+ return;
+ }
+
+ previewBackground(newtheme, true);
+}
+
+void LookAndFeelTab::launchAdvancedDialog()
+{
+ if (!m_advDialog)
+ {
+ m_advDialog = new advancedDialog(this, "advancedDialog");
+ connect(m_advDialog, SIGNAL(finished()), this, SLOT(finishAdvancedDialog()));
+ m_advDialog->show();
+ }
+ m_advDialog->setActiveWindow();
+}
+
+void LookAndFeelTab::finishAdvancedDialog()
+{
+ m_advDialog->delayedDestruct();
+ m_advDialog = 0;
+}
+
+void LookAndFeelTab::enableTransparency(bool useTransparency)
+{
+ bool useBgTheme = kcfg_UseBackgroundTheme->isChecked();
+
+ kcfg_UseBackgroundTheme->setDisabled(useTransparency);
+ kcfg_BackgroundTheme->setDisabled(useTransparency || !useBgTheme);
+ m_backgroundLabel->setDisabled(useTransparency || !useBgTheme);
+ kcfg_ColorizeBackground->setDisabled(useTransparency || !useBgTheme);
+}
+
+void LookAndFeelTab::previewBackground(const QString& themepath, bool isNew)
+{
+ QString theme = themepath;
+ if (theme[0] != '/')
+ theme = locate("data", "kicker/" + theme);
+
+ QImage tmpImg(theme);
+ if(!tmpImg.isNull())
+ {
+ tmpImg = tmpImg.smoothScale(m_backgroundLabel->contentsRect().width(),
+ m_backgroundLabel->contentsRect().height());
+ if (kcfg_ColorizeBackground->isChecked())
+ KickerLib::colorize(tmpImg);
+ theme_preview.convertFromImage(tmpImg);
+ if(!theme_preview.isNull()) {
+ // avoid getting changed(true) from KConfigDialogManager for the default value
+ if( KickerSettings::backgroundTheme() == themepath )
+ KickerSettings::setBackgroundTheme( theme );
+ kcfg_BackgroundTheme->lineEdit()->setText(theme);
+ m_backgroundLabel->setPixmap(theme_preview);
+ if (isNew)
+ emit changed();
+ return;
+ }
+ }
+
+ KMessageBox::error(this,
+ i18n("Error loading theme image file.\n\n%1\n%2")
+ .arg(theme, themepath));
+ kcfg_BackgroundTheme->clear();
+ m_backgroundLabel->setPixmap(QPixmap());
+}
+
+void LookAndFeelTab::load()
+{
+ load( false );
+}
+
+void LookAndFeelTab::load(bool useDefaults)
+{
+ KConfig config(KickerConfig::the()->configName(), false, false);
+
+ config.setReadDefaults( useDefaults );
+
+ config.setGroup("General");
+
+ bool use_theme = kcfg_UseBackgroundTheme->isChecked();
+ QString theme = kcfg_BackgroundTheme->lineEdit()->text().stripWhiteSpace();
+
+ bool transparent = kcfg_Transparent->isChecked();
+
+ kcfg_BackgroundTheme->setEnabled(use_theme);
+ m_backgroundLabel->setEnabled(use_theme);
+ kcfg_ColorizeBackground->setEnabled(use_theme);
+ m_backgroundLabel->clear();
+ if (theme.length() > 0)
+ {
+ previewBackground(theme, false);
+ }
+
+ QString tile;
+ config.setGroup("buttons");
+
+ kmenuTileChanged(m_kmenuTile->currentItem());
+ desktopTileChanged(m_desktopTile->currentItem());
+ urlTileChanged(m_urlTile->currentItem());
+ browserTileChanged(m_browserTile->currentItem());
+ wlTileChanged(m_windowListTile->currentItem());
+
+ if (config.readBoolEntry("EnableTileBackground", false))
+ {
+ config.setGroup("button_tiles");
+
+ if (config.readBoolEntry("EnableKMenuTiles", false))
+ {
+ tile = config.readEntry("KMenuTile", "solid_blue");
+ m_kmenuTile->setCurrentItem(m_tilename.findIndex(tile));
+ kcfg_KMenuTileColor->setEnabled(tile == "Colorize");
+ }
+
+ if (config.readBoolEntry("EnableDesktopButtonTiles", false))
+ {
+ tile = config.readEntry("DesktopButtonTile", "solid_orange");
+ m_desktopTile->setCurrentItem(m_tilename.findIndex(tile));
+ kcfg_DesktopButtonTileColor->setEnabled(tile == "Colorize");
+ }
+
+ if (config.readBoolEntry("EnableURLTiles", false))
+ {
+ tile = config.readEntry("URLTile", "solid_gray");
+ m_urlTile->setCurrentItem(m_tilename.findIndex(tile));
+ kcfg_URLTileColor->setEnabled(tile == "Colorize");
+ }
+
+ if (config.readBoolEntry("EnableBrowserTiles", false))
+ {
+ tile = config.readEntry("BrowserTile", "solid_green");
+ m_browserTile->setCurrentItem(m_tilename.findIndex(tile));
+ kcfg_BrowserTileColor->setEnabled(tile == "Colorize");
+ }
+
+ if (config.readBoolEntry("EnableWindowListTiles", false))
+ {
+ tile = config.readEntry("WindowListTile", "solid_green");
+ m_windowListTile->setCurrentItem(m_tilename.findIndex(tile));
+ kcfg_WindowListTileColor->setEnabled(tile == "Colorize");
+ }
+ }
+ enableTransparency( transparent );
+}
+
+void LookAndFeelTab::save()
+{
+ KConfig config(KickerConfig::the()->configName(), false, false);
+
+ config.setGroup("General");
+
+ config.setGroup("button_tiles");
+ bool enableTiles = false;
+ int tile = m_kmenuTile->currentItem();
+ if (tile > 0)
+ {
+ enableTiles = true;
+ config.writeEntry("EnableKMenuTiles", true);
+ config.writeEntry("KMenuTile", m_tilename[m_kmenuTile->currentItem()]);
+ }
+ else
+ {
+ config.writeEntry("EnableKMenuTiles", false);
+ }
+
+ tile = m_desktopTile->currentItem();
+ if (tile > 0)
+ {
+ enableTiles = true;
+ config.writeEntry("EnableDesktopButtonTiles", true);
+ config.writeEntry("DesktopButtonTile", m_tilename[m_desktopTile->currentItem()]);
+ }
+ else
+ {
+ config.writeEntry("EnableDesktopButtonTiles", false);
+ }
+
+ tile = m_urlTile->currentItem();
+ if (tile > 0)
+ {
+ enableTiles = true;
+ config.writeEntry("EnableURLTiles", tile > 0);
+ config.writeEntry("URLTile", m_tilename[m_urlTile->currentItem()]);
+ }
+ else
+ {
+ config.writeEntry("EnableURLTiles", false);
+ }
+
+ tile = m_browserTile->currentItem();
+ if (tile > 0)
+ {
+ enableTiles = true;
+ config.writeEntry("EnableBrowserTiles", tile > 0);
+ config.writeEntry("BrowserTile", m_tilename[m_browserTile->currentItem()]);
+ }
+ else
+ {
+ config.writeEntry("EnableBrowserTiles", false);
+ }
+
+ tile = m_windowListTile->currentItem();
+ if (tile > 0)
+ {
+ enableTiles = true;
+ config.writeEntry("EnableWindowListTiles", tile > 0);
+ config.writeEntry("WindowListTile", m_tilename[m_windowListTile->currentItem()]);
+ }
+ else
+ {
+ config.writeEntry("EnableWindowListTiles", false);
+ }
+
+ config.setGroup("buttons");
+ config.writeEntry("EnableTileBackground", enableTiles);
+
+ config.sync();
+}
+
+void LookAndFeelTab::defaults()
+{
+ load( true );
+}
+
+void LookAndFeelTab::fillTileCombos()
+{
+/* m_kmenuTile->clear();
+ m_kmenuTile->insertItem(i18n("Default"));
+ m_desktopTile->clear();
+ m_desktopTile->insertItem(i18n("Default"));
+ m_urlTile->clear();
+ m_urlTile->insertItem(i18n("Default"));
+ m_browserTile->clear();
+ m_browserTile->insertItem(i18n("Default"));
+ m_windowListTile->clear();
+ m_windowListTile->insertItem(i18n("Default"));*/
+ m_tilename.clear();
+ m_tilename << "" << "Colorize";
+
+ QStringList list = KGlobal::dirs()->findAllResources("tiles","*_tiny_up.png");
+ int minHeight = 0;
+
+ for (QStringList::Iterator it = list.begin(); it != list.end(); ++it)
+ {
+ QString tile = (*it);
+ QPixmap pix(tile);
+ QFileInfo fi(tile);
+ tile = fi.fileName();
+ tile.truncate(tile.find("_tiny_up.png"));
+ m_tilename << tile;
+
+ // Transform tile to words with title case
+ // The same is done when generating messages for translation
+ QStringList words = QStringList::split(QRegExp("[_ ]"), tile);
+ for (QStringList::iterator w = words.begin(); w != words.end(); ++w)
+ (*w)[0] = (*w)[0].upper();
+ tile = i18n(words.join(" ").utf8());
+
+ m_kmenuTile->insertItem(pix, tile);
+ m_desktopTile->insertItem(pix, tile);
+ m_urlTile->insertItem(pix, tile);
+ m_browserTile->insertItem(pix, tile);
+ m_windowListTile->insertItem(pix, tile);
+
+ if (pix.height() > minHeight)
+ {
+ minHeight = pix.height();
+ }
+ }
+
+ minHeight += 6;
+ m_kmenuTile->setMinimumHeight(minHeight);
+ m_desktopTile->setMinimumHeight(minHeight);
+ m_urlTile->setMinimumHeight(minHeight);
+ m_browserTile->setMinimumHeight(minHeight);
+ m_windowListTile->setMinimumHeight(minHeight);
+}
+
+void LookAndFeelTab::kmenuTileChanged(int i)
+{
+ kcfg_KMenuTileColor->setEnabled(i == 1);
+}
+
+void LookAndFeelTab::desktopTileChanged(int i)
+{
+ kcfg_DesktopButtonTileColor->setEnabled(i == 1);
+}
+
+void LookAndFeelTab::browserTileChanged(int i)
+{
+ kcfg_BrowserTileColor->setEnabled(i == 1);
+}
+
+void LookAndFeelTab::urlTileChanged(int i)
+{
+ kcfg_URLTileColor->setEnabled(i == 1);
+}
+
+void LookAndFeelTab::wlTileChanged(int i)
+{
+ kcfg_WindowListTileColor->setEnabled(i == 1);
+}
diff --git a/kcontrol/kicker/lookandfeeltab_impl.h b/kcontrol/kicker/lookandfeeltab_impl.h
new file mode 100644
index 000000000..54ef5b00d
--- /dev/null
+++ b/kcontrol/kicker/lookandfeeltab_impl.h
@@ -0,0 +1,70 @@
+/*
+ * lookandfeeltab.h
+ *
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ * Copyright (c) 2000 Aaron J. Seigo <aseigo@olympusproject.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+
+#ifndef __lookandfeeltab_h__
+#define __lookandfeeltab_h__
+
+#include "lookandfeeltab.h"
+
+class advancedDialog;
+
+class LookAndFeelTab : public LookAndFeelTabBase
+{
+ Q_OBJECT
+
+public:
+ LookAndFeelTab(QWidget *parent = 0, const char* name = 0);
+
+ void load();
+ void load(bool useDefaults);
+ void save();
+ void defaults();
+
+ QString quickHelp() const;
+
+signals:
+ void changed();
+
+protected:
+ void fillTileCombos();
+ void previewBackground(const QString& themepath, bool isNew);
+
+protected slots:
+ void browseTheme();
+ void browseTheme(const QString&);
+ void enableTransparency( bool );
+
+ void launchAdvancedDialog();
+ void finishAdvancedDialog();
+
+ void kmenuTileChanged(int i);
+ void desktopTileChanged(int i);
+ void browserTileChanged(int i);
+ void urlTileChanged(int i);
+ void wlTileChanged(int i);
+
+private:
+ QPixmap theme_preview;
+ QStringList m_tilename;
+ advancedDialog *m_advDialog;
+};
+
+#endif
diff --git a/kcontrol/kicker/lookandfeeltab_kcm.cpp b/kcontrol/kicker/lookandfeeltab_kcm.cpp
new file mode 100644
index 000000000..50be83e89
--- /dev/null
+++ b/kcontrol/kicker/lookandfeeltab_kcm.cpp
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2002 Stephan Binner <binner@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <qlayout.h>
+
+
+#include <dcopclient.h>
+
+#include "main.h"
+#include "lookandfeeltab_kcm.moc"
+#include "lookandfeeltab_impl.h"
+
+#include <X11/Xlib.h>
+#include <kaboutdata.h>
+#include <kdialog.h>
+
+LookAndFeelConfig::LookAndFeelConfig(QWidget *parent, const char *name)
+ : KCModule(parent, name)
+{
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmkicker"), I18N_NOOP("KDE Panel Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 1999 - 2001 Matthias Elter\n(c) 2002 Aaron J. Seigo"));
+
+ about->addAuthor("Matthias Elter", 0, "elter@kde.org");
+ about->addAuthor("Aaron J. Seigo", 0, "aseigo@olympusproject.org");
+ setAboutData( about );
+
+ KickerConfig::initScreenNumber();
+ QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ lookandfeeltab = new LookAndFeelTab(this);
+ layout->addWidget(lookandfeeltab);
+ layout->addStretch();
+
+ connect(lookandfeeltab, SIGNAL(changed()), SLOT(configChanged()));
+
+ load();
+}
+
+void LookAndFeelConfig::configChanged()
+{
+ emit changed(true);
+}
+
+void LookAndFeelConfig::load()
+{
+ lookandfeeltab->load();
+ emit changed(false);
+}
+
+void LookAndFeelConfig::save()
+{
+ lookandfeeltab->save();
+
+ emit changed(false);
+
+ // Tell kicker about the new config file.
+ KickerConfig::notifyKicker();
+}
+
+void LookAndFeelConfig::defaults()
+{
+ lookandfeeltab->defaults();
+
+ emit changed(true);
+}
+
+QString LookAndFeelConfig::quickHelp() const
+{
+ return i18n("<h1>Panel</h1> Here you can configure the KDE panel (also"
+ " referred to as 'kicker'). This includes options like the position and"
+ " size of the panel, as well as its hiding behavior and its looks.<p>"
+ " Note that you can also access some of these options directly by clicking"
+ " on the panel, e.g. dragging it with the left mouse button or using the"
+ " context menu on right mouse button click. This context menu also offers you"
+ " manipulation of the panel's buttons and applets.");
+}
+
diff --git a/kcontrol/kicker/lookandfeeltab_kcm.h b/kcontrol/kicker/lookandfeeltab_kcm.h
new file mode 100644
index 000000000..356becf5e
--- /dev/null
+++ b/kcontrol/kicker/lookandfeeltab_kcm.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2002 Stephan Binner <binner@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#ifndef __lookandfeelconfig_h__
+#define __lookandfeelconfig_h__
+
+#include <kcmodule.h>
+
+class LookAndFeelTab;
+
+class LookAndFeelConfig : public KCModule
+{
+ Q_OBJECT
+
+public:
+ LookAndFeelConfig(QWidget *parent = 0L, const char *name = 0L);
+
+ void load();
+ void save();
+ void defaults();
+ QString quickHelp() const;
+
+public slots:
+ void configChanged();
+
+private:
+ LookAndFeelTab *lookandfeeltab;
+};
+
+#endif // __lookandfeelconfig_h__
diff --git a/kcontrol/kicker/main.cpp b/kcontrol/kicker/main.cpp
new file mode 100644
index 000000000..4ef0f842f
--- /dev/null
+++ b/kcontrol/kicker/main.cpp
@@ -0,0 +1,398 @@
+/*
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <qcombobox.h>
+
+#include <dcopclient.h>
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kcmodulecontainer.h>
+#include <kdirwatch.h>
+#include <kimageio.h>
+#include <klistview.h>
+#include <kstaticdeleter.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+
+#include "hidingconfig.h"
+#include "kickerSettings.h"
+#include "lookandfeelconfig.h"
+#include "menuconfig.h"
+#include "positionconfig.h"
+
+#include "main.h"
+#include "main.moc"
+
+#include <X11/Xlib.h>
+
+KickerConfig *KickerConfig::m_self = 0;
+static KStaticDeleter<KickerConfig> staticKickerConfigDeleter;
+
+KickerConfig *KickerConfig::the()
+{
+ if (!m_self)
+ {
+ staticKickerConfigDeleter.setObject(m_self, new KickerConfig());
+ }
+ return m_self;
+}
+
+KickerConfig::KickerConfig(QWidget *parent, const char *name)
+ : QObject(parent, name),
+ DCOPObject("KickerConfig"),
+ configFileWatch(new KDirWatch(this)),
+ m_currentPanelIndex(0)
+{
+ m_screenNumber = qt_xdisplay() ? DefaultScreen(qt_xdisplay()) : 0;
+
+ KickerSettings::instance(configName().latin1());
+
+ init();
+
+ kapp->dcopClient()->setNotifications(true);
+ connectDCOPSignal("kicker", "kicker", "configSwitchToPanel(QString)",
+ "jumpToPanel(QString)", false);
+ kapp->dcopClient()->send("kicker", "kicker", "configLaunched()", QByteArray());
+
+ connect(this, SIGNAL(hidingPanelChanged(int)),
+ this, SLOT(setCurrentPanelIndex(int)));
+ connect(this, SIGNAL(positionPanelChanged(int)),
+ this, SLOT(setCurrentPanelIndex(int)));
+}
+
+KickerConfig::~KickerConfig()
+{
+ // QValueList::setAutoDelete where for art thou?
+ ExtensionInfoList::iterator it = m_extensionInfo.begin();
+ while (it != m_extensionInfo.end())
+ {
+ ExtensionInfo* info = *it;
+ it = m_extensionInfo.erase(it);
+ delete info;
+ }
+}
+
+// TODO: This is not true anymore:
+// this method may get called multiple times during the life of the control panel!
+void KickerConfig::init()
+{
+ disconnect(configFileWatch, SIGNAL(dirty(const QString&)), this, SLOT(configChanged(const QString&)));
+ configFileWatch->stopScan();
+ for (ExtensionInfoList::iterator it = m_extensionInfo.begin();
+ it != m_extensionInfo.end();
+ ++it)
+ {
+ configFileWatch->removeFile((*it)->_configPath);
+ }
+
+ QString configname = configName();
+ QString configpath = KGlobal::dirs()->findResource("config", configname);
+ if (configpath.isEmpty())
+ configpath = locateLocal("config", configname);
+ KSharedConfig::Ptr config = KSharedConfig::openConfig(configname);
+
+ if (m_extensionInfo.isEmpty())
+ {
+ // our list is empty, so add the main kicker config
+ m_extensionInfo.append(new ExtensionInfo(QString::null, configname, configpath));
+ configFileWatch->addFile(configpath);
+ }
+ else
+ {
+ // this isn't our first trip through here, which means we are reloading
+ // so reload the kicker config (first we have to find it ;)
+ ExtensionInfoList::iterator it = m_extensionInfo.begin();
+ for (; it != m_extensionInfo.end(); ++it)
+ {
+ if (configpath == (*it)->_configPath)
+ {
+ (*it)->load();
+ break;
+ }
+ }
+ }
+
+ setupExtensionInfo(*config, true, true);
+
+ connect(configFileWatch, SIGNAL(dirty(const QString&)), this, SLOT(configChanged(const QString&)));
+ configFileWatch->startScan();
+}
+
+void KickerConfig::notifyKicker()
+{
+ kdDebug() << "KickerConfig::notifyKicker()" << endl;
+
+ emit aboutToNotifyKicker();
+
+ // Tell kicker about the new config file.
+ if (!kapp->dcopClient()->isAttached())
+ {
+ kapp->dcopClient()->attach();
+ }
+
+ QByteArray data;
+ QCString appname;
+
+ if (m_screenNumber == 0)
+ {
+ appname = "kicker";
+ }
+ else
+ {
+ appname.sprintf("kicker-screen-%d", m_screenNumber);
+ }
+
+ kapp->dcopClient()->send(appname, appname, "configure()", data);
+}
+
+void KickerConfig::setupExtensionInfo(KConfig& config, bool checkExists, bool reloadIfExists)
+{
+ config.setGroup("General");
+ QStringList elist = config.readListEntry("Extensions2");
+
+ // all of our existing extensions
+ // we'll remove ones we find which are still there the oldExtensions, and delete
+ // all the extensions that remain (e.g. are no longer active)
+ ExtensionInfoList oldExtensions(m_extensionInfo);
+
+ for (QStringList::Iterator it = elist.begin(); it != elist.end(); ++it)
+ {
+ // extension id
+ QString group(*it);
+
+ // is there a config group for this extension?
+ if (!config.hasGroup(group) || group.contains("Extension") < 1)
+ {
+ continue;
+ }
+
+ // set config group
+ config.setGroup(group);
+
+ QString df = KGlobal::dirs()->findResource("extensions", config.readEntry("DesktopFile"));
+ QString configname = config.readEntry("ConfigFile");
+ QString configpath = KGlobal::dirs()->findResource("config", configname);
+
+ if (checkExists)
+ {
+ ExtensionInfoList::iterator extIt = m_extensionInfo.begin();
+ for (; extIt != m_extensionInfo.end(); ++extIt)
+ {
+ if (configpath == (*extIt)->_configPath)
+ {
+ // we have found it in the config file and it exists
+ // so remove it from our list of existing extensions
+ oldExtensions.remove(*extIt);
+ if (reloadIfExists)
+ {
+ (*extIt)->load();
+ }
+ break;
+ }
+ }
+
+ if (extIt != m_extensionInfo.end())
+ {
+ continue;
+ }
+ }
+
+ configFileWatch->addFile(configpath);
+ ExtensionInfo* info = new ExtensionInfo(df, configname, configpath);
+ m_extensionInfo.append(info);
+ emit extensionAdded(info);
+ }
+
+ if (checkExists)
+ {
+ // now remove all the left overs that weren't in the file
+ ExtensionInfoList::iterator extIt = oldExtensions.begin();
+ for (; extIt != oldExtensions.end(); ++extIt)
+ {
+ // don't remove the kickerrc!
+ if (!(*extIt)->_configPath.endsWith(configName()))
+ {
+ emit extensionRemoved(*extIt);
+ m_extensionInfo.remove(*extIt);
+ }
+ }
+ }
+}
+
+void KickerConfig::configChanged(const QString& configPath)
+{
+ if (configPath.endsWith(configName()))
+ {
+ KSharedConfig::Ptr config = KSharedConfig::openConfig(configName());
+ config->reparseConfiguration();
+ setupExtensionInfo(*config, true);
+ }
+
+ // find the extension and change it
+ for (ExtensionInfoList::iterator it = m_extensionInfo.begin(); it != m_extensionInfo.end(); ++it)
+ {
+ if (configPath == (*it)->_configPath)
+ {
+ emit extensionAboutToChange(configPath);
+ (*it)->configChanged();
+ break;
+ }
+ }
+
+ emit extensionChanged(configPath);
+}
+
+void KickerConfig::populateExtensionInfoList(QComboBox* list)
+{
+ list->clear();
+ for (ExtensionInfoList::iterator it = m_extensionInfo.begin(); it != m_extensionInfo.end(); ++it)
+ {
+ list->insertItem((*it)->_name);
+ }
+}
+
+const ExtensionInfoList& KickerConfig::extensionsInfo()
+{
+ return m_extensionInfo;
+}
+
+void KickerConfig::reloadExtensionInfo()
+{
+ for (ExtensionInfoList::iterator it = m_extensionInfo.begin(); it != m_extensionInfo.end(); ++it)
+ {
+ (*it)->load();
+ }
+
+ emit extensionInfoChanged();
+}
+
+void KickerConfig::saveExtentionInfo()
+{
+ for (ExtensionInfoList::iterator it = m_extensionInfo.begin(); it != m_extensionInfo.end(); ++it)
+ {
+ (*it)->save();
+ }
+}
+
+void KickerConfig::jumpToPanel(const QString& panelConfig)
+{
+ ExtensionInfoList::iterator it = m_extensionInfo.begin();
+ int index = 0;
+ for (; it != m_extensionInfo.end(); ++it, ++index)
+ {
+ if ((*it)->_configFile == panelConfig)
+ {
+ break;
+ }
+ }
+
+ if (it == m_extensionInfo.end())
+ {
+ return;
+ }
+
+ kdDebug() << "KickerConfig::jumpToPanel: index=" << index << endl;
+
+ emit hidingPanelChanged(index);
+ emit positionPanelChanged(index);
+}
+
+QString KickerConfig::configName()
+{
+ if (m_screenNumber == 0)
+ {
+ return "kickerrc";
+ }
+ else
+ {
+ return QString("kicker-screen-%1rc").arg(m_screenNumber);
+ }
+}
+
+void KickerConfig::setCurrentPanelIndex(int index)
+{
+ m_currentPanelIndex = index;
+}
+
+QString KickerConfig::quickHelp() const
+{
+ return i18n("<h1>Panel</h1> Here you can configure the KDE panel (also"
+ " referred to as 'kicker'). This includes options like the position and"
+ " size of the panel, as well as its hiding behavior and its looks.<p>"
+ " Note that you can also access some of these options directly by clicking"
+ " on the panel, e.g. dragging it with the left mouse button or using the"
+ " context menu on right mouse button click. This context menu also offers you"
+ " manipulation of the panel's buttons and applets.");
+}
+
+KAboutData *KickerConfig::aboutData()
+{
+ // the KAboutDatas are deleted by the KCModules
+ KAboutData *about
+ = new KAboutData(I18N_NOOP("kcmkicker"),
+ I18N_NOOP("KDE Panel Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 1999 - 2001 Matthias Elter\n"
+ "(c) 2002 - 2003 Aaron J. Seigo"));
+
+ about->addAuthor("Aaron J. Seigo", 0, "aseigo@kde.org");
+ about->addAuthor("Matthias Elter", 0, "elter@kde.org");
+
+ return about;
+}
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_kicker(QWidget *parent, const char *name)
+ {
+ KCModuleContainer *container = new KCModuleContainer(parent, "kcmkicker");
+ container->addModule("kicker_config_arrangement");
+ container->addModule("kicker_config_hiding");
+ container->addModule("kicker_config_menus");
+ container->addModule("kicker_config_appearance");
+ return container;
+ }
+
+ KDE_EXPORT KCModule *create_kicker_arrangement(QWidget *parent, const char * /*name*/)
+ {
+ KGlobal::dirs()->addResourceType("extensions", KStandardDirs::kde_default("data") +
+ "kicker/extensions");
+ return new PositionConfig(parent, "kcmkicker");
+ }
+
+ KDE_EXPORT KCModule *create_kicker_hiding(QWidget *parent, const char * /*name*/)
+ {
+ KGlobal::dirs()->addResourceType("extensions", KStandardDirs::kde_default("data") +
+ "kicker/extensions");
+ return new HidingConfig(parent, "kcmkicker");
+ }
+
+ KDE_EXPORT KCModule *create_kicker_menus(QWidget *parent, const char * /*name*/)
+ {
+ return new MenuConfig(parent, "kcmkicker");
+ }
+
+ KDE_EXPORT KCModule *create_kicker_appearance(QWidget *parent, const char * /*name*/)
+ {
+ KImageIO::registerFormats();
+ KGlobal::dirs()->addResourceType("tiles", KStandardDirs::kde_default("data") +
+ "kicker/tiles");
+ KGlobal::dirs()->addResourceType("hb_pics", KStandardDirs::kde_default("data") +
+ "kcmkicker/pics");
+ return new LookAndFeelConfig(parent, "kcmkicker");
+ }
+}
diff --git a/kcontrol/kicker/main.h b/kcontrol/kicker/main.h
new file mode 100644
index 000000000..cb585b077
--- /dev/null
+++ b/kcontrol/kicker/main.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#ifndef __main_h__
+#define __main_h__
+
+#include <dcopobject.h>
+#include <kconfig.h>
+
+#include "extensionInfo.h"
+
+class QComboBox;
+class KAboutData;
+class KDirWatch;
+
+class KickerConfig : public QObject, public DCOPObject
+{
+ Q_OBJECT
+ K_DCOP
+
+public:
+ static KickerConfig *the();
+ ~KickerConfig();
+
+ void populateExtensionInfoList(QComboBox* list);
+ void reloadExtensionInfo();
+ void saveExtentionInfo();
+ const ExtensionInfoList& extensionsInfo();
+
+ QString configName();
+ void notifyKicker();
+
+ QString quickHelp() const;
+ KAboutData *aboutData();
+
+ int currentPanelIndex() const { return m_currentPanelIndex; }
+
+k_dcop:
+ void jumpToPanel(const QString& panelConfig);
+
+signals:
+ void positionPanelChanged(int);
+ void hidingPanelChanged(int);
+ void extensionInfoChanged();
+ void extensionAdded(ExtensionInfo*);
+ void extensionRemoved(ExtensionInfo*);
+ void extensionChanged(const QString&);
+ void extensionAboutToChange(const QString&);
+ void aboutToNotifyKicker();
+
+protected:
+ void init();
+ void setupExtensionInfo(KConfig& c, bool checkExists, bool reloadIfExists = false);
+
+protected slots:
+ void configChanged(const QString&);
+ void setCurrentPanelIndex(int);
+
+private:
+ KickerConfig(QWidget *parent = 0, const char *name = 0);
+
+ static KickerConfig *m_self;
+
+ KDirWatch *configFileWatch;
+ ExtensionInfoList m_extensionInfo;
+ int m_screenNumber;
+ uint m_currentPanelIndex;
+};
+
+#endif // __main_h__
diff --git a/kcontrol/kicker/menuconfig.cpp b/kcontrol/kicker/menuconfig.cpp
new file mode 100644
index 000000000..5bc1964b1
--- /dev/null
+++ b/kcontrol/kicker/menuconfig.cpp
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2005 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ */
+
+#include <qlayout.h>
+#include <qtimer.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include "kickerSettings.h"
+#include "main.h"
+#include "menutab_impl.h"
+
+#include "menuconfig.h"
+#include "menuconfig.moc"
+
+MenuConfig::MenuConfig(QWidget *parent, const char *name)
+ : KCModule(parent, name)
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ m_widget = new MenuTab(this);
+ layout->addWidget(m_widget);
+ layout->addStretch();
+
+ setQuickHelp(KickerConfig::the()->quickHelp());
+ setAboutData(KickerConfig::the()->aboutData());
+
+ addConfig(KickerSettings::self(), m_widget);
+
+ connect(m_widget, SIGNAL(changed()),
+ this, SLOT(changed()));
+ connect(KickerConfig::the(), SIGNAL(aboutToNotifyKicker()),
+ this, SLOT(aboutToNotifyKicker()));
+
+ load();
+ QTimer::singleShot(0, this, SLOT(notChanged()));
+}
+
+void MenuConfig::notChanged()
+{
+ emit changed(false);
+}
+
+void MenuConfig::load()
+{
+ m_widget->load();
+ KCModule::load();
+}
+
+void MenuConfig::aboutToNotifyKicker()
+{
+ kdDebug() << "MenuConfig::aboutToNotifyKicker()" << endl;
+
+ // This slot is triggered by the signal,
+ // which is send before Kicker is notified.
+ // See comment in save().
+ m_widget->save();
+ KCModule::save();
+}
+
+void MenuConfig::save()
+{
+ // As we don't want to notify Kicker multiple times
+ // we do not save the settings here. Instead the
+ // KickerConfig object sends a signal before the
+ // notification. On this signal all existing modules,
+ // including this object, save their settings.
+ KickerConfig::the()->notifyKicker();
+}
+
+void MenuConfig::defaults()
+{
+ m_widget->defaults();
+ KCModule::defaults();
+
+ // KConfigDialogManager may queue an changed(false) signal,
+ // so we make sure, that the module is labeled as changedm,
+ // while we manage some of the widgets ourselves
+ QTimer::singleShot(0, this, SLOT(changed()));
+}
diff --git a/kcontrol/kicker/menuconfig.h b/kcontrol/kicker/menuconfig.h
new file mode 100644
index 000000000..3d73f1922
--- /dev/null
+++ b/kcontrol/kicker/menuconfig.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2005 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ */
+
+#ifndef __menuconfig_h__
+#define __menuconfig_h__
+
+#include <kcmodule.h>
+
+class MenuTab;
+
+class MenuConfig : public KCModule
+{
+ Q_OBJECT
+
+public:
+ MenuConfig(QWidget *parent = 0, const char *name = 0);
+
+ void load();
+ void save();
+ void defaults();
+
+public slots:
+ void notChanged();
+ void aboutToNotifyKicker();
+
+private:
+ MenuTab *m_widget;
+};
+
+#endif // __menuconfig_h__
diff --git a/kcontrol/kicker/menutab.ui b/kcontrol/kicker/menutab.ui
new file mode 100644
index 000000000..8d49a7965
--- /dev/null
+++ b/kcontrol/kicker/menutab.ui
@@ -0,0 +1,407 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>MenuTabBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>MenuTabBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>410</width>
+ <height>437</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>m_kmenuGroup</cstring>
+ </property>
+ <property name="title">
+ <string>K Menu</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>kcfg_MenuEntryFormat</cstring>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="title">
+ <string>Menu item format:</string>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can choose how menu entries are shown.</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="1" column="1">
+ <property name="name">
+ <cstring>m_formatSimple</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Name only</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected, items in the K Menu will appear with the application's name next to the icon.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="1">
+ <property name="name">
+ <cstring>m_formatNameDesc</cstring>
+ </property>
+ <property name="text">
+ <string>Name - &amp;Description</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected, items in the K Menu will appear with the application's name and a brief description next to the icon.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="3" column="1">
+ <property name="name">
+ <cstring>m_formatDescOnly</cstring>
+ </property>
+ <property name="text">
+ <string>D&amp;escription only</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected, items in the K Menu will appear with the application's brief description next to the icon.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="4" column="1">
+ <property name="name">
+ <cstring>m_formDescName</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Des&amp;cription (Name)</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected, items in the K Menu will appear with a brief description and the application's name in brackets next to the icon.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_UseSidePixmap</cstring>
+ </property>
+ <property name="text">
+ <string>Show side ima&amp;ge</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;When this option is selected an image will appear down the left-hand side of the K Menu. The image will be tinted according to your color settings.
+
+ &lt;p&gt;&lt;b&gt;Tip&lt;/b&gt;: You can customize the image that appears in the K Menu by putting an image file called kside.png and a tileable image file called kside_tile.png in $KDEHOME/share/apps/kicker/pics.&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m_editKMenuButton</cstring>
+ </property>
+ <property name="text">
+ <string>Edit &amp;K Menu</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Start the editor for the K menu. Here you can add, edit, remove and hide applications.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Optional Menus</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_subMenus</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>1</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is a list of the dynamic menus that can be displayed in the KDE menu in addition to the normal applications. Use the checkboxes to add or remove menus.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>m_browserGroup</cstring>
+ </property>
+ <property name="title">
+ <string>QuickBrowser Menus</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_maxQuickBrowserItemsLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Ma&amp;ximum number of entries:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kcfg_MaxEntries2</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When browsing directories that contain a lot of files, the QuickBrowser can sometimes hide your whole desktop. Here you can limit the number of entries shown at a time in the QuickBrowser. This is particularly useful for low screen resolutions.</string>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>kcfg_MaxEntries2</cstring>
+ </property>
+ <property name="value">
+ <number>30</number>
+ </property>
+ <property name="minValue">
+ <number>10</number>
+ </property>
+ <property name="maxValue">
+ <number>100</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When browsing directories that contain a lot of files, the QuickBrowser can sometimes hide your whole desktop. Here you can limit the number of entries shown at a time in the QuickBrowser. This is particularly useful for low screen resolutions.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>kcfg_ShowHiddenFiles</cstring>
+ </property>
+ <property name="text">
+ <string>Show hidden fi&amp;les</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is enabled, hidden files (i.e. files beginning with a dot) will be shown in the QuickBrowser menus.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="1" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>Spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>m_pRecentOrderGroup</cstring>
+ </property>
+ <property name="title">
+ <string>QuickStart Menu Items</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Maxim&amp;um number of entries:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kcfg_NumVisibleEntries</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This option allows you to define the maximum number of applications that should be displayed in the QuickStart menu area.</string>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>kcfg_NumVisibleEntries</cstring>
+ </property>
+ <property name="value">
+ <number>5</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="maxValue">
+ <number>20</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This option allows you to define how many applications should be displayed at most in the QuickStart menu area.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>kcfg_RecentVsOften</cstring>
+ </property>
+ <property name="text">
+ <string>Show the &amp;applications most recently used</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected the QuickStart menu area will be filled with the applications you have used most recently.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>m_showFrequent</cstring>
+ </property>
+ <property name="text">
+ <string>Show the applications most fre&amp;quently used</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected the QuickStart menu area will be filled with the applications you use most frequently.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="1" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>Spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>m_formatSimple</tabstop>
+ <tabstop>m_formatNameDesc</tabstop>
+ <tabstop>m_formDescName</tabstop>
+ <tabstop>kcfg_UseSidePixmap</tabstop>
+ <tabstop>m_editKMenuButton</tabstop>
+ <tabstop>m_subMenus</tabstop>
+ <tabstop>kcfg_ShowHiddenFiles</tabstop>
+ <tabstop>kcfg_MaxEntries2</tabstop>
+ <tabstop>kcfg_RecentVsOften</tabstop>
+ <tabstop>m_showFrequent</tabstop>
+ <tabstop>kcfg_NumVisibleEntries</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">klistview.h</include>
+ <include location="global" impldecl="in implementation">knuminput.h</include>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/kicker/menutab_impl.cpp b/kcontrol/kicker/menutab_impl.cpp
new file mode 100644
index 000000000..55cabaa88
--- /dev/null
+++ b/kcontrol/kicker/menutab_impl.cpp
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <qcheckbox.h>
+#include <qdir.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kdesktopfile.h>
+#include <kiconloader.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <knuminput.h>
+#include <kstandarddirs.h>
+
+#include "main.h"
+
+#include "menutab_impl.h"
+#include "menutab_impl.moc"
+
+kSubMenuItem::kSubMenuItem(QListView* parent,
+ const QString& visibleName,
+ const QString& desktopFile,
+ const QPixmap& icon,
+ bool checked)
+ : QCheckListItem(parent, visibleName, QCheckListItem::CheckBox),
+ m_desktopFile(desktopFile)
+{
+ setPixmap(0, icon);
+ setOn(checked);
+}
+
+QString kSubMenuItem::desktopFile()
+{
+ return m_desktopFile;
+}
+
+void kSubMenuItem::stateChange(bool state)
+{
+ emit toggled(state);
+}
+
+MenuTab::MenuTab( QWidget *parent, const char* name )
+ : MenuTabBase (parent, name),
+ m_bookmarkMenu(0),
+ m_quickBrowserMenu(0)
+{
+ // connections
+ connect(m_editKMenuButton, SIGNAL(clicked()), SLOT(launchMenuEditor()));
+
+ m_browserGroupLayout->setColStretch( 1, 1 );
+ m_pRecentOrderGroupLayout->setColStretch( 1, 1 );
+}
+
+void MenuTab::load()
+{
+ load( false );
+}
+
+void MenuTab::load( bool useDefaults )
+{
+ KSharedConfig::Ptr c = KSharedConfig::openConfig(KickerConfig::the()->configName());
+
+ c->setReadDefaults( useDefaults );
+
+ c->setGroup("menus");
+
+ m_subMenus->clear();
+
+ // show the bookmark menu?
+ m_bookmarkMenu = new kSubMenuItem(m_subMenus,
+ i18n("Bookmarks"),
+ QString::null,
+ SmallIcon("bookmark"),
+ c->readBoolEntry("UseBookmarks", false));
+ connect(m_bookmarkMenu, SIGNAL(toggled(bool)), SIGNAL(changed()));
+
+ // show the quick menus menu?
+ m_quickBrowserMenu = new kSubMenuItem(m_subMenus,
+ i18n("Quick Browser"),
+ QString::null,
+ SmallIcon("kdisknav"),
+ c->readBoolEntry("UseBrowser", false));
+ connect(m_quickBrowserMenu, SIGNAL(toggled(bool)), SIGNAL(changed()));
+
+ QStringList ext_default;
+ ext_default << "prefmenu.desktop" << "systemmenu.desktop";
+ QStringList ext = c->readListEntry("Extensions", ext_default);
+ QStringList dirs = KGlobal::dirs()->findDirs("data", "kicker/menuext");
+ kSubMenuItem* menuItem(0);
+ for (QStringList::ConstIterator dit=dirs.begin(); dit!=dirs.end(); ++dit)
+ {
+ QDir d(*dit, "*.desktop");
+ QStringList av = d.entryList();
+ for (QStringList::ConstIterator it=av.begin(); it!=av.end(); ++it)
+ {
+ KDesktopFile df(d.absFilePath(*it), true);
+ menuItem = new kSubMenuItem(m_subMenus,
+ df.readName(),
+ *it,
+ SmallIcon(df.readIcon()),
+ qFind(ext.begin(), ext.end(), *it) != ext.end());
+ connect(menuItem, SIGNAL(toggled(bool)), SIGNAL(changed()));
+ }
+ }
+
+ m_showFrequent->setChecked(true);
+
+ if ( useDefaults )
+ emit changed();
+}
+
+void MenuTab::save()
+{
+ KSharedConfig::Ptr c = KSharedConfig::openConfig(KickerConfig::the()->configName());
+
+ c->setGroup("menus");
+
+ QStringList ext;
+ QListViewItem *item(0);
+ for (item = m_subMenus->firstChild(); item; item = item->nextSibling())
+ {
+ bool isOn = static_cast<kSubMenuItem*>(item)->isOn();
+ if (item == m_bookmarkMenu)
+ {
+ c->writeEntry("UseBookmarks", isOn);
+ }
+ else if (item == m_quickBrowserMenu)
+ {
+ c->writeEntry("UseBrowser", isOn);
+ }
+ else if (isOn)
+ {
+ ext << static_cast<kSubMenuItem*>(item)->desktopFile();
+ }
+ }
+ c->writeEntry("Extensions", ext);
+
+ c->sync();
+}
+
+void MenuTab::defaults()
+{
+ load( true );
+}
+
+void MenuTab::launchMenuEditor()
+{
+ if ( KApplication::startServiceByDesktopName( "kmenuedit",
+ QString::null /*url*/,
+ 0 /*error*/,
+ 0 /*dcopservice*/,
+ 0 /*pid*/,
+ "" /*startup_id*/,
+ true /*nowait*/ ) != 0 )
+ {
+ KMessageBox::error(this,
+ i18n("The KDE menu editor (kmenuedit) could not be launched.\n"
+ "Perhaps it is not installed or not in your path."),
+ i18n("Application Missing"));
+ }
+}
diff --git a/kcontrol/kicker/menutab_impl.h b/kcontrol/kicker/menutab_impl.h
new file mode 100644
index 000000000..20ed393e1
--- /dev/null
+++ b/kcontrol/kicker/menutab_impl.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#ifndef __menutab_impl_h__
+#define __menutab_impl_h__
+
+#include <qlistview.h>
+
+#include "menutab.h"
+
+class kSubMenuItem : public QObject, public QCheckListItem
+{
+ Q_OBJECT
+
+ public:
+ kSubMenuItem(QListView* parent,
+ const QString& visibleName,
+ const QString& desktopFile,
+ const QPixmap& icon,
+ bool checked);
+ ~kSubMenuItem() {}
+
+ QString desktopFile();
+
+ signals:
+ void toggled(bool);
+
+ protected:
+ void stateChange(bool state);
+
+ QString m_desktopFile;
+};
+
+class MenuTab : public MenuTabBase
+{
+ Q_OBJECT
+
+public:
+ MenuTab( QWidget *parent=0, const char* name=0 );
+
+ void load();
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+
+signals:
+ void changed();
+
+public slots:
+ void launchMenuEditor();
+
+protected:
+ kSubMenuItem *m_bookmarkMenu;
+ kSubMenuItem *m_quickBrowserMenu;
+};
+
+#endif
+
diff --git a/kcontrol/kicker/panel.desktop b/kcontrol/kicker/panel.desktop
new file mode 100644
index 000000000..0c05d67f5
--- /dev/null
+++ b/kcontrol/kicker/panel.desktop
@@ -0,0 +1,224 @@
+[Desktop Entry]
+Icon=kcmkicker
+Type=Application
+DocPath=kcontrol/panel/index.html
+Exec=kcmshell panel
+
+
+X-KDE-Library=kicker
+X-KDE-ParentApp=kcontrol
+
+Name=Panels
+Name[af]=Panele
+Name[ar]=اللوحات
+Name[az]=Panellər
+Name[be]=Панэлі
+Name[bg]=Панели
+Name[bn]=প্যানেল
+Name[br]=Panelloù
+Name[bs]=Paneli
+Name[ca]=Plafons
+Name[cs]=Panely
+Name[csb]=Panele
+Name[cy]=Paneli
+Name[da]=Paneler
+Name[de]=Kontrollleisten
+Name[el]=Πίνακες
+Name[eo]=Paneloj
+Name[es]=Paneles
+Name[et]=Paneelid
+Name[eu]=Panelak
+Name[fa]=تابلوها
+Name[fi]=Paneelit
+Name[fr]=Tableau de bord
+Name[fy]=Panielen
+Name[ga]=Painéil
+Name[gl]=Paneis
+Name[he]=לוחות
+Name[hi]=पेनल्स
+Name[hr]=Ploče
+Name[hu]=Panelek
+Name[is]=Spjald
+Name[it]=Pannelli
+Name[ja]=パネル
+Name[ka]=პანელები
+Name[kk]=Панельдер
+Name[km]=បន្ទះ
+Name[ko]=패널
+Name[lo]=ຖາດພາແນວ
+Name[lt]=Pultai
+Name[lv]=Panelis
+Name[mk]=Панели
+Name[mn]=Удирдах самбарууд
+Name[ms]=Panel
+Name[mt]=Pannelli
+Name[nb]=Paneler
+Name[nds]=Paneels
+Name[ne]=प्यानल
+Name[nl]=Panelen
+Name[nn]=Panel
+Name[nso]=Di-Panel
+Name[pa]=ਪੈਨਲ
+Name[pl]=Panele
+Name[pt]=Painéis
+Name[pt_BR]=Painéis
+Name[ro]=Panouri
+Name[ru]=Панели
+Name[rw]=Imyanya
+Name[se]=Panelat
+Name[sk]=Panely
+Name[sl]=Pulti
+Name[sr]=Панели
+Name[sr@Latn]=Paneli
+Name[sv]=Paneler
+Name[ta]=பலகம்
+Name[te]=పెనల్సు
+Name[tg]=Панелҳо
+Name[th]=ถาดพาเนล
+Name[tr]=Paneller
+Name[tt]=Taqta
+Name[uk]=Панель
+Name[uz]=Panellar
+Name[uz@cyrillic]=Панеллар
+Name[ven]=Dziphanele
+Name[vi]=Bảng điều khiển
+Name[wa]=Scriftôrs
+Name[xh]=Amaqela eenjongo ezithile
+Name[zh_CN]=面板
+Name[zh_TW]=面板
+Name[zu]=amawindi emininingwane
+
+Comment=Configure the arrangement of the panel
+Comment[af]=Stel die rangskikking van die paneel hier op
+Comment[ar]=هنا تستطيع إعداد ترتيب اللوح
+Comment[az]=Panelin düzülüşünü quraşdır
+Comment[be]=Настаўленні раўнавання панэлі
+Comment[bg]=Настройване разпределението на системния панел
+Comment[bn]=প্যানেল-এর বিন্যাস কনফিগার করুন
+Comment[br]=Kefluniañ doare ar banell
+Comment[bs]=Ovdje možete podesiti izgled panela
+Comment[ca]=Configura l'arranjament del plafó
+Comment[cs]=Zde je možné nastavit uspořádání panelu
+Comment[csb]=Kònfigùracëjô pòłożeniô panelu
+Comment[cy]=Ffurfweddu trefn y panel
+Comment[da]=Indstil panelets arrangement
+Comment[de]=Anordnung der Kontrollleiste vornehmen
+Comment[el]=Ρυθμίστε τη διάταξη του πίνακα
+Comment[eo]=Agordu la aranĝon de la panelo
+Comment[es]=Configuración de la apariencia del panel
+Comment[et]=Siin saad seadistada paneeli paigutust
+Comment[eu]=Konfiguratu panelaren eraketa
+Comment[fa]=پیکربندی ترتیب تابلو
+Comment[fi]=Vaihda paneelin asettelua
+Comment[fr]=Configuration de la disposition du tableau de bord
+Comment[fy]=Hjir kinne jo it ûntwerp fan it paniel ynstelle
+Comment[gl]=Configurar a disposición do painel
+Comment[he]=הגדר את סידור הלוח
+Comment[hi]=फलक की व्यवस्था कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje rasporeda ploče
+Comment[hu]=A panel elrendezésének beállításai
+Comment[is]=Stilla viðmót spjaldsins
+Comment[it]=Configura la posizione del pannello
+Comment[ja]=パネルの配置を設定
+Comment[ka]=პანელის თანმიმდევრულობის კონფიგურაცია
+Comment[kk]=Панельді орналастыруын баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ការ​រៀបចំ​បន្ទះ
+Comment[lt]=Čia galite konfigūruoti pulto išdėstymą
+Comment[lv]=Šeit jūs varat konfigurēt paneļa izkārotjumu
+Comment[mk]=Конфигурирајте го распоредот на панелот
+Comment[mn]=Цонхны дарааллыг тохируулах
+Comment[ms]=Konfigur susunan panel
+Comment[mt]=Tista' tbiddel t-tqassim tal-pannell hawnhekk
+Comment[nb]=Oppstilling av panelet
+Comment[nds]=Anornen vun't Paneel instellen
+Comment[ne]=प्यानलको मिलान कन्फिगर गर्नुहोस्
+Comment[nl]=U kunt hier de opmaak van het paneel instellen
+Comment[nn]=Oppstilling av panelet
+Comment[pa]=ਪੈਨਲ ਦੇ ਢਾਂਚੇ ਦੀ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja położenia panelu
+Comment[pt]=Configurar o posicionamento do painel aqui
+Comment[pt_BR]=Configura a disposição do Painel
+Comment[ro]=Configurează modul de aranjare al panoului
+Comment[ru]=Настройка выравнивания панели
+Comment[rw]=Kuboneza itunganya ry'umwanya
+Comment[se]=Heivet panela ráhkadusa
+Comment[sk]=Nastavenie rozloženia panelu
+Comment[sl]=Nastavi razpored pulta
+Comment[sr]=Подешавање распореда на панелу
+Comment[sr@Latn]=Podešavanje rasporeda na panelu
+Comment[sv]=Anpassa panelens placering
+Comment[ta]=பலகத்தின் வரிசையை வடிவமை
+Comment[tg]=Танзимоти созишномаи панел
+Comment[th]=ปรับแต่งการจัดเรียงถาดพาเนล
+Comment[tr]=Panelin konumunu buradan yapılandırabilirsiniz
+Comment[tt]=Taqta urınlaşuın caylaw
+Comment[uk]=Налаштування компонування панелі
+Comment[uz]=Panelning tartibini moslash
+Comment[uz@cyrillic]=Панелнинг тартибини мослаш
+Comment[vi]=Cấu hình sự sắp đặt các bảng điều khiển
+Comment[wa]=Vos ploz apontyî chal l' arindjmint do scriftôr
+Comment[zh_CN]=配置面板的排列
+Comment[zh_TW]=您可以在此設定面板的排列方式
+
+Keywords=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[be]=Панэль,Панэль заданняў,Панэль стартавання,Размяшчэнне,Пазіцыя,Памер,Аўтаматычна хаваць,Хаваць,Кнопкі,Анімацыя,Фон,Тэмы,Кэш меню,Кэш,Схаваная,Схаваць,Меню KDE,Закладкі,Ранейшыя,Нядаўнія,Дакументы,Хуткі прагляд,Меню вандроўніка,Меню вандравання,Меню,Значкі,Аплеты,Запуск,Падсвятленне,Апрацоўка,Апрацоўшчык,Маштабаванне значак,kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[bg]=системен, панел, подредба, подравняване, kicker, panel, kpanel, taskbar, startbar, launchbar, location, size, auto hide, hide, buttons, animation, background, themes, menu cache, cache, hidden, K-Menu, bookmarks, recent documents, quickbrowser, browser menu, menu, icons, tiles, applets, startup, highlight, handles, zooming icons
+Keywords[bs]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,veličina,automatsko sakrivanje,sakrivanje,dugmad,animacija,pozadina,teme,keš menija,meni,keš,skriven,zabilješke,skorašnji dokumenti,meni browsera,meni preglednika,ikone,appleti,pokretanje,uvećavanje
+Keywords[ca]=kicker,plafó,kpanel,barra de tasques,barra d'inici,barra de llançament,localització,mida,auto oculta,oculta,botons,animació,temes,fons,cau del menú,cau,ocult,Menú K,punts,documents recents,navegació ràpida,menú de navegació,menú,icones,mosaics,aplets,arrencada,ressaltat,nanses,ampliar les icones
+Keywords[cs]=kicker,panel,kpanel,pruh úloh,lišta úloh,umístění, velikost,skrývání,automatické skrývání,tlačítka,animace,pozadí, motivy,nabídka,menu,záložky,nedávné dokumenty,rychlé prohlížení, ikony,dlaždice,applety,spuštění,zvýraznění,úchytky,zvětšování ikon
+Keywords[csb]=kicker,panel,kpanel,lëstëw zadaniów,sztartowô lëstëw,lëstëw zrëszaniô,pòłożenié,miara,aùtomatno tacënié,tacë,knąpë,animacëjô,spódk,spòdlé,témë,cache menu,cache,zatacony,K-Menu,załóżczi,slédny dokùmentë,chùtczé przezéranié,menu,ikònë,kafelkòwané,programiczi,zrëszanié,pòdskrzënianié,ùchwëtë,zwikszanié ikònów
+Keywords[cy]=ciciwr,kicker,panel,kpanel,bar tasgau,bar cychwyn,bar lansio,lleoliad,maint,awto-guddio,hunan-guddio,cuddio,botymau,animeiddiad,cefndir,themâu,storfa dewislen, storfa,cache,celc,cudd,K-Menu,nodau tudalen,dogfenni diweddar,porydd cyflym,dewislen porydd,dewislen,eiconau,teiliau,rhaglenigion,ymcychwyn,amlygu,carnau,eiconau chwyddo
+Keywords[da]=kicker,panel,kpanel,opgavelinje,startlinje,sted,størrelse,autogem,gem,knapper,animering,baggrund,temaer,menucache,cache,skjult,K-Menu,bogmærker,nylige dokumenter,hurtigsøger,søgemenu,menu,ikoner,fliser,panelprogrammer,opstart,markér,håndterer,ikoner
+Keywords[de]=Kicker,Panel,Taskbar,Kontrollleiste,Startleiste,Klickstartleiste,Fensterleiste,Autom. ausblenden,Ausblenden, Knöpfe,Animation,Hintergründe,Stile,Design,Themes,Menü-Zwischenspeicher, K-Menü,Zwischenspeicher,Lesezeichen,Zuletzt geöffnete Dateien, Schnellanzeiger,Menüs,Symbole,Icons,Kacheln,Applets,Miniprogramme, Java-Miniprogramme,Hervorhebung,Anfasser,Sicherheitsstufen,Zoom für Symbole
+Keywords[el]=kicker,πίνακας,kpanel,γραμμή εργασιών,γραμμή έναρξης,γραμμή εκκίνησης,τοποθεσία,μέγεθος,αυτόματη απόκρυψη,απόκρυψη,κουμπιά,εφέ κίνησης,φόντο,θέματα,λανθάνουσα μνήμη μενού,λανθάνουσα μνήμη,κρυφό, K-Μενού,σελιδοδείκτες,πρόσφατα έγγραφα,γρήγορος εξερευνητής,μενού εξερευνητή,μενού,εικονίδια,tiles,μικροεφαρμογές,έναρξη,τονισμός,χειριστήρια, μεγέθυνση εικονιδίων
+Keywords[eo]=lanĉilo,panelo,tasklistelo,situo,grandeco,aŭtokaŝo,kaŝo,butono,fono,etoso,menubufro,K-Menuo,legosigno,lasta dokumento,rapidrigardilo,rigardmenuo,piktogramo,kahelo,aplikaĵo,lanĉo,emfazo,teniloj,pligrandigo,fidindaj aplikaĵetoj,sekurecnivelo
+Keywords[es]=kicker,panel,kpanel,barra de tareas,barra de inicio,barra de lanzamiento,dirección,tamaño,auto ocultar,ocultar,botones,animación,fondo,temas,caché de menú,caché,oculto,Menú K,marcadores,documentos recientes,navegador rápido,menú navegador,menú,iconos,mosaicos,miniaplicaciones,arranque,resaltado,asas,iconos ampliados
+Keywords[et]=kicker,paneel,kpanel,tegumiriba,käivitusriba,asukoht,suurus,terminal,automaatne peitmine,peitmine,nupud,animatsioon,taust,teemad,menüü vahemälu,vahemälu,peidetud,K-menüü,järjehoidjad,viimati kasutatud dokumendid, kiirbrauser,lehitsemise menüü,menüü,ikoonid,apletid,käivitamine,esiletõstmine,piirded,ikoonide suurendamine,usaldusväärsed apletid,turvatase
+Keywords[eu]=kicker,panela,kpanela,ataza-barra,hasiera-barra,abiarazte-barra,kokapena, neurria,auto ezkutatu,ezkutatu,botoiak,animazioa,atzeko planoa, gaiak,menu-katxea,katxea,ezkutatu,K-menua,laster-markak,oraintsuko dokumentuak, arakatzaile bizkorra,arakatzaile menua,menua,ikonoak,baldosak,appletak,abiatu,nabarmendu,heldulekuak,zooming icons
+Keywords[fa]=kicker، تابلو، kpanel، میله‌ تکلیف، میله آغاز، میله راه‌انداز، محل، اندازه، مخفی کردن خودکار، مخفی کردن، دکمه‌ها، پویانمایی، زمینه، چهره‌ها، نهانگاه گزینگان، نهانگاه، مخفی، گزینگان K، چوب ‌الفها، سندهای اخیر، مرورگر سریع، گزینگان، مرورگر، شمایلها، کاشیها، برنامکها، راه‌اندازی، مشخص، گرداننده‌ها، بزرگ‌نمایی شمایلها
+Keywords[fi]=kicker,paneeli,kpanel,tehtäväpalkki,käynnistyspalkki,paikka,koko,automaattipiilotus,piilotus,napit,animaatio,tausta,teemat,valikkovälimuisti,välimuisti,K-valikko,kirjanmerkit,viimeaikaiset asiakirjat,pikaselain,selausvalikko,valikko,kuvakkeet,sovelmat,käynnistys,korostus,kahvat,kuvakkeiden suurennus
+Keywords[fr]=kicker,tableau de bord,barre du bas,barre des tâches,barre de démarrage,barre de lancement,emplacement,taille,auto-masquage,cacher,masquer,boutons,animation,fond,arrière-plan,thème,cache de menu,cache,caché,menu K,K,signets,documents récents,document récent,navigateur rapide,navigateur,menu,icône,mosaïque,applet,démarrage,surbrillance,poignée,poignées,zoom,zoom sur les icônes
+Keywords[fy]=kicker,paniel,kpanel,taakbalke,takebalke,Startbalke,startmenu,applikaasje begjinner,lokaasje,ôfmjiting,terminaltapassing,auto hide,automatysk ferstopje,ferstopje,Ynklappe,knoppen,animaasje,eftergrûn,tema's,menu lyts ûnthâld,lyts ûnthâld,ferstoppe,K-Menu,bookmarks,blêdwizers,resinte dokuminten,quickbrowser,browser menu,menu,icons,ikoan,ikoanen,tegels,tiles,applets,begjinne,opljochtsje,handles,zoomen,knoppen,hanfetten,betroubere applets,feiligens nivo
+Keywords[gl]=kicker,painel,kpanel,barra de tarefas,barra de comezo,barra de lanzamento,localización,tamaño,auto agochamento,agochamento,botóns,animación,fondo,temas,cache de menú,caché,oculto,Menú K,marcadores,derradeiros documentos,navegador rápido,menú de navegación,menú,iconas,apliques,início,resaltado,xestión,aumento de iconas
+Keywords[he]=kicker, לוח, kpanel, שורת משימות, שורת הרצה, מיקום, גודל, הסתרה אוטומטית, הסתר, אנימציה, רקע, ערכות, תפריט, מטמון, מוסתר, תפריט K, מועדפים, מסמכים אחרונים, דפדוף מהיר, תפריט, סימנים, סמלים, כותרות, יישומונים, אתחול, הדגשה, ידיות, הגדלת סמלים, taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons, panel
+Keywords[hi]=किकर,फलक,के-पेनल,कार्यपट्टी,प्रारंभपट्टी,चालकपट्टी,स्थान,आकार,स्वतः छुपें,छुपें,बटन्स,एनिमेशन,पृष्ठभूमि,प्रसंग,मेनू कैश,कैश,छुपा,के-मेन्यू,पसंद,हाल ही के दस्तावेज़,क्विक-ब्राउज़र,ब्राउज़र मेन्यू,मेन्यू,प्रतीक,टाइल्स,ऐप्लेट्स,स्टार्टअप,उभारना,हैंडल्स,जूमिंग प्रतीक
+Keywords[hr]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,ploča,traka zadataka,traka pokretanja,lokacija,veličina,automatsko skrivanje,skrivanje,gumbi,animacija,pozadina,teme,pohrana izbornika,pohrana,skriven,oznake,nedavni dokumenti,brzi preglednik,izbornik preglednika,izbornik,ikone,popločeno,apleti,naglašavanje,rukovanje,uvećane ikone
+Keywords[hu]=Kicker,panel,kpanel,feladatlista,start menü,indítómenü,indítósáv,hely,méret,automatikus elrejtés,elrejtés,gombok,animáció,háttér,témák,menügyorstár,gyorstár,rejtett,K menü,könyvjelzők,legutóbbi dokumentumok,gyorsböngésző,böngészőmenü,menü,ikonok,mozaikszerű,kisalkalmazások,indulás,kiemelés,fogantyúk,nagyítóikonok
+Keywords[is]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,trusted applets,security level
+Keywords[it]=kicker,pannello,kpanel,barra delle applicazioni,taskbar,startbar,launchbar,barra di avvio,posizione,dimensione,scomparsa automatica,pulsanti,animazione,sfondo,temi,cache dei menu,nascosto,Menu K,segnalibri,documenti recenti,browser veloce,menu,icone,piastrelle,applet,avvio,evidenziazione,maniglie,ingrandimento icone
+Keywords[ja]=kicker,パネル,kpanel,タスクバー,スタートバー,ラウンチバー,場所,サイズ,自動的に隠す,隠す,ボタン,アニメーション,背景,テーマ,メニューキャッシュ,キャッシュ,隠れた,Kメニュー,ブックマーク,最近のドキュメント,クイックブラウザ,ブラウザメニュー,メニュー,アイコン,タイル,アプレット,スタートアップ,ハイライト,ハンドル,アイコンのズーム
+Keywords[km]=kicker,បន្ទះ,kpanel,របារ​ភារកិច្ច,របារ​បើក​ដំណើរការ,ទីតាំង,ទំហំ,លាក់​ស្វ័យប្រវត្តិ,លាក់,ប៊ូតុង,ចលនា,ផ្ទៃ​ខាង​ក្រោយ,ស្បែក,ឃ្លាំង​សម្ងាត់​ម៉ឺនុយ,ឃ្លាំង​សម្ងាត់,លាក់,ម៉ឺនុយ K,កន្លែង​ចំណាំ,ឯកសារ​ថ្មីៗ​នេះ,កម្មវិធី​រុករក​រហ័ស,ម៉ឺនុយ​កម្មវិធី​រុករក,ម៉ឺនុយ,រូបតំណាង,ក្បឿង,អាប់ភ្លេត,ចាប់ផ្ដើម,បន្លិច,ប្រើ,រូបតំណាង​ពង្រីក
+Keywords[lt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,skydelis,kskydelis,užduočių juosta,paleidimo juosta,slėpti,mygtukai,animacija,fonas,temos,meniu atmintinė,atmintinė,paslėptas,žymelės,neseniai naudoti dokumentai,peržiūra,meniu,ženkliukai,perdengti,įskiepiai,paleistis,pažymėti,rankenėlės,išdidinti ženkliukus
+Keywords[lv]=kicker,panelis,kpanel,uzdevumjosla,startbar,launchbar,location,size,izmērs,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,grāmatzīmes,recent documents,quickbrowser,browser menu,izvēlne,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[mk]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,панел,лента со програми,локација,големина,авто криење,криење,копчиња,анимација,подлога,позадина,теми,кеш на менито,кеш,скриен,K-Мени,обележувачи, последни документи,брз прелистувач,мени за прелистувачи,мени,икони,плочки,аплети,рачки,зумирање на икони
+Keywords[mt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,favoriti,pannell,post,daqs,lokazzjoni,ħabi,animazzjoni,buttuni
+Keywords[nb]=kicker,panel,kpanel,oppgavelinje,startlinje,plassering,størrelse, autoskjul,skjul,knapper,animasjon,bakgrunn,temaer,mellomlager for temaer, mellomlager,skjult,K-meny,bokmerker,nylig brukte dokumenter,hurtigviser, katalogmeny,meny,ikoner,fliser,miniprogrammer,panelprogrammer,oppstart, uthev,håndtak,forstørring av ikoner
+Keywords[nds]=Kicker,Paneel,kpanel,Taskbalken,Programmbalken,Startbalken,Adress,Grött,automaatsch versteken,versteken,Knööp,Knoop,Knööp,Animatschoon,Achtergrund,Muster,Menü-Twischenspieker,Twischenspieker,versteken,K-Menü,Leesteken,leste Dokmenten,Fixkieker,Nettkieker-Menü,Menü,Lüttbiller,Titel,Programmen,starten,markeren,handles,Grepen,Lüttbiller grötter maken
+Keywords[ne]=किकर, प्यानल, के प्यानल, कार्यपट्टी, सुरुपट्टी, सुरुआतपट्टी, स्थान, आकार, स्वत: लुकाउने, लुकाउनुहोस्, बटनहरू, एनिमेसन, पृष्ठभूमि, विषयवस्तुहरू, मेनु क्यास, क्यास, लुकेको, के-मेनु, पुस्तकचिनोहरू, हालको कागजातहरू, छिटो ब्राउजर, ब्राउजर मेनु, मेनु, प्रतिमा, टायलहरू, एप्लेटहरू, सुरु, हाइलाइट, ह्यान्डल गर्दछ, जुम प्रतिमा
+Keywords[nl]=kicker,paneel,kpanel,taakbalk,takenbalk,startbalk,startmenu,applicatie starter,locatie,afmeting,terminaltoepassing,auto hide,automatisch verbergen,verbergen,invouwen,knoppen,animatie,achtergrond,thema's,menu cache,cache,verborgen,K-Menu,bookmarks,bladwijzers,recente documenten,quickbrowser,browser menu,menu,icons,icoon,iconen,pictogrammen,tegels,tiles,applets,opstarten,highlight,accentuering,handles,zoomen,knoppen,handvatten,betrouwbare applets,security level,beveiligingsniveau
+Keywords[nn]=Kicker,panel,KPanel,oppgåvelinje,oppstartslinje,plassering,storleik,autogøym,gøym,knappar,animasjon,bakgrunn,tema,menymellomlager,mellomlager,gøymd,K-meny,bokmerke,nyleg bruka dokument,snøgglesar,katalogmeny,meny,ikon,brikker,applet,panelprogram,oppstart,merking,handtak,forstørring av ikon
+Keywords[pa]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons, ਪੈਨਲ, ਟਿਕਾਣਾ, ਬਰਾਊਜ਼ਰ, ਝਲਾਕਰਾ, ਕੈਂਚੇ, ਕੇ-ਮੇਨੂ, ਬੁੱਕਮਾਰਕ, ਤਾਜ਼ਾ, ਉਘੜੇ, ਹੈਂਡਲ, ਬਟਨ, ਸਰੂਪ, ਮੇਨੂ, ਓਹਲੇ, ਅਕਾਰ
+Keywords[pl]=kicker,panel,kpanel,pasek zadań,pasek startu,pasek uruchamiania,położenie,rozmiar,automatyczne ukrywanie,ukryj,przyciski,animacja,tło,motywy,bufor (cache) menu,bufor,cache,ukryty,K-Menu,zakładki,ostatnie dokumenty,szybkie przeglądanie,menu,ikony,kafelkowane,programiki,uruchomienie,podświetlanie,uchwyty,powiększanie ikon
+Keywords[pt]=kicker,painel,kpanel,barra de tarefas,barra de início,barra de lançamento,localização,tamanho,auto-esconder,esconder,botões,animação,fundo,temas,'cache' de menu,'cache',escondido,menu K,favoritos,documentos recentes,navegador rápido,menu de navegação,menu,ícones,mosaicos,'applets',inicio,realce,pegas,ícones aumentados
+Keywords[pt_BR]=kicker,painel,kpanel,barra de tarefas,lançar aplicativos,localização,tamanho,auto-ocultar,esconder,botões, animação,fundo,temas,cache de menu,cache,escondido,Menu K,favoritos,documentos recentes,navegador rápido, menu do navegador,menu,ícones,títulos,mini-aplicativos,iniciar,realçar, manipuladores, ícones de ampliação
+Keywords[ro]=kicker,panou,kpanel,bară de procese,bară de start,pornire,lansare,mărime,locație,ascundere automată,butoane,animație,fundal,tematică,meniu K,semne de carte,documente recente,navigator rapid,meniu navigare,meniu,iconițe,mozaic,miniaplicații,evidențiere,scalare
+Keywords[rw]=igitera,umwanya,k-umwanya,umurongogutangira,umurongogutangiza,indangahantu,ingano,kwihisha,guhisha,buto,iyega,mbuganyuma,insanganyamatsiko,ubwihisho bw'ibikubiyemo,ubwihisho,bihishe,K-Ibikubiyemo,utumenyetso,inyandiko zigezweho,mucukumbuzi yihuta,ibikubiyemo bya mucukumbuzi,ibikubiyemo,udushushondanga,udukaro,apuleti,gutangira,gushimangira,ibifashi,udushushondanga guhindura-ingano
+Keywords[se]=kicker,panela,kpanel,bargoholga,álggahanholga,báiki,sturrodat,autočiega,čiehkadit,boalut,animašuvdna,duogáš,fáddá,fálločiehkárájus,čiehkárájus,K-fállu,girjemearkkat,aiddo geavahuvvon dokumeantta,ohcofállu,fállu,govažat,prográmmažat,álggaheapmi,merken,geavjjat,luohttehahtti prográmmažat,sihkkarvuohtadássi
+Keywords[sk]=kicker,panel,kpanel,taskbar,startbar,launchbar,miesto,umiestnenie,veľkosť,terminálová aplikácia,skrývanie,automatické skrývanie,tlačidlá,animácia,pozadie,témy,cache,cache ponuky,skryté,K-Menu,záložky,posledné dokumenty,rýchly prehliadač,ponuka prehliadača,menu,ikony,applety,štart,zvýraznenie,handles,zväčšovanie ikon,overené applety,úroveň zabezpečenia
+Keywords[sl]=kicker,pult,kpanel,opravilna vrstica,zagonska vrstica,mesto,lokacija,velikost,terminalski program,skrij,samodejno skrivanje,skrivanje,gumbi,animacija,ozadje,teme,menijski predpomnilnik,predpomnilnik,skrit,K-Menu,zaznamki,nedavni dokumenti,hitro brskanje,brskalni meni,meni,tlakovci,ikone,vstavki,zagon,osvetlitev,ročice,ikone za povečavo
+Keywords[sr]=kicker,панел,kpanel,трака задатака,startbar,launchbar,локација,величина,Терминалски програм,аутоматско сакривање,сакривање,дугмићи,анимација,позадина,теме,мени кеш,кеш,скривен,K-Menu,маркери,скори документи,брзи прегледач,мени прегледача,мени,иконе,блокови,апплети,startup,истицање,хватаљке,увеличавање икона,аплети којима се верује,ниво безбедности
+Keywords[sr@Latn]=kicker,panel,kpanel,traka zadataka,startbar,launchbar,lokacija,veličina,Terminalski program,automatsko sakrivanje,sakrivanje,dugmići,animacija,pozadina,teme,meni keš,keš,skriven,K-Menu,markeri,skori dokumenti,brzi pregledač,meni pregledača,meni,ikone,blokovi,appleti,startup,isticanje,hvataljke,uveličavanje ikona,apleti kojima se veruje,nivo bezbednosti
+Keywords[sv]=kicker,panel,k-panel,aktivitetsfält,startfält,körningsfält,plats,storlek,dölj automatiskt,dölj,göm,knappar,animering,bakgrund,teman,menycache,cache,gömd,dold,K-meny,bokmärken,senaste dokument,snabbläddrare,bläddringsmeny,meny,ikoner,miniprogram,start,framhäv,grepp,zoomikoner
+Keywords[ta]=கிக்கர், பானல், கேபானல்,துவக்கப்பட்டி, துவங்கும்பட்டி,இடம்,அளவு, சத்தம் மறை, மறை,பட்டன், உயிர்சித்திரம்,பின்னனி,கருப்பொருள், தற்காலிக மெனு, மறைந்த,கே-மெனு,புத்தககுறிகள், தற்போதைய ஆவணம். வேக உலாவி, உலாவி மெனு, மெனு, சின்னம், சிறுநிரல், துவக்கம், கையாள், பெரிதாக்கும் சின்னங்கள்
+Keywords[th]=kicker,พาเนล,kpanel,taskbar,startbar,แถบเรียกโปรแกรม,ที่ตั้ง,ขนาด,ซ่อนอัตโนมัติ ,ซ่อน,ปุ่ม,อนิเมชั่น,พื้นหลัง,ชุดตกแต่ง,แคชของเมนู,แคช,ถูกซ่อน,K-Menu,ที่คั่นหน้า,เอกสารที่เพิ่งเปิดไป,quickbrowser,เมนูของบราวเซอร์,เมนู,ไอคอน,พื้นผิว,applets,startup,highlight,handles,ซูมไอคอน
+Keywords[tr]=kicker,panel,kpanel,görev çubuğu,başlangıç çubuğu,başlat çubuğu,konum,boyut,Uç birim uygulaması,otomatik gizle,gizle,tuşlar,animasyon,artalan,temalar,menü ön belleği,ön bellek,gizli,K-Menu,yer imleri,en son kullanılan belgeler,hızlı gözatıcı,göz atıcı menüsü,menü,simgeler,karo,programcıklar,Başlangıç,belirt,tutamaçlar,büyüyen simgeler,güvenilen programcıklar,güvenlik düzeyi
+Keywords[tt]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser saylaq,saylaq,icons,tiles,applets,startup,highlight,handles,zooming icons
+Keywords[uk]=kicker,панель,смужка задач,kpanel,смужка запуску,розташування,розмір,консольна програма,автоматичне згортання,згортання,кнопки,анімація,тло,теми,кеш меню,кеш,схований,К-Меню,закладки,недавні документи,швидка навігація,меню навігатора,меню,піктограми,заголовки,аплети,запуск,підсвічування,маніпулятор,масштабування піктограм
+Keywords[uz]=panel,vazifalar paneli,bekitish,avto-bekitish,tugmalar,animatsiya,orqa fon,mavzular,K-menyu,kesh,yashirilgan,xatchoʻplar,yaqinda ochilgan hujjatlar,tez koʻruvchi,brauzer menyusi,menyuning keshi,menyu,nishonchalar,appletlar,nishonchalarni kattalashtirish,oʻlcham,kicker,kpanel,startbar,launchbar,joylashishi,tiles,startup,highlight,handles
+Keywords[uz@cyrillic]=панел,вазифалар панели,бекитиш,авто-бекитиш,тугмалар,анимация,орқа фон,мавзулар,К-меню,кэш,яширилган,хатчўплар,яқинда очилган ҳужжатлар,тез кўрувчи,браузер менюси,менюнинг кэши,меню,нишончалар,апплетлар,нишончаларни катталаштириш,ўлчам,kicker,kpanel,startbar,launchbar,жойлашиши,tiles,startup,highlight,handles
+Keywords[vi]=kích hoạt,bảng điều khiển,kpanel,thanh tác vụ,thanh khởi động,thanh phóng,vị trí,kích cỡ,tự ẩn,ẩn,nút,hoạt hình,mảnh nền,sắc thái,thực đơn đệm,đệm,giấu,Thực đơn K,số lưu liên kết,tài liệu gần đây,duyệt nhanh,thực đơn duyệt,thực đơn,biểu tượng,tiêu đề,tiểu ứng dụng,khởi động,nổi bật,cầm nắm,biểu tượng phóng đại,ứng dụng đáng tin,mức độ an ninh
+Keywords[wa]=kicker,panel,sicriftôr,scriftôr,kpanel,taskbar,bår des bouyes,startbar,launchbar,bår d' enondaedje,plaece,grandeu,catche tot seu,catchî,botons,animåvion,fond,tinmes,muchete menu,muchete,K-Menu,rimåkes,documints nén vî,betchteu rade,dresseŷe do betchteu,dressêye,menu,imådjetes,applets,apliketes,enonde tot seu,highlight,handles,zooming icons,zoumer les imådjetes
+Keywords[zh_CN]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons面板,任务栏,启动栏,位置,大小,自动隐藏,隐藏,按钮,动画,背景,主题,菜单缓存,缓存,书签,最近文档,快速浏览器,浏览器菜单,菜单,图标,平铺,启动,突出,句柄,缩放图标
+Keywords[zh_TW]=kicker,panel,kpanel,taskbar,startbar,launchbar,location,size,auto hide,hide,buttons,animation,background,themes,menu cache,cache,hidden,K-Menu,bookmarks,recent documents,quickbrowser,browser menu,menu,icons,tiles,applets,startup,highlight,handles,zooming icons,面板,工作列,啟動列,快捷列,位置,大小,自動隱藏,隱藏,按鈕,動畫,背景,佈景主題,選單快取,快取,隱藏,K-選單,書籤,最近開啟的文件,快速瀏覽,瀏覽選單,選單,圖示,小圖塊,應用程式,啟動,高亮度,處理,縮放圖示
+
+Categories=Qt;KDE;X-KDE-settings-desktop;
diff --git a/kcontrol/kicker/positionconfig.cpp b/kcontrol/kicker/positionconfig.cpp
new file mode 100644
index 000000000..86a94ed21
--- /dev/null
+++ b/kcontrol/kicker/positionconfig.cpp
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2005 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ */
+
+#include <qlayout.h>
+#include <qtimer.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include "positiontab_impl.h"
+#include "kickerSettings.h"
+#include "main.h"
+
+#include "positionconfig.h"
+#include "positionconfig.moc"
+
+PositionConfig::PositionConfig(QWidget *parent, const char *name)
+ : KCModule(parent, name)
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ m_widget = new PositionTab(this);
+ layout->addWidget(m_widget);
+ layout->addStretch();
+
+ setQuickHelp(KickerConfig::the()->quickHelp());
+ setAboutData(KickerConfig::the()->aboutData());
+
+ //addConfig(KickerSettings::self(), m_widget);
+
+ connect(m_widget, SIGNAL(changed()),
+ this, SLOT(changed()));
+ connect(KickerConfig::the(), SIGNAL(aboutToNotifyKicker()),
+ this, SLOT(aboutToNotifyKicker()));
+
+ load();
+ QTimer::singleShot(0, this, SLOT(notChanged()));
+}
+
+void PositionConfig::notChanged()
+{
+ emit changed(false);
+}
+
+void PositionConfig::load()
+{
+ m_widget->load();
+ KCModule::load();
+}
+
+void PositionConfig::aboutToNotifyKicker()
+{
+ kdDebug() << "PositionConfig::aboutToNotifyKicker()" << endl;
+
+ // This slot is triggered by the signal,
+ // which is send before Kicker is notified.
+ // See comment in save().
+ m_widget->save();
+ KCModule::save();
+}
+
+void PositionConfig::save()
+{
+ // As we don't want to notify Kicker multiple times
+ // we do not save the settings here. Instead the
+ // KickerConfig object sends a signal before the
+ // notification. On this signal all existing modules,
+ // including this object, save their settings.
+ KickerConfig::the()->notifyKicker();
+}
+
+void PositionConfig::defaults()
+{
+ m_widget->defaults();
+ KCModule::defaults();
+
+ // KConfigDialogManager may queue an changed(false) signal,
+ // so we make sure, that the module is labeled as changed,
+ // while we manage some of the widgets ourselves
+ QTimer::singleShot(0, this, SLOT(changed()));
+}
diff --git a/kcontrol/kicker/positionconfig.h b/kcontrol/kicker/positionconfig.h
new file mode 100644
index 000000000..8fc1c885f
--- /dev/null
+++ b/kcontrol/kicker/positionconfig.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2005 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ */
+
+#ifndef __positionconfig_h__
+#define __positionconfig_h__
+
+#include <kcmodule.h>
+
+class PositionTab;
+
+class PositionConfig : public KCModule
+{
+ Q_OBJECT
+
+public:
+ PositionConfig(QWidget *parent = 0, const char *name = 0);
+
+ void load();
+ void save();
+ void defaults();
+
+public slots:
+ void notChanged();
+ void aboutToNotifyKicker();
+
+private:
+ PositionTab *m_widget;
+};
+
+#endif // __positionconfig_h__
diff --git a/kcontrol/kicker/positiontab.ui b/kcontrol/kicker/positiontab.ui
new file mode 100644
index 000000000..b0566f5dc
--- /dev/null
+++ b/kcontrol/kicker/positiontab.ui
@@ -0,0 +1,1129 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>PositionTabBase</class>
+<author>Aaron J. Seigo</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>PositionTabBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>517</width>
+ <height>400</height>
+ </rect>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is a list of all the panels currently active on your desktop. Select one to configure.</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_panelsGroupBox</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_panelListLabel</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;ettings for:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_panelList</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>m_panelList</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>342</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox" row="1" column="1" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>XineramaGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Screen</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_monitorImage</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>151</width>
+ <height>115</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This preview image shows how the panel will appear on your screen with the settings you have chosen. Clicking the buttons around the image will move the position of the panel, while moving the length slider and choosing different sizes will change the dimensions of the panel.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer13_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>Layout12</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m_identifyButton</cstring>
+ </property>
+ <property name="text">
+ <string>Identify</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This button displays each monitor's identifying number</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>Layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_xineramaScreenLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Xinerama screen:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_xineramaScreenComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>m_xineramaScreenComboBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This menu selects which screen the Panel will be displayed on in a multiple-monitor system</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>Spacer61</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>101</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup" row="2" column="0">
+ <property name="name">
+ <cstring>m_rsizeGroup</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>10</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Len&amp;gth</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This group of settings determines how the panel is aligned, including
+how it is positioned on the screen and how much of the screen it should use.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>m_percentSlider</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="maxValue">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>100</number>
+ </property>
+ <property name="tracking">
+ <bool>true</bool>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>NoMarks</enum>
+ </property>
+ <property name="tickInterval">
+ <number>10</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This slider defines how much of the screen's edge will be occupied by the panel.</string>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>m_percentSpinBox</cstring>
+ </property>
+ <property name="value">
+ <number>100</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="maxValue">
+ <number>100</number>
+ </property>
+ <property name="suffix">
+ <string>%</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This spinbox defines how much of the screen's edge will be occupied by the panel.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_expandCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Expand as required to fit contents</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When this option is selected, the panel will grow as necessary to accommodate the buttons and applets on it.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer row="4" column="0">
+ <property name="name">
+ <cstring>Spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QButtonGroup" row="3" column="0">
+ <property name="name">
+ <cstring>m_sizeGroup</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>10</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Si&amp;ze</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This sets the size of the panel.</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="0" column="0" rowspan="1" colspan="2">
+ <item>
+ <property name="text">
+ <string>Tiny</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Small</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Normal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Large</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Custom</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_panelSize</cstring>
+ </property>
+ </widget>
+ <spacer row="1" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>Spacer14_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>Layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>m_customSlider</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minValue">
+ <number>24</number>
+ </property>
+ <property name="maxValue">
+ <number>128</number>
+ </property>
+ <property name="pageStep">
+ <number>8</number>
+ </property>
+ <property name="value">
+ <number>58</number>
+ </property>
+ <property name="tracking">
+ <bool>true</bool>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>NoMarks</enum>
+ </property>
+ <property name="tickInterval">
+ <number>20</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This slider defines the panel size when the Custom option is selected.</string>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>m_customSpinbox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="value">
+ <number>58</number>
+ </property>
+ <property name="minValue">
+ <number>24</number>
+ </property>
+ <property name="maxValue">
+ <number>128</number>
+ </property>
+ <property name="suffix">
+ <string> pixels</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This spinbox defines the panel size when the Custom option is selected.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="0">
+ <property name="name">
+ <cstring>m_locationGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Position</string>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can set the position of the panel highlighted on the left side. You can put any panel on top or bottom of the screen and on the left or right side of the screen. There you can put it into the center or into either corner of the screen.</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>Spacer9_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="0" column="0">
+ <property name="name">
+ <cstring>Spacer10_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>Layout7</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>Layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>locationTopLeft</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>Alt+1</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>locationTop</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>Alt+2</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>locationTopRight</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>Alt+3</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>Layout10</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>locationLeftTop</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>Alt+=</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>locationLeft</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>Alt+-</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>locationLeftBottom</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>Alt+0</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>Layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>locationBottomLeft</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>Alt+9</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>locationBottom</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>Alt+8</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>locationBottomRight</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>Alt+7</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="2">
+ <property name="name">
+ <cstring>Layout9</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>locationRightTop</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>Alt+4</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>locationRight</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>Alt+5</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>locationRightBottom</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>Alt+6</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>m_percentSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>PositionTabBase</receiver>
+ <slot>lengthenPanel(int)</slot>
+ </connection>
+ <connection>
+ <sender>m_sizeGroup</sender>
+ <signal>clicked(int)</signal>
+ <receiver>PositionTabBase</receiver>
+ <slot>panelDimensionsChanged()</slot>
+ </connection>
+ <connection>
+ <sender>m_customSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>PositionTabBase</receiver>
+ <slot>panelDimensionsChanged()</slot>
+ </connection>
+ <connection>
+ <sender>m_percentSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>m_percentSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>m_percentSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>m_percentSlider</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>m_customSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>m_customSpinbox</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>m_customSpinbox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>m_customSlider</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>m_locationGroup</sender>
+ <signal>clicked(int)</signal>
+ <receiver>PositionTabBase</receiver>
+ <slot>movePanel(int)</slot>
+ </connection>
+ <connection>
+ <sender>m_panelSize</sender>
+ <signal>activated(int)</signal>
+ <receiver>PositionTabBase</receiver>
+ <slot>panelDimensionsChanged()</slot>
+ </connection>
+ <connection>
+ <sender>m_panelList</sender>
+ <signal>activated(int)</signal>
+ <receiver>PositionTabBase</receiver>
+ <slot>switchPanel(int)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>locationTopLeft</tabstop>
+ <tabstop>locationTop</tabstop>
+ <tabstop>locationTopRight</tabstop>
+ <tabstop>locationRightTop</tabstop>
+ <tabstop>locationRight</tabstop>
+ <tabstop>locationRightBottom</tabstop>
+ <tabstop>locationBottomRight</tabstop>
+ <tabstop>locationBottom</tabstop>
+ <tabstop>locationBottomLeft</tabstop>
+ <tabstop>locationLeftBottom</tabstop>
+ <tabstop>locationLeft</tabstop>
+ <tabstop>locationLeftTop</tabstop>
+ <tabstop>m_percentSlider</tabstop>
+ <tabstop>m_percentSpinBox</tabstop>
+ <tabstop>m_expandCheckBox</tabstop>
+ <tabstop>m_customSlider</tabstop>
+ <tabstop>m_customSpinbox</tabstop>
+ <tabstop>m_identifyButton</tabstop>
+ <tabstop>m_xineramaScreenComboBox</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in declaration">klineedit.h</include>
+ <include location="global" impldecl="in implementation">knuminput.h</include>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected" specifier="pure virtual">lengthenPanel( int )</slot>
+ <slot access="protected" specifier="pure virtual">movePanel( int )</slot>
+ <slot access="protected" specifier="pure virtual">panelDimensionsChanged()</slot>
+ <slot specifier="pure virtual">switchPanel( int )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/kicker/positiontab_impl.cpp b/kcontrol/kicker/positiontab_impl.cpp
new file mode 100644
index 000000000..22f38e0a1
--- /dev/null
+++ b/kcontrol/kicker/positiontab_impl.cpp
@@ -0,0 +1,742 @@
+/*
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ * Copyright (c) 2002 Aaron Seigo <aseigo@olympusproject.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <stdlib.h>
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <qtooltip.h>
+#include <qtimer.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <knuminput.h>
+#include <kpanelextension.h>
+#include <kpixmap.h>
+#include <kstandarddirs.h>
+#include <kwin.h>
+
+#include "main.h"
+#include "../background/bgrender.h"
+
+#include "positiontab_impl.h"
+#include "positiontab_impl.moc"
+
+
+// magic numbers for the preview widget layout
+extern const int offsetX = 23;
+extern const int offsetY = 14;
+extern const int maxX = 150;
+extern const int maxY = 114;
+extern const int margin = 1;
+
+PositionTab::PositionTab(QWidget *parent, const char* name)
+ : PositionTabBase(parent, name),
+ m_pretendPanel(0),
+ m_desktopPreview(0),
+ m_panelInfo(0),
+ m_panelPos(PosBottom),
+ m_panelAlign(AlignLeft)
+{
+ QPixmap monitor(locate("data", "kcontrol/pics/monitor.png"));
+ m_monitorImage->setPixmap(monitor);
+ m_monitorImage->setFixedSize(m_monitorImage->sizeHint());
+
+ m_pretendDesktop = new QWidget(m_monitorImage, "pretendBG");
+ m_pretendDesktop->setGeometry(offsetX, offsetY, maxX, maxY);
+ m_pretendPanel = new QFrame(m_monitorImage, "pretendPanel");
+ m_pretendPanel->setGeometry(offsetX + margin, maxY + offsetY - 10,
+ maxX - margin, 10 - margin);
+ m_pretendPanel->setFrameShape(QFrame::MenuBarPanel);
+
+ /*
+ * set the tooltips on the buttons properly for RTL langs
+ */
+ if (kapp->reverseLayout())
+ {
+ QToolTip::add(locationTopRight, i18n("Top left"));
+ QToolTip::add(locationTop, i18n("Top center"));
+ QToolTip::add(locationTopLeft, i18n("Top right" ) );
+ QToolTip::add(locationRightTop, i18n("Left top"));
+ QToolTip::add(locationRight, i18n("Left center"));
+ QToolTip::add(locationRightBottom, i18n("Left bottom"));
+ QToolTip::add(locationBottomRight, i18n("Bottom left"));
+ QToolTip::add(locationBottom, i18n("Bottom center"));
+ QToolTip::add(locationBottomLeft, i18n("Bottom right"));
+ QToolTip::add(locationLeftTop, i18n("Right top"));
+ QToolTip::add(locationLeft, i18n("Right center"));
+ QToolTip::add(locationLeftBottom, i18n("Right bottom"));
+ }
+ else
+ {
+ QToolTip::add(locationTopLeft, i18n("Top left"));
+ QToolTip::add(locationTop, i18n("Top center"));
+ QToolTip::add(locationTopRight, i18n("Top right" ) );
+ QToolTip::add(locationLeftTop, i18n("Left top"));
+ QToolTip::add(locationLeft, i18n("Left center"));
+ QToolTip::add(locationLeftBottom, i18n("Left bottom"));
+ QToolTip::add(locationBottomLeft, i18n("Bottom left"));
+ QToolTip::add(locationBottom, i18n("Bottom center"));
+ QToolTip::add(locationBottomRight, i18n("Bottom right"));
+ QToolTip::add(locationRightTop, i18n("Right top"));
+ QToolTip::add(locationRight, i18n("Right center"));
+ QToolTip::add(locationRightBottom, i18n("Right bottom"));
+ }
+
+ // connections
+ connect(m_locationGroup, SIGNAL(clicked(int)), SIGNAL(changed()));
+ connect(m_xineramaScreenComboBox, SIGNAL(highlighted(int)), SIGNAL(changed()));
+
+ connect(m_identifyButton,SIGNAL(clicked()),SLOT(showIdentify()));
+
+ for(int s=0; s < QApplication::desktop()->numScreens(); s++)
+ { /* populate the combobox for the available screens */
+ m_xineramaScreenComboBox->insertItem(QString::number(s+1));
+ }
+ m_xineramaScreenComboBox->insertItem(i18n("All Screens"));
+
+ // hide the xinerama chooser widgets if there is no need for them
+ if (QApplication::desktop()->numScreens() < 2)
+ {
+ m_identifyButton->hide();
+ m_xineramaScreenComboBox->hide();
+ m_xineramaScreenLabel->hide();
+ }
+
+ connect(m_percentSlider, SIGNAL(valueChanged(int)), SIGNAL(changed()));
+ connect(m_percentSpinBox, SIGNAL(valueChanged(int)), SIGNAL(changed()));
+ connect(m_expandCheckBox, SIGNAL(clicked()), SIGNAL(changed()));
+
+ connect(m_sizeGroup, SIGNAL(clicked(int)), SIGNAL(changed()));
+ connect(m_customSlider, SIGNAL(valueChanged(int)), SIGNAL(changed()));
+ connect(m_customSpinbox, SIGNAL(valueChanged(int)), SIGNAL(changed()));
+
+ m_desktopPreview = new KVirtualBGRenderer(0);
+ connect(m_desktopPreview, SIGNAL(imageDone(int)),
+ SLOT(slotBGPreviewReady(int)));
+
+ connect(KickerConfig::the(), SIGNAL(extensionInfoChanged()),
+ SLOT(infoUpdated()));
+ connect(KickerConfig::the(), SIGNAL(extensionAdded(ExtensionInfo*)),
+ SLOT(extensionAdded(ExtensionInfo*)));
+ connect(KickerConfig::the(), SIGNAL(extensionRemoved(ExtensionInfo*)),
+ SLOT(extensionRemoved(ExtensionInfo*)));
+ connect(KickerConfig::the(), SIGNAL(extensionChanged(const QString&)),
+ SLOT(extensionChanged(const QString&)));
+ connect(KickerConfig::the(), SIGNAL(extensionAboutToChange(const QString&)),
+ SLOT(extensionAboutToChange(const QString&)));
+ // position tab tells hiding tab about extension selections and vice versa
+ connect(KickerConfig::the(), SIGNAL(hidingPanelChanged(int)),
+ SLOT(jumpToPanel(int)));
+ connect(m_panelList, SIGNAL(activated(int)),
+ KickerConfig::the(), SIGNAL(positionPanelChanged(int)));
+
+ connect(m_panelSize, SIGNAL(activated(int)),
+ SLOT(sizeChanged(int)));
+ connect(m_panelSize, SIGNAL(activated(int)),
+ SIGNAL(changed()));
+}
+
+PositionTab::~PositionTab()
+{
+ delete m_desktopPreview;
+}
+
+void PositionTab::load()
+{
+ m_panelInfo = 0;
+ KickerConfig::the()->populateExtensionInfoList(m_panelList);
+ m_panelsGroupBox->setHidden(m_panelList->count() < 2);
+
+ switchPanel(KickerConfig::the()->currentPanelIndex());
+ m_desktopPreview->setPreview(m_pretendDesktop->size());
+ m_desktopPreview->start();
+}
+
+void PositionTab::extensionAdded(ExtensionInfo* info)
+{
+ m_panelList->insertItem(info->_name);
+ m_panelsGroupBox->setHidden(m_panelList->count() < 2);
+}
+
+void PositionTab::save()
+{
+ storeInfo();
+ KickerConfig::the()->saveExtentionInfo();
+}
+
+void PositionTab::defaults()
+{
+ m_panelPos= PosBottom; // bottom of the screen
+ m_percentSlider->setValue( 100 ); // use all space available
+ m_percentSpinBox->setValue( 100 ); // use all space available
+ m_expandCheckBox->setChecked( true ); // expand as required
+ m_xineramaScreenComboBox->setCurrentItem(QApplication::desktop()->primaryScreen());
+
+ if (QApplication::reverseLayout())
+ {
+ // RTL lang aligns right
+ m_panelAlign = AlignRight;
+ }
+ else
+ {
+ // everyone else aligns left
+ m_panelAlign = AlignLeft;
+ }
+
+ m_panelSize->setCurrentItem(KPanelExtension::SizeNormal);
+
+ // update the magic drawing
+ lengthenPanel(-1);
+ switchPanel(KickerConfig::the()->currentPanelIndex());
+}
+
+void PositionTab::sizeChanged(int which)
+{
+ bool custom = which == KPanelExtension::SizeCustom;
+ m_customSlider->setEnabled(custom);
+ m_customSpinbox->setEnabled(custom);
+}
+
+void PositionTab::movePanel(int whichButton)
+{
+ QPushButton* pushed = reinterpret_cast<QPushButton*>(m_locationGroup->find(whichButton));
+
+ if (pushed == locationTopLeft)
+ {
+ if (!(m_panelInfo->_allowedPosition[PosTop]))
+ {
+ setPositionButtons();
+ return;
+ }
+ m_panelAlign = kapp->reverseLayout() ? AlignRight : AlignLeft;
+ m_panelPos = PosTop;
+ }
+ else if (pushed == locationTop)
+ {
+ if (!(m_panelInfo->_allowedPosition[PosTop]))
+ {
+ setPositionButtons();
+ return;
+ }
+ m_panelAlign = AlignCenter;
+ m_panelPos = PosTop;
+ }
+ else if (pushed == locationTopRight)
+ {
+ if (!(m_panelInfo->_allowedPosition[PosTop]))
+ {
+ setPositionButtons();
+ return;
+ }
+ m_panelAlign = kapp->reverseLayout() ? AlignLeft : AlignRight;
+ m_panelPos = PosTop;
+ }
+ else if (pushed == locationLeftTop)
+ {
+ if (!(m_panelInfo->_allowedPosition[kapp->reverseLayout() ? PosRight : PosLeft]))
+ {
+ setPositionButtons();
+ return;
+ }
+ m_panelAlign = AlignLeft;
+ m_panelPos = kapp->reverseLayout() ? PosRight : PosLeft;
+ }
+ else if (pushed == locationLeft)
+ {
+ if (!(m_panelInfo->_allowedPosition[kapp->reverseLayout() ? PosRight : PosLeft]))
+ {
+ setPositionButtons();
+ return;
+ }
+ m_panelAlign = AlignCenter;
+ m_panelPos = kapp->reverseLayout() ? PosRight : PosLeft;
+ }
+ else if (pushed == locationLeftBottom)
+ {
+ if (!(m_panelInfo->_allowedPosition[kapp->reverseLayout() ? PosRight : PosLeft]))
+ {
+ setPositionButtons();
+ return;
+ }
+ m_panelAlign = AlignRight;
+ m_panelPos = kapp->reverseLayout() ? PosRight : PosLeft;
+ }
+ else if (pushed == locationBottomLeft)
+ {
+ if (!(m_panelInfo->_allowedPosition[PosBottom]))
+ {
+ setPositionButtons();
+ return;
+ }
+ m_panelAlign = kapp->reverseLayout() ? AlignRight : AlignLeft;
+ m_panelPos = PosBottom;
+ }
+ else if (pushed == locationBottom)
+ {
+ if (!(m_panelInfo->_allowedPosition[PosBottom]))
+ {
+ setPositionButtons();
+ return;
+ }
+ m_panelAlign = AlignCenter;
+ m_panelPos = PosBottom;
+ }
+ else if (pushed == locationBottomRight)
+ {
+ if (!(m_panelInfo->_allowedPosition[PosBottom]))
+ {
+ setPositionButtons();
+ return;
+ }
+ m_panelAlign = kapp->reverseLayout() ? AlignLeft : AlignRight;
+ m_panelPos = PosBottom;
+ }
+ else if (pushed == locationRightTop)
+ {
+ if (!(m_panelInfo->_allowedPosition[kapp->reverseLayout() ? PosLeft : PosRight]))
+ {
+ setPositionButtons();
+ return;
+ }
+ m_panelAlign = AlignLeft;
+ m_panelPos = kapp->reverseLayout() ? PosLeft : PosRight;
+ }
+ else if (pushed == locationRight)
+ {
+ if (!(m_panelInfo->_allowedPosition[kapp->reverseLayout() ? PosLeft : PosRight]))
+ {
+ setPositionButtons();
+ return;
+ }
+ m_panelAlign = AlignCenter;
+ m_panelPos = kapp->reverseLayout() ? PosLeft : PosRight;
+ }
+ else if (pushed == locationRightBottom)
+ {
+ if (!(m_panelInfo->_allowedPosition[kapp->reverseLayout() ? PosLeft : PosRight]))
+ {
+ setPositionButtons();
+ return;
+ }
+ m_panelAlign = AlignRight;
+ m_panelPos = kapp->reverseLayout() ? PosLeft : PosRight;
+ }
+
+ lengthenPanel(-1);
+ emit panelPositionChanged(m_panelPos);
+}
+
+void PositionTab::lengthenPanel(int sizePercent)
+{
+ if (sizePercent < 0)
+ {
+ sizePercent = m_percentSlider->value();
+ }
+
+ unsigned int x(0), y(0), x2(0), y2(0);
+ unsigned int diff = 0;
+ unsigned int panelSize = 4;
+
+ switch (m_panelSize->currentItem())
+ {
+ case KPanelExtension::SizeTiny:
+ case KPanelExtension::SizeSmall:
+ panelSize = panelSize * 3 / 2;
+ break;
+ case KPanelExtension::SizeNormal:
+ panelSize *= 2;
+ break;
+ case KPanelExtension::SizeLarge:
+ panelSize = panelSize * 5 / 2;
+ break;
+ default:
+ panelSize = panelSize * m_customSlider->value() / 24;
+ break;
+ }
+
+ switch (m_panelPos)
+ {
+ case PosTop:
+ x = offsetX + margin;
+ x2 = maxX - margin;
+ y = offsetY + margin;
+ y2 = panelSize;
+
+ diff = x2 - ((x2 * sizePercent) / 100);
+ if (m_panelAlign == AlignLeft)
+ {
+ x2 -= diff;
+ }
+ else if (m_panelAlign == AlignCenter)
+ {
+ x += diff / 2;
+ x2 -= diff;
+ }
+ else // m_panelAlign == AlignRight
+ {
+ x += diff;
+ x2 -= diff;
+ }
+ break;
+ case PosLeft:
+ x = offsetX + margin;
+ x2 = panelSize;
+ y = offsetY + margin;
+ y2 = maxY - margin;
+
+ diff = y2 - ((y2 * sizePercent) / 100);
+ if (m_panelAlign == AlignLeft)
+ {
+ y2 -= diff;
+ }
+ else if (m_panelAlign == AlignCenter)
+ {
+ y += diff / 2;
+ y2 -= diff;
+ }
+ else // m_panelAlign == AlignRight
+ {
+ y += diff;
+ y2 -= diff;
+ }
+ break;
+ case PosBottom:
+ x = offsetX + margin;
+ x2 = maxX - margin;
+ y = offsetY + maxY - panelSize;
+ y2 = panelSize;
+
+ diff = x2 - ((x2 * sizePercent) / 100);
+ if (m_panelAlign == AlignLeft)
+ {
+ x2 -= diff;
+ }
+ else if (m_panelAlign == AlignCenter)
+ {
+ x += diff / 2;
+ x2 -= diff;
+ }
+ else // m_panelAlign == AlignRight
+ {
+ x += diff;
+ x2 -= diff;
+ }
+ break;
+ default: // case PosRight:
+ x = offsetX + maxX - panelSize;
+ x2 = panelSize;
+ y = offsetY + margin;
+ y2 = maxY - margin;
+
+ diff = y2 - ((y2 * sizePercent) / 100);
+ if (m_panelAlign == AlignLeft)
+ {
+ y2 -= diff;
+ }
+ else if (m_panelAlign == AlignCenter)
+ {
+ y += diff / 2;
+ y2 -= diff;
+ }
+ else // m_panelAlign == AlignRight
+ {
+ y += diff;
+ y2 -= diff;
+ }
+ break;
+ }
+
+ if (x2 < 3)
+ {
+ x2 = 3;
+ }
+
+ if (y2 < 3)
+ {
+ y2 = 3;
+ }
+
+ m_pretendPanel->setGeometry(x, y, x2, y2);
+}
+
+void PositionTab::panelDimensionsChanged()
+{
+ lengthenPanel(-1);
+}
+
+void PositionTab::slotBGPreviewReady(int)
+{
+ m_pretendDesktop->setBackgroundPixmap(m_desktopPreview->pixmap());
+#if 0
+ KPixmap pm;
+ if (QPixmap::defaultDepth() < 15)
+ {
+ pm.convertFromImage(*m_desktopPreview->image(), KPixmap::LowColor);
+ }
+ else
+ {
+ pm.convertFromImage(*m_desktopPreview->image());
+ }
+
+ m_pretendDesktop->setBackgroundPixmap(pm);
+#endif
+}
+
+void PositionTab::switchPanel(int panelItem)
+{
+ blockSignals(true);
+ ExtensionInfo* panelInfo = (KickerConfig::the()->extensionsInfo())[panelItem];
+
+ if (!panelInfo)
+ {
+ m_panelList->setCurrentItem(0);
+ panelInfo = (KickerConfig::the()->extensionsInfo())[panelItem];
+
+ if (!panelInfo)
+ {
+ return;
+ }
+ }
+
+ if (m_panelInfo)
+ {
+ storeInfo();
+ }
+
+ m_panelInfo = panelInfo;
+
+ // because this changes when panels come and go, we have
+ // to be overly pedantic and remove the custom item every time and
+ // decide to add it back again, or not
+ m_panelSize->removeItem(KPanelExtension::SizeCustom);
+ if (m_panelInfo->_customSizeMin != m_panelInfo->_customSizeMax)
+ {
+ m_panelSize->insertItem(i18n("Custom"), KPanelExtension::SizeCustom);
+ }
+
+ if (m_panelInfo->_size >= KPanelExtension::SizeCustom ||
+ (!m_panelInfo->_useStdSizes &&
+ m_panelInfo->_customSizeMin != m_panelInfo->_customSizeMax)) // compat
+ {
+ m_panelSize->setCurrentItem(KPanelExtension::SizeCustom);
+ sizeChanged(KPanelExtension::SizeCustom);
+ }
+ else
+ {
+ m_panelSize->setCurrentItem(m_panelInfo->_size);
+ sizeChanged(0);
+ }
+ m_panelSize->setEnabled(m_panelInfo->_useStdSizes);
+
+ m_customSlider->setMinValue(m_panelInfo->_customSizeMin);
+ m_customSlider->setMaxValue(m_panelInfo->_customSizeMax);
+ m_customSlider->setTickInterval(m_panelInfo->_customSizeMax / 6);
+ m_customSlider->setValue(m_panelInfo->_customSize);
+ m_customSpinbox->setMinValue(m_panelInfo->_customSizeMin);
+ m_customSpinbox->setMaxValue(m_panelInfo->_customSizeMax);
+ m_customSpinbox->setValue(m_panelInfo->_customSize);
+ m_sizeGroup->setEnabled(m_panelInfo->_resizeable);
+ m_panelPos = m_panelInfo->_position;
+ m_panelAlign = m_panelInfo->_alignment;
+ if(m_panelInfo->_xineramaScreen >= 0 && m_panelInfo->_xineramaScreen < QApplication::desktop()->numScreens())
+ m_xineramaScreenComboBox->setCurrentItem(m_panelInfo->_xineramaScreen);
+ else if(m_panelInfo->_xineramaScreen == -2) /* the All Screens option: qt uses -1 for default, so -2 for all */
+ m_xineramaScreenComboBox->setCurrentItem(m_xineramaScreenComboBox->count()-1);
+ else
+ m_xineramaScreenComboBox->setCurrentItem(QApplication::desktop()->primaryScreen());
+
+ setPositionButtons();
+
+ m_percentSlider->setValue(m_panelInfo->_sizePercentage);
+ m_percentSpinBox->setValue(m_panelInfo->_sizePercentage);
+
+ m_expandCheckBox->setChecked(m_panelInfo->_expandSize);
+
+ lengthenPanel(m_panelInfo->_sizePercentage);
+ blockSignals(false);
+}
+
+
+void PositionTab::setPositionButtons() {
+ if (m_panelPos == PosTop)
+ {
+ if (m_panelAlign == AlignLeft)
+ kapp->reverseLayout() ? locationTopRight->setOn(true) :
+ locationTopLeft->setOn(true);
+ else if (m_panelAlign == AlignCenter)
+ locationTop->setOn(true);
+ else // if (m_panelAlign == AlignRight
+ kapp->reverseLayout() ? locationTopLeft->setOn(true) :
+ locationTopRight->setOn(true);
+ }
+ else if (m_panelPos == PosRight)
+ {
+ if (m_panelAlign == AlignLeft)
+ kapp->reverseLayout() ? locationLeftTop->setOn(true) :
+ locationRightTop->setOn(true);
+ else if (m_panelAlign == AlignCenter)
+ kapp->reverseLayout() ? locationLeft->setOn(true) :
+ locationRight->setOn(true);
+ else // if (m_panelAlign == AlignRight
+ kapp->reverseLayout() ? locationLeftBottom->setOn(true) :
+ locationRightBottom->setOn(true);
+ }
+ else if (m_panelPos == PosBottom)
+ {
+ if (m_panelAlign == AlignLeft)
+ kapp->reverseLayout() ? locationBottomRight->setOn(true) :
+ locationBottomLeft->setOn(true);
+ else if (m_panelAlign == AlignCenter)
+ locationBottom->setOn(true);
+ else // if (m_panelAlign == AlignRight
+ kapp->reverseLayout() ? locationBottomLeft->setOn(true) :
+ locationBottomRight->setOn(true);
+ }
+ else // if (m_panelPos == PosLeft
+ {
+ if (m_panelAlign == AlignLeft)
+ kapp->reverseLayout() ? locationRightTop->setOn(true) :
+ locationLeftTop->setOn(true);
+ else if (m_panelAlign == AlignCenter)
+ kapp->reverseLayout() ? locationRight->setOn(true) :
+ locationLeft->setOn(true);
+ else // if (m_panelAlign == AlignRight
+ kapp->reverseLayout() ? locationRightBottom->setOn(true) :
+ locationLeftBottom->setOn(true);
+ }
+
+}
+
+void PositionTab::infoUpdated()
+{
+ switchPanel(0);
+}
+
+void PositionTab::extensionAboutToChange(const QString& configPath)
+{
+ ExtensionInfo* extension = (KickerConfig::the()->extensionsInfo())[m_panelList->currentItem()];
+ if (extension && extension->_configPath == configPath)
+ {
+ storeInfo();
+ }
+}
+
+void PositionTab::extensionChanged(const QString& configPath)
+{
+ ExtensionInfo* extension = (KickerConfig::the()->extensionsInfo())[m_panelList->currentItem()];
+ if (extension && extension->_configPath == configPath)
+ {
+ m_panelInfo = 0;
+ switchPanel(m_panelList->currentItem());
+ }
+}
+
+void PositionTab::storeInfo()
+{
+ if (!m_panelInfo)
+ {
+ return;
+ }
+
+ // Magic numbers stolen from kdebase/kicker/core/global.cpp
+ // PGlobal::sizeValue()
+ if (m_panelSize->currentItem() < KPanelExtension::SizeCustom)
+ {
+ m_panelInfo->_size = m_panelSize->currentItem();
+ }
+ else
+ {
+ m_panelInfo->_size = KPanelExtension::SizeCustom;
+ m_panelInfo->_customSize = m_customSlider->value();
+ }
+
+ m_panelInfo->_position = m_panelPos;
+ m_panelInfo->_alignment = m_panelAlign;
+ if(m_xineramaScreenComboBox->currentItem() == m_xineramaScreenComboBox->count()-1)
+ m_panelInfo->_xineramaScreen = -2; /* all screens */
+ else
+ m_panelInfo->_xineramaScreen = m_xineramaScreenComboBox->currentItem();
+
+ m_panelInfo->_sizePercentage = m_percentSlider->value();
+ m_panelInfo->_expandSize = m_expandCheckBox->isChecked();
+}
+
+void PositionTab::showIdentify()
+{
+ for(int s=0; s < QApplication::desktop()->numScreens();s++)
+ {
+
+ QLabel *screenLabel = new QLabel(0,"Screen Identify", WDestructiveClose | WStyle_Customize | WX11BypassWM );
+
+ QFont identifyFont(KGlobalSettings::generalFont());
+ identifyFont.setPixelSize(100);
+ screenLabel->setFont(identifyFont);
+
+ screenLabel->setFrameStyle(QFrame::Panel);
+ screenLabel->setFrameShadow(QFrame::Plain);
+
+ screenLabel->setAlignment(Qt::AlignCenter);
+ screenLabel->setNum(s + 1);
+ // BUGLET: we should not allow the identification to be entered again
+ // until the timer fires.
+ QTimer::singleShot(1500, screenLabel, SLOT(close()));
+
+ QPoint screenCenter(QApplication::desktop()->screenGeometry(s).center());
+ QRect targetGeometry(QPoint(0,0),screenLabel->sizeHint());
+ targetGeometry.moveCenter(screenCenter);
+
+ screenLabel->setGeometry(targetGeometry);
+
+ screenLabel->show();
+ }
+}
+
+void PositionTab::extensionRemoved(ExtensionInfo* info)
+{
+ int count = m_panelList->count();
+ int extensionCount = KickerConfig::the()->extensionsInfo().count();
+ int index = 0;
+ for (; index < count && index < extensionCount; ++index)
+ {
+ if (KickerConfig::the()->extensionsInfo()[index] == info)
+ {
+ break;
+ }
+ }
+
+ bool isCurrentlySelected = index == m_panelList->currentItem();
+ m_panelList->removeItem(index);
+ m_panelsGroupBox->setHidden(m_panelList->count() < 2);
+
+ if (isCurrentlySelected)
+ {
+ m_panelList->setCurrentItem(0);
+ }
+}
+
+void PositionTab::jumpToPanel(int index)
+{
+ m_panelList->setCurrentItem(index);
+ switchPanel(index);
+}
diff --git a/kcontrol/kicker/positiontab_impl.h b/kcontrol/kicker/positiontab_impl.h
new file mode 100644
index 000000000..6c7cdc5ea
--- /dev/null
+++ b/kcontrol/kicker/positiontab_impl.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ * Copyright (c) 2002 Aaron Seigo <aseigo@olympusproject.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+
+#ifndef __positiontab_impl_h__
+#define __positiontab_impl_h__
+
+#include "positiontab.h"
+
+class QFrame;
+class KVirtualBGRenderer;
+class KickerConfig;
+class ExtensionInfo;
+
+class PositionTab : public PositionTabBase
+{
+ Q_OBJECT
+
+public:
+ PositionTab(QWidget *parent, const char* name = 0);
+ ~PositionTab();
+
+ enum positions { PosLeft = 0, PosRight, PosTop, PosBottom };
+ enum allignments { AlignLeft = 0, AlignCenter, AlignRight };
+
+ void load();
+ void save();
+ void defaults();
+
+signals:
+ void changed();
+ void panelPositionChanged(int);
+
+protected slots:
+ void movePanel(int);
+ void lengthenPanel(int);
+ void panelDimensionsChanged();
+ void slotBGPreviewReady(int);
+ void infoUpdated();
+ void storeInfo();
+ void showIdentify();
+ void extensionAdded(ExtensionInfo*);
+ void extensionRemoved(ExtensionInfo* info);
+ void extensionChanged(const QString&);
+ void extensionAboutToChange(const QString&);
+ void sizeChanged(int);
+ void switchPanel(int);
+ void jumpToPanel(int);
+
+private:
+ QFrame* m_pretendPanel;
+ QWidget* m_pretendDesktop;
+ KVirtualBGRenderer* m_desktopPreview;
+ ExtensionInfo* m_panelInfo;
+
+ unsigned int m_panelPos;
+ unsigned int m_panelAlign;
+ void setPositionButtons();
+};
+
+#endif
+
diff --git a/kcontrol/kicker/uninstall.desktop b/kcontrol/kicker/uninstall.desktop
new file mode 100644
index 000000000..10e05f80d
--- /dev/null
+++ b/kcontrol/kicker/uninstall.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Type=Application
+Name=Foo
+Name[ko]=카메룬
+Name[nds]=Bispeel
+Name[pl]=Coś
+Name[pt]=XPTO
+Name[sr]=Фу
+Name[sr@Latn]=Fu
+Name[tr]=Boş
+Hidden=true
diff --git a/kcontrol/kio/Makefile.am b/kcontrol/kio/Makefile.am
new file mode 100644
index 000000000..29f0cf30f
--- /dev/null
+++ b/kcontrol/kio/Makefile.am
@@ -0,0 +1,39 @@
+SUBDIRS = uasproviders
+
+AM_CPPFLAGS = $(all_includes)
+AM_LDFLAGS = $(all_libraries)
+
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = kcm_kio.la
+
+kcm_kio_la_SOURCES = policydlg.cpp kcookiesmain.cpp kcookiespolicies.cpp \
+ main.cpp smbrodlg.cpp useragentdlg.cpp kproxydlgbase.cpp \
+ kmanualproxydlg.cpp kenvvarproxydlg.cpp kproxydlg.cpp \
+ kcookiesmanagement.cpp fakeuaprovider.cpp uagentproviderdlg.cpp \
+ netpref.cpp cache.cpp ksaveioconfig.cpp socks.cpp socksbase.ui \
+ kproxydlg_ui.ui kcookiesmanagementdlg_ui.ui kcookiespoliciesdlg_ui.ui \
+ policydlg_ui.ui useragentdlg_ui.ui uagentproviderdlg_ui.ui \
+ manualproxy_ui.ui envvarproxy_ui.ui cache_ui.ui
+
+kcm_kio_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+kcm_kio_la_LIBADD = $(LIB_KIO) $(LIB_KUTILS)
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmkio.pot
+
+update_DATA = socks.upd
+updatedir = $(kde_datadir)/kconf_update
+
+servicetypes_DATA = uasprovider.desktop
+servicetypesdir = $(kde_servicetypesdir)
+
+xdg_apps_DATA = cookies.desktop useragent.desktop cache.desktop \
+ lanbrowser.desktop netpref.desktop proxy.desktop
+
+smb_DATA = smb.desktop
+smbdir = $(kde_appsdir)/.hidden
+
+install-data-local: uninstall.desktop
+ $(mkinstalldirs) $(DESTDIR)$(kde_appsdir)/Settings/WebBrowsing
+ $(INSTALL_DATA) $(srcdir)/uninstall.desktop $(DESTDIR)$(kde_appsdir)/Settings/WebBrowsing/smb.desktop
diff --git a/kcontrol/kio/UA-DESKTOP-FILE-HOWTO b/kcontrol/kio/UA-DESKTOP-FILE-HOWTO
new file mode 100644
index 000000000..8d67d9a37
--- /dev/null
+++ b/kcontrol/kio/UA-DESKTOP-FILE-HOWTO
@@ -0,0 +1,135 @@
+Mini HOWTO create a "User-Agent" description file for KDE
+=========================================================
+
+This mini HOWTO describes the procedure for creating a new user-agent
+description file to extend the ones that come pre-packaged with KDE.
+The purpose of a user agent description file is to fake or spoof sites
+that refuse to render pages with the default KDE user-agent identification.
+
+In order to create new user-agent description files, simply follow the
+normal desktop file specifications set by the "DESKTOP ENTRY STANDARD"
+augmented with the following requirements:
+
+REQUIREMENTS:
+=============
+The following properties as defined by the DESKTOP ENTRY STANDARD
+must be set as shown below:
+
+Name=UADescription (XXXX)
+Type=Service
+ServiceTypes=UserAgentStrings
+
+Though the (XXXX) value shown above can be any text, it is a good idea
+to make it a short identification of the browser being emulated. However,
+there is NO requirement on what the text should be. It can even be left
+out. It is only meant to give people a quick idea which browser is being
+emulated by your desktop file.
+
+NEW PROPERTIES:
+===============
+X-KDE-UA-TAG
+FIELD: REQUIRED
+TYPE: QString
+TRANSLATE: NO
+DESCRIPTION:
+An abbreviation of the actual browser-brand and is used
+to group the entries whenever necessary. Currently there are 5
+approximations: IE, NN, MOZ, OP, MISC. These represent Internet
+Explorer, Netscape Navigator, Mozilla, Opera and Miscellaneous
+respectively. NOTE: you can enter any value here as it is just
+a place holder that would be automatically replaced with the
+actual user-agent name (X-KDE-UA-NAME).
+
+X-KDE-UA-FULL
+FIELD: REQUIRED
+TYPE: QString
+TRANSLATE: NO
+DESCRIPTION:
+The full user-agent description that will be sent to the remote
+site. It can contain the following keywords that would be replaced
+with the appropriate value as defined by "uname":
+
+appSysName the name of the operating system (ex: Linux).
+appPlatform the name of the platform. Currently hardcoded to "X11".
+appLanguage the language values as set in the control panel (ex: en, en-US).
+appSysRelease the version of the operating system (ex: 2.2.18).
+appKDERelease the current release number as set by KDE (ex: 2.1.9 >=20010310).
+appMachineType the processor or machine type (ex: i686).
+
+NOTE: if you use any of these values and want them to be replaced
+automatically, make sure you include the X-KDE-UA-DYNAMIC-ENTRY field
+and set its value to 1 (for true).
+
+X-KDE-UA-NAME
+FIELD: REQUIRED
+TYPE: QString
+TRANSLATE: YES
+DESCRIPTION:
+The actual name of the browser or user-agent.
+
+X-KDE-UA-VERSION
+FIELD: REQUIRED
+TYPE: QString
+TRANSLATE: YES
+DESCRIPTION:
+The actual version of the browser or user-agent.
+
+X-KDE-UA-SYSNAME
+FIELD: OPTIONAL
+TYPE: QString
+TRANSLATE: YES
+DESCRIPTION:
+The system name (for example Linux) where the browser
+identification was obtained from.
+
+X-KDE-UA-SYSRELEASE
+FIELD: OPTIONAL
+TYPE: QString
+TRANSLATE: YES
+DESCRIPTION:
+The system version (for example 2.4.1) where the browser
+identification was obtained from.
+
+X-KDE-UA-DYNAMIC-ENTRY
+FIELD: OPTIONAL
+TYPE: BOOLEAN (0/1)
+TRANSLATE: NO
+DESCRIPTION:
+A boolean that indicates whether the keywords described under
+X-KDE-UA-FULL should be translated. Make sure this field is
+there with its value set to "1" if you want the keywords to
+be replaced appropriately.
+
+
+EXAMPLES:
+=========
+[Desktop Entry]
+Name=UADescription (IE 5.5 on Win 98)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=IE
+X-KDE-UA-FULL=Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
+X-KDE-UA-NAME=Internet Explorer
+X-KDE-UA-VERSION=5.5
+X-KDE-UA-SYSNAME=Windows
+X-KDE-UA-SYSRELEASE=98
+
+[Desktop Entry]
+Name=UADescription (NN 4.76 on current)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=NN
+X-KDE-UA-FULL=Mozilla/4.76 (appPlatform; U; appSysName appSysRelease appMachineType)
+X-KDE-UA-NAME=Netscape Navigator
+X-KDE-UA-VERSION=4.76
+X-KDE-UA-DYNAMIC-ENTRY=1
+
+The first entry is a description file for Internet Explorer running on
+a Windows 98 machine while the second one is an example of a description
+file for Netscape browser using the "keyword" based approach to describe
+the fields that should be replaced dynamically based on the current system
+settings. Note that all "keyword" based desktop files should always set
+X-KDE-UA-DYNAMIC-ENTRY to 1.
+
+Enjoy,
+Dawit A.
diff --git a/kcontrol/kio/cache.cpp b/kcontrol/kio/cache.cpp
new file mode 100644
index 000000000..8b730ae77
--- /dev/null
+++ b/kcontrol/kio/cache.cpp
@@ -0,0 +1,127 @@
+/*
+ cache.cpp - Proxy configuration dialog
+
+ Copyright (C) 2001,02,03 Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License (GPL) version 2 as published by the Free Software
+ Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qwhatsthis.h>
+#include <qpushbutton.h>
+#include <qbuttongroup.h>
+#include <qradiobutton.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kprocess.h>
+#include <knuminput.h>
+
+#include "ksaveioconfig.h"
+#include <kio/http_slave_defaults.h>
+
+#include "cache.h"
+#include "cache_ui.h"
+
+KCacheConfigDialog::KCacheConfigDialog( QWidget* parent )
+ :KCModule( parent, "kcmkio" )
+{
+ QVBoxLayout* mainLayout = new QVBoxLayout(this, 0, 0);
+ m_dlg = new CacheDlgUI(this);
+ mainLayout->addWidget(m_dlg);
+ mainLayout->addStretch();
+
+ load();
+}
+
+void KCacheConfigDialog::load()
+{
+ m_dlg->cbUseCache->setChecked(KProtocolManager::useCache());
+ m_dlg->sbMaxCacheSize->setValue( KProtocolManager::maxCacheSize() );
+
+ KIO::CacheControl cc = KProtocolManager::cacheControl();
+
+ if (cc==KIO::CC_Verify)
+ m_dlg->rbVerifyCache->setChecked( true );
+ else if (cc==KIO::CC_Refresh)
+ m_dlg->rbVerifyCache->setChecked( true );
+ else if (cc==KIO::CC_CacheOnly)
+ m_dlg->rbOfflineMode->setChecked( true );
+ else if (cc==KIO::CC_Cache)
+ m_dlg->rbCacheIfPossible->setChecked( true );
+
+ // Config changed notifications...
+ connect ( m_dlg->cbUseCache, SIGNAL(toggled(bool)), SLOT(configChanged()) );
+ connect ( m_dlg->bgCachePolicy, SIGNAL(clicked (int)), SLOT(configChanged()) );
+ connect ( m_dlg->sbMaxCacheSize, SIGNAL(valueChanged(int)), SLOT(configChanged()) );
+ connect ( m_dlg->pbClearCache, SIGNAL(clicked()), SLOT(slotClearCache()) );
+ emit changed( false );
+}
+
+void KCacheConfigDialog::save()
+{
+ KSaveIOConfig::setUseCache( m_dlg->cbUseCache->isChecked() );
+ KSaveIOConfig::setMaxCacheSize( m_dlg->sbMaxCacheSize->value() );
+
+ if ( !m_dlg->cbUseCache->isChecked() )
+ KSaveIOConfig::setCacheControl(KIO::CC_Refresh);
+ else if ( m_dlg->rbVerifyCache->isChecked() )
+ KSaveIOConfig::setCacheControl(KIO::CC_Refresh);
+ else if ( m_dlg->rbOfflineMode->isChecked() )
+ KSaveIOConfig::setCacheControl(KIO::CC_CacheOnly);
+ else if ( m_dlg->rbCacheIfPossible->isChecked() )
+ KSaveIOConfig::setCacheControl(KIO::CC_Cache);
+
+ // Update running io-slaves...
+ KSaveIOConfig::updateRunningIOSlaves (this);
+
+ emit changed( false );
+}
+
+void KCacheConfigDialog::defaults()
+{
+ m_dlg->cbUseCache->setChecked( true );
+ m_dlg->rbVerifyCache->setChecked( true );
+ m_dlg->sbMaxCacheSize->setValue( DEFAULT_MAX_CACHE_SIZE );
+}
+
+QString KCacheConfigDialog::quickHelp() const
+{
+ return i18n( "<h1>Cache</h1><p>This module lets you configure your cache settings.</p>"
+ "<p>The cache is an internal memory in Konqueror where recently "
+ "read web pages are stored. If you want to retrieve a web "
+ "page again that you have recently read, it will not be "
+ "downloaded from the Internet, but rather retrieved from the "
+ "cache, which is a lot faster.</p>" );
+}
+
+void KCacheConfigDialog::configChanged()
+{
+ emit changed( true );
+}
+
+void KCacheConfigDialog::slotClearCache()
+{
+ KProcess process;
+ process << "kio_http_cache_cleaner" << "--clear-all";
+ process.start(KProcess::DontCare);
+ // Cleaning up might take a while. Better detach.
+ process.detach();
+}
+
+#include "cache.moc"
diff --git a/kcontrol/kio/cache.desktop b/kcontrol/kio/cache.desktop
new file mode 100644
index 000000000..c56f36a09
--- /dev/null
+++ b/kcontrol/kio/cache.desktop
@@ -0,0 +1,220 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/cache/index.html
+Icon=cache
+Exec=kcmshell cache
+
+
+X-KDE-Library=kio
+X-KDE-FactoryName=cache
+X-KDE-ParentApp=kcontrol
+
+Name=Cache
+Name[af]=Kas
+Name[ar]=الخابية
+Name[az]=Ön Yaddaş
+Name[be]=Кэш
+Name[bg]=Временна памет
+Name[bn]=ক্যাশে (Cache)
+Name[br]=Krubuilh
+Name[ca]=Cau
+Name[de]=Zwischenspeicher
+Name[el]=Λανθάνουσα μνήμη
+Name[eo]=Tenejo
+Name[es]=Caché
+Name[et]=Puhver
+Name[eu]=Katxea
+Name[fa]=نهانگاه
+Name[fi]=Välimuisti
+Name[fy]=Lyts ûnthâld
+Name[ga]=Taisce
+Name[gl]=Caché
+Name[he]=מטמון
+Name[hi]=कैश
+Name[hr]=Pohrana
+Name[hu]=Gyorstár
+Name[is]=Skyndiminni
+Name[ja]=キャッシュ
+Name[ka]=ქეში
+Name[kk]=Бүркеме
+Name[km]=ឃ្លាំង​សម្ងាត់
+Name[ko]=캐시
+Name[lo]=ແຄຊ
+Name[lt]=Krepšys
+Name[lv]=Kešatmiņa
+Name[mk]=Кеш
+Name[mn]=Завсрын хадгалагч
+Name[nb]=Mellomlager
+Name[nds]=Twischenspieker
+Name[ne]=क्यास
+Name[nn]=Mellomlager
+Name[nso]=Polokelo
+Name[pa]=ਕੈਂਚੇ
+Name[pl]=Bufor
+Name[ru]=Кэш
+Name[rw]=Ubwihisho
+Name[se]=Gaskarájus
+Name[sk]=Vyrovnávacia pamäť
+Name[sl]=Prepomnilnik
+Name[sr]=Кеш
+Name[sr@Latn]=Keš
+Name[ta]=தற்காலிக
+Name[te]=కెష్
+Name[tg]=Кэш
+Name[th]=แคช
+Name[tr]=Önbellek
+Name[tt]=Alxäter
+Name[uk]=Кеш
+Name[uz]=Kesh
+Name[uz@cyrillic]=Кэш
+Name[vi]=Bộ đệm
+Name[wa]=Muchete
+Name[xh]=Indawo yokugcina efihlakeleyo
+Name[zh_CN]=缓存
+Name[zh_TW]=快取
+Comment=Configure web cache settings
+Comment[af]=Konfigureer web kas instellings
+Comment[ar]=إعداد الخابية للشبكة
+Comment[az]=Veb ün yaddaş qurğuları
+Comment[be]=Настаўленні сеціўнага кэша
+Comment[bg]=Настройване на временната памет
+Comment[bn]=ওয়েব ক্যাশে সেটিংস কনফিগার করুন
+Comment[br]=Kefluniañ krubuilh ar gwiad
+Comment[bs]=Podesite postavke web cache-a
+Comment[ca]=Configura les opcions per al cau web
+Comment[cs]=Nastavení cache pro webové stránky
+Comment[csb]=Kònfigùracëjô nastôwù cache
+Comment[cy]=Ffurfweddu gosodiadau'r storfa w?
+Comment[da]=Indstil cache-opsætning
+Comment[de]=Einstellungen zum Zwischenspeicher vornehmen
+Comment[el]=Ρυθμίστε τη λανθάνουσα μνήμη ιστοσελίδων
+Comment[eo]=Agordo de tenejo
+Comment[es]=Preferencias del caché de web
+Comment[et]=Veebi vahemälu seadistamine
+Comment[eu]=Konfiguratu web katxearen ezarpenak
+Comment[fa]=پیکربندی تنظیمات نهانگاه وب
+Comment[fi]=WWW-välimuistin asetuksia
+Comment[fr]=Configuration des réglages du cache web
+Comment[fy]=Hjir kinne jo it lyts ûnthâld fan it web ynstelle
+Comment[gl]=Configurar as opcións da caché web
+Comment[he]=שינוי הגדרות המטמון
+Comment[hi]=वेब कैश विन्यास कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje postavki web-pohrane
+Comment[hu]=A webböngészési gyorstár beállításai
+Comment[is]=Stilla skyndiminni fyrir vefflakk
+Comment[it]=Configura le impostazioni della cache del web
+Comment[ja]=ウェブキャッシュの設定
+Comment[ka]=ვებ კეშის პარამეტრების კონფიგურაცია
+Comment[kk]=Веб бүркеме параметрлерін баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ការ​កំណត់​ឃ្លាំង​សម្ងាត់​បណ្ដាញ
+Comment[ko]=웹 캐시 설정
+Comment[lo]=ປັບແຕ່ງການຕັ້ງຄ່າລະບົບແຄຊທີ່ນີ້
+Comment[lt]=Konfigūruokite žiniatinklio krepšio nustatymus
+Comment[lv]=Šeit jūs varat konfigurēt tīmekļa kešatmiņas uzstādījumus
+Comment[mk]=Конфигурирајте ги поставувањата за веб-кешот
+Comment[mn]=Завсрын хадгалагч тохируулах
+Comment[ms]=Konfigur seting cache web
+Comment[mt]=Ikkonfigura l-cache tal-web
+Comment[nb]=Tilpass vev-mellomlageret
+Comment[nds]=Den Nett-Twischenspieker instellen
+Comment[ne]=वेब क्यास सेटिङ कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u de webcache instellen
+Comment[nn]=Oppsett av vevmellomlager
+Comment[nso]=Beakanya dipeakanyo tsa polokelo ya web
+Comment[pa]=ਵੈੱਬ ਕੈਂਚੇ ਸੈਟਿੰਗ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja ustawień bufora (cache'a)
+Comment[pt]=Configuração das opções da 'cache' da Web
+Comment[pt_BR]=Configura as preferências de cache
+Comment[ro]=Configurează setările cache-ului web
+Comment[ru]=Настройка кэша
+Comment[rw]=Kuboneza amagenamiterere y'ubwihisho bw'urubuga
+Comment[se]=Heivet fierpmádatgaskarádjusa
+Comment[sk]=Nastavenie vyrovnávacej pamäte pre WWW
+Comment[sl]=Nastavitve spletnega predpomnilnika
+Comment[sr]=Подешавање поставки веб кеша
+Comment[sr@Latn]=Podešavanje postavki veb keša
+Comment[sv]=Anpassa webbcacheinställningar
+Comment[ta]=வலை தற்காலிக அமைப்புகளை வடிவமை
+Comment[tg]=Танзимоти қароргоҳи пинҳонии интернет
+Comment[th]=ปรับแต่งการตั้งค่าระบบแคช
+Comment[tr]=Web önbellek ayarlarını buradan yapabilirsiniz
+Comment[tt]=Alxäter caylawı
+Comment[uk]=Налаштування установок кешу Тенет
+Comment[uz]=Veb-kesh moslamalarini moslash
+Comment[uz@cyrillic]=Веб-кэш мосламаларини мослаш
+Comment[ven]=Dzudzanyani mavhekanyele a cache a webu
+Comment[vi]=Cấu hình các thiết lập bộ đệm cho duyệt mạng
+Comment[wa]=Fijhoz l' apontiaedje del muchete des pådjes waibe chal
+Comment[xh]=Qwalasela izicwangciso ze web yendawo yokugcina efihlakeleyo
+Comment[zh_CN]=配置网页缓存设置
+Comment[zh_TW]=設定網頁快取設定
+Comment[zu]=Hlanganisela izilungiselelo ze-cache ye-web
+Keywords=Cache,History,Browsing History,Ports,Size
+Keywords[ar]=الخابية,الخط الزمني,خط زمن التصفح,المنافذ,القياس الحجم,الذاكرة المخبئية,التأريخ,تأريخ المتصفح,المنافذ,الحجم
+Keywords[az]=Kaşe,Keçmiş,Səyahət Keçmişi,Qapılar,Böyüklük
+Keywords[be]=Кэш,Гісторыя,Гісторыя вандровак,Вандраванне,Парты,Памер,Cache,History,Browsing History,Ports,Size
+Keywords[bg]=кеш, памет, временни, копия, страница, Cache, History, Browsing History, Ports, Size
+Keywords[br]=Krubuilh,istor,furchal an istor,porzhioù,ment
+Keywords[ca]=Cau,Historial,Historial de navegació,Ports,Mida
+Keywords[cs]=Cache,Historie,Porty,Velikost
+Keywords[csb]=cache,historëjô,historëjô przezéraniô,pòrtë,miara
+Keywords[cy]=Storfa,Hanes,Hanes Pori,Pyrth,Maint
+Keywords[da]=Cache,Historik,Netsøgningshistorik,Porte,Størrelse
+Keywords[de]=Cache,Verlauf,History,Ports,Zwischenspeicher, Größe
+Keywords[el]=Λανθάνουσα μνήμη,Ιστορικό,Ιστορικό περιήγησης,Θύρες,Μέγεθος
+Keywords[eo]=Tenejo,Historio,TTT-umado,Pordoj,Grandeco
+Keywords[es]=Caché,Historia,Historia de navegación,Puertos,Tamaño
+Keywords[et]=cache,puhver,lehitsemise puhver,pordid,suurus
+Keywords[eu]=Katxea,Historia,Arakaketa historia,Atakak,Neurria
+Keywords[fa]=نهانگاه، تاریخچه، تاریخچۀ مرور، درگاهها، اندازه
+Keywords[fi]=Välimuisti,Historia,Selailuhistoria,Portit,Koko
+Keywords[fr]=Cache,historique,navigation de l'historique,ports,taille
+Keywords[fy]=cache,lyts ûnthâld,history,Histoarje,grutte,Ynternet
+Keywords[ga]=Taisce,Stair,Stair Brabhsála,Poirt,Méid
+Keywords[gl]=Caché,Historial,Historial de Navegación,Portos,Tamaño
+Keywords[he]=מטמון,היסטוריה,היסטוריית גלישה,יציאות,גודל,Cache,History,Browsing History,Ports,Size
+Keywords[hi]=कैश,इतिहास,ब्राउज़िंग इतिहास,पोर्ट,आकार
+Keywords[hr]=Cache,Pohrana,History,Povijest,Browsing History,Ports,Portovi,Size,Veličina,Povijest pretraživanja
+Keywords[hu]=gyorstár,napló,böngészési napló,portok,méret
+Keywords[is]=Skyndiminni,Saga,Vafrasaga,Gáttir,Stærð
+Keywords[it]=cache,cronologia,navigazione,cronologia di navigazione,porte,dimensione
+Keywords[ja]=キャッシュ,履歴,ブラウズの履歴,ポート,サイズ
+Keywords[ka]=ქეში,ისტორია,მიმოხილვის ისტორია,პორტები,ზომა
+Keywords[km]=ឃ្លាំង​សម្ងាត់,ប្រវត្តិ,ប្រវត្តិ​ការ​រុករក,ច្រក,ទំហំ
+Keywords[lo]=ແຄຊ,ປະຫວັດການໃຊ້,ປະຫວັດການທ່ອງເວບประวัต,ພັອດ,ຂະຫນາດ
+Keywords[lt]=Cache,History,Browsing History,Ports,Size, kešas,krepšys,žurnalas,istorija,naršymo žurnalas,naršymo istorija,portai,dydis
+Keywords[mk]=Cache,History,Browsing History,Ports,Size,Кеш,Историја,Прелистување на историјата,Портови,Големина
+Keywords[mn]=Cache,Түүх,History,Порт,Завсрын хадгалагч,Хэмжээ
+Keywords[nb]=Mellomlager,Historie,Lesehistorie,Porter,Størrelse
+Keywords[nds]=Twischenspieker,Vörgeschicht,Browsing History,Porten,Grött
+Keywords[ne]=क्यास, इतिहास, ब्राउज इतिहास, पोर्ट, साइज
+Keywords[nl]=cache,historie,geschiedenis,grootte,internet
+Keywords[nn]=cache,mellomlager,historie,nettlesarhistorie,portar,storleik
+Keywords[nso]=Polokelo,Histori,Hostori ya Boinyakisi,Maboemo,Bogolo
+Keywords[pa]=ਅਕਾਰ,ਅਤੀਤ,ਝਲਕਾਰਾ,ਕੈਂਚੇ,ਪੋਰਟ
+Keywords[pl]=cache,bufor,historia,historia przeglądania,porty,rozmiar
+Keywords[pt]=Cache,Histórico,Histórico de Navegação,Portos,Tamanho
+Keywords[pt_BR]=Cache,Histórico,Histórico de Navegação,Portas,Tamanho
+Keywords[ro]=cache,istoric,navigare în istoric,porturi,mărime
+Keywords[rw]=Ubwihisho,Amateka,Amateka yo Gucukumbura,Imiyoboro,Ingano
+Keywords[se]=gaskarájus,historihkka,fierpmádatloganhistorihkka,verráhat,sturrodat
+Keywords[sk]=Cache,Keš,vyrovnávacia pamäť,prehliadanie,história,porty,veľkosť
+Keywords[sl]=predpomnilnik,zgodovina,zgodovina brskanja,vrata,velikost
+Keywords[sr]=Кеш, Историјат, Прегледање историјата, Портови, Величина
+Keywords[sr@Latn]=Keš, Istorijat, Pregledanje istorijata, Portovi, Veličina
+Keywords[sv]=Cache,Historik,Webbläsningshistorik,Portar,Storlek
+Keywords[ta]=தற்காலிக,வரலாறு,உலாவுதலின் வரலாறு,முனையங்கள்,அளவு
+Keywords[th]=แคช,ประวัติการใช้,ประวัติการท่องเว็บ,พอร์ต,ขนาด
+Keywords[tr]=Arabellek,Tarihçe,Gözatma Tarihçesi,Portlar
+Keywords[uk]=кеш,історія, історія навігації,порти,розмір
+Keywords[uz]=Kesh,Veb-sahifalar tarihi,Tarix,Portlar
+Keywords[uz@cyrillic]=Кэш,Веб-саҳифалар тариҳи,Тарих,Портлар
+Keywords[ven]=Cache,Divhazwakale,Divahzwakale ya Burausini,Ports,Saizi
+Keywords[vi]=Đệm,Lịch sử,Lịch sử duyệt,Cổng,Cỡ
+Keywords[wa]=Muchete,Istwere,Istwere do foytaedje,Pôrts,Grandeu
+Keywords[xh]=Indawo yokugcina, Imbali, imbali Yokhangelo zincwadi, Amazibuko, Ubungakanani
+Keywords[zh_CN]=Cache,History,Browsing History,Ports,Size,缓存,历史
+Keywords[zh_TW]=Cache,History,Browsing History,Ports,Size,快取
+Keywords[zu]=Cache,Umlando,Umlando wokucinga,Izikhumulo,Usayizi
+
+Categories=Qt;KDE;X-KDE-settings-webbrowsing;
diff --git a/kcontrol/kio/cache.h b/kcontrol/kio/cache.h
new file mode 100644
index 000000000..d2d12e5e2
--- /dev/null
+++ b/kcontrol/kio/cache.h
@@ -0,0 +1,50 @@
+/*
+ cache.h - Proxy configuration dialog
+
+ Copyright (C) 2001,02,03 Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License (GPL) version 2 as published by the Free Software
+ Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef CACHE_H
+#define CACHE_H
+
+#include <kcmodule.h>
+
+class CacheDlgUI;
+
+class KCacheConfigDialog : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KCacheConfigDialog( QWidget* parent = 0 );
+ ~KCacheConfigDialog() {};
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+ QString quickHelp() const;
+
+protected slots:
+ void configChanged();
+ void slotClearCache();
+
+private:
+ CacheDlgUI* m_dlg;
+};
+
+#endif // CACHE_H
diff --git a/kcontrol/kio/cache_ui.ui b/kcontrol/kio/cache_ui.ui
new file mode 100644
index 000000000..c0e504057
--- /dev/null
+++ b/kcontrol/kio/cache_ui.ui
@@ -0,0 +1,187 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>CacheDlgUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>CacheDlgUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>424</width>
+ <height>172</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>1</number>
+ </property>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="2" column="1">
+ <property name="name">
+ <cstring>lbMaxCacheSize</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Disk cache &amp;size:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>sbMaxCacheSize</cstring>
+ </property>
+ </widget>
+ <widget class="KIntNumInput" row="2" column="2">
+ <property name="name">
+ <cstring>sbMaxCacheSize</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="maxValue">
+ <number>999999</number>
+ </property>
+ <property name="suffix">
+ <string> KB</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="3">
+ <property name="name">
+ <cstring>pbClearCache</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>C&amp;lear Cache</string>
+ </property>
+ </widget>
+ <spacer row="2" column="4">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="5">
+ <property name="name">
+ <cstring>cbUseCache</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use cache</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this box if you want the web pages you visit to be stored on your hard disk for quicker access. The stored pages will only be updated as needed instead of on every visit to that site. This is especially useful if you have a slow connection to the Internet.</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="0" rowspan="1" colspan="5">
+ <property name="name">
+ <cstring>bgCachePolicy</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>Policy</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbVerifyCache</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Keep cache in sync</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Verify whether the cached web page is valid before attempting to fetch the web page again.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbCacheIfPossible</cstring>
+ </property>
+ <property name="text">
+ <string>Use cache whenever &amp;possible</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Always use documents from the cache when available. You can still use the reload button to synchronize the cache with the remote host.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbOfflineMode</cstring>
+ </property>
+ <property name="text">
+ <string>O&amp;ffline browsing mode</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Do not fetch web pages that are not already stored in the cache. Offline mode prevents you from viewing pages that you have not previously visited.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>cbUseCache</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>bgCachePolicy</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbUseCache</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lbMaxCacheSize</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbUseCache</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>sbMaxCacheSize</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbUseCache</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>pbClearCache</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kcontrol/kio/cookies.desktop b/kcontrol/kio/cookies.desktop
new file mode 100644
index 000000000..206dd3a92
--- /dev/null
+++ b/kcontrol/kio/cookies.desktop
@@ -0,0 +1,215 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/cookies/index.html
+Icon=cookie
+Exec=kcmshell cookies
+
+
+X-KDE-Library=kio
+X-KDE-FactoryName=cookie
+X-KDE-ParentApp=kcontrol
+
+Name=Cookies
+Name[af]=Koekies
+Name[ar]=الكعكات
+Name[az]=Kökələr (Cookies)
+Name[bg]=Бисквитки
+Name[bn]=কুকি
+Name[br]=Toupinoù
+Name[bs]=Kolačići
+Name[ca]=Galetes
+Name[csb]=Kùszczi
+Name[cy]=Cwcis
+Name[da]=Cookier
+Name[eo]=Kuketoj
+Name[et]=Küpsised
+Name[eu]=Cookie-ak
+Name[fa]=کوکیها
+Name[fi]=Evästeet
+Name[fy]=Koekjes
+Name[ga]=Fianáin
+Name[he]=עוגיות
+Name[hi]=कुकीज़
+Name[hr]=Kolačići
+Name[hu]=Cookie-k
+Name[is]=Smákökur
+Name[it]=Cookie
+Name[ja]=クッキー
+Name[ka]=ქუქები
+Name[km]=ខូគី
+Name[ko]=쿠키
+Name[lo]=ຄຸກກີ້
+Name[lt]=Slapukai
+Name[lv]=Cepumi
+Name[mk]=Колачиња
+Name[nb]=Informasjonskapsler
+Name[nds]=Kookjes
+Name[ne]=कुकी
+Name[nn]=Informasjonskapslar
+Name[nso]=Di-Cookie
+Name[pa]=ਕੂਕੀਜ਼
+Name[pl]=Ciasteczka
+Name[ro]=Cookie-uri
+Name[rw]=Inyandikonyakwirema
+Name[se]=Diehtočoahkku
+Name[sl]=Piškotki
+Name[sr]=Колачићи
+Name[sr@Latn]=Kolačići
+Name[sv]=Kakor
+Name[ta]=தற்காலிக நினைவுகள்
+Name[te]=కుకిస్
+Name[th]=คุกกี้
+Name[tr]=Çerezler
+Name[tt]=Cookie
+Name[uk]=Куки
+Name[uz]=Kukilar
+Name[uz@cyrillic]=Кукилар
+Name[wa]=Coukes
+
+Comment=Configure the way cookies work
+Comment[af]=Konfigureer die weg koekies werk
+Comment[ar]=إعداد أسلوب العمل للكعكات
+Comment[az]=Kökələrin işləmə yollarını quraşdır
+Comment[be]=Наставіць cookies
+Comment[bg]=Настройване на бисквитките
+Comment[bn]=কুকি কনফিগার করুন
+Comment[br]=Kefluniañ peseurt mod e labour an toupinoù
+Comment[bs]=Podesite način rada cookie-ja
+Comment[ca]=Configura com treballaran les galetes
+Comment[cs]=Nastavení chování cookies
+Comment[csb]=Kònfigùracëjô dzéjaniô kùszków (cookies)
+Comment[cy]=Ffurfweddu'r ffordd y mae cwcis yn gweithio
+Comment[da]=Indstil den måde cookier virker
+Comment[de]=Einstellungen zu Cookies vornehmen
+Comment[el]=Ρυθμίστε τον τρόπο με τον οποίο δουλεύουν τα cookies
+Comment[eo]=Agordo de kuketoj
+Comment[es]=Configuración del funcionamiento de las cookies
+Comment[et]=Küpsiste käitumise seadistamine
+Comment[eu]=Konfiguratu cookien portaera
+Comment[fa]=پیکربندی روش کار کردن کوکیها
+Comment[fi]=Evästeiden toiminta
+Comment[fr]=Configuration de la manière dont les cookies fonctionnent
+Comment[fy]=Hjir kinne jo de wurkwize fan koekjes ynstelle
+Comment[gl]=Configurar o funcionamento das cookies
+Comment[he]=שינוי הגדרות פעולת העוגיות
+Comment[hi]=कुकीज़ के कार्य करने के ढंग कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje funkcioniranja kolačića
+Comment[hu]=A cookie-k beállításai
+Comment[is]=Stilla hvernig tekið er við smákökum
+Comment[it]=Configurazione del funzionamento dei cookie
+Comment[ja]=クッキーの扱いを設定
+Comment[kk]=Cookies жұмысын баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​របៀប​ដែល​ខូគី​ដំណើរការ
+Comment[ko]=쿠키 작동 방법을 설정합니다
+Comment[lo]=ປັບແຕ່ງການຕັ້ງຄ່າລະບົບແຄຊທີ່ນີ້
+Comment[lt]=Čia galite keisti slapukų veikimą
+Comment[lv]=Šeit jūs varat konfigurēt cepumus
+Comment[mk]=Конфигурирајте го начинот на кој работат колачињата
+Comment[mn]=Cookies ажлыг тохируулах
+Comment[ms]=Konfigur cara cookies berfungsi
+Comment[mt]=Ikkonfigura kif jaħdmu l-"cookies"
+Comment[nb]=Oppsett av informasjonskapsler
+Comment[nds]=Instellen, woans de Kookjes funkscheneert
+Comment[ne]=कुकीको कार्य तरिका कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u het cookiesbeleid instellen
+Comment[nn]=Oppsett av informasjonskapslar
+Comment[nso]=Beakanya kamokgwa wo di-cookies di berekago kagona
+Comment[pa]=ਕੂਕੀਜ਼ ਕੰਮ ਦੇ ਢੰਗ ਦੀ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja działania ciasteczek (cookies)
+Comment[pt]=Configuração da forma como os 'cookies' funcionam
+Comment[pt_BR]=Configura a maneira como os cookies funcionarão
+Comment[ro]=Configurează modul în care acționează cookie-urile
+Comment[ru]=Настройка cookies
+Comment[rw]=Kuboneza uburyo inyandikonyakwirema zikora
+Comment[se]=Diehtočoahkkoheivehusat
+Comment[sk]=Nastavenie podpory cookies
+Comment[sl]=Nastavitve delovanja piškotkov
+Comment[sr]=Подешавање начина на који раде колачићи
+Comment[sr@Latn]=Podešavanje načina na koji rade kolačići
+Comment[sv]=Anpassa hur kakor fungerar
+Comment[ta]=தற்காலிக நினைவகங்கள் வேலையை வடிவமை
+Comment[tg]=Мизроб кардани cookies
+Comment[th]=ปรับแต่งวิธีการทำงานของคุกกี้
+Comment[tr]=Çerezlerin çalışmasını yapılandırır
+Comment[tt]=Cookies caylawı
+Comment[uk]=Налаштування механізму кук
+Comment[uz]=Kukilar ishlashini moslash
+Comment[uz@cyrillic]=Кукилар ишлашини мослаш
+Comment[ven]=Dzudzanyani ndila ine cookies dza shuma ngayo
+Comment[vi]=Cấu hình cách cookies hoạt động
+Comment[wa]=Apontyî l' dujhance des coukes
+Comment[xh]=Qwalasela indlela ezisebenza ngayo i cookies
+Comment[zh_CN]=配置 cookies 相关设置
+Comment[zh_TW]=設定 cookies 運作方式
+Comment[zu]=Hlanganisela indlela i-cookies esebenza ngayo
+
+Keywords=Cookies,Browsing,Internet,WWW,Network,Policy,Domains
+Keywords[ar]=الكعكات,التصفح,الإنترنت,الشبكة العالمية,الشبكة,السياسة,أسماء النطاقات
+Keywords[az]=Kökələr,Darama,İnternet,WWW,Şəbəkə,Sahə
+Keywords[be]="Печыва",Вандроўка,Вандраванне,Інтэрнэт,Сетка,Правілы,Домены,Cookies,Browsing,Internet,WWW,Network,Policy,Domains
+Keywords[bg]=бисквитка, бисквитки, Интернет, сърфиране, сесия, сигурност, Cookies, Browsing, Internet, WWW, Network, Policy, Domains
+Keywords[ca]=Galetes,fullejar,Internet,WWW,Xarxa,Política,Dominis
+Keywords[cs]=Cookie,Prohlížení,Internet,WWW,Síť,Domény
+Keywords[csb]=kùszczi,przezéranié,Internet,WWW,séc,reglë,domenë
+Keywords[cy]=Cwcis,Pori,Rhyngrwyd,WWW,Rhwydwaith,Polisi,Parthau
+Keywords[da]=Cookier,Netsøgning,Internet,www,Netværk,Politik,Domæner
+Keywords[de]=Cookies,Durchsuchen,Browsen,Surfen,Internet,WWW,Netzwerk,Regelungen,Domains
+Keywords[el]=Cookies,Περιήγηση,Διαδίκτυο,WWW,Δίκτυο,Πολιτική,Τομείς
+Keywords[eo]=kuketoj,TTT,Interreto,WWW,reto,konduto,retregionoj
+Keywords[es]=Cookies,Navegación,Internet,WWW,Red,Política,Dominios
+Keywords[et]=küpsised,lehitsemine,Internet,WWW,võrk,reeglid,domeenid
+Keywords[eu]=Cookie-ak,Arakaketa,Internet,WWW,Sarea,Arautegia,Domeinuak
+Keywords[fa]=کوکیها، مرور، اینترنت، WWW، شبکه، سیاست، دامنه‌ها
+Keywords[fi]=Evästeet,Selailu,Internet,WWW,Verkko,Politiikka,Verkkoalueet
+Keywords[fr]=Cookies,navigation,internet,WWW,Web,réseau,règle,politique,domaine
+Keywords[fy]=Koekjes,blêdzjen,ynternet,www,netwurk,wurkwize,domeinen
+Keywords[ga]=Fianán,Brabhsáil,Idirlíon,WWW,Líonra,Polasaí,Fearainn
+Keywords[gl]=Cookies,Navegación,Internet,WWW,Rede,Política,Dominios
+Keywords[he]=עוגיות,גלישה,אינטרנט,WWW,רשת,מדיניות,תחומים, Cookies,Browsing,Internet,Network,Policy,Domains
+Keywords[hi]=कुकीज़,ब्राउजिंग,इंटरनेट,डब्ल्यूडब्ल्यूडब्ल्यू,नेटवर्क,पालिसी,डोमेन्स
+Keywords[hr]=Cookies,Browsing,Internet,WWW,Network,Policy,Domains,Kolačići,Domene,Mreža,Pravila,Pregledavanje,Pretraživanje
+Keywords[hu]=cookie-k,böngészés,internet,WWW,hálózat,házirend,tartományok
+Keywords[id]=Cookies,Browsing,Internet,WWW,Jaringan,Policy,Domains
+Keywords[is]=Smákökur,Flakk,Flakkari,Vafr,Vafri,Vefurinn,Netið,lén
+Keywords[it]=cookie,navigazione,Internet,WWW,rete,politica,domini
+Keywords[ja]=クッキー,ブラウス,インターネット,WWW,ネットワーク,ポリシー,ドメイン
+Keywords[ka]=ქუქები,მიმოხილვა,ინტერნეტი,WWW,ქსელი,პოლისი,დომენები
+Keywords[km]=ខូគី,រុករក,អ៊ិនធឺណិត,វើលវ៉ាយវិប,បណ្ដាញ,ភាព​ឯកជន,ដែន
+Keywords[lo]=ຄຸກກີ້,ການຮງກເບິ່ງເວບເພດ,ອິນເຕີເນັດ,WWW,ລະບົບເຄືອຂ່າຍ, ຂໍ້ກຳນົດ,ໂດເມນ
+Keywords[lt]=Slapukai,Naršymas,Internetas,WWW,Tinklas,Taisyklės,Sritys
+Keywords[lv]=Cepumi,Pārlūkošana,Internets,WWW,Tīkls,Politika,Domēni
+Keywords[mk]=Cookies,Browsing,Internet,WWW,Network,Policy,Domains,Колачиња,Прелистување,Интернет,Мрежа,Политика,Домени
+Keywords[mn]=Cookies,Нэгжих,Browsing,Тэнэх,Интернэт,WWW,Сүлжээ,Дүрмүүд,Домайн
+Keywords[nb]=cookies,informasjonskapsler,surfing,internett,WWW,verdensveven,nettverk,praksis,domene
+Keywords[nds]=Kookjes,Nettkieken,Internet,WWW,Nettwark,Regel,Domänen
+Keywords[ne]=कुकी,ब्राउजिङ, इन्टरनेट, WWW, सञ्जाल, नीति, डोमेन
+Keywords[nl]=cookies,browsing,internet,www,netwerk,beleid,domeinen
+Keywords[nn]=cookies,informasjonskapslar,surfing,internett,WWW,verdsveven,nettverk,praksis,domene
+Keywords[nso]=Di-Cookies,Boinyakisi,Internet,WWW,Kgokagano,Molao,Ditikologo
+Keywords[pa]=Cookies,Browsing,Internet,WWW,Network,ਨੀਤੀ, ਡੋਮੇਨ,ਇੰਟਰਨੈਟ
+Keywords[pl]=ciasteczka,przeglądanie,Internet,WWW,sieć,zasady,domeny
+Keywords[pt]=cookies,navegação,internet,WWW,rede,política,domínios
+Keywords[pt_BR]=Cookies,Navegação,Internet,WWW,Rede,Política,Domínios
+Keywords[ro]=cookies,navigare,Internet,WWW,rețea,politici,domenii
+Keywords[rw]=Inyandikonyakwirema,Gucukumbura,Interineti,WWW,Urusobemiyoboro,Politiki,Indangarubuga
+Keywords[se]=diehtočoahkku,bláđđen,fierpmádat,WWW,fierbmi,geavat,domeana
+Keywords[sk]=Cookies,Prehliadanie, Internet, WWW, Sieť,Politika,Domény
+Keywords[sl]=piškotki,brskanje,internet,splet,WWW,omrežje,politika,domene
+Keywords[sr]=Cookies,Browsing,Интернет,WWW,Network,Policy,Domains,колачићи,Прегледање,мрежа,полиса,домени
+Keywords[sr@Latn]=Cookies,Browsing,Internet,WWW,Network,Policy,Domains,kolačići,Pregledanje,mreža,polisa,domeni
+Keywords[sv]=Kakor,Surfning,Internet,WWW,Nätverk,Policy,Domäner
+Keywords[ta]=தற்காலிக நினைவகம்,உலாவுதல்,இணையம்t,WWW,வலைப்பின்னல்,கொள்கை,வலைதளங்கள்
+Keywords[th]=คุกกี้,การเรียกดูเว็บเพจ,อินเทอร์เน็ต,WWW,ระบบเครือข่าย,ข้อกำหนด,โดเมน
+Keywords[tr]=Çerezler,Tarama,İnternet,WWW,Ağ,Alan
+Keywords[uk]=куки,навігація,Internet,Інтернет,WWW,мережа,правила,домени,Тенета
+Keywords[uz]=Kukilar,Internet,WWW,Tarmoq,Qoida,Domenlar
+Keywords[uz@cyrillic]=Кукилар,Интернет,WWW,Тармоқ,Қоида,Доменлар
+Keywords[ven]=Cookies,Burousini.Inithenete,WWW<Vhukwamani,Pholisi,Domaini
+Keywords[vi]=Cookies,Duyệt,Internet,WWW,Mạng,Chính sách,Tên miền
+Keywords[wa]=Coukes,foyter,betchter,Internet,daegntoele,WWW,rantoele,Policy,dominne,naiviaedje
+Keywords[xh]=Cookies,Khangela iincwadi,Internet,WWW,Umsebenzi womnatha,Inkqubo,Ezongameleyo
+Keywords[zh_CN]=Cookies,Browsing,Internet,WWW,Network,Policy,Domains,浏览,互联网,万维网,网络,策略,域
+Keywords[zh_TW]=Cookies,Browsing,Internet,WWW,Network,Policy,Domain,瀏覽,網際網路,網路,策略,域名
+Keywords[zu]=Cookies,Cinga,Internet,WWW,Uxhumano olusakazekile,Umthetho, Izindawo
+
+Categories=Qt;KDE;X-KDE-settings-webbrowsing;
diff --git a/kcontrol/kio/envvarproxy_ui.ui b/kcontrol/kio/envvarproxy_ui.ui
new file mode 100644
index 000000000..471b9f868
--- /dev/null
+++ b/kcontrol/kio/envvarproxy_ui.ui
@@ -0,0 +1,175 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>EnvVarProxyDlgUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>EnvVarProxyDlgUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>438</width>
+ <height>133</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="KLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>leFtp</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the name of the environment variable, e.g. &lt;b&gt;FTP_PROXY&lt;/b&gt;, used to store the address of the FTP proxy server.&lt;p&gt;
+Alternatively, you can click on the &lt;b&gt;"Auto Detect"&lt;/b&gt; button to attempt an automatic discovery of this variable.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>leHttp</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the name of the environment variable, e.g. &lt;b&gt;HTTP_PROXY&lt;/b&gt;, used to store the address of the HTTP proxy server.&lt;p&gt;
+Alternatively, you can click on the &lt;b&gt;"Auto Detect"&lt;/b&gt; button to attempt automatic discovery of this variable.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>lbFtp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;FTP:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leFtp</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the name of the environment variable, e.g. &lt;b&gt;FTP_PROXY&lt;/b&gt;, used to store the address of the FTP proxy server.&lt;p&gt;
+Alternatively, you can click on the &lt;b&gt;"Auto Detect"&lt;/b&gt; button to attempt an automatic discovery of this variable.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>lbHttps</cstring>
+ </property>
+ <property name="text">
+ <string>HTTP&amp;S:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leHttps</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the name of the environment variable, e.g. &lt;b&gt;HTTPS_PROXY&lt;/b&gt;, used to store the address of the HTTPS proxy server.&lt;p&gt;
+Alternatively, you can click on the &lt;b&gt;"Auto Detect"&lt;/b&gt; button to attempt an automatic discovery of this variable.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="1">
+ <property name="name">
+ <cstring>cbShowValue</cstring>
+ </property>
+ <property name="text">
+ <string>Show the &amp;value of the environment variables</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="2">
+ <property name="name">
+ <cstring>pbVerify</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Verify</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;Verify whether or not the environment variable names you supplied are valid. If an environment variable is not found, the associated labels will be &lt;b&gt;highlighted&lt;/b&gt; to indicate that they are invalid.&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>pbDetect</cstring>
+ </property>
+ <property name="text">
+ <string>Auto &amp;Detect</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;Attempt automatic discovery of the environment variables used for setting system wide proxy information.&lt;p&gt; This feature works by searching for commonly used variable names such as HTTP_PROXY, FTP_PROXY and NO_PROXY.&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>lbHttp</cstring>
+ </property>
+ <property name="text">
+ <string>H&amp;TTP:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leHttp</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the name of the environment variable, e.g. &lt;b&gt;HTTP_PROXY&lt;/b&gt;, used to store the address of the HTTP proxy server.&lt;p&gt;
+Alternatively, you can click on the &lt;b&gt;"Auto Detect"&lt;/b&gt; button to attempt automatic discovery of this variable.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>leHttps</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the name of the environment variable, e.g. &lt;b&gt;HTTPS_PROXY&lt;/b&gt;, used to store the address of the HTTPS proxy server.&lt;p&gt;
+Alternatively, you can click on the &lt;b&gt;"Auto Detect"&lt;/b&gt; button to attempt an automatic discovery of this variable.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>leNoProxy</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the environment variable, e.g. &lt;b&gt;NO_PROXY&lt;/b&gt;, used to store the addresses of sites for which the proxy server should not be used.&lt;p&gt;
+Alternatively, you can click on the &lt;b&gt;"Auto Detect"&lt;/b&gt; button to attempt an automatic discovery of this variable.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>lbNoProxy</cstring>
+ </property>
+ <property name="text">
+ <string>NO &amp;PROXY:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leNoProxy</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the environment variable, e.g. &lt;b&gt;NO_PROXY&lt;/b&gt;, used to store the addresses of sites for which the proxy server should not be used.&lt;p&gt;
+Alternatively, you can click on the &lt;b&gt;"Auto Detect"&lt;/b&gt; button to attempt an automatic discovery of this variable.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<tabstops>
+ <tabstop>leHttp</tabstop>
+ <tabstop>leHttps</tabstop>
+ <tabstop>leFtp</tabstop>
+ <tabstop>leNoProxy</tabstop>
+ <tabstop>pbVerify</tabstop>
+ <tabstop>pbDetect</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kcontrol/kio/fakeuaprovider.cpp b/kcontrol/kio/fakeuaprovider.cpp
new file mode 100644
index 000000000..08949c27b
--- /dev/null
+++ b/kcontrol/kio/fakeuaprovider.cpp
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2001 Dawit Alemayehu <adawit@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <time.h>
+#include <sys/utsname.h>
+
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+#include "fakeuaprovider.h"
+
+#define UA_PTOS(x) (*it)->property(x).toString()
+#define QFL(x) QString::fromLatin1(x)
+
+FakeUASProvider::FakeUASProvider()
+{
+ m_bIsDirty = true;
+}
+
+FakeUASProvider::StatusCode FakeUASProvider::createNewUAProvider( const QString& uaStr )
+{
+ QStringList split;
+ int pos = (uaStr).find("::");
+
+ if ( pos == -1 )
+ {
+ pos = (uaStr).find(':');
+ if ( pos != -1 )
+ {
+ split.append(uaStr.left(pos));
+ split.append(uaStr.mid(pos+1));
+ }
+ }
+ else
+ {
+ split = QStringList::split("::", uaStr);
+ }
+
+ if ( m_lstIdentity.contains(split[1]) )
+ return DUPLICATE_ENTRY;
+ else
+ {
+ int count = split.count();
+ m_lstIdentity.append( split[1] );
+ if ( count > 2 )
+ m_lstAlias.append(split[2]);
+ else
+ m_lstAlias.append( split[1]);
+ }
+
+ return SUCCEEDED;
+}
+
+void FakeUASProvider::loadFromDesktopFiles()
+{
+ m_providers.clear();
+ m_providers = KTrader::self()->query("UserAgentStrings");
+}
+
+void FakeUASProvider::parseDescription()
+{
+ QString tmp;
+
+ KTrader::OfferList::ConstIterator it = m_providers.begin();
+ KTrader::OfferList::ConstIterator lastItem = m_providers.end();
+
+ for ( ; it != lastItem; ++it )
+ {
+ tmp = UA_PTOS("X-KDE-UA-FULL");
+
+ if ( (*it)->property("X-KDE-UA-DYNAMIC-ENTRY").toBool() )
+ {
+ struct utsname utsn;
+ uname( &utsn );
+
+ tmp.replace( QFL("appSysName"), QString(utsn.sysname) );
+ tmp.replace( QFL("appSysRelease"), QString(utsn.release) );
+ tmp.replace( QFL("appMachineType"), QString(utsn.machine) );
+
+ QStringList languageList = KGlobal::locale()->languageList();
+ if ( languageList.count() )
+ {
+ QStringList::Iterator it = languageList.find( QString::fromLatin1("C") );
+ if( it != languageList.end() )
+ {
+ if( languageList.contains( QString::fromLatin1("en") ) > 0 )
+ languageList.remove( it );
+ else
+ (*it) = QString::fromLatin1("en");
+ }
+ }
+
+ tmp.replace( QFL("appLanguage"), QString("%1").arg(languageList.join(", ")) );
+ tmp.replace( QFL("appPlatform"), QFL("X11") );
+ }
+
+ // Ignore dups...
+ if ( m_lstIdentity.contains(tmp) )
+ continue;
+
+ m_lstIdentity << tmp;
+
+ tmp = QString("%1 %2").arg(UA_PTOS("X-KDE-UA-SYSNAME")).arg(UA_PTOS("X-KDE-UA-SYSRELEASE"));
+ if ( tmp.stripWhiteSpace().isEmpty() )
+ tmp = QString("%1 %2").arg(UA_PTOS("X-KDE-UA-"
+ "NAME")).arg(UA_PTOS("X-KDE-UA-VERSION"));
+ else
+ tmp = QString("%1 %2 on %3").arg(UA_PTOS("X-KDE-UA-"
+ "NAME")).arg(UA_PTOS("X-KDE-UA-VERSION")).arg(tmp);
+
+ m_lstAlias << tmp;
+ }
+
+ m_bIsDirty = false;
+}
+
+QString FakeUASProvider::aliasStr( const QString& name )
+{
+ int id = userAgentStringList().findIndex(name);
+ if ( id == -1 )
+ return QString::null;
+ else
+ return m_lstAlias[id];
+}
+
+QString FakeUASProvider::agentStr( const QString& name )
+{
+ int id = userAgentAliasList().findIndex(name);
+ if ( id == -1 )
+ return QString::null;
+ else
+ return m_lstIdentity[id];
+}
+
+
+QStringList FakeUASProvider::userAgentStringList()
+{
+ if ( m_bIsDirty )
+ {
+ loadFromDesktopFiles();
+ if ( !m_providers.count() )
+ return QStringList();
+ parseDescription();
+ }
+ return m_lstIdentity;
+}
+
+QStringList FakeUASProvider::userAgentAliasList ()
+{
+ if ( m_bIsDirty )
+ {
+ loadFromDesktopFiles();
+ if ( !m_providers.count() )
+ return QStringList();
+ parseDescription();
+ }
+ return m_lstAlias;
+}
+
diff --git a/kcontrol/kio/fakeuaprovider.h b/kcontrol/kio/fakeuaprovider.h
new file mode 100644
index 000000000..fedf155bf
--- /dev/null
+++ b/kcontrol/kio/fakeuaprovider.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2001 Dawit Alemayehu <adawit@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __FAKE_UAS_PROVIDER_H___
+#define __FAKE_UAS_PROVIDER_H___
+
+#include <ktrader.h>
+
+class QString;
+class QStringList;
+
+class FakeUASProvider
+{
+public:
+ enum StatusCode {
+ SUCCEEDED=0,
+ ALREADY_EXISTS,
+ DUPLICATE_ENTRY
+ };
+
+ FakeUASProvider();
+ ~FakeUASProvider(){};
+
+ StatusCode createNewUAProvider( const QString& );
+ QString aliasStr( const QString& );
+ QString agentStr( const QString& );
+ QStringList userAgentStringList();
+ QStringList userAgentAliasList();
+ bool isListDirty() const { return m_bIsDirty; }
+ void setListDirty( bool dirty ) { m_bIsDirty = dirty; }
+
+protected:
+ void loadFromDesktopFiles();
+ void parseDescription();
+
+private:
+ KTrader::OfferList m_providers;
+ QStringList m_lstIdentity;
+ QStringList m_lstAlias;
+ bool m_bIsDirty;
+};
+#endif
diff --git a/kcontrol/kio/kcookiesmain.cpp b/kcontrol/kio/kcookiesmain.cpp
new file mode 100644
index 000000000..f25a28011
--- /dev/null
+++ b/kcontrol/kio/kcookiesmain.cpp
@@ -0,0 +1,99 @@
+// kcookiesmain.cpp - Cookies configuration
+//
+// First version of cookies configuration by Waldo Bastian <bastian@kde.org>
+// This dialog box created by David Faure <faure@kde.org>
+
+#include <qlayout.h>
+#include <qtabwidget.h>
+
+#include <klocale.h>
+#include <kapplication.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <dcopref.h>
+
+#include "kcookiesmain.h"
+#include "kcookiespolicies.h"
+#include "kcookiesmanagement.h"
+
+KCookiesMain::KCookiesMain(QWidget *parent)
+ : KCModule(parent, "kcmkio")
+{
+ management = 0;
+ bool managerOK = true;
+
+ DCOPReply reply = DCOPRef( "kded", "kded" ).call( "loadModule",
+ QCString( "kcookiejar" ) );
+
+ if( !reply.isValid() )
+ {
+ managerOK = false;
+ kdDebug(7103) << "kcm_kio: KDED could not load KCookiejar!" << endl;
+ KMessageBox::sorry(0, i18n("Unable to start the cookie handler service.\n"
+ "You will not be able to manage the cookies that "
+ "are stored on your computer."));
+ }
+
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ tab = new QTabWidget(this);
+ layout->addWidget(tab);
+
+ policies = new KCookiesPolicies(this);
+ tab->addTab(policies, i18n("&Policy"));
+ connect(policies, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+
+ if( managerOK )
+ {
+ management = new KCookiesManagement(this);
+ tab->addTab(management, i18n("&Management"));
+ connect(management, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+ }
+}
+
+KCookiesMain::~KCookiesMain()
+{
+}
+
+void KCookiesMain::load()
+{
+ policies->load();
+ if( management )
+ management->load();
+}
+
+void KCookiesMain::save()
+{
+ policies->save();
+ if ( management )
+ management->save();
+}
+
+void KCookiesMain::defaults()
+{
+ KCModule* module = static_cast<KCModule*>(tab->currentPage());
+
+ if ( module == policies )
+ policies->defaults();
+ else if( management )
+ management->defaults();
+}
+
+QString KCookiesMain::quickHelp() const
+{
+ return i18n("<h1>Cookies</h1> Cookies contain information that Konqueror"
+ " (or other KDE applications using the HTTP protocol) stores on your"
+ " computer, initiated by a remote Internet server. This means that"
+ " a web server can store information about you and your browsing activities"
+ " on your machine for later use. You might consider this an invasion of"
+ " privacy. <p> However, cookies are useful in certain situations. For example, they"
+ " are often used by Internet shops, so you can 'put things into a shopping basket'."
+ " Some sites require you have a browser that supports cookies. <p>"
+ " Because most people want a compromise between privacy and the benefits cookies offer,"
+ " KDE offers you the ability to customize the way it handles cookies. So you might want"
+ " to set KDE's default policy to ask you whenever a server wants to set a cookie,"
+ " allowing you to decide. For your favorite shopping web sites that you trust, you might"
+ " want to set the policy to accept, then you can access the web sites without being prompted"
+ " every time KDE receives a cookie." );
+}
+
+#include "kcookiesmain.moc"
diff --git a/kcontrol/kio/kcookiesmain.h b/kcontrol/kio/kcookiesmain.h
new file mode 100644
index 000000000..fef111100
--- /dev/null
+++ b/kcontrol/kio/kcookiesmain.h
@@ -0,0 +1,37 @@
+// kcookiesmain.h - Cookies configuration
+//
+// First version of cookies configuration by Waldo Bastian <bastian@kde.org>
+// This dialog box created by David Faure <faure@kde.org>
+
+#ifndef __KCOOKIESMAIN_H
+#define __KCOOKIESMAIN_H
+
+#include <kcmodule.h>
+
+class QTabWidget;
+class DCOPClient;
+class KCookiesPolicies;
+class KCookiesManagement;
+
+class KCookiesMain : public KCModule
+{
+ Q_OBJECT
+public:
+ KCookiesMain(QWidget *parent = 0L);
+ ~KCookiesMain();
+
+ KCookiesPolicies* policyDlg() { return policies; }
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+ virtual QString quickHelp() const;
+
+private:
+
+ QTabWidget* tab;
+ KCookiesPolicies* policies;
+ KCookiesManagement* management;
+};
+
+#endif // __KCOOKIESMAIN_H
diff --git a/kcontrol/kio/kcookiesmanagement.cpp b/kcontrol/kio/kcookiesmanagement.cpp
new file mode 100644
index 000000000..58e983439
--- /dev/null
+++ b/kcontrol/kio/kcookiesmanagement.cpp
@@ -0,0 +1,489 @@
+/**
+ * kcookiesmanagement.cpp - Cookies manager
+ *
+ * Copyright 2000-2001 Marco Pinelli <pinmc@orion.it>
+ * Copyright (c) 2000-2001 Dawit Alemayehu <adawit@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <qapplication.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qtimer.h>
+#include <qdatetime.h>
+#include <qtoolbutton.h>
+
+#include <kidna.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kdialog.h>
+#include <kiconloader.h>
+#include <klineedit.h>
+#include <klistview.h>
+#include <klistviewsearchline.h>
+#include <kmessagebox.h>
+#include <dcopref.h>
+
+#include "kcookiesmain.h"
+#include "kcookiespolicies.h"
+#include "kcookiesmanagement.h"
+#include "kcookiesmanagementdlg_ui.h"
+
+#include <assert.h>
+
+struct CookieProp
+{
+ QString host;
+ QString name;
+ QString value;
+ QString domain;
+ QString path;
+ QString expireDate;
+ QString secure;
+ bool allLoaded;
+};
+
+CookieListViewItem::CookieListViewItem(QListView *parent, QString dom)
+ :QListViewItem(parent)
+{
+ init( 0, dom );
+}
+
+CookieListViewItem::CookieListViewItem(QListViewItem *parent, CookieProp *cookie)
+ :QListViewItem(parent)
+{
+ init( cookie );
+}
+
+CookieListViewItem::~CookieListViewItem()
+{
+ delete mCookie;
+}
+
+void CookieListViewItem::init( CookieProp* cookie, QString domain,
+ bool cookieLoaded )
+{
+ mCookie = cookie;
+ mDomain = domain;
+ mCookiesLoaded = cookieLoaded;
+}
+
+CookieProp* CookieListViewItem::leaveCookie()
+{
+ CookieProp *ret = mCookie;
+ mCookie = 0;
+ return ret;
+}
+
+QString CookieListViewItem::text(int f) const
+{
+ if (mCookie)
+ return f == 0 ? QString::null : KIDNA::toUnicode(mCookie->host);
+ else
+ return f == 0 ? KIDNA::toUnicode(mDomain) : QString::null;
+}
+
+KCookiesManagement::KCookiesManagement(QWidget *parent)
+ : KCModule(parent, "kcmkio")
+{
+ // Toplevel layout
+ QVBoxLayout* mainLayout = new QVBoxLayout(this, KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ dlg = new KCookiesManagementDlgUI (this);
+
+ dlg->tbClearSearchLine->setIconSet(SmallIconSet(QApplication::reverseLayout() ? "clear_left" : "locationbar_erase"));
+ dlg->kListViewSearchLine->setListView(dlg->lvCookies);
+
+ mainLayout->addWidget(dlg);
+ dlg->lvCookies->setSorting(0);
+
+ connect(dlg->lvCookies, SIGNAL(expanded(QListViewItem*)), SLOT(getCookies(QListViewItem*)) );
+ connect(dlg->lvCookies, SIGNAL(selectionChanged(QListViewItem*)), SLOT(showCookieDetails(QListViewItem*)) );
+
+ connect(dlg->pbDelete, SIGNAL(clicked()), SLOT(deleteCookie()));
+ connect(dlg->pbDeleteAll, SIGNAL(clicked()), SLOT(deleteAllCookies()));
+ connect(dlg->pbReload, SIGNAL(clicked()), SLOT(getDomains()));
+ connect(dlg->pbPolicy, SIGNAL(clicked()), SLOT(doPolicy()));
+
+ connect(dlg->lvCookies, SIGNAL(doubleClicked (QListViewItem *)), SLOT(doPolicy()));
+ deletedCookies.setAutoDelete(true);
+ m_bDeleteAll = false;
+ mainWidget = parent;
+
+ load();
+}
+
+KCookiesManagement::~KCookiesManagement()
+{
+}
+
+void KCookiesManagement::load()
+{
+ reset();
+ getDomains();
+}
+
+void KCookiesManagement::save()
+{
+ // If delete all cookies was requested!
+ if(m_bDeleteAll)
+ {
+ if(!DCOPRef("kded", "kcookiejar").send("deleteAllCookies"))
+ {
+ QString caption = i18n ("DCOP Communication Error");
+ QString message = i18n ("Unable to delete all the cookies as requested.");
+ KMessageBox::sorry (this, message,caption);
+ return;
+ }
+ m_bDeleteAll = false; // deleted[Cookies|Domains] have been cleared yet
+ }
+
+ // Certain groups of cookies were deleted...
+ QStringList::Iterator dIt = deletedDomains.begin();
+ while( dIt != deletedDomains.end() )
+ {
+ QByteArray call;
+ QByteArray reply;
+ QCString replyType;
+ QDataStream callStream(call, IO_WriteOnly);
+ callStream << *dIt;
+
+ if( !DCOPRef("kded", "kcookiejar").send("deleteCookiesFromDomain", (*dIt)) )
+ {
+ QString caption = i18n ("DCOP Communication Error");
+ QString message = i18n ("Unable to delete cookies as requested.");
+ KMessageBox::sorry (this, message,caption);
+ return;
+ }
+
+ dIt = deletedDomains.remove(dIt);
+ }
+
+ // Individual cookies were deleted...
+ bool success = true; // Maybe we can go on...
+ QDictIterator<CookiePropList> cookiesDom(deletedCookies);
+
+ while(cookiesDom.current())
+ {
+ CookiePropList *list = cookiesDom.current();
+ QPtrListIterator<CookieProp> cookie(*list);
+
+ while(*cookie)
+ {
+ if( !DCOPRef("kded", "kcookiejar").send("deleteCookie",(*cookie)->domain,
+ (*cookie)->host, (*cookie)->path,
+ (*cookie)->name) )
+ {
+ success = false;
+ break;
+ }
+
+ list->removeRef(*cookie);
+ }
+
+ if(!success)
+ break;
+
+ deletedCookies.remove(cookiesDom.currentKey());
+ }
+
+ emit changed( false );
+}
+
+void KCookiesManagement::defaults()
+{
+ reset();
+ getDomains();
+ emit changed (false);
+}
+
+void KCookiesManagement::reset()
+{
+ m_bDeleteAll = false;
+ clearCookieDetails();
+ dlg->lvCookies->clear();
+ deletedDomains.clear();
+ deletedCookies.clear();
+ dlg->pbDelete->setEnabled(false);
+ dlg->pbDeleteAll->setEnabled(false);
+ dlg->pbPolicy->setEnabled(false);
+}
+
+void KCookiesManagement::clearCookieDetails()
+{
+ dlg->leName->clear();
+ dlg->leValue->clear();
+ dlg->leDomain->clear();
+ dlg->lePath->clear();
+ dlg->leExpires->clear();
+ dlg->leSecure->clear();
+}
+
+QString KCookiesManagement::quickHelp() const
+{
+ return i18n("<h1>Cookies Management Quick Help</h1>" );
+}
+
+void KCookiesManagement::getDomains()
+{
+ DCOPReply reply = DCOPRef("kded", "kcookiejar").call("findDomains");
+
+ if( !reply.isValid() )
+ {
+ QString caption = i18n ("Information Lookup Failure");
+ QString message = i18n ("Unable to retrieve information about the "
+ "cookies stored on your computer.");
+ KMessageBox::sorry (this, message, caption);
+ return;
+ }
+
+ QStringList domains = reply;
+
+ if ( dlg->lvCookies->childCount() )
+ {
+ reset();
+ dlg->lvCookies->setCurrentItem( 0L );
+ }
+
+ CookieListViewItem *dom;
+ for(QStringList::Iterator dIt = domains.begin(); dIt != domains.end(); dIt++)
+ {
+ dom = new CookieListViewItem(dlg->lvCookies, *dIt);
+ dom->setExpandable(true);
+ }
+
+ // are ther any cookies?
+ dlg->pbDeleteAll->setEnabled(dlg->lvCookies->childCount());
+}
+
+void KCookiesManagement::getCookies(QListViewItem *cookieDom)
+{
+ CookieListViewItem* ckd = static_cast<CookieListViewItem*>(cookieDom);
+ if ( ckd->cookiesLoaded() )
+ return;
+
+ QValueList<int> fields;
+ fields << 0 << 1 << 2 << 3;
+
+ DCOPReply reply = DCOPRef ("kded", "kcookiejar").call ("findCookies",
+ DCOPArg(fields, "QValueList<int>"),
+ ckd->domain(),
+ QString::null,
+ QString::null,
+ QString::null);
+ if(reply.isValid())
+ {
+ QStringList fieldVal = reply;
+ QStringList::Iterator fIt = fieldVal.begin();
+
+ while(fIt != fieldVal.end())
+ {
+ CookieProp *details = new CookieProp;
+ details->domain = *fIt++;
+ details->path = *fIt++;
+ details->name = *fIt++;
+ details->host = *fIt++;
+ details->allLoaded = false;
+ new CookieListViewItem(cookieDom, details);
+ }
+
+ static_cast<CookieListViewItem*>(cookieDom)->setCookiesLoaded();
+ }
+}
+
+bool KCookiesManagement::cookieDetails(CookieProp *cookie)
+{
+ QValueList<int> fields;
+ fields << 4 << 5 << 7;
+
+ DCOPReply reply = DCOPRef ("kded", "kcookiejar").call ("findCookies",
+ DCOPArg(fields, "QValueList<int>"),
+ cookie->domain,
+ cookie->host,
+ cookie->path,
+ cookie->name);
+ if( !reply.isValid() )
+ return false;
+
+ QStringList fieldVal = reply;
+
+ QStringList::Iterator c = fieldVal.begin();
+ cookie->value = *c++;
+ unsigned tmp = (*c++).toUInt();
+
+ if( tmp == 0 )
+ cookie->expireDate = i18n("End of session");
+ else
+ {
+ QDateTime expDate;
+ expDate.setTime_t(tmp);
+ cookie->expireDate = KGlobal::locale()->formatDateTime(expDate);
+ }
+
+ tmp = (*c).toUInt();
+ cookie->secure = i18n(tmp ? "Yes" : "No");
+ cookie->allLoaded = true;
+ return true;
+}
+
+void KCookiesManagement::showCookieDetails(QListViewItem* item)
+{
+ kdDebug () << "::showCookieDetails... " << endl;
+ CookieProp *cookie = static_cast<CookieListViewItem*>(item)->cookie();
+ if( cookie )
+ {
+ if( cookie->allLoaded || cookieDetails(cookie) )
+ {
+ dlg->leName->validateAndSet(cookie->name,0,0,0);
+ dlg->leValue->validateAndSet(cookie->value,0,0,0);
+ dlg->leDomain->validateAndSet(cookie->domain,0,0,0);
+ dlg->lePath->validateAndSet(cookie->path,0,0,0);
+ dlg->leExpires->validateAndSet(cookie->expireDate,0,0,0);
+ dlg->leSecure->validateAndSet(cookie->secure,0,0,0);
+ }
+
+ dlg->pbPolicy->setEnabled (true);
+ }
+ else
+ {
+ clearCookieDetails();
+ dlg->pbPolicy->setEnabled(false);
+ }
+
+ dlg->pbDelete->setEnabled(true);
+}
+
+void KCookiesManagement::doPolicy()
+{
+ // Get current item
+ CookieListViewItem *item = static_cast<CookieListViewItem*>( dlg->lvCookies->currentItem() );
+
+ if( item && item->cookie())
+ {
+ CookieProp *cookie = item->cookie();
+
+ QString domain = cookie->domain;
+
+ if( domain.isEmpty() )
+ {
+ CookieListViewItem *parent = static_cast<CookieListViewItem*>( item->parent() );
+
+ if ( parent )
+ domain = parent->domain ();
+ }
+
+ KCookiesMain* mainDlg =static_cast<KCookiesMain*>( mainWidget );
+ // must be present or something is really wrong.
+ assert (mainDlg);
+
+ KCookiesPolicies* policyDlg = mainDlg->policyDlg();
+ // must be present unless someone rewrote the widget in which case
+ // this needs to be re-written as well.
+ assert (policyDlg);
+ policyDlg->addNewPolicy(domain);
+ }
+}
+
+
+void KCookiesManagement::deleteCookie(QListViewItem* deleteItem)
+{
+ CookieListViewItem *item = static_cast<CookieListViewItem*>( deleteItem );
+ if( item->cookie() )
+ {
+ CookieListViewItem *parent = static_cast<CookieListViewItem*>(item->parent());
+ CookiePropList *list = deletedCookies.find(parent->domain());
+ if(!list)
+ {
+ list = new CookiePropList;
+ list->setAutoDelete(true);
+ deletedCookies.insert(parent->domain(), list);
+ }
+
+ list->append(item->leaveCookie());
+ delete item;
+
+ if(parent->childCount() == 0)
+ delete parent;
+ }
+ else
+ {
+ deletedDomains.append(item->domain());
+ delete item;
+ }
+}
+
+void KCookiesManagement::deleteCookie()
+{
+ deleteCookie(dlg->lvCookies->currentItem());
+
+ QListViewItem* currentItem = dlg->lvCookies->currentItem();
+
+ if ( currentItem )
+ {
+ dlg->lvCookies->setSelected( currentItem, true );
+ showCookieDetails( currentItem );
+ }
+ else
+ clearCookieDetails();
+
+ dlg->pbDeleteAll->setEnabled(dlg->lvCookies->childCount());
+
+ const bool hasSelectedItem = dlg->lvCookies->selectedItem();
+ dlg->pbDelete->setEnabled(hasSelectedItem);
+ dlg->pbPolicy->setEnabled(hasSelectedItem);
+
+ emit changed( true );
+}
+
+void KCookiesManagement::deleteAllCookies()
+{
+ if ( dlg->kListViewSearchLine->text().isEmpty())
+ {
+ reset();
+ m_bDeleteAll = true;
+ }
+ else
+ {
+ QListViewItem* item = dlg->lvCookies->firstChild();
+
+ while (item)
+ {
+ if (item->isVisible())
+ {
+ deleteCookie(item);
+ item = dlg->lvCookies->currentItem();
+ }
+ else
+ item = item->nextSibling();
+ }
+
+ const int count = dlg->lvCookies->childCount();
+ m_bDeleteAll = (count == 0);
+ dlg->pbDeleteAll->setEnabled(count);
+
+ const bool hasSelectedItem = dlg->lvCookies->selectedItem();
+ dlg->pbDelete->setEnabled(hasSelectedItem);
+ dlg->pbPolicy->setEnabled(hasSelectedItem);
+ }
+
+ emit changed( true );
+}
+
+#include "kcookiesmanagement.moc"
diff --git a/kcontrol/kio/kcookiesmanagement.h b/kcontrol/kio/kcookiesmanagement.h
new file mode 100644
index 000000000..636be0ed3
--- /dev/null
+++ b/kcontrol/kio/kcookiesmanagement.h
@@ -0,0 +1,101 @@
+/**
+ * kcookiesmanagement.h - Cookies manager
+ *
+ * Copyright 2000-2001 Marco Pinelli <pinmc@orion.it>
+ *
+ * Contributors:
+ * Copyright (c) 2000-2001 Dawit Alemayehu <adawit@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __KCOOKIESMANAGEMENT_H
+#define __KCOOKIESMANAGEMENT_H
+
+#include <qdict.h>
+#include <qstringlist.h>
+#include <qlistview.h>
+
+#include <kcmodule.h>
+
+
+class DCOPClient;
+class KCookiesManagementDlgUI;
+
+struct CookieProp;
+
+class CookieListViewItem : public QListViewItem
+{
+public:
+ CookieListViewItem(QListView *parent, QString dom);
+ CookieListViewItem(QListViewItem *parent, CookieProp *cookie);
+ ~CookieListViewItem();
+
+ QString domain() const { return mDomain; }
+ CookieProp* cookie() const { return mCookie; }
+ CookieProp* leaveCookie();
+ void setCookiesLoaded() { mCookiesLoaded = true; }
+ bool cookiesLoaded() const { return mCookiesLoaded; }
+ virtual QString text(int f) const;
+
+private:
+ void init( CookieProp* cookie,
+ QString domain = QString::null,
+ bool cookieLoaded=false );
+ CookieProp *mCookie;
+ QString mDomain;
+ bool mCookiesLoaded;
+};
+
+class KCookiesManagement : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KCookiesManagement(QWidget *parent = 0 );
+ ~KCookiesManagement();
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+ virtual QString quickHelp() const;
+
+private slots:
+ void deleteCookie();
+ void deleteAllCookies();
+ void getDomains();
+ void getCookies(QListViewItem*);
+ void showCookieDetails(QListViewItem*);
+ void doPolicy();
+
+private:
+ void reset ();
+ void deleteCookie(QListViewItem*);
+ bool cookieDetails(CookieProp *cookie);
+ void clearCookieDetails();
+ bool policyenabled();
+
+private:
+ bool m_bDeleteAll;
+
+ QWidget* mainWidget;
+ KCookiesManagementDlgUI* dlg;
+
+ QStringList deletedDomains;
+ typedef QPtrList<CookieProp> CookiePropList;
+ QDict<CookiePropList> deletedCookies;
+};
+
+#endif // __KCOOKIESMANAGEMENT_H
diff --git a/kcontrol/kio/kcookiesmanagementdlg_ui.ui b/kcontrol/kio/kcookiesmanagementdlg_ui.ui
new file mode 100644
index 000000000..f36c0a707
--- /dev/null
+++ b/kcontrol/kio/kcookiesmanagementdlg_ui.ui
@@ -0,0 +1,323 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KCookiesManagementDlgUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KCookiesManagementDlgUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>294</width>
+ <height>432</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KListView" row="1" column="0">
+ <column>
+ <property name="text">
+ <string>Domain [Group]</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Host [Set By]</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>lvCookies</cstring>
+ </property>
+ <property name="selectionMode" stdset="0">
+ <enum>Single</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="treeStepSize">
+ <number>15</number>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbDelete</cstring>
+ </property>
+ <property name="text">
+ <string>D&amp;elete</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbDeleteAll</cstring>
+ </property>
+ <property name="text">
+ <string>Delete A&amp;ll</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbPolicy</cstring>
+ </property>
+ <property name="text">
+ <string>Change &amp;Policy...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbReload</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Reload List</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>62</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>tbClearSearchLine</cstring>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="textLabel">
+ <string>Clear Search</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Search:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kListViewSearchLine</cstring>
+ </property>
+ </widget>
+ <widget class="KListViewSearchLine">
+ <property name="name">
+ <cstring>kListViewSearchLine</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Search interactively for domains and hosts</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>gbDetails</cstring>
+ </property>
+ <property name="title">
+ <string>Details</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>leDomain</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>lePath</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="5" column="1">
+ <property name="name">
+ <cstring>leSecure</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>lbName</cstring>
+ </property>
+ <property name="text">
+ <string>Name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leName</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>lbValue</cstring>
+ </property>
+ <property name="text">
+ <string>Value:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leValue</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>lbDomain</cstring>
+ </property>
+ <property name="text">
+ <string>Domain:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leDomain</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>lbPath</cstring>
+ </property>
+ <property name="text">
+ <string>Path:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>lePath</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>lbExpires</cstring>
+ </property>
+ <property name="text">
+ <string>Expires:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leExpires</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>lbSecure</cstring>
+ </property>
+ <property name="text">
+ <string>Secure:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leSecure</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>leValue</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>leExpires</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>leName</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>tbClearSearchLine</sender>
+ <signal>clicked()</signal>
+ <receiver>kListViewSearchLine</receiver>
+ <slot>clear()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>klistviewsearchline.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/kio/kcookiespolicies.cpp b/kcontrol/kio/kcookiespolicies.cpp
new file mode 100644
index 000000000..7ee302ec1
--- /dev/null
+++ b/kcontrol/kio/kcookiespolicies.cpp
@@ -0,0 +1,474 @@
+/**
+ * kcookiespolicies.cpp - Cookies configuration
+ *
+ * Original Authors
+ * Copyright (c) Waldo Bastian <bastian@kde.org>
+ * Copyright (c) 1999 David Faure <faure@kde.org>
+ *
+ * Re-written by:
+ * Copyright (c) 2000- Dawit Alemayehu <adawit@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#include <qheader.h>
+#include <qvbox.h>
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qwhatsthis.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qtoolbutton.h>
+#include <qvbuttongroup.h>
+
+#include <kiconloader.h>
+#include <kidna.h>
+#include <kmessagebox.h>
+#include <klistview.h>
+#include <klistviewsearchline.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <dcopref.h>
+
+#include "ksaveioconfig.h"
+
+#include "kcookiespolicies.h"
+#include "kcookiespoliciesdlg_ui.h"
+
+KCookiesPolicies::KCookiesPolicies(QWidget *parent)
+ :KCModule(parent, "kcmkio")
+{
+ QVBoxLayout *mainLayout = new QVBoxLayout(this, 0, 0);
+
+ dlg = new KCookiesPolicyDlgUI (this);
+ dlg->lvDomainPolicy->header()->setStretchEnabled(true, 0);
+ dlg->lvDomainPolicy->setColumnWidthMode(0, KListView::Manual);
+ dlg->lvDomainPolicy->setColumnWidthMode(1, KListView::Maximum);
+ dlg->tbClearSearchLine->setIconSet(SmallIconSet(QApplication::reverseLayout() ? "clear_left" : "locationbar_erase"));
+ dlg->kListViewSearchLine->setListView(dlg->lvDomainPolicy);
+ QValueList<int> columns;
+ columns.append(0);
+ dlg->kListViewSearchLine->setSearchColumns(columns);
+
+ mainLayout->addWidget(dlg);
+
+ load();
+}
+
+KCookiesPolicies::~KCookiesPolicies()
+{
+}
+
+void KCookiesPolicies::configChanged ()
+{
+ //kdDebug() << "KCookiesPolicies::configChanged..." << endl;
+ emit changed((d_configChanged=true));
+}
+
+void KCookiesPolicies::cookiesEnabled( bool enable )
+{
+ dlg->bgDefault->setEnabled( enable );
+ dlg->bgPreferences->setEnabled ( enable );
+ dlg->gbDomainSpecific->setEnabled( enable );
+
+ if (enable)
+ {
+ ignoreCookieExpirationDate ( enable );
+ autoAcceptSessionCookies ( enable );
+ }
+}
+
+void KCookiesPolicies::ignoreCookieExpirationDate ( bool enable )
+{
+ bool isAutoAcceptChecked = dlg->cbAutoAcceptSessionCookies->isChecked();
+ enable = (enable && isAutoAcceptChecked);
+
+ dlg->bgDefault->setEnabled( !enable );
+ dlg->gbDomainSpecific->setEnabled( !enable );
+}
+
+void KCookiesPolicies::autoAcceptSessionCookies ( bool enable )
+{
+ bool isIgnoreExpirationChecked = dlg->cbIgnoreCookieExpirationDate->isChecked();
+ enable = (enable && isIgnoreExpirationChecked);
+
+ dlg->bgDefault->setEnabled( !enable );
+ dlg->gbDomainSpecific->setEnabled( !enable );
+}
+
+void KCookiesPolicies::addNewPolicy(const QString& domain)
+{
+ PolicyDlg pdlg (i18n("New Cookie Policy"), this);
+ pdlg.setEnableHostEdit (true, domain);
+
+ if (dlg->rbPolicyAccept->isChecked())
+ pdlg.setPolicy(KCookieAdvice::Reject);
+ else
+ pdlg.setPolicy(KCookieAdvice::Accept);
+
+ if (pdlg.exec() && !pdlg.domain().isEmpty())
+ {
+ QString domain = KIDNA::toUnicode(pdlg.domain());
+ int advice = pdlg.advice();
+
+ if ( !handleDuplicate(domain, advice) )
+ {
+ const char* strAdvice = KCookieAdvice::adviceToStr(advice);
+ QListViewItem* index = new QListViewItem (dlg->lvDomainPolicy,
+ domain, i18n(strAdvice));
+ m_pDomainPolicy.insert (index, strAdvice);
+ configChanged();
+ }
+ }
+}
+
+
+void KCookiesPolicies::addPressed()
+{
+ addNewPolicy (QString::null);
+}
+
+void KCookiesPolicies::changePressed()
+{
+ QListViewItem* index = dlg->lvDomainPolicy->currentItem();
+
+ if (!index)
+ return;
+
+ QString oldDomain = index->text(0);
+
+ PolicyDlg pdlg (i18n("Change Cookie Policy"), this);
+ pdlg.setPolicy (KCookieAdvice::strToAdvice(m_pDomainPolicy[index]));
+ pdlg.setEnableHostEdit (true, oldDomain);
+
+ if( pdlg.exec() && !pdlg.domain().isEmpty())
+ {
+ QString newDomain = KIDNA::toUnicode(pdlg.domain());
+ int advice = pdlg.advice();
+ if (newDomain == oldDomain || !handleDuplicate(newDomain, advice))
+ {
+ m_pDomainPolicy[index] = KCookieAdvice::adviceToStr(advice);
+ index->setText(0, newDomain);
+ index->setText(1, i18n(m_pDomainPolicy[index]) );
+ configChanged();
+ }
+ }
+}
+
+bool KCookiesPolicies::handleDuplicate( const QString& domain, int advice )
+{
+ QListViewItem* item = dlg->lvDomainPolicy->firstChild();
+ while ( item != 0 )
+ {
+ if ( item->text(0) == domain )
+ {
+ QString msg = i18n("<qt>A policy already exists for"
+ "<center><b>%1</b></center>"
+ "Do you want to replace it?</qt>").arg(domain);
+ int res = KMessageBox::warningContinueCancel(this, msg,
+ i18n("Duplicate Policy"),
+ i18n("Replace"));
+ if ( res == KMessageBox::Continue )
+ {
+ m_pDomainPolicy[item]= KCookieAdvice::adviceToStr(advice);
+ item->setText(0, domain);
+ item->setText(1, i18n(m_pDomainPolicy[item]));
+ configChanged();
+ return true;
+ }
+ else
+ return true; // User Cancelled!!
+ }
+ item = item->nextSibling();
+ }
+ return false;
+}
+
+void KCookiesPolicies::deletePressed()
+{
+ QListViewItem* nextItem = 0L;
+ QListViewItem* item = dlg->lvDomainPolicy->firstChild ();
+
+ while (item != 0L)
+ {
+ if (dlg->lvDomainPolicy->isSelected (item))
+ {
+ nextItem = item->itemBelow();
+ if ( !nextItem )
+ nextItem = item->itemAbove();
+
+ delete item;
+ item = nextItem;
+ }
+ else
+ {
+ item = item->itemBelow();
+ }
+ }
+
+ if (nextItem)
+ dlg->lvDomainPolicy->setSelected (nextItem, true);
+
+ updateButtons();
+ configChanged();
+}
+
+void KCookiesPolicies::deleteAllPressed()
+{
+ m_pDomainPolicy.clear();
+ dlg->lvDomainPolicy->clear();
+ updateButtons();
+ configChanged();
+}
+
+void KCookiesPolicies::updateButtons()
+{
+ bool hasItems = dlg->lvDomainPolicy->childCount() > 0;
+
+ dlg->pbChange->setEnabled ((hasItems && d_itemsSelected == 1));
+ dlg->pbDelete->setEnabled ((hasItems && d_itemsSelected > 0));
+ dlg->pbDeleteAll->setEnabled ( hasItems );
+}
+
+void KCookiesPolicies::updateDomainList(const QStringList &domainConfig)
+{
+ dlg->lvDomainPolicy->clear();
+
+ QStringList::ConstIterator it = domainConfig.begin();
+ for (; it != domainConfig.end(); ++it)
+ {
+ QString domain;
+ KCookieAdvice::Value advice = KCookieAdvice::Dunno;
+
+ splitDomainAdvice(*it, domain, advice);
+
+ if (!domain.isEmpty())
+ {
+ QListViewItem* index = new QListViewItem( dlg->lvDomainPolicy, KIDNA::toUnicode(domain),
+ i18n(KCookieAdvice::adviceToStr(advice)) );
+ m_pDomainPolicy[index] = KCookieAdvice::adviceToStr(advice);
+ }
+ }
+}
+
+void KCookiesPolicies::selectionChanged ()
+{
+ QListViewItem* item = dlg->lvDomainPolicy->firstChild ();
+
+ d_itemsSelected = 0;
+
+ while (item != 0L)
+ {
+ if (dlg->lvDomainPolicy->isSelected (item))
+ d_itemsSelected++;
+ item = item->nextSibling ();
+ }
+
+ updateButtons ();
+}
+
+void KCookiesPolicies::load()
+{
+ d_itemsSelected = 0;
+ d_configChanged = false;
+
+ KConfig cfg ("kcookiejarrc", true);
+ cfg.setGroup ("Cookie Policy");
+
+ bool enableCookies = cfg.readBoolEntry("Cookies", true);
+ dlg->cbEnableCookies->setChecked (enableCookies);
+ cookiesEnabled( enableCookies );
+
+ KCookieAdvice::Value advice = KCookieAdvice::strToAdvice (cfg.readEntry(
+ "CookieGlobalAdvice", "Ask"));
+ switch (advice)
+ {
+ case KCookieAdvice::Accept:
+ dlg->rbPolicyAccept->setChecked (true);
+ break;
+ case KCookieAdvice::Reject:
+ dlg->rbPolicyReject->setChecked (true);
+ break;
+ case KCookieAdvice::Ask:
+ case KCookieAdvice::Dunno:
+ default:
+ dlg->rbPolicyAsk->setChecked (true);
+ }
+
+ bool enable = cfg.readBoolEntry("RejectCrossDomainCookies", true);
+ dlg->cbRejectCrossDomainCookies->setChecked (enable);
+
+ bool sessionCookies = cfg.readBoolEntry("AcceptSessionCookies", true);
+ dlg->cbAutoAcceptSessionCookies->setChecked (sessionCookies);
+ bool cookieExpiration = cfg.readBoolEntry("IgnoreExpirationDate", false);
+ dlg->cbIgnoreCookieExpirationDate->setChecked (cookieExpiration);
+ updateDomainList(cfg.readListEntry("CookieDomainAdvice"));
+
+ if (enableCookies)
+ {
+ ignoreCookieExpirationDate( cookieExpiration );
+ autoAcceptSessionCookies( sessionCookies );
+ updateButtons();
+ }
+
+ // Connect the main swicth :) Enable/disable cookie support
+ connect( dlg->cbEnableCookies, SIGNAL( toggled(bool) ),
+ SLOT( cookiesEnabled(bool) ) );
+ connect( dlg->cbEnableCookies, SIGNAL( toggled(bool) ),
+ SLOT( configChanged() ) );
+
+ // Connect the preference check boxes...
+ connect ( dlg->cbRejectCrossDomainCookies, SIGNAL(clicked()),
+ SLOT(configChanged()));
+ connect ( dlg->cbAutoAcceptSessionCookies, SIGNAL(toggled(bool)),
+ SLOT(configChanged()));
+ connect ( dlg->cbIgnoreCookieExpirationDate, SIGNAL(toggled(bool)),
+ SLOT(configChanged()));
+
+ connect ( dlg->cbAutoAcceptSessionCookies, SIGNAL(toggled(bool)),
+ SLOT(autoAcceptSessionCookies(bool)));
+ connect ( dlg->cbIgnoreCookieExpirationDate, SIGNAL(toggled(bool)),
+ SLOT(ignoreCookieExpirationDate(bool)));
+
+ // Connect the default cookie policy radio buttons...
+ connect(dlg->bgDefault, SIGNAL(clicked(int)), SLOT(configChanged()));
+
+ // Connect signals from the domain specific policy listview.
+ connect( dlg->lvDomainPolicy, SIGNAL(selectionChanged()),
+ SLOT(selectionChanged()) );
+ connect( dlg->lvDomainPolicy, SIGNAL(doubleClicked (QListViewItem *)),
+ SLOT(changePressed() ) );
+ connect( dlg->lvDomainPolicy, SIGNAL(returnPressed ( QListViewItem * )),
+ SLOT(changePressed() ) );
+
+ // Connect the buttons...
+ connect( dlg->pbNew, SIGNAL(clicked()), SLOT( addPressed() ) );
+ connect( dlg->pbChange, SIGNAL( clicked() ), SLOT( changePressed() ) );
+ connect( dlg->pbDelete, SIGNAL( clicked() ), SLOT( deletePressed() ) );
+ connect( dlg->pbDeleteAll, SIGNAL( clicked() ), SLOT( deleteAllPressed() ) );
+}
+
+void KCookiesPolicies::save()
+{
+ // If nothing changed, ignore the save request.
+ if (!d_configChanged)
+ return;
+
+ KConfig cfg ( "kcookiejarrc" );
+ cfg.setGroup( "Cookie Policy" );
+
+ bool state = dlg->cbEnableCookies->isChecked();
+ cfg.writeEntry( "Cookies", state );
+ state = dlg->cbRejectCrossDomainCookies->isChecked();
+ cfg.writeEntry( "RejectCrossDomainCookies", state );
+ state = dlg->cbAutoAcceptSessionCookies->isChecked();
+ cfg.writeEntry( "AcceptSessionCookies", state );
+ state = dlg->cbIgnoreCookieExpirationDate->isChecked();
+ cfg.writeEntry( "IgnoreExpirationDate", state );
+
+ QString advice;
+ if (dlg->rbPolicyAccept->isChecked())
+ advice = KCookieAdvice::adviceToStr(KCookieAdvice::Accept);
+ else if (dlg->rbPolicyReject->isChecked())
+ advice = KCookieAdvice::adviceToStr(KCookieAdvice::Reject);
+ else
+ advice = KCookieAdvice::adviceToStr(KCookieAdvice::Ask);
+
+ cfg.writeEntry("CookieGlobalAdvice", advice);
+
+ QStringList domainConfig;
+ QListViewItem *at = dlg->lvDomainPolicy->firstChild();
+
+ while( at )
+ {
+ domainConfig.append(QString::fromLatin1("%1:%2").arg(KIDNA::toAscii(at->text(0))).arg(m_pDomainPolicy[at]));
+ at = at->nextSibling();
+ }
+
+ cfg.writeEntry("CookieDomainAdvice", domainConfig);
+ cfg.sync();
+
+ // Update the cookiejar...
+ if (!dlg->cbEnableCookies->isChecked())
+ (void)DCOPRef("kded", "kcookiejar").send("shutdown");
+ else
+ {
+ if (!DCOPRef("kded", "kcookiejar").send("reloadPolicy"))
+ KMessageBox::sorry(0, i18n("Unable to communicate with the cookie handler service.\n"
+ "Any changes you made will not take effect until the service "
+ "is restarted."));
+ }
+
+ // Force running io-slave to reload configurations...
+ KSaveIOConfig::updateRunningIOSlaves (this);
+ emit changed( false );
+}
+
+
+void KCookiesPolicies::defaults()
+{
+ dlg->cbEnableCookies->setChecked( true );
+ dlg->rbPolicyAsk->setChecked( true );
+ dlg->rbPolicyAccept->setChecked( false );
+ dlg->rbPolicyReject->setChecked( false );
+ dlg->cbRejectCrossDomainCookies->setChecked( true );
+ dlg->cbAutoAcceptSessionCookies->setChecked( true );
+ dlg->cbIgnoreCookieExpirationDate->setChecked( false );
+ dlg->lvDomainPolicy->clear();
+
+ cookiesEnabled( dlg->cbEnableCookies->isChecked() );
+ updateButtons();
+}
+
+void KCookiesPolicies::splitDomainAdvice (const QString& cfg, QString &domain,
+ KCookieAdvice::Value &advice)
+{
+ int sepPos = cfg.findRev(':');
+
+ // Ignore any policy that does not contain a domain...
+ if ( sepPos <= 0 )
+ return;
+
+ domain = cfg.left(sepPos);
+ advice = KCookieAdvice::strToAdvice( cfg.mid( sepPos+1 ) );
+}
+
+QString KCookiesPolicies::quickHelp() const
+{
+ return i18n("<h1>Cookies</h1> Cookies contain information that Konqueror"
+ " (or any other KDE application using the HTTP protocol) stores"
+ " on your computer from a remote Internet server. This means"
+ " that a web server can store information about you and your"
+ " browsing activities on your machine for later use. You might"
+ " consider this an invasion of privacy.<p>However, cookies are"
+ " useful in certain situations. For example, they are often used"
+ " by Internet shops, so you can 'put things into a shopping"
+ " basket'. Some sites require you have a browser that supports"
+ " cookies.<p>Because most people want a compromise between privacy"
+ " and the benefits cookies offer, KDE offers you the ability to"
+ " customize the way it handles cookies. You might, for example"
+ " want to set KDE's default policy to ask you whenever a server"
+ " wants to set a cookie or simply reject or accept everything."
+ " For example, you might choose to accept all cookies from your"
+ " favorite shopping web site. For this all you have to do is"
+ " either browse to that particular site and when you are presented"
+ " with the cookie dialog box, click on <i> This domain </i> under"
+ " the 'apply to' tab and choose accept or simply specify the name"
+ " of the site in the <i> Domain Specific Policy </i> tab and set"
+ " it to accept. This enables you to receive cookies from trusted"
+ " web sites without being asked every time KDE receives a cookie."
+ );
+}
+
+#include "kcookiespolicies.moc"
diff --git a/kcontrol/kio/kcookiespolicies.h b/kcontrol/kio/kcookiespolicies.h
new file mode 100644
index 000000000..5b2eaf086
--- /dev/null
+++ b/kcontrol/kio/kcookiespolicies.h
@@ -0,0 +1,81 @@
+/**
+ * kcookiespolicies.h - Cookies configuration
+ *
+ * Original Authors
+ * Copyright (c) Waldo Bastian <bastian@kde.org>
+ * Copyright (c) 1999 David Faure <faure@kde.org>
+ *
+ * Re-written by:
+ * Copyright (c) 2000- Dawit Alemayehu <adawit@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __KCOOKIESPOLICIES_H
+#define __KCOOKIESPOLICIES_H
+
+#include <qmap.h>
+#include <kcmodule.h>
+
+#include "policydlg.h"
+
+class QListViewItem;
+
+class DCOPClient;
+class KCookiesPolicyDlgUI;
+
+class KCookiesPolicies : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KCookiesPolicies(QWidget *parent = 0);
+ ~KCookiesPolicies();
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+ virtual QString quickHelp() const;
+
+ void addNewPolicy(const QString& domain);
+
+protected slots:
+ void autoAcceptSessionCookies ( bool );
+ void ignoreCookieExpirationDate ( bool );
+ void cookiesEnabled( bool );
+ void configChanged();
+
+ void selectionChanged();
+ void updateButtons();
+
+ void deleteAllPressed();
+ void deletePressed();
+ void changePressed();
+ void addPressed();
+
+private:
+ void updateDomainList(const QStringList& list);
+ bool handleDuplicate( const QString& domain, int );
+ void splitDomainAdvice (const QString& configStr, QString &domain,
+ KCookieAdvice::Value &advice);
+
+private:
+ int d_itemsSelected;
+ bool d_configChanged;
+ KCookiesPolicyDlgUI* dlg;
+ QMap<QListViewItem*, const char*> m_pDomainPolicy;
+};
+
+#endif // __KCOOKIESPOLICIES_H
diff --git a/kcontrol/kio/kcookiespoliciesdlg_ui.ui b/kcontrol/kio/kcookiespoliciesdlg_ui.ui
new file mode 100644
index 000000000..435ca8640
--- /dev/null
+++ b/kcontrol/kio/kcookiespoliciesdlg_ui.ui
@@ -0,0 +1,323 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KCookiesPolicyDlgUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KCookiesPolicyDlgUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>444</width>
+ <height>552</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>cbEnableCookies</cstring>
+ </property>
+ <property name="text">
+ <string>Enable coo&amp;kies</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enable cookie support. Normally you will want to have cookie support enabled and customize it to suit your privacy needs.&lt;p&gt;
+Please note that disabling cookie support might make many web sites unbrowsable.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>bgPreferences</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbRejectCrossDomainCookies</cstring>
+ </property>
+ <property name="text">
+ <string>Only acce&amp;pt cookies from originating server</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Reject the so called third-party cookies. These are cookies that originate from a site other than the one you are currently browsing. For example, if you visit &lt;b&gt;www.foobar.com&lt;/b&gt; while this option is on, only cookies that originate from www.foobar.com will be processed per your settings. Cookies from any other site will be rejected. This reduces the chances of site operators compiling a profile about your daily browsing habits.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbAutoAcceptSessionCookies</cstring>
+ </property>
+ <property name="text">
+ <string>Automaticall&amp;y accept session cookies</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Automatically accept temporary cookies meant to expire at the end of the current session. Such cookies will not be stored in your computer's hard drive or storage device. Instead, they are deleted when you close all applications (e.g. your browser) that use them.&lt;p&gt;
+&lt;u&gt;NOTE:&lt;/u&gt; Checking this option along with the next one will override your default as well as site specific cookie policies. However, doing so also increases your privacy since all cookies will be removed when the current session ends.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbIgnoreCookieExpirationDate</cstring>
+ </property>
+ <property name="text">
+ <string>Treat &amp;all cookies as session cookies</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Treat all cookies as session cookies. Session cookies are small pieces of data that are temporarily stored in your computer's memory until you quit or close all applications (e.g. your browser) that use them. Unlike regular cookies, session cookies are never stored on your hard drive or other storage medium.&lt;p&gt;
+&lt;u&gt;NOTE:&lt;/u&gt; Checking this option along with the previous one will override your default as well as site specific cookie policies. However, doing so also increases your privacy since all cookies will be removed when the current session ends.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup" row="2" column="0">
+ <property name="name">
+ <cstring>bgDefault</cstring>
+ </property>
+ <property name="title">
+ <string>Default Policy</string>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Determines how cookies received from a remote machine will be handled:
+&lt;ul&gt;
+&lt;li&gt;&lt;b&gt;Ask&lt;/b&gt; will cause KDE to ask for your confirmation whenever a server wants to set a cookie."&lt;/li&gt;
+&lt;li&gt;&lt;b&gt;Accept&lt;/b&gt; will cause cookies to be accepted without prompting you.&lt;/li&gt;
+&lt;li&gt;&lt;b&gt;Reject&lt;/b&gt; will cause the cookiejar to refuse all cookies it receives.&lt;/li&gt;
+&lt;/ul&gt;&lt;p&gt;
+&lt;u&gt;NOTE:&lt;/u&gt; Domain specific policies, which can be set below, always take precedence over the default policy.
+&lt;/qt&gt;</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbPolicyAsk</cstring>
+ </property>
+ <property name="text">
+ <string>Ask &amp;for confirmation</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbPolicyAccept</cstring>
+ </property>
+ <property name="text">
+ <string>Accep&amp;t all cookies</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbPolicyReject</cstring>
+ </property>
+ <property name="text">
+ <string>Re&amp;ject all cookies</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="3" column="0">
+ <property name="name">
+ <cstring>gbDomainSpecific</cstring>
+ </property>
+ <property name="title">
+ <string>Site Policy</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+To add a new policy, simply click on the &lt;b&gt;Add...&lt;/b&gt; button and supply the necessary information. To change an existing policy, use the &lt;b&gt;Change...&lt;/b&gt; button and choose the new policy from the policy dialog box. Clicking on the &lt;b&gt;Delete&lt;/b&gt; button will remove the currently selected policy causing the default policy setting to be used for that domain whereas &lt;b&gt;Delete All&lt;/b&gt; will remove all the site specific policies.
+&lt;/qt&gt;</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="0" column="1" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbNew</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbChange</cstring>
+ </property>
+ <property name="text">
+ <string>Chan&amp;ge...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbDelete</cstring>
+ </property>
+ <property name="text">
+ <string>D&amp;elete</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbDeleteAll</cstring>
+ </property>
+ <property name="text">
+ <string>Delete A&amp;ll</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="KListView" row="1" column="0" rowspan="2" colspan="1">
+ <column>
+ <property name="text">
+ <string>Domain</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Policy</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>lvDomainPolicy</cstring>
+ </property>
+ <property name="selectionMode" stdset="0">
+ <enum>Extended</enum>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="treeStepSize">
+ <number>0</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+List of sites for which you have set a specific cookie policy. Specific policies override the default policy setting for these sites.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>tbClearSearchLine</cstring>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="textLabel">
+ <string>Clear Search</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Search:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kListViewSearchLine</cstring>
+ </property>
+ </widget>
+ <widget class="KListViewSearchLine">
+ <property name="name">
+ <cstring>kListViewSearchLine</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Search interactively for domains</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>tbClearSearchLine</sender>
+ <signal>clicked()</signal>
+ <receiver>kListViewSearchLine</receiver>
+ <slot>clear()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+ <includehint>klistviewsearchline.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/kio/kenvvarproxydlg.cpp b/kcontrol/kio/kenvvarproxydlg.cpp
new file mode 100644
index 000000000..eaad2b1b6
--- /dev/null
+++ b/kcontrol/kio/kenvvarproxydlg.cpp
@@ -0,0 +1,303 @@
+/*
+ kenvvarproxydlg.cpp - Proxy configuration dialog
+
+ Copyright (C) 2001- Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License (GPL) version 2 as published by the Free Software
+ Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <stdlib.h>
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qwhatsthis.h>
+#include <qpushbutton.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <klineedit.h>
+#include <kmessagebox.h>
+
+#include "envvarproxy_ui.h"
+#include "kenvvarproxydlg.h"
+
+
+#define ENV_FTP_PROXY "FTP_PROXY,ftp_proxy,FTPPROXY,ftpproxy,PROXY,proxy"
+#define ENV_HTTP_PROXY "HTTP_PROXY,http_proxy,HTTPPROXY,httpproxy,PROXY,proxy"
+#define ENV_HTTPS_PROXY "HTTPS_PROXY,https_proxy,HTTPSPROXY,httpsproxy,PROXY,proxy"
+#define NO_PROXY "NO_PROXY,no_proxy"
+
+
+static QString getProxyEnv(const QString& var)
+{
+ return QString::fromLocal8Bit(::getenv(var.local8Bit().data()));
+}
+
+static bool autoDetectProxySetting(const QString& type, QString& proxyEnv)
+{
+ QStringList list = QStringList::split( ',', type);
+ QStringList::ConstIterator it = list.begin();
+ QStringList::ConstIterator end = list.end();
+
+ for(; it != end; ++it)
+ {
+ if(!getProxyEnv(*it).isEmpty())
+ {
+ proxyEnv = *it;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+KEnvVarProxyDlg::KEnvVarProxyDlg( QWidget* parent, const char* name )
+ :KProxyDialogBase( parent, name, true,
+ i18n( "Variable Proxy Configuration" ) )
+{
+ mDlg = new EnvVarProxyDlgUI( this );
+ setMainWidget( mDlg );
+ mDlg->leHttp->setMinimumWidth( mDlg->leHttp->fontMetrics().maxWidth() * 20 );
+ init();
+}
+
+KEnvVarProxyDlg::~KEnvVarProxyDlg ()
+{
+}
+
+void KEnvVarProxyDlg::init()
+{
+ m_bHasValidData = false;
+
+ connect( mDlg->cbShowValue, SIGNAL( clicked() ), SLOT( showValuePressed() ) );
+ connect( mDlg->pbVerify, SIGNAL( clicked() ), SLOT( verifyPressed() ) );
+ connect( mDlg->pbDetect, SIGNAL( clicked() ), SLOT( autoDetectPressed() ) );
+}
+
+void KEnvVarProxyDlg::setProxyData( const KProxyData& data )
+{
+ // Setup HTTP Proxy...
+ if (!getProxyEnv(data.proxyList["http"]).isEmpty())
+ mEnvVarsMap["http"] = data.proxyList["http"];
+
+ // Setup HTTPS Proxy...
+ if (!getProxyEnv(data.proxyList["https"]).isEmpty())
+ mEnvVarsMap["https"] = data.proxyList["https"];
+
+ // Setup FTP Proxy...
+ if (!getProxyEnv(data.proxyList["ftp"]).isEmpty())
+ mEnvVarsMap["ftp"] = data.proxyList["ftp"];
+
+ // Setup NO Proxy For...
+ QString noProxyFor = data.noProxyFor.join("");
+ if (!getProxyEnv(noProxyFor).isEmpty())
+ mEnvVarsMap["noProxy"] = noProxyFor;
+
+ mDlg->cbShowValue->setChecked( data.showEnvVarValue );
+ showValue();
+}
+
+const KProxyData KEnvVarProxyDlg::data() const
+{
+ KProxyData data;
+
+ if (m_bHasValidData)
+ {
+ data.proxyList["http"] = mEnvVarsMap["http"];
+ data.proxyList["https"] = mEnvVarsMap["https"];
+ data.proxyList["ftp"] = mEnvVarsMap["ftp"];
+ data.noProxyFor = mEnvVarsMap["noProxy"];
+ data.type = KProtocolManager::EnvVarProxy;
+ data.showEnvVarValue = mDlg->cbShowValue->isChecked();
+ }
+
+ return data;
+}
+
+
+void KEnvVarProxyDlg::verifyPressed()
+{
+ if ( !validate() )
+ {
+ QString msg = i18n("You must specify at least one valid proxy "
+ "environment variable.");
+
+ QString details = i18n("<qt>Make sure you entered the actual environment "
+ "variable name rather than its value. For "
+ "example, if the environment variable is <br><b>"
+ "HTTP_PROXY=http://localhost:3128</b><br> you need "
+ "to enter <b>HTTP_PROXY</b> here instead of the "
+ "actual value http://localhost:3128.</qt>");
+
+ KMessageBox::detailedSorry( this, msg, details,
+ i18n("Invalid Proxy Setup") );
+ }
+ else
+ {
+ KMessageBox::information( this, i18n("Successfully verified."),
+ i18n("Proxy Setup") );
+ }
+}
+
+void KEnvVarProxyDlg::autoDetectPressed()
+{
+ bool found = false;
+
+ setHighLight (mDlg->lbHttp, false);
+ setHighLight (mDlg->lbHttps, false);
+ setHighLight (mDlg->lbFtp, false);
+ setHighLight (mDlg->lbNoProxy, false);
+
+ // Detect HTTP proxy settings...
+ found |= autoDetectProxySetting (QString::fromLatin1(ENV_HTTP_PROXY), mEnvVarsMap["http"]);
+
+ // Detect HTTPS proxy settings...
+ found |= autoDetectProxySetting (QString::fromLatin1(ENV_HTTPS_PROXY), mEnvVarsMap["https"]);
+
+ // Detect FTP proxy settings...
+ found |= autoDetectProxySetting (QString::fromLatin1(ENV_FTP_PROXY), mEnvVarsMap["ftp"]);
+
+ // Detect the NO_PROXY settings...
+ found |= autoDetectProxySetting (QString::fromLatin1(NO_PROXY), mEnvVarsMap["noProxy"]);
+
+ if ( !found )
+ {
+ QString msg = i18n("Did not detect any environment variables "
+ "commonly used to set system wide proxy "
+ "information.");
+
+ QString details = i18n("<qt>To learn about the variable names the "
+ "automatic detection process searches for, "
+ "press OK, click on the quick help button "
+ "on the window title bar of the "
+ "previous dialog and then click on the "
+ "\"<b>Auto Detect</b>\" button.</qt>");
+
+ KMessageBox::detailedSorry( this, msg, details,
+ i18n("Automatic Proxy Variable Detection") );
+ return;
+ }
+
+ showValue();
+}
+
+void KEnvVarProxyDlg::updateVariables()
+{
+ QString text = mDlg->leHttp->text();
+ if (mEnvVarsMap["http"] != text)
+ mEnvVarsMap["http"] = text;
+
+ text = mDlg->leHttps->text();
+ if (mEnvVarsMap["https"] != text)
+ mEnvVarsMap["https"] = text;
+
+ text = mDlg->leFtp->text();
+ if (mEnvVarsMap["ftp"] != text)
+ mEnvVarsMap["ftp"] = text;
+
+ text = mDlg->leNoProxy->text();
+ if (mEnvVarsMap["noProxy"] != text)
+ mEnvVarsMap["noProxy"] = text;
+}
+
+void KEnvVarProxyDlg::showValuePressed()
+{
+ // Only update the variables whenever
+ if (mDlg->cbShowValue->isChecked())
+ updateVariables();
+
+ showValue();
+}
+
+void KEnvVarProxyDlg::showValue()
+{
+ bool enable = mDlg->cbShowValue->isChecked();
+
+ mDlg->leHttp->setReadOnly (enable);
+ mDlg->leHttps->setReadOnly (enable);
+ mDlg->leFtp->setReadOnly (enable);
+ mDlg->leNoProxy->setReadOnly (enable);
+
+ if (enable)
+ {
+ mDlg->leHttp->setText(getProxyEnv(mEnvVarsMap["http"]));
+ mDlg->leHttps->setText(getProxyEnv(mEnvVarsMap["https"]));
+ mDlg->leFtp->setText(getProxyEnv(mEnvVarsMap["ftp"]));
+ mDlg->leNoProxy->setText(getProxyEnv(mEnvVarsMap["noProxy"]));
+ }
+ else
+ {
+ mDlg->leHttp->setText(mEnvVarsMap["http"]);
+ mDlg->leHttps->setText(mEnvVarsMap["https"]);
+ mDlg->leFtp->setText(mEnvVarsMap["ftp"]);
+ mDlg->leNoProxy->setText(mEnvVarsMap["noProxy"]);
+ }
+}
+
+bool KEnvVarProxyDlg::validate(bool erase)
+{
+ m_bHasValidData = false;
+
+ if(!mDlg->cbShowValue->isChecked())
+ updateVariables();
+
+ bool notFound = getProxyEnv(mEnvVarsMap["http"]).isEmpty();
+ m_bHasValidData |= !notFound;
+ setHighLight (mDlg->lbHttp, notFound);
+ if(notFound && erase) mEnvVarsMap["http"] = QString::null;
+
+ notFound = getProxyEnv(mEnvVarsMap["https"]).isEmpty();
+ m_bHasValidData |= !notFound;
+ setHighLight (mDlg->lbHttps, notFound);
+ if(notFound && erase) mEnvVarsMap["https"] = QString::null;
+
+ notFound = getProxyEnv(mEnvVarsMap["ftp"]).isEmpty();
+ m_bHasValidData |= !notFound;
+ setHighLight (mDlg->lbFtp, notFound);
+ if(notFound && erase) mEnvVarsMap["ftp"] = QString::null;
+
+ notFound = getProxyEnv(mEnvVarsMap["noProxy"]).isEmpty();
+ m_bHasValidData |= !notFound;
+ setHighLight (mDlg->lbNoProxy, notFound);
+ if(notFound && erase) mEnvVarsMap["noProxy"] = QString::null;
+
+ return m_bHasValidData;
+}
+
+void KEnvVarProxyDlg::slotOk()
+{
+ if(!validate(true))
+ {
+ QString msg = i18n("You must specify at least one valid proxy "
+ "environment variable.");
+
+ QString details = i18n("<qt>Make sure you entered the actual environment "
+ "variable name rather than its value. For "
+ "example, if the environment variable is <br><b>"
+ "HTTP_PROXY=http://localhost:3128</b><br> you need "
+ "to enter <b>HTTP_PROXY</b> here instead of the "
+ "actual value http://localhost:3128.</qt>");
+
+ KMessageBox::detailedError( this, msg, details,
+ i18n("Invalid Proxy Setup") );
+ return;
+ }
+
+ KDialogBase::slotOk ();
+}
+
+#include "kenvvarproxydlg.moc"
diff --git a/kcontrol/kio/kenvvarproxydlg.h b/kcontrol/kio/kenvvarproxydlg.h
new file mode 100644
index 000000000..bf4c073a6
--- /dev/null
+++ b/kcontrol/kio/kenvvarproxydlg.h
@@ -0,0 +1,57 @@
+/*
+ kenvvarproxydlg.h - Base dialog box for proxy configuration
+
+ Copyright (C) 2001- Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License (GPL) version 2 as published by the Free Software
+ Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef KENVVAR_PROXY_DIALOG_H
+#define KENVVAR_PROXY_DIALOG_H
+
+#include <qmap.h>
+
+#include "kproxydlgbase.h"
+
+class EnvVarProxyDlgUI;
+
+class KEnvVarProxyDlg : public KProxyDialogBase
+{
+ Q_OBJECT
+
+public:
+ KEnvVarProxyDlg( QWidget* parent = 0, const char* name = 0 );
+ ~KEnvVarProxyDlg();
+
+ virtual const KProxyData data() const;
+ virtual void setProxyData( const KProxyData &data );
+
+protected slots:
+ virtual void slotOk();
+ void verifyPressed();
+ void showValuePressed();
+ void autoDetectPressed();
+
+protected:
+ void init();
+ bool validate(bool erase = false);
+ void showValue();
+ void updateVariables();
+
+private:
+ EnvVarProxyDlgUI* mDlg;
+ QMap<QString, QString> mEnvVarsMap;
+};
+#endif
diff --git a/kcontrol/kio/kio_ftprc.kcfg b/kcontrol/kio/kio_ftprc.kcfg
new file mode 100644
index 000000000..610b2e68a
--- /dev/null
+++ b/kcontrol/kio/kio_ftprc.kcfg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="kio_ftprc" />
+ <group name="DesktopIcons" >
+
+ <entry name="DisablePassiveMode" type="Bool">
+ <label>Disable Passive FTP</label>
+ <whatsthis>When FTP connections are passive the client connects to the server, instead of the other way round, so firewalls do not block the connection; old FTP servers may not support Passive FTP though.</whatsthis>
+ <default>false</default>
+ </entry>
+
+ <entry name="MarkPartial" type="Bool">
+ <label>Mark partially uploaded files</label>
+ <whatsthis>While a file is being uploaded its extension is ".part". When fully uploaded it is renamed to its real name.</whatsthis>
+ <default>true</default>
+ </entry>
+
+ </group>
+</kcfg>
diff --git a/kcontrol/kio/kio_ftprc.kcfgc b/kcontrol/kio/kio_ftprc.kcfgc
new file mode 100644
index 000000000..7b5ca780f
--- /dev/null
+++ b/kcontrol/kio/kio_ftprc.kcfgc
@@ -0,0 +1,5 @@
+File=kio_ftprc.kcfg
+ClassName=KioFtp
+Singleton=true
+Mutators=true
+
diff --git a/kcontrol/kio/kioslave.kcfg b/kcontrol/kio/kioslave.kcfg
new file mode 100644
index 000000000..4dcce7191
--- /dev/null
+++ b/kcontrol/kio/kioslave.kcfg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="kio_ftprc" />
+ <group name="General">
+ <entry name="PersistentProxyConnection" type="Bool">
+ <default>false</default>
+ </entry>
+ <entry name="ProxyConnectTimeout" type="UInt" >
+ <default>10</default>
+ <min>2</min>
+ <max>3600</max>
+ </entry>
+ <entry name="ConnectTimeout" type="UInt" >
+ <default>20</default>
+ <min>2</min>
+ <max>3600</max>
+ </entry>
+ <entry name="ReadTimeout" type="UInt" >
+ <default>15</default>
+ <min>2</min>
+ <max>3600</max>
+ </entry>
+ <entry name="ResponseTimeout" type="UInt" >
+ <default>600</default>
+ <min>2</min>
+ <max>3600</max>
+ </entry>
+ </group>
+ <group name="Proxy Settings" >
+ <entry name="AuthMode" type="String" >
+ </entry>
+ <entry name="ReversedException" type="Bool">
+ </entry>
+ <entry name="ftpProxy" type="String">
+ </entry>
+ <entry name="httpProxy" type="String">
+ </entry>
+ <entry name="httpsProxy" type="String">
+ </entry>
+ </group>
+</kcfg>
diff --git a/kcontrol/kio/kioslave.kcfgc b/kcontrol/kio/kioslave.kcfgc
new file mode 100644
index 000000000..7b5ca780f
--- /dev/null
+++ b/kcontrol/kio/kioslave.kcfgc
@@ -0,0 +1,5 @@
+File=kio_ftprc.kcfg
+ClassName=KioFtp
+Singleton=true
+Mutators=true
+
diff --git a/kcontrol/kio/kmanualproxydlg.cpp b/kcontrol/kio/kmanualproxydlg.cpp
new file mode 100644
index 000000000..9a3df6afb
--- /dev/null
+++ b/kcontrol/kio/kmanualproxydlg.cpp
@@ -0,0 +1,498 @@
+/*
+ kmanualproxydlg.cpp - Proxy configuration dialog
+
+ Copyright (C) 2001-2004 Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License (GPL) version 2 as published by the Free Software
+ Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qspinbox.h>
+#include <qcheckbox.h>
+#include <qwhatsthis.h>
+#include <qpushbutton.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <knuminput.h>
+#include <klistbox.h>
+#include <klineedit.h>
+#include <kicontheme.h>
+#include <kurifilter.h>
+#include <kmessagebox.h>
+#include <kiconloader.h>
+#include <kinputdialog.h>
+#include <kio/ioslave_defaults.h>
+
+#include "manualproxy_ui.h"
+#include "kmanualproxydlg.h"
+
+
+KManualProxyDlg::KManualProxyDlg( QWidget* parent, const char* name )
+ :KProxyDialogBase( parent, name, true,
+ i18n("Manual Proxy Configuration") )
+{
+ mDlg = new ManualProxyDlgUI (this);
+ setMainWidget( mDlg );
+
+ mDlg->pbCopyDown->setPixmap( BarIcon("down", KIcon::SizeSmall) );
+ QSizePolicy sizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed,
+ mDlg->pbCopyDown->sizePolicy().hasHeightForWidth() );
+ mDlg->pbCopyDown->setSizePolicy( sizePolicy );
+
+ init();
+}
+
+void KManualProxyDlg::init()
+{
+ mDlg->sbHttp->setRange( 0, MAX_PORT_VALUE );
+ mDlg->sbHttps->setRange( 0, MAX_PORT_VALUE );
+ mDlg->sbFtp->setRange( 0, MAX_PORT_VALUE );
+
+ connect( mDlg->pbNew, SIGNAL( clicked() ), SLOT( newPressed() ) );
+ connect( mDlg->pbChange, SIGNAL( clicked() ), SLOT( changePressed() ) );
+ connect( mDlg->pbDelete, SIGNAL( clicked() ), SLOT( deletePressed() ) );
+ connect( mDlg->pbDeleteAll, SIGNAL( clicked() ), SLOT( deleteAllPressed() ) );
+
+ connect( mDlg->lbExceptions, SIGNAL(selectionChanged()), SLOT(updateButtons()) );
+ connect( mDlg->lbExceptions, SIGNAL(doubleClicked (QListBoxItem *)), SLOT(changePressed()));
+
+ connect( mDlg->cbSameProxy, SIGNAL( toggled(bool) ), SLOT( sameProxy(bool) ) );
+ connect( mDlg->pbCopyDown, SIGNAL( clicked() ), SLOT( copyDown() ) );
+
+ connect( mDlg->leHttp, SIGNAL(textChanged(const QString&)), SLOT(textChanged(const QString&)) );
+ connect( mDlg->sbHttp, SIGNAL(valueChanged(int)), SLOT(valueChanged (int)) );
+}
+
+void KManualProxyDlg::setProxyData( const KProxyData &data )
+{
+ KURL url;
+
+ // Set the HTTP proxy...
+ if (!isValidURL(data.proxyList["http"], &url))
+ mDlg->sbHttp->setValue( DEFAULT_PROXY_PORT );
+ else
+ {
+ int port = url.port();
+ if ( port <= 0 )
+ port = DEFAULT_PROXY_PORT;
+
+ url.setPort( 0 );
+ mDlg->leHttp->setText( url.url() );
+ mDlg->sbHttp->setValue( port );
+ }
+
+ bool useSameProxy = (!mDlg->leHttp->text().isEmpty () &&
+ data.proxyList["http"] == data.proxyList["https"] &&
+ data.proxyList["http"] == data.proxyList["ftp"]);
+
+ mDlg->cbSameProxy->setChecked ( useSameProxy );
+
+ if ( useSameProxy )
+ {
+ mDlg->leHttps->setText ( mDlg->leHttp->text() );
+ mDlg->leFtp->setText ( mDlg->leHttp->text() );
+ mDlg->sbHttps->setValue( mDlg->sbHttp->value() );
+ mDlg->sbFtp->setValue( mDlg->sbHttp->value() );
+
+ sameProxy ( true );
+ }
+ else
+ {
+ // Set the HTTPS proxy...
+ if( !isValidURL( data.proxyList["https"], &url ) )
+ mDlg->sbHttps->setValue( DEFAULT_PROXY_PORT );
+ else
+ {
+ int port = url.port();
+ if ( port <= 0 )
+ port = DEFAULT_PROXY_PORT;
+
+ url.setPort( 0 );
+ mDlg->leHttps->setText( url.url() );
+ mDlg->sbHttps->setValue( port );
+ }
+
+ // Set the FTP proxy...
+ if( !isValidURL( data.proxyList["ftp"], &url ) )
+ mDlg->sbFtp->setValue( DEFAULT_PROXY_PORT );
+ else
+ {
+ int port = url.port();
+ if ( port <= 0 )
+ port = DEFAULT_PROXY_PORT;
+
+ url.setPort( 0 );
+ mDlg->leFtp->setText( url.url() );
+ mDlg->sbFtp->setValue( port );
+ }
+ }
+
+ QStringList::ConstIterator it = data.noProxyFor.begin();
+ for( ; it != data.noProxyFor.end(); ++it )
+ {
+ // "no_proxy" is a keyword used by the environment variable
+ // based configuration. We ignore it here as it is not applicable...
+ if ((*it).lower() != "no_proxy" && !(*it).isEmpty())
+ {
+ // Validate the NOPROXYFOR entries and use only hostnames if the entry is
+ // a valid or legitimate URL. NOTE: needed to catch manual manipulation
+ // of the proxy config files...
+ if( isValidURL( *it ) || ((*it).length() >= 3 && (*it).startsWith(".")) )
+ mDlg->lbExceptions->insertItem( *it );
+ }
+ }
+
+ mDlg->cbReverseProxy->setChecked( data.useReverseProxy );
+}
+
+const KProxyData KManualProxyDlg::data() const
+{
+ KProxyData data;
+
+ if (!m_bHasValidData)
+ return data;
+
+ data.proxyList["http"] = urlFromInput( mDlg->leHttp, mDlg->sbHttp );
+
+ if ( mDlg->cbSameProxy->isChecked () )
+ {
+ data.proxyList["https"] = data.proxyList["http"];
+ data.proxyList["ftp"] = data.proxyList["http"];
+ }
+ else
+ {
+ data.proxyList["https"] = urlFromInput( mDlg->leHttps, mDlg->sbHttps );
+ data.proxyList["ftp"] = urlFromInput( mDlg->leFtp, mDlg->sbFtp );
+ }
+
+ if ( mDlg->lbExceptions->count() )
+ {
+ QListBoxItem* item = mDlg->lbExceptions->firstItem();
+ for( ; item != 0L; item = item->next() )
+ data.noProxyFor << item->text();
+ }
+
+ data.type = KProtocolManager::ManualProxy;
+ data.useReverseProxy = mDlg->cbReverseProxy->isChecked();
+
+ return data;
+}
+
+void KManualProxyDlg::sameProxy( bool enable )
+{
+ mDlg->leHttps->setEnabled (!enable );
+ mDlg->leFtp->setEnabled (!enable );
+ mDlg->sbHttps->setEnabled (!enable );
+ mDlg->sbFtp->setEnabled (!enable );
+ mDlg->pbCopyDown->setEnabled( !enable );
+
+ if (enable)
+ {
+ mOldFtpText = mDlg->leFtp->text();
+ mOldHttpsText = mDlg->leHttps->text();
+
+ mOldFtpPort = mDlg->sbFtp->value();
+ mOldHttpsPort = mDlg->sbHttps->value();
+
+ int port = mDlg->sbHttp->value();
+ QString text = mDlg->leHttp->text();
+
+ mDlg->leFtp->setText (text);
+ mDlg->leHttps->setText (text);
+
+ mDlg->sbFtp->setValue (port);
+ mDlg->sbHttps->setValue (port);
+
+ if (mDlg->lbHttps->font().bold())
+ setHighLight( mDlg->lbHttps, false );
+
+ if (mDlg->lbFtp->font().bold())
+ setHighLight( mDlg->lbFtp, false );
+ }
+ else
+ {
+ mDlg->leFtp->setText (mOldFtpText);
+ mDlg->leHttps->setText (mOldHttpsText);
+
+ mDlg->sbFtp->setValue (mOldFtpPort);
+ mDlg->sbHttps->setValue (mOldHttpsPort);
+ }
+}
+
+bool KManualProxyDlg::validate()
+{
+ KURL filteredURL;
+ unsigned short count = 0;
+
+ if ( isValidURL( mDlg->leHttp->text(), &filteredURL ) )
+ {
+ mDlg->leHttp->setText( filteredURL.url() );
+ count++;
+ }
+ else
+ setHighLight( mDlg->lbHttp, true );
+
+ if ( !mDlg->cbSameProxy->isChecked () )
+ {
+ if ( isValidURL( mDlg->leHttps->text(), &filteredURL ) )
+ {
+ mDlg->leHttps->setText( filteredURL.url() );
+ count++;
+ }
+ else
+ setHighLight( mDlg->lbHttps, true );
+
+ if ( isValidURL( mDlg->leFtp->text(), &filteredURL ) )
+ {
+ mDlg->leFtp->setText( filteredURL.url() );
+ count++;
+ }
+ else
+ setHighLight( mDlg->lbFtp, true );
+ }
+
+ if ( count == 0 )
+ {
+ showErrorMsg( i18n("Invalid Proxy Setting"),
+ i18n("One or more of the specified proxy settings are "
+ "invalid. The incorrect entries are highlighted.") );
+ }
+
+ return (count > 0);
+}
+
+void KManualProxyDlg::textChanged(const QString& text)
+{
+ if (!mDlg->cbSameProxy->isChecked())
+ return;
+
+ mDlg->leFtp->setText( text );
+ mDlg->leHttps->setText( text );
+}
+
+void KManualProxyDlg::valueChanged(int value)
+{
+ if (!mDlg->cbSameProxy->isChecked())
+ return;
+
+ mDlg->sbFtp->setValue (value);
+ mDlg->sbHttps->setValue (value);
+ }
+
+void KManualProxyDlg::copyDown()
+{
+ int action = -1;
+
+ if ( !mDlg->leHttp->text().isEmpty() )
+ action += 4;
+ else if ( !mDlg->leHttps->text().isEmpty() )
+ action += 3;
+
+ switch ( action )
+ {
+ case 3:
+ mDlg->leHttps->setText( mDlg->leHttp->text() );
+ mDlg->sbHttps->setValue( mDlg->sbHttp->value() );
+ mDlg->leFtp->setText( mDlg->leHttp->text() );
+ mDlg->sbFtp->setValue( mDlg->sbHttp->value() );
+ break;
+ case 2:
+ mDlg->leFtp->setText( mDlg->leHttps->text() );
+ mDlg->sbFtp->setValue( mDlg->sbHttps->value() );
+ break;
+ case 1:
+ case 0:
+ default:
+ break;
+ }
+}
+
+void KManualProxyDlg::slotOk()
+{
+ //qDebug("m_bHasValidData: %s" , m_bHasValidData ? "true" : "false");
+ if ( m_bHasValidData || validate() )
+ {
+ KDialogBase::slotOk();
+ m_bHasValidData = true;
+ }
+}
+
+bool KManualProxyDlg::handleDuplicate( const QString& site )
+{
+ QListBoxItem* item = mDlg->lbExceptions->firstItem();
+ while ( item != 0 )
+ {
+ if ( item->text().findRev( site ) != -1 &&
+ item != mDlg->lbExceptions->selectedItem() )
+ {
+ QString msg = i18n("You entered a duplicate address. "
+ "Please try again.");
+ QString details = i18n("<qt><center><b>%1</b></center> "
+ "is already in the list.</qt>").arg(site);
+ KMessageBox::detailedError( this, msg, details, i18n("Duplicate Entry") );
+ return true;
+ }
+
+ item = item->next();
+ }
+ return false;
+}
+
+void KManualProxyDlg::newPressed()
+{
+ QString result;
+ if( getException(result, i18n("New Exception")) && !handleDuplicate(result) )
+ mDlg->lbExceptions->insertItem( result );
+}
+
+void KManualProxyDlg::changePressed()
+{
+ QString result;
+ if( getException( result, i18n("Change Exception"),
+ mDlg->lbExceptions->currentText() ) &&
+ !handleDuplicate( result ) )
+ mDlg->lbExceptions->changeItem( result, mDlg->lbExceptions->currentItem() );
+}
+
+void KManualProxyDlg::deletePressed()
+{
+ mDlg->lbExceptions->removeItem( mDlg->lbExceptions->currentItem() );
+ mDlg->lbExceptions->setSelected( mDlg->lbExceptions->currentItem(), true );
+ updateButtons();
+}
+
+void KManualProxyDlg::deleteAllPressed()
+{
+ mDlg->lbExceptions->clear();
+ updateButtons();
+}
+
+void KManualProxyDlg::updateButtons()
+{
+ bool hasItems = mDlg->lbExceptions->count() > 0;
+ bool itemSelected = (hasItems && mDlg->lbExceptions->selectedItem()!=0);
+
+ mDlg->pbDeleteAll->setEnabled( hasItems );
+ mDlg->pbDelete->setEnabled( itemSelected );
+ mDlg->pbChange->setEnabled( itemSelected );
+}
+
+QString KManualProxyDlg::urlFromInput(const KLineEdit* edit,
+ const QSpinBox* spin) const
+{
+ if (!edit)
+ return QString::null;
+
+ KURL u( edit->text() );
+
+ if (spin)
+ u.setPort( spin->value() );
+
+ return u.url();
+}
+
+bool KManualProxyDlg::isValidURL( const QString& _url, KURL* result ) const
+{
+ KURL url (_url);
+
+ QStringList filters;
+ filters << "kshorturifilter" << "localdomainurifilter";
+
+ // If the typed URL is malformed, and the filters cannot filter it
+ // then it must be an invalid entry.
+ if( !(url.isValid() || KURIFilter::self()->filterURI(url, filters)) &&
+ !url.hasHost() )
+ return false;
+
+ QString host (url.host());
+
+ // We only check for a relevant subset of characters that are
+ // not allowed in <authority> component of a URL.
+ if ( host.contains ('*') || host.contains (' ') || host.contains ('?') )
+ return false;
+
+ if ( result )
+ *result = url;
+
+ return true;
+}
+
+void KManualProxyDlg::showErrorMsg( const QString& caption,
+ const QString& message )
+{
+ QString cap( caption );
+ QString msg( message );
+
+ if ( cap.isNull() )
+ cap = i18n("Invalid Entry");
+
+ if ( msg.isNull() )
+ msg = i18n("The address you have entered is not valid.");
+
+ QString details = i18n("<qt>Make sure none of the addresses or URLs you "
+ "specified contain invalid or wildcard characters "
+ "such as spaces, asterisks (*), or question marks(?).<p>"
+ "<u>Examples of VALID entries:</u><br/>"
+ "<code>http://mycompany.com, 192.168.10.1, "
+ "mycompany.com, localhost, http://localhost</code><p>"
+ "<u>Examples of INVALID entries:</u><br/>"
+ "<code>http://my company.com, http:/mycompany,com "
+ "file:/localhost</code></qt>");
+
+ KMessageBox::detailedError( this, msg, details, cap );
+}
+
+bool KManualProxyDlg::getException ( QString& result,
+ const QString& caption,
+ const QString& value )
+{
+ QString label;
+
+ // Specify the appropriate message...
+ if ( mDlg->cbReverseProxy->isChecked() )
+ label = i18n("Enter the URL or address that should use the above proxy "
+ "settings:");
+ else
+ label = i18n("Enter the address or URL that should be excluded from "
+ "using the above proxy settings:");
+
+ QString whatsThis = i18n("<qt>Enter a valid address or url.<p>"
+ "<b><u>NOTE:</u></b> Wildcard matching such as "
+ "<code>*.kde.org</code> is not supported. If you want "
+ "to match any host in the <code>.kde.org</code> domain, "
+ "e.g. <code>printing.kde.org</code>, then simply enter "
+ "<code>.kde.org</code></qt>");
+
+ bool ok;
+ result = KInputDialog::text( caption, label, value, &ok, 0, 0, 0,
+ QString::null, whatsThis );
+
+ // If the user pressed cancel, do nothing...
+ if (!ok)
+ return false;
+
+ // If the typed URL is malformed, and the filters cannot filter it
+ // then it must be an invalid entry,
+ if( isValidURL(result) || (result.length() >= 3 && result.startsWith(".")))
+ return true;
+
+ showErrorMsg();
+ return false;
+}
+
+#include "kmanualproxydlg.moc"
diff --git a/kcontrol/kio/kmanualproxydlg.h b/kcontrol/kio/kmanualproxydlg.h
new file mode 100644
index 000000000..a21e3775c
--- /dev/null
+++ b/kcontrol/kio/kmanualproxydlg.h
@@ -0,0 +1,77 @@
+/*
+ kmanualproxydlg.h - Base dialog box for proxy configuration
+
+ Copyright (C) 2001-2004 Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License (GPL) version 2 as published by the Free Software
+ Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KMANUAL_PROXY_DIALOG_H
+#define KMANUAL_PROXY_DIALOG_H
+
+#include "kproxydlgbase.h"
+
+class QSpinBox;
+class KLineEdit;
+class ManualProxyDlgUI;
+
+class KManualProxyDlg : public KProxyDialogBase
+{
+ Q_OBJECT
+
+public:
+ KManualProxyDlg( QWidget* parent = 0, const char* name = 0 );
+ ~KManualProxyDlg() {};
+
+ virtual void setProxyData( const KProxyData &data );
+ virtual const KProxyData data() const;
+
+protected:
+ void init();
+ bool validate();
+
+protected slots:
+ virtual void slotOk();
+
+ void copyDown();
+ void sameProxy( bool );
+ void valueChanged (int value);
+ void textChanged (const QString&);
+
+ void newPressed();
+ void updateButtons();
+ void changePressed();
+ void deletePressed();
+ void deleteAllPressed();
+
+private:
+ QString urlFromInput( const KLineEdit* edit, const QSpinBox* spin ) const;
+ bool isValidURL( const QString&, KURL* = 0 ) const;
+ bool handleDuplicate( const QString& );
+ bool getException ( QString&, const QString&,
+ const QString& value = QString::null );
+ void showErrorMsg( const QString& caption = QString::null,
+ const QString& message = QString::null );
+
+private:
+ ManualProxyDlgUI* mDlg;
+
+ int mOldFtpPort;
+ int mOldHttpsPort;
+ QString mOldFtpText;
+ QString mOldHttpsText;
+};
+#endif
diff --git a/kcontrol/kio/kproxydlg.cpp b/kcontrol/kio/kproxydlg.cpp
new file mode 100644
index 000000000..c7f9d7d20
--- /dev/null
+++ b/kcontrol/kio/kproxydlg.cpp
@@ -0,0 +1,375 @@
+/*
+ kproxydlg.cpp - Proxy configuration dialog
+
+ Copyright (C) 2001- Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License (GPL) version 2 as published by the Free Software
+ Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qregexp.h>
+#include <qcheckbox.h>
+#include <qwhatsthis.h>
+#include <qbuttongroup.h>
+#include <qradiobutton.h>
+#include <qtabwidget.h>
+
+#include <klocale.h>
+#include <klineedit.h>
+#include <kmessagebox.h>
+
+#include "ksaveioconfig.h"
+#include "kenvvarproxydlg.h"
+#include "kmanualproxydlg.h"
+
+#include "socks.h"
+#include "kproxydlg.h"
+#include "kproxydlg_ui.h"
+
+KProxyOptions::KProxyOptions (QWidget* parent )
+ :KCModule (parent, "kcmkio")
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+
+ mTab = new QTabWidget(this);
+ layout->addWidget(mTab);
+
+ mProxy = new KProxyDialog(mTab);
+ mSocks = new KSocksConfig(mTab);
+
+ mTab->addTab(mProxy, i18n("&Proxy"));
+ mTab->addTab(mSocks, i18n("&SOCKS"));
+
+ connect(mProxy, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+ connect(mSocks, SIGNAL(changed(bool)), SIGNAL(changed(bool)));
+ connect(mTab, SIGNAL(currentChanged(QWidget *)), SIGNAL(quickHelpChanged()));
+}
+
+KProxyOptions::~KProxyOptions()
+{
+}
+
+void KProxyOptions::load()
+{
+ mProxy->load();
+ mSocks->load();
+}
+
+void KProxyOptions::save()
+{
+ mProxy->save();
+ mSocks->save();
+}
+
+void KProxyOptions::defaults()
+{
+ mProxy->defaults();
+ mSocks->defaults();
+}
+
+QString KProxyOptions::quickHelp() const
+{
+ QWidget *w = mTab->currentPage();
+
+ if (w && w->inherits("KCModule"))
+ {
+ KCModule *m = static_cast<KCModule *>(w);
+ return m->quickHelp();
+ }
+
+ return QString::null;
+}
+
+
+KProxyDialog::KProxyDialog( QWidget* parent)
+ :KCModule( parent, "kcmkio" )
+{
+ QVBoxLayout* mainLayout = new QVBoxLayout( this, KDialog::marginHint(),
+ KDialog::spacingHint() );
+
+ mDlg = new KProxyDialogUI( this );
+ mainLayout->addWidget( mDlg );
+ mainLayout->addStretch();
+
+ // signals and slots connections
+ connect( mDlg->rbNoProxy, SIGNAL( toggled(bool) ),
+ SLOT( slotUseProxyChanged() ) );
+
+ connect( mDlg->rbAutoDiscover, SIGNAL( toggled(bool) ),
+ SLOT( slotChanged() ) );
+ connect( mDlg->rbAutoScript, SIGNAL( toggled(bool) ),
+ SLOT( slotChanged() ) );
+
+ connect( mDlg->rbPrompt, SIGNAL( toggled(bool) ),
+ SLOT( slotChanged() ) );
+ connect( mDlg->rbPresetLogin, SIGNAL( toggled(bool) ),
+ SLOT( slotChanged() ) );
+
+ connect( mDlg->cbPersConn, SIGNAL( toggled(bool) ),
+ SLOT( slotChanged() ) );
+
+ connect( mDlg->location, SIGNAL( textChanged(const QString&) ),
+ SLOT( slotChanged() ) );
+
+ connect( mDlg->pbEnvSetup, SIGNAL( clicked() ), SLOT( setupEnvProxy() ) );
+ connect( mDlg->pbManSetup, SIGNAL( clicked() ), SLOT( setupManProxy() ) );
+
+ load();
+}
+
+KProxyDialog::~KProxyDialog()
+{
+ delete mData;
+ mData = 0;
+}
+
+void KProxyDialog::load()
+{
+ mDefaultData = false;
+ mData = new KProxyData;
+
+ KProtocolManager proto;
+ bool useProxy = proto.useProxy();
+ mData->type = proto.proxyType();
+ mData->proxyList["http"] = proto.proxyFor( "http" );
+ mData->proxyList["https"] = proto.proxyFor( "https" );
+ mData->proxyList["ftp"] = proto.proxyFor( "ftp" );
+ mData->proxyList["script"] = proto.proxyConfigScript();
+ mData->useReverseProxy = proto.useReverseProxy();
+ mData->noProxyFor = QStringList::split( QRegExp("[',''\t'' ']"),
+ proto.noProxyForRaw() );
+
+ mDlg->gbAuth->setEnabled( useProxy );
+ mDlg->gbOptions->setEnabled( useProxy );
+
+ mDlg->cbPersConn->setChecked( proto.persistentProxyConnection() );
+
+ if ( !mData->proxyList["script"].isEmpty() )
+ mDlg->location->lineEdit()->setText( mData->proxyList["script"] );
+
+ switch ( mData->type )
+ {
+ case KProtocolManager::WPADProxy:
+ mDlg->rbAutoDiscover->setChecked( true );
+ break;
+ case KProtocolManager::PACProxy:
+ mDlg->rbAutoScript->setChecked( true );
+ break;
+ case KProtocolManager::ManualProxy:
+ mDlg->rbManual->setChecked( true );
+ break;
+ case KProtocolManager::EnvVarProxy:
+ mDlg->rbEnvVar->setChecked( true );
+ break;
+ case KProtocolManager::NoProxy:
+ default:
+ mDlg->rbNoProxy->setChecked( true );
+ break;
+ }
+
+ switch( proto.proxyAuthMode() )
+ {
+ case KProtocolManager::Prompt:
+ mDlg->rbPrompt->setChecked( true );
+ break;
+ case KProtocolManager::Automatic:
+ mDlg->rbPresetLogin->setChecked( true );
+ default:
+ break;
+ }
+}
+
+void KProxyDialog::save()
+{
+ bool updateProxyScout = false;
+
+ if (mDefaultData)
+ mData->reset ();
+
+ if ( mDlg->rbNoProxy->isChecked() )
+ {
+ KSaveIOConfig::setProxyType( KProtocolManager::NoProxy );
+ }
+ else
+ {
+ if ( mDlg->rbAutoDiscover->isChecked() )
+ {
+ KSaveIOConfig::setProxyType( KProtocolManager::WPADProxy );
+ updateProxyScout = true;
+ }
+ else if ( mDlg->rbAutoScript->isChecked() )
+ {
+ KURL u( mDlg->location->lineEdit()->text() );
+
+ if ( !u.isValid() )
+ {
+ showInvalidMessage( i18n("The address of the automatic proxy "
+ "configuration script is invalid. Please "
+ "correct this problem before proceeding. "
+ "Otherwise, your changes you will be "
+ "ignored.") );
+ return;
+ }
+ else
+ {
+ KSaveIOConfig::setProxyType( KProtocolManager::PACProxy );
+ mData->proxyList["script"] = u.url();
+ updateProxyScout = true;
+ }
+ }
+ else if ( mDlg->rbManual->isChecked() )
+ {
+ if ( mData->type != KProtocolManager::ManualProxy )
+ {
+ // Let's try a bit harder to determine if the previous
+ // proxy setting was indeed a manual proxy
+ KURL u ( mData->proxyList["http"] );
+ bool validProxy = (u.isValid() && u.port() != 0);
+ u= mData->proxyList["https"];
+ validProxy |= (u.isValid() && u.port() != 0);
+ u= mData->proxyList["ftp"];
+ validProxy |= (u.isValid() && u.port() != 0);
+
+ if (!validProxy)
+ {
+ showInvalidMessage();
+ return;
+ }
+
+ mData->type = KProtocolManager::ManualProxy;
+ }
+
+ KSaveIOConfig::setProxyType( KProtocolManager::ManualProxy );
+ }
+ else if ( mDlg->rbEnvVar->isChecked() )
+ {
+ if ( mData->type != KProtocolManager::EnvVarProxy )
+ {
+ showInvalidMessage();
+ return;
+ }
+
+ KSaveIOConfig::setProxyType( KProtocolManager::EnvVarProxy );
+ }
+
+ if ( mDlg->rbPrompt->isChecked() )
+ KSaveIOConfig::setProxyAuthMode( KProtocolManager::Prompt );
+ else if ( mDlg->rbPresetLogin->isChecked() )
+ KSaveIOConfig::setProxyAuthMode( KProtocolManager::Automatic );
+ }
+
+ KSaveIOConfig::setPersistentProxyConnection( mDlg->cbPersConn->isChecked() );
+
+ // Save the common proxy setting...
+ KSaveIOConfig::setProxyFor( "ftp", mData->proxyList["ftp"] );
+ KSaveIOConfig::setProxyFor( "http", mData->proxyList["http"] );
+ KSaveIOConfig::setProxyFor( "https", mData->proxyList["https"] );
+
+ KSaveIOConfig::setProxyConfigScript( mData->proxyList["script"] );
+ KSaveIOConfig::setUseReverseProxy( mData->useReverseProxy );
+ KSaveIOConfig::setNoProxyFor( mData->noProxyFor.join(",") );
+
+
+ KSaveIOConfig::updateRunningIOSlaves (this);
+ if ( updateProxyScout )
+ KSaveIOConfig::updateProxyScout( this );
+
+ emit changed( false );
+}
+
+void KProxyDialog::defaults()
+{
+ mDefaultData = true;
+ mDlg->rbNoProxy->setChecked( true );
+ mDlg->location->lineEdit()->clear();
+ mDlg->cbPersConn->setChecked( false );
+ emit changed( true );
+}
+
+void KProxyDialog::setupManProxy()
+{
+ KManualProxyDlg dlgManual( this );
+
+ dlgManual.setProxyData( *mData );
+
+ if ( dlgManual.exec() == QDialog::Accepted )
+ {
+ *mData = dlgManual.data();
+ mDlg->rbManual->setChecked(true);
+ emit changed( true );
+ }
+}
+
+void KProxyDialog::setupEnvProxy()
+{
+ KEnvVarProxyDlg dlgEnv( this );
+
+ dlgEnv.setProxyData( *mData );
+
+ if ( dlgEnv.exec() == QDialog::Accepted )
+ {
+ *mData = dlgEnv.data();
+ mDlg->rbEnvVar->setChecked(true);
+ emit changed( true );
+ }
+}
+
+void KProxyDialog::slotChanged()
+{
+ mDefaultData = false;
+ emit changed( true );
+}
+
+void KProxyDialog::slotUseProxyChanged()
+{
+ mDefaultData = false;
+ bool useProxy = !(mDlg->rbNoProxy->isChecked());
+ mDlg->gbAuth->setEnabled(useProxy);
+ mDlg->gbOptions->setEnabled(useProxy);
+ emit changed( true );
+}
+
+QString KProxyDialog::quickHelp() const
+{
+ return i18n( "<h1>Proxy</h1>"
+ "<p>A proxy server is an intermediate program that sits between "
+ "your machine and the Internet and provides services such as "
+ "web page caching and/or filtering.</p>"
+ "<p>Caching proxy servers give you faster access to sites you have "
+ "already visited by locally storing or caching the content of those "
+ "pages; filtering proxy servers, on the other hand, provide the "
+ "ability to block out requests for ads, spam, or anything else you "
+ "want to block.</p>"
+ "<p><u>Note:</u> Some proxy servers provide both services.</p>" );
+}
+
+void KProxyDialog::showInvalidMessage( const QString& _msg )
+{
+ QString msg;
+
+ if( !_msg.isEmpty() )
+ msg = _msg;
+ else
+ msg = i18n( "<qt>The proxy settings you specified are invalid."
+ "<p>Please click on the <b>Setup...</b> "
+ "button and correct the problem before proceeding; "
+ "otherwise your changes will be ignored.</qt>" );
+
+ KMessageBox::error( this, msg, i18n("Invalid Proxy Setup") );
+}
+
+#include "kproxydlg.moc"
diff --git a/kcontrol/kio/kproxydlg.h b/kcontrol/kio/kproxydlg.h
new file mode 100644
index 000000000..bbac5641d
--- /dev/null
+++ b/kcontrol/kio/kproxydlg.h
@@ -0,0 +1,82 @@
+/*
+ kproxydlg.h - Proxy configuration dialog
+
+ Copyright (C) 2001- Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License (GPL) version 2 as published by the Free Software
+ Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _KPROXYDIALOG_H
+#define _KPROXYDIALOG_H
+
+#include <qstring.h>
+
+#include <kcmodule.h>
+
+class QTabWidget;
+
+class KProxyData;
+class KProxyDialogUI;
+
+class KProxyOptions : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KProxyOptions( QWidget* parent = 0 );
+ ~KProxyOptions();
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+ virtual QString quickHelp() const;
+
+private:
+ KCModule* mProxy;
+ KCModule* mSocks;
+ QTabWidget* mTab;
+};
+
+class KProxyDialog : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KProxyDialog( QWidget* parent = 0 );
+ ~KProxyDialog();
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+ QString quickHelp() const;
+
+private slots:
+ void slotChanged();
+ void slotUseProxyChanged();
+
+ void setupManProxy();
+ void setupEnvProxy();
+
+private:
+ void showInvalidMessage( const QString& _msg = QString::null );
+
+private:
+ KProxyDialogUI* mDlg;
+ KProxyData* mData;
+ bool mDefaultData;
+};
+
+#endif
diff --git a/kcontrol/kio/kproxydlg_ui.ui b/kcontrol/kio/kproxydlg_ui.ui
new file mode 100644
index 000000000..1a6b5d6e2
--- /dev/null
+++ b/kcontrol/kio/kproxydlg_ui.ui
@@ -0,0 +1,441 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KProxyDialogUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ProxyDlgUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>418</width>
+ <height>420</height>
+ </rect>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Setup proxy configuration.
+&lt;p&gt;
+A proxy server is an intermediate machine that sits between your computer and the Internet and provides services such as web page caching and filtering. Caching proxy servers give you faster access to web sites you have already visited by locally storing or caching those pages; filtering proxy servers usually provide the ability to block out requests for ads, spam, or anything else you want to block.
+&lt;p&gt;
+If you are uncertain whether or not you need to use a proxy server to connect to the Internet, consult your Internet service provider's setup guide or your system administrator.
+&lt;/qt&gt;</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>gbConfigure</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbNoProxy</cstring>
+ </property>
+ <property name="text">
+ <string>Connect to the &amp;Internet directly</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Connect to the Internet directly.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbAutoDiscover</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>A&amp;utomatically detect proxy configuration</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Automatically detect and configure the proxy settings.&lt;p&gt;
+Automatic detection is performed using the &lt;b&gt;Web Proxy Auto-Discovery Protocol (WPAD)&lt;/b&gt;.&lt;p&gt;
+&lt;b&gt;NOTE:&lt;/b&gt; This option might not work properly or not work at all in some UNIX/Linux distributions. If you encounter a problem when using this option, please check the FAQ section at http://konqueror.kde.org.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbAutoScript</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>U&amp;se the following proxy configuration URL</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Use the specified proxy script URL to configure the proxy settings.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>location</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter the address for the proxy configuration script.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbEnvVar</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Use preset proxy environment &amp;variables</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Use environment variables to configure the proxy settings.&lt;p&gt;
+Environment variables such as &lt;b&gt;HTTP_PROXY&lt;/b&gt; and &lt;b&gt;NO_PROXY&lt;/b&gt; are usually used in multi-user UNIX installations, where both graphical and non-graphical applications need to share the same proxy configuration information.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbEnvSetup</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Setup...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Show the proxy environment variable configuration dialog.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbManual</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Manually specify the proxy settings</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Manually enter proxy server configuration information.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbManSetup</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Setup...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Show the manual proxy configuration dialog.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>gbAuth</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>Authori&amp;zation</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbPrompt</cstring>
+ </property>
+ <property name="text">
+ <string>Prompt as &amp;needed</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Prompt for login information whenever it is required.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rbPresetLogin</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Use the following lo&amp;gin information.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Use the information below to login into proxy servers as needed.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="0" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KLineEdit" row="1" column="2">
+ <property name="name">
+ <cstring>lePassword</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="echoMode">
+ <enum>Password</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Login password.</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="2">
+ <property name="name">
+ <cstring>leUsername</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Login name.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>lbPassword</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Password:</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Login password.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>lbUsername</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Username:</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Login name.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>gbOptions</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>O&amp;ptions</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbPersConn</cstring>
+ </property>
+ <property name="text">
+ <string>Use persistent connections to proxy</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Use persistent proxy connection.&lt;p&gt;
+Although a persistent proxy connection is faster, note that it only works correctly with proxies that are fully HTTP 1.1 compliant. Do &lt;b&gt;not&lt;/b&gt; use this option in combination with non-HTTP 1.1 compliant proxy servers such as JunkBuster and WWWOfle.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>rbPresetLogin</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>leUsername</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>rbPresetLogin</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lbUsername</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>rbPresetLogin</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lePassword</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>rbPresetLogin</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lbPassword</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>rbAutoScript</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>location</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/kio/kproxydlgbase.cpp b/kcontrol/kio/kproxydlgbase.cpp
new file mode 100644
index 000000000..c901037e3
--- /dev/null
+++ b/kcontrol/kio/kproxydlgbase.cpp
@@ -0,0 +1,74 @@
+ /*
+ kproxydlgbase.h - Base dialog box for proxy configuration
+
+ Copyright (C) 2001- Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License (GPL) version 2 as published by the Free Software
+ Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "kproxydlgbase.h"
+
+KProxyData::KProxyData()
+{
+ init ();
+}
+
+KProxyData::KProxyData(const KProxyData &data)
+{
+ (*this) = data;
+}
+
+KProxyData& KProxyData::operator=( const KProxyData &data )
+{
+ useReverseProxy = data.useReverseProxy;
+ showEnvVarValue = data.showEnvVarValue;
+ noProxyFor = data.noProxyFor;
+ proxyList = data.proxyList;
+ type = data.type;
+
+ return (*this);
+}
+
+void KProxyData::reset()
+{
+ init();
+}
+
+void KProxyData::init()
+{
+ proxyList.clear();
+ noProxyFor.clear();
+ useReverseProxy = false;
+ showEnvVarValue = false;
+}
+
+
+KProxyDialogBase::KProxyDialogBase( QWidget* parent, const char* name,
+ bool modal, const QString &caption )
+ :KDialogBase( parent, name, modal, caption, Ok|Cancel, Ok, true )
+{
+ m_bHasValidData = false;
+}
+
+void KProxyDialogBase::setHighLight (QWidget* widget, bool highlight)
+{
+ if (!widget)
+ return;
+
+ QFont f = widget->font();
+ f.setBold( highlight );
+ widget->setFont( f );
+}
diff --git a/kcontrol/kio/kproxydlgbase.h b/kcontrol/kio/kproxydlgbase.h
new file mode 100644
index 000000000..7c39f31c0
--- /dev/null
+++ b/kcontrol/kio/kproxydlgbase.h
@@ -0,0 +1,68 @@
+/*
+ kproxydlgbase.h - Base dialog box for proxy configuration
+
+ Copyright (C) 2001- Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License (GPL) version 2 as published by the Free Software
+ Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KPROXY_DIALOG_BASE_H
+#define KPROXY_DIALOG_BASE_H
+
+#include <qmap.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+#include <kdialogbase.h>
+#include <kprotocolmanager.h>
+
+class KProxyData
+{
+public:
+ KProxyData();
+ KProxyData( const KProxyData &data );
+
+ void reset ();
+ KProxyData& operator=( const KProxyData &data );
+
+ bool useReverseProxy;
+ bool showEnvVarValue;
+ QStringList noProxyFor;
+ KProtocolManager::ProxyType type;
+ QMap<QString, QString> proxyList;
+
+private:
+ void init();
+};
+
+
+class KProxyDialogBase : public KDialogBase
+{
+public:
+ KProxyDialogBase( QWidget* parent = 0, const char* name = 0,
+ bool modal = false, const QString &caption = QString::null);
+
+ virtual ~KProxyDialogBase() {};
+
+ virtual const KProxyData data() const=0;
+
+ virtual void setProxyData (const KProxyData&)=0;
+
+protected:
+ void setHighLight (QWidget* widget = 0, bool highlight = false);
+ bool m_bHasValidData;
+};
+#endif
diff --git a/kcontrol/kio/ksaveioconfig.cpp b/kcontrol/kio/ksaveioconfig.cpp
new file mode 100644
index 000000000..a251c0aed
--- /dev/null
+++ b/kcontrol/kio/ksaveioconfig.cpp
@@ -0,0 +1,260 @@
+/*
+ Copyright (C) 2001 Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <dcopref.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstaticdeleter.h>
+#include <kio/ioslave_defaults.h>
+
+#include "ksaveioconfig.h"
+
+class KSaveIOConfigPrivate
+{
+public:
+ KSaveIOConfigPrivate ();
+ ~KSaveIOConfigPrivate ();
+
+ KConfig* config;
+ KConfig* http_config;
+};
+
+static KSaveIOConfigPrivate *ksiocpref = 0;
+static KStaticDeleter<KSaveIOConfigPrivate> ksiocp;
+
+KSaveIOConfigPrivate::KSaveIOConfigPrivate (): config(0), http_config(0)
+{
+ ksiocp.setObject (ksiocpref, this);
+}
+
+KSaveIOConfigPrivate::~KSaveIOConfigPrivate ()
+{
+ delete config;
+}
+
+KSaveIOConfigPrivate* KSaveIOConfig::d = 0;
+
+KConfig* KSaveIOConfig::config()
+{
+ if (!d)
+ d = new KSaveIOConfigPrivate;
+
+ if (!d->config)
+ d->config = new KConfig("kioslaverc", false, false);
+
+ return d->config;
+}
+
+KConfig* KSaveIOConfig::http_config()
+{
+ if (!d)
+ d = new KSaveIOConfigPrivate;
+
+ if (!d->http_config)
+ d->http_config = new KConfig("kio_httprc", false, false);
+
+ return d->http_config;
+}
+
+void KSaveIOConfig::reparseConfiguration ()
+{
+ delete d->config;
+ d->config = 0;
+}
+
+void KSaveIOConfig::setReadTimeout( int _timeout )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( QString::null );
+ cfg->writeEntry("ReadTimeout", QMAX(MIN_TIMEOUT_VALUE,_timeout));
+ cfg->sync();
+}
+
+void KSaveIOConfig::setConnectTimeout( int _timeout )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( QString::null );
+ cfg->writeEntry("ConnectTimeout", QMAX(MIN_TIMEOUT_VALUE,_timeout));
+ cfg->sync();
+}
+
+void KSaveIOConfig::setProxyConnectTimeout( int _timeout )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( QString::null );
+ cfg->writeEntry("ProxyConnectTimeout", QMAX(MIN_TIMEOUT_VALUE,_timeout));
+ cfg->sync();
+}
+
+void KSaveIOConfig::setResponseTimeout( int _timeout )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( QString::null );
+ cfg->writeEntry("ResponseTimeout", QMAX(MIN_TIMEOUT_VALUE,_timeout));
+ cfg->sync();
+}
+
+
+void KSaveIOConfig::setMarkPartial( bool _mode )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( QString::null );
+ cfg->writeEntry( "MarkPartial", _mode );
+ cfg->sync();
+}
+
+void KSaveIOConfig::setMinimumKeepSize( int _size )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( QString::null );
+ cfg->writeEntry( "MinimumKeepSize", _size );
+ cfg->sync();
+}
+
+void KSaveIOConfig::setAutoResume( bool _mode )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( QString::null );
+ cfg->writeEntry( "AutoResume", _mode );
+ cfg->sync();
+}
+
+void KSaveIOConfig::setUseCache( bool _mode )
+{
+ KConfig* cfg = http_config ();
+ cfg->writeEntry( "UseCache", _mode );
+ cfg->sync();
+}
+
+void KSaveIOConfig::setMaxCacheSize( int cache_size )
+{
+ KConfig* cfg = http_config ();
+ cfg->writeEntry( "MaxCacheSize", cache_size );
+ cfg->sync();
+}
+
+void KSaveIOConfig::setCacheControl(KIO::CacheControl policy)
+{
+ KConfig* cfg = http_config ();
+ QString tmp = KIO::getCacheControlString(policy);
+ cfg->writeEntry("cache", tmp);
+ cfg->sync();
+}
+
+void KSaveIOConfig::setMaxCacheAge( int cache_age )
+{
+ KConfig* cfg = http_config ();
+ cfg->writeEntry( "MaxCacheAge", cache_age );
+ cfg->sync();
+}
+
+void KSaveIOConfig::setUseReverseProxy( bool mode )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( "Proxy Settings" );
+ cfg->writeEntry("ReversedException", mode);
+ cfg->sync();
+}
+
+void KSaveIOConfig::setProxyType(KProtocolManager::ProxyType type)
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( "Proxy Settings" );
+ cfg->writeEntry( "ProxyType", static_cast<int>(type) );
+ cfg->sync();
+}
+
+void KSaveIOConfig::setProxyAuthMode(KProtocolManager::ProxyAuthMode mode)
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( "Proxy Settings" );
+ cfg->writeEntry( "AuthMode", static_cast<int>(mode) );
+ cfg->sync();
+}
+
+void KSaveIOConfig::setNoProxyFor( const QString& _noproxy )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( "Proxy Settings" );
+ cfg->writeEntry( "NoProxyFor", _noproxy );
+ cfg->sync();
+}
+
+void KSaveIOConfig::setProxyFor( const QString& protocol,
+ const QString& _proxy )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( "Proxy Settings" );
+ cfg->writeEntry( protocol.lower() + "Proxy", _proxy );
+ cfg->sync();
+}
+
+void KSaveIOConfig::setProxyConfigScript( const QString& _url )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( "Proxy Settings" );
+ cfg->writeEntry( "Proxy Config Script", _url );
+ cfg->sync();
+}
+
+void KSaveIOConfig::setPersistentProxyConnection( bool enable )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( QString::null );
+ cfg->writeEntry( "PersistentProxyConnection", enable );
+ cfg->sync();
+}
+
+void KSaveIOConfig::setPersistentConnections( bool enable )
+{
+ KConfig* cfg = config ();
+ cfg->setGroup( QString::null );
+ cfg->writeEntry( "PersistentConnections", enable );
+ cfg->sync();
+}
+
+void KSaveIOConfig::updateRunningIOSlaves (QWidget *parent)
+{
+ // Inform all running io-slaves about the changes...
+ // if we cannot update, ioslaves inform the end user...
+ if (!DCOPRef("*", "KIO::Scheduler").send("reparseSlaveConfiguration", QString::null))
+ {
+ QString caption = i18n("Update Failed");
+ QString message = i18n("You have to restart the running applications "
+ "for these changes to take effect.");
+ KMessageBox::information (parent, message, caption);
+ return;
+ }
+}
+
+void KSaveIOConfig::updateProxyScout( QWidget * parent )
+{
+ // Inform the proxyscout kded module about changes
+ // if we cannot update, ioslaves inform the end user...
+ if (!DCOPRef("kded", "proxyscout").send("reset"))
+ {
+ QString caption = i18n("Update Failed");
+ QString message = i18n("You have to restart KDE "
+ "for these changes to take effect.");
+ KMessageBox::information (parent, message, caption);
+ return;
+ }
+}
+
diff --git a/kcontrol/kio/ksaveioconfig.h b/kcontrol/kio/ksaveioconfig.h
new file mode 100644
index 000000000..3a6528ed2
--- /dev/null
+++ b/kcontrol/kio/ksaveioconfig.h
@@ -0,0 +1,96 @@
+/*
+ Copyright (C) 2001 Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KSAVEIO_CONFIG_H_
+#define KSAVEIO_CONFIG_H_
+
+#include <kprotocolmanager.h>
+
+class QWidget;
+class KSaveIOConfigPrivate;
+
+class KSaveIOConfig
+{
+public:
+
+ /* Reload config file (kioslaverc) */
+ static void reparseConfiguration();
+
+
+ /** Timeout Settings */
+ static void setReadTimeout( int );
+
+ static void setConnectTimeout( int );
+
+ static void setProxyConnectTimeout( int );
+
+ static void setResponseTimeout( int );
+
+
+ /** Cache Settings */
+ static void setMaxCacheAge( int );
+
+ static void setUseCache( bool );
+
+ static void setMaxCacheSize( int );
+
+ static void setCacheControl( KIO::CacheControl );
+
+
+ /** Proxy Settings */
+ static void setUseReverseProxy( bool );
+
+ static void setProxyType( KProtocolManager::ProxyType );
+
+ static void setProxyAuthMode( KProtocolManager::ProxyAuthMode );
+
+ static void setProxyConfigScript( const QString& );
+
+ static void setProxyFor( const QString&, const QString& );
+
+ static void setNoProxyFor( const QString& );
+
+
+ /** Miscelaneous Settings */
+ static void setMarkPartial( bool );
+
+ static void setMinimumKeepSize( int );
+
+ static void setAutoResume( bool );
+
+ static void setPersistentConnections( bool );
+
+ static void setPersistentProxyConnection( bool );
+
+
+ /** Update all running io-slaves */
+ static void updateRunningIOSlaves (QWidget * parent = 0L);
+
+ /** Update proxy scout */
+ static void updateProxyScout( QWidget * parent = 0L );
+
+protected:
+ static KConfig* config ();
+ static KConfig* http_config ();
+ KSaveIOConfig ();
+
+private:
+ static KSaveIOConfigPrivate* d;
+};
+#endif
diff --git a/kcontrol/kio/lanbrowser.desktop b/kcontrol/kio/lanbrowser.desktop
new file mode 100644
index 000000000..5d3965667
--- /dev/null
+++ b/kcontrol/kio/lanbrowser.desktop
@@ -0,0 +1,226 @@
+[Desktop Entry]
+Type=Application
+Icon=samba
+Exec=kcmshell lanbrowser
+
+
+X-KDE-Library=kio
+X-KDE-FactoryName=lanbrowser
+
+Name=Local Network Browsing
+Name[af]=Plaaslike Netwerk Blaaiïng
+Name[ar]=تصفح الشبكة المحلية
+Name[az]=Yerli Şəbəkə
+Name[be]=Прагляд мясцовай сеткі
+Name[bg]=Локална мрежа
+Name[bn]=স্থানীয় নেটওয়ার্ক ব্রাউজিং
+Name[br]=Furchal ar rouedad lec'hel
+Name[bs]=Pregledanje lokalne mreže
+Name[ca]=Navegació per la xarxa local
+Name[cs]=Prohlížení lokální sítě
+Name[csb]=Przezéranié môlowi sécë
+Name[cy]=Pori Rhwydwaith Lleol
+Name[da]=Lokal netværkssøgning
+Name[de]=Netzwerk-Browser
+Name[el]=Τοπική περιήγηση δικτύου
+Name[eo]=Traserĉado de la loka reto
+Name[es]=Navegación por la red local
+Name[et]=Kohtvõrgu lehitsemine
+Name[eu]=Sare lokaleko arakaketa
+Name[fa]=مرور شبکۀ محلی
+Name[fi]=Paikallisverkon selaus
+Name[fr]=Navigation dans le réseau local
+Name[fy]=Lokaal netwurk
+Name[ga]=Brabhsáil an Líonra Logánta
+Name[gl]=Exploración da Rede Local
+Name[he]=עיון ברשת המקומית
+Name[hi]=स्थानीय नेटवर्क ब्राउजिंग
+Name[hr]=Pregledavanje lokalne mreže
+Name[hu]=Hálózatböngészés
+Name[is]=Staðarnetsflakk
+Name[it]=Navigazione rete locale
+Name[ja]=ローカルネットワーク参照
+Name[ka]=ლოკალური ქსელის მიმოხილვა
+Name[kk]=Жергілікті желіні шолу
+Name[km]=ការ​រុករក​បណ្ដាញ​មូលដ្ឋាន
+Name[ko]=로컬 네트워크 탐색
+Name[lo]=ເຄືອຂ່າຍພາຍໃນ
+Name[lt]=Vietinio tinklo naršymas
+Name[lv]=Lokālā Tīkla pārlūkošana
+Name[mk]=Прелистување на локалната мрежа
+Name[mn]=Дотоод Сүлжээ-Хөтөч
+Name[ms]=Pelayaran Rangkaian Setempat
+Name[mt]=Browsing tan-Network Lokali
+Name[nb]=Lokalt nettverk
+Name[nds]=Lokaal Nettwarkkieker
+Name[ne]=स्थानीय सञ्जाल ब्राउजिङ
+Name[nl]=Lokaal netwerk
+Name[nn]=Lokalt nettverk
+Name[nso]=Boinyakisi bja Kgokagano ya Selegae
+Name[pa]=ਸਥਾਨਕ ਨੈੱਟਵਰਕ ਝਲਕਾਰਾ
+Name[pl]=Przeglądanie sieci lokalnej
+Name[pt]=Navegação na Rede Local
+Name[pt_BR]=Navegação em Rede Local
+Name[ro]=Răsfoire rețea locală
+Name[ru]=Обзор локальной сети
+Name[rw]=Gucukumbura Urusobemiyoboro rwa Hafi
+Name[se]=Báikkálaš fierbmebláđđen
+Name[sk]=Prehliadanie lokálnej siete
+Name[sl]=Brskanje po krajevnem omrežju
+Name[sr]=Прегледање локалне мреже
+Name[sr@Latn]=Pregledanje lokalne mreže
+Name[sv]=Lokal nätverksbläddring
+Name[ta]=உள் வலைதல உலாவுதல்
+Name[te]=స్థానిక నెట్వర్క్ బ్రౌజింగ్
+Name[tg]=Обзори шабакаи локалӣ
+Name[th]=เรียกดูเครือข่ายท้องถิ่น
+Name[tr]=Yerel Ağ Tarama
+Name[tt]=Cirle Çeltärne Küzläw
+Name[uk]=Перегляд локальної мережі
+Name[uz]=Lokal tarmoqni koʻrish
+Name[uz@cyrillic]=Локал тармоқни кўриш
+Name[ven]=Burausini ya vhukwamani ha hefhano
+Name[vi]=Duyệt mạng nội bộ
+Name[wa]=Naiviaedje del locåle rantoele
+Name[xh]=Ukhangelo Lomsebenzi womnatha Wobulali
+Name[zh_CN]=局域网浏览
+Name[zh_TW]=區域網路瀏覽
+Name[zu]=Ukucinga oxhumanweni oluseduze
+
+Comment=Setup lisa, reslisa and the ioslaves
+Comment[af]=Stel lisa, reslisa en die ioslaves op
+Comment[az]=Lisa, reslisa və ioslaves-i quraşdır
+Comment[be]=Настаўленні lisa, reslisa і ioslaves
+Comment[bg]=Настройване на lisa, reslisa и ioslaves
+Comment[bn]=lisa, reslisa এবং ioslaves সেট-আপ
+Comment[br]=Kefluniadur lisa, reslisa and skalvoù IO
+Comment[bs]=Podesite lisa, reslisa i ioslaves
+Comment[ca]=Arranja lisa, reslisa i els ioslaves
+Comment[cs]=Nastavení Lisa, ResLisa a pomocných zařízení
+Comment[csb]=Ùstôw lisa, reslisa ë procedurów wé/wi
+Comment[cy]=Gosodiad lisa,reslisa a'r gweision-io
+Comment[da]=Opsætning af lisa, reslisa og ioslaverne
+Comment[de]=Einrichtung von LISa, resLISa und Ein-/Ausgabemodulen
+Comment[el]=Ρύθμιση του lisa, reslisa και των ioslaves
+Comment[eo]=Agordo de Lisa, Reslisa kaj la Enel-sklavoj
+Comment[es]=Configuración de lisa, reslisa y los ioslaves
+Comment[et]=Lisa, reslisa ja KIO moodulite seadistamine
+Comment[eu]=Konfiguratu lisa, reslisa eta ioslave-ak
+Comment[fa]=برپایی lisa، reslisa و ioslaves
+Comment[fi]=Lisan, Reslisan ja KIO-palveluiden asetukset
+Comment[fr]=Configuration de LISa, ResLISa et des modules d'entrées-sorties
+Comment[fy]=Lisa, reslisa en de ioslaves ynstelle
+Comment[ga]=Socraigh lisa, reslisa agus ioslaves
+Comment[gl]=Configurar lisa, reslisa e os escravos I/O
+Comment[he]=שינוי הגדרות reslisa ,lisa והפרוטוקולים
+Comment[hi]=लिसा,रेसलिसा तथा आईओस्लेव्स सेटअप करें
+Comment[hr]=Postavke za module lisa, reslisu i ioslaves
+Comment[hu]=A Lisa, a ResLisa és a KDE protokollok beállításai
+Comment[is]=Stilla lisa, reslisa og I/Ú-þrælana
+Comment[it]=Imposta lisa, reslisa e gli ioslave
+Comment[ja]=lisa, reslisa, ioslave の設定
+Comment[ka]=lisa, reslisa და ioslaves -ს კონფიგურაცია
+Comment[kk]=lisa, reslisa және the ioslaves дегендерді орнату
+Comment[km]=ដំឡើង lisa, reslisa និង ioslaves
+Comment[ko]=lisa, reslisa, IO 슬레이브 설정
+Comment[lt]=Lisa, reslisa ir ioslaves nustatymas
+Comment[lv]=Uzstāda lisa, reslisa un iovergus
+Comment[mk]=Поставете ги lisa, reslisa и ioslaves
+Comment[mn]=LISa, resLISa ба Оролт/Гаралт-модулын тохируулга
+Comment[mt]=Issettja lisa, reslisa u l-ioslaves
+Comment[nb]=Oppsett av lisa, reslisa og i/u-slavene
+Comment[nds]=Lisa, reslisa un de In-/Utgaavdeensten instellen
+Comment[ne]=लिसा, रेसलिसा र इओस्लेभ सेटअप गर्नुहोस्
+Comment[nl]=Lisa, reslisa en de ioslaves instellen
+Comment[nn]=Oppsett av lisa, reslisa og i/u-slavane
+Comment[nso]=Beakanya lisa, reslisa le ioslaves
+Comment[pa]=lisa, reslisa ਤੇ ioslaves ਸੈੱਟਅੱਪ
+Comment[pl]=Ustawienie lisa, reslisa i procedur we/wy
+Comment[pt]=Configurar o lisa, o reslisa e os seus ioslaves
+Comment[pt_BR]=Configura lisa, reslisa e os escravos
+Comment[ro]=Setează lisa, reslisa și dispozitivele I/O
+Comment[ru]=Настройка lisa, reslisa и ioslaves
+Comment[rw]=Kugena imiterere ya lisa, reslisa na ioslaves
+Comment[se]=Heivet lisa,reslisa ja s/o-šlávaid
+Comment[sk]=Nastavenie lisa, reslisa a IO klientov
+Comment[sl]=Nastavitve lisa, reslisa in ioslave
+Comment[sr]=Подешавање lisa-e, reslisa-e, и ioslave-ова
+Comment[sr@Latn]=Podešavanje lisa-e, reslisa-e, i ioslave-ova
+Comment[sv]=Ställ in lisa, reslisa och I/O-slavarna
+Comment[ta]= லிசா, ரெஸ்லிசா மற்றும் ஐஓஸ்லேவ்ஸ் அமைப்பு
+Comment[tg]=Танзимоти lisa, reslisa ва ioslaves
+Comment[th]=ตั้งค่า lisa, reslisa และ ioslaves
+Comment[tr]=lisa, reslisa ve ioslaves kurulumu
+Comment[tt]=lisa, reslisa, ioslaves caylawları
+Comment[uk]=Встановлення lisa,reslisa та ioslaves
+Comment[uz]=Lisa, reslisa va ioslave xizmatlarni moslash
+Comment[uz@cyrillic]=Lisa, reslisa ва ioslave хизматларни мослаш
+Comment[ven]=Vhekanyani lisa,reslisa na ioslaves
+Comment[vi]=Cài đặt lisa,reslisa và các ioslave
+Comment[wa]=Apontiaedje di lisa, reslisa et les ioslaves
+Comment[xh]=Cwangcisa i lisa, reslisa ne ioslaves
+Comment[zh_CN]=设置 lisa、reslisa 和 ioslaves
+Comment[zu]=lungiselela i-lisa, i-reslisa ne-ioslaves
+
+Keywords=samba,smb,windows,network
+Keywords[az]=xml,rpc,daemon,demon,port,qapı,network,şəbəkə,samba,smb,windows
+Keywords[be]=Сетка,Навакольнае асяроддзе,samba,smb,windows,network
+Keywords[bg]=самба, мрежа, локална, преглед, връзка, samba, smb, windows, network
+Keywords[br]=samba,smb,prenester,rouedad
+Keywords[bs]=samba,smb,windows,network,mreža
+Keywords[ca]=samba,smb,windows,xarxa
+Keywords[cs]=samba,smb,windows,síť
+Keywords[csb]=samba,smb,windows,séc
+Keywords[cy]=samba,smb,windows, rhwydwaith
+Keywords[da]=samba,smb,windows,netværk
+Keywords[de]=samba,smb,windows,netzwerk
+Keywords[el]=samba,smb,windows,δίκτυο
+Keywords[eo]=samba,smb,fenestro,windows,reto
+Keywords[es]=samba,smb,windows,red
+Keywords[et]=samba,smb,windows,võrk
+Keywords[eu]=samba,smb,windows,sarea
+Keywords[fa]=samba، smb، پنجره‌ها، شبکه
+Keywords[fi]=samba,smb,windows,verkko
+Keywords[fr]=samba,smb,windows,réseau
+Keywords[fy]=samba,smb,windows,netwurk
+Keywords[ga]=samba,smb,windows,líonra
+Keywords[gl]=samba,smb,windows,rede
+Keywords[he]=סמבה,smb,חלונות,רשת, samba,windows,network
+Keywords[hi]=साम्बा,एसएमबी,विंडोज़,नेटवर्क
+Keywords[hr]=samba,smb,windows,network,mreža
+Keywords[hu]=Samba,smb,Windows,hálózat
+Keywords[is]=samba,smb,windows,network,net
+Keywords[it]=samba,smb,windows,rete
+Keywords[ja]=samba,smb,ウィンドウズ,ネットワーク
+Keywords[km]=samba,smb,windows,បណ្ដាញ
+Keywords[lt]=samba,smb,windows,network,tinklas
+Keywords[lv]=samba,smb,windows,tīkls
+Keywords[mk]=samba,smb,windows,network,мрежа,заеднички,Виндоус
+Keywords[nb]=samba,smb,windows,nettverk
+Keywords[nds]=samba,smb,Windows,Nettwark
+Keywords[ne]=साम्बा, smb, सञ्झ्याल, सञ्जाल
+Keywords[nl]=samba,smb,windows,netwerk
+Keywords[nn]=samba,smb,windows,nettverk
+Keywords[pa]=samba,smb,windows,network,ਨੈੱਟਵਰਕ,ਸਾਂਬਾ
+Keywords[pl]=samba,smb,windows,sieć
+Keywords[pt]=samba,smb,windows,rede
+Keywords[pt_BR]=samba,smb,windows,rede
+Keywords[ro]=samba,smb,windows,rețea
+Keywords[rw]=samba,smb,windows,urusobemiyoboro
+Keywords[se]=samba,smb,windows,fierpmádat
+Keywords[sk]=samba,smb,windows,sieť
+Keywords[sl]=samba,smb,windows,network,omrežje
+Keywords[sr]=samba,smb,windows,network,мрежа,самба
+Keywords[sr@Latn]=samba,smb,windows,network,mreža,samba
+Keywords[sv]=samba,smb,windows,nätverk
+Keywords[ta]=சாம்ப்,smb,சாளரங்கள்,வலைதளம்
+Keywords[th]=samba,smb,วินโดวส์,เครือข่าย
+Keywords[tr]=samba,smb,windows,ağ
+Keywords[uk]=samba,smb,windows,мережа
+Keywords[uz]=samba,smb,windows,tarmoq
+Keywords[uz@cyrillic]=samba,smb,windows,тармоқ
+Keywords[vi]=samba,smb,cửa sổ,mạng
+Keywords[wa]=samba,smb,windows,network,rantoele
+Keywords[zh_CN]=samba,smb,windows,network,网络
+
+Categories=Qt;KDE;X-KDE-settings-network;
diff --git a/kcontrol/kio/main.cpp b/kcontrol/kio/main.cpp
new file mode 100644
index 000000000..dfe2eb0f8
--- /dev/null
+++ b/kcontrol/kio/main.cpp
@@ -0,0 +1,158 @@
+// (c) Torben Weis 1998
+// (c) David Faure 1998
+/*
+ * main.cpp for lisa,reslisa,kio_lan and kio_rlan kcm module
+ *
+ * Copyright (C) 2000,2001 Alexander Neundorf <neundorf@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <qfile.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtabwidget.h>
+
+#include <kcmoduleloader.h>
+#include <klocale.h>
+
+#include "kcookiesmain.h"
+#include "netpref.h"
+#include "smbrodlg.h"
+#include "useragentdlg.h"
+#include "kproxydlg.h"
+#include "cache.h"
+
+#include "main.h"
+
+extern "C"
+{
+
+ KDE_EXPORT KCModule *create_cookie(QWidget *parent, const char /**name*/)
+ {
+ return new KCookiesMain(parent);
+ }
+
+ KDE_EXPORT KCModule *create_smb(QWidget *parent, const char /**name*/)
+ {
+ return new SMBRoOptions(parent);
+ }
+
+ KDE_EXPORT KCModule *create_useragent(QWidget *parent, const char /**name*/)
+ {
+ return new UserAgentDlg(parent);
+ }
+
+ KDE_EXPORT KCModule *create_proxy(QWidget *parent, const char /**name*/)
+ {
+ return new KProxyOptions(parent);
+ }
+
+ KDE_EXPORT KCModule *create_cache(QWidget *parent, const char /**name*/)
+ {
+ return new KCacheConfigDialog( parent );
+ }
+
+ KDE_EXPORT KCModule *create_netpref(QWidget *parent, const char /**name*/)
+ {
+ return new KIOPreferences(parent);
+ }
+
+ KDE_EXPORT KCModule *create_lanbrowser(QWidget *parent, const char *)
+ {
+ return new LanBrowser(parent);
+ }
+
+}
+
+LanBrowser::LanBrowser(QWidget *parent)
+:KCModule(parent,"kcmkio")
+,layout(this)
+,tabs(this)
+{
+ setQuickHelp( i18n("<h1>Local Network Browsing</h1>Here you setup your "
+ "<b>\"Network Neighborhood\"</b>. You "
+ "can use either the LISa daemon and the lan:/ ioslave, or the "
+ "ResLISa daemon and the rlan:/ ioslave.<br><br>"
+ "About the <b>LAN ioslave</b> configuration:<br> If you select it, the "
+ "ioslave, <i>if available</i>, will check whether the host "
+ "supports this service when you open this host. Please note "
+ "that paranoid people might consider even this to be an attack.<br>"
+ "<i>Always</i> means that you will always see the links for the "
+ "services, regardless of whether they are actually offered by the host. "
+ "<i>Never</i> means that you will never have the links to the services. "
+ "In both cases you will not contact the host, so nobody will ever regard "
+ "you as an attacker.<br><br>More information about <b>LISa</b> "
+ "can be found at <a href=\"http://lisa-home.sourceforge.net\">"
+ "the LISa Homepage</a> or contact Alexander Neundorf "
+ "&lt;<a href=\"mailto:neundorf@kde.org\">neundorf@kde.org</a>&gt;."));
+
+ layout.addWidget(&tabs);
+
+ smbPage = create_smb(&tabs, 0);
+ tabs.addTab(smbPage, i18n("&Windows Shares"));
+ connect(smbPage,SIGNAL(changed(bool)), SLOT( changed() ));
+
+ lisaPage = KCModuleLoader::loadModule("kcmlisa", KCModuleLoader::None, &tabs);
+ if (lisaPage)
+ {
+ tabs.addTab(lisaPage,i18n("&LISa Daemon"));
+ connect(lisaPage,SIGNAL(changed()), SLOT( changed() ));
+ }
+
+// resLisaPage = KCModuleLoader::loadModule("kcmreslisa", &tabs);
+// if (resLisaPage)
+// {
+// tabs.addTab(resLisaPage,i18n("R&esLISa Daemon"));
+// connect(resLisaPage,SIGNAL(changed()), SLOT( changed() ));
+// }
+
+ kioLanPage = KCModuleLoader::loadModule("kcmkiolan", KCModuleLoader::None, &tabs);
+ if (kioLanPage)
+ {
+ tabs.addTab(kioLanPage,i18n("lan:/ Iosla&ve"));
+ connect(kioLanPage,SIGNAL(changed()), SLOT( changed() ));
+ }
+
+ setButtons(Apply|Help);
+ load();
+}
+
+void LanBrowser::load()
+{
+ smbPage->load();
+ if (lisaPage)
+ lisaPage->load();
+// if (resLisaPage)
+// resLisaPage->load();
+ if (kioLanPage)
+ kioLanPage->load();
+ emit changed(false);
+}
+
+void LanBrowser::save()
+{
+ smbPage->save();
+// if (resLisaPage)
+// resLisaPage->save();
+ if (kioLanPage)
+ kioLanPage->save();
+ if (lisaPage)
+ lisaPage->save();
+ emit changed(false);
+}
+
+#include "main.moc"
+
diff --git a/kcontrol/kio/main.h b/kcontrol/kio/main.h
new file mode 100644
index 000000000..d2499c5e4
--- /dev/null
+++ b/kcontrol/kio/main.h
@@ -0,0 +1,46 @@
+/*
+ * main.cpp for lisa,reslisa,kio_lan and kio_rlan kcm module
+ *
+ * Copyright (C) 2000 Alexander Neundorf <neundorf@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef MYMAIN_H
+#define MYMAIN_H
+
+#include <kcmodule.h>
+#include <kglobal.h>
+
+class QTabWidget;
+
+class LanBrowser:public KCModule
+{
+ Q_OBJECT
+ public:
+ LanBrowser(QWidget *parent=0);
+ virtual void load();
+ virtual void save();
+
+ private:
+ QVBoxLayout layout;
+ QTabWidget tabs;
+ KCModule *smbPage;
+ KCModule *lisaPage;
+// KCModule *resLisaPage;
+ KCModule *kioLanPage;
+};
+#endif
+
diff --git a/kcontrol/kio/manualproxy_ui.ui b/kcontrol/kio/manualproxy_ui.ui
new file mode 100644
index 000000000..1c8ef8634
--- /dev/null
+++ b/kcontrol/kio/manualproxy_ui.ui
@@ -0,0 +1,317 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>ManualProxyDlgUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ManualProxyDlgUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>489</width>
+ <height>438</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>gbServers</cstring>
+ </property>
+ <property name="title">
+ <string>Ser&amp;vers</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>lbFtp</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;FTP:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leFtp</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>lbHttps</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>HTTP&amp;S:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leHttps</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>lbHttp</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>H&amp;TTP:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leHttp</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>leHttp</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter the address of the HTTP proxy server.</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>leHttps</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter the address of the HTTPS proxy server.</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>leFtp</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter the address of the FTP proxy server.</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox" row="2" column="2">
+ <property name="name">
+ <cstring>sbFtp</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65536</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter the port number of the FTP proxy server. Default 8080. Another common value is 3128.</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox" row="1" column="2">
+ <property name="name">
+ <cstring>sbHttps</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65536</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter the port number of the HTTP proxy server. Default is 8080. Another common value is 3128.</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox" row="0" column="2">
+ <property name="name">
+ <cstring>sbHttp</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>65536</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter the port number of the HTTP proxy server. Default is 8080. Another common value is 3128.</string>
+ </property>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>51</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="3" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>cbSameProxy</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use the same proxy server for all protocols</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="3">
+ <property name="name">
+ <cstring>pbCopyDown</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>gbExceptions</cstring>
+ </property>
+ <property name="title">
+ <string>E&amp;xceptions</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbReverseProxy</cstring>
+ </property>
+ <property name="text">
+ <string>Use proxy only for entries in this list</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Reverse the use of the exception list. Checking this box will result in the proxy servers being used only when the requested URL matches one of the addresses listed here.&lt;p&gt;This feature is useful if all you want or need is to use a proxy server for a few specific sites.&lt;p&gt;If you have more complex requirements you might want to use a configuration script.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>pbDeleteAll</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>D&amp;elete All</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Remove all proxy exception addresses from the list.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>pbDelete</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>De&amp;lete</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Remove the selected proxy exception address from the list.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>pbNew</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Add new proxy exception address to the list.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>pbChange</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>C&amp;hange...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Change the selected proxy exception address.</string>
+ </property>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>114</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KListBox" row="0" column="0" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>lbExceptions</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>leHttp</tabstop>
+ <tabstop>sbHttp</tabstop>
+ <tabstop>leHttps</tabstop>
+ <tabstop>sbHttps</tabstop>
+ <tabstop>leFtp</tabstop>
+ <tabstop>sbFtp</tabstop>
+ <tabstop>cbSameProxy</tabstop>
+ <tabstop>pbCopyDown</tabstop>
+ <tabstop>cbReverseProxy</tabstop>
+ <tabstop>pbNew</tabstop>
+ <tabstop>pbChange</tabstop>
+ <tabstop>pbDelete</tabstop>
+ <tabstop>pbDeleteAll</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kcontrol/kio/netpref.cpp b/kcontrol/kio/netpref.cpp
new file mode 100644
index 000000000..6aa20c4e7
--- /dev/null
+++ b/kcontrol/kio/netpref.cpp
@@ -0,0 +1,138 @@
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qwhatsthis.h>
+#include <qvgroupbox.h>
+
+#include <kio/ioslave_defaults.h>
+#include <knuminput.h>
+#include <klocale.h>
+#include <kdialog.h>
+#include <kconfig.h>
+
+#include "ksaveioconfig.h"
+#include "netpref.h"
+
+#define MAX_TIMEOUT_VALUE 3600
+
+KIOPreferences::KIOPreferences( QWidget* parent )
+ :KCModule( parent, "kcmkio" )
+{
+ QVBoxLayout* mainLayout = new QVBoxLayout( this, 0,
+ KDialog::spacingHint() );
+ gb_Timeout = new QVGroupBox( i18n("Timeout Values"), this, "gb_Timeout" );
+ QWhatsThis::add( gb_Timeout, i18n("Here you can set timeout values. "
+ "You might want to tweak them if your "
+ "connection is very slow. The maximum "
+ "allowed value is %1 seconds.").arg(MAX_TIMEOUT_VALUE));
+ mainLayout->addWidget( gb_Timeout );
+
+ sb_socketRead = new KIntNumInput( gb_Timeout, "sb_socketRead" );
+ sb_socketRead->setSuffix( i18n( " sec" ) );
+ sb_socketRead->setLabel( i18n( "Soc&ket read:" ), AlignVCenter);
+ connect(sb_socketRead, SIGNAL(valueChanged ( int )),
+ this, SLOT(configChanged()));
+
+ sb_proxyConnect = new KIntNumInput( sb_socketRead, 0, gb_Timeout,
+ 10, "sb_proxyConnect" );
+ sb_proxyConnect->setSuffix( i18n( " sec" ) );
+ sb_proxyConnect->setLabel( i18n( "Pro&xy connect:" ), AlignVCenter);
+ connect(sb_proxyConnect, SIGNAL(valueChanged ( int )),
+ this, SLOT(configChanged()));
+
+ sb_serverConnect = new KIntNumInput( sb_proxyConnect, 0, gb_Timeout,
+ 10, "sb_serverConnect" );
+ sb_serverConnect->setSuffix( i18n( " sec" ) );
+ sb_serverConnect->setLabel( i18n("Server co&nnect:"), AlignVCenter);
+ connect(sb_serverConnect, SIGNAL(valueChanged ( int )),
+ this, SLOT(configChanged()));
+
+ sb_serverResponse = new KIntNumInput( sb_serverConnect, 0, gb_Timeout,
+ 10, "sb_serverResponse" );
+ sb_serverResponse->setSuffix( i18n( " sec" ) );
+ sb_serverResponse->setLabel( i18n("&Server response:"), AlignVCenter);
+ connect(sb_serverResponse, SIGNAL(valueChanged ( int )),
+ this, SLOT(configChanged()));
+
+ gb_Ftp = new QVGroupBox( i18n( "FTP Options" ), this, "gb_Ftp" );
+ cb_ftpEnablePasv = new QCheckBox( i18n( "Enable passive &mode (PASV)" ), gb_Ftp );
+ QWhatsThis::add(cb_ftpEnablePasv, i18n( "Enables FTP's \"passive\" mode. This is required to allow FTP to work from behind firewalls." ));
+ cb_ftpMarkPartial = new QCheckBox( i18n( "Mark &partially uploaded files" ), gb_Ftp );
+ QWhatsThis::add(cb_ftpMarkPartial, i18n( "<p>Marks partially uploaded FTP files.</p>"
+ "<p>When this option is enabled, partially uploaded files "
+ "will have a \".part\" extension. This extension will be removed "
+ "once the transfer is complete.</p>"));
+
+ mainLayout->addWidget( gb_Ftp );
+
+ connect(cb_ftpEnablePasv, SIGNAL(toggled(bool)), SLOT(configChanged()));
+ connect(cb_ftpMarkPartial, SIGNAL(toggled(bool)), SLOT(configChanged()));
+
+ mainLayout->addStretch();
+
+ load();
+}
+
+KIOPreferences::~KIOPreferences()
+{
+}
+
+void KIOPreferences::load()
+{
+ KProtocolManager proto;
+
+ sb_socketRead->setRange( MIN_TIMEOUT_VALUE, MAX_TIMEOUT_VALUE );
+ sb_serverResponse->setRange( MIN_TIMEOUT_VALUE, MAX_TIMEOUT_VALUE );
+ sb_serverConnect->setRange( MIN_TIMEOUT_VALUE, MAX_TIMEOUT_VALUE );
+ sb_proxyConnect->setRange( MIN_TIMEOUT_VALUE, MAX_TIMEOUT_VALUE );
+
+ sb_socketRead->setValue( proto.readTimeout() );
+ sb_serverResponse->setValue( proto.responseTimeout() );
+ sb_serverConnect->setValue( proto.connectTimeout() );
+ sb_proxyConnect->setValue( proto.proxyConnectTimeout() );
+
+ KConfig config( "kio_ftprc", true, false );
+ cb_ftpEnablePasv->setChecked( !config.readBoolEntry( "DisablePassiveMode", false ) );
+ cb_ftpMarkPartial->setChecked( config.readBoolEntry( "MarkPartial", true ) );
+ emit changed( false );
+}
+
+void KIOPreferences::save()
+{
+ KSaveIOConfig::setReadTimeout( sb_socketRead->value() );
+ KSaveIOConfig::setResponseTimeout( sb_serverResponse->value() );
+ KSaveIOConfig::setConnectTimeout( sb_serverConnect->value() );
+ KSaveIOConfig::setProxyConnectTimeout( sb_proxyConnect->value() );
+
+ KConfig config( "kio_ftprc", false, false );
+ config.writeEntry( "DisablePassiveMode", !cb_ftpEnablePasv->isChecked() );
+ config.writeEntry( "MarkPartial", cb_ftpMarkPartial->isChecked() );
+ config.sync();
+
+ KSaveIOConfig::updateRunningIOSlaves (this);
+
+ emit changed( false );
+}
+
+void KIOPreferences::defaults()
+{
+ sb_socketRead->setValue( DEFAULT_READ_TIMEOUT );
+ sb_serverResponse->setValue( DEFAULT_RESPONSE_TIMEOUT );
+ sb_serverConnect->setValue( DEFAULT_CONNECT_TIMEOUT );
+ sb_proxyConnect->setValue( DEFAULT_PROXY_CONNECT_TIMEOUT );
+
+ cb_ftpEnablePasv->setChecked( true );
+ cb_ftpMarkPartial->setChecked( true );
+
+ emit changed(true);
+}
+
+QString KIOPreferences::quickHelp() const
+{
+ return i18n("<h1>Network Preferences</h1>Here you can define"
+ " the behavior of KDE programs when using Internet"
+ " and network connections. If you experience timeouts"
+ " or use a modem to connect to the Internet, you might"
+ " want to adjust these settings." );
+}
+
+#include "netpref.moc"
diff --git a/kcontrol/kio/netpref.desktop b/kcontrol/kio/netpref.desktop
new file mode 100644
index 000000000..43349e926
--- /dev/null
+++ b/kcontrol/kio/netpref.desktop
@@ -0,0 +1,205 @@
+[Desktop Entry]
+Comment=Configure generic network preferences, like timeout values
+Comment[af]=Konfigureer generies netwerk voorkeure, hou van tydverstreke waardes
+Comment[ar]=إعداد تفضيلات الشبكة العامة، مثل قيم فترات الإنتظار
+Comment[az]=Ümumi şəbəkə qurğuları, məsələn vaxt dolması kimi
+Comment[be]=Настаўленні агульных уласцівасцяў сеткі, напр., тэрмінаў чакання
+Comment[bg]=Настройване на общите мрежови параметри
+Comment[bn]=বিবিধ নেটওয়ার্ক সেটিংস কনফিগারেশন, যথা টাইম-আউট মানসমূহ
+Comment[bs]=Podešavanje općih mrežnih postavki kao što su timeout vrijednosti
+Comment[ca]=Configuració de les preferències genèriques de la xarxa, com ara els valors per als temps d'expiració
+Comment[cs]=Nastavení obecných parametrů sítě, např. časových limitů
+Comment[csb]=Kònfigùracëjô sécoëch nastôwów jakno np. limitu czasu
+Comment[cy]=Ffurfweddu dewisiadau rhwydwaith generig, fel gwerthoedd goramser
+Comment[da]=Indstil generelle netværksvalg såsom timeout-værdier
+Comment[de]=Einfache Netzwerkeinstellungen vornehmen wie z. B. Zeitüberschreitungen
+Comment[el]=Ρύθμιση γενικών προτιμήσεων δικτύου, όπως τιμές χρονικών ορίων
+Comment[eo]=Ĝeneralaj retopcioj, kiel tempolimoj ktp.
+Comment[es]=Configuración de las preferencias genéricas de red, como los tiempos de desconexión
+Comment[et]=Üldised võrguseadistused
+Comment[eu]=Konfiguratu sarerako hobespen orokorrak (denbora-muga balioak, besteak beste)
+Comment[fa]=پیکربندی تنظیمات شبکۀ محلی، مانند مقادیر اتمام‌ وقت
+Comment[fi]=Muokkaa yleisiä verkkoasetuksia kuten aikakatkaisuarvoja
+Comment[fr]=Configuration générique du réseau, comme par exemple les valeurs des délais d'attente
+Comment[fy]=ynstelle fan algemiene netwurkfoarkar, sa as tiidslimytwearden
+Comment[gl]=Configurar as preferéncias xenéricas de rede, como os valores de agarda
+Comment[he]=שינוי הגדרות רשת כלליות כגון ערכי זמנים מוקצבים
+Comment[hi]=जेनेरिक नेटवर्क प्राथमिकताएँ, जैसे टाइम-आउट मूल्य- कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje generičkih mrežnih vrijednosti, poput vremena prekoračenja
+Comment[hu]=A hálózati paraméterek, például a várakozási idők beállítása
+Comment[is]=Tilgreina almennar netstillingar, t.d. hámarkstíma
+Comment[it]=Configura le preferenze di rete generiche, come ad esempio i tempi massimi
+Comment[ja]=タイムアウト値などの一般的なネットワーク設定
+Comment[ka]=ქსელის ზოგადი პარამეტრები, ისეთი როგორიცაა ტაიმაუტი
+Comment[kk]=Күту уақыты секілді желінің негізгі параметрлерін баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ចំណង់​ចំណូល​ចិត្ត​បណ្ដាញ​ទូទៅ ដូចជា​តម្លៃ​អស់​ពេល​ជាដើម
+Comment[ko]=제한 시간 값 같이 일반 네트워크에서 기본이 되는 값을 설정합니다
+Comment[lo]=ປັບແຕ່ງຄ່າທົ່ວໄປການລະບົບເຄືອຂ່າຍ ເຊັ່ນຄ່າການໃຊ້ເວລາເປັນຕົ້ນ
+Comment[lt]=Konfigūruoti bendrus tinklo pasirinkimus, tokius, kaip laiko limitai
+Comment[lv]=Konfigurē vispārējus tīkla uzstādījumus, kā noildzes vērtības
+Comment[mk]=Конфигурирајте ги општите мрежни параметри, како тајмаут вредности
+Comment[mn]=Ерөнхий сүлжээ-Тохируулга тохируулах Ж.нь.Хугацаа хэтрэлтийн хугацаа
+Comment[ms]=Konfigur keutamaan rangkaian generik, seperti nilai waktu rehat
+Comment[mt]=Hawn tista' tagħżel preferenzi ġeneriċi tan-network, bħal ħinijiet ta' stennija
+Comment[nb]=Angi generelle nettverksinnstillinger, f.eks. verdier for tidsavbrudd
+Comment[nds]=Standard-Nettwarkinstellen, as t.B. Tietgrenzen
+Comment[ne]=समय समाप्ति मान जस्तै जेनेरिक सञ्जाल प्राथमिकता कन्फिगर गर्नुहोस्
+Comment[nl]=Instellen van algemene netwerkvoorkeuren, zoals tijdslimietwaarden
+Comment[nn]=Oppsett av generelle nettverksinnstillingar, som til dømes tidsgrenser
+Comment[nso]=Beakanya dikganyogo tsa kgokagano ya kakaretso, goswana le maboleng a phelelo ya nako
+Comment[pa]=ਨੈੱਟਵਰਕ ਪਸੰਦ ਸੰਰਚਨਾ, ਜਿਵੇਂ ਸਮਾਂ-ਸੀਮਾ ਮੁੱਲ
+Comment[pl]=Konfiguracja niskopoziomowych ustawień sieciowych np. limitu czasu
+Comment[pt]=Configuração das opções gerais da rede, p.ex. tempos-limite
+Comment[pt_BR]=Configurar preferências genéricas para rede tais como valores de tempo limite
+Comment[ro]=Configurează opțiuni de rețea precum valorile temporizărilor
+Comment[ru]=Общие свойства сети, такие как значения времени ожидания
+Comment[rw]=Kuboneza ibijyanye n'urusobemiyoboro rusange, nk'uduciro tw'igihecyarenze
+Comment[se]=Oppalaš fierbmeoidimat, nugo áigemearit
+Comment[sk]=Nastavenie všeobecných parametrov siete, napr. dôb čakania
+Comment[sl]=Nastavljanje splošnih nastavitev omrežja kot na primer vrednosti zakasnitev
+Comment[sr]=Подешавања генеричких параметара мреже, као што је прекорачење времена...
+Comment[sr@Latn]=Podešavanja generičkih parametara mreže, kao što je prekoračenje vremena...
+Comment[sv]=Anpassa allmänna nätverksinställningar, som tidsgränser
+Comment[ta]=பிறப்பு வலைதள சலுகைகள், நேரமுடிவு மதிப்பு ஆகியவற்றை வடிவமை
+Comment[tg]= Хусусиятҳои шабакаи монанди мӯҳлати вақт, дар инҷо танзим кунед
+Comment[th]=ปรับแต่งค่าระบบเครือข่ายทั่วไป เช่น ค่าการใช้เวลา เป็นต้น
+Comment[tr]=Genel ağ tercihlerini yapılandır, zaman aşımı değerleri gibi
+Comment[tt]=Çeltärneñ töp köyläwläre; kötterü arası kebek.
+Comment[uk]=Налаштування загальних параметрів мережі, таких як значення тайм-аутів
+Comment[uz]=Taymaut qiymatiga oʻxshagan tarmoq parametrlarni moslash
+Comment[uz@cyrillic]=Таймаут қийматига ўхшаган тармоқ параметрларни мослаш
+Comment[ven]=Khonifigarani thodea dza vhukwamani sa tshifhinga tsho fhelaho
+Comment[vi]=Cấu hình mạng nói chung ví dụ như giới hạn thời gian
+Comment[wa]=Apontiaedje des preferinces rantoele djenerikes, come les valixhances di timeout
+Comment[xh]=Qwalasela iinketho zomsebenzi womnatha ka wonke-wonke, njengamaxabiso ophelelo lwexesha
+Comment[zh_CN]=配置通用网络首选项,例如超时值
+Comment[zh_TW]=設定一般網路喜好設定,例如逾時值
+Comment[zu]=Hlanganisela okuncanyelwa uwonkewonke koxhumano olusazekile, njengamanani esikhathi sokuphuma
+Exec=kcmshell netpref
+Icon=network
+Keywords=timeout,iopref,netpref,network preferences,ftp
+Keywords[be]=Тэрмін чакання,Уласцівасці сеткі,timeout,iopref,netpref,network preferences,ftp
+Keywords[bg]=просрочка, време, времето, пауза, прекъсване, връзка, timeout, iopref, netpref, network preferences, ftp
+Keywords[bs]=timeout,iopref,netpref,network preferences,ftp,mreža
+Keywords[ca]=temps d'expiració,iopref,netpref,preferències de la xarxa,ftp
+Keywords[cs]=časový limit,iopref,netpref,nastavení sítě,ftp
+Keywords[csb]=limit czasu, sécowé nastôwë,séc,nastôw wé/wi,ftp
+Keywords[da]=timeout,udløb,ioindst,netindst,netværksindstillinger,ftp
+Keywords[de]=Zeitlimit,Netzwerkeinstellungen,Ein-/Ausgabemodul-Einstellungen
+Keywords[el]=χρονικό όριο,iopref,netpref,προτιμήσεις δικτύου,ftp
+Keywords[eo]=tempolimo,enel-preferaĵoj,reto,retpreferaĵoj,ftp
+Keywords[es]=timeout,iopref,netpref,red preferencias,ftp
+Keywords[et]=taimaut,aegumine,võrgu seadistused,ftp
+Keywords[eu]=denbora-muga,iopref,netpref,sareko hobespenak, ftp
+Keywords[fa]=اتمام وقت، iopref، تنظیمات شبکه، قاپ
+Keywords[fr]=délai,configuration du réseau,réseau,entrées/sorties,ftp
+Keywords[fy]=timeout,iopref,netpref,netwurkfoarkar,tiidslimyt,ftp
+Keywords[gl]=timeout,iopref,netpref,preferéncias de rede, ftp
+Keywords[he]=זמן מוקצב,iopref,netpref,העדפות רשת, timeout,iopref,netpref,network preferences,ftp
+Keywords[hr]=timeout,prekoračenje vremena,iopref,netpref,network preferences,postavke mreže,ftp
+Keywords[hu]=várakozási idő,iopref,netpref,hálózati beállítások,ftp
+Keywords[is]=hámarkstími,iopref,netpref,netstillingar,ftp
+Keywords[it]=tempo massimo,timeout,iopref,netpref,rete,preferenze di rete,ftp
+Keywords[ja]=タイムアウト, iopref, netpref, ネットワーク設定, ftp
+Keywords[km]=អស់​ពេល,iopref,netpref,ចំណង់ចំណូល​ចិត្ត​បណ្ដាញ,ftp
+Keywords[lt]=timeout,iopref,netpref,network preferences,ftp,laiko limitas, tinklo pasirinkimai
+Keywords[mk]=timeout,iopref,netpref,network preferences,ftp,тајмаут,мрежни параметри
+Keywords[nb]=avbruddsverdi,I/U-innstillinger,nettverk,nettverksinnstillinger,ftp
+Keywords[nds]=timeout,iopref,netpref,Nettwarkinstellen,ftp,Tietgrenz,aflopen
+Keywords[ne]=समय समाप्त, iopref, netpref, सञ्जाल प्राथमिकता, ftp
+Keywords[nl]=timeout,iopref,netpref,netwerkvoorkeuren,tijdslimiet,ftp
+Keywords[nn]=tidsgrense,IU-oppsett,nettverksinnstillingar,nettverk,nettverksoppsett,ftp
+Keywords[pl]=limit czasu, ustawienia sieciowe,sieć,ustawienia we/wy,ftp
+Keywords[pt]=tempo limite,iopref,netpref,configuração da rede,ftp
+Keywords[pt_BR]=tempo limite,iopref,netpref,preferências de rede,ftp,configurações de rede
+Keywords[ro]=temporizare,iopref,netpref,preferințe de rețea,ftp
+Keywords[rw]= Igihecyarenze,iopref,netpref,ibijyana n'urusobemiyoboro,ftp
+Keywords[sl]=iztek,zakasnitev,iopref,netpref,nastavitve omrežja,ftp
+Keywords[sv]=tidsgräns,io-inställning,nät-inställning,nätverksinställningar,FTP
+Keywords[ta]=நேரம் முடிந்தது,iopref,netpref,வலைதளம் சலுகைகள்,ftp
+Keywords[th]=หมดเวลา,iopref,netpref,ปรับแต่งระบบเครือข่าย,ftp
+Keywords[tr]=zaman aşımı,ağ tercihleri,iopref,netpref,ftp
+Keywords[uk]=тайм-аут,iopref,netpref,параметри мережі,ftp
+Keywords[uz]=taymaut,iopref,netpref,tarmoq parametrlari,ftp
+Keywords[uz@cyrillic]=таймаут,iopref,netpref,тармоқ параметрлари,ftp
+Keywords[vi]=giới hạn thời gian,iopref,netpref,tuỳ chọn mạng
+Keywords[wa]=timeout,iopref,netpref,preferinces rantoele,ftp
+Keywords[zh_CN]=timeout,iopref,netpref,network preferences,超时,网络首选项,ftp
+Keywords[zh_TW]=timeout,iopref,netpref,network preferences,ftp,作業逾時,網路喜好設定
+Name=Connection Preferences
+Name[af]=Koppeling Voorkeure
+Name[ar]=تفضيلات الإتصال
+Name[be]=Уласцівасці злучэнняў
+Name[bg]=Настройване на връзката
+Name[bn]=যোগাযোগ পছন্দসমূহ
+Name[br]=Kefluniadur ar gevreadenn
+Name[bs]=Postavke konekcije
+Name[ca]=Preferències de connexió
+Name[cs]=Nastavení připojení
+Name[csb]=Kònfigùracëjô sparłãczeniów
+Name[da]=Indstillinger af forbindelse
+Name[de]=Verbindungseinstellungen
+Name[el]=Προτιμήσεις σύνδεσης
+Name[eo]=Konektaj Agordoj
+Name[es]=Preferencias de conexión
+Name[et]=Ühenduse seadistused
+Name[eu]=Konexio hobespenak
+Name[fa]=تنظیمات اتصال
+Name[fi]=Asetukset
+Name[fr]=Préférences de connexion
+Name[fy]=Ferbiningfoarkar
+Name[ga]=Sainroghanna Naisc
+Name[gl]=Preferéncias da Conexón
+Name[he]=העדפות חיבור
+Name[hi]=कनेक्शन वरीयताएँ
+Name[hr]=Postavke povezivanja
+Name[hu]=Hálózati paraméterek
+Name[is]=Stillingar tenginga
+Name[it]=Preferenze sulle connessioni
+Name[ja]=接続設定
+Name[ka]=კავშირის თვისებები
+Name[kk]=Қосылым параметрлері
+Name[km]=ចំណង់ចំណូល​ចិត្ត​ការ​តភ្ជាប់
+Name[ko]=연결 설정
+Name[lt]=Prisijungimo pasirinkimai
+Name[lv]=Savienojumu parametri
+Name[mk]=Параметри на поврзувањето
+Name[ms]=Keutamaan Sambungan
+Name[nb]=Forbindelsesinnstillinger
+Name[nds]=Instellen för de Verbinnen
+Name[ne]=जडान प्राथमिकता
+Name[nl]=Verbindingsvoorkeuren
+Name[nn]=Innstillingar for samband
+Name[pa]=ਕੁਨੈਕਸ਼ਨ ਪਸੰਦ
+Name[pl]=Konfiguracja połączeń
+Name[pt]=Preferências da Ligação
+Name[pt_BR]=Configurações de Conexão
+Name[ro]=Preferințe conexiune
+Name[ru]=Свойства соединения
+Name[rw]=Ibijyanye n'Ukwihuza
+Name[se]=Oktavuohta oidimat
+Name[sk]=Preferencie pripojenia
+Name[sl]=Lastnosti povezave
+Name[sr]=Подешавања повезивања
+Name[sr@Latn]=Podešavanja povezivanja
+Name[sv]=Anslutningsinställningar
+Name[ta]=இணைப்பு முன்னுரிமைகள்
+Name[tg]=Хусусиятҳои алоқа
+Name[th]=ค่าที่ชอบสำหรับการเชื่อมต่อ
+Name[tr]=Bağlantı Tercihleri
+Name[tt]=Totaşu Caylawları
+Name[uk]=Параметри з'єднання
+Name[uz]=Aloqa parametrlari
+Name[uz@cyrillic]=Алоқа параметрлари
+Name[vi]=Tuỳ chọn trong Nối mạng
+Name[wa]=Preferinces di raloyaedje
+Name[zh_CN]=连接首选项
+Name[zh_TW]=連線偏好設定
+Type=Application
+DocPath=kcontrol/netpref/index.html
+X-KDE-FactoryName=netpref
+X-KDE-Library=kio
+
+X-KDE-ParentApp=kcontrol
+
+Categories=Qt;KDE;X-KDE-settings-network;
diff --git a/kcontrol/kio/netpref.h b/kcontrol/kio/netpref.h
new file mode 100644
index 000000000..2e269d4cd
--- /dev/null
+++ b/kcontrol/kio/netpref.h
@@ -0,0 +1,44 @@
+#ifndef KIOPREFERENCES_H
+#define KIOPREFERENCES_H
+
+#include <kcmodule.h>
+
+class QLabel;
+class QVGroupBox;
+class QCheckBox;
+class QVBoxLayout;
+class QHBoxLayout;
+class QGridLayout;
+
+class KIntNumInput;
+
+class KIOPreferences : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KIOPreferences( QWidget* parent = 0);
+ ~KIOPreferences();
+
+ void load();
+ void save();
+ void defaults();
+
+ QString quickHelp() const;
+
+protected slots:
+ void configChanged() { emit changed(true); }
+
+private:
+ QVGroupBox* gb_Ftp;
+ QVGroupBox* gb_Timeout;
+ QCheckBox* cb_ftpEnablePasv;
+ QCheckBox* cb_ftpMarkPartial;
+
+ KIntNumInput* sb_socketRead;
+ KIntNumInput* sb_proxyConnect;
+ KIntNumInput* sb_serverConnect;
+ KIntNumInput* sb_serverResponse;
+};
+
+#endif // KIOPREFERENCES_H
diff --git a/kcontrol/kio/policydlg.cpp b/kcontrol/kio/policydlg.cpp
new file mode 100644
index 000000000..8e59c4bb0
--- /dev/null
+++ b/kcontrol/kio/policydlg.cpp
@@ -0,0 +1,107 @@
+/**
+ * Copyright (c) 2000- Dawit Alemayehu <adawit@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <qpushbutton.h>
+#include <qwhatsthis.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qvalidator.h>
+
+#include <klineedit.h>
+#include <kcombobox.h>
+#include <klocale.h>
+
+#include "policydlg.h"
+#include "policydlg_ui.h"
+
+
+class DomainLineValidator : public QValidator
+{
+public:
+ DomainLineValidator(QObject *parent)
+ :QValidator(parent, "domainValidator")
+ {
+ }
+
+ State validate(QString &input, int &) const
+ {
+ if (input.isEmpty() || (input == "."))
+ return Intermediate;
+
+ int length = input.length();
+
+ for(int i = 0 ; i < length; i++)
+ {
+ if (!input[i].isLetterOrNumber() && input[i] != '.' && input[i] != '-')
+ return Invalid;
+ }
+
+ return Acceptable;
+ }
+};
+
+
+PolicyDlg::PolicyDlg (const QString& caption, QWidget *parent,
+ const char *name)
+ : KDialogBase(parent, name, true, caption, Ok|Cancel, Ok, true)
+{
+ m_dlgUI = new PolicyDlgUI (this);
+ setMainWidget(m_dlgUI);
+
+ m_dlgUI->leDomain->setValidator(new DomainLineValidator(m_dlgUI->leDomain));
+ m_dlgUI->cbPolicy->setMinimumWidth( m_dlgUI->cbPolicy->fontMetrics().maxWidth() * 25 );
+
+ enableButtonOK( false );
+ connect(m_dlgUI->leDomain, SIGNAL(textChanged(const QString&)),
+ SLOT(slotTextChanged(const QString&)));
+
+ setFixedSize (sizeHint());
+ m_dlgUI->leDomain->setFocus ();
+}
+
+void PolicyDlg::setEnableHostEdit( bool state, const QString& host )
+{
+ if ( !host.isEmpty() )
+ m_dlgUI->leDomain->setText( host );
+ m_dlgUI->leDomain->setEnabled( state );
+}
+
+void PolicyDlg::setPolicy (int policy)
+{
+ if ( policy > -1 && policy <= static_cast<int>(m_dlgUI->cbPolicy->count()) )
+ m_dlgUI->cbPolicy->setCurrentItem(policy-1);
+
+ if ( !m_dlgUI->leDomain->isEnabled() )
+ m_dlgUI->cbPolicy->setFocus();
+}
+
+int PolicyDlg::advice () const
+{
+ return m_dlgUI->cbPolicy->currentItem() + 1;
+}
+
+QString PolicyDlg::domain () const
+{
+ return m_dlgUI->leDomain->text();
+}
+
+void PolicyDlg::slotTextChanged( const QString& text )
+{
+ enableButtonOK( text.length() > 1 );
+}
+#include "policydlg.moc"
diff --git a/kcontrol/kio/policydlg.h b/kcontrol/kio/policydlg.h
new file mode 100644
index 000000000..dcdca5136
--- /dev/null
+++ b/kcontrol/kio/policydlg.h
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2000- Dawit Alemayehu <adawit@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _POLICYDLG_H
+#define _POLICYDLG_H
+
+#include <qstring.h>
+
+#include <kdialogbase.h>
+
+
+class QPushButton;
+class PolicyDlgUI;
+
+class KCookieAdvice
+{
+public:
+ enum Value {Dunno=0, Accept, Reject, Ask};
+
+ static const char * adviceToStr (const int& advice)
+ {
+ switch (advice)
+ {
+ case KCookieAdvice::Accept:
+ return I18N_NOOP("Accept");
+ case KCookieAdvice::Reject:
+ return I18N_NOOP("Reject");
+ case KCookieAdvice::Ask:
+ return I18N_NOOP("Ask");
+ default:
+ return I18N_NOOP("Dunno");
+ }
+ }
+
+ static KCookieAdvice::Value strToAdvice (const QString& advice)
+ {
+ if (advice.isEmpty())
+ return KCookieAdvice::Dunno;
+
+ if (advice.find (QString::fromLatin1("accept"), 0, false) == 0)
+ return KCookieAdvice::Accept;
+ else if (advice.find (QString::fromLatin1("reject"), 0, false) == 0)
+ return KCookieAdvice::Reject;
+ else if (advice.find (QString::fromLatin1("ask"), 0, false) == 0)
+ return KCookieAdvice::Ask;
+
+ return KCookieAdvice::Dunno;
+ }
+};
+
+class PolicyDlg : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ PolicyDlg (const QString& caption, QWidget *parent = 0,
+ const char *name = 0);
+ ~PolicyDlg (){};
+
+ int advice() const;
+ QString domain() const;
+
+ void setEnableHostEdit( bool, const QString& host = QString::null );
+ void setPolicy (int policy);
+
+protected slots:
+ void slotTextChanged( const QString& );
+
+private:
+ PolicyDlgUI* m_dlgUI;
+};
+#endif
diff --git a/kcontrol/kio/policydlg_ui.ui b/kcontrol/kio/policydlg_ui.ui
new file mode 100644
index 000000000..1bae63208
--- /dev/null
+++ b/kcontrol/kio/policydlg_ui.ui
@@ -0,0 +1,106 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>PolicyDlgUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>PolicyDlgUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>291</width>
+ <height>120</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lbDomain</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Domain name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leDomain</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the host or domain to which this policy applies, e.g. &lt;b&gt;www.kde.org&lt;/b&gt; or &lt;b&gt;.kde.org&lt;/b&gt;.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>leDomain</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the host or domain to which this policy applies, e.g. &lt;b&gt;www.kde.org&lt;/b&gt; or &lt;b&gt;.kde.org&lt;/b&gt;.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lbPolicy</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Policy:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cbPolicy</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Select the desired policy:
+&lt;ul&gt;
+&lt;li&gt;&lt;b&gt;Accept&lt;/b&gt; - Allows this site to set cookies&lt;/li&gt;
+&lt;li&gt;&lt;b&gt;Reject&lt;/b&gt; - Refuse all cookies sent from this site&lt;/li&gt;
+&lt;li&gt;&lt;b&gt;Ask&lt;/b&gt; - Prompt when cookies are received from this site&lt;/li&gt;
+&lt;/ul&gt;
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <item>
+ <property name="text">
+ <string>Accept</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Reject</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Ask</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>cbPolicy</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Select the desired policy:
+&lt;ul&gt;
+&lt;li&gt;&lt;b&gt;Accept&lt;/b&gt; - Allows this site to set cookies&lt;/li&gt;
+&lt;li&gt;&lt;b&gt;Reject&lt;/b&gt; - Refuse all cookies sent from this site&lt;/li&gt;
+&lt;li&gt;&lt;b&gt;Ask&lt;/b&gt; - Prompt when cookies are received from this site&lt;/li&gt;
+&lt;/ul&gt;
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/kio/proxy.desktop b/kcontrol/kio/proxy.desktop
new file mode 100644
index 000000000..6d2773bf7
--- /dev/null
+++ b/kcontrol/kio/proxy.desktop
@@ -0,0 +1,209 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/proxy/index.html
+Icon=proxy
+Exec=kcmshell proxy
+
+
+X-KDE-Library=kio
+X-KDE-FactoryName=proxy
+X-KDE-ParentApp=kcontrol
+
+Name=Proxy
+Name[af]=Volmag
+Name[ar]=الوكيل
+Name[az]=Vəkil Verici
+Name[be]=Проксі
+Name[bg]=Прокси сървър
+Name[bn]=প্রক্সি
+Name[br]=Proksi
+Name[ca]=Intermediari
+Name[csb]=Pòstrzédnik (Proxy)
+Name[cy]=Dirprwy
+Name[el]=Διαμεσολαβητής
+Name[eo]=Prokuriloj
+Name[eu]=Proxya
+Name[fa]=پیشکار
+Name[fi]=Välityspalvelin
+Name[fr]=Serveur mandataire (proxy)
+Name[ga]=Seachfhreastalaí
+Name[he]=מתווכים
+Name[hi]=प्रॉक्सी
+Name[is]=Milliþjónn
+Name[ja]=プロキシ
+Name[ka]=პროქსი
+Name[kk]=Прокси
+Name[km]=ប្រូកស៊ី
+Name[ko]=프록시
+Name[lo]=ພຣັອກຊີ
+Name[mk]=Прокси
+Name[mn]=Итгэмжилэгч-сервер
+Name[ms]=Proksi
+Name[nb]=Mellomtjener
+Name[ne]=प्रोक्सी
+Name[nn]=Mellomtenar
+Name[nso]=Moemalegato
+Name[pa]=ਪਰਾਕਸੀ
+Name[pl]=Pośrednik (Proxy)
+Name[ru]=Прокси
+Name[rw]=Porogisi
+Name[se]=Gaskabálvá
+Name[sl]=Posrednik
+Name[sr]=Прокси
+Name[sr@Latn]=Proksi
+Name[sv]=Proxyservrar
+Name[ta]=பதிவாணை
+Name[te]=ప్రాక్సి
+Name[tg]=Прокси
+Name[th]=พร็อกซี
+Name[tr]=Vekil Sunucu
+Name[uk]=Проксі
+Name[uz]=Proksi
+Name[uz@cyrillic]=Прокси
+Name[ven]=Purokusi
+Name[xh]=Umntu onegunya lokusebenzela omnye
+Name[zh_CN]=代理
+Name[zh_TW]=代理
+Name[zu]=Umlingani
+Comment=Configure the proxy servers used
+Comment[af]=Konfigureer die volmag bedieners gebruik word
+Comment[ar]=إعداد خوادم التوكيل المستعملة
+Comment[az]=İşlədilən vəkil verici qurğuları
+Comment[be]=Настаўленні сервераў проксі
+Comment[bg]=Настройване на прокси сървъра
+Comment[bn]=ব্যবহৃত প্রক্সি সার্ভার কনফিগার করুন
+Comment[br]=Kefluniañ ar servijeroù proksi implijet
+Comment[bs]=Podesite proxy servere
+Comment[ca]=Configura els servidors intermediaris emprats
+Comment[cs]=Nastavení proxy serverů
+Comment[csb]=Kònfigùracëjô pòstrzédniczącëch serwerów (proxy)
+Comment[cy]=Ffurfweddu gweinyddion dirprwyol i'w defnyddio
+Comment[da]=Indstil de proxyservere der bruges
+Comment[de]=Proxy-Server einrichten
+Comment[el]=Ρυθμίστε τους διαμεσολαβητές που χρησιμοποιούνται
+Comment[eo]=Agordo de prokurilo
+Comment[es]=Configuración de los servidores Proxy usados
+Comment[et]=Kasutatavate proxy serverite seadistamine
+Comment[eu]=Konfiguratu erabilitako proxy zerbitzariak
+Comment[fa]=پیکربندی پیشکارهای استفاده‌شده
+Comment[fi]=Käytettävät välityspalvelimet
+Comment[fr]=Configuration des serveurs mandataires (proxy) utilisés
+Comment[fy]=Hjir kinne jo de Proxy-tsjinner ynstelle
+Comment[gl]=Configurar os servidores proxy empregados
+Comment[he]=שינוי הגדרות השרתים המתווכים שנעשה בהם שימוש
+Comment[hi]=उपयोग में प्रॉक्सी सर्वर कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje proxy poslužitelja
+Comment[hu]=A proxy kiszolgálók beállításai
+Comment[is]=Stilla milliþjóna sem á að nota
+Comment[it]=Configura il server proxy da usare
+Comment[ja]=プロキシサーバの設定
+Comment[ka]=გამოყენებული პროქსების კონფიგურაცია
+Comment[kk]=Қолданатын прокси серверлерді баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ម៉ាស៊ីន​បម្រើ​ដែល​បាន​ប្រើ
+Comment[ko]=사용할 프록시 서버 설정
+Comment[lo]=ປັບແຕ່ງເຊີບເວີພຣັອກຊີ
+Comment[lt]=Konfigūruoti naudojamus proxy serverius
+Comment[mk]=Конфигурирајте ги прокси-серверите кои се користат
+Comment[mn]=Итгэмжилэгч сервер тохируулах
+Comment[ms]=Konfigur pelayan proksi yang digunakan
+Comment[mt]=Ikkonfigura servers proxy
+Comment[nb]=Oppsett av mellomtjenere
+Comment[nds]=De bruukten Proxies instellen
+Comment[ne]=प्रयोग गरिएको प्रोक्सी सर्भर कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u de Proxy-servers instellen
+Comment[nn]=Oppsett av mellomtenarar
+Comment[nso]=Beakanya diabi tsa moemalegato tseo di somisitswego
+Comment[pa]=ਵਰਤੇ ਜਾਂਦੇ ਪਰਾਕਸੀ ਸਰਵਰਾਂ ਦੀ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja serwerów pośredniczących (proxy)
+Comment[pt]=Configurar os servidores 'proxy' usados
+Comment[pt_BR]=Configura os servidores proxy usados
+Comment[ro]=Configurează serverele proxy utilizate
+Comment[ru]=Настройка серверов прокси
+Comment[rw]=Kuboneza amaseriveri porogisi akoreshwa
+Comment[se]=Heivet gaskabálváid mat geavahuvvojit
+Comment[sk]=Nastavenie proxy serverov
+Comment[sl]=Nastavitev uporabe posredniških strežnikov
+Comment[sr]=Подешавање коришћених прокси сервера
+Comment[sr@Latn]=Podešavanje korišćenih proksi servera
+Comment[sv]=Anpassa proxyservrar som används
+Comment[ta]=பயன்படுத்தப்பட்ட பதிவாணை சேவகன்களை அமை
+Comment[tg]=Танзими коргузорҳои прокси мавриди истифода
+Comment[th]=ปรับแต่งเซิร์ฟเวอร์พร็อกซี
+Comment[tr]=Vekil sunucularını yapılandırır
+Comment[tt]=Proxy serverlären caylaw
+Comment[uk]=Налаштування проксі-сервера
+Comment[uz]=Proksi serverlarini moslash
+Comment[uz@cyrillic]=Прокси серверларини мослаш
+Comment[ven]=Dzudzanyani dzisiva dza Proxy dzo shumiswaho
+Comment[vi]=Cấu hình máy chủ proxy được sử dụng
+Comment[wa]=Apontyî les sierveus proxy d' eployîs
+Comment[xh]=Qwalasela indlela abasebenziswa ngayo abancedisi be proxy
+Comment[zh_CN]=配置所用的代理服务器
+Comment[zh_TW]=設定使用的代理伺服器
+Comment[zu]=Hlanganisela abalekeleli abangabalingani abasetshenziswayo
+Keywords=Proxy,Proxy server,Firewall,Squid,proxy
+Keywords[ar]=الوكيل,خادم التوكيل,جدار عزل النار,Squid,الوكيل
+Keywords[az]=Proksi,vəkil verici,vəkil,Firewall,firewall,Squid,Proxy,proxy,atəş divarı,atəş
+Keywords[be]=Проксі,Сервер проксі,Брандмаўэр,проксі,Proxy,Proxy server,Firewall,Squid,proxy
+Keywords[bg]=прокси, сървър, посредник, Proxy, Proxy server, Firewall, Squid, proxy
+Keywords[br]=Proksi,Server proksi,Moger-tan,Squid,proksi
+Keywords[ca]=Intermediari,Servidor intermediari,Tallafocs,Squid,intermediari
+Keywords[csb]=proxy,pòstrzédnik,pòstrzédniczącô serwera,ògniowô scana,Squid
+Keywords[cy]=Dirprwy,Gweinydd dirprwyol,Mur gwarchod,Squid,dirprwy
+Keywords[da]=Proxy,Proxyserver,Brandmur,Squid,proxy
+Keywords[el]=Διαμεσολαβητής,Διαμεσολαβητής,Firewall,Squid,διαμεσολαβητής
+Keywords[eo]=Prokurilo,Prokuro-servo,Fajroŝirmilo,Squid
+Keywords[es]=Proxy,servidor Proxy,Cortafuegos,Squid,proxy
+Keywords[et]=proxy,proxy server,tulemüür,squid
+Keywords[eu]=Proxya,Proxy zerbitzaria,Firewalla,Squid,proxya
+Keywords[fa]=پیشکار، پیشکاری، دیوارۀ آتش، Squid،پیشکار
+Keywords[fi]=Välityspalvelin,Palomuuri,Squid
+Keywords[fr]=proxy,serveur mandataire,pare-feu,squid
+Keywords[fy]=proxy,proxy tsjinner,brânmourre,squid
+Keywords[ga]=Seachfhreastalaí,Balla Dóiteáin,Squid
+Keywords[gl]=Proxy,Servidor Proxy,Cortafogos,Squid,proxy
+Keywords[he]=מתווך,שרת מתווך,Firewall,Squid, Proxy,Proxy server,Squid,proxy
+Keywords[hi]=प्रॉक्सी,प्रॉक्सी सर्वर,फायरवाल,एसक्यू-आईडी,प्रॉक्सी
+Keywords[hr]=Proxy,Proxy server,Proxy poslužitelj, Firewall,Squid,proxy,Vatrozid
+Keywords[hu]=proxy,proxy kiszolgáló,tűzfal,Squid,proxy
+Keywords[is]=Eldveggur,Proxy,Proxy server,Firewall,Squid,proxy
+Keywords[it]=proxy,server proxy,firewall,Squid
+Keywords[ja]=プロキシ,プロキシサーバ,ファイアウォール,Squid,プロキシ
+Keywords[ka]=პროქსი,პროქსი სერვერი,ფაირვოლი,Squid,პროქსი
+Keywords[km]=ប្រូកស៊ី,ម៉ាស៊ីន​បម្រើ​ប្រូកស៊ី,ជញ្ជាំង​ភ្លើង,Squid,ប្រូកស៊ី
+Keywords[lo]=ພຣັອກຊີ,ເຊີເວີພຣັອກຊີ,ໄຟລ໌ວອລ໌,ສະວິກ,ພຣັອກຊີ
+Keywords[lt]=Proxy,Proxy server,Firewall,Squid,proxy, proxy serveris,ugniasienė
+Keywords[mk]=Proxy,Proxy server,Firewall,Squid,proxy, Прокси,Прокси сервер,Огнен Ѕид,прокси
+Keywords[mn]=Итгэмжилэгч,Итгэмжилэгч сервер,Firewall,Squid,proxy
+Keywords[nb]=proxy,mellomtjener,brannmur,squid
+Keywords[nds]=Proxy,Proxyserver,Nettdiek,Squid,proxy
+Keywords[ne]=प्रोक्सी, प्रोक्सी सर्भर, फायरवाल, स्क्विड, प्रोक्सी
+Keywords[nl]=proxy,proxy server,firewall,squid
+Keywords[nn]=proxy,mellomtenar,brannmur,squid
+Keywords[nso]=Moemalegato,Moabi wa moemalegato,Firewall,Squid,moemalegato
+Keywords[pa]=Proxy,Proxy server,Firewall,Squid,ਪਰਾਕਸੀ, ਪਰਾਕਸੀ ਸਰਵਰ
+Keywords[pl]=proxy,pośrednik,serwer pośredniczący,zapora ogniowa,Squid
+Keywords[pt]=Proxy,Servidor proxy,Firewall,Squid,proxy
+Keywords[pt_BR]=Proxy,Servidor Proxy,Firewall,Squid,proxy
+Keywords[ro]=proxy,server proxy,firewall,squid,zid de foc
+Keywords[rw]=Porogisi, Seriveri porogisi,Urukuta-muriro,Squid,porogisi
+Keywords[se]=proxy,gaskabálvá,gaskabálvá,buollinmuvra,squid
+Keywords[sl]=posrednik,posredniški strežnik,požarni zid,squid,proxy
+Keywords[sr]=Прокси, Прокси сервер, Firewall, Squid, прокси
+Keywords[sr@Latn]=Proksi, Proksi server, Firewall, Squid, proksi
+Keywords[sv]=Proxy,Proxy-server,Brandvägg,Squid,proxy
+Keywords[ta]=பதிவாணை,பதிவாணை சேவகன்,ஃபயர்வால்,ஸ்க்யுட்,ப்ராக்சி
+Keywords[th]=พร็อกซี,เซิร์ฟเวอร์พร็อกซี,ไฟร์วอลล์,สควิด,พร็อกซี
+Keywords[tr]=Vekil,Vekil sunucu,Güvenlik duvarı,Squid,proxy
+Keywords[uk]=проксі,проксі-сервер,фаєрвол,Squid,proxy
+Keywords[uz]=Squid,Proksi,Proksi server,Fayervol,proksi
+Keywords[uz@cyrillic]=Squid,Прокси,Прокси сервер,Файервол,прокси
+Keywords[ven]=Purokusi,Siva ya Purokusi,Luvhondo lwa mulilo,Squid,Purokusi
+Keywords[vi]=Proxy,Máy phục vụ proxy,Tường lửa,Squid,proxy
+Keywords[wa]=Proxy,Proxy server,Firewall,Squid,proxy,sierveu proxy,meur siconte feu
+Keywords[xh]=Umntu onegunya lokudsebenzela omnye, umncedisi womntu onegunya,udonga lomlilo,Squid,umntu onegunya lokusebenzela omnye
+Keywords[zh_CN]=Proxy,Proxy server,Firewall,Squid,proxy,代理,代理服务器,防火墙
+Keywords[zh_TW]=Proxy,Proxy server,Firewall,Squid,proxy,代理,代理伺服器,防火牆
+Keywords[zu]=Umlingani,Umlekeleli ongumlingana,Firewall,Squid,umlingani
+
+Categories=Qt;KDE;X-KDE-settings-network;
diff --git a/kcontrol/kio/smb.desktop b/kcontrol/kio/smb.desktop
new file mode 100644
index 000000000..7a1330706
--- /dev/null
+++ b/kcontrol/kio/smb.desktop
@@ -0,0 +1,233 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/smb/index.html
+Icon=samba
+Exec=kcmshell smb
+
+
+X-KDE-Library=kio
+X-KDE-FactoryName=smb
+X-KDE-ParentApp=kcontrol
+
+Name=Windows Shares
+Name[af]=Vensters Gedeelde bronne
+Name[ar]=مشاركات Windows
+Name[az]=Windows Payları
+Name[be]=Агульныя тэчкі Windows
+Name[bg]=Споделяне с Windows
+Name[bn]=উইণ্ডোস শেয়ারস
+Name[br]=Rannadur prenestrer
+Name[ca]=Comparticions Windows
+Name[cs]=Sdílené disky systému Microsoft Windows
+Name[csb]=Zbiérné dostónczi Windows
+Name[cy]=Rhaniadau Windows
+Name[da]=Windows-shares
+Name[de]=Windows-Freigaben
+Name[el]=Κοινόχρηστοι πόροι Windows
+Name[eo]=Vindozaj retdosierujoj
+Name[es]=Comparticiones Windows
+Name[et]=Windowsi ressursid
+Name[eu]=Windows konpartizioak
+Name[fa]=اشتراکهای ویندوزی
+Name[fi]=Windows-jaot
+Name[fr]=Partages Windows
+Name[fy]=Windows-netwurken
+Name[gl]=Comparticións con Windows
+Name[he]=שיתופי Windows
+Name[hi]=विंडोज़ साझेदारी
+Name[hr]=Windows dijeljenja
+Name[hu]=Samba kliens
+Name[id]=Share Windows
+Name[is]=SMB netdrif
+Name[it]=Condivisioni Windows
+Name[ja]=ウィンドウズ共有
+Name[ka]=Windows საზიარო
+Name[kk]=Windows ортақ ресурстары
+Name[ko]=윈도 공유
+Name[lo]=ການໃຊ້ຊັບພະຍາກອນຮ່ວມກັບວິນໂດສ໌
+Name[lt]=Windows bendro naudojimo diskai
+Name[lv]=Windows Šāres
+Name[mk]=Windows заеднички
+Name[mn]=Windows-Нөөцүүд
+Name[ms]=Kongsi Tetingkap
+Name[mt]=Shares tal-Windows
+Name[nb]=Delte Windows-ressurser
+Name[nds]=Windows-Freegaven
+Name[ne]=विण्डोज साझेदारी
+Name[nl]=Windows-netwerken
+Name[nn]=Delte Windows-ressursar
+Name[nso]=Dikabagano tsa Window
+Name[oc]=Directoris windows
+Name[pa]=ਵਿੰਡੋ (windows) ਸਾਂਝ
+Name[pl]=Udostępniane zasoby Windows
+Name[pt]=Partilhas do Windows
+Name[pt_BR]=Compartilhamentos Windows
+Name[ro]=Partajări Windows
+Name[ru]=Ресурсы Windows
+Name[rw]=Imigabane Windows
+Name[se]=Juohkojuvvon Windows-resurssat
+Name[sk]=Zdieľanie v sieti Windows
+Name[sl]=Souporabe iz Windows
+Name[sr]=Дељени Windows ресурси
+Name[sr@Latn]=Deljeni Windows resursi
+Name[sv]=Utdelade Windows-kataloger
+Name[ta]=சாளரங்களின் பங்குகள்
+Name[tg]=Иштирокоти Windows
+Name[th]=ใช้ทรัพยากรร่วมกับวินโดว์ส
+Name[tr]=Windows Paylaşımları
+Name[tt]=Windows Urtaqları
+Name[uk]=Спільні ресурси Windows
+Name[ven]=Mukovhekano wa dziwindo
+Name[vi]=Chia sẻ với Windows
+Name[wa]=Pårtaedjes avou Windows
+Name[xh]=Ulwahlulelwano lwe Windows
+Name[zh_CN]=Windows 共享资源
+Name[zh_TW]=Windows 資源共享
+Name[zu]=Izabelo zama-Window
+
+Comment=Use to configure which windows (SMB) filesystems you can browse
+Comment[af]=Gebruik na konfigureer wat vensters (Smb) lêerstelsels jy kan blaai
+Comment[ar]=إستعمل لإعداد أي من أنظمة الملفات (SMB) تستطيع التصفّح
+Comment[az]=Gəzə biləcəyiniz windows (SMB) fayl sistemlərini quraşdırmaqda işlədilir
+Comment[be]=Настаўленні файлавых сістэмаў SMB
+Comment[bg]=Настройване споделянето на файлове с Windows
+Comment[bn]=কোন কোন উইণ্ডোস (সাম্বা) শেয়ার ব্রাউজ করতে পারবেন তা নির্বাচন করতে ব্যবহার করুন
+Comment[br]=Implijit evit kefluniañ pe reizhiad restroù windows (SMB) a c'hellit furchal
+Comment[bs]=Koristite ovu opciju za podešavanje Windows (SMB) datotečnih sistema koje želite pregledavati
+Comment[ca]=S'usa per a configurar en quins sistemes de fitxers windows (SMB) es podrà navegar
+Comment[cs]=Použijte k nastavení systémů Windows (SMB), které chcete procházet
+Comment[csb]=Kònfigùracëjô przistãpnëch systemòwëch lopków z Windowsa (SMB)
+Comment[cy]=Defnyddio i ffurfweddu pa cysodau ffeil Windows (SMB) a fedrwch eu pori
+Comment[da]=Bruges til at indstille hvilke Windows-filsystemer (SMB) du kan se
+Comment[de]=Hier stellen Sie ein, welche (SMB-)Dateisysteme Sie durchsuchen können
+Comment[el]=Ρυθμίστε ποια συστήματα αρχείων windows (SMB) μπορείτε να επισκεφθείτε
+Comment[eo]=Retdosierujoj alireblaj per SMB
+Comment[es]=Úselo para configurar qué sistemas de archivos de Windows (SMB) puede examinar
+Comment[et]=Windowsi (SMB) jagatud resursside lehitsemise seadistused
+Comment[eu]=Erabil ezazu zein windows fitxategi sistema (SMB) araka dezakezunkonfiguratzeko
+Comment[fa]=استفاده جهت پیکربندی سیستم پرونده‌های ویندوزی(SMB) که می‌توانید مرور کنید.
+Comment[fi]=Käytä asettaaksesi windowsin (SMB) tiedostojärjestelmiä, joita voit selata
+Comment[fr]=Configuration des systèmes de fichiers Windows (SMB)
+Comment[fy]=Hjir kinne jo fêstelle mei wat fan Windows-triemsystemen (SMB) jo fia it netwurk blêdzje wolle.
+Comment[gl]=Use-o para configurar os sistemas de ficheiros windows (SMB) que pode navegar
+Comment[he]=שינוי ההגדרות בנוגע למערכות הקבצים של SMB) Windows) בהן ניתן לעיין
+Comment[hi]=कॉन्फ़िगर करने के लिए इस्तेमाल करें कि कौन सा विंडोज़ फ़ाइलसिस्टम (SMB) आप ब्राउज कर सकते हैं.
+Comment[hr]=Konfiguriranje Windows (SMB) datotečnih sustava koje smijete pregledavati
+Comment[hu]=Az SMB fájlrendszerek böngészésének beállításai
+Comment[id]=Digunakan untuk konfigurasi sistem file windows (SMB) yang digunakan
+Comment[is]=Stilla hvaða SMB netdiska (e. windows sameignir) þú getur skoðað
+Comment[it]=Configura quali filesystem windows (SMB) si possono sfogliare
+Comment[ja]=windows(SMB)ファイルシステムをブラウズするための設定
+Comment[ka]=გამოიყენება windows (SMB) ფაილური სისტემების ჩვენების მისათითებლად
+Comment[kk]=Windows-компьютерлердің қай файл жүйелері (SMB) қатынауға ашық екенін баптау
+Comment[km]=ប្រើ​ដើម្បី​កំណត់​រចនាសម្ព័ន្ធ ថា​តើ​ប្រព័ន្ធ​ឯកសារ Windows (SMB) ណា​មួយ​ដែល​អ្នក​អាច​រុករក
+Comment[ko]=윈도 (SMB) 파일 시스템 탐색 설정
+Comment[lo]=ໃຊ້ສຳລັບການປັບແຕ່ງການເອີ້ນລະບົບ ແຟ້ມຂອງວິນໂດສ໌ (SMB)
+Comment[lt]=Naudokite tai norėdami nustatyti kurias Windows (SMB) bylų sistemas Jūs galėsite naršyti
+Comment[lv]=Lietojiet, lai norādītu kuras windows (SMB) failu sistēmas Jūs varētu pārlūkot
+Comment[mk]=Користете го за да конфигурирате кои windows (SMB) датотечни системи можете да ги прелистувате
+Comment[mn]=Энд та ямар виндовс (SMB-)Файлын систем нэгжиж чадахаа тохируулж болно
+Comment[ms]=Guna untuk konfigur sistem fail tetingkap (SMB) mana yang anda boleh layar
+Comment[mt]=Uża dan biex tagħżel liema filesystems tal-Windows (SMB) tista' tibbrowsja
+Comment[nb]=Her kan du stille inn hvilke Windows-filsystemer (SMB) du kan lese
+Comment[nds]=Instellen, welke Windows- (SMB-) Dateisystemen Du bruken kannst
+Comment[ne]=तपाईँले ब्राउज गर्न सक्ने विण्डोजको (SMB) फाइल प्रणालीहरूमा कन्फिगर गर्न प्रयोग गर्नुहोस्
+Comment[nl]=Hier kunt u bepalen op welke Windows-bestandssytemen (SMB) u via het netwerk wilt kunnen bladeren.
+Comment[nn]=Her kan du setja opp kva for Windows-filsystem (SMB) du kan lesa
+Comment[nso]=E hlwela e beakanya gore ke di-system dife tsa faele ya window (SMB) tseo oka inyakisago tsona
+Comment[oc]=S'usa per configurar quins sistemes de fiquièrs windows (SMB) podetz fullejar
+Comment[pa]=ਸੰਰਚਨਾ ਵਰਤੋਂ, ਜੋ ਕਿ ਵਿੰਡੋ (SMB) ਫਾਇਲ ਸਿਸਟਮ ਦੀ ਝਲਕ ਵੇਖਾ ਸਕਦਾ ਹੈ
+Comment[pl]=Konfiguracja dostępnych systemów plików z Windows (SMB)
+Comment[pt]=Configuração das partilhas de Windows (SMB) a que você pode aceder
+Comment[pt_BR]=Use para configurar em quais sistemas de arquivos SMB (Rede Windows) você pode navegar
+Comment[ro]=Configurează partajările Windows (SMB) pe care le puteți răsfoi
+Comment[ru]=Настройка просмотра доступных разделяемых ресурсов Windows-машин
+Comment[rw]=Gukoresha mu kuboneza sisitemudosiye ya Windows (SMB) ushobora gucukumbura
+Comment[se]=Dás sáhtát heivehit guđe Windows-fiilavuogádaid (SMB) oaččut lohkat
+Comment[sk]=Konfigurácia súborového systému Windows (SMB), ktorý môžete prehliadať
+Comment[sl]=Uporabite za nastavitev datotečnih sistemov Windows (SMB), po katerih lahko brskate
+Comment[sr]=Користите да би подесили које Windows (SMB) системе фајлове ћете моћи да прегледате
+Comment[sr@Latn]=Koristite da bi podesili koje Windows (SMB) sisteme fajlove ćete moći da pregledate
+Comment[sv]=Använd detta för att ställa in vilka Windows-filsystem (SMB) som du kan komma åt
+Comment[ta]=நீங்கள் உலாவக்கூடிய சாளர கோப்பு அமைப்புகளை (SMB) வடிவமைக்கவும்
+Comment[tg]= Барои танзим кардани системаи windows, ки (SMB)-ро мехоҳед мурур кунед, қобили истифода аст
+Comment[th]=ใช้ปรับแต่งการเรียกดูระบบแฟ้มของวินโดว์ส (SMB)
+Comment[tr]=Gözatabileceğiniz windows (SMB) dosya sistemlerini yapılandırmakta kullanılır
+Comment[tt]=Windows çeltärendä büleneşkän belem qaraw tärtibeneñ caylawları
+Comment[uk]=Налаштування файлових систем Windows (SMB), для навігації
+Comment[ven]=I shuma u khonifigara uri ndi mashumele a (SMB) faela a windo ane ninga buronza
+Comment[vi]=Dùng để cấu hình hệ thống tập tin Windows (SMB) nào mà bạn có thể duyệt
+Comment[wa]=Eployî po-z apontyî ké sistinme di fitchî Windows (SMB) vos ploz foyter
+Comment[xh]=Sebenzisa ukuqwalasela eyiphi (SMB) indlela yousebenza okwaziyo ukukhangela iincwadi
+Comment[zh_CN]=配置您可以浏览的 Windows (SMB) 文件系统
+Comment[zh_TW]=設定您可以瀏覽的 Windows (SMB) 檔案系統
+Comment[zu]=Sebenzisa ukuhlanganisela ukuthi imaphi amasistimu amafayela ama-window (SMB) ongacinga kuwo
+
+Keywords=SMB,SAMBA,SMB client,Windows network,LAN,Network,neighborhood,Server,Broadcast,WINS,Share,Login,Passwords
+Keywords[ar]=SMB,SAMBA,زبون SMB,شبكة Windows,شبكة المنطقة المحلية,الشبكة,الجوار,الخادم,البث,WINS,المشاركة,تسجيل الدخول,كلمات المرور
+Keywords[az]=SMB,SAMBA,SMB alıcı,Windows şəbəkəsi,LAN,Şəbəkə,qonşular,Giriş,Parol,Paylaşım,WINS,yayın
+Keywords[be]=Кліент SMB,Сетка Windows,Навакольнае асяроддзе,Сетка,асяроддзе,Сервер,Публікацыя,Агульныя файлы,Уваход,Пароль,Паролі,Уліковы запіс,Сесія,SMB,SAMBA,SMB client,Windows network,LAN,Network,neighborhood,Server,Broadcast,WINS,Share,Login,Passwords
+Keywords[bg]=самба, споделяне, файлове, принтери, печат, пароли, SMB, SAMBA, SMB client, Windows network, LAN, Network, neighborhood, Server, Broadcast, WINS, Share, Login, Passwords
+Keywords[ca]=SMB,SAMBA,Client SMB,Xarxa Windows,LAN,Xarxa,veïnat,servidor,Broadcast,WINS,Compartició,Accés,Contrasenyes
+Keywords[cs]=SMB,Samba,SMB klient,Síť Microsoft Windows,LAN,Síť,Okolní počítače,Server,Broadcast,WINS,Share,Login,Hesla
+Keywords[csb]=SMB,SAMBA,klient SMB,séc Windows,LAN,môlowô séc,sécowé òkrãże,serwera,rozgłôszanié,WINS,dostónk,logòwanié,parole
+Keywords[cy]=SMB,SAMBA,dibynnydd SMB,Rhwydwaith Windows,LAN,Rhwydwaith,cymdogaeth,Gweinydd,Darllediad,WINS,Rhanniad,Mewngofnodi,Cyfrineiriau
+Keywords[da]=SMB,Samba,SMB-klient,Windows-netværk,Lan,Netværk,arbejdsgruppe,server,Udsend,WINS,Del,Login,kodeord
+Keywords[de]=SMB,Samba,SMB-Client,Windows-Netzwerk,LAN,Netzwerk,Netzumgebung,Umgebung,Server,Broadcast,WINS,Freigabe,Anmeldung,Passwörter
+Keywords[el]=SMB,SAMBA,Πελάτης SMB,Δίκτυο Windows,LAN,Δίκτυο,γειτονιά,Εξυπηρετητής,Εκπομπή,WINDS,Κοινόχρηστος πόρος,Σύνδεση,Κωδικοί πρόσβασης
+Keywords[en_GB]=SMB,SAMBA,SMB client,Windows network,LAN,Network,neighbourhood,Server,Broadcast,WINS,Share,Login,Passwords
+Keywords[eo]=SMB,Sambo,kliento,Vindozo,reto,LAN,najbaraĵo,servilo,dissendo,WINS,retdosierujo,saluto,pasvorto
+Keywords[es]=SMB,SAMBA,Cliente SMB,Red Windows,LAN,Red,entorno,Servidor,Broadcast,WINS,Compartición,Entrada,Acceso,Contraseñas
+Keywords[et]=SMB,samba,SMB klient,Windowsi võrk,LAN,võrk,naabrus,server,broadcast,üldlevi,WINS,jagatud ressurss,kasutajanimi,paroolid
+Keywords[eu]=SMB,SAMBA,SMB bezeroa,Windows sarea,LAN,Sarea,ingurunea,Zerbitzaria,Broadcast,WINS,Konpartizioa,Saio hasiera,Pasahitza
+Keywords[fa]=SMB، SAMBA، کارخواه SMB، شبکۀ ویندوزی، شبکۀ داخلی، شبکه، مجاورت، کارساز، پخش، WINS، مشترک، ورود، اسم‌ رمزها
+Keywords[fi]=SMB,SAMBA,SMB-asiakas,Windows verkko,LAN,Verkko,Naapuruus,Palvelin,Jakelu,WINS,Jako,Kirjautuminen,Salasanat
+Keywords[fr]=smb,samba,client smb,réseau Windows,lan,réseau local,réseau,voisinage,serveur,broadcast,diffusion,wins,partage,connexion,mot de passe,windows,login
+Keywords[fy]=SMB,SAMBA,SMB-client,Windows-netwurk,LAN,netwurk,omwrâld,neighborhood,server,broadcast,WINS,share,Oanmelde,login,wachtwurden,netwurk
+Keywords[gl]=SMB,SAMBA,cliente SMB,rede Windows,LAN,Rede,veciñanza,Servidor,Broadcast,WINS,Compartición,Login,Inicio,Contrasinais
+Keywords[he]=שיתוף,כניסה למערכת,ססמאות,WINS,רשת מקומית,רשת,שכנים,שרת,שידור,רשת Windows,תוכנית SMB,SAMBA,SMB, SMB client,Windows network,LAN,Network,neighborhood,Server,Broadcast,WINS,Share,Login,Passwords
+Keywords[hi]=एसएमबी,साम्बा,एसएमबी क्लाएंट,विंडोज़ नेटवर्क,लैन,नेटवर्क,नेबरहुड,सर्वर,ब्राडकास्ट,विन्स,साझेदारी,लॉगइन,पासवर्ड
+Keywords[hr]=SMB,SAMBA,SMB client,Windows network,LAN,Network,neighborhood,Server,Broadcast,WINS,Share,Login,Passwords,SMB klijent,Windows mreža,Mreža,susjedstvo,Poslužitelj,Opća objava,Dijeljenje,Prijava,Lozinke
+Keywords[hu]=SMB,Samba,SMB-kliens,Windows-hálózat,LAN,hálózat,környezet,kiszolgáló,broadcast,WINS,megosztás,bejelentkezés,jelszavak
+Keywords[id]=SMB,SAMBA,klien SMB,Windows network,LAN,Network,neighborhood,Server,Broadcast,WINS,Share,Login,Passwords
+Keywords[is]=Windows net,SMB netdrif,netdrif,net,SMB biðill,Net,nágrenni,þjónn,deild,lykilorð,innskráning
+Keywords[it]=SMB,SAMBA,Client SMB,Rete Windows,LAN,Rete,Risorse di rete,Accesso,WINS,Login,Share,Condivisioni,Password,Broadcast,vicini,server,risorse di rete
+Keywords[ja]=SMB,SAMBA,SMBクライアント,Windowsネットワーク,LAN,ネットワーク,neighborhood,サーバ,ブロードキャスト,WINS,共有,ログイン,パスワード
+Keywords[km]=SMB,SAMBA,ម៉ាស៊ីន​ភ្ញៀវ SMB,បណ្ដាញ Windows,LAN,បណ្ដាញ,កុំព្យូទ័រ​ជិត​ខាង,ម៉ាស៊ីន​បម្រើ,ផ្សាយ,WINS,រួម,ចូល,ពាក្យ​សម្ងាត់
+Keywords[lo]=SMB,SAMBA,ໄຄລເອນ SMB,ລະບົບເຄືອຂ່າຍຂອງວິນໂດສ໌,ແລນ, ລະບົບເຄືອຂ່າຍ,ລະແວກດງວກັນ,ເຊີເວີ,ບອດຄາສ, WINS,ຊັບພະຍາກອນໃຊ້ຮ່ວມກັນ,ລັອກອິນ,ລະຫັດຜ່ານ
+Keywords[lt]=SMB,SAMBA,SMB client,SMB klientas,Windows network,Windows tinklas,LAN,vietinis tinklas,Network,tinklas,neighborhood,kaiminystė,Server,serveris,Broadcast,transliacija,WINS,Share,bendro naudojimo,bendro naudojimo diskas,Login,Passwords
+Keywords[lv]=SMB,SAMBA,SMB klients,Windows tīkls,LAN,Tīkls,kaimiņš,Serveris,Pārraide,WINS,Šāre,Pieteikšanās,Paroles
+Keywords[mk]=SMB,SAMBA,SMB client,Windows network,LAN,Network,neighborhood,Server,Broadcast,WINS,Share,Login,Passwords,клиент,Windows мрежа,Мрежа, соседство,Сервер,Емитување,WINS,Заеднички,Најава,Лозинки
+Keywords[mn]=SMB,Samba,SMB-Client,Виндовс-Сүлжээ,LAN,Сүлжээ, Сүлжээний орчин,Орчин,сервер,Цацалт,WINS,Share,Login,Нууц үгс
+Keywords[nb]=SMB,SAMBA,SMB-klient,Windows-nettverk,LAN,Nettverk,nabolag,tjener,kringkasting,WINS,deling,innlogging,passord,ressurs
+Keywords[nds]=SMB,SAMBA,SMB-Client,Windowsnettwark,LAN,Nettwark,Naverschap,Server,Broadcast,Rundroop,WINS,deelt Ressource,anmellen,Passwöör
+Keywords[ne]=SMB, SAMBA, SMB क्लाइन्ट,सञ्झ्याल सञ्जाल, LAN, सञ्जाल, छिमेकी, सर्भर, प्रसारण, WINS, बाडँफाट, लगइन, पासवर्ड
+Keywords[nl]=SMB,SAMBA,SMB-client,Windows-netwerk,LAN,netwerk,omgeving,neighborhood,server,broadcast,WINS,share,inloggen,login,aanmelden,wachtwoorden,netwerk
+Keywords[nn]=SMB,SAMBA,SMB-klient,Windows-nettverk,LAN,nettverk,nabolag,grannelag,tenar,kringkasting,WINS,deling,innlogging,passord,ressurs
+Keywords[nso]=SMB,SAMBA,Moreki wa SMB,Kgokagano ya di-Window,LAN,Kgokagano,boagisane,Moabi,Kgaso,WINS,Kabagano,Tseno,Mantsuphetiso
+Keywords[pa]=SMB,SAMBA,SMB ਕਲਾਂਇਟ,Windows network,LAN,ਨੈਟਵਰਕ,ਗੁਆਂਢੀ, ਸਰਵਰ,Broadcast,WINS,ਸਾਂਝ, ਲਾਗਿੰਨ, ਗੁਪਤ-ਕੋਡ
+Keywords[pl]=SMB,SAMBA,klient SMB,sieć Windows,LAN,sieć lokalna,otoczenie sieciowe,serwer,rozgłoszenie,WINS,zasób,logowanie,hasła
+Keywords[pt]=SMB,SAMBA,cliente SMB,rede Windows,Windows,LAN,rede,vizinhança de rede,servidor,difusão,WINS,partilha,login,senhas
+Keywords[pt_BR]=SMB,SAMBA,cliente SMB,rede Windows,LAN,rede,vizinhança,ambiente de rede,servidor,difusão,WINS,Volume,compartilhamento,login,senhas
+Keywords[ro]=SMB,SAMBA,client SMB,Windows,LAN,rețea,vecinătate,server,difuziune,WINS,partajare,logare,parole
+Keywords[rw]=SMB,SAMBA,Umukiriya SMB, Urusobemiyoboro Windows,LAN,Urusobemiyoboro,Seriveri,Isakazamakuru,WINS,Isangira,Ifashayinjira,Amagambobanga
+Keywords[se]=SMB,SAMBA,SMB-klienta,Windows-fierpmádat,LAN,fierpmádat,WINS,sisačáliheapmi,beassansánit
+Keywords[sk]=SMB,SAMBA,SMB klient,sieť Windows,LAN,Sieť,WINS,broadcast,server,login,prihlásenie,heslá,share
+Keywords[sl]=SMB,SAMBA,odjemnik SMB,omrežje Windows,LAN,omrežje,omrežna soseščina,oddajanje,WINS,prijava,gesla
+Keywords[sr]=SMB,SAMBA,SMB client,Windows network,LAN,Network,neighborhood,Сервер,Broadcast,WINS,Share,Login,Passwords,Мрежа,комшилук,дељење,пријава,лозинке
+Keywords[sr@Latn]=SMB,SAMBA,SMB client,Windows network,LAN,Network,neighborhood,Server,Broadcast,WINS,Share,Login,Passwords,Mreža,komšiluk,deljenje,prijava,lozinke
+Keywords[sv]=SMB,SAMBA,SMB-klient,Windowsnätverk,LAN,Nätverk,omgivning,Server,Broadcast,WINS,Utdelning,Lösenord,Inloggning
+Keywords[ta]=SMB,SAMBA,SMB உறுப்பினர்,சாளரங்கள் வலைதளம்,LAN,வலைதளம்,பல வலைதளங்கள்,சேவகன்,ஒலிப்பரப்புதல்,WINS,பங்கு,உள்நுழை,கடவுச்சொற்கள்
+Keywords[th]=SMB,SAMBA,ไคลเอนต์ SMB,ระบบเครือข่ายของวินโดว์ส,แลน,ระบบเครือข่าย,ที่ใกล้เคียง,เซิร์ฟเวอร์,ถ่ายทอด,WINS,ทรัพยากรใช้ร่วมกัน,ล็อกอิน,รหัสผ่าน
+Keywords[tr]=SMB,SAMBA,SMB istemci,Windows ağı,LAN,Ağ,komşular,Giriş,Parola,Paylaşım,WINS,yayın
+Keywords[uk]=клієнт SMB,мережа Windows,ЛОМ,LAN,мережа,оточення,SMB,SAMBA,сервер,мережа Windows,ЛОМ,LAN,мережа,оточення,SMB,SAMBA,сервер,трансляція,WINS,спільний ресурс,реєстрація,паролі
+Keywords[uz]=SMB,SAMBA,SMB klienti,Windows tarmogʻi,LAN,Tarmoq,tarmoq muhiti,Server,Broadcast,WINS,Share,Foydalanuvchi,Maxfiy soʻzlar
+Keywords[uz@cyrillic]=SMB,SAMBA,SMB клиенти,Windows тармоғи,LAN,Тармоқ,тармоқ муҳити,Сервер,Broadcast,WINS,Share,Фойдаланувчи,Махфий сўзлар
+Keywords[ven]=SMB,SAMBA,vhashumisani na SMB,Vhukwamani ha Dziwindo,LAN,Vhukwamani,vhadzulatsini,Siva,Hasha,WINS,U kovhekana,U loga,Dziphasiwede
+Keywords[vi]=SMB,SAMBA,SMB khách,Mạng Windows,LAN,Mạng,hàng xóm,Máy chủ,Broadcast,WINS,Chia xẻ,Đăng nhập,Mật khẩu
+Keywords[wa]=SMB,SAMBA,cliyint SMB,rantoele Windows,LAN,Rantoele,vijhnaedje,Sierveu,Broadcast,WINS,pårtaedje,pårtaedjî,Login,Passwords,sicrets,mots di passe
+Keywords[xh]=SMB,SAMBA,umxhasi we SMB,umsebenzi womnatha we Window,LAN, Umsebenzi womnatha,ubumelwane,Umncedisi,Usasazo,WINS,Yahlula,Igama elithile, Amagama agqithisiweyo
+Keywords[zh_CN]=SMB,SAMBA,SMB client,Windows network,LAN,Network,neighborhood,Server,Broadcast,WINS,Share,Login,Passwords,局域网,网络,邻居,服务器,广播,共享,登录,密码
+Keywords[zh_TW]=SMB,SAMBA,SMB client,Windows network,LAN,Network,neighborhood,Server,Broadcast,WINS,Share,Login,Passwords,客戶端程式,Windows 網路,區域網路,網路,網路芳鄰,伺服器,廣播,共享,登入,密碼
+Keywords[zu]=SMB,SAMBA,umxhasi we-SMB,uxhumano olusakazekile lwama-window,LAN,Uxhumano olusakazekile,isizinda,Umlekeleli,Sakaza,WINS, ukwabelana,Ukungena ngaphakathi,Amagama-okudlula
+
diff --git a/kcontrol/kio/smbrodlg.cpp b/kcontrol/kio/smbrodlg.cpp
new file mode 100644
index 000000000..dc075c793
--- /dev/null
+++ b/kcontrol/kio/smbrodlg.cpp
@@ -0,0 +1,191 @@
+/* This file is part of the KDE project
+
+ Copyright (C) 2000 Alexander Neundorf <neundorf@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qtextcodec.h>
+
+#include <klocale.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <kcharsets.h>
+#include <kcombobox.h>
+#include <kdialog.h>
+
+#include "smbrodlg.h"
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+SMBRoOptions::SMBRoOptions(QWidget *parent)
+ : KCModule(parent, "kcmkio")
+{
+ QGridLayout *layout = new QGridLayout(this,2,-1,KDialog::marginHint(),
+ KDialog::spacingHint());
+ QLabel *label=new QLabel(i18n("This is the configuration for the samba client only, not the server."),this);
+ layout->addMultiCellWidget(label,0,0,0,1);
+
+ m_userLe=new QLineEdit(this);
+ label=new QLabel(m_userLe,i18n("Default user name:"),this);
+ layout->addWidget(label,1,0);
+ layout->addWidget(m_userLe,1,1);
+
+ m_passwordLe=new QLineEdit(this);
+ m_passwordLe->setEchoMode(QLineEdit::Password);
+ label=new QLabel(m_passwordLe,i18n("Default password:"),this);
+ layout->addWidget(label,2,0);
+ layout->addWidget(m_passwordLe,2,1);
+
+/* m_workgroupLe=new QLineEdit(this);
+ label=new QLabel(m_workgroupLe,i18n("Workgroup:"),this);
+ layout->addWidget(label,3,0);
+ layout->addWidget(m_workgroupLe,3,1);
+
+ m_showHiddenShares=new QCheckBox(i18n("Show hidden shares"),this);
+ layout->addMultiCellWidget(m_showHiddenShares,4,4,0,1);
+
+ m_encodingList = new KComboBox( false, this );
+ QStringList _strList = KGlobal::charsets()->availableEncodingNames();
+ m_encodingList->insertStringList( _strList );
+
+ label = new QLabel( m_encodingList, i18n( "MS Windows encoding:" ), this );
+ layout->addWidget( label, 3, 0 );
+ layout->addWidget( m_encodingList, 3, 1 );
+ */
+
+ layout->addWidget(new QWidget(this),4,0);
+
+// connect(m_showHiddenShares, SIGNAL(toggled(bool)), this, SLOT(changed()));
+ connect(m_userLe, SIGNAL(textChanged(const QString&)), this, SLOT(changed()));
+ connect(m_passwordLe, SIGNAL(textChanged(const QString&)), this, SLOT(changed()));
+// connect(m_workgroupLe, SIGNAL(textChanged(const QString&)), this, SLOT(changed()));
+// connect( m_encodingList, SIGNAL( activated( const QString & ) ), this , SLOT( changed() ) );
+
+ layout->setRowStretch(4, 1);
+
+ // finaly read the options
+ load();
+}
+
+SMBRoOptions::~SMBRoOptions()
+{
+}
+
+void SMBRoOptions::load()
+{
+ KConfig *cfg = new KConfig("kioslaverc");
+
+ QString tmp;
+ cfg->setGroup( "Browser Settings/SMBro" );
+ m_userLe->setText(cfg->readEntry("User"));
+// m_workgroupLe->setText(cfg->readEntry("Workgroup"));
+// m_showHiddenShares->setChecked(cfg->readBoolEntry("ShowHiddenShares",false));
+
+// QStringList _strList = KGlobal::charsets()->availableEncodingNames();
+// QString m_encoding = QTextCodec::codecForLocale()->name();
+// m_encodingList->setCurrentItem( _strList.findIndex( cfg->readEntry( "Encoding", m_encoding.lower() ) ) );
+
+ // unscramble
+ QString scrambled = cfg->readEntry( "Password" );
+ QString password = "";
+ for (uint i=0; i<scrambled.length()/3; i++)
+ {
+ QChar qc1 = scrambled[i*3];
+ QChar qc2 = scrambled[i*3+1];
+ QChar qc3 = scrambled[i*3+2];
+ unsigned int a1 = qc1.latin1() - '0';
+ unsigned int a2 = qc2.latin1() - 'A';
+ unsigned int a3 = qc3.latin1() - '0';
+ unsigned int num = ((a1 & 0x3F) << 10) | ((a2& 0x1F) << 5) | (a3 & 0x1F);
+ password[i] = QChar((uchar)((num - 17) ^ 173)); // restore
+ }
+ m_passwordLe->setText(password);
+
+ delete cfg;
+}
+
+void SMBRoOptions::save()
+{
+ KConfig *cfg = new KConfig("kioslaverc");
+
+ cfg->setGroup( "Browser Settings/SMBro" );
+ cfg->writeEntry( "User", m_userLe->text());
+// cfg->writeEntry( "Workgroup", m_workgroupLe->text());
+// cfg->writeEntry( "ShowHiddenShares", m_showHiddenShares->isChecked());
+// cfg->writeEntry( "Encoding", m_encodingList->currentText() );
+
+ //taken from Nicola Brodu's smb ioslave
+ //it's not really secure, but at
+ //least better than storing the plain password
+ QString password(m_passwordLe->text());
+ QString scrambled;
+ for (uint i=0; i<password.length(); i++)
+ {
+ QChar c = password[i];
+ unsigned int num = (c.unicode() ^ 173) + 17;
+ unsigned int a1 = (num & 0xFC00) >> 10;
+ unsigned int a2 = (num & 0x3E0) >> 5;
+ unsigned int a3 = (num & 0x1F);
+ scrambled += (char)(a1+'0');
+ scrambled += (char)(a2+'A');
+ scrambled += (char)(a3+'0');
+ }
+ cfg->writeEntry( "Password", scrambled);
+
+ delete cfg;
+}
+
+void SMBRoOptions::defaults()
+{
+ m_userLe->setText("");
+ m_passwordLe->setText("");
+// m_workgroupLe->setText("");
+// m_showHiddenShares->setChecked(false);
+}
+
+void SMBRoOptions::changed()
+{
+ emit KCModule::changed(true);
+}
+
+QString SMBRoOptions::quickHelp() const
+{
+ return i18n("<h1>Windows Shares</h1>Konqueror is able to access shared "
+ "windows filesystems if properly configured. If there is a "
+ "specific computer from which you want to browse, fill in "
+ "the <em>Browse server</em> field. This is mandatory if you "
+ "do not run Samba locally. The <em>Broadcast address</em> "
+ "and <em>WINS address</em> fields will also be available, if you "
+ "use the native code, or the location of the 'smb.conf' file "
+ "from which the options are read, when using Samba. In any case, the "
+ "broadcast address (interfaces in smb.conf) must be set up if it "
+ "is guessed incorrectly or you have multiple cards. A WINS server "
+ "usually improves performance, and reduces the network load a lot.<p>"
+ "The bindings are used to assign a default user for a given server, "
+ "possibly with the corresponding password, or for accessing specific "
+ "shares. If you choose to, new bindings will be created for logins and "
+ "shares accessed during browsing. You can edit all of them from here. "
+ "Passwords will be stored locally, and scrambled so as to render them "
+ "unreadable to the human eye. For security reasons, you may not want to "
+ "do that, as entries with passwords are clearly indicated as such.<p>");
+}
+
+#include "smbrodlg.moc"
diff --git a/kcontrol/kio/smbrodlg.h b/kcontrol/kio/smbrodlg.h
new file mode 100644
index 000000000..d72972516
--- /dev/null
+++ b/kcontrol/kio/smbrodlg.h
@@ -0,0 +1,55 @@
+/* This file is part of the KDE project
+
+ Copyright (C) 2000, 2005 Alexander Neundorf <neundorf@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __SMBRODLG_H
+#define __SMBRODLG_H
+
+#include <qwidget.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+
+#include <kcmodule.h>
+
+class KComboBox;
+
+class SMBRoOptions : public KCModule
+{
+ Q_OBJECT
+ public:
+ SMBRoOptions(QWidget *parent = 0);
+ ~SMBRoOptions();
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+ QString quickHelp() const;
+
+ private slots:
+ void changed();
+
+ private:
+ QLineEdit *m_userLe;
+ QLineEdit *m_passwordLe;
+// QLineEdit *m_workgroupLe; //currently unused, Alex
+// QCheckBox *m_showHiddenShares; //currently unused, Alex
+// KComboBox *m_encodingList; //currently unused
+};
+
+#endif
diff --git a/kcontrol/kio/socks.cpp b/kcontrol/kio/socks.cpp
new file mode 100644
index 000000000..9c6678a5d
--- /dev/null
+++ b/kcontrol/kio/socks.cpp
@@ -0,0 +1,279 @@
+/**
+ * socks.cpp
+ *
+ * Copyright (c) 2001 George Staikos <staikos@kde.org>
+ * Copyright (c) 2001 Daniel Molkentin <molkentin@kde.org> (designer port)
+ *
+ * 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 <qlayout.h>
+#include <qlabel.h>
+#include <qvbuttongroup.h>
+#include <qcheckbox.h>
+
+#include <kfiledialog.h>
+#include <klistview.h>
+#include <kmessagebox.h>
+#include <ksocks.h>
+#include <kapplication.h>
+
+#include "socks.h"
+#include <kaboutdata.h>
+
+KSocksConfig::KSocksConfig(QWidget *parent)
+ : KCModule(parent, "kcmkio")
+{
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmsocks"), I18N_NOOP("KDE SOCKS Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2001 George Staikos"));
+
+ about->addAuthor("George Staikos", 0, "staikos@kde.org");
+
+ setAboutData( about );
+
+
+ QVBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ base = new SocksBase(this);
+ layout->add(base);
+
+ connect(base->_c_enableSocks, SIGNAL(clicked()), this, SLOT(enableChanged()));
+ connect(base->bg, SIGNAL(clicked(int)), this, SLOT(methodChanged(int)));
+
+ // The custom library
+ connect(base->_c_customPath, SIGNAL(openFileDialog(KURLRequester *)), this, SLOT(chooseCustomLib(KURLRequester *)));
+ connect(base->_c_customPath, SIGNAL(textChanged(const QString&)),
+ this, SLOT(customPathChanged(const QString&)));
+
+ // Additional libpaths
+ connect(base->_c_newPath, SIGNAL(openFileDialog(KURLRequester *)), this, SLOT(chooseCustomLib(KURLRequester *)));
+ connect(base->_c_newPath, SIGNAL(returnPressed(const QString&)),
+ this, SLOT(addThisLibrary(const QString&)));
+ connect(base->_c_newPath, SIGNAL(textChanged(const QString&)),
+ this, SLOT(libTextChanged(const QString&)));
+ connect(base->_c_add, SIGNAL(clicked()), this, SLOT(addLibrary()));
+ connect(base->_c_remove, SIGNAL(clicked()), this, SLOT(removeLibrary()));
+ connect(base->_c_libs, SIGNAL(selectionChanged()), this, SLOT(libSelection()));
+
+ // The "Test" button
+ connect(base->_c_test, SIGNAL(clicked()), this, SLOT(testClicked()));
+
+ // The config backend
+ load();
+}
+
+KSocksConfig::~KSocksConfig()
+{
+}
+
+void KSocksConfig::configChanged()
+{
+ emit changed(true);
+}
+
+void KSocksConfig::enableChanged()
+{
+ KMessageBox::information(NULL,
+ i18n("These changes will only apply to newly "
+ "started applications."),
+ i18n("SOCKS Support"),
+ "SOCKSdontshowagain");
+ emit changed(true);
+}
+
+
+void KSocksConfig::methodChanged(int id)
+{
+ if (id == 4) {
+ base->_c_customLabel->setEnabled(true);
+ base->_c_customPath->setEnabled(true);
+ } else {
+ base->_c_customLabel->setEnabled(false);
+ base->_c_customPath->setEnabled(false);
+ }
+ emit changed(true);
+}
+
+
+void KSocksConfig::customPathChanged(const QString&)
+{
+ emit changed(true);
+}
+
+
+void KSocksConfig::testClicked()
+{
+ save(); // we have to save before we can test! Perhaps
+ // it would be best to warn, though.
+
+ if (KSocks::self()->hasSocks()) {
+ KMessageBox::information(NULL,
+ i18n("Success: SOCKS was found and initialized."),
+ i18n("SOCKS Support"));
+ // Eventually we could actually attempt to connect to a site here.
+ } else {
+ KMessageBox::information(NULL,
+ i18n("SOCKS could not be loaded."),
+ i18n("SOCKS Support"));
+ }
+
+ KSocks::self()->die();
+
+}
+
+
+void KSocksConfig::chooseCustomLib(KURLRequester * url)
+{
+ url->setMode( KFile::Directory );
+/* QString newFile = KFileDialog::getOpenFileName();
+ if (newFile.length() > 0) {
+ base->_c_customPath->setURL(newFile);
+ emit changed(true);
+ }*/
+}
+
+
+
+void KSocksConfig::libTextChanged(const QString& lib)
+{
+ if (lib.length() > 0)
+ base-> _c_add->setEnabled(true);
+ else base->_c_add->setEnabled(false);
+}
+
+
+void KSocksConfig::addThisLibrary(const QString& lib)
+{
+ if (lib.length() > 0) {
+ new QListViewItem(base->_c_libs, lib);
+ base->_c_newPath->clear();
+ base->_c_add->setEnabled(false);
+ base->_c_newPath->setFocus();
+ emit changed(true);
+ }
+}
+
+
+void KSocksConfig::addLibrary()
+{
+ addThisLibrary(base->_c_newPath->url());
+}
+
+
+void KSocksConfig::removeLibrary()
+{
+ QListViewItem *thisitem = base->_c_libs->selectedItem();
+ base->_c_libs->takeItem(thisitem);
+ delete thisitem;
+ base->_c_libs->clearSelection();
+ base->_c_remove->setEnabled(false);
+ emit changed(true);
+}
+
+
+void KSocksConfig::libSelection()
+{
+ base->_c_remove->setEnabled(true);
+}
+
+
+void KSocksConfig::load()
+{
+ KConfigGroup config(kapp->config(), "Socks");
+ base->_c_enableSocks->setChecked(config.readBoolEntry("SOCKS_enable", false));
+ int id = config.readNumEntry("SOCKS_method", 1);
+ base->bg->setButton(id);
+ if (id == 4) {
+ base->_c_customLabel->setEnabled(true);
+ base->_c_customPath->setEnabled(true);
+ } else {
+ base->_c_customLabel->setEnabled(false);
+ base->_c_customPath->setEnabled(false);
+ }
+ base->_c_customPath->setURL(config.readPathEntry("SOCKS_lib"));
+
+ QListViewItem *thisitem;
+ while ((thisitem = base->_c_libs->firstChild())) {
+ base->_c_libs->takeItem(thisitem);
+ delete thisitem;
+ }
+
+ QStringList libs = config.readPathListEntry("SOCKS_lib_path");
+ for(QStringList::Iterator it = libs.begin();
+ it != libs.end();
+ ++it ) {
+ new QListViewItem(base->_c_libs, *it);
+ }
+ base->_c_libs->clearSelection();
+ base->_c_remove->setEnabled(false);
+ base->_c_add->setEnabled(false);
+ base->_c_newPath->clear();
+ emit changed(false);
+}
+
+void KSocksConfig::save()
+{
+ KConfigGroup config(kapp->config(), "Socks");
+ config.writeEntry("SOCKS_enable",base-> _c_enableSocks->isChecked(), true, true);
+ config.writeEntry("SOCKS_method", base->bg->id(base->bg->selected()), true, true);
+ config.writePathEntry("SOCKS_lib", base->_c_customPath->url(), true, true);
+ QListViewItem *thisitem = base->_c_libs->firstChild();
+
+ QStringList libs;
+ while (thisitem) {
+ libs << thisitem->text(0);
+ thisitem = thisitem->itemBelow();
+ }
+ config.writePathEntry("SOCKS_lib_path", libs, ',', true, true);
+
+ kapp->config()->sync();
+
+ emit changed(false);
+}
+
+void KSocksConfig::defaults()
+{
+
+ base->_c_enableSocks->setChecked(false);
+ base->bg->setButton(1);
+ base->_c_customLabel->setEnabled(false);
+ base->_c_customPath->setEnabled(false);
+ base->_c_customPath->setURL("");
+ QListViewItem *thisitem;
+ while ((thisitem = base->_c_libs->firstChild())) {
+ base->_c_libs->takeItem(thisitem);
+ delete thisitem;
+ }
+ base->_c_newPath->clear();
+ base->_c_add->setEnabled(false);
+ base->_c_remove->setEnabled(false);
+ emit changed(true);
+}
+
+QString KSocksConfig::quickHelp() const
+{
+ return i18n("<h1>SOCKS</h1><p>This module allows you to configure KDE support"
+ " for a SOCKS server or proxy.</p><p>SOCKS is a protocol to traverse firewalls"
+ " as described in <a href=\"http://rfc.net/rfc1928.html\">RFC 1928</a>."
+ " <p>If you have no idea what this is and if your system administrator does not"
+ " tell you to use it, leave it disabled.</p>");
+}
+
+
+#include "socks.moc"
+
diff --git a/kcontrol/kio/socks.h b/kcontrol/kio/socks.h
new file mode 100644
index 000000000..1d950f607
--- /dev/null
+++ b/kcontrol/kio/socks.h
@@ -0,0 +1,73 @@
+/**
+ * socks.h
+ *
+ * Copyright (c) 2001 George Staikos <staikos@kde.org>
+ * Copyright (c) 2001 Daniel Molkentin <molkentin@kde.org> (designer port)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _SOCKS_H
+#define _SOCKS_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kcmodule.h>
+
+#include "socksbase.h"
+
+
+class QVButtonGroup;
+
+class KSocksConfig : public KCModule
+{
+ Q_OBJECT
+public:
+ KSocksConfig(QWidget *parent);
+ virtual ~KSocksConfig();
+
+ SocksBase *base;
+
+ void load();
+ void save();
+ void defaults();
+
+ int buttons();
+ QString quickHelp() const;
+
+public slots:
+ void configChanged();
+
+private slots:
+ void enableChanged();
+ void methodChanged(int id);
+ void testClicked();
+ void chooseCustomLib(KURLRequester *url);
+ void customPathChanged(const QString&);
+ void addLibrary();
+ void libTextChanged(const QString& lib);
+ void addThisLibrary(const QString& lib);
+ void removeLibrary();
+ void libSelection();
+
+private:
+
+ bool _socksEnabled;
+ int _useWhat;
+};
+
+#endif
diff --git a/kcontrol/kio/socks.upd b/kcontrol/kio/socks.upd
new file mode 100644
index 000000000..ed0383275
--- /dev/null
+++ b/kcontrol/kio/socks.upd
@@ -0,0 +1,8 @@
+# Hello world
+Id=kde3.0/r1
+File=ksocksrc,kdeglobals
+Group=<default>,Socks
+Key=Custom Lib,SOCKS_lib
+Key=Enable SOCKS,SOCKS_enable
+Key=Lib Path,SOCKS_lib_path
+Key=SOCKS Method,SOCKS_method
diff --git a/kcontrol/kio/socksbase.ui b/kcontrol/kio/socksbase.ui
new file mode 100644
index 000000000..5def84076
--- /dev/null
+++ b/kcontrol/kio/socksbase.ui
@@ -0,0 +1,335 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>SocksBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SocksBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>455</width>
+ <height>402</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>SOCKS</string>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_c_enableSocks</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Enable SOCKS support</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this to enable SOCKS4 and SOCKS5 support in KDE applications and I/O subsystems.</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>bg</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>SOCKS Implementation</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>_c_detect</cstring>
+ </property>
+ <property name="text">
+ <string>A&amp;uto detect</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>1</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If you select Autodetect, then KDE will automatically search for an implementation of SOCKS on your computer.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="1">
+ <property name="name">
+ <cstring>_c_NEC</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;NEC SOCKS</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>2</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This will force KDE to use NEC SOCKS if it can be found.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>_c_custom</cstring>
+ </property>
+ <property name="text">
+ <string>Use &amp;custom library</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>4</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select custom if you wish to use an unlisted SOCKS library. Please note that this may not always work as it depends on the API of the library which you specify (below).</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>_c_customLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Path:</string>
+ </property>
+ <property name="indent">
+ <number>20</number>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>_c_customPath</cstring>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>_c_customPath</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter the path to an unsupported SOCKS library.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QRadioButton" row="0" column="2">
+ <property name="name">
+ <cstring>_c_Dante</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Dante</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>3</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This will force KDE to use Dante if it can be found.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>_c_addPaths</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Additional Library Search Paths</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can specify additional directories to search for the SOCKS libraries. /usr/lib, /usr/local/lib, /usr/local/socks5/lib and /opt/socks5/lib are already searched by default.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Path</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>_c_libs</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is the list of additional paths that will be searched.</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>_c_newPath</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>25</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>_c_add</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>_c_remove</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>_c_test</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Test</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to test SOCKS support.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>_c_enableSocks</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>bg</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>_c_enableSocks</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>_c_addPaths</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>_c_enableSocks</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>_c_test</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in declaration">kurlrequester.h</include>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/kio/uagentproviderdlg.cpp b/kcontrol/kio/uagentproviderdlg.cpp
new file mode 100644
index 000000000..3b71b29f4
--- /dev/null
+++ b/kcontrol/kio/uagentproviderdlg.cpp
@@ -0,0 +1,149 @@
+/**
+ * Copyright (c) 2001 Dawit Alemayehu <adawit@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlistbox.h>
+#include <qwhatsthis.h>
+#include <qpushbutton.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kcombobox.h>
+#include <klineedit.h>
+#include <kurllabel.h>
+
+#include "fakeuaprovider.h"
+#include "uagentproviderdlg.h"
+#include "uagentproviderdlg_ui.h"
+
+UALineEdit::UALineEdit( QWidget *parent, const char *name )
+ :KLineEdit( parent, name )
+{
+ // For now do not accept any drops since they might contain
+ // characters we do not accept.
+ // TODO: Re-implement ::dropEvent to allow acceptable formats...
+ setAcceptDrops( false );
+}
+
+void UALineEdit::keyPressEvent( QKeyEvent* e )
+{
+ int key = e->key();
+ QString keycode = e->text();
+ if ( (key >= Qt::Key_Escape && key <= Qt::Key_Help) || key == Qt::Key_Period ||
+ (cursorPosition() > 0 && key == Qt::Key_Minus) ||
+ (!keycode.isEmpty() && keycode.unicode()->isLetterOrNumber()) )
+ {
+ KLineEdit::keyPressEvent(e);
+ return;
+ }
+ e->accept();
+}
+
+UAProviderDlg::UAProviderDlg( const QString& caption, QWidget *parent,
+ FakeUASProvider* provider, const char *name )
+ :KDialog(parent, name, true), m_provider(provider)
+{
+ setCaption ( caption );
+
+ QVBoxLayout* mainLayout = new QVBoxLayout(this, 0, 0);
+
+ dlg = new UAProviderDlgUI (this);
+ mainLayout->addWidget(dlg);
+ //dlg->leIdentity->setEnableSqueezedText( true );
+
+ if (!m_provider)
+ {
+ setEnabled( false );
+ return;
+ }
+
+ init();
+}
+
+UAProviderDlg::~UAProviderDlg()
+{
+}
+
+void UAProviderDlg::init()
+{
+ connect( dlg->pbOk, SIGNAL(clicked()), SLOT(accept()) );
+ connect( dlg->pbCancel, SIGNAL(clicked()), SLOT(reject()) );
+
+ connect( dlg->leSite, SIGNAL(textChanged(const QString&)),
+ SLOT(slotTextChanged( const QString&)) );
+
+ connect( dlg->cbAlias, SIGNAL(activated(const QString&)),
+ SLOT(slotActivated(const QString&)) );
+
+ dlg->cbAlias->clear();
+ dlg->cbAlias->insertStringList( m_provider->userAgentAliasList() );
+ dlg->cbAlias->insertItem( "", 0 );
+ dlg->cbAlias->listBox()->sort();
+
+ dlg->leSite->setFocus();
+}
+
+void UAProviderDlg::slotActivated( const QString& text )
+{
+ if ( text.isEmpty() )
+ dlg->leIdentity->setText( "" );
+ else
+ dlg->leIdentity->setText( m_provider->agentStr(text) );
+
+ dlg->pbOk->setEnabled( (!dlg->leSite->text().isEmpty() && !text.isEmpty()) );
+}
+
+void UAProviderDlg::slotTextChanged( const QString& text )
+{
+ dlg->pbOk->setEnabled( (!text.isEmpty() && !dlg->cbAlias->currentText().isEmpty()) );
+}
+
+void UAProviderDlg::setSiteName( const QString& text )
+{
+ dlg->leSite->setText( text );
+}
+
+void UAProviderDlg::setIdentity( const QString& text )
+{
+ int id = dlg->cbAlias->listBox()->index( dlg->cbAlias->listBox()->findItem(text) );
+ dlg->cbAlias->setCurrentItem( id );
+ slotActivated( dlg->cbAlias->currentText() );
+ if ( !dlg->leSite->isEnabled() )
+ dlg->cbAlias->setFocus();
+}
+
+QString UAProviderDlg::siteName()
+{
+ QString site_name=dlg->leSite->text().lower();
+ site_name = site_name.remove( "https://" );
+ site_name = site_name.remove( "http://" );
+ return site_name;
+}
+
+QString UAProviderDlg::identity()
+{
+ return dlg->cbAlias->currentText();
+}
+
+QString UAProviderDlg::alias()
+{
+ return dlg->leIdentity->text();
+}
+
+#include "uagentproviderdlg.moc"
diff --git a/kcontrol/kio/uagentproviderdlg.h b/kcontrol/kio/uagentproviderdlg.h
new file mode 100644
index 000000000..67b38d42e
--- /dev/null
+++ b/kcontrol/kio/uagentproviderdlg.h
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2001 Dawit Alemayehu <adawit@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __UAPROVIDERDLG_H___
+#define __UAPROVIDERDLG_H___
+
+
+#include <kdialog.h>
+#include <klineedit.h>
+
+
+class FakeUASProvider;
+class UAProviderDlgUI;
+
+class UALineEdit : public KLineEdit
+{
+ Q_OBJECT
+
+public:
+ UALineEdit( QWidget *parent, const char *name=0 );
+
+protected:
+ virtual void keyPressEvent( QKeyEvent * );
+};
+
+class UAProviderDlg : public KDialog
+{
+ Q_OBJECT
+
+public:
+ UAProviderDlg( const QString& caption, QWidget *parent = 0,
+ FakeUASProvider* provider = 0, const char *name = 0 );
+ ~UAProviderDlg();
+
+ void setSiteName( const QString& );
+ void setIdentity( const QString& );
+
+ QString siteName();
+ QString identity();
+ QString alias();
+
+protected slots:
+ void slotActivated( const QString& );
+ void slotTextChanged( const QString& );
+
+protected:
+ void init();
+
+private:
+ FakeUASProvider* m_provider;
+ UAProviderDlgUI* dlg;
+};
+#endif
diff --git a/kcontrol/kio/uagentproviderdlg_ui.ui b/kcontrol/kio/uagentproviderdlg_ui.ui
new file mode 100644
index 000000000..6f2a006ec
--- /dev/null
+++ b/kcontrol/kio/uagentproviderdlg_ui.ui
@@ -0,0 +1,207 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>UAProviderDlgUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>UAProviderDlgUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>298</width>
+ <height>240</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>lbSite</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;When browsing the following site:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leSite</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the site or domain name where a fake browser identification should be used.&lt;p&gt;
+&lt;u&gt;NOTE:&lt;/u&gt; Wildcard syntax such as \"*,?\" is NOT allowed: instead, use the top level address of a site to make generic matches; for example, if you want all KDE sites to receive a fake browser identification, you would enter &lt;code&gt;.kde.org&lt;/code&gt; - the fake identity would then be sent to any KDE site that ends with &lt;code&gt;.kde.org&lt;/code&gt;.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="0">
+ <property name="name">
+ <cstring>leSite</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Enter the site or domain name where a fake browser identification should be used.&lt;p&gt;
+&lt;u&gt;NOTE:&lt;/u&gt; Wildcard syntax such as \"*,?\" is NOT allowed: instead, use the top level address of a site to make generic matches; for example, if you want all KDE sites to receive a fake browser identification, you would enter &lt;code&gt;.kde.org&lt;/code&gt; - the fake identity would then be sent to any KDE site that ends with &lt;code&gt;.kde.org&lt;/code&gt;.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>lbAlias</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use the following identification:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leIdentity</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Select the browser identification to use whenever contacting the site you specified above.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="3" column="0">
+ <property name="name">
+ <cstring>cbAlias</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Select the browser identification to use whenever contacting the site you specified above.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>lbIdentity</cstring>
+ </property>
+ <property name="text">
+ <string>Real identification:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leIdentity</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+The actual browser identification text that will be sent to the remote machine.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="5" column="0">
+ <property name="name">
+ <cstring>leIdentity</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+The actual browser identification text that will be sent to the remote machine.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <spacer row="6" column="0">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="8" column="0">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>29</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbOk</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="Line" row="7" column="0">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>kcombobox.h</includehint>
+ <includehint>klineedit.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/kio/uasprovider.desktop b/kcontrol/kio/uasprovider.desktop
new file mode 100644
index 000000000..a8fe24b0d
--- /dev/null
+++ b/kcontrol/kio/uasprovider.desktop
@@ -0,0 +1,98 @@
+[Desktop Entry]
+Type=ServiceType
+X-KDE-ServiceType=UserAgentStrings
+Comment=UserAgent Strings
+Comment[af]=Gebruiker agent Stringe
+Comment[ar]=سلاسل UserAgent
+Comment[az]=İstifadəçi Vasitəsi Kəliməsi
+Comment[be]=Радкі ідэнтыфікацыі вандроўніка UserAgent
+Comment[bg]=Идентификация на браузъра
+Comment[bs]=UserAgent stringovi
+Comment[ca]=Regles de l'agent d'usuari
+Comment[cs]=Řetězce uživatelského agenta
+Comment[csb]=Miona "Programë Brëkòwnika"
+Comment[cy]=Llinynnau Asiant y Defnyddiwr
+Comment[da]=Brugeragent-strenge
+Comment[de]=Browserkennungen
+Comment[el]=Συμβολοσειρές πράκτορα χρήστη
+Comment[eo]=Uzantoagento-frazoj
+Comment[es]=Cadenas del Agente de Usuario
+Comment[et]=Veebilehitseja identifikaatorid
+Comment[eu]=Erabiltzaile agentearen kateak
+Comment[fa]=رشته‌های عامل‌ کاربر
+Comment[fi]=Käyttäjäagenttimerkkijonot
+Comment[fr]=Chaînes d'identité du navigateur
+Comment[fy]=regels foar brûkersagint
+Comment[ga]=Teaghráin UserAgent
+Comment[gl]=Cadeas do Axente de Usuario
+Comment[he]=מחרוזות זיהוי דפדפן
+Comment[hi]=यूज़रएजेंट स्ट्रिंग्स
+Comment[hr]=Identifikacijske (UA - UserAgent) poruke
+Comment[hu]=Böngészőazonosítók
+Comment[is]=UserAgent strengir
+Comment[it]=Stringhe User Agent
+Comment[ja]=UserAgent 文字列
+Comment[ka]=Строки UserAgent
+Comment[kk]=UserAgent жолдары
+Comment[km]=ខ្សែ​អក្សរ​ភ្នាក់ងារ​អ្នក​ប្រើ
+Comment[ko]=UserAgent 문자열
+Comment[lo]=ຂໍ້ຄວາມສະແດງຕົວເຄື່ອງມືຂອງຜູ້ໃຊ້
+Comment[lt]=Vartojo agento eilutės
+Comment[lv]=LietotājaAģenta Rinda
+Comment[mk]=UserAgent низи
+Comment[mn]=UserAgent-Таних тэмдэг
+Comment[ms]=Rentetan Ejen Pengguna
+Comment[mt]=Test tal-UserAgent
+Comment[nb]=Brukeragentstrenger
+Comment[nds]=Nettkieker-Kennen instellen
+Comment[ne]=प्रयोगकर्ता एजेन्ट स्ट्रिङ
+Comment[nl]=regels voor Gebruikersagent
+Comment[nn]=Brukaragentstrengar
+Comment[nso]=Methalofoko ya Mothusi wa Modirisi
+Comment[pa]=ਉਪਭੋਗੀ-ਏਜੰਟ ਸਤਰਾਂ
+Comment[pl]=Nazwy "Programu Użytkownika"
+Comment[pt]=Mensagens do agente do utilizador
+Comment[pt_BR]=Strings de Agente de Usuários
+Comment[ro]=Texte "User Agent"
+Comment[ru]=Строки UserAgent
+Comment[rw]=Amakurikiranyanyuguti UmukoziUkoresha
+Comment[se]=Geavaheaddjeageanta-dovdamearkkat
+Comment[sk]=Reťazce WWW agenta
+Comment[sl]=Nizi uporabniškega agenta
+Comment[sr]=UserAgent низови
+Comment[sr@Latn]=UserAgent nizovi
+Comment[sv]=Användaragentsträngar
+Comment[ta]=பயன்படுத்துபவர் தொடர்ச்சிகள்
+Comment[tg]=Сатри оҷонсии корбар
+Comment[th]=ข้อความแสดงตัวเครื่องมือของผู้ใช้
+Comment[tr]=UserAgent Dizileri
+Comment[tt]=UserAgent Sätirläre
+Comment[uk]=Рядки агента користувача
+Comment[ven]=Mutevhe wa vhashumisi
+Comment[vi]=Chuỗi UserAgent
+Comment[wa]=Tchinnes d' idintité do betchteu
+Comment[xh]=Iqela lamagama UserAgent
+Comment[zh_CN]=用户代理设置
+Comment[zh_TW]=使用者代理字串設定
+Comment[zu]=Iqoqo lamagama lommeli womsebenzisi
+
+[PropertyDef::X-KDE-UA-TAG]
+Type=QString
+
+[PropertyDef::X-KDE-UA-FULL]
+Type=QString
+
+[PropertyDef::X-KDE-UA-NAME]
+Type=QString
+
+[PropertyDef::X-KDE-UA-VERSION]
+Type=QString
+
+[PropertyDef::X-KDE-UA-SYSNAME]
+Type=QString
+
+[PropertyDef::X-KDE-UA-SYSRELEASE]
+Type=QString
+
+[PropertyDef::X-KDE-UA-DYNAMIC-ENTRY]
+Type=bool
diff --git a/kcontrol/kio/uasproviders/Makefile.am b/kcontrol/kio/uasproviders/Makefile.am
new file mode 100644
index 000000000..b929efc1b
--- /dev/null
+++ b/kcontrol/kio/uasproviders/Makefile.am
@@ -0,0 +1,14 @@
+services_DATA = ie401onwinnt4.desktop ie45onwinnt5.desktop ie501onwinnt5.desktop \
+ ie50onppc.desktop \
+ ie55onwin98.desktop ie55onwinnt5.desktop ie60onwinnt51.desktop \
+ ie60oncurrent.desktop mozonwinxp.desktop mozonwin2000.desktop \
+ mozoncurrent16.desktop mozoncurrent12.desktop \
+ mozoncurrent.desktop nn301oncurrent.desktop nn475onwin95.desktop \
+ nn475oncurrent.desktop nn476onppc.desktop op403onwinnt4.desktop \
+ lynxoncurrent.desktop w3moncurrent.desktop wgetoncurrent.desktop \
+ ns71oncurrent.desktop ns71onwinnt51.desktop op75oncurrent.desktop \
+ safari12.desktop safari20.desktop googlebot.desktop \
+ firefox10oncurrent.desktop firefox15oncurrent.desktop
+
+servicesdir = $(kde_servicesdir)/useragentstrings
+
diff --git a/kcontrol/kio/uasproviders/firefox10oncurrent.desktop b/kcontrol/kio/uasproviders/firefox10oncurrent.desktop
new file mode 100644
index 000000000..1cfae8d0a
--- /dev/null
+++ b/kcontrol/kio/uasproviders/firefox10oncurrent.desktop
@@ -0,0 +1,70 @@
+[Desktop Entry]
+Name=UADescription (Firefox 1.0 on current)
+Name[af]=UA-beskrywing (Firefox 1.0 op huidige bedryfstelsel)
+Name[be]=UADescription (Firefox 1.0 на гэтай сістэме)
+Name[bs]=UADescription (Firefox 1.0 na trenutnom)
+Name[ca]=Descripció UA (Firefox 1.0 a l'actual)
+Name[cs]=Popis agenta (Firefox 1.0 na aktuálním)
+Name[csb]=Òpis programë brëkòwnika (FireFox 1.0)
+Name[da]=Brugeragentbeskrivelse (Firefox 1.0 på denne)
+Name[de]=Browserkennung (Firefox 1.0 unter aktuellem Betriebssystem)
+Name[el]=Περιγραφή UA (Firefox 1.0 στο τρέχον σύστημα)
+Name[eo]=UA-Priskribo (Fajrovulpo 1.0 sub nuna)
+Name[es]=UADescription (Firefox 1.0 en actual)
+Name[et]=UADescription (Selles masinas töötav Firefox 1.0)
+Name[eu]=UA azalpena (Firefox 1.0 unekoan)
+Name[fa]=UADescription (Firefox 1.0 در حال حاضر)
+Name[fi]=Käyttäjäagenttikuvaus (Firefox 1.0)
+Name[fr]=Identité du navigateur (Firefox 1.0 sous le système actuel)
+Name[fy]=GA-omskriuwing (Firefox 1.0 op aktive)
+Name[ga]=UADescription (Firefox 1.0 ar an gcóras reatha)
+Name[gl]=UADescription (Firefox 3.01 no actual)
+Name[he]=UADescription (Firefox 1.0 בנוכחי)
+Name[hr]=UADescription (Firefox 1.0 na trenutnom)
+Name[hu]=Böngészőtípus (Firefox 1.0)
+Name[id]=UADescription (Firefox 1.0)
+Name[is]=UAD strengur (Firefox 1.0 á núverandi)
+Name[it]=DescrizioneUA (Firefox 1.0 su sistema attuale)
+Name[ka]=UADescription (Firefox 1.0 მიმდინარე სისტემაში)
+Name[kk]=UADescription (Firefox 1.0 осы орында)
+Name[km]=UADescription (Firefox 1.0 បច្ចុប្បន្ន)
+Name[ko]=UADescription (현재 플랫폼의 Firefox 1.5)
+Name[lt]=Naudotojo agento aprašymas (Firefox 1.0 ir esama)
+Name[lv]=UAApraksts (Firefox 1.0 uz tekošā)
+Name[mk]=UADescription (Firefox 1.0 на тековно)
+Name[nb]=Brukeragent (Firefox 1.0 på denne)
+Name[nds]=UA-Beschrieven (Firefox 1.0 op dit Systeem)
+Name[ne]=UA वर्णन (हाल फायरफक्स 1.0 मा)
+Name[nl]=GA-beschrijving (Firefox 1.0 op huidige)
+Name[nn]=Brukaragent (Firefox 1.0 herifrå)
+Name[pa]=UADescription (ਮੌਜੂਦਾ Firefox 1.0 ਉੱਤੇ)
+Name[pl]=Opis przeglądarki użytkownika (FireFox 1.0 na bieżącym systemie)
+Name[pt]=UADescription (Firefox 1.0 no sistema actual)
+Name[pt_BR]=UADescription (Firefox 1.0 no sistema atual)
+Name[ro]=Descriere UA (Firefox 1.0 pentru sistemul de operare curent)
+Name[ru]=UADescription (Firefox 1.0 на текущей системе)
+Name[rw]=UADescription (Firefox 1.0 ku igezweho)
+Name[se]=UA-čilgehus (Firefox 1.0 dán mašiinnas)
+Name[sl]=UAOpis (Firefox 1.0 na trenutnem)
+Name[sr]=UADescription (Firefox 1.0 на тренутном)
+Name[sr@Latn]=UADescription (Firefox 1.0 na trenutnom)
+Name[sv]=AA-beskrivning (Firefox 1.0 på aktuell)
+Name[ta]=UAவிவரம் (Firefox 1.0 on current)
+Name[tg]=UADescription (Системаи ҷорӣ Firefox 1.0)
+Name[th]=UADescription (ไฟร์ฟอกซ์ 1.0 บนระบบปัจจุบัน)
+Name[tr]=UA Tanımı (Firefox 1.0)
+Name[tt]=UADescription (Firefox 1.0, şul uq astında)
+Name[uk]=UADescription (Firefox 1.0 на поточній)
+Name[uz]=UADescription (joriy bilan Firefox 1.0)
+Name[uz@cyrillic]=UADescription (жорий билан Firefox 1.0)
+Name[vi]=Mô tả UA (đang dùng Firefox 1.0)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Firefox 1.0 sol ci do moumint)
+Name[zh_CN]=用户代理描述 (运行于本机的 Firefox 1.0)
+Name[zh_TW]=使用者代理描述 (Firefox 1.0 on current)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=FF
+X-KDE-UA-FULL=Mozilla/5.0 (appPlatform; U; appMachineType appSysName; appLanguage; rv:1.7.12) Gecko/20050915 Firefox/1.0.7
+X-KDE-UA-NAME=Firefox
+X-KDE-UA-VERSION=1.0.7
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/firefox15oncurrent.desktop b/kcontrol/kio/uasproviders/firefox15oncurrent.desktop
new file mode 100644
index 000000000..ecea40004
--- /dev/null
+++ b/kcontrol/kio/uasproviders/firefox15oncurrent.desktop
@@ -0,0 +1,58 @@
+[Desktop Entry]
+Name=UADescription (Firefox 1.5 on current)
+Name[bg]=UADescription (текущо Firefox 1.5)
+Name[ca]=Descripció UA (Firefox 1.5 a l'actual)
+Name[cs]=Popis UA (Firefox 1.5 na aktuálním)
+Name[csb]=Òpis programë brëkòwnika (FireFox 1.5)
+Name[da]=Brugeragentbeskrivelse (Firefox 1.5 på denne)
+Name[de]=Browserkennung (Firefox 1.5 unter aktuellem Betriebssystem)
+Name[el]=Περιγραφή UA (Firefox 1.5 στο τρέχον σύστημα)
+Name[eo]=UA-Priskribo (Fajrovulpo 1.5 sub nuna)
+Name[es]=UADescription (Firefox 1.5 en actual)
+Name[et]=UADescription (Selles masinas töötav Firefox 1.5)
+Name[fa]=UADescription (Firefox 1.5 در حال حاضر)
+Name[fi]=Käyttäjäagenttikuvaus (Firefox 1.5)
+Name[fr]=Identité du navigateur (Firefox 1.5 sous le système actuel)
+Name[fy]=GA-omskriuwing (Firefox 1.5 op aktive)
+Name[gl]=UADescription (Firefox 1.5 na actual)
+Name[he]=UADescription (Firefox 1.5 בנוכחי)
+Name[hr]=UADescription (Firefox 1.5 na trenutnom)
+Name[hu]=Böngészőtípus (Firefox 1.5)
+Name[id]=UADescription (Firefox 1.5)
+Name[is]=UAD strengur (Firefox 1.5 á núverandi)
+Name[it]=DescrizioneUA (Firefox 1.5 su sistema attuale)
+Name[kk]=UADescription (Firefox 1.5 осы орында)
+Name[km]=UADescription (Firefox 1.5 បច្ចុប្បន្ន)
+Name[ko]=UADescription (현재 플랫폼의 Firefox 1.5)
+Name[lt]=Naudotojo agento aprašymas (Firefox 1.5 šioje sistemoje)
+Name[nb]=Brukeragent (Firefox 1.5 på denne)
+Name[nds]=UA-Beschrieven (Firefox 1.5 op dit Systeem)
+Name[ne]=यूए वर्णन (हाल फायरफक्स १.०)
+Name[nl]=GA-beschrijving (Firefox 1.0 op huidige machine/besturingssysteem)
+Name[nn]=Brukaragent (Firefox 1.5 herifrå)
+Name[pa]=UADescription (ਮੌਜੂਦਾ ਉੱਤੇ 1.5)
+Name[pl]=Opis przeglądarki użytkownika (Firefox 1.5 na bieżącym systemie)
+Name[pt]=UADescription (Firefox 1.5 no sistema actual)
+Name[pt_BR]=UADescription (Firefox 1.5 no sistema atual)
+Name[ro]=Descriere UA (Firefox 1.5 pe curent)
+Name[ru]=UADescription (Firefox 1.5 на текущей системе)
+Name[sl]=UAOpis (Firefox 1.5 na trenutnem)
+Name[sr]=UADescription (Firefox 1.5 на тренутном)
+Name[sr@Latn]=UADescription (Firefox 1.5 na trenutnom)
+Name[sv]=AA-beskrivning (Firefox 1.5 på aktuell)
+Name[tg]=UADescription (Системаи ҷорӣ Firefox 1.5)
+Name[th]=UADescription (ไฟร์ฟอกซ์ 1.5 บนระบบปัจจุบัน)
+Name[tr]=UA Tanımı (Firefox 1.5)
+Name[uk]=UADescription (Firefox 1.5 на поточній)
+Name[uz]=UADescription (joriy bilan Firefox 1.5)
+Name[uz@cyrillic]=UADescription (жорий билан Firefox 1.5)
+Name[vi]=Mô tả UA (đang dùng Firefox 1.5)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Firefox 1.5 sol ci moumint)
+Name[zh_TW]=使用者代理描述 (Firefox 1.5 on current)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=FF
+X-KDE-UA-FULL=Mozilla/5.0 (appPlatform; U; appMachineType appSysName; appLanguage; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
+X-KDE-UA-NAME=Firefox
+X-KDE-UA-VERSION=1.5.0.4
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/googlebot.desktop b/kcontrol/kio/uasproviders/googlebot.desktop
new file mode 100644
index 000000000..4644e13bf
--- /dev/null
+++ b/kcontrol/kio/uasproviders/googlebot.desktop
@@ -0,0 +1,44 @@
+[Desktop Entry]
+Name=UADescription (Googlebot/2.1)
+Name[af]=UA-beskrywing (Googlebot/2.1)
+Name[az]=İA İzahatı (Googlebot/2.1)
+Name[ca]=Descripció UA (Googlebot/2.1)
+Name[cs]=Popis agenta (Googlebot/2.1)
+Name[csb]=Òpis programë brëkòwnika (Googlebot/2.1)
+Name[de]=Browserkennung (Googlebot/2.1)
+Name[el]=Περιγραφή UA (Googlebot/2.1)
+Name[eo]=UA-Priskribo (Googlebot/2.1)
+Name[eu]=UA azalpena (Wget 1.5.3)
+Name[fi]=Käyttäjäagenttikuvaus (Googlebot/2.1)
+Name[fr]=Identité du navigateur (Googlebot/2.1)
+Name[fy]=GA-omskriuwing (Googlebot/2.1)
+Name[hi]=यूए-डिस्क्रिप्शन (गूगलबॉट/2.1)
+Name[hu]=Böngészőtípus (Googlebot/2.1)
+Name[is]=UAD strengur (Googlebot/2.1)
+Name[it]=DescrizioneUA (Googlebot/2.1)
+Name[lt]=Naudotojo agento aprašymas (Googlebot/2.1)
+Name[lv]=UAApraksts (Googlebot/2.1)
+Name[nb]=Brukeragent (Googlebot/2.1)
+Name[nds]=UA-Beschrieven (Googlebot/2.1)
+Name[ne]=UA वर्णन (गुगलबुट/2.1)
+Name[nl]=GA-beschrijving (Googlebot/2.1)
+Name[nn]=Brukaragent (Googlebot/2.1)
+Name[pl]=Opis przeglądarki użytkownika (Googlebot/2.1)
+Name[pt_BR]=Descrição (Googlebot/2.1)
+Name[ro]=Descriere UA (Googlebot/2.1)
+Name[se]=UA-čilgehus (Googlebot/2.1)
+Name[sl]=UAOpis (Googlebot/2.1)
+Name[sv]=AA-beskrivning (Googlebot/2.1)
+Name[ta]=UAவிவரம் (Googlebot/2.1)
+Name[tg]=UADescription (Системаи ҷорӣ Googlebot/2.1)
+Name[tr]=UA Tanımı (Googlebot/2.1)
+Name[vi]=Mô tả UA (Googlebot/2.1)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Googlebot/2.1)
+Name[zh_CN]=用户代理描述 (Google 机器人/2.1)
+Name[zh_TW]=使用者代理描述 (Googlebot/2.1)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=MISC
+X-KDE-UA-FULL=Googlebot/2.1 (+http://www.googlebot.com/bot.html)
+X-KDE-UA-NAME=Googlebot
+X-KDE-UA-VERSION=2.1
diff --git a/kcontrol/kio/uasproviders/ie401onwinnt4.desktop b/kcontrol/kio/uasproviders/ie401onwinnt4.desktop
new file mode 100644
index 000000000..661590037
--- /dev/null
+++ b/kcontrol/kio/uasproviders/ie401onwinnt4.desktop
@@ -0,0 +1,80 @@
+[Desktop Entry]
+Name=UADescription (IE 4.01 on Win 2000)
+Name[af]=UA-beskrywing (IE 4.01 op Win 2000)
+Name[be]=UADescription (IE 4.01 на Win 2000)
+Name[br]=UADescription (IE 4.01 war Win 2000)
+Name[ca]=Descripció de AU (IE 4.01 en Windows 2000)
+Name[cs]=Popis agenta (IE 4.01 na Win 2000)
+Name[csb]=Òpis programë brëkòwnika (IE 4.01 na Win 2000)
+Name[cy]=UADisgrifiad (IE 4.01 ar Win 2000)
+Name[da]=Brugeragentbeskrivelse (IE 4.01 på Win 2000)
+Name[de]=Browserkennung (IE 4.01 auf Windows 2000)
+Name[el]=Περιγραφή UA (IE 4.01 σε Win 2000)
+Name[eo]=UA-Priskribo (IE 4.01 sur Vindozo 2000)
+Name[es]=Descripción de AU (IE 4.01 en Windows 2000)
+Name[et]=UADescription (IE 4.01 Win2000 platvormil)
+Name[eu]=UA azalpena (IE 4.01 Win 2000-n)
+Name[fa]=UADescription (IE 4.01 در Win 2000)
+Name[fi]=Käyttäjäagenttikuvaus (IE 4.01 Win 2000:lla)
+Name[fr]=Identité du navigateur (IE 4.01 sous Windows 2000)
+Name[fy]=GA-omskriuwing (IE 4.01 op Win 2000)
+Name[ga]=UADescription (IE 4.01 ar Win 2000)
+Name[gl]=UADescription (IE 4.01 en Win 2000)
+Name[he]=UADescription (Win 2000ב־ IE 4.01)
+Name[hi]=यूएडी-डिस्क्रिप्शन (IE 4.01 विन 2000 पर)
+Name[hr]=UADescription (IE 4.01 na Win 2000)
+Name[hu]=Böngészőtípus (IE 4.01, Win 2000)
+Name[id]=UADescription (IE 4.01 di Win 2000)
+Name[is]=UAD strengur (IE 4.01 on Win 2000)
+Name[it]=DescrizioneUA (IE 4.01 su Win 2000)
+Name[ka]=UADescription (IE 4.01 Win 2000-ში)
+Name[kk]=UADescription (IE 4.01 / Win 2000)
+Name[km]=UADescription (IE 4.01 នៅ​លើ Win 2000)
+Name[ko]=UADescription (윈도 2000의 IE 4.01)
+Name[lo]=UADescription (IE 4.5 on Win 2000)
+Name[lt]=Naudotojo agento aprašymas (IE 4.01 ir Win 2000)
+Name[lv]=UAApraksts (IE 4.01 uz Win 2000)
+Name[mk]=UADescription (IE 4.01 на Win 2000)
+Name[mn]=UserAgent-Тодорхойлолт (IE 4.01 on Win 2000)
+Name[mt]=UADescription (IE 4.01 fuq Win 2000)
+Name[nb]=Brukeragent (IE 4.01 på Win 2000)
+Name[nds]=UA-Beschrieven (IE 4.01 op Win 2000)
+Name[ne]=UA वर्णन (Win 2000 मा IE 4.01)
+Name[nl]=GA-beschrijving (IE 4.01 op Win 2000)
+Name[nn]=Brukaragent (IE 4.01 på Win 2000)
+Name[nso]=UAThlaloso (IE 4.01 go Win 2000)
+Name[pa]=UADescription (ਵਿੰਡੋ ੨੦੦੦ 'ਤੇ IE 4.01)
+Name[pl]=Opis przeglądarki użytkownika (IE 4.01 na Win 2000)
+Name[pt]=UADescription (IE 4.01 no Win 2000)
+Name[pt_BR]=Descrição (IE 4.01 no Win 2000)
+Name[ro]=Descriere UA (IE 4.01 pentru Win 2000)
+Name[ru]=UADescription (IE 4.01 на Win 2000)
+Name[rw]=UADescription (IE 4.01 kuri Win 2000)
+Name[se]=UA-čilgehus (IE 4.01 ja Win 2000)
+Name[sk]=Popis agenta (IE 4.01 na Win 2000)
+Name[sl]=UAOpis (IE 4.01 na Windows 2000)
+Name[sr]=UADescription (IE 4.01 на Win 2000)
+Name[sr@Latn]=UADescription (IE 4.01 na Win 2000)
+Name[sv]=AA-beskrivning (IE 4.01 på Win 2000)
+Name[ta]=UAவிவரம் (IE 4.01 on Win 2000)
+Name[tg]=ТавзеҳиUA (IE 4.01 ба Win 2000)
+Name[th]=UADescription (IE 4.01 บน Win 2000)
+Name[tr]=UA Tanımı (Win 2000 üzerinde IE 4.01)
+Name[tt]=UADescription (IE 4.01, Win 2000 astında)
+Name[uk]=UADescription (IE 4.01 на Win 2000)
+Name[uz]=UADescription (Win 2000 bilan IE 4.01)
+Name[uz@cyrillic]=UADescription (Win 2000 билан IE 4.01)
+Name[ven]=Thalutshedzo ya UA (IE 4.01 on Win 2000)
+Name[vi]=Mô tả UA (IE 4.01 trên Win 2000)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (IE 4.01 so Win 2000)
+Name[xh]=UADescription (IE 4.01 kwi Win 2000)
+Name[zh_CN]=用户代理描述 (运行于 Win 2000 的 IE 4.01)
+Name[zh_TW]=使用者代理描述 (IE 4.01 on Win 2000)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=IE
+X-KDE-UA-FULL=Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)
+X-KDE-UA-NAME=Internet Explorer
+X-KDE-UA-VERSION=4.01
+X-KDE-UA-SYSNAME=Windows
+X-KDE-UA-SYSRELEASE=2000
diff --git a/kcontrol/kio/uasproviders/ie45onwinnt5.desktop b/kcontrol/kio/uasproviders/ie45onwinnt5.desktop
new file mode 100644
index 000000000..25bf059d6
--- /dev/null
+++ b/kcontrol/kio/uasproviders/ie45onwinnt5.desktop
@@ -0,0 +1,80 @@
+[Desktop Entry]
+Name=UADescription (IE 4.5 on Win 2000)
+Name[af]=UA-beskrywing (Ie 4.5 op Win 2000)
+Name[az]=UADescription (IE 5.5 on Win 2000)
+Name[be]=UADescription (IE 4.5 на Win 2000)
+Name[br]=UADescription (IE 4.5 war Win 2000)
+Name[ca]=Descripció de AU (IE 4.5 en Windows 2000)
+Name[cs]=Popis agenta (IE 4.5 na Win 2000)
+Name[csb]=Òpis programë brëkòwnika (IE 4.5 na Win 2000)
+Name[cy]=UADisgrifiad(IE 4.5 ar Win 2000)
+Name[da]=Brugeragentbeskrivelse (IE 4.5 på Win 2000)
+Name[de]=Browserkennung (IE 4.5 auf Windows 2000)
+Name[el]=Περιγραφή UA (IE 5.5 σε Win 2000)
+Name[eo]=UA-Priskribo (IE 4.5 sub Vindozo 2000)
+Name[es]=Descripción de AU (IE 4.5 en Windows 2000)
+Name[et]=UADescription (IE 4.5 Win2000 platvormil)
+Name[eu]=UA azalpena (IE 4.5 Win 2000-n)
+Name[fa]=UADescription (IE 4.5 در Win 2000)
+Name[fi]=Käyttäjäagenttikuvaus (IE 4.5 Win 2000:lla)
+Name[fr]=Identité du navigateur (IE 4.5 sous Windows 2000)
+Name[fy]=GA-omskriuwing (IE 4.5 op Win 2000)
+Name[ga]=UADescription (IE 4.5 ar Win 2000)
+Name[gl]=UADescription (IE 4.5 en Win 2000)
+Name[he]=UADescription (Win 2000ב־ IE 4.5)
+Name[hi]=यूएडी-डिस्क्रिप्शन (IE 4.5 विन 2000 पर)
+Name[hr]=UADescription (IE 4.5 na Win 2000)
+Name[hu]=Böngészőtípus (IE 4.5, Win 2000)
+Name[id]=UADescription (IE 4.5 di Win 2000)
+Name[is]=UAD strengur (IE 4.5 on Win 2000)
+Name[it]=DescrizioneUA (IE 4.5 su Win 2000)
+Name[ka]=UADescription (IE 4.5 Win 2000-ში)
+Name[kk]=UADescription (IE 4.5 / Win 2000)
+Name[km]=UADescription (IE 4.5 នៅ​លើ Win 2000)
+Name[ko]=UADescription (윈도 2000의 IE 5.5)
+Name[lt]=Naudotojo agento aprašymas (IE 4.5 ir Win 2000)
+Name[lv]=UAApraksts (IE 5.5 uz Win 2000)
+Name[mk]=UADescription (IE 4.5 на Win 2000)
+Name[mn]=UserAgent-Тодорхойлолт (IE 5.5 on Win 2000)
+Name[mt]=UADescription (IE 4.5 fuq Win 2000)
+Name[nb]=Brukeragent (IE 4.5 på Win 2000)
+Name[nds]=UA-Beschrieven (IE 4.5 op Win 2000)
+Name[ne]=UA वर्णन (Win 2000 मा IE 4.5)
+Name[nl]=GA-beschrijving (IE 4.5 op Win 2000)
+Name[nn]=Brukaragent (IE 4.5 på Win 2000)
+Name[nso]=UAThlaloso (IE 4.5 go Win 2000)
+Name[pa]=UADescription (ਵਿੰਡੋ ੨੦੦੦ 'ਤੇ IE 4.5)
+Name[pl]=Opis przeglądarki użytkownika (IE 4.5 na Win 2000)
+Name[pt]=UADescription (IE 4.5 no Win 2000)
+Name[pt_BR]=Descrição (IE 4.5 no Win 2000)
+Name[ro]=Descriere UA (IE 4.5 pentru Win 2000)
+Name[ru]=UADescription (IE 4.5 на Win 2000)
+Name[rw]=UADescription (IE 4.5 kuri Win 2000)
+Name[se]=UA-čilgehus (IE 4.5 ja Win 2000)
+Name[sk]=Popis agenta (IE 4.5 na Win 2000)
+Name[sl]=UAOpis (IE 4.5 v Windows 2000)
+Name[sr]=UADescription (IE 4.5 на Win 2000)
+Name[sr@Latn]=UADescription (IE 4.5 na Win 2000)
+Name[sv]=AA-beskrivning (IE 4.5 på Win 2000)
+Name[ta]=UAவிவரம் (IE 4.5 on Win 2000)
+Name[tg]=ТавзеҳиUA (IE 4.5 ба Win 2000)
+Name[th]=UADescription (IE 4.5 บน Win 2000)
+Name[tr]=UA Tanımı (Win 2000 üzerinde IE 4.5)
+Name[tt]=UADescription (IE 4.5, Win 2000 astında)
+Name[uk]=UADescription (IE 4.5 на Win 2000)
+Name[uz]=UADescription (Win 2000 bilan IE 4.5)
+Name[uz@cyrillic]=UADescription (Win 2000 билан IE 4.5)
+Name[ven]=Thalutshedzo ya UA (IE 4.5 on Win 2000)
+Name[vi]=Mô tả UA (IE 5.5 trên Win 2000)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (IE 4.5 so Win 2000)Name=
+Name[xh]=UADescription (IE 4.5 kwi Win 2000)
+Name[zh_CN]=用户代理描述 (运行于 Win 2000 的 IE 4.5)
+Name[zh_TW]=使用者代理描述 (IE 4.5 on Win 2000)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=IE
+X-KDE-UA-FULL=Mozilla/4.0 (compatible; MSIE 4.5; Windows NT 5.0)
+X-KDE-UA-NAME=Internet Explorer
+X-KDE-UA-VERSION=4.5
+X-KDE-UA-SYSNAME=Windows
+X-KDE-UA-SYSRELEASE=2000
diff --git a/kcontrol/kio/uasproviders/ie501onwinnt5.desktop b/kcontrol/kio/uasproviders/ie501onwinnt5.desktop
new file mode 100644
index 000000000..27b90f643
--- /dev/null
+++ b/kcontrol/kio/uasproviders/ie501onwinnt5.desktop
@@ -0,0 +1,79 @@
+[Desktop Entry]
+Name=UADescription (IE 5.01 on Win 2000)
+Name[af]=Ua-beskrywing (Ie 5.01 op Win 2000)
+Name[be]=UADescription (IE 5.01 на Win 2000)
+Name[br]=UADescription (IE 5.01 war Win 2000)
+Name[ca]=Descripció de AU (IE 5.01 en Windows 2000)
+Name[cs]=Popis agenta (IE 5.01 na Win 2000)
+Name[csb]=Òpis programë brëkòwnika (IE 5.01 na Win 2000)
+Name[cy]=UADisgrifiad (IE 5.01 ar Win 2000)
+Name[da]=Brugeragentbeskrivelse (IE 5.01 på Win 2000)
+Name[de]=Browserkennung (IE 5.01 auf Windows 2000)
+Name[el]=Περιγραφή UA (IE 5.01 σε Win 2000)
+Name[eo]=UA-Priskribo (IE 5.01 sub Vindozo 2000)
+Name[es]=Descripción de AU (IE 5.01 en Windows 2000)
+Name[et]=UADescription (IE 5.01 Win2000 platvormil)
+Name[eu]=UA azalpena (IE 5.01 Win 2000-n)
+Name[fa]=UADescription (IE 5.01 در Win 2000)
+Name[fi]=Käyttäjäagenttikuvaus (IE 5.01 Win 2000:lla)
+Name[fr]=Identité du navigateur (IE 5.01 sous Windows 2000)
+Name[fy]=GA-omskriuwing (IE 5.01 op Win 2000)
+Name[ga]=UADescription (IE 5.01 ar Win 2000)
+Name[gl]=UADescription (IE 5.01 en Win 2000)
+Name[he]=UADescription (Win 2000ב־ IE 5.01)
+Name[hi]=यूएडी-डिस्क्रिप्शन (IE 5.01 विन 2000 पर)
+Name[hr]=UADescription (IE 5.01 na Win 2000)
+Name[hu]=Böngészőtípus (IE 5.01, Win 2000)
+Name[id]=UADescription (IE 5.01 di Win 2000)
+Name[is]=UAD strengur (IE 5.01 on Win 2000)
+Name[it]=DescrizioneUA (IE 5.01 su Win 2000)
+Name[ka]=UADescription (IE 5.01 Win 2000-ში)
+Name[kk]=UADescription (IE 5.01 / Win 2000)
+Name[km]=UADescription (IE 5.01 នៅ​លើ Win 2000)
+Name[ko]=UADescription (윈도 2000의 IE 4.01)
+Name[lt]=Naudotojo agento aprašymas (IE 5.01 ir Win 2000)
+Name[lv]=UAApraksts (IE 5.01 uz Win 2000)
+Name[mk]=UADescription (IE 5.01 на Win 2000)
+Name[mn]=UserAgent-Тодорхойлолт (IE 5.01 on Win 2000)
+Name[mt]=UADescription (IE 5.01 fuq Win 2000)
+Name[nb]=Brukeragent (IE 5.01 på Win 2000)
+Name[nds]=UA-Beschrieven (IE 5.01 op Win 2000)
+Name[ne]=UA वर्णन (Win 2000 मा IE 5.01)
+Name[nl]=GA-beschrijving (IE 5.01 op Win 2000)
+Name[nn]=Brukaragent (IE 5.01 på Win 2000)
+Name[nso]=UAThlaloso (IE 5.01 go Win 2000)
+Name[pa]=UADescription (ਵਿੰਡੋ ੨੦੦੦ 'ਤੇ IE 5.01)
+Name[pl]=Opis przeglądarki użytkownika (IE 5.01 na Win 2000)
+Name[pt]=UADescription (IE 5.01 no Win 2000)
+Name[pt_BR]=Descrição (IE 5.01 no Win 2000)
+Name[ro]=Descriere UA (IE 5.01 pentru Win 2000)
+Name[ru]=UADescription (IE 5.01 на Win 2000)
+Name[rw]=UADescription (IE 5.01 kuri Win 2000)
+Name[se]=UA-čilgehus (IE 5.01 ja Win 2000)
+Name[sk]=Popis agenta (IE 5.01 na Win 2000)
+Name[sl]=UAOpis (IE 5.01 na Windows 2000)
+Name[sr]=UADescription (IE 5.01 на Win 2000)
+Name[sr@Latn]=UADescription (IE 5.01 na Win 2000)
+Name[sv]=AA-beskrivning (IE 5.01 på Win 2000)
+Name[ta]=UAவிவரம் (IE 5.01 on Win 2000)
+Name[tg]=ТавзеҳиUA (IE 5.01 ба Win 2000)
+Name[th]=UADescription (IE 5.01 บน Win 2000)
+Name[tr]=UA Tanımı (Win 2000 üzerinde IE 5.01)
+Name[tt]=UADescription (IE 5.01, Win 2000 astında)
+Name[uk]=UADescription (IE 5.01 на Win 2000)
+Name[uz]=UADescription (Win 2000 bilan IE 5.01)
+Name[uz@cyrillic]=UADescription (Win 2000 билан IE 5.01)
+Name[ven]=Thalutshedzo (IE 5.01 on Win 2000)
+Name[vi]=Mô tả UA (IE 5.01 trên Win 2000)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (IE 5.01 so Win 2000)
+Name[xh]=UADescription (IE 5.01 kwi Win 2000)
+Name[zh_CN]=用户代理描述 (运行于 Win 2000 的 IE 5.01)
+Name[zh_TW]=使用者代理描述 (IE 5.01 on Win 2000)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=IE
+X-KDE-UA-FULL=Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
+X-KDE-UA-NAME=Internet Explorer
+X-KDE-UA-VERSION=5.01
+X-KDE-UA-SYSNAME=Windows
+X-KDE-UA-SYSRELEASE=2000
diff --git a/kcontrol/kio/uasproviders/ie50onppc.desktop b/kcontrol/kio/uasproviders/ie50onppc.desktop
new file mode 100644
index 000000000..6cb00f7e4
--- /dev/null
+++ b/kcontrol/kio/uasproviders/ie50onppc.desktop
@@ -0,0 +1,79 @@
+[Desktop Entry]
+Name=UADescription (IE 5.0 on Mac PPC)
+Name[af]=UA-beskrywing (Ie 5.0 op Mac Ppc)
+Name[be]=UADescription (IE 5.0 на Mac PPC)
+Name[br]=UADescription (IE 5.0 war Mac PPC)
+Name[ca]=Descripció de AU (IE 5.0 en Mac PPC)
+Name[cs]=Popis agenta (IE 5.0 na Mac PPC)
+Name[csb]=Òpis programë brëkòwnika (IE 5.0 na Mac PPC)
+Name[cy]=UADisgrifiad (IE 5.0 ar Mac PPC)
+Name[da]=Brugeragentbeskrivelse (IE 5.0 på Mac PPC)
+Name[de]=Browserkennung (IE 5.0 auf Mac PPC)
+Name[el]=Περιγραφή UA (IE 5.0 σε Mac PPC)
+Name[eo]=UA-Priskribo (IE 5.0 sub Mac-PPC)
+Name[es]=Descripción de AU (IE 5.0 en Mac PPC)
+Name[et]=UADescription (IE 5.0 MacPPC platvormil)
+Name[eu]=UA azalpena (IE 5.0 Mac PPC-n)
+Name[fa]=UADescription (IE 5.0 در Mac PPC)
+Name[fi]=Käyttäjäagenttikuvaus (IE 5.0 Mac PPC:llä)
+Name[fr]=Identité du navigateur (IE 5.0 sous Mac PPC)
+Name[fy]=GA-omskriuwing (IE 5.0 op Mac PPC)
+Name[ga]=UADescription (IE 5.0 ar Mac PPC)
+Name[gl]=UADescription (IE 5.0 en Mac PPC)
+Name[he]=UADescription (Mac PPCב־ IE 5.0)
+Name[hi]=यूएडी-डिस्क्रिप्शन (IE 5.0 मैक पीपीसी पर)
+Name[hr]=UADescription (IE 5.0 na Mac PPC)
+Name[hu]=Böngészőtípus (IE 5.0, Mac PPC)
+Name[id]=UADescription (IE 5.0 di Mac PPC)
+Name[is]=UAD strengur (IE 5.0 on Mac PPC)
+Name[it]=DescrizioneUA (IE 5.0 su Mac PPC)
+Name[ka]=UADescription (IE 5.0 Mac PPC-ში)
+Name[kk]=UADescription (IE 5.0 / Mac PPC)
+Name[km]=UADescription (IE 5.0 នៅ​លើ Mac PPC)
+Name[ko]=UADescription (Mac PPC의 IE 5.0)
+Name[lt]=Naudotojo agento aprašymas (IE 5.0 ir Mac PPC)
+Name[lv]=UAApraksts (IE 5.0 uz Mac PPC)
+Name[mk]=UADescription (IE 5.0 на Mac PPC)
+Name[mn]=UserAgent-Тодорхойлолт (IE 5.0 on Mac PPC)
+Name[mt]=UADescription (IE 5.0 fuq Mac PPC)
+Name[nb]=Brukeragent (IE 5.0 på Mac PPC)
+Name[nds]=UA-Beschrieven (IE 5.0 op Mac PPC)
+Name[ne]=UA वर्णन (Mac PPC मा IE 5.0)
+Name[nl]=GA-beschrijving (IE 5.0 op Mac PPC)
+Name[nn]=Brukaragent (IE 5.0 på Mac PPC)
+Name[nso]=UAThlaloso (IE 5.0 go Mac PPC)
+Name[pa]=UADescription (ਮੈਕ PPC 'ਤੇ IE 5.0)
+Name[pl]=Opis przeglądarki użytkownika (IE 5.0 na Mac PPC)
+Name[pt]=UADescription (IE 5.0 no Mac PPC)
+Name[pt_BR]=Descrição (IE 5.0 no Mac PPC)
+Name[ro]=Descriere UA (IE 5.0 pentru Mac PPC)
+Name[ru]=UADescription (IE 5.0 на Mac PPC)
+Name[rw]=UADescription (IE 5.0 kuri Mac PPC)
+Name[se]=UA-čilgehus (IE 5.0 ja Mac PPC)
+Name[sk]=Popis agenta (IE 5.0 na Mac PPC)
+Name[sl]=UAOpis (IE 5.0 na Mac PPC)
+Name[sr]=UADescription (IE 5.0 на Mac PPC)
+Name[sr@Latn]=UADescription (IE 5.0 na Mac PPC)
+Name[sv]=AA-beskrivning (IE 5.0 på Mac PPC)
+Name[ta]=UAவிவரம் (IE 5.0 on Mac PPC)
+Name[tg]=ТавзеҳиUA (IE 5.0 ба Mac PPC)
+Name[th]=UADescription (IE 5.0 บน Mac PPC)
+Name[tr]=UA Tanımı (Mac PPC üzerinde IE 5.0)
+Name[tt]=UADescription (IE 5.0, Mac PPC astında)
+Name[uk]=UADescription (IE 5.0 на Mac PPC)
+Name[uz]=UADescription (Mac PPC bilan IE 5.0)
+Name[uz@cyrillic]=UADescription (Mac PPC билан IE 5.0)
+Name[ven]=Thalutshedzo ya UA (IE 5.0 on Mac PPC)
+Name[vi]=Mô tả UA (IE 5.0 trên Mac PPC)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (IE 5.0 so Mac PPC)
+Name[xh]=UADescription (IE 5.0 kwi Mac PPC)
+Name[zh_CN]=用户代理描述 (运行于 Mac PPC 的 IE 5.0)
+Name[zh_TW]=使用者代理描述 (IE 5.0 on Mac PPC)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=IE
+X-KDE-UA-FULL=Mozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC)
+X-KDE-UA-NAME=Internet Explorer
+X-KDE-UA-VERSION=5.0
+X-KDE-UA-SYSNAME=Mac
+X-KDE-UA-SYSRELEASE=PPC
diff --git a/kcontrol/kio/uasproviders/ie55onwin98.desktop b/kcontrol/kio/uasproviders/ie55onwin98.desktop
new file mode 100644
index 000000000..3d1aff5e8
--- /dev/null
+++ b/kcontrol/kio/uasproviders/ie55onwin98.desktop
@@ -0,0 +1,79 @@
+[Desktop Entry]
+Name=UADescription (IE 5.5 on Win 98)
+Name[af]=UA-beskrywing (Ie 5.5 op Win 98)
+Name[be]=UADescription (IE 5.5 на Win 98)
+Name[br]=UADescription (IE 5.5 war Win 98)
+Name[ca]=Descripció de AU (IE 5.5 en Windows 98)
+Name[cs]=Popis agenta (IE 5.5 na Win 98)
+Name[csb]=Òpis programë brëkòwnika (IE 5.5 na Win 98)
+Name[cy]=UADisgrifiad (IE 5.5 ar Win 98)
+Name[da]=Brugeragentbeskrivelse (IE 5.5 på Win 98)
+Name[de]=Browserkennung (IE 5.5 unter Windows 98)
+Name[el]=Περιγραφή UA (IE 5.5 σε Win 98)
+Name[eo]=UA-Priskribo (IE 5.5 sub Vindozo 98)
+Name[es]=Descripción de AU (IE 5.5 en Windows 98)
+Name[et]=UADescription (IE 5.5 Win98 platvormil)
+Name[eu]=UA azalpena (IE 5.5 Win 98-an)
+Name[fa]=UADescription (IE 5.5 در Win 98)
+Name[fi]=Käyttäjäagenttikuvaus (IE 5.5 Win 98:lla)
+Name[fr]=Identité du navigateur (IE 5.5 sous Windows 98)
+Name[fy]=GA-omskriuwing (IE 5.5 op Win 98)
+Name[ga]=UADescription (IE 5.5 ar Win 98)
+Name[gl]=UADescription (IE 5.5 en Win 98)
+Name[he]=UADescription (Win 98ב־ IE 5.5)
+Name[hi]=यूएडी-डिस्क्रिप्शन (IE 5.5 विन 98 पर)
+Name[hr]=UADescription (IE 5.5 na Win 98)
+Name[hu]=Böngészőtípus (IE 5.5, Win 98)
+Name[id]=UADescription (IE 5.5 di Win 98)
+Name[is]=UAD strengur (IE 5.5 on Win 98)
+Name[it]=DescrizioneUA (IE 5.5 su Win 98)
+Name[ka]=UADescription (IE 5.5 Win 98-ში)
+Name[kk]=UADescription (IE 5.5 / Win 98)
+Name[km]=UADescription (IE 5.5 នៅ​លើ Win 98)
+Name[ko]=UADescription (윈도 2000의 IE 5.5)
+Name[lt]=Naudotojo agento aprašymas (IE 5.5 ir Win 98)
+Name[lv]=UAApraksts (IE 5.5 uz Win 98)
+Name[mk]=UADescription (IE 5.5 на Win 98)
+Name[mn]=UserAgent-Тодорхойлолт (IE 5.5 on Win 98)
+Name[mt]=UADescription (IE 5.5 fuq Win 98)
+Name[nb]=Brukeragent (IE 5.5 på Win 98)
+Name[nds]=UA-Beschrieven (IE 5.5 op Win 98)
+Name[ne]=UA वर्णन (Win 98 मा IE 5.5)
+Name[nl]=GA-beschrijving (IE 5.5 op Win 98)
+Name[nn]=Brukaragent (IE 5.5 på Win 98)
+Name[nso]=UAThlaloso (IE 5.5 go Win 98)
+Name[pa]=UADescription (ਵਿੰਡੋ ੯੮ 'ਤੇ IE 5.5)
+Name[pl]=Opis przeglądarki użytkownika (IE 5.5 na Win 98)
+Name[pt]=UADescription (IE 5.5 no Win 95)
+Name[pt_BR]=Descrição (IE 5.5 no Win 98)
+Name[ro]=Descriere UA (IE 5.5 pentru Win 98)
+Name[ru]=UADescription (IE 5.5 на Win 98)
+Name[rw]=UADescription (IE 5.5 kuri Win 98)
+Name[se]=UA-čilgehus (IE 5.5 ja Win 98)
+Name[sk]=Popis agenta (IE 5.5 na Win 98)
+Name[sl]=UAOpis (IE 5.5 na Windows 98)
+Name[sr]=UADescription (IE 5.5 на Win 98)
+Name[sr@Latn]=UADescription (IE 5.5 na Win 98)
+Name[sv]=AA-beskrivning (IE 5.5 på Win 98)
+Name[ta]=UAவிவரம் (IE 5.5 on Win 98)
+Name[tg]=ТавзеҳиUA (IE 5.5 ба Win 98)
+Name[th]=UADescription (IE 5.5 บน Win 98)
+Name[tr]=UA Tanımı (Win 98 üzerinde IE 5.5)
+Name[tt]=UADescription (IE 5.5, Win 98 astında)
+Name[uk]=UADescription (IE 5.5 на Win 98)
+Name[uz]=UADescription (Win 98 bilan IE 5.5)
+Name[uz@cyrillic]=UADescription (Win 98 билан IE 5.5)
+Name[ven]=Thalutshedzo ya UA (IE 5.5 on Win 98)
+Name[vi]=Mô tả UA (IE 5.5 trên Win 98)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (IE 5.5 so Win 98)
+Name[xh]=UADescription UA (IE 5.5 kwi Win 98)
+Name[zh_CN]=用户代理描述 (运行于 Win 98 的 IE 5.5)
+Name[zh_TW]=使用者代理描述 (IE 5.5 on Win 98)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=IE
+X-KDE-UA-FULL=Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
+X-KDE-UA-NAME=Internet Explorer
+X-KDE-UA-VERSION=5.5
+X-KDE-UA-SYSNAME=Windows
+X-KDE-UA-SYSRELEASE=98
diff --git a/kcontrol/kio/uasproviders/ie55onwinnt5.desktop b/kcontrol/kio/uasproviders/ie55onwinnt5.desktop
new file mode 100644
index 000000000..a283897e1
--- /dev/null
+++ b/kcontrol/kio/uasproviders/ie55onwinnt5.desktop
@@ -0,0 +1,79 @@
+[Desktop Entry]
+Name=UADescription (IE 5.5 on Win 2000)
+Name[af]=UA-beskrywing (Ie 5.5 op Win 2000)
+Name[be]=UADescription (IE 5.5 на Win 2000)
+Name[br]=UADescription (IE 5.5 war Win 2000)
+Name[ca]=Descripció de AU (IE 5.5 en Windows 2000)
+Name[cs]=Popis agenta (IE 5.5 na Win 2000)
+Name[csb]=Òpis programë brëkòwnika (IE 5.5 na Win 2000)
+Name[cy]=UADisgrifiad (IE 5.5 ar Win 2000)
+Name[da]=Brugeragentbeskrivelse (IE 5.5 på Win 2000)
+Name[de]=Browserkennung (IE 5.5 unter Windows 2000)
+Name[el]=Περιγραφή UA (IE 5.5 σε Win 2000)
+Name[eo]=UA-Priskribo (IE 5.5 sub Vindozo 2000)
+Name[es]=Descripción de AU (IE 5.5 en Windows 2000)
+Name[et]=UADescription (IE 5.5 Win2000 platvormil)
+Name[eu]=UA azalpena (IE 5.5 Win 2000-n)
+Name[fa]=UADescription (IE 5.5 در Win 2000)
+Name[fi]=Käyttäjäagenttikuvaus (IE 5.5 Win 2000:lla)
+Name[fr]=Identité du navigateur (IE 5.5 sous Windows 2000)
+Name[fy]=GA-omskriuwing (IE 5.5 op Win 2000)
+Name[ga]=UADescription (IE 5.5 ar Win 2000)
+Name[gl]=UADescription (IE 5.5 en Win 2000)
+Name[he]=UADescription (Win 2000ב־ IE 5.5)
+Name[hi]=यूएडी-डिस्क्रिप्शन (IE 5.5 विन 2000 पर)
+Name[hr]=UADescription (IE 5.5 na Win 2000)
+Name[hu]=Böngészőtípus (IE 5.5, Win 2000)
+Name[id]=UADescription (IE 5.5 di Win 2000)
+Name[is]=UAD strengur (IE 5.5 on Win 2000)
+Name[it]=DescrizioneUA (IE 5.5 su Win 2000)
+Name[ka]=UADescription (IE 5.5 Win 2000-ში)
+Name[kk]=UADescription (IE 5.5 / Win 2000)
+Name[km]=UADescription (IE 5.5 នៅ​លើ Win 2000)
+Name[ko]=UADescription (윈도 2000의 IE 5.5)
+Name[lt]=Naudotojo agento aprašymas (IE 5.5 ir Win 2000)
+Name[lv]=UAApraksts (IE 5.5 uz Win 2000)
+Name[mk]=UADescription (IE 5.5 на Win 2000)
+Name[mn]=UserAgent-Тодорхойлолт (IE 5.5 on Win 2000)
+Name[mt]=UADescription (IE 5.5 fuq Win 2000)
+Name[nb]=Brukeragent (IE 5.5 på Win 2000)
+Name[nds]=UA-Beschrieven (IE 5.5 op Win 2000)
+Name[ne]=UA वर्णन (Win 2000मा IE 5.5)
+Name[nl]=GA-beschrijving (IE 5.5 op Win 2000)
+Name[nn]=Brukaragent (IE 5.5 på Win 2000)
+Name[nso]=UAThlaloso (IE 5.5 go Win 2000)
+Name[pa]=UADescription (ਵਿੰਡੋ ੨੦੦੦ 'ਤੇ IE 5.5)
+Name[pl]=Opis przeglądarki użytkownika (IE 5.5 na Win 2000)
+Name[pt]=UADescription (IE 5.5 no Win 2000)
+Name[pt_BR]=Descrição (IE 5.5 no Win 2000)
+Name[ro]=Descriere UA (IE 5.5 pentru Win 2000)
+Name[ru]=UADescription (IE 5.5 на Win 2000)
+Name[rw]=UADescription (IE 5.5 kuri Win 2000)
+Name[se]=UA-čilgehus (IE 5.5 ja Win 2000)
+Name[sk]=Popis agenta (IE 5.5 na Win 2000)
+Name[sl]=UAOpis (IE 5.5 na Windows 2000)
+Name[sr]=UADescription (IE 5.5 на Win 2000)
+Name[sr@Latn]=UADescription (IE 5.5 na Win 2000)
+Name[sv]=AA-beskrivning (IE 5.5 på Win 2000)
+Name[ta]=UAவிவரம் (IE 5.5 on Win 2000)
+Name[tg]=ТавзеҳиUA (IE 5.5 ба Win 2000)
+Name[th]=UADescription (IE 5.5 บน Win 2000)
+Name[tr]=UA Tanımı (Win 2000 üzerinde IE 5.5)
+Name[tt]=UADescription (IE 5.5, Win 2000 astında)
+Name[uk]=UADescription (IE 5.5 на Win 2000)
+Name[uz]=UADescription (Win 2000 bilan IE 5.5)
+Name[uz@cyrillic]=UADescription (Win 2000 билан IE 5.5)
+Name[ven]=Thalutshedzo ya UA (IE 5.5 on Win 2000)
+Name[vi]=Mô tả UA (IE 5.5 trên Win 2000)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (IE 5.5 so Win 2000)
+Name[xh]=UADescription (IE 5.5 kwi Win 2000)
+Name[zh_CN]=用户代理描述 (运行于 Win 2000 的 IE 5.5)
+Name[zh_TW]=使用者代理描述 (IE 5.5 on Win 2000)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=IE
+X-KDE-UA-FULL=Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
+X-KDE-UA-NAME=Internet Explorer
+X-KDE-UA-VERSION=5.5
+X-KDE-UA-SYSNAME=Windows
+X-KDE-UA-SYSRELEASE=2000
diff --git a/kcontrol/kio/uasproviders/ie60oncurrent.desktop b/kcontrol/kio/uasproviders/ie60oncurrent.desktop
new file mode 100644
index 000000000..e65fbb2a4
--- /dev/null
+++ b/kcontrol/kio/uasproviders/ie60oncurrent.desktop
@@ -0,0 +1,69 @@
+[Desktop Entry]
+Name=UADescription (IE 6.0 on current)
+Name[af]=UA-beskrywing (IE 6.0 op huidige bedryfstelsel)
+Name[be]=UADescription (IE 6.0 на гэтай сістэме)
+Name[bs]=UADescription (IE 6.0 na trenutnom)
+Name[ca]=Descripció UA (IE 6.0 a l'actual)
+Name[cs]=Popis agenta (IE 6.0 na aktuálním)
+Name[csb]=Òpis programë brëkòwnika (IE 6.0)
+Name[da]=Brugeragentbeskrivelse (IE 6.0 på denne)
+Name[de]=Browserkennung (IE 6.0 unter aktuellem Betriebssystem)
+Name[el]=Περιγραφή UA (IE 6.01 στο τρέχον σύστημα)
+Name[eo]=UA-Priskribo (IE 6.0 sub nuna)
+Name[es]=UADescription (IE 6.0 en actual)
+Name[et]=UADescription (Selles masinas töötav IE 6.0)
+Name[eu]=UA azalpena (IE 6.0 unekoan)
+Name[fa]=UADescription (IE 6.0 در حال حاضر)
+Name[fr]=Identité du navigateur (IE 6.0 sous le système actuel)
+Name[fy]=GA-omskriuwing (IE 6.0 op aktive)
+Name[ga]=UADescription (IE 6.0 ar an gcóras reatha)
+Name[gl]=UADescription (IE 6.0 no actual)
+Name[he]=UADescription (NN 3.01 בנוכחי)
+Name[hr]=UADescription (IE 6.0 na trenutnom)
+Name[hu]=Böngészőtípus (IE 6.0)
+Name[id]=UADescription (IE 6.0)
+Name[is]=UAD strengur (IE 6.0 á núverandi)
+Name[it]=DescrizioneUA (IE 6.0 su sistema attuale)
+Name[ka]=UADescription (IE 6.0 მიმდინარე სისტემაში)
+Name[kk]=UADescription (IE 6.0 осы орында)
+Name[km]=UADescription (IE 6.0 បច្ចុប្បន្ន)
+Name[ko]=UADescription (현재 플랫폼의 IE 6.0)
+Name[lt]=Naudotojo agento aprašymas (IE 6.0 ir esama)
+Name[lv]=UAApraksts (IE 6.0 uz tekošā)
+Name[mk]=UADescription (IE 6.0 на тековно)
+Name[nb]=Brukeragent (IE 6.0 på denne)
+Name[nds]=UA-Beschrieven (IE 6.0 op dit Systeem)
+Name[ne]=UA वर्णन (हाल IE 6.0 मा)
+Name[nl]=GA-beschrijving (IE 6.0 op huidige)
+Name[nn]=Brukaragent (IE 6.0 herifrå)
+Name[pa]=UADescription (ਮੌਜੂਦਾ IE 6.0)
+Name[pl]=Opis przeglądarki użytkownika (IE 6.0 na bieżącym systemie)
+Name[pt]=UADescription (IE 6.0 no sistema actual)
+Name[pt_BR]=Descrição (IE 6.0 no sistema atual)
+Name[ro]=Descriere UA (IE 6.0 pentru sistemul de operare curent)
+Name[ru]=UADescription (IE 6.0 на текущей системе)
+Name[rw]=UADescription (IE 6.0 ku igezweho)
+Name[se]=UA-čilgehus (IE 6.0 dán mašiinnas)
+Name[sl]=UAOpis (IE 6.0 na trenutnem)
+Name[sr]=UADescription (IE 6.0 на тренутном)
+Name[sr@Latn]=UADescription (IE 6.0 na trenutnom)
+Name[sv]=AA-beskrivning (IE 6.0 på aktuell)
+Name[ta]=UAவிவரம் (IE 6.0 on current)
+Name[tg]=UADescription (Системаи ҷорӣ IE 6.0)
+Name[th]=UADescription (IE 6.0 บนระบบปัจจุบัน)
+Name[tr]=UA Tanımı (bulunulanda IE 6.0)
+Name[tt]=UADescription (IE 6.0, şul uq astında)
+Name[uk]=UADescription (IE 6.0 на поточній)
+Name[uz]=UADescription (joriy bilan IE 6.0)
+Name[uz@cyrillic]=UADescription (жорий билан IE 6.0)
+Name[vi]=Mô tả UA (đang dùng IE 6.0)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (IE 6.0 sol ci do moumint)
+Name[zh_CN]=用户代理描述 (运行于本机的 IE 6.0)
+Name[zh_TW]=使用者代理描述 (IE 6.0 on current)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=IE
+X-KDE-UA-FULL=Mozilla/4.0 (compatible; MSIE 6.0; appPlatform; appSysName appMachineType) Konqueror/3.5 (KHTML, like Gecko)
+X-KDE-UA-NAME=Internet Explorer
+X-KDE-UA-VERSION=6.0
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/ie60onwinnt51.desktop b/kcontrol/kio/uasproviders/ie60onwinnt51.desktop
new file mode 100644
index 000000000..c2afcb31f
--- /dev/null
+++ b/kcontrol/kio/uasproviders/ie60onwinnt51.desktop
@@ -0,0 +1,81 @@
+[Desktop Entry]
+Name=UADescription (IE 6.0 on Win XP)
+Name[af]=UA-beskrywing (IE 6.0 op Win XP)
+Name[az]=İAİzahatı (Win XP üstündə IE 6.0)
+Name[be]=UADescription (IE 6.0 на Win XP)
+Name[br]=UADescription (IE 6.0 war Win XP)
+Name[bs]=UADescription (IE 5.0 on Win XP)
+Name[ca]=Descripció de AU (IE 6.0 en Win XP)
+Name[cs]=Popis agenta (IE 6.0 na Win XP)
+Name[csb]=Òpis programë brëkòwnika (IE 6.0 na Win XP)
+Name[cy]=UADisgrifiad (IE 6.0 ar Win XP)
+Name[da]=Brugeragentbeskrivelse (IE 6.0 på Win XP)
+Name[de]=Browserkennung (IE 6.0 unter Windows XP)
+Name[el]=Περιγραφή UA (IE 6.0 σε Win XP)
+Name[eo]=UA-Priskribo (IE 6.0 sub Vindozo XP)
+Name[es]=Descripción de AU (IE 6.0 en Win XP)
+Name[et]=UADescription (IE 6.0 Win XP platvormil)
+Name[eu]=UA azalpena (IE 6.0 Win XP-n)
+Name[fa]=UADescription (IE 6.0 در Win XP)
+Name[fi]=Käyttäjäagenttikuvaus (IE 6.0 Win XP:llä)
+Name[fr]=Identité du navigateur (IE 6.0 sous Windows XP)
+Name[fy]=GA-omskriuwing (IE 6.0 op Win XP)
+Name[ga]=UADescription (IE 6.0 ar Win XP)
+Name[gl]=UADescription (IE 6.0 en Win XP)
+Name[he]=UADescription (Win XPב־ IE 6.0)
+Name[hi]=यूएडी-डिस्क्रिप्शन (IE 6.0 विन एक्सपी पर)
+Name[hr]=UADescription (IE 5.0 na Win 95)
+Name[hu]=Böngészőtípus (IE 6.0, Win XP)
+Name[id]=UADescription (IE 6.0 di Win XP)
+Name[is]=UAD strengur (IE 5.0 on Win XP)
+Name[it]=DescrizioneUA (IE 6.0 su Win XP)
+Name[ka]=UADescription (IE 5.0 Win 95-ში)
+Name[kk]=UADescription (IE 6.0 / Win XP)
+Name[km]=UADescription (IE 6.0 នៅ​លើ Win XP)
+Name[ko]=UADescription (윈도 XP의 IE 6.0)
+Name[lt]=Naudotojo agento aprašymas (IE 6.0 ir Win XP)
+Name[lv]=UAApraksts (IE 6.0 uz Win XP)
+Name[mk]=UADescription (IE 6.0 на Win XP)
+Name[mn]=User-Agent-Тодорхойлолт (IE 6.0 on Win XP)
+Name[mt]=UADescription (IE 6.0 fuq Win XP)
+Name[nb]=Brukeragent (IE 6.0 på Win XP)
+Name[nds]=UA-Beschrieven (IE 6.0 op Win XP)
+Name[ne]=UA वर्णन (Win XP मा IE 6.0)
+Name[nl]=GA-beschrijving (IE 6.0 op Win XP)
+Name[nn]=Brukaragent (IE 6.0 på Win XP)
+Name[nso]=UAThlaloso (IE 6.0 go Win XP)
+Name[pa]=UADescription (ਵਿੰਡੋ XP 'ਤੇ IE 6.0)
+Name[pl]=Opis przeglądarki użytkownika (IE 6.0 na Win XP)
+Name[pt]=UADescription (IE 6.0 no Win XP)
+Name[pt_BR]=Descrição (IE 6.0 no Win XP)
+Name[ro]=Descriere UA (IE 6.0 pentru Win XP)
+Name[ru]=UADescription (IE 5.0 на Win 95)
+Name[rw]=UADescription (IE 6.0 kuri Win XP)
+Name[se]=UA-čilgehus (IE 6.0 ja Win XP)
+Name[sk]=Popis agenta (IE 6.0 na Win XP)
+Name[sl]=UAOpis (IE 6.0 na Windows XP)
+Name[sr]=UADescription (IE 6.0 на Win XP)
+Name[sr@Latn]=UADescription (IE 6.0 na Win XP)
+Name[sv]=AA-beskrivning (IE 6.0 på Win XP)
+Name[ta]=UAவிவரம்(IE 6.0 on Win XP)
+Name[tg]=ТавзеҳиUA (IE 6.0 ба Win XP)
+Name[th]=UADescription (IE 6.0 บน Win XP)
+Name[tr]=UA Tanımı (Win XP üzerinde IE 6.0)
+Name[tt]=UADescription (IE 6.0, Win XP astında)
+Name[uk]=UADescription (IE 6.0 на Win XP)
+Name[uz]=UADescription (Win XP bilan IE 6.0)
+Name[uz@cyrillic]=UADescription (Win XP билан IE 6.0)
+Name[ven]=Thalutshedzo ya UA (IE 5.0 kha Win XP)
+Name[vi]=Mô tả UA (IE 6.0 trên Win XP)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (IE 6.0 so Win XP)
+Name[xh]=UADescription (IE 6.0 kwi Win XP)
+Name[zh_CN]=用户代理描述 (运行于 Win XP 的 IE 6.0)
+Name[zh_TW]=使用者代理描述 (IE 6.0 on Win XP)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=IE
+X-KDE-UA-FULL=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
+X-KDE-UA-NAME=Internet Explorer
+X-KDE-UA-VERSION=6.0
+X-KDE-UA-SYSNAME=Windows
+X-KDE-UA-SYSRELEASE=XP
diff --git a/kcontrol/kio/uasproviders/lynxoncurrent.desktop b/kcontrol/kio/uasproviders/lynxoncurrent.desktop
new file mode 100644
index 000000000..400ed11ad
--- /dev/null
+++ b/kcontrol/kio/uasproviders/lynxoncurrent.desktop
@@ -0,0 +1,51 @@
+[Desktop Entry]
+Name=UADescription (Lynx 2.8.3)
+Name[af]=UA-beskrywing (Lynx 2.8.3)
+Name[ca]=Descripció de AU (Lynx 2.8.3)
+Name[cs]=Popis agenta (Lynx 2.8.3)
+Name[csb]=Òpis programë brëkòwnika (Lynx 2.8.3)
+Name[cy]=UADisgrifiad (Lynx 2.8.3)
+Name[da]=Brugeragentbeskrivelse (Lynx 2.8.3)
+Name[de]=Browserkennung (Lynx 2.8.3)
+Name[el]=Περιγραφή UA (Lynx 2.8.3)
+Name[eo]=UA-Priskribo (Lynx 2.8.3)
+Name[es]=Descripción de AU (Lynx 2.8.3)
+Name[eu]=UA azalpena (Lynx 2.8.3)
+Name[fi]=Käyttäjäagenttikuvaus (Lynx 2.8.3)
+Name[fr]=Identité du navigateur (Lynx 2.8.3)
+Name[fy]=GA-omskriuwing (Lynx 2.8.3)
+Name[hi]=यूएडी-डिस्क्रिप्शन (लायनक्स 2.8.3)
+Name[hu]=Böngészőtípus (Lynx 2.8.3)
+Name[is]=UAD strengur (Lynx 2.8.3)
+Name[it]=DescrizioneUA (Lynx 2.8.3)
+Name[lt]=Naudotojo agento aprašymas (Lynx 2.8.3)
+Name[lv]=UAApraksts (Lynx 2.8.3)
+Name[mn]=UserAgent-Тодорхойлолт (Lynx 2.8.3)
+Name[nb]=Brukeragent (Lynx 2.8.3)
+Name[nds]=UA-Beschrieven (Lynx 2.8.3)
+Name[ne]=UA वर्णन (Lynx 2.8.3)
+Name[nl]=GA-beschrijving (Lynx 2.8.3)
+Name[nn]=Brukaragent (Lynx 2.8.3)
+Name[nso]=UAThlaloso (Lynx 2.8.3)
+Name[pa]=UADescription(ਲੇਨਕਸ2.8.30)
+Name[pl]=Opis przeglądarki użytkownika (Lynx 2.8.3)
+Name[pt_BR]=Descrição (Lynx 2.8.3)
+Name[ro]=Descriere UA (Lynx 2.8.3)
+Name[se]=UA-čilgehus (Lynx 2.8.3)
+Name[sk]=Popis agenta (Lynx 2.8.3)
+Name[sl]=UAOpis (Lynx 2.8.3)
+Name[sv]=AA-beskrivning (Lynx 2.8.3)
+Name[ta]=UAவிவரம் (Lynx 2.8.3)
+Name[tg]=ТавзеҳиUA (Линукс 2.8.3)
+Name[tr]=UA Tanımı (Lynx 2.8.3)
+Name[ven]=Thalutshedzo ya UA (Lynx 2.8.3)
+Name[vi]=Mô tả UA (Lynx 2.8.3)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Lynx 2.8.3)
+Name[zh_CN]=用户代理描述 (Lynx 2.8.3)
+Name[zh_TW]=使用者代理描述 (Lynx 2.8.3)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=MISC
+X-KDE-UA-FULL=Lynx/2.8.3dev.6 libwww-FM/2.14
+X-KDE-UA-NAME=Lynx
+X-KDE-UA-VERSION=2.8.3dev.6
diff --git a/kcontrol/kio/uasproviders/mozoncurrent.desktop b/kcontrol/kio/uasproviders/mozoncurrent.desktop
new file mode 100644
index 000000000..4e6f483a5
--- /dev/null
+++ b/kcontrol/kio/uasproviders/mozoncurrent.desktop
@@ -0,0 +1,70 @@
+[Desktop Entry]
+Name=UADescription (Mozilla 1.7 on current)
+Name[af]=UA-beskrywing (Mozilla 1.7 op huidige bedryfstelsel)
+Name[be]=UADescription (Mozilla 1.7 на гэтай сістэме)
+Name[bs]=UADescription (Mozilla 1.7 na trenutnom)
+Name[ca]=Descripció UA (Mozilla 1.7 a l'actual)
+Name[cs]=Popis agenta (Mozilla 1.7 na aktuálním)
+Name[csb]=Òpis programë brëkòwnika (Mozilla 1.7)
+Name[da]=Brugeragentbeskrivelse (Mozilla 1.7 på denne)
+Name[de]=Browserkennung (Mozilla 1.7 unter aktuellem Betriebssystem)
+Name[el]=Περιγραφή UA (Mozilla 1.7 στο τρέχον σύστημα)
+Name[eo]=UA-Priskribo (Mozilo 1.7 sub nuna)
+Name[es]=UADescription (Mozilla 1.7 en actual)
+Name[et]=UADescription (Selles masinas töötav Mozilla 1.7)
+Name[eu]=UA deskriptioa (Mozilla 1.7 unekoan)
+Name[fa]=UADescription (Mozilla 1.7 در حال حاضر)
+Name[fi]=Käyttäjäagenttikuvaus (Mozilla 1.7 nykyisin)
+Name[fr]=Identité du navigateur (Mozilla 1.7 sous le système actuel)
+Name[fy]=GA-omskriuwing (Mozilla 1.7 op aktive)
+Name[ga]=UADescription (Mozilla 1.7 ar an gcóras reatha)
+Name[gl]=UADescription (Mozilla 1.6 no actual)
+Name[he]=UADescription (Mozilla 1.7 בנוכחי)
+Name[hr]=UADescription (Mozilla 1.7 na trenutnom)
+Name[hu]=Böngészőtípus (Mozilla 1.7)
+Name[id]=UADescription (Mozilla 1.7)
+Name[is]=UAD strengur (Mozilla 1.7 á núverandi)
+Name[it]=DescrizioneUA (Mozilla 1.7 su sistema attuale)
+Name[ka]=UADescription (Mozilla 1.7 მიმდინარე სისტემაში)
+Name[kk]=UADescription (Mozilla 1.7 осы орында)
+Name[km]=UADescription (Mozilla 1.7 បច្ចុប្បន្ន)
+Name[ko]=UADescription (현재 플랫폼의 Mozilla 1.7)
+Name[lt]=Naudotojo agento aprašymas (Mozilla 1.7 ir esama)
+Name[lv]=UAApraksts (Mozilla 1.7 uz tekošā)
+Name[mk]=UADescription (Mozilla 1.7 на тековно)
+Name[nb]=Brukeragent (Mozilla 1.7 herifra)
+Name[nds]=UA-Beschrieven (Mozilla 1.7 op dit Systeem)
+Name[ne]=UA वर्णन (हाल मोजिला १.७)
+Name[nl]=GA-beschrijving (Mozilla 1.7 op current)
+Name[nn]=Brukaragent (Mozilla 1.7 herifrå)
+Name[pa]=UADescription (ਮੌਜੂਦਾ Mozilla 1.7)
+Name[pl]=Opis przeglądarki użytkownika (Mozilla 1.7 na bieżącym systemie)
+Name[pt]=UADescription (Mozilla 1.7 no sistema actual)
+Name[pt_BR]=Descrição (Mozilla 1.7 no sistema atual)
+Name[ro]=Descriere UA (Mozilla 1.7 pentru sistemul de operare curent)
+Name[ru]=UADescription (Mozilla 1.7 на текущей системе)
+Name[rw]=UADescription (Mozilla 1.7 ku igezweho)
+Name[se]=UA-čilgehus (Mozilla 1.7 dán mašiinnas)
+Name[sl]=UAOpis (Mozilla 1.7 na trenutnem)
+Name[sr]=UADescription (Mozilla 1.7 на тренутном)
+Name[sr@Latn]=UADescription (Mozilla 1.7 na trenutnom)
+Name[sv]=AA-beskrivning (Mozilla 1.7 på aktuell)
+Name[ta]=UADescription (Mozilla 1.7 on current)
+Name[tg]=UADescription (Системаи ҷорӣ Mozilla 1.7)
+Name[th]=UADescription (มอซิลล่า 1.7 บนระบบปัจจุบัน)
+Name[tr]=UA Tanımı (bulunulanda Mozilla 1.6)
+Name[tt]=UADescription (Mozilla 1.7, şul uq astında)
+Name[uk]=UADescription (Mozilla 1.7 на поточній)
+Name[uz]=UADescription (joriy bilan Mozilla 1.7)
+Name[uz@cyrillic]=UADescription (жорий билан Mozilla 1.7)
+Name[vi]=Mô tả UA (đang dùng Mozilla 1.7)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Mozilla 1.7 sol ci do moumint)
+Name[zh_CN]=用户代理描述 (运行于本机的 Mozilla 1.7)
+Name[zh_TW]=使用者代理描述 (Mozilla 1.7 on current)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=MOZ
+X-KDE-UA-FULL=Mozilla/5.0 (appPlatform; U; appSysName appMachineType; appLanguage; rv:1.7.3) Gecko/20040916
+X-KDE-UA-NAME=Mozilla
+X-KDE-UA-VERSION=1.7.3
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/mozoncurrent12.desktop b/kcontrol/kio/uasproviders/mozoncurrent12.desktop
new file mode 100644
index 000000000..0155d1282
--- /dev/null
+++ b/kcontrol/kio/uasproviders/mozoncurrent12.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Name=UADescription (Mozilla 1.2.1 on current)
+Name[af]=UA-beskrywing (Mozilla 1.2.1 op huidige bedryfstelsel)
+Name[az]=İAİzahatı (Hazırkı Mozilla 1.2.1)
+Name[be]=UADescription (Mozilla 1.2.1 на гэтай сістэме)
+Name[bs]=UADescription (Mozilla 1.2.1 na trenutnom)
+Name[ca]=Descripció de AU (Mozilla 1.2.1 sobre l'actual)
+Name[cs]=Popis agenta (Mozilla 1.2.1 na aktuálním)
+Name[csb]=Òpis programë brëkòwnika (Mozilla 1.2.1)
+Name[cy]=UADisgrifiad (Mozilla 1.2.1 ar gyfredol)
+Name[da]=Brugeragentbeskrivelse (Mozilla 1.2.1 på denne)
+Name[de]=Browserkennung (Mozilla 1.2.1 unter aktuellem Betriebssystem)
+Name[el]=Περιγραφή UA (Mozilla 1.2.1 στο τρέχον σύστημα)
+Name[eo]=UA-Priskribo (Mozilo 1.2.1 sub nuna)
+Name[es]=Descripción de AU (Mozilla 1.2.1 en actual
+Name[et]=UADescription (Selles masinas töötav Mozilla 1.2.1)
+Name[eu]=UA deskriptioa (Mozilla 1.2.1 unekoan)
+Name[fa]=UADescription (Mozilla 1.2.1 در حال حاضر)
+Name[fi]=Käyttäjäagenttikuvaus (Mozilla 1.2.1 nykyisellä)
+Name[fr]=Identité du navigateur (Mozilla 1.2.1 sous le système actuel)
+Name[fy]=GA-omskriuwing (Mozilla 1.2.1 op aktive)
+Name[ga]=UADescription (Mozilla 1.2.1 ar an gcóras reatha)
+Name[gl]=UADescription (Mozilla 1.2.1 no actual)
+Name[he]=UADescription (Mozilla 1.2.1 בנוכחי)
+Name[hi]=यूएडी-डिस्क्रिप्शन (मोज़िला 1.2.1 हालिया पर)
+Name[hr]=UADescription (Mozilla 1.2.1 na trenutnom)
+Name[hu]=Böngészőtípus (Mozilla 1.2.1)
+Name[id]=UADescription (Mozilla 1.2.1)
+Name[is]=UAD strengur (Mozilla 1.2.1 on current)
+Name[it]=DescrizioneUA (Mozilla 1.2.1 su sistema attuale)
+Name[ka]=UADescription (Mozilla 1.2.1 მიმდინარე სისტემაში)
+Name[kk]=UADescription (Mozilla 1.2.1 осы орында)
+Name[km]=UADescription (Mozilla 1.2.1 បច្ចុប្បន្ន)
+Name[ko]=UADescription (현재 플랫폼의 Mozilla 1.2.1)
+Name[lt]=Naudotojo agento aprašymas (Mozilla 1.2.1 ir esama)
+Name[lv]=UAApraksts (Mozilla 1.2.1 uz tekošā)
+Name[mk]=UADescription (Mozilla 1.2.1 на тековниот)
+Name[mn]=UserAgent-Тодорхойлолт (Мокилла 1.2.1 идэвхитэй)
+Name[mt]=UADescription (Mozilla 1.2.1 fuq kurrenti)
+Name[nb]=Brukeragent (Mozilla 1.2.1 herifra)
+Name[nds]=UA-Beschrieven (Mozilla 1.2.1 op dit Systeem)
+Name[ne]=UA वर्णन (हाल मोजिला १.२.१)
+Name[nl]=GA-beschrijving (Mozilla 1.2.1 op current)
+Name[nn]=Brukaragent (Mozilla 1.2.1 herifrå)
+Name[pa]=UADescription (ਮੌਜੂਦਾ 'ਤੇ ਮੌਜੀਲਾ ੧.੨.੧)
+Name[pl]=Opis przeglądarki użytkownika (Mozilla 1.2.1 na bieżącym systemie)
+Name[pt]=UADescription (Mozilla 1.2.1 no sistema actual)
+Name[pt_BR]=Descrição (Mozilla 1.2.1 no sistema atual)
+Name[ro]=Descriere UA (Mozilla 1.2.1 pentru sistemul de operare curent)
+Name[ru]=UADescription (Mozilla 1.2.1 на текущей системе)
+Name[rw]=UADescription (Mozilla 1.2.1 ku igezweho)
+Name[se]=UA-čilgehus (Mozilla 1.2.1 dan mašiinas)
+Name[sk]=UADescription (Mozilla 1.2.1)
+Name[sl]=UAOpis (Mozilla 1.2.1 na trenutnem)
+Name[sr]=UADescription (Mozilla 1.2.1 на тренутном)
+Name[sr@Latn]=UADescription (Mozilla 1.2.1 na trenutnom)
+Name[sv]=AA-beskrivning (Mozilla 1.2.1 på aktuell)
+Name[ta]=UAவிவரம் (M18 on current)
+Name[tg]=ТавзеҳиUA (Mozilla 1.2.1 равон)
+Name[th]=UADescription (มอซิลล่า 1.2.1 บนระบบปัจจุบัน)
+Name[tr]=UA Tanımı (güncel üzerinde Mozilla 1.2.1)
+Name[tt]=UADescription (Mozilla 1.2.1, şul uq astında)
+Name[uk]=UADescription (Mozilla 1.2.1 на поточній ОС)
+Name[uz]=UADescription (joriy bilan Mozilla 1.2.1)
+Name[uz@cyrillic]=UADescription (жорий билан Mozilla 1.2.1)
+Name[vi]=Mô tả UA (đang dùng Mozilla 1.2.1)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Mozilla 1.2.1 sol ci do moumint)
+Name[zh_CN]=用户代理描述 (运行于本机的 Mozilla 1.2.1)
+Name[zh_TW]=使用者代理描述 (Mozilla 1.2.1 on current)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=MOZ
+X-KDE-UA-FULL=Mozilla/5.0 (appSysName; U; appLanguage; rv:1.2.1) Gecko/20021130
+X-KDE-UA-NAME=Mozilla
+X-KDE-UA-VERSION=1.2.1
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/mozoncurrent16.desktop b/kcontrol/kio/uasproviders/mozoncurrent16.desktop
new file mode 100644
index 000000000..6867a5ee1
--- /dev/null
+++ b/kcontrol/kio/uasproviders/mozoncurrent16.desktop
@@ -0,0 +1,75 @@
+[Desktop Entry]
+Name=UADescription (Mozilla 1.6 on current)
+Name[af]=UA-beskrywing (Mozilla 1.6 op huidige bedryfstelsel)
+Name[az]=İA İzahatı (Mozilla 1.6 on current)
+Name[be]=UADescription (Mozilla 1.6 на гэтай сістэме)
+Name[bs]=UADescription (Mozilla 1.6 na trenutnom)
+Name[ca]=UADescription (Mozilla 1.6 a l'actual)
+Name[cs]=Popis agenta (Mozilla 1.6 na aktuálním)
+Name[csb]=Òpis programë brëkòwnika (Mozilla 1.6)
+Name[cy]=DisgrifiadUA (Mozilla 1.6 ar hyn o bryd)
+Name[da]=Brugeragentbeskrivelse (Mozilla 1.6 på denne)
+Name[de]=Browserkennung (Mozilla 1.6 unter aktuellem Betriebssystem)
+Name[el]=Περιγραφή UA (Mozilla 1.6 στο τρέχον σύστημα)
+Name[eo]=UA-Priskribo (Mozilo 1.6 sub nuna)
+Name[es]=Descripción de AU (Mozilla 1.6 en actual)
+Name[et]=UADescription (Selles masinas töötav Mozilla 1.6)
+Name[eu]=UA deskriptioa (Mozilla 1.6 unekoan)
+Name[fa]=UADescription (Mozilla 1.6 در حال حاضر)
+Name[fi]=Käyttäjäagenttikuvaus (Mozilla 1.6 nykyisellä)
+Name[fr]=Identité du navigateur (Mozilla 1.6 sous le système actuel)
+Name[fy]=GA-omskriuwing (Mozilla 1.6 op aktive)
+Name[ga]=UADescription (Mozilla 1.6 ar an gcóras reatha)
+Name[gl]=UADescription (Mozilla 1.6 no actual)
+Name[he]=UADescription (Mozilla 1.6 בנוכחי)
+Name[hi]=यूए-डिस्क्रिप्शन (मौजूदा में मोज़िला 1.6)
+Name[hr]=UADescription (Mozilla 1.6 na trenutnom)
+Name[hu]=Böngészőtípus (Mozilla 1.6)
+Name[id]=UADescription (Mozilla 1.6)
+Name[is]=UAD strengur (Mozilla 1.6 on current)
+Name[it]=DescrizioneUA(Mozilla 1.6 su sistema attuale)
+Name[ka]=UADescription (Mozilla 1.6 მიმდინარე სისტემაში)
+Name[kk]=UADescription (Mozilla 1.6 осы орында)
+Name[km]=UADescription (Mozilla 1.6 បច្ចុប្បន្ន)
+Name[ko]=UADescription (현재 플랫폼의 Mozilla 1.7)
+Name[lt]=Naudotojo agento aprašymas (Mozilla 1.6 ir esama)
+Name[lv]=UAApraksts (Mozilla 1.6 uz tekošā)
+Name[mk]=UADescription (Mozilla 1.6 на тековниот)
+Name[mt]=UADescription (Mozilla 1.6 fuq kurrenti)
+Name[nb]=Brukeragent (Mozilla 1.6 herifra)
+Name[nds]=UA-Beschrieven (Mozilla 1.6 op dit Systeem)
+Name[ne]=UA वर्णन (हाल मोजिला १.६)
+Name[nl]=GA-beschrijving (Mozilla 1.6 op current)
+Name[nn]=Brukaragent (Mozilla 1.6 herifrå)
+Name[pa]=UADescription (ਮੌਜੂਦਾ 'ਤੇ ਮੌਜੀਲਾ ੧.੬)
+Name[pl]=Opis przeglądarki użytkownika (Mozilla 1.6 na bieżącym systemie)
+Name[pt]=UADescription (Mozilla 1.6 no sistema actual)
+Name[pt_BR]=Descrição (Mozilla 1.6 no sistema atual)
+Name[ro]=Descriere UA (Mozilla 1.6 pentru sistemul de operare curent)
+Name[ru]=UADescription (Mozilla 1.6 на текущей системе)
+Name[rw]=UADescription (Mozilla 1.6 ku igezweho)
+Name[se]=UA-čilgehus (Mozilla 1.6 dan mašiinas)
+Name[sk]=Popis agenta (Mozilla 1.6 na aktuálnom)
+Name[sl]=UAOpis (Mozilla 1.6 na trenutnem)
+Name[sr]=UADescription (Mozilla 1.6 на тренутном)
+Name[sr@Latn]=UADescription (Mozilla 1.6 na trenutnom)
+Name[sv]=AA-beskrivning (Mozilla 1.6 på aktuell)
+Name[ta]=UADescription (Mozilla 1.6 தற்ப்போதில்)
+Name[tg]=UADescription (Системаи ҷорӣ Mozilla 1.6)
+Name[th]=UADescription (มอซิลล่า 1.6 บนระบบปัจจุบัน)
+Name[tr]=UATanımı (güncel üzerinde Mozilla 1.6)
+Name[tt]=UADescription (Mozilla 1.6, şul uq astında)
+Name[uk]=UADescription (Mozilla 1.6 на поточній ОС)
+Name[uz]=UADescription (joriy bilan Mozilla 1.6)
+Name[uz@cyrillic]=UADescription (жорий билан Mozilla 1.6)
+Name[vi]=Mô tả UA (đang dùng Mozilla 1.6)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Mozilla 1.6 sol ci do moumint)
+Name[zh_CN]=用户代理描述 (运行于本机的 Mozilla 1.6)
+Name[zh_TW]=使用者代理描述 (Mozilla 1.6 on current)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=MOZ
+X-KDE-UA-FULL=Mozilla/5.0 (appPlatform; U; appSysName appMachineType; appLanguage; rv:1.6) Gecko/20040113
+X-KDE-UA-NAME=Mozilla
+X-KDE-UA-VERSION=1.6
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/mozonwin2000.desktop b/kcontrol/kio/uasproviders/mozonwin2000.desktop
new file mode 100644
index 000000000..1e2ac37aa
--- /dev/null
+++ b/kcontrol/kio/uasproviders/mozonwin2000.desktop
@@ -0,0 +1,73 @@
+[Desktop Entry]
+Name=UADescription (1.2.1 on Windows 2000)
+Name[af]=UA-beskrywing (1.2.1 op Windows 2000)
+Name[be]=UADescription (1.2.1 на Windows 2000)
+Name[br]=UADescription (1.2.1 war Windows 2000)
+Name[bs]=UADescription (1.2.1 na Windows 2000)
+Name[ca]=Descripció UA (1.2.1 a Windows 2000)
+Name[cs]=Popis agenta (1.2.1 na Windows 2000)
+Name[csb]=Òpis programë brëkòwnika (1.2.1 na Windows 2000)
+Name[da]=Brugeragentbeskrivelse (1.2.1 på Windows 2000)
+Name[de]=Browserkennung (1.2.1 unter Windows 2000)
+Name[el]=Περιγραφή UA (1.2.1 σε Windows 2000)
+Name[eo]=UA-Priskribo (1.2.1 sub Vindozo 2000)
+Name[es]=UADescription (1.2.1 en Windows 2000)
+Name[et]=UADescription (1.2.1 Windows 2000 platvormil)
+Name[eu]=UA azalpena (1.2.1 Windows 2000n)
+Name[fa]=UADescription (1.2.1 در Windows 2000)
+Name[fi]=Käyttäjäagenttikuvaus (1.2.1 Windows 2000)
+Name[fr]=Identité du navigateur (1.2.1 sous Windows 2000)
+Name[fy]=GA-omskriuwing (1.2.1 op Windows 2000)
+Name[ga]=UADescription (1.2.1 ar Windows 2000)
+Name[gl]=UADescription (1.2.1 en Windows 2000)
+Name[he]=UADescription (1.2.1 Windows2000ב־)
+Name[hr]=UADescription (1.2.1 na Windows 2000)
+Name[hu]=Böngészőtípus (Mozilla 1.2.1, Win 2000)
+Name[id]=UADescription (1.2.1 di Windows 2000)
+Name[is]=UAD strengur (1.2.1 á Windows 2000)
+Name[it]=DescrizioneUA (1.2.1 su Windows 2000)
+Name[ka]=UADescription (1.2.1 Windows 2000-ში)
+Name[kk]=UADescription (1.2.1 / Windows 2000)
+Name[km]=UADescription (1.2.1 នៅ​លើ Windows 2000)
+Name[ko]=UADescription (윈도 2000의 IE 4.01)
+Name[lt]=Naudotojo agento aprašymas (1.2.1 ir Windows 2000)
+Name[lv]=UAApraksts (1.2.1 uz Windows 2000)
+Name[mk]=UADescription (1.2.1 на Windows 2000)
+Name[nb]=Brukeragent (1.2.1 på Windows 2000)
+Name[nds]=UA-Beschrieven (1.2.1 op Windows 2000)
+Name[ne]=UA वर्णन (विण्डोज २०००मा १.२.१)
+Name[nl]=GA-beschrijving (1.2.1 op Windows 2000)
+Name[nn]=Brukaragent (1.2.1 på Windows 2000)
+Name[pa]=UADescription (Windows 2000 'ਤੇ 1.2.1)
+Name[pl]=Opis przeglądarki użytkownika (1.2.1 na Windows 2000)
+Name[pt]=UADescription (1.2.1 no Windows 2000)
+Name[pt_BR]=Descrição (1.2.1 no Windows 2000)
+Name[ro]=Descriere UA (1.2.1 pentru WinNT 2000)
+Name[ru]=UADescription (1.2.1 на Windows 2000)
+Name[rw]=UADescription (1.2.1 kuri Windows 2000)
+Name[se]=UA-čilgehus (1.2.1 ja Windows 2000)
+Name[sl]=UAOpis (1.2.1 na Windows 2000)
+Name[sr]=UADescription (1.2.1 на Windows 2000)
+Name[sr@Latn]=UADescription (1.2.1 na Windows 2000)
+Name[sv]=AA-beskrivning (1.2.1 på Windows 2000)
+Name[ta]=UAவிவரம் (1.2.1 on Windows 2000)
+Name[tg]=UADescription (1.2.1 дар асоси Windows 2000)
+Name[tr]=UA Tanımı (Windows 2000'de 1.2.1)
+Name[tt]=UADescription (1.2.1, Windows 2000 astında)
+Name[uk]=UADescription (1.2.1 на Windows 2000)
+Name[uz]=UADescription (Windows 2000 bilan 1.2.1)
+Name[uz@cyrillic]=UADescription (Windows 2000 билан 1.2.1)
+Name[vi]=Mô tả UA (1.2.1 trên Win 2000)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Mozilla 1.2.1 so Windows 2000)
+Name[zh_CN]=用户代理描述 (运行于 Windows 2000 的 1.2.1)
+Name[zh_TW]=使用者代理描述 (1.2.1 on Windows 2000)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=MOZ
+X-KDE-UA-FULL=Mozilla/5.0 (Windows; U; Windows NT 5.0; appLanguage; 1.2.1) Gecko/20021130
+X-KDE-UA-NAME=Mozilla
+X-KDE-UA-VERSION=1.2.1
+X-KDE-UA-SYSNAME=Windows
+X-KDE-UA-SYSRELEASE=2000
+X-KDE-UA-DYNAMIC-ENTRY=1
+
diff --git a/kcontrol/kio/uasproviders/mozonwinxp.desktop b/kcontrol/kio/uasproviders/mozonwinxp.desktop
new file mode 100644
index 000000000..3cc5f9029
--- /dev/null
+++ b/kcontrol/kio/uasproviders/mozonwinxp.desktop
@@ -0,0 +1,74 @@
+[Desktop Entry]
+Name=UADescription (Mozilla 1.7 on Windows XP)
+Name[af]=UA-beskrywing (Mozilla 1.7 op Windows XP)
+Name[be]=UADescription (Mozilla 1.7 на Windows XP)
+Name[br]=UADescription (Mozilla 1.7 war Windows XP)
+Name[bs]=UADescription (Mozilla 1.7 na Windows XP)
+Name[ca]=Descripció UA (Mozilla 1.7 a Windows XP)
+Name[cs]=Popis agenta (Mozilla 1.7 na Windows XP)
+Name[csb]=Òpis programë brëkòwnika (Mozilla 1.7 na Windows XP)
+Name[da]=Brugeragentbeskrivelse (Mozilla 1.7 på Windows XP)
+Name[de]=Browserkennung (Mozilla 1.7 unter Windows XP)
+Name[el]=Περιγραφή UA (Mozilla 1.7 σε Windows XP)
+Name[eo]=UA-Priskribo (Mozilo 1.7 sub Vindozo XP)
+Name[es]=UADescription (Mozilla 1.7 en Windows XP)
+Name[et]=UADescription (Mozilla 1.7 Windows XP platvormil)
+Name[eu]=UA azalpena (Mozilla 1.7 Windows XPn)
+Name[fa]=UADescription (Mozilla 1.7 در Windows XP)
+Name[fi]=Käyttäjäagenttikuvaus (Mozilla 1.7 Windows XP)
+Name[fr]=Identité du navigateur (Mozilla 1.7 sous Windows XP)
+Name[fy]=GA-omskriuwing (Mozilla 1.7 op Windows XP)
+Name[ga]=UADescription (Mozilla 1.7 ar Windows XP)
+Name[gl]=UADescription (Mozila 1.7 en Windows XP)
+Name[he]=UADescription (Mozilla 1.7 Windows XPב־)
+Name[hr]=UADescription (Mozilla 1.7 na Windows XP)
+Name[hu]=Böngészőtípus (Mozilla 1.7, Windows XP)
+Name[id]=UADescription (Mozilla 1.7 di Windows XP)
+Name[is]=UAD strengur (Mozilla 1.7 á Windows XP)
+Name[it]=DescrizioneUA (Mozilla 1.7 su Windows XP)
+Name[ka]=UADescription (Mozilla 1.7 Windows XP-ში)
+Name[kk]=UADescription (Mozilla 1.7 / Windows XP)
+Name[km]=UADescription (Mozilla 1.7 នៅ​លើ Windows XP)
+Name[ko]=UADescription (윈도 XP의 Mozilla 1.7)
+Name[lt]=Naudotojo agento aprašymas (Mozilla 1.7 ir Windows XP)
+Name[lv]=UAApraksts (Mozilla 1.7 uz Windows XP)
+Name[mk]=UADescription (Mozilla 1.7 на Windows XP)
+Name[nb]=Brukeragent (Mozilla 1.7 på Windows XP)
+Name[nds]=UA-Beschrieven (Mozilla 1.7 op Windows XP)
+Name[ne]=UA वर्णन (विण्डोज एक्स पीमा मोजिला १.७)
+Name[nl]=GA-beschrijving (Mozilla 1.7 op Windows XP)
+Name[nn]=Brukaragent (Mozilla 1.7 på Windows XP)
+Name[pa]=UADescription (Windows XP 'ਤੇ Mozilla 1.7)
+Name[pl]=Opis przeglądarki użytkownika (Mozilla 1.7 na Windows XP)
+Name[pt]=UADescription (Mozilla 1.7 no Windows XP)
+Name[pt_BR]=Descrição (Mozilla 1.7 no Windows XP)
+Name[ro]=Descriere UA (Mozilla 1.7 pentru Windows XP)
+Name[ru]=UADescription (Mozilla 1.7 на Windows XP)
+Name[rw]=UADescription (Mozilla 1.7 kuri Windows XP)
+Name[se]=UA-čilgehus (Mozilla 1.7 ja Windows XP)
+Name[sl]=UAOpis (Mozilla 1.7 na Windows XP)
+Name[sr]=UADescription (Mozilla 1.7 на Windows XP)
+Name[sr@Latn]=UADescription (Mozilla 1.7 na Windows XP)
+Name[sv]=AA-beskrivning (Mozilla 1.7 på Windows XP)
+Name[ta]=UAவிவரம் (Mozilla 1.7 on Windows XP)
+Name[tg]=UADescription (Mozilla 1.7 дар асоси Windows XP)
+Name[th]=UADescription (มอซิลล่า 1.7 บน Windows XP)
+Name[tr]=UA Tanımı (Windows XP'de Mozilla 1.7)
+Name[tt]=UADescription (Mozilla 1.7, Windows XP astında)
+Name[uk]=UADescription (Mozilla 1.7 на Windows XP)
+Name[uz]=UADescription (Windows XP bilan Mozilla 1.7)
+Name[uz@cyrillic]=UADescription (Windows XP билан Mozilla 1.7)
+Name[vi]=Mô tả UA (Mozilla 1.7 trên Win XP)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Mozilla 1.7 so Windows XP)
+Name[zh_CN]=用户代理描述 (运行于 Windows XP 的 NN 4.7)
+Name[zh_TW]=使用者代理描述 (Mozilla 1.7 on Windows XP)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=MOZ
+X-KDE-UA-FULL=Mozilla/5.0 (Windows; U; Windows NT 5.1; appLanguage; rv:1.7.3) Gecko/20040916
+X-KDE-UA-NAME=Mozilla
+X-KDE-UA-VERSION=1.7.3
+X-KDE-UA-SYSNAME=Windows
+X-KDE-UA-SYSRELEASE=XP
+X-KDE-UA-DYNAMIC-ENTRY=1
+
diff --git a/kcontrol/kio/uasproviders/nn301oncurrent.desktop b/kcontrol/kio/uasproviders/nn301oncurrent.desktop
new file mode 100644
index 000000000..469b53b50
--- /dev/null
+++ b/kcontrol/kio/uasproviders/nn301oncurrent.desktop
@@ -0,0 +1,78 @@
+[Desktop Entry]
+Name=UADescription (NN 3.01 on current)
+Name[af]=UA-beskrywing (NN 3.01 op huidige bedryfstelsel)
+Name[be]=UADescription (NN 3.01 на гэтай сістэме)
+Name[bs]=UADescription (NN 3.01 na trenutnom)
+Name[ca]=Descripció de AU (NN 3.01 sobre l'actual)
+Name[cs]=Popis agenta (NN 3.01 na aktuálním)
+Name[csb]=Òpis programë brëkòwnika (NN 3.01)
+Name[cy]=UADisgrifiad (NN 3.01 ar gyfredol)
+Name[da]=Brugeragentbeskrivelse (NN 3.01 på denne)
+Name[de]=Browserkennung (NN 3.01 unter aktuellem Betriebssystem)
+Name[el]=Περιγραφή UA (NN 3.01 στο τρέχον σύστημα)
+Name[eo]=UA-Priskribo (NN 3.01 sub nuna)
+Name[es]=Descripción de AU (NN 3.01 en actual)
+Name[et]=UADescription (Selles masinas töötav Netscape 3.01)
+Name[eu]=UA azalpena (NN 3.01 unekoan)
+Name[fa]=UADescription (NN 3.01 در حال حاضر)
+Name[fi]=Käyttäjäagenttikuvaus (NN 3.01 nykyisellä)
+Name[fr]=Identité du navigateur (Navigator 3.01 sous le système actuel)
+Name[fy]=GA-omskriuwing (NN 3.01 op aktive)
+Name[ga]=UADescription (NN 3.01 ar an gcóras reatha)
+Name[gl]=UADescription (NN 3.01 no actual)
+Name[he]=UADescription (NN 3.01 בנוכחי)
+Name[hi]=यूएडी-डिस्क्रिप्शन (एनएन 3.01 हालिया पर)
+Name[hr]=UADescription (NN 3.01 na trenutnom)
+Name[hu]=Böngészőtípus (NN 3.01)
+Name[id]=UADescription (NN 3.01)
+Name[is]=UAD strengur (NN 3.01 on current)
+Name[it]=DescrizioneUA (NN 3.01 su sistema attuale)
+Name[ka]=UADescription (NN 3.01 მიმდინარე სისტემაში)
+Name[kk]=UADescription (NN 3.01 осы орында)
+Name[km]=UADescription (NN 3.01 បច្ចុប្បន្ន)
+Name[ko]=UADescription (현재 플랫폼의 넷스케이프 3.01)
+Name[lt]=Naudotojo agento aprašymas (NN 3.01 ir esama)
+Name[lv]=UAApraksts (NN 3.01 uz tekošā)
+Name[mk]=UADescription (NN 3.01 на тековен)
+Name[mn]=UserAgent-Тодорхойлолт (NN 3.01 on current)
+Name[mt]=UADescription (NN 3.01 fuq kurrenti)
+Name[nb]=Brukeragent (NN 3.01 herifra)
+Name[nds]=UA-Beschrieven (NN 3.01 op dit Systeem)
+Name[ne]=UA वर्णन (हाल NN 3.01 मा)
+Name[nl]=GA-beschrijving (NN 3.01 op huidige)
+Name[nn]=Brukaragent (NN 3.01 herifrå)
+Name[nso]=UAThlaloso (NN 3.01 go ya bjale)
+Name[pa]=UADescription (ਮੌਜੂਦਾ 'ਤੇ NN 3.01)
+Name[pl]=Opis przeglądarki użytkownika (NN 3.01 na bieżącym systemie)
+Name[pt]=UADescription (NN 3.01 no sistema actual)
+Name[pt_BR]=Descrição (NN 3.01 no sistema atual)
+Name[ro]=Descriere UA (NN 3.01 pentru sistemul de operare curent)
+Name[ru]=UADescription (NN 3.01 на текущей системе)
+Name[rw]=UADescription (NN 3.01 ku igezweho)
+Name[se]=UA-čilgehus (NN 3.01 dán mašiinnas)
+Name[sk]=Popis agenta (NN 3.01 na aktuálnom)
+Name[sl]=UAOpis (NN 3.01 na trenutnem)
+Name[sr]=UADescription (NN 3.01 на тренутном)
+Name[sr@Latn]=UADescription (NN 3.01 na trenutnom)
+Name[sv]=AA-beskrivning (NN 3.01 på aktuell)
+Name[ta]=UAவிவரம் (NN 3.01 on current)
+Name[tg]=ТавзеҳиUA (NN 3.01 равон)
+Name[th]=UADescription (NN 3.01 บนระบบปัจจุบัน)
+Name[tr]=UA Tanımı (güncel üzerinde NN 3.01)
+Name[tt]=UADescription (NN 3.01, şul uq astında)
+Name[uk]=UADescription (NN 3.01 на поточній ОС)
+Name[uz]=UADescription (joriy bilan NN 3.01)
+Name[uz@cyrillic]=UADescription (жорий билан NN 3.01)
+Name[ven]=Thalutshedzo ya UA (NN 3.01 zwa zwino)
+Name[vi]=Mô tả UA (đang dùng NN 3.01)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (NN 3.01 sol ci do moumint)
+Name[xh]=UADescription (NN 3.01 okwangoku)
+Name[zh_CN]=用户代理描述 (运行于本机的 NN 3.01)
+Name[zh_TW]=使用者代理描述 (NN 3.01 on current)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=NN
+X-KDE-UA-FULL=Mozilla/3.01 (appPlatform; I; appSysName appSysRelease appMachineType)
+X-KDE-UA-NAME=Netscape Navigator
+X-KDE-UA-VERSION=3.01
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/nn475oncurrent.desktop b/kcontrol/kio/uasproviders/nn475oncurrent.desktop
new file mode 100644
index 000000000..783ee5b99
--- /dev/null
+++ b/kcontrol/kio/uasproviders/nn475oncurrent.desktop
@@ -0,0 +1,78 @@
+[Desktop Entry]
+Name=UADescription (NN 4.76 on current)
+Name[af]=UA-beskrywing (NN 4.76 op huidige bedryfstelsel)
+Name[be]=UADescription (NN 4.76 на гэтай сістэме)
+Name[bs]=UADescription (NN 4.76 na trenutnom)
+Name[ca]=Descripció de AU (NN 4.76 sobre l'actual)
+Name[cs]=Popis agenta (NN 4.76 na aktuálním)
+Name[csb]=Òpis programë brëkòwnika (NN 4.76)
+Name[cy]=UADisgrifiad (NN 4.76 ar gyfredol)
+Name[da]=Brugeragentbeskrivelse (NN 4.76 på denne)
+Name[de]=Browserkennung (NN 4.76 unter aktuellem Betriebssystem)
+Name[el]=Περιγραφή UA (NN 4.76 στο τρέχον σύστημα)
+Name[eo]=UA-Priskribo (NN 4.76 sub nuna)
+Name[es]=Descripción de AU (NN 4.76 en actual)
+Name[et]=UADescription (Selles masinas töötav Netscape 4.76)
+Name[eu]=UA azalpena (NN 4.76 unekoan)
+Name[fa]=UADescription (NN 4.76 در حال حاضر)
+Name[fi]=Käyttäjäagenttikuvaus (NN 4.76 nykyisellä)
+Name[fr]=Identité du navigateur (Navigator 4.76 sous le système actuel)
+Name[fy]=GA-omskriuwing (NN 4.76 op aktive)
+Name[ga]=UADescription (NN 4.76 ar an gcóras reatha)
+Name[gl]=UADescription (NN 4.76 no actual)
+Name[he]=UADescription (NN 4.76 בנוכחי)
+Name[hi]=यूएडी-डिस्क्रिप्शन (एनएन 4.76 हालिया पर)
+Name[hr]=UADescription (NN 4.76 na trenutnom)
+Name[hu]=Böngészőtípus (NN 4.76)
+Name[id]=UADescription (NN 4.76)
+Name[is]=UAD strengur (NN 4.76 on current)
+Name[it]=DescrizioneUA (NN 4.76)
+Name[ka]=UADescription (NN 4.76 მიმდინარე სისტემაში)
+Name[kk]=UADescription (NN 4.76 осы орында)
+Name[km]=UADescription (NN 4.76 បច្ចុប្បន្ន)
+Name[ko]=UADescription (현재 플랫폼의 넷스케이프 4.76)
+Name[lt]=Naudotojo agento aprašymas (NN 4.76 ir esama)
+Name[lv]=UAApraksts (NN 4.76 uz tekošā)
+Name[mk]=UADescription (NN 4.76 на тековен)
+Name[mn]=UserAgent-Тодорхойлолт (NN 4.76 on current)
+Name[mt]=UADescription (NN 4.76 fuq kurrenti)
+Name[nb]=Brukeragent (NN 4.76 herifra)
+Name[nds]=UA-Beschrieven (NN 4.76 op dit Systeem)
+Name[ne]=UA वर्णन (हाल NN 4.76 मा)
+Name[nl]=GA-beschrijving (NN 4.76 op huidige)
+Name[nn]=Brukaragent (NN 4.76 herifrå)
+Name[nso]=UAThlaloso (NN 4.76 go ya bjale)
+Name[pa]=UADescription (ਮੌਜੂਦਾ 'ਤੇ NN 4.76)
+Name[pl]=Opis przeglądarki użytkownika (NN 4.76 na bieżącym systemie)
+Name[pt]=UADescription (NN 4.76 no sistema actual)
+Name[pt_BR]=Descrição (NN 4.76 no sistema atual)
+Name[ro]=Descriere UA (NN 4.76 pentru sistemul de operare curent)
+Name[ru]=UADescription (NN 4.76 на текущей системе)
+Name[rw]=UADescription (NN 4.76 ku igezweho)
+Name[se]=UA-čilgehus (NN 4.76 dán mašiinnas)
+Name[sk]=Popis agenta (NN 4.76 na aktuálnom)
+Name[sl]=UAOpis (NN 4.76 na trenutnem)
+Name[sr]=UADescription (NN 4.76 на тренутном)
+Name[sr@Latn]=UADescription (NN 4.76 na trenutnom)
+Name[sv]=AA-beskrivning (NN 4.76 på aktuell)
+Name[ta]=UAவிவரம் (NN 4.76 on current)
+Name[tg]=ТавзеҳиUA (NN 4.76 равон)
+Name[th]=UADescription (NN 4.76 บนระบบปัจจุบัน)
+Name[tr]=UA Tanımı (güncel üzerinde NN 4.76)
+Name[tt]=UADescription (NN 4.76, şul uq astında)
+Name[uk]=UADescription (NN 4.76 на поточній ОС)
+Name[uz]=UADescription (joriy bilan NN 4.76)
+Name[uz@cyrillic]=UADescription (жорий билан NN 4.76)
+Name[ven]=Thalutshedzo ya UA (NN 4.76 zwa zwino)
+Name[vi]=Mô tả UA (đang dùng NN 4.76)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (NN 4.76 sol ci do moumint)
+Name[xh]=UADescription (NN 4.76 okwangoku)
+Name[zh_CN]=用户代理描述 (运行于本机的 NN 4.76)
+Name[zh_TW]=使用者代理描述 (NN 4.76 on current)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=NN
+X-KDE-UA-FULL=Mozilla/4.76 (appPlatform; U; appSysName appSysRelease appMachineType)
+X-KDE-UA-NAME=Netscape Navigator
+X-KDE-UA-VERSION=4.76
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/nn475onwin95.desktop b/kcontrol/kio/uasproviders/nn475onwin95.desktop
new file mode 100644
index 000000000..9416516f4
--- /dev/null
+++ b/kcontrol/kio/uasproviders/nn475onwin95.desktop
@@ -0,0 +1,81 @@
+[Desktop Entry]
+Name=UADescription (NN 4.7 on Windows 95)
+Name[af]=UA-beskrywing (NN 4.7 op Windows 95)
+Name[be]=UADescription (NN 4.7 на Windows 95)
+Name[br]=UADescription (NN 4.7 war Windows 95)
+Name[bs]=UADescription (NN 4.7 na Windows 95)
+Name[ca]=Descripció de AU (NN 4.7 en Windows 95)
+Name[cs]=Popis agenta (NN 4.7 na Windows 95)
+Name[csb]=Òpis programë brëkòwnika (NN 4.7 na Windows 95)
+Name[cy]=UADisgrifiad (NN4.7 ar Windows 95)
+Name[da]=Brugeragentbeskrivelse (NN 4.7 på Windows 95)
+Name[de]=Browserkennung (NN 4.7 unter Windows 95)
+Name[el]=Περιγραφή UA (NN 4.7 σε Windows 95)
+Name[eo]=UA-Priskribo (NN 4.7 sub Vindozo 95)
+Name[es]=Descripción de AU (NN 4.7 en Windows 95)
+Name[et]=UADescription (Netscape 4.7 Win95 platvormil)
+Name[eu]=UA azalpena (NN 4.7 Windows 95-ean)
+Name[fa]=UADescription (NN 4.7 در Windows 95)
+Name[fi]=Käyttäjäagenttikuvaus (NN 4.7 Windows 95:lla)
+Name[fr]=Identité du navigateur (Navigator 4.7 sous Windows 95)
+Name[fy]=GA-omskriuwing (NN 4.76 op Windows 95)
+Name[ga]=UADescription (NN 4.7 ar Windows 95)
+Name[gl]=UADescription (NN 4.7 en Windows 95)
+Name[he]=UADescription (Windows 95ב־ NN 4.7)
+Name[hi]=यूएडी-डिस्क्रिप्शन (एनएन 4.7 विंडोज़ 95 पर)
+Name[hr]=UADescription (NN 4.7 na Windows 95)
+Name[hu]=Böngészőtípus (NN 4.7, Win 95)
+Name[id]=UADescription (NN 4.7 di Windows 95)
+Name[is]=UAD strengur (NN 4.7 on Windows 95)
+Name[it]=DescrizioneUA (NN 4.7 su Windows 95)
+Name[ka]=UADescription (NN 4.7 Windows 95-ში)
+Name[kk]=UADescription (NN 4.7 / Windows 95)
+Name[km]=UADescription (NN 4.7 នៅ​លើ Windows 95)
+Name[ko]=UADescription (윈도 95의 넷스케이프 4.7)
+Name[lt]=Naudotojo agento aprašymas (NN 4.7 ir Windows 95)
+Name[lv]=UAApraksts (NN 4.7 uz Windows 95)
+Name[mk]=UADescription (NN 4.7 на Windows 95)
+Name[mn]=UserAgent-Тодорхойлолт (NN 4.7 on Windows 95)
+Name[mt]=UADescription (NN 4.7 fuq Windows 95)
+Name[nb]=Brukeragent (NN 4.7 på Windows 95)
+Name[nds]=UA-Beschrieven (NN 4.7 op Windows 95)
+Name[ne]=UA वर्णन (विण्डोज ९५ मा NN 4.7)
+Name[nl]=GA-beschrijving (NN 4.76 op Windows 95)
+Name[nn]=Brukaragent (NN 4.7 på Windows 95)
+Name[nso]=UAThlaloso (NN4.7 go Windows 95)
+Name[pa]=UADescription (ਵਿੰਡੋ ੯੫ 'ਤੇ NN 4.7)
+Name[pl]=Opis przeglądarki użytkownika (NN 4.7 na Windows 95)
+Name[pt]=UADescription (NN 4.7 no Windows 95)
+Name[pt_BR]=Descrição (NN 4.7 no Windows 95)
+Name[ro]=Descriere UA (NN 4.7 pentru Windows 95)
+Name[ru]=UADescription (NN 4.7 на Windows 95)
+Name[rw]=UADescription (NN 4.7 kuri Windows 95)
+Name[se]=UA-čilgehus (NN 4.7 ja Windows 95)
+Name[sk]=Popis agenta (NN 4.7 na Windows 95)
+Name[sl]=UAOpis (NN 4.7 na Windows 95)
+Name[sr]=UADescription (NN 4.7 на Windows 95)
+Name[sr@Latn]=UADescription (NN 4.7 na Windows 95)
+Name[sv]=AA-beskrivning (NN 4.7 på Windows 95)
+Name[ta]=UAவிவரம் (NN 4.7 on Windows 95)
+Name[tg]=ТавзеҳиUA (NN 4.7 ба Windows 95)
+Name[th]=UADescription (NN 4.7 บน Windows 95)
+Name[tr]=UA Tanımı (Windows 95 üzerinde NN 4.7)
+Name[tt]=UADescription (NN 4.7, Windows 95 astında)
+Name[uk]=UADescription (NN 4.7 на Windows 95)
+Name[uz]=UADescription (Windows 95 bilan NN 4.7)
+Name[uz@cyrillic]=UADescription (Windows 95 билан NN 4.7)
+Name[ven]=Thalutshedzo ya UA (NN 4.7 kha 95)
+Name[vi]=Mô tả UA (NN 4.7 trên Windows 95)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (NN 4.7 so Windows 95)
+Name[xh]=UADescription (NN 4.7 kwi Windows.95)
+Name[zh_CN]=用户代理描述 (运行于 Windows 95 的 NN 4.7)
+Name[zh_TW]=使用者代理描述 (NN 4.7 on Windows 95)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=NN
+X-KDE-UA-FULL=Mozilla/4.7 [appLanguage] (Win95; U)
+X-KDE-UA-NAME=Netscape Navigator
+X-KDE-UA-VERSION=4.76
+X-KDE-UA-SYSNAME=Windows
+X-KDE-UA-SYSRELEASE=95
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/nn476onppc.desktop b/kcontrol/kio/uasproviders/nn476onppc.desktop
new file mode 100644
index 000000000..b24f83abc
--- /dev/null
+++ b/kcontrol/kio/uasproviders/nn476onppc.desktop
@@ -0,0 +1,82 @@
+[Desktop Entry]
+Name=UADescription (NN on Mac PPC)
+Name[af]=UA-beskrywing (NN op Mac PPC)
+Name[be]=UADescription (NN на Mac PPC)
+Name[br]=UADescription (NN war Mac PPC)
+Name[bs]=UADescription (NN na Mac PPC)
+Name[ca]=Descripció de AU (NN en Mac PPC)
+Name[cs]=Popis agenta (NN na Mac PPC)
+Name[csb]=Òpis programë brëkòwnika (NN na Mac PPC)
+Name[cy]=UADisgrifiad (NN ar Mac PPC)
+Name[da]=Brugeragentbeskrivelse (NN på Mac PPC)
+Name[de]=Browserkennung (NN auf Mac PPC)
+Name[el]=Περιγραφή UA (NN σε Mac PPC)
+Name[eo]=UA-Priskribo (NN sub Mac-PPC)
+Name[es]=Descripción de AU (NN en Mac PPC)
+Name[et]=UADescription (Netscape MacPPC platvormil)
+Name[eu]=UA azalpena (NN Mac PPC-n)
+Name[fa]=UADescription (NN در Mac PPC)
+Name[fi]=Käyttäjäagenttikuvaus (NN Mac PPC:llä)
+Name[fr]=Identité du navigateur (Navigator sous Mac PPC)
+Name[fy]=GA-omskriuwing (NN op Mac PPC)
+Name[ga]=UADescription (NN ar Mac PPC)
+Name[gl]=UADescription (NN en Mac PPC)
+Name[he]=UADescription (Mac PPCב־ NN)
+Name[hi]=यूएडी-डिस्क्रिप्शन (एनएन मैक पीपीसी पर)
+Name[hr]=UADescription (NN na Mac PPC)
+Name[hu]=Böngészőtípus (NN, Mac PPC)
+Name[id]=UADescription (NN di Mac PPC)
+Name[is]=UAD strengur (NN on Mac PPC)
+Name[it]=DescrizioneUA (NN su Mac PPC)
+Name[ka]=UADescription (NN на Mac PPC)
+Name[kk]=UADescription (NN / Mac PPC)
+Name[km]=UADescription (NN នៅ​លើ Mac PPC)
+Name[ko]=UADescription (Mac PPC의 IE 5.0)
+Name[lt]=Naudotojo agento aprašymas (NN ir Mac PPC)
+Name[lv]=UAApraksts (NN uz Mac PPC)
+Name[mk]=UADescription (NN на Mac PPC)
+Name[mn]=UserAgent-Тодорхойлолт (NN on Mac PPC)
+Name[mt]=UADescription (NN fuq Mac PPC)
+Name[nb]=Brukeragent (NN på Mac PPC)
+Name[nds]=UA-Beschrieven (NN op Mac PPC)
+Name[ne]=UA वर्णन (Mac PPC NN on)
+Name[nl]=GA-beschrijving (NN op Mac PPC)
+Name[nn]=Brukaragent (NN på Mac PPC)
+Name[nso]=UAThlaloso (NN go Mac PPC)
+Name[pa]=UADescription (Mac PPC 'ਤੇ N1)
+Name[pl]=Opis przeglądarki użytkownika (NN na Mac PPC)
+Name[pt]=UADescription (NN no Mac PPC)
+Name[pt_BR]=Descrição (NN no Mac PPC)
+Name[ro]=Descriere UA (NN pentru Mac PPC)
+Name[ru]=UADescription (NN на Mac PPC)
+Name[rw]=UADescription (NN kuri Mac PPC)
+Name[se]=UA-čilgehus (NN ja Mac PPC)
+Name[sk]=Popis agenta (NN na Mac PPC)
+Name[sl]=UAOpis (NN na Mac PPC)
+Name[sr]=UADescription (NN на Mac PPC-у)
+Name[sr@Latn]=UADescription (NN na Mac PPC-u)
+Name[sv]=AA-beskrivning (NN på Mac PPC)
+Name[ta]=UAவிவரம் (NN on Mac PPC)
+Name[tg]=ТавзеҳиUA (NN ба Mac PPC)
+Name[th]=UADescription (NN บน Mac PPC)
+Name[tr]=UA Tanımı (Mac PPC üzerinde NN)
+Name[tt]=UADescription (NN, Mac PPC astında)
+Name[uk]=UADescription (NN на Mac PPC)
+Name[uz]=UADescription (Mac PPC bilan NN)
+Name[uz@cyrillic]=UADescription (Mac PPC билан NN)
+Name[ven]=Thalutshedzo ya UA (NN kha Mac PPC)
+Name[vi]=Mô tả UA (NN trên Mac PPC)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (NN so Mac PPC)
+Name[xh]=UADescription (NN kwi Mac PPC)
+Name[zh_CN]=用户代理描述 (运行于 Mac PPC 的 NN)
+Name[zh_TW]=使用者代理描述 (NN on Mac PPC)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=NN
+X-KDE-UA-FULL=Mozilla/4.76 (Macintosh; U; PPC)
+X-KDE-UA-NAME=Netscape Navigator
+X-KDE-UA-VERSION=4.76
+X-KDE-UA-SYSNAME=Mac
+X-KDE-UA-SYSRELEASE=PPC
+
+
diff --git a/kcontrol/kio/uasproviders/ns71oncurrent.desktop b/kcontrol/kio/uasproviders/ns71oncurrent.desktop
new file mode 100644
index 000000000..6dc158c57
--- /dev/null
+++ b/kcontrol/kio/uasproviders/ns71oncurrent.desktop
@@ -0,0 +1,72 @@
+[Desktop Entry]
+Name=UADescription (Netscape 7.1 on current)
+Name[af]=UA-beskrywing (Netscape 7.1 op huidige bedryfstelsel)
+Name[az]=İA İzahatı (Netscape 7.1 on current)
+Name[be]=UADescription (NN 3.01 на гэтай сістэме)
+Name[bs]=UADescription (Netscape 7.1 na trenutnom)
+Name[ca]=Descripció UA (Netscape 7.1 a l'actual)
+Name[cs]=Popis agenta (Netscape 7.1 na aktuálním)
+Name[csb]=Òpis programë brëkòwnika (Netscape 7.1)
+Name[da]=UADescription (Netscape 7.1 på denne)
+Name[de]=Browserkennung (Netscape 7.1 unter aktuellem Betriebssystem)
+Name[el]=Περιγραφή UA (Netscape 7.1 στο τρέχον σύστημα)
+Name[eo]=UA-Priskribo (Netskapo 7.1 sub nuna)
+Name[es]=UADescription (Netscape 7.1 en actual)
+Name[et]=UADescription (Selles masinas töötav Netscape 7.1)
+Name[eu]=UA azalpena (Netscape 7.1 unekoan)
+Name[fa]=UADescription (Netscape 7.1 در حال حاضر)
+Name[fi]=Käyttäjäagenttikuvaus (Netscape 7.1 nykyisellä)
+Name[fr]=Identité du navigateur (Netscape 7.1 sous le système actuel)
+Name[fy]=GA-omskriuwing (Netscape 7.1 op aktive)
+Name[ga]=UADescription (Netscape 7.1 ar an gcóras reatha)
+Name[gl]=UADescription (Netscape 7.1 no actual)
+Name[he]=UADescription (Netscape 7.1 בנוכחי)
+Name[hi]=यूए-डिस्क्रिप्शन (मौजूदा में नेटस्केप 7.1)
+Name[hr]=UADescription (Netscape 7.1 na trenutnom)
+Name[hu]=Böngészőtípus (Netscape 7.1)
+Name[id]=UADescription (Netscape 7.1)
+Name[is]=UAD strengur (Netscape 7.1 á núverandi)
+Name[it]=DescrizioneUA (Netscape 7.1 su sistema attuale)
+Name[ka]=UADescription (Netscape 7.1 მიმდინარე სისტემაში)
+Name[kk]=UADescription (Netscape 7.1 осы орында)
+Name[km]=UADescription (Netscape 7.1 បច្ចុប្បន្ន)
+Name[ko]=UADescription (현재 플랫폼의 넷스케이프 7.1)
+Name[lt]=Naudotojo agento aprašymas (Netscape 7.1 ir esama)
+Name[lv]=UAApraksts (NN 7.1 uz tekošā)
+Name[mk]=UADescription (Netscape 7.1 на тековно)
+Name[mt]=UADescription (NN 3.01 fuq kurrenti)
+Name[nb]=Brukeragent (Netscape 7.1 herifra)
+Name[nds]=UA-Beschrieven (Netscape 7.1 op dit Systeem)
+Name[ne]=UA वर्णन (हाल नेटस्केप ७.१)
+Name[nl]=GA-beschrijving (Netscape 7.1 op current)
+Name[nn]=Brukaragent (Netscape 7.1 herifrå)
+Name[pa]=UADescription (ਮੌਜੂਦਾ 'ਤੇ Netscape 7.1)
+Name[pl]=Opis przeglądarki użytkownika (Netscape 7.1 na bieżącym systemie)
+Name[pt]=UADescription (Netscape 7.1 no sistema actual)
+Name[pt_BR]=Descrição (Netscape 7.1 no sistema atual)
+Name[ro]=Descriere UA (Netscape 7.1 pentru sistemul de operare curent)
+Name[ru]=UADescription (Netscape 7.1 на текущей системе)
+Name[rw]=UADescription (Netscape 7.1 ku igezweho)
+Name[se]=UA-čilgehus (Netscape 7.1 dán mašiinnas)
+Name[sl]=UAOpis (Netscape 7.1 na trenutnem)
+Name[sr]=UADescription (Netscape 7.1 на тренутном)
+Name[sr@Latn]=UADescription (Netscape 7.1 na trenutnom)
+Name[sv]=AA-beskrivning (Netscape 7.1 på aktuell)
+Name[ta]=UAவிவரம் (நடப்பில் 3.01 நெட்ஸ்கேப்)
+Name[tg]=UADescription (Системаи ҷорӣ Netscape 7.1)
+Name[th]=UADescription (เน็ตสเคป 7.1 บนระบบปัจจุบัน)
+Name[tr]=UA Tanımı (Netscape 7.1)
+Name[tt]=UADescription (Netscape 7.1, şul uq astında)
+Name[uz]=UADescription (joriy bilan Netscape 7.1)
+Name[uz@cyrillic]=UADescription (жорий билан Netscape 7.1)
+Name[vi]=Mô tả UA (đang dùng Netscape 7.1)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Netscape 7.1 sol ci do moumint)
+Name[zh_CN]=用户代理描述 (运行于本机的 Netscape 7.1)
+Name[zh_TW]=使用者代理描述 (Netscape 7.1 on current)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=NN
+X-KDE-UA-FULL=Mozilla/5.0 (appPlatform; U; appSysName appMachineType; en-CA; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)
+X-KDE-UA-NAME=Netscape
+X-KDE-UA-VERSION=7.1
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/ns71onwinnt51.desktop b/kcontrol/kio/uasproviders/ns71onwinnt51.desktop
new file mode 100644
index 000000000..73cfb9d8a
--- /dev/null
+++ b/kcontrol/kio/uasproviders/ns71onwinnt51.desktop
@@ -0,0 +1,74 @@
+[Desktop Entry]
+Name=UADescription (Netscape 7.1 on XP)
+Name[af]=UA-beskrywing (Netscape 7.1 op XP)
+Name[az]=İA İzahatı (XP üstündə Netscape 7.1)
+Name[be]=UADescription (Netscape 7.1 на XP)
+Name[br]=UADescription (Netscape 7.1 war XP)
+Name[bs]=UADescription (Netscape 7.1 na XP)
+Name[ca]=Descripció UA (Netscape 7.1 a XP)
+Name[cs]=Popis agenta (Netscape 7.1 na XP)
+Name[csb]=Òpis programë brëkòwnika (Netscape 7.1 na Windows XP)
+Name[da]=UADescription (Netscape 7.1 på XP)
+Name[de]=Browserkennung (Netscape 7.1 unter Windows XP)
+Name[el]=Περιγραφή UA (Netscape 7.1 σε Win XP)
+Name[eo]=UA-Priskribo (Netskapo 7.1 sub Vindozo XP)
+Name[es]=UADescription (Netscape 7.1 en XP)
+Name[et]=UADescription (Netscape 7.1 Win XP platvormil)
+Name[eu]=UA azalpena (Netscape 7.1 XPn)
+Name[fa]=UADescription (Netscape 7.1 در XP)
+Name[fi]=Käyttäjäagenttikuvaus (Netscape 7.1 Win XP:llä)
+Name[fr]=Identité du navigateur (Netscape 7.1 sous Windows XP)
+Name[fy]=GA-omskriuwing (Netscape 7.1 op XP)
+Name[ga]=UADescription (Netscape 7.1 ar XP)
+Name[gl]=UADescription (Netscape 7.1 en Win XP)
+Name[he]=UADescription (Netscape 7.1 XPב־)
+Name[hi]=यूए-डिस्क्रिप्शन (एक्सपी में नेटस्केप 7.1)
+Name[hr]=UADescription (Netscape 7.1 na XP)
+Name[hu]=Böngészőtípus (Netscape 7.1 Windows XP)
+Name[id]=UADescription (Netscape 7.1 di XP)
+Name[is]=UAD strengur (Netscape 7.1 á XP)
+Name[it]=DescrizioneUA (Netscape 7.1 su XP)
+Name[ka]=UADescription (Netscape 7.1 XP-ში)
+Name[kk]=UADescription (Netscape 7.1 / XP)
+Name[km]=UADescription (Netscape 7.1 នៅ​លើ XP)
+Name[ko]=UADescription (윈도 XP의 넷스케이프 7.1)
+Name[lt]=Naudotojo agento aprašymas (Netscape 7.1 ir Windows XP)
+Name[lv]=UAApraksts (Netscape 7.1 uz XP)
+Name[mk]=UADescription (Netscape 7.1 на XP)
+Name[mt]=UADescription (IE 6.0 fuq Win XP)
+Name[nb]=Brukeragent (Netscape 7.1 på XP)
+Name[nds]=UA-Beschrieven (Netscape 7.1 op XP)
+Name[ne]=UA वर्णन (XP मा नेटस्केप ७.१)
+Name[nl]=GA-beschrijving (Netscape 7.1 op XP)
+Name[nn]=Brukaragent (Netscape 7.1 på XP)
+Name[pa]=UADescription (XP 'ਤੇ Netscape 7.1)
+Name[pl]=Opis przeglądarki użytkownika (Netscape 7.1 na Windows XP)
+Name[pt]=UADescription (Netscape 7.1 no XP)
+Name[pt_BR]=Descrição (Netscape 7.1 no XP)
+Name[ro]=Descriere UA (Netscape 7.1 pentru Win XP)
+Name[ru]=UADescription (Netscape 7.1 на XP)
+Name[rw]=UADescription (Netscape 7.1 kuri XP)
+Name[se]=UA-čilgehus (Netscape 7.1 on XP)
+Name[sl]=UAopis (Netscape 7.1 na Windows XP)
+Name[sr]=UADescription (Netscape 7.1 на XP)
+Name[sr@Latn]=UADescription (Netscape 7.1 na XP)
+Name[sv]=AA-beskrivning (Netscape 7.1 på XP)
+Name[ta]=UAவிவரம் ( XPல் நெட்ஸ்கேப் 7.1 )
+Name[tg]=UADescription (Netscape 7.1 дар асоси XP)
+Name[th]=UADescription (เน็ตสเคป 7.1 บน XP)
+Name[tr]=UA Tanımı (XP üzerinde Netscape 6.0)
+Name[tt]=UADescription (Netscape 7.1, XP astında)
+Name[uz]=UADescription (Windows XP bilan Netscape 7.1)
+Name[uz@cyrillic]=UADescription (Windows XP билан Netscape 7.1)
+Name[vi]=Mô tả UA (Netscape 7.1 trên Win XP)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Netscape 7.1 so XP)
+Name[zh_CN]=用户代理描述 (运行于 Win XP 的 Netscape 7.1)
+Name[zh_TW]=使用者代理描述 (Netscape 7.1 on XP)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=NN
+X-KDE-UA-FULL=Mozilla/5.0 (Windows; U; Windows NT 5.1; en-CA; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)
+X-KDE-UA-NAME=Netscape
+X-KDE-UA-VERSION=7.1
+X-KDE-UA-SYSNAME=Windows
+X-KDE-UA-SYSRELEASE=XP
diff --git a/kcontrol/kio/uasproviders/op403onwinnt4.desktop b/kcontrol/kio/uasproviders/op403onwinnt4.desktop
new file mode 100644
index 000000000..96111efa9
--- /dev/null
+++ b/kcontrol/kio/uasproviders/op403onwinnt4.desktop
@@ -0,0 +1,80 @@
+[Desktop Entry]
+Name=UADescription (Opera 4.03 on NT)
+Name[af]=UA-beskrywing (Opera 4.03 op NT)
+Name[be]=UADescription (Opera 4.03 на NT)
+Name[br]=UADescription (Opera 4.03 war NT)
+Name[bs]=UADescription (Opera 4.03 na NT)
+Name[ca]=Descripció de AU (Opera 4.03 en NT)
+Name[cs]=Popis agenta (Opera 4.03 na NT)
+Name[csb]=Òpis programë brëkòwnika (Opera 4.03 na NT)
+Name[cy]=UADisgrifiad (Opera 4.03 ar NT)
+Name[da]=Brugeragentbeskrivelse (Opera 4.03 på NT)
+Name[de]=Browserkennung (Opera 4.03 unter Windows NT)
+Name[el]=Περιγραφή UA (Opera 4.03 σε NT)
+Name[eo]=UA-Priskribo (Opera 4.03 sub NT)
+Name[es]=Descripción de AU (Opera 4.03 en NT)
+Name[et]=UADescription (Opera 4.03 WinNT platvormil)
+Name[eu]=UA azalpena (Opera 4.03 NT-n)
+Name[fa]=UADescription (Opera 4.03 در NT)
+Name[fi]=Käyttäjäagenttikuvaus (Opera 4.03 NT:llä)
+Name[fr]=Identité du navigateur (Opera 4.03 sous Windows NT)
+Name[fy]=GA-omskriuwing (Opera 4.03 op NT)
+Name[ga]=UADescription (Opera 4.03 ar NT)
+Name[gl]=UADescription (Opera 4.03 en NT)
+Name[he]=UADescription (NTב־ Opera 4.03)
+Name[hi]=यूएडी-डिस्क्रिप्शन (ओपेरा 4.03 एनटी पर)
+Name[hr]=UADescription (Opera 4.03 na NT)
+Name[hu]=Böngészőtípus (Opera 4.03, Win NT)
+Name[id]=UADescription (Opera 4.03 di NT)
+Name[is]=UAD strengur (Opera 4.03 on NT)
+Name[it]=DescrizioneUA (Opera 4.03 su NT)
+Name[ka]=UADescription (Opera 4.03 на NT)
+Name[kk]=UADescription (Opera 4.03 / NT)
+Name[km]=UADescription (Opera 4.03 នៅ​លើ NT)
+Name[ko]=UADescription (윈도 NT의 Opera 4.03)
+Name[lt]=Naudotojo agento aprašymas (Opera 4.03ir NT)
+Name[lv]=UAApraksts (Opera 4.03 uz NT)
+Name[mk]=UADescription (Opera 4.03 на NT)
+Name[mn]=UserAgent-Тодорхойлолт (Opera 4.03 on NT)
+Name[mt]=UADescription (Opera 4.03 fuq NT)
+Name[nb]=Brukeragent (Opera 4.03 på NT)
+Name[nds]=UA-Beschrieven (Opera 4.03 op NT)
+Name[ne]=UA वर्णन (NT मा Opera 4.03)
+Name[nl]=GA-beschrijving (Opera 4.03 op NT)
+Name[nn]=Brukaragent (Opera 4.03 på NT)
+Name[nso]=UAThlaloso (Opera 4.03 go NT)
+Name[pa]=UADescription (NT 'ਤੇ ਓਪੇਰਾ 4.03)
+Name[pl]=Opis przeglądarki użytkownika (Opera 4.03 na NT)
+Name[pt]=UADescription (Opera 4.03 em NT)
+Name[pt_BR]=Descrição (Opera 4.03 no NT)
+Name[ro]=Descriere UA (Opera 4.03 pentru NT)
+Name[ru]=UADescription (Opera 4.03 на NT)
+Name[rw]=UADescription (Opera 4.03 kuri NT)
+Name[se]=UA-čilgehus (Opera 4.03 ja NT)
+Name[sk]=Popis agenta (Opera 4.03 na NT)
+Name[sl]=UAOpis (Opera 4.03 na Windows NT)
+Name[sr]=UADescription (Opera 4.03 на NT-у)
+Name[sr@Latn]=UADescription (Opera 4.03 na NT-u)
+Name[sv]=AA-beskrivning (Opera 4.03 på NT)
+Name[ta]=UAவிவரம்(Opera 4.03 on NT)
+Name[tg]=ТавзеҳиUA (Opera 4.03 ба NT)
+Name[th]=UADescription (โอเปร่า 4.03 บน NT)
+Name[tr]=UA Tanımı (NT üzerinde Opera 4.03)
+Name[tt]=UADescription (Opera 4.03, şul uq astında)
+Name[uk]=UADescription (Opera 4.03 на NT)
+Name[uz]=UADescription (NT bilan Opera 4.03)
+Name[uz@cyrillic]=UADescription (NT билан Opera 4.03)
+Name[ven]=Thalutshedzo ya UA (Opera 4.03 kha NT)
+Name[vi]=Mô tả UA (Opera 4.03 trên NT)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Opera 4.03 so NT)
+Name[xh]=UADescription (Opera 4.03 kwi NT)
+Name[zh_CN]=用户代理描述 (运行于 NT 的 Opera 4.03)
+Name[zh_TW]=使用者代理描述 (Opera 4.03 on NT)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=OPR
+X-KDE-UA-FULL=Opera/4.03 (Windows NT 4.0; U)
+X-KDE-UA-NAME=Opera
+X-KDE-UA-VERSION=4.03
+X-KDE-UA-SYSNAME=Windows NT
+X-KDE-UA-SYSRELEASE=4.0
diff --git a/kcontrol/kio/uasproviders/op75oncurrent.desktop b/kcontrol/kio/uasproviders/op75oncurrent.desktop
new file mode 100644
index 000000000..ecd498f60
--- /dev/null
+++ b/kcontrol/kio/uasproviders/op75oncurrent.desktop
@@ -0,0 +1,69 @@
+[Desktop Entry]
+Name=UADescription (Opera 7.53 on current)
+Name[af]=UA-beskrywing (Opera 7.53 op huidige bedryfstelsel)
+Name[be]=UADescription (Opera 7.53 на гэтай сістэме)
+Name[bs]=UADescription (Opera 7.53 na trenutnom)
+Name[ca]=Descripció UA (Opera 7.53 a l'actual)
+Name[cs]=Popis agenta (Opera 7.53 na aktuálním)
+Name[csb]=Òpis programë brëkòwnika (Opera 7.53)
+Name[da]=UADescription (Opera 7.53 på denne)
+Name[de]=Browserkennung (Opera 7.53 unter aktuellem Betriebssystem)
+Name[el]=Περιγραφή UA (Opera 7.53 στο τρέχον σύστημα)
+Name[eo]=UA-Priskribo (Opera 7.53 sub nuna)
+Name[es]=UADescription (Opera 7.53 en actual)
+Name[et]=UADescription (Selles masinas töötav Opera 7.53)
+Name[eu]=UA azalpena (Opera 7.53 unekoan)
+Name[fa]=UADescription (Opera 7.53 در حال حاضر)
+Name[fi]=Käyttäjäagenttikuvaus (Opera 7.53 nykyisellä)
+Name[fr]=Identité du navigateur (Opera 7.53 sous le système actuel)
+Name[fy]=GA-omskriuwing (Opera 7.53 op aktive)
+Name[ga]=UADescription (Opera 7.53 ar an gcóras reatha)
+Name[gl]=UADescription (Opera 7.53 no actual)
+Name[hr]=UADescription (Opera 7.53 na trenutnom)
+Name[hu]=Böngészőtípus (Opera 7.53)
+Name[id]=UADescription (Opera 7.53)
+Name[is]=UAD strengur (Opera 7.53 á núverandi)
+Name[it]=DescrizioneUA (Opera 7.53 su sistema attuale)
+Name[ka]=UADescription (Opera 7.53 მიმდინარე სისტემაში)
+Name[kk]=UADescription (Opera 7.53 осы орында)
+Name[km]=UADescription (Opera 7.53 បច្ចុប្បន្ន)
+Name[ko]=UADescription (현재 플랫폼의 Opera 8.5)
+Name[lt]=Naudotojo agento aprašymas (Opera 7.53 ir esama)
+Name[lv]=UAApraksts (Opera 7.53 uz tekošā)
+Name[mk]=UADescription (Opera 7.53 на тековно)
+Name[nb]=Brukeragent (Opera 7.53 herifra)
+Name[nds]=UA-Beschrieven (Opera 7.53 op dit Systeem)
+Name[ne]=UA वर्णन (हाल Opera 7.53)
+Name[nl]=GA-beschrijving (Opera 7.53 op huidige)
+Name[nn]=Brukaragent (Opera 7.53 herifrå)
+Name[pa]=UADescription (ਮੌਜੂਦਾ 'ਤੇ ਓਪੇਰਾ 7.53)
+Name[pl]=Opis przeglądarki użytkownika (Opera 7.53 na bieżącym systemie)
+Name[pt]=UADescription (Opera 7.53 no sistema actual)
+Name[pt_BR]=Descrição (Opera 7.53 no sistema atual)
+Name[ro]=Descriere UA (Opera 7.53 pentru sistemul de operare curent)
+Name[ru]=UADescription (Opera 7.53 на текущей системе)
+Name[rw]=UADescription (Opera 7.53 ku igezweho)
+Name[se]=UA-čilgehus (Opera 7.53 dán mašiinnas)
+Name[sl]=UAOpis (Opera 7.53 na trenutnem)
+Name[sr]=UADescription (Opera 7.53 на тренутном)
+Name[sr@Latn]=UADescription (Opera 7.53 na trenutnom)
+Name[sv]=AA-beskrivning (Opera 7.53 på aktuell)
+Name[ta]=UAவிவரம் (நடப்பில் 7.53 ஓபெரா)
+Name[tg]=UADescription (Системаи ҷорӣ Opera 7.53)
+Name[th]=UADescription (โอเปร่า 7.53 บนระบบปัจจุบัน)
+Name[tr]=UA Tanımı (bulunulanda Opera 7.53)
+Name[tt]=UADescription (Opera 7.53, şul uq astında)
+Name[uk]=UADescription (Opera 7.53 на поточній)
+Name[uz]=UADescription (joriy bilan Opera 7.53)
+Name[uz@cyrillic]=UADescription (жорий билан Opera 7.53)
+Name[vi]=Mô tả UA (đang dùng Opera 7.53)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Opera 7.53 sol ci do moumint)
+Name[zh_CN]=用户代理描述 (运行于本机的 Opera 7.53)
+Name[zh_TW]=使用者代理描述 (Opera 7.53 on current)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=OPR
+X-KDE-UA-FULL=Opera/7.53 (appPlatform; appSysName appMachineType; U) [appLanguage]
+X-KDE-UA-NAME=Opera
+X-KDE-UA-VERSION=7.53
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/safari12.desktop b/kcontrol/kio/uasproviders/safari12.desktop
new file mode 100644
index 000000000..b6fd23d15
--- /dev/null
+++ b/kcontrol/kio/uasproviders/safari12.desktop
@@ -0,0 +1,73 @@
+[Desktop Entry]
+Name=UADescription (Safari 1.2 on MacOS X)
+Name[af]=UA-beskrywing (Safari 1.2 op MacOS X)
+Name[be]=UADescription (Safari 1.2 на MacOS X)
+Name[br]=UADescription (Safari 1.2 war MacOS X)
+Name[bs]=UADescription (Safari 1.2 na MacOS X)
+Name[ca]=Descripció UA (Safari 1.2 a MacOS X)
+Name[cs]=Popis agenta (Safari 1.2 na MacOS X)
+Name[csb]=Òpis programë brëkòwnika (Safari 1.2 na MacOS X)
+Name[da]=UADescription (Safari 1.2 på MacOS X)
+Name[de]=Browserkennung (Safari 1.2 unter MacOS X)
+Name[el]=Περιγραφή UA (Safari 1.2 σε MacOS X)
+Name[eo]=UA-Priskribo (Safari 1.2 sub MacOS X)
+Name[es]=UADescription (Safari 1.2 en MacOS X)
+Name[et]=UADescription (Safari 1.2 MacOS X platvormil)
+Name[eu]=UADescription (Safari 1.2 MacOS Xn)
+Name[fa]=UADescription (Safari 1.2 در MacOS X)
+Name[fi]=Käyttäjäagenttikuvaus (Safari 1.2 MacOS X:llä)
+Name[fr]=Identité du navigateur (Safari 1.2 sous MacOS X)
+Name[fy]=GA-omskriuwing (Safari 1.2 op MacOS X)
+Name[ga]=UADescription (Safari 1.2 ar MacOS X)
+Name[gl]=UADescription (Safari 1.2 en MacOS X)
+Name[he]=UADescription (Safari על MacOS X)
+Name[hr]=UADescription (Safari 1.2 na MacOS X)
+Name[hu]=Böngészőtípus (Safari 1.2, MacOS X)
+Name[id]=UADescription (Safari 1.2 di MacOS X)
+Name[is]=UAD strengur (Safari 1.2 á MacOS X)
+Name[it]=DescrizioneUA (Safari 1.2 su MacOS X)
+Name[ka]=UADescription (Safari 1.2 на Mac MacOS X)
+Name[kk]=UADescription (Safari 1.2 / MacOS X)
+Name[km]=UADescription (Safari 1.2 នៅ​លើ MacOS X)
+Name[ko]=UADescription (Mac OS X의 Safari 1.2)
+Name[lt]=Naudotojo agento aprašymas (Safari 1.2 ir MacOS X)
+Name[lv]=UAApraksts (Safari 1.2 uz MacOS X)
+Name[mk]=UADescription (Safari 1.2 на MacOS X)
+Name[nb]=Brukeragent (Safari 1.2 på MacOS X)
+Name[nds]=UA-Beschrieven (Safari 1.2 op MacOS X)
+Name[ne]=UA वर्णन (MacOS X मा Safari 1.2)
+Name[nl]=GA-beschrijving (Safari 1.2 op MacOS X)
+Name[nn]=Brukaragent (Safari 1.2 på MacOS X)
+Name[pa]=UADescription (MacOS X 'ਤੇ Safari 1.2)
+Name[pl]=Opis przeglądarki użytkownika (Safari 1.2 na MacOS X)
+Name[pt]=UADescription (Safari 1.2 no MacOS X)
+Name[pt_BR]=Descrição (Safari 1.2 no MacOS X)
+Name[ro]=Descriere UA (Safari 1.2 pentru MacOS X)
+Name[ru]=UADescription (Safari 1.2 на Mac MacOS X)
+Name[rw]=UADescription (Safari 1.2 kuri MacOS X)
+Name[se]=UA-čilgehus (Safari 1.2 ja MacOS X)
+Name[sl]=UAOpis (Safari 1.2 na MacOS X)
+Name[sr]=UADescription (Safari 1.2 на MacOS-у X)
+Name[sr@Latn]=UADescription (Safari 1.2 na MacOS-u X)
+Name[sv]=AA-beskrivning (Safari 1.2 på MacOS X)
+Name[ta]=UAவிவரம் (Safari 1.2 on MacOS X)
+Name[tg]=UADescription (Safari 1.2 дар асоси Mac MacOS X)
+Name[th]=UADescription (ซาฟารี 1.2 บน MacOS X)
+Name[tr]=UA Tanımı (MacOS X'de Safari 1.2)
+Name[tt]=UADescription (Safari 1.2, MacOS X astında)
+Name[uk]=UADescription (Safari 1.2 на MacOS X)
+Name[uz]=UADescription (MacOS X bilan Safari 1.2)
+Name[uz@cyrillic]=UADescription (MacOS X билан Safari 1.2)
+Name[vi]=Mô tả UA (Safari 1.2 trên MacOS X)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Safari 1.2 so MacOS X)
+Name[zh_CN]=用户代理描述 (运行于 MacOS X 的 Safari 1.2)
+Name[zh_TW]=使用者代理描述 (Safari 1.2 on MacOS X)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=SAF
+X-KDE-UA-FULL=Mozilla/5.0 (Macintosh; U; PPC Mac OS X; appLanguage) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.11
+X-KDE-UA-NAME=Safari
+X-KDE-UA-VERSION=1.2.4
+X-KDE-UA-SYSNAME=Mac OS
+X-KDE-UA-SYSRELEASE=X
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/safari20.desktop b/kcontrol/kio/uasproviders/safari20.desktop
new file mode 100644
index 000000000..14f3a8883
--- /dev/null
+++ b/kcontrol/kio/uasproviders/safari20.desktop
@@ -0,0 +1,59 @@
+[Desktop Entry]
+Name=UADescription (Safari 2.0 on MacOS X)
+Name[bg]=UADescription (Safari 2.0 на MacOS X)
+Name[ca]=Descripció UA (Safari 2.0 a MacOS X)
+Name[cs]=Popis UA (Safari 2.0 na MacOS X)
+Name[csb]=Òpis programë brëkòwnika (Safari 2.0 na MacOS X)
+Name[da]=UADescription (Safari 2.0 på MacOS X)
+Name[de]=Browserkennung (Safari 2.0 unter MacOS X)
+Name[el]=Περιγραφή UA (Safari 2 σε MacOS X)
+Name[eo]=UA-Priskribo (Safari 2.0 sub MacOS X)
+Name[es]=UADescription (Safari 2.0 en MacOS X)
+Name[et]=UADescription (Safari 2.0 MacOS X platvormil)
+Name[fi]=Käyttäjäagenttikuvaus (Safari 2.0 MacOS X:llä)
+Name[fr]=Identité du navigateur (Safari 2.0 sous MacOS X)
+Name[fy]=GA-omskriuwing (Safari 2.0 op MacOS X)
+Name[gl]=UADescription (Safari 2.0 en MacOS X)
+Name[he]=UADescription (Safari 2.0 על MacOS X)
+Name[hr]=UADescription (Safari 2.0 na MacOS X)
+Name[hu]=Böngészőtípus (Safari 2.0, MacOS X)
+Name[id]=UADescription (Safari 2.0 di MacOS X)
+Name[is]=UAD strengur (Safari 2.0 á MacOS X)
+Name[it]=DescrizioneUA (Safari 2.0 su MacOS X)
+Name[kk]=UADescription (Safari 2.0 / MacOS X)
+Name[km]=UADescription (Safari 2.0 នៅ​លើ MacOS X)
+Name[ko]=UADescription (Mac OS X의 Safari 2.0)
+Name[lt]=Naudotojo agento aprašymas (Safari 2.0 ir MacOS X)
+Name[nb]=Brukeragent (Safari 2.0 på MacOS X)
+Name[nds]=UA-Beschrieven (Safari 2.0 op MacOS X)
+Name[ne]=यूए वर्णन (MacOS X मा Safari 1.2)
+Name[nl]=GA-beschrijving (Safari 2.0 op MacOS X)
+Name[nn]=Brukaragent (Safari 2.0 på MacOS X)
+Name[pa]=UADescription (MacOS X ਉੱਤੇ ਸਫ਼ਾਰੀ 2.0)
+Name[pl]=Opis przeglądarki użytkownika (Safari 2.0 na MacOS X)
+Name[pt]=UADescription (Safari 2.0 no MacOS X)
+Name[pt_BR]=UADescription (Safari 2.0 no MacOS X)
+Name[ro]=Descriere UA (Safari 2.0 pentru MacOS X)
+Name[ru]=UADescription (Safari 2.0 на Mac MacOS X)
+Name[sl]=UAOpis (Safari 2.0 na MacOS X)
+Name[sr]=UADescription (Safari 2.0 на MacOS-у X)
+Name[sr@Latn]=UADescription (Safari 2.0 na MacOS-u X)
+Name[sv]=AA-beskrivning (Safari 2.0 på MacOS X)
+Name[tg]=UADescription (Safari 2.0 дар асоси Mac MacOS X)
+Name[th]=UADescription (ซาฟารี 2.0 บน MacOS X)
+Name[tr]=UA Tanımı (MacOS X'de Safari 1.2)
+Name[uk]=UADescription (Safari 2.0 на MacOS X)
+Name[uz]=UADescription (MacOS X bilan Safari 2.0)
+Name[uz@cyrillic]=UADescription (MacOS X билан Safari 2.0)
+Name[vi]=Mô tả UA (Safari 2.0 trên MacOS X)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Safari 2.0 so MacOS X)
+Name[zh_TW]=使用者代理描述 (Safari 2.0 on MacOS X)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=SAF
+X-KDE-UA-FULL=Mozilla/5.0 (Macintosh; U; PPC Mac OS X; appLanguage) AppleWebKit/412 (KHTML, like Gecko) Safari/412
+X-KDE-UA-NAME=Safari
+X-KDE-UA-VERSION=2.0
+X-KDE-UA-SYSNAME=Mac OS
+X-KDE-UA-SYSRELEASE=X
+X-KDE-UA-DYNAMIC-ENTRY=1
diff --git a/kcontrol/kio/uasproviders/w3moncurrent.desktop b/kcontrol/kio/uasproviders/w3moncurrent.desktop
new file mode 100644
index 000000000..e2b97276c
--- /dev/null
+++ b/kcontrol/kio/uasproviders/w3moncurrent.desktop
@@ -0,0 +1,50 @@
+[Desktop Entry]
+Name=UADescription (w3m 0.1.9)
+Name[af]=UA-beskrywing (w3m 0.1.9)
+Name[ca]=Descripció de AU (w3m 0.1.9)
+Name[cs]=Popis agenta (w3m 0.1.9)
+Name[csb]=Òpis programë brëkòwnika (w3m 0.1.9)
+Name[cy]=UADisgrifiad (w3m 0.1.9)
+Name[da]=Brugeragentbeskrivelse (w3m 0.1.9)
+Name[de]=Browserkennung (w3m 0.1.9)
+Name[el]=Περιγραφή UA (w3m 0.1.9)
+Name[eo]=UA-Priskribo (w3m 0.1.9)
+Name[es]=Descripción de AU (w3m 0.1.9)
+Name[eu]=UA azalpena (w3m 0.1.9)
+Name[fi]=Käyttäjäagenttikuvaus (w3m 0.1.9)
+Name[fr]=Identité du navigateur (w3m 0.1.9)
+Name[fy]=GA-omskriuwing (w3m 0.1.9)
+Name[hi]=यूएडी-डिस्क्रिप्शन (डब्ल्यू3एम 0.1.9)
+Name[hu]=Böngészőtípus (w3m 0.1.9)
+Name[is]=UAD strengur (w3m 0.1.9)
+Name[it]=DescrizioneUA (w3m 0.1.9)
+Name[lt]=Naudotojo agento aprašymas (w3m 0.1.9)
+Name[lv]=UAApraksts (w3m 0.1.9)
+Name[mn]=UserAgent-Тодорхойлолт (w3m 0.1.9)
+Name[nb]=Brukeragent (w3m 0.1.9)
+Name[nds]=UA-Beschrieven (w3m 0.1.9)
+Name[ne]=UA वर्णन (w3m 0.1.9)
+Name[nl]=GA-beschrijving (w3m 0.1.9)
+Name[nn]=Brukaragent (w3m 0.1.9)
+Name[nso]=UAThlaloso (w3m 0.1.9)
+Name[pl]=Opis przeglądarki użytkownika (w3m 0.1.9)
+Name[pt_BR]=Descrição (w3m 0.1.9)
+Name[ro]=Descriere UA (w3m 0.1.9)
+Name[se]=UA-čilgehus (w3m 0.1.9)
+Name[sk]=Popis agenta (w3m 0.1.9)
+Name[sl]=UAOpis (w3m 0.1.9)
+Name[sv]=AA-beskrivning (w3m 0.1.9)
+Name[ta]=UAவிவரம் (w3m 0.1.9)
+Name[tg]=ТавзеҳиUA (w3m 0.1.9)
+Name[tr]=UA Tanımı (w3m 0.1.9)
+Name[ven]=Thalutshedzo ya UA (w3m 0.1.9)
+Name[vi]=Mô tả UA (w3m 0.1.9)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (w3m 0.1.9)
+Name[zh_CN]=用户代理描述 (w3m 0.1.9)
+Name[zh_TW]=使用者代理描述 (w3m 0.1.9)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=MISC
+X-KDE-UA-FULL=w3m/0.1.9
+X-KDE-UA-NAME=w3m
+X-KDE-UA-VERSION=0.1.9
diff --git a/kcontrol/kio/uasproviders/wgetoncurrent.desktop b/kcontrol/kio/uasproviders/wgetoncurrent.desktop
new file mode 100644
index 000000000..0f2da9fb9
--- /dev/null
+++ b/kcontrol/kio/uasproviders/wgetoncurrent.desktop
@@ -0,0 +1,50 @@
+[Desktop Entry]
+Name=UADescription (Wget 1.5.3)
+Name[af]=UA-beskrywing (Wget 1.5.3)
+Name[ca]=Descripció de AU (Wget 1.5.3)
+Name[cs]=Popis agenta (Wget 1.5.3)
+Name[csb]=Òpis programë brëkòwnika (Wget 1.5.3)
+Name[cy]=UADisgrifiad (Wget 1.5.3)
+Name[da]=Brugeragentbeskrivelse (Wget 1.5.3)
+Name[de]=Programmkennung (Wget 1.5.3)
+Name[el]=Περιγραφή UA (Wget 1.5.3)
+Name[eo]=UA-Priskribo (Wget 1.5.3)
+Name[es]=Descripción de AU (Wget 1.5.3)
+Name[eu]=UA azalpena (Wget 1.5.3)
+Name[fi]=Käyttäjäagenttikuvaus (Wget 1.5.3)
+Name[fr]=Identité du navigateur (Wget 1.5.3)
+Name[fy]=GA-omskriuwing (Wget 1.5.3)
+Name[hi]=यूएडी-डिस्क्रिप्शन (डब्ल्यूगेट 1.5.3)
+Name[hu]=Böngészőtípus (Wget 1.5.3)
+Name[is]=UAD strengur (Wget 1.5.3)
+Name[it]=DescrizioneUA (Wget 1.5.3)
+Name[lt]=Naudotojo agento aprašymas (Wget 1.5.3)
+Name[lv]=UAApraksts (Wget 1.5.3)
+Name[mn]=UserAgent-Тодорхойлолт (Wget 1.5.3)
+Name[nb]=Brukeragent (Wget 1.5.3)
+Name[nds]=UA-Beschrieven (Wget 1.5.3)
+Name[ne]=UA वर्णन (Wget 1.5.3)
+Name[nl]=GA-beschrijving (Wget 1.5.3)
+Name[nn]=Brukaragent (Wget 1.5.3)
+Name[nso]=UAThlaloso (Wget 1.5.3)
+Name[pl]=Opis przeglądarki użytkownika (Wget 1.5.3)
+Name[pt_BR]=Descrição (Wget 1.5.3)
+Name[ro]=Descriere UA (Wget 1.5.3)
+Name[se]=UA-čilgehus (Wget 1.5.3)
+Name[sk]=Popis agenta (Wget 1.5.3)
+Name[sl]=UAOpis (Wget 1.5.3)
+Name[sv]=AA-beskrivning (Wget 1.5.3)
+Name[ta]=UAவிவரம் (Wget 1.5.3)
+Name[tg]=ТавзеҳиUA (Wget 1.5.3)
+Name[tr]=UA Tanımı (Wget 1.5.3)
+Name[ven]=Thalutshedzo ya UA (Wget 1.5.3)
+Name[vi]=Mô tả UA (Wget 1.5.3)
+Name[wa]=Discrijhaedje di l' idintité do betchteu (Wget 1.5.3)
+Name[zh_CN]=用户代理描述 (Wget 1.5.3)
+Name[zh_TW]=使用者代理描述 (Wget 1.5.3)
+Type=Service
+ServiceTypes=UserAgentStrings
+X-KDE-UA-TAG=MISC
+X-KDE-UA-FULL=Wget/1.5.3
+X-KDE-UA-NAME=Wget
+X-KDE-UA-VERSION=1.5.3
diff --git a/kcontrol/kio/uninstall.desktop b/kcontrol/kio/uninstall.desktop
new file mode 100644
index 000000000..e1e3e1732
--- /dev/null
+++ b/kcontrol/kio/uninstall.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
diff --git a/kcontrol/kio/useragent.desktop b/kcontrol/kio/useragent.desktop
new file mode 100644
index 000000000..e6d719872
--- /dev/null
+++ b/kcontrol/kio/useragent.desktop
@@ -0,0 +1,232 @@
+[Desktop Entry]
+Type=Application
+Icon=agent
+Exec=kcmshell useragent
+DocPath=kcontrol/useragent/index.html
+
+
+X-KDE-Library=kio
+X-KDE-FactoryName=useragent
+X-KDE-ParentApp=kcontrol
+
+Name=Browser Identification
+Name[af]=Stelsel identifisering
+Name[ar]=تعريف المتصفح
+Name[az]=Səyyah Tanıdılması
+Name[be]=Ідэнтыфікацыя вандроўніка
+Name[bg]=Идентификация
+Name[bn]=ব্রাউজার সনাক্তকরণ
+Name[br]=Anvelezh ar furcher
+Name[bs]=Identifikacija browsera
+Name[ca]=Identificació del navegador
+Name[cs]=Identifikace prohlížeče
+Name[csb]=Identifikacëjô przezérnika
+Name[cy]=Enw'r Porwr
+Name[da]=Browser-identifikation
+Name[de]=Browserkennung
+Name[el]=Ταυτοποίηση περιηγητή
+Name[eo]=TTT-legila identeco
+Name[es]=Identificación del navegador
+Name[et]=Veebilehitseja identifikaator
+Name[eu]=Arakatzailearen identifikazioa
+Name[fa]=شناسایی مرورگر
+Name[fi]=Selaimen tunnistus
+Name[fr]=Identification du navigateur
+Name[fy]=Blêder identifikaasje
+Name[ga]=Aitheantas Brabhsálaithe
+Name[gl]=Identificación do Navegador
+Name[he]=זיהוי דפדפן
+Name[hi]= ब्राउज़र पहचान
+Name[hr]=Identifikacija preglednika
+Name[hu]=Böngészőazonosító
+Name[is]=Auðkenni vafra
+Name[it]=Identificazione browser
+Name[ja]=ブラウザ識別情報
+Name[ka]=ბრაუზერის ინდენტიფიკაცია
+Name[kk]=Браузердің өз туралы хабарлауы
+Name[km]=ការ​កំណត់​អត្តសញ្ញាណ​កម្មវិធី​រុករក
+Name[ko]=브라우저 증명
+Name[lo]=ການແຈ້ງເຕືອນ
+Name[lt]=Naršyklės identifikacija
+Name[lv]=Pārlūka identifikācija
+Name[mk]=Идентификација
+Name[mn]=Хөтөч-Тодотгол
+Name[ms]=Pengenalpastian Pelayar
+Name[mt]=Identifikazzjoni tal-browser
+Name[nb]=Nettleseridentifisering
+Name[nds]=Nettkieker-Identiteet
+Name[ne]=ब्राउजर पहिचान
+Name[nl]=Browseridentificatie
+Name[nn]=Nettlesaridentifikasjon
+Name[nso]=Boitsibiso bja Seinyakisi
+Name[pa]=ਝਲਕਾਰਾ ਪਛਾਣ
+Name[pl]=Identyfikacja przeglądarki
+Name[pt]=Identificação do Navegador
+Name[pt_BR]=Identificação do Navegador
+Name[ro]=Identificare navigator web
+Name[ru]=Идентификация браузера
+Name[rw]=Ikiranga Mucukumbuzi
+Name[se]=Fierpmádatloganidentifikašuvdna
+Name[sk]=Identifikácie prehliadača
+Name[sl]=Identifikacija brskalnika
+Name[sr]=Идентификација прегледача
+Name[sr@Latn]=Identifikacija pregledača
+Name[sv]=Webbläsaridentifikation
+Name[ta]=உலாவி அடையாளம்
+Name[tg]=Шиносоии тафсир
+Name[th]=การแสดงตัวของบราวเซอร์
+Name[tr]=Web tarayıcı kimliği
+Name[tt]=Browser Tanışması
+Name[uk]=Ідентифікація навігатора
+Name[ven]=U talusa ha burausu
+Name[vi]=Nhận diện trình duyệt
+Name[wa]=Inditifiaedje do betchteu
+Name[xh]=Uchazo Lomkhangeli zincwadi
+Name[zh_CN]=浏览器识别
+Name[zh_TW]=瀏覽器識別
+Name[zu]=Umazisi Womcingi
+
+Comment=Configure the way Konqueror reports itself
+Comment[af]=Stel die manier waarop Konqueror homself raporteer op
+Comment[ar]=إعداد طريقة التعريف لــ Konqueror عن نفسه
+Comment[az]=Konqeror-un özünü tanıtmasını quraşdır
+Comment[be]=Настаўленні спосабу прадстаўлення Konqueror у Сеціве
+Comment[bg]=Настройване идентификацията на браузъра
+Comment[bn]=কনকরার নিজেকে কিভাবে উপস্থাপন করবে তা কনফিগার করুন
+Comment[bs]=Podesite kako se Konqueror identificira serveru
+Comment[ca]=Configura com desitgeu que s'identifiqui el Konqueror
+Comment[cs]=Zde můžete jak se bude Konqueror hlásit webovým serverům
+Comment[csb]=Kònfigùracëjô ôrtu przedstôwianiô sã Konquerora
+Comment[cy]=Ffurfweddu'r ffordd y mae Konqueror yn adrodd ei hun
+Comment[da]=Indstil den måde Konquerors rapporterer sigselv
+Comment[de]=Kennungen für Konqueror als Webbrowser festlegen
+Comment[el]=Ρυθμίστε τον τρόπο με τον οποίο αναφέρεται το Konqueror
+Comment[eo]=Agordo de Konkeranto-"user agent"
+Comment[es]=Configuración del modo de autoidentificación de Konqueror
+Comment[et]=Viisi, kuidas Konqueror endast teada annab, seadistamine
+Comment[eu]=Konfiguratu nola azaltzen duen Konquerorrek bere burua
+Comment[fa]=پیکربندی روشی که Konqueror گزارش خود را می‌دهد.
+Comment[fi]=Vaihda Konquerorin esittäytymistapaa
+Comment[fr]=Configuration de la manière dont Konqueror se signale
+Comment[fy]=Hjir kinne jo fêststelle hoe Konqueror har by webtsjinners identifisearret
+Comment[gl]=Configurar o xeito en que Konqueror informa sobre si mesmo
+Comment[he]=שינוי הדרך שבה Konqueror מזדהה
+Comment[hi]=कॉन्करर अपने आप को जिस रूप में रिपोर्ट करे वैसा कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje načina na koji se Konqueror prijavljuje
+Comment[hu]=A Konqueror webböngésző kliensazonosítójának beállítása
+Comment[is]=Stilla hvernig Konqueror kynnir sig
+Comment[it]=Configura il modo in cui Konqueror si identifica presso i server
+Comment[ja]=Konqueror のブラウザ識別情報を設定
+Comment[ka]=Konqueror-ის იდენტიფიკაციის კონფიგურირება
+Comment[kk]=Konqueror өз туралы хабарлауын баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​របៀប​ដែល Konqueror រាយការណ៍​ខ្លួន​វា
+Comment[ko]=Konqueror가 자신을 보고하는 방법 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງລັກສະນະແລະຄວາມຮູ້ສຶກໃນການໃຊ້ງານ Konqueror ໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite nustatyti, kaip Konqueror save identifikuoja
+Comment[lv]=Norādiet kā Iekarotājs identificēs sevi
+Comment[mk]=Конфигурирајте го начинот на кој Konqueror се пријавува себе си
+Comment[mn]=Конкюрорыг вэб-Хөтөчөөр авах эсэхийг тогтоох
+Comment[ms]=Konfigur cara Konqueror melaporkan dirinya
+Comment[mt]=Ikkonfigura kif jirrapporta ruħu Konqueror
+Comment[nb]=Tilpass Konquerors egenrapportering
+Comment[nds]=Instellen, wat Konqueror seggt, woneem he is
+Comment[ne]=कन्क्वेररले प्रतिवेदन गर्ने तरिकामा कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u bepalen hoe Konqueror zich bij webservers identificeert
+Comment[nn]=Vel korleis Konqueror skal presentera seg sjølv
+Comment[nso]=Beakanya ka mokgwa wo Konqueror e ipegago ka gona
+Comment[pa]=ਕੋਨਕਿਉਰੋਰ ਦੇ ਖੁਦ ਨੂੰ ਜਾਣਕਾਰੀ ਦੇਣ ਦੇ ਢੰਗ ਦੀ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja sposobu przedstawiania się Konquerora
+Comment[pt]=Configuração da forma como o Konqueror se apresenta
+Comment[pt_BR]=Configura o modo como o Konqueror se mostra externamente
+Comment[ro]=Configurează modul în care Konqueror se identifică la serverele de web
+Comment[ru]=Настройка идентификации Konqueror
+Comment[rw]=Kuboneza inzira Konqueror yitangaza
+Comment[se]=Vállje mo Konqueror galgá iežas ovdanbuktit
+Comment[sk]=Nastavenie identifikácie Konquerora
+Comment[sl]=Nastavitev načina predstavljanja Konquerorja
+Comment[sr]=Подешавање како Konqueror представља себе
+Comment[sr@Latn]=Podešavanje kako Konqueror predstavlja sebe
+Comment[sv]=Anpassa hur Konqueror identifierar sig
+Comment[ta]=கான்கொரர் அறிக்கைகளை வழிகளை வடிவமை
+Comment[tg]=Танзими идентификатсияи Konqueror
+Comment[th]=ปรับแต่งการแสดงตัวของคอนเควอร์เรอร์
+Comment[tr]=Konqueror'ın raporlama sistemini yapılandır
+Comment[tt]=Konqueror üz-üzen beldergän ısulın saylaw
+Comment[uk]=Тут можна налаштувати ідентифікацію Konqueror
+Comment[ven]=Dzudzanyani ndila ine Kongueror yadi vhiga ngayo
+Comment[vi]=Cấu hình cách Konqueror tự báo cáo
+Comment[wa]=Aponteye li manire ki Konqueror si prezinte
+Comment[xh]=Qwalasela indlela i Konqueror ezichaza ngayo
+Comment[zh_CN]=配置 Konqueror 的报告自己的方式
+Comment[zh_TW]=設定 Konqueror 回報自身狀況的方式
+Comment[zu]=Hlanganisela indlela i-Konqueror ezibika ngayo
+
+Keywords=User Agent,Browser,Internet,WWW,Network,agent,bindings,server,login
+Keywords[af]=Gebruiker Agent,Browser,Internet,WWW,Network,agent,bindings,server,login
+Keywords[ar]=عميل المستخدم,المتصفح,الشبكة العالمية,الشبكة,عميل,bindings,User Agent,Browser,Internet,WWW,Network,agent,bindings, server,login,خادم,دخول
+Keywords[az]=İstifadəçi Vasitəsi,Səyyah,İnternet,WWW,Şəbəkə,giriş,verici,vasitə
+Keywords[be]=Кліент,Вандроўнік,Сетка,Агент,сервер,уваход,сесія,User Agent,Browser,Internet,WWW,Network,agent,bindings,server,login
+Keywords[bg]=идентификация, клиент, потребителски, браузър, Интернет, агент, сайт, представяне, User Agent, Browser, Internet, WWW, Network, agent, bindings, server, login
+Keywords[ca]=Agent d'usuari,Fullejador,Internet,WWW,Xarxa,agent,lligams,servidor,accés
+Keywords[cs]=Uživatelský agent,Prohlížeč,Internet,WWW,Síť,Agent,Vazby,Server,Login,Přihlášení
+Keywords[csb]=User Agent,programa brëkòwnika,przezérnik,Internet,WWW,séc,agent,sparłączenia,serwera,login
+Keywords[cy]=Asiant y Defnyddiwr,Porwr,Rhyngrwyd,WWW,Rhwydwaith,asiant,rhwymiadau,gweinydd,mewngofnodi
+Keywords[da]=Brugeragent,Internet,WWW,Netværk,agent,bindinger,server,login
+Keywords[de]=Browserkennung,Internetprogramm,Browser,Internet,WWW,Netzwerk,Server,Zuordnungen,Anmeldung
+Keywords[el]=Πράκτορας χρήστη,Περιηγητής,Διαδίκτυο,WWW,Δίκτυο,πράκτορας,bindings,εξυπηρετητής,σύνδεση
+Keywords[eo]=uzanto,agento,TTT,Interreto,WWW,reto,asocioj,servilo,saluto
+Keywords[es]=Agente de Usuario,Navegador,Internet,WWW,Red,agente,asociaciones,servidor,entrada,acceso
+Keywords[et]=kasutajaagent,identifikaator,veebilehitseja,Internet,WWW,võrk,agent,seosed,server,sisselogimine
+Keywords[eu]=Erabiltzaile agentea,Arakatzailea,Internet,WWW,sarea,agentea, elkarketak,zerbitzaria,saio-hasiera
+Keywords[fa]=عامل کاربر، مرورگر، اینترنت، WWW، شبکه، عامل، مقیدسازیها، کارساز، ورود
+Keywords[fi]=Käyttäjäagentti,Selain,Internet,WWW,Verkko,agentti,sidokset,palvelin,kirjautuminen
+Keywords[fr]=identité du navigateur,navigateur,WWW,réseau,associations,serveur,connexion,login,internet
+Keywords[fy]=user agent,browser,internet,www,netwurk,brûkersagint,agint,biningen,tsjinner,oanmelding
+Keywords[ga]=UserAgent,gníomhaire úsáideora,Brabhsálaí,Idirlíon,WWW,Líonra,Gréasán,gníomhaire,ceangail,freastalaí,logáil isteach
+Keywords[gl]=Axente de Usuario,User Agent,Navegador,Internet,WWW,Rede,axente,atallos,servidor,login
+Keywords[he]=רשת,זיהוי,קישורים,שרת,כניסה למערכת,דפדפן,זיהוי דפדפן,WWW,אינטרנט, User Agent,Browser,Internet,WWW,Network,agent,bindings,server,login
+Keywords[hi]=उपयोक्ता एजेंट, ब्राउज़र,इंटरनेट,डब्ल्यूडब्ल्यूडब्ल्यू,नेटवर्क,एजेंट,बाइंडिंग्स,सर्वर,लॉगइन
+Keywords[hr]=User Agent,Browser,Internet,WWW,Network,agent,bindings,server,login,Korisnički agent,Preglednik,Mreža,povezivanja,poslužitelj,prijava
+Keywords[hu]=böngészőtípus,böngésző,internet,WWW,hálózat,azonosító,hozzárendelések,kiszolgáló,bejelentkezés
+Keywords[id]=Agen User,Browser,Internet,WWW,Jaringan,agent,bindings,server,login
+Keywords[is]=Vafraauðkenning,Auðkennig,Auðkenning Vafra,Vafri,Net,Netið,bindingar,þjónn,innstimplun,innskráning
+Keywords[it]=User agent,Navigazione,Browser,Internet,WWW,Rete,agent,collegamenti,server,login,accesso
+Keywords[ja]=ユーザエージェント,ブラウザ,インターネット, WWW,ネットワーク,エージェント,バインディング,サーバ,ログイン
+Keywords[km]=ភ្នាក់ងារ​អ្នក​ប្រើ,កម្មវិធី​រុករក,អ៊ិនធឺណិត,វើលវ៉ាយវិប,បណ្ដាញ,ភ្នាក់ងារ,ការ​ចង,ម៉ាស៊ីន​បម្រើ,ចូល
+Keywords[lt]=Naudotojo agentas,User-Agent,Naršyklė,Internet,WWW,Tinklas,agentas,sietis,serveris, registracija
+Keywords[lv]=Lietotāja Aģents,Pārlūks,Internets,WWW,Tīkls,aģents,sasaistes,serveris,pieteikšanās
+Keywords[mk]=User Agent,Browser,Internet,WWW,Network,agent,bindings,server,login,Кориснички агент,Прелистувач,Интернет,Мрежа,агент,поврзувања,сервер,најава
+Keywords[mn]=User Agent,Интернэт програм,Хөтөч,Интернэт,WWW,Сүлжээ,сервер,Холбоос,Нэвтрэлт
+Keywords[nb]=brukaragent,nettleser,internett,WWW,verdensveven,nettverk,agent,tjener,innlogging
+Keywords[nds]=User Agent,Browser,Internet,WWW,Nettwark,agent,bindings,Server,Nettkieker,anmellen
+Keywords[ne]=प्रयोगकर्ता एजेन्ट, ब्राउजर, इन्टरनेट, WWW, सञ्जाल, एजेन्ट, बाइन्डिङहरू, सर्भर, लगइन
+Keywords[nl]=user agent,browser,internet,www,netwerk,gebruikersagent,agent,bindingen,server,login
+Keywords[nn]=brukaragent,nettlesar,internett,WWW,verdsveven,nettverk,agent,tenar,innlogging
+Keywords[nso]=Mothusi wa Modirisi,Seinyakisi,Internet,WWW,Kgokagano,mothusi, ditlemo,moabi,tseno
+Keywords[pa]=WWW,Network,agent,bindings,ਏਜੰਟ,ਸਰਵਰ,ਲਾਗਿੰਨ,ਇੰਟਰਨੈਟ,ਝਲਕਾਰਾ,ਉਪਭੋਗੀ ਏਜੰਟ,ਨੈਟਵਰਕ
+Keywords[pl]=User Agent,program użytkownika,przeglądarka,Internet,WWW,sieć,agent,powiązania,serwer,login
+Keywords[pt]=agente do utilizador,navegador,internet,WWW,rede
+Keywords[pt_BR]=Agente de usuário,navegador,Internet,WWW,Rede,agente,ligações,servidor,login
+Keywords[ro]=agent utilizator,User Agent,navigator,browser,Internet,WWW,rețea,agent,asocieri,server,logare
+Keywords[rw]=Umukozi Ukoresha,Mucukumbuzi,Interineti,WWW,Urusoberemiyoboro,umukozi, Ibyafataranyijwe,seriveri,ifashayinjira
+Keywords[se]=geavaheaddjiageanta,fierpmádatlogan,fierpmádat,WWW,interneahtta,fierbmi, ageanta,bálvá,sisačáliheapmi
+Keywords[sk]=User Agent,Prehliadač,Internet,WWW,Sieť,agent,server,login,prihlásenie
+Keywords[sl]=uporabniški agent,brskalnik,internet,WWW,splet,omrežje,strežnik,prijava
+Keywords[sr]=User Агент,Browser,Интернет,WWW,Network,агент,bindings,сервер,login, Мрежа,прегледач,агент,кориснички агент
+Keywords[sr@Latn]=User Agent,Browser,Internet,WWW,Network,agent,bindings,server,login, Mreža,pregledač,agent,korisnički agent
+Keywords[sv]=Användaragent,Webbläsare,Internet,WWW,Nätverk,agent,bindningar, server,inloggning
+Keywords[ta]=பயன்படுத்துபவர் முகவர்,உலாவி,வலைபின்னல்,WWW,வலைதளம்,முகவர்,bindings,சேவகன்,உள்நுழை
+Keywords[th]=เครื่องมือของผู้ใช้,บราวเซอร์,อินเทอร์เน็ต,WWW,เครือข่าย,เครื่องมือ,การจับคู่,เซิร์ฟเวอร์,ล็อกอิน
+Keywords[tr]=Kullanıcı Aracısı,Tarayıcı,İnternet,WWW,Ağ,giriş,sunucu,aracı
+Keywords[uk]=агент навігатора,навігатор,Інтернет,WWW,мережа,агент,прив'язки,сервер,реєстрація
+Keywords[uz]=User Agent,WWW,agent,bindings,Brauzer,Internet,Tarmoq,server
+Keywords[uz@cyrillic]=User Agent,WWW,agent,bindings,Браузер,Интернет,Тармоқ,сервер
+Keywords[ven]=Mushumisi,Buronza.Inithanete,WWW,Vhgukwamani,Mushumeli,dzithanganyo,Siva,U loga
+Keywords[vi]=Trình khách,Trình duyệt,Internet,WWW,Mạng,khách,tổ hợp,máy chủ,đăng nhập
+Keywords[wa]=User Agent,idintité do betchteu,betchteu,Internet,daedntoele,WWW,rantoele,idintité,agent,sierveu,login,elodjaedje
+Keywords[xh]=Ummeli womsebenzisi,Umkhangeli zincwadi,Internet,WWW,Umsebenzi womnatha,ummeli,izibophelelo,umncedisi,igama elithile
+Keywords[zh_CN]=User Agent,Browser,Internet,WWW,Network,agent,bindings,server,login,用户代理,Agent,Browser,Internet,WWW,Network,agent,bindings,server,login,用户代理,浏览,网络,代理,关联,服务器,登录
+Keywords[zh_TW]=User Agent,Browser,Internet,WWW,Network,agent,bindings,server,login,使用者代理程式,瀏覽器,網際網路,網路,代理程式,伺服器,登入
+Keywords[zu]=Ummeli Womsebenzisi,Umcingi,Internet,WWW,Uxhumano olusakazekile, ummeli,izibongo,umlekeleli,ngena ngaphakathi
+
+Categories=Qt;KDE;X-KDE-settings-webbrowsing;
diff --git a/kcontrol/kio/useragentdlg.cpp b/kcontrol/kio/useragentdlg.cpp
new file mode 100644
index 000000000..b8256b946
--- /dev/null
+++ b/kcontrol/kio/useragentdlg.cpp
@@ -0,0 +1,403 @@
+/*
+ Original Authors:
+ Copyright (c) Kalle Dalheimer 1997
+ Copyright (c) David Faure <faure@kde.org> 1998
+ Copyright (c) Dirk Mueller <mueller@kde.org> 2000
+
+ Completely re-written by:
+ Copyright (C) 2000- Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License (GPL)
+ version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qvbox.h>
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qlineedit.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qpushbutton.h>
+#include <qvbuttongroup.h>
+
+#include <kdebug.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <klistview.h>
+#include <kmessagebox.h>
+#include <ksimpleconfig.h>
+#include <kio/http_slave_defaults.h>
+
+#include "ksaveioconfig.h"
+#include "fakeuaprovider.h"
+#include "uagentproviderdlg.h"
+
+#include "useragentdlg.h"
+#include "useragentdlg_ui.h"
+
+UserAgentDlg::UserAgentDlg( QWidget * parent )
+ :KCModule( parent, "kcmkio" )
+{
+ QVBoxLayout *mainLayout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ dlg = new UserAgentDlgUI (this);
+ mainLayout->addWidget(dlg);
+
+ dlg->lvDomainPolicyList->setSorting(0);
+
+ connect( dlg->cbSendUAString, SIGNAL(clicked()), SLOT(configChanged()) );
+
+ connect( dlg->gbDefaultId, SIGNAL(clicked(int)),
+ SLOT(changeDefaultUAModifiers(int)));
+
+ connect( dlg->lvDomainPolicyList, SIGNAL(selectionChanged()),
+ SLOT(selectionChanged()) );
+ connect( dlg->lvDomainPolicyList, SIGNAL(doubleClicked (QListViewItem *)),
+ SLOT(changePressed()) );
+ connect( dlg->lvDomainPolicyList, SIGNAL( returnPressed ( QListViewItem * ) ),
+ SLOT( changePressed() ));
+
+ connect( dlg->pbNew, SIGNAL(clicked()), SLOT( addPressed() ) );
+ connect( dlg->pbChange, SIGNAL( clicked() ), SLOT( changePressed() ) );
+ connect( dlg->pbDelete, SIGNAL( clicked() ), SLOT( deletePressed() ) );
+ connect( dlg->pbDeleteAll, SIGNAL( clicked() ), SLOT( deleteAllPressed() ) );
+
+ load();
+}
+
+UserAgentDlg::~UserAgentDlg()
+{
+ delete m_provider;
+ delete m_config;
+}
+
+void UserAgentDlg::load()
+{
+ d_itemsSelected = 0;
+ dlg->lvDomainPolicyList->clear();
+
+ m_config = new KConfig("kio_httprc", false, false);
+ m_provider = new FakeUASProvider();
+
+ QStringList list = m_config->groupList();
+ for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
+ {
+ if ( (*it) == "<default>")
+ continue;
+ QString domain = *it;
+ m_config->setGroup(*it);
+ QString agentStr = m_config->readEntry("UserAgent");
+ if (!agentStr.isEmpty())
+ {
+ QString realName = m_provider->aliasStr(agentStr);
+ (void) new QListViewItem( dlg->lvDomainPolicyList, domain.lower(), realName, agentStr );
+ }
+ }
+
+ // Update buttons and checkboxes...
+ m_config->setGroup(QString::null);
+ bool b = m_config->readBoolEntry("SendUserAgent", true);
+ dlg->cbSendUAString->setChecked( b );
+ m_ua_keys = m_config->readEntry("UserAgentKeys", DEFAULT_USER_AGENT_KEYS).lower();
+ dlg->leDefaultId->setSqueezedText( KProtocolManager::defaultUserAgent( m_ua_keys ) );
+ dlg->cbOS->setChecked( m_ua_keys.contains('o') );
+ dlg->cbOSVersion->setChecked( m_ua_keys.contains('v') );
+ dlg->cbOSVersion->setEnabled( m_ua_keys.contains('o') );
+ dlg->cbPlatform->setChecked( m_ua_keys.contains('p') );
+ dlg->cbProcessorType->setChecked( m_ua_keys.contains('m') );
+ dlg->cbLanguage->setChecked( m_ua_keys.contains('l') );
+ updateButtons();
+ emit changed( false );
+}
+
+void UserAgentDlg::updateButtons()
+{
+ bool hasItems = dlg->lvDomainPolicyList->childCount() > 0;
+
+ dlg->pbChange->setEnabled ((hasItems && d_itemsSelected == 1));
+ dlg->pbDelete->setEnabled ((hasItems && d_itemsSelected > 0));
+ dlg->pbDeleteAll->setEnabled ( hasItems );
+}
+
+void UserAgentDlg::defaults()
+{
+ dlg->lvDomainPolicyList->clear();
+ m_ua_keys = DEFAULT_USER_AGENT_KEYS;
+ dlg->leDefaultId->setSqueezedText( KProtocolManager::defaultUserAgent(m_ua_keys) );
+ dlg->cbOS->setChecked( m_ua_keys.contains('o') );
+ dlg->cbOSVersion->setChecked( m_ua_keys.contains('v') );
+ dlg->cbOSVersion->setEnabled( m_ua_keys.contains('o') );
+ dlg->cbPlatform->setChecked( m_ua_keys.contains('p') );
+ dlg->cbProcessorType->setChecked( m_ua_keys.contains('m') );
+ dlg->cbLanguage->setChecked( m_ua_keys.contains('l') );
+ dlg->cbSendUAString->setChecked( true );
+ updateButtons();
+ configChanged();
+}
+
+void UserAgentDlg::save()
+{
+ QStringList deleteList;
+
+ // This is tricky because we have to take care to delete entries
+ // as well.
+ QStringList list = m_config->groupList();
+ for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
+ {
+ if ( (*it) == "<default>")
+ continue;
+ QString domain = *it;
+ m_config->setGroup(*it);
+ if (m_config->hasKey("UserAgent"))
+ deleteList.append(*it);
+ }
+
+ QListViewItem* it = dlg->lvDomainPolicyList->firstChild();
+ while(it)
+ {
+ QString domain = it->text(0);
+ if (domain[0] == '.')
+ domain = domain.mid(1);
+ QString userAgent = it->text(2);
+ m_config->setGroup(domain);
+ m_config->writeEntry("UserAgent", userAgent);
+ deleteList.remove(domain);
+
+ it = it->nextSibling();
+ }
+
+ m_config->setGroup(QString::null);
+ m_config->writeEntry("SendUserAgent", dlg->cbSendUAString->isChecked());
+ m_config->writeEntry("UserAgentKeys", m_ua_keys );
+ m_config->sync();
+
+ // Delete all entries from deleteList.
+ if (!deleteList.isEmpty())
+ {
+ // Remove entries from local file.
+ KSimpleConfig cfg("kio_httprc");
+ for ( QStringList::Iterator it = deleteList.begin();
+ it != deleteList.end(); ++it )
+ {
+ cfg.setGroup(*it);
+ cfg.deleteEntry("UserAgent", false);
+ cfg.deleteGroup(*it, false); // Delete if empty.
+ }
+ cfg.sync();
+
+ m_config->reparseConfiguration();
+ // Check everything is gone, reset to blank otherwise.
+ for ( QStringList::Iterator it = deleteList.begin();
+ it != deleteList.end(); ++it )
+ {
+ m_config->setGroup(*it);
+ if (m_config->hasKey("UserAgent"))
+ m_config->writeEntry("UserAgent", QString::null);
+ }
+ m_config->sync();
+ }
+
+ KSaveIOConfig::updateRunningIOSlaves (this);
+
+ emit changed( false );
+}
+
+bool UserAgentDlg::handleDuplicate( const QString& site,
+ const QString& identity,
+ const QString& alias )
+{
+ QListViewItem* item = dlg->lvDomainPolicyList->firstChild();
+ while ( item != 0 )
+ {
+ if ( item->text(0) == site )
+ {
+ QString msg = i18n("<qt><center>Found an existing identification for"
+ "<br/><b>%1</b><br/>"
+ "Do you want to replace it?</center>"
+ "</qt>").arg(site);
+ int res = KMessageBox::warningContinueCancel(this, msg,
+ i18n("Duplicate Identification"),
+ i18n("Replace"));
+ if ( res == KMessageBox::Continue )
+ {
+ item->setText(0, site);
+ item->setText(1, identity);
+ item->setText(2, alias);
+ configChanged();
+ }
+ return true;
+ }
+ item = item->nextSibling();
+ }
+ return false;
+}
+
+void UserAgentDlg::addPressed()
+{
+ UAProviderDlg pdlg ( i18n("Add Identification"), this, m_provider );
+
+ if ( pdlg.exec() == QDialog::Accepted )
+ {
+ if ( !handleDuplicate( pdlg.siteName(), pdlg.identity(), pdlg.alias() ) )
+ {
+ QListViewItem* index = new QListViewItem( dlg->lvDomainPolicyList,
+ pdlg.siteName(),
+ pdlg.identity(),
+ pdlg.alias() );
+ dlg->lvDomainPolicyList->sort();
+ dlg->lvDomainPolicyList->setCurrentItem( index );
+ configChanged();
+ }
+ }
+}
+
+void UserAgentDlg::changePressed()
+{
+ UAProviderDlg pdlg ( i18n("Modify Identification"), this, m_provider );
+
+ QListViewItem *index = dlg->lvDomainPolicyList->currentItem();
+
+ if(!index)
+ return;
+
+ QString old_site = index->text(0);
+ pdlg.setSiteName( old_site );
+ pdlg.setIdentity( index->text(1) );
+
+ if ( pdlg.exec() == QDialog::Accepted )
+ {
+ QString new_site = pdlg.siteName();
+ if ( new_site == old_site ||
+ !handleDuplicate( new_site, pdlg.identity(), pdlg.alias() ) )
+ {
+ index->setText( 0, new_site );
+ index->setText( 1, pdlg.identity() );
+ index->setText( 2, pdlg.alias() );
+ configChanged();
+ }
+ }
+}
+
+void UserAgentDlg::deletePressed()
+{
+ QListViewItem* item;
+ QListViewItem* nextItem = 0;
+
+ item = dlg->lvDomainPolicyList->firstChild ();
+
+ while (item != 0L)
+ {
+ if (dlg->lvDomainPolicyList->isSelected (item))
+ {
+ nextItem = item->itemBelow();
+ if ( !nextItem )
+ nextItem = item->itemAbove();
+
+ delete item;
+ item = nextItem;
+ }
+ else
+ {
+ item = item->itemBelow();
+ }
+ }
+
+ if (nextItem)
+ dlg->lvDomainPolicyList->setSelected (nextItem, true);
+
+ updateButtons();
+ configChanged();
+}
+
+void UserAgentDlg::deleteAllPressed()
+{
+ dlg->lvDomainPolicyList->clear();
+ updateButtons();
+ configChanged();
+}
+
+void UserAgentDlg::configChanged()
+{
+ emit changed ( true );
+}
+
+void UserAgentDlg::changeDefaultUAModifiers( int )
+{
+ m_ua_keys = ":"; // Make sure it's not empty
+
+ if ( dlg->cbOS->isChecked() )
+ m_ua_keys += 'o';
+
+ if ( dlg->cbOSVersion->isChecked() )
+ m_ua_keys += 'v';
+
+ if ( dlg->cbPlatform->isChecked() )
+ m_ua_keys += 'p';
+
+ if ( dlg->cbProcessorType->isChecked() )
+ m_ua_keys += 'm';
+
+ if ( dlg->cbLanguage->isChecked() )
+ m_ua_keys += 'l';
+
+ dlg->cbOSVersion->setEnabled(m_ua_keys.contains('o'));
+
+ QString modVal = KProtocolManager::defaultUserAgent( m_ua_keys );
+ if ( dlg->leDefaultId->text() != modVal )
+ {
+ dlg->leDefaultId->setSqueezedText(modVal);
+ configChanged();
+ }
+}
+
+void UserAgentDlg::selectionChanged ()
+{
+ QListViewItem* item;
+
+ d_itemsSelected = 0;
+ item = dlg->lvDomainPolicyList->firstChild ();
+
+ while (item != 0L)
+ {
+ if (dlg->lvDomainPolicyList->isSelected (item))
+ d_itemsSelected++;
+ item = item->nextSibling ();
+ }
+
+ updateButtons ();
+}
+
+QString UserAgentDlg::quickHelp() const
+{
+ return i18n( "<h1>Browser Identification</h1> "
+ "The browser-identification module allows you to have full "
+ "control over how Konqueror will identify itself to web "
+ "sites you browse."
+ "<P>This ability to fake identification is necessary because "
+ "some web sites do not display properly when they detect that "
+ "they are not talking to current versions of either Netscape "
+ "Navigator or Internet Explorer, even if the browser actually "
+ "supports all the necessary features to render those pages "
+ "properly. "
+ "For such sites, you can use this feature to try to browse "
+ "them. Please understand that this might not always work, since "
+ "such sites might be using non-standard web protocols and or "
+ "specifications."
+ "<P><u>NOTE:</u> To obtain specific help on a particular section "
+ "of the dialog box, simply click on the quick help button on "
+ "the window title bar, then click on the section "
+ "for which you are seeking help." );
+}
+
+#include "useragentdlg.moc"
diff --git a/kcontrol/kio/useragentdlg.h b/kcontrol/kio/useragentdlg.h
new file mode 100644
index 000000000..56534e142
--- /dev/null
+++ b/kcontrol/kio/useragentdlg.h
@@ -0,0 +1,83 @@
+/*
+ Original Authors:
+ Copyright (c) Kalle Dalheimer 1997
+ Copyright (c) David Faure <faure@kde.org> 1998
+ Copyright (c) Dirk Mueller <mueller@kde.org> 2000
+
+ Completely re-written by:
+ Copyright (C) 2000- Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License (GPL)
+ version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _USERAGENTDLG_H
+#define _USERAGENTDLG_H
+
+#include <kcmodule.h>
+
+class KConfig;
+class FakeUASProvider;
+class UserAgentDlgUI;
+
+class UserAgentDlg : public KCModule
+{
+ Q_OBJECT
+
+public:
+ UserAgentDlg ( QWidget * parent = 0) ;
+ ~UserAgentDlg();
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+ QString quickHelp() const;
+
+private slots:
+ void updateButtons();
+ void selectionChanged();
+
+ void addPressed();
+ void changePressed();
+ void deletePressed();
+ void deleteAllPressed();
+
+ void configChanged();
+ void changeDefaultUAModifiers( int );
+
+private:
+ bool handleDuplicate( const QString&, const QString&, const QString& );
+
+ enum {
+ SHOW_OS = 0,
+ SHOW_OS_VERSION,
+ SHOW_PLATFORM,
+ SHOW_MACHINE,
+ SHOW_LANGUAGE
+ };
+
+ // Useragent modifiers...
+ QString m_ua_keys;
+
+ // Fake user-agent modifiers...
+ FakeUASProvider* m_provider;
+
+ //
+ int d_itemsSelected;
+
+ KConfig *m_config;
+ UserAgentDlgUI* dlg;
+};
+
+#endif
diff --git a/kcontrol/kio/useragentdlg_ui.ui b/kcontrol/kio/useragentdlg_ui.ui
new file mode 100644
index 000000000..0db2a2440
--- /dev/null
+++ b/kcontrol/kio/useragentdlg_ui.ui
@@ -0,0 +1,355 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>UserAgentDlgUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>UserAgentDlgUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>395</width>
+ <height>470</height>
+ </rect>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Here you can modify the default browser-identification text or set a site &lt;code&gt;(eg. www.kde.org)&lt;/code&gt; or a domain &lt;code&gt;(eg. kde.org)&lt;/code&gt; specific identification text.&lt;p&gt;
+To add a new site specific identification text, click the &lt;code&gt;New&lt;/code&gt; button and supply the necessary information. To change an existing site specific entry, click on the &lt;code&gt;Change&lt;/code&gt; button. The &lt;code&gt;Delete&lt;/code&gt; button will remove the selected site specific identification text, causing the setting to be used for that site or domain.
+&lt;/qt&gt;</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbSendUAString</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Send identification</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;
+Send the browser identification to web sites.&lt;p&gt;
+&lt;u&gt;NOTE:&lt;/u&gt; Many sites rely on this information to display pages properly, hence, it is highly recommended that you do not totally disable this feature but rather customize it.&lt;p&gt;
+By default, only minimal identification information is sent to remote sites. The identification text that will be sent is shown below.
+&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>gbDefaultId</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Default Identification</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The browser identification text sent to the sites you visit. Use the provided options to customize it.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>leDefaultId</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The browser identification text sent to the sites you visit. You can customize it using the options provided below.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbOS</cstring>
+ </property>
+ <property name="text">
+ <string>Add operating s&amp;ystem name</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Includes your operating system's name in the browser identification text.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbOSVersion</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Add operating system &amp;version</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Includes your operating system's version number in the browser identification text.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbPlatform</cstring>
+ </property>
+ <property name="text">
+ <string>Add &amp;platform name</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Includes your platform type in the browser identification text</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbProcessorType</cstring>
+ </property>
+ <property name="text">
+ <string>Add &amp;machine (processor) type</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Includes your machine's CPU type in the browser identification text.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cbLanguage</cstring>
+ </property>
+ <property name="text">
+ <string>Add lang&amp;uage information</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Includes your language settings in the browser identification text.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>gbDomainPolicy</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Site Specific Identification</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Site Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Identification</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>User Agent</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>lvDomainPolicyList</cstring>
+ </property>
+ <property name="selectionMode" stdset="0">
+ <enum>Extended</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ <property name="treeStepSize">
+ <number>0</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>List of sites for which the specified identification text will be used instead of the default one.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbNew</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Add new identification text for a site.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbChange</cstring>
+ </property>
+ <property name="text">
+ <string>Chan&amp;ge...</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Change the selected identifier text.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbDelete</cstring>
+ </property>
+ <property name="text">
+ <string>D&amp;elete</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Delete the selected identifier text.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pbDeleteAll</cstring>
+ </property>
+ <property name="text">
+ <string>Delete A&amp;ll</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Delete all identifiers.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>cbOS</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>cbOSVersion</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbSendUAString</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>gbDefaultId</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbSendUAString</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>gbDomainPolicy</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/knotify/CHANGES b/kcontrol/knotify/CHANGES
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/kcontrol/knotify/CHANGES
diff --git a/kcontrol/knotify/Makefile.am b/kcontrol/knotify/Makefile.am
new file mode 100644
index 000000000..1fc878b67
--- /dev/null
+++ b/kcontrol/knotify/Makefile.am
@@ -0,0 +1,27 @@
+SUBDIRS= . sounds
+
+kde_module_LTLIBRARIES = kcm_knotify.la
+
+kcm_knotify_la_SOURCES = knotify.cpp playersettings.ui
+
+kcm_knotify_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_knotify_la_LIBADD = $(LIB_KIO)
+AM_CPPFLAGS = $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = knotify.h
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmnotify.pot
+
+xdg_apps_DATA = kcmnotify.desktop
+
+pics_DATA = play.png
+picsdir = $(kde_datadir)/kcontrol/pics
+
+# the following should be gone at release time.
+install-data-local:
+ rm -f $(DESTDIR)$(kde_appsdir)/Settings/LookNFeel/knotify.desktop
+ rm -f $(DESTDIR)$(kde_appsdir)/Settings/LookNFeel/kcmnotify.desktop
+
diff --git a/kcontrol/knotify/README b/kcontrol/knotify/README
new file mode 100644
index 000000000..7fd84d340
--- /dev/null
+++ b/kcontrol/knotify/README
@@ -0,0 +1,2 @@
+This is a KDE Control Center Module for configuring system notifications
+
diff --git a/kcontrol/knotify/kcmnotify.desktop b/kcontrol/knotify/kcmnotify.desktop
new file mode 100644
index 000000000..217512c05
--- /dev/null
+++ b/kcontrol/knotify/kcmnotify.desktop
@@ -0,0 +1,243 @@
+[Desktop Entry]
+Exec=kcmshell kcmnotify
+Icon=knotify
+Type=Application
+DocPath=kcontrol/kcmnotify/index.html
+
+
+X-KDE-Library=knotify
+X-KDE-ParentApp=kcontrol
+
+Name=System Notifications
+Name[af]=Stelsel Inkennistelling
+Name[ar]=تنبيهات النظام
+Name[az]=Sistem Bildirişləri
+Name[be]=Сістэмныя нагадванні
+Name[bg]=Уведомяване
+Name[bn]=সিস্টেম বিজ্ঞপ্তি
+Name[br]=Kemenn ar reizhiad
+Name[bs]=Sistemska obavještenja
+Name[ca]=Notificacions del sistema
+Name[cs]=Systémová hlášení
+Name[csb]=Systemòwé dôwanié wiédzë
+Name[cy]=Hysbysiadau Cysawd
+Name[da]=Systembekendtgørelser
+Name[de]=Systemnachrichten
+Name[el]=Ειδοποιήσεις συστήματος
+Name[eo]=Sistematentigoj
+Name[es]=Notificaciones del sistema
+Name[et]=Süsteemi märguanded
+Name[eu]=Sistemaren jakinarazpenak
+Name[fa]=اخطارهای سیستم
+Name[fi]=Järjestelmähuomautukset
+Name[fr]=Notifications du système
+Name[fy]=Systeemoankundigingen
+Name[ga]=Fógairt an Chórais
+Name[gl]=Notificacións do Sistema
+Name[he]=הודעות מערכת
+Name[hi]=तंत्र सूचनाएँ
+Name[hr]=Obavijesti sustava
+Name[hu]=Rendszerüzenetek
+Name[id]=Pemberitahuan Sistem
+Name[is]=Kerfistilkynningar
+Name[it]=Avvisi di sistema
+Name[ja]=システム通知
+Name[ka]=სისტემური შეტყობინებები
+Name[kk]=Жүйелік құлақтандырулар
+Name[km]=ការ​ជូនដំណឹង​ប្រព័ន្ធ
+Name[ko]=시스템 알림
+Name[lo]=ການແຈ້ງເຕືອນຂອງລະບົບ
+Name[lt]=Sistemos pranešimai
+Name[lv]=Sistēmas Paziņojumi
+Name[mk]=Системски известувања
+Name[mn]=Системийн сонордуулга
+Name[ms]=Pemberitahuan Sistem
+Name[mt]=Notifiki tas-Sistema
+Name[nb]=Systemvarsler
+Name[nds]=Systeemnarichten
+Name[ne]=प्रणाली सूचना
+Name[nl]=Systeemnotificaties
+Name[nn]=Systempåminningar
+Name[nso]=Ditsebiso tsa System
+Name[oc]=Notificacions dèu sistemo
+Name[pa]=ਸਿਸਟਮ ਸੂਚਨਾਵਾਂ
+Name[pl]=Powiadomienia systemowe
+Name[pt]=Mensagens do Sistema
+Name[pt_BR]=Notificações do Sistema
+Name[ro]=Notificări de sistem
+Name[ru]=Системные уведомления
+Name[rw]=Amamenyesha Sisitemu
+Name[se]=Vuogádatmuittuhusat
+Name[sk]=Systémové správy
+Name[sl]=Sistemska obvestila
+Name[sr]=Системска обавештења
+Name[sr@Latn]=Sistemska obaveštenja
+Name[sv]=Systemunderrättelser
+Name[ta]=அமைப்பு குறிப்பகள்
+Name[tg]=Огоҳномаи система
+Name[th]=การแจ้งเตือนของระบบ
+Name[tr]=Sistem Bildirimleri
+Name[tt]=Sistem Beldermäläre
+Name[uk]=Системні повідомлення
+Name[uz]=Tizimning xabarnomalari
+Name[uz@cyrillic]=Тизимнинг хабарномалари
+Name[ven]=Thalutshedzo ya UA (M18 kha WinNT 4.0)
+Name[vi]=Thông báo Hệ thống
+Name[wa]=Notifiaedjes do sistinme
+Name[xh]=Izaziso Zendlela esetyenziswayo
+Name[zh_CN]=系统通知
+Name[zh_TW]=系統通知
+Name[zu]=Izaziso zesistimu
+
+Comment=System Notification Configuration
+Comment[af]=Stelsel Inkennisstelling Opstelling
+Comment[ar]=إعدادات تنبيهات النظام
+Comment[az]=Sistem Bildirişi Quraşdırması
+Comment[be]=Настаўленні сістэмных нагадванняў
+Comment[bg]=Настройване на системата за уведомяване
+Comment[bn]=সিস্টেম বিজ্ঞপ্তি কনফিগারেশন
+Comment[br]=Kefluniañ kemenn ar reizhiad
+Comment[bs]=Podešavanje sistemskih obavještenja
+Comment[ca]=Configuració de les notificacions del sistema
+Comment[cs]=Nastavení systémových hlášení
+Comment[csb]=Kònfigùracëjô systemòwegò dôwaniô wiédzë
+Comment[cy]=Ffurfweddu Hysbysiadau Cysawd
+Comment[da]=Opsætning af systembekendtgørelser
+Comment[de]=Einstellung der Systemnachrichten
+Comment[el]=Ρύθμιση ειδοποιήσεων συστήματος
+Comment[eo]=Agordo de sistematentigoj
+Comment[es]=Configuración de las notificaciones del sistema
+Comment[et]=Süsteemsete märguannete seadistamine
+Comment[eu]=Sistemaren jakinarazpenen konfigurazioa
+Comment[fa]=پیکربندی اخطارهای سیستم
+Comment[fi]=Järjestelmähuomautusten asetukset
+Comment[fr]=Configuration du système de notifications
+Comment[fy]=Ynstellings fan de systeemoankundigingen
+Comment[gl]=Configuración das Notificacións do Sistema
+Comment[he]=שינוי הגדרות הודעות המערכת
+Comment[hi]=तंत्र सूचना कॉन्फ़िगरेशन
+Comment[hr]=Konfiguriranje obavijesti sustava
+Comment[hu]=A rendszerüzenetek beállítása
+Comment[id]=Konfigurasi pemberitahuan sistem
+Comment[is]=Stillingar tilkynninga frá kerfinu
+Comment[it]=Configurazione degli avvisi di sistema
+Comment[ja]=システム通知の設定
+Comment[ka]=სისტემური შეტყობინებების კონფიგურაცია
+Comment[kk]=Жүйелік құлақтандыруларды баптау
+Comment[km]=ការ​កំណត់​រចនាសម្ព័ន្ធជូនដំណឹងប្រព័ន្ធ
+Comment[ko]=시스템 알림 설정
+Comment[lo]=ປັບແຕ່ງການແຈ້ງເຕືອນຂອງລະບົບ
+Comment[lt]=Sistemos pranešimų derinimas
+Comment[lv]=Sistēmas Paziņojumu Konfigurēšana
+Comment[mk]=Конфигурација на системските известувања
+Comment[mn]=Системийн сонордуулга тохируулга
+Comment[ms]=Konfigurasi Pemberitahuan Sistem
+Comment[mt]=Konfigurazzjoni tan-notifiki tas-Sistema
+Comment[nb]=Oppett av systemvarsling
+Comment[nds]=Systeemnarichten instellen
+Comment[ne]=प्रणाली सूचना कन्फिगरेसन
+Comment[nl]=Instellingen van de systeemnotificatie
+Comment[nn]=Oppsett av systempåminningar
+Comment[nso]=Peakanyo ya Tsebiso ya System
+Comment[oc]=Configuracion de les notificacions dèu sistemo
+Comment[pa]=ਸਿਸਟਮ ਸੂਚਨਾ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja powiadamiania systemowego
+Comment[pt]=Configuração das mensagens do sistema
+Comment[pt_BR]=Configuração das notificações do sistema
+Comment[ro]=Configurează notificările de sistem
+Comment[ru]=Настройка системных уведомлений
+Comment[rw]=Iboneza ry'Amamenyesha Sisitemu
+Comment[se]=Heivet vuogádatmuittuhusat
+Comment[sk]=Nastavenie správ systému
+Comment[sl]=Nastavitev sistemskih obvestil
+Comment[sr]=Подешавање системских обавештења
+Comment[sr@Latn]=Podešavanje sistemskih obaveštenja
+Comment[sv]=Anpassa systemunderrättelser
+Comment[ta]=சாதனம் குறிப்பு அமைப்பு
+Comment[tg]=Танзими огоҳномаи система
+Comment[th]=ปรับแต่งการแจ้งเตือนของระบบ
+Comment[tr]=Sistem Bildirimi Yapılandırması
+Comment[tt]=Sistem Beldermälären Caylaw
+Comment[uk]=Налаштування системних повідомлень
+Comment[uz]=Tizimning xabarnomalarini moslash
+Comment[uz@cyrillic]=Тизимнинг хабарномаларини мослаш
+Comment[ven]=Khonifiguresheni yau divhadza sisiteme
+Comment[vi]=Cấu hình Thông báo Hệ thống
+Comment[wa]=Apontiaedje po les notifiaedjes do sistinme
+Comment[xh]=Uqwalaselo Lwezaziso Zendlela yokusebenza
+Comment[zh_CN]=系统通知配置
+Comment[zh_TW]=系統通知組態
+Comment[zu]=Inhlanganiselo yokwazisa kwesistimu
+
+Keywords=System sounds,Audio,Sound,Notify,Alerts,Notification
+Keywords[af]=Stelsel sounds,Audio,Sound,Notify,Alerts,Notification
+Keywords[ar]=أصوات النظام,Audio,System sounds,Audio,Sound,Notify,Alerts, Notification,صوت,نبّه,تحذيات,تنبيهات
+Keywords[az]=Sistem səsləri,Səs,Bildir,Alarmlar,Bildirmə
+Keywords[be]=Сістэмныя гукі,Аўдыё,Гук,Нагадванне,Важныя нагадванні,Нагадваць,System sounds,Audio,Sound,Notify,Alerts,Notification
+Keywords[bg]=системен, звук, уведомяване, информация, грешка, събития, System sounds, Audio, Sound, Notify, Alerts, Notification
+Keywords[br]=sonioù ar reizhiad,klevet,son,kemenn,evezh
+Keywords[bs]=System sounds,Audio,Sound,Notify,Alerts,Notification,zvuk
+Keywords[ca]=Sons del sistema,Àudio,So,Notifica,Alertes,Notificació
+Keywords[cs]=Systémové zvuky,Audio,Oznámit,Varování,Oznámení
+Keywords[csb]=Systemòwé zwãczi,Audio,Zwãk,Dôwac wiédzã,Alarmë,Dôwanié wiédzë
+Keywords[cy]=Sain cysawd,Awdio,Swn,Hysbysu,Rhybuddion,Hysbysiad
+Keywords[da]=Systemlyde,audio,Lyd,Bekendtgør,Advarsler,Bekendtgørelse
+Keywords[de]=Klänge,Systemklänge,Audio,Sound,Benachrichtigung,Nachricht,Alarm,Signalton,Beep
+Keywords[el]=Ήχοι συστήματος,Audio,Ήχος,Ειδοποιώ,Συναγερμοί,Ειδοποίηση
+Keywords[eo]=sistemo,sonoroj,aŭdio,sono,atentigo,alarmo,operaciumo
+Keywords[es]=Sonidos del sistema,Audio,Sonido,Notificar,Alertas,Notificación
+Keywords[et]=süsteemsed helid,audio,heli,märguanded,alarm
+Keywords[eu]=Sistemaren soinuak,Audioa,Soinua,Jakinarazi,Alertak,Jakinarazpenak
+Keywords[fa]=صداهای سیستم، صوتی، صوت، اخطار، هشدار، اخطار
+Keywords[fi]=Järjestelmä-äänet,Äänet,Huomauttaa,Varoitukset,Huomautus
+Keywords[fr]=sons du système,son,audio,notification,alertes,événements
+Keywords[fy]=systeemlûden,audio,lûd,warskôgingen,lûdssinjaal,oankundiging
+Keywords[gl]=Sons do sistema,Audio,Son,Notificar,Alertas,Notificación
+Keywords[he]=צלילי מערכת,שמע,צליל,הודעה,תזכורות, System sounds,Audio,Sound,Notify,Alerts,Notification
+Keywords[hi]=तंत्र ध्वनि,ऑडियो,ध्वनि,सूचना,सतर्क,सूचनाएँ
+Keywords[hr]=System sounds,Audio,Sound,Notify,Alerts,Notification,Zvuk,Sistemski zvukovi,Obavijesti,Upozorenja,Obavijest
+Keywords[hu]=rendszerhangok,audió,hang,figyelmeztető,vészjelző
+Keywords[id]=System sounds,Audio,Sound,Notify,Alerts,Pemberitahuan
+Keywords[is]=Kerfishljóð,Hljóð,Tilkynningar,Villur,Bjalla
+Keywords[it]=Suoni di sistema,Audio,Suono,Notifica,Avvisi,Messaggi
+Keywords[ja]=システムサウンド,オーディオ,サウンド,通知, アラート,通知
+Keywords[ka]=სისტემის ხმები,აუდიო,ხმა,შეტყობინება,განგაში,შეტყობინება
+Keywords[km]=សំឡេង​ប្រព័ន្ធ,សំឡេង,សោត,ជូនដំណឹង,ព្រមាន,ការ​ជូនដំណឹង
+Keywords[lt]=Sistemos garsai,Audio,Garsas,Pranešimas,Perspėjimai
+Keywords[lv]=Sistēmas skaņas,Audio,Skaņa,Paziņo,Brīdinājumi,Paziņošana
+Keywords[mk]=System sounds,Audio,Sound,Notify,Alerts,Notification,Системски звуци,Аудио,Звук,Извести,Предупредувања,Известувања
+Keywords[mn]=Чимээ,Системийн чимээ,Audio,Дуу,Мэдээлэгч,Мэдээ,Alarm,Сигналын чимээ,Beep
+Keywords[nb]=Systemlyder,Lyd,Varsle,Advarsel,Varsling,alarm,signal
+Keywords[nds]=Systeemkläng,Audio,Klang,Notify,Bescheed,Notification,Bescheed geven
+Keywords[ne]=प्रणाली ध्वनि, अडियो, ध्वनि, सूचित, चेतावनी, सूचना
+Keywords[nl]=systeemgeluiden,audio,geluid,waarschuwingen,geluidssignaal,notificatie
+Keywords[nn]=systemlydar,lyd,påminning,varsel,alarm,signal
+Keywords[nso]=Medumo ya System,Kwagalo,Modumo,Tsebisa,Ditheeletso,Tsebiso
+Keywords[oc]=Sons dèu sistemo,Ã?udio,Son,Notifica,Alertes,Notificacion
+Keywords[pa]=ਸਿਸਟਮ ਧੁਨੀ,ਆਡੀਓ,ਧੁਨੀ,ਸੂਚਨਾ,ਚੇਤਾਵਨੀ,ਸੂਚਨਾਵਾਂ
+Keywords[pl]=Dźwieki systemowe,Audio,Dźwiek,Powiadamiac,Alarmy,Powiadamianie
+Keywords[pt]=sons de sistema,áudio,som,notificar,alertas,notificação
+Keywords[pt_BR]=Sons de sistema,áudio,Som,Notificação,Alertas,Notificação
+Keywords[ro]=sunete de sistem,audio,sunet,alertă,notificare
+Keywords[rw]=Amajwi sisitemu,Inyumvo,Ijwi,Kumenyesha,Integuza,Imenyekanisha
+Keywords[se]=vuogádatjienat,jietna,audio,dieđihit,váruhusat,signála
+Keywords[sk]=Systém zvukov,Audio,Zvuk,Správy,Upozornenia
+Keywords[sl]=sistemski zvoki,avdio,zvok,obvestila,alarmi
+Keywords[sr]=System sounds,Аудио,Sound,Notify,Alerts,Notification,Звук,Узбуне,обавештења,системски звуци
+Keywords[sr@Latn]=System sounds,Audio,Sound,Notify,Alerts,Notification,Zvuk,Uzbune,obaveštenja,sistemski zvuci
+Keywords[sv]=Systemljud,Ljud,ljud,Underrättelse,Varningar,Bekräftelse
+Keywords[ta]=அமைப்பு ஒலிகள்,கேட்பொலி,ஒலி,தெரியப்படுத்து,எச்சரிக்கைகள்,தெரியப்படுத்துதல்
+Keywords[th]=ระบบเสียง,ออดิโอ,เสียง,แจ้งเตือน,เตือน,การแจ้งเตือน
+Keywords[tr]=Sistem sesleri,Ses,Bildir,Alarmlar,Bildirme
+Keywords[uk]=системні звуки,аудіо,audio,звук,повідомлення,попередження,сповіщення
+Keywords[uz]=Tizim tovush signallari,Audio,Tovush,Xabar berish,Xabarnomalar
+Keywords[uz@cyrillic]=Тизим товуш сигналлари,Аудио,Товуш,Хабар бериш,Хабарномалар
+Keywords[ven]=Mubvumo wa sisitemu,Zwaupfiwa,Mubvumo,Divhadza,Divhisa,Ndivhadzo
+Keywords[vi]=Âm thanh hệ thống,Âm,Âm thanh,Thông báo,Cảnh báo,Thông báo
+Keywords[wa]=Sons do sistinme,Audio,Son,Notifyî,Alertes,Notifiaedje
+Keywords[xh]=Izandi zendlela,Evakalayo,Isandi,Yazisa,Izilumkiso zengozi,Izaziso
+Keywords[zh_CN]=System sounds,Audio,Sound,Notify,Alerts,Notification,系统音效,音效,通知,警报
+Keywords[zh_TW]=System sounds,Audio,Sound,Notify,Alerts,Notification,系統音效,音效,通知,警報
+Keywords[zu]=Imisindo yesistimu,Okuzwakalayo,Umsindo,Yazisa,Ukuqwashisa, Ukwazisa
+
+Categories=Qt;KDE;X-KDE-settings-sound;
diff --git a/kcontrol/knotify/knotify.cpp b/kcontrol/knotify/knotify.cpp
new file mode 100644
index 000000000..8cd4d16a5
--- /dev/null
+++ b/kcontrol/knotify/knotify.cpp
@@ -0,0 +1,328 @@
+/*
+ Copyright (C) 2000,2002 Carsten Pfeiffer <pfeiffer@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+
+#include <qbuttongroup.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qslider.h>
+#include <qvbox.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <knotifydialog.h>
+#include <kparts/genericfactory.h>
+#include <kstandarddirs.h>
+#include <kurlcompletion.h>
+#include <kurlrequester.h>
+
+
+#include "knotify.h"
+#include "playersettings.h"
+
+static const int COL_FILENAME = 1;
+
+typedef KGenericFactory<KCMKNotify, QWidget> NotifyFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_knotify, NotifyFactory("kcmnotify") )
+
+using namespace KNotify;
+
+KCMKNotify::KCMKNotify(QWidget *parent, const char *name, const QStringList & )
+ : KCModule(NotifyFactory::instance(), parent, name),
+ m_playerSettings( 0L )
+{
+ setButtons( Help | Default | Apply );
+
+ setQuickHelp( i18n("<h1>System Notifications</h1>"
+ "KDE allows for a great deal of control over how you "
+ "will be notified when certain events occur. There are "
+ "several choices as to how you are notified:"
+ "<ul><li>As the application was originally designed."
+ "<li>With a beep or other noise."
+ "<li>Via a popup dialog box with additional information."
+ "<li>By recording the event in a logfile without "
+ "any additional visual or audible alert."
+ "</ul>"));
+
+ QVBoxLayout *layout = new QVBoxLayout( this, 0, KDialog::spacingHint() );
+
+ QLabel *label = new QLabel( i18n( "Event source:" ), this );
+ m_appCombo = new KComboBox( false, this, "app combo" );
+
+ QHBoxLayout *hbox = new QHBoxLayout( layout );
+ hbox->addWidget( label );
+ hbox->addWidget( m_appCombo, 10 );
+
+ m_notifyWidget = new KNotifyWidget( this, "knotify widget", true );
+ connect( m_notifyWidget, SIGNAL( changed( bool )), SIGNAL( changed(bool)));
+
+ layout->addWidget( m_notifyWidget );
+
+ connect( m_appCombo, SIGNAL( activated( const QString& ) ),
+ SLOT( slotAppActivated( const QString& )) );
+
+ connect( m_notifyWidget->m_playerButton, SIGNAL( clicked() ),
+ SLOT( slotPlayerSettings()));
+
+ KAboutData* ab = new KAboutData(
+ "kcmknotify", I18N_NOOP("KNotify"), "3.0",
+ I18N_NOOP("System Notification Control Panel Module"),
+ KAboutData::License_GPL, "(c) 2002 Carsten Pfeiffer", 0, 0 );
+ ab->addAuthor( "Carsten Pfeiffer", 0, "pfeiffer@kde.org" );
+ ab->addCredit( "Charles Samuels", I18N_NOOP("Original implementation"),
+ "charles@altair.dhs.org" );
+ setAboutData( ab );
+
+ load();
+}
+
+KCMKNotify::~KCMKNotify()
+{
+ KConfig config( "knotifyrc", false, false );
+ config.setGroup( "Misc" );
+ ApplicationList allApps = m_notifyWidget->allApps();
+ ApplicationListIterator appIt( allApps );
+ for ( ; appIt.current(); ++appIt )
+ {
+ if( appIt.current()->text() == m_appCombo->currentText())
+ config.writeEntry( "LastConfiguredApp", appIt.current()->appName());
+ }
+}
+
+Application * KCMKNotify::applicationByDescription( const QString& text )
+{
+ // not really efficient, but this is not really time-critical
+ ApplicationList& allApps = m_notifyWidget->allApps();
+ ApplicationListIterator it ( allApps );
+ for ( ; it.current(); ++it )
+ {
+ if ( it.current()->text() == text )
+ return it.current();
+ }
+
+ return 0L;
+}
+
+void KCMKNotify::slotAppActivated( const QString& text )
+{
+ Application *app = applicationByDescription( text );
+ if ( app )
+ {
+ m_notifyWidget->clearVisible();
+ m_notifyWidget->addVisibleApp( app );
+ }
+}
+
+void KCMKNotify::slotPlayerSettings()
+{
+ // kcmshell is a modal dialog, and apparently, we can't put a non-modal
+ // dialog besides a modal dialog. sigh.
+ if ( !m_playerSettings )
+ m_playerSettings = new PlayerSettingsDialog( this, true );
+
+ m_playerSettings->exec();
+}
+
+
+void KCMKNotify::defaults()
+{
+ m_notifyWidget->resetDefaults( true ); // ask user
+ load( true );
+}
+
+void KCMKNotify::load()
+{
+ load( false );
+}
+
+void KCMKNotify::load( bool useDefaults )
+{
+ setEnabled( false );
+
+ m_appCombo->clear();
+ m_notifyWidget->clear();
+
+ QStringList fullpaths =
+ KGlobal::dirs()->findAllResources("data", "*/eventsrc", false, true );
+
+ QStringList::ConstIterator it = fullpaths.begin();
+ for ( ; it != fullpaths.end(); ++it)
+ m_notifyWidget->addApplicationEvents( *it );
+
+ ApplicationList allApps = m_notifyWidget->allApps();
+ allApps.sort();
+ m_notifyWidget->setEnabled( !allApps.isEmpty() );
+
+ KConfig config( "knotifyrc", true, false );
+ config.setReadDefaults( useDefaults );
+ config.setGroup( "Misc" );
+ QString select = config.readEntry( "LastConfiguredApp" );
+ if( select.isEmpty())
+ select = "knotify"; // default to system notifications
+ bool selected = false;
+
+ ApplicationListIterator appIt( allApps );
+ for ( ; appIt.current(); ++appIt )
+ {
+ m_appCombo->insertItem( appIt.current()->text() );
+ if( appIt.current()->appName() == select )
+ {
+ m_appCombo->setCurrentItem( appIt.current()->text());
+ selected = true;
+ }
+ else if( !selected && appIt.current()->appName() == "knotify" )
+ m_appCombo->setCurrentItem( appIt.current()->text());
+ }
+
+ // sets the applicationEvents for KNotifyWidget
+ slotAppActivated( m_appCombo->currentText() );
+
+ // unsetCursor(); // unsetting doesn't work. sigh.
+ setEnabled( true );
+ emit changed( useDefaults );
+}
+
+void KCMKNotify::save()
+{
+ if ( m_playerSettings )
+ m_playerSettings->save();
+
+ m_notifyWidget->save(); // will dcop knotify about its new config
+
+ emit changed( false );
+}
+
+///////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////
+
+PlayerSettingsDialog::PlayerSettingsDialog( QWidget *parent, bool modal )
+ : KDialogBase( parent, "player settings dialog", modal,
+ i18n("Player Settings"), Ok|Apply|Cancel, Ok, true )
+{
+ QFrame *frame = makeMainWidget();
+
+ QVBoxLayout *topLayout = new QVBoxLayout( frame, 0,
+ KDialog::spacingHint() );
+
+ m_ui = new PlayerSettingsUI(frame);
+ topLayout->addWidget(m_ui);
+
+ load( false );
+ dataChanged = false;
+ enableButton(Apply, false);
+
+ connect( m_ui->cbExternal, SIGNAL( toggled( bool ) ), this, SLOT( externalToggled( bool ) ) );
+ connect( m_ui->grpPlayers, SIGNAL( clicked( int ) ), this, SLOT( slotChanged() ) );
+ connect( m_ui->volumeSlider, SIGNAL( valueChanged ( int ) ), this, SLOT( slotChanged() ) );
+ connect( m_ui->reqExternal, SIGNAL( textChanged( const QString& ) ), this, SLOT( slotChanged() ) );
+}
+
+void PlayerSettingsDialog::load( bool useDefaults )
+{
+ KConfig config( "knotifyrc", true, false );
+ config.setReadDefaults( useDefaults );
+ config.setGroup( "Misc" );
+ bool useExternal = config.readBoolEntry( "Use external player", false );
+ m_ui->cbExternal->setChecked( useExternal );
+ m_ui->reqExternal->setURL( config.readPathEntry( "External player" ) );
+ m_ui->volumeSlider->setValue( config.readNumEntry( "Volume", 100 ) );
+
+ if ( !m_ui->cbExternal->isChecked() )
+ {
+ config.setGroup( "StartProgress" );
+ if ( config.readBoolEntry( "Use Arts", true ) )
+ {
+ m_ui->cbArts->setChecked( true );
+ }
+ else
+ {
+ m_ui->cbNone->setChecked( true );
+ }
+ }
+}
+
+void PlayerSettingsDialog::save()
+{
+ // see kdelibs/arts/knotify/knotify.cpp
+ KConfig config( "knotifyrc", false, false );
+ config.setGroup( "Misc" );
+
+ config.writePathEntry( "External player", m_ui->reqExternal->url() );
+ config.writeEntry( "Use external player", m_ui->cbExternal->isChecked() );
+ config.writeEntry( "Volume", m_ui->volumeSlider->value() );
+
+ config.setGroup( "StartProgress" );
+
+ if ( m_ui->cbNone->isChecked() )
+ {
+ // user explicitly says "no sound!"
+ config.writeEntry( "Use Arts", false );
+ }
+ else if ( m_ui->cbArts->isChecked() )
+ {
+ // use explicitly said to use aRts so we turn it back on
+ // we don't want to always set this to the value of
+ // m_ui->cbArts->isChecked() since we don't want to
+ // turn off aRts support just because they also chose
+ // an external player
+ config.writeEntry( "Use Arts", true );
+ config.writeEntry( "Arts Init", true ); // reset it for the next time
+ }
+
+ config.sync();
+}
+
+// reimplements KDialogBase::slotApply()
+void PlayerSettingsDialog::slotApply()
+{
+ save();
+ dataChanged = false;
+ enableButton(Apply, false);
+ kapp->dcopClient()->send("knotify", "", "reconfigure()", "");
+
+ KDialogBase::slotApply();
+}
+
+// reimplements KDialogBase::slotOk()
+void PlayerSettingsDialog::slotOk()
+{
+ if( dataChanged )
+ slotApply();
+ KDialogBase::slotOk();
+}
+
+void PlayerSettingsDialog::slotChanged()
+{
+ dataChanged = true;
+ enableButton(Apply, true);
+}
+
+void PlayerSettingsDialog::externalToggled( bool on )
+{
+ if ( on )
+ m_ui->reqExternal->setFocus();
+ else
+ m_ui->reqExternal->clearFocus();
+}
+
+#include "knotify.moc"
diff --git a/kcontrol/knotify/knotify.h b/kcontrol/knotify/knotify.h
new file mode 100644
index 000000000..2ee2f3ef6
--- /dev/null
+++ b/kcontrol/knotify/knotify.h
@@ -0,0 +1,96 @@
+/*
+ Copyright (C) 2000,2002 Carsten Pfeiffer <pfeiffer@kde.org>
+
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+
+
+#ifndef _KNOTIFY_H
+#define _KNOTIFY_H
+
+#include <qstring.h>
+
+#include <kcmodule.h>
+#include <kdialogbase.h>
+
+class QCheckBox;
+class QLabel;
+class QSlider;
+
+class KAboutData;
+class KComboBox;
+class KURLRequester;
+class PlayerSettingsDialog;
+class PlayerSettingsUI;
+
+namespace KNotify
+{
+ class Application;
+ class KNotifyWidget;
+}
+
+class KCMKNotify : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KCMKNotify(QWidget *parent, const char *name, const QStringList &);
+ virtual ~KCMKNotify();
+
+ virtual void defaults();
+ virtual void save();
+ virtual void load(bool useDefaults );
+
+public slots:
+ virtual void load();
+
+private slots:
+ void slotAppActivated( const QString& app );
+ void slotPlayerSettings();
+
+private:
+ KNotify::Application *applicationByDescription( const QString& text );
+
+ KComboBox *m_appCombo;
+ KNotify::KNotifyWidget *m_notifyWidget;
+ PlayerSettingsDialog *m_playerSettings;
+
+};
+
+class PlayerSettingsDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ PlayerSettingsDialog( QWidget *parent, bool modal );
+ void load( bool useDefaults );
+ void save();
+
+protected slots:
+ virtual void slotApply();
+ virtual void slotOk();
+ void externalToggled( bool on );
+ void slotChanged();
+
+private:
+ PlayerSettingsUI* m_ui;
+ bool dataChanged;
+};
+
+
+#endif
diff --git a/kcontrol/knotify/play.png b/kcontrol/knotify/play.png
new file mode 100644
index 000000000..e0daeb8c9
--- /dev/null
+++ b/kcontrol/knotify/play.png
Binary files differ
diff --git a/kcontrol/knotify/playersettings.ui b/kcontrol/knotify/playersettings.ui
new file mode 100644
index 000000000..f990fc995
--- /dev/null
+++ b/kcontrol/knotify/playersettings.ui
@@ -0,0 +1,330 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>PlayerSettingsUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>PlayerSettingsUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>387</width>
+ <height>207</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Audio Player Settings&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>grpPlayers</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QRadioButton" row="4" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>cbNone</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;No audio output</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>cbExternal</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use an external player</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="0" column="1" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>233</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="1" column="2">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>100%</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>0%</string>
+ </property>
+ </widget>
+ <widget class="QSlider" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>volumeSlider</cstring>
+ </property>
+ <property name="maxValue">
+ <number>100</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Volume:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>volumeSlider</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QRadioButton" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>cbArts</cstring>
+ </property>
+ <property name="text">
+ <string>Use the &amp;KDE sound system</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="1">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Player:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>reqExternal</cstring>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="3" column="2">
+ <property name="name">
+ <cstring>reqExternal</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>10</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>cbArts</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textLabel4</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbArts</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textLabel2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbArts</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>volumeSlider</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbArts</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textLabel3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbExternal</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textLabel5</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbExternal</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>reqExternal</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>cbArts</tabstop>
+ <tabstop>volumeSlider</tabstop>
+ <tabstop>reqExternal</tabstop>
+ <tabstop>cbExternal</tabstop>
+ <tabstop>cbNone</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/knotify/sounds/KDE_Beep.ogg b/kcontrol/knotify/sounds/KDE_Beep.ogg
new file mode 100644
index 000000000..ac9985bbd
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Ahem.wav b/kcontrol/knotify/sounds/KDE_Beep_Ahem.wav
new file mode 100644
index 000000000..c6c7c4b0f
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Ahem.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Beep.wav b/kcontrol/knotify/sounds/KDE_Beep_Beep.wav
new file mode 100644
index 000000000..3c18175f7
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Beep.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Bottles.wav b/kcontrol/knotify/sounds/KDE_Beep_Bottles.wav
new file mode 100644
index 000000000..1b82bc128
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Bottles.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Car.ogg b/kcontrol/knotify/sounds/KDE_Beep_Car.ogg
new file mode 100644
index 000000000..bb1f952c0
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Car.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Classic.ogg b/kcontrol/knotify/sounds/KDE_Beep_Classic.ogg
new file mode 100644
index 000000000..991c08dc1
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Classic.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_ClassicBeep.wav b/kcontrol/knotify/sounds/KDE_Beep_ClassicBeep.wav
new file mode 100644
index 000000000..f7e6d5977
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_ClassicBeep.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_ClockChime.wav b/kcontrol/knotify/sounds/KDE_Beep_ClockChime.wav
new file mode 100644
index 000000000..74a7f5187
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_ClockChime.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Connect.ogg b/kcontrol/knotify/sounds/KDE_Beep_Connect.ogg
new file mode 100644
index 000000000..2b2e26c5e
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Connect.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Connect.wav b/kcontrol/knotify/sounds/KDE_Beep_Connect.wav
new file mode 100644
index 000000000..109e8d1c8
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Connect.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Digital_1.ogg b/kcontrol/knotify/sounds/KDE_Beep_Digital_1.ogg
new file mode 100644
index 000000000..5fd25353c
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Digital_1.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Digital_2.ogg b/kcontrol/knotify/sounds/KDE_Beep_Digital_2.ogg
new file mode 100644
index 000000000..caba4cf19
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Digital_2.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Door.wav b/kcontrol/knotify/sounds/KDE_Beep_Door.wav
new file mode 100644
index 000000000..5257aca9f
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Door.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Double.ogg b/kcontrol/knotify/sounds/KDE_Beep_Double.ogg
new file mode 100644
index 000000000..a5b279f12
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Double.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Harsh.ogg b/kcontrol/knotify/sounds/KDE_Beep_Harsh.ogg
new file mode 100644
index 000000000..b2fbd0d38
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Harsh.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Honk.wav b/kcontrol/knotify/sounds/KDE_Beep_Honk.wav
new file mode 100644
index 000000000..9faf34c61
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Honk.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Lightning.wav b/kcontrol/knotify/sounds/KDE_Beep_Lightning.wav
new file mode 100644
index 000000000..9d418c968
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Lightning.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Phone_1.ogg b/kcontrol/knotify/sounds/KDE_Beep_Phone_1.ogg
new file mode 100644
index 000000000..0d902cbae
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Phone_1.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Phone_2.ogg b/kcontrol/knotify/sounds/KDE_Beep_Phone_2.ogg
new file mode 100644
index 000000000..1c8d27419
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Phone_2.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Pop.wav b/kcontrol/knotify/sounds/KDE_Beep_Pop.wav
new file mode 100644
index 000000000..3a9133381
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Pop.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_RimShot.wav b/kcontrol/knotify/sounds/KDE_Beep_RimShot.wav
new file mode 100644
index 000000000..6f978150b
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_RimShot.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_RingRing.wav b/kcontrol/knotify/sounds/KDE_Beep_RingRing.wav
new file mode 100644
index 000000000..01b6eee81
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_RingRing.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_ShortBeep.wav b/kcontrol/knotify/sounds/KDE_Beep_ShortBeep.wav
new file mode 100644
index 000000000..2c3795ad7
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_ShortBeep.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Beep_Yo.wav b/kcontrol/knotify/sounds/KDE_Beep_Yo.wav
new file mode 100644
index 000000000..c98273bbb
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Beep_Yo.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Bottles.ogg b/kcontrol/knotify/sounds/KDE_Bottles.ogg
new file mode 100644
index 000000000..52a78c74b
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Bottles.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Chimes_1.ogg b/kcontrol/knotify/sounds/KDE_Chimes_1.ogg
new file mode 100644
index 000000000..76c8b530b
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Chimes_1.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Chimes_2.ogg b/kcontrol/knotify/sounds/KDE_Chimes_2.ogg
new file mode 100644
index 000000000..b66d819bf
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Chimes_2.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Chimes_3.ogg b/kcontrol/knotify/sounds/KDE_Chimes_3.ogg
new file mode 100644
index 000000000..e170000f6
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Chimes_3.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Click.wav b/kcontrol/knotify/sounds/KDE_Click.wav
new file mode 100644
index 000000000..b7c572983
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Click.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Click_1.ogg b/kcontrol/knotify/sounds/KDE_Click_1.ogg
new file mode 100644
index 000000000..39cb99194
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Click_1.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Click_2.ogg b/kcontrol/knotify/sounds/KDE_Click_2.ogg
new file mode 100644
index 000000000..75836862c
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Click_2.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Click_3.ogg b/kcontrol/knotify/sounds/KDE_Click_3.ogg
new file mode 100644
index 000000000..a829deeeb
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Click_3.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Close_Window.wav b/kcontrol/knotify/sounds/KDE_Close_Window.wav
new file mode 100644
index 000000000..920434770
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Close_Window.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Critical_Error.wav b/kcontrol/knotify/sounds/KDE_Critical_Error.wav
new file mode 100644
index 000000000..6ae8366a2
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Critical_Error.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop1.wav b/kcontrol/knotify/sounds/KDE_Desktop1.wav
new file mode 100644
index 000000000..735c33a82
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop1.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop2.wav b/kcontrol/knotify/sounds/KDE_Desktop2.wav
new file mode 100644
index 000000000..211a3be06
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop2.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop3.wav b/kcontrol/knotify/sounds/KDE_Desktop3.wav
new file mode 100644
index 000000000..b7b9101f1
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop3.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop4.wav b/kcontrol/knotify/sounds/KDE_Desktop4.wav
new file mode 100644
index 000000000..8e6cc5e89
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop4.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop5.wav b/kcontrol/knotify/sounds/KDE_Desktop5.wav
new file mode 100644
index 000000000..51db8892c
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop5.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop6.wav b/kcontrol/knotify/sounds/KDE_Desktop6.wav
new file mode 100644
index 000000000..664d34072
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop6.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop7.wav b/kcontrol/knotify/sounds/KDE_Desktop7.wav
new file mode 100644
index 000000000..a60702fea
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop7.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop8.wav b/kcontrol/knotify/sounds/KDE_Desktop8.wav
new file mode 100644
index 000000000..53adf2705
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop8.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop_1.ogg b/kcontrol/knotify/sounds/KDE_Desktop_1.ogg
new file mode 100644
index 000000000..6c1a73d46
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop_1.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop_2.ogg b/kcontrol/knotify/sounds/KDE_Desktop_2.ogg
new file mode 100644
index 000000000..dfdc897a5
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop_2.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop_3.ogg b/kcontrol/knotify/sounds/KDE_Desktop_3.ogg
new file mode 100644
index 000000000..af838bf5a
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop_3.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop_4.ogg b/kcontrol/knotify/sounds/KDE_Desktop_4.ogg
new file mode 100644
index 000000000..bfe0b2498
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop_4.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop_5.ogg b/kcontrol/knotify/sounds/KDE_Desktop_5.ogg
new file mode 100644
index 000000000..1dfa1159d
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop_5.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop_6.ogg b/kcontrol/knotify/sounds/KDE_Desktop_6.ogg
new file mode 100644
index 000000000..8cfe1c11d
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop_6.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop_7.ogg b/kcontrol/knotify/sounds/KDE_Desktop_7.ogg
new file mode 100644
index 000000000..2f6e1dbb8
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop_7.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Desktop_8.ogg b/kcontrol/knotify/sounds/KDE_Desktop_8.ogg
new file mode 100644
index 000000000..60eebb8a5
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Desktop_8.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Dialog_Appear.ogg b/kcontrol/knotify/sounds/KDE_Dialog_Appear.ogg
new file mode 100644
index 000000000..a41c410bc
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Dialog_Appear.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Dialog_Appear.wav b/kcontrol/knotify/sounds/KDE_Dialog_Appear.wav
new file mode 100644
index 000000000..1f7e37754
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Dialog_Appear.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Dialog_Disappear.ogg b/kcontrol/knotify/sounds/KDE_Dialog_Disappear.ogg
new file mode 100644
index 000000000..5005380d1
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Dialog_Disappear.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Dialog_Disappear.wav b/kcontrol/knotify/sounds/KDE_Dialog_Disappear.wav
new file mode 100644
index 000000000..1c665305f
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Dialog_Disappear.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Door.ogg b/kcontrol/knotify/sounds/KDE_Door.ogg
new file mode 100644
index 000000000..8fe37c373
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Door.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Drum_Break.ogg b/kcontrol/knotify/sounds/KDE_Drum_Break.ogg
new file mode 100644
index 000000000..bee81f578
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Drum_Break.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Error.wav b/kcontrol/knotify/sounds/KDE_Error.wav
new file mode 100644
index 000000000..ed97e88f5
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Error.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Error_1.ogg b/kcontrol/knotify/sounds/KDE_Error_1.ogg
new file mode 100644
index 000000000..86f083fe0
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Error_1.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Error_2.ogg b/kcontrol/knotify/sounds/KDE_Error_2.ogg
new file mode 100644
index 000000000..bd92b9451
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Error_2.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Error_3.ogg b/kcontrol/knotify/sounds/KDE_Error_3.ogg
new file mode 100644
index 000000000..e0aab309f
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Error_3.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Event_1.ogg b/kcontrol/knotify/sounds/KDE_Event_1.ogg
new file mode 100644
index 000000000..05e54f6b5
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Event_1.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Event_2.ogg b/kcontrol/knotify/sounds/KDE_Event_2.ogg
new file mode 100644
index 000000000..1e183ac21
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Event_2.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Event_3.ogg b/kcontrol/knotify/sounds/KDE_Event_3.ogg
new file mode 100644
index 000000000..18179ffc1
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Event_3.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Event_4.ogg b/kcontrol/knotify/sounds/KDE_Event_4.ogg
new file mode 100644
index 000000000..7ba373346
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Event_4.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Event_5.ogg b/kcontrol/knotify/sounds/KDE_Event_5.ogg
new file mode 100644
index 000000000..afdfd67fe
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Event_5.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Glass_Break.ogg b/kcontrol/knotify/sounds/KDE_Glass_Break.ogg
new file mode 100644
index 000000000..6d071f066
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Glass_Break.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Keyboard_Key_1.ogg b/kcontrol/knotify/sounds/KDE_Keyboard_Key_1.ogg
new file mode 100644
index 000000000..4860c1f0e
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Keyboard_Key_1.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Logout.wav b/kcontrol/knotify/sounds/KDE_Logout.wav
new file mode 100644
index 000000000..dfe5ce00d
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Logout.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Logout_1.ogg b/kcontrol/knotify/sounds/KDE_Logout_1.ogg
new file mode 100644
index 000000000..b170afa02
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Logout_1.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Logout_2.ogg b/kcontrol/knotify/sounds/KDE_Logout_2.ogg
new file mode 100644
index 000000000..cb1e46c0e
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Logout_2.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Logout_3.ogg b/kcontrol/knotify/sounds/KDE_Logout_3.ogg
new file mode 100644
index 000000000..f0d62f20d
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Logout_3.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Notify.wav b/kcontrol/knotify/sounds/KDE_Notify.wav
new file mode 100644
index 000000000..6795636c7
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Notify.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Pop.ogg b/kcontrol/knotify/sounds/KDE_Pop.ogg
new file mode 100644
index 000000000..14535f67b
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Pop.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Star_Ship_1.ogg b/kcontrol/knotify/sounds/KDE_Star_Ship_1.ogg
new file mode 100644
index 000000000..daa451531
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Star_Ship_1.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Startup.wav b/kcontrol/knotify/sounds/KDE_Startup.wav
new file mode 100644
index 000000000..7eff53fce
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Startup.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Startup_1.ogg b/kcontrol/knotify/sounds/KDE_Startup_1.ogg
new file mode 100644
index 000000000..2fca9715b
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Startup_1.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Startup_2.ogg b/kcontrol/knotify/sounds/KDE_Startup_2.ogg
new file mode 100644
index 000000000..0c0c7459e
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Startup_2.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Startup_3.ogg b/kcontrol/knotify/sounds/KDE_Startup_3.ogg
new file mode 100644
index 000000000..e1cd9e2a9
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Startup_3.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_TypeWriter_Bell.ogg b/kcontrol/knotify/sounds/KDE_TypeWriter_Bell.ogg
new file mode 100644
index 000000000..090fdfe17
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_TypeWriter_Bell.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_TypeWriter_End_Of_Line.ogg b/kcontrol/knotify/sounds/KDE_TypeWriter_End_Of_Line.ogg
new file mode 100644
index 000000000..80be17f62
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_TypeWriter_End_Of_Line.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_TypeWriter_Key_1.ogg b/kcontrol/knotify/sounds/KDE_TypeWriter_Key_1.ogg
new file mode 100644
index 000000000..5856589a5
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_TypeWriter_Key_1.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_TypeWriter_Key_2.ogg b/kcontrol/knotify/sounds/KDE_TypeWriter_Key_2.ogg
new file mode 100644
index 000000000..fcd143f70
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_TypeWriter_Key_2.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_TypeWriter_Reload.ogg b/kcontrol/knotify/sounds/KDE_TypeWriter_Reload.ogg
new file mode 100644
index 000000000..5258bc4ba
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_TypeWriter_Reload.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_TypeWriter_Scroll.ogg b/kcontrol/knotify/sounds/KDE_TypeWriter_Scroll.ogg
new file mode 100644
index 000000000..906646be6
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_TypeWriter_Scroll.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Vox_Ahem.ogg b/kcontrol/knotify/sounds/KDE_Vox_Ahem.ogg
new file mode 100644
index 000000000..d047942d9
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Vox_Ahem.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Vox_Yo.ogg b/kcontrol/knotify/sounds/KDE_Vox_Yo.ogg
new file mode 100644
index 000000000..3f885ed67
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Vox_Yo.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Warp.ogg b/kcontrol/knotify/sounds/KDE_Warp.ogg
new file mode 100644
index 000000000..de0f06caa
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Warp.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Water_Drop.ogg b/kcontrol/knotify/sounds/KDE_Water_Drop.ogg
new file mode 100644
index 000000000..b92df084f
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Water_Drop.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Close.ogg b/kcontrol/knotify/sounds/KDE_Window_Close.ogg
new file mode 100644
index 000000000..e9cd12878
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Close.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Close.wav b/kcontrol/knotify/sounds/KDE_Window_Close.wav
new file mode 100644
index 000000000..67901a4bf
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Close.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_DeIconify.ogg b/kcontrol/knotify/sounds/KDE_Window_DeIconify.ogg
new file mode 100644
index 000000000..b269594ef
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_DeIconify.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_DeIconify.wav b/kcontrol/knotify/sounds/KDE_Window_DeIconify.wav
new file mode 100644
index 000000000..0ece877d5
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_DeIconify.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Hide.ogg b/kcontrol/knotify/sounds/KDE_Window_Hide.ogg
new file mode 100644
index 000000000..9e625484c
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Hide.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Iconify.ogg b/kcontrol/knotify/sounds/KDE_Window_Iconify.ogg
new file mode 100644
index 000000000..113c2c0d5
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Iconify.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Iconify.wav b/kcontrol/knotify/sounds/KDE_Window_Iconify.wav
new file mode 100644
index 000000000..55b4e4598
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Iconify.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Maximize.wav b/kcontrol/knotify/sounds/KDE_Window_Maximize.wav
new file mode 100644
index 000000000..41771f693
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Maximize.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Open.ogg b/kcontrol/knotify/sounds/KDE_Window_Open.ogg
new file mode 100644
index 000000000..7957c9084
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Open.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Open.wav b/kcontrol/knotify/sounds/KDE_Window_Open.wav
new file mode 100644
index 000000000..d7db787c1
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Open.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Shade_Down.ogg b/kcontrol/knotify/sounds/KDE_Window_Shade_Down.ogg
new file mode 100644
index 000000000..62cd4bb1a
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Shade_Down.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Shade_Down.wav b/kcontrol/knotify/sounds/KDE_Window_Shade_Down.wav
new file mode 100644
index 000000000..59b8ae5ab
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Shade_Down.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Shade_Up.ogg b/kcontrol/knotify/sounds/KDE_Window_Shade_Up.ogg
new file mode 100644
index 000000000..74aae0863
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Shade_Up.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Shade_Up.wav b/kcontrol/knotify/sounds/KDE_Window_Shade_Up.wav
new file mode 100644
index 000000000..a5a31a50c
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Shade_Up.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Sticky.ogg b/kcontrol/knotify/sounds/KDE_Window_Sticky.ogg
new file mode 100644
index 000000000..55c4894b0
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Sticky.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_Sticky.wav b/kcontrol/knotify/sounds/KDE_Window_Sticky.wav
new file mode 100644
index 000000000..b89d383bd
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_Sticky.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_UnHide.ogg b/kcontrol/knotify/sounds/KDE_Window_UnHide.ogg
new file mode 100644
index 000000000..2cdd04d04
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_UnHide.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_UnMaximize.wav b/kcontrol/knotify/sounds/KDE_Window_UnMaximize.wav
new file mode 100644
index 000000000..eb19400fd
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_UnMaximize.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_UnSticky.ogg b/kcontrol/knotify/sounds/KDE_Window_UnSticky.ogg
new file mode 100644
index 000000000..4de9d0ee1
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_UnSticky.ogg
Binary files differ
diff --git a/kcontrol/knotify/sounds/KDE_Window_UnSticky.wav b/kcontrol/knotify/sounds/KDE_Window_UnSticky.wav
new file mode 100644
index 000000000..a5943b9e9
--- /dev/null
+++ b/kcontrol/knotify/sounds/KDE_Window_UnSticky.wav
Binary files differ
diff --git a/kcontrol/knotify/sounds/Makefile.am b/kcontrol/knotify/sounds/Makefile.am
new file mode 100644
index 000000000..0ff4e2468
--- /dev/null
+++ b/kcontrol/knotify/sounds/Makefile.am
@@ -0,0 +1,113 @@
+sounds_data_DATA = \
+ KDE_Beep_Ahem.wav \
+ KDE_Beep_Beep.wav \
+ KDE_Beep_Bottles.wav \
+ KDE_Beep_ClassicBeep.wav \
+ KDE_Beep_ClockChime.wav \
+ KDE_Beep_Connect.wav \
+ KDE_Beep_Door.wav \
+ KDE_Beep_Honk.wav \
+ KDE_Beep_Lightning.wav \
+ KDE_Beep_Pop.wav \
+ KDE_Beep_RimShot.wav \
+ KDE_Beep_RingRing.wav \
+ KDE_Beep_ShortBeep.wav \
+ KDE_Beep_Yo.wav \
+ KDE_Click.wav \
+ KDE_Close_Window.wav \
+ KDE_Critical_Error.wav \
+ KDE_Desktop1.wav \
+ KDE_Desktop2.wav \
+ KDE_Desktop3.wav \
+ KDE_Desktop4.wav \
+ KDE_Desktop5.wav \
+ KDE_Desktop6.wav \
+ KDE_Desktop7.wav \
+ KDE_Desktop8.wav \
+ KDE_Dialog_Appear.wav \
+ KDE_Dialog_Disappear.wav \
+ KDE_Error.wav \
+ KDE_Logout.wav \
+ KDE_Notify.wav \
+ KDE_Startup.wav \
+ KDE_Window_Close.wav \
+ KDE_Window_DeIconify.wav \
+ KDE_Window_Iconify.wav \
+ KDE_Window_Maximize.wav \
+ KDE_Window_Open.wav \
+ KDE_Window_Shade_Down.wav \
+ KDE_Window_Shade_Up.wav \
+ KDE_Window_Sticky.wav \
+ KDE_Window_UnMaximize.wav \
+ KDE_Window_UnSticky.wav \
+ KDE_Beep.ogg \
+ KDE_Beep_Car.ogg \
+ KDE_Beep_Classic.ogg \
+ KDE_Beep_Connect.ogg \
+ KDE_Beep_Digital_1.ogg \
+ KDE_Beep_Digital_2.ogg \
+ KDE_Beep_Double.ogg \
+ KDE_Beep_Harsh.ogg \
+ KDE_Beep_Phone_1.ogg \
+ KDE_Beep_Phone_2.ogg \
+ KDE_Bottles.ogg \
+ KDE_Chimes_1.ogg \
+ KDE_Chimes_2.ogg \
+ KDE_Chimes_3.ogg \
+ KDE_Click_1.ogg \
+ KDE_Click_2.ogg \
+ KDE_Click_3.ogg \
+ KDE_Desktop_1.ogg \
+ KDE_Desktop_2.ogg \
+ KDE_Desktop_3.ogg \
+ KDE_Desktop_4.ogg \
+ KDE_Desktop_5.ogg \
+ KDE_Desktop_6.ogg \
+ KDE_Desktop_7.ogg \
+ KDE_Desktop_8.ogg \
+ KDE_Dialog_Appear.ogg \
+ KDE_Dialog_Disappear.ogg \
+ KDE_Door.ogg \
+ KDE_Drum_Break.ogg \
+ KDE_Error_1.ogg \
+ KDE_Error_2.ogg \
+ KDE_Error_3.ogg \
+ KDE_Event_1.ogg \
+ KDE_Event_2.ogg \
+ KDE_Event_3.ogg \
+ KDE_Event_4.ogg \
+ KDE_Event_5.ogg \
+ KDE_Glass_Break.ogg \
+ KDE_Keyboard_Key_1.ogg \
+ KDE_Logout_1.ogg \
+ KDE_Logout_2.ogg \
+ KDE_Logout_3.ogg \
+ KDE_Pop.ogg \
+ KDE_Star_Ship_1.ogg \
+ KDE_Startup_1.ogg \
+ KDE_Startup_2.ogg \
+ KDE_Startup_3.ogg \
+ KDE_TypeWriter_Bell.ogg \
+ KDE_TypeWriter_End_Of_Line.ogg \
+ KDE_TypeWriter_Key_1.ogg \
+ KDE_TypeWriter_Key_2.ogg \
+ KDE_TypeWriter_Reload.ogg \
+ KDE_TypeWriter_Scroll.ogg \
+ KDE_Vox_Ahem.ogg \
+ KDE_Vox_Yo.ogg \
+ KDE_Warp.ogg \
+ KDE_Water_Drop.ogg \
+ KDE_Window_Close.ogg \
+ KDE_Window_DeIconify.ogg \
+ KDE_Window_Hide.ogg \
+ KDE_Window_Iconify.ogg \
+ KDE_Window_Open.ogg \
+ KDE_Window_Shade_Down.ogg \
+ KDE_Window_Shade_Up.ogg \
+ KDE_Window_Sticky.ogg \
+ KDE_Window_UnHide.ogg \
+ KDE_Window_UnSticky.ogg
+
+sounds_datadir = $(kde_sounddir)
+
+EXTRA_DIST = $(sounds_data_DATA)
diff --git a/kcontrol/konq/Makefile.am b/kcontrol/konq/Makefile.am
new file mode 100644
index 000000000..80bd7591d
--- /dev/null
+++ b/kcontrol/konq/Makefile.am
@@ -0,0 +1,30 @@
+AM_CPPFLAGS = -I$(top_srcdir)/libkonq $(all_includes)
+AM_LDFLAGS = $(all_libraries)
+
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = kcm_konq.la
+
+kcm_konq_la_SOURCES = behaviour.cpp desktop.cpp rootopts.cpp \
+ fontopts.cpp previews.cpp browser.cpp \
+ uiserver.stub main.cpp desktopbehavior_impl.cpp \
+ desktopbehavior.ui
+
+kcm_konq_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_konq_la_LIBADD = $(LIB_KIO) $(LIB_KDEUI) $(LIB_KSYCOCA) $(LIB_KUTILS)
+
+kcm_konq_la_DATA = overlapping.png onlyone.png
+kcm_konq_ladir = $(kde_datadir)/kcontrol/pics
+
+kcmkonq_data_DATA = filebehavior.desktop fileappearance.desktop filepreviews.desktop
+kcmkonq_datadir = $(kde_appsdir)/.hidden
+
+xdg_apps_DATA = desktopbehavior.desktop desktop.desktop desktoppath.desktop filebrowser.desktop
+
+uiserver_DIR = $(kde_includes)/kio
+
+EXTRA_DIST = $(kcm_konq_la_DATA) $(kcmkonq_data_DATA)
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmkonq.pot
+
diff --git a/kcontrol/konq/README b/kcontrol/konq/README
new file mode 100644
index 000000000..11ad5c7b5
--- /dev/null
+++ b/kcontrol/konq/README
@@ -0,0 +1,19 @@
+This module contains a combination of configuration items which at first
+sight seem to be a rather weird combination.
+
+It contains configuration for:
+* KDesktop
+* Konqueror
+* Number of virtual desktops. (Handled by KWin via NETWM)
+* Behaviour of desktop borders (Handled by KWin)
+
+The reason for this combination is that the configuration of KDesktop and
+Konqueror is very similar codewise. On the other hand, the number of virtual
+desktops, border behaviour and the other KDesktop options belongs together
+from a user interface point of view. The result is that all these options
+are now grouped together here.
+
+In total it provide 3 configuration modules:
+* desktop.desktop (Desktop configuration)
+* kcmkonq.desktop (File browser configuration)
+* virtualdesktops.desktop (Configuration of virtual desktops)
diff --git a/kcontrol/konq/behaviour.cpp b/kcontrol/konq/behaviour.cpp
new file mode 100644
index 000000000..4bb782eeb
--- /dev/null
+++ b/kcontrol/konq/behaviour.cpp
@@ -0,0 +1,285 @@
+/**
+ * Copyright (c) 2001 David Faure <david@mandrakesoft.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+// Behaviour options for konqueror
+
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qvbox.h>
+#include <qvbuttongroup.h>
+#include <qvgroupbox.h>
+#include <qwhatsthis.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kio/uiserver_stub.h>
+#include <klocale.h>
+#include <konq_defaults.h>
+#include <kstandarddirs.h>
+#include <kurlrequester.h>
+
+#include "behaviour.h"
+
+KBehaviourOptions::KBehaviourOptions(KConfig *config, QString group, QWidget *parent, const char * )
+ : KCModule(parent, "kcmkonq"), g_pConfig(config), groupname(group)
+{
+ QLabel * label;
+
+ setQuickHelp( i18n("<h1>Konqueror Behavior</h1> You can configure how Konqueror behaves as a file manager here."));
+
+ QVBoxLayout *lay = new QVBoxLayout( this, 0, KDialog::spacingHint() );
+
+ QVGroupBox * miscGb = new QVGroupBox(i18n("Misc Options"), this);
+ lay->addWidget( miscGb );
+ QHBox *hbox = new QHBox(miscGb);
+ QVBox *vbox = new QVBox(hbox);
+
+ // ----
+
+ winPixmap = new QLabel(hbox);
+ winPixmap->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ winPixmap->setPixmap(QPixmap(locate("data",
+ "kcontrol/pics/onlyone.png")));
+ winPixmap->setFixedSize( winPixmap->sizeHint() );
+
+
+ // ----
+
+ cbNewWin = new QCheckBox(i18n("Open folders in separate &windows"), vbox);
+ QWhatsThis::add( cbNewWin, i18n("If this option is checked, Konqueror will open a new window when "
+ "you open a folder, rather than showing that folder's contents in the current window."));
+ connect(cbNewWin, SIGNAL(clicked()), this, SLOT(changed()));
+ connect(cbNewWin, SIGNAL(toggled(bool)), SLOT(updateWinPixmap(bool)));
+
+ // ----
+
+ cbListProgress = new QCheckBox( i18n( "&Show network operations in a single window" ), vbox );
+ connect(cbListProgress, SIGNAL(clicked()), this, SLOT(changed()));
+
+ QWhatsThis::add( cbListProgress, i18n("Checking this option will group the"
+ " progress information for all network file transfers into a single window"
+ " with a list. When the option is not checked, all transfers appear in a"
+ " separate window.") );
+
+
+ // --
+
+ cbShowTips = new QCheckBox( i18n( "Show file &tips" ), vbox );
+ connect(cbShowTips, SIGNAL(clicked()), this, SLOT(changed()));
+
+ QWhatsThis::add( cbShowTips, i18n("Here you can control if, when moving the mouse over a file, you want to see a "
+ "small popup window with additional information about that file"));
+
+ connect(cbShowTips, SIGNAL(toggled(bool)), SLOT(slotShowTips(bool)));
+/*
+ //connect(cbShowTips, SIGNAL(toggled(bool)), sbToolTip, SLOT(setEnabled(bool)));
+ //connect(cbShowTips, SIGNAL(toggled(bool)), fileTips, SLOT(setEnabled(bool)));
+ fileTips->setBuddy(sbToolTip);
+ QString tipstr = i18n("If you move the mouse over a file, you usually see a small popup window that shows some "
+ "additional information about that file. Here, you can set how many items of information "
+ "are displayed");
+ QWhatsThis::add( fileTips, tipstr );
+ QWhatsThis::add( sbToolTip, tipstr );
+*/
+
+ QHBox *hboxpreview = new QHBox(vbox);
+ QWidget* spacer = new QWidget( hboxpreview );
+ spacer->setMinimumSize( 20, 0 );
+ spacer->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Minimum );
+
+ cbShowPreviewsInTips = new QCheckBox( i18n( "Show &previews in file tips" ), hboxpreview );
+ connect(cbShowPreviewsInTips, SIGNAL(clicked()), this, SLOT(changed()));
+
+ QWhatsThis::add( cbShowPreviewsInTips, i18n("Here you can control if you want the "
+ "popup window to contain a larger preview for the file, when moving the mouse over it."));
+
+ cbRenameDirectlyIcon = new QCheckBox(i18n("Rename icons in&line"), vbox);
+ QWhatsThis::add(cbRenameDirectlyIcon, i18n("Checking this option will allow files to be "
+ "renamed by clicking directly on the icon name. "));
+ connect(cbRenameDirectlyIcon, SIGNAL(clicked()), this, SLOT(changed()));
+
+ QHBoxLayout *hlay = new QHBoxLayout( lay );
+
+ label = new QLabel(i18n("Home &URL:"), this);
+ hlay->addWidget( label );
+
+ homeURL = new KURLRequester(this);
+ homeURL->setMode(KFile::Directory);
+ homeURL->setCaption(i18n("Select Home Folder"));
+ hlay->addWidget( homeURL );
+ connect(homeURL, SIGNAL(textChanged(const QString &)), this, SLOT(changed()));
+ label->setBuddy(homeURL);
+
+ QString homestr = i18n("This is the URL (e.g. a folder or a web page) where "
+ "Konqueror will jump to when the \"Home\" button is pressed. "
+ "This is usually your home folder, symbolized by a 'tilde' (~).");
+ QWhatsThis::add( label, homestr );
+ QWhatsThis::add( homeURL, homestr );
+
+ lay->addItem(new QSpacerItem(0,20,QSizePolicy::Fixed,QSizePolicy::Fixed));
+
+ cbShowDeleteCommand = new QCheckBox( i18n( "Show 'Delete' context me&nu entries which bypass the trashcan" ), this );
+ lay->addWidget( cbShowDeleteCommand );
+ connect(cbShowDeleteCommand, SIGNAL(clicked()), this, SLOT(changed()));
+
+ QWhatsThis::add( cbShowDeleteCommand, i18n("Check this if you want 'Delete' menu commands to be displayed "
+ "on the desktop and in the file manager's context menus. "
+ "You can always delete files by holding the Shift key "
+ "while calling 'Move to Trash'."));
+
+ QButtonGroup *bg = new QVButtonGroup( i18n("Ask Confirmation For"), this );
+ bg->layout()->setSpacing( KDialog::spacingHint() );
+ QWhatsThis::add( bg, i18n("This option tells Konqueror whether to ask"
+ " for a confirmation when you \"delete\" a file."
+ " <ul><li><em>Move To Trash:</em> moves the file to your trash folder,"
+ " from where it can be recovered very easily.</li>"
+ " <li><em>Delete:</em> simply deletes the file.</li>"
+ " </li></ul>") );
+
+ connect(bg, SIGNAL( clicked( int ) ), SLOT( changed() ));
+
+ cbMoveToTrash = new QCheckBox( i18n("&Move to trash"), bg );
+
+ cbDelete = new QCheckBox( i18n("D&elete"), bg );
+
+ lay->addWidget(bg);
+
+ lay->addStretch();
+
+ load();
+}
+
+KBehaviourOptions::~KBehaviourOptions()
+{
+}
+
+void KBehaviourOptions::slotShowTips(bool b)
+{
+// sbToolTip->setEnabled( b );
+ cbShowPreviewsInTips->setEnabled( b );
+// fileTips->setEnabled( b );
+
+}
+
+void KBehaviourOptions::load()
+{
+ load( false );
+}
+
+void KBehaviourOptions::load( bool useDefaults )
+{
+ g_pConfig->setReadDefaults( useDefaults );
+
+ g_pConfig->setGroup( groupname );
+ cbNewWin->setChecked( g_pConfig->readBoolEntry("AlwaysNewWin", false) );
+ updateWinPixmap(cbNewWin->isChecked());
+
+ homeURL->setURL(g_pConfig->readPathEntry("HomeURL", "~"));
+
+ bool stips = g_pConfig->readBoolEntry( "ShowFileTips", true );
+ cbShowTips->setChecked( stips );
+ slotShowTips( stips );
+
+ bool showPreviewsIntips = g_pConfig->readBoolEntry( "ShowPreviewsInFileTips", true );
+ cbShowPreviewsInTips->setChecked( showPreviewsIntips );
+
+ cbRenameDirectlyIcon->setChecked( g_pConfig->readBoolEntry("RenameIconDirectly", DEFAULT_RENAMEICONDIRECTLY ) );
+
+ KConfig globalconfig("kdeglobals", true, false);
+ globalconfig.setGroup( "KDE" );
+ cbShowDeleteCommand->setChecked( globalconfig.readBoolEntry("ShowDeleteCommand", false) );
+
+// if (!stips) sbToolTip->setEnabled( false );
+ if (!stips) cbShowPreviewsInTips->setEnabled( false );
+
+// sbToolTip->setValue( g_pConfig->readNumEntry( "FileTipItems", 6 ) );
+
+ KConfig config("uiserverrc");
+ config.setGroup( "UIServer" );
+
+ cbListProgress->setChecked( config.readBoolEntry( "ShowList", false ) );
+
+ g_pConfig->setGroup( "Trash" );
+ cbMoveToTrash->setChecked( g_pConfig->readBoolEntry("ConfirmTrash", DEFAULT_CONFIRMTRASH) );
+ cbDelete->setChecked( g_pConfig->readBoolEntry("ConfirmDelete", DEFAULT_CONFIRMDELETE) );
+
+ emit changed( useDefaults );
+}
+
+void KBehaviourOptions::defaults()
+{
+ load( true );
+}
+
+void KBehaviourOptions::save()
+{
+ g_pConfig->setGroup( groupname );
+
+ g_pConfig->writeEntry( "AlwaysNewWin", cbNewWin->isChecked() );
+ g_pConfig->writePathEntry( "HomeURL", homeURL->url().isEmpty()? QString("~") : homeURL->url() );
+
+ g_pConfig->writeEntry( "ShowFileTips", cbShowTips->isChecked() );
+ g_pConfig->writeEntry( "ShowPreviewsInFileTips", cbShowPreviewsInTips->isChecked() );
+// g_pConfig->writeEntry( "FileTipsItems", sbToolTip->value() );
+
+ g_pConfig->writeEntry( "RenameIconDirectly", cbRenameDirectlyIcon->isChecked());
+
+ KConfig globalconfig("kdeglobals", false, false);
+ globalconfig.setGroup( "KDE" );
+ globalconfig.writeEntry( "ShowDeleteCommand", cbShowDeleteCommand->isChecked());
+ globalconfig.sync();
+
+ g_pConfig->setGroup( "Trash" );
+ g_pConfig->writeEntry( "ConfirmTrash", cbMoveToTrash->isChecked());
+ g_pConfig->writeEntry( "ConfirmDelete", cbDelete->isChecked());
+ g_pConfig->sync();
+
+ // UIServer setting
+ KConfig config("uiserverrc");
+ config.setGroup( "UIServer" );
+ config.writeEntry( "ShowList", cbListProgress->isChecked() );
+ config.sync();
+ // Tell the running server
+ if ( kapp->dcopClient()->isApplicationRegistered( "kio_uiserver" ) )
+ {
+ UIServer_stub uiserver( "kio_uiserver", "UIServer" );
+ uiserver.setListMode( cbListProgress->isChecked() );
+ }
+
+ // Send signal to konqueror
+ QByteArray data;
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ kapp->dcopClient()->send( "konqueror*", "KonquerorIface", "reparseConfiguration()", data );
+ kapp->dcopClient()->send( "kdesktop", "KDesktopIface", "configure()", data );
+}
+
+void KBehaviourOptions::updateWinPixmap(bool b)
+{
+ if (b)
+ winPixmap->setPixmap(QPixmap(locate("data",
+ "kcontrol/pics/overlapping.png")));
+ else
+ winPixmap->setPixmap(QPixmap(locate("data",
+ "kcontrol/pics/onlyone.png")));
+}
+
+#include "behaviour.moc"
diff --git a/kcontrol/konq/behaviour.h b/kcontrol/konq/behaviour.h
new file mode 100644
index 000000000..9db3a36ba
--- /dev/null
+++ b/kcontrol/konq/behaviour.h
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2001 David Faure <david@mandrakesoft.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __BEHAVIOUR_H__
+#define __BEHAVIOUR_H__
+
+#include <kcmodule.h>
+
+class QCheckBox;
+class QLabel;
+class QRadioButton;
+class QSpinBox;
+class QVButtonGroup;
+
+class KConfig;
+class KURLRequester;
+
+//-----------------------------------------------------------------------------
+
+
+class KBehaviourOptions : public KCModule
+{
+ Q_OBJECT
+public:
+ KBehaviourOptions(KConfig *config, QString group, QWidget *parent=0, const char *name=0);
+ ~KBehaviourOptions();
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+
+protected slots:
+
+ void updateWinPixmap(bool);
+ void slotShowTips(bool);
+private:
+
+ KConfig *g_pConfig;
+ QString groupname;
+
+ QCheckBox *cbNewWin;
+ QCheckBox *cbListProgress;
+
+ QLabel *winPixmap;
+
+ KURLRequester *homeURL;
+
+ QVButtonGroup *bgOneProcess;
+ //QLabel *fileTips;
+ //QSpinBox *sbToolTip;
+ QCheckBox *cbShowTips;
+ QCheckBox *cbShowPreviewsInTips;
+ QCheckBox *cbRenameDirectlyIcon;
+
+ QCheckBox *cbMoveToTrash;
+ QCheckBox *cbDelete;
+ QCheckBox *cbShowDeleteCommand;
+};
+
+#endif // __BEHAVIOUR_H__
diff --git a/kcontrol/konq/browser.cpp b/kcontrol/konq/browser.cpp
new file mode 100644
index 000000000..5ab82579d
--- /dev/null
+++ b/kcontrol/konq/browser.cpp
@@ -0,0 +1,109 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Waldo Bastian <bastian@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qlayout.h>
+#include <qtabwidget.h>
+#include <qfile.h>
+
+#include <klocale.h>
+#include <kdialog.h>
+#include <fixx11h.h>
+#include <kcmoduleloader.h>
+
+#include "behaviour.h"
+#include "fontopts.h"
+#include "previews.h"
+#include "browser.h"
+
+KBrowserOptions::KBrowserOptions(KConfig *config, QString group, QWidget *parent, const char *name)
+ : KCModule( parent, "kcmkonq" )
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ QTabWidget *tab = new QTabWidget(this);
+ layout->addWidget(tab);
+
+ appearance = new KonqFontOptions(config, group, false, tab, name);
+ appearance->layout()->setMargin( KDialog::marginHint() );
+
+ behavior = new KBehaviourOptions(config, group, tab, name);
+ behavior->layout()->setMargin( KDialog::marginHint() );
+
+ previews = new KPreviewOptions(tab, name);
+ previews->layout()->setMargin( KDialog::marginHint() );
+
+ kuick = KCModuleLoader::loadModule("kcmkuick", tab);
+
+ tab->addTab(appearance, i18n("&Appearance"));
+ tab->addTab(behavior, i18n("&Behavior"));
+ tab->addTab(previews, i18n("&Previews && Meta-Data"));
+ if (kuick)
+ {
+ kuick->layout()->setMargin( KDialog::marginHint() );
+ tab->addTab(kuick, i18n("&Quick Copy && Move"));
+ }
+
+ connect(appearance, SIGNAL(changed(bool)), this, SIGNAL(changed(bool)));
+ connect(behavior, SIGNAL(changed(bool)), this, SIGNAL(changed(bool)));
+ connect(previews, SIGNAL(changed(bool)), this, SIGNAL(changed(bool)));
+ if (kuick)
+ connect(kuick, SIGNAL(changed(bool)), this, SIGNAL(changed(bool)));
+
+ connect(tab, SIGNAL(currentChanged(QWidget *)),
+ this, SIGNAL(quickHelpChanged()));
+ m_tab = tab;
+}
+
+void KBrowserOptions::load()
+{
+ appearance->load();
+ behavior->load();
+ previews->load();
+ if (kuick)
+ kuick->load();
+}
+
+void KBrowserOptions::defaults()
+{
+ appearance->defaults();
+ behavior->defaults();
+ previews->defaults();
+ if (kuick)
+ kuick->defaults();
+}
+
+void KBrowserOptions::save()
+{
+ appearance->save();
+ behavior->save();
+ previews->save();
+ if (kuick)
+ kuick->save();
+}
+
+QString KBrowserOptions::quickHelp() const
+{
+ QWidget *w = m_tab->currentPage();
+ if (w->inherits("KCModule"))
+ {
+ KCModule *m = static_cast<KCModule *>(w);
+ return m->quickHelp();
+ }
+ return QString::null;
+}
+
+#include "browser.moc"
diff --git a/kcontrol/konq/browser.h b/kcontrol/konq/browser.h
new file mode 100644
index 000000000..26727de1b
--- /dev/null
+++ b/kcontrol/konq/browser.h
@@ -0,0 +1,50 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Waldo Bastian <bastian@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+
+#ifndef __KBROWSER_OPTIONS_H__
+#define __KBROWSER_OPTIONS_H__
+
+#include <kcmodule.h>
+
+class KConfig;
+class QTabWidget;
+
+//-----------------------------------------------------------------------------
+
+class KBrowserOptions : public KCModule
+{
+ Q_OBJECT
+public:
+ KBrowserOptions(KConfig *config, QString group, QWidget *parent=0, const char *name=0);
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+ virtual QString quickHelp() const;
+
+private:
+
+ KCModule *appearance;
+ KCModule *behavior;
+ KCModule *previews;
+ KCModule *kuick;
+ QTabWidget *m_tab;
+};
+
+#endif
diff --git a/kcontrol/konq/desktop.cpp b/kcontrol/konq/desktop.cpp
new file mode 100644
index 000000000..c2478b587
--- /dev/null
+++ b/kcontrol/konq/desktop.cpp
@@ -0,0 +1,246 @@
+// -*- c-basic-offset: 2 -*-
+/**
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <qlabel.h>
+#include <qgroupbox.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+#include <qcheckbox.h>
+#include <qslider.h>
+
+#include <kapplication.h>
+#include <kglobal.h>
+#include <dcopclient.h>
+#include <klocale.h>
+#include <kdialog.h>
+#include <klineedit.h>
+#include <knuminput.h>
+#include <kconfig.h>
+
+#include <netwm.h>
+
+#include "desktop.h"
+#include "desktop.moc"
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_virtualdesktops(QWidget *parent, const char * /*name*/)
+ {
+ return new KDesktopConfig(parent, "kcmkonq");
+ }
+}
+
+// I'm using lineedits by intention as it makes sence to be able
+// to see all desktop names at the same time. It also makes sense to
+// be able to TAB through those line edits fast. So don't send me mails
+// asking why I did not implement a more intelligent/smaller GUI.
+
+KDesktopConfig::KDesktopConfig(QWidget *parent, const char * /*name*/)
+ : KCModule(parent, "kcmkonq")
+{
+
+ setQuickHelp( i18n("<h1>Multiple Desktops</h1>In this module, you can configure how many virtual desktops you want and how these should be labeled."));
+
+ Q_ASSERT(maxDesktops % 2 == 0);
+
+ QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ // number group
+ QGroupBox *number_group = new QGroupBox(this);
+
+ QHBoxLayout *lay = new QHBoxLayout(number_group,
+ KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ QLabel *label = new QLabel(i18n("N&umber of desktops: "), number_group);
+ _numInput = new KIntNumInput(4, number_group);
+ _numInput->setRange(1, maxDesktops, 1, true);
+ connect(_numInput, SIGNAL(valueChanged(int)), SLOT(slotValueChanged(int)));
+ connect(_numInput, SIGNAL(valueChanged(int)), SLOT( changed() ));
+ label->setBuddy( _numInput );
+ QString wtstr = i18n( "Here you can set how many virtual desktops you want on your KDE desktop. Move the slider to change the value." );
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( _numInput, wtstr );
+
+ lay->addWidget(label);
+ lay->addWidget(_numInput);
+ lay->setStretchFactor( _numInput, 2 );
+
+ layout->addWidget(number_group);
+
+ // name group
+ QGroupBox *name_group = new QGroupBox(i18n("Desktop &Names"), this);
+
+ name_group->setColumnLayout(4, Horizontal);
+
+ for(int i = 0; i < (maxDesktops/2); i++)
+ {
+ _nameLabel[i] = new QLabel(i18n("Desktop %1:").arg(i+1), name_group);
+ _nameInput[i] = new KLineEdit(name_group);
+ _nameLabel[i+(maxDesktops/2)] = new QLabel(i18n("Desktop %1:").arg(i+(maxDesktops/2)+1), name_group);
+ _nameInput[i+(maxDesktops/2)] = new KLineEdit(name_group);
+ QWhatsThis::add( _nameLabel[i], i18n( "Here you can enter the name for desktop %1" ).arg( i+1 ) );
+ QWhatsThis::add( _nameInput[i], i18n( "Here you can enter the name for desktop %1" ).arg( i+1 ) );
+ QWhatsThis::add( _nameLabel[i+(maxDesktops/2)], i18n( "Here you can enter the name for desktop %1" ).arg( i+(maxDesktops/2)+1 ) );
+ QWhatsThis::add( _nameInput[i+(maxDesktops/2)], i18n( "Here you can enter the name for desktop %1" ).arg( i+(maxDesktops/2)+1 ) );
+
+ connect(_nameInput[i], SIGNAL(textChanged(const QString&)),
+ SLOT( changed() ));
+ connect(_nameInput[i+(maxDesktops/2)], SIGNAL(textChanged(const QString&)),
+ SLOT( changed() ));
+ }
+
+ for(int i = 1; i < maxDesktops; i++)
+ setTabOrder( _nameInput[i-1], _nameInput[i] );
+
+ layout->addWidget(name_group);
+
+ _wheelOption = new QCheckBox(i18n("Mouse wheel over desktop background switches desktop"), this);
+ connect(_wheelOption,SIGNAL(toggled(bool)), SLOT( changed() ));
+
+ layout->addWidget(_wheelOption);
+ layout->addStretch(1);
+
+ load();
+}
+
+void KDesktopConfig::load()
+{
+ load( false );
+}
+
+void KDesktopConfig::load( bool useDefaults )
+{
+ // get number of desktops
+ NETRootInfo info( qt_xdisplay(), NET::NumberOfDesktops | NET::DesktopNames );
+ int n = info.numberOfDesktops();
+
+ int konq_screen_number = 0;
+ if (qt_xdisplay())
+ konq_screen_number = DefaultScreen(qt_xdisplay());
+
+ QCString groupname;
+ if (konq_screen_number == 0)
+ groupname = "Desktops";
+ else
+ groupname.sprintf("Desktops-screen-%d", konq_screen_number);
+
+ KConfig * kwinconfig = new KConfig("kwinrc");
+
+ kwinconfig->setReadDefaults( useDefaults );
+
+ kwinconfig->setGroup("Desktops");
+ for(int i = 1; i <= maxDesktops; i++)
+ {
+ QString key_name(QString("Name_") + QString::number(i));
+ QString name = QString::fromUtf8(info.desktopName(i));
+ if (name.isEmpty()) // Get name from configuration if none is set in the WM.
+ {
+ name = kwinconfig->readEntry(key_name, i18n("Desktop %1").arg(i));
+ }
+ _nameInput[i-1]->setText(name);
+
+ // Is this entry immutable or not in the range of configured desktops?
+ _labelImmutable[i - 1] = kwinconfig->entryIsImmutable(key_name);
+ _nameInput[i-1]->setEnabled(i <= n && !_labelImmutable[i - 1]);
+ }
+
+ _numInput->setEnabled(!kwinconfig->entryIsImmutable("Number"));
+
+ delete kwinconfig;
+ kwinconfig = 0;
+
+ QString configfile;
+ if (konq_screen_number == 0)
+ configfile = "kdesktoprc";
+ else
+ configfile.sprintf("kdesktop-screen-%drc", konq_screen_number);
+
+ KConfig *config = new KConfig(configfile, false, false);
+
+ config->setReadDefaults( useDefaults );
+
+ config->setGroup("Mouse Buttons");
+ _wheelOption->setChecked(config->readBoolEntry("WheelSwitchesWorkspace",false));
+
+ _wheelOptionImmutable = config->entryIsImmutable("WheelSwitchesWorkspace");
+
+ if (_wheelOptionImmutable || n<2)
+ _wheelOption->setEnabled( false );
+
+ delete config;
+ config = 0;
+
+ _numInput->setValue(n);
+ emit changed( useDefaults );
+}
+
+void KDesktopConfig::save()
+{
+ NETRootInfo info( qt_xdisplay(), NET::NumberOfDesktops | NET::DesktopNames );
+ // set desktop names
+ for(int i = 1; i <= maxDesktops; i++)
+ {
+ info.setDesktopName(i, (_nameInput[i-1]->text()).utf8());
+ info.activate();
+ }
+ // set number of desktops
+ info.setNumberOfDesktops(_numInput->value());
+ info.activate();
+
+ XSync(qt_xdisplay(), FALSE);
+
+ int konq_screen_number = 0;
+ if (qt_xdisplay())
+ konq_screen_number = DefaultScreen(qt_xdisplay());
+
+ QCString appname;
+ if (konq_screen_number == 0)
+ appname = "kdesktop";
+ else
+ appname.sprintf("kdesktop-screen-%d", konq_screen_number);
+
+ KConfig *config = new KConfig(appname + "rc");
+ config->setGroup("Mouse Buttons");
+ config->writeEntry("WheelSwitchesWorkspace", _wheelOption->isChecked());
+ delete config;
+
+ // Tell kdesktop about the new config file
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ QByteArray data;
+
+ kapp->dcopClient()->send( appname, "KDesktopIface", "configure()", data );
+
+ emit changed(false);
+}
+
+void KDesktopConfig::defaults()
+{
+ load( true );
+}
+
+void KDesktopConfig::slotValueChanged(int n)
+{
+ for(int i = 0; i < maxDesktops; i++)
+ { _nameInput[i]->setEnabled(i < n && !_labelImmutable[i]); }
+ if (!_wheelOptionImmutable)
+ { _wheelOption->setEnabled(n>1); }
+ emit changed(true);
+}
diff --git a/kcontrol/konq/desktop.desktop b/kcontrol/konq/desktop.desktop
new file mode 100644
index 000000000..3e203827e
--- /dev/null
+++ b/kcontrol/konq/desktop.desktop
@@ -0,0 +1,236 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/desktop/index.html#desktop-number
+Icon=desktop
+Exec=kcmshell desktop
+
+
+X-KDE-Library=konq
+X-KDE-FactoryName=ddesktop
+X-KDE-ParentApp=kcontrol
+
+Name=Multiple Desktops
+Name[af]=Veelvuldige Werkskerms
+Name[ar]=أسطح مكتب متعددة
+Name[az]=Masa Üstləri
+Name[be]=Некалькі працоўных сталоў
+Name[bg]=Работни плотове
+Name[bn]=একাধিক ডেস্কটপ
+Name[br]=Lies burev
+Name[bs]=Višestruki desktopi
+Name[ca]=Múltiples escriptoris
+Name[cs]=Virtuální plochy
+Name[csb]=Wiele pùltów
+Name[cy]=Penbyrddau Lluosol
+Name[da]=Flere desktoppe
+Name[de]=Virtuelle Arbeitsflächen
+Name[el]=Πολλαπλές επιφάνειες εργασίας
+Name[eo]=Pluraj tabuloj
+Name[es]=Escritorios múltiples
+Name[et]=Virtuaalsed töölauad
+Name[eu]=Mahaigain anitz
+Name[fa]=رومیزیهای چندگانه
+Name[fi]=Virtuaalityöpöydät
+Name[fr]=Bureaux multiples
+Name[fy]=Firtuele buroblêden
+Name[ga]=Deasca Iomadúla
+Name[gl]=Múltiples Escritórios
+Name[he]=שולחנות עבודה מרובים
+Name[hi]=अनेक डेस्कटॉप
+Name[hr]=Višestruke radne površine
+Name[hu]=Virtuális munkaasztalok
+Name[is]=Sýndarskjáborð
+Name[it]=Desktop multipli
+Name[ja]=デスクトップの数
+Name[ka]=მრავალ დაფიანი რეჟიმი
+Name[kk]=Виртуалды үстелдер
+Name[km]=ផ្ទៃតុ​ច្រើន
+Name[ko]=다중 데스크톱
+Name[lo]=ພື້່ນທີ່ືທຳງານສະເຫມືອນ
+Name[lt]=Daugelis darbastalių
+Name[lv]=Vairākas Darbvirsmas
+Name[mk]=Повеќе површини
+Name[mn]=Виртуал ажлын талбар
+Name[ms]=Berbilang Desktop
+Name[mt]=Desktops Multipli
+Name[nb]=Flere skrivebord
+Name[nds]=Mehr as een Schriefdisch
+Name[ne]=बहुविध डेस्कटप
+Name[nl]=Virtuele bureaubladen
+Name[nn]=Fleire skrivebord
+Name[nso]=Di-Desktop tsa Bontshi
+Name[pa]=ਬਹੁ ਵੇਹੜਾ
+Name[pl]=Wiele pulpitów
+Name[pt]=Ecrãs Múltiplos
+Name[pt_BR]=Múltiplas Áreas de Trabalho
+Name[ro]=Ecrane multiple
+Name[ru]=Виртуальные рабочие столы
+Name[rw]=Ibiro Bitandukanye
+Name[se]=Máŋggaid čállinbeavddi
+Name[sk]=Virtuálne pracovné plochy
+Name[sl]=Več namizij
+Name[sr]=Вишеструке радне површине
+Name[sr@Latn]=Višestruke radne površine
+Name[sv]=Flera skrivbord
+Name[ta]=பலவகையான மேல்மேசைகள்
+Name[te]=ఎక్కువ రంగస్థలాలు
+Name[tg]=Мизи кориҳои виртуалӣ
+Name[th]=หลายพื้นที่ทำงาน
+Name[tr]=Çoklu Masaüstü
+Name[tt]=Östäl Sanı
+Name[uk]=Віртуальні стільниці
+Name[uz]=Bir nechta ish stollari
+Name[uz@cyrillic]=Бир нечта иш столлари
+Name[ven]=Desktop nnzhi
+Name[vi]=Nhiều Màn hình nền
+Name[wa]=Multi-sicribannes
+Name[xh]=Desktops Ezininzi
+Name[zh_CN]=多个桌面
+Name[zh_TW]=多重桌面
+Name[zu]=Ama-Desktops amaningi
+
+Comment=You can configure how many virtual desktops there are.
+Comment[af]=Jy kan opstel hoeveel virtuele werkskerms daar is.
+Comment[ar]=يمكنك تحديد كم من الأسطح الوهمية موجودة.
+Comment[az]=Virtual masa üstlərinin sayını quraşdırın.
+Comment[be]=Тут вы можаце змяніць колькасць віртуальных стальніц.
+Comment[bg]=Настройване на работните плотове
+Comment[bn]=কটি ভার্চুয়াল ডেস্কটপ থাকবে কনফিগার করতে পারেন
+Comment[br]=Amañ e c'hellit kefluniañ pet burev galloudel ez eus.
+Comment[bs]=Ovdje možete podesiti broj virtuelnih radnih površina
+Comment[ca]=Podeu configurar quants escriptoris virtuals hi ha d'haver-hi.
+Comment[cs]=Zde je možné nastavit, kolik si přejete virtuálních ploch.
+Comment[csb]=Kònfigùracëjô wielënë wirtualnëch pùltów.
+Comment[cy]=Gallwch ffurfweddu faint o benbyrddau sydd ar gael
+Comment[da]=Her kan du indstille hvor mange virtuelle desktoppe der er.
+Comment[de]=Hier können Sie die Zahl der virtuellen Arbeitsflächen festlegen
+Comment[el]=Μπορείτε να ρυθμίσετε πόσες εικονικές επιφάνειες εργασίας θα υπάρχουν.
+Comment[eo]=Ĉi tie vi povas agordi kiom da virtualaj tabuloj jen estas.
+Comment[es]=Configuración del número de escritorios virtuales.
+Comment[et]=Virtuaalsete töölaudade arvu seadistamine
+Comment[eu]=Mahaigain birtualen kopurua konfigura dezakezu.
+Comment[fa]=می‌توانید پیکربندی کنید چند رومیزی مجازی وجود دارد.
+Comment[fi]=Voit määritelle virtuaalityöpöytien määrän.
+Comment[fr]=Configuration du nombre de bureaux virtuels
+Comment[fy]=Hjir kinne jo fêststelle hoefolle firtuele buroblêden jo brûke wolle.
+Comment[gl]=Pode configurar aqui cantos escritórios virtuais quere empregar.
+Comment[he]=שינוי מספר שולחנות העבודה הווירטואליים
+Comment[hi]=आप कॉन्फ़िगर कर सकते हैं कि वहाँ कितने आभासी डेस्कटॉप हों.
+Comment[hr]=Konfiguriranje broja virtualnih radnih površina
+Comment[hu]=A virtuális munkaasztalok számának beállítása
+Comment[is]=Hér getur þú stillt hversu mörg sýndaskjáborðin eru.
+Comment[it]=Configura quanti desktop virtuali vuoi avere.
+Comment[ja]=仮想デスクトップの数を設定
+Comment[ka]=თქვენ შეგიძლიათ ვირტუალური სამუშაო მაგიდების რაოდენობის კონფიგურაცია
+Comment[kk]=Керек виртуалды үстелдер санын орнату.
+Comment[km]=អ្នក​អាច​កំណត់​រចនាសម្ព័ន្ធ ចំនួន​ផ្ទៃ​តុ​និមិត្ត ។
+Comment[ko]=다중 데스크톱의 개수 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງຖາດພາແນວ ແຖບຫນ້າຕ່າງງານ ໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite nustatyti kiek menamų darbastalių naudoti
+Comment[lv]=Jūs varat konfigurēt cik daudz virtuālo darbvirsmu ir.
+Comment[mk]=Може да конфигурирате колку виртуелни работни површини ќе има.
+Comment[mn]=Энд та виртуал ажилын талбарын тоог тогтоож өгч болно
+Comment[ms]=Anda boleh konfigur berapa banyak desktop maya yang ada.
+Comment[mt]=Hawn tista tikkonfigura kemm ikollok desktops virtwali.
+Comment[nb]=Velg hvor mange virtuelle skrivebord du vil ha.
+Comment[nds]=Du kannst hier instellen, wo vele virtuelle Schriefdischen dat gifft
+Comment[ne]=तपाईँले त्यहाँ भएका अवास्तविक डेस्कटपहरू कन्फिगर गर्न सक्नुहुन्छ ।
+Comment[nl]=U kunt hier bepalen hoeveel virtuele bureaubladen u wilt gebruiken.
+Comment[nn]=Vel kor mange virtuelle skrivebord du vil ha.
+Comment[nso]=Oka beakanya gore gona le di-desktop tse kae tse maatla.
+Comment[pa]=ਤੁਸੀਂ ਸੰਰਚਿਤ ਕਰ ਸਕਦੇ ਹੋ ਕਿ ਕਿੰਨੇ ਫਰਜ਼ੀ ਵੇਹੜੇ ਵੇਖਾਏ ਜਾਣ।
+Comment[pl]=Konfiguracja liczby wirtualnych pulpitów.
+Comment[pt]=O utilizador pode configurar quantos ecrãs virtuais existem.
+Comment[pt_BR]=Você pode configurar aqui quantas áreas de trabalho virtuais existem.
+Comment[ro]=Puteți configura câte ecrane virtuale există.
+Comment[ru]=Настройка количества виртуальных рабочих столов
+Comment[rw]=Ushobora kuboneza ibiro bitaboneka bingahe bihari.
+Comment[se]=Sáhtát heivehit galle virtuella čállinbeavddi dus galgá leat.
+Comment[sk]=Nastavenie počtu virtuálnych plôch.
+Comment[sl]=Tu lahko nastavite število navideznih namizij.
+Comment[sr]=Овде можете подесити колико ће бити виртуелних радних површина.
+Comment[sr@Latn]=Ovde možete podesiti koliko će biti virtuelnih radnih površina.
+Comment[sv]=Anpassa antalet virtuella skrivbord
+Comment[ta]=மெய்நிகர் மேல்மேசைகளின் எண்ணிக்கையை வடிவமைக்கலாம்.
+Comment[tg]=Инҷо метавонед таъдоди мизи кориҳои миҷозии худро таъин кунед.
+Comment[th]=คุณสามารถปรับแต่งจำนวนของพื้นที่ทำงานเสมือนได้ที่นี่
+Comment[tr]=Kaç görsel masaüstüne sahip olacağınızı buradan yapılandırabilirsiniz.
+Comment[tt]=Xıyalí östäl sanın caylaw.
+Comment[uk]=Налаштування кількості віртуальних стільниць.
+Comment[uz]=Bu yerda virtual ish stollarning sonini moslashingiz mumkin
+Comment[uz@cyrillic]=Бу ерда виртуал иш столларнинг сонини мослашингиз мумкин
+Comment[ven]=Ni nga dzudzanya uri ndi desktop ngana dza zwamutshini.
+Comment[vi]=Bạn có thể đặt số màn hình nền ảo ở đây
+Comment[wa]=Vos ploz apontyî chal cobén gn a d' forveyous scribannes
+Comment[xh]=Ungaqwalasela ukuba zizakubangakanani ii desktops ezingabonakaliyo.
+Comment[zh_CN]=可以在这里配置虚拟桌面的数量。
+Comment[zh_TW]=您可以在這裡設定要有多少個虛擬桌面。
+Comment[zu]=Ungahlanganisela ukuthi mangaki ama-desktop angamanga akhona.
+Keywords=desktop,desktops,number,virtual desktop
+Keywords[ar]=سطح المكتب,رقم,سطح مكتب وهمي
+Keywords[az]=masa üstü,Ad,Masa üstü Miqdarı,Masa üstü sayğacı,desktop,virtual
+Keywords[be]=Працоўны стол,Працоўныя сталы,Колькасць,Віртуальны працоўны стол,Віртуальныя працоўныя сталы,desktop,desktops,number,virtual desktop
+Keywords[bg]=работен, плот, брой, виртуален, desktop, number, virtual desktop
+Keywords[br]=burev,burevioù,niver,burev galloudel
+Keywords[bs]=desktop,desktops,number,virtual desktop,desktopi,radna površina
+Keywords[ca]=escriptori,escriptoris,número,escriptori virtual
+Keywords[cs]=Pracovní plocha,Počet,Virtuální plocha,Plocha
+Keywords[csb]=desktop,biurkò,biurka,pùlt,pùltë,wielëna,wirtualné biurkò,wirtualny pùlt
+Keywords[cy]=penbwrdd, penbyrddau,rhif,penbwrdd rhith
+Keywords[da]=desktop,desktoppe,antal,virtuelt desktop
+Keywords[de]=Arbeitsfläche,Desktop,Anzahl,Virtuelle Arbeitsfläche
+Keywords[el]=επιφάνεια εργασίας,επιφάνειες εργασίας,αριθμός,εικονική επιφάνεια εργασίας
+Keywords[eo]=tabulo,tabuloj,nombro,virtuala tabulo
+Keywords[es]=escritorio,escritorios,número,escritorio virtual
+Keywords[et]=töölaud,töölauad,arv,virtuaalne töölaud
+Keywords[eu]=mahaigaina, mahaigainak,zenbakia,mahaigain birtuala
+Keywords[fa]=رومیزی، رومیزیها، تعداد، رومیزی مجازی
+Keywords[fi]=työpöytä,työpöydät,lukumäärä,virtuaalityöpöytä
+Keywords[fr]=bureau,bureaux,numéro,bureaux virtuels
+Keywords[fy]=desktop,buroblêd,buroblêden,namme fan buroblêd,nûmmer,buroblêdtelling,firtuele buroblêden
+Keywords[ga]=deasc,deasca,uimhir,deasc fhíorúil
+Keywords[gl]=escritório,escritórios,número,escritório virtual
+Keywords[he]=שולחן עבודה,שולחנות עבודה,מספר,שולחן עבודה וירטואלי, desktop,desktops,number,virtual desktop
+Keywords[hi]=डेस्कटॉप,डेस्कटॉप्स,संख्या,आभासी डेस्कटॉप
+Keywords[hr]=desktop,desktops,number,virtual desktop,radna površina,broj,virtualna radna površina
+Keywords[hu]=munkaasztal,munkaasztalok,szám,virtuális munkaasztal
+Keywords[is]=skjáborð,nafn,heiti,númer,fjöldi
+Keywords[it]=desktop,nome desktop,numero di desktop,desktop virtuali
+Keywords[ja]=デスクトップ,数,仮想デスクトップ
+Keywords[ka]=სამუშაო მაგიდა,სამუშაო მაგიდები,რიცხვი,ვირტუალური სამუშაო მაგიდა
+Keywords[km]=ផ្ទៃតុ,ចំនួន,ផ្ទៃតុ​និមិត្ត
+Keywords[lt]=desktop,desktops,darbastaliai,number,skaičius,menamas darbastalis
+Keywords[lv]=Darbvirsma,Darbavirsmas,Skaits,virtuālā darbvirsma
+Keywords[mk]=desktop,desktops,number,virtual desktop,работна површина,површина,работни површини,површини,број,виртуелна површина
+Keywords[mn]=Ажлын тавцан,Ажлын тавцан,Тоо,Виртуал ажлын тавцан
+Keywords[ms]=desktop,desktop,bilangan,desktop maya
+Keywords[mt]=desktop,desktops,number,virtual desktop,virtwal,virtwali
+Keywords[nb]=Skrivebord,antall,virtuelt skrivebord
+Keywords[nds]=Schriefdisch,Schriefdischen,Tall,virtuelle Schriefdischen
+Keywords[ne]=डेस्कटप, डेस्कटपहरू, सङ्ख्या, अवास्तविक, डेस्कटप
+Keywords[nl]=desktop,bureaublad,bureaubladen,naam van bureaublad,nummer,bureaubladtelling,virtuele bureaubladen
+Keywords[nn]=skrivebord,nummer,virtuelt skrivebord
+Keywords[pa]=desktop,desktops,number,virtual desktop,ਵੇਹੜੇ,ਗਿਣਤੀ
+Keywords[pl]=desktop,biurko,biurka,pulpit,pulpity,numer,wirtualne biurko,wirtualny pulpit
+Keywords[pt]=ecrã,ambiente de trabalho,número,ecrã virtual
+Keywords[pt_BR]=área de trabalho,número,área de trabalho virtual
+Keywords[ro]=ecran,număr,ecran virtual,afișare,monitor
+Keywords[rw]= Ibiro,ibiro,umubare,ibiro bitagaragara
+Keywords[se]=čállinbeavdi,čállinbeavddit,nummir,virtuella čállinbeavdi
+Keywords[sk]=pracovná plocha,meno,počet plôch,číslo plochy
+Keywords[sl]=namizje,ime,številka,število namizij,navidezno
+Keywords[sr]=desktop,desktops,number,virtual desktop,радна површина,број,виртуелна радна површина
+Keywords[sr@Latn]=desktop,desktops,number,virtual desktop,radna površina,broj,virtuelna radna površina
+Keywords[sv]=skrivbord,antal skrivbord,antal,virtuellt skrivbord
+Keywords[ta]=மேல்மேசை, மேல்மேசைகள்,எண்ணிக்கை,மெய்நிகர் மேல்மேசை
+Keywords[th]=พื้นที่ทำงาน,จำนวน,พื้นที่ทำงานเสมือน
+Keywords[tr]=masaüstü,isim,masaüstü sayısı,sanal masaüstü
+Keywords[uk]=стільниця,стільниці,номер,віртуальна стільниця
+Keywords[uz]=ish stoli,ish stollari,son,virtual ish stoli
+Keywords[uz@cyrillic]=иш столи,иш столлари,сон,виртуал иш столи
+Keywords[vi]=màn hình nền,nhiều màn hình nền,số,màn hình nền ảo
+Keywords[wa]=sicribanne,sicribannes,nombe,forveyou sicribanne,forveyou scribanne
+Keywords[zh_CN]=desktop,desktops,number,virtual desktop,桌面,数量,虚拟桌面
+Keywords[zh_TW]=desktop,number,virtual desktop,桌面,編號,虛擬桌面
+
+Categories=Qt;KDE;X-KDE-settings-desktop;
diff --git a/kcontrol/konq/desktop.h b/kcontrol/konq/desktop.h
new file mode 100644
index 000000000..291d5dd8f
--- /dev/null
+++ b/kcontrol/konq/desktop.h
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __desktop_h__
+#define __desktop_h__
+
+#include <kcmodule.h>
+
+class QSpinBox;
+class QLabel;
+class QCheckBox;
+class KLineEdit;
+class KIntNumInput;
+
+// if you change this, update also the number of keyboard shortcuts in kwin/kwinbindings.cpp
+static const int maxDesktops = 20;
+
+class KDesktopConfig : public KCModule
+{
+ Q_OBJECT
+
+ public:
+ KDesktopConfig(QWidget *parent = 0L, const char *name = 0L);
+
+ void load();
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+
+ protected slots:
+ void slotValueChanged(int);
+
+ private:
+ KIntNumInput *_numInput;
+ QLabel *_nameLabel[maxDesktops];
+ KLineEdit *_nameInput[maxDesktops];
+ QCheckBox *_wheelOption;
+ bool _wheelOptionImmutable;
+ bool _labelImmutable[maxDesktops];
+};
+
+#endif
diff --git a/kcontrol/konq/desktopbehavior.desktop b/kcontrol/konq/desktopbehavior.desktop
new file mode 100644
index 000000000..d20ba1ae1
--- /dev/null
+++ b/kcontrol/konq/desktopbehavior.desktop
@@ -0,0 +1,236 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/desktopbehavior/index.html
+Icon=desktop
+Exec=kcmshell desktopbehavior
+
+
+X-KDE-Library=konq
+X-KDE-FactoryName=dbehavior
+X-KDE-ParentApp=kcontrol
+
+Name=Behavior
+Name[af]=Gedrag
+Name[ar]=السلوك
+Name[az]=Davranış
+Name[be]=Паводзіны
+Name[bg]=Поведение
+Name[bn]=আচরণ
+Name[br]=Emzalc'h
+Name[bs]=Ponašanje
+Name[ca]=Comportament
+Name[cs]=Chování
+Name[csb]=Zachòwanié
+Name[cy]=Ymddygiad
+Name[da]=Opførsel
+Name[de]=Verhalten
+Name[el]=Συμπεριφορά
+Name[en_GB]=Behaviour
+Name[eo]=Konduto
+Name[es]=Comportamiento
+Name[et]=Käitumine
+Name[eu]=Portaera
+Name[fa]=رفتار
+Name[fi]=Käyttäytyminen
+Name[fr]=Comportement
+Name[fy]=Gedrach
+Name[ga]=Oibriú
+Name[gl]=Comportamento
+Name[he]=פעולה
+Name[hi]=बर्ताव
+Name[hr]=Ponašanje
+Name[hu]=Működés
+Name[is]=Hegðun
+Name[it]=Comportamento
+Name[ja]=挙動
+Name[ka]=ქცევა
+Name[kk]=Қасиеттері
+Name[km]=ឥរិយាបថ
+Name[ko]=행동
+Name[lo]=ພຶດຕິກຳຂອງຫນ້າຕ່າງ
+Name[lt]=Elgsena
+Name[lv]=Izturēšanās
+Name[mk]=Однесување
+Name[mn]=Байдал
+Name[ms]=Peri laku
+Name[mt]=Imġieba
+Name[nb]=Oppførsel
+Name[nds]=Bedregen
+Name[ne]=व्यवहार
+Name[nl]=Gedrag
+Name[nn]=Åtferd
+Name[nso]=Maitshwaro
+Name[pa]=ਵਿਹਾਰ
+Name[pl]=Zachowanie
+Name[pt]=Comportamento
+Name[pt_BR]=Comportamento
+Name[ro]=Comportament
+Name[ru]=Поведение
+Name[rw]=Imyitwarire
+Name[se]=Láhtten
+Name[sk]=Správanie
+Name[sl]=Obnašanje
+Name[sr]=Понашање
+Name[sr@Latn]=Ponašanje
+Name[ss]=Kutiphatsa
+Name[sv]=Uppträdande
+Name[ta]= நடத்தை
+Name[te]=ప్రవర్తన
+Name[tg]=Рафтор
+Name[th]=พฤติกรรม
+Name[tr]=Davranış
+Name[tt]=Eşlise eş
+Name[uk]=Поведінка
+Name[uz]=Xususiyatlar
+Name[uz@cyrillic]=Хусусиятлар
+Name[ven]=Maitele
+Name[vi]=Cách hoạt động
+Name[wa]=Dujhance
+Name[xh]=Ukuziphatha
+Name[zh_CN]=行为
+Name[zh_TW]=行為
+Name[zu]=Ukuziphatha
+
+Comment=You can configure how the desktop behaves here
+Comment[af]=Jy kan die werkskerm gedrag hier opstel
+Comment[ar]=هنا يمكنك إعداد سلوك سطح المكتب
+Comment[az]=Masa üstünün davranışını buradan quraşdıra bilərsiniz
+Comment[be]=Тут вы можаце змяніць паводзіны стальніцы
+Comment[bg]=Настройване поведението на работния плот
+Comment[bn]=এখানে ডেস্কটপ-এর আচরণ কনফিগার করতে পারেন
+Comment[br]=Amañ e c'hellit kefluniañ penaos ar vurev en em zalc'h evel ur merour restroù
+Comment[bs]=Ovdje možete podesiti ponašanje radne površine
+Comment[ca]=Aquí podeu configurar com es comportarà l'escriptori
+Comment[cs]=Zde je možné nastavit chování pracovní plochy
+Comment[csb]=Kònfigùracëjô zachòwaniô pùltu
+Comment[cy]=Ffurfweddu ymddygiad y penbwrdd yma
+Comment[da]=Her kan du indstille desktoppens opførsel
+Comment[de]=Hier können Sie das Verhalten der Arbeitsfläche festlegen
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε τη συμπεριφορά της επιφάνειας εργασίας
+Comment[eo]=Vi povas agordi kiel la tabulo kondutas.
+Comment[es]=Configuración del modo de comportamiento del escritorio
+Comment[et]=Siin saad seadistada töölaua käitumist
+Comment[eu]=Mahaigainen portaera konfigura dezakezu hemen
+Comment[fa]=می‌توانید چگونگی رفتار رومیزی را در اینجا پیکربندی کنید.
+Comment[fi]=Tässä kohdassa voit määritellä työpöydän asetuksia
+Comment[fr]=Configuration du comportement du bureau
+Comment[fy]=Hjir kinne jo it gedrach fan jo buroblêd ynstelle
+Comment[gl]=Pode configurar aqui o comportamento do escritório
+Comment[he]=שינוי הגדרות הפעולה של שולחן העבודה
+Comment[hi]=आप कॉन्फ़िगर कर सकते हैं कि डेस्कटॉप कैसा बर्ताव करें
+Comment[hr]=Konfiguriranje načina na koji se radne površine ponašaju
+Comment[hu]=A munkaasztal viselkedésének beállítása
+Comment[is]=Hér getur þú stillt hegðun skjáborða
+Comment[it]=Configura il comportamento del desktop
+Comment[ja]=デスクトップの挙動を設定
+Comment[ka]=სამუშაო დაფის ქცვის კონფიგურაცია
+Comment[kk]=Үстелдің қасиеттерін орнату
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនាសម្ព័ន្ធ​ឥរិយាបថ​របស់​ផ្ទៃតុ
+Comment[ko]=데스크톱의 행동 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງການທຳງານ ຂອງເຄື່ອງມືຈັດການເຊສຊັນໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite konfigūruoti darbastalio elgseną
+Comment[lv]=Šeit jūs varat konfigurēt kā izturas darbvirsma
+Comment[mk]=Тука може да конфигурирате како да се однесува работната површина
+Comment[mn]=Энд та ажлын талбарын байдлыг тогтооно
+Comment[ms]=Anda boleh konfigur bagaimana desktop berkelakuan di sini
+Comment[mt]=Tista' tissettja l-imġieba tad-desktop minn hawn
+Comment[nb]=Tilpass skrivebordets oppførsel her
+Comment[nds]=Du kannst hier instellen, wodennig sik de Schriefdisch bedriggt
+Comment[ne]=तापईँले त्यहाँ भएका डेस्कटपले गर्ने व्यवहार कन्फिगर गर्न सक्नुहुन्छ
+Comment[nl]=Hier kunt u het gedrag van uw desktop instellen
+Comment[nn]=Vel korleis skrivebordet skal oppføra seg
+Comment[nso]=Oka beakanya ka mokgwa wo desktop e phelago ka gona mo
+Comment[pa]=ਤੁਸੀਂ ਸੰਰਚਿਤ ਕਰ ਸਕਦੇ ਹੋ ਕਿ ਵੇਹੜਾ ਵਿਹਾਰ ਕਿਵੇਂ ਕਰੇਗਾ।
+Comment[pl]=Konfiguracja zachowania pulpitu
+Comment[pt]=O utilizador pode configurar aqui como é que o ecrã se comporta
+Comment[pt_BR]=Você pode configurar aqui como o área de trabalho se comporta
+Comment[ro]=Aici configurați modul în care se comportă mediul KDE
+Comment[ru]=Настройка поведения рабочего стола
+Comment[rw]=Ushobora kuboneza ukuntu ibiro byitwara hano
+Comment[se]=Dás sáhtát heivehit mo čállinbeavdi galgá láhttet
+Comment[sk]=Nastavenie správania pracovnej plochy
+Comment[sl]=Tu lahko nastavite obnašanje namizja
+Comment[sr]=Овде можете подесити како ће се понашати радна површина
+Comment[sr@Latn]=Ovde možete podesiti kako će se ponašati radna površina
+Comment[sv]=Anpassa hur skrivbordet beter sig
+Comment[ta]=இங்கே மேல்மேசை எப்படி இயங்குகிறது என்பதை வடிவமைக்க முடியும்.
+Comment[tg]=Инҷо метавонед рафтори мизи кориатонро танзим кунед
+Comment[th]=คุณสามารถปรับแต่งพฤติกรรมของพื้นที่ทำงานได้ที่นี่
+Comment[tr]=Masaüstü davranışını buradan yapılandırabilirsiniz
+Comment[tt]=Östälneñ çağılışın caylaw
+Comment[uk]=Налаштування поведінки стільниці
+Comment[uz]=Bu yerda ish stolining xususiyatlarini moslash mumkin
+Comment[uz@cyrillic]=Бу ерда иш столининг хусусиятларини мослаш мумкин
+Comment[ven]=Ni nga dzudzanya uri na desktop inga difara hani hafhano
+Comment[vi]=Bạn có thề cấu hình cách hoạt động của màn hình nền ở đây
+Comment[wa]=Vos ploz apontyî chal li dujhance do scribanne
+Comment[xh]=Ungaqwalasela ukuziphatha kwe desktop apha
+Comment[zh_CN]=在这里配置桌面行为
+Comment[zh_TW]=您可以在這裡設定桌面的行為
+Comment[zu]=Ungahlanganisela ukuthi idesktop iziphathe kanjanilapha
+Keywords=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,
+Keywords[ar]=konqueror,مسيير الملفات,kfm,التلميحات و النصائح,تلميحات الملف,نافذة منعزلة,spawn windows,السلوك,إستعمال الذاكرة,عنوان المورد النظامي للمنزل
+Keywords[be]=Кіраўнік файлаў,Карысныя парады,Падказкі,Падказкі файлаў,Асобнае акно,Паводзіны,Выкарыстанне памяці,Хатняя тэчка,konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,
+Keywords[bg]=работен, плот, поведение, място, браузър, прозорец, konqueror, filemanager, kfm, tips, file tips, separate window, spawn windows, behavior, behaviour, memory usage, Home URL,
+Keywords[ca]=konqueror,gestor de fitxers,kfm,consells,consells del fitxer,finestra separada,expandir finestres,comportament,us de la memòria, URL d'inici,
+Keywords[cs]=Konqueror,Správce souborů,Kfm,Tipy,Souborové tipy,Rozdílné okno, Chování,Spotřeba paměti,Domovské URL,Domovský adresář
+Keywords[csb]=konqueror,menedżer lopków,kfm,wskôzë,wëdowédzô ò lopkù,apartné òkno, wiele òknów,zachòwanié,brëkòwanié pamiãcë,domôcy URL
+Keywords[cy]=konqueror,rheolydd ffeiliau,kfm,cyngor,cyngor ffeiliau,ffenestr gwahan,taenu ffenestri,ymddygiad,defnydd cof,URL Cartref
+Keywords[da]=konqueror,filhåndtering,kfm,tip,filtip,separat vindue,flere vinduer,opførsel,hukommelsesforbrug,Hjemme-URL,
+Keywords[de]=Konqueror,Dateimanager,kfm,Tipps,Fenster,Verhalten,Persönlicher Ordner,Speicherverwendung
+Keywords[el]=konqueror,διαχειριστής αρχείων,kfm,πληροφορίες,πληροφορίες αρχείων,ξεχωριστό παράθυρο,πολλαπλασιασμός παραθύρων,συμπεριφορά,συμπεριφορά,χρήση μνήμης,URL σπιτιού,
+Keywords[eo]=dosieradministrilo,aparta fenestro,uzata memoro
+Keywords[es]=konqueror,gestor de archivos,kfm,sugerencias,ventana separada, extender ventanas,comportamiento,uso de memoria, URl de inicio,
+Keywords[et]=konqueror,failihaldur,kfm,vihjed,failide vihjed,eraldi aken,käitumine,mälukasutus,kodukataloog
+Keywords[eu]=konqueror,fitxategi kudeatzailea,kfm,iradokizunak,fitxategi iradokizunak, aparteko leihoa,leihoak hedatu,portaera,memoriaren erabilera,Hasierako URLa,
+Keywords[fa]=konqueror، مدیر پرونده، kfm، نکات، نکات پرونده، پنجرۀ مجزا، پنجره‌های تکثیرشده، رفتار، رفتار، کاربرد حافظه، نشانی وب آغازه،
+Keywords[fi]=konqueror,tiedostonhallinta,kfm,vinkit,tiedostovinkit,erillinen ikkuna,käytös,muistinkäyttö,Koti-URL
+Keywords[fr]=konqueror,gestionnaire de fichiers,explorateur,kfm,astuces,fenêtre séparée,rafraîchissement des fenêtres,comportement,utilisation de la mémoire,Home URL,URL de démarrage
+Keywords[fy]=konqueror,filemanager,kfm,tips,knopinfo,arktippen,gedrach,ûnthâldgebrûk,thús,persoanlike map,
+Keywords[gl]=konqueror,xestor de ficheiros,kfm,consellos de ficheiro,fiestra separada,fiestras emerxentes,comportamento,uso da memoria,URL Persoal,
+Keywords[he]=konqueror,מנהל קבצים,kfm,עצות,פירוט לקבצים,חלון נפרד,שימוש בזיכרון,פעולה,כתובת בית, konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL
+Keywords[hi]=कॉन्करर,फ़ाइलमैनेजर,केएफएम,संकेत,फ़ाइल संकेत,अलग विंडो,विंडो बनाएँ,बर्ताव,आचरण,मेमोरी उपयोग,मुख यूआरएल,
+Keywords[hr]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,upravljač datoteka,savjeti datoteka,posebni prozor,pojavljujući prozor,ponašanje,upotreba memorije,URL početne stranice
+Keywords[hu]=konqueror,fájlkezelő,kfm,tippek,fájltippek,külön ablak,ablakgenerálás,viselkedés,memóriahasználat,saját URL,
+Keywords[is]=konqueror,skráastjóri,kfm,ráð,skráarráð,aðskilin gluggi,margfaldast, gluggar,hegðun,minnisnotkun,heimaslóð,
+Keywords[it]=konqueror,filemanager,kfm,trucchi,file,separa finestre,comportamento,memoria utilizzata,home
+Keywords[ja]=konqueror,ファイルマネージャ,kfm,ツールチップ,個別ウィンドウ, ポップウィンドウ,挙動,メモリ使用量,ホームURL
+Keywords[km]=konqueror,កម្មវិធី​គ្រប់គ្រង​ឯកសារ,kfm,ព័ត៌មាន​ជំនួស,ព័ត៌មាន​ជំនួយ​ឯកសារ,ខណ្ឌចែក​បង្អួច,បង្កើត​បង្អួច,ឥរិយាបថ,ការ​ប្រើ​សតិ,URL ដើម
+Keywords[lt]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL, bylų tvarkyklė, kfm, patarimai, atskiri langai, elgesys, elgsena, atminties naudojimas, namų adresas
+Keywords[lv]=iekarotājs,failumenedžeris,kfm,padoms,failu padomi,atsevišķs logs,spawn windows,izturēšanās,atmiņas izmantošana,Mājas URL,
+Keywords[mk]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,менаџер на датотеки,совети,совети за датотеки,подели го прозорецот, однесување,користење на меморија,Домашно URL,
+Keywords[mn]=Конкюрор,Файл удирдагч,kfm,Зөвлөмж,Цонх,Байдал, Хувийн лавлах,Санах ойн ашиглалт
+Keywords[mt]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,ħjilijiet,pariri,imġieba
+Keywords[nb]=konqueror,filemanager,kfm,tips,file tips,separate vinduer,filbehandler,fil,adskilte vindu,delte vinduer,oppførsel,minnebruk,hjemme-nettadresse
+Keywords[nds]=Konqueror,Dateipleger,kfm,Tipps,Tooltips,egen Finster,Finstern maken,Bedregen,Spiekerverbruuk,Startadress
+Keywords[ne]=कन्क्वेरर, फाइल प्रबन्धक, kfm, टिपहरू, फाइल टिपहरू, फरक सञ्झ्याल, स्पवन सञ्झ्यालहरू, व्यवहार, स्मृति प्रयोग,गृह URL,
+Keywords[nl]=konqueror,filemanager,kfm,tips,knopinfo,tooltips,gedrag,geheugengebruik,home,persoonlijke map,
+Keywords[nn]=Konqueror,filhandsamar,KFM,tips,filtips,eige vindauge,nye vindauge,åtferd,minnebruk,heime-URL
+Keywords[nso]=konqueror,molaodi wa faele,kfm,ditomotsebe,ditomotsebe tsa faele,window yeo e hlaogilego,spawn windows,mekgwa,mekgwa,tshomiso ya kelelo,URL ya gae,
+Keywords[pa]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,ਫਾਇਲ ਮੈਨੇਜਰ,ਸੰਕੇਤ,ਵੱਖਰਾ ਝਰੋਖਾ,ਵਿਹਾਰ,ਮੈਮੋਰੀ ਵਰਤੋਂ,ਕੋਨਕਿਉਰਰ
+Keywords[pl]=konqueror,menedżer plików,kfm,wskazówki,informacja o pliku,osobne okno, mnożące się okna,zachowanie,zużycie zasobów pamięci,odnośnik do kartoteki domowej
+Keywords[pt]=konqueror,gestor de ficheiros,kfm,dicas,dicas de ficheiros,janela separada,comportamento,utilização de memória,URL de base,
+Keywords[pt_BR]=konqueror,gerenciador de arquivos,kfm,dicas,arquivos de dicas,janelas separadas,janelas unidas,comportamento,comportamento,uso de memória,URL local,
+Keywords[ro]=konqueror,manager de fișiere,kfm,sfaturi,ferestre separate,comportament,utilizare memorie,URL Acasă
+Keywords[rw]=Konqueror,mugengadosiye,kfm,inyobora, inyobora y'idosiye, gutandukanya Idirishya,kurema amadirishya,imyitwarire,imyitwarire,ikoresha ry'umwanyabubiko,URL y'Ipaji kwinjira,
+Keywords[se]=konqueror,fiilagieđahalli,kfm,rávvagat,fiilarávvagat,iežaš láse,ođđa láset,láhtten,muitugeavaheapmi,ruoktu-URL
+Keywords[sk]=konqueror,správa súborov,kfm,tipy,oddelené okná,nové okná,správanie,využitie pamäti,domovské URL
+Keywords[sl]=konqueror,upravitelj datotek,upravljalnik,kfm,namigi,namigi datotek,ločeno okno,ustvari okna,obnašanje,poraba pomnilnika,domači URL
+Keywords[sr]=konqueror,filemanager,kfm,форе,форе за фајлове,одвојени прозор,spawn прозори,понашање,искоришћеност меморије,Home URL,
+Keywords[sr@Latn]=konqueror,filemanager,kfm,fore,fore za fajlove,odvojeni prozor,spawn prozori,ponašanje,iskorišćenost memorije,Home URL,
+Keywords[sv]=konqueror,filhanterare,kfm,tips,filtips,särskilt fönster,visa fönster,beteende,minnesanvändning,hemadress
+Keywords[ta]=கான்கொரர்,கோப்பு மேலாளர்,kfm,குறிப்புகள்,கோப்பு குறிப்புகள்,தனி சாளரம்,நீள்வட்ட சாளரம்,நடத்தை,நினைவு பயன்பாடு,வீட்டு வலைப்பின்னல்,
+Keywords[th]=คอนเควอร์เรอร์,จัดการแฟ้ม,kfm,เคล็ดลับ,เคล็ดลับแฟ้ม,แยกหน้าต่าง,หน้าต่างเปิดใหม่,พฤติกรรม,การใช้หน่วยความจำ,ตำแหน่งหลัก,
+Keywords[tr]=konqueror,dosya yöneticisi,kfm,ipuçları,dosya,pencere,davranış,bellek kullanımı,başlangıç
+Keywords[uk]=konqueror,менеджер файлів,kfm,підказки,підказки по файлах,створення вікон,поведінка,використання пам'яті,домашній URL
+Keywords[uz]=konqueror,fayl boshqaruvchisi,kfm,eslatmalar,fayl eslatmalari,alohida oyna,spawn windows,xususiyatlar,xotiradan foydalanish,Uy URL
+Keywords[uz@cyrillic]=konqueror,файл бошқарувчиси,kfm,эслатмалар,файл эслатмалари,алоҳида ойна,spawn windows,хусусиятлар,хотирадан фойдаланиш,Уй URL
+Keywords[ven]=konqueror,mulanguli wa faela,kfm,tsivhudzo,tsivhudzo ya faela,window yo fhandekanaho,spawn windows,maitele,maitele,mashumisele a muhumbulo,Haya URL,
+Keywords[vi]=konqueror,trình quản lý tập tin,kfm,gợi ý,gợi ý tập tin,phân cách cửa sổ,cửa sổ nhỏ,cách hoạt động,các cách hoạt động,bộ nhớ sử dụng,URL Nhà,
+Keywords[wa]=konqueror,manaedjeu d' fitchî,kfm,tips,bon a savu,bon a saveur,purnea metous a pårt,dispårtis purneas,dujhance,eployaedje del memwere,URL Måjhon
+Keywords[xh]=konqueror,umphathi wefayile,kfm,amancam, ifayile amancam,yahlula i window,yenza,windows, ukuziphatha,usebenziso lwenkumbulo,Ekhaya URL,
+Keywords[zh_CN]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,文件管理器,提示,文件提示,拆分窗口,新开窗口,行为,内存使用,主 URL,
+Keywords[zh_TW]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,征服家,檔案管理程式,檔案密訣,分離視窗,產生視窗,行為,記憶體使用量,家 URL,
+Keywords[zu]=konqueror,imenenja yefayela,kfm,amacebo,amacebo efayela,i-window elahlukene,ama-window azelwe,ukuziphatha,ukuziphhatha, ukusetshenziswa kenkumbulo,i-URL yasekhaya,
+
+Categories=Qt;KDE;X-KDE-settings-desktop;
diff --git a/kcontrol/konq/desktopbehavior.ui b/kcontrol/konq/desktopbehavior.ui
new file mode 100644
index 000000000..1632021ef
--- /dev/null
+++ b/kcontrol/konq/desktopbehavior.ui
@@ -0,0 +1,426 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>DesktopBehaviorBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DesktopBehaviorBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>791</width>
+ <height>501</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>behaviorTab</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>General</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>iconsEnabledBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Show icons on desktop</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Uncheck this option if you do not want to have icons on the desktop. Without icons the desktop will be somewhat faster but you will no longer be able to drag files to the desktop.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>vrootBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Allow pro&amp;grams in desktop window</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option if you want to run X11 programs that draw into the desktop such as xsnow, xpenguin or xmountain. If you have problems with applications like netscape that check the root window for running instances, disable this option.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>toolTipBox</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;tooltips</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup" row="3" column="0">
+ <property name="name">
+ <cstring>desktopMenuGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Menu Bar at Top of Screen</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;None</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is selected, there is no menu bar at the top of the screen.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Desktop menu bar</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is selected, there is one menu bar at the top of the screen which shows the desktop menus.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>radioButton1_3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Current application's menu bar (Mac OS-style)</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is selected, applications will not have their menu bar attached to their own window anymore. Instead, there is one menu bar at the top of the screen which shows the menus of the currently active application. You might recognize this behavior from Mac OS.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="4" column="0">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Mouse Button Actions</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>middleLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Middle button:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>leftLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Left button:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>rightLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Right button:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="1">
+ <property name="name">
+ <cstring>rightComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>leftComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="2">
+ <property name="name">
+ <cstring>leftEditButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Edit...</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <property name="name">
+ <cstring>middleComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>middleEditButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Edit...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="2">
+ <property name="name">
+ <cstring>rightEditButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Edit...</string>
+ </property>
+ </widget>
+ <spacer row="0" column="3" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>191</width>
+ <height>80</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <spacer row="5" column="0">
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>File Icons</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>autoLineupIconsBox</cstring>
+ </property>
+ <property name="text">
+ <string>Automatically &amp;line up icons</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option if you want to see your icons automatically aligned to the grid when you move them.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>showHiddenBox</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;hidden files</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;If you check this option, any files in your desktop directory that begin with a period (.) will be shown. Usually, such files contain configuration information, and remain hidden from view.&lt;/p&gt;
+&lt;p&gt;For example, files which are named ".directory" are plain text files which contain information for Konqueror, such as the icon to use in displaying a directory, the order in which files should be sorted, etc. You should not change or delete these files unless you know what you are doing.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="KListView" row="2" column="0">
+ <column>
+ <property name="text">
+ <string>Show Icon Previews For</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>false</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>previewListView</cstring>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select for which types of files you want to enable preview images.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Device Icons</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>enableMediaBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Show device icons:</string>
+ </property>
+ </widget>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Device Types to Display</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>false</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>mediaListView</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Deselect the device types which you do not want to see on the desktop.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>enableMediaBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>mediaListView</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>autoLineupIconsBox</tabstop>
+ <tabstop>showHiddenBox</tabstop>
+ <tabstop>previewListView</tabstop>
+ <tabstop>enableMediaBox</tabstop>
+ <tabstop>mediaListView</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/konq/desktopbehavior_impl.cpp b/kcontrol/konq/desktopbehavior_impl.cpp
new file mode 100644
index 000000000..e8052bfb0
--- /dev/null
+++ b/kcontrol/konq/desktopbehavior_impl.cpp
@@ -0,0 +1,466 @@
+/**
+ * (c) Martin R. Jones 1996
+ * (c) Bernd Wuebben 1998
+ * (c) Christian Tibirna 1998
+ * (c) David Faure 1998, 2000
+ * (c) John Firebaugh 2003
+ *
+ * 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 "desktopbehavior_impl.h"
+
+#include <qlayout.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qcombobox.h>
+#include <qpushbutton.h>
+#include <qbuttongroup.h>
+#include <qtabwidget.h>
+#include <qwhatsthis.h>
+#include <klistview.h>
+#include <kservice.h>
+#include <klocale.h>
+#include <kglobalsettings.h>
+#include <kmimetype.h>
+#include <ktrader.h>
+#include <kapplication.h>
+#include <kcustommenueditor.h>
+#include <dcopclient.h>
+#include <konq_defaults.h> // include default values directly from libkonq
+#include <kipc.h>
+#include <kprotocolinfo.h>
+
+const int customMenu1ID = 5;
+const int customMenu2ID = 6;
+
+DesktopBehaviorModule::DesktopBehaviorModule(KConfig *config, QWidget *parent, const char * )
+ : KCModule( parent, "kcmkonq" )
+{
+ QVBoxLayout* layout = new QVBoxLayout(this);
+ m_behavior = new DesktopBehavior(config, this);
+ layout->addWidget(m_behavior);
+ connect(m_behavior, SIGNAL(changed()), this, SLOT(changed()));
+}
+
+void DesktopBehaviorModule::changed()
+{
+ emit KCModule::changed( true );
+}
+
+class DesktopBehaviorPreviewItem : public QCheckListItem
+{
+public:
+ DesktopBehaviorPreviewItem(DesktopBehavior *rootOpts, QListView *parent,
+ const KService::Ptr &plugin, bool on)
+ : QCheckListItem(parent, plugin->name(), CheckBox),
+ m_rootOpts(rootOpts)
+ {
+ m_pluginName = plugin->desktopEntryName();
+ setOn(on);
+ }
+ DesktopBehaviorPreviewItem(DesktopBehavior *rootOpts, QListView *parent,
+ bool on)
+ : QCheckListItem(parent, i18n("Sound Files"), CheckBox),
+ m_rootOpts(rootOpts)
+ {
+ m_pluginName = "audio/";
+ setOn(on);
+ }
+ const QString &pluginName() const { return m_pluginName; }
+
+protected:
+ virtual void stateChange( bool ) { m_rootOpts->changed(); }
+
+private:
+ DesktopBehavior *m_rootOpts;
+ QString m_pluginName;
+};
+
+
+class DesktopBehaviorMediaItem : public QCheckListItem
+{
+public:
+ DesktopBehaviorMediaItem(DesktopBehavior *rootOpts, QListView *parent,
+ const QString name, const QString mimetype, bool on)
+ : QCheckListItem(parent, name, CheckBox),
+ m_rootOpts(rootOpts),m_mimeType(mimetype){setOn(on);}
+
+ const QString &mimeType() const { return m_mimeType; }
+
+protected:
+ virtual void stateChange( bool ) { m_rootOpts->changed(); }
+
+private:
+ DesktopBehavior *m_rootOpts;
+ QString m_mimeType;
+};
+
+
+static const int choiceCount=7;
+static const char * s_choices[7] = { "", "WindowListMenu", "DesktopMenu", "AppMenu", "BookmarksMenu", "CustomMenu1", "CustomMenu2" };
+
+DesktopBehavior::DesktopBehavior(KConfig *config, QWidget *parent, const char * )
+ : DesktopBehaviorBase( parent, "kcmkonq" ), g_pConfig(config)
+{
+ QString strMouseButton1, strMouseButton3, strButtonTxt1, strButtonTxt3;
+
+ /*
+ * The text on this form depends on the mouse setting, which can be right
+ * or left handed. The outer button functionality is actually swapped
+ *
+ */
+ bool leftHandedMouse = ( KGlobalSettings::mouseSettings().handed == KGlobalSettings::KMouseSettings::LeftHanded);
+
+ m_bHasMedia = KProtocolInfo::isKnownProtocol(QString::fromLatin1("media"));
+
+ connect(desktopMenuGroup, SIGNAL(clicked(int)), this, SIGNAL(changed()));
+ connect(iconsEnabledBox, SIGNAL(clicked()), this, SLOT(enableChanged()));
+ connect(showHiddenBox, SIGNAL(clicked()), this, SIGNAL(changed()));
+ connect(vrootBox, SIGNAL(clicked()), this, SIGNAL(changed()));
+ connect(autoLineupIconsBox, SIGNAL(clicked()), this, SIGNAL(changed()));
+ connect(toolTipBox, SIGNAL(clicked()), this, SIGNAL(changed()));
+
+ strMouseButton1 = i18n("&Left button:");
+ strButtonTxt1 = i18n( "You can choose what happens when"
+ " you click the left button of your pointing device on the desktop:");
+
+ strMouseButton3 = i18n("Right b&utton:");
+ strButtonTxt3 = i18n( "You can choose what happens when"
+ " you click the right button of your pointing device on the desktop:");
+
+ if ( leftHandedMouse )
+ {
+ qSwap(strMouseButton1, strMouseButton3);
+ qSwap(strButtonTxt1, strButtonTxt3);
+ }
+
+ leftLabel->setText( strMouseButton1 );
+ leftLabel->setBuddy( leftComboBox );
+ fillMenuCombo( leftComboBox );
+ connect(leftEditButton, SIGNAL(clicked()), this, SLOT(editButtonPressed()));
+ connect(leftComboBox, SIGNAL(activated(int)), this, SIGNAL(changed()));
+ connect(leftComboBox, SIGNAL(activated(int)), this, SLOT(comboBoxChanged()));
+ QString wtstr = strButtonTxt1 +
+ i18n(" <ul><li><em>No action:</em> as you might guess, nothing happens!</li>"
+ " <li><em>Window list menu:</em> a menu showing all windows on all"
+ " virtual desktops pops up. You can click on the desktop name to switch"
+ " to that desktop, or on a window name to shift focus to that window,"
+ " switching desktops if necessary, and restoring the window if it is"
+ " hidden. Hidden or minimized windows are represented with their names"
+ " in parentheses.</li>"
+ " <li><em>Desktop menu:</em> a context menu for the desktop pops up."
+ " Among other things, this menu has options for configuring the display,"
+ " locking the screen, and logging out of KDE.</li>"
+ " <li><em>Application menu:</em> the \"K\" menu pops up. This might be"
+ " useful for quickly accessing applications if you like to keep the"
+ " panel (also known as \"Kicker\") hidden from view.</li></ul>");
+ QWhatsThis::add( leftLabel, wtstr );
+ QWhatsThis::add( leftComboBox, wtstr );
+
+ middleLabel->setBuddy( middleComboBox );
+ fillMenuCombo( middleComboBox );
+ connect(middleEditButton, SIGNAL(clicked()), this, SLOT(editButtonPressed()));
+ connect(middleComboBox, SIGNAL(activated(int)), this, SIGNAL(changed()));
+ connect(middleComboBox, SIGNAL(activated(int)), this, SLOT(comboBoxChanged()));
+ wtstr = i18n("You can choose what happens when"
+ " you click the middle button of your pointing device on the desktop:"
+ " <ul><li><em>No action:</em> as you might guess, nothing happens!</li>"
+ " <li><em>Window list menu:</em> a menu showing all windows on all"
+ " virtual desktops pops up. You can click on the desktop name to switch"
+ " to that desktop, or on a window name to shift focus to that window,"
+ " switching desktops if necessary, and restoring the window if it is"
+ " hidden. Hidden or minimized windows are represented with their names"
+ " in parentheses.</li>"
+ " <li><em>Desktop menu:</em> a context menu for the desktop pops up."
+ " Among other things, this menu has options for configuring the display,"
+ " locking the screen, and logging out of KDE.</li>"
+ " <li><em>Application menu:</em> the \"K\" menu pops up. This might be"
+ " useful for quickly accessing applications if you like to keep the"
+ " panel (also known as \"Kicker\") hidden from view.</li></ul>");
+ QWhatsThis::add( middleLabel, wtstr );
+ QWhatsThis::add( middleComboBox, wtstr );
+
+ rightLabel->setText( strMouseButton3 );
+ rightLabel->setBuddy( rightComboBox );
+ fillMenuCombo( rightComboBox );
+ connect(rightEditButton, SIGNAL(clicked()), this, SLOT(editButtonPressed()));
+ connect(rightComboBox, SIGNAL(activated(int)), this, SIGNAL(changed()));
+ connect(rightComboBox, SIGNAL(activated(int)), this, SLOT(comboBoxChanged()));
+ wtstr = strButtonTxt3 +
+ i18n(" <ul><li><em>No action:</em> as you might guess, nothing happens!</li>"
+ " <li><em>Window list menu:</em> a menu showing all windows on all"
+ " virtual desktops pops up. You can click on the desktop name to switch"
+ " to that desktop, or on a window name to shift focus to that window,"
+ " switching desktops if necessary, and restoring the window if it is"
+ " hidden. Hidden or minimized windows are represented with their names"
+ " in parentheses.</li>"
+ " <li><em>Desktop menu:</em> a context menu for the desktop pops up."
+ " Among other things, this menu has options for configuring the display,"
+ " locking the screen, and logging out of KDE.</li>"
+ " <li><em>Application menu:</em> the \"K\" menu pops up. This might be"
+ " useful for quickly accessing applications if you like to keep the"
+ " panel (also known as \"Kicker\") hidden from view.</li></ul>");
+ QWhatsThis::add( rightLabel, wtstr );
+ QWhatsThis::add( rightComboBox, wtstr );
+
+ if (m_bHasMedia)
+ {
+ connect(enableMediaBox, SIGNAL(clicked()), this, SLOT(enableChanged()));
+ }
+ else
+ {
+ delete behaviorTab->page(2);
+ }
+
+ load();
+}
+
+void DesktopBehavior::fillMediaListView()
+{
+ mediaListView->clear();
+ mediaListView->setRootIsDecorated(false);
+ KMimeType::List mimetypes = KMimeType::allMimeTypes();
+ QValueListIterator<KMimeType::Ptr> it2(mimetypes.begin());
+ g_pConfig->setGroup( "Media" );
+ enableMediaBox->setChecked(g_pConfig->readBoolEntry("enabled",false));
+ QString excludedMedia=g_pConfig->readEntry("exclude","media/hdd_mounted,media/hdd_unmounted,media/floppy_unmounted,media/cdrom_unmounted,media/floppy5_unmounted");
+ for (; it2 != mimetypes.end(); ++it2) {
+ if ( ((*it2)->name().startsWith("media/")) )
+ {
+ bool ok=excludedMedia.contains((*it2)->name())==0;
+ new DesktopBehaviorMediaItem (this, mediaListView, (*it2)->comment(), (*it2)->name(),ok);
+
+ }
+ }
+}
+
+void DesktopBehavior::saveMediaListView()
+{
+ if (!m_bHasMedia)
+ return;
+
+ g_pConfig->setGroup( "Media" );
+ g_pConfig->writeEntry("enabled",enableMediaBox->isChecked());
+ QStringList exclude;
+ for (DesktopBehaviorMediaItem *it=static_cast<DesktopBehaviorMediaItem *>(mediaListView->firstChild());
+ it; it=static_cast<DesktopBehaviorMediaItem *>(it->nextSibling()))
+ {
+ if (!it->isOn()) exclude << it->mimeType();
+ }
+ g_pConfig->writeEntry("exclude",exclude);
+}
+
+
+void DesktopBehavior::fillMenuCombo( QComboBox * combo )
+{
+ combo->insertItem( i18n("No Action") );
+ combo->insertItem( i18n("Window List Menu") );
+ combo->insertItem( i18n("Desktop Menu") );
+ combo->insertItem( i18n("Application Menu") );
+ combo->insertItem( i18n("Bookmarks Menu") );
+ combo->insertItem( i18n("Custom Menu 1") );
+ combo->insertItem( i18n("Custom Menu 2") );
+}
+
+void DesktopBehavior::load()
+{
+ load( false );
+}
+
+void DesktopBehavior::load( bool useDefaults )
+{
+ g_pConfig->setReadDefaults( useDefaults );
+ g_pConfig->setGroup( "Desktop Icons" );
+ bool bShowHidden = g_pConfig->readBoolEntry("ShowHidden", DEFAULT_SHOW_HIDDEN_ROOT_ICONS);
+ showHiddenBox->setChecked(bShowHidden);
+ //bool bVertAlign = g_pConfig->readBoolEntry("VertAlign", DEFAULT_VERT_ALIGN);
+ KTrader::OfferList plugins = KTrader::self()->query("ThumbCreator");
+ previewListView->clear();
+ QStringList previews = g_pConfig->readListEntry("Preview");
+ for (KTrader::OfferList::ConstIterator it = plugins.begin(); it != plugins.end(); ++it)
+ new DesktopBehaviorPreviewItem(this, previewListView, *it, previews.contains((*it)->desktopEntryName()));
+ new DesktopBehaviorPreviewItem(this, previewListView, previews.contains("audio/"));
+ //
+ g_pConfig->setGroup( "FMSettings" );
+ toolTipBox->setChecked(g_pConfig->readBoolEntry( "ShowFileTips", true ) );
+ g_pConfig->setGroup( "Menubar" );
+ KConfig config( "kdeglobals" );
+ config.setGroup("KDE");
+ bool globalMenuBar = config.readBoolEntry("macStyle", false);
+ bool desktopMenuBar = g_pConfig->readBoolEntry("ShowMenubar", false);
+ if ( globalMenuBar )
+ desktopMenuGroup->setButton( 2 );
+ else if ( desktopMenuBar )
+ desktopMenuGroup->setButton( 1 );
+ else
+ desktopMenuGroup->setButton( 0 );
+ g_pConfig->setGroup( "General" );
+ vrootBox->setChecked( g_pConfig->readBoolEntry( "SetVRoot", false ) );
+ iconsEnabledBox->setChecked( g_pConfig->readBoolEntry( "Enabled", true ) );
+ autoLineupIconsBox->setChecked( g_pConfig->readBoolEntry( "AutoLineUpIcons", false ) );
+
+ //
+ g_pConfig->setGroup( "Mouse Buttons" );
+ QString s;
+ s = g_pConfig->readEntry( "Left", "" );
+ for ( int c = 0 ; c < choiceCount ; c ++ )
+ if (s == s_choices[c])
+ { leftComboBox->setCurrentItem( c ); break; }
+ s = g_pConfig->readEntry( "Middle", "WindowListMenu" );
+ for ( int c = 0 ; c < choiceCount ; c ++ )
+ if (s == s_choices[c])
+ { middleComboBox->setCurrentItem( c ); break; }
+ s = g_pConfig->readEntry( "Right", "DesktopMenu" );
+ for ( int c = 0 ; c < choiceCount ; c ++ )
+ if (s == s_choices[c])
+ { rightComboBox->setCurrentItem( c ); break; }
+
+ comboBoxChanged();
+ if (m_bHasMedia)
+ fillMediaListView();
+ enableChanged();
+}
+
+void DesktopBehavior::defaults()
+{
+ load( true );
+}
+
+
+void DesktopBehavior::save()
+{
+ g_pConfig->setGroup( "Desktop Icons" );
+ g_pConfig->writeEntry("ShowHidden", showHiddenBox->isChecked());
+ QStringList previews;
+ for ( DesktopBehaviorPreviewItem *item = static_cast<DesktopBehaviorPreviewItem *>( previewListView->firstChild() );
+ item;
+ item = static_cast<DesktopBehaviorPreviewItem *>( item->nextSibling() ) )
+ if ( item->isOn() )
+ previews.append( item->pluginName() );
+ g_pConfig->writeEntry( "Preview", previews );
+ g_pConfig->setGroup( "FMSettings" );
+ g_pConfig->writeEntry( "ShowFileTips", toolTipBox->isChecked() );
+ g_pConfig->setGroup( "Menubar" );
+ g_pConfig->writeEntry("ShowMenubar", desktopMenuGroup->selectedId() == 1);
+ KConfig config( "kdeglobals" );
+ config.setGroup("KDE");
+ bool globalMenuBar = desktopMenuGroup->selectedId() == 2;
+ if ( globalMenuBar != config.readBoolEntry("macStyle", false) )
+ {
+ config.writeEntry( "macStyle", globalMenuBar, true, true );
+ config.sync();
+ KIPC::sendMessageAll(KIPC::ToolbarStyleChanged);
+ }
+ g_pConfig->setGroup( "Mouse Buttons" );
+ g_pConfig->writeEntry("Left", s_choices[ leftComboBox->currentItem() ] );
+ g_pConfig->writeEntry("Middle", s_choices[ middleComboBox->currentItem() ]);
+ g_pConfig->writeEntry("Right", s_choices[ rightComboBox->currentItem() ]);
+
+ g_pConfig->setGroup( "General" );
+ g_pConfig->writeEntry( "SetVRoot", vrootBox->isChecked() );
+ g_pConfig->writeEntry( "Enabled", iconsEnabledBox->isChecked() );
+ g_pConfig->writeEntry( "AutoLineUpIcons", autoLineupIconsBox->isChecked() );
+
+ saveMediaListView();
+ g_pConfig->sync();
+
+ // Tell kdesktop about the new config file
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ QByteArray data;
+
+ int konq_screen_number = KApplication::desktop()->primaryScreen();
+ QCString appname;
+ if (konq_screen_number == 0)
+ appname = "kdesktop";
+ else
+ appname.sprintf("kdesktop-screen-%d", konq_screen_number);
+ kapp->dcopClient()->send( appname, "KDesktopIface", "configure()", data );
+ // for the standalone menubar setting
+ kapp->dcopClient()->send( "menuapplet*", "menuapplet", "configure()", data );
+ kapp->dcopClient()->send( "kicker", "kicker", "configureMenubar()", data );
+ kapp->dcopClient()->send( "kwin*", "", "reconfigure()", data );
+}
+
+void DesktopBehavior::enableChanged()
+{
+ bool enabled = iconsEnabledBox->isChecked();
+ behaviorTab->setTabEnabled(behaviorTab->page(1), enabled);
+ vrootBox->setEnabled(enabled);
+
+ if (m_bHasMedia)
+ {
+ behaviorTab->setTabEnabled(behaviorTab->page(2), enabled);
+ enableMediaBox->setEnabled(enabled);
+ mediaListView->setEnabled(enableMediaBox->isChecked());
+ }
+
+ changed();
+}
+
+void DesktopBehavior::comboBoxChanged()
+{
+ int i;
+ i = leftComboBox->currentItem();
+ leftEditButton->setEnabled((i == customMenu1ID) || (i == customMenu2ID));
+ i = middleComboBox->currentItem();
+ middleEditButton->setEnabled((i == customMenu1ID) || (i == customMenu2ID));
+ i = rightComboBox->currentItem();
+ rightEditButton->setEnabled((i == customMenu1ID) || (i == customMenu2ID));
+}
+
+void DesktopBehavior::editButtonPressed()
+{
+ int i = 0;
+ if (sender() == leftEditButton)
+ i = leftComboBox->currentItem();
+ if (sender() == middleEditButton)
+ i = middleComboBox->currentItem();
+ if (sender() == rightEditButton)
+ i = rightComboBox->currentItem();
+
+ QString cfgFile;
+ if (i == customMenu1ID)
+ cfgFile = "kdesktop_custom_menu1";
+ if (i == customMenu2ID)
+ cfgFile = "kdesktop_custom_menu2";
+
+ if (cfgFile.isEmpty())
+ return;
+
+ KCustomMenuEditor editor(this);
+ KConfig cfg(cfgFile, false, false);
+
+ editor.load(&cfg);
+ if (editor.exec())
+ {
+ editor.save(&cfg);
+ cfg.sync();
+ emit changed();
+ }
+}
+
+QString DesktopBehavior::quickHelp() const
+{
+ return i18n("<h1>Behavior</h1>\n"
+ "This module allows you to choose various options\n"
+ "for your desktop, including the way in which icons are arranged and\n"
+ "the pop-up menus associated with clicks of the middle and right mouse\n"
+ "buttons on the desktop.\n"
+ "Use the \"What's This?\" (Shift+F1) to get help on specific options.");
+}
+
+#include "desktopbehavior_impl.moc"
diff --git a/kcontrol/konq/desktopbehavior_impl.h b/kcontrol/konq/desktopbehavior_impl.h
new file mode 100644
index 000000000..0417e8994
--- /dev/null
+++ b/kcontrol/konq/desktopbehavior_impl.h
@@ -0,0 +1,79 @@
+/**
+ * (c) Martin R. Jones 1996
+ * (c) David Faure 1998, 2000
+ * (c) John Firebaugh 2003
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef desktopbehavior_h
+#define desktopbehavior_h
+
+#include "desktopbehavior.h"
+#include <kconfig.h>
+#include <kcmodule.h>
+
+class DesktopBehavior : public DesktopBehaviorBase
+{
+ Q_OBJECT
+public:
+ DesktopBehavior(KConfig *config, QWidget *parent = 0L, const char *name = 0L );
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+ virtual QString quickHelp() const;
+ friend class DesktopBehaviorPreviewItem;
+ friend class DesktopBehaviorMediaItem;
+
+signals:
+ void changed();
+
+private slots:
+ void enableChanged();
+ void comboBoxChanged();
+ void editButtonPressed();
+
+private:
+ KConfig *g_pConfig;
+
+ void fillMediaListView();
+ void saveMediaListView();
+
+ // Combo for the menus
+ void fillMenuCombo( QComboBox * combo );
+
+ typedef enum { NOTHING = 0, WINDOWLISTMENU, DESKTOPMENU, APPMENU, BOOKMARKSMENU=12 } menuChoice;
+ bool m_bHasMedia;
+};
+
+class DesktopBehaviorModule : public KCModule
+{
+ Q_OBJECT
+
+public:
+ DesktopBehaviorModule(KConfig *config, QWidget *parent = 0L, const char *name = 0L );
+ virtual void load() { m_behavior->load(); emit KCModule::changed( false ); }
+ virtual void save() { m_behavior->save(); emit KCModule::changed( false ); }
+ virtual void defaults() { m_behavior->defaults(); emit KCModule::changed( true ); }
+
+private slots:
+ void changed();
+
+private:
+ DesktopBehavior* m_behavior;
+};
+
+#endif
diff --git a/kcontrol/konq/desktoppath.desktop b/kcontrol/konq/desktoppath.desktop
new file mode 100644
index 000000000..d646cbf24
--- /dev/null
+++ b/kcontrol/konq/desktoppath.desktop
@@ -0,0 +1,226 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/desktop/index.html#desktop-desktop-path
+Icon=kfm
+Exec=kcmshell desktoppath
+
+
+X-KDE-Library=konq
+X-KDE-FactoryName=dpath
+X-KDE-ParentApp=kcontrol
+
+Name=Paths
+Name[af]=Soekgidse
+Name[ar]=المسارات
+Name[az]=Cığırlar
+Name[be]=Шляхі
+Name[bg]=Пътища
+Name[bn]=পাথ (Paths)
+Name[br]=Hentoù
+Name[bs]=Putevi
+Name[ca]=Rutes
+Name[cs]=Cesty
+Name[csb]=Stegnë
+Name[cy]=Llwybrau
+Name[da]=Stier
+Name[de]=Pfade
+Name[el]=Κατάλογοι
+Name[eo]=Padoj
+Name[es]=Rutas
+Name[et]=Otsinguteed
+Name[eu]=Bide-izenak
+Name[fa]=مسیرها
+Name[fi]=Polut
+Name[fr]=Emplacements
+Name[fy]=Paden
+Name[ga]=Conairí
+Name[gl]=Camiños
+Name[he]=נתיבים
+Name[hi]=पथ
+Name[hr]=Putanje
+Name[hu]=Elérési utak
+Name[is]=Slóðir
+Name[it]=Percorsi
+Name[ja]=パス
+Name[ka]=ბილიკი
+Name[kk]=Жолдар
+Name[km]=ផ្លូវ
+Name[ko]=경로
+Name[lo]=ຄະນິດສາດ
+Name[lt]=Keliai
+Name[lv]=Ceļi
+Name[mk]=Патеки
+Name[mn]=Замууд
+Name[ms]=Laluan
+Name[nb]=Stier
+Name[nds]=Padden
+Name[ne]=मार्ग
+Name[nl]=Paden
+Name[nn]=Stiar
+Name[nso]=Ditsejana
+Name[pa]=ਮਾਰਗ
+Name[pl]=Ścieżki
+Name[pt]=Localizações
+Name[pt_BR]=Caminhos
+Name[ro]=Căi
+Name[ru]=Пути
+Name[rw]=Inzira
+Name[se]=Bálgát
+Name[sk]=Cesty
+Name[sl]=Poti
+Name[sr]=Путање
+Name[sr@Latn]=Putanje
+Name[ss]=Tindlela
+Name[sv]=Sökvägar
+Name[ta]=பாதைகள்
+Name[te]=దారులు
+Name[tg]=Роҳчаҳо
+Name[th]=เส้นทาง
+Name[tr]=Yollar
+Name[tt]=Yullar
+Name[uk]=Шляхи
+Name[uz]=Yoʻllar
+Name[uz@cyrillic]=Йўллар
+Name[ven]=Ndila
+Name[vi]=Đường dẫn
+Name[wa]=Tchimins
+Name[xh]=Umendo
+Name[zh_CN]=路径
+Name[zh_TW]=路徑
+Name[zu]=Izindlela
+
+Comment=Change the location important files are stored
+Comment[af]=Verander die ligging belangrik lêers word gestoor
+Comment[ar]=غير المكان المستعمل لحفظ الملفات المهمة
+Comment[az]=Vacib faylların saxlandığı yeri dəyişdirin
+Comment[be]=Змена тэчак для захавання важных файлаў
+Comment[bg]=Настройване местоположението на важните файлове
+Comment[bn]=বিভিন্ন গুরুত্বপূর্ণ ফাইল কোন অবস্থানে থাকবে তা পরিবর্তন করুন
+Comment[bs]=Podesite lokacije važnih filtera
+Comment[ca]=Canvia la localització d'on seran desats els fitxers importants
+Comment[cs]=Změna umístění důležitých souborů
+Comment[csb]=Môl trzëmaniô wôżnëch lopków
+Comment[cy]=Newid lle mae ffeiliau pwysig yn cael eu cadw
+Comment[da]=Ændr stedet hvor vigtige filer gemmes
+Comment[de]=Den Ordner für wichtige Dateien ändern
+Comment[el]=Αλλάξτε την τοποθεσία στην οποία αποθηκεύονται σημαντικά αρχεία
+Comment[eo]=Ŝanĝu la lokon, kie oni konservas gravajn dosierojn
+Comment[es]=Cambiar la ubicación de archivos importantes
+Comment[et]=Oluliste failide asukoha muutmine
+Comment[eu]=Aldatu fitxategi inportanteen kokapena
+Comment[fa]=تغییر محل ذخیرۀ پرونده‌های مهم
+Comment[fi]=Tässä kohdassa voit määritellä minne tärkeät tiedostot tallennetaan
+Comment[fr]=Changer l'endroit où les fichiers importants sont stockés
+Comment[fy]=Hjir kinne jo de lokaasje fan it bewarjen fan belangrike triemmen wizigje
+Comment[gl]=Cambiar o lugar onde se gaardan os ficheiro importantes
+Comment[he]=שינוי המיקומים בהם מאוחסנים קבצים חשובים
+Comment[hi]=महत्वपूर्ण फ़ाइलों के रखने का स्थान बदलें
+Comment[hr]=Promijenite lokaciju za smještaj važnih datoteka
+Comment[hu]=Néhány fontosabb elérési utat lehet itt beállítani
+Comment[is]=Breyta staðsetningu mikilvægra skráa
+Comment[it]=Cambia la posizione in cui vengono salvati i file importanti
+Comment[ja]=重要なファイルなどの保存場所を変更
+Comment[ka]=მნიშვნელოვანი ფაილბის გეზის ცვლილება შენახულია
+Comment[kk]=Маңызды файлдар орналасатын орындарын өзгерту
+Comment[km]=ប្ដូរ​ទីតាំង​ដែល​ត្រូវ​ទុក​ឯកសារ​សំខាន់ៗ
+Comment[ko]=중요한 파일이 저장되는 곳 설정
+Comment[lo]=ຕົວກອງການເລືອກຫນ້າ/ການຈັດລະດັບ
+Comment[lt]=Pakeiskite svarbių bylų saugojimo vietą
+Comment[lv]=Mainīt nozīmīgu failu atrašanās vietas
+Comment[mk]=Сменете ја локацијата каде што се чуваат важни датотеки
+Comment[mn]=Чухал файлууд агуулж буй лавлах өөрчилөх
+Comment[ms]=Ubah lokasi fail penting disimpan
+Comment[mt]=Ibdel fejn jiġu miżmuma fajls importanti
+Comment[nb]=Endre plasseringa av viktige filer
+Comment[nds]=Den Oort för wichtige Dateien ännern
+Comment[ne]=महत्वपूर्ण फाइल भण्डारण गरिएको स्थान परिवर्तन गर्नुहोस्
+Comment[nl]=Hier kunt u de locatie voor het opslaan van belangrijke bestanden wijzigen
+Comment[nn]=Endra plasseringa av viktige filer
+Comment[nso]=Fetosa tulo yeo go bolokwago difaele tse bohlokwa
+Comment[pa]=ਜ਼ਰੂਰੀ ਫਾਇਲਾਂ ਸੰਭਾਲਣ ਲਈ ਟਿਕਾਣਾ ਤਬਦੀਲ
+Comment[pl]=Miejsce przechowywania ważnych plików
+Comment[pt]=Alterar as localizações onde os ficheiros importantes estão guardados
+Comment[pt_BR]=Modifica a localização onde importantes arquivos devem ser armazenados
+Comment[ro]=Modifică locația de stocare a fișierelor importante
+Comment[ru]=Пути к важным файлам
+Comment[rw]=Guhindura indanganturo yaho amadosiye ngirakamaro abitswe
+Comment[se]=Rievdat báikkiid gosa dehálaš fiillat bidjut
+Comment[sk]=Zmena umiestnenia dôležitých súborov
+Comment[sl]=Spremenite lokacije shranjenih pomembnih datotek
+Comment[sr]=Промена локације где су смештени битни фајлови
+Comment[sr@Latn]=Promena lokacije gde su smešteni bitni fajlovi
+Comment[sv]=Ändra plats för lagring av viktiga filer
+Comment[ta]=முக்கிய கோப்புகள் சேகரிக்கப்பட்டுள்ள இடத்தை மாற்று
+Comment[tg]=Тариқ барои файлҳои асосӣ
+Comment[th]=เปลี่ยนตำแหน่งที่เก็บแฟ้มที่สำคัญ
+Comment[tr]=Önemli dosyaların kaydedildiği yeri düzenle
+Comment[tt]=İñ kiräk biremnärneñ yullar tözätü
+Comment[uk]=Зміна адреси зберігання важливих файлів
+Comment[uz]=Muhim fayllarning joylashgan joyini oʻzgartirish
+Comment[uz@cyrillic]=Муҳим файлларнинг жойлашган жойини ўзгартириш
+Comment[ven]=Shandukisani fhethu huna dzifaela dza ndeme dza vhulungwa hone
+Comment[vi]=Thay đổi đường dẫn tới các tập tin quan trọng
+Comment[wa]=Candjî l' plaece ki les impôrtants fitchîs sont wårdés
+Comment[xh]=Tshintsha indawo apho zibekwa kona iifayile ezibalulekileyo
+Comment[zh_CN]=更改重要文件存储的位置
+Comment[zh_TW]=改變儲存重要檔案的位置
+Comment[zu]=Shintsha indawo okugcinwe kuyo amafayela abalulekile
+Keywords=konqueror,filemanager,paths,desktop,directories,autostart
+Keywords[ar]=konqueror,مسيير الملفات,المسارات,سطح المكتب,الأدلة,تلقائية بدء التشغيل
+Keywords[be]=Кіраўнік файлаў,Шляхі,Працоўны стол,Тэчкі,Дырэкторыі,Аўтаматычны запуск,Аўтазапуск,Запуск,konqueror,filemanager,paths,desktop,directories,autostart
+Keywords[bg]=път, документи, работен, плот, konqueror, filemanager, paths, desktop, directories, autostart
+Keywords[bs]=konqueror,filemanager,paths,desktop,trash,directories,autostart,datoteke,smeće
+Keywords[ca]=konqueror,gestor de fitxers,rutes,escriptori,directoris,autoinici
+Keywords[cs]=Konqueror,Správce souborů,Cesty,Plocha,Adresáře,Autostart, Automatické spuštění
+Keywords[csb]=konqueror,menedżer lopków,stegnë,biurko,pùlt,katalodżi,automatné zrëszënié
+Keywords[da]=konqueror,filhåndtering,stier,desktop,mapper,autostart
+Keywords[de]=Konqueror,Dateimanager,Pfade,Arbeitsfläche,Mülleimer,Verzeichnisse,Ordner,Autostart
+Keywords[el]=konqueror,διαχειριστής αρχείων,διαδρομές,επιφάνεια εργασίας,απορρίμματα,κατάλογοι,αυτόματη εκκίνηση
+Keywords[eo]=konqueranto,dosieradministrilo,vojoj,labortablo,dosierujoj,aŭtolanĉo
+Keywords[es]=konqueror,gestor de archivos,rutas,escritorio,papelera,directorios,autoinicio
+Keywords[et]=konqueror,failihaldur,otsinguteed,töölaud,kataloogid,autostart
+Keywords[eu]=konqueror,fitxategi kudeatzailea,bide-izenak,mahaigaina,direktorioak,autoabiatu
+Keywords[fa]=konqueror، مدیر پرونده، مسیرها، رومیزی، فهرستهای راهنما، خودآغاز
+Keywords[fi]=konqueror,tiedostonhallinta,polut,työpöytä,kansiot,automaattikäynnistys
+Keywords[fr]=konqueror,gestionnaire de fichiers,explorateur,paths,chemins,emplacements,bureau,dossiers,répertoires,démarrage automatique,autostart
+Keywords[fy]=konqueror,filemanager,bestandsbeheer,triembehear,path,paden,paad,zoekpaden,sykpaden,desktop,bureaublad,buroblêd,trash,prullenbak,jiskefet,directories,triemtafels,mappen,folders,autostart,documenten,dokuminten
+Keywords[ga]=konqueror,bainisteoir comhad,conairí,deasc,comhadlanna
+Keywords[gl]=konqueror,xestor de ficheiros,rotas,escritório,lixo,cartafoles,autoinício
+Keywords[he]=konqueror,מנהל קבצים,נתיבים,שולחן עבודה,אשפה,ספריות,הפעלה אוטומטית, filemanager,paths,desktop,directories,autostart
+Keywords[hr]=konqueror,filemanager,paths,desktop,directories,autostart,upravljač datotekama,putanje,radna površina,mape,automatsko pokretanje
+Keywords[hu]=Konqueror,fájlkezelő,elérési utak,munkaasztal,könyvtárak,automatikus indítás
+Keywords[is]=konqueror,skráastjóri,slóðir,skjáborð,möppur,sjálfræsing
+Keywords[it]=konqueror,filemanager,percorsi,path,desktop,cestino,directory,avvio automatico,gestione file,file
+Keywords[ja]=konqueror,ファイルマネージャ,パス,デスクトップ,ごみ箱,ディレクトリ,自動スタート
+Keywords[km]=konqueror,កម្មវិធី​គ្រប់គ្រង​ឯកសារ,ផ្លូវ,ផ្ទៃតុ,ថត,ចាប់ផ្ដើម​ស្វ័យប្រវត្តិ
+Keywords[lt]=konqueror,filemanager,paths,desktop,directories,autostart, bylų tvarkyklė,keliai,darbastalis,aplankai
+Keywords[mk]=konqueror,filemanager,paths,desktop,trash,directories,autostart,менаџер на датотеки,патеки,работна површина,површина,корпа,именици,директориуми,папки,автостарт
+Keywords[nb]=konqueror,filbehandler,paths,desktop,papirkurv,mapper,autostart,filbehandler,stier,arbeidsflate,søppel,kataloger,skrivebord
+Keywords[nds]=Konqueror,Dateipleger,Padden,Schriefdisch,Orner,Autostart
+Keywords[ne]=कन्क्वेरर, फाइल प्रबन्धक, मार्गहरू, डेस्कटप, डाइरेक्टरीहरू, स्वत: सुरुआत
+Keywords[nl]=konqueror,filemanager,bestandsbeheer,path,paden,zoekpaden,desktop,bureaublad,trash,prullenbak,directories,mappen,folders,autostart,documenten,
+Keywords[nn]=Konqueror,filhandsamar,stigar,skrivebord,mapper,autostart
+Keywords[pa]=autostart,ਕੋਨਕਿਉਰਰ,ਫਾਇਲ ਮੈਨੇਜਰ,ਮਾਰਗ,ਵੇਹੜਾ,ਡਾਇਰੈਕਟਰੀਆਂ
+Keywords[pl]=konqueror,menedżer plików,ścieżki,biurko,pulpit,katalogi,automatyczne uruchamianie
+Keywords[pt]=konqueror,gestor de ficheiros,localizações,ecrã,lixo,directorias,arranque,pastas
+Keywords[pt_BR]=konqueror,gerenciador de arquivos, caminhos,área de trabalho,pastas,auto-início
+Keywords[ro]=konqueror,manager de fișiere,căi,desktop,directoare,autostart
+Keywords[ru]=konqueror,filemanager,paths,desktop,trash,directories,autostart
+Keywords[rw]= Konqueror,mugengadosiye,inzira,ibiro,ububiko,kwitangiza
+Keywords[se]=konqueror,fiilagieđahalli,bálgát,čállinbeavdi,máhpat,autoálggaheapmi
+Keywords[sl]=konqueror,upravitelj datotek,poti,namizje,mape,samodejni zagon
+Keywords[sr]=konqueror,filemanager,paths,desktop,directories,autostart,путање,менаџер,радна,површина,фасцикле
+Keywords[sr@Latn]=konqueror,filemanager,paths,desktop,directories,autostart,putanje,menadžer,radna,površina,fascikle
+Keywords[sv]=konqueror,filhanterare,sökvägar,skrivbord,kataloger,automatisk start
+Keywords[ta]=கான்கொரர்,கோப்பு மேலாளர்,பாதைகள்,மேல்மேசை,அடைவுகள்,தானாகவே தொடங்குதல்
+Keywords[th]=คอนเควอร์เรอร์,ตัวจัดการแฟ้ม,เส้นทาง,พื้นที่ทำงาน,ถังขยะ,ไดเร็กทอรี,เริ่มอัตโนมัติ
+Keywords[tr]=konqueror,dosya yöneticisi,yollar,masaüstü,çöp,dizinler,otomatik başlangıç
+Keywords[uk]=konqueror,менеджер файлів,шляхи,стільниця,смітник,каталоги,автозапуск
+Keywords[uz]=konqueror,fayl boshqaruvchisi,yoʻllar,ish stoli,direktoriyalar,avto-boshlash
+Keywords[uz@cyrillic]=konqueror,файл бошқарувчиси,йўллар,иш столи,директориялар,авто-бошлаш
+Keywords[vi]=konqueror,trình quản lý tập tin,đường dẫn,màn hình nền,thùng rác,thư mục,tự khởi động
+Keywords[wa]=konqueror,manaedjeu d' fitchî,tchimins,sicribanne,ridants,autostart,enonde tot seu
+Keywords[zh_CN]=konqueror,filemanager,paths,desktop,directories,autostart,文件管理器,路径,桌面,目录,自动启动
+Keywords[zh_TW]=konqueror,filemanager,paths,desktop,directories,autostart,征服家,檔案管理程式,路徑,桌面,目錄,自動啟動
+
+Categories=Qt;KDE;X-KDE-settings-system;
diff --git a/kcontrol/konq/fileappearance.desktop b/kcontrol/konq/fileappearance.desktop
new file mode 100644
index 000000000..3c2b8c87b
--- /dev/null
+++ b/kcontrol/konq/fileappearance.desktop
@@ -0,0 +1,234 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/filemanager/index.html
+Icon=kfm
+Exec=kcmshell fileappearance
+
+
+X-KDE-Library=konq
+X-KDE-FactoryName=appearance
+X-KDE-ParentApp=kcontrol
+
+Name=Appearance
+Name[af]=Voorkoms
+Name[ar]=المظهر
+Name[az]=Görünüş
+Name[be]=Вонкавы выгляд
+Name[bg]=Системен панел
+Name[bn]=চেহারা
+Name[br]=Neuziadur
+Name[bs]=Izgled
+Name[ca]=Aparença
+Name[cs]=Vzhled
+Name[csb]=Wëzdrzatk
+Name[cy]=Golwg
+Name[da]=Udseende
+Name[de]=Erscheinungsbild
+Name[el]=Εμφάνιση
+Name[eo]=Aspekto
+Name[es]=Aspecto
+Name[et]=Välimus
+Name[eu]=Itxura
+Name[fa]=ظاهر
+Name[fi]=Ulkonäkö
+Name[fr]=Apparence
+Name[fy]=Uterlik
+Name[ga]=Cuma
+Name[gl]=Apariencia
+Name[he]=מראה
+Name[hi]=शक्ल-सूरत
+Name[hr]=Izgled
+Name[hu]=Megjelenés
+Name[id]=Penampilan
+Name[is]=Útlit
+Name[it]=Aspetto
+Name[ja]=外観
+Name[ka]=გარეგნობა
+Name[kk]=Көрініс
+Name[km]=រូបរាង
+Name[ko]=모양
+Name[lo]=ການປະກົດ
+Name[lt]=Išvaizda
+Name[lv]=Izskats
+Name[mk]=Изглед
+Name[mn]=Харагдалт
+Name[ms]=Rupa
+Name[mt]=Apparenza
+Name[nb]=Utseende
+Name[nds]=Utsehn
+Name[ne]=दृश्य
+Name[nl]=Uiterlijk
+Name[nn]=Utsjånad
+Name[nso]=Ponagalo
+Name[pa]=ਦਿੱਖ
+Name[pl]=Wygląd
+Name[pt]=Aparência
+Name[pt_BR]=Aparência
+Name[ro]=Aspect
+Name[ru]=Внешний вид
+Name[rw]=Imigaragarire
+Name[se]=Fárda
+Name[sk]=Vzhľad
+Name[sl]=Videz
+Name[sr]=Изглед
+Name[sr@Latn]=Izgled
+Name[sv]=Utseende
+Name[ta]=தோற்றம்
+Name[tg]=Намуди зоҳирӣ
+Name[th]=ลักษณะที่ปรากฎ
+Name[tr]=Görünüm
+Name[tt]=Küreneş
+Name[uk]=Вигляд
+Name[uz]=Tashqi koʻrinish
+Name[uz@cyrillic]=Ташқи кўриниш
+Name[ven]=Mbonalelo
+Name[vi]=Diện mạo
+Name[wa]=Rivnance
+Name[xh]=Inkangeleko
+Name[zh_CN]=外观
+Name[zh_TW]=外觀
+Name[zu]=Ukubukeka
+
+Comment=You can configure how Konqueror looks as a file manager here
+Comment[af]=Jy kan hier opstel hoe Konqueror as 'n lêer bestuurder lyk
+Comment[ar]=يمكنك هنا إعداد كيفية ظهور Konqueror كمسيير للملفات
+Comment[az]=Konqueror-un fayl idarəçisi olaraq nəcə görünəcəyini buradan quraşdırın
+Comment[be]=Тут вы можаце змяніць выгляд Konqueror для кіравання файламі
+Comment[bg]=Настройване външния вид на файловия браузър
+Comment[bn]=ফাইল ম্যানেজার হিসাবে কনকরার-এর চেহারা কেমন হবে তা এখানে কনফিগার করতে পারেন
+Comment[br]=Amañ e c'hellit kefluniañ penaos Konqueror az zo gwellet evel a merour restroù
+Comment[bs]=Ovdje možete podesiti kako izgleda Konqueror kao upravitelj datotekama
+Comment[ca]=Aquí podeu configurar com es mostrarà el Konqueror com a gestor de fitxers
+Comment[cs]=Zde je možné nastavit vzhled správce souborů
+Comment[csb]=Kònfigùracëjô wëzdrzatkù Konquerora jakno menadżera lopków
+Comment[cy]=Ffurfweddu golwg Konqueror fel rheolydd ffeiliau
+Comment[da]=Her kan du indstille hvordan Konqueror ser ud som filhåndtering
+Comment[de]=Hier können Sie das Erscheinungsbild von Konqueror als Dateimanager festlegen
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε το πως θα εμφανίζεται το Konqueror ως διαχειριστής αρχείων
+Comment[eo]=Ĉi tie vi povas agordi kiel konkeranto aspektas kiel dosieradministrilo
+Comment[es]=Aquí puede configurar el aspecto de Konqueror como gestor de archivos
+Comment[et]=Konquerori failihalduri välimuse seadistamine
+Comment[eu]=Hemen Konquerorren itxura konfigura dezakezu fitxategi kudeatzaile gisa ari denean
+Comment[fa]=می‌توانید پیکربندی کنید، که اینجا Konqueror به عنوان مدیر پرونده چگونه به نظر می‌رسد.
+Comment[fi]=Tässä kohdassa voit määritellä Konquerorin tiedostonhallinnan ulkonäön asetuksia
+Comment[fr]=Apparence de Konqueror en tant que gestionnaire de fichiers
+Comment[fy]=Hjir kinne jo it uterlik fan Konqueror as triembehearder ynstelle
+Comment[gl]=Pode configurar aqui o xeito en que se mostra Konqueror como xestor de ficheiros
+Comment[he]=שינוי הדרך שבה Konqueror נראה בתור מנהל קבצים
+Comment[hi]=आप कॉन्फ़िगर कर सकते हैं कि कॉन्करर यहाँ फ़ाइल प्रबंधक जैसे कैसे दिखे
+Comment[hr]=Konfiguriranje izgleda Konqueror upravljača datoteka
+Comment[hu]=Itt lehet beállítani a Konqueror fájlkezelő jellemzőit
+Comment[is]=Hér getur þú stillt hvernig Konqueror lítur út sem skráastjóri
+Comment[it]=Configura l'aspetto di Konqueror come gestore dei file
+Comment[ja]=Konqueror ファイルマネージャの外観を設定
+Comment[ka]=Konqueror-ის, როგორც ფაილური მენეჯერის, იერის კონფიგურირება
+Comment[kk]=Konqueror файл менеджер ретінде қолданғандағы көрінісі
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនា​សម្ព័ន្ធ របៀប​ដែល Konqueror មើល​ទៅ​ដូចជា​កម្មវិធី​គ្រប់គ្រង​ឯកសារ
+Comment[ko]=Konqueror의 파일 관리자로서의 모양 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງການທຳງານຂອງເຄື່ອງ ຈັດການເຊສຊັນໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite nustatyti, kaip atrodo Konqueror-bylų tvarkyklė
+Comment[lv]=Šeit jūs varat konfigurēt Iekarotāja izskatu failu pārlūkošanas laikā
+Comment[mk]=Конфигурирајте го изгледот на Konqueror како менаџер на датотеки
+Comment[mn]=Энд та конкюрорын харагдалтыг файл удирдагчийн хувьд тогтоох
+Comment[ms]=Anda boleh konfigur bagaiman rupa Konqueror sebagai pengurus fail di sini
+Comment[mt]=Hawn tista' tikkonfigura kif jidher Konqueror bħala manager tal-fajls
+Comment[nb]=Tilpass hvordan filbehandleren Konqueror skal se ut
+Comment[nds]=Hier kannst Du instellen, wodennig Konqueror as Dateipleger utsehn schall
+Comment[ne]=तपाईँले यहाँ कन्क्वेररले फाइल प्रबन्धकलाई हेर्ने तरिका कन्फिगर गर्न सक्नुहुन्छ
+Comment[nl]=Hier kunt u het uiterlijk van Konqueror als bestandsbeheerder instellen
+Comment[nn]=Her kan du velja korleis filhandsamaren Konqueror skal sjå ut
+Comment[nso]=O swanetse go beakanya ka mokgwa wo Konqueror e bogegago bjale ka molaodi wa faele mo
+Comment[pa]=ਤੁਸੀਂ ਇੱਥੇ ਸੰਰਚਿਤ ਕਰ ਸਕਦੇ ਹੋ ਕਿ ਕੋਨਕਿਉਰਰ ਇੱਕ ਫਾਇਲ ਮੈਨੇਜਰ ਦੇ ਰੂਪ ਵਿੱਚ ਕਿਵੇਂ ਦਿਖਾਈ ਦੇਵੇਗਾ।
+Comment[pl]=Konfiguracja wyglądu Konquerora jako menedżera plików
+Comment[pt]=O utilizador pode configurar aqui a forma como o Konqueror age, como um gestor de ficheiros
+Comment[pt_BR]=Você pode configurar aqui como o Konqueror ficará como gerenciador de arquivos
+Comment[ro]=Configurează aspectul Konqueror ca manager de fișiere
+Comment[ru]=Настройка внешнего вида Konqueror как менеджера файлов
+Comment[rw]=Ushobora kugena ukuntu Konqueror igaragara nka mugengadosiye hano
+Comment[se]=Dás heivehat Konquerora fárdda fiilagieđahallin
+Comment[sk]=Nastavenie vzhľadu Konquerora ako správcu súborov
+Comment[sl]=Nastavitve izgleda Konquerorja kot upravitelja datotek
+Comment[sr]=Овде можете подесити како ће Konqueror као менаџер фајлова да изгледа
+Comment[sr@Latn]=Ovde možete podesiti kako će Konqueror kao menadžer fajlova da izgleda
+Comment[sv]=Anpassa hur Konqueror ser ut som filhanterare
+Comment[ta]=கான்கொரர் கோப்பு மேலாளராக எப்படி தெரிகிறது என்பதை இங்கே வடிவமைக்க முடியும்.
+Comment[tg]= Шумо метавонед зоҳири Konqueror-ро ба унвони мудири файл дар инҷо танзим кунед.
+Comment[th]=คุณสามารถปรับแต่งคอนเควอร์เรอร์ในการเป็นเครื่องมือจัดการแฟ้มได้ที่นี่
+Comment[tr]=Konqueror'un dosya yöneticisi olarak nasıl görüneceğini yapılandırın
+Comment[tt]=Birem idäräçe bularaq eşläwçe Konqueror'nıñ küreneşen caylaw
+Comment[uk]=Тут можна налаштувати вигляд Konqeror, як менеджера сеансу
+Comment[uz]=Konqueror fayl boshqaruvchisi sifatida qanday koʻrinishini moslash
+Comment[uz@cyrillic]=Konqueror файл бошқарувчиси сифатида қандай кўринишини мослаш
+Comment[ven]=Ninga dzudzanya uri na Konqueror i sedzea sa mulanguli wa faela hafhano
+Comment[vi]=Bạn có thể cấu hình ngoại hình của Konqueror trông như nào khi quản lý tập tin ở đây
+Comment[wa]=Chal vos ploz apontyî li rivnance di Konqueror cwand i fwait l' manaedjeu di fitchîs
+Comment[xh]=Ungaqwalasela indlela ebonakala ngoyo i Konqueror njengomphathi wefayile
+Comment[zh_CN]=在这里配置 Konqueror 的文件管理器外观
+Comment[zh_TW]=您可以在這裡設定 Konqueror 做為檔案管理程式的外觀
+Comment[zu]=Ungahlanganisela ukuthi i-konqueror ibukeke kanjani njengemenenja yamafayela lapha
+Keywords=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour
+Keywords[ar]=konqueror,مسيير الملفات,word wrap,wrap,تسطير الأحرف,الشاشة,حجم الملف,البايتات,المحرف,اللون,العرض
+Keywords[az]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,fayl,fayl idarəçisi,rəng,yazı növü,altı cızıqlı
+Keywords[be]=Кіраўнік файлаў,Перанос словаў,Перанос,Падкрэсліванне,Падкрэслены,Паказваць,Памер,Байты,Шрыфт,Колер,konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour
+Keywords[bg]=файлове, файл, управление, браузър, мениджър, konqueror, filemanager,word wrap, wrap, underline, display, filesize, bytes, font, color, colour
+Keywords[ca]=konqueror,gestor de fitxers, ajust de línia,subratllar,mostrar,mida del fitxer,octets,lletra,color,colorit
+Keywords[cs]=Konqueror,Správce souborů,Zalamování,Podtrhávání,Zobrazení,Velikost souboru,Bajty,Písmo,Barva
+Keywords[csb]=konqueror,menedżer lopków,zawijanié wierztów,zawijanié,podsztëchiwanié,wëzdrzatk, miara lopkù,bajtë,fòntë,farwa
+Keywords[cy]=konqueror,rheolydd ffeiliau,lapio geiriau,lapio,tanlinellu,dangos,maint ffeil,beitiau,ffont,lliw
+Keywords[da]=konqueror,filhåndtering,ordombrydning,ombrydning,understreg,vis,filstørrelse,byte,skrifttype,farve
+Keywords[de]=Konqueror,Dateimanager,Zeilenfall,Textumbruch,Unterstreichen,Darstellung,Dateigröße,Schrift,Farbe,Byte
+Keywords[el]=konqueror,διαχειριστής αρχείων,αναδίπλωση λέξεων,αναδίπλωση,υπογράμμιση,προβολή,μέγεθος αρχείου,bytes,γραμματοσειρά,χρώμα,χρώμα
+Keywords[eo]=konkeranto,dosieradministrilo,vidigi,vidigo,dosiera grandeco,bajto,bitoko,okbitaro,tiparo,koloro
+Keywords[es]=konqueror,gestor de archivos, ajuste de línea,subrayar,mostrar,tamaño de archivo,bytes,tipo de letra,color
+Keywords[et]=konqueror,failihaldur,sõnade murdmine,murdmine,allajoonimine,ekraan,faili suurus,baidid,font,värv
+Keywords[eu]=konqueror,fitxategi kudeatzailea,itzulbiratu, egokitu,azpimarratu,pantaila,fitxategi tamaina,byteak,letra-tipoa,kolorea
+Keywords[fa]=konqueror، مدیر پرونده، سطربندی واژه، سطربندی، خط زیر، نمایش، اندازه پرونده، بایتها، قلم، رنگ، رنگ
+Keywords[fi]=konqueror,tiedostonhallinta,sanankatkaisu,alleviivaus,tiedostokoko,tavuja, kirjasin,väri
+Keywords[fr]=konqueror,gestionnaire de fichiers,explorateur,retour à la ligne,soulignement,affichage,taille des fichiers,octets,police,couleur
+Keywords[fy]=konqueror,filemanager,triembehear,word wrap,rigelôfbreking,ûnderstreakje,display,werjefte,filesize,triemgrutte,bytes,fonts,lettertypen,kleur,color
+Keywords[ga]=konqueror,bainisteoir comhad,timfhilleadh focal,timfhilleadh,líne faoi,scáileán,méid comhaid,bearta,cló,clófhoireann,dath
+Keywords[gl]=konqueror,xestor de ficheiros,axuste de palabras,axuste,subliñar,mostrar,tamaño de ficheiro,bites,fonte,cor
+Keywords[he]=konqueror,מנהל קבצים,גלישת שורות,קו תחתון,תצוגה,גודל קובץ,בתים,גופן,צבע, konqueror,filemanager,word wrap, wrap,underline,display,filesize,bytes,font,color,colour
+Keywords[hi]=कॉन्करर,फ़ाइलप्रबंधक,वर्ड रैप,रैप,रेखांकित,प्रकटन,फ़ाइलआकार,बाइट्स,फ़ॉन्ट,रंग
+Keywords[hr]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,upravljač datoteka,omatanje riječi,omatanje,podvlačenje,prikaz,veličina datoteke,bajtovi,font,boja,boje
+Keywords[hu]=konqueror,fájlkezelő,szótördelés,tördelés,aláhúzás,képernyő,fájlméret,bájt,betűtípus,szín,színek
+Keywords[is]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour, litir,línuskipting,skjár,skjáborð,bæt,litur
+Keywords[it]=konqueror,filemanager,a capo,sottolineatura,schermo,dimensione file,byte,caratteri,colori
+Keywords[ja]=konqueror,ファイルマネージャ,ワードラップ,行の折り返し,下線,表示,ファイルサイズ, バイト,フォント,色,カラー
+Keywords[km]=konqueror,កម្មវិធី​គ្រប់គ្រង​ឯកសារ,រុំ​ពាក្យ,រុំ,គូសបន្ទាត់​ក្រោម,បង្ហាញ,ទំហំ​ឯកសារ,បៃ,ពុម្ពអក្សរ,ពណ៌
+Keywords[lt]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,bylų tvarkyklė, žodžių perkėlimas, perkėlimas, pabraukimas, ekranas, bylos dydis, baitai, šriftas,spalva
+Keywords[lv]=iekarotājs,failumenedžeris,vārdu apciršana,apciršana,pasvītrojums,ekrāns,failu izmērs,baiti,fonti,krāsas
+Keywords[mk]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,менаџер на датотеки,прекршување на зборови,прекршување,подвлекување,екран,големина на датотека,бајти,фонт,боја
+Keywords[mn]=Конкюрор,Файл удирдагч,Текст таслах,Доогуур зураас, Дүрслэл,Файлын хэмжээ,Бичиг,Өнгө,Байт
+Keywords[mt]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,manager tal-fajls,daqs,kulur,kuluri
+Keywords[nb]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,filbehandler,tekstbryting,understreket,skjerm,filstørrelse,byter,fonter,farger
+Keywords[nds]=Konqueror,Dateipleger,word wrap,ümbreken,ünnerstreken,Dorstellen,Dateigrött,Bytes,Schriftoort, Klöör, Klören
+Keywords[ne]=कन्क्वेरर, फाइल प्रबन्धक, शब्द बेर्नुहोस्, बेर्नुहोस्, कच, प्रदर्शन गर्नुहोस्, फाइल साइज, बाइट्स, फन्ट, रङ, रङ
+Keywords[nl]=konqueror,filemanager,bestandsbeheer,word wrap,regelafbreking,onderstrepen,display,weergave,filesize,bestandsgrootte,bytes,fonts,lettertypen,kleur,color
+Keywords[nn]=Konqueror,filhandsamar,tekstbryting,linjebryting,bryting,understrek,vis,filstorleik,byte,skrift,farge
+Keywords[nso]=konqueror,molaodi wa faele,tatetso ya faele,tatetso ya mantsu,tatetso,thalelela,pontsho,bogolo bja faele,bytes,fonto,mmala,mmala
+Keywords[pa]=ਕੋਨਕਿਉਰਰ,ਫਾਇਲ ਮੈਨੇਜਰ,ਸ਼ਬਦ ਸਮੇਟੋ,ਸਮੇਟੋ,ਹੇਠਾਂ ਰੇਖਾ,ਫਾਇਲ ਅਕਾਰ,ਬਾਈਟ,ਫੋਂਟ,ਰੰਗ ਝਲਕ
+Keywords[pl]=konqueror,menedżer plików,zawijanie wierszy,zawijanie,podkreślenie,wygląd, rozmiar pliku,bajty,czcionki,kolor
+Keywords[pt]=konqueror,gestor de ficheiros,mudança de linha,mudança,sublinhado,ecrã,tamanho do ficheiro,bytes,tipo de letra,cor
+Keywords[pt_BR]=konqueror,gerenciador de arquivos,quebra de linha, sublinhado, display,tamanho de arquivo,bytes,fonte,cor,cor
+Keywords[ro]=konqueror,manager de fișiere,limitare cuvînt,limitare,subliniere,afișare,mărime fișier,octeți,font,culoare
+Keywords[rw]= Konqueror,mugengadosiye,ifunika ry'ijambo,gufunika,gucaho umurongo,Kugaragaza,inganoidosiye,bayite,imyandikire,ibara,ibara
+Keywords[se]=Konqueror,fiilagieđahalli,linnjádoaddjin,doaddjin,vuolláisárgu,čájet,fiilasturrodat,stávvalat,fonta,ivdni
+Keywords[sk]=konqueror,správa súborov,zalamovanie slov,podčiarknutie,zobrazenie,veľkosť súborov,bajty,písmo,farba
+Keywords[sl]=konqueror,upravitelj datotek,upravljalnik,prelom vrstic,prelom,podčrta,prikaz,velikost datoteke,bajt,pisava,barva
+Keywords[sr]=konqueror,filemanager,преламање текста,преламање,подвлачење,приказ,величина фајла,бајтови,фонт,боја
+Keywords[sr@Latn]=konqueror,filemanager,prelamanje teksta,prelamanje,podvlačenje,prikaz,veličina fajla,bajtovi,font,boja
+Keywords[sv]=konqueror,filhanterare,radbrytning,understreck,visa,filstorlek,byte,teckensnitt,färg
+Keywords[ta]=கான்கொரர்,கோப்பு மேலாளர்,வார்த்தை மடக்கு, மடக்கு,அடிகோடிடு,காட்டு,கோப்பு அளவு,பைட்டுகள்,எழுத்துரு,வண்ணம்,வண்ணம்
+Keywords[th]=คอนเควอร์เรอร์,จัดการแฟ้ม,ตัดคำ,ตัด,ขีดเส้นใต้,แสดงผล,ขนาดแฟ้ม,ไบต์,แบบอักษร,สี
+Keywords[tr]=konqueror,dosya yöneticisi,görünüm,dosya boyu,bayt,yazıtipi,renk
+Keywords[uk]=konqueror,менеджер файлів, переніс файлів,переніс,підкреслення,дисплей, розмір файлів,байти,шрифт,колір
+Keywords[uz]=konqueror,fayl boshqaruvchisi,word wrap,wrap,tagini chizish,koʻrsatish,fayning hajmi,baytlar,shrift,rang
+Keywords[uz@cyrillic]=konqueror,файл бошқарувчиси,word wrap,wrap,тагини чизиш,кўрсатиш,файнинг ҳажми,байтлар,шрифт,ранг
+Keywords[ven]=konqueror,mulanguli wa faela,putela ha fhungo,putela,talela,sumbedza,saizi ya faela, bytes,fontu,muvhala,muvhala
+Keywords[vi]=konqueror,trình quản lý tập tin,bao quanh văn bản,bao quanh,gạch chân,màn hình,cỡ tập tin,số byte,phông chữ,mầu,mầu sắc
+Keywords[wa]=konqueror,manaedjeu di fitchî,sorlignî,håyner,håynaedje,grandeu d' fitchî,bytes,bites,fonte,coleur
+Keywords[xh]=konqueror,umphathi wefayile,songela amagama,songela, yenza umgca ezantsi,bonisa, ubngakanani befayile,bytes,umgca,umbala,umbala
+Keywords[zh_CN]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,文件管理器,自动换行,下划线,显示,文件大小,字节,字体,颜色
+Keywords[zh_TW]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,征服家,檔案管理程式,文字換行,換行,底線,顯示,檔案大小,位元組,字型,顏色
+Keywords[zu]=konqueror,imenenja yamafayela,ukugoqwa kwamafayela, ukugoqwa,dwebela,veza,usayizi ama-byte osayizi wefayela,uhlobo lwamagama, umbala,umbala
diff --git a/kcontrol/konq/filebehavior.desktop b/kcontrol/konq/filebehavior.desktop
new file mode 100644
index 000000000..c57b70a1a
--- /dev/null
+++ b/kcontrol/konq/filebehavior.desktop
@@ -0,0 +1,225 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/filemanager/index.html
+Icon=kfm
+Exec=kcmshell filebehavior
+
+
+X-KDE-Library=konq
+X-KDE-FactoryName=behavior
+X-KDE-ParentApp=kcontrol
+
+Name=Behavior
+Name[af]=Gedrag
+Name[ar]=السلوك
+Name[az]=Davranış
+Name[be]=Паводзіны
+Name[bg]=Поведение
+Name[bn]=আচরণ
+Name[br]=Emzalc'h
+Name[bs]=Ponašanje
+Name[ca]=Comportament
+Name[cs]=Chování
+Name[csb]=Zachòwanié
+Name[cy]=Ymddygiad
+Name[da]=Opførsel
+Name[de]=Verhalten
+Name[el]=Συμπεριφορά
+Name[en_GB]=Behaviour
+Name[eo]=Konduto
+Name[es]=Comportamiento
+Name[et]=Käitumine
+Name[eu]=Portaera
+Name[fa]=رفتار
+Name[fi]=Käyttäytyminen
+Name[fr]=Comportement
+Name[fy]=Gedrach
+Name[ga]=Oibriú
+Name[gl]=Comportamento
+Name[he]=פעולה
+Name[hi]=बर्ताव
+Name[hr]=Ponašanje
+Name[hu]=Működés
+Name[is]=Hegðun
+Name[it]=Comportamento
+Name[ja]=挙動
+Name[ka]=ქცევა
+Name[kk]=Қасиеттері
+Name[km]=ឥរិយាបថ
+Name[ko]=행동
+Name[lo]=ພຶດຕິກຳຂອງຫນ້າຕ່າງ
+Name[lt]=Elgsena
+Name[lv]=Izturēšanās
+Name[mk]=Однесување
+Name[mn]=Байдал
+Name[ms]=Peri laku
+Name[mt]=Imġieba
+Name[nb]=Oppførsel
+Name[nds]=Bedregen
+Name[ne]=व्यवहार
+Name[nl]=Gedrag
+Name[nn]=Åtferd
+Name[nso]=Maitshwaro
+Name[pa]=ਵਿਹਾਰ
+Name[pl]=Zachowanie
+Name[pt]=Comportamento
+Name[pt_BR]=Comportamento
+Name[ro]=Comportament
+Name[ru]=Поведение
+Name[rw]=Imyitwarire
+Name[se]=Láhtten
+Name[sk]=Správanie
+Name[sl]=Obnašanje
+Name[sr]=Понашање
+Name[sr@Latn]=Ponašanje
+Name[ss]=Kutiphatsa
+Name[sv]=Uppträdande
+Name[ta]= நடத்தை
+Name[te]=ప్రవర్తన
+Name[tg]=Рафтор
+Name[th]=พฤติกรรม
+Name[tr]=Davranış
+Name[tt]=Eşlise eş
+Name[uk]=Поведінка
+Name[uz]=Xususiyatlar
+Name[uz@cyrillic]=Хусусиятлар
+Name[ven]=Maitele
+Name[vi]=Cách hoạt động
+Name[wa]=Dujhance
+Name[xh]=Ukuziphatha
+Name[zh_CN]=行为
+Name[zh_TW]=行為
+Name[zu]=Ukuziphatha
+
+Comment=You can configure how Konqueror behaves as a file manager here
+Comment[af]=Jy kan konfigureer hoe Konqueror gedrag as 'n lêer bestuurder hier
+Comment[ar]=يمكنك هنا إعداد سلوك Konqueror كمسيير للملفات
+Comment[az]=Konqueror-un fayl idarəçisi olaraq nəcə davranacağını buradan quraşdırın
+Comment[be]=Тут вы можаце змяніць паводзіны Konqueror для кіравання файламі
+Comment[bg]=Настройване поведението на файловия браузър
+Comment[bn]=ফাইল ম্যানেজার হিসাবে কনকরার-এর আচরণ কেমন হবে তা এখানে কনফিগার করতে পারেন
+Comment[br]=Amañ e c'hellit kefluniañ penaos Konqueror en em zalc'h evel ur merour restroù
+Comment[bs]=Ovdje možete podesiti kako se Konqueror ponaša kao upravitelj datotekama
+Comment[ca]=Aquí podeu configurar com es comportarà el Konqueror com a gestor de fitxers
+Comment[cs]=Zde je možné nastavit správce chování Konqueroru jako správce souborů
+Comment[csb]=Kònfigùracëjô zachòwaniô Konquerora jakno menadżera lopków
+Comment[cy]=Ffurfweddu ymddygiad Konqueror fel rheolydd ffeiliau
+Comment[da]=Her kan du indstille hvordan Konqueror opfører sig som filhåndtering
+Comment[de]=Hier können Sie das Verhalten von Konqueror als Dateimanager festlegen
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε το πως θα συμπεριφέρεται το Konqueror ως διαχειριστής αρχείων
+Comment[eo]=Ĉi tie vi povas agordi kiel konkeranto kondutas kiel dosieradministrilo
+Comment[es]=Aquí puede configurar el comportamiento de Konqueror como gestor de archivos
+Comment[et]=Konquerori failihalduri käitumise seadistamine
+Comment[eu]=Hemen Konquerorren portaera konfigura dezakezu fitxategi kudeatzaile gisa ari denean
+Comment[fa]=می‌توانید در اینجا، چگونگی رفتار Konqueror را به عنوان مدیر پرونده پیکربندی کنید
+Comment[fi]=Tässä kohdassa voit määritellä Konquerorin tiedostonhallinnan asetuksia
+Comment[fr]=Comportement de Konqueror en tant que gestionnaire de fichiers
+Comment[fy]=Hjir kinne jo it gedrach fan Konqueror as triembehearder ynstelle.
+Comment[gl]=Pode configurar aqui o modo en que se comportará Konqueror como xestor de ficheiros
+Comment[he]=שינוי הדרך שבה Konqueror פועל בתור מנהל קבצים
+Comment[hi]=आप कॉन्फ़िगर कर सकते हैं कि कॉन्करर यहाँ फ़ाइल प्रबंधक की तरह कैसे बर्ताव करे
+Comment[hr]=Konfiguriranje načina na koji se Konqueror ponaša kao upravljač datoteka
+Comment[hu]=Itt lehet beállítani a Konqueror fájlkezelő működési jellemzőit
+Comment[is]=Hér getur þú stillt hvernig Konqueror hegðar sér sem skráastjóri
+Comment[it]=Configura il comportamento di Konqueror come gestore dei file
+Comment[ja]=Konqueror ファイルマネージャの挙動を設定
+Comment[ka]=Konqueror-ის, როგორც ფაილური მენეჯერის, ქცევის კონფიგურირება
+Comment[kk]=Konqueror файл менеджер ретінде қолданғандағы қасиеттерін баптау
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនាសម្ព័ន្ធ របៀប​ដែល Konqueror ដើរតួ​ជា​កម្មវិធី​គ្រប់គ្រង​ឯកសារ
+Comment[ko]=Konqueror의 파일 관리자로서의 행동 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງການທຳງານຂອງເຄື່ອງ ຈັດການເຊສຊັນໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite nustatyti, kaip elgiasi Konqueror-bylų tvarkyklė
+Comment[lv]=Šeit jūs varat konfigurēt Iekarotāja izturēšanos failu pārlūkošanas laikā
+Comment[mk]=Конфигурирајте го однесувањето на Konqueror како менаџер на датотеки
+Comment[mn]=Энд та конкюрорын байдлыг файл удирдагчийн хувьд тогтоож
+Comment[ms]=Anda boleh konfigur bagaimana Konqueror berkelakuan sebagai pengurus fail di sini
+Comment[mt]=Hawn tista' tissettja l-imġieba ta' Konqueror bħala manager tal-fajls
+Comment[nb]=Tilpass hvordan Konqueror opptrer som filbehandler
+Comment[nds]=Hier kannst Du instellen, wodennig sik Konqueror as Dateipleger bedregen schall
+Comment[ne]=तपाईँले यहाँ कन्क्वेररले फाइल प्रबन्धकलाई गर्ने व्यवहार कन्फिगर गर्न सक्नुहुन्छ
+Comment[nl]=Hier kunt u het gedrag van Konqueror als bestandsbeheerder instellen.
+Comment[nn]=Her kan du velja korleis filhandsamaren Konqueror skal oppføra seg
+Comment[nso]=Oka beakanya ka fao Konqueror e phelago bjalo ka molaodi wa faele mo
+Comment[pa]=ਤੁਸੀਂ ਇੱਥੇ ਸੰਰਚਿਤ ਕਰ ਸਕਦੇ ਹੋ ਕਿ ਕੋਨਕਿਉਰਰ ਇੱਕ ਫਾਇਲ ਮੈਨੇਜਰ ਦੇ ਰੂਪ ਵਿੱਚ ਕਿਵੇਂ ਵਿਵਹਾਰ ਦੇਵੇਗਾ।
+Comment[pl]=Konfiguracja zachowania Konquerora jako menedżera plików
+Comment[pt]=O utilizador pode configurar aqui como é que o Konqueror se comporta como um gestor de ficheiros
+Comment[pt_BR]=Você pode configurar como o Konqueror se comporta como gerenciador de arquivos aqui
+Comment[ro]=Configurează comportamentul Konqueror ca manager de fișiere
+Comment[ru]=Настройка поведения Konqueror как менеджера файлов
+Comment[rw]=Ushobora kugena ukuntu Konqueror yitwara nka mugengadosiye hano
+Comment[se]=Dás heivehat mo Konqueror fiilagieđahallin galgá láhttet
+Comment[sk]=Nastavenie Konquerora ako správcu súborov
+Comment[sl]=Nastavitve obnašanja Konquerorja kot upravitelja datotek
+Comment[sr]=Овде можете подесити како ће се Konqueror као менаџер фајлова понашати
+Comment[sr@Latn]=Ovde možete podesiti kako će se Konqueror kao menadžer fajlova ponašati
+Comment[sv]=Anpassa hur Konqueror beter sig som filhanterare
+Comment[ta]=கான்கொரர் கோப்பு மேலாளராக எப்படி இயங்குகிறது என்பதை இங்கே வடிவமைக்க முடியும்.
+Comment[tg]=Шумо метавонед рафтори Konqueror-ро ба унвони мудири файл дар инҷо таъин кунед.
+Comment[th]=คุณสามารถปรับแต่งพฤติกรรมของคอนเควอร์เรอร์ในการเป็นเครื่องมือจัดการแฟ้มได้ที่นี่
+Comment[tr]=Konqueror'un dosya yöneticisi olarak nasıl davranacağını buradan yapılandırabilirsiniz
+Comment[tt]=Birem idäräçe bularaq eşläwçe Konqueror'nıñ çağılışın caylaw
+Comment[uk]=Тут можна налаштувати поведінку Konqueror, як менеджера сеансу
+Comment[uz]=Konqueror fayl boshqaruvchisi sifatida xususiyatini moslash
+Comment[uz@cyrillic]=Konqueror файл бошқарувчиси сифатида хусусиятини мослаш
+Comment[ven]=Ni nga dzudzanya uri Konqueror inga tshilisa hani sa mulanguli wa faela hafhano
+Comment[vi]=Bạn có thể cấu hình cách Konqueror hoạt động như một trình quản lý tập tin ở đây
+Comment[wa]=Chal vos ploz apontyî li dujhance di Konqueror cwand i fwait l' manaedjeu di fitchîs
+Comment[xh]=Ungaqwalasela ukuziphatha kwe Konqueror njengomphathi wefayile apha
+Comment[zh_CN]=在这里配置 Konqueror 的文件管理器行为
+Comment[zh_TW]=您可以在這裡設定 Konqueror 做為檔案管理程式的行為
+Comment[zu]=Ungahlanganisela ukuthi i-Konqueror iziphathe kanjani njengemenenja yamafayela lapha
+Keywords=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation
+Keywords[ar]=konqueror,مسيير الملفات,kfm,التلميحات و النصائح,تلميحات الملف,نافذة منعزلة,spawn windows,السلوك,أمحي,إستعمال الذاكرة,عنوان المورد النظامي للمنزل,عمليات الشبكة,حوار التقدم,سلة المهملات,محو,تأكيد
+Keywords[be]=Кіраўнік файлаў,Парады,Падказкі,Падказкі файлаў,Асобнае акно,Паводзіны,Выкарыстанне памяці,Хатняя тэчка,Сеткавыя аперацыя,Прагэрс,Выкананне,Сметніца,Выдаленне,Выдаліць,Пацверджанне,konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation
+Keywords[bg]=работен, плот, поведение, място, браузър, прозорец,konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,
+Keywords[bs]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation,savjeti,odvojen prozor,otvaraj prozore,ponašanje,zauzeće memorije,mrežne operacije,traka napretka,kućni URL,početni URL,smeće,brisanje,potvrda,potvrdi
+Keywords[ca]=konqueror,gestor de fitxers,kfm,consells,consells del fitxer,finestra separada,expandir finestres,comportament,us de la memòria, URL d'inici,operacions de xarxa,diàleg de progrés,paperera,esborra,confirmacio
+Keywords[cs]=konqueror,správce souborů,kfm,tipy,oddělené okno,chování,využití paměti,domvské URL,síťové operace,průběh,koš,potvrzení
+Keywords[csb]=konqueror,menedżer lopków,kfm,podpòwiescë,apartné òkno,nowé òkna,zachòwanié,brëkòwanié pamiãcë,domôcy URl,kòsz,lëstëw pòkrokù,remanié,pòcwierdzenia,cécowé dzéjania
+Keywords[da]=konqueror,filhåndtering,kfm,tip,filtip,separat vindue,flere vinduer,opførsel,hukommelsesforbrug,Hjemme-URL,netværksoperationer, fremgangsdialog,affald,slet bekræftelse
+Keywords[de]=Konqueror,Dateimanager,kfm,Tipps,Fenster,Verhalten,Persönlicher Ordner,Speicherverwendung,URL,Adressen,Netzwerkoperationen,Fortschrittsanzeige,Mülleimer,Papierkorb,Löschen,Bestätigung
+Keywords[el]=konqueror,διαχειριστής αρχείων,kfm,συμβουλές,συμβουλές αρχείων,ξεχωριστό παράθυρο,δημιουργία παραθύρων,συμπεριφορά,συμπεριφορά,χρήση μνήμης,Αρχική URL,λειτουργίες δικτύου,παράθυρο διαλόγου προόδου,κάδος απορριμμάτων,διαγραφή,επιβεβαίωση
+Keywords[en_GB]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialogue,wastebin,delete,confirmation
+Keywords[eo]=konkeranto,dosieradministrilo,kfm,konsiloj,dosierokonsiloj,aparta fenestro,lanĉitaj fenestroj,konduto,uzata memoro,hejma URLo, retagoj,progresdialogo,rubujo,forigi,konfirmi
+Keywords[es]=konqueror,gestor de archivos,kfm,sugerencias,ventana separada, extender ventanas,comportamiento,uso de memoria, URL de inicio,operaciones de red, diálogo de progreso,papelera,borrar,confirmación
+Keywords[et]=konqueror,failihaldur,kfm,vihjed,failide vihjed,eraldi aken,käitumine,mälukasutus,kodukataloog,võrguoperatsioonid,võrgutoimingud,edenemisdialoog,prügikast,kustutamine
+Keywords[eu]=konqueror,fitxategi kudeatzailea,kfm,iradokizunak,fitxategi iradokizunak, aparteko leihoa,leihoak hedatu,portaera,memoriaren erabilera,Hasierako URLa,ezabatu, berrespena
+Keywords[fa]=konqueror، مدیر پرونده، kfm، نکات، نکات پرونده، پنجرۀ مجزا، پنجره‌های تکثیرشده، رفتار، رفتار، کاربرد حافظه، نشانی وب آغازه، عملیات شبکه، محاورۀ پیشرفت، زباله‌دان، حذف، تأیید
+Keywords[fi]=konqueror,tiedostonhallinta,kfm,vinkit,tiedostovinkit,erillinen ikkuna,erityisikkuna,käytös,muistinkäyttö,Koti-URL,kotiosoite,verkkotoiminnot,edistymisdialogi,roskakori,poisto,vahvistus
+Keywords[fr]=konqueror,gestionnaire de fichiers,explorateur,kfm,astuces,fenêtre séparée,rafraîchissement des fenêtres,comportement,utilisation de la mémoire,Home URL,URL de démarrage,opérations réseau,fenêtre de progression,corbeille,poubelle,effacer,détruire,suppression,confirmation
+Keywords[fy]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,ûnthâld gebrûk, ynternetadres, fuortgong, netwurk hanelingen, finsters fergrutsje, triembehearder, finsterbehearder
+Keywords[gl]=konqueror,xestor de ficheiros,kfm,información de ficheiro,fiestra separada,fiestras emerxentes,comportamento,uso da memória,URL de início,operacións en rede,diálogo de progreso,lixo
+Keywords[he]=konqueror,מנהל קבצים,kfm,עצות,פירוט לקבצים,חלון נפרד,שימוש בזיכרון,פעולה,כתובת בית, פח זבל, אשפה, סל מחזור, סל מחזור, filemanager,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation
+Keywords[hr]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation,upravljač datoteka,poseban prozor,ponašanje,upotreba memorije,URL početne stranice,mrežni postupci,dijalog napredovanja,otpad,brisanje,potvrđivanje
+Keywords[hu]=konqueror,fájlkezelő,kfm,tippek,fájltippek,külön ablak,ablakmegnyitás,viselkedés,memóriahasználat,saját URL,hálózati műveletek,állapotjelző ablak,szemétkosár,törlés,megerősítés
+Keywords[is]=konqueror,skráastjóri,kfm,ráð,skráarráð,aðskilin gluggi,margfaldast, gluggar,hegðun,minnisnotkun,heimaslóð, netaðgerðir, framvindugluggi, ruslafata,eyða, staðfesta
+Keywords[it]=konqueror,filemanager,kfm,trucchi,file,separa finestre,comportamento,memoria utilizzata,home,operazioni di rete,avanzamento,finestra avanzamento,cestino,elimina,cancella,conferme
+Keywords[ja]=konqueror,ファイルマネージャ,kfm,ツールチップ,個別ウィンドウ, ポップウィンドウ,挙動,メモリ使用量,ホームURL,ネットワーク操作,進捗ダイアログ,ごみ箱,削除,確認
+Keywords[km]=konqueror,កម្មវិធី​គ្រប់គ្រង​ឯកសារ,kfm,ព័ត៌មាន​ជំនួយ,ព័ត៌មាន,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation
+Keywords[lt]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation,bylų tvarkyklė,patarimai,bylų patarimai,langai,atskiri langai, elgesys, elgsena, atminties naudojimas, namų adresas,tinklo operacijos,progreso dialogas,šiukšliadėžė,trinti,patvirtinimas
+Keywords[mk]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation,менаџер на датотеки,совети,совети за датотеки,подели го прозорецот,однесување,користење на меморија,Домашно URL,мрежни операции,дијалог за прогрес,корпа за отпадоци,избриши,потврда
+Keywords[nb]=konqueror,filbehandler,kfm,tips,tips om filer,eget vindu,åpne vinduer,oppførsel,minnebruk,hjemmeside på nettet,nettverksoperasjoner,framdriftsviser,papirkurv
+Keywords[nds]=Konqueror,Dateipleger,kfm,Tipps,Dateitipps,egen Finster,Finster maken,Bedregen,behaviour,memory,Spiekerverbruuk,Home,Startsiet,Startadress,Nettwark-Akschonen,Vörankamendialoog,Affalltünn,Affall,löschen,Nafraag,nafragen,wegdoon
+Keywords[ne]=कन्क्वेरर, फाइल प्रबन्धक, kfm, टिपहरू, फाइल टिप, फरक सञ्झ्याल, स्पवन सञ्झ्यालहरू, व्यवहार,व्यवहार,स्मृति प्रयोग, गृह URL,सञ्जाल सञ्चालन, प्रगति संवाद, रद्दीटोकरी क्यान, मेट्नुहोस्, यकीन
+Keywords[nl]=konqueror,filemanager,bestandsbeheerder,kfm,tips,file tips,bestandstips,apart venster,gedrag,geheugengebruik,persoonlijke map,netwerkoperaties,voortgangsdialoog,prullenbak,verwijderen,bevestiging,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation
+Keywords[nn]=konqueror,filhandterar,kfm,tips,filtips,eige vindauge,nye vindauge,åtferd,minnebruk,heime-URL,nettverksopersjonar,framdriftsindikator,papirkorg,slett,stadfesting
+Keywords[pa]=kfm,ਕੋਨਕਿਉਰਰ,ਫਾਇਲ ਮੈਨੇਜਰ,ਸੰਕੇਤ,ਵੱਖਰਾ ਝਰੋਖਾ,ਵਿਹਾਰ,ਮੈਮੋਰੀ ਵਰਤੋਂ, ਨੈੱਟਵਰਕ ਕਾਰਵਾਈ,ਤਰੱਕੀ ਵਾਰਤਾਲਾਪ,ਰੱਦੀ,ਹਟਾਓ,ਪੁਸ਼ਟੀ,ਘਰ URL,ਸੰਕੇਤ
+Keywords[pl]=konqueror,menedżer plików,kfm,podpowiedzi,osobne okno,nowe okna,zachowanie,zużycie pamięci,katalog domowy,kosz,pasek postępu,usuwanie,potwierdzenia,operacje sieciowe
+Keywords[pt]=konqueror,gestor de ficheiros,kfm,dicas,dicas de ficheiros,janela separada,comportamento,utilização de memória,URL de base,operações de rede,janela de evolução,caixote do lixo,apagar,confirmação
+Keywords[pt_BR]=konqueror,gerenciador de arquivos,kfm,dicas,arquivos de dicas,janelas separadas,janelas unidas,comportamento,uso de memória,pasta do usuário, operações de rede, diálogo de progresso, lata de lixo, remoção, confirmação
+Keywords[ro]=konqueror,manager de fișiere,kfm,sfaturi,ferestre separate,comportament,utilizare memorie,URL personal,operații de rețea,dialog de progres,gunoi,ștergere,confirmare
+Keywords[rw]=Konqueror,mugengadosiye,kfm,inyobora,inyobora z'idosiye, gutandukanya idirishya,kurema amadirishya,imyitwarire,imyitwarire,ikoresha ry'ububiko,URL y'ipaji ibanza, ibikorwa by'urusobemiyoboro,ikiganiro aho bigeze,agatebo njyamwanda,gusiba,iyemeza
+Keywords[sl]=konqueror,upravitelj datotek,upravljalnik,kfm,namig,namigi datotek,ločeno okno,ustvari okna,obnašanje,poraba pomnilnika,domači URL, omrežne operacije,okno napredka,smeti,brisanje,potrditev
+Keywords[sr]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation,форе,форе за фајлове,одвојени прозор,spawn прозори,понашање,искоришћеност меморије,Home URL,савети,смеће,мрежне операције
+Keywords[sr@Latn]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation,fore,fore za fajlove,odvojeni prozor,spawn prozori,ponašanje,iskorišćenost memorije,Home URL,saveti,smeće,mrežne operacije
+Keywords[sv]=konqueror,filhanterare,kfm,tips,filtips,särskilt fönster,visa fönster,beteende,minnesanvändning,hemadress,nätverksåtgärder,förloppsdialogruta,papperskorg,ta bort,bekräftelse
+Keywords[ta]=கான்கொரர்,கோப்பு மேலாளர்,kfm,குறிப்புகள்,கோப்பு குறிப்புகள்,தனி சாளரம்,நீள்வட்ட சாளரம்,நடத்தை,நினைவு பயன்பாடு,வீட்டு வலைப்பின்னல்,வலைப்பின்னல் செயல்பாடுகள், வழிமுறை உரையாடல்,குப்பைத்தொட்டி, நீக்கு,உறுதிப்படுத்தல்
+Keywords[th]=คอนเควอร์เรอร์,ตัวจัดการแฟ้ม,kfm,เคล็ดลับ,เคล็ดลับแฟ้ม,หน้าต่างแยกต่างหาก,สร้างหน้าต่างใหม่,พฤติิกรรม,การใช้หน่วยความจำ,ตำแหน่งหลักการทำงานทางเครือข่าย,กล่องแสดงความก้าวหน้า,ถังขยะ,ลบทิ้ง,การยืนยัน,
+Keywords[tr]=konqueror,dosya yöneticisi,kfm,ipuçları,dosya ipuçları,pencere,davranış,bellek kullanımı,başlangıç,bellek kullanımı,başlangıç adresi,ağ işlemleri,ilerleme penceresi,çöp kutusu
+Keywords[uk]=konqueror,менеджер файлів,kfm,підказки,підказки по файлах,окремі вікна,створення вікон,поведінка,використання пам'яті,домашній URL,робота з мережею,вікно поступу,смітник,
+Keywords[uz]=konqueror,fayl boshqaruvchisi,kfm,eslatmalar,fayl eslatmalari,alohida oyna,spawn windows,xususiyatlar,xotiradan foydalanish,Uy URL,tarmoq amallari,chiqindilar qutisi,oʻchirish,tasdiqlash
+Keywords[uz@cyrillic]=konqueror,файл бошқарувчиси,kfm,эслатмалар,файл эслатмалари,алоҳида ойна,spawn windows,хусусиятлар,хотирадан фойдаланиш,Уй URL,тармоқ амаллари,чиқиндилар қутиси,ўчириш,тасдиқлаш
+Keywords[vi]=konqueror,trình quản lý tập tin,kfm,gợi ý,tập tin tips,phân cách cửa sổ,cửa sổ nhỏ,cách hoạt động,cách hoạt động,sử dụng bộ nhớ,URL Nhà,hoạt động mạng,hộp thoại tiến trình,thùng rác,xoá,xác nhận
+Keywords[wa]=konqueror,manaedjeu d' fitchî,kfm,bon a savu,bon a saveur,purneas metous a pårt,dispårtis purneas,dujhance,elpoyaedje del memwere,URL Måjhob,operåcions rantoele,divize di progrès,batch,disfacer,acertiner
+Keywords[zh_CN]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation,文件管理器,提示,文件提示,拆分窗口,新开窗口,行为,内存使用,主 URL,网络操作,进度对话框,回收站,删除,确认
+Keywords[zh_TW]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,network operations,progress dialog,trash can,delete,confirmation,征服家,檔案管理程式,密訣,檔案密訣,分離視窗,產生視窗,行為,記憶體使用量,家 URL,網路操作,進度對話盒,資源回收桶,刪除,確認
diff --git a/kcontrol/konq/filebrowser.desktop b/kcontrol/konq/filebrowser.desktop
new file mode 100644
index 000000000..74cc32ade
--- /dev/null
+++ b/kcontrol/konq/filebrowser.desktop
@@ -0,0 +1,239 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/filemanager/index.html
+Icon=kfm
+Exec=kcmshell filebrowser
+
+
+X-KDE-Library=konq
+X-KDE-FactoryName=browser
+X-KDE-ParentApp=kcontrol
+
+Name=File Manager
+Name[af]=Lêer Bestuurder
+Name[ar]=مدبّر الملفات
+Name[az]=Fayl İdarəcisi
+Name[be]=Кіраўнік файлаў
+Name[bg]=Файлов браузър
+Name[bn]=ফাইল ম্যানেজার
+Name[br]=Merour restroù
+Name[bs]=Upravitelj datotekama
+Name[ca]=Gestor de fitxers
+Name[cs]=Správce souborů
+Name[csb]=Menedżer lopków
+Name[cy]=Rheolydd Ffeiliau
+Name[da]=Filhåndtering
+Name[de]=Dateimanager
+Name[el]=Διαχειριστής αρχείων
+Name[eo]=Dosieradministrilo
+Name[es]=Gestor de archivos
+Name[et]=Failihaldur
+Name[eu]=Fitxategi kudeatzailea
+Name[fa]=مدیر پرونده
+Name[fi]=Tiedostonhallinta
+Name[fo]=Fíluhandfarari
+Name[fr]=Gestionnaire de fichiers
+Name[fy]=Triembehearder
+Name[ga]=Bainisteoir Comhad
+Name[gl]=Xestor de Ficheiros
+Name[he]=מנהל הקבצים
+Name[hi]=फ़ाइल प्रबंधक
+Name[hr]=Upravitelj datotekama
+Name[hsb]=Datajowy manager
+Name[hu]=Fájlkezelő
+Name[id]=Manajer File
+Name[is]=Skráastjóri
+Name[it]=File manager
+Name[ja]=ファイルマネージャ
+Name[ka]=ფაილთა მენჯერი
+Name[kk]=Файл менеджері
+Name[km]=កម្មវិធី​គ្រប់គ្រង​ឯកសារ
+Name[ko]=파일 관리자
+Name[lo]=ເຄື່ອງມືການຈັດການແຟ້ມ
+Name[lt]=Bylų tvarkyklė
+Name[lv]=Failu Menedžeris
+Name[mk]=Менаџер на датотеки
+Name[mn]=Файл удирдагч
+Name[ms]=Pengurus Fail
+Name[mt]=Manager tal-Fajls
+Name[nb]=Filbehandler
+Name[nds]=Dateipleger
+Name[ne]=फाइल प्रबन्धक
+Name[nl]=Bestandsbeheerder
+Name[nn]=Filhandsamar
+Name[nso]=Molaodi wa Faele
+Name[oc]=Gestionari de fiquièrs
+Name[pa]=ਫਾਇਲ ਮੈਨੇਜਰ
+Name[pl]=Menedżer plików
+Name[pt]=Gestor de Ficheiros
+Name[pt_BR]=Gerenciador de Arquivos
+Name[ro]=Manager de fișiere
+Name[ru]=Файловый менеджер
+Name[rw]= Mucungamadosiye
+Name[se]=Fiilagieđahalli
+Name[sk]=Správca súborov
+Name[sl]=Upravitelj datotek
+Name[sr]=Менаџер фајлова
+Name[sr@Latn]=Menadžer fajlova
+Name[ss]=Siphatsi selifayela
+Name[sv]=Filhanterare
+Name[ta]=கோப்பு மேலாளர்
+Name[te]=దస్త్రాల అభికర్త
+Name[tg]=Мудири файл
+Name[th]=เครื่องมือจัดการแฟ้ม
+Name[tr]=Dosya Yöneticisi
+Name[tt]=Birem İdäräçe
+Name[uk]=Менеджер файлів
+Name[uz]=Fayl boshqaruvchisi
+Name[uz@cyrillic]=Файл бошқарувчиси
+Name[ven]=Mulanguli wa faela
+Name[vi]=Trình quản lí tập tin
+Name[wa]=Manaedjeu di fitchîs
+Name[xh]=Umphathi Wefayile
+Name[zh_CN]=文件管理器
+Name[zh_TW]=檔案管理程式
+Name[zu]=imenenja yamafayela
+
+Comment=You can configure Konqueror's file manager mode here
+Comment[af]=Jy kan Konqueror se lêer bestuurder gedrag hier opstel
+Comment[ar]=يمكنك هنا إعداد نمط مسيير الملفات Konqueror
+Comment[az]=Konqueror-un fayl idarəçisi modunu buradan quraşdırın
+Comment[be]=Тут вы можаце змяніць рэжым кіравання файламі Konqueror
+Comment[bg]=Настройване на файловия браузър
+Comment[bn]=এখানে কনকরার-এর ফাইল ম্যানেজার মোড কনফিগার করতে পারেন
+Comment[br]=Amañ e c'hellit kefluniañ mod merour restroù Konqueror
+Comment[bs]=Ovdje možete podesiti kako izgleda Konqueror kao menadžer datoteka
+Comment[ca]=Aquí podeu configurar el mode del gestor de fitxers Konqueror
+Comment[cs]=Zde je možné nastavit režim správce souborů Konqueror
+Comment[csb]=Kònfigùracëjô Konquerora w tribie menadżera lopków
+Comment[cy]=Ffurfweddu modd rheolydd ffeiliau Konqueror
+Comment[da]=Her kan du indstille hvordan Konqueror ser ud som filhåndtering
+Comment[de]=Hier können Sie das Erscheinungsbild von Konqueror als Dateimanager festlegen
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε τη λειτουργία του Konqueror ως διαχειριστή αρχείων
+Comment[eo]=Ĉi tie vi povas agordi Konkeranton kiel dosieradministrilo.
+Comment[es]=Aquí puede configurar el modo de gestor de archivos de Konqueror
+Comment[et]=Siin saad seadistada Konquerori failihalduri režiimi
+Comment[eu]=Konquerorren fitxategi kudeaketa era konfigura dezakezu hemen
+Comment[fa]=می‌توانید حالت مدیر پرونده Konqueror را در اینجا پیکربندی کنید
+Comment[fi]=Tässä kohdassa voit määritellä Konquerorin tiedostonhallinnan tilan asetuksia
+Comment[fr]=Configuration du mode gestionnaire de fichiers de Konqueror
+Comment[fy]=Hjir kinne jo it uterlik fan Konqueror as triembehearder ynstelle
+Comment[gl]=Pode configurar aqui o modo de xestión de ficheiros de Konqueror
+Comment[he]=שינוי הגדרות מצב מנהל הקבצים של Konqueror
+Comment[hi]=आप यहाँ कॉन्करर के फ़ाइल प्रबंधक मोड को कॉन्फ़िगर कर सकते हैं
+Comment[hr]=Konfiguriranje načina Konqueror upravljača datotekama
+Comment[hu]=A Konqueror fájlkezelő részének működési jellemzői
+Comment[is]=Hér getur þú stillt Konqueror skráarstjórahaminn
+Comment[it]=Configura la modalità "gestione file" di Konqueror
+Comment[ja]=Konqueror のファイルマネージャモードを設定
+Comment[ka]=აქ შეგიძლიათ დააკონფიგურიროთ Konqueror ფაილური მენეჯერის რეჟიმი
+Comment[kk]=Konqueror файл менеджер ретінде қолданғанды баптау
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនាសម្ព័ន្ធ​របៀប​កម្មវិធី​គ្រប់គ្រង​ឯកសារ​របស់ Konqueror
+Comment[ko]=Konqueror의 파일 관리자 모드 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງການທຳງານຂອງເຄື່ອງ ຈັດການເຊສຊັນໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite konfigūruoti Konqueror bylų tvarkyklės veikseną
+Comment[lv]=Šeit Jūs varat konfigurēt Iekarotāja failu menedžera režīmu
+Comment[mk]=Тука може да го конфигурирате режимот на Konqueror за менаџирање на датотеки
+Comment[mn]=Энд та конкюрорын харагдалтыг файл удирдагчийн хувьд тогтооно
+Comment[ms]=Anda boleh konfigur mod pengurus fail Konqueror di sini
+Comment[mt]=Ikkonfigura kif jidher Konqueror bħala manager tal-fajls
+Comment[nb]=Tilpass hvordan Konqueror ser ut som filbehandler
+Comment[nds]=Hier kannst Du Konqueror sien Bedriefoort instellen
+Comment[ne]=तपाईँले यहाँ कन्क्वेरर फाइल प्रबन्धक मोड कन्फिगर गर्नु सक्नुहुन्छ
+Comment[nl]=Hier kunt u het uiterlijk van Konqueror als bestandsbeheerder instellen
+Comment[nn]=Her kan du setja opp filhandsamaren Konqueror
+Comment[nso]=Oka beakanya mokgwa wa molaodi wa faele ya Konqueror mo
+Comment[pa]=ਤੁਸੀਂ ਇੱਥੇ ਕੋਨਕਿਉਰੋਰ ਦੇ ਫਾਇਲ ਮੈਨੇਜਰ ਰੂਪ ਨੂੰ ਸੰਰਚਿਤ ਕਰ ਸਕਦੇ ਹੋ
+Comment[pl]=Konfiguracja Konquerora w trybie menedżera plików
+Comment[pt]=O utilizador pode configurar aqui o modo de gestão de ficheiros do Konqueror
+Comment[pt_BR]=Você pode configurar o modo de gerenciamento de arquivos do Konqueror aqui
+Comment[ro]=Aici configurați modul de manager de fișiere al Konqueror
+Comment[ru]=Настройка режима менеджера файлов
+Comment[rw]=Ushobora kugena uburyo bwa mugengadosiye ya Konqueror hano
+Comment[se]=Dás heivehat Konquerora fiilagieđahallin
+Comment[sk]=Nastavenie Konquerora ako správcu súborov
+Comment[sl]=Nastavitve načina Konquerorja kot upravitelja datotek
+Comment[sr]=Овде можете подесити Konqueror-ов режим управљања фајловима
+Comment[sr@Latn]=Ovde možete podesiti Konqueror-ov režim upravljanja fajlovima
+Comment[sv]=Anpassa Konquerors filhanteringsläge
+Comment[ta]=இங்கே கான்கொரர் கோப்பு மேலாளர் வகையை வடிவமைக்கலாம்.
+Comment[tg]=Шумо метавонед ҳолати мудири файли Konqueror-ро танзим кунед
+Comment[th]=คุณสามารถปรับแต่งโหมดของคอนเควอร์เรอร์ในการเป็นเครื่องมือจัดการแฟ้มได้ที่นี่
+Comment[tr]=Konqueror'un dosya yöneticisi kipini buradan ayarlayabilirsiniz
+Comment[tt]=Konqueror'nıñ birem idäräçe bularaq eşläw ısulın caylaw
+Comment[uk]=Налаштування режиму менеджера файлів Konqueror
+Comment[ven]=Ni nga dzudzanya moudu wa mulanguli wa faela Konqueror hafhano
+Comment[vi]=Bạn có thể cấu hình các chế độ hoạt động của trình quản lý tập tin Konqueror ở đây
+Comment[wa]=Chal vos ploz apontyî li mode do manaedjeu di fitchîs d' Konqueror
+Comment[xh]=Uyakwazi ukuqwalasela apha indlela yomphathi wefayile we Konqueror
+Comment[zh_CN]=在这里配置 Konqueror 的文件管理器模式
+Comment[zh_TW]=您可以在這裡設定 Konqueror 的檔案管理模式
+Comment[zu]=Ungahlanganisela indlela yemenenja yamafayela ye-konqueror lapha
+Keywords=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour
+Keywords[ar]=konqueror,مسيير الملفات,word wrap,wrap,تسطير الأحرف,الشاشة,حجم الملف,البايتات,المحرف,اللون,العرض
+Keywords[az]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,fayl,fayl idarəçisi,rəng,yazı növü,altı cızıqlı
+Keywords[be]=Кіраўнік файлаў,Перанос словаў,Перанос,Падкрэсліванне,Падкрэслены,Паказваць,Памер,Байты,Шрыфт,Колер,konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour
+Keywords[bg]=файлове, файл, управление, браузър, мениджър, konqueror, filemanager,word wrap, wrap, underline, display, filesize, bytes, font, color, colour
+Keywords[ca]=konqueror,gestor de fitxers, ajust de línia,subratllar,mostrar,mida del fitxer,octets,lletra,color,colorit
+Keywords[cs]=Konqueror,Správce souborů,Zalamování,Podtrhávání,Zobrazení,Velikost souboru,Bajty,Písmo,Barva
+Keywords[csb]=konqueror,menedżer lopków,zawijanié wierztów,zawijanié,podsztëchiwanié,wëzdrzatk, miara lopkù,bajtë,fòntë,farwa
+Keywords[cy]=konqueror,rheolydd ffeiliau,lapio geiriau,lapio,tanlinellu,dangos,maint ffeil,beitiau,ffont,lliw
+Keywords[da]=konqueror,filhåndtering,ordombrydning,ombrydning,understreg,vis,filstørrelse,byte,skrifttype,farve
+Keywords[de]=Konqueror,Dateimanager,Zeilenfall,Textumbruch,Unterstreichen,Darstellung,Dateigröße,Schrift,Farbe,Byte
+Keywords[el]=konqueror,διαχειριστής αρχείων,αναδίπλωση λέξεων,αναδίπλωση,υπογράμμιση,προβολή,μέγεθος αρχείου,bytes,γραμματοσειρά,χρώμα,χρώμα
+Keywords[eo]=konkeranto,dosieradministrilo,vidigi,vidigo,dosiera grandeco,bajto,bitoko,okbitaro,tiparo,koloro
+Keywords[es]=konqueror,gestor de archivos, ajuste de línea,subrayar,mostrar,tamaño de archivo,bytes,tipo de letra,color
+Keywords[et]=konqueror,failihaldur,sõnade murdmine,murdmine,allajoonimine,ekraan,faili suurus,baidid,font,värv
+Keywords[eu]=konqueror,fitxategi kudeatzailea,itzulbiratu, egokitu,azpimarratu,pantaila,fitxategi tamaina,byteak,letra-tipoa,kolorea
+Keywords[fa]=konqueror، مدیر پرونده، سطربندی واژه، سطربندی، خط زیر، نمایش، اندازه پرونده، بایتها، قلم، رنگ، رنگ
+Keywords[fi]=konqueror,tiedostonhallinta,sanankatkaisu,alleviivaus,tiedostokoko,tavuja, kirjasin,väri
+Keywords[fr]=konqueror,gestionnaire de fichiers,explorateur,retour à la ligne,soulignement,affichage,taille des fichiers,octets,police,couleur
+Keywords[fy]=konqueror,filemanager,triembehear,word wrap,rigelôfbreking,ûnderstreakje,display,werjefte,filesize,triemgrutte,bytes,fonts,lettertypen,kleur,color
+Keywords[ga]=konqueror,bainisteoir comhad,timfhilleadh focal,timfhilleadh,líne faoi,scáileán,méid comhaid,bearta,cló,clófhoireann,dath
+Keywords[gl]=konqueror,xestor de ficheiros,axuste de palabras,axuste,subliñar,mostrar,tamaño de ficheiro,bites,fonte,cor
+Keywords[he]=konqueror,מנהל קבצים,גלישת שורות,קו תחתון,תצוגה,גודל קובץ,בתים,גופן,צבע, konqueror,filemanager,word wrap, wrap,underline,display,filesize,bytes,font,color,colour
+Keywords[hi]=कॉन्करर,फ़ाइलप्रबंधक,वर्ड रैप,रैप,रेखांकित,प्रकटन,फ़ाइलआकार,बाइट्स,फ़ॉन्ट,रंग
+Keywords[hr]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,upravljač datoteka,omatanje riječi,omatanje,podvlačenje,prikaz,veličina datoteke,bajtovi,font,boja,boje
+Keywords[hu]=konqueror,fájlkezelő,szótördelés,tördelés,aláhúzás,képernyő,fájlméret,bájt,betűtípus,szín,színek
+Keywords[is]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour, litir,línuskipting,skjár,skjáborð,bæt,litur
+Keywords[it]=konqueror,filemanager,a capo,sottolineatura,schermo,dimensione file,byte,caratteri,colori
+Keywords[ja]=konqueror,ファイルマネージャ,ワードラップ,行の折り返し,下線,表示,ファイルサイズ, バイト,フォント,色,カラー
+Keywords[km]=konqueror,កម្មវិធី​គ្រប់គ្រង​ឯកសារ,រុំ​ពាក្យ,រុំ,គូសបន្ទាត់​ក្រោម,បង្ហាញ,ទំហំ​ឯកសារ,បៃ,ពុម្ពអក្សរ,ពណ៌
+Keywords[lt]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,bylų tvarkyklė, žodžių perkėlimas, perkėlimas, pabraukimas, ekranas, bylos dydis, baitai, šriftas,spalva
+Keywords[lv]=iekarotājs,failumenedžeris,vārdu apciršana,apciršana,pasvītrojums,ekrāns,failu izmērs,baiti,fonti,krāsas
+Keywords[mk]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,менаџер на датотеки,прекршување на зборови,прекршување,подвлекување,екран,големина на датотека,бајти,фонт,боја
+Keywords[mn]=Конкюрор,Файл удирдагч,Текст таслах,Доогуур зураас, Дүрслэл,Файлын хэмжээ,Бичиг,Өнгө,Байт
+Keywords[mt]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,manager tal-fajls,daqs,kulur,kuluri
+Keywords[nb]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,filbehandler,tekstbryting,understreket,skjerm,filstørrelse,byter,fonter,farger
+Keywords[nds]=Konqueror,Dateipleger,word wrap,ümbreken,ünnerstreken,Dorstellen,Dateigrött,Bytes,Schriftoort, Klöör, Klören
+Keywords[ne]=कन्क्वेरर, फाइल प्रबन्धक, शब्द बेर्नुहोस्, बेर्नुहोस्, कच, प्रदर्शन गर्नुहोस्, फाइल साइज, बाइट्स, फन्ट, रङ, रङ
+Keywords[nl]=konqueror,filemanager,bestandsbeheer,word wrap,regelafbreking,onderstrepen,display,weergave,filesize,bestandsgrootte,bytes,fonts,lettertypen,kleur,color
+Keywords[nn]=Konqueror,filhandsamar,tekstbryting,linjebryting,bryting,understrek,vis,filstorleik,byte,skrift,farge
+Keywords[nso]=konqueror,molaodi wa faele,tatetso ya faele,tatetso ya mantsu,tatetso,thalelela,pontsho,bogolo bja faele,bytes,fonto,mmala,mmala
+Keywords[pa]=ਕੋਨਕਿਉਰਰ,ਫਾਇਲ ਮੈਨੇਜਰ,ਸ਼ਬਦ ਸਮੇਟੋ,ਸਮੇਟੋ,ਹੇਠਾਂ ਰੇਖਾ,ਫਾਇਲ ਅਕਾਰ,ਬਾਈਟ,ਫੋਂਟ,ਰੰਗ ਝਲਕ
+Keywords[pl]=konqueror,menedżer plików,zawijanie wierszy,zawijanie,podkreślenie,wygląd, rozmiar pliku,bajty,czcionki,kolor
+Keywords[pt]=konqueror,gestor de ficheiros,mudança de linha,mudança,sublinhado,ecrã,tamanho do ficheiro,bytes,tipo de letra,cor
+Keywords[pt_BR]=konqueror,gerenciador de arquivos,quebra de linha, sublinhado, display,tamanho de arquivo,bytes,fonte,cor,cor
+Keywords[ro]=konqueror,manager de fișiere,limitare cuvînt,limitare,subliniere,afișare,mărime fișier,octeți,font,culoare
+Keywords[rw]= Konqueror,mugengadosiye,ifunika ry'ijambo,gufunika,gucaho umurongo,Kugaragaza,inganoidosiye,bayite,imyandikire,ibara,ibara
+Keywords[se]=Konqueror,fiilagieđahalli,linnjádoaddjin,doaddjin,vuolláisárgu,čájet,fiilasturrodat,stávvalat,fonta,ivdni
+Keywords[sk]=konqueror,správa súborov,zalamovanie slov,podčiarknutie,zobrazenie,veľkosť súborov,bajty,písmo,farba
+Keywords[sl]=konqueror,upravitelj datotek,upravljalnik,prelom vrstic,prelom,podčrta,prikaz,velikost datoteke,bajt,pisava,barva
+Keywords[sr]=konqueror,filemanager,преламање текста,преламање,подвлачење,приказ,величина фајла,бајтови,фонт,боја
+Keywords[sr@Latn]=konqueror,filemanager,prelamanje teksta,prelamanje,podvlačenje,prikaz,veličina fajla,bajtovi,font,boja
+Keywords[sv]=konqueror,filhanterare,radbrytning,understreck,visa,filstorlek,byte,teckensnitt,färg
+Keywords[ta]=கான்கொரர்,கோப்பு மேலாளர்,வார்த்தை மடக்கு, மடக்கு,அடிகோடிடு,காட்டு,கோப்பு அளவு,பைட்டுகள்,எழுத்துரு,வண்ணம்,வண்ணம்
+Keywords[th]=คอนเควอร์เรอร์,จัดการแฟ้ม,ตัดคำ,ตัด,ขีดเส้นใต้,แสดงผล,ขนาดแฟ้ม,ไบต์,แบบอักษร,สี
+Keywords[tr]=konqueror,dosya yöneticisi,görünüm,dosya boyu,bayt,yazıtipi,renk
+Keywords[uk]=konqueror,менеджер файлів, переніс файлів,переніс,підкреслення,дисплей, розмір файлів,байти,шрифт,колір
+Keywords[uz]=konqueror,fayl boshqaruvchisi,word wrap,wrap,tagini chizish,koʻrsatish,fayning hajmi,baytlar,shrift,rang
+Keywords[uz@cyrillic]=konqueror,файл бошқарувчиси,word wrap,wrap,тагини чизиш,кўрсатиш,файнинг ҳажми,байтлар,шрифт,ранг
+Keywords[ven]=konqueror,mulanguli wa faela,putela ha fhungo,putela,talela,sumbedza,saizi ya faela, bytes,fontu,muvhala,muvhala
+Keywords[vi]=konqueror,trình quản lý tập tin,bao quanh văn bản,bao quanh,gạch chân,màn hình,cỡ tập tin,số byte,phông chữ,mầu,mầu sắc
+Keywords[wa]=konqueror,manaedjeu di fitchî,sorlignî,håyner,håynaedje,grandeu d' fitchî,bytes,bites,fonte,coleur
+Keywords[xh]=konqueror,umphathi wefayile,songela amagama,songela, yenza umgca ezantsi,bonisa, ubngakanani befayile,bytes,umgca,umbala,umbala
+Keywords[zh_CN]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,文件管理器,自动换行,下划线,显示,文件大小,字节,字体,颜色
+Keywords[zh_TW]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,征服家,檔案管理程式,文字換行,換行,底線,顯示,檔案大小,位元組,字型,顏色
+Keywords[zu]=konqueror,imenenja yamafayela,ukugoqwa kwamafayela, ukugoqwa,dwebela,veza,usayizi ama-byte osayizi wefayela,uhlobo lwamagama, umbala,umbala
+
+Categories=Qt;KDE;X-KDE-settings-components;
diff --git a/kcontrol/konq/filepreviews.desktop b/kcontrol/konq/filepreviews.desktop
new file mode 100644
index 000000000..60a78139c
--- /dev/null
+++ b/kcontrol/konq/filepreviews.desktop
@@ -0,0 +1,220 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/filemanager/index.html
+Icon=kfm
+Exec=kcmshell filepreviews
+
+
+X-KDE-Library=konq
+X-KDE-FactoryName=previews
+X-KDE-ParentApp=kcontrol
+
+Name=Previews & Meta-Data
+Name[af]=Voorskoue & Meta-Data
+Name[az]=Nümayişlər & Meta Mə'lumat
+Name[be]=Перадпрагляд і метададзеныя
+Name[bg]=Преглед и данни
+Name[bn]=প্রাক্-দর্শন এবং মেটা-ডেটা
+Name[bs]=Pregledi i meta-podaci
+Name[ca]=Vistes prèvies i meta-dades
+Name[cs]=Náhledy a metadata
+Name[csb]=Pòzderczi ë pòdôwczi meta
+Name[cy]=Rhagolygon & Meta-data
+Name[da]=Forhåndsvisninger & Metadata
+Name[de]=Vorschauen & Metadaten
+Name[el]=Προεπισκοπήσεις & Μετα-δεδομένα
+Name[eo]=Antaŭrigardoj kaj metadatumoj
+Name[es]=Previsualizaciones & Meta-datos
+Name[et]=Eelvaatlused ja metaandmed
+Name[eu]=Aurrebistak eta metadatuak
+Name[fa]=پیش‌نمایشها و فراداده
+Name[fi]=Esikatselut ja metatiedot
+Name[fr]=Aperçus & Méta-informations
+Name[fy]=foarbylden en meta-data
+Name[ga]=Réamhamhairc & Meiteashonraí
+Name[gl]=Miniaturas e Meta Datos
+Name[he]=תצוגות מקדימות ומידע־על
+Name[hi]=पूर्वावलोकन एवं मेटा-डाटा
+Name[hr]=Pregledi i meta podaci
+Name[hu]=Gyorsnézetek
+Name[is]=Forsýnir og metagögn
+Name[it]=Anteprime e informazioni
+Name[ja]=プレビュー & メタデータ
+Name[ka]=წინასწარ ხედვა და მეტა მონაცემები
+Name[kk]=Нобайлары мен мета-деректер
+Name[km]=មើល​ជា​មុន & ទិន្នន័យ​មេតា
+Name[ko]=미리 보기와 메타데이터
+Name[lt]=Peržiūros ir meta duomenys
+Name[lv]=Priekšapskate un Meta dati
+Name[mk]=Прегледи и метаподатоци
+Name[mn]=Урьд харах & Мета-Өгөгдөл
+Name[ms]=Prapapar & Data Meta
+Name[mt]=Previżjonijiet u Meta-data
+Name[nb]=Forhåndsvisning og metadata
+Name[nds]=Vöransichten & Meta-Daten
+Name[ne]=पूर्वावलोकन र मेटा-डेटा
+Name[nl]=Voorbeelden en meta-data
+Name[nn]=Førehandsvising og metadata
+Name[pa]=ਝਲਕ ਅਤੇ ਮੈਟਾ-ਡਾਟਾ
+Name[pl]=Podglądy i metadane
+Name[pt]=Antevisões e Meta Dados
+Name[pt_BR]=Pré-visualizações & Metadados
+Name[ro]=Previzualizări și metainformații
+Name[ru]=Миниатюры и мета-данные
+Name[rw]=Amagaragazambere & Ibyatanzwe-Bidasanzwe
+Name[se]=Ovdačájeheamit ja metadáhtat
+Name[sk]=Náhľady a meta dáta
+Name[sl]=Ogledi in metapodatki
+Name[sr]=Прегледи и мета подаци
+Name[sr@Latn]=Pregledi i meta podaci
+Name[sv]=Förhandsgranskning och metadata
+Name[ta]=முன்காட்சிகள் & மெடா-தகவல்
+Name[te]=ముందు విక్షణాలు & మెటా-దత్తాంశాలు
+Name[tg]=Пешнамоишҳо ва Meta-Data
+Name[th]=แสดงตัวอย่าง & ข้อมูลเมตา
+Name[tr]=Önizlemeler
+Name[tt]=Kürep Alu & Meta-Eçtälek
+Name[uk]=Перегляд та метадані
+Name[uz]=Koʻrib chiqish\nva meta-maʼlumot
+Name[uz@cyrillic]=Кўриб чиқиш\nва мета-маълумот
+Name[vi]=Xem trước & Thông tin tập tin
+Name[wa]=Prévey & Meta-dnêyes
+Name[zh_CN]=预览和元数据
+Name[zh_TW]=預覽與中繼資料
+
+Comment=You can configure how Konqueror Previews & Meta-data work here
+Comment[af]=Jy kan hier opstel hoe Konqueror se Voorskoue & Meta-data werk
+Comment[be]=Тут вы можаце змяніць працу перадагляду і метададзеных Konqueror
+Comment[bg]=Настройване режима на преглед на файловия браузър
+Comment[bn]=কনকরার-এ প্রাক্-দর্শন এবং মেটা-ডেটা কিভাবে কাজ করবে তা এখানে কনফিগার করতে পারেন
+Comment[bs]=Ovdje možete podesiti kako rade Pregledi i meta-podaci u Konqueroru
+Comment[ca]=Aquí podeu configurar com funcionaran les vistes prèvies i les meta-dades en el Konqueror
+Comment[cs]=Zde je možné nastavit chování náhledů a metadat v Konqueroru
+Comment[csb]=Kònfigùracëjô pòdzéraniô zamkłoscë lopków ë pòdôwków meta w Konquerorze
+Comment[cy]=Gallwch ffurfweddu sut mae Rhagolygon & Meta-data Konqueror yn gweithio yma
+Comment[da]=Her kan du indstille hvordan forhåndsvisninger & metadata fungerer i Konqueror
+Comment[de]=Hier können Sie das Verhalten von Vorschauen und Metadaten in Konqueror festlegen
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε το πως θα δουλεύουν οι Προεπισκοπήσεις & Μετα-δεδομένα του Konqueror
+Comment[eo]=Ĉi tie vi povas agordi kiel konkeranto antaŭrigardojn kaj metadatumojn kondutas.
+Comment[es]=Puede configurar como trabaja la previsualización y meta-datos de Konqueror
+Comment[et]=Siin saad seadistada, kuidas töötab Konquerori eelvaatlus ja metaandmete esitamine
+Comment[eu]=Konquerorren aurrebistak eta metadatuak nola egiten duten lan konfigura dezakezu hemen
+Comment[fa]=می‌توانید طرزکار پیش‌نمایشها و فراداده Konqueror را در اینجا پیکربندی کنید
+Comment[fi]=Tässä kohdassa voit määritellä, kuinka Konquerorin esikatselu ja metadata toimii
+Comment[fr]=Fonctionnement des aperçus et méta-informations de Konqueror
+Comment[fy]=Hjir kinne jo ynstelle hoe de foarbylden en metadata yn Konqueror wurkje
+Comment[gl]=Pode configurar aqui as Miniaturas e os Meta Datos en Konqueror
+Comment[he]=שינוי הדרך שבה פועלות תצוגות מקדימות ומידע־על ב־Konqueror
+Comment[hi]=आप यहाँ कॉन्फ़िगर कर सकते हैं कि कॉन्करर का पूर्वावलोकन व मेटा-डाटा कैसे काम करता है
+Comment[hr]=Konfiguriranje načina rada Konqueror pregleda i prikaza meta-podataka
+Comment[hu]=Itt lehet beállítani a Konqueror gyorsnézeteit és a jellemzők megjelenítési módját
+Comment[is]=Hér getur þú stillt hvernig Konqueror forsýnir skrár og meðhöndlar metagögn
+Comment[it]=Configura il funzionamento di anteprime ed informazioni aggiuntive di Konqueror
+Comment[ja]=Konqueror のプレビューとメタデータ機能を設定
+Comment[ka]=წინასწარ ხედვის და მეტა მონაცემების კონფიგურირება Konqueror-ში
+Comment[kk]= Konqueror нобайларды және мета-деректерді қалай көрсететінін баптау
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនាសម្ព័ន្ធ របៀប​ដែល​ការ​មើល​ជា​មុន & ទិន្នន័យ​មេតា Konqueror ដំណើរការ
+Comment[ko]=Konqueror의 미리 보기와 메타데이터 작업 설정
+Comment[lt]=Čia galite nustatyti, kaip veikia Konqueror peržiūros ir meta duomenų rodymas
+Comment[lv]=Šeit Jūs varat konfigurēt Iekarotāja failu priekšapskati un metadatu rādīšanu
+Comment[mk]=Конфигурирајте ја работата на прегледите и метаподатоците во Konqueror
+Comment[mn]=Энд та конкюрорын урьдчилан харах байдлыг тогтооно
+Comment[ms]=Anda boleh konfigur bagaimana Prapapar & Data Meta Konqueror berfungsi di sini
+Comment[mt]=Tista' tissettja kif jaħdmu l-previżjonijiet u meta-data ta' Konqueror minn hawn
+Comment[nb]=Tilpass hvordan forhåndsvisning og metadata skal virke i Konqueror
+Comment[nds]=Hier kannst Du instellen, wodennig Vöransichten un Meta-Daten in Konqueror arbeidt
+Comment[ne]=तपाईँले यहाँ कन्क्वेरर पूर्वावलोकन र मेटा-डेटाले गर्ने कार्य कन्फिगर गर्न सक्नुहुन्छ
+Comment[nl]=Hier kunt u instellen hoe de voorbeelden en metadata in Konqueror werken
+Comment[nn]=Her kan du velja korleis førehandsvising og metadata i Konqueror skal fungera
+Comment[pa]=ਇੱਥੇ ਤੁਸੀਂ ਕੋਨਕਿਉਰੋਰ ਝਾਤੀ ਅਤੇ ਮੈਟਾ-ਡਾਟਾ ਕੰਮ ਨੂੰ ਸੰਰਚਿਤ ਕਰ ਸਕਦੇ ਹੋ।
+Comment[pl]=Konfiguracja podglądów zawartości plików i metadanych w Konquerorze
+Comment[pt]=O utilizador pode configurar aqui como é que as Antevisões do Konqueror e os meta-dados funcionam aqui
+Comment[pt_BR]=Você pode configurar como funcionam as prévisualizações e metadados do Konqueror aqui
+Comment[ro]=Configurează funcționarea previzualizărilor și metainformațiilor în Konqueror
+Comment[ru]=Настройка создания миниатюр и показа мета-данных в Konqueror
+Comment[rw]=Ushobora kugena ukuntu Amagaragazambere ya Konqueror & Ibyatanzwe-bidasanzwe bikora hano
+Comment[se]=Dás sáhtát heivehit ovdačájeheamit ja metadáhtat galget doaibmat Konqueroras
+Comment[sk]=Nastavenie, ako fungujú náhľady a zisťovanie meta dát v Konquerore
+Comment[sl]=Nastavite lahko, kako delujejo Konquerorjevi ogledi in metapodatki
+Comment[sr]=Овде можете подесити како Konqueror-ови прегледи и мета подаци раде
+Comment[sr@Latn]=Ovde možete podesiti kako Konqueror-ovi pregledi i meta podaci rade
+Comment[sv]=Anpassa hur Konquerors förhandsgranskning och metadata fungerar
+Comment[ta]=கான்கொரர் முன்ஓட்டங்கள் மற்றும் மெடா-தகவல் எப்படி இயங்குகிறது என்பதை வடிவமைக்க முடியும்.
+Comment[tg]=Шумо метавонед чигунагии кори пешнамоиши Konqueror-ро ва Meta-data-ро дар инҷо танзим кунед.
+Comment[th]=คุณสามารถปรับแต่งการแสดงตัวอย่าง & ข้อมูลเมตาของคอนเควอร์เรอร์ได้ที่นี่
+Comment[tr]=Konqueror önizlemelerini buradan yapılandırabilirsiniz
+Comment[tt]=Konqueror'dağı Kürsätkeç eşen caylaw
+Comment[uk]=Тут можна налаштувати роботу попереднього перегляду Konqueror та метаданих
+Comment[uz]=Koʻrib chiqishlar va meta-maʼlumotni moslash
+Comment[uz@cyrillic]=Кўриб чиқишлар ва мета-маълумотни мослаш
+Comment[vi]=Bạn có thể cấu hình cách làm việc của bộ Xem trước & Thông tin tập tin của Konqueror ở đây
+Comment[wa]=Chal vos ploz apontyî comint Konqueror rote avou li Prévey & Meta-dnêyes
+Comment[zh_CN]=您可在此配置 Konqueror 预览和元数据工作的方式
+Comment[zh_TW]=您可以在這裡設定 Konqueror 的預覽與中繼資料如何運作
+Keywords=konqueror,filemanager,previews,file previews,maximum size
+Keywords[af]=konqueror,filemanager,previews,file previews,maximum grootte
+Keywords[ar]=كونكيورر،مسسير الملفات،المعاينات،إستعراض الملفات، الحجم الأقصى
+Keywords[be]=Кіраўнік файлаў,Прагляд,Перадпрагляд,Перадпрагляд файлаў,Прагляд файлаў,Найбольшы памер,konqueror,filemanager,previews,file previews,maximum size
+Keywords[bg]=данни, файл, мета, браузър, konqueror, filemanager,previews, file previews, maximum size
+Keywords[ca]=konqueror,gestor de fitxers,vistes prèvies,vistes prèvies de fitxers,mida màxima
+Keywords[cs]=Konqueror,Správce souborů,Náhledy,Náhledy souborů,Maximální velikost
+Keywords[csb]=konqueror,menedżer lopków,pòdzerczi,pòdzerczi zamkłosców lopków, maksymalnô miara
+Keywords[cy]=konqueror,rheolydd ffeiliau,rhagolygon ffeil,maint mwyaf
+Keywords[da]=konqueror,filhåndtering,forhåndsvisninger,filforhåndsvisninger,maksimal størrelse
+Keywords[de]=Konqueror,Dateimanager,Vorschau,Dateivorschau,Dateigrößen
+Keywords[el]=konqueror,διαχειριστής αρχείων,προεπισκοπήσεις,προεπισκοπήσεις αρχείων,μέγιστο μέγεθος
+Keywords[eo]=konkeranto,dieradministrilo,antaŭrigardoj
+Keywords[es]=konqueror,gestor de archivos,previsualizaciones,previsualizaciones de archivos, tamaño máximo
+Keywords[et]=konqueror,failihaldur,eelvaatlused,faili eelvaatlus,maksimaalne suurus
+Keywords[eu]=konqueror,fitxategi kudeatzailea,aurrebistak,fitxategi aurrebistak, gehienezko neurria
+Keywords[fa]=konqueror، مدیر پرونده، پیش‌نمایشها، پیش‌نمایشهای پرونده، بیشینۀ اندازه
+Keywords[fi]=konqueror,tiedostonhallinta,eikatselu,tiedoston esikatselu,maksimikoko
+Keywords[fr]=konqueror,gestionnaire de fichiers,explorateur,aperçus,taille maximale
+Keywords[fy]=konqueror,filemanager,triembehearder,previews,foarbylden,foarútsjen,triemmenfoarbylden,maksimum grutte
+Keywords[ga]=konqueror,bainisteoir comhad,réamhamharc,réamhamharc comhad,uasmhéid
+Keywords[gl]=konqueror,xestor de ficheiros,antever,miniaturas de ficheiros,tamaño máximo
+Keywords[he]=konqueror,מנהל קבצים,תצוגות מקדימות,גודל מרבי, filemanager,previews,file previews,maximum size
+Keywords[hi]=कॉन्करर,फ़ाइलप्रबंधक,पूर्वावलोकन,फ़ाइल पूर्वावलोकन,अधिकतम आकार
+Keywords[hr]=konqueror,filemanager,previews,file previews,maximum size,upravljač datotekama,pregled,pregled datoteka,najveća veličina
+Keywords[hu]=Konqueror,fájlkezelő,gyorsnézetek,fájl-gyorsnézetek,maximális méret
+Keywords[is]=konqueror,skráastjóri,forsýna,forsýna skrár,hámarks stærð
+Keywords[it]=konqueror,filemanager,anteprime,anteprime file,dimensione massima
+Keywords[ja]=konqueror,ファイルマネージャ,プレビュー,ファイルのプレビュー,最大サイズ
+Keywords[km]=konqueror,កម្មវិធី​គ្រប់គ្រង​ឯកសារ,មើល​ជា​មុន,មើល​ឯកសារ​ជា​មុន,ទំហំ​អតិបរមា
+Keywords[lt]=konqueror,filemanager,previews,file previews,maximum size, bylų tvarkyklė, peržiūros, bylų peržiūros, didžiausias dydis
+Keywords[lv]=Iekarotājs,failu menedžeris,priekšapskate,failu priekšapskate,maksimālais izmērs
+Keywords[mk]=konqueror,filemanager,previews,file previews,maximum size,менаџер на датотеки, прегледи, прегледи на датотеки,максимална големина
+Keywords[mn]=Конкюрор,Файл удирдагч,Урьдчилан харах,Файл харах,Файлын хэмжээ
+Keywords[mt]=konqueror,filemanager,previews,file previews,maximum size,manager tal-fajls,previżjoni,daqs massimu
+Keywords[nb]=konqueror,forhåndsvisning,fil,filbehandler,forhåndsvisning,filvisning,største størrelse
+Keywords[nds]=Konqueror,Dateipleger,Vöransichten,Dateivöransicht,maximale Grött
+Keywords[ne]=कन्क्वेरर, फाइल व्वस्थापक, पूर्वावलोकन, फाइल पूर्वावलोकन, अधिकतम साइज
+Keywords[nl]=konqueror,filemanager,bestandsbeheer,previews,voorbeelden,vooruitblikken,bestandsvoorbeelden,maximum grootte
+Keywords[nn]=Konqueror,filhandsamar,førehandsvising,filvising,høgste storleik
+Keywords[nso]=konqueror,molaodi wa faele,diponelopele,diponelopele tsa faele,bogolo bja magomo a godimo
+Keywords[pa]=ਕੋਨਕਿਉਰਰ,ਫਾਇਲ ਮੈਨੇਜਰ,ਝਲਕ,ਫਾਇਲ ਝਲਕ,ਵੱਧ ਤੋਂ ਵੱਧ ਅਕਾਰ
+Keywords[pl]=konqueror,menedżer plików,podglądy,podglądy zawartości plików, rozmiar maksymalny
+Keywords[pt]=konqueror,gestor de ficheiros,antevisões,antevisões de ficheiros,tamanho máximo
+Keywords[pt_BR]=konqueror,gerenciador de arquivos,visualização,pré-visualizações de arquivos,tamanho máximo,previsões
+Keywords[ro]=konqueror,manager de fișiere,previzualizări,mărime maximă
+Keywords[rw]=Konqueror,mugengadosiye,amagaragazambere,amagaragazambere y'idosiye,ingano ntarengwa
+Keywords[se]=konqueror,fiilagieđahalli,ovdačájeheamit,fiilaovdačájeheamit,badjerádji sturrodat
+Keywords[sk]=konqueror,správa súborov,náhľady,náhľady súborov,maximálna veľkosť
+Keywords[sl]=konqueror,upravitelj datotek,upravljalnik,predogled,ogled,največja velikost
+Keywords[sr]=konqueror,filemanager,прегледи,прегледи фајлова,максимална величина
+Keywords[sr@Latn]=konqueror,filemanager,pregledi,pregledi fajlova,maksimalna veličina
+Keywords[sv]=konqueror,filhanterare,förhandsgranskning,maximal storlek
+Keywords[ta]=கான்கொரர்,கோப்பு மேலாளர்,முன்காட்சிகள்,கோப்பு முன்காட்சிகள்,அதிகப்பட்ச அளவு
+Keywords[tg]=konqueror,filemanager,previews,file previews,maximum size, конкурор, мудири файл, пешнамоиш, файли пешнамоиш, андозаи калонтарин
+Keywords[th]=คอนเควอร์เรอร์,จัดการแฟ้ม,แสดงตัวอย่าง,แสดงตัวอย่างแฟ้ม,ขนาดสูงสุด
+Keywords[tr]=konqueror,dosya yöneticisi,önizlemeler,azami boyut,dosya önizleme
+Keywords[uk]=konqueror,менеджер файлів,перегляд,перегляд файлів,максимальний розмір
+Keywords[uz]=konqueror,fayl boshqaruvchi,koʻrib chiqishlar,faylni koʻrib chiqish
+Keywords[uz@cyrillic]=konqueror,файл бошқарувчи,кўриб чиқишлар,файлни кўриб чиқиш
+Keywords[ven]=konqueror,mulanguli wa faela,mbonelaphanda,mbonelaphanda ya faela,saizi khulwane
+Keywords[vi]=konqueror,trình quản lý tập tin,xem trước,xem trước tập tin,cỡ lớn nhất
+Keywords[wa]=konqueror,manaedjeu di fitchî,prévey,prévey les fitchîs,grandeu macsimom
+Keywords[xh]=konqueror,umphathi wefayile,imboniselo. iimboniselo zefayile,yandisa ubungakanani
+Keywords[zh_CN]=konqueror,filemanager,previews,file previews,maximum size,文件管理器,预览,文件预览,最大大小
+Keywords[zh_TW]=konqueror,filemanager,previews,file previews,maximum size,征服家,檔案管理程式,預覽,檔案預覽,最大大小,
+Keywords[zu]=konqueror,imenenja yamafayela,imibukiso yangaphambili, imibukiso yangaphambili yamafayela,usayizi ophezulu
diff --git a/kcontrol/konq/fontopts.cpp b/kcontrol/konq/fontopts.cpp
new file mode 100644
index 000000000..66cc3962c
--- /dev/null
+++ b/kcontrol/konq/fontopts.cpp
@@ -0,0 +1,387 @@
+/* This file is part of the KDE project
+ Copyright (C) 1999 David Faure <faure@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <assert.h>
+
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kcolorbutton.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kfontcombo.h>
+#include <kfontdialog.h>
+#include <klocale.h>
+#include <konq_defaults.h> // include default values directly from konqueror
+
+#include "fontopts.h"
+
+
+//-----------------------------------------------------------------------------
+
+KonqFontOptions::KonqFontOptions(KConfig *config, QString group, bool desktop, QWidget *parent, const char* /*name*/)
+ : KCModule( parent, "kcmkonq" ), g_pConfig(config), groupname(group), m_bDesktop(desktop)
+{
+ QLabel *label;
+ QString wtstr;
+ int row = 0;
+
+ int LASTLINE = m_bDesktop ? 8 : 10; // this can be different :)
+#define LASTCOLUMN 2
+ QGridLayout *lay = new QGridLayout(this,LASTLINE+1,LASTCOLUMN+1, 0,
+ KDialog::spacingHint());
+ lay->setRowStretch(LASTLINE,10);
+ lay->setColStretch(LASTCOLUMN,10);
+
+ row++;
+
+ m_pStandard = new KFontCombo( this );
+ label = new QLabel( m_pStandard, i18n("&Standard font:"), this );
+ lay->addWidget(label,row,0);
+ lay->addMultiCellWidget(m_pStandard,row,row,1,1);
+
+ wtstr = i18n("This is the font used to display text in Konqueror windows.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( m_pStandard, wtstr );
+
+ row++;
+ connect( m_pStandard, SIGNAL( activated(const QString&) ),
+ SLOT( slotStandardFont(const QString&) ) );
+ connect( m_pStandard, SIGNAL( activated(const QString&) ),
+ SLOT(changed() ) );
+ connect( m_pStandard, SIGNAL( textChanged(const QString&) ),
+ SLOT( slotStandardFont(const QString&) ) );
+ connect( m_pStandard, SIGNAL( textChanged(const QString&) ),
+ SLOT(changed() ) );
+
+ m_pSize = new QSpinBox( 4,18,1,this );
+ label = new QLabel( m_pSize, i18n("Font si&ze:"), this );
+ lay->addWidget(label,row,0);
+ lay->addMultiCellWidget(m_pSize,row,row,1,1);
+
+ connect( m_pSize, SIGNAL( valueChanged(int) ),
+ this, SLOT( slotFontSize(int) ) );
+ row+=2;
+
+ wtstr = i18n("This is the font size used to display text in Konqueror windows.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( m_pSize, wtstr );
+ int hAlign = QApplication::reverseLayout() ? AlignRight : AlignLeft;
+
+ //
+#define COLOR_BUTTON_COL 1
+ m_pNormalText = new KColorButton( normalTextColor, this );
+ label = new QLabel( m_pNormalText, i18n("Normal te&xt color:"), this );
+ lay->addWidget(label,row,0);
+ lay->addWidget(m_pNormalText,row,COLOR_BUTTON_COL,hAlign);
+
+ wtstr = i18n("This is the color used to display text in Konqueror windows.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( m_pNormalText, wtstr );
+
+ connect( m_pNormalText, SIGNAL( changed( const QColor & ) ),
+ SLOT( slotNormalTextColorChanged( const QColor & ) ) );
+
+ /*
+ row++;
+ label = new QLabel( i18n("Highlighted text color:"), this );
+ lay->addWidget(label,row,0);
+
+ m_pHighlightedText = new KColorButton( highlightedTextColor, this );
+ lay->addWidget(m_pHighlightedText,row,COLOR_BUTTON_COL,hAlign);
+
+ wtstr = i18n("This is the color used to display selected text in Konqueror windows.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( m_pHighlightedText, wtstr );
+
+ connect( m_pHighlightedText, SIGNAL( changed( const QColor & ) ),
+ SLOT( slotHighlightedTextColorChanged( const QColor & ) ) );
+ */
+
+ row++;
+
+ if ( m_bDesktop )
+ {
+ m_cbTextBackground = new QCheckBox( i18n("&Text background color:"), this );
+ lay->addWidget(m_cbTextBackground,row,0);
+ connect( m_cbTextBackground, SIGNAL( clicked() ),
+ SLOT( slotTextBackgroundClicked() ) );
+
+ m_pTextBackground = new KColorButton( textBackgroundColor, this );
+ lay->addWidget(m_pTextBackground,row,COLOR_BUTTON_COL,hAlign);
+
+ wtstr = i18n("This is the color used behind the text for the icons on the desktop.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( m_pTextBackground, wtstr );
+
+ connect( m_pTextBackground, SIGNAL( changed( const QColor & ) ),
+ SLOT( slotTextBackgroundColorChanged( const QColor & ) ) );
+
+ row++;
+ }
+ else
+ {
+ m_pNbLines = new QSpinBox( 1, 10, 1, this );
+ QLabel* label = new QLabel( m_pNbLines, i18n("H&eight for icon text:"), this );
+ lay->addWidget( label, row, 0 );
+ lay->addWidget( m_pNbLines, row, 1 );
+ connect( m_pNbLines, SIGNAL( valueChanged(int) ),
+ this, SLOT( changed() ) );
+ connect( m_pNbLines, SIGNAL( valueChanged(int) ),
+ SLOT( slotPNbLinesChanged(int)) );
+
+ QString thwt = i18n("This is the maximum number of lines that can be"
+ " used to draw icon text. Long file names are"
+ " truncated at the end of the last line.");
+ QWhatsThis::add( label, thwt );
+ QWhatsThis::add( m_pNbLines, thwt );
+
+ row++;
+
+ // width for the items in multicolumn icon view
+ m_pNbWidth = new QSpinBox( 1, 100000, 1, this );
+
+ label = new QLabel( m_pNbWidth, i18n("&Width for icon text:"), this );
+ lay->addWidget( label, row, 0 );
+ lay->addWidget( m_pNbWidth, row, 1 );
+ connect( m_pNbWidth, SIGNAL( valueChanged(int) ),
+ this, SLOT( changed() ) );
+ connect( m_pNbWidth, SIGNAL( valueChanged(int) ),
+ SLOT( slotPNbWidthChanged(int)) );
+
+ thwt = i18n( "This is the maximum width for the icon text when konqueror "
+ "is used in multi column view mode." );
+ QWhatsThis::add( label, thwt );
+ QWhatsThis::add( m_pNbWidth, thwt );
+
+ row++;
+ }
+
+ cbUnderline = new QCheckBox(i18n("&Underline filenames"), this);
+ lay->addMultiCellWidget(cbUnderline,row,row,0,LASTCOLUMN,hAlign);
+ connect(cbUnderline, SIGNAL(clicked()), this, SLOT(changed()));
+
+ QWhatsThis::add( cbUnderline, i18n("Checking this option will result in filenames"
+ " being underlined, so that they look like links on a web page. Note:"
+ " to complete the analogy, make sure that single click activation is"
+ " enabled in the mouse control module.") );
+
+ if ( !m_bDesktop )
+ {
+ row++;
+
+ m_pSizeInBytes = new QCheckBox(i18n("Display file sizes in b&ytes"), this);
+ lay->addMultiCellWidget( m_pSizeInBytes,row,row,0,LASTCOLUMN,hAlign );
+ connect( m_pSizeInBytes, SIGNAL(clicked()), this, SLOT(changed()) );
+
+ QWhatsThis::add( m_pSizeInBytes, i18n("Checking this option will result in file sizes"
+ " being displayed in bytes. Otherwise file sizes are"
+ " being displayed in kilobytes or megabytes if appropriate.") );
+ }
+ row++;
+
+ assert( row == LASTLINE-1 );
+ // The last line is empty and grows if resized
+
+ load();
+}
+
+void KonqFontOptions::slotFontSize(int i)
+{
+ m_fSize = i;
+ changed();
+}
+
+void KonqFontOptions::slotStandardFont(const QString& n )
+{
+ m_stdName = n;
+}
+
+void KonqFontOptions::slotPNbLinesChanged(int value)
+{
+ m_pNbLines->setSuffix( i18n( " line", " lines", value ) );
+}
+
+void KonqFontOptions::slotPNbWidthChanged(int value)
+{
+ m_pNbWidth->setSuffix( i18n( " pixel", " pixels", value ) );
+}
+
+void KonqFontOptions::load()
+{
+ load( false );
+}
+
+void KonqFontOptions::load( bool useDefaults )
+{
+ g_pConfig->setReadDefaults( useDefaults );
+
+ g_pConfig->setGroup(groupname);
+
+ QFont stdFont = g_pConfig->readFontEntry( "StandardFont" );
+ m_stdName = stdFont.family();
+ m_fSize = stdFont.pointSize();
+ // we have to use QFontInfo, in case the font was specified with a pixel size
+ if ( m_fSize == -1 )
+ m_fSize = QFontInfo(stdFont).pointSize();
+
+ normalTextColor = KGlobalSettings::textColor();
+ normalTextColor = g_pConfig->readColorEntry( "NormalTextColor", &normalTextColor );
+ m_pNormalText->setColor( normalTextColor );
+
+ /* highlightedTextColor = KGlobalSettings::highlightedTextColor();
+ highlightedTextColor = g_pConfig->readColorEntry( "HighlightedTextColor", &highlightedTextColor );
+ m_pHighlightedText->setColor( highlightedTextColor );
+ */
+
+ if ( m_bDesktop )
+ {
+ textBackgroundColor = g_pConfig->readColorEntry( "ItemTextBackground" );
+ m_cbTextBackground->setChecked(textBackgroundColor.isValid());
+ m_pTextBackground->setEnabled(textBackgroundColor.isValid());
+ m_pTextBackground->setColor( textBackgroundColor );
+ // Don't keep an invalid color around, otherwise checking the checkbox still gives invalid.
+ if ( !textBackgroundColor.isValid() )
+ textBackgroundColor = Qt::black;
+ }
+ else
+ {
+ int n = g_pConfig->readNumEntry( "TextHeight", 0 );
+ if ( n == 0 ) {
+ if ( g_pConfig->readBoolEntry( "WordWrapText", true ) )
+ n = DEFAULT_TEXTHEIGHT;
+ else
+ n = 1;
+ }
+ m_pNbLines->setValue( n );
+
+ n = g_pConfig->readNumEntry( "TextWidth", DEFAULT_TEXTWIDTH_MULTICOLUMN );
+ m_pNbWidth->setValue( n );
+
+ m_pSizeInBytes->setChecked( g_pConfig->readBoolEntry( "DisplayFileSizeInBytes", DEFAULT_FILESIZEINBYTES ) );
+ }
+ cbUnderline->setChecked( g_pConfig->readBoolEntry("UnderlineLinks", DEFAULT_UNDERLINELINKS ) );
+
+ KConfig cfg("kdeglobals");
+ cfg.setGroup("DesktopIcons");
+
+ updateGUI();
+ emit changed( useDefaults );
+}
+
+void KonqFontOptions::defaults()
+{
+ load( true );
+}
+
+void KonqFontOptions::updateGUI()
+{
+ if ( m_stdName.isEmpty() )
+ m_stdName = KGlobalSettings::generalFont().family();
+
+ m_pStandard->setCurrentFont( m_stdName );
+ m_pSize->setValue( m_fSize );
+}
+
+void KonqFontOptions::save()
+{
+ g_pConfig->setGroup(groupname);
+
+ QFont stdFont( m_stdName, m_fSize );
+ g_pConfig->writeEntry( "StandardFont", stdFont );
+
+ g_pConfig->writeEntry( "NormalTextColor", normalTextColor );
+ //g_pConfig->writeEntry( "HighlightedTextColor", highlightedTextColor );
+ if ( m_bDesktop )
+ g_pConfig->writeEntry( "ItemTextBackground", m_cbTextBackground->isChecked() ? textBackgroundColor : QColor());
+ else
+ {
+ g_pConfig->writeEntry( "TextHeight", m_pNbLines->value() );
+ g_pConfig->writeEntry( "TextWidth", m_pNbWidth->value() );
+ g_pConfig->writeEntry( "DisplayFileSizeInBytes", m_pSizeInBytes->isChecked() );
+ }
+ g_pConfig->writeEntry( "UnderlineLinks", cbUnderline->isChecked() );
+ g_pConfig->sync();
+
+ KConfig cfg("kdeglobals");
+ cfg.setGroup("DesktopIcons");
+
+ // Send signal to konqueror
+ // Warning. In case something is added/changed here, keep kfmclient in sync
+ QByteArray data;
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ kapp->dcopClient()->send( "konqueror*", "KonquerorIface", "reparseConfiguration()", data );
+
+ // Tell kdesktop about the new config file
+ int konq_screen_number = KApplication::desktop()->primaryScreen();
+ QCString appname;
+ if (konq_screen_number == 0)
+ appname = "kdesktop";
+ else
+ appname.sprintf("kdesktop-screen-%d", konq_screen_number);
+ kapp->dcopClient()->send( appname, "KDesktopIface", "configure()", data );
+}
+
+void KonqFontOptions::slotTextBackgroundClicked()
+{
+ m_pTextBackground->setEnabled( m_cbTextBackground->isChecked() );
+ changed();
+}
+
+void KonqFontOptions::slotNormalTextColorChanged( const QColor &col )
+{
+ if ( normalTextColor != col )
+ {
+ normalTextColor = col;
+ changed();
+ }
+}
+
+/*
+void KonqFontOptions::slotHighlightedTextColorChanged( const QColor &col )
+{
+ if ( highlightedTextColor != col )
+ {
+ highlightedTextColor = col;
+ changed();
+ }
+}
+*/
+
+void KonqFontOptions::slotTextBackgroundColorChanged( const QColor &col )
+{
+ if ( textBackgroundColor != col )
+ {
+ textBackgroundColor = col;
+ changed();
+ }
+}
+
+QString KonqFontOptions::quickHelp() const
+{
+ return i18n("<h1>Appearance</h1> You can configure how Konqueror looks as a file manager here.");
+}
+
+#include "fontopts.moc"
diff --git a/kcontrol/konq/fontopts.h b/kcontrol/konq/fontopts.h
new file mode 100644
index 000000000..18473c18d
--- /dev/null
+++ b/kcontrol/konq/fontopts.h
@@ -0,0 +1,112 @@
+/* This file is part of the KDE project
+ Copyright (C) 1999 David Faure <faure@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+//-----------------------------------------------------------------------------
+//
+// Konqueror/KDesktop Fonts & Colors Options (for icon/tree view)
+//
+// (c) Martin R. Jones 1996
+// (c) Bernd Wuebben 1998
+//
+// KControl port & modifications
+// (c) Torben Weis 1998
+//
+// End of the KControl port by David
+// Port to KControl 2 by MHK
+// konqy adaptations by David
+
+#ifndef __KONQFONT_OPTIONS_H__
+#define __KONQFONT_OPTIONS_H__
+
+#include <qstringlist.h>
+#include <qspinbox.h>
+
+#include <kcmodule.h>
+
+class QCheckBox;
+class QRadioButton;
+
+class KColorButton;
+class KConfig;
+class KFontCombo;
+
+
+//-----------------------------------------------------------------------------
+
+class KonqFontOptions : public KCModule
+{
+ Q_OBJECT
+public:
+ KonqFontOptions(KConfig *config, QString group, bool desktop, QWidget *parent=0, const char *name=0);
+ QString quickHelp() const;
+
+ virtual void load();
+ virtual void load( bool readDefaults );
+ virtual void save();
+ virtual void defaults();
+
+public slots:
+ void slotFontSize(int i);
+ void slotStandardFont(const QString& n);
+ void slotTextBackgroundClicked();
+
+ void slotNormalTextColorChanged( const QColor &col );
+ //void slotHighlightedTextColorChanged( const QColor &col );
+ void slotTextBackgroundColorChanged( const QColor &col );
+
+private slots:
+ void slotPNbLinesChanged(int value);
+ void slotPNbWidthChanged(int value);
+
+private:
+ void updateGUI();
+
+private:
+
+ KConfig *g_pConfig;
+ QString groupname;
+ bool m_bDesktop;
+
+ /*
+ QRadioButton* m_pSmall;
+ QRadioButton* m_pMedium;
+ QRadioButton* m_pLarge;
+ */
+ KFontCombo* m_pStandard;
+ QSpinBox* m_pSize;
+
+ int m_fSize;
+ QString m_stdName;
+
+ KColorButton* m_pBg;
+ KColorButton* m_pNormalText;
+ //KColorButton* m_pHighlightedText;
+ QCheckBox* m_cbTextBackground;
+ KColorButton* m_pTextBackground;
+ QColor normalTextColor;
+ //QColor highlightedTextColor;
+ QColor textBackgroundColor;
+
+ QSpinBox* m_pNbLines;
+ QSpinBox* m_pNbWidth;
+ QCheckBox* cbUnderline;
+ QCheckBox* m_pSizeInBytes;
+};
+
+#endif
diff --git a/kcontrol/konq/main.cpp b/kcontrol/konq/main.cpp
new file mode 100644
index 000000000..dc9a08380
--- /dev/null
+++ b/kcontrol/konq/main.cpp
@@ -0,0 +1,98 @@
+/*
+ * main.cpp
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ *
+ * 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 "rootopts.h"
+#include "behaviour.h"
+#include "fontopts.h"
+#include "desktop.h"
+#include "previews.h"
+#include "browser.h"
+#include "desktopbehavior_impl.h"
+
+#include <kconfig.h>
+#include <kapplication.h>
+
+static QCString configname()
+{
+ int desktop = KApplication::desktop()->primaryScreen();
+ QCString name;
+ if (desktop == 0)
+ name = "kdesktoprc";
+ else
+ name.sprintf("kdesktop-screen-%drc", desktop);
+
+ return name;
+}
+
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_browser(QWidget *parent, const char *name)
+ {
+ KConfig *config = new KConfig("konquerorrc", false, true);
+ return new KBrowserOptions(config, "FMSettings", parent, name);
+ }
+
+ KDE_EXPORT KCModule *create_behavior(QWidget *parent, const char *name)
+ {
+ KConfig *config = new KConfig("konquerorrc", false, true);
+ return new KBehaviourOptions(config, "FMSettings", parent, name);
+ }
+
+ KDE_EXPORT KCModule *create_appearance(QWidget *parent, const char *name)
+ {
+ KConfig *config = new KConfig("konquerorrc", false, true);
+ return new KonqFontOptions(config, "FMSettings", false, parent, name);
+ }
+
+ KDE_EXPORT KCModule *create_previews(QWidget *parent, const char *name)
+ {
+ return new KPreviewOptions(parent, name);
+ }
+
+ KDE_EXPORT KCModule *create_dbehavior(QWidget *parent, const char* /*name*/)
+ {
+ KConfig *config = new KConfig(configname(), false, false);
+ return new DesktopBehaviorModule(config, parent);
+ }
+
+ KDE_EXPORT KCModule *create_dappearance(QWidget *parent, const char* /*name*/)
+ {
+ KConfig *config = new KConfig(configname(), false, false);
+ return new KonqFontOptions(config, "FMSettings", true, parent);
+ }
+
+ KDE_EXPORT KCModule *create_dpath(QWidget *parent, const char* /*name*/)
+ {
+ //KConfig *config = new KConfig(configname(), false, false);
+ return new DesktopPathConfig(parent);
+ }
+
+ KDE_EXPORT KCModule *create_ddesktop(QWidget *parent, const char* /*name*/)
+ {
+ return new KDesktopConfig(parent, "VirtualDesktops");
+ }
+}
+
+
diff --git a/kcontrol/konq/onlyone.png b/kcontrol/konq/onlyone.png
new file mode 100644
index 000000000..03cb65b9c
--- /dev/null
+++ b/kcontrol/konq/onlyone.png
Binary files differ
diff --git a/kcontrol/konq/overlapping.png b/kcontrol/konq/overlapping.png
new file mode 100644
index 000000000..93adb259e
--- /dev/null
+++ b/kcontrol/konq/overlapping.png
Binary files differ
diff --git a/kcontrol/konq/previews.cpp b/kcontrol/konq/previews.cpp
new file mode 100644
index 000000000..20d9a4499
--- /dev/null
+++ b/kcontrol/konq/previews.cpp
@@ -0,0 +1,219 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 2002 David Faure <faure@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+//
+// File previews configuration
+//
+
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <knuminput.h>
+#include <kprotocolinfo.h>
+
+#include "previews.h"
+
+//-----------------------------------------------------------------------------
+
+class PreviewCheckListItem : public QCheckListItem
+{
+ public:
+ PreviewCheckListItem( QListView *parent, const QString &text )
+ : QCheckListItem( parent, text, CheckBoxController )
+ {}
+
+ PreviewCheckListItem( QListViewItem *parent, const QString &text )
+ : QCheckListItem( parent, text, CheckBox )
+ {}
+
+ protected:
+ void stateChange( bool )
+ {
+ static_cast<KPreviewOptions *>( listView()->parent() )->changed();
+ }
+};
+
+KPreviewOptions::KPreviewOptions( QWidget *parent, const char */*name*/ )
+ : KCModule( parent, "kcmkonq" )
+{
+ QVBoxLayout *lay = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ lay->addWidget( new QLabel( i18n("<p>Allow previews, \"Folder Icons Reflect Contents\", and "
+ "retrieval of meta-data on protocols:</p>"), this ) );
+
+ setQuickHelp( i18n("<h1>Preview Options</h1> Here you can modify the behavior "
+ "of Konqueror when it shows the files in a folder."
+ "<h2>The list of protocols:</h2> check the protocols over which "
+ "previews should be shown; uncheck those over which they should not. "
+ "For instance, you might want to show previews over SMB if the local "
+ "network is fast enough, but you might disable it for FTP if you often "
+ "visit very slow FTP sites with large images."
+ "<h2>Maximum File Size:</h2> select the maximum file size for which "
+ "previews should be generated. For instance, if set to 1 MB (the default), "
+ "no preview will be generated for files bigger than 1 MB, for speed reasons."));
+
+ // Listview containing checkboxes for all protocols that support listing
+ KListView *listView = new KListView( this, "listView" );
+ listView->addColumn( i18n( "Select Protocols" ) );
+ listView->setFullWidth( true );
+
+ QHBoxLayout *hbox = new QHBoxLayout( lay );
+ hbox->addWidget( listView );
+ hbox->addStretch();
+
+ PreviewCheckListItem *localItems = new PreviewCheckListItem( listView,
+ i18n( "Local Protocols" ) );
+ PreviewCheckListItem *inetItems = new PreviewCheckListItem( listView,
+ i18n( "Internet Protocols" ) );
+
+ QStringList protocolList = KProtocolInfo::protocols();
+ protocolList.sort();
+ QStringList::Iterator it = protocolList.begin();
+
+ KURL url;
+ url.setPath("/");
+
+ for ( ; it != protocolList.end() ; ++it )
+ {
+ url.setProtocol( *it );
+ if ( KProtocolInfo::supportsListing( url ) )
+ {
+ QCheckListItem *item;
+ if ( KProtocolInfo::protocolClass( *it ) == ":local" )
+ item = new PreviewCheckListItem( localItems, ( *it ) );
+ else
+ item = new PreviewCheckListItem( inetItems, ( *it ) );
+
+ m_items.append( item );
+ }
+ }
+
+ listView->setOpen( localItems, true );
+ listView->setOpen( inetItems, true );
+
+ QWhatsThis::add( listView,
+ i18n("This option makes it possible to choose when the file previews, "
+ "smart folder icons, and meta-data in the File Manager should be activated.\n"
+ "In the list of protocols that appear, select which ones are fast "
+ "enough for you to allow previews to be generated.") );
+
+ QLabel *label = new QLabel( i18n( "&Maximum file size:" ), this );
+ lay->addWidget( label );
+
+ m_maxSize = new KDoubleNumInput( this );
+ m_maxSize->setSuffix( i18n(" MB") );
+ m_maxSize->setRange( 0.02, 10, 0.02, true );
+ m_maxSize->setPrecision( 1 );
+ label->setBuddy( m_maxSize );
+ lay->addWidget( m_maxSize );
+ connect( m_maxSize, SIGNAL( valueChanged(double) ), SLOT( changed() ) );
+
+ m_boostSize = new QCheckBox(i18n("&Increase size of previews relative to icons"), this);
+ connect( m_boostSize, SIGNAL( toggled(bool) ), SLOT( changed() ) );
+ lay->addWidget(m_boostSize);
+
+ m_useFileThumbnails = new QCheckBox(i18n("&Use thumbnails embedded in files"), this);
+ connect( m_useFileThumbnails, SIGNAL( toggled(bool) ), SLOT( changed() ) );
+
+ lay->addWidget(m_useFileThumbnails);
+
+ QWhatsThis::add( m_useFileThumbnails,
+ i18n("Select this to use thumbnails that are found inside some "
+ "file types (e.g. JPEG). This will increase speed and reduce "
+ "disk usage. Deselect it if you have files that have been processed "
+ "by programs which create inaccurate thumbnails, such as ImageMagick.") );
+
+ lay->addWidget( new QWidget(this), 10 );
+
+ load();
+}
+
+// Default: 1 MB
+#define DEFAULT_MAXSIZE (1024*1024)
+
+void KPreviewOptions::load(bool useDefaults)
+{
+ // *** load and apply to GUI ***
+ KGlobal::config()->setReadDefaults(useDefaults);
+ KConfigGroup group( KGlobal::config(), "PreviewSettings" );
+ QPtrListIterator<QCheckListItem> it( m_items );
+
+ for ( ; it.current() ; ++it ) {
+ QString protocol( it.current()->text() );
+ if ( ( protocol == "file" ) && ( !group.hasKey ( protocol ) ) )
+ // file should be enabled in case is not defined because if not so
+ // than preview's lost when size is changed from default one
+ it.current()->setOn( true );
+ else
+ it.current()->setOn( group.readBoolEntry( protocol, false ) );
+ }
+ // config key is in bytes (default value 1MB), numinput is in MB
+ m_maxSize->setValue( ((double)group.readNumEntry( "MaximumSize", DEFAULT_MAXSIZE )) / (1024*1024) );
+
+ m_boostSize->setChecked( group.readBoolEntry( "BoostSize", false /*default*/ ) );
+ m_useFileThumbnails->setChecked( group.readBoolEntry( "UseFileThumbnails", true /*default*/ ) );
+ KGlobal::config()->setReadDefaults(false);
+}
+
+void KPreviewOptions::load()
+{
+ load(false);
+}
+
+void KPreviewOptions::defaults()
+{
+ load(true);
+}
+
+void KPreviewOptions::save()
+{
+ KConfigGroup group( KGlobal::config(), "PreviewSettings" );
+ QPtrListIterator<QCheckListItem> it( m_items );
+ for ( ; it.current() ; ++it ) {
+ QString protocol( it.current()->text() );
+ group.writeEntry( protocol, it.current()->isOn(), true, true );
+ }
+ // config key is in bytes, numinput is in MB
+ group.writeEntry( "MaximumSize", qRound( m_maxSize->value() *1024*1024 ), true, true );
+ group.writeEntry( "BoostSize", m_boostSize->isChecked(), true, true );
+ group.writeEntry( "UseFileThumbnails", m_useFileThumbnails->isChecked(), true, true );
+ group.sync();
+
+ // Send signal to konqueror
+ // Warning. In case something is added/changed here, keep kfmclient in sync
+ QByteArray data;
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ kapp->dcopClient()->send( "konqueror*", "KonquerorIface", "reparseConfiguration()", data );
+}
+
+void KPreviewOptions::changed()
+{
+ emit KCModule::changed(true);
+}
+
+#include "previews.moc"
diff --git a/kcontrol/konq/previews.h b/kcontrol/konq/previews.h
new file mode 100644
index 000000000..b91e7b563
--- /dev/null
+++ b/kcontrol/konq/previews.h
@@ -0,0 +1,65 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 2002 David Faure <faure@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+//
+// File previews configuration
+//
+
+#ifndef _PREVIEWS_OPTIONS_H
+#define _PREVIEWS_OPTIONS_H
+
+/*
+
+The "Previews" Tab contains :
+
+List of protocols that support listing, with a checkbox for each
+Configuration of the maximum image size
+
+*/
+
+#include <qstring.h>
+
+#include <kcmodule.h>
+
+class KConfig;
+class QCheckBox;
+class QCheckListItem;
+class KDoubleNumInput;
+
+class KPreviewOptions : public KCModule
+{
+ Q_OBJECT
+public:
+ KPreviewOptions( QWidget *parent = 0L, const char *name = 0L );
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+
+protected:
+ void load(bool useDefaults);
+
+public slots:
+ void changed();
+
+private:
+ QPtrList<QCheckListItem> m_items;
+ KDoubleNumInput *m_maxSize;
+ QCheckBox *m_boostSize;
+ QCheckBox *m_useFileThumbnails;
+};
+
+#endif
diff --git a/kcontrol/konq/rootopts.cpp b/kcontrol/konq/rootopts.cpp
new file mode 100644
index 000000000..c546aa3ee
--- /dev/null
+++ b/kcontrol/konq/rootopts.cpp
@@ -0,0 +1,345 @@
+//
+//
+// "Desktop Options" Tab for KDesktop configuration
+//
+// (c) Martin R. Jones 1996
+// (c) Bernd Wuebben 1998
+//
+// Layouts
+// (c) Christian Tibirna 1998
+// Port to KControl, split from Misc Tab, Port to KControl2
+// (c) David Faure 1998
+// Desktop menus, paths
+// (c) David Faure 2000
+
+#include <config.h>
+
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qvgroupbox.h>
+#include <qwhatsthis.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kcustommenueditor.h>
+#include <kdebug.h>
+#include <kfileitem.h>
+#include <kglobalsettings.h>
+#include <kipc.h>
+#include <klistview.h>
+#include <kio/job.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kmimetype.h>
+#include <kstandarddirs.h>
+#include <ktrader.h>
+#include <konq_defaults.h> // include default values directly from libkonq
+#include <kurlrequester.h>
+
+#include "rootopts.h"
+
+//-----------------------------------------------------------------------------
+
+DesktopPathConfig::DesktopPathConfig(QWidget *parent, const char * )
+ : KCModule( parent, "kcmkonq" )
+{
+ QLabel * tmpLabel;
+
+#undef RO_LASTROW
+#undef RO_LASTCOL
+#define RO_LASTROW 4 // 3 paths + last row
+#define RO_LASTCOL 2
+
+ int row = 0;
+ QGridLayout *lay = new QGridLayout(this, RO_LASTROW+1, RO_LASTCOL+1,
+ 0, KDialog::spacingHint());
+
+ lay->setRowStretch(RO_LASTROW,10); // last line grows
+
+ lay->setColStretch(0,0);
+ lay->setColStretch(1,0);
+ lay->setColStretch(2,10);
+
+
+ setQuickHelp( i18n("<h1>Paths</h1>\n"
+ "This module allows you to choose where in the filesystem the "
+ "files on your desktop should be stored.\n"
+ "Use the \"What's This?\" (Shift+F1) to get help on specific options."));
+
+ // Desktop Paths
+ row++;
+ tmpLabel = new QLabel(i18n("Des&ktop path:"), this);
+ lay->addWidget(tmpLabel, row, 0);
+ urDesktop = new KURLRequester(this);
+ urDesktop->setMode( KFile::Directory );
+ tmpLabel->setBuddy( urDesktop );
+ lay->addMultiCellWidget(urDesktop, row, row, 1, RO_LASTCOL);
+ connect(urDesktop, SIGNAL(textChanged(const QString &)), this, SLOT(changed()));
+ QString wtstr = i18n("This folder contains all the files"
+ " which you see on your desktop. You can change the location of this"
+ " folder if you want to, and the contents will move automatically"
+ " to the new location as well.");
+ QWhatsThis::add( tmpLabel, wtstr );
+ QWhatsThis::add( urDesktop, wtstr );
+
+ row++;
+ tmpLabel = new QLabel(i18n("A&utostart path:"), this);
+ lay->addWidget(tmpLabel, row, 0);
+ urAutostart = new KURLRequester(this);
+ urAutostart->setMode( KFile::Directory );
+ tmpLabel->setBuddy( urAutostart );
+ lay->addMultiCellWidget(urAutostart, row, row, 1, RO_LASTCOL);
+ connect(urAutostart, SIGNAL(textChanged(const QString &)), this, SLOT(changed()));
+ wtstr = i18n("This folder contains applications or"
+ " links to applications (shortcuts) that you want to have started"
+ " automatically whenever KDE starts. You can change the location of this"
+ " folder if you want to, and the contents will move automatically"
+ " to the new location as well.");
+ QWhatsThis::add( tmpLabel, wtstr );
+ QWhatsThis::add( urAutostart, wtstr );
+
+ row++;
+ tmpLabel = new QLabel(i18n("D&ocuments path:"), this);
+ lay->addWidget(tmpLabel, row, 0);
+ urDocument = new KURLRequester(this);
+ urDocument->setMode( KFile::Directory );
+ tmpLabel->setBuddy( urDocument );
+ lay->addMultiCellWidget(urDocument, row, row, 1, RO_LASTCOL);
+ connect(urDocument, SIGNAL(textChanged(const QString &)), this, SLOT(changed()));
+ wtstr = i18n("This folder will be used by default to "
+ "load or save documents from or to.");
+ QWhatsThis::add( tmpLabel, wtstr );
+ QWhatsThis::add( urDocument, wtstr );
+
+ // -- Bottom --
+ Q_ASSERT( row == RO_LASTROW-1 ); // if it fails here, check the row++ and RO_LASTROW above
+
+ load();
+}
+
+void DesktopPathConfig::load()
+{
+ load( false );
+}
+
+void DesktopPathConfig::load( bool useDefaults )
+{
+ KConfig config("kdeglobals", true, false);
+ // Desktop Paths
+ config.setReadDefaults( useDefaults );
+
+ config.setGroup("Paths");
+ urDesktop->setURL( config.readPathEntry( "Desktop" , KGlobalSettings::desktopPath() ));
+ urAutostart->setURL( config.readPathEntry( "Autostart" , KGlobalSettings::autostartPath() ));
+ urDocument->setURL( config.readPathEntry( "Documents", KGlobalSettings::documentPath() ));
+
+ emit changed( useDefaults );
+}
+
+void DesktopPathConfig::defaults()
+{
+ load( true );
+}
+
+void DesktopPathConfig::save()
+{
+ KConfig *config = KGlobal::config();
+ KConfigGroupSaver cgs( config, "Paths" );
+
+ bool pathChanged = false;
+ bool autostartMoved = false;
+
+ KURL desktopURL;
+ desktopURL.setPath( KGlobalSettings::desktopPath() );
+ KURL newDesktopURL;
+ newDesktopURL.setPath(urDesktop->url());
+
+ KURL autostartURL;
+ autostartURL.setPath( KGlobalSettings::autostartPath() );
+ KURL newAutostartURL;
+ newAutostartURL.setPath(urAutostart->url());
+
+ KURL documentURL;
+ documentURL.setPath( KGlobalSettings::documentPath() );
+ KURL newDocumentURL;
+ newDocumentURL.setPath(urDocument->url());
+
+ if ( !newDesktopURL.equals( desktopURL, true ) )
+ {
+ // Test which other paths were inside this one (as it is by default)
+ // and for each, test where it should go.
+ // * Inside destination -> let them be moved with the desktop (but adjust name if necessary)
+ // * Not inside destination -> move first
+ // !!!
+ kdDebug() << "desktopURL=" << desktopURL.url() << endl;
+ QString urlDesktop = urDesktop->url();
+ if ( !urlDesktop.endsWith( "/" ))
+ urlDesktop+="/";
+
+ if ( desktopURL.isParentOf( autostartURL ) )
+ {
+ kdDebug() << "Autostart is on the desktop" << endl;
+
+ // Either the Autostart field wasn't changed (-> need to update it)
+ if ( newAutostartURL.equals( autostartURL, true ) )
+ {
+ // Hack. It could be in a subdir inside desktop. Hmmm... Argl.
+ urAutostart->setURL( urlDesktop + "Autostart/" );
+ kdDebug() << "Autostart is moved with the desktop" << endl;
+ autostartMoved = true;
+ }
+ // or it has been changed (->need to move it from here)
+ else
+ {
+ KURL futureAutostartURL;
+ futureAutostartURL.setPath( urlDesktop + "Autostart/" );
+ if ( newAutostartURL.equals( futureAutostartURL, true ) )
+ autostartMoved = true;
+ else
+ autostartMoved = moveDir( KURL( KGlobalSettings::autostartPath() ), KURL( urAutostart->url() ), i18n("Autostart") );
+ }
+ }
+
+ if ( moveDir( KURL( KGlobalSettings::desktopPath() ), KURL( urlDesktop ), i18n("Desktop") ) )
+ {
+// config->writeEntry( "Desktop", urDesktop->url());
+ config->writePathEntry( "Desktop", urlDesktop, true, true );
+ pathChanged = true;
+ }
+ }
+
+ if ( !newAutostartURL.equals( autostartURL, true ) )
+ {
+ if (!autostartMoved)
+ autostartMoved = moveDir( KURL( KGlobalSettings::autostartPath() ), KURL( urAutostart->url() ), i18n("Autostart") );
+ if (autostartMoved)
+ {
+// config->writeEntry( "Autostart", Autostart->url());
+ config->writePathEntry( "Autostart", urAutostart->url(), true, true );
+ pathChanged = true;
+ }
+ }
+
+ if ( !newDocumentURL.equals( documentURL, true ) )
+ {
+ bool pathOk = true;
+ QString path = urDocument->url();
+ if (!QDir(path).exists())
+ {
+ if (!KStandardDirs::makeDir(path))
+ {
+ KMessageBox::sorry(this, KIO::buildErrorString(KIO::ERR_COULD_NOT_MKDIR, path));
+ urDocument->setURL(documentURL.path());
+ pathOk = false;
+ }
+ }
+
+ if (pathOk)
+ {
+ config->writePathEntry( "Documents", path, true, true );
+ pathChanged = true;
+ }
+ }
+
+ config->sync();
+
+ if (pathChanged)
+ {
+ kdDebug() << "DesktopPathConfig::save sending message SettingsChanged" << endl;
+ KIPC::sendMessageAll(KIPC::SettingsChanged, KApplication::SETTINGS_PATHS);
+ }
+
+ // Tell kdesktop about the new config file
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ QByteArray data;
+
+ int konq_screen_number = KApplication::desktop()->primaryScreen();
+ QCString appname;
+ if (konq_screen_number == 0)
+ appname = "kdesktop";
+ else
+ appname.sprintf("kdesktop-screen-%d", konq_screen_number);
+ kapp->dcopClient()->send( appname, "KDesktopIface", "configure()", data );
+}
+
+bool DesktopPathConfig::moveDir( const KURL & src, const KURL & dest, const QString & type )
+{
+ if (!src.isLocalFile() || !dest.isLocalFile())
+ return true;
+ m_ok = true;
+ // Ask for confirmation before moving the files
+ if ( KMessageBox::questionYesNo( this, i18n("The path for '%1' has been changed;\ndo you want the files to be moved from '%2' to '%3'?").
+ arg(type).arg(src.path()).arg(dest.path()), i18n("Confirmation Required"),i18n("Move"),KStdGuiItem::cancel() )
+ == KMessageBox::Yes )
+ {
+ bool destExists = QFile::exists(dest.path());
+ if (destExists)
+ {
+ m_copyToDest = dest;
+ m_copyFromSrc = src;
+ KIO::ListJob* job = KIO::listDir( src );
+ connect( job, SIGNAL( entries( KIO::Job *, const KIO::UDSEntryList& ) ),
+ this, SLOT( slotEntries( KIO::Job *, const KIO::UDSEntryList& ) ) );
+ qApp->enter_loop();
+
+ if (m_ok)
+ {
+ KIO::del( src );
+ }
+ }
+ else
+ {
+ KIO::Job * job = KIO::move( src, dest );
+ connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotResult( KIO::Job * ) ) );
+ // wait for job
+ qApp->enter_loop();
+ }
+ }
+ kdDebug() << "DesktopPathConfig::slotResult returning " << m_ok << endl;
+ return m_ok;
+}
+
+void DesktopPathConfig::slotEntries( KIO::Job * job, const KIO::UDSEntryList& list)
+{
+ if (job->error())
+ {
+ job->showErrorDialog(this);
+ return;
+ }
+
+ KIO::UDSEntryListConstIterator it = list.begin();
+ KIO::UDSEntryListConstIterator end = list.end();
+ for (; it != end; ++it)
+ {
+ KFileItem file(*it, m_copyFromSrc, true, true);
+ if (file.url() == m_copyFromSrc || file.url().fileName() == "..")
+ {
+ continue;
+ }
+
+ KIO::Job * moveJob = KIO::move( file.url(), m_copyToDest );
+ connect( moveJob, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotResult( KIO::Job * ) ) );
+ qApp->enter_loop();
+ }
+ qApp->exit_loop();
+}
+
+void DesktopPathConfig::slotResult( KIO::Job * job )
+{
+ if (job->error())
+ {
+ if ( job->error() != KIO::ERR_DOES_NOT_EXIST )
+ m_ok = false;
+ // If the source doesn't exist, no wonder we couldn't move the dir.
+ // In that case, trust the user and set the new setting in any case.
+
+ job->showErrorDialog(this);
+ }
+ qApp->exit_loop();
+}
+
+#include "rootopts.moc"
diff --git a/kcontrol/konq/rootopts.h b/kcontrol/konq/rootopts.h
new file mode 100644
index 000000000..3a7b7ee3f
--- /dev/null
+++ b/kcontrol/konq/rootopts.h
@@ -0,0 +1,64 @@
+//
+//
+// "Desktop Icons Options" Tab for KDesktop configuration
+//
+// (c) Martin R. Jones 1996
+//
+// Port to KControl, split from "Misc" Tab, Port to KControl2
+// (c) David Faure 1998
+// Desktop menus, paths
+// (c) David Faure 2000
+
+#ifndef __ROOT_OPTIONS_H
+#define __ROOT_OPTIONS_H
+
+
+#include <qstring.h>
+
+#include <kcmodule.h>
+#include <kio/global.h>
+#include <kurl.h>
+
+class QCheckBox;
+class QComboBox;
+class QPushButton;
+
+class KConfig;
+class KListView;
+class KURLRequester;
+
+namespace KIO { class Job; }
+
+//-----------------------------------------------------------------------------
+// The "Path" Tab contains :
+// The paths for Desktop, Autostart and Documents
+
+class DesktopPathConfig : public KCModule
+{
+ Q_OBJECT
+public:
+ DesktopPathConfig(QWidget *parent = 0L, const char *name = 0L );
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+
+private slots:
+ void slotEntries( KIO::Job * job, const KIO::UDSEntryList& list);
+
+private:
+ // Desktop Paths
+ KURLRequester *urDesktop;
+ KURLRequester *urAutostart;
+ KURLRequester *urDocument;
+
+ bool moveDir( const KURL & src, const KURL & dest, const QString & type );
+ bool m_ok;
+ KURL m_copyToDest; // used when the destination directory already exists
+ KURL m_copyFromSrc;
+
+private slots:
+ void slotResult( KIO::Job * job );
+};
+
+#endif // __ROOT_OPTIONS_H
diff --git a/kcontrol/konq/webappearance.desktop b/kcontrol/konq/webappearance.desktop
new file mode 100644
index 000000000..3c2b8c87b
--- /dev/null
+++ b/kcontrol/konq/webappearance.desktop
@@ -0,0 +1,234 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/filemanager/index.html
+Icon=kfm
+Exec=kcmshell fileappearance
+
+
+X-KDE-Library=konq
+X-KDE-FactoryName=appearance
+X-KDE-ParentApp=kcontrol
+
+Name=Appearance
+Name[af]=Voorkoms
+Name[ar]=المظهر
+Name[az]=Görünüş
+Name[be]=Вонкавы выгляд
+Name[bg]=Системен панел
+Name[bn]=চেহারা
+Name[br]=Neuziadur
+Name[bs]=Izgled
+Name[ca]=Aparença
+Name[cs]=Vzhled
+Name[csb]=Wëzdrzatk
+Name[cy]=Golwg
+Name[da]=Udseende
+Name[de]=Erscheinungsbild
+Name[el]=Εμφάνιση
+Name[eo]=Aspekto
+Name[es]=Aspecto
+Name[et]=Välimus
+Name[eu]=Itxura
+Name[fa]=ظاهر
+Name[fi]=Ulkonäkö
+Name[fr]=Apparence
+Name[fy]=Uterlik
+Name[ga]=Cuma
+Name[gl]=Apariencia
+Name[he]=מראה
+Name[hi]=शक्ल-सूरत
+Name[hr]=Izgled
+Name[hu]=Megjelenés
+Name[id]=Penampilan
+Name[is]=Útlit
+Name[it]=Aspetto
+Name[ja]=外観
+Name[ka]=გარეგნობა
+Name[kk]=Көрініс
+Name[km]=រូបរាង
+Name[ko]=모양
+Name[lo]=ການປະກົດ
+Name[lt]=Išvaizda
+Name[lv]=Izskats
+Name[mk]=Изглед
+Name[mn]=Харагдалт
+Name[ms]=Rupa
+Name[mt]=Apparenza
+Name[nb]=Utseende
+Name[nds]=Utsehn
+Name[ne]=दृश्य
+Name[nl]=Uiterlijk
+Name[nn]=Utsjånad
+Name[nso]=Ponagalo
+Name[pa]=ਦਿੱਖ
+Name[pl]=Wygląd
+Name[pt]=Aparência
+Name[pt_BR]=Aparência
+Name[ro]=Aspect
+Name[ru]=Внешний вид
+Name[rw]=Imigaragarire
+Name[se]=Fárda
+Name[sk]=Vzhľad
+Name[sl]=Videz
+Name[sr]=Изглед
+Name[sr@Latn]=Izgled
+Name[sv]=Utseende
+Name[ta]=தோற்றம்
+Name[tg]=Намуди зоҳирӣ
+Name[th]=ลักษณะที่ปรากฎ
+Name[tr]=Görünüm
+Name[tt]=Küreneş
+Name[uk]=Вигляд
+Name[uz]=Tashqi koʻrinish
+Name[uz@cyrillic]=Ташқи кўриниш
+Name[ven]=Mbonalelo
+Name[vi]=Diện mạo
+Name[wa]=Rivnance
+Name[xh]=Inkangeleko
+Name[zh_CN]=外观
+Name[zh_TW]=外觀
+Name[zu]=Ukubukeka
+
+Comment=You can configure how Konqueror looks as a file manager here
+Comment[af]=Jy kan hier opstel hoe Konqueror as 'n lêer bestuurder lyk
+Comment[ar]=يمكنك هنا إعداد كيفية ظهور Konqueror كمسيير للملفات
+Comment[az]=Konqueror-un fayl idarəçisi olaraq nəcə görünəcəyini buradan quraşdırın
+Comment[be]=Тут вы можаце змяніць выгляд Konqueror для кіравання файламі
+Comment[bg]=Настройване външния вид на файловия браузър
+Comment[bn]=ফাইল ম্যানেজার হিসাবে কনকরার-এর চেহারা কেমন হবে তা এখানে কনফিগার করতে পারেন
+Comment[br]=Amañ e c'hellit kefluniañ penaos Konqueror az zo gwellet evel a merour restroù
+Comment[bs]=Ovdje možete podesiti kako izgleda Konqueror kao upravitelj datotekama
+Comment[ca]=Aquí podeu configurar com es mostrarà el Konqueror com a gestor de fitxers
+Comment[cs]=Zde je možné nastavit vzhled správce souborů
+Comment[csb]=Kònfigùracëjô wëzdrzatkù Konquerora jakno menadżera lopków
+Comment[cy]=Ffurfweddu golwg Konqueror fel rheolydd ffeiliau
+Comment[da]=Her kan du indstille hvordan Konqueror ser ud som filhåndtering
+Comment[de]=Hier können Sie das Erscheinungsbild von Konqueror als Dateimanager festlegen
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε το πως θα εμφανίζεται το Konqueror ως διαχειριστής αρχείων
+Comment[eo]=Ĉi tie vi povas agordi kiel konkeranto aspektas kiel dosieradministrilo
+Comment[es]=Aquí puede configurar el aspecto de Konqueror como gestor de archivos
+Comment[et]=Konquerori failihalduri välimuse seadistamine
+Comment[eu]=Hemen Konquerorren itxura konfigura dezakezu fitxategi kudeatzaile gisa ari denean
+Comment[fa]=می‌توانید پیکربندی کنید، که اینجا Konqueror به عنوان مدیر پرونده چگونه به نظر می‌رسد.
+Comment[fi]=Tässä kohdassa voit määritellä Konquerorin tiedostonhallinnan ulkonäön asetuksia
+Comment[fr]=Apparence de Konqueror en tant que gestionnaire de fichiers
+Comment[fy]=Hjir kinne jo it uterlik fan Konqueror as triembehearder ynstelle
+Comment[gl]=Pode configurar aqui o xeito en que se mostra Konqueror como xestor de ficheiros
+Comment[he]=שינוי הדרך שבה Konqueror נראה בתור מנהל קבצים
+Comment[hi]=आप कॉन्फ़िगर कर सकते हैं कि कॉन्करर यहाँ फ़ाइल प्रबंधक जैसे कैसे दिखे
+Comment[hr]=Konfiguriranje izgleda Konqueror upravljača datoteka
+Comment[hu]=Itt lehet beállítani a Konqueror fájlkezelő jellemzőit
+Comment[is]=Hér getur þú stillt hvernig Konqueror lítur út sem skráastjóri
+Comment[it]=Configura l'aspetto di Konqueror come gestore dei file
+Comment[ja]=Konqueror ファイルマネージャの外観を設定
+Comment[ka]=Konqueror-ის, როგორც ფაილური მენეჯერის, იერის კონფიგურირება
+Comment[kk]=Konqueror файл менеджер ретінде қолданғандағы көрінісі
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនា​សម្ព័ន្ធ របៀប​ដែល Konqueror មើល​ទៅ​ដូចជា​កម្មវិធី​គ្រប់គ្រង​ឯកសារ
+Comment[ko]=Konqueror의 파일 관리자로서의 모양 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງການທຳງານຂອງເຄື່ອງ ຈັດການເຊສຊັນໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite nustatyti, kaip atrodo Konqueror-bylų tvarkyklė
+Comment[lv]=Šeit jūs varat konfigurēt Iekarotāja izskatu failu pārlūkošanas laikā
+Comment[mk]=Конфигурирајте го изгледот на Konqueror како менаџер на датотеки
+Comment[mn]=Энд та конкюрорын харагдалтыг файл удирдагчийн хувьд тогтоох
+Comment[ms]=Anda boleh konfigur bagaiman rupa Konqueror sebagai pengurus fail di sini
+Comment[mt]=Hawn tista' tikkonfigura kif jidher Konqueror bħala manager tal-fajls
+Comment[nb]=Tilpass hvordan filbehandleren Konqueror skal se ut
+Comment[nds]=Hier kannst Du instellen, wodennig Konqueror as Dateipleger utsehn schall
+Comment[ne]=तपाईँले यहाँ कन्क्वेररले फाइल प्रबन्धकलाई हेर्ने तरिका कन्फिगर गर्न सक्नुहुन्छ
+Comment[nl]=Hier kunt u het uiterlijk van Konqueror als bestandsbeheerder instellen
+Comment[nn]=Her kan du velja korleis filhandsamaren Konqueror skal sjå ut
+Comment[nso]=O swanetse go beakanya ka mokgwa wo Konqueror e bogegago bjale ka molaodi wa faele mo
+Comment[pa]=ਤੁਸੀਂ ਇੱਥੇ ਸੰਰਚਿਤ ਕਰ ਸਕਦੇ ਹੋ ਕਿ ਕੋਨਕਿਉਰਰ ਇੱਕ ਫਾਇਲ ਮੈਨੇਜਰ ਦੇ ਰੂਪ ਵਿੱਚ ਕਿਵੇਂ ਦਿਖਾਈ ਦੇਵੇਗਾ।
+Comment[pl]=Konfiguracja wyglądu Konquerora jako menedżera plików
+Comment[pt]=O utilizador pode configurar aqui a forma como o Konqueror age, como um gestor de ficheiros
+Comment[pt_BR]=Você pode configurar aqui como o Konqueror ficará como gerenciador de arquivos
+Comment[ro]=Configurează aspectul Konqueror ca manager de fișiere
+Comment[ru]=Настройка внешнего вида Konqueror как менеджера файлов
+Comment[rw]=Ushobora kugena ukuntu Konqueror igaragara nka mugengadosiye hano
+Comment[se]=Dás heivehat Konquerora fárdda fiilagieđahallin
+Comment[sk]=Nastavenie vzhľadu Konquerora ako správcu súborov
+Comment[sl]=Nastavitve izgleda Konquerorja kot upravitelja datotek
+Comment[sr]=Овде можете подесити како ће Konqueror као менаџер фајлова да изгледа
+Comment[sr@Latn]=Ovde možete podesiti kako će Konqueror kao menadžer fajlova da izgleda
+Comment[sv]=Anpassa hur Konqueror ser ut som filhanterare
+Comment[ta]=கான்கொரர் கோப்பு மேலாளராக எப்படி தெரிகிறது என்பதை இங்கே வடிவமைக்க முடியும்.
+Comment[tg]= Шумо метавонед зоҳири Konqueror-ро ба унвони мудири файл дар инҷо танзим кунед.
+Comment[th]=คุณสามารถปรับแต่งคอนเควอร์เรอร์ในการเป็นเครื่องมือจัดการแฟ้มได้ที่นี่
+Comment[tr]=Konqueror'un dosya yöneticisi olarak nasıl görüneceğini yapılandırın
+Comment[tt]=Birem idäräçe bularaq eşläwçe Konqueror'nıñ küreneşen caylaw
+Comment[uk]=Тут можна налаштувати вигляд Konqeror, як менеджера сеансу
+Comment[uz]=Konqueror fayl boshqaruvchisi sifatida qanday koʻrinishini moslash
+Comment[uz@cyrillic]=Konqueror файл бошқарувчиси сифатида қандай кўринишини мослаш
+Comment[ven]=Ninga dzudzanya uri na Konqueror i sedzea sa mulanguli wa faela hafhano
+Comment[vi]=Bạn có thể cấu hình ngoại hình của Konqueror trông như nào khi quản lý tập tin ở đây
+Comment[wa]=Chal vos ploz apontyî li rivnance di Konqueror cwand i fwait l' manaedjeu di fitchîs
+Comment[xh]=Ungaqwalasela indlela ebonakala ngoyo i Konqueror njengomphathi wefayile
+Comment[zh_CN]=在这里配置 Konqueror 的文件管理器外观
+Comment[zh_TW]=您可以在這裡設定 Konqueror 做為檔案管理程式的外觀
+Comment[zu]=Ungahlanganisela ukuthi i-konqueror ibukeke kanjani njengemenenja yamafayela lapha
+Keywords=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour
+Keywords[ar]=konqueror,مسيير الملفات,word wrap,wrap,تسطير الأحرف,الشاشة,حجم الملف,البايتات,المحرف,اللون,العرض
+Keywords[az]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,fayl,fayl idarəçisi,rəng,yazı növü,altı cızıqlı
+Keywords[be]=Кіраўнік файлаў,Перанос словаў,Перанос,Падкрэсліванне,Падкрэслены,Паказваць,Памер,Байты,Шрыфт,Колер,konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour
+Keywords[bg]=файлове, файл, управление, браузър, мениджър, konqueror, filemanager,word wrap, wrap, underline, display, filesize, bytes, font, color, colour
+Keywords[ca]=konqueror,gestor de fitxers, ajust de línia,subratllar,mostrar,mida del fitxer,octets,lletra,color,colorit
+Keywords[cs]=Konqueror,Správce souborů,Zalamování,Podtrhávání,Zobrazení,Velikost souboru,Bajty,Písmo,Barva
+Keywords[csb]=konqueror,menedżer lopków,zawijanié wierztów,zawijanié,podsztëchiwanié,wëzdrzatk, miara lopkù,bajtë,fòntë,farwa
+Keywords[cy]=konqueror,rheolydd ffeiliau,lapio geiriau,lapio,tanlinellu,dangos,maint ffeil,beitiau,ffont,lliw
+Keywords[da]=konqueror,filhåndtering,ordombrydning,ombrydning,understreg,vis,filstørrelse,byte,skrifttype,farve
+Keywords[de]=Konqueror,Dateimanager,Zeilenfall,Textumbruch,Unterstreichen,Darstellung,Dateigröße,Schrift,Farbe,Byte
+Keywords[el]=konqueror,διαχειριστής αρχείων,αναδίπλωση λέξεων,αναδίπλωση,υπογράμμιση,προβολή,μέγεθος αρχείου,bytes,γραμματοσειρά,χρώμα,χρώμα
+Keywords[eo]=konkeranto,dosieradministrilo,vidigi,vidigo,dosiera grandeco,bajto,bitoko,okbitaro,tiparo,koloro
+Keywords[es]=konqueror,gestor de archivos, ajuste de línea,subrayar,mostrar,tamaño de archivo,bytes,tipo de letra,color
+Keywords[et]=konqueror,failihaldur,sõnade murdmine,murdmine,allajoonimine,ekraan,faili suurus,baidid,font,värv
+Keywords[eu]=konqueror,fitxategi kudeatzailea,itzulbiratu, egokitu,azpimarratu,pantaila,fitxategi tamaina,byteak,letra-tipoa,kolorea
+Keywords[fa]=konqueror، مدیر پرونده، سطربندی واژه، سطربندی، خط زیر، نمایش، اندازه پرونده، بایتها، قلم، رنگ، رنگ
+Keywords[fi]=konqueror,tiedostonhallinta,sanankatkaisu,alleviivaus,tiedostokoko,tavuja, kirjasin,väri
+Keywords[fr]=konqueror,gestionnaire de fichiers,explorateur,retour à la ligne,soulignement,affichage,taille des fichiers,octets,police,couleur
+Keywords[fy]=konqueror,filemanager,triembehear,word wrap,rigelôfbreking,ûnderstreakje,display,werjefte,filesize,triemgrutte,bytes,fonts,lettertypen,kleur,color
+Keywords[ga]=konqueror,bainisteoir comhad,timfhilleadh focal,timfhilleadh,líne faoi,scáileán,méid comhaid,bearta,cló,clófhoireann,dath
+Keywords[gl]=konqueror,xestor de ficheiros,axuste de palabras,axuste,subliñar,mostrar,tamaño de ficheiro,bites,fonte,cor
+Keywords[he]=konqueror,מנהל קבצים,גלישת שורות,קו תחתון,תצוגה,גודל קובץ,בתים,גופן,צבע, konqueror,filemanager,word wrap, wrap,underline,display,filesize,bytes,font,color,colour
+Keywords[hi]=कॉन्करर,फ़ाइलप्रबंधक,वर्ड रैप,रैप,रेखांकित,प्रकटन,फ़ाइलआकार,बाइट्स,फ़ॉन्ट,रंग
+Keywords[hr]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,upravljač datoteka,omatanje riječi,omatanje,podvlačenje,prikaz,veličina datoteke,bajtovi,font,boja,boje
+Keywords[hu]=konqueror,fájlkezelő,szótördelés,tördelés,aláhúzás,képernyő,fájlméret,bájt,betűtípus,szín,színek
+Keywords[is]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour, litir,línuskipting,skjár,skjáborð,bæt,litur
+Keywords[it]=konqueror,filemanager,a capo,sottolineatura,schermo,dimensione file,byte,caratteri,colori
+Keywords[ja]=konqueror,ファイルマネージャ,ワードラップ,行の折り返し,下線,表示,ファイルサイズ, バイト,フォント,色,カラー
+Keywords[km]=konqueror,កម្មវិធី​គ្រប់គ្រង​ឯកសារ,រុំ​ពាក្យ,រុំ,គូសបន្ទាត់​ក្រោម,បង្ហាញ,ទំហំ​ឯកសារ,បៃ,ពុម្ពអក្សរ,ពណ៌
+Keywords[lt]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,bylų tvarkyklė, žodžių perkėlimas, perkėlimas, pabraukimas, ekranas, bylos dydis, baitai, šriftas,spalva
+Keywords[lv]=iekarotājs,failumenedžeris,vārdu apciršana,apciršana,pasvītrojums,ekrāns,failu izmērs,baiti,fonti,krāsas
+Keywords[mk]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,менаџер на датотеки,прекршување на зборови,прекршување,подвлекување,екран,големина на датотека,бајти,фонт,боја
+Keywords[mn]=Конкюрор,Файл удирдагч,Текст таслах,Доогуур зураас, Дүрслэл,Файлын хэмжээ,Бичиг,Өнгө,Байт
+Keywords[mt]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,manager tal-fajls,daqs,kulur,kuluri
+Keywords[nb]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,filbehandler,tekstbryting,understreket,skjerm,filstørrelse,byter,fonter,farger
+Keywords[nds]=Konqueror,Dateipleger,word wrap,ümbreken,ünnerstreken,Dorstellen,Dateigrött,Bytes,Schriftoort, Klöör, Klören
+Keywords[ne]=कन्क्वेरर, फाइल प्रबन्धक, शब्द बेर्नुहोस्, बेर्नुहोस्, कच, प्रदर्शन गर्नुहोस्, फाइल साइज, बाइट्स, फन्ट, रङ, रङ
+Keywords[nl]=konqueror,filemanager,bestandsbeheer,word wrap,regelafbreking,onderstrepen,display,weergave,filesize,bestandsgrootte,bytes,fonts,lettertypen,kleur,color
+Keywords[nn]=Konqueror,filhandsamar,tekstbryting,linjebryting,bryting,understrek,vis,filstorleik,byte,skrift,farge
+Keywords[nso]=konqueror,molaodi wa faele,tatetso ya faele,tatetso ya mantsu,tatetso,thalelela,pontsho,bogolo bja faele,bytes,fonto,mmala,mmala
+Keywords[pa]=ਕੋਨਕਿਉਰਰ,ਫਾਇਲ ਮੈਨੇਜਰ,ਸ਼ਬਦ ਸਮੇਟੋ,ਸਮੇਟੋ,ਹੇਠਾਂ ਰੇਖਾ,ਫਾਇਲ ਅਕਾਰ,ਬਾਈਟ,ਫੋਂਟ,ਰੰਗ ਝਲਕ
+Keywords[pl]=konqueror,menedżer plików,zawijanie wierszy,zawijanie,podkreślenie,wygląd, rozmiar pliku,bajty,czcionki,kolor
+Keywords[pt]=konqueror,gestor de ficheiros,mudança de linha,mudança,sublinhado,ecrã,tamanho do ficheiro,bytes,tipo de letra,cor
+Keywords[pt_BR]=konqueror,gerenciador de arquivos,quebra de linha, sublinhado, display,tamanho de arquivo,bytes,fonte,cor,cor
+Keywords[ro]=konqueror,manager de fișiere,limitare cuvînt,limitare,subliniere,afișare,mărime fișier,octeți,font,culoare
+Keywords[rw]= Konqueror,mugengadosiye,ifunika ry'ijambo,gufunika,gucaho umurongo,Kugaragaza,inganoidosiye,bayite,imyandikire,ibara,ibara
+Keywords[se]=Konqueror,fiilagieđahalli,linnjádoaddjin,doaddjin,vuolláisárgu,čájet,fiilasturrodat,stávvalat,fonta,ivdni
+Keywords[sk]=konqueror,správa súborov,zalamovanie slov,podčiarknutie,zobrazenie,veľkosť súborov,bajty,písmo,farba
+Keywords[sl]=konqueror,upravitelj datotek,upravljalnik,prelom vrstic,prelom,podčrta,prikaz,velikost datoteke,bajt,pisava,barva
+Keywords[sr]=konqueror,filemanager,преламање текста,преламање,подвлачење,приказ,величина фајла,бајтови,фонт,боја
+Keywords[sr@Latn]=konqueror,filemanager,prelamanje teksta,prelamanje,podvlačenje,prikaz,veličina fajla,bajtovi,font,boja
+Keywords[sv]=konqueror,filhanterare,radbrytning,understreck,visa,filstorlek,byte,teckensnitt,färg
+Keywords[ta]=கான்கொரர்,கோப்பு மேலாளர்,வார்த்தை மடக்கு, மடக்கு,அடிகோடிடு,காட்டு,கோப்பு அளவு,பைட்டுகள்,எழுத்துரு,வண்ணம்,வண்ணம்
+Keywords[th]=คอนเควอร์เรอร์,จัดการแฟ้ม,ตัดคำ,ตัด,ขีดเส้นใต้,แสดงผล,ขนาดแฟ้ม,ไบต์,แบบอักษร,สี
+Keywords[tr]=konqueror,dosya yöneticisi,görünüm,dosya boyu,bayt,yazıtipi,renk
+Keywords[uk]=konqueror,менеджер файлів, переніс файлів,переніс,підкреслення,дисплей, розмір файлів,байти,шрифт,колір
+Keywords[uz]=konqueror,fayl boshqaruvchisi,word wrap,wrap,tagini chizish,koʻrsatish,fayning hajmi,baytlar,shrift,rang
+Keywords[uz@cyrillic]=konqueror,файл бошқарувчиси,word wrap,wrap,тагини чизиш,кўрсатиш,файнинг ҳажми,байтлар,шрифт,ранг
+Keywords[ven]=konqueror,mulanguli wa faela,putela ha fhungo,putela,talela,sumbedza,saizi ya faela, bytes,fontu,muvhala,muvhala
+Keywords[vi]=konqueror,trình quản lý tập tin,bao quanh văn bản,bao quanh,gạch chân,màn hình,cỡ tập tin,số byte,phông chữ,mầu,mầu sắc
+Keywords[wa]=konqueror,manaedjeu di fitchî,sorlignî,håyner,håynaedje,grandeu d' fitchî,bytes,bites,fonte,coleur
+Keywords[xh]=konqueror,umphathi wefayile,songela amagama,songela, yenza umgca ezantsi,bonisa, ubngakanani befayile,bytes,umgca,umbala,umbala
+Keywords[zh_CN]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,文件管理器,自动换行,下划线,显示,文件大小,字节,字体,颜色
+Keywords[zh_TW]=konqueror,filemanager,word wrap,wrap,underline,display,filesize,bytes,font,color,colour,征服家,檔案管理程式,文字換行,換行,底線,顯示,檔案大小,位元組,字型,顏色
+Keywords[zu]=konqueror,imenenja yamafayela,ukugoqwa kwamafayela, ukugoqwa,dwebela,veza,usayizi ama-byte osayizi wefayela,uhlobo lwamagama, umbala,umbala
diff --git a/kcontrol/konq/webbehavior.desktop b/kcontrol/konq/webbehavior.desktop
new file mode 100644
index 000000000..3dfe93b69
--- /dev/null
+++ b/kcontrol/konq/webbehavior.desktop
@@ -0,0 +1,234 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/filemanager/index.html
+Icon=kfm
+Exec=kcmshell filebehavior
+
+
+X-KDE-Library=konq
+X-KDE-FactoryName=behavior
+X-KDE-ParentApp=kcontrol
+
+Name=Behavior
+Name[af]=Gedrag
+Name[ar]=السلوك
+Name[az]=Davranış
+Name[be]=Паводзіны
+Name[bg]=Поведение
+Name[bn]=আচরণ
+Name[br]=Emzalc'h
+Name[bs]=Ponašanje
+Name[ca]=Comportament
+Name[cs]=Chování
+Name[csb]=Zachòwanié
+Name[cy]=Ymddygiad
+Name[da]=Opførsel
+Name[de]=Verhalten
+Name[el]=Συμπεριφορά
+Name[en_GB]=Behaviour
+Name[eo]=Konduto
+Name[es]=Comportamiento
+Name[et]=Käitumine
+Name[eu]=Portaera
+Name[fa]=رفتار
+Name[fi]=Käyttäytyminen
+Name[fr]=Comportement
+Name[fy]=Gedrach
+Name[ga]=Oibriú
+Name[gl]=Comportamento
+Name[he]=פעולה
+Name[hi]=बर्ताव
+Name[hr]=Ponašanje
+Name[hu]=Működés
+Name[is]=Hegðun
+Name[it]=Comportamento
+Name[ja]=挙動
+Name[ka]=ქცევა
+Name[kk]=Қасиеттері
+Name[km]=ឥរិយាបថ
+Name[ko]=행동
+Name[lo]=ພຶດຕິກຳຂອງຫນ້າຕ່າງ
+Name[lt]=Elgsena
+Name[lv]=Izturēšanās
+Name[mk]=Однесување
+Name[mn]=Байдал
+Name[ms]=Peri laku
+Name[mt]=Imġieba
+Name[nb]=Oppførsel
+Name[nds]=Bedregen
+Name[ne]=व्यवहार
+Name[nl]=Gedrag
+Name[nn]=Åtferd
+Name[nso]=Maitshwaro
+Name[pa]=ਵਿਹਾਰ
+Name[pl]=Zachowanie
+Name[pt]=Comportamento
+Name[pt_BR]=Comportamento
+Name[ro]=Comportament
+Name[ru]=Поведение
+Name[rw]=Imyitwarire
+Name[se]=Láhtten
+Name[sk]=Správanie
+Name[sl]=Obnašanje
+Name[sr]=Понашање
+Name[sr@Latn]=Ponašanje
+Name[ss]=Kutiphatsa
+Name[sv]=Uppträdande
+Name[ta]= நடத்தை
+Name[te]=ప్రవర్తన
+Name[tg]=Рафтор
+Name[th]=พฤติกรรม
+Name[tr]=Davranış
+Name[tt]=Eşlise eş
+Name[uk]=Поведінка
+Name[uz]=Xususiyatlar
+Name[uz@cyrillic]=Хусусиятлар
+Name[ven]=Maitele
+Name[vi]=Cách hoạt động
+Name[wa]=Dujhance
+Name[xh]=Ukuziphatha
+Name[zh_CN]=行为
+Name[zh_TW]=行為
+Name[zu]=Ukuziphatha
+
+Comment=You can configure how Konqueror behaves as a file manager here
+Comment[af]=Jy kan konfigureer hoe Konqueror gedrag as 'n lêer bestuurder hier
+Comment[ar]=يمكنك هنا إعداد سلوك Konqueror كمسيير للملفات
+Comment[az]=Konqueror-un fayl idarəçisi olaraq nəcə davranacağını buradan quraşdırın
+Comment[be]=Тут вы можаце змяніць паводзіны Konqueror для кіравання файламі
+Comment[bg]=Настройване поведението на файловия браузър
+Comment[bn]=ফাইল ম্যানেজার হিসাবে কনকরার-এর আচরণ কেমন হবে তা এখানে কনফিগার করতে পারেন
+Comment[br]=Amañ e c'hellit kefluniañ penaos Konqueror en em zalc'h evel ur merour restroù
+Comment[bs]=Ovdje možete podesiti kako se Konqueror ponaša kao upravitelj datotekama
+Comment[ca]=Aquí podeu configurar com es comportarà el Konqueror com a gestor de fitxers
+Comment[cs]=Zde je možné nastavit správce chování Konqueroru jako správce souborů
+Comment[csb]=Kònfigùracëjô zachòwaniô Konquerora jakno menadżera lopków
+Comment[cy]=Ffurfweddu ymddygiad Konqueror fel rheolydd ffeiliau
+Comment[da]=Her kan du indstille hvordan Konqueror opfører sig som filhåndtering
+Comment[de]=Hier können Sie das Verhalten von Konqueror als Dateimanager festlegen
+Comment[el]=Εδώ μπορείτε να ρυθμίσετε το πως θα συμπεριφέρεται το Konqueror ως διαχειριστής αρχείων
+Comment[eo]=Ĉi tie vi povas agordi kiel konkeranto kondutas kiel dosieradministrilo
+Comment[es]=Aquí puede configurar el comportamiento de Konqueror como gestor de archivos
+Comment[et]=Konquerori failihalduri käitumise seadistamine
+Comment[eu]=Hemen Konquerorren portaera konfigura dezakezu fitxategi kudeatzaile gisa ari denean
+Comment[fa]=می‌توانید در اینجا، چگونگی رفتار Konqueror را به عنوان مدیر پرونده پیکربندی کنید
+Comment[fi]=Tässä kohdassa voit määritellä Konquerorin tiedostonhallinnan asetuksia
+Comment[fr]=Comportement de Konqueror en tant que gestionnaire de fichiers
+Comment[fy]=Hjir kinne jo it gedrach fan Konqueror as triembehearder ynstelle.
+Comment[gl]=Pode configurar aqui o modo en que se comportará Konqueror como xestor de ficheiros
+Comment[he]=שינוי הדרך שבה Konqueror פועל בתור מנהל קבצים
+Comment[hi]=आप कॉन्फ़िगर कर सकते हैं कि कॉन्करर यहाँ फ़ाइल प्रबंधक की तरह कैसे बर्ताव करे
+Comment[hr]=Konfiguriranje načina na koji se Konqueror ponaša kao upravljač datoteka
+Comment[hu]=Itt lehet beállítani a Konqueror fájlkezelő működési jellemzőit
+Comment[is]=Hér getur þú stillt hvernig Konqueror hegðar sér sem skráastjóri
+Comment[it]=Configura il comportamento di Konqueror come gestore dei file
+Comment[ja]=Konqueror ファイルマネージャの挙動を設定
+Comment[ka]=Konqueror-ის, როგორც ფაილური მენეჯერის, ქცევის კონფიგურირება
+Comment[kk]=Konqueror файл менеджер ретінде қолданғандағы қасиеттерін баптау
+Comment[km]=នៅ​ទីនេះ អ្នក​អាច​កំណត់​រចនាសម្ព័ន្ធ របៀប​ដែល Konqueror ដើរតួ​ជា​កម្មវិធី​គ្រប់គ្រង​ឯកសារ
+Comment[ko]=Konqueror의 파일 관리자로서의 행동 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງການທຳງານຂອງເຄື່ອງ ຈັດການເຊສຊັນໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite nustatyti, kaip elgiasi Konqueror-bylų tvarkyklė
+Comment[lv]=Šeit jūs varat konfigurēt Iekarotāja izturēšanos failu pārlūkošanas laikā
+Comment[mk]=Конфигурирајте го однесувањето на Konqueror како менаџер на датотеки
+Comment[mn]=Энд та конкюрорын байдлыг файл удирдагчийн хувьд тогтоож
+Comment[ms]=Anda boleh konfigur bagaimana Konqueror berkelakuan sebagai pengurus fail di sini
+Comment[mt]=Hawn tista' tissettja l-imġieba ta' Konqueror bħala manager tal-fajls
+Comment[nb]=Tilpass hvordan Konqueror opptrer som filbehandler
+Comment[nds]=Hier kannst Du instellen, wodennig sik Konqueror as Dateipleger bedregen schall
+Comment[ne]=तपाईँले यहाँ कन्क्वेररले फाइल प्रबन्धकलाई गर्ने व्यवहार कन्फिगर गर्न सक्नुहुन्छ
+Comment[nl]=Hier kunt u het gedrag van Konqueror als bestandsbeheerder instellen.
+Comment[nn]=Her kan du velja korleis filhandsamaren Konqueror skal oppføra seg
+Comment[nso]=Oka beakanya ka fao Konqueror e phelago bjalo ka molaodi wa faele mo
+Comment[pa]=ਤੁਸੀਂ ਇੱਥੇ ਸੰਰਚਿਤ ਕਰ ਸਕਦੇ ਹੋ ਕਿ ਕੋਨਕਿਉਰਰ ਇੱਕ ਫਾਇਲ ਮੈਨੇਜਰ ਦੇ ਰੂਪ ਵਿੱਚ ਕਿਵੇਂ ਵਿਵਹਾਰ ਦੇਵੇਗਾ।
+Comment[pl]=Konfiguracja zachowania Konquerora jako menedżera plików
+Comment[pt]=O utilizador pode configurar aqui como é que o Konqueror se comporta como um gestor de ficheiros
+Comment[pt_BR]=Você pode configurar como o Konqueror se comporta como gerenciador de arquivos aqui
+Comment[ro]=Configurează comportamentul Konqueror ca manager de fișiere
+Comment[ru]=Настройка поведения Konqueror как менеджера файлов
+Comment[rw]=Ushobora kugena ukuntu Konqueror yitwara nka mugengadosiye hano
+Comment[se]=Dás heivehat mo Konqueror fiilagieđahallin galgá láhttet
+Comment[sk]=Nastavenie Konquerora ako správcu súborov
+Comment[sl]=Nastavitve obnašanja Konquerorja kot upravitelja datotek
+Comment[sr]=Овде можете подесити како ће се Konqueror као менаџер фајлова понашати
+Comment[sr@Latn]=Ovde možete podesiti kako će se Konqueror kao menadžer fajlova ponašati
+Comment[sv]=Anpassa hur Konqueror beter sig som filhanterare
+Comment[ta]=கான்கொரர் கோப்பு மேலாளராக எப்படி இயங்குகிறது என்பதை இங்கே வடிவமைக்க முடியும்.
+Comment[tg]=Шумо метавонед рафтори Konqueror-ро ба унвони мудири файл дар инҷо таъин кунед.
+Comment[th]=คุณสามารถปรับแต่งพฤติกรรมของคอนเควอร์เรอร์ในการเป็นเครื่องมือจัดการแฟ้มได้ที่นี่
+Comment[tr]=Konqueror'un dosya yöneticisi olarak nasıl davranacağını buradan yapılandırabilirsiniz
+Comment[tt]=Birem idäräçe bularaq eşläwçe Konqueror'nıñ çağılışın caylaw
+Comment[uk]=Тут можна налаштувати поведінку Konqueror, як менеджера сеансу
+Comment[uz]=Konqueror fayl boshqaruvchisi sifatida xususiyatini moslash
+Comment[uz@cyrillic]=Konqueror файл бошқарувчиси сифатида хусусиятини мослаш
+Comment[ven]=Ni nga dzudzanya uri Konqueror inga tshilisa hani sa mulanguli wa faela hafhano
+Comment[vi]=Bạn có thể cấu hình cách Konqueror hoạt động như một trình quản lý tập tin ở đây
+Comment[wa]=Chal vos ploz apontyî li dujhance di Konqueror cwand i fwait l' manaedjeu di fitchîs
+Comment[xh]=Ungaqwalasela ukuziphatha kwe Konqueror njengomphathi wefayile apha
+Comment[zh_CN]=在这里配置 Konqueror 的文件管理器行为
+Comment[zh_TW]=您可以在這裡設定 Konqueror 做為檔案管理程式的行為
+Comment[zu]=Ungahlanganisela ukuthi i-Konqueror iziphathe kanjani njengemenenja yamafayela lapha
+Keywords=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,
+Keywords[ar]=konqueror,مسيير الملفات,kfm,التلميحات و النصائح,تلميحات الملف,نافذة منعزلة,spawn windows,السلوك,إستعمال الذاكرة,عنوان المورد النظامي للمنزل
+Keywords[be]=Кіраўнік файлаў,Карысныя парады,Падказкі,Падказкі файлаў,Асобнае акно,Паводзіны,Выкарыстанне памяці,Хатняя тэчка,konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,
+Keywords[bg]=работен, плот, поведение, място, браузър, прозорец, konqueror, filemanager, kfm, tips, file tips, separate window, spawn windows, behavior, behaviour, memory usage, Home URL,
+Keywords[ca]=konqueror,gestor de fitxers,kfm,consells,consells del fitxer,finestra separada,expandir finestres,comportament,us de la memòria, URL d'inici,
+Keywords[cs]=Konqueror,Správce souborů,Kfm,Tipy,Souborové tipy,Rozdílné okno, Chování,Spotřeba paměti,Domovské URL,Domovský adresář
+Keywords[csb]=konqueror,menedżer lopków,kfm,wskôzë,wëdowédzô ò lopkù,apartné òkno, wiele òknów,zachòwanié,brëkòwanié pamiãcë,domôcy URL
+Keywords[cy]=konqueror,rheolydd ffeiliau,kfm,cyngor,cyngor ffeiliau,ffenestr gwahan,taenu ffenestri,ymddygiad,defnydd cof,URL Cartref
+Keywords[da]=konqueror,filhåndtering,kfm,tip,filtip,separat vindue,flere vinduer,opførsel,hukommelsesforbrug,Hjemme-URL,
+Keywords[de]=Konqueror,Dateimanager,kfm,Tipps,Fenster,Verhalten,Persönlicher Ordner,Speicherverwendung
+Keywords[el]=konqueror,διαχειριστής αρχείων,kfm,πληροφορίες,πληροφορίες αρχείων,ξεχωριστό παράθυρο,πολλαπλασιασμός παραθύρων,συμπεριφορά,συμπεριφορά,χρήση μνήμης,URL σπιτιού,
+Keywords[eo]=dosieradministrilo,aparta fenestro,uzata memoro
+Keywords[es]=konqueror,gestor de archivos,kfm,sugerencias,ventana separada, extender ventanas,comportamiento,uso de memoria, URl de inicio,
+Keywords[et]=konqueror,failihaldur,kfm,vihjed,failide vihjed,eraldi aken,käitumine,mälukasutus,kodukataloog
+Keywords[eu]=konqueror,fitxategi kudeatzailea,kfm,iradokizunak,fitxategi iradokizunak, aparteko leihoa,leihoak hedatu,portaera,memoriaren erabilera,Hasierako URLa,
+Keywords[fa]=konqueror، مدیر پرونده، kfm، نکات، نکات پرونده، پنجرۀ مجزا، پنجره‌های تکثیرشده، رفتار، رفتار، کاربرد حافظه، نشانی وب آغازه،
+Keywords[fi]=konqueror,tiedostonhallinta,kfm,vinkit,tiedostovinkit,erillinen ikkuna,käytös,muistinkäyttö,Koti-URL
+Keywords[fr]=konqueror,gestionnaire de fichiers,explorateur,kfm,astuces,fenêtre séparée,rafraîchissement des fenêtres,comportement,utilisation de la mémoire,Home URL,URL de démarrage
+Keywords[fy]=konqueror,filemanager,kfm,tips,knopinfo,arktippen,gedrach,ûnthâldgebrûk,thús,persoanlike map,
+Keywords[gl]=konqueror,xestor de ficheiros,kfm,consellos de ficheiro,fiestra separada,fiestras emerxentes,comportamento,uso da memoria,URL Persoal,
+Keywords[he]=konqueror,מנהל קבצים,kfm,עצות,פירוט לקבצים,חלון נפרד,שימוש בזיכרון,פעולה,כתובת בית, konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL
+Keywords[hi]=कॉन्करर,फ़ाइलमैनेजर,केएफएम,संकेत,फ़ाइल संकेत,अलग विंडो,विंडो बनाएँ,बर्ताव,आचरण,मेमोरी उपयोग,मुख यूआरएल,
+Keywords[hr]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,upravljač datoteka,savjeti datoteka,posebni prozor,pojavljujući prozor,ponašanje,upotreba memorije,URL početne stranice
+Keywords[hu]=konqueror,fájlkezelő,kfm,tippek,fájltippek,külön ablak,ablakgenerálás,viselkedés,memóriahasználat,saját URL,
+Keywords[is]=konqueror,skráastjóri,kfm,ráð,skráarráð,aðskilin gluggi,margfaldast, gluggar,hegðun,minnisnotkun,heimaslóð,
+Keywords[it]=konqueror,filemanager,kfm,trucchi,file,separa finestre,comportamento,memoria utilizzata,home
+Keywords[ja]=konqueror,ファイルマネージャ,kfm,ツールチップ,個別ウィンドウ, ポップウィンドウ,挙動,メモリ使用量,ホームURL
+Keywords[km]=konqueror,កម្មវិធី​គ្រប់គ្រង​ឯកសារ,kfm,ព័ត៌មាន​ជំនួស,ព័ត៌មាន​ជំនួយ​ឯកសារ,ខណ្ឌចែក​បង្អួច,បង្កើត​បង្អួច,ឥរិយាបថ,ការ​ប្រើ​សតិ,URL ដើម
+Keywords[lt]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL, bylų tvarkyklė, kfm, patarimai, atskiri langai, elgesys, elgsena, atminties naudojimas, namų adresas
+Keywords[lv]=iekarotājs,failumenedžeris,kfm,padoms,failu padomi,atsevišķs logs,spawn windows,izturēšanās,atmiņas izmantošana,Mājas URL,
+Keywords[mk]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,менаџер на датотеки,совети,совети за датотеки,подели го прозорецот, однесување,користење на меморија,Домашно URL,
+Keywords[mn]=Конкюрор,Файл удирдагч,kfm,Зөвлөмж,Цонх,Байдал, Хувийн лавлах,Санах ойн ашиглалт
+Keywords[mt]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,ħjilijiet,pariri,imġieba
+Keywords[nb]=konqueror,filemanager,kfm,tips,file tips,separate vinduer,filbehandler,fil,adskilte vindu,delte vinduer,oppførsel,minnebruk,hjemme-nettadresse
+Keywords[nds]=Konqueror,Dateipleger,kfm,Tipps,Tooltips,egen Finster,Finstern maken,Bedregen,Spiekerverbruuk,Startadress
+Keywords[ne]=कन्क्वेरर, फाइल प्रबन्धक, kfm, टिपहरू, फाइल टिपहरू, फरक सञ्झ्याल, स्पवन सञ्झ्यालहरू, व्यवहार, स्मृति प्रयोग,गृह URL,
+Keywords[nl]=konqueror,filemanager,kfm,tips,knopinfo,tooltips,gedrag,geheugengebruik,home,persoonlijke map,
+Keywords[nn]=Konqueror,filhandsamar,KFM,tips,filtips,eige vindauge,nye vindauge,åtferd,minnebruk,heime-URL
+Keywords[nso]=konqueror,molaodi wa faele,kfm,ditomotsebe,ditomotsebe tsa faele,window yeo e hlaogilego,spawn windows,mekgwa,mekgwa,tshomiso ya kelelo,URL ya gae,
+Keywords[pa]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,ਫਾਇਲ ਮੈਨੇਜਰ,ਸੰਕੇਤ,ਵੱਖਰਾ ਝਰੋਖਾ,ਵਿਹਾਰ,ਮੈਮੋਰੀ ਵਰਤੋਂ,ਕੋਨਕਿਉਰਰ
+Keywords[pl]=konqueror,menedżer plików,kfm,wskazówki,informacja o pliku,osobne okno, mnożące się okna,zachowanie,zużycie zasobów pamięci,odnośnik do kartoteki domowej
+Keywords[pt]=konqueror,gestor de ficheiros,kfm,dicas,dicas de ficheiros,janela separada,comportamento,utilização de memória,URL de base,
+Keywords[pt_BR]=konqueror,gerenciador de arquivos,kfm,dicas,arquivos de dicas,janelas separadas,janelas unidas,comportamento,comportamento,uso de memória,URL local,
+Keywords[ro]=konqueror,manager de fișiere,kfm,sfaturi,ferestre separate,comportament,utilizare memorie,URL Acasă
+Keywords[rw]=Konqueror,mugengadosiye,kfm,inyobora, inyobora y'idosiye, gutandukanya Idirishya,kurema amadirishya,imyitwarire,imyitwarire,ikoresha ry'umwanyabubiko,URL y'Ipaji kwinjira,
+Keywords[se]=konqueror,fiilagieđahalli,kfm,rávvagat,fiilarávvagat,iežaš láse,ođđa láset,láhtten,muitugeavaheapmi,ruoktu-URL
+Keywords[sk]=konqueror,správa súborov,kfm,tipy,oddelené okná,nové okná,správanie,využitie pamäti,domovské URL
+Keywords[sl]=konqueror,upravitelj datotek,upravljalnik,kfm,namigi,namigi datotek,ločeno okno,ustvari okna,obnašanje,poraba pomnilnika,domači URL
+Keywords[sr]=konqueror,filemanager,kfm,форе,форе за фајлове,одвојени прозор,spawn прозори,понашање,искоришћеност меморије,Home URL,
+Keywords[sr@Latn]=konqueror,filemanager,kfm,fore,fore za fajlove,odvojeni prozor,spawn prozori,ponašanje,iskorišćenost memorije,Home URL,
+Keywords[sv]=konqueror,filhanterare,kfm,tips,filtips,särskilt fönster,visa fönster,beteende,minnesanvändning,hemadress
+Keywords[ta]=கான்கொரர்,கோப்பு மேலாளர்,kfm,குறிப்புகள்,கோப்பு குறிப்புகள்,தனி சாளரம்,நீள்வட்ட சாளரம்,நடத்தை,நினைவு பயன்பாடு,வீட்டு வலைப்பின்னல்,
+Keywords[th]=คอนเควอร์เรอร์,จัดการแฟ้ม,kfm,เคล็ดลับ,เคล็ดลับแฟ้ม,แยกหน้าต่าง,หน้าต่างเปิดใหม่,พฤติกรรม,การใช้หน่วยความจำ,ตำแหน่งหลัก,
+Keywords[tr]=konqueror,dosya yöneticisi,kfm,ipuçları,dosya,pencere,davranış,bellek kullanımı,başlangıç
+Keywords[uk]=konqueror,менеджер файлів,kfm,підказки,підказки по файлах,створення вікон,поведінка,використання пам'яті,домашній URL
+Keywords[uz]=konqueror,fayl boshqaruvchisi,kfm,eslatmalar,fayl eslatmalari,alohida oyna,spawn windows,xususiyatlar,xotiradan foydalanish,Uy URL
+Keywords[uz@cyrillic]=konqueror,файл бошқарувчиси,kfm,эслатмалар,файл эслатмалари,алоҳида ойна,spawn windows,хусусиятлар,хотирадан фойдаланиш,Уй URL
+Keywords[ven]=konqueror,mulanguli wa faela,kfm,tsivhudzo,tsivhudzo ya faela,window yo fhandekanaho,spawn windows,maitele,maitele,mashumisele a muhumbulo,Haya URL,
+Keywords[vi]=konqueror,trình quản lý tập tin,kfm,gợi ý,gợi ý tập tin,phân cách cửa sổ,cửa sổ nhỏ,cách hoạt động,các cách hoạt động,bộ nhớ sử dụng,URL Nhà,
+Keywords[wa]=konqueror,manaedjeu d' fitchî,kfm,tips,bon a savu,bon a saveur,purnea metous a pårt,dispårtis purneas,dujhance,eployaedje del memwere,URL Måjhon
+Keywords[xh]=konqueror,umphathi wefayile,kfm,amancam, ifayile amancam,yahlula i window,yenza,windows, ukuziphatha,usebenziso lwenkumbulo,Ekhaya URL,
+Keywords[zh_CN]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,文件管理器,提示,文件提示,拆分窗口,新开窗口,行为,内存使用,主 URL,
+Keywords[zh_TW]=konqueror,filemanager,kfm,tips,file tips,separate window,spawn windows,behavior,behaviour,memory usage,Home URL,征服家,檔案管理程式,檔案密訣,分離視窗,產生視窗,行為,記憶體使用量,家 URL,
+Keywords[zu]=konqueror,imenenja yefayela,kfm,amacebo,amacebo efayela,i-window elahlukene,ama-window azelwe,ukuziphatha,ukuziphhatha, ukusetshenziswa kenkumbulo,i-URL yasekhaya,
diff --git a/kcontrol/konqhtml/Makefile.am b/kcontrol/konqhtml/Makefile.am
new file mode 100644
index 000000000..87cf8a664
--- /dev/null
+++ b/kcontrol/konqhtml/Makefile.am
@@ -0,0 +1,26 @@
+AM_CPPFLAGS = -I$(top_srcdir)/libkonq -I$(top_srcdir)/kcontrol/input $(all_includes)
+AM_LDFLAGS = $(all_libraries)
+
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = kcm_konqhtml.la
+
+kcm_konqhtml_la_SOURCES = advancedTabDialog.cpp htmlopts.cpp jsopts.cpp \
+ javaopts.cpp pluginopts.cpp appearance.cpp \
+ khttpoptdlg.cpp policydlg.cpp main.cpp \
+ jspolicies.cpp nsconfigwidget.ui policies.cpp \
+ domainlistview.cpp advancedTabOptions.ui \
+ filteropts.cpp
+
+kcm_konqhtml_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_konqhtml_la_LIBADD = -lkhtml -lkdeui
+
+xdg_apps_DATA = khtml_behavior.desktop khtml_java_js.desktop khtml_fonts.desktop khtml_filter.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmkonqhtml.pot
+
+install-data-local: uninstall.desktop
+ $(mkinstalldirs) $(DESTDIR)$(kde_appsdir)/Settings/WebBrowsing
+ $(INSTALL_DATA) $(srcdir)/uninstall.desktop $(DESTDIR)$(kde_appsdir)/Settings/WebBrowsing/nsplugin.desktop
+ $(INSTALL_DATA) $(srcdir)/uninstall.desktop $(DESTDIR)$(kde_appsdir)/Settings/WebBrowsing/khtml_appearance.desktop
diff --git a/kcontrol/konqhtml/advancedTabDialog.cpp b/kcontrol/konqhtml/advancedTabDialog.cpp
new file mode 100644
index 000000000..93a576043
--- /dev/null
+++ b/kcontrol/konqhtml/advancedTabDialog.cpp
@@ -0,0 +1,121 @@
+/*
+ * advancedTabDialog.cpp
+ *
+ * Copyright (c) 2002 Aaron J. Seigo <aseigo@olympusproject.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qslider.h>
+
+#include <kapplication.h>
+#include <dcopclient.h>
+#include <kcolorbutton.h>
+#include <klocale.h>
+#include <kconfig.h>
+
+#include "advancedTabDialog.h"
+#include "advancedTabOptions.h"
+#include "main.h"
+
+advancedTabDialog::advancedTabDialog(QWidget* parent, KConfig* config, const char* name)
+ : KDialogBase(KDialogBase::Plain,
+ i18n("Advanced Options"),
+ KDialogBase::Ok |
+ KDialogBase::Apply |
+ KDialogBase::Cancel,
+ KDialogBase::Ok,
+ parent,
+ name,
+ true, true),
+ m_pConfig(config)
+{
+ connect(this, SIGNAL(applyClicked()),
+ this, SLOT(save()));
+ connect(this, SIGNAL(okClicked()),
+ this, SLOT(save()));
+ actionButton(Apply)->setEnabled(false);
+ QFrame* page = plainPage();
+ QVBoxLayout* layout = new QVBoxLayout(page);
+ m_advancedWidget = new advancedTabOptions(page);
+ layout->addWidget(m_advancedWidget);
+ layout->addSpacing( 20 );
+ layout->addStretch();
+
+ connect(m_advancedWidget->m_pNewTabsInBackground, SIGNAL(clicked()), this, SLOT(changed()));
+ connect(m_advancedWidget->m_pOpenAfterCurrentPage, SIGNAL(clicked()), this, SLOT(changed()));
+ connect(m_advancedWidget->m_pTabConfirm, SIGNAL(clicked()), this, SLOT(changed()));
+ connect(m_advancedWidget->m_pTabCloseActivatePrevious, SIGNAL(clicked()), this, SLOT(changed()));
+ connect(m_advancedWidget->m_pPermanentCloseButton, SIGNAL(clicked()), this, SLOT(changed()));
+ connect(m_advancedWidget->m_pKonquerorTabforExternalURL, SIGNAL(clicked()), this, SLOT(changed()));
+ connect(m_advancedWidget->m_pPopupsWithinTabs, SIGNAL(clicked()), this, SLOT(changed()));
+
+ load();
+}
+
+advancedTabDialog::~advancedTabDialog()
+{
+}
+
+void advancedTabDialog::load()
+{
+ m_pConfig->setGroup("FMSettings");
+ m_advancedWidget->m_pNewTabsInBackground->setChecked( ! (m_pConfig->readBoolEntry( "NewTabsInFront", false )) );
+ m_advancedWidget->m_pOpenAfterCurrentPage->setChecked( m_pConfig->readBoolEntry( "OpenAfterCurrentPage", false ) );
+ m_advancedWidget->m_pPermanentCloseButton->setChecked( m_pConfig->readBoolEntry( "PermanentCloseButton", false ) );
+ m_advancedWidget->m_pKonquerorTabforExternalURL->setChecked( m_pConfig->readBoolEntry( "KonquerorTabforExternalURL", false ) );
+ m_advancedWidget->m_pPopupsWithinTabs->setChecked( m_pConfig->readBoolEntry( "PopupsWithinTabs", false ) );
+ m_advancedWidget->m_pTabCloseActivatePrevious->setChecked( m_pConfig->readBoolEntry( "TabCloseActivatePrevious", false ) );
+
+ m_pConfig->setGroup("Notification Messages");
+ m_advancedWidget->m_pTabConfirm->setChecked( !m_pConfig->hasKey("MultipleTabConfirm") );
+
+ actionButton(Apply)->setEnabled(false);
+}
+
+void advancedTabDialog::save()
+{
+ m_pConfig->setGroup("FMSettings");
+ m_pConfig->writeEntry( "NewTabsInFront", !(m_advancedWidget->m_pNewTabsInBackground->isChecked()) );
+ m_pConfig->writeEntry( "OpenAfterCurrentPage", m_advancedWidget->m_pOpenAfterCurrentPage->isChecked() );
+ m_pConfig->writeEntry( "PermanentCloseButton", m_advancedWidget->m_pPermanentCloseButton->isChecked() );
+ m_pConfig->writeEntry( "KonquerorTabforExternalURL", m_advancedWidget->m_pKonquerorTabforExternalURL->isChecked() );
+ m_pConfig->writeEntry( "PopupsWithinTabs", m_advancedWidget->m_pPopupsWithinTabs->isChecked() );
+ m_pConfig->writeEntry( "TabCloseActivatePrevious", m_advancedWidget->m_pTabCloseActivatePrevious->isChecked() );
+ m_pConfig->sync();
+
+ // It only matters wether the key is present, its value has no meaning
+ m_pConfig->setGroup("Notification Messages");
+ if ( m_advancedWidget->m_pTabConfirm->isChecked() ) m_pConfig->deleteEntry( "MultipleTabConfirm" );
+ else m_pConfig->writeEntry( "MultipleTabConfirm", true );
+
+ QByteArray data;
+ if ( !KApplication::kApplication()->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ KApplication::kApplication()->dcopClient()->send( "konqueror*", "KonquerorIface", "reparseConfiguration()", data );
+
+ actionButton(Apply)->setEnabled(false);
+}
+
+void advancedTabDialog::changed()
+{
+ actionButton(Apply)->setEnabled(true);
+}
+
+#include "advancedTabDialog.moc"
diff --git a/kcontrol/konqhtml/advancedTabDialog.h b/kcontrol/konqhtml/advancedTabDialog.h
new file mode 100644
index 000000000..728e8928b
--- /dev/null
+++ b/kcontrol/konqhtml/advancedTabDialog.h
@@ -0,0 +1,45 @@
+/*
+ * advancedTabDialog.h
+ *
+ * Copyright (c) 2002 Aaron J. Seigo <aseigo@olympusproject.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#ifndef __ADVANCEDTABDIALOG_H
+#define __ADVANCEDTABDIALOG_H
+
+#include <kdialogbase.h>
+
+class advancedTabOptions;
+
+class advancedTabDialog : public KDialogBase
+{
+ Q_OBJECT
+
+ public:
+ advancedTabDialog(QWidget* parent, KConfig *config, const char* name);
+ ~advancedTabDialog();
+
+ protected slots:
+ void load();
+ void save();
+ void changed();
+
+ private:
+ KConfig* m_pConfig;
+ advancedTabOptions* m_advancedWidget;
+};
+
+#endif
diff --git a/kcontrol/konqhtml/advancedTabOptions.ui b/kcontrol/konqhtml/advancedTabOptions.ui
new file mode 100644
index 000000000..7116bc1ee
--- /dev/null
+++ b/kcontrol/konqhtml/advancedTabOptions.ui
@@ -0,0 +1,155 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>advancedTabOptions</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>advancedTabOptions</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>644</width>
+ <height>208</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Advanced Options&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>Line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_pNewTabsInBackground</cstring>
+ </property>
+ <property name="text">
+ <string>O&amp;pen new tabs in the background</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This will open a new tab in the background, instead of in the foreground.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_pOpenAfterCurrentPage</cstring>
+ </property>
+ <property name="text">
+ <string>Open &amp;new tab after current tab</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This will open a new tab opened from a page after the current tab, instead of after the last tab.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_pTabConfirm</cstring>
+ </property>
+ <property name="text">
+ <string>Confirm &amp;when closing windows with multiple tabs</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This will ask you whether you are sure you want to close a window when it has multiple tabs opened in it.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_pPermanentCloseButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Show close button instead of website icon</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This will display close buttons inside each tab instead of websites' icons.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_pPopupsWithinTabs</cstring>
+ </property>
+ <property name="text">
+ <string>Open pop&amp;ups in new tab instead of in new window</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Whether or not JavaScript popups if allowed shall open in a new tab or in a new window.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_pTabCloseActivatePrevious</cstring>
+ </property>
+ <property name="text">
+ <string>Activate previous used tab when closing the current tab</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When checking this the previous used or opened tab will be activated when you close the current active tab instead of the one right to the current tab.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_pKonquerorTabforExternalURL</cstring>
+ </property>
+ <property name="text">
+ <string>Open as tab in existing Konqueror when URL is called externally</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When you click a URL in another KDE program or call kfmclient to open a URL, the current desktop will be searched for a non-minimized Konqueror and, if found, the URL opened as a new tab within it. Otherwise a new Konqueror window will be opened with the required URL.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/konqhtml/appearance.cpp b/kcontrol/konqhtml/appearance.cpp
new file mode 100644
index 000000000..15cbd036a
--- /dev/null
+++ b/kcontrol/konqhtml/appearance.cpp
@@ -0,0 +1,417 @@
+
+#include <qfontdatabase.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qvgroupbox.h>
+#include <qwhatsthis.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kcharsets.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kfontcombo.h>
+#include <kglobal.h>
+#include <khtmldefaults.h>
+#include <klocale.h>
+#include <knuminput.h>
+
+#if defined Q_WS_X11 && !defined K_WS_QTONLY
+#include <X11/Xlib.h>
+#endif
+
+
+#include "appearance.moc"
+
+KAppearanceOptions::KAppearanceOptions(KConfig *config, QString group, QWidget *parent, const char *)
+ : KCModule( parent, "kcmkonqhtml" ), m_pConfig(config), m_groupname(group),
+ fSize( 10 ), fMinSize( HTML_DEFAULT_MIN_FONT_SIZE )
+
+{
+ setQuickHelp( i18n("<h1>Konqueror Fonts</h1>On this page, you can configure "
+ "which fonts Konqueror should use to display the web "
+ "pages you view."));
+
+ QString wtstr;
+
+ QGridLayout *lay = new QGridLayout(this, 1 ,1 , 0, KDialog::spacingHint());
+ int r = 0;
+ int E = 0, M = 1, W = 3; //CT 3 (instead 2) allows smaller color buttons
+
+ QGroupBox* gb = new QGroupBox( 1, QGroupBox::Horizontal, i18n("Font Si&ze"), this );
+ lay->addMultiCellWidget(gb, r, r, E, W);
+
+ QWhatsThis::add( gb, i18n("This is the relative font size Konqueror uses to display web sites.") );
+
+ m_minSize = new KIntNumInput( fMinSize, gb );
+ m_minSize->setLabel( i18n( "M&inimum font size:" ) );
+ m_minSize->setRange( 2, 30 );
+ connect( m_minSize, SIGNAL( valueChanged( int ) ), this, SLOT( slotMinimumFontSize( int ) ) );
+ connect( m_minSize, SIGNAL( valueChanged( int ) ), this, SLOT( changed() ) );
+ QWhatsThis::add( m_minSize, i18n( "Konqueror will never display text smaller than "
+ "this size,<br>overriding any other settings" ) );
+
+ m_MedSize = new KIntNumInput( m_minSize, fSize, gb );
+ m_MedSize->setLabel( i18n( "&Medium font size:" ) );
+ m_MedSize->setRange( 2, 30 );
+ connect( m_MedSize, SIGNAL( valueChanged( int ) ), this, SLOT( slotFontSize( int ) ) );
+ connect( m_MedSize, SIGNAL( valueChanged( int ) ), this, SLOT( changed() ) );
+ QWhatsThis::add( m_MedSize,
+ i18n("This is the relative font size Konqueror uses "
+ "to display web sites.") );
+
+ QStringList emptyList;
+
+ QLabel* label = new QLabel( i18n("S&tandard font:"), this );
+ lay->addWidget( label , ++r, E);
+
+ m_pFonts[0] = new KFontCombo( emptyList, this );
+
+ label->setBuddy( m_pFonts[0] );
+ lay->addMultiCellWidget(m_pFonts[0], r, r, M, W);
+
+ wtstr = i18n("This is the font used to display normal text in a web page.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( m_pFonts[0], wtstr );
+
+ connect( m_pFonts[0], SIGNAL( activated(const QString&) ),
+ SLOT( slotStandardFont(const QString&) ) );
+ connect( m_pFonts[0], SIGNAL( activated(const QString&) ),
+ SLOT(changed() ) );
+ connect( m_pFonts[0]->lineEdit(), SIGNAL( textChanged(const QString&) ),
+ SLOT( slotStandardFont(const QString&) ) );
+ connect( m_pFonts[0], SIGNAL( textChanged(const QString&) ),
+ SLOT(changed() ) );
+
+ label = new QLabel( i18n( "&Fixed font:"), this );
+ lay->addWidget( label, ++r, E );
+
+ m_pFonts[1] = new KFontCombo( emptyList, this );
+
+ label->setBuddy( m_pFonts[1] );
+ lay->addMultiCellWidget(m_pFonts[1], r, r, M, W);
+
+ wtstr = i18n("This is the font used to display fixed-width (i.e. non-proportional) text.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( m_pFonts[1], wtstr );
+
+ connect( m_pFonts[1], SIGNAL( activated(const QString&) ),
+ SLOT( slotFixedFont(const QString&) ) );
+ connect( m_pFonts[1], SIGNAL( activated(const QString&) ),
+ SLOT(changed() ) );
+ connect( m_pFonts[1]->lineEdit(), SIGNAL( textChanged(const QString&) ),
+ SLOT( slotFixedFont(const QString&) ) );
+ connect( m_pFonts[1], SIGNAL( textChanged(const QString&) ),
+ SLOT(changed() ) );
+
+ label = new QLabel( i18n( "S&erif font:" ), this );
+ lay->addWidget( label, ++r, E );
+
+ m_pFonts[2] = new KFontCombo( emptyList, this );
+
+ label->setBuddy( m_pFonts[2] );
+ lay->addMultiCellWidget( m_pFonts[2], r, r, M, W );
+
+ wtstr= i18n( "This is the font used to display text that is marked up as serif." );
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( m_pFonts[2], wtstr );
+
+ connect( m_pFonts[2], SIGNAL( activated( const QString& ) ),
+ SLOT( slotSerifFont( const QString& ) ) );
+ connect( m_pFonts[2], SIGNAL( activated( const QString& ) ),
+ SLOT( changed() ) );
+ connect( m_pFonts[2]->lineEdit(), SIGNAL( textChanged(const QString&) ),
+ SLOT( slotSerifFont(const QString&) ) );
+ connect( m_pFonts[2], SIGNAL( textChanged(const QString&) ),
+ SLOT(changed() ) );
+
+ label = new QLabel( i18n( "Sa&ns serif font:" ), this );
+ lay->addWidget( label, ++r, E );
+
+ m_pFonts[3] = new KFontCombo( emptyList, this );
+
+ label->setBuddy( m_pFonts[3] );
+ lay->addMultiCellWidget( m_pFonts[3], r, r, M, W );
+
+ wtstr= i18n( "This is the font used to display text that is marked up as sans-serif." );
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( m_pFonts[3], wtstr );
+
+ connect( m_pFonts[3], SIGNAL( activated( const QString& ) ),
+ SLOT( slotSansSerifFont( const QString& ) ) );
+ connect( m_pFonts[3], SIGNAL( activated( const QString& ) ),
+ SLOT( changed() ) );
+ connect( m_pFonts[3]->lineEdit(), SIGNAL( textChanged(const QString&) ),
+ SLOT( slotSansSerifFont(const QString&) ) );
+ connect( m_pFonts[3], SIGNAL( textChanged(const QString&) ),
+ SLOT(changed() ) );
+
+
+ label = new QLabel( i18n( "C&ursive font:" ), this );
+ lay->addWidget( label, ++r, E );
+
+ m_pFonts[4] = new KFontCombo( emptyList, this );
+
+ label->setBuddy( m_pFonts[4] );
+ lay->addMultiCellWidget( m_pFonts[4], r, r, M, W );
+
+ wtstr= i18n( "This is the font used to display text that is marked up as italic." );
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( m_pFonts[4], wtstr );
+
+ connect( m_pFonts[4], SIGNAL( activated( const QString& ) ),
+ SLOT( slotCursiveFont( const QString& ) ) );
+ connect( m_pFonts[4], SIGNAL( activated( const QString& ) ),
+ SLOT( changed() ) );
+ connect( m_pFonts[4]->lineEdit(), SIGNAL( textChanged(const QString&) ),
+ SLOT( slotCursiveFont(const QString&) ) );
+ connect( m_pFonts[4], SIGNAL( textChanged(const QString&) ),
+ SLOT(changed() ) );
+
+
+ label = new QLabel( i18n( "Fantas&y font:" ), this );
+ lay->addWidget( label, ++r, E );
+
+ m_pFonts[5] = new KFontCombo( emptyList, this );
+
+ label->setBuddy( m_pFonts[5] );
+ lay->addMultiCellWidget( m_pFonts[5], r, r, M, W );
+
+ wtstr= i18n( "This is the font used to display text that is marked up as a fantasy font." );
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( m_pFonts[5], wtstr );
+
+ connect( m_pFonts[5], SIGNAL( activated( const QString& ) ),
+ SLOT( slotFantasyFont( const QString& ) ) );
+ connect( m_pFonts[5], SIGNAL( activated( const QString& ) ),
+ SLOT( changed() ) );
+ connect( m_pFonts[5]->lineEdit(), SIGNAL( textChanged(const QString&) ),
+ SLOT( slotFantasyFont(const QString&) ) );
+ connect( m_pFonts[5], SIGNAL( textChanged(const QString&) ),
+ SLOT(changed() ) );
+
+
+ label = new QLabel( i18n( "Font &size adjustment for this encoding:" ), this );
+ lay->addWidget( label, ++r, M );
+
+ m_pFontSizeAdjust = new QSpinBox( -5, 5, 1, this );
+ label->setBuddy( m_pFontSizeAdjust );
+ lay->addMultiCellWidget( m_pFontSizeAdjust, r, r, M+1, W );
+
+ connect( m_pFontSizeAdjust, SIGNAL( valueChanged( int ) ),
+ SLOT( slotFontSizeAdjust( int ) ) );
+ connect( m_pFontSizeAdjust, SIGNAL( valueChanged( int ) ),
+ SLOT( changed() ) );
+
+ label = new QLabel( i18n( "Default encoding:"), this );
+ //++r;
+ //lay->addMultiCellWidget( label, r, r, E, E+1);
+ lay->addWidget( label, ++r, E);
+
+ m_pEncoding = new QComboBox( false, this );
+ label->setBuddy( m_pEncoding );
+ encodings = KGlobal::charsets()->availableEncodingNames();
+ encodings.prepend(i18n("Use Language Encoding"));
+ m_pEncoding->insertStringList( encodings );
+ lay->addMultiCellWidget(m_pEncoding,r, r, M, W);
+
+ wtstr = i18n( "Select the default encoding to be used; normally, you will be fine with 'Use language encoding' "
+ "and should not have to change this.");
+ QWhatsThis::add( label, wtstr );
+ QWhatsThis::add( m_pEncoding, wtstr );
+
+ connect( m_pEncoding, SIGNAL( activated(const QString& ) ),
+ SLOT( slotEncoding(const QString&) ) );
+ connect( m_pEncoding, SIGNAL( activated(const QString& ) ),
+ SLOT( changed() ) );
+
+ ++r; lay->setRowStretch(r, 8);
+
+ QFontDatabase db;
+
+ m_families = db.families();
+
+ m_pFonts[0]->setFonts( m_families );
+ m_pFonts[1]->setFonts( m_families );
+ m_pFonts[2]->setFonts( m_families );
+ m_pFonts[3]->setFonts( m_families );
+ m_pFonts[4]->setFonts( m_families );
+ m_pFonts[5]->setFonts( m_families );
+
+ load();
+}
+
+KAppearanceOptions::~KAppearanceOptions()
+{
+delete m_pConfig;
+}
+
+void KAppearanceOptions::slotFontSize( int i )
+{
+ fSize = i;
+ if ( fSize < fMinSize ) {
+ m_minSize->setValue( fSize );
+ fMinSize = fSize;
+ }
+}
+
+
+void KAppearanceOptions::slotMinimumFontSize( int i )
+{
+ fMinSize = i;
+ if ( fMinSize > fSize ) {
+ m_MedSize->setValue( fMinSize );
+ fSize = fMinSize;
+ }
+}
+
+
+void KAppearanceOptions::slotStandardFont(const QString& n )
+{
+ fonts[0] = n;
+}
+
+
+void KAppearanceOptions::slotFixedFont(const QString& n )
+{
+ fonts[1] = n;
+}
+
+
+void KAppearanceOptions::slotSerifFont( const QString& n )
+{
+ fonts[2] = n;
+}
+
+
+void KAppearanceOptions::slotSansSerifFont( const QString& n )
+{
+ fonts[3] = n;
+}
+
+
+void KAppearanceOptions::slotCursiveFont( const QString& n )
+{
+ fonts[4] = n;
+}
+
+
+void KAppearanceOptions::slotFantasyFont( const QString& n )
+{
+ fonts[5] = n;
+}
+
+void KAppearanceOptions::slotFontSizeAdjust( int value )
+{
+ fonts[6] = QString::number( value );
+}
+
+void KAppearanceOptions::slotEncoding(const QString& n)
+{
+ encodingName = n;
+}
+
+void KAppearanceOptions::load()
+{
+ load( false );
+}
+
+void KAppearanceOptions::load( bool useDefaults )
+{
+ KConfig khtmlrc("khtmlrc", true, false);
+ m_pConfig->setReadDefaults( useDefaults );
+
+ khtmlrc.setReadDefaults( useDefaults );
+
+#define SET_GROUP(x) m_pConfig->setGroup(x); khtmlrc.setGroup(x)
+#define READ_NUM(x,y) m_pConfig->readNumEntry(x, khtmlrc.readNumEntry(x, y))
+#define READ_ENTRY(x,y) m_pConfig->readEntry(x, khtmlrc.readEntry(x, y))
+#define READ_LIST(x) m_pConfig->readListEntry(x, khtmlrc.readListEntry(x))
+
+ SET_GROUP(m_groupname);
+ fSize = READ_NUM( "MediumFontSize", 12 );
+ fMinSize = READ_NUM( "MinimumFontSize", HTML_DEFAULT_MIN_FONT_SIZE );
+ if (fSize < fMinSize)
+ fSize = fMinSize;
+
+ defaultFonts = QStringList();
+ defaultFonts.append( READ_ENTRY( "StandardFont", KGlobalSettings::generalFont().family() ) );
+ defaultFonts.append( READ_ENTRY( "FixedFont", KGlobalSettings::fixedFont().family() ) );
+ defaultFonts.append( READ_ENTRY( "SerifFont", HTML_DEFAULT_VIEW_SERIF_FONT ) );
+ defaultFonts.append( READ_ENTRY( "SansSerifFont", HTML_DEFAULT_VIEW_SANSSERIF_FONT ) );
+ defaultFonts.append( READ_ENTRY( "CursiveFont", HTML_DEFAULT_VIEW_CURSIVE_FONT ) );
+ defaultFonts.append( READ_ENTRY( "FantasyFont", HTML_DEFAULT_VIEW_FANTASY_FONT ) );
+ defaultFonts.append( QString("0") ); // default font size adjustment
+
+ if (m_pConfig->hasKey("Fonts"))
+ fonts = m_pConfig->readListEntry( "Fonts" );
+ else
+ fonts = khtmlrc.readListEntry( "Fonts" );
+ while (fonts.count() < 7)
+ fonts.append(QString::null);
+
+ encodingName = READ_ENTRY( "DefaultEncoding", QString::null );
+ //kdDebug(0) << "encoding = " << encodingName << endl;
+
+ updateGUI();
+ emit changed( useDefaults );
+
+#undef SET_GROUP
+#undef READ_NUM
+#undef READ_ENTRY
+#undef READ_LIST
+}
+
+void KAppearanceOptions::defaults()
+{
+ load( true );
+}
+
+void KAppearanceOptions::updateGUI()
+{
+ //kdDebug() << "KAppearanceOptions::updateGUI " << charset << endl;
+ for ( int f = 0; f < 6; f++ ) {
+ QString ff = fonts[f];
+ if (ff.isEmpty())
+ ff = defaultFonts[f];
+ m_pFonts[f]->setCurrentFont(ff);
+ }
+
+ int i = 0;
+ for ( QStringList::Iterator it = encodings.begin(); it != encodings.end(); ++it, ++i )
+ if ( encodingName == *it )
+ m_pEncoding->setCurrentItem( i );
+ if(encodingName.isEmpty())
+ m_pEncoding->setCurrentItem( 0 );
+ m_pFontSizeAdjust->setValue( fonts[6].toInt() );
+ m_MedSize->blockSignals(true);
+ m_MedSize->setValue( fSize );
+ m_MedSize->blockSignals(false);
+ m_minSize->blockSignals(true);
+ m_minSize->setValue( fMinSize );
+ m_minSize->blockSignals(false);
+}
+
+void KAppearanceOptions::save()
+{
+ m_pConfig->setGroup(m_groupname);
+ m_pConfig->writeEntry( "MediumFontSize", fSize );
+ m_pConfig->writeEntry( "MinimumFontSize", fMinSize );
+ m_pConfig->writeEntry( "Fonts", fonts );
+
+ // If the user chose "Use language encoding", write an empty string
+ if (encodingName == i18n("Use Language Encoding"))
+ encodingName = "";
+ m_pConfig->writeEntry( "DefaultEncoding", encodingName );
+ m_pConfig->sync();
+
+ QByteArray data;
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ kapp->dcopClient()->send( "konqueror*", "KonquerorIface", "reparseConfiguration()", data );
+
+ emit changed(false);
+}
+
diff --git a/kcontrol/konqhtml/appearance.h b/kcontrol/konqhtml/appearance.h
new file mode 100644
index 000000000..dd16626bd
--- /dev/null
+++ b/kcontrol/konqhtml/appearance.h
@@ -0,0 +1,70 @@
+// -*- c-basic-offset: 2 -*-
+// (c) Martin R. Jones 1996
+// (c) Bernd Wuebben 1998
+// KControl port & modifications
+// (c) Torben Weis 1998
+// End of the KControl port, added 'kfmclient configure' call.
+// (c) David Faure 1998
+// Cleanup and modifications for KDE 2.1
+// (c) Daniel Molkentin 2000
+
+#ifndef __APPEARANCE_H__
+#define __APPEARANCE_H__
+
+#include <qwidget.h>
+#include <qmap.h>
+
+#include <kcmodule.h>
+
+class QSpinBox;
+class KFontCombo;
+
+class KAppearanceOptions : public KCModule
+{
+ Q_OBJECT
+public:
+ KAppearanceOptions(KConfig *config, QString group, QWidget *parent=0, const char *name=0);
+ ~KAppearanceOptions();
+
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+
+public slots:
+ void slotFontSize( int );
+ void slotMinimumFontSize( int );
+ void slotStandardFont(const QString& n);
+ void slotFixedFont(const QString& n);
+ void slotSerifFont( const QString& n );
+ void slotSansSerifFont( const QString& n );
+ void slotCursiveFont( const QString& n );
+ void slotFantasyFont( const QString& n );
+ void slotEncoding( const QString& n);
+ void slotFontSizeAdjust( int value );
+
+private:
+ void updateGUI();
+
+private:
+
+ KConfig *m_pConfig;
+ QString m_groupname;
+ QStringList m_families;
+
+ KIntNumInput* m_minSize;
+ KIntNumInput* m_MedSize;
+ KIntNumInput* m_pageDPI;
+ KFontCombo* m_pFonts[6];
+ QComboBox* m_pEncoding;
+ QSpinBox *m_pFontSizeAdjust;
+
+ int fSize;
+ int fMinSize;
+ QStringList encodings;
+ QStringList fonts;
+ QStringList defaultFonts;
+ QString encodingName;
+};
+
+#endif // __APPEARANCE_H__
diff --git a/kcontrol/konqhtml/domainlistview.cpp b/kcontrol/konqhtml/domainlistview.cpp
new file mode 100644
index 000000000..a55221f43
--- /dev/null
+++ b/kcontrol/konqhtml/domainlistview.cpp
@@ -0,0 +1,230 @@
+/*
+ Copyright (c) 2002 Leo Savernik <l.savernik@aon.at>
+ Derived from jsopts.cpp and javaopts.cpp, code copied from there is
+ copyrighted to its respective owners.
+
+ 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 <qlayout.h>
+#include <qpushbutton.h>
+#include <qwhatsthis.h>
+
+#include <kconfig.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include "domainlistview.h"
+#include "policies.h"
+#include "policydlg.h"
+
+DomainListView::DomainListView(KConfig *config,const QString &title,
+ QWidget *parent,const char *name) :
+ QGroupBox(title, parent, name), config(config) {
+ setColumnLayout(0, Qt::Vertical);
+ layout()->setSpacing(0);
+ layout()->setMargin(0);
+ QGridLayout* thisLayout = new QGridLayout(layout());
+ thisLayout->setAlignment(Qt::AlignTop);
+ thisLayout->setSpacing(KDialog::spacingHint());
+ thisLayout->setMargin(KDialog::marginHint());
+
+ domainSpecificLV = new KListView(this);
+ domainSpecificLV->addColumn(i18n("Host/Domain"));
+ domainSpecificLV->addColumn(i18n("Policy"), 100);
+ connect(domainSpecificLV,SIGNAL(doubleClicked(QListViewItem *)), SLOT(changePressed()));
+ connect(domainSpecificLV,SIGNAL(returnPressed(QListViewItem *)), SLOT(changePressed()));
+ connect(domainSpecificLV, SIGNAL( executed( QListViewItem *)), SLOT( updateButton()));
+ connect(domainSpecificLV, SIGNAL(selectionChanged()), SLOT(updateButton()));
+ thisLayout->addMultiCellWidget(domainSpecificLV, 0, 5, 0, 0);
+
+ addDomainPB = new QPushButton(i18n("&New..."), this);
+ thisLayout->addWidget(addDomainPB, 0, 1);
+ connect(addDomainPB, SIGNAL(clicked()), SLOT(addPressed()));
+
+ changeDomainPB = new QPushButton( i18n("Chan&ge..."), this);
+ thisLayout->addWidget(changeDomainPB, 1, 1);
+ connect(changeDomainPB, SIGNAL(clicked()), this, SLOT(changePressed()));
+
+ deleteDomainPB = new QPushButton(i18n("De&lete"), this);
+ thisLayout->addWidget(deleteDomainPB, 2, 1);
+ connect(deleteDomainPB, SIGNAL(clicked()), this, SLOT(deletePressed()));
+
+ importDomainPB = new QPushButton(i18n("&Import..."), this);
+ thisLayout->addWidget(importDomainPB, 3, 1);
+ connect(importDomainPB, SIGNAL(clicked()), this, SLOT(importPressed()));
+ importDomainPB->setEnabled(false);
+ importDomainPB->hide();
+
+ exportDomainPB = new QPushButton(i18n("&Export..."), this);
+ thisLayout->addWidget(exportDomainPB, 4, 1);
+ connect(exportDomainPB, SIGNAL(clicked()), this, SLOT(exportPressed()));
+ exportDomainPB->setEnabled(false);
+ exportDomainPB->hide();
+
+ QSpacerItem* spacer = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding);
+ thisLayout->addItem(spacer, 5, 1);
+
+ QWhatsThis::add( addDomainPB, i18n("Click on this button to manually add a host or domain "
+ "specific policy.") );
+ QWhatsThis::add( changeDomainPB, i18n("Click on this button to change the policy for the "
+ "host or domain selected in the list box.") );
+ QWhatsThis::add( deleteDomainPB, i18n("Click on this button to delete the policy for the "
+ "host or domain selected in the list box.") );
+ updateButton();
+}
+
+DomainListView::~DomainListView() {
+ // free all policies
+ DomainPolicyMap::Iterator it = domainPolicies.begin();
+ for (; it != domainPolicies.end(); ++it) {
+ delete it.data();
+ }/*next it*/
+}
+
+void DomainListView::updateButton()
+{
+ QListViewItem *index = domainSpecificLV->currentItem();
+ bool enable = ( index != 0 );
+ changeDomainPB->setEnabled( enable );
+ deleteDomainPB->setEnabled( enable );
+
+}
+
+void DomainListView::addPressed()
+{
+// JavaPolicies pol_copy(m_pConfig,m_groupname,false);
+ Policies *pol = createPolicies();
+ pol->defaults();
+ PolicyDialog pDlg(pol, this);
+ setupPolicyDlg(AddButton,pDlg,pol);
+ if( pDlg.exec() ) {
+ QListViewItem* index = new QListViewItem( domainSpecificLV, pDlg.domain(),
+ pDlg.featureEnabledPolicyText() );
+ pol->setDomain(pDlg.domain());
+ domainPolicies.insert(index, pol);
+ domainSpecificLV->setCurrentItem( index );
+ emit changed(true);
+ } else {
+ delete pol;
+ }
+ updateButton();
+}
+
+void DomainListView::changePressed()
+{
+ QListViewItem *index = domainSpecificLV->currentItem();
+ if ( index == 0 )
+ {
+ KMessageBox::information( 0, i18n("You must first select a policy to be changed." ) );
+ return;
+ }
+
+ Policies *pol = domainPolicies[index];
+ // This must be copied because the policy dialog is allowed to change
+ // the data even if the changes are rejected in the end.
+ Policies *pol_copy = copyPolicies(pol);
+
+ PolicyDialog pDlg( pol_copy, this );
+ pDlg.setDisableEdit( true, index->text(0) );
+ setupPolicyDlg(ChangeButton,pDlg,pol_copy);
+ if( pDlg.exec() )
+ {
+ pol_copy->setDomain(pDlg.domain());
+ domainPolicies[index] = pol_copy;
+ pol_copy = pol;
+ index->setText(0, pDlg.domain() );
+ index->setText(1, pDlg.featureEnabledPolicyText());
+ emit changed(true);
+ }
+ delete pol_copy;
+}
+
+void DomainListView::deletePressed()
+{
+ QListViewItem *index = domainSpecificLV->currentItem();
+ if ( index == 0 )
+ {
+ KMessageBox::information( 0, i18n("You must first select a policy to delete." ) );
+ return;
+ }
+
+ DomainPolicyMap::Iterator it = domainPolicies.find(index);
+ if (it != domainPolicies.end()) {
+ delete it.data();
+ domainPolicies.remove(it);
+ delete index;
+ emit changed(true);
+ }
+ updateButton();
+}
+
+void DomainListView::importPressed()
+{
+ // PENDING(kalle) Implement this.
+}
+
+void DomainListView::exportPressed()
+{
+ // PENDING(kalle) Implement this.
+}
+
+void DomainListView::initialize(const QStringList &domainList)
+{
+ domainSpecificLV->clear();
+ domainPolicies.clear();
+// JavaPolicies pol(m_pConfig,m_groupname,false);
+ for (QStringList::ConstIterator it = domainList.begin();
+ it != domainList.end(); ++it) {
+ QString domain = *it;
+ Policies *pol = createPolicies();
+ pol->setDomain(domain);
+ pol->load();
+
+ QString policy;
+ if (pol->isFeatureEnabledPolicyInherited())
+ policy = i18n("Use Global");
+ else if (pol->isFeatureEnabled())
+ policy = i18n("Accept");
+ else
+ policy = i18n("Reject");
+ QListViewItem *index =
+ new QListViewItem( domainSpecificLV, domain, policy );
+
+ domainPolicies[index] = pol;
+ }
+}
+
+void DomainListView::save(const QString &group, const QString &domainListKey) {
+ QStringList domainList;
+ DomainPolicyMap::Iterator it = domainPolicies.begin();
+ for (; it != domainPolicies.end(); ++it) {
+ QListViewItem *current = it.key();
+ Policies *pol = it.data();
+ pol->save();
+ domainList.append(current->text(0));
+ }
+ config->setGroup(group);
+ config->writeEntry(domainListKey, domainList);
+}
+
+void DomainListView::setupPolicyDlg(PushButton /*trigger*/,
+ PolicyDialog &/*pDlg*/,Policies */*copy*/) {
+ // do nothing
+}
+
+#include "domainlistview.moc"
diff --git a/kcontrol/konqhtml/domainlistview.h b/kcontrol/konqhtml/domainlistview.h
new file mode 100644
index 000000000..3fb3f102e
--- /dev/null
+++ b/kcontrol/konqhtml/domainlistview.h
@@ -0,0 +1,209 @@
+/*
+ Copyright (c) 2002 Leo Savernik <l.savernik@aon.at>
+ Derived from jsopts.h and javaopts.h, code copied from there is
+ copyrighted to its respective owners.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __DOMAINLISTVIEW_H__
+#define __DOMAINLISTVIEW_H__
+
+#include <qgroupbox.h>
+#include <qmap.h>
+
+class QListViewItem;
+class QPushButton;
+class QStringList;
+
+class KConfig;
+class KListView;
+
+class Policies;
+class PolicyDialog;
+
+/**
+ * @short Provides a list view of domains which policies are attached to.
+ *
+ * This class resembles a list view of domain names and some buttons to
+ * manipulate it. You should use this widget if you need to manage domains
+ * whose policies are described by (derivatives of) Policies objects.
+ *
+ * The contained widgets can be accessed by respective getters for
+ * fine-tuning/customizing them afterwards.
+ *
+ * To use this class you have to derive your own and implement most
+ * (all) of the protected methods. You need these to customize this widget
+ * for its special purpose.
+ *
+ * @author Leo Savernik
+ */
+class DomainListView : public QGroupBox {
+ Q_OBJECT
+public:
+ /** Enumerates the available buttons.
+ */
+ enum PushButton {
+ AddButton, ChangeButton, DeleteButton, ImportButton, ExportButton
+ };
+
+ /**
+ * constructor
+ * @param config configuration to read from and to write to
+ * @param title title to be used for enclosing group box
+ * @param parent parent widget
+ * @param name internal name for debugging
+ */
+ DomainListView(KConfig *config,const QString &title,QWidget *parent,
+ const char *name = 0);
+
+ virtual ~DomainListView();
+
+ /**
+ * clears the list view.
+ */
+// void clear();
+
+ /**
+ * returns the list view displaying the domains
+ */
+ KListView *listView() const { return domainSpecificLV; }
+
+ /**
+ * returns the add push-button.
+ *
+ * Note: The add button already contains a default "what's this" text.
+ */
+ QPushButton *addButton() const { return addDomainPB; }
+
+ /**
+ * returns the change push-button.
+ *
+ * Note: The change button already contains a default "what's this" text.
+ */
+ QPushButton *changeButton() const { return changeDomainPB; }
+
+ /**
+ * returns the delete push-button.
+ *
+ * Note: The delete button already contains a default "what's this" text.
+ */
+ QPushButton *deleteButton() const { return deleteDomainPB; }
+
+ /**
+ * returns the import push-button.
+ */
+ QPushButton *importButton() const { return importDomainPB; }
+
+ /**
+ * returns the export push-button.
+ */
+ QPushButton *exportButton() const { return exportDomainPB; }
+
+ /**
+ * Initializes the list view with the given list of domains as well
+ * as the domain policy map.
+ *
+ * This method may be called multiple times on a DomainListView instance.
+ *
+ * @param domainList given list of domains
+ */
+ void initialize(const QStringList &domainList);
+
+ /**
+ * saves the current state of all domains to the configuration object.
+ * @param group the group the information is to be saved under
+ * @param domainListKey the name of the key which the list of domains
+ * is stored under.
+ */
+ void save(const QString &group, const QString &domainListKey);
+
+
+signals:
+ /**
+ * indicates that a configuration has been changed within this list view.
+ * @param state true if changed, false if not
+ */
+ void changed(bool state);
+
+protected:
+ /**
+ * factory method for creating a new domain-specific policies object.
+ *
+ * Example:
+ * <pre>
+ * JavaPolicies *JavaDomainListView::createPolicies() {
+ * return new JavaPolicies(m_pConfig,m_groupname,false);
+ * }
+ * </pre>
+ */
+ virtual Policies *createPolicies() = 0;
+
+ /**
+ * factory method for copying a policies object.
+ *
+ * Derived classes must interpret the given object as the same type
+ * as those created by createPolicies and return a copy of this very type.
+ *
+ * Example:
+ * <pre>
+ * JavaPolicies *JavaDomainListView::copyPolicies(Policies *pol) {
+ * return new JavaPolicies(*static_cast<JavaPolicies *>(pol));
+ * }
+ * </pre>
+ * @param pol policies object to be copied
+ */
+ virtual Policies *copyPolicies(Policies *pol) = 0;
+
+ /**
+ * allows derived classes to customize the policy dialog.
+ *
+ * The default implementation does nothing.
+ * @param trigger triggered by which button
+ * @param pDlg reference to policy dialog
+ * @param copy policies object this dialog is used for changing. Derived
+ * classes can safely cast the @p copy object to the same type they
+ * returned in their createPolicies implementation.
+ */
+ virtual void setupPolicyDlg(PushButton trigger,PolicyDialog &pDlg,
+ Policies *copy);
+
+private slots:
+ void addPressed();
+ void changePressed();
+ void deletePressed();
+ void importPressed();
+ void exportPressed();
+ void updateButton();
+
+protected:
+
+ KConfig *config;
+
+ KListView *domainSpecificLV;
+
+ QPushButton* addDomainPB;
+ QPushButton* changeDomainPB;
+ QPushButton* deleteDomainPB;
+ QPushButton* importDomainPB;
+ QPushButton* exportDomainPB;
+
+ typedef QMap<QListViewItem*, Policies *> DomainPolicyMap;
+ DomainPolicyMap domainPolicies;
+};
+
+#endif // __DOMAINLISTVIEW_H__
+
diff --git a/kcontrol/konqhtml/filteropts.cpp b/kcontrol/konqhtml/filteropts.cpp
new file mode 100644
index 000000000..a1a68b63e
--- /dev/null
+++ b/kcontrol/konqhtml/filteropts.cpp
@@ -0,0 +1,327 @@
+/*
+ Copyright (C) 2005 Ivor Hewitt <ivor@ivor.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <kconfig.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kaboutdata.h>
+#include <kfiledialog.h>
+#include <dcopclient.h>
+
+#include <qlayout.h>
+#include <qlistbox.h>
+#include <qpushbutton.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qvbox.h>
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qwhatsthis.h>
+#include <qregexp.h>
+
+#include "filteropts.h"
+#include "filteropts.moc"
+
+KCMFilter::KCMFilter(KConfig *config, QString group,
+ QWidget *parent, const char * )
+ : KCModule( parent, "kcmkonqhtml" ),
+ mConfig( config ),
+ mGroupname( group ),
+ mSelCount(0)
+{
+ setButtons(Default|Apply);
+
+ QVBoxLayout *topLayout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ mEnableCheck = new QCheckBox(i18n("Enable filters"), this);
+ topLayout->addWidget( mEnableCheck );
+
+ mKillCheck = new QCheckBox(i18n("Hide filtered images"), this);
+ topLayout->addWidget( mKillCheck );
+
+ QGroupBox *topBox = new QGroupBox( 1, Horizontal, i18n("URL Expressions to Filter"), this );
+ topLayout->addWidget( topBox );
+
+ mListBox = new QListBox( topBox );
+ mListBox->setSelectionMode(QListBox::Extended);
+ new QLabel( i18n("Expression (e.g. http://www.site.com/ad/*):"), topBox);
+ mString = new QLineEdit( topBox );
+
+ QHBox *buttonBox = new QHBox( topBox );
+ buttonBox->setSpacing( KDialog::spacingHint() );
+
+ mInsertButton = new QPushButton( i18n("Insert"), buttonBox );
+ connect( mInsertButton, SIGNAL( clicked() ), SLOT( insertFilter() ) );
+ mUpdateButton = new QPushButton( i18n("Update"), buttonBox );
+ connect( mUpdateButton, SIGNAL( clicked() ), SLOT( updateFilter() ) );
+ mRemoveButton = new QPushButton( i18n("Remove"), buttonBox );
+ connect( mRemoveButton, SIGNAL( clicked() ), SLOT( removeFilter() ) );
+
+ mImportButton = new QPushButton(i18n("Import..."),buttonBox);
+ connect( mImportButton, SIGNAL( clicked() ), SLOT( importFilters() ) );
+ mExportButton = new QPushButton(i18n("Export..."),buttonBox);
+ connect( mExportButton, SIGNAL( clicked() ), SLOT( exportFilters() ) );
+
+ connect( mEnableCheck, SIGNAL( clicked()), this, SLOT( slotEnableChecked()));
+ connect( mKillCheck, SIGNAL( clicked()), this, SLOT( slotKillChecked()));
+ connect( mListBox, SIGNAL( selectionChanged ()),this, SLOT( slotItemSelected()));
+
+/*
+ * Whats this items
+ */
+ QWhatsThis::add( mEnableCheck, i18n("Enable or disable AdBlocK filters. When enabled a set of expressions "
+ "to be blocked should be defined in the filter list for blocking to "
+ "take effect."));
+ QWhatsThis::add( mKillCheck, i18n("When enabled blocked images will be removed from the page completely "
+ "otherwise a placeholder 'blocked' image will be used."));
+ QWhatsThis::add( mListBox, i18n("This is the list of URL filters that will be applied to all linked "
+ "images and frames. The filters are processed in order so place "
+ "more generic filters towards the top of the list."));
+ QWhatsThis::add( mString, i18n("Enter an expression to filter. Expressions can be defined as either "
+ "a filename style wildcard e.g. http://www.site.com/ads* or as a full "
+ "regular expression by surrounding the string with '/' e.g. "
+ " //(ad|banner)\\./"));
+ load();
+ updateButton();
+}
+
+KCMFilter::~KCMFilter()
+{
+ delete mConfig;
+}
+
+void KCMFilter::slotKillChecked()
+{
+ emit changed( true );
+}
+
+void KCMFilter::slotEnableChecked()
+{
+ updateButton();
+ emit changed( true );
+}
+
+void KCMFilter::slotItemSelected()
+{
+ int currentId=-1;
+ unsigned int i;
+ for( i=0,mSelCount=0; i < mListBox->count() && mSelCount<2; ++i )
+ {
+ if (mListBox->isSelected(i))
+ {
+ currentId=i;
+ mSelCount++;
+ }
+ }
+
+ if ( currentId >= 0 )
+ {
+ mString->setText(mListBox->text(currentId));
+ }
+ updateButton();
+}
+
+void KCMFilter::updateButton()
+{
+ bool state = mEnableCheck->isChecked();
+
+ mUpdateButton->setEnabled(state && (mSelCount == 1));
+ mRemoveButton->setEnabled(state && (mSelCount > 0));
+ mInsertButton->setEnabled(state);
+ mImportButton->setEnabled(state);
+ mExportButton->setEnabled(state);
+
+ mListBox->setEnabled(state);
+ mString->setEnabled(state);
+ mKillCheck->setEnabled(state);
+}
+
+void KCMFilter::importFilters()
+{
+ QString inFile = KFileDialog::getOpenFileName();
+ if (inFile.length() > 0)
+ {
+ QFile f(inFile);
+ if ( f.open( IO_ReadOnly ) )
+ {
+ QTextStream ts( &f );
+ QStringList paths;
+ QString line;
+ while (!ts.atEnd())
+ {
+ line = ts.readLine();
+ if (line.lower().compare("[adblock]") == 0)
+ continue;
+
+ // Treat leading ! as filter comment, otherwise check expressions
+ // are valid.
+ if (!line.startsWith("!"))
+ {
+ if (line.length()>2 && line[0]=='/' && line[line.length()-1] == '/')
+ {
+ QString inside = line.mid(1, line.length()-2);
+ QRegExp rx(inside);
+ if (!rx.isValid())
+ continue;
+ }
+ else
+ {
+ QRegExp rx(line);
+ rx.setWildcard(true);
+ if (!rx.isValid())
+ continue;
+ }
+ }
+
+ if (!line.isEmpty() && mListBox->findItem(line, Qt::CaseSensitive|Qt::ExactMatch) == 0)
+ paths.append(line);
+ }
+ f.close();
+
+ mListBox->insertStringList( paths );
+ emit changed(true);
+ }
+ }
+}
+
+void KCMFilter::exportFilters()
+{
+ QString outFile = KFileDialog::getSaveFileName();
+ if (outFile.length() > 0)
+ {
+ QFile f(outFile);
+ if ( f.open( IO_WriteOnly ) )
+ {
+ QTextStream ts( &f );
+ ts.setEncoding( QTextStream::UnicodeUTF8 );
+ ts << "[AdBlock]" << endl;
+
+ uint i;
+ for( i = 0; i < mListBox->count(); ++i )
+ ts << mListBox->text(i) << endl;
+
+ f.close();
+ }
+ }
+}
+
+void KCMFilter::defaults()
+{
+ load( true );
+}
+
+void KCMFilter::save()
+{
+ mConfig->deleteGroup(mGroupname);
+ mConfig->setGroup(mGroupname);
+
+ mConfig->writeEntry("Enabled",mEnableCheck->isChecked());
+ mConfig->writeEntry("Shrink",mKillCheck->isChecked());
+
+ uint i;
+ for( i = 0; i < mListBox->count(); ++i )
+ {
+ QString key = "Filter-" + QString::number(i);
+ mConfig->writeEntry(key, mListBox->text(i));
+ }
+ mConfig->writeEntry("Count",mListBox->count());
+
+ mConfig->sync();
+ DCOPClient::mainClient()->send("konqueror*","KonquerorIface","reparseConfiguration()",QByteArray());
+
+}
+void KCMFilter::load()
+{
+ load( false );
+}
+
+void KCMFilter::load( bool useDefaults )
+{
+ QStringList paths;
+
+ mConfig->setReadDefaults( useDefaults );
+
+ mConfig->setGroup( mGroupname );
+ mEnableCheck->setChecked( mConfig->readBoolEntry("Enabled",false));
+ mKillCheck->setChecked( mConfig->readBoolEntry("Shrink",false));
+
+ QMap<QString,QString> entryMap = mConfig->entryMap( mGroupname );
+ QMap<QString,QString>::ConstIterator it;
+ int num = mConfig->readNumEntry("Count",0);
+ for (int i=0; i<num; ++i)
+ {
+ QString key = "Filter-" + QString::number(i);
+ it = entryMap.find(key);
+ if (it != entryMap.end())
+ paths.append(it.data());
+ }
+
+ mListBox->insertStringList( paths );
+
+ emit changed( useDefaults );
+}
+
+void KCMFilter::insertFilter()
+{
+ if ( !mString->text().isEmpty() )
+ {
+ mListBox->insertItem( mString->text() );
+ int id=mListBox->count()-1;
+ mListBox->clearSelection();
+ mListBox->setSelected(id,true);
+ mListBox->setCurrentItem(id);
+ mListBox->ensureCurrentVisible();
+ mString->clear();
+ emit changed( true );
+ }
+ updateButton();
+}
+
+void KCMFilter::removeFilter()
+{
+ for( int i = mListBox->count(); i >= 0; --i )
+ {
+ if (mListBox->isSelected(i))
+ mListBox->removeItem(i);
+ }
+ mString->clear();
+ emit changed( true );
+ updateButton();
+}
+
+void KCMFilter::updateFilter()
+{
+ if ( !mString->text().isEmpty() )
+ {
+ int index = mListBox->currentItem();
+ if ( index >= 0 )
+ {
+ mListBox->changeItem( mString->text(), index );
+ emit changed( true );
+ }
+ }
+ updateButton();
+}
+
+QString KCMFilter::quickHelp() const
+{
+ return i18n("<h1>Konqueror AdBlocK</h1> Konqueror AdBlocK allows you to create a list of filters"
+ " that are checked against linked images and frames. URL's that match are either discarded or"
+ " replaced with a placeholder image. ");
+}
diff --git a/kcontrol/konqhtml/filteropts.h b/kcontrol/konqhtml/filteropts.h
new file mode 100644
index 000000000..28fcaa652
--- /dev/null
+++ b/kcontrol/konqhtml/filteropts.h
@@ -0,0 +1,74 @@
+/*
+ Copyright (C) 2005 Ivor Hewitt <ivor@ivor.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+#ifndef FILTEROPTS_H
+#define FILTEROPTS_H
+
+#include <kcmodule.h>
+
+class QListBox;
+class QPushButton;
+class QLineEdit;
+class QListBoxItem;
+class QCheckBox;
+
+class KConfig;
+
+class KCMFilter : public KCModule
+{
+ Q_OBJECT
+public:
+ KCMFilter( KConfig* config, QString group, QWidget* parent = 0, const char* name = 0 );
+ ~KCMFilter();
+
+ void load();
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+ QString quickHelp() const;
+
+public slots:
+
+protected slots:
+ void insertFilter();
+ void updateFilter();
+ void removeFilter();
+ void slotItemSelected();
+ void slotEnableChecked();
+ void slotKillChecked();
+
+ void exportFilters();
+ void importFilters();
+
+private:
+ void updateButton();
+ QListBox *mListBox;
+ QLineEdit *mString;
+ QCheckBox *mEnableCheck;
+ QCheckBox *mKillCheck;
+ QPushButton *mInsertButton;
+ QPushButton *mUpdateButton;
+ QPushButton *mRemoveButton;
+ QPushButton *mImportButton;
+ QPushButton *mExportButton;
+
+ KConfig *mConfig;
+ QString mGroupname;
+ int mSelCount;
+};
+
+#endif
diff --git a/kcontrol/konqhtml/htmlopts.cpp b/kcontrol/konqhtml/htmlopts.cpp
new file mode 100644
index 000000000..44738e293
--- /dev/null
+++ b/kcontrol/konqhtml/htmlopts.cpp
@@ -0,0 +1,365 @@
+////
+// "Misc Options" Tab for KFM configuration
+//
+// (c) Sven Radej 1998
+// (c) David Faure 1998
+// (c) 2001 Waldo Bastian <bastian@kde.org>
+
+#include <qlayout.h>//CT - 12Nov1998
+#include <qwhatsthis.h>
+#include <qvgroupbox.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+
+#include "htmlopts.h"
+#include "advancedTabDialog.h"
+
+#include <konq_defaults.h> // include default values directly from konqueror
+#include <kglobalsettings.h> // get default for DEFAULT_CHANGECURSOR
+#include <klocale.h>
+#include <kdialog.h>
+#include <knuminput.h>
+#include <kseparator.h>
+
+#include <kapplication.h>
+#include <dcopclient.h>
+
+
+#include "htmlopts.moc"
+
+enum UnderlineLinkType { UnderlineAlways=0, UnderlineNever=1, UnderlineHover=2 };
+enum AnimationsType { AnimationsAlways=0, AnimationsNever=1, AnimationsLoopOnce=2 };
+//-----------------------------------------------------------------------------
+
+KMiscHTMLOptions::KMiscHTMLOptions(KConfig *config, QString group, QWidget *parent, const char *)
+ : KCModule( parent, "kcmkonqhtml" ), m_pConfig(config), m_groupname(group)
+{
+ int row = 0;
+ QGridLayout *lay = new QGridLayout(this, 10, 2, 0, KDialog::spacingHint());
+
+ // Bookmarks
+ setQuickHelp( i18n("<h1>Konqueror Browser</h1> Here you can configure Konqueror's browser "
+ "functionality. Please note that the file manager "
+ "functionality has to be configured using the \"File Manager\" "
+ "configuration module. You can make some "
+ "settings how Konqueror should handle the HTML code in "
+ "the web pages it loads. It is usually not necessary to "
+ "change anything here."));
+
+ QVGroupBox *bgBookmarks = new QVGroupBox( i18n("Boo&kmarks"), this );
+ m_pAdvancedAddBookmarkCheckBox = new QCheckBox(i18n( "Ask for name and folder when adding bookmarks" ), bgBookmarks);
+ QWhatsThis::add( m_pAdvancedAddBookmarkCheckBox, i18n( "If this box is checked, Konqueror will allow you to"
+ " change the title of the bookmark and choose a folder in which to store it when you add a new bookmark." ) );
+ connect(m_pAdvancedAddBookmarkCheckBox, SIGNAL(clicked()), SLOT(slotChanged()));
+
+ m_pOnlyMarkedBookmarksCheckBox = new QCheckBox(i18n( "Show only marked bookmarks in bookmark toolbar" ), bgBookmarks);
+ QWhatsThis::add( m_pOnlyMarkedBookmarksCheckBox, i18n( "If this box is checked, Konqueror will show only those"
+ " bookmarks in the bookmark toolbar which you have marked to do so in the bookmark editor." ) );
+ connect(m_pOnlyMarkedBookmarksCheckBox, SIGNAL(clicked()), SLOT(slotChanged()));
+
+ lay->addMultiCellWidget( bgBookmarks, row, row, 0, 1 );
+ row++;
+
+ // Form completion
+
+ QVGroupBox *bgForm = new QVGroupBox( i18n("Form Com&pletion"), this );
+ m_pFormCompletionCheckBox = new QCheckBox(i18n( "Enable completion of &forms" ), bgForm);
+ QWhatsThis::add( m_pFormCompletionCheckBox, i18n( "If this box is checked, Konqueror will remember"
+ " the data you enter in web forms and suggest it in similar fields for all forms." ) );
+ connect(m_pFormCompletionCheckBox, SIGNAL(clicked()), SLOT(slotChanged()));
+
+ m_pMaxFormCompletionItems = new KIntNumInput( bgForm );
+ m_pMaxFormCompletionItems->setLabel( i18n( "&Maximum completions:" ) );
+ m_pMaxFormCompletionItems->setRange( 0, 100 );
+ QWhatsThis::add( m_pMaxFormCompletionItems,
+ i18n( "Here you can select how many values Konqueror will remember for a form field." ) );
+ connect(m_pMaxFormCompletionItems, SIGNAL(valueChanged(int)), SLOT(slotChanged()));
+
+ lay->addMultiCellWidget( bgForm, row, row, 0, 1 );
+ row++;
+
+ // Tabbed Browsing
+
+ QGroupBox *bgTabbedBrowsing = new QGroupBox( 0, Qt::Vertical, i18n("Tabbed Browsing"), this );
+ QVBoxLayout *laygroup = new QVBoxLayout(bgTabbedBrowsing->layout(), KDialog::spacingHint() );
+
+ m_pShowMMBInTabs = new QCheckBox( i18n( "Open &links in new tab instead of in new window" ), bgTabbedBrowsing );
+ QWhatsThis::add( m_pShowMMBInTabs, i18n("This will open a new tab instead of a new window in various situations, "
+ "such as choosing a link or a folder with the middle mouse button.") );
+ connect(m_pShowMMBInTabs, SIGNAL(clicked()), SLOT(slotChanged()));
+ laygroup->addWidget(m_pShowMMBInTabs);
+
+ m_pDynamicTabbarHide = new QCheckBox( i18n( "Hide the tab bar when only one tab is open" ), bgTabbedBrowsing );
+ QWhatsThis::add( m_pDynamicTabbarHide, i18n("This will display the tab bar only if there are two or more tabs. Otherwise it will always be displayed.") );
+ connect(m_pDynamicTabbarHide, SIGNAL(clicked()), SLOT(slotChanged()));
+ laygroup->addWidget(m_pDynamicTabbarHide);
+
+ QHBoxLayout *laytab = new QHBoxLayout(laygroup, KDialog::spacingHint());
+ QPushButton *advancedTabButton = new QPushButton( i18n( "Advanced Options"), bgTabbedBrowsing );
+ laytab->addWidget(advancedTabButton);
+ laytab->addStretch();
+ connect(advancedTabButton, SIGNAL(clicked()), this, SLOT(launchAdvancedTabDialog()));
+
+ lay->addMultiCellWidget( bgTabbedBrowsing, row, row, 0, 1 );
+ row++;
+
+ // Mouse behavior
+
+ QVGroupBox *bgMouse = new QVGroupBox( i18n("Mouse Beha&vior"), this );
+
+ m_cbCursor = new QCheckBox(i18n("Chan&ge cursor over links"), bgMouse );
+ QWhatsThis::add( m_cbCursor, i18n("If this option is set, the shape of the cursor will change "
+ "(usually to a hand) if it is moved over a hyperlink.") );
+ connect(m_cbCursor, SIGNAL(clicked()), SLOT(slotChanged()));
+
+ m_pOpenMiddleClick = new QCheckBox( i18n ("M&iddle click opens URL in selection" ), bgMouse );
+ QWhatsThis::add( m_pOpenMiddleClick, i18n (
+ "If this box is checked, you can open the URL in the selection by middle clicking on a "
+ "Konqueror view." ) );
+ connect(m_pOpenMiddleClick, SIGNAL(clicked()), SLOT(slotChanged()));
+
+ m_pBackRightClick = new QCheckBox( i18n( "Right click goes &back in history" ), bgMouse );
+ QWhatsThis::add( m_pBackRightClick, i18n(
+ "If this box is checked, you can go back in history by right clicking on a Konqueror view. "
+ "To access the context menu, press the right mouse button and move." ) );
+ connect(m_pBackRightClick, SIGNAL(clicked()), SLOT(slotChanged()));
+
+ lay->addMultiCellWidget( bgMouse, row, row, 0, 1 );
+ row++;
+
+ // Misc
+
+ m_pAutoLoadImagesCheckBox = new QCheckBox( i18n( "A&utomatically load images"), this );
+ QWhatsThis::add( m_pAutoLoadImagesCheckBox, i18n( "If this box is checked, Konqueror will automatically load any images that are embedded in a web page. Otherwise, it will display placeholders for the images, and you can then manually load the images by clicking on the image button.<br>Unless you have a very slow network connection, you will probably want to check this box to enhance your browsing experience." ) );
+ connect(m_pAutoLoadImagesCheckBox, SIGNAL(clicked()), SLOT(slotChanged()));
+ lay->addMultiCellWidget( m_pAutoLoadImagesCheckBox, row, row, 0, 1 );
+ row++;
+
+ m_pUnfinishedImageFrameCheckBox = new QCheckBox( i18n( "Dra&w frame around not completely loaded images"), this );
+ QWhatsThis::add( m_pUnfinishedImageFrameCheckBox, i18n( "If this box is checked, Konqueror will draw a frame as placeholder around not yet fully loaded images that are embedded in a web page.<br>Especially if you have a slow network connection, you will probably want to check this box to enhance your browsing experience." ) );
+ connect(m_pUnfinishedImageFrameCheckBox, SIGNAL(clicked()), SLOT(slotChanged()));
+ lay->addMultiCellWidget( m_pUnfinishedImageFrameCheckBox, row, row, 0, 1 );
+ row++;
+
+ m_pAutoRedirectCheckBox = new QCheckBox( i18n( "Allow automatic delayed &reloading/redirecting"), this );
+ QWhatsThis::add( m_pAutoRedirectCheckBox,
+ i18n( "Some web pages request an automatic reload or redirection after a certain period of time. By unchecking this box Konqueror will ignore these requests." ) );
+ connect(m_pAutoRedirectCheckBox, SIGNAL(clicked()), SLOT(slotChanged()));
+ lay->addMultiCellWidget( m_pAutoRedirectCheckBox, row, row, 0, 1 );
+ row++;
+
+
+ // More misc
+
+ KSeparator *sep = new KSeparator(this);
+ lay->addMultiCellWidget(sep, row, row, 0, 1);
+ row++;
+
+ QLabel *label = new QLabel( i18n("Und&erline links:"), this);
+ m_pUnderlineCombo = new QComboBox( false, this );
+ label->setBuddy(m_pUnderlineCombo);
+ m_pUnderlineCombo->insertItem(i18n("underline","Enabled"), UnderlineAlways);
+ m_pUnderlineCombo->insertItem(i18n("underline","Disabled"), UnderlineNever);
+ m_pUnderlineCombo->insertItem(i18n("Only on Hover"), UnderlineHover);
+ lay->addWidget(label, row, 0);
+ lay->addWidget(m_pUnderlineCombo, row, 1);
+ row++;
+ QString whatsThis = i18n("Controls how Konqueror handles underlining hyperlinks:<br>"
+ "<ul><li><b>Enabled</b>: Always underline links</li>"
+ "<li><b>Disabled</b>: Never underline links</li>"
+ "<li><b>Only on Hover</b>: Underline when the mouse is moved over the link</li>"
+ "</ul><br><i>Note: The site's CSS definitions can override this value</i>");
+ QWhatsThis::add( label, whatsThis);
+ QWhatsThis::add( m_pUnderlineCombo, whatsThis);
+ connect(m_pUnderlineCombo, SIGNAL(activated(int)), SLOT(slotChanged()));
+
+
+
+ label = new QLabel( i18n("A&nimations:"), this);
+ m_pAnimationsCombo = new QComboBox( false, this );
+ label->setBuddy(m_pAnimationsCombo);
+ m_pAnimationsCombo->insertItem(i18n("animations","Enabled"), AnimationsAlways);
+ m_pAnimationsCombo->insertItem(i18n("animations","Disabled"), AnimationsNever);
+ m_pAnimationsCombo->insertItem(i18n("Show Only Once"), AnimationsLoopOnce);
+ lay->addWidget(label, row, 0);
+ lay->addWidget(m_pAnimationsCombo, row, 1);
+ row++;
+ whatsThis = i18n("Controls how Konqueror shows animated images:<br>"
+ "<ul><li><b>Enabled</b>: Show all animations completely.</li>"
+ "<li><b>Disabled</b>: Never show animations, show the start image only.</li>"
+ "<li><b>Show only once</b>: Show all animations completely but do not repeat them.</li>");
+ QWhatsThis::add( label, whatsThis);
+ QWhatsThis::add( m_pAnimationsCombo, whatsThis);
+ connect(m_pAnimationsCombo, SIGNAL(activated(int)), SLOT(slotChanged()));
+
+ lay->setRowStretch(row, 1);
+
+ load();
+ emit changed(false);
+}
+
+KMiscHTMLOptions::~KMiscHTMLOptions()
+{
+ delete m_pConfig;
+}
+
+void KMiscHTMLOptions::load()
+{
+ load( false );
+}
+
+void KMiscHTMLOptions::load( bool useDefaults )
+{
+ KConfig khtmlrc("khtmlrc", true, false);
+ khtmlrc.setReadDefaults( useDefaults );
+ m_pConfig->setReadDefaults( useDefaults );
+
+#define SET_GROUP(x) m_pConfig->setGroup(x); khtmlrc.setGroup(x)
+#define READ_BOOL(x,y) m_pConfig->readBoolEntry(x, khtmlrc.readBoolEntry(x, y))
+#define READ_ENTRY(x) m_pConfig->readEntry(x, khtmlrc.readEntry(x))
+
+
+ // *** load ***
+ SET_GROUP( "MainView Settings" );
+ bool bOpenMiddleClick = READ_BOOL( "OpenMiddleClick", true );
+ bool bBackRightClick = READ_BOOL( "BackRightClick", false );
+ SET_GROUP( "HTML Settings" );
+ bool changeCursor = READ_BOOL("ChangeCursor", KDE_DEFAULT_CHANGECURSOR);
+ bool underlineLinks = READ_BOOL("UnderlineLinks", DEFAULT_UNDERLINELINKS);
+ bool hoverLinks = READ_BOOL("HoverLinks", true);
+ bool bAutoLoadImages = READ_BOOL( "AutoLoadImages", true );
+ bool bUnfinishedImageFrame = READ_BOOL( "UnfinishedImageFrame", true );
+ QString strAnimations = READ_ENTRY( "ShowAnimations" ).lower();
+
+ bool bAutoRedirect = m_pConfig->readBoolEntry( "AutoDelayedActions", true );
+
+ // *** apply to GUI ***
+ m_cbCursor->setChecked( changeCursor );
+ m_pAutoLoadImagesCheckBox->setChecked( bAutoLoadImages );
+ m_pUnfinishedImageFrameCheckBox->setChecked( bUnfinishedImageFrame );
+ m_pAutoRedirectCheckBox->setChecked( bAutoRedirect );
+ m_pOpenMiddleClick->setChecked( bOpenMiddleClick );
+ m_pBackRightClick->setChecked( bBackRightClick );
+
+ // we use two keys for link underlining so that this config file
+ // is backwards compatible with KDE 2.0. the HoverLink setting
+ // has precedence over the UnderlineLinks setting
+ if (hoverLinks)
+ {
+ m_pUnderlineCombo->setCurrentItem( UnderlineHover );
+ }
+ else
+ {
+ if (underlineLinks)
+ m_pUnderlineCombo->setCurrentItem( UnderlineAlways );
+ else
+ m_pUnderlineCombo->setCurrentItem( UnderlineNever );
+ }
+ if (strAnimations == "disabled")
+ m_pAnimationsCombo->setCurrentItem( AnimationsNever );
+ else if (strAnimations == "looponce")
+ m_pAnimationsCombo->setCurrentItem( AnimationsLoopOnce );
+ else
+ m_pAnimationsCombo->setCurrentItem( AnimationsAlways );
+
+ m_pFormCompletionCheckBox->setChecked( m_pConfig->readBoolEntry( "FormCompletion", true ) );
+ m_pMaxFormCompletionItems->setValue( m_pConfig->readNumEntry( "MaxFormCompletionItems", 10 ) );
+ m_pMaxFormCompletionItems->setEnabled( m_pFormCompletionCheckBox->isChecked() );
+
+ m_pConfig->setGroup("FMSettings");
+ m_pShowMMBInTabs->setChecked( m_pConfig->readBoolEntry( "MMBOpensTab", false ) );
+ m_pDynamicTabbarHide->setChecked( ! (m_pConfig->readBoolEntry( "AlwaysTabbedMode", false )) );
+
+ KConfig config("kbookmarkrc", true, false);
+ config.setReadDefaults( useDefaults );
+ config.setGroup("Bookmarks");
+ m_pAdvancedAddBookmarkCheckBox->setChecked( config.readBoolEntry("AdvancedAddBookmarkDialog", false) );
+ m_pOnlyMarkedBookmarksCheckBox->setChecked( config.readBoolEntry("FilteredToolbar", false) );
+
+ emit changed( useDefaults );
+
+#undef READ_ENTRY
+#undef READ_BOOL
+#undef SET_GROUP
+}
+
+void KMiscHTMLOptions::defaults()
+{
+ load( true );
+}
+
+void KMiscHTMLOptions::save()
+{
+ m_pConfig->setGroup( "MainView Settings" );
+ m_pConfig->writeEntry( "OpenMiddleClick", m_pOpenMiddleClick->isChecked() );
+ m_pConfig->writeEntry( "BackRightClick", m_pBackRightClick->isChecked() );
+ m_pConfig->setGroup( "HTML Settings" );
+ m_pConfig->writeEntry( "ChangeCursor", m_cbCursor->isChecked() );
+ m_pConfig->writeEntry( "AutoLoadImages", m_pAutoLoadImagesCheckBox->isChecked() );
+ m_pConfig->writeEntry( "UnfinishedImageFrame", m_pUnfinishedImageFrameCheckBox->isChecked() );
+ m_pConfig->writeEntry( "AutoDelayedActions", m_pAutoRedirectCheckBox->isChecked() );
+ switch(m_pUnderlineCombo->currentItem())
+ {
+ case UnderlineAlways:
+ m_pConfig->writeEntry( "UnderlineLinks", true );
+ m_pConfig->writeEntry( "HoverLinks", false );
+ break;
+ case UnderlineNever:
+ m_pConfig->writeEntry( "UnderlineLinks", false );
+ m_pConfig->writeEntry( "HoverLinks", false );
+ break;
+ case UnderlineHover:
+ m_pConfig->writeEntry( "UnderlineLinks", false );
+ m_pConfig->writeEntry( "HoverLinks", true );
+ break;
+ }
+ switch(m_pAnimationsCombo->currentItem())
+ {
+ case AnimationsAlways:
+ m_pConfig->writeEntry( "ShowAnimations", "Enabled" );
+ break;
+ case AnimationsNever:
+ m_pConfig->writeEntry( "ShowAnimations", "Disabled" );
+ break;
+ case AnimationsLoopOnce:
+ m_pConfig->writeEntry( "ShowAnimations", "LoopOnce" );
+ break;
+ }
+
+ m_pConfig->writeEntry( "FormCompletion", m_pFormCompletionCheckBox->isChecked() );
+ m_pConfig->writeEntry( "MaxFormCompletionItems", m_pMaxFormCompletionItems->value() );
+
+ m_pConfig->setGroup("FMSettings");
+ m_pConfig->writeEntry( "MMBOpensTab", m_pShowMMBInTabs->isChecked() );
+ m_pConfig->writeEntry( "AlwaysTabbedMode", !(m_pDynamicTabbarHide->isChecked()) );
+ m_pConfig->sync();
+
+ KConfig config("kbookmarkrc", false, false);
+ config.setGroup("Bookmarks");
+ config.writeEntry("AdvancedAddBookmarkDialog", m_pAdvancedAddBookmarkCheckBox->isChecked());
+ config.writeEntry("FilteredToolbar", m_pOnlyMarkedBookmarksCheckBox->isChecked());
+ config.sync();
+
+ QByteArray data;
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ kapp->dcopClient()->send( "konqueror*", "KonquerorIface", "reparseConfiguration()", data );
+
+ emit changed(false);
+}
+
+
+void KMiscHTMLOptions::slotChanged()
+{
+ m_pMaxFormCompletionItems->setEnabled( m_pFormCompletionCheckBox->isChecked() );
+ emit changed(true);
+}
+
+
+void KMiscHTMLOptions::launchAdvancedTabDialog()
+{
+ advancedTabDialog* dialog = new advancedTabDialog(this, m_pConfig, "advancedTabDialog");
+ dialog->exec();
+}
+
+
diff --git a/kcontrol/konqhtml/htmlopts.h b/kcontrol/konqhtml/htmlopts.h
new file mode 100644
index 000000000..15f5a2511
--- /dev/null
+++ b/kcontrol/konqhtml/htmlopts.h
@@ -0,0 +1,68 @@
+//
+//
+// "Misc Options" Tab for KFM configuration
+//
+// (c) Sven Radej 1998
+// (c) David Faure 1998
+
+#ifndef __KMISCHTML_OPTIONS_H
+#define __KMISCHTML_OPTIONS_H
+
+#include <qstrlist.h>
+#include <qcheckbox.h>
+#include <qlineedit.h>
+#include <qcombobox.h>
+
+
+//-----------------------------------------------------------------------------
+// The "Misc Options" Tab for the HTML view contains :
+
+// Change cursor over links
+// Underline links
+// AutoLoad Images
+// ... there is room for others :))
+
+
+#include <qstring.h>
+#include <kconfig.h>
+#include <kcmodule.h>
+class QRadioButton;
+class KIntNumInput;
+
+class KMiscHTMLOptions : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KMiscHTMLOptions(KConfig *config, QString group, QWidget *parent = 0L, const char *name = 0L );
+ ~KMiscHTMLOptions();
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+
+private slots:
+ void slotChanged();
+ void launchAdvancedTabDialog();
+
+private:
+ KConfig* m_pConfig;
+ QString m_groupname;
+
+ QComboBox* m_pUnderlineCombo;
+ QComboBox* m_pAnimationsCombo;
+ QCheckBox* m_cbCursor;
+ QCheckBox* m_pAutoLoadImagesCheckBox;
+ QCheckBox* m_pUnfinishedImageFrameCheckBox;
+ QCheckBox* m_pAutoRedirectCheckBox;
+ QCheckBox* m_pOpenMiddleClick;
+ QCheckBox* m_pBackRightClick;
+ QCheckBox* m_pShowMMBInTabs;
+ QCheckBox* m_pFormCompletionCheckBox;
+ QCheckBox* m_pDynamicTabbarHide;
+ QCheckBox* m_pAdvancedAddBookmarkCheckBox;
+ QCheckBox* m_pOnlyMarkedBookmarksCheckBox;
+ KIntNumInput* m_pMaxFormCompletionItems;
+};
+
+#endif
diff --git a/kcontrol/konqhtml/javaopts.cpp b/kcontrol/konqhtml/javaopts.cpp
new file mode 100644
index 000000000..539e9bb37
--- /dev/null
+++ b/kcontrol/konqhtml/javaopts.cpp
@@ -0,0 +1,337 @@
+// (c) Martin R. Jones 1996
+// (c) Bernd Wuebben 1998
+// KControl port & modifications
+// (c) Torben Weis 1998
+// End of the KControl port, added 'kfmclient configure' call.
+// (c) David Faure 1998
+// New configuration scheme for Java/JavaScript
+// (c) Kalle Dalheimer 2000
+// Redesign and cleanup
+// (c) Daniel Molkentin 2000
+// Big changes to accommodate per-domain settings
+// (c) Leo Savernik 2002-2003
+
+#include <config.h>
+#include <klistview.h>
+#include <kurlrequester.h>
+#include <kdebug.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <khtml_settings.h>
+#include <knuminput.h>
+
+#include <qlayout.h>
+#include <qwhatsthis.h>
+#include <qvgroupbox.h>
+#include <qlabel.h>
+
+#include "htmlopts.h"
+#include "policydlg.h"
+#include "javaopts.h"
+
+// == class JavaPolicies =====
+
+JavaPolicies::JavaPolicies(KConfig* config, const QString &group, bool global,
+ const QString &domain) :
+ Policies(config,group,global,domain,"java.","EnableJava") {
+}
+
+JavaPolicies::JavaPolicies() : Policies(0,QString::null,false,
+ QString::null,QString::null,QString::null) {
+}
+
+JavaPolicies::~JavaPolicies() {
+}
+
+// == class KJavaOptions =====
+
+KJavaOptions::KJavaOptions( KConfig* config, QString group,
+ QWidget *parent, const char *name )
+ : KCModule( parent, name ),
+ _removeJavaScriptDomainAdvice(false),
+ m_pConfig( config ),
+ m_groupname( group ),
+ java_global_policies(config,group,true),
+ _removeJavaDomainSettings(false)
+{
+ QVBoxLayout* toplevel = new QVBoxLayout( this, 10, 5 );
+
+ /***************************************************************************
+ ********************* Global Settings *************************************
+ **************************************************************************/
+ QVGroupBox* globalGB = new QVGroupBox( i18n( "Global Settings" ), this );
+ toplevel->addWidget( globalGB );
+ enableJavaGloballyCB = new QCheckBox( i18n( "Enable Ja&va globally" ), globalGB );
+ connect( enableJavaGloballyCB, SIGNAL( clicked() ), this, SLOT( slotChanged() ) );
+ connect( enableJavaGloballyCB, SIGNAL( clicked() ), this, SLOT( toggleJavaControls() ) );
+
+
+ /***************************************************************************
+ ***************** Domain Specific Settings ********************************
+ **************************************************************************/
+ domainSpecific = new JavaDomainListView(m_pConfig,m_groupname,this,this);
+ connect(domainSpecific,SIGNAL(changed(bool)),SLOT(slotChanged()));
+ toplevel->addWidget( domainSpecific, 2 );
+
+ /***************************************************************************
+ ***************** Java Runtime Settings ***********************************
+ **************************************************************************/
+ QVGroupBox* javartGB = new QVGroupBox( i18n( "Java Runtime Settings" ), this );
+ toplevel->addWidget( javartGB );
+
+ QWidget* checkboxes = new QWidget( javartGB );
+ QGridLayout* grid = new QGridLayout( checkboxes, 2, 2 );
+
+ javaSecurityManagerCB = new QCheckBox( i18n("&Use security manager" ), checkboxes );
+ grid->addWidget( javaSecurityManagerCB, 0, 0 );
+ connect( javaSecurityManagerCB, SIGNAL(toggled( bool )), this, SLOT(slotChanged()) );
+
+ useKioCB = new QCheckBox( i18n("Use &KIO"), checkboxes );
+ grid->addWidget( useKioCB, 0, 1 );
+ connect( useKioCB, SIGNAL(toggled( bool )), this, SLOT(slotChanged()) );
+
+ enableShutdownCB = new QCheckBox( i18n("Shu&tdown applet server when inactive"), checkboxes );
+ grid->addWidget( enableShutdownCB, 1, 0 );
+ connect( enableShutdownCB, SIGNAL(toggled( bool )), this, SLOT(slotChanged()) );
+ connect( enableShutdownCB, SIGNAL(clicked()), this, SLOT(toggleJavaControls()) );
+
+ QHBox* secondsHB = new QHBox( javartGB );
+ serverTimeoutSB = new KIntNumInput( secondsHB );
+ serverTimeoutSB->setRange( 0, 1000, 5 );
+ serverTimeoutSB->setLabel( i18n("App&let server timeout:"), AlignLeft );
+ serverTimeoutSB->setSuffix(i18n(" sec"));
+ connect(serverTimeoutSB, SIGNAL(valueChanged(int)),this,SLOT(slotChanged()));
+
+ QHBox* pathHB = new QHBox( javartGB );
+ pathHB->setSpacing( 10 );
+ QLabel* pathLA = new QLabel( i18n( "&Path to Java executable, or 'java':" ),
+ pathHB );
+ pathED = new KURLRequester( pathHB );
+ connect( pathED, SIGNAL(textChanged( const QString& )), this, SLOT(slotChanged()) );
+ pathLA->setBuddy( pathED );
+
+ QHBox* addArgHB = new QHBox( javartGB );
+ addArgHB->setSpacing( 10 );
+ QLabel* addArgLA = new QLabel( i18n( "Additional Java a&rguments:" ), addArgHB );
+ addArgED = new QLineEdit( addArgHB );
+ connect( addArgED, SIGNAL(textChanged( const QString& )), this, SLOT(slotChanged()) );
+ addArgLA->setBuddy( addArgED );
+
+ /***************************************************************************
+ ********************** WhatsThis? items ***********************************
+ **************************************************************************/
+ QWhatsThis::add( enableJavaGloballyCB, i18n("Enables the execution of scripts written in Java "
+ "that can be contained in HTML pages. "
+ "Note that, as with any browser, enabling active contents can be a security problem.") );
+ QString wtstr = i18n("This box contains the domains and hosts you have set "
+ "a specific Java policy for. This policy will be used "
+ "instead of the default policy for enabling or disabling Java applets on pages sent by these "
+ "domains or hosts. <p>Select a policy and use the controls on "
+ "the right to modify it.");
+ QWhatsThis::add( domainSpecific->listView(), wtstr );
+#if 0
+ QWhatsThis::add( domainSpecific->importButton(), i18n("Click this button to choose the file that contains "
+ "the Java policies. These policies will be merged "
+ "with the existing ones. Duplicate entries are ignored.") );
+ QWhatsThis::add( domainSpecific->exportButton(), i18n("Click this button to save the Java policy to a zipped "
+ "file. The file, named <b>java_policy.tgz</b>, will be "
+ "saved to a location of your choice." ) );
+#endif
+ QWhatsThis::add( domainSpecific, i18n("Here you can set specific Java policies for any particular "
+ "host or domain. To add a new policy, simply click the <i>New...</i> "
+ "button and supply the necessary information requested by the "
+ "dialog box. To change an existing policy, click on the <i>Change...</i> "
+ "button and choose the new policy from the policy dialog box. Clicking "
+ "on the <i>Delete</i> button will remove the selected policy, causing the default "
+ "policy setting to be used for that domain.") );
+#if 0
+ "The <i>Import</i> and <i>Export</i> "
+ "button allows you to easily share your policies with other people by allowing "
+ "you to save and retrieve them from a zipped file.") );
+#endif
+
+ QWhatsThis::add( javaSecurityManagerCB, i18n( "Enabling the security manager will cause the jvm to run with a Security "
+ "Manager in place. This will keep applets from being able to read and "
+ "write to your file system, creating arbitrary sockets, and other actions "
+ "which could be used to compromise your system. Disable this option at your "
+ "own risk. You can modify your $HOME/.java.policy file with the Java "
+ "policytool utility to give code downloaded from certain sites more "
+ "permissions." ) );
+
+ QWhatsThis::add( useKioCB, i18n( "Enabling this will cause the jvm to use KIO for network transport ") );
+
+ QWhatsThis::add( pathED, i18n("Enter the path to the java executable. If you want to use the jre in "
+ "your path, simply leave it as 'java'. If you need to use a different jre, "
+ "enter the path to the java executable (e.g. /usr/lib/jdk/bin/java), "
+ "or the path to the directory that contains 'bin/java' (e.g. /opt/IBMJava2-13).") );
+
+ QWhatsThis::add( addArgED, i18n("If you want special arguments to be passed to the virtual machine, enter them here.") );
+
+ QString shutdown = i18n("When all the applets have been destroyed, the applet server should shut down. "
+ "However, starting the jvm takes a lot of time. If you would like to "
+ "keep the java process running while you are "
+ "browsing, you can set the timeout value to whatever you like. To keep "
+ "the java process running for the whole time that the konqueror process is, "
+ "leave the Shutdown Applet Server checkbox unchecked.");
+ QWhatsThis::add( serverTimeoutSB, shutdown);
+ QWhatsThis::add( enableShutdownCB, shutdown);
+ // Finally do the loading
+ load();
+}
+
+void KJavaOptions::load()
+{
+ load( false );
+}
+
+void KJavaOptions::load(bool useDefaults)
+{
+ m_pConfig->setReadDefaults( useDefaults );
+
+ // *** load ***
+ java_global_policies.load();
+ bool bJavaGlobal = java_global_policies.isFeatureEnabled();
+ bool bSecurityManager = m_pConfig->readBoolEntry( "UseSecurityManager", true );
+ bool bUseKio = m_pConfig->readBoolEntry( "UseKio", false );
+ bool bServerShutdown = m_pConfig->readBoolEntry( "ShutdownAppletServer", true );
+ int serverTimeout = m_pConfig->readNumEntry( "AppletServerTimeout", 60 );
+#if defined(PATH_JAVA)
+ QString sJavaPath = m_pConfig->readPathEntry( "JavaPath", PATH_JAVA );
+#else
+ QString sJavaPath = m_pConfig->readPathEntry( "JavaPath", "java" );
+#endif
+
+ if( sJavaPath == "/usr/lib/jdk" )
+ sJavaPath = "java";
+
+ if( m_pConfig->hasKey( "JavaDomains" ) )
+ domainSpecific->initialize(m_pConfig->readListEntry("JavaDomains"));
+ else if( m_pConfig->hasKey( "JavaDomainSettings" ) ) {
+ domainSpecific->updateDomainListLegacy( m_pConfig->readListEntry("JavaDomainSettings") );
+ _removeJavaDomainSettings = true;
+ } else {
+ domainSpecific->updateDomainListLegacy( m_pConfig->readListEntry("JavaScriptDomainAdvice") );
+ _removeJavaScriptDomainAdvice = true;
+ }
+
+ // *** apply to GUI ***
+ enableJavaGloballyCB->setChecked( bJavaGlobal );
+ javaSecurityManagerCB->setChecked( bSecurityManager );
+ useKioCB->setChecked( bUseKio );
+
+ addArgED->setText( m_pConfig->readEntry( "JavaArgs" ) );
+ pathED->lineEdit()->setText( sJavaPath );
+
+ enableShutdownCB->setChecked( bServerShutdown );
+ serverTimeoutSB->setValue( serverTimeout );
+
+ toggleJavaControls();
+ emit changed( useDefaults );
+}
+
+void KJavaOptions::defaults()
+{
+ load( true );
+}
+
+void KJavaOptions::save()
+{
+ java_global_policies.save();
+ m_pConfig->writeEntry( "JavaArgs", addArgED->text() );
+ m_pConfig->writePathEntry( "JavaPath", pathED->lineEdit()->text() );
+ m_pConfig->writeEntry( "UseSecurityManager", javaSecurityManagerCB->isChecked() );
+ m_pConfig->writeEntry( "UseKio", useKioCB->isChecked() );
+ m_pConfig->writeEntry( "ShutdownAppletServer", enableShutdownCB->isChecked() );
+ m_pConfig->writeEntry( "AppletServerTimeout", serverTimeoutSB->value() );
+
+ domainSpecific->save(m_groupname,"JavaDomains");
+
+ if (_removeJavaDomainSettings) {
+ m_pConfig->deleteEntry("JavaDomainSettings");
+ _removeJavaDomainSettings = false;
+ }
+
+ // sync moved to KJSParts::save
+// m_pConfig->sync();
+ emit changed( false );
+}
+
+void KJavaOptions::slotChanged()
+{
+ emit changed(true);
+}
+
+
+void KJavaOptions::toggleJavaControls()
+{
+ bool isEnabled = true; //enableJavaGloballyCB->isChecked();
+
+ java_global_policies.setFeatureEnabled( enableJavaGloballyCB->isChecked() );
+ javaSecurityManagerCB->setEnabled( isEnabled );
+ useKioCB->setEnabled( isEnabled );
+ addArgED->setEnabled( isEnabled );
+ pathED->setEnabled( isEnabled );
+ enableShutdownCB->setEnabled( isEnabled );
+
+ serverTimeoutSB->setEnabled( enableShutdownCB->isChecked() && isEnabled );
+}
+
+// == class JavaDomainListView =====
+
+JavaDomainListView::JavaDomainListView(KConfig *config,const QString &group,
+ KJavaOptions *options,QWidget *parent,const char *name)
+ : DomainListView(config,i18n( "Doma&in-Specific" ), parent, name),
+ group(group), options(options) {
+}
+
+JavaDomainListView::~JavaDomainListView() {
+}
+
+void JavaDomainListView::updateDomainListLegacy(const QStringList &domainConfig)
+{
+ domainSpecificLV->clear();
+ JavaPolicies pol(config,group,false);
+ pol.defaults();
+ for ( QStringList::ConstIterator it = domainConfig.begin();
+ it != domainConfig.end(); ++it)
+ {
+ QString domain;
+ KHTMLSettings::KJavaScriptAdvice javaAdvice;
+ KHTMLSettings::KJavaScriptAdvice javaScriptAdvice;
+ KHTMLSettings::splitDomainAdvice(*it, domain, javaAdvice, javaScriptAdvice);
+ if (javaAdvice != KHTMLSettings::KJavaScriptDunno) {
+ QListViewItem* index = new QListViewItem( domainSpecificLV, domain,
+ i18n(KHTMLSettings::adviceToStr(javaAdvice)) );
+ pol.setDomain(domain);
+ pol.setFeatureEnabled(javaAdvice != KHTMLSettings::KJavaScriptReject);
+ domainPolicies[index] = new JavaPolicies(pol);
+ }
+ }
+}
+
+void JavaDomainListView::setupPolicyDlg(PushButton trigger,PolicyDialog &pDlg,
+ Policies *pol) {
+ QString caption;
+ switch (trigger) {
+ case AddButton: caption = i18n( "New Java Policy" );
+ pol->setFeatureEnabled(!options->enableJavaGloballyCB->isChecked());
+ break;
+ case ChangeButton: caption = i18n( "Change Java Policy" ); break;
+ default: ; // inhibit gcc warning
+ }/*end switch*/
+ pDlg.setCaption(caption);
+ pDlg.setFeatureEnabledLabel(i18n("&Java policy:"));
+ pDlg.setFeatureEnabledWhatsThis(i18n("Select a Java policy for "
+ "the above host or domain."));
+ pDlg.refresh();
+}
+
+JavaPolicies *JavaDomainListView::createPolicies() {
+ return new JavaPolicies(config,group,false);
+}
+
+JavaPolicies *JavaDomainListView::copyPolicies(Policies *pol) {
+ return new JavaPolicies(*static_cast<JavaPolicies *>(pol));
+}
+
+#include "javaopts.moc"
diff --git a/kcontrol/konqhtml/javaopts.h b/kcontrol/konqhtml/javaopts.h
new file mode 100644
index 000000000..638b3a921
--- /dev/null
+++ b/kcontrol/konqhtml/javaopts.h
@@ -0,0 +1,126 @@
+//-----------------------------------------------------------------------------
+//
+// HTML Options
+//
+// (c) Martin R. Jones 1996
+//
+// Port to KControl
+// (c) Torben Weis 1998
+//
+// Redesign and cleanup
+// (c) Daniel Molkentin 2000
+//
+//-----------------------------------------------------------------------------
+
+#ifndef __JAVAOPTS_H__
+#define __JAVAOPTS_H__
+
+#include <kcmodule.h>
+
+#include "domainlistview.h"
+#include "policies.h"
+
+class KColorButton;
+class KConfig;
+class KListView;
+class KURLRequester;
+class KIntNumInput;
+
+class QCheckBox;
+class QComboBox;
+class QLineEdit;
+class QListViewItem;
+class QRadioButton;
+
+class KJavaOptions;
+
+/** policies with java-specific constructor
+ */
+class JavaPolicies : public Policies {
+public:
+ /**
+ * constructor
+ * @param config configuration to initialize this instance from
+ * @param group config group to use if this instance contains the global
+ * policies (global == true)
+ * @param global true if this instance contains the global policy settings,
+ * false if this instance contains policies specific for a domain.
+ * @param domain name of the domain this instance is used to configure the
+ * policies for (case insensitive, ignored if global == true)
+ */
+ JavaPolicies(KConfig* config, const QString &group, bool global,
+ const QString &domain = QString::null);
+
+ /** empty constructur to make QMap happy
+ * don't use for constructing a policies instance.
+ * @internal
+ */
+ JavaPolicies();
+
+ virtual ~JavaPolicies();
+};
+
+/** Java-specific enhancements to the domain list view
+ */
+class JavaDomainListView : public DomainListView {
+ Q_OBJECT
+public:
+ JavaDomainListView(KConfig *config,const QString &group,KJavaOptions *opt,
+ QWidget *parent,const char *name = 0);
+ virtual ~JavaDomainListView();
+
+ /** remnant for importing pre KDE 3.2 settings
+ */
+ void updateDomainListLegacy(const QStringList &domainConfig);
+
+protected:
+ virtual JavaPolicies *createPolicies();
+ virtual JavaPolicies *copyPolicies(Policies *pol);
+ virtual void setupPolicyDlg(PushButton trigger,PolicyDialog &pDlg,
+ Policies *copy);
+
+private:
+ QString group;
+ KJavaOptions *options;
+};
+
+class KJavaOptions : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KJavaOptions( KConfig* config, QString group, QWidget* parent = 0, const char* name = 0 );
+
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+
+ bool _removeJavaScriptDomainAdvice;
+
+private slots:
+ void slotChanged();
+ void toggleJavaControls();
+
+private:
+
+ KConfig* m_pConfig;
+ QString m_groupname;
+ JavaPolicies java_global_policies;
+
+ QCheckBox* enableJavaGloballyCB;
+ QCheckBox* javaSecurityManagerCB;
+ QCheckBox* useKioCB;
+ QCheckBox* enableShutdownCB;
+ KIntNumInput* serverTimeoutSB;
+ QLineEdit* addArgED;
+ KURLRequester* pathED;
+ bool _removeJavaDomainSettings;
+
+ JavaDomainListView *domainSpecific;
+
+ friend class JavaDomainListView;
+};
+
+#endif // __HTML_OPTIONS_H__
+
diff --git a/kcontrol/konqhtml/jsopts.cpp b/kcontrol/konqhtml/jsopts.cpp
new file mode 100644
index 000000000..b6522f767
--- /dev/null
+++ b/kcontrol/konqhtml/jsopts.cpp
@@ -0,0 +1,231 @@
+// (c) Martin R. Jones 1996
+// (c) Bernd Wuebben 1998
+// KControl port & modifications
+// (c) Torben Weis 1998
+// End of the KControl port, added 'kfmclient configure' call.
+// (c) David Faure 1998
+// New configuration scheme for JavaScript
+// (C) Kalle Dalheimer 2000
+// Major cleanup & Java/JS settings splitted
+// (c) Daniel Molkentin 2000
+// Big changes to accommodate per-domain settings
+// (c) Leo Savernik 2002-2003
+
+#include <qlayout.h>
+#include <qwhatsthis.h>
+#include <qvgroupbox.h>
+#include <kconfig.h>
+#include <klistview.h>
+#include <kdebug.h>
+#include <kurlrequester.h>
+
+#if defined Q_WS_X11 && !defined K_WS_QTONLY
+#include <X11/Xlib.h>
+#endif
+
+#include "htmlopts.h"
+#include "policydlg.h"
+
+#include <klocale.h>
+
+#include "jsopts.h"
+
+#include "jsopts.moc"
+
+// == class KJavaScriptOptions =====
+
+KJavaScriptOptions::KJavaScriptOptions( KConfig* config, QString group, QWidget *parent,
+ const char *name ) :
+ KCModule( parent, name ),
+ _removeJavaScriptDomainAdvice(false),
+ m_pConfig( config ), m_groupname( group ),
+ js_global_policies(config,group,true,QString::null),
+ _removeECMADomainSettings(false)
+{
+ QVBoxLayout* toplevel = new QVBoxLayout( this, 10, 5 );
+
+ // the global checkbox
+ QGroupBox* globalGB = new QGroupBox( 2, Vertical, i18n( "Global Settings" ), this );
+ toplevel->addWidget( globalGB );
+
+ enableJavaScriptGloballyCB = new QCheckBox( i18n( "Ena&ble JavaScript globally" ), globalGB );
+ QWhatsThis::add( enableJavaScriptGloballyCB, i18n("Enables the execution of scripts written in ECMA-Script "
+ "(also known as JavaScript) that can be contained in HTML pages. "
+ "Note that, as with any browser, enabling scripting languages can be a security problem.") );
+ connect( enableJavaScriptGloballyCB, SIGNAL( clicked() ), SLOT( changed() ) );
+ connect( enableJavaScriptGloballyCB, SIGNAL( clicked() ), this, SLOT( slotChangeJSEnabled() ) );
+
+ reportErrorsCB = new QCheckBox( i18n( "Report &errors" ), globalGB );
+ QWhatsThis::add( reportErrorsCB, i18n("Enables the reporting of errors that occur when JavaScript "
+ "code is executed.") );
+ connect( reportErrorsCB, SIGNAL( clicked() ), SLOT( changed() ) );
+
+ jsDebugWindow = new QCheckBox( i18n( "Enable debu&gger" ), globalGB );
+ QWhatsThis::add( jsDebugWindow, i18n( "Enables builtin JavaScript debugger." ) );
+ connect( jsDebugWindow, SIGNAL( clicked() ), SLOT( changed() ) );
+
+ // the domain-specific listview
+ domainSpecific = new JSDomainListView(m_pConfig,m_groupname,this,this);
+ connect(domainSpecific,SIGNAL(changed(bool)),SLOT(changed()));
+ toplevel->addWidget( domainSpecific, 2 );
+
+ QWhatsThis::add( domainSpecific, i18n("Here you can set specific JavaScript policies for any particular "
+ "host or domain. To add a new policy, simply click the <i>New...</i> "
+ "button and supply the necessary information requested by the "
+ "dialog box. To change an existing policy, click on the <i>Change...</i> "
+ "button and choose the new policy from the policy dialog box. Clicking "
+ "on the <i>Delete</i> button will remove the selected policy causing the default "
+ "policy setting to be used for that domain. The <i>Import</i> and <i>Export</i> "
+ "button allows you to easily share your policies with other people by allowing "
+ "you to save and retrieve them from a zipped file.") );
+
+ QString wtstr = i18n("This box contains the domains and hosts you have set "
+ "a specific JavaScript policy for. This policy will be used "
+ "instead of the default policy for enabling or disabling JavaScript on pages sent by these "
+ "domains or hosts. <p>Select a policy and use the controls on "
+ "the right to modify it.");
+ QWhatsThis::add( domainSpecific->listView(), wtstr );
+
+ QWhatsThis::add( domainSpecific->importButton(), i18n("Click this button to choose the file that contains "
+ "the JavaScript policies. These policies will be merged "
+ "with the existing ones. Duplicate entries are ignored.") );
+ QWhatsThis::add( domainSpecific->exportButton(), i18n("Click this button to save the JavaScript policy to a zipped "
+ "file. The file, named <b>javascript_policy.tgz</b>, will be "
+ "saved to a location of your choice." ) );
+
+ // the frame containing the JavaScript policies settings
+ js_policies_frame = new JSPoliciesFrame(&js_global_policies,
+ i18n("Global JavaScript Policies"),this);
+ toplevel->addWidget(js_policies_frame);
+ connect(js_policies_frame, SIGNAL(changed()), SLOT(changed()));
+
+ // Finally do the loading
+ load();
+}
+
+void KJavaScriptOptions::load()
+{
+ load( false );
+}
+
+void KJavaScriptOptions::load( bool useDefaults )
+{
+ m_pConfig->setReadDefaults( useDefaults );
+
+ // *** load ***
+ m_pConfig->setGroup(m_groupname);
+
+ if( m_pConfig->hasKey( "ECMADomains" ) )
+ domainSpecific->initialize(m_pConfig->readListEntry("ECMADomains"));
+ else if( m_pConfig->hasKey( "ECMADomainSettings" ) ) {
+ domainSpecific->updateDomainListLegacy( m_pConfig->readListEntry( "ECMADomainSettings" ) );
+ _removeECMADomainSettings = true;
+ } else {
+ domainSpecific->updateDomainListLegacy(m_pConfig->readListEntry("JavaScriptDomainAdvice") );
+ _removeJavaScriptDomainAdvice = true;
+ }
+
+ // *** apply to GUI ***
+ js_policies_frame->load();
+ enableJavaScriptGloballyCB->setChecked(
+ js_global_policies.isFeatureEnabled());
+ reportErrorsCB->setChecked( m_pConfig->readBoolEntry("ReportJavaScriptErrors",false));
+ jsDebugWindow->setChecked( m_pConfig->readBoolEntry( "EnableJavaScriptDebug",false ) );
+
+ emit changed(useDefaults);
+}
+
+void KJavaScriptOptions::defaults()
+{
+ load( true );
+}
+
+void KJavaScriptOptions::save()
+{
+ m_pConfig->setGroup(m_groupname);
+ m_pConfig->writeEntry( "ReportJavaScriptErrors", reportErrorsCB->isChecked() );
+ m_pConfig->writeEntry( "EnableJavaScriptDebug", jsDebugWindow->isChecked() );
+
+ domainSpecific->save(m_groupname,"ECMADomains");
+ js_policies_frame->save();
+
+ if (_removeECMADomainSettings) {
+ m_pConfig->deleteEntry("ECMADomainSettings");
+ _removeECMADomainSettings = false;
+ }
+
+ // sync moved to KJSParts::save
+// m_pConfig->sync();
+ emit changed(false);
+}
+
+void KJavaScriptOptions::slotChangeJSEnabled() {
+ js_global_policies.setFeatureEnabled(enableJavaScriptGloballyCB->isChecked());
+}
+
+// == class JSDomainListView =====
+
+JSDomainListView::JSDomainListView(KConfig *config,const QString &group,
+ KJavaScriptOptions *options, QWidget *parent,const char *name)
+ : DomainListView(config,i18n( "Do&main-Specific" ), parent, name),
+ group(group), options(options) {
+}
+
+JSDomainListView::~JSDomainListView() {
+}
+
+void JSDomainListView::updateDomainListLegacy(const QStringList &domainConfig)
+{
+ domainSpecificLV->clear();
+ JSPolicies pol(config,group,false);
+ pol.defaults();
+ for (QStringList::ConstIterator it = domainConfig.begin();
+ it != domainConfig.end(); ++it) {
+ QString domain;
+ KHTMLSettings::KJavaScriptAdvice javaAdvice;
+ KHTMLSettings::KJavaScriptAdvice javaScriptAdvice;
+ KHTMLSettings::splitDomainAdvice(*it, domain, javaAdvice, javaScriptAdvice);
+ if (javaScriptAdvice != KHTMLSettings::KJavaScriptDunno) {
+ QListViewItem *index =
+ new QListViewItem( domainSpecificLV, domain,
+ i18n(KHTMLSettings::adviceToStr(javaScriptAdvice)) );
+
+ pol.setDomain(domain);
+ pol.setFeatureEnabled(javaScriptAdvice != KHTMLSettings::KJavaScriptReject);
+ domainPolicies[index] = new JSPolicies(pol);
+ }
+ }
+}
+
+void JSDomainListView::setupPolicyDlg(PushButton trigger,PolicyDialog &pDlg,
+ Policies *pol) {
+ JSPolicies *jspol = static_cast<JSPolicies *>(pol);
+ QString caption;
+ switch (trigger) {
+ case AddButton:
+ caption = i18n( "New JavaScript Policy" );
+ jspol->setFeatureEnabled(!options->enableJavaScriptGloballyCB->isChecked());
+ break;
+ case ChangeButton: caption = i18n( "Change JavaScript Policy" ); break;
+ default: ; // inhibit gcc warning
+ }/*end switch*/
+ pDlg.setCaption(caption);
+ pDlg.setFeatureEnabledLabel(i18n("JavaScript policy:"));
+ pDlg.setFeatureEnabledWhatsThis(i18n("Select a JavaScript policy for "
+ "the above host or domain."));
+ JSPoliciesFrame *panel = new JSPoliciesFrame(jspol,i18n("Domain-Specific "
+ "JavaScript Policies"),pDlg.mainWidget());
+ panel->refresh();
+ pDlg.addPolicyPanel(panel);
+ pDlg.refresh();
+}
+
+JSPolicies *JSDomainListView::createPolicies() {
+ return new JSPolicies(config,group,false);
+}
+
+JSPolicies *JSDomainListView::copyPolicies(Policies *pol) {
+ return new JSPolicies(*static_cast<JSPolicies *>(pol));
+}
+
+
diff --git a/kcontrol/konqhtml/jsopts.h b/kcontrol/konqhtml/jsopts.h
new file mode 100644
index 000000000..41f5c87fd
--- /dev/null
+++ b/kcontrol/konqhtml/jsopts.h
@@ -0,0 +1,90 @@
+//-----------------------------------------------------------------------------
+//
+// HTML Options
+//
+// (c) Martin R. Jones 1996
+//
+// Port to KControl
+// (c) Torben Weis 1998
+
+#ifndef __JSOPTS_H__
+#define __JSOPTS_H__
+
+#include <kcmodule.h>
+
+#include "domainlistview.h"
+#include "jspolicies.h"
+
+class KColorButton;
+class KConfig;
+class KURLRequester;
+class QCheckBox;
+class QComboBox;
+class QLineEdit;
+class QListViewItem;
+class QRadioButton;
+class QSpinBox;
+class QButtonGroup;
+
+class PolicyDialog;
+
+class KJavaScriptOptions;
+
+/** JavaScript-specific enhancements to the domain list view
+ */
+class JSDomainListView : public DomainListView {
+ Q_OBJECT
+public:
+ JSDomainListView(KConfig *config,const QString &group,KJavaScriptOptions *opt,
+ QWidget *parent,const char *name = 0);
+ virtual ~JSDomainListView();
+
+ /** remnant for importing pre KDE 3.2 settings
+ */
+ void updateDomainListLegacy(const QStringList &domainConfig);
+
+protected:
+ virtual JSPolicies *createPolicies();
+ virtual JSPolicies *copyPolicies(Policies *pol);
+ virtual void setupPolicyDlg(PushButton trigger,PolicyDialog &pDlg,
+ Policies *copy);
+
+private:
+ QString group;
+ KJavaScriptOptions *options;
+};
+
+class KJavaScriptOptions : public KCModule
+{
+ Q_OBJECT
+public:
+ KJavaScriptOptions( KConfig* config, QString group, QWidget* parent = 0, const char* name = 0 );
+
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+
+ bool _removeJavaScriptDomainAdvice;
+
+private slots:
+ void slotChangeJSEnabled();
+
+private:
+
+ KConfig *m_pConfig;
+ QString m_groupname;
+ JSPolicies js_global_policies;
+ QCheckBox *enableJavaScriptGloballyCB;
+ QCheckBox *reportErrorsCB;
+ QCheckBox *jsDebugWindow;
+ JSPoliciesFrame *js_policies_frame;
+ bool _removeECMADomainSettings;
+
+ JSDomainListView* domainSpecific;
+
+ friend class JSDomainListView;
+};
+
+#endif // __JSOPTS_H__
+
diff --git a/kcontrol/konqhtml/jspolicies.cpp b/kcontrol/konqhtml/jspolicies.cpp
new file mode 100644
index 000000000..d4afbbd1d
--- /dev/null
+++ b/kcontrol/konqhtml/jspolicies.cpp
@@ -0,0 +1,407 @@
+/*
+ Copyright (c) 2002 Leo Savernik <l.savernik@aon.at>
+ Derived from jsopt.cpp, code copied from there is copyrighted to its
+ respective owners.
+
+ 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 <qbuttongroup.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qwhatsthis.h>
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "jspolicies.h"
+
+// == class JSPolicies ==
+
+JSPolicies::JSPolicies(KConfig* config,const QString &group,
+ bool global,const QString &domain) :
+ Policies(config,group,global,domain,"javascript.","EnableJavaScript") {
+}
+
+JSPolicies::JSPolicies() : Policies(0,QString::null,false,
+ QString::null,QString::null,QString::null) {
+}
+
+JSPolicies::~JSPolicies() {
+}
+
+void JSPolicies::load() {
+ Policies::load();
+
+ QString key;
+
+// enableJavaScriptDebugCB->setChecked( m_pConfig->readBoolEntry("EnableJavaScriptDebug",false));
+// enableDebugOutputCB->setChecked( m_pConfig->readBoolEntry("EnableJSDebugOutput") );
+ key = prefix + "WindowOpenPolicy";
+ window_open = config->readUnsignedNumEntry(key,
+ is_global ? KHTMLSettings::KJSWindowOpenSmart : INHERIT_POLICY);
+
+ key = prefix + "WindowResizePolicy";
+ window_resize = config->readUnsignedNumEntry(key,
+ is_global ? KHTMLSettings::KJSWindowResizeAllow : INHERIT_POLICY);
+
+ key = prefix + "WindowMovePolicy";
+ window_move = config->readUnsignedNumEntry(key,
+ is_global ? KHTMLSettings::KJSWindowMoveAllow : INHERIT_POLICY);
+
+ key = prefix + "WindowFocusPolicy";
+ window_focus = config->readUnsignedNumEntry(key,
+ is_global ? KHTMLSettings::KJSWindowFocusAllow : INHERIT_POLICY);
+
+ key = prefix + "WindowStatusPolicy";
+ window_status = config->readUnsignedNumEntry(key,
+ is_global ? KHTMLSettings::KJSWindowStatusAllow : INHERIT_POLICY);
+}
+
+void JSPolicies::defaults() {
+ Policies::defaults();
+// enableJavaScriptGloballyCB->setChecked( true );
+// enableJavaScriptDebugCB->setChecked( false );
+// js_popup->setButton(0);
+ // enableDebugOutputCB->setChecked( false );
+ window_open = is_global ? KHTMLSettings::KJSWindowOpenSmart : INHERIT_POLICY;
+ window_resize = is_global ? KHTMLSettings::KJSWindowResizeAllow : INHERIT_POLICY;
+ window_move = is_global ? KHTMLSettings::KJSWindowMoveAllow : INHERIT_POLICY;
+ window_focus = is_global ? KHTMLSettings::KJSWindowFocusAllow : INHERIT_POLICY;
+ window_status = is_global ? KHTMLSettings::KJSWindowStatusAllow : INHERIT_POLICY;
+}
+
+void JSPolicies::save() {
+ Policies::save();
+
+ QString key;
+ key = prefix + "WindowOpenPolicy";
+ if (window_open != INHERIT_POLICY)
+ config->writeEntry(key, window_open);
+ else
+ config->deleteEntry(key);
+
+ key = prefix + "WindowResizePolicy";
+ if (window_resize != INHERIT_POLICY)
+ config->writeEntry(key, window_resize);
+ else
+ config->deleteEntry(key);
+
+ key = prefix + "WindowMovePolicy";
+ if (window_move != INHERIT_POLICY)
+ config->writeEntry(key, window_move);
+ else
+ config->deleteEntry(key);
+
+ key = prefix + "WindowFocusPolicy";
+ if (window_focus != INHERIT_POLICY)
+ config->writeEntry(key, window_focus);
+ else
+ config->deleteEntry(key);
+
+ key = prefix + "WindowStatusPolicy";
+ if (window_status != INHERIT_POLICY)
+ config->writeEntry(key, window_status);
+ else
+ config->deleteEntry(key);
+
+ // don't do a config->sync() here for sake of efficiency
+}
+
+// == class JSPoliciesFrame ==
+
+JSPoliciesFrame::JSPoliciesFrame(JSPolicies *policies, const QString &title,
+ QWidget* parent) :
+ QGroupBox(title, parent, "jspoliciesframe"),
+ policies(policies) {
+
+ bool is_per_domain = !policies->isGlobal();
+
+ setColumnLayout(0, Qt::Vertical);
+ layout()->setSpacing(0);
+ layout()->setMargin(0);
+ QGridLayout *this_layout = new QGridLayout(layout(),5,10+is_per_domain*2);
+ this_layout->setAlignment(Qt::AlignTop);
+ this_layout->setSpacing(3);
+ this_layout->setMargin(11);
+
+ QString wtstr; // what's this description
+ int colIdx; // column index
+
+ // === window.open ================================
+ colIdx = 0;
+ QLabel *label = new QLabel(i18n("Open new windows:"),this);
+ this_layout->addWidget(label,0,colIdx++);
+
+ js_popup = new QButtonGroup(this);
+ js_popup->setExclusive(true);
+ js_popup->setHidden(true);
+
+ QRadioButton* policy_btn;
+ if (is_per_domain) {
+ policy_btn = new QRadioButton(i18n("Use global"), this);
+ QWhatsThis::add(policy_btn,i18n("Use setting from global policy."));
+ js_popup->insert(policy_btn,INHERIT_POLICY);
+ this_layout->addWidget(policy_btn,0,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+ }/*end if*/
+
+ policy_btn = new QRadioButton(i18n("Allow"), this);
+ QWhatsThis::add(policy_btn,i18n("Accept all popup window requests."));
+ js_popup->insert(policy_btn,KHTMLSettings::KJSWindowOpenAllow);
+ this_layout->addWidget(policy_btn,0,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+
+ policy_btn = new QRadioButton(i18n("Ask"), this);
+ QWhatsThis::add(policy_btn,i18n("Prompt every time a popup window is requested."));
+ js_popup->insert(policy_btn,KHTMLSettings::KJSWindowOpenAsk);
+ this_layout->addWidget(policy_btn,0,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+
+ policy_btn = new QRadioButton(i18n("Deny"), this);
+ QWhatsThis::add(policy_btn,i18n("Reject all popup window requests."));
+ js_popup->insert(policy_btn,KHTMLSettings::KJSWindowOpenDeny);
+ this_layout->addWidget(policy_btn,0,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+
+ policy_btn = new QRadioButton(i18n("Smart"), this);
+ QWhatsThis::add(policy_btn, i18n("Accept popup window requests only when "
+ "links are activated through an explicit "
+ "mouse click or keyboard operation."));
+ js_popup->insert(policy_btn,KHTMLSettings::KJSWindowOpenSmart);
+ this_layout->addWidget(policy_btn,0,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+
+ wtstr = i18n("If you disable this, Konqueror will stop "
+ "interpreting the <i>window.open()</i> "
+ "JavaScript command. This is useful if you "
+ "regularly visit sites that make extensive use "
+ "of this command to pop up ad banners.<br>"
+ "<br><b>Note:</b> Disabling this option might "
+ "also break certain sites that require <i>"
+ "window.open()</i> for proper operation. Use "
+ "this feature carefully.");
+ QWhatsThis::add(label, wtstr);
+ connect(js_popup, SIGNAL(clicked(int)), SLOT(setWindowOpenPolicy(int)));
+
+ // === window.resizeBy/resizeTo ================================
+ colIdx = 0;
+ label = new QLabel(i18n("Resize window:"),this);
+ this_layout->addWidget(label,1,colIdx++);
+
+ js_resize = new QButtonGroup(this);
+ js_resize->setExclusive(true);
+ js_resize->setHidden(true);
+
+ if (is_per_domain) {
+ policy_btn = new QRadioButton(i18n("Use global"), this);
+ QWhatsThis::add(policy_btn,i18n("Use setting from global policy."));
+ js_resize->insert(policy_btn,INHERIT_POLICY);
+ this_layout->addWidget(policy_btn,1,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+ }/*end if*/
+
+ policy_btn = new QRadioButton(i18n("Allow"), this);
+ QWhatsThis::add(policy_btn,i18n("Allow scripts to change the window size."));
+ js_resize->insert(policy_btn,KHTMLSettings::KJSWindowResizeAllow);
+ this_layout->addWidget(policy_btn,1,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+
+ policy_btn = new QRadioButton(i18n("Ignore"), this);
+ QWhatsThis::add( policy_btn,i18n("Ignore attempts of scripts to change the window size. "
+ "The web page will <i>think</i> it changed the "
+ "size but the actual window is not affected."));
+ js_resize->insert(policy_btn,KHTMLSettings::KJSWindowResizeIgnore);
+ this_layout->addWidget(policy_btn,1,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+
+ wtstr = i18n("Some websites change the window size on their own by using "
+ "<i>window.resizeBy()</i> or <i>window.resizeTo()</i>. "
+ "This option specifies the treatment of such "
+ "attempts.");
+ QWhatsThis::add(label, wtstr);
+ connect(js_resize, SIGNAL(clicked(int)), SLOT(setWindowResizePolicy(int)));
+
+ // === window.moveBy/moveTo ================================
+ colIdx = 0;
+ label = new QLabel(i18n("Move window:"),this);
+ this_layout->addWidget(label,2,colIdx++);
+
+ js_move = new QButtonGroup(this);
+ js_move->setExclusive(true);
+ js_move->setHidden(true);
+
+ if (is_per_domain) {
+ policy_btn = new QRadioButton(i18n("Use global"), this);
+ QWhatsThis::add(policy_btn,i18n("Use setting from global policy."));
+ js_move->insert(policy_btn,INHERIT_POLICY);
+ this_layout->addWidget(policy_btn,2,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+ }/*end if*/
+
+ policy_btn = new QRadioButton(i18n("Allow"), this);
+ QWhatsThis::add(policy_btn,i18n("Allow scripts to change the window position."));
+ js_move->insert(policy_btn,KHTMLSettings::KJSWindowMoveAllow);
+ this_layout->addWidget(policy_btn,2,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+
+ policy_btn = new QRadioButton(i18n("Ignore"), this);
+ QWhatsThis::add(policy_btn,i18n("Ignore attempts of scripts to change the window position. "
+ "The web page will <i>think</i> it moved the "
+ "window but the actual position is not affected."));
+ js_move->insert(policy_btn,KHTMLSettings::KJSWindowMoveIgnore);
+ this_layout->addWidget(policy_btn,2,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+
+ wtstr = i18n("Some websites change the window position on their own by using "
+ "<i>window.moveBy()</i> or <i>window.moveTo()</i>. "
+ "This option specifies the treatment of such "
+ "attempts.");
+ QWhatsThis::add(label, wtstr);
+ connect(js_move, SIGNAL(clicked(int)), SLOT(setWindowMovePolicy(int)));
+
+ // === window.focus ================================
+ colIdx = 0;
+ label = new QLabel(i18n("Focus window:"),this);
+ this_layout->addWidget(label,3,colIdx++);
+
+ js_focus = new QButtonGroup(this);
+ js_focus->setExclusive(true);
+ js_focus->setHidden(true);
+
+ if (is_per_domain) {
+ policy_btn = new QRadioButton(i18n("Use global"), this);
+ QWhatsThis::add(policy_btn,i18n("Use setting from global policy."));
+ js_focus->insert(policy_btn,INHERIT_POLICY);
+ this_layout->addWidget(policy_btn,3,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+ }/*end if*/
+
+ policy_btn = new QRadioButton(i18n("Allow"), this);
+ QWhatsThis::add( policy_btn,i18n("Allow scripts to focus the window.") );
+ js_focus->insert(policy_btn,KHTMLSettings::KJSWindowFocusAllow);
+ this_layout->addWidget(policy_btn,3,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+
+ policy_btn = new QRadioButton(i18n("Ignore"), this);
+ QWhatsThis::add( policy_btn,i18n("Ignore attempts of scripts to focus the window. "
+ "The web page will <i>think</i> it brought "
+ "the focus to the window but the actual "
+ "focus will remain unchanged.") );
+ js_focus->insert(policy_btn,KHTMLSettings::KJSWindowFocusIgnore);
+ this_layout->addWidget(policy_btn,3,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+
+ wtstr = i18n("Some websites set the focus to their browser window on their "
+ "own by using <i>window.focus()</i>. This usually leads to "
+ "the window being moved to the front interrupting whatever "
+ "action the user was dedicated to at that time. "
+ "This option specifies the treatment of such "
+ "attempts.");
+ QWhatsThis::add(label, wtstr);
+ connect(js_focus, SIGNAL(clicked(int)), SLOT(setWindowFocusPolicy(int)));
+
+ // === window.status ================================
+ colIdx = 0;
+ label = new QLabel(i18n("Modify status bar text:"),this);
+ this_layout->addWidget(label,4,colIdx++);
+
+ js_statusbar = new QButtonGroup(this);
+ js_statusbar->setExclusive(true);
+ js_statusbar->setHidden(true);
+
+ if (is_per_domain) {
+ policy_btn = new QRadioButton(i18n("Use global"), this);
+ QWhatsThis::add(policy_btn,i18n("Use setting from global policy."));
+ js_statusbar->insert(policy_btn,INHERIT_POLICY);
+ this_layout->addWidget(policy_btn,4,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+ }/*end if*/
+
+ policy_btn = new QRadioButton(i18n("Allow"), this);
+ QWhatsThis::add(policy_btn,i18n("Allow scripts to change the text of the status bar."));
+ js_statusbar->insert(policy_btn,KHTMLSettings::KJSWindowStatusAllow);
+ this_layout->addWidget(policy_btn,4,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+
+ policy_btn = new QRadioButton(i18n("Ignore"), this);
+ QWhatsThis::add( policy_btn,i18n("Ignore attempts of scripts to change the status bar text. "
+ "The web page will <i>think</i> it changed "
+ "the text but the actual text will remain "
+ "unchanged.") );
+ js_statusbar->insert(policy_btn,KHTMLSettings::KJSWindowStatusIgnore);
+ this_layout->addWidget(policy_btn,4,colIdx++);
+ this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
+
+ wtstr = i18n("Some websites change the status bar text by setting "
+ "<i>window.status</i> or <i>window.defaultStatus</i>, "
+ "thus sometimes preventing displaying the real URLs of hyperlinks. "
+ "This option specifies the treatment of such "
+ "attempts.");
+ QWhatsThis::add(label, wtstr);
+ connect(js_statusbar, SIGNAL(clicked(int)), SLOT(setWindowStatusPolicy(int)));
+}
+
+JSPoliciesFrame::~JSPoliciesFrame() {
+}
+
+void JSPoliciesFrame::refresh() {
+ QRadioButton *button;
+ button = static_cast<QRadioButton *>(js_popup->find(
+ policies->window_open));
+ if (button != 0) button->setChecked(true);
+ button = static_cast<QRadioButton *>(js_resize->find(
+ policies->window_resize));
+ if (button != 0) button->setChecked(true);
+ button = static_cast<QRadioButton *>(js_move->find(
+ policies->window_move));
+ if (button != 0) button->setChecked(true);
+ button = static_cast<QRadioButton *>(js_focus->find(
+ policies->window_focus));
+ if (button != 0) button->setChecked(true);
+ button = static_cast<QRadioButton *>(js_statusbar->find(
+ policies->window_status));
+ if (button != 0) button->setChecked(true);
+}
+
+void JSPoliciesFrame::setWindowOpenPolicy(int id) {
+ policies->window_open = id;
+ emit changed();
+}
+
+void JSPoliciesFrame::setWindowResizePolicy(int id) {
+ policies->window_resize = id;
+ emit changed();
+}
+
+void JSPoliciesFrame::setWindowMovePolicy(int id) {
+ policies->window_move = id;
+ emit changed();
+}
+
+void JSPoliciesFrame::setWindowFocusPolicy(int id) {
+ policies->window_focus = id;
+ emit changed();
+}
+
+void JSPoliciesFrame::setWindowStatusPolicy(int id) {
+ policies->window_status = id;
+ emit changed();
+}
+
+#include "jspolicies.moc"
diff --git a/kcontrol/konqhtml/jspolicies.h b/kcontrol/konqhtml/jspolicies.h
new file mode 100644
index 000000000..a955abc96
--- /dev/null
+++ b/kcontrol/konqhtml/jspolicies.h
@@ -0,0 +1,270 @@
+/*
+ Copyright (c) 2002 Leo Savernik <l.savernik@aon.at>
+ Derived from jsopt.h, code copied from there is copyrighted to its
+ respective owners.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __JSPOLICIES_H__
+#define __JSPOLICIES_H__
+
+#include <qgroupbox.h>
+#include <qstring.h>
+
+#include <khtml_settings.h>
+
+#include "policies.h"
+
+class KConfig;
+class QRadioButton;
+class QButtonGroup;
+
+// special value for inheriting a global policy
+#define INHERIT_POLICY 32767
+
+/**
+ * @short Contains all the JavaScript policies and methods for their manipulation.
+ *
+ * This class provides access to the JavaScript policies.
+ *
+ * @author Leo Savernik
+ */
+class JSPolicies : public Policies {
+public:
+#if 0
+ /**
+ * Enumeration for all policies
+ */
+ enum Policies { JavaScriptEnabled = 0, WindowOpen, WindowResize,
+ WindowMove, WindowFocus, WindowStatus, NumPolicies };
+#endif
+
+ /**
+ * constructor
+ * @param config configuration to initialize this instance from
+ * @param group config group to use if this instance contains the global
+ * policies (global == true)
+ * @param global true if this instance contains the global policy settings,
+ * false if this instance contains policies specific for a domain.
+ * @param domain name of the domain this instance is used to configure the
+ * policies for (case insensitive, ignored if global == true)
+ */
+ JSPolicies(KConfig* config, const QString &group, bool global,
+ const QString &domain = QString::null);
+
+ /**
+ * dummy constructor to make QMap happy.
+ *
+ * Never construct an object by using this.
+ * @internal
+ */
+ JSPolicies();
+
+ virtual ~JSPolicies();
+
+ /**
+ * Returns whether the WindowOpen policy is inherited.
+ */
+ bool isWindowOpenPolicyInherited() const {
+ return window_open == INHERIT_POLICY;
+ }
+ /**
+ * Returns the current value of the WindowOpen policy.
+ *
+ * This will return an illegal value if isWindowOpenPolicyInherited is
+ * true.
+ */
+ KHTMLSettings::KJSWindowOpenPolicy windowOpenPolicy() const {
+ return (KHTMLSettings::KJSWindowOpenPolicy)window_open;
+ }
+
+ /**
+ * Returns whether the WindowResize policy is inherited.
+ */
+ bool isWindowResizePolicyInherited() const {
+ return window_resize == INHERIT_POLICY;
+ }
+ /**
+ * Returns the current value of the WindowResize policy.
+ *
+ * This will return an illegal value if isWindowResizePolicyInherited is
+ * true.
+ */
+ KHTMLSettings::KJSWindowResizePolicy windowResizePolicy() const {
+ return (KHTMLSettings::KJSWindowResizePolicy)window_resize;
+ }
+
+ /**
+ * Returns whether the WindowMove policy is inherited.
+ */
+ bool isWindowMovePolicyInherited() const {
+ return window_move == INHERIT_POLICY;
+ }
+ /**
+ * Returns the current value of the WindowMove policy.
+ *
+ * This will return an illegal value if isWindowMovePolicyInherited is
+ * true.
+ */
+ KHTMLSettings::KJSWindowMovePolicy windowMovePolicy() const {
+ return (KHTMLSettings::KJSWindowMovePolicy)window_move;
+ }
+
+ /**
+ * Returns whether the WindowFocus policy is inherited.
+ */
+ bool isWindowFocusPolicyInherited() const {
+ return window_focus == INHERIT_POLICY;
+ }
+ /**
+ * Returns the current value of the WindowFocus policy.
+ *
+ * This will return an illegal value if isWindowFocusPolicyInherited is
+ * true.
+ */
+ KHTMLSettings::KJSWindowFocusPolicy windowFocusPolicy() const {
+ return (KHTMLSettings::KJSWindowFocusPolicy)window_focus;
+ }
+
+ /**
+ * Returns whether the WindowStatus policy is inherited.
+ */
+ bool isWindowStatusPolicyInherited() const {
+ return window_status == INHERIT_POLICY;
+ }
+ /**
+ * Returns the current value of the WindowStatus policy.
+ *
+ * This will return an illegal value if isWindowStatusPolicyInherited is
+ * true.
+ */
+ KHTMLSettings::KJSWindowStatusPolicy windowStatusPolicy() const {
+ return (KHTMLSettings::KJSWindowStatusPolicy)window_status;
+ }
+
+ /**
+ * (re)loads settings from configuration file given in the constructor.
+ */
+ virtual void load();
+ /**
+ * saves current settings to the configuration file given in the constructor
+ */
+ virtual void save();
+ /**
+ * restores the default settings
+ */
+ virtual void defaults();
+
+private:
+ // one of KHTMLSettings::KJSWindowOpenPolicy or INHERIT_POLICY
+ unsigned int window_open;
+ // one of KHTMLSettings::KJSWindowResizePolicy or INHERIT_POLICY
+ unsigned int window_resize;
+ // one of KHTMLSettings::KJSWindowMovePolicy or INHERIT_POLICY
+ unsigned int window_move;
+ // one of KHTMLSettings::KJSWindowFocusPolicy or INHERIT_POLICY
+ unsigned int window_focus;
+ // one of KHTMLSettings::KJSWindowStatusPolicy or INHERIT_POLICY
+ unsigned int window_status;
+
+ friend class JSPoliciesFrame; // for changing policies
+};
+
+/**
+ * @short Provides a framed widget with controls for the JavaScript policy settings.
+ *
+ * This widget contains controls for changing all JavaScript policies
+ * except the JavaScript enabled policy itself. The rationale behind this is
+ * that the enabled policy be separate from the rest in a prominent
+ * place.
+ *
+ * It is suitable for the global policy settings as well as for the
+ * domain-specific settings.
+ *
+ * The difference between global and domain-specific is the existence of
+ * a special inheritance option in the latter case. That way domain-specific
+ * policies can inherit their value from the global policies.
+ *
+ * @author Leo Savernik
+ */
+class JSPoliciesFrame : public QGroupBox {
+ Q_OBJECT
+public:
+ /**
+ * constructor
+ * @param policies associated object containing the policy values. This
+ * object will be updated accordingly as the settings are changed.
+ * @param title title for group box
+ * @param parent parent widget
+ */
+ JSPoliciesFrame(JSPolicies *policies, const QString &title,
+ QWidget* parent = 0);
+
+ virtual ~JSPoliciesFrame();
+
+ /**
+ * updates the controls to resemble the status of the underlying
+ * JSPolicies object.
+ */
+ void refresh();
+ /**
+ * (re)loads settings from configuration file given in the constructor.
+ */
+ void load() {
+ policies->load();
+ refresh();
+ }
+ /**
+ * saves current settings to the configuration file given in the constructor
+ */
+ void save() {
+ policies->save();
+ }
+ /**
+ * restores the default settings
+ */
+ void defaults() {
+ policies->defaults();
+ refresh();
+ }
+
+signals:
+ /**
+ * emitted every time an option has been changed
+ */
+ void changed();
+
+private slots:
+ void setWindowOpenPolicy(int id);
+ void setWindowResizePolicy(int id);
+ void setWindowMovePolicy(int id);
+ void setWindowFocusPolicy(int id);
+ void setWindowStatusPolicy(int id);
+
+private:
+
+ JSPolicies *policies;
+ QButtonGroup *js_popup;
+ QButtonGroup *js_resize;
+ QButtonGroup *js_move;
+ QButtonGroup *js_focus;
+ QButtonGroup *js_statusbar;
+};
+
+
+#endif // __JSPOLICIES_H__
+
diff --git a/kcontrol/konqhtml/khtml_behavior.desktop b/kcontrol/konqhtml/khtml_behavior.desktop
new file mode 100644
index 000000000..60719d007
--- /dev/null
+++ b/kcontrol/konqhtml/khtml_behavior.desktop
@@ -0,0 +1,231 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/khtml/index.html#kbrowse-html
+Icon=konqueror
+Exec=kcmshell khtml_behavior
+
+
+X-KDE-Library=konqhtml
+X-KDE-FactoryName=khtml_behavior
+
+Name=Web Behavior
+Name[af]=Web Gedrag
+Name[ar]=سلوك الشبكة
+Name[az]=Veb Davranışı
+Name[be]=Паводзіны ў Сеціве
+Name[bg]=Уеб браузър
+Name[bn]=ওয়েব আচরণ
+Name[br]=Emzalc'h ar gwiad
+Name[bs]=Ponašanje web preglednika
+Name[ca]=Comportament web
+Name[cs]=Chování na webu
+Name[csb]=Przezéranié WWW
+Name[cy]=Ymddygiad Gwê
+Name[da]=WWW-Opførsel
+Name[de]=Webverhalten
+Name[el]=Συμπεριφορά ιστού
+Name[en_GB]=Web Behaviour
+Name[eo]=TTT-Konduto
+Name[es]=Comportamiento
+Name[et]=Veebilehitseja käitumine
+Name[eu]=Web portaera
+Name[fa]=رفتار وب
+Name[fi]=Verkkokäyttäytyminen
+Name[fr]=Comportement web
+Name[fy]=Webgedrach
+Name[ga]=Oibriú Lín
+Name[gl]=Comportamento Web
+Name[he]=התנהגות רשת
+Name[hi]=वेब बर्ताव
+Name[hr]=Web ponašanje
+Name[hu]=Webes működés
+Name[is]=Vefhegðun
+Name[it]=Comportamento Web
+Name[ja]=ウェブでの挙動
+Name[ka]=წევ ქცევა
+Name[kk]=Веб қасиеттері
+Name[km]=ឥរិយាបថ​បណ្ដាញ
+Name[ko]=웹 행동
+Name[lt]=Žiniatinklio elgsena
+Name[lv]=Tīmekļa izturēšanās
+Name[mk]=Веб-однесување
+Name[mn]=Вэб байдал
+Name[ms]=Kelakuan Web
+Name[mt]=Imġieba web
+Name[nb]=Nettoppførsel
+Name[nds]=Bedregen in't Nett
+Name[ne]=वेभ व्यवहार
+Name[nl]=Webgedrag
+Name[nn]=Vevåtferd
+Name[pa]=ਵੈਬ ਵਿਹਾਰ
+Name[pl]=Przeglądanie WWW
+Name[pt]=Comportamento na Web
+Name[pt_BR]=Comportamento Web
+Name[ro]=Comportament web
+Name[ru]=Поведение Веб
+Name[rw]=Imyitwarire Urubugamakuru
+Name[se]=Webláhtten
+Name[sk]=Správanie WWW
+Name[sl]=Spletno obnašanje
+Name[sr]=Веб понашање
+Name[sr@Latn]=Veb ponašanje
+Name[sv]=Nätbeteende
+Name[ta]=வலைப் பண்புகள்
+Name[te]=వెబ్ ప్రవర్తన
+Name[tg]=Рафтори Вэб
+Name[th]=พฤติกรรมของเว็บ
+Name[tr]=Web Davranışı
+Name[tt]=Web Çağılışı
+Name[uk]=Поведінка Навігатора
+Name[uz]=Veb xususiyatlari
+Name[uz@cyrillic]=Веб хусусиятлари
+Name[vi]=Cách hoạt động của duyệt mạng
+Name[wa]=Dujhance waibe
+Name[zh_CN]=Web 行为
+Name[zh_TW]=網頁行為
+Comment=Configure the browser behavior
+Comment[af]=Konfigureer die blaaier gedrag
+Comment[ar]=إعداد سلوك المتصفح
+Comment[be]=Настаўленні паводзінаў вандроўніка
+Comment[bg]=Настройване на уеб браузъра
+Comment[bn]=ব্রাউজারের আচরণ কনফিগার করুন
+Comment[br]=Kefluniañ emzalc'h ar furcher
+Comment[bs]=Podesite ponašanje web preglednika
+Comment[ca]=Configura el comportament del navegador
+Comment[cs]=Nastavení chování prohlížeče
+Comment[csb]=Kònfigùracëjô zachòwaniô przezérnika
+Comment[cy]=Ffurfweddu ymddygiad y porydd
+Comment[da]=Indstil browserens opførsel
+Comment[de]=Verhalten des Webbrowsers festlegen
+Comment[el]=Ρυθμίστε τη συμπεριφορά του περιηγητή
+Comment[en_GB]=Configure the browser behaviour
+Comment[eo]=Agordas la konduton de la TTT-legilo
+Comment[es]=Configuración del comportamiento del navegador
+Comment[et]=Konquerori veebilehitseja käitumine
+Comment[eu]=Konfiguratu arakatzailearen portaera
+Comment[fa]=پیکربندی رفتار مرورگر
+Comment[fi]=Selaimen asetukset
+Comment[fr]=Configuration du comportement du navigateur
+Comment[fy]=Hjir kinne jo it gedrach fan de webblêder ynstelle
+Comment[ga]=Cumraigh oibriú an bhrabhsálaí
+Comment[gl]=Configurar o comportamento do navegador
+Comment[he]=שינוי הגדרות פעולת הדפדפן
+Comment[hi]=वेब बर्ताव कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje ponašanja preglednika
+Comment[hu]=A Konqueror webböngésző részének működési jellemzői
+Comment[is]=Stilla hegðan vafrara
+Comment[it]=Configura il comportamento del browser
+Comment[ja]=ウェブブラウザの挙動を設定
+Comment[ka]=ბრაუზერის ქცევის კონფიგურაცია
+Comment[kk]=Браузер қасиеттерін баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ឥរិយាបថ​កម្មវិធី​រុករក​បណ្ដាញ
+Comment[ko]=브라우저 행동 설정
+Comment[lo]=ປັບແຕ່ງເຊີເວີພຣັອກຊີ
+Comment[lt]=Konfigūruoti naršyklės elgesį
+Comment[lv]=Konfigurēt pārlūka izturešanos
+Comment[mk]=Конфигурирајте го однесувањето на прелистувачот
+Comment[mn]=Вэб-Хөтөчийн байдлыг тогтоох
+Comment[ms]=Konfigur kalakuan pelayar
+Comment[mt]=Ikkonfigura l-imġieba tal-browser
+Comment[nb]=Tilpass nettleserens oppførsel
+Comment[nds]=Dat Bedregen vun den Nettkieker instellen
+Comment[ne]=ब्राउजरको व्यवहार कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u het gedrag van de webbrowser instellen
+Comment[nn]=Oppsett av nettlesaråtferda
+Comment[nso]=Beakanya maitshwaro a seinyakisi
+Comment[pa]=ਝਲਕਾਰਾ ਵਿਹਾਰ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja zachowania przeglądarki
+Comment[pt]=Configurar o comportamento do navegador
+Comment[pt_BR]=Configura o comportamento do navegador
+Comment[ro]=Configurează comportamentul de navigator de web
+Comment[ru]=Настройка поведения браузера
+Comment[rw]=Kuboneza imyitwarire ya mucukumbuzi
+Comment[se]=Heivet mo fierpmádatlogan láhtte
+Comment[sk]=Nastavenie správania prehliadača
+Comment[sl]=Nastavitve obnašanja brskalnika
+Comment[sr]=Подешавање понашања прегледача
+Comment[sr@Latn]=Podešavanje ponašanja pregledača
+Comment[sv]=Anpassa webbläsarens beteende
+Comment[ta]=உலாவியின் இயக்கத்தை வடிவமை
+Comment[tg]=Танзими рафтори тафсир
+Comment[th]=ปรับแต่งพฤติกรมของบราวเซอร์
+Comment[tr]=Web tarayıcı davranışlarını yapılandır
+Comment[tt]=Girgeç çağılışın caylaw
+Comment[uk]=Налаштування поведінки навігатора
+Comment[uz]=Brauzerning xususiyatlarini moslash
+Comment[uz@cyrillic]=Браузернинг хусусиятларини мослаш
+Comment[ven]=Dzudzanyani maitele a burausa
+Comment[vi]=Cấu hình cách hoạt động của trình duyệt
+Comment[wa]=Apontyî l' dujhance do betchteu waibe
+Comment[xh]=Qwalasela indlela umkhangeli zincwadi aziphatha ngayo
+Comment[zh_CN]=配置浏览器行为
+Comment[zh_TW]=設定瀏覽器行為
+Comment[zu]=Hlanaganisela ukuziphatha komcingi
+Keywords=konqueror,kfm,browser,html,web,www,fonts,colours,colors,java,javascript,cursor,links,images,charsets,character sets,encoding
+Keywords[az]=konqueror,kfm,səyyah,html,şəbəkə,www,yazı növləri,rənglər,java,javascript,hərf,hərf dəstəsi,kodlama,bağlantılar,rəsmlər,ox
+Keywords[be]=Вандроўнік,Сеціва,Шрыфты,Колеры,Сцэнар,Курсор,Спасылкі,Відарысы,Малюнкі,Знаказбор,Знаказборы,konqueror,kfm,browser,html,web,www,fonts,colours,colors,java,javascript,cursor,links,images,charsets,character sets,encoding
+Keywords[bg]=браузър, страници, Интернет, уеб, konqueror,kfm, browser, html, web, www, fonts, colours, colors, java, javascript, cursor, links, images, charsets, character sets, encoding
+Keywords[bs]=konqueror,kfm,browser,html,web,www,fonts,colours,colors,java,javascript,cursor,links,images,charsets,character sets,encoding,kodni raspored,preglednik,fontovi,boje,font,boja,kursor,link,linkovi,slike,slika,skup znakova
+Keywords[ca]=konqueror,kfm,navegador,html,web,www,lletres,colorits,colors,java,javascript,cursor,enllaços,imatges,caràcters,joc de caràcters,codificació
+Keywords[cs]=Konqueror,Kfm,Prohlížeč,HTML,Web,WWW,Písma,Barvy,Java,JavaScript, Kurzor,Odkazy,Obrázky,Znakové sady,Kódování
+Keywords[csb]=konqueror,kfm,przezérnik,html,séc www,fòntë,farwë,java,javascript,kùrsor,lënczi,òbrôzczi,zestôw merków,kòdowanié
+Keywords[cy]=konqueror,kfm,porydd,html,gw?,www,ffontiau,lliwiau,java,javascript,cyrchydd,cysylltiadau,delweddau,setiau nodau,nod,amgodiad
+Keywords[da]=konqueror,kfm,browser,HTML,net,skrifttyper,farver,java,javascript,markør,henvisninger,billeder,tegnsæt,indkodning
+Keywords[de]=Konqueror,Kfm,Browser,HTML,Web,WWW,Schriften,Farben,Java,JavaScript,Cursor,Links,Verknüpfungen,Bilder,Zeichensätze,Encoding
+Keywords[el]=konqueror,kfm,περιηγητής,html,ιστός,www,γραμματοσειρές,χρώματα,χρώματα,java,javascript,δρομέας,δεσμοί,εικόνες,σύνολα χαρακτήρων,σύνολα χαρακτήρων,κωδικοποίηση
+Keywords[en_GB]=konqueror,kfm,browser,html,web,www,fonts,colours,java,javascript,cursor,links,images,charsets,character sets,encoding
+Keywords[eo]=Konkeranto,Kfm,TTT,HTML,WWW,tiparo,koloro,Javo,Javoskripto,kursoro,kursilo,ligo,referenco,bildo,signaro,kodo
+Keywords[es]=konqueror,kfm,navegador,html,web,www,tipo de letra,colores,java,javascript,cursor,enlaces,imágenes,mapas de caracteres,codificación
+Keywords[et]=konqueror,kfm,veebilehitseja,html,veeb,www,fondid,värvid,java,javascript,kursor,viidad,lingid,pildid,kooditabel,kodeering
+Keywords[eu]=konqueror,kfm,arakatzailea,html,web,www,letra-tipoak,koloreak,java,javascript,kurtsorea,linkak,irudiak,karaktere-multzoak,karaktereen hobespenak,kodeketa
+Keywords[fa]=konqueror، kfm، مرورگر، زنگام، وب، www، قلمها، رنگها، رنگها، جاوا، جاوااسکریپت، مکان‌نما، پیوندها، تصاویر، نوسه‌گان، نویسه‌گان، کدبندی
+Keywords[fi]=konqueror,kfm,selain,html,web,www,kirjasimet,värit,java,javascript,osoitin,linkit,kuvat,merkistöt,koodaus
+Keywords[fr]=konqueror,kfm,navigateur,html,web,www,polices,couleurs,java,javascript,curseur,liens,images,jeu de caractères,caractères,codage,encodage
+Keywords[fy]=konqueror,kfm,browser,blêder,html,web,www,fonts,lettertypen,kleuren,java,javascript,javaskript,cursor,links,rinnerke,skeakels,ôfbyldingen,charsets,tekensets,karaktersamling,kodearring,ynternet
+Keywords[ga]=konqueror,kfm,brabhsálaí,html,gréasán,www,clófhoirne,clónna,dathanna,java,javascript,cúrsóir,naisc,nascanna,íomhánna,tacair charachtair,ionchódú
+Keywords[gl]=konqueror,kfm,navegador,html,web,www,fontes,cores,java,javascript,ponteiro,ligazóns,imaxes,carácteres,conxunto de carácteres,codificación
+Keywords[he]=גופנים,צבעים,Java,ג'אווה,מצביע,קישורים,תמונות,מערכי תווים,קידוד,WWW,רשת, HTML,דפדפן,KFM,Konqueror, kfm,browser,html,web,www,fonts,colours,colors,java,javascript,cursor,links, images,charsets,character sets,encoding
+Keywords[hi]=कॉन्करर,केएफएम,ब्राउज़र,एचटीएमएल,वेब,डब्ल्यूडब्ल्यूडब्ल्यू,फ़ॉन्ट्स,रंग,जावा,जावास्क्रिप्ट,संकेतक,लिंक्स,छवि,अक्षर माला,अक्षरमाला,एनकोडिंग
+Keywords[hr]=konqueror,kfm,browser,html,web,www,fonts,colours,colors,java,javascript,cursor,links,images,charsets,character sets,encoding,preglednik,fontovi,boja,boje,pokazivač,veze,slike,znakovi,kodiranje,kodiranje zakova
+Keywords[hu]=Konqueror,KFM,böngésző,HTML,web,WWW,betűtípusok,színek,Java,JavaScript,egérmutató,linkek,képek,karakterkészletek,kódolás
+Keywords[is]=vafri,vefur,vefurinn,vefsíður,letur,litir,kóðun,stafatafla,bendill,myndir,www,html,stafir
+Keywords[it]=konqueror,kfm,browser,html,web,www,caratteri,colori,java,javascript,cursore,collegamenti,link,immagini,set di caratteri,charset,codifica
+Keywords[ja]=konqueror,kfm,ブラウザ,html,web,ウェブ,www,フォント,色,色,java,javascript,カーソル,リンク,画像,文字セット,文字セット,エンコーディング
+Keywords[km]=konqueror,kfm,កម្មវិធី​រុករក,html,បណ្ដាញ,វើលវ៉ាយវិប,ពុម្ពអក្សរ,ពណ៌,java,javascript,ទស្សន៍ទ្រនិច,តំណ,រូបភាព,សំណុំ​តួអក្សរ,
+Keywords[lt]=konqueror,kfm,browser,html,web,www,fonts,colours,colors,java,javascript,cursor,links,images,charsets,character sets,encoding,narašymas,html,tinklalapis,tinklapis,www,šriftai,koloritai,spalvos,,java,java scebarijus,žymeklis,nuorodos,paveikslai,simboliai,koduotė,simbolių rinkinys
+Keywords[lv]=iekarotājs,kfm,pārlūks,html,web,www,fonti,krāsojums,krāsas,java,javaskripts,kursors,saites,attēli,simbolukomplekti,simbolu komplekti,kodējums
+Keywords[mk]=konqueror,kfm,browser,html,web,www,fonts,colours,colors,java,javascript,cursor,links,images,charsets,character sets,encoding,прелистувач,веб,фонтови,бои,курсор,врски,слики,знаковни множества,кодирање
+Keywords[mn]=Конкюрор,Kfm,Хөтөч,HTML,Вэб,WWW,Бичиг,Өнгө,Java,JavaScript,Түүчээ,Холбоосууд,Links,Зураг,Тэмдэгт олонлог,Кодчилол
+Keywords[nb]=konqueror,kfm,nettleser,html,nettet,www,veven,verdensveven,skriftyper,farger,java,javaskript,markør,tegnsett,koding,bilde,skriptspråk,Internett
+Keywords[nds]=Konqueror,kfm,Browser,Nettkieker,HTML,web,www,Schriftoorden,Klören,Klöör,Java,JavaScript,Cursor,Links,Biller,Tekensett,Tekensetten,Koderen
+Keywords[ne]=कन्क्वेरर, kfm, ब्राउजर,html, वेब,www, फन्ट, रङ, रङहरू, जाभा, जाभास्क्रिप्ट, कर्सर, लिङ्क, छवि, चारसेट, क्यारेक्टर सेट, सङ्केतन
+Keywords[nl]=konqueror,kfm,browser,html,web,www,fonts,lettertypen,kleuren,,java,,javascript,cursor,links,koppelingen,afbeeldingen,charsets,tekensets,tekenverzamelingen,codering,internet
+Keywords[nn]=Konqueror,KFM,nettlesar,HTML,verdsveven,WWW,skrifter,fargar,Java,JavaScript,skriptspråk,Internett,peikar,lenkjer,bilete,teiknsett,koding,teiknkoding
+Keywords[nso]=konqueror,kfm,seinyakisi,html,web,www,difonto,mebala,mebala,java,setlankana sa java,cursor,dikgokaganyi,diponagalo,charsets,dipeakanyo tsa dihlaka,go khouta
+Keywords[pa]=ਕੋਨਕਿਉਰਰ,kfm,ਝਲਕਾਰਾ,html,web,www,ਫੋਂਟ, ਰੰਗ, ਜਾਵਾ, ਜਾਵਾ ਸਕ੍ਰਿਪਟ, ਕਰਸਰ, ਸਬੰਧ, ਚਿੱਤਰ, ਅੱਖਰ-ਸੈਟ, ਇੰਕੋਡਿੰਗ
+Keywords[pl]=konqueror,kfm,przeglądarka,html,sieć www,czcionki,kolory,java,javascript,kursor,linki,odnośniki,obrazki,zestawy znaków,kodowanie
+Keywords[pt]=konqueror,kfm,navegador,html,web,www,tipos de letra,fontes,cores,java,javascript,cursor,ligações,imagens,charsets,mapas de caracteres,codificação
+Keywords[pt_BR]=Konqueror,kfm,navegador,html,web,WWW,fontes,cores,java,javascript, cursor,ligações,imagens,conjuntos de caracteres,codificação
+Keywords[ro]=konqueror,kfm,navigator,browser,html,web,www,font,culori,java,javascript,cursor,legături,imagini,set de caractere,codare
+Keywords[rw]=Konqueror,kfm,mucukumbuzi,html,urubuga,www,imyandikire, amabara,amabara,java,javascript,inyoborayandika,amahuza,itsinda-nyuguti,amatsinda y'inyuguti,gusobeka
+Keywords[se]=konqueror,kfm,fierpmádatlogan,html,web,WWW,fonttat,ivnnit,java,javascript,seaván,liŋkkat,govat,mearkarájut,koden
+Keywords[sk]=konqueror,kfm,prehliadač,html,web,www,písma,farby,java,javascript,kurzor,odkazy,obrázky,znakové sady,kódovanie
+Keywords[sl]=konqueror,kfm,brskalnik,html,splet,www,pisave,barve,java,javascript,kurzor,povezave,slike,nabori znakov,znakovni nabori,kodiranje
+Keywords[sr]=konqueror,kfm,browser,html,web,www,fonts,colours,colors,java,javascript,cursor,links,images,charsets,character sets,encoding,прегледач,веб,фонтови,боје,показивач,везе,слике,скупови знакова,кодирање
+Keywords[sr@Latn]=konqueror,kfm,browser,html,web,www,fonts,colours,colors,java,javascript,cursor,links,images,charsets,character sets,encoding,pregledač,veb,fontovi,boje,pokazivač,veze,slike,skupovi znakova,kodiranje
+Keywords[sv]=konqueror,kfm,webbläsare,html,webb,www,teckensnitt,färger,java,javaskript,länkar,bilder,kodning,teckenuppsättningar
+Keywords[ta]=கான்கொரர்,kfm,உலாவி,html,வலை,www,எழுத்துருக்கள்,வண்ணங்கள்,வண்ணங்கள்,ஜாவா,ஜாவா எழுத்துரு,நிலைக்காட்டி,இணைப்புகள்,பிம்பங்கள்,charsets,சொல் அமைப்புகள்,குறியீடு
+Keywords[th]=คอนเควอร์เรอร์,kfm,บราวเซอร์,html,เว็บ,www,แบบอักษร,สี,จาวา,จาวาสคริปต์,เคอร์เซอร์,ลิงค์,ภาพ,ชุดรหัสอักขระ,ชุดรหัสอักขระ,การเข้ารหัส
+Keywords[tr]=konqueror,kfm,tarayıcı,html,web,www,yazı tipleri,renkler,java,javascript,karakter,karakter seti,kodlama,bağlantılar,resimler,imleç
+Keywords[uk]=konqueror,kfm,навігатор,html,шрифти,web,Тенета,кольори,java,javascript,курсор,www,посилання,зображення,набори символів,кодування
+Keywords[uz]=konqueror,kfm,html,www,brauzer,veb,shriftlar,belgilar toʻplami,kodlash usuli,java,javascript,bogʻlar,kursor,ranglar
+Keywords[uz@cyrillic]=konqueror,kfm,html,www,браузер,веб,шрифтлар,белгилар тўплами,кодлаш усули,java,javascript,боғлар,курсор,ранглар
+Keywords[ven]=konqueror,kfm,buronza,html,webu,www,dzifontu,mivhala,mivhala,java,manwalwa a java,cursor,vhukwamani,zwifanyiso,tshasete,mavhekanyele a muanewa,uinikhouda
+Keywords[vi]=konqueror,kfm,trình duyệt,html,web,www,phông chữ,màu sắc,màu,java,javascript,con trỏ,liên kết,hình ảnh,ký tự,tập ký tự,mã ký tự
+Keywords[wa]=konqueror,kfm,betchteu,html,waibe,www,fontes,coleurs,java,javascript,cursoe,loyéns,imådjes,ecôdaedjes
+Keywords[xh]=konqueror,kfm,umkhangeli zincwadi,html,web,www,imigca,imibala,imibala,java,okushicilelwe phantsi kwe java,isalatisi,amakhonkco,imifanekiso,icharsets,amaqela abasebenzi, encoding
+Keywords[zh_CN]=konqueror,kfm,browser,html,web,www,fonts,colours,colors,java,javascript,cursor,links,images,charsets,character sets,encoding,浏览,字体,颜色,光标,链接,图像,字符集,编码
+Keywords[zh_TW]=konqueror,kfm,browser,html,web,www,fonts,colours,colors,java,javascript,cursor,links,images,charsets,character sets,encoding,瀏覽,字型,色彩,顏色,游標,連結,影像,字元,字集,編碼
+Keywords[zu]=konqueror,kfm,umcingi,html,web,www,izinhlobo zamagama, imibala,imibala,java,javascripy,inkomba,izixhumanisi,izithombe,charsets, amaqoqo ezimpawu,ukubhala ngekhodi
+
+Categories=Qt;KDE;X-KDE-settings-webbrowsing;
diff --git a/kcontrol/konqhtml/khtml_filter.desktop b/kcontrol/konqhtml/khtml_filter.desktop
new file mode 100644
index 000000000..25356f562
--- /dev/null
+++ b/kcontrol/konqhtml/khtml_filter.desktop
@@ -0,0 +1,145 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/khtml/index.html#khtml-adblock
+Icon=filter
+Exec=kcmshell khtml_filter
+
+X-KDE-Library=konqhtml
+X-KDE-FactoryName=khtml_filter
+
+Name=AdBlocK Filters
+Name[af]=Advertensie blok filters
+Name[ar]=مرشحات مكافحة الدعايات
+Name[be]=Фільтры AdBlocK
+Name[bg]=Блокиране на реклами
+Name[bn]=অ্যাড্-ব্লক ফিল্টার
+Name[br]=Siloù AdBlocK
+Name[bs]=AdBlocK filteri
+Name[ca]=Filtres de bloqueig publicitari
+Name[cs]=AdBlocK filtry
+Name[csb]=Flitrë AdBlocK
+Name[da]=AdBlocK filtre
+Name[de]=Werbefilter
+Name[el]=Φίλτρα AdBlocK
+Name[eo]=ReklamBloK Filtroj
+Name[es]=Filtros de anuncios (AdBlock)
+Name[et]=AdBlocK filtrid
+Name[eu]=AdBlocK iragazkiak
+Name[fa]=پالایه‌های AdBlocK
+Name[fi]=AdBlocK-suotimet
+Name[fr]=Filtres AdBlocK
+Name[fy]=AdBlock-filters
+Name[ga]=Scagairí AdBlockK
+Name[gl]=Filtros AdBlocK
+Name[he]=מסנני חלונות מקופצים (AdBlock)
+Name[hr]=AdBlocK filtri
+Name[hu]=AdBlocK szűrők
+Name[is]=AdBlocK síur
+Name[it]=Filtri AdBlocK
+Name[ja]=AdBlocK フィルタ
+Name[ka]=AdBlocK ფილტრები
+Name[kk]=AdBlocK сүзгілері
+Name[km]=តម្រង AdBlocK
+Name[ko]=AdBlocK 필터
+Name[lt]=AdBlocK filtrai
+Name[mk]=AdBlocK-филтри
+Name[ms]=Penapis AdBlocK
+Name[nb]=Reklamefiltere
+Name[nds]=Warvenfilter
+Name[ne]=AdBlocK फिल्टर
+Name[nl]=AdBlock-filters
+Name[nn]=Reklamefilter
+Name[pa]=AdBlocK ਫਿਲਟਰ
+Name[pl]=Flitry AdBlocK
+Name[pt]=Filtros do AdBlock
+Name[pt_BR]=Filtros AdBlocK
+Name[ro]=Filtre AdBlocK
+Name[ru]=Фильтры AdBlocK
+Name[rw]=Muyunguruzi AdBlocK
+Name[se]=AdBlocK-sillit
+Name[sk]=AdBlock filtre
+Name[sl]=Filtri AdBlocK
+Name[sr]=AdBlocK-ови филтери
+Name[sr@Latn]=AdBlocK-ovi filteri
+Name[sv]=Reklamblockeringsfilter
+Name[te]=ఏడ్ బ్లాక్ గలనులు
+Name[tg]=Филтрҳои AdBlocK
+Name[th]=ตัวกรองของ AdBlocK
+Name[tr]=AdBlocK Filtreleri
+Name[tt]=Reklam Sözgeçläre
+Name[uk]=Фільтри AdBlocK
+Name[uz]=AdBlocK filterlari
+Name[uz@cyrillic]=AdBlocK филтерлари
+Name[vi]=Lọc Quảng cáo
+Name[wa]=Passetes AdBlocK
+Name[zh_CN]=广告拦截过滤器
+Name[zh_TW]=AdBlocK 過濾器
+
+Comment=Configure Konqueror AdBlocK filters
+Comment[af]=Konfigureer die weg Konqueror raporte self
+Comment[ar]=إعداد مرشحات Konqueror لمكافحة الدعايات
+Comment[be]=Настаўленні фільтраў AdBlocK для Konqueror
+Comment[bg]=Настройване на филтрите за блокиране на реклами
+Comment[bn]=কনকরার-এ বিজ্ঞাপন আটকাতে ব্যবহৃত ফিল্টার কনফিগার করুন
+Comment[br]=Kefluniañ siloù AdBlocK Konqueror
+Comment[bs]=Podesite Konqueror AdBlocK filtere
+Comment[ca]=Configura els filtres de bloqueig publicitari de Konqueror
+Comment[cs]=Zde můžete nastavit blokování reklam
+Comment[csb]=Kònfigùracëjô filtrów AdBlocK Konquerora
+Comment[da]=Indstil Konquerors adblock filtre
+Comment[de]=Hier können Sie Einstellungen zum Werbefilter vornehmen
+Comment[el]=Ρυθμίστε τα φίλτρα AdBlocK του Konqueror
+Comment[eo]=Agordo de Konkeranto-ReklamBloK filtroj
+Comment[es]=Configuración de los filtros de anuncios de Konqueror
+Comment[et]=Konqueror AdBlocK filtrite seadistamine
+Comment[eu]=Konfiguratu Konqueror AdBlock iragazkiak
+Comment[fa]=پیکربندی پالایه‌های AdBlocK Konqueror
+Comment[fi]=Aseta Konquerorin AdBlocK-suotimia
+Comment[fr]=Configurer les filtres AdBlocK de Konqueror
+Comment[fy]=Konfigurearje de filters om reklame te warjen
+Comment[ga]=Cumraigh na Scagairí AdBlocK Konqueror
+Comment[gl]=Configurar os filtros AdBlocK en Konqueror
+Comment[he]=הגדרת מסנני חלונות מקופצים (AdBlock)
+Comment[hr]=Konfiguriranje Konqueror AdBlocK filtara
+Comment[hu]=A Konqueror AdBlocK szűrőinek beállítása
+Comment[is]=Stilla Konqueror AdBlocK síur
+Comment[it]=Configura i filtri AdBlock per Konqueror
+Comment[ja]=Konqueror AdBlocK フィルタの設定
+Comment[ka]=Configure Konqueror AdBlocK ფილტრები
+Comment[kk]=Konqueror AdBlocK сүзгілерді баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធតម្រង​របស់ Konqueror AdBlocK
+Comment[ko]=Konqueror AdBlocK 필터 설정
+Comment[lt]=Konfigūruoti Konqueror AdBlocK filtrus
+Comment[mk]=Конфигурирајте ги AdBlocK-филтрите на Konqueror
+Comment[ms]=Konfigur penapis AdBlocK Konqueror
+Comment[nb]=Tilpass Konquerors reklamefiltere
+Comment[nds]=Hier kannst Du Konquerors Warvenfilter instellen
+Comment[ne]=कन्क्वेरर AdBlocK फिल्टर कन्फिगर गर्नुहोस्
+Comment[nl]=Filters voor blokkeren van advertenties in Konqueror instellen
+Comment[nn]=Tilpass reklamefiltera til Konqueror
+Comment[pa]=ਕੋਨਕਿਉਰਰ ਐਡਬਲਾਕ ਫਿਲਟਰ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja filtrów AdBlocK Konquerora
+Comment[pt]=Configurar os filtros AdBlock do Konqueror
+Comment[pt_BR]=Configura os filtros AdBlocK no Konqueror
+Comment[ro]=Configurează filtrele AdBlocK pentru Konqueror
+Comment[ru]=Настройка блокирования рекламы для Konqueror
+Comment[rw]=Kuboneza muyunguruzi AdBlocK Konqueror
+Comment[se]=Heivet Konqueror:a AdBlocK-silliid
+Comment[sk]=Nastavenie AdBlock filtrov pre Konqueror
+Comment[sl]=Nastavitev filtrov AdBlocK za Konqueror
+Comment[sr]=Подешавање AdBlock-ових филтера за Konqueror
+Comment[sr@Latn]=Podešavanje AdBlock-ovih filtera za Konqueror
+Comment[sv]=Anpassa Konquerors reklamblockeringsfilter
+Comment[tg]=Танзимоти қулфи рекламаи Ad барои Konqueror
+Comment[th]=ปรับแต่งตัวกรอง AdBlocK ของคอนเควอร์เรอร์
+Comment[tr]=Konqueror'ın AdBlocK Filtrelerini yapılandır
+Comment[tt]=Konqueror'dağı reklam kistergeçneñ caylaw
+Comment[uk]=Налаштувати фільтри блокування реклами для Konqueror
+Comment[uz]=Konqueror uchun AdBlocK filterlarini moslash
+Comment[uz@cyrillic]=Konqueror учун AdBlocK филтерларини мослаш
+Comment[vi]=Cấu hình cách Konqueror lọc bỏ các quảng cáo khó chịu
+Comment[wa]=Apontyî es passetes AdBlocK di Konqueror
+Comment[zh_CN]=配置 Konqueror 的广告拦截过滤器
+Comment[zh_TW]=設定 Konqueror AdBlocK 過濾器
+
+Categories=Qt;KDE;X-KDE-settings-webbrowsing;
diff --git a/kcontrol/konqhtml/khtml_fonts.desktop b/kcontrol/konqhtml/khtml_fonts.desktop
new file mode 100644
index 000000000..7c1511840
--- /dev/null
+++ b/kcontrol/konqhtml/khtml_fonts.desktop
@@ -0,0 +1,230 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/khtml/index.html#kbrowse-appearance
+Icon=fonts
+Exec=kcmshell khtml_fonts
+
+
+X-KDE-Library=konqhtml
+X-KDE-FactoryName=khtml_fonts
+
+Name=Fonts
+Name[af]=Skriftipes
+Name[ar]=المحارف
+Name[az]=Yazı növləri
+Name[be]=Шрыфты
+Name[bg]=Шрифтове
+Name[bn]=ফন্ট
+Name[br]=Fontoù
+Name[bs]=Fontovi
+Name[ca]=Lletres
+Name[cs]=Písma
+Name[csb]=Fòntë
+Name[cy]=Ffontiau
+Name[da]=Skrifttyper
+Name[de]=Schriftarten
+Name[el]=Γραμματοσειρές
+Name[eo]=Tiparoj
+Name[es]=Tipos de letra
+Name[et]=Fondid
+Name[eu]=Letra-tipoak
+Name[fa]=قلمها
+Name[fi]=Kirjasimet
+Name[fr]=Polices
+Name[fy]=Lettertypen
+Name[ga]=Clónna
+Name[gl]=Fontes
+Name[he]=גופנים
+Name[hi]=फ़ॉन्ट्स
+Name[hr]=Fontovi
+Name[hu]=Betűtípusok
+Name[is]=Letur
+Name[it]=Tipi di carattere
+Name[ja]=フォント
+Name[ka]=ფონტები
+Name[kk]=Қаріптер
+Name[km]=ពុម្ពអក្សរ
+Name[ko]=글꼴
+Name[lo]=ຮູບແບບຕົວອັກສອນ
+Name[lt]=Šriftai
+Name[lv]=Fonti
+Name[mk]=Фонтови
+Name[mn]=Бичгүүд
+Name[ms]=Fon
+Name[nb]=Skrifttype
+Name[nds]=Schriftoorden
+Name[ne]=फन्ट
+Name[nl]=Lettertypen
+Name[nn]=Skrifttypar
+Name[nso]=Difonto
+Name[pa]=ਫੋਂਟ
+Name[pl]=Czcionki
+Name[pt]=Tipos de Letra
+Name[pt_BR]=Fontes
+Name[ro]=Fonturi
+Name[ru]=Шрифты
+Name[rw]=Imyandikire
+Name[se]=Fonttat
+Name[sk]=Písma
+Name[sl]=Pisave
+Name[sr]=Фонтови
+Name[sr@Latn]=Fontovi
+Name[ss]=Timo tetinhlamvu temagama
+Name[sv]=Teckensnitt
+Name[ta]=எழுத்துருக்கள்
+Name[tg]=Ҳарфҳо
+Name[th]=แบบอักษร
+Name[tr]=Yazıtipleri
+Name[tt]=Yazu
+Name[uk]=Шрифти
+Name[uz]=Shriftlar
+Name[uz@cyrillic]=Шрифтлар
+Name[ven]=Fontu
+Name[vi]=Phông chữ
+Name[wa]=Fontes
+Name[xh]=Uhlobo lwamagama
+Name[zh_CN]=字体
+Name[zh_TW]=字型
+Name[zu]=Izinhlobo zamagama
+Comment=Configure the fonts used on web pages
+Comment[af]=Konfigureer die skriftipes gebruik word op web bladsye
+Comment[ar]=إعداد المحارف المستعملة على صفحات الشبكة
+Comment[be]=Настаўленні шрыфтоў для выкарыстання на старонках Сеціва
+Comment[bg]=Настройване на шрифтовете за уеб страниците
+Comment[bn]=ওয়েব পেজ-এ ব্যবহৃত ফন্ট কনফিগার করুন
+Comment[br]=Kefluniañ an nodrezhoù evit ar pajennoù gwiad
+Comment[bs]=Podesite fontove korištene na web stranicama
+Comment[ca]=Configura els tipus de lletres emprades a les pàgines web
+Comment[cs]=Nastavení písem pro webové stránky
+Comment[csb]=Kònfigùracëjô fòntów na internetowëch starnach
+Comment[cy]=Ffurfweddu'r ffontiau sy'n cael eu defnyddio ar dudalennau gwe
+Comment[da]=Indstil de skrifttyper der bruges på netsider
+Comment[de]=Schriften für die Darstellung von Webseiten festlegen
+Comment[el]=Ρυθμίστε τις γραμματοσειρές που χρησιμοποιούνται στις ιστοσελίδες
+Comment[eo]=Agordas la tiparojn kiuj estas uzataj sur TTT-paĝoj
+Comment[es]=Configuración de los tipos de letra usados en las páginas web
+Comment[et]=Veebilehtedel kasutatavate fontide seadistamine
+Comment[eu]=Konfiguratu web orrietan erabiliko diren letra-tipoak
+Comment[fa]=پیکربندی قلمهای استفاده‌شده در صفحات وب
+Comment[fi]=WWW-sivujen kirjasimet
+Comment[fr]=Configuration des polices utilisées sur les pages web
+Comment[fy]=Hjir kinne jo de lettertypen die brûkt wurde op de websiden ynstelle
+Comment[gl]=Configurar as fontes empregadas nas páxinas web
+Comment[he]=שינוי הגדרות הגופנים שנעשה בהם שימוש בדפי אינטרנט
+Comment[hi]=वेब पृष्ठ पर उपयोग में आने वाले फ़ॉन्ट्स कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje fontova upotrijebljenih na web-stranicama
+Comment[hu]=A Konqueror webböngésző betűtípusainak beállítása
+Comment[is]=Stillta letur sem notað er á vefsíðum
+Comment[it]=Configura i caratteri da usare nelle pagine web
+Comment[ja]=ウェブページで使用するフォントを設定
+Comment[ka]=ვებ გვერდების შრიფტების კონფიგურაცია
+Comment[kk]=Веб парақтарда қолданатын қаріптер
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ពុម្ពអក្សរ ដែល​ប្រើ​លើ​ទំព័រ​បណ្ដាញ
+Comment[ko]=웹 페이지의 글꼴 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງລັກສະນະແລະຄວາມຮູ້ສຶກໃນການໃຊ້ງານ Konqueror ໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite konfigūruoti šriftus, naudojamus tinklalapiuose
+Comment[lv]=Šeit Jūs varat konfigurēt tīmekļa lapās lietotos fontus
+Comment[mk]=Конфигурирајте ги фонтовите што се користат за веб-страници
+Comment[mn]=Вэб хуудас харагдалтын бичиг тогтоох
+Comment[ms]=Konfigur fon yang digunakan dalam halaman web
+Comment[mt]=Agħżel il-fonts li jintużaw fuq paġni web
+Comment[nb]=Tilpass hvilke skrifttyper som brukes på nettsider
+Comment[nds]=De Schriftoorden för Nettsieden instellen
+Comment[ne]=वेब पृष्ठहरूमा प्रयोग गरिने फन्ट कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u de lettertypen die op webpagina's gebruikt worden instellen
+Comment[nn]=Oppsett av skrifter for nettsider
+Comment[nso]=Beakanya difonto tseo di somiswago go matlakala a web
+Comment[pa]=ਵੈੱਬ ਸਫੇ 'ਤੇ ਫੋਂਟ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja czcionek na stronach internetowych
+Comment[pt]=Configurar os tipos de letra usados nas páginas Web
+Comment[pt_BR]=Configura as fontes usadas em páginas da web
+Comment[ro]=Configurează fonturile utilizate în paginile web
+Comment[ru]=Настройка шрифтов веб-страниц
+Comment[rw]=Kuboneza imyandikire ikoreshwa ku mapaji rubuga
+Comment[se]=Heivet makkár fonttat geavahuvvojit fierpmádatsiidduin
+Comment[sk]=Nastavenie písiem pre webové stránky
+Comment[sl]=Nastavitve pisav, prikazanih na spletnih straneh
+Comment[sr]=Подешавање фонтова који се користе на веб страницама
+Comment[sr@Latn]=Podešavanje fontova koji se koriste na veb stranicama
+Comment[sv]=Anpassa teckensnitt som används på webbsidor
+Comment[ta]=வலைபக்கங்களில் பயன்படுத்தப்படும் எழுத்துருக்களை வடிவமை
+Comment[tg]=Танзими ҳарфҳои лозимӣ барои намоиши сафҳоти Вэб
+Comment[th]=ปรับแต่งแบบอักษรที่จะใช้กับหน้าเว็บ
+Comment[tr]=Web sayfalarında kullanılan yazıtipini buradan yapılandırın
+Comment[tt]=Säxifä bitlärendä qullanası yazu törlären caylaw
+Comment[uk]=Налаштування шрифтів для сторінок Тенет
+Comment[uz]=Veb-sahifalarida ishlatiladigan shriftlarni moslash
+Comment[uz@cyrillic]=Веб-саҳифаларида ишлатиладиган шрифтларни мослаш
+Comment[ven]=Dzudzanyani dzifontu dzo shumiswa kha masiatari a webu
+Comment[vi]=Cấu hình phông chữ sử dụng trên các trang mạng
+Comment[wa]=Apontyî les fontes eployeyes ezès pådjes waibe
+Comment[xh]=Qwlasela uhlobo lwamagama asebenziswe kumaphepha e web
+Comment[zh_CN]=配置网页所使用的字体
+Comment[zh_TW]=設定使用於網頁的字型
+Comment[zu]=Hlanganisela uhlobo lwamagama olusetshenziswa emakhasini e-web
+Keywords=konqueror,kfm,browser,html,web,www,fonts,charsets,character sets,encoding
+Keywords[be]=Вандроўнік,Сеціва,Шрыфт,Знаказборы,Знаказбор,konqueror,kfm,browser,html,web,www,fonts,charsets,character sets,encoding
+Keywords[bg]=уеб, шрифтове, страници, браузър, Интернет, konqueror, kfm, browser, html, web, www, fonts, charsets, character sets, encoding
+Keywords[bs]=konqueror,kfm,browser,html,web,www,fonts,charsets,character sets,encoding,preglednik,font,fontovi,skup znakova,kodni raspored
+Keywords[ca]=konqueror,kfm,navegador,html,web,www,lletres,caràcters.jocs de caràcters,codificació
+Keywords[cs]=Konqueror,Kfm,Prohlížeč,HTML,Web,WWW,Písma,Znakové sady,Kódování
+Keywords[csb]=konqueror,kfm,przezérnik,html,séc www,zestôw merków,kòdowanié
+Keywords[cy]=konqueror,kfm,porydd,html,gwe,www,ffontiau,setiau nodau,amgodiad
+Keywords[da]=konqueror,kfm,browser,HTML,net,www,skrifttyper,tegnsæt,indkodning
+Keywords[de]=Konqueror,kfm,Browser,HTML,Web,WWW,Schriften,Zeichensätze,Kodierung
+Keywords[el]=konqueror,kfm,περιηγητής,html,ιστός,www,γραμματοσειρές,σύνολα χαρακτήρων,σύνολα χαρακτήρων,κωδικοποίηση
+Keywords[eo]=Konkeranto,Kfm,TTT,HTML,WWW,tiparo,koloro,Javo,Javoskripto,kursoro,kursilo,ligo,referenco,bildo,signaro,kodo
+Keywords[es]=konqueror,kfm,navegador,html,web,www,tipos de letra,mapas de caracteres,codificación
+Keywords[et]=konqueror,kfm,veebilehitseja,html,veeb,www,fondid,kooditabel,kodeering
+Keywords[eu]=konqueror,kfm,arakatzailea,html,web,www,letra-tipoak,karaktere-multzoak, karaktere hobespenak,kodeketa
+Keywords[fa]=konqueror،kfm، مرورگر، زنگام، وب، www،قلمها، نویسه‌گان، نویسه‌گان،کدبندی
+Keywords[fi]=konqueror,kfm,selain,html,web,www,kirjasimet,merkistöt,koodaus
+Keywords[fr]=konqueror,kfm,navigateur,html,web,www,polices,couleurs,java,javascript,curseur,liens,images,jeu de caractères,caractères,codage,encodage
+Keywords[fy]=konqueror,kfm,browser,blêder,html,web,www,fonts,lettertypen,tekensets,karaktersamling,kodearring,ynternet
+Keywords[ga]=konqueror,kfm,brabhsálaí,html,gréasán,www,clónna,clófhoirne,tacair charachtair,ionchódú
+Keywords[gl]=konqueror,kfm,navegador,html,web,www,fontes,carácteres,conxunto de carácteres,codificación
+Keywords[he]=konqueror,kfm,דפדפן,html,web,www,אינטרנט,browser,web,fonts,charsets,character sets,encoding, גופנים,מערכי תווים,קידוד
+Keywords[hi]=कॉन्करर,केएफएम,ब्राउजर,एचटीएमएल,वेब,डब्ल्यूडब्ल्यूडब्ल्यू,फ़ॉन्ट्स,अक्षरमाला,अक्षर माला,एनकोडिंग
+Keywords[hr]=konqueror,kfm,browser,html,web,www,fonts,charsets,character sets,encoding,preglednik,fontovi,kodiranje,kodiranje zakova
+Keywords[hu]=Konqueror,kfm,böngésző,HTML,web,WWW,betűtípusok,karakterkészletek,betűkészletek,kódolás
+Keywords[is]=vafri,vefur,vefurinn,vefsíður,letur,litir,kóðun,stafatafla, bendill,myndir,www,html,stafir
+Keywords[it]=konqueror,kfm,browser,html,web,www,caratteri,colori,set di caratteri,charset,codifica
+Keywords[ja]=konqueror,kfm,ブラウザ,html,web,ウェブ,www,フォント,文字,文字セット,色,カラー,エンコーディング
+Keywords[km]=konqueror,kfm,កម្មវិធី​រុករក,html,បណ្ដាញ,វើលវ៉ាយវិប,ពុម្ពអក្សរ,ការ​អ៊ិនកូដ
+Keywords[lt]=konqueror,kfm,browser,html,web,www,fonts,colours,colors,charsets,character sets,encodingsets,encoding,narašymas,html,tinklalapis,tinklapis,www,šriftai,spalvos,simbolių rinkiniai,koduotė
+Keywords[lv]=iekarotājs,kfm,pārlūks,html,web,www,fonti,krāsojums,krāsas,java,javaskripts,kursors,saites,attēli,simbolukomplekti,simbolu komplekti,kodējums
+Keywords[mk]=konqueror,kfm,browser,html,web,www,fonts,charsets,character sets,encoding,прелистувач,веб,фонтови,знаковни множества,кодирање
+Keywords[mn]=Конкюрор,kfm,Хөтөч,HTML,Вэб,WWW,Бичиг,Тэмдэгт олонлог,Кодчилол
+Keywords[nb]=konqueror,kfm,nettleser,html,nettet,www,veven,verdensveven,Internett,skriftyper,skrifter,koding,tegnsett,tegnkoding
+Keywords[nds]=Konqueror,kfm,Nettkieker,browser,HTML,web,www,Schriftoorden,Tekensetten,Koderen
+Keywords[ne]=कन्क्वेरर,kfm, ब्राउजर,html, वेब,www, फन्टहरू, चारसेटहरू, क्यारेक्टर सेट, सङ्केतन
+Keywords[nl]=konqueror,kfm,browser,html,web,www,fonts,lettertypen,tekensets,karakterverzamelingen,codering,encoding,internet
+Keywords[nn]=Konqueror,KFM,nettlesar,HTML,verdsveven,WWW,skrifter,teiknsett,koding,teiknkoding
+Keywords[nso]=konqueror,kfm,seinyakisi,html,web,www,difonto,charsets,dipeakanyo tsa dihlaka,go khouta
+Keywords[pa]=ਕੋਨਕਿਉਰਰ,kfm,ਝਲਕਾਰਾ,html,web,www,ਫੋਂਟ, ਅੱਖਰ-ਸੈਟ, ਅੱਖਰ ਸੈਟ, ਇੰਕੋਡਿੰਗ
+Keywords[pl]=konqueror,kfm,przeglądarka,html,sieć www,zestawy znaków,kodowanie
+Keywords[pt]=konqueror,kfm,navegador,html,web,www,tipos de letra,fontes,cores,java,javascript,cursor,ligações,imagens,charsets,mapas de caracteres,codificação
+Keywords[pt_BR]=konqueror,kfm,navegador,html,web,WWW,fontes,conjuntos de caracteres,codificação
+Keywords[ro]=konqueror,kfm,navigator,browser,html,web,www,fonturi,culori,java,javascript,cursor,legături,imagini,set de caractere,codare
+Keywords[rw]= Konqueror,kfm,mucukumbuzi,html,urubuga,www,imyandikire, itsinda-nyuguti, amatsinda y'inyuguti,gusobeka
+Keywords[se]=Konqueror,kfm,fierpmádatlogan,html,web,www,fonttat,mearkarájut,koden
+Keywords[sk]=konqueror,kfm,prehliadač,html,web,www,písma,farby,znakové sady,kódovanie
+Keywords[sl]=konqueror,kfm,brskalnik,html,splet,www,pisave,nabori znakov,znakovni nabori,kodiranje
+Keywords[sr]=konqueror,kfm,прегледач,html,web,www,фонтови,боје,java,јавасцрипт,показивач,везе,слике,кодни распоред,скуп знакова,кодирање
+Keywords[sr@Latn]=konqueror,kfm,pregledač,html,web,www,fontovi,boje,java,javascript,pokazivač,veze,slike,kodni raspored,skup znakova,kodiranje
+Keywords[sv]=konqueror,kfm,webbläsare,html,webb,www,teckensnitt,färger,java,javaskript,länkar,bilder,kodning,teckenuppsättningar
+Keywords[ta]=கான்கொரர், கோப்பு மேலாளர், html,வலை, www,எழுத்துரு, எழுத்தமைப்பு முறை,எழுத்தமைப்பு முறை, குறியீடு முறை
+Keywords[th]=คอนเควอร์เรอร์,kfm,บราวเซอร์,html,เว็บ,www,แบบอักษร,อักขระ,ชุดอักขระ,การเข้ารหัส
+Keywords[tr]=konqueror,kfm,tarayıcı,html,web,www,yazı tipleri,kodlama
+Keywords[uk]=konqueror,kfm,навігатор,html,шрифти,Тенета,www,набори символів,кодування
+Keywords[uz]=konqueror,kfm,html,www,brauzer,veb,shriftlar,belgilar toʻplami,kodlash usuli
+Keywords[uz@cyrillic]=konqueror,kfm,html,www,браузер,веб,шрифтлар,белгилар тўплами,кодлаш усули
+Keywords[ven]=konqueror,kfm,buronza,html,webu,www,dzifontu,mivhala,mivhala,java,manwalwa a java,cursor,vhukwamani,zwifanyiso,tshasete,mavhekanyele a muanewa,uinikhouda
+Keywords[vi]=konqueror,kfm,trình duyệt,html,web,www,phông chữ,ký tự,bảng ký tự,mã ký tự
+Keywords[wa]=konqueror,kfm,betchteu,html,waibe,www,fontes,ecôdaedjes,ecôdaedje
+Keywords[xh]=konqueror,kfm,umkhangeli zincwadi,html,web,www,imigca, amaqela abasebenzisi,encoding
+Keywords[zh_CN]=konqueror,kfm,browser,html,web,www,fonts,charsets,character sets,encoding,浏览器,网页,字体,字符集,编码
+Keywords[zh_TW]=konqueror,kfm,browser,html,web,www,fonts,charsets,character sets,征服家,字元,字元集,編碼,瀏覽器,字型,網頁
+Keywords[zu]=konqueror,kfm,umcingi,html,web,www,izinhlobo zamagama,charsets,amaqoqo ezimpawu,ukubhala ngekhodi
+
+Categories=Qt;KDE;X-KDE-settings-webbrowsing;
diff --git a/kcontrol/konqhtml/khtml_java_js.desktop b/kcontrol/konqhtml/khtml_java_js.desktop
new file mode 100644
index 000000000..7ba252b91
--- /dev/null
+++ b/kcontrol/konqhtml/khtml_java_js.desktop
@@ -0,0 +1,211 @@
+[Desktop Entry]
+Type=Application
+DocPath=kcontrol/khtml/index.html#kbrowse-java
+Icon=konqueror
+Exec=kcmshell khtml_java_js
+
+
+X-KDE-Library=konqhtml
+X-KDE-FactoryName=khtml_java_js
+
+Name=Java & JavaScript
+Name[af]=Java & Javaskrip
+Name[ar]=Java و JavaScript
+Name[az]=Java və JavaScript
+Name[be]=Java і JavaScript
+Name[bg]=Java и JavaScript
+Name[bn]=জাভা এবং জাভাস্ক্রিপ্ট
+Name[bs]=JavaScript i Java
+Name[ca]=Java i JavaScript
+Name[cs]=Java a JavaScript
+Name[csb]=Java ë JavaScript
+Name[cy]=Java a JavaScript
+Name[eo]=Ĝavo kaj Ĝavoskripto
+Name[es]=Java y JavaScript
+Name[et]=Java ja JavaScript
+Name[eu]=Java eta JavaScript
+Name[fa]=جاوا و جاوااسکریپت
+Name[fi]=Java ja JavaScript
+Name[fy]=Java en JavaSkript
+Name[gl]=Java e JavaScript
+Name[he]=JavaScript-ו Java
+Name[hi]=जावा एवं जावा-स्क्रिप्ट
+Name[hr]=Java i JavaScript
+Name[hu]=Java/Javascript
+Name[is]=Java og JavaScript
+Name[it]=Java e JavaScript
+Name[ka]=Java და JavaScript
+Name[kk]=Java және JavaScript
+Name[ko]=자바와 자바스크립트
+Name[lo]=ແຟ້່ມໂພສ໌ສຄລິບແລະ PDF
+Name[lt]=Java ir JavaScript
+Name[mk]=Java и JavaScript
+Name[mt]=Java u JavaScript
+Name[nb]=Java og JavaScript
+Name[ne]=जाभा र जाभा स्क्रिप्ट
+Name[nl]=Java en JavaScript
+Name[nn]=Java og JavaScript
+Name[nso]=Java & Setlankana sa Java
+Name[pa]=Java ਅਤੇ ਜਾਵਾ ਸਕਰਿਪਟ
+Name[pl]=Java i JavaScript
+Name[pt]=Java e JavaScript
+Name[ro]=Java și JavaScript
+Name[ru]=Java и JavaScript
+Name[se]=Java ja Javascript
+Name[sl]=Java in javascript
+Name[ss]=I-Java & JavaScript
+Name[sv]=Java och Javaskript
+Name[ta]=ஜாவா & ஜாவா எழுத்தாக்கம்
+Name[te]=జావా & జావాస్క్రిప్ట్
+Name[tg]=Java ва JavaScript
+Name[th]=จาวาและจาวาสคริปต์
+Name[tr]=Java ve JavaScript
+Name[tt]=Java belän JavaScript
+Name[uz]=Java va JavaScript
+Name[uz@cyrillic]=Java ва JavaScript
+Name[wa]=Java eyet JavaScript
+Name[zh_CN]=Java 和 JavaScript
+Name[zh_TW]=Java 與 JavaScript
+Comment=Configure the behavior of Java and JavaScript
+Comment[af]=Konfigureer die gedrag van Java en Javaskrip
+Comment[ar]=إعداد سلوك Java و JavaScript
+Comment[be]=Настаўленні Java і JavaScript
+Comment[bg]=Настройване на Java и JavaScript
+Comment[bn]=জাভা এবং জাভাস্ক্রিপ্ট-এর আচরণ কনফিগার করুন
+Comment[br]=Kefluniañ emzalc'h Java ha JavaScript
+Comment[bs]=Podesite ponašanje JavaScript i Java-e
+Comment[ca]=Configura el comportament de Java i JavaScript
+Comment[cs]=Nastavení chování Javy a Javascriptu
+Comment[csb]=Kònfigùracëjô dzejaniô Javë ë JavaScriptu
+Comment[cy]=Ffurfweddu ymddygiad Java a JavaScript
+Comment[da]=Indstil hvordan JavaScript og Java opfører sig
+Comment[de]=Verhalten von Java und JavaScript festlegen
+Comment[el]=Ρυθμίστε τη συμπεριφορά της Java και της JavaScript
+Comment[en_GB]=Configure the behaviour of Java and JavaScript
+Comment[eo]=Agordo la konduton de Ĝavo kaj Ĝavoskripto
+Comment[es]=Configuración del comportamiento de Java y JavaScript
+Comment[et]=Java ja JavaScripti käitumise seadistamine
+Comment[eu]=Konfiguratu Java eta JavaScripten portaera
+Comment[fa]=پیکربندی رفتار جاوا و جاوااسکریپت
+Comment[fi]=Javan ja JavaScriptin asetukset
+Comment[fr]=Configuration du comportement de Java et JavaScript
+Comment[fy]=Hjir kinne jo it gedrach fan Java en JavaSkript ynstelle
+Comment[ga]=Cumraigh oibriú Java agus JavaScript
+Comment[gl]=Configurar o comportamento de Java e JavaScript
+Comment[he]=שינוי הגדרות Java ו־JavaScript
+Comment[hi]=जावा एवं जावा-स्क्रिप्ट कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje ponašanja Jave i JavaScripta
+Comment[hu]=A Java és a Javascript beállításai
+Comment[is]=Stilla hegðun Java og JavaScript
+Comment[it]=Configura il comportamento di Java e JavaScript
+Comment[ja]=Java と JavaScript の挙動を設定
+Comment[ka]=Java და JavaScript -ის ქცევის კონფიგურაცია
+Comment[kk]=Java және JavaScript қасиеттерін баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ឥរិយាបថ​របស់ Java និង JavaScript
+Comment[ko]=자바와 자바스크립트 행동 설정
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງການທຳງານ ຂອງເຄື່ອງມືການຈັດເຊສຊັນໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite konfigūruoti Java bei JavaScript elgseną
+Comment[lv]=Šeit Jūs varat konfigurēt Java un JavaScript izturēšanos
+Comment[mk]=Конфигурирајте го однесувањето на Java и JavaScript
+Comment[mn]=Java ба JavaScript-н байдлыг тогтоох
+Comment[ms]=Konfigur kelakuan Java dan JavaScript
+Comment[mt]=Ikkonfigura l-imġieba ta' Java u JavaScript
+Comment[nb]=Innstillinger for Java og JavaScript
+Comment[nds]=Dat Bedregen vun Java un JavaSkript hier instellen
+Comment[ne]=जाभा र जाभा स्क्रिप्टकको व्यवहार कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u het gedrag van Java en JavaScript instellen
+Comment[nn]=Innstillingar for Java og JavaScript
+Comment[nso]=Beakanya maitshwaro a Java le setlankana sa Java
+Comment[pa]=Java ਅਤੇ ਜਾਵਾ-ਸਕਰਿਪਟ ਦੇ ਵਿਹਾਰ ਦੀ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja działania Javy i JavaScriptu
+Comment[pt]=Configurar o comportamento do Java e do JavaScript
+Comment[pt_BR]=Configura o comportamento do Java e JavaScript
+Comment[ro]=Configurează comportamentul Java și JavaScript
+Comment[ru]=Настройка поведения Java и JavaScript
+Comment[rw]=Kuboneza imyitwarire ya Java na JavaScript
+Comment[se]=Java ja Javascript-heivehusat
+Comment[sk]=Nastavenie správania jazykov JavaScript a Java
+Comment[sl]=Nastavitve obnašanja jave in javascripta
+Comment[sr]=Подешавање понашања Java-е и JavaScript-а
+Comment[sr@Latn]=Podešavanje ponašanja Java-e i JavaScript-a
+Comment[sv]=Anpassa beteendet hos Java och Javaskript
+Comment[ta]=ஜாவா மற்றும் ஜாவா எழுத்தாக்கத்தின் இயக்கத்தை வடிவமைக்க முடியும்.
+Comment[tg]=Танзими нафъи рафтори Java ва JavaScript
+Comment[th]=ปรับแต่งพฤติกรรมของจาวาและจาวาสคริปต์
+Comment[tr]=Java ve JavaScript ayarlarını buradan hazırlayın
+Comment[tt]=Java belän JavaScript caylaw
+Comment[uk]=Налаштування поведінки Java та JavaScript
+Comment[uz]=Java va JavaScript xususiyatlarini moslash
+Comment[uz@cyrillic]=Java ва JavaScript хусусиятларини мослаш
+Comment[ven]=Dzudzanyani maitele a Java na Javascript
+Comment[vi]=Cấu hình cách hoạt động của Java và JavaScript
+Comment[wa]=Apontyî li dujhance pol Java eyet l' JavaScript
+Comment[xh]=Qwalasela ukuziphatha kwe Java ne JavaScript
+Comment[zh_CN]=配置 Java 和 JavaScript 的行为
+Comment[zh_TW]=設定 Java 與 JavaScript 的行為
+Comment[zu]=Hlanganisela ukuthi i-Java kanye ne-JavaScript iziphathe kanjani
+Keywords=konqueror,kfm,browser,html,web,www,java,javascript
+Keywords[be]=Вандроўнік,Сеціва,Сцэнар,konqueror,kfm,browser,html,web,www,java,javascript
+Keywords[bg]=Джава, Джава скрипт, скрипт, konqueror, kfm, browser, html, web, www, java, javascript
+Keywords[br]=konqueror,kfm,furcher,html,web,gwiad,java,javascript
+Keywords[ca]=konqueror,kfm,navegador,html,web,www,java,javascript
+Keywords[cs]=Konqueror,Kfm,Prohlížeč,HTML,Web,WWW,Java,JavaScript
+Keywords[csb]=konqueror,kfm,przezérnik,html,séc www,www,java,javascript
+Keywords[cy]=konqueror,kfm,porydd,html,gwe,www,java,javascript
+Keywords[da]=konqueror,kfm,browser,HTML,net,www,java,javascript
+Keywords[de]=Konqueror,kfm,Browser,HTML,Web,WWW,Java,JavaScript
+Keywords[el]=konqueror,kfm,περιηγητής,html,ιστός,www,java,javascript
+Keywords[eo]=Konkeranto,Kfm,TTT,HTML,WWW,tiparo,koloro,Javo,Javoskripto,kursoro,kursilo,ligo,referenco,bildo,signaro,kodo
+Keywords[es]=konqueror,kfm,navegador,html,web,wwwjava,javascript
+Keywords[et]=konqueror,kfm,veebilehitseja,html,veeb,www,java,javascript
+Keywords[eu]=konqueror,kfm,arakatzailea,html,web,www,java,javascript
+Keywords[fa]=konqueror، kfm، مرورگر، زنگام، وب، www، جاوا، جاوااسکریپت
+Keywords[fi]=konqueror,kfm,selain,html,web,www,java,javascript
+Keywords[fr]=konqueror,kfm,navigateur,html,web,www,polices,couleurs,java,javascript,curseur,liens,images,jeu de caractères,caractères,codage,encodage
+Keywords[fy]=konqueror,kfm,browser,blêder,html,web,www,java,javaskript,ynternet
+Keywords[ga]=konqueror,kfm,brabhsálaí,html,gréasán,www,java,javascript
+Keywords[gl]=konqueror,kfm,navegador,html,web,www,java,javascript
+Keywords[he]=konqueror,kfm,דפדפן,html,אינטרנט,www,java,javascript,ג'אווה, browser,web,www,java,javascript
+Keywords[hi]=कॉन्करर,केएफएम,ब्राउज़र,एचटीएमएल,वेब,डब्ल्यूडब्ल्यूडब्ल्यू.जावा,जावा-स्क्रिप्ट
+Keywords[hr]=konqueror,kfm,browser,html,web,www,java,javascript,preglednik
+Keywords[hu]=Konqueror,kfm,böngésző,HTML,web,WWW,Java,Javascript
+Keywords[is]=konqueror,kfm,browser,html,web,www,java,javascript,vafri
+Keywords[ja]=konqueror,kfm,ブラウザ,html,web,ウェブ,www,java,javascript
+Keywords[km]=konqueror,kfm,កម្មវិធី​រុករក,html,វិប,វើលវ៉ាយវិប,java,javascript
+Keywords[lt]=konqueror,kfm,browser,html,web,www,java,javascript, naršyklė,tinklalapiai, žiniatinklis
+Keywords[lv]=iekarotājs,kfm,pārlūks,html,web,www,java,javaskripts
+Keywords[mk]=konqueror,kfm,browser,html,web,www,java,javascript,прелистувач,веб
+Keywords[mn]=Конкюрор,kfm,Хөтөч,HTML,Веб,WWW,Java,JavaScript
+Keywords[nb]=konqueror,kfm,html,nettet,www,java,javascript,nettleser,Internett
+Keywords[nds]=Konqueror,kfm,browser,Nettkieker,HTML,web,www,Java,JavaScript
+Keywords[ne]=कन्क्वेरर, kfm, ब्राउजर, html, वेब, www, जाभा, जाभास्क्रिप्ट
+Keywords[nl]=konqueror,kfm,browser,html,web,www,java,javascript,internet
+Keywords[nn]=Konqueror,KFM,nettlesar,HTML,verdsveven,WWW,Java,JavaScript
+Keywords[nso]=konqueror,kfm,seinyakisi,html,web,www,java,setlankana sa java
+Keywords[pa]=ਕੋਨਕਿਉਰਰ,kfm,ਝਲਕਾਰਾ,html,web,www,java,javascript,ਜਾਵਾ
+Keywords[pl]=konqueror,kfm,przeglądarka,html,sieć www,www,java,javascript
+Keywords[pt]=konqueror,kfm,navegador,html,web,www,java,javascript
+Keywords[pt_BR]=konqueror,kfm,navegador,html,web,WWW,java,javascript
+Keywords[ro]=konqueror,kfm,navigator,browser,html,web,www,java,javascript
+Keywords[rw]= Konqueror,kfm,mucukumbuzi,html,urubuga,www,java,javascript
+Keywords[se]=konqueror,kfm,fierpmádatlogan,html,web,www,java,javascript
+Keywords[sk]=konqueror,kfm,prehliadač,html,web,www,java,javascript
+Keywords[sl]=konqueror,kfm,brskalnik,html,splet,www,java,javascript
+Keywords[sr]=konqueror,kfm,прегледач,html,web,www,java,javascript
+Keywords[sr@Latn]=konqueror,kfm,pregledač,html,web,www,java,javascript
+Keywords[sv]=konqueror,kfm,webbläsare,html,webb,www,teckensnitt,färger,java,javaskript,länkar,bilder,kodning,teckenuppsättningar
+Keywords[ta]=கான்கொரர்,kfm,உலாவி,html,வலை,www,ஜாவா,ஜாவா எழுத்தாக்கம்
+Keywords[th]=คอนเควอร์เรอร์,kfm,บราวเซอร์,html,เว็บ,www,จาวา,จาวาสคริปต์
+Keywords[tr]=konqueror,kfm,tarayıcı,html,web,www,java,javascript
+Keywords[uk]=konqueror,kfm,навігатор,html,web,Тенета,java,javascript,www
+Keywords[uz]=konqueror,kfm,brauzer,html,veb,www,java,javascript
+Keywords[uz@cyrillic]=konqueror,kfm,браузер,html,веб,www,java,javascript
+Keywords[ven]=konqueror,kfm,buronza,html,webu,www,dzifontu,mivhala,mivhala,java,manwalwa a java,cursor,vhukwamani,zwifanyiso,tshasete,mavhekanyele a muanewa,uinikhouda
+Keywords[vi]=konqueror,kfm,trình duyệt,html,web,www,java,javascript
+Keywords[wa]=konqueror,kfm,betchteu,html,waibe,waibes,www,java,javascript
+Keywords[xh]=konqueror,kfm,umkhangeli zincwadi,html,web, www,java,okushicilelwe phantsi kwe java
+Keywords[zh_CN]=konqueror,kfm,browser,html,web,www,java,javascript,浏览器
+Keywords[zh_TW]=konqueror,kfm,browser,html,web,www,java,javascript,征服家,瀏覽器,網頁
+Keywords[zu]=konqueror,kfm,umcingi,html,web,www,java,javascript
+
+Categories=Qt;KDE;X-KDE-settings-webbrowsing;
diff --git a/kcontrol/konqhtml/khttpoptdlg.cpp b/kcontrol/konqhtml/khttpoptdlg.cpp
new file mode 100644
index 000000000..e6c9a95ba
--- /dev/null
+++ b/kcontrol/konqhtml/khttpoptdlg.cpp
@@ -0,0 +1,81 @@
+// File khttpoptdlg.cpp by Jacek Konieczny <jajcus@zeus.posl.gliwice.pl>
+// Port to KControl by David Faure <faure@kde.org>
+
+#include <qlayout.h> //CT
+
+#include <klocale.h>
+#include <kglobal.h>
+#include "khttpoptdlg.h"
+
+
+KHTTPOptions::KHTTPOptions(KConfig *config, QString group, QWidget *parent, const char *name)
+ : KCModule( parent, name ), m_pConfig(config), m_groupname(group)
+{
+ QVBoxLayout *lay = new QVBoxLayout(this, 10, 5);
+
+ lay->addWidget( new QLabel(i18n("Accept languages:"), this) );
+
+ le_languages = new QLineEdit(this);
+ lay->addWidget( le_languages );
+ connect(le_languages, SIGNAL(textChanged(const QString&)),
+ this, SLOT(slotChanged()));
+
+ lay->addSpacing(10);
+ lay->addWidget( new QLabel(i18n("Accept character sets:"), this) );
+
+ le_charsets = new QLineEdit(this);
+ lay->addWidget( le_charsets );
+ connect(le_charsets, SIGNAL(textChanged(const QString&)),
+ this, SLOT(slotChanged()));
+
+ lay->addStretch(10);
+
+ // defaultCharsets = QString("utf-8 ")+klocale->charset()+" iso-8859-1";
+ defaultCharsets = QString("utf-8 ")+" iso-8859-1"; // TODO
+
+ // finaly read the options
+ load();
+}
+
+void KHTTPOptions::load()
+{
+ load( false );
+}
+
+void KHTTPOptions::load( bool useDefaults )
+{
+ QString tmp;
+
+ m_pConfig->setReadDefaults( useDefaults );
+
+ m_pConfig->setGroup( "Browser Settings/HTTP" );
+ tmp = m_pConfig->readEntry( "AcceptLanguages",KGlobal::locale()->languageList().join(","));
+ le_languages->setText( tmp );
+ tmp = m_pConfig->readEntry( "AcceptCharsets",defaultCharsets);
+ le_charsets->setText( tmp );
+
+ emit changed( useDefaults );
+
+}
+
+void KHTTPOptions::save()
+{
+ m_pConfig->setGroup( "Browser Settings/HTTP" );
+ m_pConfig->writeEntry( "AcceptLanguages", le_languages->text());
+ m_pConfig->writeEntry( "AcceptCharsets", le_charsets->text());
+ m_pConfig->sync();
+}
+
+void KHTTPOptions::defaults()
+{
+ load( true );
+}
+
+
+void KHTTPOptions::slotChanged()
+{
+ emit changed(true);
+}
+
+
+#include "khttpoptdlg.moc"
diff --git a/kcontrol/konqhtml/khttpoptdlg.h b/kcontrol/konqhtml/khttpoptdlg.h
new file mode 100644
index 000000000..36e3650b4
--- /dev/null
+++ b/kcontrol/konqhtml/khttpoptdlg.h
@@ -0,0 +1,49 @@
+// khttpoptdlg.h - extra HTTP configuration by Jacek Konieczy <jajcus@zeus.polsl.gliwice.pl>
+#ifndef __KHTTPOPTDLG_H
+#define __KHTTPOPTDLG_H
+
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <qstring.h>
+
+#include <kcmodule.h>
+#include <kconfig.h>
+
+
+/**
+* Dialog for configuring HTTP Options like charset and language negotiation
+* and assuming that file got from HTTP is HTML if no Content-Type is given
+*/
+class KHTTPOptions : public KCModule
+{
+Q_OBJECT
+ public:
+ KHTTPOptions(KConfig *config, QString group, QWidget *parent = 0L, const char *name = 0L);
+
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+
+ private:
+
+ KConfig *m_pConfig;
+ QString m_groupname;
+
+ // Acceptable languages "LANG" - locale selected languages
+ QLabel *lb_languages;
+ QLineEdit *le_languages;
+
+ // Acceptable charsets "CHARSET" - locale selected charset
+ QLabel *lb_charsets;
+ QLineEdit *le_charsets;
+
+ QString defaultCharsets;
+
+private slots:
+ void slotChanged();
+
+};
+
+#endif // __KHTTPOPTDLG_H
diff --git a/kcontrol/konqhtml/main.cpp b/kcontrol/konqhtml/main.cpp
new file mode 100644
index 000000000..b1d459b00
--- /dev/null
+++ b/kcontrol/konqhtml/main.cpp
@@ -0,0 +1,171 @@
+/*
+ * main.cpp
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ * Copyright (c) 2000 Daniel Molkentin <molkentin@kde.org>
+ *
+ * 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 <unistd.h>
+
+#include <kapplication.h>
+#include <dcopclient.h>
+#include <qtabwidget.h>
+#include <qlayout.h>
+
+#include "jsopts.h"
+#include "javaopts.h"
+#include "pluginopts.h"
+#include "appearance.h"
+#include "htmlopts.h"
+#include "filteropts.h"
+
+#include "main.h"
+#include <kaboutdata.h>
+#include "main.moc"
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_khtml_behavior(QWidget *parent, const char *name)
+ {
+ KConfig *c = new KConfig( "konquerorrc", false, false );
+ return new KMiscHTMLOptions(c, "HTML Settings", parent, name);
+ }
+
+ KDE_EXPORT KCModule *create_khtml_fonts(QWidget *parent, const char *name)
+ {
+ KConfig *c = new KConfig( "konquerorrc", false, false );
+ return new KAppearanceOptions(c, "HTML Settings", parent, name);
+ }
+
+ KDE_EXPORT KCModule *create_khtml_java_js(QWidget *parent, const char* /*name*/)
+ {
+ KConfig *c = new KConfig( "konquerorrc", false, false );
+ return new KJSParts(c, parent, "kcmkonqhtml");
+ }
+
+ KDE_EXPORT KCModule *create_khtml_plugins(QWidget *parent, const char *name)
+ {
+ KConfig *c = new KConfig( "konquerorrc", false, false );
+ return new KPluginOptions(c, "Java/JavaScript Settings", parent, name);
+ }
+
+ KDE_EXPORT KCModule *create_khtml_filter(QWidget *parent, const char *name )
+ {
+ KConfig *c = new KConfig( "khtmlrc", false, false );
+ return new KCMFilter(c, "Filter Settings", parent, name);
+ }
+}
+
+
+KJSParts::KJSParts(KConfig *config, QWidget *parent, const char *name)
+ : KCModule(parent, name), mConfig(config)
+{
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmkonqhtml"), I18N_NOOP("Konqueror Browsing Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 1999 - 2001 The Konqueror Developers"));
+
+ about->addAuthor("Waldo Bastian",0,"bastian@kde.org");
+ about->addAuthor("David Faure",0,"faure@kde.org");
+ about->addAuthor("Matthias Kalle Dalheimer",0,"kalle@kde.org");
+ about->addAuthor("Lars Knoll",0,"knoll@kde.org");
+ about->addAuthor("Dirk Mueller",0,"mueller@kde.org");
+ about->addAuthor("Daniel Molkentin",0,"molkentin@kde.org");
+ about->addAuthor("Wynn Wilkes",0,"wynnw@caldera.com");
+
+ about->addCredit("Leo Savernik",I18N_NOOP("JavaScript access controls\n"
+ "Per-domain policies extensions"),
+ "l.savernik@aon.at");
+
+ setAboutData( about );
+
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ tab = new QTabWidget(this);
+ layout->addWidget(tab);
+
+ // ### the groupname is duplicated in KJSParts::save
+ java = new KJavaOptions( config, "Java/JavaScript Settings", this, name );
+ tab->addTab( java, i18n( "&Java" ) );
+ connect( java, SIGNAL( changed( bool ) ), SIGNAL( changed( bool ) ) );
+
+ javascript = new KJavaScriptOptions( config, "Java/JavaScript Settings", this, name );
+ tab->addTab( javascript, i18n( "Java&Script" ) );
+ connect( javascript, SIGNAL( changed( bool ) ), SIGNAL( changed( bool ) ) );
+}
+
+KJSParts::~KJSParts()
+{
+ delete mConfig;
+}
+
+void KJSParts::load()
+{
+ javascript->load();
+ java->load();
+}
+
+
+void KJSParts::save()
+{
+ javascript->save();
+ java->save();
+
+ // delete old keys after they have been migrated
+ if (javascript->_removeJavaScriptDomainAdvice
+ || java->_removeJavaScriptDomainAdvice) {
+ mConfig->setGroup("Java/JavaScript Settings");
+ mConfig->deleteEntry("JavaScriptDomainAdvice");
+ javascript->_removeJavaScriptDomainAdvice = false;
+ java->_removeJavaScriptDomainAdvice = false;
+ }
+
+ mConfig->sync();
+
+ // Send signal to konqueror
+ // Warning. In case something is added/changed here, keep kfmclient in sync
+ QByteArray data;
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ kapp->dcopClient()->send( "konqueror*", "KonquerorIface", "reparseConfiguration()", data );
+}
+
+
+void KJSParts::defaults()
+{
+ javascript->defaults();
+ java->defaults();
+}
+
+QString KJSParts::quickHelp() const
+{
+ return i18n("<h2>JavaScript</h2>On this page, you can configure "
+ "whether JavaScript programs embedded in web pages should "
+ "be allowed to be executed by Konqueror."
+ "<h2>Java</h2>On this page, you can configure "
+ "whether Java applets embedded in web pages should "
+ "be allowed to be executed by Konqueror."
+ "<br><br><b>Note:</b> Active content is always a "
+ "security risk, which is why Konqueror allows you to specify very "
+ "fine-grained from which hosts you want to execute Java and/or "
+ "JavaScript programs." );
+}
+
+
diff --git a/kcontrol/konqhtml/main.h b/kcontrol/konqhtml/main.h
new file mode 100644
index 000000000..20f461fa2
--- /dev/null
+++ b/kcontrol/konqhtml/main.h
@@ -0,0 +1,60 @@
+/*
+ * main.h
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ * Copyright (c) 2000 Daniel Molkentin <molkentin@kde.org>
+ *
+ * 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.
+ */
+
+
+#ifndef __MAIN_H__
+#define __MAIN_H__
+
+#include <kcmodule.h>
+
+class KJavaOptions;
+class KJavaScriptOptions;
+
+class QTabWidget;
+
+class KJSParts : public KCModule
+{
+ Q_OBJECT
+
+public:
+
+ KJSParts(KConfig *config,QWidget *parent, const char *name);
+ virtual ~KJSParts();
+
+ void load();
+ void save();
+ void defaults();
+ QString quickHelp() const;
+
+
+private:
+ QTabWidget *tab;
+
+ KJavaScriptOptions *javascript;
+ KJavaOptions *java;
+
+ KConfig *mConfig;
+};
+
+#endif
diff --git a/kcontrol/konqhtml/nsconfigwidget.ui b/kcontrol/konqhtml/nsconfigwidget.ui
new file mode 100644
index 000000000..d772595c2
--- /dev/null
+++ b/kcontrol/konqhtml/nsconfigwidget.ui
@@ -0,0 +1,273 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>NSConfigWidget</class>
+<author>Stefan Schimanski &lt;1Stein@gmx.de&gt;</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>NSConfigWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>458</width>
+ <height>373</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Netscape Plugin Config</string>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>TabWidget2</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Scan</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>scanButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Scan for New Plugins</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click here to scan for newly installed Netscape plugins now.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>scanAtStartup</cstring>
+ </property>
+ <property name="text">
+ <string>Scan for new plugins at &amp;KDE startup</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this option is enabled, KDE will look for new Netscape plugins every time it starts up. This makes it easier for you if you often install new plugins, but it may also slow down KDE startup. You might want to disable this option, especially if you seldom install plugins.</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>300</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>Scan Folders</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>dirRemove</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="2">
+ <property name="name">
+ <cstring>dirNew</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>dirEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="mode" stdset="0">
+ <number>18</number>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="2">
+ <property name="name">
+ <cstring>dirDown</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Do&amp;wn</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="2">
+ <property name="name">
+ <cstring>dirUp</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Up</string>
+ </property>
+ </widget>
+ <widget class="KListBox" row="1" column="0" rowspan="4" colspan="2">
+ <property name="name">
+ <cstring>dirList</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <spacer row="4" column="2">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Plugins</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView" row="1" column="0">
+ <column>
+ <property name="text">
+ <string>Information</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Value</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>pluginList</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can see a list of the Netscape plugins KDE has found.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>useArtsdsp</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Use a&amp;rtsdsp to pipe plugin sound through aRts</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<includes>
+ <include location="global" impldecl="in declaration">klocale.h</include>
+ <include location="global" impldecl="in declaration">kurlrequester.h</include>
+ <include location="global" impldecl="in declaration">klistbox.h</include>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>qwidget.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klistbox.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/konqhtml/pluginopts.cpp b/kcontrol/konqhtml/pluginopts.cpp
new file mode 100644
index 000000000..7fec6f9d3
--- /dev/null
+++ b/kcontrol/konqhtml/pluginopts.cpp
@@ -0,0 +1,659 @@
+// (c) 2002-2003 Leo Savernik, per-domain settings
+// (c) 2001, Daniel Naber, based on javaopts.cpp
+// (c) 2000 Stefan Schimanski <1Stein@gmx.de>, Netscape parts
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <qlayout.h>
+#include <qprogressdialog.h>
+#include <qregexp.h>
+#include <qslider.h>
+#include <qvgroupbox.h>
+#include <qwhatsthis.h>
+
+#include <dcopclient.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kfiledialog.h>
+#include <kiconloader.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kprocio.h>
+#include <kstandarddirs.h>
+#include <kurlrequester.h>
+
+#include "htmlopts.h"
+#include "pluginopts.h"
+#include "policydlg.h"
+
+
+// == class PluginPolicies =====
+
+PluginPolicies::PluginPolicies(KConfig* config, const QString &group, bool global,
+ const QString &domain) :
+ Policies(config,group,global,domain,"plugins.","EnablePlugins") {
+}
+
+PluginPolicies::~PluginPolicies() {
+}
+
+// == class KPluginOptions =====
+
+KPluginOptions::KPluginOptions( KConfig* config, QString group, QWidget *parent,
+ const char *)
+ : KCModule( parent, "kcmkonqhtml" ),
+ m_pConfig( config ),
+ m_groupname( group ),
+ m_nspluginscan (0),
+ global_policies(config,group,true)
+{
+ QVBoxLayout* toplevel = new QVBoxLayout( this, 0, KDialog::spacingHint() );
+
+ /**************************************************************************
+ ******************** Global Settings *************************************
+ *************************************************************************/
+ QVGroupBox* globalGB = new QVGroupBox( i18n( "Global Settings" ), this );
+ toplevel->addWidget( globalGB );
+ enablePluginsGloballyCB = new QCheckBox( i18n( "&Enable plugins globally" ), globalGB );
+ enableHTTPOnly = new QCheckBox( i18n( "Only allow &HTTP and HTTPS URLs for plugins" ), globalGB );
+ enableUserDemand = new QCheckBox( i18n( "&Load plugins on demand only" ), globalGB );
+ priorityLabel = new QLabel(i18n("CPU priority for plugins: %1").arg(QString::null), globalGB);
+ priority = new QSlider(5, 100, 5, 100, Horizontal, globalGB);
+ connect( enablePluginsGloballyCB, SIGNAL( clicked() ), this, SLOT( slotChanged() ) );
+ connect( enablePluginsGloballyCB, SIGNAL( clicked() ), this, SLOT( slotTogglePluginsEnabled() ) );
+ connect( enableHTTPOnly, SIGNAL( clicked() ), this, SLOT( slotChanged() ) );
+ connect( enableUserDemand, SIGNAL( clicked() ), this, SLOT( slotChanged() ) );
+ connect( priority, SIGNAL( valueChanged(int) ), this, SLOT( slotChanged() ) );
+ connect( priority, SIGNAL( valueChanged(int) ), this, SLOT( updatePLabel(int) ) );
+
+ QFrame *hrule = new QFrame(globalGB);
+ hrule->setFrameStyle(QFrame::HLine | QFrame::Sunken);
+ hrule->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::Fixed);
+
+ /**************************************************************************
+ ********************* Domain-specific Settings ***************************
+ *************************************************************************/
+ QPushButton *domainSpecPB = new QPushButton(i18n("Domain-Specific Settin&gs"),
+ globalGB);
+ domainSpecPB->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
+ connect(domainSpecPB,SIGNAL(clicked()),SLOT(slotShowDomainDlg()));
+
+ domainSpecificDlg = new KDialogBase(KDialogBase::Swallow,
+ i18n("Domain-Specific Policies"),KDialogBase::Close,
+ KDialogBase::Close,this,"domainSpecificDlg", true);
+
+ domainSpecific = new PluginDomainListView(config,group,this,domainSpecificDlg);
+ domainSpecific->setMinimumSize(320,200);
+ connect(domainSpecific,SIGNAL(changed(bool)),SLOT(slotChanged()));
+
+ domainSpecificDlg->setMainWidget(domainSpecific);
+
+ /**************************************************************************
+ ********************** WhatsThis? items **********************************
+ *************************************************************************/
+ QWhatsThis::add( enablePluginsGloballyCB, i18n("Enables the execution of plugins "
+ "that can be contained in HTML pages, e.g. Macromedia Flash. "
+ "Note that, as with any browser, enabling active contents can be a security problem.") );
+
+ QString wtstr = i18n("This box contains the domains and hosts you have set "
+ "a specific plugin policy for. This policy will be used "
+ "instead of the default policy for enabling or disabling plugins on pages sent by these "
+ "domains or hosts. <p>Select a policy and use the controls on "
+ "the right to modify it.");
+ QWhatsThis::add( domainSpecific->listView(), wtstr );
+ QWhatsThis::add( domainSpecific->importButton(), i18n("Click this button to choose the file that contains "
+ "the plugin policies. These policies will be merged "
+ "with the existing ones. Duplicate entries are ignored.") );
+ QWhatsThis::add( domainSpecific->exportButton(), i18n("Click this button to save the plugin policy to a zipped "
+ "file. The file, named <b>plugin_policy.tgz</b>, will be "
+ "saved to a location of your choice." ) );
+ QWhatsThis::add( domainSpecific, i18n("Here you can set specific plugin policies for any particular "
+ "host or domain. To add a new policy, simply click the <i>New...</i> "
+ "button and supply the necessary information requested by the "
+ "dialog box. To change an existing policy, click on the <i>Change...</i> "
+ "button and choose the new policy from the policy dialog box. Clicking "
+ "on the <i>Delete</i> button will remove the selected policy causing the default "
+ "policy setting to be used for that domain.") );
+#if 0
+ "The <i>Import</i> and <i>Export</i> "
+ "button allows you to easily share your policies with other people by allowing "
+ "you to save and retrieve them from a zipped file.") );
+#endif
+
+/*****************************************************************************/
+
+ QVGroupBox* netscapeGB = new QVGroupBox( i18n( "Netscape Plugins" ), this );
+ toplevel->addWidget( netscapeGB );
+
+ // create Designer made widget
+ m_widget = new NSConfigWidget( netscapeGB, "configwidget" );
+ m_widget->dirEdit->setMode(KFile::ExistingOnly | KFile::LocalOnly | KFile::Directory);
+
+ // setup widgets
+ connect( m_widget->scanAtStartup, SIGNAL(clicked()), SLOT(change()) );
+ connect( m_widget->scanButton, SIGNAL(clicked()), SLOT(scan()) );
+
+ m_changed = false;
+
+ dirInit();
+ pluginInit();
+
+ // Finally do the loading
+ load();
+}
+
+KPluginOptions::~KPluginOptions()
+{
+ delete m_pConfig;
+}
+
+
+void KPluginOptions::updatePLabel(int p) {
+ QString level;
+ p = (100 - p)/5;
+ if (p > 15) {
+ level = i18n("lowest priority", "lowest");
+ } else if (p > 11) {
+ level = i18n("low priority", "low");
+ } else if (p > 7) {
+ level = i18n("medium priority", "medium");
+ } else if (p > 3) {
+ level = i18n("high priority", "high");
+ } else {
+ level = i18n("highest priority", "highest");
+ }
+
+ priorityLabel->setText(i18n("CPU priority for plugins: %1").arg(level));
+}
+
+void KPluginOptions::load()
+{
+ load( false );
+}
+
+void KPluginOptions::load( bool useDefaults )
+{
+
+
+ // *** load ***
+ global_policies.load();
+ bool bPluginGlobal = global_policies.isFeatureEnabled();
+
+ // *** apply to GUI ***
+ enablePluginsGloballyCB->setChecked( bPluginGlobal );
+
+ domainSpecific->initialize(m_pConfig->readListEntry("PluginDomains"));
+
+/****************************************************************************/
+
+ KConfig *config = new KConfig("kcmnspluginrc", true);
+
+ config->setReadDefaults( useDefaults );
+
+ config->setGroup("Misc");
+ m_widget->scanAtStartup->setChecked( config->readBoolEntry( "startkdeScan", false ) );
+
+ m_widget->dirEdit->setURL("");
+ m_widget->dirEdit->setEnabled( false );
+ m_widget->dirRemove->setEnabled( false );
+ m_widget->dirUp->setEnabled( false );
+ m_widget->dirDown->setEnabled( false );
+ enableHTTPOnly->setChecked( config->readBoolEntry("HTTP URLs Only", false) );
+ enableUserDemand->setChecked( config->readBoolEntry("demandLoad", false) );
+ priority->setValue(100 - KCLAMP(config->readNumEntry("Nice Level", 0), 0, 19) * 5);
+ updatePLabel(priority->value());
+
+ dirLoad( config, useDefaults );
+ pluginLoad( config );
+
+ delete config;
+
+ emit changed( useDefaults );
+}
+
+void KPluginOptions::defaults()
+{
+ load( true );
+}
+
+void KPluginOptions::save()
+{
+ global_policies.save();
+
+ domainSpecific->save(m_groupname,"PluginDomains");
+
+ m_pConfig->sync(); // I need a sync here, otherwise "apply" won't work
+ // instantly
+
+ QByteArray data;
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ kapp->dcopClient()->send( "konqueror*", "KonquerorIface", "reparseConfiguration()", data );
+
+/*****************************************************************************/
+
+ KConfig *config= new KConfig("kcmnspluginrc", false);
+
+ dirSave( config );
+ pluginSave( config );
+
+ config->setGroup("Misc");
+ config->writeEntry( "startkdeScan", m_widget->scanAtStartup->isChecked() );
+ config->writeEntry( "HTTP URLs Only", enableHTTPOnly->isChecked() );
+ config->writeEntry( "demandLoad", enableUserDemand->isChecked() );
+ config->writeEntry("Nice Level", (int)(100 - priority->value()) / 5);
+ config->sync();
+ delete config;
+
+ change( false );
+}
+
+QString KPluginOptions::quickHelp() const
+{
+ return i18n("<h1>Konqueror Plugins</h1> The Konqueror web browser can use Netscape"
+ " plugins to show special content, just like the Navigator does. Please note that"
+ " the way you have to install Netscape plugins may depend on your distribution. A typical"
+ " place to install them is, for example, '/opt/netscape/plugins'.");
+}
+
+void KPluginOptions::slotChanged()
+{
+ emit changed(true);
+}
+
+void KPluginOptions::slotTogglePluginsEnabled() {
+ global_policies.setFeatureEnabled(enablePluginsGloballyCB->isChecked());
+}
+
+void KPluginOptions::slotShowDomainDlg() {
+ domainSpecificDlg->show();
+}
+
+/***********************************************************************************/
+
+void KPluginOptions::scan()
+{
+ m_widget->scanButton->setEnabled(false);
+ if ( m_changed ) {
+ int ret = KMessageBox::warningYesNoCancel( this,
+ i18n("Do you want to apply your changes "
+ "before the scan? Otherwise the "
+ "changes will be lost."), QString::null, KStdGuiItem::save(), KStdGuiItem::discard() );
+ if ( ret==KMessageBox::Cancel ) {
+ m_widget->scanButton->setEnabled(true);
+ return;
+ }
+ if ( ret==KMessageBox::Yes )
+ save();
+ }
+
+ m_nspluginscan = new KProcIO;
+ QString scanExe = KGlobal::dirs()->findExe("nspluginscan");
+ if (!scanExe) {
+ kdDebug() << "can't find nspluginviewer" << endl;
+ delete m_nspluginscan;
+ m_nspluginscan = 0L;
+
+ KMessageBox::sorry ( this,
+ i18n("The nspluginscan executable cannot be found. "
+ "Netscape plugins will not be scanned.") );
+ m_widget->scanButton->setEnabled(true);
+ return;
+ }
+
+ // find nspluginscan executable
+ m_progress = new QProgressDialog( i18n("Scanning for plugins"), i18n("Cancel"), 100, this );
+ m_progress->setProgress( 5 );
+
+ // start nspluginscan
+ *m_nspluginscan << scanExe << "--verbose";
+ kdDebug() << "Running nspluginscan" << endl;
+ connect(m_nspluginscan, SIGNAL(readReady(KProcIO*)),
+ this, SLOT(progress(KProcIO*)));
+ connect(m_nspluginscan, SIGNAL(processExited(KProcess *)),
+ this, SLOT(scanDone()));
+ connect(m_progress, SIGNAL(cancelled()), this, SLOT(scanDone()));
+
+ m_nspluginscan->start();
+}
+
+void KPluginOptions::progress(KProcIO *proc)
+{
+ QString line;
+ while(proc->readln(line) > 0)
+ ;
+ m_progress->setProgress(line.stripWhiteSpace().toInt());
+}
+
+void KPluginOptions::scanDone()
+{
+ m_progress->setProgress(100);
+ load();
+
+ delete m_progress; m_progress = 0L;
+ m_nspluginscan->deleteLater(); m_nspluginscan = 0L;
+ m_widget->scanButton->setEnabled(true);
+}
+
+/***********************************************************************************/
+
+
+void KPluginOptions::dirInit()
+{
+ m_widget->dirEdit->setCaption(i18n("Select Plugin Scan Folder"));
+ connect( m_widget->dirNew, SIGNAL(clicked()), SLOT(dirNew()));
+ connect( m_widget->dirRemove, SIGNAL(clicked()), SLOT(dirRemove()));
+ connect( m_widget->dirUp, SIGNAL(clicked()), SLOT(dirUp()));
+ connect( m_widget->dirDown, SIGNAL(clicked()), SLOT(dirDown()) );
+ connect( m_widget->useArtsdsp, SIGNAL(clicked()),SLOT(change()));
+ connect( m_widget->dirEdit,
+ SIGNAL(textChanged(const QString&)),
+ SLOT(dirEdited(const QString &)) );
+
+ connect( m_widget->dirList,
+ SIGNAL(executed(QListBoxItem*)),
+ SLOT(dirSelect(QListBoxItem*)) );
+
+ connect( m_widget->dirList,
+ SIGNAL(selectionChanged(QListBoxItem*)),
+ SLOT(dirSelect(QListBoxItem*)) );
+}
+
+
+void KPluginOptions::dirLoad( KConfig *config, bool useDefault )
+{
+ QStringList paths;
+
+ // read search paths
+
+ config->setGroup("Misc");
+ if ( config->hasKey( "scanPaths" ) && !useDefault )
+ paths = config->readListEntry( "scanPaths" );
+ else {//keep sync with kdebase/nsplugins
+ paths.append("$HOME/.mozilla/plugins");
+ paths.append("$HOME/.netscape/plugins");
+ paths.append("/usr/lib/firefox/plugins");
+ paths.append("/usr/lib64/browser-plugins");
+ paths.append("/usr/lib/browser-plugins");
+ paths.append("/usr/local/netscape/plugins");
+ paths.append("/opt/mozilla/plugins");
+ paths.append("/opt/mozilla/lib/plugins");
+ paths.append("/opt/netscape/plugins");
+ paths.append("/opt/netscape/communicator/plugins");
+ paths.append("/usr/lib/netscape/plugins");
+ paths.append("/usr/lib/netscape/plugins-libc5");
+ paths.append("/usr/lib/netscape/plugins-libc6");
+ paths.append("/usr/lib/mozilla/plugins");
+ paths.append("/usr/lib64/netscape/plugins");
+ paths.append("/usr/lib64/mozilla/plugins");
+ paths.append("$MOZILLA_HOME/plugins");
+
+ }
+
+ // fill list
+ m_widget->dirList->clear();
+ m_widget->dirList->insertStringList( paths );
+
+ // setup other widgets
+ bool useArtsdsp = config->readBoolEntry( "useArtsdsp", false );
+ m_widget->useArtsdsp->setChecked( useArtsdsp );
+}
+
+
+void KPluginOptions::dirSave( KConfig *config )
+{
+ // create stringlist
+ QStringList paths;
+ QListBoxItem *item = m_widget->dirList->firstItem();
+ for ( ; item!=0; item=item->next() )
+ if ( !item->text().isEmpty() )
+ paths << item->text();
+
+ // write entry
+ config->setGroup( "Misc" );
+ config->writeEntry( "scanPaths", paths );
+ config->writeEntry( "useArtsdsp", m_widget->useArtsdsp->isOn() );
+}
+
+
+void KPluginOptions::dirSelect( QListBoxItem *item )
+{
+ m_widget->dirEdit->setEnabled( item!=0 );
+ m_widget->dirRemove->setEnabled( item!=0 );
+
+ unsigned cur = m_widget->dirList->index(m_widget->dirList->selectedItem());
+ m_widget->dirDown->setEnabled( item!=0 && cur<m_widget->dirList->count()-1 );
+ m_widget->dirUp->setEnabled( item!=0 && cur>0 );
+ m_widget->dirEdit->setURL( item!=0 ? item->text() : QString::null );
+ }
+
+
+void KPluginOptions::dirNew()
+{
+ m_widget->dirList->insertItem( QString::null, 0 );
+ m_widget->dirList->setCurrentItem( 0 );
+ dirSelect( m_widget->dirList->selectedItem() );
+ m_widget->dirEdit->setURL(QString::null);
+ m_widget->dirEdit->setFocus();
+ change();
+}
+
+
+void KPluginOptions::dirRemove()
+{
+ m_widget->dirEdit->setURL(QString::null);
+ delete m_widget->dirList->selectedItem();
+ m_widget->dirRemove->setEnabled( false );
+ m_widget->dirUp->setEnabled( false );
+ m_widget->dirDown->setEnabled( false );
+ m_widget->dirEdit->setEnabled( false );
+ change();
+}
+
+
+void KPluginOptions::dirUp()
+{
+ unsigned cur = m_widget->dirList->index(m_widget->dirList->selectedItem());
+ if ( cur>0 ) {
+ QString txt = m_widget->dirList->text(cur-1);
+ m_widget->dirList->removeItem( cur-1 );
+ m_widget->dirList->insertItem( txt, cur );
+
+ m_widget->dirUp->setEnabled( cur-1>0 );
+ m_widget->dirDown->setEnabled( true );
+ change();
+ }
+}
+
+
+void KPluginOptions::dirDown()
+{
+ unsigned cur = m_widget->dirList->index(m_widget->dirList->selectedItem());
+ if ( cur < m_widget->dirList->count()-1 ) {
+ QString txt = m_widget->dirList->text(cur+1);
+ m_widget->dirList->removeItem( cur+1 );
+ m_widget->dirList->insertItem( txt, cur );
+
+ m_widget->dirUp->setEnabled( true );
+ m_widget->dirDown->setEnabled( cur+1<m_widget->dirList->count()-1 );
+ change();
+ }
+}
+
+
+void KPluginOptions::dirEdited(const QString &txt )
+{
+ if ( m_widget->dirList->currentText() != txt ) {
+ m_widget->dirList->blockSignals(true);
+ m_widget->dirList->changeItem( txt, m_widget->dirList->currentItem() );
+ m_widget->dirList->blockSignals(false);
+ change();
+ }
+}
+
+
+/***********************************************************************************/
+
+
+void KPluginOptions::pluginInit()
+{
+}
+
+
+void KPluginOptions::pluginLoad( KConfig* /*config*/ )
+{
+ kdDebug() << "-> KPluginOptions::fillPluginList" << endl;
+ m_widget->pluginList->clear();
+ QRegExp version(";version=[^:]*:");
+
+ // open the cache file
+ QFile cachef( locate("data", "nsplugins/cache") );
+ if ( !cachef.exists() || !cachef.open(IO_ReadOnly) ) {
+ kdDebug() << "Could not load plugin cache file!" << endl;
+ return;
+ }
+
+ QTextStream cache(&cachef);
+
+ // root object
+ QListViewItem *root = new QListViewItem( m_widget->pluginList, i18n("Netscape Plugins") );
+ root->setOpen( true );
+ root->setSelectable( false );
+ root->setExpandable( true );
+ root->setPixmap(0, SmallIcon("netscape"));
+
+ // read in cache
+ QString line, plugin;
+ QListViewItem *next = 0;
+ QListViewItem *lastMIME = 0;
+ while ( !cache.atEnd() ) {
+
+ line = cache.readLine();
+ //kdDebug() << line << endl;
+ if (line.isEmpty() || (line.left(1) == "#"))
+ continue;
+
+ if (line.left(1) == "[") {
+
+ plugin = line.mid(1,line.length()-2);
+ //kdDebug() << "plugin=" << plugin << endl;
+
+ // add plugin root item
+ next = new QListViewItem( root, i18n("Plugin"), plugin );
+ next->setOpen( false );
+ next->setSelectable( false );
+ next->setExpandable( true );
+
+ lastMIME = 0;
+
+ continue;
+ }
+
+ QStringList desc = QStringList::split(':', line, TRUE);
+ QString mime = desc[0].stripWhiteSpace();
+ QString name = desc[2];
+ QString suffixes = desc[1];
+
+ if (!mime.isEmpty()) {
+ //kdDebug() << "mime=" << mime << " desc=" << name << " suffix=" << suffixes << endl;
+ lastMIME = new QListViewItem( next, lastMIME, i18n("MIME type"), mime );
+ lastMIME->setOpen( false );
+ lastMIME->setSelectable( false );
+ lastMIME->setExpandable( true );
+
+ QListViewItem *last = new QListViewItem( lastMIME, 0, i18n("Description"), name );
+ last->setOpen( false );
+ last->setSelectable( false );
+ last->setExpandable( false );
+
+ last = new QListViewItem( lastMIME, last, i18n("Suffixes"), suffixes );
+ last->setOpen( false );
+ last->setSelectable( false );
+ last->setExpandable( false );
+ }
+ }
+
+ //kdDebug() << "<- KPluginOptions::fillPluginList" << endl;
+}
+
+
+void KPluginOptions::pluginSave( KConfig* /*config*/ )
+{
+
+}
+
+// == class PluginDomainDialog =====
+
+PluginDomainDialog::PluginDomainDialog(QWidget *parent) :
+ QWidget(parent,"PluginDomainDialog") {
+ setCaption(i18n("Domain-Specific Policies"));
+
+ thisLayout = new QVBoxLayout(this);
+ thisLayout->addSpacing(6);
+ QFrame *hrule = new QFrame(this);
+ hrule->setFrameStyle(QFrame::HLine | QFrame::Sunken);
+ thisLayout->addWidget(hrule);
+ thisLayout->addSpacing(6);
+
+ QBoxLayout *hl = new QHBoxLayout(this,0,6);
+ hl->addStretch(10);
+
+ QPushButton *closePB = new KPushButton(KStdGuiItem::close(),this);
+ connect(closePB,SIGNAL(clicked()),SLOT(slotClose()));
+ hl->addWidget(closePB);
+ thisLayout->addLayout(hl);
+}
+
+PluginDomainDialog::~PluginDomainDialog() {
+}
+
+void PluginDomainDialog::setMainWidget(QWidget *widget) {
+ thisLayout->insertWidget(0,widget);
+}
+
+void PluginDomainDialog::slotClose() {
+ hide();
+}
+
+// == class PluginDomainListView =====
+
+PluginDomainListView::PluginDomainListView(KConfig *config,const QString &group,
+ KPluginOptions *options,QWidget *parent,const char *name)
+ : DomainListView(config,i18n( "Doma&in-Specific" ), parent, name),
+ group(group), options(options) {
+}
+
+PluginDomainListView::~PluginDomainListView() {
+}
+
+void PluginDomainListView::setupPolicyDlg(PushButton trigger,PolicyDialog &pDlg,
+ Policies *pol) {
+ QString caption;
+ switch (trigger) {
+ case AddButton:
+ caption = i18n( "New Plugin Policy" );
+ pol->setFeatureEnabled(!options->enablePluginsGloballyCB->isChecked());
+ break;
+ case ChangeButton: caption = i18n( "Change Plugin Policy" ); break;
+ default: ; // inhibit gcc warning
+ }/*end switch*/
+ pDlg.setCaption(caption);
+ pDlg.setFeatureEnabledLabel(i18n("&Plugin policy:"));
+ pDlg.setFeatureEnabledWhatsThis(i18n("Select a plugin policy for "
+ "the above host or domain."));
+ pDlg.refresh();
+}
+
+PluginPolicies *PluginDomainListView::createPolicies() {
+ return new PluginPolicies(config,group,false);
+}
+
+PluginPolicies *PluginDomainListView::copyPolicies(Policies *pol) {
+ return new PluginPolicies(*static_cast<PluginPolicies *>(pol));
+}
+
+#include "pluginopts.moc"
diff --git a/kcontrol/konqhtml/pluginopts.h b/kcontrol/konqhtml/pluginopts.h
new file mode 100644
index 000000000..46142dcf7
--- /dev/null
+++ b/kcontrol/konqhtml/pluginopts.h
@@ -0,0 +1,163 @@
+//-----------------------------------------------------------------------------
+//
+// Plugin Options
+//
+// (c) 2002 Leo Savernik, per-domain settings
+// (c) 2001, Daniel Naber, based on javaopts.h
+// (c) 2000, Stefan Schimanski <1Stein@gmx.de>, Netscape parts
+//
+//-----------------------------------------------------------------------------
+
+#ifndef __PLUGINOPTS_H__
+#define __PLUGINOPTS_H__
+
+#include <qwidget.h>
+
+#include "domainlistview.h"
+#include "policies.h"
+
+class KConfig;
+class QCheckBox;
+
+#include <kcmodule.h>
+#include "nsconfigwidget.h"
+
+class QBoxLayout;
+class QLabel;
+class QProgressDialog;
+class QSlider;
+class KDialogBase;
+class KPluginOptions;
+class KProcIO;
+
+/** policies with plugin-specific constructor
+ */
+class PluginPolicies : public Policies {
+public:
+ /**
+ * constructor
+ * @param config configuration to initialize this instance from
+ * @param group config group to use if this instance contains the global
+ * policies (global == true)
+ * @param global true if this instance contains the global policy settings,
+ * false if this instance contains policies specific for a domain.
+ * @param domain name of the domain this instance is used to configure the
+ * policies for (case insensitive, ignored if global == true)
+ */
+ PluginPolicies(KConfig* config, const QString &group, bool global,
+ const QString &domain = QString::null);
+
+ virtual ~PluginPolicies();
+};
+
+/** Plugin-specific enhancements to the domain list view
+ */
+class PluginDomainListView : public DomainListView {
+ Q_OBJECT
+public:
+ PluginDomainListView(KConfig *config,const QString &group,KPluginOptions *opt,
+ QWidget *parent,const char *name = 0);
+ virtual ~PluginDomainListView();
+
+protected:
+ virtual PluginPolicies *createPolicies();
+ virtual PluginPolicies *copyPolicies(Policies *pol);
+ virtual void setupPolicyDlg(PushButton trigger,PolicyDialog &pDlg,
+ Policies *copy);
+
+private:
+ QString group;
+ KPluginOptions *options;
+};
+
+/**
+ * dialog for embedding a PluginDomainListView widget
+ */
+class PluginDomainDialog : public QWidget {
+ Q_OBJECT
+public:
+
+ PluginDomainDialog(QWidget *parent);
+ virtual ~PluginDomainDialog();
+
+ void setMainWidget(QWidget *widget);
+
+private slots:
+ virtual void slotClose();
+
+private:
+ PluginDomainListView *domainSpecific;
+ QBoxLayout *thisLayout;
+};
+
+class KPluginOptions : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KPluginOptions( KConfig* config, QString group, QWidget* parent = 0, const char* name = 0 );
+ ~KPluginOptions();
+
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+ QString quickHelp() const;
+
+private slots:
+ void slotChanged();
+ void slotTogglePluginsEnabled();
+ void slotShowDomainDlg();
+
+private:
+
+ KConfig* m_pConfig;
+ QString m_groupname;
+
+ QCheckBox *enablePluginsGloballyCB, *enableHTTPOnly, *enableUserDemand;
+
+
+ protected slots:
+ void progress(KProcIO *);
+ void updatePLabel(int);
+ void change() { change( true ); };
+ void change( bool c ) { emit changed(c); m_changed = c; };
+
+ void scan();
+ void scanDone();
+
+ private:
+ NSConfigWidget *m_widget;
+ bool m_changed;
+ QProgressDialog *m_progress;
+ KProcIO* m_nspluginscan;
+ QSlider *priority;
+ QLabel *priorityLabel;
+ PluginPolicies global_policies;
+ PluginDomainListView *domainSpecific;
+ KDialogBase *domainSpecificDlg;
+
+/******************************************************************************/
+ protected:
+ void dirInit();
+ void dirLoad( KConfig *config, bool useDefault = false );
+ void dirSave( KConfig *config );
+
+ protected slots:
+ void dirNew();
+ void dirRemove();
+ void dirUp();
+ void dirDown();
+ void dirEdited(const QString &);
+ void dirSelect( QListBoxItem * );
+
+/******************************************************************************/
+ protected:
+ void pluginInit();
+ void pluginLoad( KConfig *config );
+ void pluginSave( KConfig *config );
+
+ friend class PluginDomainListView;
+};
+
+#endif // __PLUGINOPTS_H__
diff --git a/kcontrol/konqhtml/policies.cpp b/kcontrol/konqhtml/policies.cpp
new file mode 100644
index 000000000..153c80888
--- /dev/null
+++ b/kcontrol/konqhtml/policies.cpp
@@ -0,0 +1,74 @@
+/*
+ Copyright (c) 2002 Leo Savernik <l.savernik@aon.at>
+ Derived from jsopt.cpp, code copied from there is copyrighted to its
+ respective owners.
+
+ 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 <kconfig.h>
+#include <kdebug.h>
+
+#include "policies.h"
+
+// == class Policies ==
+
+Policies::Policies(KConfig* config,const QString &group,
+ bool global,const QString &domain, const QString &prefix,
+ const QString &feature_key) :
+ is_global(global), config(config), groupname(group),
+ prefix(prefix), feature_key(feature_key) {
+
+ if (is_global) {
+ this->prefix = QString::null; // global keys have no prefix
+ }/*end if*/
+ setDomain(domain);
+}
+
+Policies::~Policies() {
+}
+
+void Policies::setDomain(const QString &domain) {
+ if (is_global) return;
+ this->domain = domain.lower();
+ groupname = this->domain; // group is domain in this case
+}
+
+void Policies::load() {
+ config->setGroup(groupname);
+
+ QString key = prefix + feature_key;
+ if (config->hasKey(key))
+ feature_enabled = config->readBoolEntry(key);
+ else
+ feature_enabled = is_global ? true : INHERIT_POLICY;
+}
+
+void Policies::defaults() {
+ feature_enabled = is_global ? true : INHERIT_POLICY;
+}
+
+void Policies::save() {
+ config->setGroup(groupname);
+
+ QString key = prefix + feature_key;
+ if (feature_enabled != INHERIT_POLICY)
+ config->writeEntry(key, (bool)feature_enabled);
+ else
+ config->deleteEntry(key);
+
+ // don't do a config->sync() here for sake of efficiency
+}
diff --git a/kcontrol/konqhtml/policies.h b/kcontrol/konqhtml/policies.h
new file mode 100644
index 000000000..b5643c0bd
--- /dev/null
+++ b/kcontrol/konqhtml/policies.h
@@ -0,0 +1,134 @@
+/*
+ Copyright (c) 2002 Leo Savernik <l.savernik@aon.at>
+ Derived from jsopt.h, code copied from there is copyrighted to its
+ respective owners.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef __POLICIES_H__
+#define __POLICIES_H__
+
+#include <qstring.h>
+
+class KConfig;
+
+// special value for inheriting a global policy
+#define INHERIT_POLICY 32767
+
+/**
+ * @short Contains the basic policies and methods for their manipulation.
+ *
+ * This class provides access to the basic policies that are common
+ * to all features.
+ *
+ * @author Leo Savernik
+ */
+class Policies {
+public:
+ /**
+ * constructor
+ * @param config configuration to initialize this instance from
+ * @param group config group to use if this instance contains the global
+ * policies (global == true)
+ * @param global true if this instance contains the global policy settings,
+ * false if it contains policies specific to a domain.
+ * @param domain name of the domain this instance is used to configure the
+ * policies for (case insensitive, ignored if global == true)
+ * @param prefix prefix to use for configuration keys. The domain-specific
+ * policies use of the format "&lt;feature&gt;." (note the trailing dot).
+ * Global policies have no prefix, it is ignored if global == true.
+ * @param feature_key key of the "feature enabled" policy. The final
+ * key the policy is stored under will be prefix + featureKey.
+ */
+ Policies(KConfig* config, const QString &group, bool global,
+ const QString &domain, const QString &prefix,
+ const QString &feature_key);
+
+ virtual ~Policies();
+
+ /**
+ * Returns true if this is the global policies object
+ */
+ bool isGlobal() const {
+ return is_global;
+ }
+
+ /** sets a new domain for this policy
+ * @param domain domain name, will be converted to lowercase
+ */
+ void setDomain(const QString &domain);
+
+ /**
+ * Returns whether the "feature enabled" policy is inherited.
+ */
+ bool isFeatureEnabledPolicyInherited() const {
+ return feature_enabled == INHERIT_POLICY;
+ }
+ /** inherits "feature enabled" policy */
+ void inheritFeatureEnabledPolicy() {
+ feature_enabled = INHERIT_POLICY;
+ }
+ /**
+ * Returns whether this feature is enabled.
+ *
+ * This will return an illegal value if isFeatureEnabledPolicyInherited
+ * is true.
+ */
+ bool isFeatureEnabled() const {
+ return (bool)feature_enabled;
+ }
+ /**
+ * Enables/disables this feature
+ * @param on true will enable it, false disable it
+ */
+ void setFeatureEnabled(int on) {
+ feature_enabled = on;
+ }
+
+ /**
+ * (re)loads settings from configuration file given in the constructor.
+ *
+ * Implicitely sets the group given in the constructor. Don't forget to
+ * call this method from derived methods.
+ */
+ virtual void load();
+ /**
+ * saves current settings to the configuration file given in the constructor
+ *
+ * Implicitely sets the group given in the constructor. Don't forget to
+ * call this method from derived methods.
+ */
+ virtual void save();
+ /**
+ * restores the default settings
+ */
+ virtual void defaults();
+
+protected:
+ // true or false or INHERIT_POLICY
+ unsigned int feature_enabled;
+
+ bool is_global;
+ KConfig *config;
+ QString groupname;
+ QString domain;
+ QString prefix;
+ QString feature_key;
+};
+
+#endif // __POLICIES_H__
+
diff --git a/kcontrol/konqhtml/policydlg.cpp b/kcontrol/konqhtml/policydlg.cpp
new file mode 100644
index 000000000..801068d3a
--- /dev/null
+++ b/kcontrol/konqhtml/policydlg.cpp
@@ -0,0 +1,128 @@
+// (C) < 2002 to whoever created and edited this file before
+// (C) 2002 Leo Savernik <l.savernik@aon.at>
+// Generalizing the policy dialog
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qwhatsthis.h>
+#include <qcombobox.h>
+
+#include <klocale.h>
+#include <kbuttonbox.h>
+#include <kmessagebox.h>
+
+#include <qpushbutton.h>
+
+#include "policydlg.h"
+#include "policies.h"
+
+PolicyDialog::PolicyDialog( Policies *policies, QWidget *parent, const char *name )
+ : KDialogBase(parent, name, true, QString::null, Ok|Cancel, Ok, true),
+ policies(policies)
+{
+ QFrame *main = makeMainWidget();
+
+ insertIdx = 1; // index where to insert additional panels
+ topl = new QVBoxLayout(main, 0, spacingHint());
+
+ QGridLayout *grid = new QGridLayout(topl, 2, 2);
+ grid->setColStretch(1, 1);
+
+ QLabel *l = new QLabel(i18n("&Host or domain name:"), main);
+ grid->addWidget(l, 0, 0);
+
+ le_domain = new QLineEdit(main);
+ l->setBuddy( le_domain );
+ grid->addWidget(le_domain, 0, 1);
+ connect( le_domain,SIGNAL(textChanged( const QString & )),
+ SLOT(slotTextChanged( const QString &)));
+
+ QWhatsThis::add(le_domain, i18n("Enter the name of a host (like www.kde.org) "
+ "or a domain, starting with a dot (like .kde.org or .org)") );
+
+ l_feature_policy = new QLabel(main);
+ grid->addWidget(l_feature_policy, 1, 0);
+
+ cb_feature_policy = new QComboBox(main);
+ l_feature_policy->setBuddy( cb_feature_policy );
+ policy_values << i18n("Use Global") << i18n("Accept") << i18n("Reject");
+ cb_feature_policy->insertStringList(policy_values);
+ grid->addWidget(cb_feature_policy, 1, 1);
+
+ le_domain->setFocus();
+
+ enableButtonOK(!le_domain->text().isEmpty());
+}
+
+PolicyDialog::FeatureEnabledPolicy PolicyDialog::featureEnabledPolicy() const {
+ return (FeatureEnabledPolicy)cb_feature_policy->currentItem();
+}
+
+void PolicyDialog::slotTextChanged( const QString &text)
+{
+ enableButtonOK(!text.isEmpty());
+}
+
+void PolicyDialog::setDisableEdit( bool state, const QString& text )
+{
+ le_domain->setText( text );
+
+ le_domain->setEnabled( state );
+
+ if( state )
+ cb_feature_policy->setFocus();
+}
+
+void PolicyDialog::refresh() {
+ FeatureEnabledPolicy pol;
+
+ if (policies->isFeatureEnabledPolicyInherited())
+ pol = InheritGlobal;
+ else if (policies->isFeatureEnabled())
+ pol = Accept;
+ else
+ pol = Reject;
+ cb_feature_policy->setCurrentItem(pol);
+}
+
+void PolicyDialog::setFeatureEnabledLabel(const QString &text) {
+ l_feature_policy->setText(text);
+}
+
+void PolicyDialog::setFeatureEnabledWhatsThis(const QString &text) {
+ QWhatsThis::add(cb_feature_policy, text);
+}
+
+void PolicyDialog::addPolicyPanel(QWidget *panel) {
+ topl->insertWidget(insertIdx++,panel);
+}
+
+QString PolicyDialog::featureEnabledPolicyText() const {
+ int pol = cb_feature_policy->currentItem();
+ if (pol >= 0 && pol < 3) // Keep in sync with FeatureEnabledPolicy
+ return policy_values[pol];
+ else
+ return QString::null;
+}
+
+void PolicyDialog::accept()
+{
+ if( le_domain->text().isEmpty() )
+ {
+ KMessageBox::information( 0, i18n("You must first enter a domain name.") );
+ return;
+ }
+
+ FeatureEnabledPolicy pol = (FeatureEnabledPolicy)
+ cb_feature_policy->currentItem();
+ if (pol == InheritGlobal) {
+ policies->inheritFeatureEnabledPolicy();
+ } else if (pol == Reject) {
+ policies->setFeatureEnabled(false);
+ } else {
+ policies->setFeatureEnabled(true);
+ }
+ QDialog::accept();
+}
+
+#include "policydlg.moc"
diff --git a/kcontrol/konqhtml/policydlg.h b/kcontrol/konqhtml/policydlg.h
new file mode 100644
index 000000000..6922aa736
--- /dev/null
+++ b/kcontrol/konqhtml/policydlg.h
@@ -0,0 +1,130 @@
+// (C) < 2002 to whoever created and edited this file before
+// (C) 2002 Leo Savernik <l.savernik@aon.at>
+// Generalizing the policy dialog
+
+#ifndef _POLICYDLG_H
+#define _POLICYDLG_H
+
+#include <kdialogbase.h>
+
+#include <qlineedit.h>
+#include <qstringlist.h>
+
+class QLabel;
+class QComboBox;
+class QString;
+class QVBoxLayout;
+class QPushButton;
+
+class Policies;
+
+/**
+ * A dialog for editing domain-specific policies.
+ *
+ * Each dialog must be associated with a relevant Policies instance which
+ * will be updated within this dialog appropriately.
+ *
+ * Additionally you can insert your own widget containing controls for
+ * specific policies with addPolicyPanel.
+ *
+ * @author unknown
+ */
+class PolicyDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Enumerates the possible return values for the "feature enabled"
+ * policy
+ */
+ enum FeatureEnabledPolicy { InheritGlobal = 0, Accept, Reject };
+
+ /** constructor
+ * @param policies policies object this dialog will write the settings
+ * into. Note that it always reflects the current settings,
+ * even if the dialog has been cancelled.
+ * @param parent parent widget this belongs to
+ * @param name internal name
+ */
+ PolicyDialog(Policies *policies, QWidget *parent = 0, const char *name = 0 );
+
+ virtual ~PolicyDialog() {};
+
+ /*
+ * @return whether this feature should be activated, deactivated or
+ * inherited from the respective global policy.
+ */
+ FeatureEnabledPolicy featureEnabledPolicy() const;
+
+ /**
+ * @return the textual representation of the current "feature enabled"
+ * policy
+ */
+ QString featureEnabledPolicyText() const;
+
+ /*
+ * @return the hostname for which the policy is being set
+ */
+ QString domain() const { return le_domain->text(); }
+
+ /*
+ * Sets the line-edit to be enabled/disabled.
+ *
+ * This method will set the text in the lineedit if the
+ * value is not null.
+ *
+ * @param state @p true to enable the line-edit, otherwise disabled.
+ * @param text the text to be set in the line-edit. Default is NULL.
+ */
+ void setDisableEdit( bool /*state*/, const QString& text = QString::null );
+
+ /**
+ * Sets the label for the "feature enabled" policy
+ * @param text label text
+ */
+ void setFeatureEnabledLabel(const QString &text);
+
+ /**
+ * Sets the "What's This" text for the "feature enabled" policy
+ * combo box.
+ * @param text what's-this text
+ */
+ void setFeatureEnabledWhatsThis(const QString &text);
+
+ /**
+ * Syncs the controls with the current content of the
+ * associated policies object.
+ */
+ void refresh();
+
+ /**
+ * Adds another panel which contains controls for more policies.
+ *
+ * The widget is inserted between the "feature enabled" combo box and
+ * the dialog buttons at the bottom.
+ *
+ * Currently at most one widget can be added.
+ * @param panel pointer to widget to insert. The dialog takes ownership
+ * of it, but does not reparent it.
+ */
+ void addPolicyPanel(QWidget *panel);
+
+protected slots:
+
+ virtual void accept();
+ void slotTextChanged( const QString &text);
+
+private:
+ Policies *policies;
+ QVBoxLayout *topl;
+ int insertIdx;
+ QLineEdit *le_domain;
+ QLabel *l_feature_policy;
+ QComboBox *cb_feature_policy;
+ QWidget *panel;
+ QStringList policy_values;
+ QPushButton *okButton;
+};
+
+#endif
diff --git a/kcontrol/konqhtml/uninstall.desktop b/kcontrol/konqhtml/uninstall.desktop
new file mode 100644
index 000000000..e1e3e1732
--- /dev/null
+++ b/kcontrol/konqhtml/uninstall.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
diff --git a/kcontrol/konsole/AUTHORS b/kcontrol/konsole/AUTHORS
new file mode 100644
index 000000000..a515139f9
--- /dev/null
+++ b/kcontrol/konsole/AUTHORS
@@ -0,0 +1,2 @@
+Andrea Rizzi <rizzi@kde.org> April 2001
+Stephan Binner <stephan.binner@gmx.de> October 2001
diff --git a/kcontrol/konsole/Makefile.am b/kcontrol/konsole/Makefile.am
new file mode 100644
index 000000000..622e7fa71
--- /dev/null
+++ b/kcontrol/konsole/Makefile.am
@@ -0,0 +1,18 @@
+kde_module_LTLIBRARIES = kcm_konsole.la
+
+kcm_konsole_la_SOURCES = schemaeditor.cpp sessioneditor.cpp kcmkonsole.cpp \
+ schemadialog.ui sessiondialog.ui kcmkonsoledialog.ui
+
+kcm_konsole_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_konsole_la_LIBADD = -lkdeui $(LIB_KIO)
+AM_CPPFLAGS = $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = kcmkonsole.h schemaeditor.h sessioneditor.h schemadialog.h sessiondialog.h kcmkonsoledialog.h
+
+kcmkonsole_data_DATA = kcmkonsole.desktop
+kcmkonsole_datadir = $(kde_appsdir)/.hidden
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmkonsole.pot
diff --git a/kcontrol/konsole/kcmkonsole.cpp b/kcontrol/konsole/kcmkonsole.cpp
new file mode 100644
index 000000000..19b547366
--- /dev/null
+++ b/kcontrol/konsole/kcmkonsole.cpp
@@ -0,0 +1,191 @@
+/***************************************************************************
+ kcmkonsole.cpp - control module for konsole
+ -------------------
+ begin : mar apr 17 16:44:59 CEST 2001
+ copyright : (C) 2001 by Andrea Rizzi
+ email : rizzi@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qstringlist.h>
+#include <qtabwidget.h>
+
+#include <dcopclient.h>
+
+#include <kaboutdata.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kfontdialog.h>
+#include <kgenericfactory.h>
+#include <kmessagebox.h>
+
+#include "schemaeditor.h"
+#include "sessioneditor.h"
+#include "kcmkonsole.h"
+
+typedef KGenericFactory<KCMKonsole, QWidget> ModuleFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_konsole, ModuleFactory("kcmkonsole") )
+
+KCMKonsole::KCMKonsole(QWidget * parent, const char *name, const QStringList&)
+:KCModule(ModuleFactory::instance(), parent, name)
+{
+
+ setQuickHelp( i18n("<h1>Konsole</h1> With this module you can configure Konsole, the KDE terminal"
+ " application. You can configure the generic Konsole options (which can also be "
+ "configured using the RMB) and you can edit the schemas and sessions "
+ "available to Konsole."));
+
+ QVBoxLayout *topLayout = new QVBoxLayout(this);
+ dialog = new KCMKonsoleDialog(this);
+ dialog->line_spacingSB->setRange(0, 8, 1, false);
+ dialog->line_spacingSB->setSpecialValueText(i18n("normal line spacing", "Normal"));
+ dialog->show();
+ topLayout->add(dialog);
+ load();
+
+ KAboutData *ab=new KAboutData( "kcmkonsole", I18N_NOOP("KCM Konsole"),
+ "0.2",I18N_NOOP("KControl module for Konsole configuration"), KAboutData::License_GPL,
+ "(c) 2001, Andrea Rizzi", 0, 0, "rizzi@kde.org");
+
+ ab->addAuthor("Andrea Rizzi",0, "rizzi@kde.org");
+ setAboutData( ab );
+
+ connect(dialog->terminalSizeHintCB,SIGNAL(toggled(bool)), SLOT( changed() ));
+ connect(dialog->warnCB,SIGNAL(toggled(bool)), SLOT( changed() ));
+ connect(dialog->ctrldragCB,SIGNAL(toggled(bool)), SLOT( changed() ));
+ connect(dialog->cutToBeginningOfLineCB,SIGNAL(toggled(bool)), SLOT( changed() ));
+ connect(dialog->allowResizeCB,SIGNAL(toggled(bool)), SLOT( changed() ));
+ connect(dialog->bidiCB,SIGNAL(toggled(bool)), SLOT( changed() ));
+ connect(dialog->xonXoffCB,SIGNAL(toggled(bool)), SLOT( changed() ));
+ connect(dialog->blinkingCB,SIGNAL(toggled(bool)), SLOT( changed() ));
+ connect(dialog->frameCB,SIGNAL(toggled(bool)), SLOT( changed() ));
+ connect(dialog->line_spacingSB,SIGNAL(valueChanged(int)), SLOT( changed() ));
+ connect(dialog->matchTabWinTitleCB,SIGNAL(toggled(bool)), SLOT( changed() ));
+ connect(dialog->silence_secondsSB,SIGNAL(valueChanged(int)), SLOT( changed() ));
+ connect(dialog->word_connectorLE,SIGNAL(textChanged(const QString &)), SLOT( changed() ));
+ connect(dialog->SchemaEditor1, SIGNAL(changed()), SLOT( changed() ));
+ connect(dialog->SessionEditor1, SIGNAL(changed()), SLOT( changed() ));
+ connect(dialog->SchemaEditor1, SIGNAL(schemaListChanged(const QStringList &,const QStringList &)),
+ dialog->SessionEditor1, SLOT(schemaListChanged(const QStringList &,const QStringList &)));
+ connect(dialog->SessionEditor1, SIGNAL(getList()), dialog->SchemaEditor1, SLOT(getList()));
+}
+
+void KCMKonsole::load()
+{
+ load(false);
+}
+
+void KCMKonsole::load(bool useDefaults)
+{
+ KConfig config("konsolerc", true);
+ config.setDesktopGroup();
+ config.setReadDefaults(useDefaults);
+
+ dialog->terminalSizeHintCB->setChecked(config.readBoolEntry("TerminalSizeHint",false));
+ bidiOrig = config.readBoolEntry("EnableBidi",false);
+ dialog->bidiCB->setChecked(bidiOrig);
+ dialog->matchTabWinTitleCB->setChecked(config.readBoolEntry("MatchTabWinTitle",false));
+ dialog->warnCB->setChecked(config.readBoolEntry("WarnQuit",true));
+ dialog->ctrldragCB->setChecked(config.readBoolEntry("CtrlDrag",true));
+ dialog->cutToBeginningOfLineCB->setChecked(config.readBoolEntry("CutToBeginningOfLine",false));
+ dialog->allowResizeCB->setChecked(config.readBoolEntry("AllowResize",false));
+ xonXoffOrig = config.readBoolEntry("XonXoff",false);
+ dialog->xonXoffCB->setChecked(xonXoffOrig);
+ dialog->blinkingCB->setChecked(config.readBoolEntry("BlinkingCursor",false));
+ dialog->frameCB->setChecked(config.readBoolEntry("has frame",true));
+ dialog->line_spacingSB->setValue(config.readUnsignedNumEntry( "LineSpacing", 0 ));
+ dialog->silence_secondsSB->setValue(config.readUnsignedNumEntry( "SilenceSeconds", 10 ));
+ dialog->word_connectorLE->setText(config.readEntry("wordseps",":@-./_~"));
+
+ dialog->SchemaEditor1->setSchema(config.readEntry("schema"));
+
+ emit changed(useDefaults);
+}
+
+void KCMKonsole::save()
+{
+ if (dialog->SchemaEditor1->isModified())
+ {
+ dialog->TabWidget2->showPage(dialog->tab_2);
+ dialog->SchemaEditor1->querySave();
+ }
+
+ if (dialog->SessionEditor1->isModified())
+ {
+ dialog->TabWidget2->showPage(dialog->tab_3);
+ dialog->SessionEditor1->querySave();
+ }
+
+ KConfig config("konsolerc");
+ config.setDesktopGroup();
+
+ config.writeEntry("TerminalSizeHint", dialog->terminalSizeHintCB->isChecked());
+ bool bidiNew = dialog->bidiCB->isChecked();
+ config.writeEntry("EnableBidi", bidiNew);
+ config.writeEntry("MatchTabWinTitle", dialog->matchTabWinTitleCB->isChecked());
+ config.writeEntry("WarnQuit", dialog->warnCB->isChecked());
+ config.writeEntry("CtrlDrag", dialog->ctrldragCB->isChecked());
+ config.writeEntry("CutToBeginningOfLine", dialog->cutToBeginningOfLineCB->isChecked());
+ config.writeEntry("AllowResize", dialog->allowResizeCB->isChecked());
+ bool xonXoffNew = dialog->xonXoffCB->isChecked();
+ config.writeEntry("XonXoff", xonXoffNew);
+ config.writeEntry("BlinkingCursor", dialog->blinkingCB->isChecked());
+ config.writeEntry("has frame", dialog->frameCB->isChecked());
+ config.writeEntry("LineSpacing" , dialog->line_spacingSB->value());
+ config.writeEntry("SilenceSeconds" , dialog->silence_secondsSB->value());
+ config.writeEntry("wordseps", dialog->word_connectorLE->text());
+
+ config.writeEntry("schema", dialog->SchemaEditor1->schema());
+
+ config.sync();
+
+ emit changed(false);
+
+ DCOPClient *dcc = kapp->dcopClient();
+ dcc->send("konsole-*", "konsole", "reparseConfiguration()", QByteArray());
+ dcc->send("kdesktop", "default", "configure()", QByteArray());
+ dcc->send("klauncher", "klauncher", "reparseConfiguration()", QByteArray());
+
+ if (xonXoffOrig != xonXoffNew)
+ {
+ xonXoffOrig = xonXoffNew;
+ KMessageBox::information(this, i18n("The Ctrl+S/Ctrl+Q flow control setting will only affect "
+ "newly started Konsole sessions.\n"
+ "The 'stty' command can be used to change the flow control "
+ "settings of existing Konsole sessions."));
+ }
+
+ if (bidiNew && !bidiOrig)
+ {
+ KMessageBox::information(this, i18n("You have chosen to enable "
+ "bidirectional text rendering by "
+ "default.\n"
+ "Note that bidirectional text may "
+ "not always be shown correctly, "
+ "especially when selecting parts of "
+ "text written right-to-left. This "
+ "is a known issue which cannot be "
+ "resolved at the moment due to the "
+ "nature of text handling in "
+ "console-based applications."));
+ }
+ bidiOrig = bidiNew;
+
+}
+
+void KCMKonsole::defaults()
+{
+ load(true);
+}
+
+#include "kcmkonsole.moc"
diff --git a/kcontrol/konsole/kcmkonsole.desktop b/kcontrol/konsole/kcmkonsole.desktop
new file mode 100644
index 000000000..8aa6aecf1
--- /dev/null
+++ b/kcontrol/konsole/kcmkonsole.desktop
@@ -0,0 +1,185 @@
+[Desktop Entry]
+Icon=konsole
+Type=Application
+Exec=kcmshell kcmkonsole
+DocPath=kcontrol/kcmkonsole/index.html
+
+X-KDE-Library=konsole
+X-KDE-ParentApp=kcontrol
+Name=Konsole
+Name[ar]=طرفية التحكم
+Name[az]=Konsol
+Name[be]=Кансоль
+Name[bg]=Конзола
+Name[bn]=কনসোল
+Name[bs]=Konzola
+Name[ca]=Consola
+Name[csb]=Kònsola
+Name[el]=Κονσόλα
+Name[eo]=Konzolo
+Name[et]=Konsool
+Name[eu]=Kontsola
+Name[he]=מסוף
+Name[hi]=कंसोल
+Name[hr]=Konzola
+Name[is]=Skjáhermir
+Name[ka]=კონსოლი
+Name[lo]=ຄອນໂຊລ - K
+Name[mk]=Конзола
+Name[mn]=Консол
+Name[nb]=Konsoll
+Name[ne]=कन्सोल
+Name[nn]=Konsoll
+Name[pa]=ਕੰਨਸੋਲ
+Name[pl]=Konsola
+Name[ro]=Consolă
+Name[se]=Konsolla
+Name[sk]=Konzola
+Name[sl]=Konzola
+Name[ta]=கான்சோல்
+Name[te]=కాన్సోల్
+Name[tg]=Консол
+Name[th]=คอนโซล K
+Name[zu]=Ikhonsoli
+Comment=Konsole configuration module
+Comment[af]=Konsole opstelling module
+Comment[ar]=وحدة إعداد طرفية التحكم
+Comment[az]=Konsol quraşdırma modulu
+Comment[be]=Модуль настаўлення кансолі
+Comment[bg]=Настройване на конзолата
+Comment[bn]=কনসোল কনফিগারেশন মডিউল
+Comment[br]=Mollad kefluniadur Konsole
+Comment[bs]=Modul sa podešavanje konzole
+Comment[ca]=Mòdul de configuració de la consola
+Comment[cs]=Konfigurační modul terminálu konsole
+Comment[csb]=Mòduł kònfigùracëji kònsolë
+Comment[cy]=Modiwl ffurfweddu Konsole
+Comment[da]=Konsole-indstillingsmodul
+Comment[de]=Modul zur Einrichtung von Konsole
+Comment[el]=Άρθρωμα ρύθμισης Κονσόλας
+Comment[eo]=Agordo de Konzolo
+Comment[es]=Módulo de configuración de Konsole
+Comment[et]=Terminaliemulaatori seadistamine
+Comment[eu]=Kontsola konfiguratzeko modulua
+Comment[fa]=پیمانۀ پیکربندی Konsole
+Comment[fi]=Konsolen asetukset
+Comment[fr]=Configuration de Konsole
+Comment[fy]=Konsole-ynstellingsmodule
+Comment[ga]=Modúl Cumraíochta Konsole
+Comment[gl]=Módulo de configuración de Konsole
+Comment[he]=שינוי הגדרות המסוף
+Comment[hi]=कंसोल कॉन्फ़िगरेशन मोड
+Comment[hr]=Modul za konfiguriranje konzole
+Comment[hu]=A Konsole parancsértelmező beállításai
+Comment[is]=Skjáhermisstillingar
+Comment[it]=Modulo di configurazione di Konsole
+Comment[ja]=Konsole の設定モジュール
+Comment[ka]=კონსოლის კონფიგურაციის მოდული
+Comment[kk]=Konsole модулін баптау
+Comment[km]=ម៉ូឌុល​កំណត់​រចនាសម្ព័ន្ធ Konsole
+Comment[lo]=ໂມດູນປັບແຕ່ງຄອນໂຊນ - K
+Comment[lt]=Konsole konfigūravimo įrankis
+Comment[lv]=Konsoles konfigurācijas modulis
+Comment[mk]=Модул за конфигурација на конзолата
+Comment[mn]=Консол тохируулгын модул
+Comment[ms]=Konsol modul konfigurasi
+Comment[mt]=Konfigurazzjoni ta' Konsole
+Comment[nb]=Verktøy for å tilpasse Konsole
+Comment[nds]=Moduul för't Instellen vun Konsole
+Comment[ne]=कन्सोल कन्फिगरेसन मोड्युल
+Comment[nl]=Konsole-configuratiemodule
+Comment[nn]=Oppsettmodul for Konsole
+Comment[nso]=Seripa sa peakanyo ya konsole
+Comment[pa]=ਕੰਨਸੋਲ ਸੰਰਚਨਾ ਮੈਡੀਊਲ
+Comment[pl]=Moduł konfiguracji konsoli
+Comment[pt]=Módulo de configuração do Konsole
+Comment[pt_BR]=Módulo de configuração do Konsole
+Comment[ro]=Modul de configurare Konsole
+Comment[ru]=Модуль настройки Konsole
+Comment[rw]=Igice cy'iboneza rya Konsole
+Comment[se]=Konsole:a heivehanmoduvla
+Comment[sk]=Konfiguračný modul konzole
+Comment[sl]=Modul za nastavitve konzole
+Comment[sr]=Модул за подешавање Konsole
+Comment[sr@Latn]=Modul za podešavanje Konsole
+Comment[sv]=Anpassa Konsole
+Comment[ta]=கான்சோல் வடிவமைப்பு பகுதி
+Comment[tg]=Модули танзимоти Konsole
+Comment[th]=โมดูลปรับแต่งคอนโซล K
+Comment[tr]=Konsole Yapılandırma modülü
+Comment[tt]=Konsol caylaw modulı
+Comment[uk]=Засіб конфігурації модуля Konsole
+Comment[uz]=Terminalni moslash moduli
+Comment[uz@cyrillic]=Терминални мослаш модули
+Comment[ven]=Modulu wa nzudzanyo wa Konsole
+Comment[vi]=Cấu hình Konsole
+Comment[wa]=Module d' apontiaedje do terminå di KDE Konsole
+Comment[xh]=Umnqongo woqwalaselo we Konsole
+Comment[zh_CN]=Konsole 配置模块
+Comment[zh_TW]=Konsole 組態模組
+Comment[zu]=Ingxenye yokuhlanganisela ikhonsoli
+Keywords=konsole,schema,konsole background,colors,background,terminal application,terminal
+Keywords[az]=konsol,sxem,konsol arxa planı,rənglər,arxa plan,terminal proqramı,terminal
+Keywords[be]=Кансоль,Схема,Фон кансолі,Колеры,Фон,Тэрмінальная праграма,Тэрмінал,Эмулятар тэрміналу,konsole,schema,konsole background,colors,background,terminal application,terminal
+Keywords[bg]=конзола, терминал, konsole, schema, konsole background, colors, background, terminal application, terminal
+Keywords[ca]=consola,esquema,fons de la consola,colors,fons,aplicació de terminal,terminal
+Keywords[cs]=konsole,schéma,pozadí konsole,barvy,pozadí,terminálová aplikace,terminál
+Keywords[csb]=kònsola,schemat,spòdlé kònsolë,farwë,spòdlé,programa terminala,terminal
+Keywords[cy]=konsole,sgema,cefndir konsole,lliwiau,cefndir,cymhwysiadau terfynell,terfynell
+Keywords[da]=konsole,sammensætning,konsole-baggrund,farver,baggrund,terminalprogram,terminal
+Keywords[de]=Konsole,Farbschema,Hintergrund,Farben,Terminal
+Keywords[el]=κονσόλα,σχήμα,φόντο κονσόλας,χρώματα,φόντο,εφαρμογή τερματικού,τερματικό
+Keywords[en_GB]=konsole,schema,konsole background,colours,background,terminal application,terminal
+Keywords[eo]=Konzolo,koloraro,fono,koloro,konzolofono,terminaaplikaĵo,terminalo
+Keywords[es]=konsole,esquema,fondo de konsole,colores,fondo,aplicación de terminal,terminal
+Keywords[et]=konsool,skeem,konsooli taust,värvid,taust,terminal,terminaliemulaator
+Keywords[eu]=konsole,eskema,kontsolaren atzeko planoa,koloreak,atzeko planoa,terminal aplikazioa,terminala
+Keywords[fa]=konsole، طرحواره، زمینه konsole، رنگها، زمینه، کاربرد پایانه، پایانه
+Keywords[fi]=konsole,teema,konsolen tausta,värit,tausta,pääteohjelma,pääte,komento,komentikkuna
+Keywords[fr]=konsole,modèle,fond,couleurs,terminal
+Keywords[fy]=konsole,skema,konsole eftergrûn,colors,kleuren,background,eftergrûn,terminal applikaasje,terminal
+Keywords[ga]=konsole,scéimre,cúlra konsole,dathanna,cúlra,clár teirminéil,teirminéal
+Keywords[gl]=konsole,esquema,fondo de konsole,cores,fondo,aplicación de terminal,terminal
+Keywords[he]=מסוף,יישום מסוף,רקע,צבעים,רקע המסוף,תבנית, konsole,schema,konsole background,colors,background,terminal application,terminal
+Keywords[hi]=कंसोल,योजना,कंसोल पृष्ठभूमि,रंग,पृष्ठ भूमि,टर्मिनल अनुप्रयोग,टर्मिनल
+Keywords[hr]=konsole,schema,konsole background,colors,background,terminal application,terminal,konzola,shema,pozadina konzole,boje,pozadina,terminalska aplikacija
+Keywords[hu]=Konsole,kinézet,terminál-háttér,színek,háttér,terminálalkalmazás,terminál
+Keywords[is]=konsole,skjáhermir,skjáhermissbakgrunnur,litir,bakgrunnur,terminal application,terminal
+Keywords[it]=konsole,schema,sfondo di konsole,colori,sfondo,terminale,shell
+Keywords[ja]=konsole,schema,konsole 背景,色,背景,ターミナルアプリケーション,ターミナル
+Keywords[km]=កុងសូល,គ្រោងការណ៍,ផ្ទៃ​ខាង​ក្រោយ​កុងសូល,ពណ៌,ផ្ទៃ​ខាង​ក្រោយ,កម្មវិធី​ស្ថានីយ,ស្ថានីយ
+Keywords[lt]=konsole,schema,konsole background,colors,background,terminal application,terminal, konsolė, schema, konsolės fono spalva, spalvos, fono spalva, terminalinė programa, terminalas
+Keywords[lv]=konsole,shēma,konsoles fons,krāsas,fons,termināla aplikācija,termināls
+Keywords[mk]=konsole,schema,konsole background,colors,background,terminal application,terminal,конзола,шема,подлога на конзола,позадина на конзола,бои,подлога,позадина,терминалска апликација,терминал
+Keywords[mn]=Консол,Өнгөний схем,Дэвсгэр,Өнгө,Терминал
+Keywords[mt]=konsole,schema,konsole background,colors,background,terminal application,terminal,skema,sfond,kuluri,emulatur
+Keywords[nb]=konsole,oppsett,konsoll,konsollbakgrunn,farger,bakgrunn,terminal
+Keywords[nds]=Konsole,Muster,Klören,Achtergrund,Terminalprogramm,Terminal
+Keywords[ne]=कन्सोल, स्कीमा, कन्सोल पृष्ठभूमि, रङहरू, पृष्ठभूमि, टर्मिनल अनुप्रयोग, टर्मिनल
+Keywords[nn]=konsoll,oppsett,konsollbakgrunn,fargar,bakgrunn,terminal
+Keywords[nso]=konsole,schema,bokamorago bja konsole,mebala,bokamorago,tshomiso ya terminal,terminal
+Keywords[pa]=konsole,schema,konsole background,colors,background,terminal application,terminal,ਕੰਨਸੋਲ,ਸਕੀਮ,ਰੰਗ,ਟਰਮੀਨਲ
+Keywords[pl]=konsola,schemat,tło konsoli,kolory,tło,program terminala,terminal
+Keywords[pt]=konsole,esquema,fundo do konsole,cores,fundo,aplicação de terminal,terminal
+Keywords[pt_BR]=konsole,esquema,fundo do konsole,cores,segundo plano,aplicativo de terminal, terminal
+Keywords[ro]=consolă,konsole,schemă,fundal,terminal,aplicație terminal
+Keywords[rw]=Konsole,igishushanyombonera ,mbuganyuma ya konsole,amabara , mbuganyuma ,Porogaramu Igihera, Igihera
+Keywords[se]=konsolla,heivehus,konsolladuogás,ivnnit,duogáš,terminála
+Keywords[sk]=konsole,schéma,pozadie konzole,konzola,farby,pozadie,terminálová aplikácia,terminál
+Keywords[sl]=konsola,shema,ozadje konzole,barve,ozadje,terminalski program,terminal
+Keywords[sr]=konsole,schema,konsole background,colors,background,terminal application,terminal,терминал,боје,позадина,шема
+Keywords[sr@Latn]=konsole,schema,konsole background,colors,background,terminal application,terminal,terminal,boje,pozadina,šema
+Keywords[sv]=konsole,konsoll,schema,konsol bakgrund,färger,bakgrund,terminalprogram,terminal
+Keywords[ta]=கான்சோல்,அமைப்பு,கான்சோல் பின்ன்ணி,வண்ணங்கள்,பின்ன்ணி,கடைசி பயன்பாடு,கடைசி
+Keywords[th]=คอนโซล K,ชุดรูปแบบ,พื้นหลังคอนโซล,สี,พื้นหลัง,แอพพลิเคชันเทอร์มินัล,เทอร์มินัล
+Keywords[tr]=konsol,şema,konsol arkaplanı,renkler,arkaplan,terminal,konsole
+Keywords[uk]=konsole,схема,тло konsole,кольори,тло,програма терміналу,термінал
+Keywords[uz]=terminalning orqa foni,ranglar,orqa fon,terminal dasturi,terminal
+Keywords[uz@cyrillic]=терминалнинг орқа фони,ранглар,орқа фон,терминал дастури,терминал
+Keywords[ven]=konsole,tshikimu,vhuvha ha konsole,mivhala ya konsole,theminala,apulifikhesheni ya theminala,theminala
+Keywords[vi]=konsole,schema,ảnh nền của konsole,màu,nền,trình đầu cuối,thiết bị cuối
+Keywords[wa]=konsole,arindjmint,fond del konsole,coleurs,fond,prgrame terminå,terminå
+Keywords[xh]=konsole,schema,imvelaphi ye konsole,imibala,imvelaphi,isicelo sesiphelo sendlela,isiphelo sendlela
+Keywords[zh_CN]=konsole,schema,konsole background,colors,background,terminal application,terminal,颜色,背景色,终端程序,终端
+Keywords[zh_TW]=konsole,schema,konsole background,colors,background,terminal application,terminal,配色,konsole 背景,顏色,背景,終端機應用程式,終端機
+Keywords[zu]=konsole,iplani,inkundla yekhonsoli,imibala,inkundla, umyaleli wangaphandle,ithuluzi langaphandle
diff --git a/kcontrol/konsole/kcmkonsole.h b/kcontrol/konsole/kcmkonsole.h
new file mode 100644
index 000000000..ae6ee069b
--- /dev/null
+++ b/kcontrol/konsole/kcmkonsole.h
@@ -0,0 +1,46 @@
+/***************************************************************************
+ kcmkonsole.h
+ -------------------
+ begin : mar apr 17 16:44:59 CEST 2001
+ copyright : (C) 2001 by Andrea Rizzi
+ email : rizzi@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef KCMKONSOLE_H
+#define KCMKONSOLE_H
+
+#include <kcmodule.h>
+
+#include "kcmkonsoledialog.h"
+
+class QFont;
+class QStringList;
+
+class KCMKonsole
+ : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KCMKonsole (QWidget *parent = 0, const char *name = 0, const QStringList& = 0);
+
+ void load();
+ void load(bool useDefaults);
+ void save();
+ void defaults();
+private:
+ KCMKonsoleDialog *dialog;
+ bool xonXoffOrig;
+ bool bidiOrig;
+};
+
+#endif
diff --git a/kcontrol/konsole/kcmkonsoledialog.ui b/kcontrol/konsole/kcmkonsoledialog.ui
new file mode 100644
index 000000000..bb805ed4b
--- /dev/null
+++ b/kcontrol/konsole/kcmkonsoledialog.ui
@@ -0,0 +1,390 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KCMKonsoleDialog</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KCMKonsoleDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>507</width>
+ <height>490</height>
+ </rect>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>TabWidget2</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;General</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>GroupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Double Click</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>Consider the following characters &amp;part of a word when double clicking:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>word_connectorLE</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="0">
+ <property name="name">
+ <cstring>word_connectorLE</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>GroupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Misc</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>terminalSizeHintCB</cstring>
+ </property>
+ <property name="text">
+ <string>Show terminal si&amp;ze after resizing</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>frameCB</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;frame</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>warnCB</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Confirm quit when closing more than one session</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>blinkingCB</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Blinking cursor</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>ctrldragCB</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Require Ctrl key for drag and drop</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="5" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>cutToBeginningOfLineCB</cstring>
+ </property>
+ <property name="text">
+ <string>Triple click selects &amp;only from the current word forward</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="6" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>allowResizeCB</cstring>
+ </property>
+ <property name="text">
+ <string>Allow progr&amp;ams to resize terminal window</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="7" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>xonXoffCB</cstring>
+ </property>
+ <property name="text">
+ <string>Use Ctrl+S/Ctrl+Q flow control</string>
+ </property>
+ </widget>
+ <spacer row="11" column="3">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="8" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>bidiCB</cstring>
+ </property>
+ <property name="text">
+ <string>Enable bidirectional text rendering</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="11" column="0">
+ <property name="name">
+ <cstring>SilenceLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Seconds to detect s&amp;ilence:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>silence_secondsSB</cstring>
+ </property>
+ </widget>
+ <widget class="KIntNumInput" row="11" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>silence_secondsSB</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="KIntNumInput" row="10" column="2">
+ <property name="name">
+ <cstring>line_spacingSB</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="maxValue">
+ <number>8</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="10" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>TextLabel1_4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Line spacing:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>line_spacingSB</cstring>
+ </property>
+ </widget>
+ <spacer row="10" column="3">
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="9" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>matchTabWinTitleCB</cstring>
+ </property>
+ <property name="text">
+ <string>Set tab title to match window title</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Schema</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="SchemaEditor">
+ <property name="name">
+ <cstring>SchemaEditor1</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>S&amp;ession</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="SessionEditor">
+ <property name="name">
+ <cstring>SessionEditor1</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>SchemaEditor</class>
+ <header location="local">schemaeditor.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>7</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </customwidget>
+ <customwidget>
+ <class>SessionEditor</class>
+ <header location="local">sessioneditor.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>7</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </customwidget>
+</customwidgets>
+<includes>
+ <include location="global" impldecl="in declaration">kcolorbutton.h</include>
+ <include location="global" impldecl="in declaration">knuminput.h</include>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>schemaeditor.h</includehint>
+ <includehint>sessioneditor.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/konsole/schemadialog.ui b/kcontrol/konsole/schemadialog.ui
new file mode 100644
index 000000000..64fda6a49
--- /dev/null
+++ b/kcontrol/konsole/schemadialog.ui
@@ -0,0 +1,631 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>SchemaDialog</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SchemaDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>420</width>
+ <height>423</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Konsole Schema Editor</string>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Title:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>titleLine</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>titleLine</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Colors</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel8</cstring>
+ </property>
+ <property name="text">
+ <string>Shell co&amp;lor:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>colorCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>boldCheck</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Bold</string>
+ </property>
+ </widget>
+ <spacer row="1" column="4">
+ <property name="name" stdset="0">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KColorButton" row="1" column="3">
+ <property name="name">
+ <cstring>colorButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="2">
+ <item>
+ <property name="text">
+ <string>Custom</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>System Background</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>System Foreground</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Random Hue</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>typeCombo</cstring>
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name" stdset="0">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="2" column="2" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>transparentCheck</cstring>
+ </property>
+ <property name="text">
+ <string>Trans&amp;parent</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Konsole color:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>typeCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="0">
+ <item>
+ <property name="text">
+ <string>0 - Foreground Color</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>1 - Background Color</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>2 - Color 0 (black)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>3 - Color 1 (red)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>4 - Color 2 (green)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>5 - Color 3 (yellow)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>6 - Color 4 (blue)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>7 - Color 5 (magenta)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>8 - Color 6 (cyan)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>9 - Color 7 (white)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>10 - Foreground Intensive Color</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>11 - Background Intensive Color</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>12 - Color 0 Intensive (gray)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>13 - Color 1 Intensive (light red)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>14 - Color 2 Intensive (light green)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>15 - Color 3 Intensive (light yellow)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>16 - Color 4 Intensive (light blue)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>17 - Color 5 Intensive (light magenta)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>18 - Color 6 Intensive (light cyan)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>19 - Color 7 Intensive (white)</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>colorCombo</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0">
+ <property name="name">
+ <cstring>GroupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Schema</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>schemaList</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>defaultSchemaCB</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;et as default schema</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="0" column="0">
+ <property name="name">
+ <cstring>saveButton</cstring>
+ </property>
+ <property name="text">
+ <string>Sa&amp;ve Schema...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>removeButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove Schema</string>
+ </property>
+ </widget>
+ <spacer row="0" column="1">
+ <property name="name" stdset="0">
+ <cstring>Spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="2" column="1">
+ <property name="name">
+ <cstring>GroupBox13</cstring>
+ </property>
+ <property name="title">
+ <string>Background</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="4" column="0">
+ <property name="name" stdset="0">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLineEdit" row="1" column="0" rowspan="1" colspan="5">
+ <property name="name">
+ <cstring>backgndLine</cstring>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="1" column="5">
+ <property name="name">
+ <cstring>imageBrowse</cstring>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="3" rowspan="1" colspan="2">
+ <item>
+ <property name="text">
+ <string>Tiled</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Centered</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Full</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>modeCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>TextLabel11</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Image:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>modeCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="1">
+ <property name="name">
+ <cstring>TextLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>Min</string>
+ </property>
+ </widget>
+ <widget class="QSlider" row="5" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>shadeSlide</cstring>
+ </property>
+ <property name="value">
+ <number>50</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="4">
+ <property name="name">
+ <cstring>TextLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Max</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Shade t&amp;o:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>shadeColor</cstring>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="4" column="3" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>shadeColor</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="5">
+ <property name="name">
+ <cstring>previewPixmap</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>180</width>
+ <height>120</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>180</width>
+ <height>120</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="6">
+ <property name="name">
+ <cstring>transparencyCheck</cstring>
+ </property>
+ <property name="text">
+ <string>Tr&amp;ansparent</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name" stdset="0">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>transparencyCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>shadeSlide</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>transparencyCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>shadeColor</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>transparencyCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>TextLabel3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>transparencyCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>TextLabel6</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>transparencyCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>TextLabel5</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>transparencyCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>TextLabel5</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>defaultSchemaCB</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>defaultSchemaCB</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>transparencyCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>backgndLine</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>transparencyCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>imageBrowse</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>titleLine</tabstop>
+ <tabstop>colorCombo</tabstop>
+ <tabstop>typeCombo</tabstop>
+ <tabstop>boldCheck</tabstop>
+ <tabstop>transparentCheck</tabstop>
+ <tabstop>colorButton</tabstop>
+ <tabstop>schemaList</tabstop>
+ <tabstop>defaultSchemaCB</tabstop>
+ <tabstop>saveButton</tabstop>
+ <tabstop>removeButton</tabstop>
+ <tabstop>modeCombo</tabstop>
+ <tabstop>backgndLine</tabstop>
+ <tabstop>transparencyCheck</tabstop>
+ <tabstop>shadeColor</tabstop>
+ <tabstop>shadeSlide</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in declaration">kcolorbutton.h</include>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/konsole/schemaeditor.cpp b/kcontrol/konsole/schemaeditor.cpp
new file mode 100644
index 000000000..f7591bee8
--- /dev/null
+++ b/kcontrol/konsole/schemaeditor.cpp
@@ -0,0 +1,708 @@
+/***************************************************************************
+ schemaeditor.cpp - description
+ -------------------
+ begin : mar apr 17 16:44:59 CEST 2001
+ copyright : (C) 2001 by Andrea Rizzi
+ email : rizzi@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#define TABLE_COLORS 20
+
+
+#include "schemaeditor.h"
+#include "schemaeditor.moc"
+
+#include <dcopclient.h>
+
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qwmatrix.h>
+#include <qcombobox.h>
+#include <kdebug.h>
+#include <qcheckbox.h>
+#include <kstandarddirs.h>
+
+//#include <errno.h>
+
+#include <qslider.h>
+#include <klocale.h>
+#include <kfiledialog.h>
+#include <kinputdialog.h>
+#include <qtoolbutton.h>
+#include <kmessagebox.h>
+#include <ksharedpixmap.h>
+#include <kimageeffect.h>
+#include <qimage.h>
+
+// SchemaListBoxText is a list box text item with schema filename
+class SchemaListBoxText : public QListBoxText
+{
+ public:
+ SchemaListBoxText(const QString &title, const QString &filename): QListBoxText(title)
+ {
+ m_filename = filename;
+ };
+
+ const QString filename() { return m_filename; };
+
+ private:
+ QString m_filename;
+};
+
+
+SchemaEditor::SchemaEditor(QWidget * parent, const char *name)
+:SchemaDialog(parent, name)
+{
+ schMod= false;
+ loaded = false;
+ schemaLoaded = false;
+ change = false;
+ oldSlot = 0;
+ oldSchema = -1;
+ color.resize(20);
+ type.resize(20);
+ bold.resize(20);
+ transparent.resize(20);
+ defaultSchema = "";
+ spix = new KSharedPixmap;
+
+ connect(spix, SIGNAL(done(bool)), SLOT(previewLoaded(bool)));
+
+ DCOPClient *client = kapp->dcopClient();
+ if (!client->isAttached())
+ client->attach();
+ QByteArray data;
+
+ QDataStream args(data, IO_WriteOnly);
+ args << 1;
+ client->send("kdesktop", "KBackgroundIface", "setExport(int)", data);
+
+
+
+
+ transparencyCheck->setChecked(true);
+ transparencyCheck->setChecked(false);
+
+
+ KGlobal::locale()->insertCatalogue("konsole"); // For schema translations
+ connect(imageBrowse, SIGNAL(clicked()), this, SLOT(imageSelect()));
+ connect(saveButton, SIGNAL(clicked()), this, SLOT(saveCurrent()));
+ connect(removeButton, SIGNAL(clicked()), this, SLOT(removeCurrent()));
+ connect(colorCombo, SIGNAL(activated(int)), this, SLOT(slotColorChanged(int)));
+ connect(typeCombo, SIGNAL(activated(int)), this, SLOT(slotTypeChanged(int)));
+ connect(schemaList, SIGNAL(highlighted(int)), this, SLOT(readSchema(int)));
+ connect(shadeColor, SIGNAL(changed(const QColor&)), this, SLOT(updatePreview()));
+ connect(shadeSlide, SIGNAL(valueChanged(int)), this, SLOT(updatePreview()));
+ connect(transparencyCheck, SIGNAL(toggled(bool)), this, SLOT(updatePreview()));
+ connect(backgndLine, SIGNAL(returnPressed()), this, SLOT(updatePreview()));
+
+ connect(titleLine, SIGNAL(textChanged(const QString&)), this, SLOT(schemaModified()));
+ connect(shadeColor, SIGNAL(changed(const QColor&)), this, SLOT(schemaModified()));
+ connect(shadeSlide, SIGNAL(valueChanged(int)), this, SLOT(schemaModified()));
+ connect(transparencyCheck, SIGNAL(toggled(bool)), this, SLOT(schemaModified()));
+ connect(modeCombo, SIGNAL(activated(int)), this, SLOT(schemaModified()));
+ connect(backgndLine, SIGNAL(returnPressed()), this, SLOT(schemaModified()));
+ connect(transparentCheck, SIGNAL(toggled(bool)), this, SLOT(schemaModified()));
+ connect(boldCheck, SIGNAL(toggled(bool)), this, SLOT(schemaModified()));
+ connect(colorButton, SIGNAL(changed(const QColor&)), this, SLOT(schemaModified()));
+ connect(backgndLine, SIGNAL(textChanged(const QString&)), this, SLOT(schemaModified()));
+
+ connect(defaultSchemaCB, SIGNAL(toggled(bool)), this, SIGNAL(changed()));
+ removeButton->setEnabled( schemaList->currentItem() );
+}
+
+
+QString SchemaEditor::schema()
+{
+ QString filename = defaultSchema;
+
+ int i = schemaList->currentItem();
+ if (defaultSchemaCB->isChecked() && i>=0)
+ filename = ((SchemaListBoxText *) schemaList->item(i))->filename();
+
+ return filename.section('/',-1);
+}
+
+
+void SchemaEditor::setSchema(QString sch)
+{
+ defaultSchema = sch;
+ sch = locate("data", "konsole/"+sch);
+
+ int sc = -1;
+ for (int i = 0; i < (int) schemaList->count(); i++)
+ if (sch == ((SchemaListBoxText *) schemaList->item(i))->filename())
+ sc = i;
+
+ oldSchema = sc;
+ if (sc == -1)
+ sc = 0;
+ schemaList->setCurrentItem(sc);
+// readSchema(sc);
+}
+
+SchemaEditor::~SchemaEditor()
+{
+ delete spix;
+}
+
+
+
+void SchemaEditor::updatePreview()
+{
+
+ if (transparencyCheck->isChecked()) {
+ if (loaded) {
+ float rx = (100.0 - shadeSlide->value()) / 100;
+ QImage ima(pix.convertToImage());
+ ima = KImageEffect::fade(ima, rx, shadeColor->color());
+ QPixmap pm;
+ pm.convertFromImage(ima);
+ previewPixmap->setPixmap(pm);
+ previewPixmap->setScaledContents(true);
+ }
+ else //try to reload
+ {
+ if(!spix->loadFromShared(QString("DESKTOP1")))
+ kdDebug(0) << "cannot load" << endl;
+
+ }
+ } else {
+ QPixmap pm;
+ pm.load(backgndLine->text());
+ if ( pm.isNull() ) {
+ previewPixmap->clear();
+ } else {
+ previewPixmap->setPixmap(pm);
+ previewPixmap->setScaledContents(true);
+ }
+ }
+
+}
+
+void SchemaEditor::previewLoaded(bool l)
+{
+ if (l) {
+ QWMatrix mat;
+ pix =
+ spix->xForm(mat.
+ scale(180.0 / spix->QPixmap::width(),
+ 100.0 / spix->QPixmap::height()));
+ kdDebug(0) << "Loaded" << endl;
+ loaded = true;
+ if (transparencyCheck->isChecked()) {
+ updatePreview();
+ }
+
+ } else
+ kdDebug(0) << "error loading" << endl;
+
+}
+
+
+void SchemaEditor::getList()
+{
+ if (! schemaLoaded) {
+ loadAllSchema();
+ setSchema(defaultSchema);
+ schemaLoaded = true;
+ change = true;
+ }
+}
+
+void SchemaEditor::show()
+{
+ getList();
+ SchemaDialog::show();
+}
+
+
+void SchemaEditor::loadAllSchema(QString currentFile)
+{
+ QStringList list = KGlobal::dirs()->findAllResources("data", "konsole/*.schema");
+ QStringList::ConstIterator it;
+ disconnect(schemaList, SIGNAL(highlighted(int)), this, SLOT(readSchema(int)));
+ schemaList->clear();
+
+ QListBoxItem* currentItem = 0;
+ for (it = list.begin(); it != list.end(); ++it) {
+
+ QString name = (*it);
+
+ QString title = readSchemaTitle(name);
+
+ // Only insert new items so that local items override global
+ if (schemaList->findItem(title, ExactMatch) == 0) {
+ if (title.isNull() || title.isEmpty())
+ title=i18n("untitled");
+
+ schemaList->insertItem(new SchemaListBoxText(title, name));
+ if (currentFile==name.section('/',-1))
+ currentItem = schemaList->item( schemaList->count()-1 );
+ }
+ }
+ schemaList->sort();
+ schemaList->setCurrentItem(0); // select the first added item correctly too
+ schemaList->setCurrentItem(currentItem);
+ connect(schemaList, SIGNAL(highlighted(int)), this, SLOT(readSchema(int)));
+ schemaListChanged();
+}
+
+void SchemaEditor::imageSelect()
+{
+ QString start;
+ start = backgndLine->text();
+ if (start.isEmpty())
+ {
+ QStringList list=KGlobal::dirs()->resourceDirs("wallpaper");
+ if(list.count()>0)
+ start= list.last();
+ }
+
+ KURL url = KFileDialog::getImageOpenURL(start, 0, i18n("Select Background Image"));
+// KURL url=KFileDialog::getOpenURL(start,"",0,i18n("Select Background Image"));
+ if(!url.path().isEmpty())
+ {
+ backgndLine->setText(url.path());
+ updatePreview();
+ }
+}
+
+void SchemaEditor::slotTypeChanged(int slot)
+{
+ schemaModified();
+
+ bool active = slot == 0 || slot == 3;
+ colorButton->setEnabled(active);
+ boldCheck->setEnabled(active);
+ transparentCheck->setEnabled(active);
+}
+
+
+void SchemaEditor::slotColorChanged(int slot)
+{
+ kdDebug(0) << slot << endl;
+ color[oldSlot] = colorButton->color();
+ type[oldSlot] = typeCombo->currentItem();
+ bold[oldSlot] = boldCheck->isChecked();
+ transparent[oldSlot] = transparentCheck->isChecked();
+
+ change = false; // Don't mark as modified
+ transparentCheck->setChecked(transparent[slot]);
+ boldCheck->setChecked(bold[slot]);
+ typeCombo->setCurrentItem(type[slot]);
+ colorButton->setColor(color[slot]);
+ oldSlot = slot;
+ change = true;
+}
+
+void SchemaEditor::removeCurrent()
+{
+ int i = schemaList->currentItem();
+ if(i==-1)
+ return;
+ QString base = ((SchemaListBoxText *) schemaList->item(i))->filename();
+
+ // Query if system schemas should be removed
+ if (locateLocal("data", "konsole/" + base.section('/', -1)) != base) {
+ int code = KMessageBox::warningContinueCancel(this,
+ i18n("You are trying to remove a system schema. Are you sure?"),
+ i18n("Removing System Schema"),
+ KGuiItem(i18n("&Delete"), "editdelete"));
+ if (code != KMessageBox::Continue)
+ return;
+ }
+
+ QString base_filename = base.section('/',-1);
+
+ if(base_filename==schema())
+ setSchema("");
+
+ if (!QFile::remove(base))
+ KMessageBox::error(this,
+ i18n("Cannot remove the schema.\nMaybe it is a system schema.\n"),
+ i18n("Error Removing Schema"));
+
+ loadAllSchema();
+
+ setSchema(defaultSchema);
+
+}
+
+void SchemaEditor::saveCurrent()
+{
+
+ //This is to update the color table
+ colorCombo->setCurrentItem(0);
+ slotColorChanged(0);
+
+ QString fullpath;
+ if (schemaList->currentText() == titleLine->text()) {
+ int i = schemaList->currentItem();
+ fullpath = ((SchemaListBoxText *) schemaList->item(i))->filename().section('/',-1);
+ }
+ else {
+ // Only ask for a name for changed titleLine, considered a "save as"
+ fullpath = titleLine->text().stripWhiteSpace().simplifyWhiteSpace()+".schema";
+
+ bool ok;
+ fullpath = KInputDialog::getText( i18n( "Save Schema" ),
+ i18n( "File name:" ), fullpath, &ok, this );
+ if (!ok) return;
+ }
+
+ if (fullpath[0] != '/')
+ fullpath = KGlobal::dirs()->saveLocation("data", "konsole/") + fullpath;
+
+ QFile f(fullpath);
+ if (f.open(IO_WriteOnly)) {
+ QTextStream t(&f);
+ t.setEncoding( QTextStream::UnicodeUTF8 );
+
+ t << "# schema for konsole autogenerated with the schema editor" << endl;
+ t << endl;
+ t << "title " << titleLine->text() << endl; // Use title line as schema title
+ t << endl;
+ if (transparencyCheck->isChecked()) {
+ QColor c = shadeColor->color();
+ QString tra;
+ tra.sprintf("transparency %1.2f %3d %3d %3d",
+ 1.0 * (100 - shadeSlide->value()) / 100, c.red(), c.green(), c.blue());
+ t << tra << endl;
+ }
+
+ if (!backgndLine->text().isEmpty()) {
+ QString smode;
+ int mode;
+ mode = modeCombo->currentItem();
+ if (mode == 0)
+ smode = "tile";
+ if (mode == 1)
+ smode = "center";
+ if (mode == 2)
+ smode = "full";
+
+ QString image;
+ image.sprintf("image %s %s",
+ (const char *) smode.latin1(),
+ (const char *) backgndLine->text().utf8());
+ t << image << endl;
+ }
+ t << endl;
+ t << "# foreground colors" << endl;
+ t << endl;
+ t << "# note that the default background color is flagged" << endl;
+ t << "# to become transparent when an image is present." << endl;
+ t << endl;
+ t << "# slot transparent bold" << endl;
+ t << "# | red grn blu | |" << endl;
+ t << "# V V--color--V V V" << endl;
+
+ for (int i = 0; i < 20; i++) {
+ QString scol;
+ if (type[i] == 0)
+ scol.sprintf("color %2d %3d %3d %3d %2d %1d # %s", i,
+ color[i].red(), color[i].green(), color[i].blue(),
+ transparent[i], bold[i],
+ (const char *) colorCombo->text(i).utf8());
+ else if (type[i] == 1)
+ scol.sprintf("sysfg %2d %2d %1d # %s", i,
+ transparent[i], bold[i],
+ (const char *) colorCombo->text(i).utf8());
+ else if (type[i] == 2)
+ scol.sprintf("sysbg %2d %2d %1d # %s", i,
+ transparent[i], bold[i],
+ (const char *) colorCombo->text(i).utf8());
+ else {
+ int ch, cs, cv;
+ color[i].hsv(&ch, &cs, &cv);
+ scol.sprintf("rcolor %1d %3d %3d %2d %1d # %s", i,
+ cs, cv, transparent[i], bold[i],
+ (const char *) colorCombo->text(i).utf8());
+ }
+ t << scol << endl;
+ }
+
+
+ f.close();
+ } else
+ KMessageBox::error(this, i18n("Cannot save the schema.\nMaybe permission denied.\n"),
+ i18n("Error Saving Schema"));
+
+ schMod=false;
+ loadAllSchema(fullpath.section('/',-1));
+}
+
+void SchemaEditor::schemaModified()
+{
+ if (change) {
+ saveButton->setEnabled(titleLine->text().length() != 0);
+ schMod=true;
+ emit changed();
+ }
+}
+
+QString SchemaEditor::readSchemaTitle(const QString & file)
+{
+ /*
+ Code taken from konsole/konsole/schema.cpp
+
+ */
+
+
+ QString fPath = locate("data", "konsole/" + file);
+
+ if (fPath.isNull())
+ fPath = locate("data", file);
+
+ if (fPath.isNull())
+ return 0;
+
+ FILE *sysin = fopen(QFile::encodeName(fPath), "r");
+ if (!sysin)
+ return 0;
+
+
+ char line[100];
+ while (fscanf(sysin, "%80[^\n]\n", line) > 0)
+ if (strlen(line) > 5)
+ if (!strncmp(line, "title", 5)) {
+ fclose(sysin);
+ return i18n(line + 6);
+ }
+
+ return 0;
+}
+
+void SchemaEditor::schemaListChanged()
+{
+ QStringList titles, filenames;
+ SchemaListBoxText *item;
+
+ for (int index = 0; index < (int) schemaList->count(); index++) {
+ item = (SchemaListBoxText *) schemaList->item(index);
+ titles.append(item->text());
+ filenames.append(item->filename().section('/', -1));
+ }
+
+ emit schemaListChanged(titles, filenames);
+}
+
+void SchemaEditor::querySave()
+{
+ int result = KMessageBox::questionYesNo(this,
+ i18n("The schema has been modified.\n"
+ "Do you want to save the changes?"),
+ i18n("Schema Modified"),
+ KStdGuiItem::save(),
+ KStdGuiItem::discard());
+ if (result == KMessageBox::Yes)
+ {
+ saveCurrent();
+ }
+}
+
+void SchemaEditor::readSchema(int num)
+{
+ /*
+ Code taken from konsole/konsole/schema.cpp
+
+ */
+
+ if (oldSchema != -1) {
+
+
+ if (defaultSchemaCB->isChecked()) {
+
+ defaultSchema = ((SchemaListBoxText *) schemaList->item(oldSchema))->filename();
+
+ }
+
+ if(schMod) {
+ disconnect(schemaList, SIGNAL(highlighted(int)), this, SLOT(readSchema(int)));
+ schemaList->setCurrentItem(oldSchema);
+ querySave();
+ schemaList->setCurrentItem(num);
+ connect(schemaList, SIGNAL(highlighted(int)), this, SLOT(readSchema(int)));
+ schMod=false;
+ }
+
+ }
+
+ QString fPath = locate("data", "konsole/" +
+ ((SchemaListBoxText *) schemaList->item(num))->filename());
+
+ if (fPath.isNull())
+ fPath = locate("data",
+ ((SchemaListBoxText *) schemaList->item(num))->filename());
+
+ if (fPath.isNull()) {
+ KMessageBox::error(this, i18n("Cannot find the schema."),
+ i18n("Error Loading Schema"));
+
+
+ return;
+ }
+ removeButton->setEnabled( QFileInfo (fPath).isWritable () );
+ defaultSchemaCB->setChecked(fPath.section('/',-1) == defaultSchema.section('/',-1));
+
+ FILE *sysin = fopen(QFile::encodeName(fPath), "r");
+ if (!sysin) {
+ KMessageBox::error(this, i18n("Cannot load the schema."),
+ i18n("Error Loading Schema"));
+ loadAllSchema();
+ return;
+ }
+
+ char line[100];
+
+
+ titleLine->setText(i18n("untitled"));
+ transparencyCheck->setChecked(false);
+ backgndLine->setText("");
+
+ while (fscanf(sysin, "%80[^\n]\n", line) > 0) {
+ if (strlen(line) > 5) {
+
+ if (!strncmp(line, "title", 5)) {
+ titleLine->setText(i18n(line + 6));
+ }
+
+
+
+ if (!strncmp(line, "image", 5)) {
+ char rend[100], path[100];
+ int attr = 1;
+ if (sscanf(line, "image %s %s", rend, path) != 2)
+ continue;
+ if (!strcmp(rend, "tile"))
+ attr = 2;
+ else if (!strcmp(rend, "center"))
+ attr = 3;
+ else if (!strcmp(rend, "full"))
+ attr = 4;
+ else
+ continue;
+
+ QString qline(line);
+ backgndLine->setText(locate("wallpaper", qline.mid( qline.find(" ",7)+1 ) ));
+ modeCombo->setCurrentItem(attr - 2);
+
+ }
+
+
+ if (!strncmp(line, "transparency", 12)) {
+ float rx;
+ int rr, rg, rb;
+ // Transparency needs 4 parameters: fade strength and the 3
+ // components of the fade color.
+ if (sscanf(line, "transparency %g %d %d %d", &rx, &rr, &rg, &rb) != 4)
+ continue;
+
+ transparencyCheck->setChecked(true);
+ shadeSlide->setValue((int)(100 - rx * 100));
+ shadeColor->setColor(QColor(rr, rg, rb));
+
+ }
+ if (!strncmp(line,"rcolor",6)) {
+ int fi,ch,cs,cv,tr,bo;
+ if(sscanf(line,"rcolor %d %d %d %d %d",&fi,&cs,&cv,&tr,&bo) != 5)
+ continue;
+ if (!(0 <= fi && fi <= TABLE_COLORS))
+ continue;
+ ch = 0; // Random hue - set to zero
+ if (!(0 <= cs && cs <= 255 ))
+ continue;
+ if (!(0 <= cv && cv <= 255 ))
+ continue;
+ if (!(0 <= tr && tr <= 1 ))
+ continue;
+ if (!(0 <= bo && bo <= 1 ))
+ continue;
+ color[fi] = QColor();
+ color[fi].setHsv(ch,cs,cv);
+ transparent[fi] = tr;
+ bold[fi] = bo;
+ type[fi] = 3;
+ }
+ if (!strncmp(line, "color", 5)) {
+ int fi, cr, cg, cb, tr, bo;
+ if (sscanf(line, "color %d %d %d %d %d %d", &fi, &cr, &cg, &cb, &tr, &bo) != 6)
+ continue;
+ if (!(0 <= fi && fi <= TABLE_COLORS))
+ continue;
+ if (!(0 <= cr && cr <= 255))
+ continue;
+ if (!(0 <= cg && cg <= 255))
+ continue;
+ if (!(0 <= cb && cb <= 255))
+ continue;
+ if (!(0 <= tr && tr <= 1))
+ continue;
+ if (!(0 <= bo && bo <= 1))
+ continue;
+ color[fi] = QColor(cr, cg, cb);
+ transparent[fi] = tr;
+ bold[fi] = bo;
+ type[fi] = 0;
+
+ }
+ if (!strncmp(line, "sysfg", 5)) {
+ int fi, tr, bo;
+ if (sscanf(line, "sysfg %d %d %d", &fi, &tr, &bo) != 3)
+ continue;
+ if (!(0 <= fi && fi <= TABLE_COLORS))
+ continue;
+ if (!(0 <= tr && tr <= 1))
+ continue;
+ if (!(0 <= bo && bo <= 1))
+ continue;
+ color[fi] = kapp->palette().active().text();
+ transparent[fi] = tr;
+ bold[fi] = bo;
+ type[fi] = 1;
+ }
+ if (!strncmp(line, "sysbg", 5)) {
+ int fi, tr, bo;
+ if (sscanf(line, "sysbg %d %d %d", &fi, &tr, &bo) != 3)
+ continue;
+ if (!(0 <= fi && fi <= TABLE_COLORS))
+ continue;
+ if (!(0 <= tr && tr <= 1))
+ continue;
+ if (!(0 <= bo && bo <= 1))
+ continue;
+ color[fi] = kapp->palette().active().base();
+ transparent[fi] = tr;
+ bold[fi] = bo;
+ type[fi] = 2;
+ }
+ }
+ }
+ fclose(sysin);
+ int ii = colorCombo->currentItem();
+ transparentCheck->setChecked(transparent[ii]);
+ boldCheck->setChecked(bold[ii]);
+ typeCombo->setCurrentItem(type[ii]);
+ colorButton->setColor(color[ii]);
+
+ bool inactive = type[ii] == 1 || type[ii] == 2;
+ boldCheck->setDisabled(inactive);
+ transparentCheck->setDisabled(inactive);
+ colorButton->setDisabled(inactive);
+
+ oldSchema = num;
+ updatePreview();
+ schMod=false;
+ return;
+}
+
diff --git a/kcontrol/konsole/schemaeditor.h b/kcontrol/konsole/schemaeditor.h
new file mode 100644
index 000000000..550f51762
--- /dev/null
+++ b/kcontrol/konsole/schemaeditor.h
@@ -0,0 +1,84 @@
+/***************************************************************************
+ schemaeditor.h - description
+ -------------------
+ begin : mar apr 17 16:44:59 CEST 2001
+ copyright : (C) 2001 by Andrea Rizzi
+ email : rizzi@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef SCHEMAEDITOR_H
+#define SCHEMAEDITOR_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kapplication.h>
+#include <qwidget.h>
+class QPixmap;
+class KSharedPixmap;
+
+#include "schemadialog.h"
+
+/** SchemaEditor is the base class of the porject */
+class SchemaEditor : public SchemaDialog
+{
+ Q_OBJECT
+ public:
+ /** constructor */
+ SchemaEditor(QWidget* parent=0, const char *name=0);
+ /** destructor */
+ ~SchemaEditor();
+
+ QString schema();
+ void setSchema(QString);
+ bool isModified() const { return schMod; }
+ void querySave();
+
+ signals:
+ void changed();
+ void schemaListChanged(const QStringList &titles, const QStringList &filenames);
+
+ public slots:
+ void slotColorChanged(int);
+ void imageSelect();
+ void slotTypeChanged(int);
+ void readSchema(int);
+ void saveCurrent();
+ void removeCurrent();
+ void previewLoaded(bool l);
+ void getList();
+ private slots:
+ void show();
+ void schemaModified();
+ void loadAllSchema(QString currentFile="");
+ void updatePreview();
+ private:
+ bool schMod;
+ QMemArray<QColor> color;
+ QMemArray<int> type; // 0= custom, 1= sysfg, 2=sysbg, 3=rcolor
+ QMemArray<bool> transparent;
+ QMemArray<bool> bold;
+ QPixmap pix;
+ KSharedPixmap *spix;
+ QString defaultSchema;
+ bool loaded;
+ bool schemaLoaded;
+ bool change;
+ int oldSchema;
+ int oldSlot;
+ QString readSchemaTitle(const QString& filename);
+ void schemaListChanged();
+
+};
+
+#endif
diff --git a/kcontrol/konsole/sessiondialog.ui b/kcontrol/konsole/sessiondialog.ui
new file mode 100644
index 000000000..a86a74077
--- /dev/null
+++ b/kcontrol/konsole/sessiondialog.ui
@@ -0,0 +1,446 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SessionDialog</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SessionDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>436</width>
+ <height>476</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Konsole Session Editor</string>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="1" column="1">
+ <property name="name">
+ <cstring>propertiesGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Properties</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout29</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>&lt;Default&gt;</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Normal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Tiny</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Small</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Medium</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Large</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Huge</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Linux</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Unicode</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Custom</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>fontCombo</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>termLine</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>keytabCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Font:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>fontCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="5" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>schemaCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>TextLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;chema:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>schemaCombo</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel8</cstring>
+ </property>
+ <property name="text">
+ <string>$&amp;TERM:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>termLine</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>TextLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Keytab:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>keytabCombo</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="KIconButton" row="0" column="1">
+ <property name="name">
+ <cstring>previewIcon</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>100</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>100</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>90</width>
+ <height>100</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&amp;Icon:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignTop|AlignLeft</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>previewIcon</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>sessionGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Session</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>sessionList</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="0" column="0">
+ <property name="name">
+ <cstring>saveButton</cstring>
+ </property>
+ <property name="text">
+ <string>Sa&amp;ve Session...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>removeButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove Session</string>
+ </property>
+ </widget>
+ <spacer row="0" column="1">
+ <property name="name">
+ <cstring>Spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>generalGroup</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>General</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>nameLine</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>E&amp;xecute:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>executeLine</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Directory:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>directoryLine</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>nameLine</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>executeLine</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>directoryLine</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>nameLine</tabstop>
+ <tabstop>executeLine</tabstop>
+ <tabstop>directoryLine</tabstop>
+ <tabstop>sessionList</tabstop>
+ <tabstop>saveButton</tabstop>
+ <tabstop>removeButton</tabstop>
+ <tabstop>previewIcon</tabstop>
+ <tabstop>fontCombo</tabstop>
+ <tabstop>termLine</tabstop>
+ <tabstop>keytabCombo</tabstop>
+ <tabstop>schemaCombo</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in declaration">kcolorbutton.h</include>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kicondialog.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/konsole/sessioneditor.cpp b/kcontrol/konsole/sessioneditor.cpp
new file mode 100644
index 000000000..8542adfcb
--- /dev/null
+++ b/kcontrol/konsole/sessioneditor.cpp
@@ -0,0 +1,383 @@
+/***************************************************************************
+ sessioneditor.cpp - description
+ -------------------
+ begin : oct 28 2001
+ copyright : (C) 2001 by Stephan Binner
+ email : binner@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "sessioneditor.h"
+#include "sessioneditor.moc"
+
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+
+#include <klocale.h>
+#include <kfiledialog.h>
+#include <kinputdialog.h>
+#include <kicondialog.h>
+#include <kmessagebox.h>
+#include <kurlrequester.h>
+#include <klineedit.h>
+#include <kiconloader.h>
+#include <krun.h>
+#include <kshell.h>
+
+// SessionListBoxText is a list box text item with session filename
+class SessionListBoxText : public QListBoxText
+{
+ public:
+ SessionListBoxText(const QString &title, const QString &filename): QListBoxText(title)
+ {
+ m_filename = filename;
+ };
+
+ const QString filename() { return m_filename; };
+
+ private:
+ QString m_filename;
+};
+
+SessionEditor::SessionEditor(QWidget * parent, const char *name)
+:SessionDialog(parent, name)
+{
+ sesMod=false;
+ oldSession=-1;
+ loaded=false;
+
+ KGlobal::locale()->insertCatalogue("konsole"); // For schema and keytab translations
+ KGlobal::iconLoader()->addAppDir( "konsole" );
+
+ directoryLine->setMode(KFile::Directory);
+ connect(sessionList, SIGNAL(highlighted(int)), this, SLOT(readSession(int)));
+ connect(saveButton, SIGNAL(clicked()), this, SLOT(saveCurrent()));
+ connect(removeButton, SIGNAL(clicked()), this, SLOT(removeCurrent()));
+
+ connect(nameLine, SIGNAL(textChanged(const QString&)), this, SLOT(sessionModified()));
+ connect(directoryLine, SIGNAL(textChanged(const QString&)), this, SLOT(sessionModified()));
+ connect(executeLine, SIGNAL(textChanged(const QString&)), this, SLOT(sessionModified()));
+ connect(termLine, SIGNAL(textChanged(const QString&)), this, SLOT(sessionModified()));
+
+ connect(previewIcon, SIGNAL(iconChanged(QString)), this, SLOT(sessionModified()));
+
+ connect(fontCombo, SIGNAL(activated(int)), this, SLOT(sessionModified()));
+ connect(keytabCombo, SIGNAL(activated(int)), this, SLOT(sessionModified()));
+ connect(schemaCombo, SIGNAL(activated(int)), this, SLOT(sessionModified()));
+}
+
+SessionEditor::~SessionEditor()
+{
+ keytabFilename.setAutoDelete(true);
+ schemaFilename.setAutoDelete(true);
+}
+
+void SessionEditor::show()
+{
+ removeButton->setEnabled(sessionList->count()>1);
+ if (! loaded) {
+ loadAllKeytab();
+ loadAllSession();
+ readSession(0);
+ sessionList->setCurrentItem(0);
+ loaded = true;
+ }
+ SessionDialog::show();
+}
+
+void SessionEditor::loadAllKeytab()
+{
+ QStringList lst = KGlobal::dirs()->findAllResources("data", "konsole/*.keytab");
+ keytabCombo->clear();
+ keytabFilename.clear();
+
+ keytabCombo->insertItem(i18n("XTerm (XFree 4.x.x)"),0);
+ keytabFilename.append(new QString(""));
+
+ int i=1;
+ for(QStringList::Iterator it = lst.begin(); it != lst.end(); ++it )
+ {
+ QString name = (*it);
+ QString title = readKeymapTitle(name);
+
+ name = name.section('/',-1);
+ name = name.section('.',0);
+ keytabFilename.append(new QString(name));
+
+ if (title.isNull() || title.isEmpty())
+ title=i18n("untitled");
+
+ keytabCombo->insertItem(title,i);
+
+ i++;
+ }
+}
+
+QString SessionEditor::readKeymapTitle(const QString & file)
+{
+ QString fPath = locate("data", "konsole/" + file);
+
+ if (fPath.isNull())
+ fPath = locate("data", file);
+ removeButton->setEnabled( QFileInfo (fPath).isWritable () );
+
+ if (fPath.isNull())
+ return 0;
+
+ FILE *sysin = fopen(QFile::encodeName(fPath), "r");
+ if (!sysin)
+ return 0;
+
+ char line[100];
+ int len;
+ while (fscanf(sysin, "%80[^\n]\n", line) > 0)
+ if ((len = strlen(line)) > 8)
+ if (!strncmp(line, "keyboard", 8)) {
+ fclose(sysin);
+ if(line[len-1] == '"')
+ line[len-1] = '\000';
+ QString temp;
+ if(line[9] == '"')
+ temp=i18n(line+10);
+ else
+ temp=i18n(line+9);
+ return temp;
+ }
+
+ return 0;
+}
+
+void SessionEditor::loadAllSession(QString currentFile)
+{
+ QStringList list = KGlobal::dirs()->findAllResources("data", "konsole/*.desktop", false, true);
+ sessionList->clear();
+
+ QListBoxItem* currentItem = 0;
+ for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) {
+
+ QString name = (*it);
+
+ KSimpleConfig* co = new KSimpleConfig(name,true);
+ co->setDesktopGroup();
+ QString sesname = co->readEntry("Name",i18n("Unnamed"));
+ delete co;
+
+ sessionList->insertItem(new SessionListBoxText(sesname, name));
+
+ if (currentFile==name.section('/',-1))
+ currentItem = sessionList->item( sessionList->count()-1 );
+ }
+ sessionList->sort();
+ sessionList->setCurrentItem(0); // select the first added item correctly too
+ sessionList->setCurrentItem(currentItem);
+ emit getList();
+}
+
+void SessionEditor::readSession(int num)
+{
+ int i,counter;
+ QString str;
+ KSimpleConfig* co;
+
+ if(sesMod) {
+ disconnect(sessionList, SIGNAL(highlighted(int)), this, SLOT(readSession(int)));
+
+ sessionList->setCurrentItem(oldSession);
+ querySave();
+ sessionList->setCurrentItem(num);
+ connect(sessionList, SIGNAL(highlighted(int)), this, SLOT(readSession(int)));
+ sesMod=false;
+ }
+ if( sessionList->item(num) )
+ {
+ removeButton->setEnabled( QFileInfo ( ((SessionListBoxText *)sessionList->item(num))->filename() ).isWritable () );
+ co = new KSimpleConfig( ((SessionListBoxText *)sessionList->item(num))->filename(),true);
+
+ co->setDesktopGroup();
+ str = co->readEntry("Name");
+ nameLine->setText(str);
+
+ str = co->readPathEntry("Cwd");
+ directoryLine->lineEdit()->setText(str);
+
+ str = co->readPathEntry("Exec");
+ executeLine->setText(str);
+
+ str = co->readEntry("Icon","konsole");
+ previewIcon->setIcon(str);
+
+ i = co->readUnsignedNumEntry("Font",(unsigned int)-1);
+ fontCombo->setCurrentItem(i+1);
+
+ str = co->readEntry("Term","xterm");
+ termLine->setText(str);
+
+ str = co->readEntry("KeyTab","");
+ i=0;
+ counter=0;
+ for (QString *it = keytabFilename.first(); it != 0; it = keytabFilename.next()) {
+ if (str == (*it))
+ i = counter;
+ counter++;
+ }
+ keytabCombo->setCurrentItem(i);
+
+ str = co->readEntry("Schema","");
+ i=0;
+ counter=0;
+ for (QString *it = schemaFilename.first(); it != 0; it = schemaFilename.next()) {
+ if (str == (*it))
+ i = counter;
+ counter++;
+ }
+ schemaCombo->setCurrentItem(i);
+ delete co;
+ }
+ sesMod=false;
+ oldSession=num;
+}
+
+void SessionEditor::querySave()
+{
+ int result = KMessageBox::questionYesNo(this,
+ i18n("The session has been modified.\n"
+ "Do you want to save the changes?"),
+ i18n("Session Modified"),
+ KStdGuiItem::save(),
+ KStdGuiItem::discard());
+ if (result == KMessageBox::Yes)
+ {
+ saveCurrent();
+ }
+}
+
+void SessionEditor::schemaListChanged(const QStringList &titles, const QStringList &filenames)
+{
+ const QString text = schemaCombo->currentText();
+
+ schemaCombo->clear();
+ schemaFilename.clear();
+
+ schemaCombo->insertItem(i18n("Konsole Default"),0);
+ schemaFilename.append(new QString(""));
+
+ schemaCombo->insertStringList(titles, 1);
+ for (QStringList::const_iterator it = filenames.begin(); it != filenames.end(); ++it)
+ schemaFilename.append(new QString(*it));
+
+ // Restore current item
+ int item = 0;
+ for (int i = 0; i < schemaCombo->count(); i++)
+ if (schemaCombo->text(i) == text) {
+ item = i;
+ break;
+ }
+ schemaCombo->setCurrentItem(item);
+}
+
+void SessionEditor::saveCurrent()
+{
+ // Verify Execute entry is valid; otherwise Konsole will ignore it.
+ // This code is take from konsole.cpp; if you change one, change both.
+ QString exec = executeLine->text();
+ if ( !exec.isEmpty() ) // If Execute field is empty, default shell is used.
+ {
+ if ( exec.startsWith( "su -c \'" ) )
+ exec = exec.mid( 7, exec.length() - 8 );
+ exec = KRun::binaryName( exec, false );
+ exec = KShell::tildeExpand( exec );
+ QString pexec = KGlobal::dirs()->findExe( exec );
+
+ if ( pexec.isEmpty() )
+ {
+ int result = KMessageBox::warningContinueCancel( this,
+ i18n( "The Execute entry is not a valid command.\n"
+ "You can still save this session, but it will not show up in Konsole's Session list." ),
+ i18n( "Invalid Execute Entry" ),
+ KStdGuiItem::save() );
+ if ( result != KMessageBox::Continue )
+ return;
+ }
+
+ }
+
+ QString fullpath;
+ if (sessionList->currentText() == nameLine->text()) {
+ fullpath = ( ((SessionListBoxText *)sessionList->item( sessionList->currentItem() ))->filename() ).section('/',-1);
+ }
+ else {
+ // Only ask for a name for changed nameLine, considered a "save as"
+ fullpath = nameLine->text().stripWhiteSpace().simplifyWhiteSpace()+".desktop";
+
+ bool ok;
+ fullpath = KInputDialog::getText( i18n( "Save Session" ),
+ i18n( "File name:" ), fullpath, &ok, this );
+ if (!ok) return;
+ }
+
+ if (fullpath[0] != '/')
+ fullpath = KGlobal::dirs()->saveLocation("data", "konsole/") + fullpath;
+
+ KSimpleConfig* co = new KSimpleConfig(fullpath);
+ co->setDesktopGroup();
+ co->writeEntry("Type","KonsoleApplication");
+ co->writeEntry("Name",nameLine->text());
+ co->writePathEntry("Cwd",directoryLine->lineEdit()->text());
+ co->writePathEntry("Exec",executeLine->text());
+ co->writeEntry("Icon",previewIcon->icon());
+ if (fontCombo->currentItem()==0)
+ co->writeEntry("Font","");
+ else
+ co->writeEntry("Font",fontCombo->currentItem()-1);
+ co->writeEntry("Term",termLine->text());
+ co->writeEntry("KeyTab",*keytabFilename.at(keytabCombo->currentItem()));
+ co->writeEntry("Schema",*schemaFilename.at(schemaCombo->currentItem()));
+ co->sync();
+ delete co;
+ sesMod=false;
+ loadAllSession(fullpath.section('/',-1));
+ removeButton->setEnabled(sessionList->count()>1);
+}
+
+void SessionEditor::removeCurrent()
+{
+ QString base = ((SessionListBoxText *)sessionList->item( sessionList->currentItem() ))->filename();
+
+ // Query if system sessions should be removed
+ if (locateLocal("data", "konsole/" + base.section('/', -1)) != base) {
+ int code = KMessageBox::warningContinueCancel(this,
+ i18n("You are trying to remove a system session. Are you sure?"),
+ i18n("Removing System Session"),
+ KGuiItem(i18n("&Delete"),"editdelete"));
+ if (code != KMessageBox::Continue)
+ return;
+ }
+
+ if (!QFile::remove(base)) {
+ KMessageBox::error(this,
+ i18n("Cannot remove the session.\nMaybe it is a system session.\n"),
+ i18n("Error Removing Session"));
+ return;
+ }
+ removeButton->setEnabled(sessionList->count()>1);
+ loadAllSession();
+ readSession(0);
+ sessionList->setCurrentItem(0);
+}
+
+void SessionEditor::sessionModified()
+{
+ saveButton->setEnabled(nameLine->text().length() != 0);
+ sesMod=true;
+ emit changed();
+}
diff --git a/kcontrol/konsole/sessioneditor.h b/kcontrol/konsole/sessioneditor.h
new file mode 100644
index 000000000..15d1aee2b
--- /dev/null
+++ b/kcontrol/konsole/sessioneditor.h
@@ -0,0 +1,68 @@
+/***************************************************************************
+ sessioneditor.h - description
+ -------------------
+ begin : oct 28 2001
+ copyright : (C) 2001 by Stephan Binner
+ email : binner@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef SESSIONEDITOR_H
+#define SESSIONEDITOR_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qptrlist.h>
+#include <qstringlist.h>
+#include <kapplication.h>
+#include <qwidget.h>
+
+#include "sessiondialog.h"
+
+class SessionEditor : public SessionDialog
+{
+ Q_OBJECT
+ public:
+ SessionEditor(QWidget* parent=0, const char *name=0);
+ ~SessionEditor();
+
+ bool isModified() const { return sesMod; }
+ void querySave();
+
+ signals:
+ void changed();
+ void getList();
+
+ public slots:
+ void schemaListChanged(const QStringList &titles, const QStringList &filenames);
+
+ private slots:
+ void readSession(int);
+ void saveCurrent();
+ void removeCurrent();
+ void sessionModified();
+
+ private:
+ void show();
+ void loadAllKeytab();
+ void loadAllSession(QString currentFile="");
+ QString readKeymapTitle(const QString& filename);
+
+ bool sesMod;
+ int oldSession;
+ bool loaded;
+ QPtrList<QString> keytabFilename;
+ QPtrList<QString> schemaFilename;
+};
+
+#endif
diff --git a/kcontrol/krdb/AUTHORS b/kcontrol/krdb/AUTHORS
new file mode 100644
index 000000000..e0808125b
--- /dev/null
+++ b/kcontrol/krdb/AUTHORS
@@ -0,0 +1,9 @@
+Display Configuration Modules:
+
+ Martin Jones (mjones@powerup.com.au)
+ Mark Donohoe (donohoe@kde.org)
+ Geert Jansen (g.t.jansen@stud.tue.nl)
+
+Conversion to kcontrol applet:
+
+ Matthias Hoelzer (hoelzer@physik.uni-wuerzburg.de)
diff --git a/kcontrol/krdb/Makefile.am b/kcontrol/krdb/Makefile.am
new file mode 100644
index 000000000..6bd22e322
--- /dev/null
+++ b/kcontrol/krdb/Makefile.am
@@ -0,0 +1,15 @@
+AM_CPPFLAGS = $(all_includes)
+
+SUBDIRS = . themes kcs ad pics
+
+
+noinst_LTLIBRARIES = libkrdb.la
+libkrdb_la_SOURCES = krdb.cpp
+libkrdb_la_LIBADD = $(LIB_KDECORE)
+libkrdb_la_LDFLAGS = -no-undefined $(all_libraries)
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/krdb.pot
+
+update_DATA = kcmdisplayrc.upd
+updatedir = $(kde_datadir)/kconf_update
diff --git a/kcontrol/krdb/ad/AAAAAAGeneral.ad b/kcontrol/krdb/ad/AAAAAAGeneral.ad
new file mode 100644
index 000000000..d398d410e
--- /dev/null
+++ b/kcontrol/krdb/ad/AAAAAAGeneral.ad
@@ -0,0 +1,2 @@
+*background: BACKGROUND
+*foreground: FOREGROUND
diff --git a/kcontrol/krdb/ad/AAAMotif.ad b/kcontrol/krdb/ad/AAAMotif.ad
new file mode 100644
index 000000000..af36763ef
--- /dev/null
+++ b/kcontrol/krdb/ad/AAAMotif.ad
@@ -0,0 +1,74 @@
+*XmScrollBar.background: BACKGROUND
+*XmScrollBar.foreground: FOREGROUND
+
+*XmSash.background: BACKGROUND
+*XmSash.foreground: FOREGROUND
+
+*XmLabel.background: BACKGROUND
+*XmLabel.foreground: FOREGROUND
+*XmLabelGadget.background: BACKGROUND
+*XmLabelGadget.foreground: FOREGROUND
+
+*XmCascadeButton.background: BACKGROUND
+*XmCascadeButton.foreground: FOREGROUND
+*XmCascadeButtonGadget.background: BACKGROUND
+*XmCascadeButtonGadget.foreground: FOREGROUND
+
+*XmToggleButton.background: BACKGROUND
+*XmToggleButton.foreground: FOREGROUND
+*XmToggleButtonGadget.background: BACKGROUND
+*XmToggleButtonGadget.foreground: FOREGROUND
+
+*XmPushButton.background: BACKGROUND
+*XmPushButton.foreground: FOREGROUND
+*XmPushButtonGadget.background: BACKGROUND
+*XmPushButtonGadget.foreground: FOREGROUND
+
+*XmSeparator.background: BACKGROUND
+*XmSeparator.foreground: FOREGROUND
+*XmSeparatorGadget.background: BACKGROUND
+*XmSeparatorGadget.foreground: FOREGROUND
+
+*XmTearOffButton.background: BACKGROUND
+*XmTearOffButton.foreground: FOREGROUND
+*XmTearOffButtonGadget.background: BACKGROUND
+*XmTearOffButtonGadget.foreground: FOREGROUND
+
+*XmMenuShell.background: BACKGROUND
+*XmMenuShell.foreground: FOREGROUND
+
+*XmDialogShell.background: BACKGROUND
+*XmDialogShell.foreground: FOREGROUND
+
+*XmFileSelectionBox.background: BACKGROUND
+*XmFileSelectionBox.foreground: FOREGROUND
+
+*XmSelectionBox.background: BACKGROUND
+*XmSelectionBox.foreground: FOREGROUND
+
+*XmMessageBox.background: BACKGROUND
+*XmMessageBox.foreground: FOREGROUND
+
+*XmRowColumn.background: BACKGROUND
+*XmRowColumn.foreground: FOREGROUND
+
+*XmFrame.background: BACKGROUND
+*XmFrame.foreground: FOREGROUND
+
+*XmForm.background: BACKGROUND
+*XmForm.foreground: FOREGROUND
+
+*XmScrolledWindow.background: BACKGROUND
+*XmScrolledWindow.foreground: FOREGROUND
+
+*XmPanedWindow.background: BACKGROUND
+*XmPanedWindow.foreground: FOREGROUND
+
+*XmText.background: WINDOW_BACKGROUND
+*XmText.foreground: WINDOW_FOREGROUND
+
+*XmTextField.background: WINDOW_BACKGROUND
+*XmTextField.foreground: WINDOW_FOREGROUND
+
+*XmList.background: WINDOW_BACKGROUND
+*XmList.foreground: WINDOW_FOREGROUND
diff --git a/kcontrol/krdb/ad/AAATk.ad b/kcontrol/krdb/ad/AAATk.ad
new file mode 100644
index 000000000..33a12009f
--- /dev/null
+++ b/kcontrol/krdb/ad/AAATk.ad
@@ -0,0 +1,107 @@
+*Toplevel.background: BACKGROUND
+*Toplevel.foreground: FOREGROUND
+*Toplevel.highlightBackground: BACKGROUND
+*Toplevel.highlightColor: FOREGROUND
+*Toplevel.activeBackground: BACKGROUND
+*Toplevel.activeForeground: FOREGROUND
+
+*Button.background: BACKGROUND
+*Button.foreground: FOREGROUND
+*Button.highlightBackground: BACKGROUND
+*Button.highlightColor: FOREGROUND
+*Button.activeBackground: BACKGROUND
+*Button.activeForeground: FOREGROUND
+
+*Menubutton.background: BACKGROUND
+*Menubutton.foreground: FOREGROUND
+*Menubutton.highlightBackground: BACKGROUND
+*Menubutton.highlightColor: FOREGROUND
+*Menubutton.activeBackground: BACKGROUND
+*Menubutton.activeForeground: FOREGROUND
+
+*Checkbutton.background: BACKGROUND
+*Checkbutton.foreground: FOREGROUND
+*Checkbutton.highlightBackground: BACKGROUND
+*Checkbutton.highlightColor: FOREGROUND
+*Checkbutton.activeBackground: BACKGROUND
+*Checkbutton.activeForeground: FOREGROUND
+
+*Radiobutton.background: BACKGROUND
+*Radiobutton.foreground: FOREGROUND
+*Radiobutton.highlightBackground: BACKGROUND
+*Radiobutton.highlightColor: FOREGROUND
+*Radiobutton.activeBackground: BACKGROUND
+*Radiobutton.activeForeground: FOREGROUND
+
+!*Label.background: BACKGROUND
+!*Label.foreground: FOREGROUND
+*Label.highlightBackground: BACKGROUND
+*Label.highlightColor: FOREGROUND
+*Label.activeBackground: BACKGROUND
+*Label.activeForeground: FOREGROUND
+
+*Menu.background: BACKGROUND
+*Menu.foreground: FOREGROUND
+*Menu.highlightBackground: BACKGROUND
+*Menu.highlightColor: FOREGROUND
+*Menu.activeBackground: BACKGROUND
+*Menu.activeForeground: FOREGROUND
+
+*Frame.background: BACKGROUND
+*Frame.foreground: FOREGROUND
+*Frame.highlightBackground: BACKGROUND
+*Frame.highlightColor: FOREGROUND
+*Frame.activeBackground: BACKGROUND
+*Frame.activeForeground: FOREGROUND
+
+!*Scrollbar.background: BACKGROUND
+!*Scrollbar.foreground: FOREGROUND
+*Scrollbar.highlightBackground: BACKGROUND
+*Scrollbar.highlightColor: FOREGROUND
+*Scrollbar.activeBackground: BACKGROUND
+*Scrollbar.activeForeground: FOREGROUND
+*Scrollbar.troughColor: BACKGROUND
+
+*Scale.background: BACKGROUND
+*Scale.foreground: FOREGROUND
+*Scale.highlightBackground: BACKGROUND
+*Scale.highlightColor: FOREGROUND
+*Scale.activeBackground: BACKGROUND
+*Scale.activeForeground: FOREGROUND
+*Scale.troughColor: BACKGROUND
+
+*Entry.background: WINDOW_BACKGROUND
+*Entry.foreground: WINDOW_FOREGROUND
+*Entry.highlightBackground: WINDOW_BACKGROUND
+*Entry.highlightColor: WINDOW_FOREGROUND
+*Entry.activeBackground: WINDOW_BACKGROUND
+*Entry.activeForeground: WINDOW_FOREGROUND
+*Entry.selectBackground: SELECT_BACKGROUND
+*Entry.selectForeground: SELECT_FOREGROUND
+
+!*Text.background: WINDOW_BACKGROUND
+!*Text.foreground: WINDOW_FOREGROUND
+*Text.highlightBackground: WINDOW_BACKGROUND
+*Text.highlightColor: WINDOW_FOREGROUND
+*Text.activeBackground: WINDOW_BACKGROUND
+*Text.activeForeground: WINDOW_FOREGROUND
+*Text.selectBackground: SELECT_BACKGROUND
+*Text.selectForeground: SELECT_FOREGROUND
+
+*Listbox.background: WINDOW_BACKGROUND
+*Listbox.foreground: WINDOW_FOREGROUND
+*Listbox.highlightBackground: WINDOW_BACKGROUND
+*Listbox.highlightColor: WINDOW_FOREGROUND
+*Listbox.activeBackground: WINDOW_BACKGROUND
+*Listbox.activeForeground: WINDOW_FOREGROUND
+*Listbox.selectBackground: SELECT_BACKGROUND
+*Listbox.selectForeground: SELECT_FOREGROUND
+
+*Canvas.background: WINDOW_BACKGROUND
+*Canvas.foreground: WINDOW_FOREGROUND
+*Canvas.highlightBackground: WINDOW_BACKGROUND
+*Canvas.highlightColor: WINDOW_FOREGROUND
+*Canvas.activeBackground: WINDOW_BACKGROUND
+*Canvas.activeForeground: WINDOW_FOREGROUND
+*Canvas.selectbackground: SELECT_BACKGROUND
+*Canvas.selectforeground: SELECT_FOREGROUND
diff --git a/kcontrol/krdb/ad/AAAXaw.ad b/kcontrol/krdb/ad/AAAXaw.ad
new file mode 100644
index 000000000..86848731f
--- /dev/null
+++ b/kcontrol/krdb/ad/AAAXaw.ad
@@ -0,0 +1,36 @@
+*beNiceToColormap: false
+*borderColor: black
+
+*MenuButton.background: BACKGROUND
+*Command.background: BACKGROUND
+*Toggle.background: BACKGROUND
+*Label.background: BACKGROUND
+*Scrollbar*background: BACKGROUND
+*SimpleMenu*background: BACKGROUND
+*Box.background: BACKGROUND
+*Form.background: BACKGROUND
+*Dialog.background: BACKGROUND
+*Text.background: WINDOW_BACKGROUND
+*List.background: WINDOW_BACKGROUND
+
+*MenuButton.foreground: FOREGROUND
+*Command.foreground: FOREGROUND
+*Toggle.foreground: FOREGROUND
+*Label.foreground: FOREGROUND
+*Scrollbar.foreground: FOREGROUND
+*SimpleMenu*foreground: FOREGROUND
+*Box.foreground: FOREGROUND
+*Form.foreground: FOREGROUND
+*Dialog.foreground: FOREGROUND
+*Text.foreground: WINDOW_FOREGROUND
+*List.foreground: WINDOW_FOREGROUND
+
+*ScrollbarBackground: BACKGROUND
+*Scrollbar*width: 15
+*Scrollbar*height: 15
+*Scrollbar*shadowWidth: 2
+*Scrollbar*cursorName: left_ptr
+*Scrollbar*pushThumb: false
+*ShapeStyle: Rectangle
+*SmeBSB*shadowWidth: 3
+*Scrollbar*Cursor: left_ptr
diff --git a/kcontrol/krdb/ad/AcroRead.ad b/kcontrol/krdb/ad/AcroRead.ad
new file mode 100644
index 000000000..dfd238123
--- /dev/null
+++ b/kcontrol/krdb/ad/AcroRead.ad
@@ -0,0 +1,8 @@
+nspluginviewer*lprCommand: kprinter
+acroread*lprCommand: kprinter
+Acroread.foreground: WINDOW_FOREGROUND
+Acroread.background: WINDOW_BACKGROUND
+AcroRead.borderColor: WINDOW_FOREGROUND
+AcroRead.XmScreen.background: WINDOW_BACKGROUND
+AcroRead.XmScreen.borderColor: WINDOW_FOREGROUND
+
diff --git a/kcontrol/krdb/ad/Editres.ad b/kcontrol/krdb/ad/Editres.ad
new file mode 100644
index 000000000..31ee2aa87
--- /dev/null
+++ b/kcontrol/krdb/ad/Editres.ad
@@ -0,0 +1,5 @@
+editres*Tree.Background: WINDOW_BACKGROUND
+editres*Tree.Foreground: WINDOW_FOREGROUND
+editres*Tree.Toggle.Foreground: FOREGROUND
+editres*Tree.Toggle.Background: BACKGROUND
+editres*Panner.Background: BACKGROUND
diff --git a/kcontrol/krdb/ad/Emacs.ad b/kcontrol/krdb/ad/Emacs.ad
new file mode 100644
index 000000000..c38a1094b
--- /dev/null
+++ b/kcontrol/krdb/ad/Emacs.ad
@@ -0,0 +1,17 @@
+Emacs.default.attributeForeground: WINDOW_FOREGROUND
+Emacs.default.attributeBackground: WINDOW_BACKGROUND
+
+Emacs*Foreground: WINDOW_FOREGROUND
+Emacs*Background: WINDOW_BACKGROUND
+Emacs*menubar*foreground: FOREGROUND
+Emacs*menubar*background: BACKGROUND
+Emacs*popup*Foreground: FOREGROUND
+Emacs*popup*Background: BACKGROUND
+Emacs*Dialog*foreground: FOREGROUND
+Emacs*Dialog*background: BACKGROUND
+Emacs*XlwScrollBar.Foreground: FOREGROUND
+Emacs*XlwScrollBar.Background: BACKGROUND
+Emacs*topToolBarShadowColor: BACKGROUND
+Emacs*bottomToolBarShadowColor: BACKGROUND
+Emacs*backgroundToolBarColor: BACKGROUND
+Emacs*toolBarShadowThickness: 0
diff --git a/kcontrol/krdb/ad/GV.ad b/kcontrol/krdb/ad/GV.ad
new file mode 100644
index 000000000..95707f559
--- /dev/null
+++ b/kcontrol/krdb/ad/GV.ad
@@ -0,0 +1 @@
+GV.printCommand: kprinter
diff --git a/kcontrol/krdb/ad/ML.ad b/kcontrol/krdb/ad/ML.ad
new file mode 100644
index 000000000..8c4482453
--- /dev/null
+++ b/kcontrol/krdb/ad/ML.ad
@@ -0,0 +1,36 @@
+ml*background: BACKGROUND
+ml*foreground: FOREGROUND
+ml*XmText*foreground: WINDOW_FOREGROUND
+ml*XmText*background: WINDOW_BACKGROUND
+ml*XmList*foreground: WINDOW_FOREGROUND
+ml*XmList*background: WINDOW_BACKGROUND
+!ml*XmLabel*foreground: FOREGROUND
+!ml*XmLabel*background: BACKGROUND
+ml*XmTextField*background: WINDOW_BACKGROUND
+ml*XmTextField*foreground: WINDOW_FOREGROUND
+ml*helpwin*textSW.text.background: WINDOW_BACKGROUND
+ml*helpwin*textSW.text.foreground: WINDOW_FOREGROUND
+ml*textSW.text.background: WINDOW_BACKGROUND
+ml*textSW.text.foreground: WINDOW_FOREGROUND
+ml*log*textSW.text.background: WINDOW_BACKGROUND
+ml*log*textSW.text.foreground: WINDOW_FOREGROUND
+ml*selectColor: BACKGROUND
+ml*highlightColor: BACKGROUND
+ml.form.height: 550
+ml.form.width: 650
+ml*focusPolicy: pointer
+ml*XmForm*verticalSpacing: 0
+ml*XmForm*topOffset: 0
+ml*XmForm*bottomOffset: 0
+ml*XmRowColumn*spacing: 0
+ml*XmRowColumn*marginHeight: 1
+ml*XmRowColumn.entryBorder: 0
+ml*XmCascadeButton.marginHeight: 2
+ml*XmCascadeButton.marginWidth: 8
+ml*XmToggleButton.marginHeight: 1
+ml*XmPushButton.marginHeight: 1
+ml*marginHeight: 2
+ml*marginWidth: 3
+ml*XmList*highlightThickness: 0
+ml*borderWidth: 0
+
diff --git a/kcontrol/krdb/ad/Makefile.am b/kcontrol/krdb/ad/Makefile.am
new file mode 100644
index 000000000..68b2fe2bb
--- /dev/null
+++ b/kcontrol/krdb/ad/Makefile.am
@@ -0,0 +1,13 @@
+
+AM_CPPFLAGS = $(all_includes)
+
+kdisplay_defaults_data_DATA = AAAAAAGeneral.ad AAAMotif.ad AAATk.ad AAAXaw.ad AcroRead.ad \
+ Editres.ad Emacs.ad GV.ad ML.ad Nedit.ad Netscape.ad RVPlayer.ad \
+ WPerfect.ad XCalc.ad Xawtv.ad Xdvi.ad XTerm.ad XOsview.ad XV.ad Xpdf.ad
+
+kdisplay_defaults_datadir = $(kde_datadir)/kdisplay/app-defaults
+
+EXTRA_DIST = $(kdisplay_defaults_data_DATA)
+
+bin_SCRIPTS = krdb
+
diff --git a/kcontrol/krdb/ad/Nedit.ad b/kcontrol/krdb/ad/Nedit.ad
new file mode 100644
index 000000000..6e3dc3b56
--- /dev/null
+++ b/kcontrol/krdb/ad/Nedit.ad
@@ -0,0 +1,2 @@
+nedit*background: BACKGROUND
+nedit*foreground: FOREGROUND
diff --git a/kcontrol/krdb/ad/Netscape.ad b/kcontrol/krdb/ad/Netscape.ad
new file mode 100644
index 000000000..890f37ecf
--- /dev/null
+++ b/kcontrol/krdb/ad/Netscape.ad
@@ -0,0 +1,25 @@
+Netscape*background: BACKGROUND
+Netscape*foreground: FOREGROUND
+Netscape*XmText*foreground: WINDOW_FOREGROUND
+Netscape*XmText*background: WINDOW_BACKGROUND
+Netscape*XmTextField*foreground: WINDOW_FOREGROUND
+Netscape*XmTextField*background: WINDOW_BACKGROUND
+Netscape*XmList*foreground: WINDOW_FOREGROUND
+Netscape*XmList*background: WINDOW_BACKGROUND
+Netscape*topShadowColor: HIGHLIGHT
+Netscape*bottomShadowColor: LOWLIGHT
+Netscape*urlText*foreground: WINDOW_FOREGROUND
+Netscape*urlText*background: WINDOW_BACKGROUND
+Netscape*XmLGrid.foreground: WINDOW_FOREGROUND
+Netscape*XmLGrid.background: BACKGROUND
+Netscape*urlLabel*foreground: WINDOW_FOREGROUND
+Netscape*urlLabel*background: WINDOW_BACKGROUND
+Netscape*thermo.slider.foreground: SELECT_BACKGROUND
+Netscape*thermo.slider.background: BACKGROUND
+Netscape*power.LED.foreground: SELECT_BACKGROUND
+Netscape*power.LED.background: BACKGROUND
+Netscape*defaultBackground: WINDOW_BACKGROUND
+Netscape*selectColor: BACKGROUND
+Netscape*highlightColor: BACKGROUND
+Netscape*selectForeground: SELECT_FOREGROUND
+Netscape*selectBackground: SELECT_BACKGROUND
diff --git a/kcontrol/krdb/ad/README b/kcontrol/krdb/ad/README
new file mode 100644
index 000000000..7dfbcbd8f
--- /dev/null
+++ b/kcontrol/krdb/ad/README
@@ -0,0 +1,63 @@
+KRDB V0.2
+
+CHANGES V0.2
+- use QFontInfo
+- general purpose files e.g. AAAMotif.ad thanks to Gerd
+ Knorr <kraxel@goldbach.isdn.cs.tu-berlin.de>
+
+The krdb utility provides a convenient way to manage the
+resources of legacy applications on your KDE desktop.
+Simply run krdb every time you want to update the resources
+of your supported apps.
+
+You can easily write application default files for your own
+applications. To see how, follow the example of the
+supplied application default file for XV which specifies
+
+xv*foreground: FOREGROUND
+xv*background: BACKGROUND
+xv*highlight: HIGHLIGHT
+xv*lowlight: LOWLIGHT
+xv*monofont: FIXED_FONT
+
+The applications resources assign variables which will be
+defined by krdb. The complete list of possible variables to
+choose from is
+
+FOREGROUND, BACKGROUND, HIGHLIGHT, LOWLIGHT,
+WINDOW_FOREGROUND, WINDOW_BACKGROUND, SELECT_FOREGROUND,
+SELECT_BACKGROUND, INACTIVE_FOREGROUND,
+INACTIVE_BACKGROUND, INACTIVE_BLEND, ACTIVE_FOREGROUND,
+ACTIVE_BACKGROUND, ACTIVE_BLEND, FONT, BOLD_FONT, ITALIC_FONT,
+FIXED_FONT, TITLE_FONT and FONTLIST.
+
+Their meaning should be obvious to anyone familiar with
+KDE's desktop wide resources. Install your application
+default file either in
+
+$(KDEDIR)/share/apps/kdisplay/app-defaults
+
+or
+
+$(HOME)/.kde/share/apps/kdisplay/app-defaults
+
+so that it is available to krdb for reading. If you want to
+override a system file simply copy it to your user
+directory and make amendments.
+
+The krdb utility works by putting your current KDE color
+and font scheme into preprocessor statements, concatenating
+the specially written application default files and using
+xrdb -merge to write to RESOURCE_MANAGER. Thus it gives a
+simple way to make non-KDE applications fit in with the
+desktop.
+
+krdb now comes with a set of general purpose configuration
+files for the Motif, Xaw and TK toolkits. How well these
+general purpose resources apply to specific applications
+will depend on what other application defaults are
+installed. If you want krdb general resource files to apply
+most generally you should not have application specific
+entries for similar resources in ~/.Xdefaults or in the
+system app-defaults directory e.g.
+/usr/lib/X11R6/app-defaults.
diff --git a/kcontrol/krdb/ad/RVPlayer.ad b/kcontrol/krdb/ad/RVPlayer.ad
new file mode 100644
index 000000000..10603c8d6
--- /dev/null
+++ b/kcontrol/krdb/ad/RVPlayer.ad
@@ -0,0 +1,40 @@
+*rvplayer*background: BACKGROUND
+*rvplayer*Label.BorderColor: WINDOW_FOREGROUND
+*rvplayer*Command.BorderColor: WINDOW_FOREGROUND
+*rvplayer*Command.background: BACKGROUND
+*rvplayer*Command.foreground: FOREGROUND
+*rvplayer*MenuButton.BorderColor: WINDOW_FOREGROUND
+*rvplayer*MenuButton.background: BACKGROUND
+*rvplayer*SimpleMenu.foreground: FOREGROUND
+*rvplayer*SimpleMenu.background: BACKGROUND
+*rvplayer*SimpleMenu.BorderColor: LOWLIGHT
+*rvplayer*SmeBSB*fgInsensitive: HIGHLIGHT
+*rvplayer*timeslider.foreground: BACKGROUND
+*rvplayer*timeslider.topShadowPixel: LOWLIGHT
+*rvplayer*timeslider.bottomShadowPixel: HIGHLIGHT
+*rvplayer*timeslider.thumbPixel: HIGHLIGHT
+*rvplayer*SepLine.topShadowPixel: LOWLIGHT
+*rvplayer*SepLine.bottomShadowPixel: HIGHLIGHT
+*rvplayer*SepLine.BorderColor: BACKGROUND
+*rvplayer*titletext.background: BACKGROUND
+*rvplayer*titletext.topShadowPixel: LOWLIGHT
+*rvplayer*titletext.bottomShadowPixel: HIGHLIGHT
+*rvplayer*authortext.background: BACKGROUND
+*rvplayer*authortext.topShadowPixel: LOWLIGHT
+*rvplayer*authortext.bottomShadowPixel: HIGHLIGHT
+*rvplayer*copyrighttext.background: BACKGROUND
+*rvplayer*copyrighttext.topShadowPixel: LOWLIGHT
+*rvplayer*copyrighttext.bottomShadowPixel: HIGHLIGHT
+*rvplayer*statustext.background: BACKGROUND
+*rvplayer*statustext.foreground: FOREGROUND
+*rvplayer*statusback.background: BACKGROUND
+*rvplayer*statusback.foreground: FOREGROUND
+*rvplayer*proptext.background: BACKGROUND
+*rvplayer*proptext.foreground: FOREGROUND
+*rvplayer*timeinfotext.topShadowPixel: LOWLIGHT
+*rvplayer*timeinfotext.bottomShadowPixel: HIGHLIGHT
+*rvplayer*timeinfotext.background: BACKGROUND
+*rvplayer*timeinfotext.foreground: FOREGROUND
+*rvplayer*volumeslider.topShadowPixel: LOWLIGHT
+*rvplayer*volumeslider.bottomShadowPixel: HIGHLIGHT
+*rvplayer*Vslider.thumbPixel: HIGHLIGHT
diff --git a/kcontrol/krdb/ad/WPerfect.ad b/kcontrol/krdb/ad/WPerfect.ad
new file mode 100644
index 000000000..f005d8452
--- /dev/null
+++ b/kcontrol/krdb/ad/WPerfect.ad
@@ -0,0 +1,69 @@
+XWp*XmDrawingArea.background: WINDOW_BACKGROUND
+XWp*XmList*background: WINDOW_BACKGROUND
+XWp*XmText*background: WINDOW_BACKGROUND
+XWp*XmTextField*background: #FFFFFFFFFFFF
+WPFMShell*XmDrawingArea*background: WINDOW_BACKGROUND
+WPFMShell*XmList*background: WINDOW_BACKGROUND
+WPFMShell*XmText*background: WINDOW_BACKGROUND
+WPFMShell*XmTextField*background: WINDOW_BACKGROUND
+XWp*XmDrawingArea.foreground: WINDOW_FOREGROUND
+XWp*XmList*foreground: WINDOW_FOREGROUND
+XWp*XmText*foreground: WINDOW_FOREGROUND
+XWp*XmTextField*foreground: WINDOW_FOREGROUND
+WPFMShell*XmDrawingArea*foreground: WINDOW_FOREGROUND
+WPFMShell*XmList*foreground: WINDOW_FOREGROUND
+WPFMShell*XmText*foreground: WINDOW_FOREGROUND
+WPFMShell*XmTextField*foreground: WINDOW_FOREGROUND
+XWp.mainWindowForm.mainWindowMenubar*background: BACKGROUND
+XWp*MenuBar*background: BACKGROUND
+XWp*menubar*background: BACKGROUND
+XWp*popmenu*background: BACKGROUND
+WPFMShell*MenuBar*background: BACKGROUND
+WPFMShell*menubar*background: BACKGROUND
+XWp.mainWindowForm.mainWindowMenubar*foreground: FOREGROUND
+XWp*MenuBar*foreground: FOREGROUND
+XWp*menubar*foreground: FOREGROUND
+XWp*popmenu*foreground: FOREGROUND
+WPFMShell*MenuBar*foreground: FOREGROUND
+WPFMShell*menubar*foreground: FOREGROUND
+XWp*XmDialogShell*foreground: FOREGROUND
+XWp*XmDialogShell*XmScrolledWindow*XmDrawingArea.foreground: FOREGROUND
+WPFMShell*XmDialogShell*foreground: FOREGROUND
+WPFMShell*XmDialogShell*XmScrolledWindow*XmDrawingArea.foreground: FOREGROUND
+XWp*XmDialogShell*XmDrawingArea.foreground: WINDOW_FOREGROUND
+XWp*XmDialogShell*XmList*foreground: WINDOW_FOREGROUND
+XWp*XmDialogShell*XmText*foreground: WINDOW_FOREGROUND
+XWp*XmDialogShell*XmTextField*foreground: WINDOW_FOREGROUND
+WPFMShell*XmDialogShell*XmDrawingArea*foreground: WINDOW_FOREGROUND
+WPFMShell*XmDialogShell*XmList*foreground: WINDOW_FOREGROUND
+WPFMShell*XmDialogShell*XmText*foreground: WINDOW_FOREGROUND
+WPFMShell*XmDialogShell*XmTextField*foreground: WINDOW_FOREGROUND
+XWp*XmDialogShell*background: BACKGROUND
+XWp*XmDialogShell*XmScrolledWindow*XmDrawingArea.background: WINDOW_BACKGROUND
+WPFMShell*XmDialogShell*background: WINDOW_BACKGROUND
+WPFMShell*XmDialogShell*XmScrolledWindow*XmDrawingArea.background:
+WINDOW_BACKGROUND
+XWp*XmDialogShell*XmDrawingArea.background: WINDOW_BACKGROUND
+XWp*XmDialogShell*XmList*background: WINDOW_BACKGROUND
+XWp*XmDialogShell*XmText*background: WINDOW_BACKGROUND
+XWp*XmDialogShell*XmTextField*background: WINDOW_BACKGROUND
+WPFMShell*XmDialogShell*XmDrawingArea*background: WINDOW_BACKGROUND
+WPFMShell*XmDialogShell*XmList*background: WINDOW_BACKGROUND
+WPFMShell*XmDialogShell*XmText*background: WINDOW_BACKGROUND
+WPFMShell*XmDialogShell*XmTextField*background: WINDOW_BACKGROUND
+XWp*background: BACKGROUND
+XWp*XmScrolledWindow*XmDrawingArea.background: BACKGROUND
+WPFMShell*background: BACKGROUND
+WPFMShell*XmScrolledWindow*XmDrawingArea.background: BACKGROUND
+XWp.form.rulerframe.ruler*background: BACKGROUND
+XWp.form.controlbar.menubar.CBHlpButton*background: BACKGROUND
+XWp*foreground: FOREGROUND
+XWp*XmScrolledWindow*XmDrawingArea.foreground: FOREGROUND
+WPFMShell*foreground: FOREGROUND
+WPFMShell*XmScrolledWindow*XmDrawingArea.foreground: FOREGROUND
+XWp.form.scrollbar0.background: BACKGROUND
+XWp.form.hscrollbar.background: BACKGROUND
+
+
+
+
diff --git a/kcontrol/krdb/ad/XCalc.ad b/kcontrol/krdb/ad/XCalc.ad
new file mode 100644
index 000000000..7f2ebcfac
--- /dev/null
+++ b/kcontrol/krdb/ad/XCalc.ad
@@ -0,0 +1,7 @@
+xcalc*background: BACKGROUND
+xcalc*foreground: FOREGROUND
+!xcalc*bevel.Background: LOWLIGHT
+!xcalc*bevel.screen*background: WINDOW_BACKGROUND
+!xcalc*bevel.screen*foreground: WINDOW_FOREGROUND
+xcalc*bevel.screen.LCD.background: WINDOW_BACKGROUND
+xcalc*bevel.screen.LCD.foreground: WINDOW_FOREGROUND
diff --git a/kcontrol/krdb/ad/XOsview.ad b/kcontrol/krdb/ad/XOsview.ad
new file mode 100644
index 000000000..b9a3c1619
--- /dev/null
+++ b/kcontrol/krdb/ad/XOsview.ad
@@ -0,0 +1,5 @@
+xosview*meterLabelColor: FOREGROUND
+xosview*usedLabelColor: FOREGROUND
+xosview*background: BACKGROUND
+xosview*foreground: FOREGROUND
+
diff --git a/kcontrol/krdb/ad/XTerm.ad b/kcontrol/krdb/ad/XTerm.ad
new file mode 100644
index 000000000..cf0e41c8e
--- /dev/null
+++ b/kcontrol/krdb/ad/XTerm.ad
@@ -0,0 +1,4 @@
+xterm*background: WINDOW_BACKGROUND
+xterm*foreground: WINDOW_FOREGROUND
+xterm.SimpleMenu*background: BACKGROUND
+xterm.SimpleMenu*foreground: FOREGROUND
diff --git a/kcontrol/krdb/ad/XV.ad b/kcontrol/krdb/ad/XV.ad
new file mode 100644
index 000000000..c9c288cb2
--- /dev/null
+++ b/kcontrol/krdb/ad/XV.ad
@@ -0,0 +1,2 @@
+!xv*highlight: HIGHLIGHT
+!xv*lowlight: LOWLIGHT
diff --git a/kcontrol/krdb/ad/Xawtv.ad b/kcontrol/krdb/ad/Xawtv.ad
new file mode 100644
index 000000000..4134464aa
--- /dev/null
+++ b/kcontrol/krdb/ad/Xawtv.ad
@@ -0,0 +1,10 @@
+Xawtv*foreground: FOREGROUND
+Xawtv*background: BACKGROUND
+TopLevelShell*foreground: FOREGROUND
+TopLevelShell*background: BACKGROUND
+Streamer*Text*background: BACKGROUND
+Config*Text*background: BACKGROUND
+Config*channel.background: BACKGROUND
+Config*key.background: BACKGROUND
+Config*list.background: BACKGROUND
+Xawtv*Dialog.value.background: BACKGROUND
diff --git a/kcontrol/krdb/ad/Xdvi.ad b/kcontrol/krdb/ad/Xdvi.ad
new file mode 100644
index 000000000..6b1848023
--- /dev/null
+++ b/kcontrol/krdb/ad/Xdvi.ad
@@ -0,0 +1 @@
+xdvi.background: white
diff --git a/kcontrol/krdb/ad/Xpdf.ad b/kcontrol/krdb/ad/Xpdf.ad
new file mode 100644
index 000000000..3109bbbd9
--- /dev/null
+++ b/kcontrol/krdb/ad/Xpdf.ad
@@ -0,0 +1,3 @@
+xpdf.urlCommand: kfmclient exec %s
+xpdf.foreground: FOREGROUND
+xpdf.background: BACKGROUND
diff --git a/kcontrol/krdb/ad/krdb b/kcontrol/krdb/ad/krdb
new file mode 100755
index 000000000..96ee9fc92
--- /dev/null
+++ b/kcontrol/krdb/ad/krdb
@@ -0,0 +1,4 @@
+#! /bin/sh
+
+kcminit style
+
diff --git a/kcontrol/krdb/kcmdisplayrc.upd b/kcontrol/krdb/kcmdisplayrc.upd
new file mode 100644
index 000000000..4d139ad2c
--- /dev/null
+++ b/kcontrol/krdb/kcmdisplayrc.upd
@@ -0,0 +1,7 @@
+# This is comment
+Id=kde3
+File=kcmdisplayrc
+Group=X11
+Options=copy
+Key=useResourceManager,exportKDEColors
+Key=useResourceManager,exportKDEFonts
diff --git a/kcontrol/krdb/kcs/AtlasGreen.kcsrc b/kcontrol/krdb/kcs/AtlasGreen.kcsrc
new file mode 100644
index 000000000..9ce3f6aff
--- /dev/null
+++ b/kcontrol/krdb/kcs/AtlasGreen.kcsrc
@@ -0,0 +1,83 @@
+# KDE Config File
+[Color Scheme]
+Name=Atlas Green
+Name[af]=Atlas Groen
+Name[ar]=أخضر أطلسي
+Name[az]=Atlas Yaşılı
+Name[bn]=অ্যাটলাস গ্রিন
+Name[bs]=Atlas zelena
+Name[ca]=Verd Atlas
+Name[cs]=Atlasově zelená
+Name[csb]=Atłasowô zelonosc
+Name[cy]=Gwyrdd Atlas
+Name[da]=Atlasgrøn
+Name[de]=Atlas-Grün
+Name[el]=Atlas πράσινο
+Name[eo]=Atlasa verdo
+Name[es]=Verde atlas
+Name[et]=Atlasroheline
+Name[eu]=Atlas berdea
+Name[fa]=سبز اطلس
+Name[fi]=Atlaksenvihreä
+Name[fr]=Atlas vert
+Name[fy]=Atlasgrien
+Name[gl]=Verde Atlas
+Name[he]=גווני ירוק
+Name[hi]=एटलस हरा
+Name[hr]=Atlas zelena
+Name[hu]=Atlaszzöld
+Name[is]=Atlasgrænn
+Name[it]=Atlante verde
+Name[ja]=アトラスグリーン
+Name[km]=Atlas បៃតង
+Name[lo]=ຂງວແຜນທີ່
+Name[lt]=Žalia atlasinė
+Name[lv]=Atlasa zaļš
+Name[mn]=Атлас-Ногоон
+Name[ms]=Hijau Lumut
+Name[mt]=Aħdar Atlas
+Name[nb]=Atlas grønn
+Name[nds]=Atlas-Gröön
+Name[ne]=एटलस हरियो
+Name[nl]=Atlasgroen
+Name[nn]=Atlas grøn
+Name[pa]=ਐਲਟਸ ਗਰੀਨ
+Name[pl]=Atłasowa zieleń
+Name[pt]=Verde Atlas
+Name[pt_BR]=Atlas
+Name[ro]=Verde Atlas
+Name[rw]=Icyatsi Atalasi
+Name[se]=Atlas ruoná
+Name[sk]=Atlasová zelená
+Name[sl]=Zeleni atlas
+Name[sr]=Атлас зелено
+Name[sr@Latn]=Atlas zeleno
+Name[sv]=Atlasgrön
+Name[ta]=பூமி பச்சை
+Name[te]=అట్లాస్ పచ్చ
+Name[tg]=Атласи сабз (Atlas Green)
+Name[tr]=Atlas Yeşili
+Name[uk]=Зелений атлас
+Name[uz]=Yashil atlas
+Name[uz@cyrillic]=Яшил атлас
+Name[ven]=Atlas Dala
+Name[vi]=Màu xanh Atlas
+Name[xh]=Okuluhlaza kwe Atlas
+Name[zh_CN]=地图绿
+Name[zh_TW]=Atlas 綠
+background=#afb49f
+buttonBackground=#afb49f
+buttonForeground=#000000
+selectBackground=#6f7a63
+foreground=#000000
+activeForeground=#ffffff
+inactiveBackground=#000000
+inactiveBlend=#afb49f
+activeBackground=#6f7a63
+activeBlend=#000000
+contrast=5
+inactiveForeground=#afb49f
+windowForeground=#000000
+windowBackground=#ffffff
+selectForeground=#ffffff
+alternateBackground=#EFF3E0
diff --git a/kcontrol/krdb/kcs/BeOS.kcsrc b/kcontrol/krdb/kcs/BeOS.kcsrc
new file mode 100644
index 000000000..a7ce7a86e
--- /dev/null
+++ b/kcontrol/krdb/kcs/BeOS.kcsrc
@@ -0,0 +1,26 @@
+# KDE Config File
+[Color Scheme]
+foreground=0,0,0
+selectForeground=0,0,0
+activeBlend=255,215,0
+selectBackground=168,168,168
+inactiveBackground=237,237,237
+Name=BeOS
+Name[af]=Beos
+Name[hi]=बीई-ओएस
+Name[id]=Beos
+Name[lo]=ລະບົບປະຕິບັດການ BeOS
+Name[te]=బిఓఎస్
+Name[tg]=Системаи омили Be
+Name[th]=ระบบปฏิบัติการ BeOS
+contrast=7
+background=217,217,217
+buttonBackground=217,217,217
+buttonForeground=0,0,0
+activeBackground=255,215,0
+inactiveBlend=237,237,237
+inactiveForeground=0,0,0
+activeForeground=0,0,0
+windowForeground=0,0,0
+windowBackground=255,255,255
+alternateBackground=255,252,235
diff --git a/kcontrol/krdb/kcs/BlackOnWhite.kcsrc b/kcontrol/krdb/kcs/BlackOnWhite.kcsrc
new file mode 100644
index 000000000..73e3be970
--- /dev/null
+++ b/kcontrol/krdb/kcs/BlackOnWhite.kcsrc
@@ -0,0 +1,89 @@
+[Color Scheme]
+Name=High Contrast Black Text
+Name[af]=Hoë kontras swart teks
+Name[ar]=نص أسود عالي التباين
+Name[be]=Высокакантрастная "Белае па чорным"
+Name[bn]=হাই কনট্রাস্ট কালো লেখা
+Name[bs]=Visoki kontrast, crni tekst
+Name[ca]=Text negre d'alt contrast
+Name[cs]=Vysoký kontrast, černý text
+Name[csb]=Kòntrastowi czôrny tekst
+Name[da]=Sort tekst med høj kontrast
+Name[de]=Hoher Kontrast, Schwarz auf Weiß
+Name[el]=Μαύρο κείμενο υψηλής αντίθεσης
+Name[eo]=Alt-kontrasta Nigra Teksto
+Name[es]=Texto negro de alto contraste
+Name[et]=Väga kontrastne must tekst
+Name[eu]=Kontraste handiko zuria beltzaren gainean
+Name[fa]=متن سیاه با سایه روشن بالا
+Name[fi]=Valkoista mustalla suurilla värivastakohdilla
+Name[fr]=Texte en noir avec contraste élevé
+Name[fy]=Heech kontrast swarte tekst
+Name[gl]=Texto Negro de Alto Contraste
+Name[he]=ניגודיות גבוהה טקסט שחור
+Name[hr]=Crni tekst visokog kontrasta
+Name[hu]=Erősen kontrasztos fekete szöveg
+Name[is]=Há birtuskila svartur texti
+Name[it]=Testo nero ad alto contrasto
+Name[ja]=ハイコントラストの黒いテキスト
+Name[ka]=კონტრასტული შავი ტექსტი
+Name[kk]=Контрастығы жоғары қара мәтін
+Name[km]=អត្ថបទ​ពណ៌​ខ្មៅ កម្រិត​ពណ៌​ខ្ពស់
+Name[lt]=Didelio kontrasto juodas tekstas
+Name[mk]=Црн текст со висок контраст
+Name[ms]=Teks Hitam Kontras Tinggi
+Name[nb]=Høykontrast svart tekst
+Name[nds]=Hogen Kontrast, swatt Text
+Name[ne]=उच्च व्यतिरेक कालो पाठ
+Name[nl]=Hoog contrast zwarte tekst
+Name[nn]=Høgkontrast svart tekst
+Name[pa]=ਜਿਆਦਾ ਗੂਡ਼ਾ ਕਾਲਾ ਪਾਠ
+Name[pl]=Kontrastowy czarny tekst
+Name[pt]=Alto Contraste Texto Preto
+Name[pt_BR]=Alto Contraste do Texto Preto
+Name[ro]=Contrast mare text negru
+Name[ru]=Высококонтрастный чёрный текст
+Name[rw]=Umwandiko w'Umukara Inyuranyamigaragarire yo Hejuru
+Name[se]=Alla vuostálasvuohta, čáhppes teaksta
+Name[sk]=Vysokokontrastný čierny text
+Name[sl]=Visoko kontrastno črno besedilo
+Name[sr]=Црни текст високог контраста
+Name[sr@Latn]=Crni tekst visokog kontrasta
+Name[sv]=Svart text med hög kontrast
+Name[ta]=அதிக மாறுபட்ட கறுப்பு மீது வெள்ளை உரை
+Name[tg]=Матни баландсифати сиёҳ
+Name[th]=อักษรดำคอนทราสสูง
+Name[tr]=Yüksek Kontrast Siyah Metin
+Name[tt]=Kisken Qara
+Name[uk]=Висококонтрастний чорний текст
+Name[uz]=Yuqori kontrastli qora matn
+Name[uz@cyrillic]=Юқори контрастли қора матн
+Name[vi]=Chữ đen trên nền trắng
+Name[wa]=Noer so blanc
+Name[zh_CN]=高对比黑字
+Name[zh_TW]=高對比黑色字
+activeBackground=165,165,255
+activeBlend=165,165,255
+activeForeground=0,0,0
+activeTitleBtnBg=0,0,0
+activeForeground=0,0,0
+alternateBackground=215,215,255
+background=255,255,255
+buttonBackground=255,255,255
+buttonForeground=0,0,0
+contrast=7
+foreground=0,0,0
+frame=122,122,255
+handle=122,122,255
+inactiveBackground=225,225,225
+inactiveBlend=225,225,225
+inactiveForeground=128,128,128
+inactiveFrame=225,225,225
+inactiveHandle=225,225,225
+inactiveTitleBtnBg=85,85,85
+linkColor=0,0,0
+selectBackground=165,165,255
+selectForeground=0,0,0
+visitedLinkColor=0,0,0
+windowBackground=255,255,255
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/BlueSlate.kcsrc b/kcontrol/krdb/kcs/BlueSlate.kcsrc
new file mode 100644
index 000000000..f3682849c
--- /dev/null
+++ b/kcontrol/krdb/kcs/BlueSlate.kcsrc
@@ -0,0 +1,87 @@
+# KDE Config File
+[Color Scheme]
+Name=Blue Slate
+Name[af]=Blou Graniet
+Name[ar]=أزرق رخامي
+Name[az]=Mavi Səma
+Name[bn]=ব্লু স্লেট
+Name[br]=Stad glas
+Name[bs]=Plavi mermer
+Name[ca]=Blau pissarra
+Name[cs]=Modrá plískanice
+Name[csb]=Mòdrô dakówka
+Name[cy]=Llechfaen Glas
+Name[da]=Blå tavle
+Name[de]=Schieferblau
+Name[el]=Μπλε Slate
+Name[eo]=Blua ardezo
+Name[es]=Azul pizarra
+Name[et]=Sinine kivitahvel
+Name[eu]=Arbel urdina
+Name[fa]=تخته‌سنگ آبی
+Name[fi]=Sininen liuske
+Name[fr]=Ardoise bleue
+Name[fy]=Laaiblau
+Name[gl]=Azul Lousa
+Name[he]=צפחה כחולה
+Name[hi]=नीला स्लेट
+Name[hr]=Plavo-siva
+Name[hu]=Kékes árnyalat
+Name[is]=Bláar flögur
+Name[it]=Blu ardesia
+Name[ja]=ブルースレート
+Name[kk]=Көгілдір күй
+Name[km]=ខៀវ​ស្លេក
+Name[lo]=ເຈ້ຍສີຟ້າ
+Name[lt]=Pilkai mėlyna
+Name[lv]=Zils Šīferis
+Name[mn]=Хөх занар
+Name[ms]=Loh Biru
+Name[mt]=Tafal ikħal
+Name[nb]=Skiferblå
+Name[nds]=Blaag Schiefer
+Name[ne]=निलो स्लेट
+Name[nl]=Leisteenblauw
+Name[nn]=Blågrå
+Name[nso]=Seleiti se se tala
+Name[pa]=ਨੀਲਾ ਸਲਾਟੀ
+Name[pl]=Niebieska dachówka
+Name[pt]=Azul Forte
+Name[pt_BR]= Azul
+Name[ro]=Albastru de ardezie
+Name[rw]=Ubururu Ibuyebururu
+Name[se]=Alit-ránes
+Name[sk]=Modrá bridlica
+Name[sl]=Modri skril
+Name[sr]=Плави шкриљац
+Name[sr@Latn]=Plavi škriljac
+Name[sv]=Blå skiffer
+Name[ta]=நீல பலகை
+Name[te]=నీలపు పలక
+Name[tg]=Оби моил ба сиёҳ
+Name[th]=กระดานสีฟ้า
+Name[tr]=Mavi Tahta
+Name[tt]=Zäñgär-Sorı
+Name[uk]=Синій шифер
+Name[uz]=Koʻkish kul
+Name[uz@cyrillic]=Кўкиш кул
+Name[ven]=Tshileiti tsha lutombo
+Name[vi]=Xanh xám
+Name[wa]=Bleu estat
+Name[zh_CN]=蓝灰
+Name[zh_TW]=藍灰
+background=#9db9c8
+buttonBackground=#9db9c8
+buttonForeground=#000000
+selectBackground=#558097
+foreground=#000000
+activeForeground=#ffffff
+inactiveBackground=#9c9c9c
+inactiveBlend=#9db9c8
+activeBackground=#558097
+activeBlend=#9db9c8
+contrast=5
+inactiveForeground=#d6d6d6
+windowForeground=#000000
+windowBackground=#c3c3c3
+selectForeground=#ffffff
diff --git a/kcontrol/krdb/kcs/CDE.kcsrc b/kcontrol/krdb/kcs/CDE.kcsrc
new file mode 100644
index 000000000..ca219cb15
--- /dev/null
+++ b/kcontrol/krdb/kcs/CDE.kcsrc
@@ -0,0 +1,26 @@
+# KDE Config File
+[Color Scheme]
+Name=CDE
+Name[hi]=सीडीई
+Name[mn]=КДE
+Name[te]=సిడిఈ
+Name[tg]=Муҳити графикии муштарак (CDE)
+Name[th]=แบบ CDE
+background=#999999
+buttonBackground=#999999
+buttonForeground=#ffffff
+selectBackground=#326284
+foreground=#ffffff
+activeForeground=#ffffff
+activeBlend=#999999
+inactiveBackground=#818181
+inactiveBlend=#999999
+activeBackground=#326284
+contrast=7
+inactiveForeground=#ffffff
+windowForeground=#ffffff
+windowBackground=#818181
+selectForeground=#ffffff
+linkColor=#ffffc0
+visitedLinkColor=#c0ffc0
+alternateBackground=#929292
diff --git a/kcontrol/krdb/kcs/DarkBlue.kcsrc b/kcontrol/krdb/kcs/DarkBlue.kcsrc
new file mode 100644
index 000000000..fbdde7d63
--- /dev/null
+++ b/kcontrol/krdb/kcs/DarkBlue.kcsrc
@@ -0,0 +1,98 @@
+[Color Scheme]
+activeBackground=65,101,148
+activeBlend=0,40,74
+activeForeground=255,255,255
+activeTitleBtnBg=66,103,148
+activeTitleBtnBlend=
+activeTitleBtnFg=66,103,148
+alternateBackground=0,66,123
+background=66,103,148
+buttonBackground=66,103,148
+buttonForeground=255,255,255
+contrast=8
+foreground=255,255,255
+inactiveBackground=66,103,148
+inactiveBlend=74,113,164
+inactiveForeground=0,42,78
+inactiveTitleBtnBg=66,103,148
+inactiveTitleBtnBlend=0,112,182
+inactiveTitleBtnFg=66,103,148
+Name=Dark Blue
+Name[af]=Donker Blou
+Name[ar]=أزرق غامق
+Name[az]=Tünd Göy
+Name[be]=Цёмна-сіняя
+Name[bn]=গাঢ় নীল
+Name[br]=Glas teñval
+Name[bs]=Tamno plava
+Name[ca]=Blau fosc
+Name[cs]=Tmavě modrá
+Name[csb]=Cemnomòdri
+Name[cy]=Glas tywyll
+Name[da]=Mørkeblå
+Name[de]=Dunkelblau
+Name[el]=Σκούρο μπλε
+Name[eo]=Malhela bluo
+Name[es]=Azul oscuro
+Name[et]=Tumesinine
+Name[eu]=Urdin iluna
+Name[fa]=آبی تیره
+Name[fi]=Tummansininen
+Name[fr]=Bleu foncé
+Name[fy]=Tsjusterblau
+Name[ga]=Dúghorm
+Name[gl]=Azul Escuro
+Name[he]=כחול כהה
+Name[hi]=गहरा नीला
+Name[hr]=Tamno plava
+Name[hu]=Sötétkék
+Name[is]=Dökkblátt
+Name[it]=Blu scuro
+Name[ja]=ダークブルー
+Name[kk]=Кою көк
+Name[km]=ខៀវ​ស្រងាត់
+Name[lo]=ນໍ້າເງິນເຂັ້ມ
+Name[lt]=Tamsiai mėlyna
+Name[lv]=Tumši Zils
+Name[mk]=Темно сино
+Name[mn]=Хар хөх
+Name[ms]=Biru Tua
+Name[mt]=Ikħal skur
+Name[nb]=Mørkeblå
+Name[nds]=Düüster-Blaag
+Name[ne]=गाढा निलो
+Name[nl]=Donkerblauw
+Name[nn]=Mørkeblå
+Name[nso]=Botala bjo bo tsene letsego
+Name[pa]=ਗੂੜਾ ਨੀਲਾ
+Name[pl]=Ciemnoniebieski
+Name[pt]=Azul escuro
+Name[pt_BR]=Azul escuro
+Name[ro]=Albastru închis
+Name[rw]=Ubururu Bwijimye
+Name[se]=Sevdnjesalit
+Name[sk]=Tmavomodrá
+Name[sl]=Temna modrina
+Name[sr]=Тамно плава
+Name[sr@Latn]=Tamno plava
+Name[sv]=Mörkblå
+Name[te]=ముదురు నీలం
+Name[th]=น้ำเงินเข้ม
+Name[tr]=Koyu Mavi
+Name[tt]=Qara Zäñgär
+Name[uk]=Синя темрява
+Name[uz]=Toʻq koʻk
+Name[uz@cyrillic]=Тўқ кўк
+Name[ven]=Lutombo lwo nzwinzwimalaho
+Name[vi]=Màu xanh thẫm
+Name[wa]=Foncé bleu
+Name[xh]=Luhlaza buntsundu (okwesibhaka-bhaka)
+Name[zh_CN]=深蓝
+Name[zh_TW]=深藍
+Name[zu]=Okuluhlaza kakhulu
+selectBackground=92,179,255
+selectForeground=0,0,0
+windowBackground=0,42,78
+windowForeground=220,220,220
+linkColor=#00ffff
+visitedLinkColor=#c0c0ff
diff --git a/kcontrol/krdb/kcs/DesertRed.kcsrc b/kcontrol/krdb/kcs/DesertRed.kcsrc
new file mode 100644
index 000000000..6be73c2d7
--- /dev/null
+++ b/kcontrol/krdb/kcs/DesertRed.kcsrc
@@ -0,0 +1,89 @@
+# KDE Config File
+[Color Scheme]
+Name=Desert Red
+Name[af]=Woestyn Rooi
+Name[ar]=أحمر صحراوي
+Name[az]=Səhra Qırmızısı
+Name[be]=Пустынна-чырвоная
+Name[bn]=ডেসার্ট রেড
+Name[bs]=Pustinjski crvena
+Name[ca]=Roig del desert
+Name[cs]=Pouštní červená
+Name[csb]=Czerwionosc pùstini
+Name[cy]=Anialdir Coch
+Name[da]=Ørkenrød
+Name[de]=Wüstenrot
+Name[el]=Κόκκινο της ερήμου
+Name[eo]=Dezerta ruĝo
+Name[es]=Rojo desierto
+Name[et]=Kõrbepunane
+Name[eu]=Basamortu gorria
+Name[fa]=قرمز صحرایی
+Name[fi]=Aavikon punainen
+Name[fr]=Désert rouge
+Name[fy]=Woestynread
+Name[gl]=Vermello Deserto
+Name[he]=אדום מדברי
+Name[hi]=मरु लाल
+Name[hr]=Pustinjski crvena
+Name[hu]=Téglavörös
+Name[is]=Eyðimerkurrautt
+Name[it]=Rosso deserto
+Name[ja]=砂漠色
+Name[kk]=Қызыл шөл
+Name[km]=ក្រហម​ស្លេក
+Name[lo]=ແດງທະເລຊາຍ
+Name[lt]=Raudona dykumos
+Name[lv]=Tuksneša sarkans
+Name[mk]=Пустинско црвено
+Name[mn]=Говийн улаан
+Name[ms]=Merah Karat
+Name[mt]=Ramla l-ħamra
+Name[nb]=Ørkenrød
+Name[nds]=Wööst-Root
+Name[ne]=बलौटे रातो
+Name[nl]=Woestijnrood
+Name[nn]=Ørkenraud
+Name[nso]=Bohubedu bja Letanaga
+Name[pa]=ਮਾਰੂਥਲੀ ਲਾਲ
+Name[pl]=Czerwień pustyni
+Name[pt]=Vermelho Deserto
+Name[pt_BR]=Vermelho
+Name[ro]=Roșu deșert
+Name[rw]=Umutuku Ubutayu
+Name[se]=Saddoáhperuoksat
+Name[sk]=Púštna červená
+Name[sl]=Puščavska rdeča
+Name[sr]=Пустињско црвена
+Name[sr@Latn]=Pustinjsko crvena
+Name[sv]=Ökenröd
+Name[ta]=பாலைவன சிவப்பு
+Name[te]=ఎడారి ఎరుపు
+Name[th]=แดงทะเลทราย
+Name[tr]=Çöl Kırmızısı
+Name[uk]=Червона пустеля
+Name[uz]=Qizil choʻl
+Name[uz@cyrillic]=Қизил чўл
+Name[ven]=Vhutswuku ha muvhala wa soga
+Name[vi]=Đỏ sa mạc
+Name[wa]=Rodje do dezert
+Name[xh]=Bomvu Krwe
+Name[zh_CN]=沙漠红
+Name[zh_TW]=沙漠紅
+Name[zu]=Okubovu okogwadule
+background=214,205,187
+buttonBackground=214,205,187
+buttonForeground=0,0,0
+selectBackground=128,0,0
+foreground=0,0,0
+activeForeground=255,255,255
+inactiveBackground=0,0,0
+inactiveBlend=214,205,187
+activeBackground=128,0,0
+activeBlend=0,0,0
+contrast=3
+inactiveForeground=214,214,214
+windowForeground=0,0,0
+windowBackground=255,255,255
+selectForeground=255,255,255
+alternateBackground=255,246,230
diff --git a/kcontrol/krdb/kcs/DigitalCDE.kcsrc b/kcontrol/krdb/kcs/DigitalCDE.kcsrc
new file mode 100644
index 000000000..6e56c3b5a
--- /dev/null
+++ b/kcontrol/krdb/kcs/DigitalCDE.kcsrc
@@ -0,0 +1,69 @@
+# KDE Config File
+[Color Scheme]
+Name=Digital CDE
+Name[af]=Digitaal Cde
+Name[az]=Dijital CDE
+Name[be]=Лічбавая CDE
+Name[bn]=ডিজিটাল CDE
+Name[br]=CDE niverel
+Name[ca]=CDE digital
+Name[csb]=CDE firmë Digital
+Name[cy]=CDE Digidol
+Name[de]=Digital (DEC) CDE
+Name[el]=Ψηφιακό CDE
+Name[eo]=Digital-CDE
+Name[es]=CDE de Digital
+Name[eu]=Digital-en CDE
+Name[fa]=CDE رقمی
+Name[gl]=CDE Dixital
+Name[hi]=डिज़िटल सीडीई
+Name[hr]=Digitalni CDE
+Name[is]=Stafrænt CDE
+Name[km]=CDE ឌីជីថល
+Name[ko]=디지털 시계
+Name[lo]=ໂປຣແກຣມຈັດການຫນ້າຕ່າງ CDE
+Name[lt]=Skaitmeninis CDE
+Name[lv]=Ciparu CDE
+Name[mn]=Тоон (DEC) КДE
+Name[ms]=CDE Digital
+Name[ne]=डिजिटल CDE
+Name[nso]=CDE ya Dinomoro
+Name[pa]=ਡਿਜ਼ੀਟਲ CDE
+Name[pl]=CDE firmy Digital
+Name[pt]=CDE da Digital
+Name[pt_BR]=CDE Digital
+Name[ro]=CDE Digital
+Name[rw]=CDE Bimenyetsomibare
+Name[se]=Digitalálaš CDE
+Name[sk]=CDE od Digital
+Name[sl]=Digitalni CDE
+Name[ta]=டிஜிட்டல் CDE
+Name[te]=డిజిటల్ సిడిఈ
+Name[th]=แบบ Digital CDE
+Name[tr]=Dijital CDE
+Name[uz]=Raqamli CDE
+Name[uz@cyrillic]=Рақамли CDE
+Name[ven]=CDE ya Didzhithala
+Name[vi]=CDE số
+Name[wa]=Didjitå CDE
+Name[xh]=CDE Ebonisa Inani Ngalinye
+Name[zh_TW]=數位 CDE
+Name[zu]=I-CDE eyizinombolo
+background=#4b7b82
+buttonBackground=#4b7b82
+buttonForeground=#ffffff
+selectBackground=#526673
+alternateBackground=#304445
+foreground=#ffffff
+activeForeground=#ffffff
+inactiveBackground=#4b7b82
+inactiveBlend=#4b7b82
+activeBackground=#a47591
+activeBlend=#4b7b82
+contrast=7
+inactiveForeground=#ffffff
+windowForeground=#ffffff
+windowBackground=#374d4e
+selectForeground=#ffffff
+linkColor=#00ffff
+visitedLinkColor=#c0c0ff
diff --git a/kcontrol/krdb/kcs/EveX.kcsrc b/kcontrol/krdb/kcs/EveX.kcsrc
new file mode 100644
index 000000000..b63776fcf
--- /dev/null
+++ b/kcontrol/krdb/kcs/EveX.kcsrc
@@ -0,0 +1,27 @@
+[Color Scheme]
+Name=EveX
+Name[af]=Evex
+Name[hi]=एवेक्स
+Name[lo]=ແບບ EveX
+Name[pl]=WigiliaX
+Name[te]=ఈవెక్స్
+Name[th]=แบบ EveX
+activeBackground=233,233,233
+activeBlend=233,233,233
+activeForeground=2,2,2
+activeTitleBtnBg=220,220,220
+background=230,222,220
+buttonBackground=228,228,228
+buttonForeground=0,0,0
+contrast=7
+foreground=0,0,0
+inactiveBackground=150,167,202
+inactiveBlend=157,176,208
+inactiveForeground=93,112,145
+inactiveTitleBtnBg=220,220,220
+linkColor=0,0,192
+selectBackground=10,95,137
+selectForeground=255,255,255
+visitedLinkColor=128,0,128
+windowBackground=255,255,255
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/KDEOne.kcsrc b/kcontrol/krdb/kcs/KDEOne.kcsrc
new file mode 100644
index 000000000..181047169
--- /dev/null
+++ b/kcontrol/krdb/kcs/KDEOne.kcsrc
@@ -0,0 +1,30 @@
+[Color Scheme]
+activeBackground=0,0,128
+activeBlend=0,0,0
+activeForeground=255,255,255
+activeTitleBtnBg=192,192,192
+background=192,192,192
+buttonBackground=192,192,192
+buttonForeground=0,0,0
+contrast=7
+foreground=0,0,0
+inactiveBackground=128,128,128
+inactiveBlend=192,192,192
+inactiveForeground=192,192,192
+inactiveTitleBtnBg=192,192,192
+linkColor=0,0,255
+Name=KDE 1
+Name[af]=Kde 1
+Name[bn]=কে.ডি.ই. ১
+Name[fa]=KDE ۱
+Name[hi]=केडीई 1
+Name[km]=KDE ១
+Name[lo]=ໂປຣແກຣມຈັດການຫນ້າຕ່າງ KDE 1
+Name[mn]=КДЭ 1
+Name[te]=కెడిఈ 1
+Name[th]=แบบ KDE 1
+selectBackground=0,0,128
+selectForeground=255,255,255
+visitedLinkColor=255,0,255
+windowBackground=255,255,255
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/KDETwo.kcsrc b/kcontrol/krdb/kcs/KDETwo.kcsrc
new file mode 100644
index 000000000..ec128160f
--- /dev/null
+++ b/kcontrol/krdb/kcs/KDETwo.kcsrc
@@ -0,0 +1,28 @@
+[Color Scheme]
+activeBackground=10,95,137
+activeBlend=10,95,137
+activeForeground=255,255,255
+activeTitleBtnBg=192,192,192
+background=220,220,220
+buttonBackground=228,228,228
+buttonForeground=0,0,0
+contrast=7
+foreground=0,0,0
+inactiveBackground=220,220,220
+inactiveBlend=220,220,220
+inactiveForeground=0,0,0
+linkColor=0,0,192
+Name=KDE 2
+Name[bn]=কে.ডি.ই. ২
+Name[fa]=KDE ۲
+Name[hi]=केडीई 2
+Name[km]=KDE ២
+Name[lo]=KDE
+Name[mn]=КДЭ 2
+Name[te]=కెడిఈ 2
+Name[th]=แบบ KDE 2
+selectBackground=10,95,137
+selectForeground=255,255,255
+visitedLinkColor=128,0,128
+windowBackground=255,255,255
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/Keramik.kcsrc b/kcontrol/krdb/kcs/Keramik.kcsrc
new file mode 100644
index 000000000..241d29f90
--- /dev/null
+++ b/kcontrol/krdb/kcs/Keramik.kcsrc
@@ -0,0 +1,49 @@
+[Color Scheme]
+Name=Keramik
+Name[ar]=قرميدي
+Name[be]=Кераміка
+Name[bn]=কেরামিক
+Name[cs]=Keramika
+Name[eo]=Ceramiko
+Name[fa]=کرامیک
+Name[fy]=Keramyk
+Name[hi]=के-रामिक
+Name[it]=Ceramica
+Name[lo]=ເຄຣາມິກ - K
+Name[lv]=Keramika
+Name[mk]=Керамик
+Name[mn]=Ваар
+Name[nb]=Keramikk
+Name[ne]=केरामिक
+Name[nn]=Keramikk
+Name[pa]=ਕੀਰਾਮਿਕ
+Name[se]=Bálseduodji
+Name[sr]=Керамика
+Name[sr@Latn]=Keramika
+Name[ta]=கெராமிக்
+Name[te]=కెరామిక్
+Name[th]=เครามิก
+Name[uk]=Керамік
+Name[uz]=Keramika
+Name[uz@cyrillic]=Керамика
+Name[vi]=Gốm
+activeBackground=62,145,235
+activeBlend=62,145,235
+activeForeground=255,255,255
+activeTitleBtnBg=220,220,220
+alternateBackground=238,246,255
+background=234,233,232
+buttonBackground=230,240,249
+buttonForeground=0,0,0
+contrast=7
+foreground=0,0,0
+inactiveBackground=175,214,255
+inactiveBlend=175,214,255
+inactiveForeground=255,255,255
+inactiveTitleBtnBg=220,220,220
+linkColor=0,0,192
+selectBackground=169,209,255
+selectForeground=3,3,3
+visitedLinkColor=128,0,128
+windowBackground=255,255,255
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/KeramikEmerald.kcsrc b/kcontrol/krdb/kcs/KeramikEmerald.kcsrc
new file mode 100644
index 000000000..6ffbf9b51
--- /dev/null
+++ b/kcontrol/krdb/kcs/KeramikEmerald.kcsrc
@@ -0,0 +1,73 @@
+[Color Scheme]
+Name=Keramik Emerald
+Name[be]=Ізумрудная кераміка
+Name[bn]=কেরামিক এমারেল্ড
+Name[br]=Keramik emrodez
+Name[ca]=Keramik maragda
+Name[cs]=Keramika (emerald)
+Name[cy]=Keramik Emerallt
+Name[da]=Keramik-smaragd
+Name[de]=Porzellan-Smaragd
+Name[el]=Keramik σμαράγδι
+Name[eo]=Ceramika Bluo
+Name[es]=Esmeralda cerámica
+Name[et]=Sügavroheline Keramik
+Name[eu]=Keramik esmeralda
+Name[fa]=زمردی کرامیک
+Name[fi]=Keramik smaragdi
+Name[fr]=Keramik émeraude
+Name[fy]=Keramyk-Emerald
+Name[ga]=Iathghlas Keramik
+Name[gl]=Keramic Esmeralda
+Name[hi]=के-रामिक पन्ना
+Name[hu]=Keramik (kék)
+Name[it]=Ceramica smeraldo
+Name[km]=Keramik បៃតង​ឆើត
+Name[lo]=ເຄຣາມິກ - K
+Name[lt]=Keramik smaragdinis
+Name[lv]=Smaragda Keramika
+Name[mk]=Керамик смарагд
+Name[mn]=Ваар-Emerald
+Name[ms]=Zamrud Keramik
+Name[mt]=Keramik Żmeralda
+Name[nb]=Keramikk, smaragdgrønn
+Name[nds]=Keramik-Smaragd
+Name[ne]=केरामिक इमेरल्ड
+Name[nl]=Keramik-Emerald
+Name[nn]=Keramikk, smaragdgrøn
+Name[pa]=ਕੀਰਾਮਿਕ ਈਮੀਰਾਲਡ
+Name[pt]=Keramik Esmeralda
+Name[pt_BR]=Keramik Esmeralda
+Name[rw]=Ibuyecyatsi Keramik
+Name[se]=Bálseduoddji, smarágdalágan
+Name[sr]=Смарагдна керамика
+Name[sr@Latn]=Smaragdna keramika
+Name[sv]=Keramik smaragd
+Name[ta]=கெராமிக் எமரால்ட்
+Name[te]=కెరామిక్ మరకతం
+Name[th]=เครามิกมรกต
+Name[uz]=Zumrad keramika
+Name[uz@cyrillic]=Зумрад керамика
+Name[vi]=Gốm lục bảo
+Name[zh_CN]=Keramik 翠绿
+Name[zh_TW]=綠寶石 Keramik
+activeBackground=213,166,55
+activeBlend=212,165,56
+activeForeground=255,255,255
+activeTitleBtnBg=220,220,220
+alternateBackground=240,240,240
+background=238,238,230
+buttonBackground=238,234,222
+buttonForeground=0,0,0
+contrast=7
+foreground=0,0,0
+inactiveBackground=193,197,171
+inactiveBlend=226,230,199
+inactiveForeground=255,255,255
+inactiveTitleBtnBg=220,220,220
+linkColor=0,0,192
+selectBackground=134,204,134
+selectForeground=0,0,0
+visitedLinkColor=128,0,128
+windowBackground=255,255,255
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/KeramikWhite.kcsrc b/kcontrol/krdb/kcs/KeramikWhite.kcsrc
new file mode 100644
index 000000000..1fe807db1
--- /dev/null
+++ b/kcontrol/krdb/kcs/KeramikWhite.kcsrc
@@ -0,0 +1,91 @@
+[Color Scheme]
+Name=Keramik White
+Name[af]=Keramik Wit
+Name[ar]=قرميدي أبيض
+Name[az]=Keramik Ağ
+Name[be]=Белая кераміка
+Name[bn]=কেরামিক সাদা
+Name[br]=Keramik gwenn
+Name[bs]=Keramik bijela
+Name[ca]=Keramik blanc
+Name[cs]=Keramika (bílá)
+Name[csb]=Keramik Biôłi
+Name[cy]=Keramik Gwyn
+Name[da]=Keramik hvid
+Name[de]=Porzellanweiß
+Name[el]=Keramik άσπρο
+Name[eo]=Ceramika blanko
+Name[es]=Keramik blanco
+Name[et]=Valge Keramik
+Name[eu]=Keramik zuria
+Name[fa]=سفید کرامیک
+Name[fi]=Keramik valkoinen
+Name[fr]=Keramik blanc
+Name[fy]=Keramyk-wit
+Name[ga]=Bán Keramik
+Name[gl]=Keramic Branco
+Name[hi]=केरमिक सफेद
+Name[hr]=Keramik bijela
+Name[hu]=Keramik (fehér)
+Name[is]=Keramik hvítt
+Name[it]=Ceramica bianca
+Name[km]=Keramik ស
+Name[lo]=ເຄຣາມິກ - K
+Name[lt]=Keramik baltas
+Name[lv]=Balta Keramika
+Name[mk]=Керамик бело
+Name[mn]=Шаазан цагаан
+Name[ms]=Putih Keramik
+Name[mt]=Keramik Abjad
+Name[nb]=Keramikk, hvit
+Name[nds]=Keramikwitt
+Name[ne]=केरामिक सेतो
+Name[nl]=Keramik-wit
+Name[nn]=Keramikk kvit
+Name[nso]=Boshweu bja Keramik
+Name[pa]=ਕੀਰਾਮਿਕ ਸਫੈਦ
+Name[pl]=Keramik Biały
+Name[pt]=Keramik Branco
+Name[pt_BR]=Keramik Branco
+Name[ro]=Keramik alb
+Name[rw]=Umweru Keramik
+Name[se]=Vilges bálseduoddji
+Name[sk]=Keramik Biely
+Name[sl]=Keramik bela
+Name[sr]=Бела керамика
+Name[sr@Latn]=Bela keramika
+Name[sv]=Vit Keramik
+Name[ta]=கேரமிக் வெள்ளை
+Name[te]=కెరామిక్ తెలుపు
+Name[tg]=Keramik-и сафед
+Name[th]=เครามิกขาว
+Name[tr]=Beyaz Keramik
+Name[uk]=Білий Keramik
+Name[uz]=Oq keramika
+Name[uz@cyrillic]=Оқ керамика
+Name[vi]=Gốm trắng
+Name[wa]=Blanc Keramik
+Name[xh]=Keramik Emhlophe
+Name[zh_CN]=Keramik 白
+Name[zh_TW]=Keramik 白
+Name[zu]=Okumhlophe kwe-Keramik
+activeBackground=151,173,195
+activeBlend=151,173,195
+activeForeground=255,255,255
+activeTitleBtnBg=220,220,220
+alternateBackground=238,246,255
+background=233,233,233
+buttonBackground=246,246,246
+buttonForeground=0,0,0
+contrast=7
+foreground=0,0,0
+inactiveBackground=210,210,210
+inactiveBlend=215,215,215
+inactiveForeground=255,255,255
+inactiveTitleBtnBg=220,220,220
+linkColor=0,0,192
+selectBackground=255,221,118
+selectForeground=3,3,3
+visitedLinkColor=128,0,128
+windowBackground=255,255,255
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/Makefile.am b/kcontrol/krdb/kcs/Makefile.am
new file mode 100644
index 000000000..8c5200089
--- /dev/null
+++ b/kcontrol/krdb/kcs/Makefile.am
@@ -0,0 +1,12 @@
+
+kdisplay_colorschemes_data_DATA = AtlasGreen.kcsrc BeOS.kcsrc BlueSlate.kcsrc \
+ CDE.kcsrc DarkBlue.kcsrc DesertRed.kcsrc DigitalCDE.kcsrc \
+ PaleGray.kcsrc Pumpkin.kcsrc SolarisCDE.kcsrc Storm.kcsrc \
+ Windows2000.kcsrc System.kcsrc Next.kcsrc PointReyesGreen.kcsrc \
+ KDEOne.kcsrc KDETwo.kcsrc MediaPeach.kcsrc Windows95.kcsrc EveX.kcsrc \
+ WindowsXP.kcsrc Keramik.kcsrc KeramikEmerald.kcsrc KeramikWhite.kcsrc \
+ BlackOnWhite.kcsrc WhiteOnBlack.kcsrc YellowOnBlue.kcsrc Plastik.kcsrc
+
+kdisplay_colorschemes_datadir = $(kde_datadir)/kdisplay/color-schemes
+
+EXTRA_DIST = $(kdisplay_colorschemes_data_DATA)
diff --git a/kcontrol/krdb/kcs/MediaPeach.kcsrc b/kcontrol/krdb/kcs/MediaPeach.kcsrc
new file mode 100644
index 000000000..2b68a18d7
--- /dev/null
+++ b/kcontrol/krdb/kcs/MediaPeach.kcsrc
@@ -0,0 +1,60 @@
+[Color Scheme]
+Name=Media Peach
+Name[af]=Media Perske
+Name[bn]=মিডিয়া পীচ
+Name[bs]=Media breskva
+Name[cy]=Eirynen Wlanog Cyfryngau
+Name[de]=Mittlere Pfirsichfarbe
+Name[eo]=Persiko
+Name[es]=Melocotón multimedia
+Name[eu]=Multimedia mertxika
+Name[fr]=Pêche pastel
+Name[he]=אפרסק
+Name[hi]=मीडिया पीच
+Name[hr]=Medijska breskva
+Name[hu]=Barackszínű
+Name[it]=Pesca
+Name[lo]=ລູກທໍ້
+Name[lt]=Media persiko
+Name[lv]=Mēdiju Persiks
+Name[ms]=Pic Sederhana
+Name[nb]=Mediefersken
+Name[nds]=Middelpeersch
+Name[ne]=मिडिया पिच
+Name[nn]=Mediefersken
+Name[pa]=ਮੀਡਿਆ ਪੀਂਚ
+Name[pt_BR]=Pêssego
+Name[ro]=Piersică
+Name[se]=Mediapersihkka
+Name[ta]=ஊடக பீச்
+Name[te]=మీడియా పీచ్
+Name[th]=ลูกท้อ
+Name[tr]=Medya Şeftalisi
+Name[uz]=Shaftoli
+Name[uz@cyrillic]=Шафтоли
+Name[ven]=Beregisi Zwimvumvusi
+Name[vi]=Hồng đào
+Name[wa]=Petche media
+Name[xh]=Peach Esesiphakathini
+Name[zh_CN]=Media 桃色
+Name[zh_TW]=Media 桃紅
+Name[zu]=Unozindaba osapetshisi
+activeBackground=68,31,156
+activeBlend=11,4,35
+activeForeground=255,255,255
+activeTitleBtnBg=214,205,187
+background=244,221,178
+buttonBackground=244,221,178
+buttonForeground=0,0,0
+contrast=3
+foreground=0,0,0
+inactiveBackground=0,70,70
+inactiveBlend=14,45,27
+inactiveForeground=214,214,214
+inactiveTitleBtnBg=214,205,187
+linkColor=0,0,192
+selectBackground=128,0,0
+selectForeground=255,255,255
+visitedLinkColor=128,0,128
+windowBackground=255,231,186
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/Next.kcsrc b/kcontrol/krdb/kcs/Next.kcsrc
new file mode 100644
index 000000000..bc2424ef8
--- /dev/null
+++ b/kcontrol/krdb/kcs/Next.kcsrc
@@ -0,0 +1,53 @@
+[Color Scheme]
+activeBackground=0,0,0
+activeBlend=255,255,255
+activeForeground=255,255,255
+activeTitleBtnBg=0,0,0
+activeTitleBtnBlend=0,0,0
+activeTitleBtnFg=255,255,255
+background=168,168,168
+alternateBackground=233,233,233
+buttonBackground=168,168,168
+buttonForeground=0,0,0
+contrast=10
+foreground=0,0,0
+inactiveBackground=168,168,168
+inactiveBlend=168,168,168
+inactiveForeground=255,255,255
+inactiveTitleBtnBg=168,168,168
+inactiveTitleBtnBlend=168,168,168
+inactiveTitleBtnFg=255,255,255
+Name=Next
+Name[af]=Volgende
+Name[bn]=নেক্সট
+Name[br]=A heul
+Name[cy]=Nesaf
+Name[eo]=Neksto
+Name[es]=NeXT
+Name[fa]=بعدی
+Name[fy]=Fierder
+Name[ga]=Ar Aghaidh
+Name[hi]=अगला
+Name[km]=បន្ទាប់
+Name[lo]=ລະບົບປະຕິບັດການ Next
+Name[lt]=Kitas
+Name[ne]=पछिल्लो
+Name[nso]=Latelago
+Name[pa]=ਅੱਗੇ
+Name[rw]=Ibikurikira
+Name[ss]=Lokulandzelako
+Name[ta]=அடுத்து
+Name[te]=నెక్స్ట్
+Name[tg]=Навбатӣ
+Name[th]=ระบบปฏิบัติการ Next
+Name[tt]=Kiläse
+Name[ven]=Phanda
+Name[vi]=Tiếp theo
+Name[wa]=NeXT
+Name[xh]=Elandelayo
+Name[zh_TW]=下一個
+Name[zu]=Okulandelayo
+selectBackground=0,0,0
+selectForeground=255,255,255
+windowBackground=255,255,255
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/PaleGray.kcsrc b/kcontrol/krdb/kcs/PaleGray.kcsrc
new file mode 100644
index 000000000..cc4ee8465
--- /dev/null
+++ b/kcontrol/krdb/kcs/PaleGray.kcsrc
@@ -0,0 +1,90 @@
+# KDE Config File
+[Color Scheme]
+Name=Pale Gray
+Name[af]=Bleek Grys
+Name[ar]=رمادي فاتح
+Name[az]=Boz Qurd
+Name[be]=Адценні шэрага колеру
+Name[bn]=ধূসর ছাই
+Name[bs]=Blijedo siva
+Name[ca]=Gris pàl·lid
+Name[cs]=Bledě šedá
+Name[csb]=Bladoszari
+Name[cy]=Llwyd Golau
+Name[da]=Hvidgrå
+Name[de]=Fahles Grau
+Name[el]=Χλωμό γκρι
+Name[en_GB]=Pale Grey
+Name[eo]=Pala grizo
+Name[es]=Gris pálido
+Name[et]=Kahvatuhall
+Name[eu]=Gris zurbila
+Name[fa]=خاکستری کم‌رنگ
+Name[fi]=Vaaleanharmaa
+Name[fr]=Gris pâle
+Name[fy]=Fealgriis
+Name[ga]=Liathghlas
+Name[gl]=Gris Claro
+Name[he]=אפור בהיר
+Name[hi]=फ़ीका धूसर
+Name[hr]=Blijedo sivo
+Name[hu]=Halványszürke
+Name[is]=Fölgrátt
+Name[it]=Grigio pallido
+Name[ja]=ペールグレー
+Name[km]=ប្រផេះ​ស្លេក
+Name[lo]=ເທົາອ່ອນ
+Name[lt]=Pilkšva
+Name[lv]=Gaiši pelēks
+Name[mk]=Бледо сиво
+Name[mn]=Цайвар саарал
+Name[ms]=Kelabu Pucat
+Name[mt]=Griż Ċar
+Name[nb]=Lysegrå
+Name[nds]=Bleek-Gries
+Name[ne]=पेल खैरो
+Name[nl]=Vaalgrijs
+Name[nn]=Lysegrå
+Name[pa]=ਪਾਲੀ ਗਰੇ
+Name[pl]=Bladoszary
+Name[pt]=Cinzento Pálido
+Name[pt_BR]=Cinza
+Name[ro]=Gri pal
+Name[rw]=Ikijuju cyoroshye
+Name[se]=Čuvgesránes
+Name[sk]=Svetlošedá
+Name[sl]=Bleda sivina
+Name[sr]=Бледо сива
+Name[sr@Latn]=Bledo siva
+Name[sv]=Blekgrå
+Name[ta]=பழுப்புச் சாயல்
+Name[te]=లేత బూడిద
+Name[th]=เทาอ่อน
+Name[tr]=Açık Gri
+Name[tt]=Tonıq Sorı
+Name[uk]=Тьмяно-сірий
+Name[uz]=Och kul
+Name[uz@cyrillic]=Оч кул
+Name[ven]=Lutada lwo tshenuluwaho
+Name[vi]=Màu xám nhạt
+Name[wa]=Clair gris
+Name[xh]=Ngwevu Bumbatsha
+Name[zh_CN]=灰白
+Name[zh_TW]=灰白
+Name[zu]=Okumpunga ngokukhanyayo
+background=#d6d6d6
+buttonBackground=#d6d6d6
+buttonForeground=#000000
+selectBackground=#000000
+foreground=#000000
+activeForeground=#ffffff
+inactiveBackground=#a0a0a0
+inactiveBlend=#d6d6d6
+activeBackground=#000000
+activeBlend=#d6d6d6
+contrast=3
+inactiveForeground=#d6d6d6
+windowForeground=#000000
+windowBackground=#ffffff
+selectForeground=#ffffff
+alternateBackground=#f5f5f5
diff --git a/kcontrol/krdb/kcs/Plastik.kcsrc b/kcontrol/krdb/kcs/Plastik.kcsrc
new file mode 100644
index 000000000..bfc365648
--- /dev/null
+++ b/kcontrol/krdb/kcs/Plastik.kcsrc
@@ -0,0 +1,55 @@
+[Color Scheme]
+Name=Plastik
+Name[af]=Plastiek
+Name[ar]=بلاستيك
+Name[be]=Пластык
+Name[bn]=প্লাস্টিক
+Name[eo]=Plastiko
+Name[fa]=پلاستیک
+Name[fy]=Plastyk
+Name[hi]=प्लास्टिक
+Name[hr]=Plastika
+Name[is]=Plast
+Name[it]=Plastica
+Name[ka]=Пластик
+Name[kk]=Пластик
+Name[km]=ប្ល៉ាស្ទិក
+Name[lt]=Plastikinis
+Name[lv]=Plastika
+Name[mk]=Пластик
+Name[nb]=Plast
+Name[ne]=प्लास्टिक
+Name[nn]=Plast
+Name[pa]=ਪਲਾਸਟਿਕ
+Name[ro]=Plastic
+Name[ru]=Пластик
+Name[se]=Plastihkka
+Name[sr]=Пластика
+Name[sr@Latn]=Plastika
+Name[ta]=திட்டம்
+Name[te]=ప్లాస్టిక్
+Name[th]=พลาสติก
+Name[uk]=Пластик
+Name[uz@cyrillic]=Пластик
+Name[vi]=Chất dẻo
+Name[zh_CN]=塑料
+activeBackground=65,142,220
+activeBlend=107,145,184
+activeForeground=255,255,255
+activeTitleBtnBg=220,220,220
+alternateBackground=237,244,249
+background=239,239,239
+buttonBackground=221,223,228
+buttonForeground=0,0,0
+contrast=7
+foreground=0,0,0
+inactiveBackground=157,170,186
+inactiveBlend=157,170,186
+inactiveForeground=221,221,221
+inactiveTitleBtnBg=220,220,220
+linkColor=0,0,238
+selectBackground=103,141,178
+selectForeground=255,255,255
+visitedLinkColor=82,24,139
+windowBackground=255,255,255
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/PointReyesGreen.kcsrc b/kcontrol/krdb/kcs/PointReyesGreen.kcsrc
new file mode 100644
index 000000000..e7c9b9bee
--- /dev/null
+++ b/kcontrol/krdb/kcs/PointReyesGreen.kcsrc
@@ -0,0 +1,75 @@
+[Color Scheme]
+activeBackground=65,127,75
+activeBlend=65,127,75
+activeForeground=255,255,255
+activeTitleBtnBg=116,132,115
+alternateBackground=226,234,226
+background=211,197,190
+buttonBackground=171,160,154
+buttonForeground=38,75,44
+contrast=0
+foreground=46,90,53
+inactiveBackground=116,132,115
+inactiveBlend=116,132,115
+inactiveForeground=192,179,173
+inactiveTitleBtnBg=162,184,160
+linkColor=14,153,4
+Name=Point Reyes Green
+Name[af]=Punt Strale Groen
+Name[az]=Point Reyes Yaşılı
+Name[bs]=Point Reyes zelena
+Name[ca]=Verd Point Reyes
+Name[cs]=Point Reyes zelená
+Name[csb]=Zelonosc pùnktu Reyes
+Name[cy]=Gwyrdd Point Reyes
+Name[de]=Point Reyes-Grün
+Name[eo]=Verdaj tonoj
+Name[es]=Verde Point Reyes
+Name[et]=Point Reyes roheline
+Name[eu]=Point Reyes berdea
+Name[fa]=سبز نقطه-نقطه
+Name[fr]=Vert doux
+Name[fy]=Dúngrien
+Name[he]=ירוק ים
+Name[hi]=प्वाइंट रेस हरा
+Name[hr]=Point Reyes zeleno
+Name[hu]=Zöldes árnyalat
+Name[is]=Point Reyes grænt
+Name[it]=Verde Point Reyes
+Name[ja]=ポイントレイズグリーン
+Name[lo]=ຈຸດຂງວປະກາຍ
+Name[lt]=Point Reyes žalia
+Name[lv]=Point Reyes Zaļš
+Name[mn]=Point Reyes-Ногоон
+Name[mt]=Aħdar Point Reyes
+Name[nb]=Grønn og rosa
+Name[nds]=Point Reyes-Gröön
+Name[ne]=बिन्दु रेइज हरियो
+Name[nl]=Duingroen
+Name[nn]=Grøn og rosa
+Name[pa]=ਬਿੰਦੂ ਰੀਆਈਸ ਹਰਾ
+Name[pl]=Zieleń punktu Reyes
+Name[pt]=Verde Point Reyes
+Name[pt_BR]=Verde
+Name[ro]=Verde Point Reyes
+Name[rw]=Akadomo Reyes Icyatsi
+Name[se]=Ruoná ja guvgesrukses
+Name[sk]=Point Reyes zelená
+Name[sl]=Zelena Point Reyes
+Name[sr]=Point Reyes зелена
+Name[sr@Latn]=Point Reyes zelena
+Name[sv]=Point Reyes-grön
+Name[te]=పాయింట్ రెయిస్ పచ్చ
+Name[tg]=Сабзи нуқта нуқта
+Name[th]=จุดเขียวประปราย
+Name[tr]=Point Reyes Yeşili
+Name[ven]=Kha Muvhala mudala
+Name[vi]=Màu xanh Point Reyes
+Name[wa]=Vert Point Reyes
+Name[xh]=Point Reyes Green (okwengca)
+Name[zh_TW]=Point Reyes 綠
+selectBackground=65,127,75
+selectForeground=255,255,255
+visitedLinkColor=38,75,44
+windowBackground=255,255,255
+windowForeground=83,33,19
diff --git a/kcontrol/krdb/kcs/Pumpkin.kcsrc b/kcontrol/krdb/kcs/Pumpkin.kcsrc
new file mode 100644
index 000000000..b27f9f275
--- /dev/null
+++ b/kcontrol/krdb/kcs/Pumpkin.kcsrc
@@ -0,0 +1,87 @@
+# KDE Config File
+[Color Scheme]
+foreground=0,0,0
+selectForeground=255,255,255
+activeBlend=255,215,0
+selectBackground=205,133,63
+inactiveBackground=160,160,160
+Name=Pumpkin
+Name[af]=Pampoen
+Name[ar]=يقطيني
+Name[be]=Гарбуз
+Name[bn]=পাম্পকিন
+Name[ca]=Carabassa
+Name[cs]=Dýně
+Name[csb]=Bania
+Name[cy]=Pwmpen
+Name[de]=Kürbis
+Name[el]=Κολοκύθα
+Name[eo]=Kukurbo
+Name[es]=Calabaza
+Name[et]=Kõrvits
+Name[eu]=Kalabaza
+Name[fa]=کدو حلوایی
+Name[fi]=Kurpitsa
+Name[fr]=Potiron
+Name[fy]=klabats
+Name[ga]=Puimcín
+Name[he]=דלעת
+Name[hi]=कुम्हड़ा
+Name[hr]=Bundeva
+Name[hu]=Házitök
+Name[is]=Grasker
+Name[it]=Zucca
+Name[ja]=かぼちゃ色
+Name[kk]=Асқабақ
+Name[km]=ល្ពៅ
+Name[lo]=ຫມາກອຶ
+Name[lv]=Ķirbis
+Name[mk]=Тиквичка
+Name[mn]=Хулуу
+Name[ms]=Labu
+Name[mt]=Qargħa Ħamra
+Name[nb]=Gresskar
+Name[nds]=Körbs
+Name[ne]=पम्पकिन
+Name[nl]=Pompoen
+Name[nn]=Graskar
+Name[nso]=Lephutsi
+Name[pa]=ਪੰਪਕਿਨ
+Name[pl]=Dynia
+Name[pt]=Abóbora
+Name[pt_BR]=Abóbora
+Name[ro]=Dovlecel
+Name[ru]=Тыква
+Name[se]=Gurbbet
+Name[sk]=Tekvica
+Name[sl]=Buča
+Name[sr]=Бундева
+Name[sr@Latn]=Bundeva
+Name[ss]=Litsanga
+Name[sv]=Pumpa
+Name[ta]=பூசணிக்காய்
+Name[te]=గుమ్మడి
+Name[tg]=Каду
+Name[th]=ฟักทอง
+Name[tt]=Qabaq
+Name[uk]=Гарбузовий
+Name[uz]=Qovoq
+Name[uz@cyrillic]=Қовоқ
+Name[ven]=Fhuri
+Name[vi]=Bí đỏ
+Name[wa]=Potiron
+Name[xh]=Ithanga
+Name[zh_CN]=南瓜黄
+Name[zh_TW]=南瓜黃
+Name[zu]=Ithanga
+contrast=3
+background=238,216,174
+buttonBackground=238,216,174
+buttonForeground=0,0,0
+activeBackground=205,133,63
+inactiveBlend=214,214,214
+inactiveForeground=238,238,209
+activeForeground=255,255,255
+windowForeground=0,0,0
+windowBackground=255,255,255
+alternateBackground=255,245,235
diff --git a/kcontrol/krdb/kcs/SolarisCDE.kcsrc b/kcontrol/krdb/kcs/SolarisCDE.kcsrc
new file mode 100644
index 000000000..747eeb337
--- /dev/null
+++ b/kcontrol/krdb/kcs/SolarisCDE.kcsrc
@@ -0,0 +1,38 @@
+[Color Scheme]
+Name=Solaris
+Name[az]=Solaris CDE
+Name[bn]=সোলারিস
+Name[eo]=Solariso
+Name[fa]=سولاریس
+Name[hi]=सोलारिस
+Name[kk]=Солярис
+Name[lo]=ໂຊລາຣິສ
+Name[lt]=Solario CDE
+Name[ne]=सोलारिस
+Name[ru]=Солярис
+Name[ta]=சோலாரிஸ்
+Name[te]=సొలారిస్
+Name[tg]=Солярис
+Name[th]=โซลาริส
+Name[tt]=Qoyaşlı
+Name[ven]=Solarisi
+Name[xh]=Isikhanyiso esenziwa lilanga
+activeBackground=178,77,122
+activeBlend=174,178,195
+activeForeground=255,255,255
+activeTitleBtnBg=174,178,195
+background=174,178,195
+buttonBackground=174,178,195
+buttonForeground=0,0,0
+contrast=3
+foreground=0,0,0
+inactiveBackground=174,178,195
+inactiveBlend=174,178,195
+inactiveForeground=0,0,0
+inactiveTitleBtnBg=174,178,195
+linkColor=0,0,255
+selectBackground=113,139,165
+selectForeground=255,255,255
+visitedLinkColor=192,255,255
+windowBackground=147,151,165
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/Storm.kcsrc b/kcontrol/krdb/kcs/Storm.kcsrc
new file mode 100644
index 000000000..cfdec4fa2
--- /dev/null
+++ b/kcontrol/krdb/kcs/Storm.kcsrc
@@ -0,0 +1,84 @@
+# KDE Config File
+[Color Scheme]
+foreground=0,0,0
+selectForeground=255,255,255
+activeBlend=139,0,139
+selectBackground=139,0,139
+inactiveBackground=120,120,120
+Name=Storm
+Name[ar]=عاصفة
+Name[az]=Fırtına
+Name[be]=Навальніца
+Name[bn]=স্টর্ম
+Name[br]=Gwallamzer
+Name[ca]=Tempesta
+Name[cs]=Bouře
+Name[csb]=Grzëmòt
+Name[de]=Sturm
+Name[el]=Καταιγίδα
+Name[eo]=Ŝtormo
+Name[es]=Tormenta
+Name[eu]=Ekaitza
+Name[fa]=طوفان
+Name[fi]=Myrsky
+Name[fr]=Tempête
+Name[fy]=Stoarm
+Name[ga]=Stoirm
+Name[gl]=Tormenta
+Name[he]=סערה
+Name[hi]=तूफ़ान
+Name[hr]=Oluja
+Name[hu]=Vihar
+Name[is]=Stormur
+Name[it]=Tempesta
+Name[ja]=ストーム
+Name[kk]=Дауыл
+Name[km]=ព្យុះ
+Name[lo]=ພາຍຸ
+Name[lt]=Audra
+Name[lv]=Vētra
+Name[mk]=Бура
+Name[mn]=Шуурга
+Name[ms]=Ribut
+Name[mt]=Tempesta
+Name[ne]=स्टर्म
+Name[nso]=Matlakadibe
+Name[pa]=ਤੂਫਾਨੀ
+Name[pl]=Burza
+Name[pt]=Tempestade
+Name[pt_BR]=Tempestade
+Name[ro]=Furtună
+Name[ru]=Шторм
+Name[rw]=Umuhengeri
+Name[se]=Riđđu
+Name[sk]=Búrka
+Name[sl]=Nevihta
+Name[sr]=Олуја
+Name[sr@Latn]=Oluja
+Name[ta]=புயல்
+Name[te]=స్టార్మ్
+Name[tg]=Тӯфон
+Name[th]=พายุ
+Name[tr]=Fırtına
+Name[tt]=Dawıl
+Name[uk]=Гроза
+Name[uz]=Poʻrtana
+Name[uz@cyrillic]=Пўртана
+Name[ven]=Madumbu
+Name[vi]=Bão
+Name[wa]=Timpesse
+Name[xh]=Isikhukhula
+Name[zh_CN]=风暴
+Name[zh_TW]=風暴
+Name[zu]=Ukuduma
+contrast=7
+background=192,192,192
+buttonBackground=192,192,192
+buttonForeground=0,0,0
+activeBackground=139,0,139
+inactiveBlend=120,120,120
+inactiveForeground=0,0,0
+activeForeground=255,255,255
+windowForeground=0,0,0
+windowBackground=255,255,255
+alternateBackground=255,240,255
diff --git a/kcontrol/krdb/kcs/System.kcsrc b/kcontrol/krdb/kcs/System.kcsrc
new file mode 100644
index 000000000..8e0a8c02d
--- /dev/null
+++ b/kcontrol/krdb/kcs/System.kcsrc
@@ -0,0 +1,99 @@
+[Color Scheme]
+activeBackground=192,192,192
+activeBlend=192,192,192
+activeForeground=0,0,0
+activeTitleBtnBg=255,255,255
+activeTitleBtnBlend=128,128,128
+activeTitleBtnFg=54,60,89
+background=211,211,211
+buttonBackground=211,211,211
+buttonForeground=0,0,0
+contrast=2
+foreground=0,0,0
+inactiveBackground=192,192,192
+inactiveBlend=192,192,192
+inactiveForeground=128,128,128
+inactiveTitleBtnBg=255,255,255
+inactiveTitleBtnBlend=128,128,128
+inactiveTitleBtnFg=43,45,62
+Name=System
+Name[af]=Stelsel
+Name[ar]=النظام
+Name[az]=Sistem
+Name[be]=Сістэма
+Name[bg]=Система
+Name[bn]=সিস্টেম
+Name[br]=Reizhiad
+Name[bs]=Sistem
+Name[ca]=Sistema
+Name[cs]=Systém
+Name[csb]=Systema
+Name[cy]=Cysawd
+Name[el]=Σύστημα
+Name[eo]=Sistemo
+Name[es]=Sistema
+Name[et]=Süsteem
+Name[eu]=Sistema
+Name[fa]=سیستم
+Name[fi]=Järjestelmä
+Name[fo]=Kervi
+Name[fr]=Système
+Name[fy]=Systeem
+Name[ga]=Córas
+Name[gl]=Sistema
+Name[he]=מערכת
+Name[hi]=तंत्र
+Name[hr]=Sustav
+Name[hu]=Rendszer
+Name[id]=Sistem
+Name[is]=Kerfi
+Name[it]=Sistema
+Name[ja]=システム
+Name[ka]=სისტემა
+Name[kk]=Жүйелік
+Name[km]=ប្រព័ន្ធ
+Name[ko]=시스템
+Name[lo]=ຈັດການລະບົບ
+Name[lt]=Sistema
+Name[lv]=Sistēma
+Name[mk]=Систем
+Name[mn]=Систем
+Name[ms]=Sistem
+Name[mt]=Sistema
+Name[nds]=Systeem
+Name[ne]=प्रणाली
+Name[nl]=Systeem
+Name[oc]=Sistemo
+Name[pa]=ਸਿਸਟਮ
+Name[pt]=Sistema
+Name[pt_BR]=Sistema
+Name[ro]=Sistem
+Name[ru]=Система
+Name[rw]=Sisitemu
+Name[se]=Vuogádat
+Name[sk]=Systém
+Name[sl]=Sistem
+Name[sr]=Систем
+Name[sr@Latn]=Sistem
+Name[ss]=Umshini
+Name[ta]=அமைப்பு
+Name[te]=వ్యవస్థ
+Name[tg]=Система
+Name[th]=ระบบ
+Name[tr]=Sistem
+Name[tt]=Sistem
+Name[uk]=Система
+Name[uz]=Tizim
+Name[uz@cyrillic]=Тизим
+Name[ven]=Maitele
+Name[vi]=Hệ thống
+Name[wa]=Sistinme
+Name[xh]=Indlela esestyenziswayo
+Name[zh_CN]=系统
+Name[zh_TW]=系統
+Name[zu]=Isistimu
+selectBackground=90,36,0
+selectForeground=255,255,255
+windowBackground=255,255,255
+windowForeground=0,0,0
+alternateBackground=255,247,240
diff --git a/kcontrol/krdb/kcs/WhiteOnBlack.kcsrc b/kcontrol/krdb/kcs/WhiteOnBlack.kcsrc
new file mode 100644
index 000000000..f62cbae07
--- /dev/null
+++ b/kcontrol/krdb/kcs/WhiteOnBlack.kcsrc
@@ -0,0 +1,88 @@
+[Color Scheme]
+Name=High Contrast White Text
+Name[af]=Hoë kontras wit teks
+Name[ar]=نص أبيض عالي التباين
+Name[be]=Высока кантрастная "белы тэкст"
+Name[bn]=হাই কনট্রাস্ট সাদা লেখা
+Name[bs]=Visoki kontrast, bijeli tekst
+Name[ca]=Text blanc d'alt contrast
+Name[cs]=Vysoký kontrast, bílý text
+Name[csb]=Kòntrastowi biôłi tekst
+Name[da]=Hvid tekst med høj kontrast
+Name[de]=Hoher Kontrast, Weiß auf Schwarz
+Name[el]=Άσπρο κείμενο υψηλής αντίθεσης
+Name[eo]=Alt-kontrasta Blanka Teksto
+Name[es]=Texto blanco de alto contraste
+Name[et]=Väga kontrastne valge tekst
+Name[eu]=Kontraste handiko testu zuria
+Name[fa]=متن سفید با سایه روشن بالا
+Name[fi]=Suuren värikontrastin valkoinen teksti
+Name[fr]=Texte en blanc avec contraste élevé
+Name[fy]=Heech kontrast wite tekst
+Name[gl]=Texto Branco de Alto Contraste
+Name[he]=ניגודיות גבוהה עם טקסט לבן
+Name[hr]=Bijeli tekst visokog kontrasta
+Name[hu]=Erősen kontrasztos fehér szöveg
+Name[is]=Há birtuskila hvítur texti
+Name[it]=Testo bianco ad alto contrasto
+Name[ja]=ハイコントラストの白いテキスト
+Name[ka]=მაღალკონსტრასტული თეთრი ტექტი
+Name[kk]=Контрастығы жоғары ақ мәтін
+Name[km]=អត្ថបទ​ពណ៌​ស កម្រិត​ពណ៌​ខ្ពស់
+Name[lt]=Didelio kontrasto baltas tekstas
+Name[mk]=Бел текст со висок контраст
+Name[ms]=Teks Putih Kontras Tinggi
+Name[nb]=Høykontrast, hvit tekst
+Name[nds]=Hogen Kontrast, witt Text
+Name[ne]=उच्च व्यतिरेक सेतो पाठ
+Name[nl]=Hoog contrast witte tekst
+Name[nn]=Høgkontrast, kvit tekst
+Name[pa]=ਜਿਆਦਾ ਗੂੜਾ ਪਾਠ ਸਫੈਦ
+Name[pl]=Kontrastowy biały tekst
+Name[pt]=Alto Contraste Texto Branco
+Name[pt_BR]=Alto Contraste do Texto Branco
+Name[ro]=Contrast mare text alb
+Name[ru]=Высококонтрастный белый текст
+Name[rw]=Umwandiko w'Umweru Inyuranyamigaragarire yo Hejuru
+Name[se]=Alla vuostálasvuohta, vilges teaksta
+Name[sk]=Vysokokontrastný biely text
+Name[sl]=Visoko kontrastno belo besedilo
+Name[sr]=Бели текст високог контраста
+Name[sr@Latn]=Beli tekst visokog kontrasta
+Name[sv]=Vit text med hög kontrast
+Name[ta]=அதிக மாறுபட்ட வெள்ளை உரை
+Name[th]=ตัวอักษรขาวคอนทราสสูง
+Name[tr]=Yüksek Kontrast Beyaz Metin
+Name[tt]=Kisken Aq
+Name[uk]=Висококонтрастний білий текст
+Name[uz]=Yuqori kontrastli oq matn
+Name[uz@cyrillic]=Юқори контрастли оқ матн
+Name[vi]=Chữ trắng trên nền đen
+Name[wa]=Blanc so noer
+Name[zh_CN]=高对比度白色文字
+Name[zh_TW]=高對比反白文字
+activeBackground=0,0,90
+activeBlend=0,0,90
+activeForeground=255,255,255
+activeTitleBtnBg=255,255,255
+activeForeground=255,255,255
+alternateBackground=0,0,40
+background=0,0,0
+buttonBackground=0,0,0
+buttonForeground=255,255,255
+contrast=7
+foreground=255,255,255
+frame=0,0,133
+handle=0,0,133
+inactiveBackground=30,30,30
+inactiveBlend=30,30,30
+inactiveForeground=128,128,128
+inactiveFrame=30,30,30
+inactiveHandle=30,30,30
+inactiveTitleBtnBg=170,170,170
+linkColor=255,255,255
+selectBackground=0,0,90
+selectForeground=255,255,255
+visitedLinkColor=255,255,255
+windowBackground=0,0,0
+windowForeground=255,255,255
diff --git a/kcontrol/krdb/kcs/Windows2000.kcsrc b/kcontrol/krdb/kcs/Windows2000.kcsrc
new file mode 100644
index 000000000..bccc59369
--- /dev/null
+++ b/kcontrol/krdb/kcs/Windows2000.kcsrc
@@ -0,0 +1,36 @@
+[Color Scheme]
+Name=Redmond 2000
+Name[bn]=রেডমন্ড ২০০০
+Name[eo]=Redmondo 2000
+Name[fa]=ردموند ۲۰۰۰
+Name[hi]=रेडमण्ड 2000
+Name[lo]=ເຣດມອນ 2000
+Name[lv]=Redmonda 2000
+Name[mn]=Улаан сар 2000
+Name[ne]=रेडमोन्ड २०००
+Name[ta]=ரெட்மான்ட் 2000
+Name[te]=రెడ్ మాండ్ 2000
+Name[th]=เรดมอนด์ 2000
+Name[uk]=Редмонд 2000
+Name[uz@cyrillic]=Редмонд 2000
+Name[ven]=Redmond gidimbili
+activeBackground=0,36,104
+activeBlend=168,204,240
+activeForeground=255,255,255
+activeTitleBtnBg=220,220,220
+alternateBackground=240,240,240
+background=212,208,200
+buttonBackground=212,208,200
+buttonForeground=0,0,0
+contrast=7
+foreground=0,0,0
+inactiveBackground=220,220,220
+inactiveBlend=220,220,220
+inactiveForeground=0,0,0
+inactiveTitleBtnBg=220,220,220
+linkColor=0,0,192
+selectBackground=0,36,104
+selectForeground=255,255,255
+visitedLinkColor=128,0,128
+windowBackground=255,255,255
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/Windows95.kcsrc b/kcontrol/krdb/kcs/Windows95.kcsrc
new file mode 100644
index 000000000..e31c8906c
--- /dev/null
+++ b/kcontrol/krdb/kcs/Windows95.kcsrc
@@ -0,0 +1,33 @@
+#KDE Config File
+[Color Scheme]
+Name=Redmond 95
+Name[bn]=রেডমন্ড ৯৫
+Name[eo]=Redmondo 95
+Name[fa]=ردموند ۹۵
+Name[hi]=रेडमण्ड 95
+Name[ko]=레드몬드
+Name[lo]=ເຣດມອນ 95
+Name[lv]=Redmonda 95
+Name[mn]=Улаан сар 95
+Name[ne]=रेडमोन्ड ९५
+Name[ta]=ரெட் மோன்ட் 95
+Name[te]=రెడ్ మాండ్ 95
+Name[th]=เรดมอนด์ 95
+Name[uk]=Редмонд 95
+Name[uz@cyrillic]=Редмонд 95
+Name[ven]=Redmond Futahe thanu
+background=#c3c3c3
+buttonBackground=#c3c3c3
+buttonForeground=#000000
+selectBackground=#000080
+foreground=#000000
+activeForeground=#ffffff
+activeBlend=#5a0a65
+inactiveBackground=#9c9c9c
+activeBackground=#000080
+inactiveBlend=#c3c3c3
+contrast=7
+inactiveForeground=#d6d6d6
+windowForeground=#000000
+windowBackground=#ffffff
+selectForeground=#ffffff
diff --git a/kcontrol/krdb/kcs/WindowsXP.kcsrc b/kcontrol/krdb/kcs/WindowsXP.kcsrc
new file mode 100644
index 000000000..75ec92644
--- /dev/null
+++ b/kcontrol/krdb/kcs/WindowsXP.kcsrc
@@ -0,0 +1,36 @@
+[Color Scheme]
+Name=Redmond XP
+Name[bn]=রেডমন্ড এক্স-পি
+Name[eo]=Redmondo XP
+Name[fa]=ردموند XP
+Name[hi]=रेडमण्ड एक्सपी
+Name[ko]=레드몬드
+Name[lo]=ເຣດມອນ XP
+Name[lv]=Redmonda XP
+Name[mn]=Улаан сар XP
+Name[ne]=रेडमोन्ड XP
+Name[ta]=ரெட்மாண்ட் XP
+Name[te]=రెడ్ మాండ్ ఎక్స్ పి
+Name[th]=เรดมอนด์ XP
+Name[uk]=Редмонд XP
+Name[uz@cyrillic]=Редмонд XP
+activeBackground=47,103,255
+activeBlend=41,93,180
+activeForeground=255,255,255
+activeTitleBtnBg=220,220,220
+alternateBackground=240,240,240
+background=238,238,230
+buttonBackground=238,234,222
+buttonForeground=0,0,0
+contrast=7
+foreground=0,0,0
+inactiveBackground=220,220,220
+inactiveBlend=220,220,220
+inactiveForeground=0,0,0
+inactiveTitleBtnBg=220,220,220
+linkColor=0,0,192
+selectBackground=74,121,205
+selectForeground=255,255,255
+visitedLinkColor=128,0,128
+windowBackground=255,255,255
+windowForeground=0,0,0
diff --git a/kcontrol/krdb/kcs/YellowOnBlue.kcsrc b/kcontrol/krdb/kcs/YellowOnBlue.kcsrc
new file mode 100644
index 000000000..446c2d781
--- /dev/null
+++ b/kcontrol/krdb/kcs/YellowOnBlue.kcsrc
@@ -0,0 +1,89 @@
+[Color Scheme]
+Name=High Contrast Yellow on Blue
+Name[af]=Hoë kontras geel op blou
+Name[ar]=أصفر على أزرق عالي التباين
+Name[be]=Высокакантрастная "Жоўтае па блакітным"
+Name[bn]=হাই কনট্রাস্ট নীলের ওপর হলুদ
+Name[bs]=Visoki kontrast, žuto na plavom
+Name[ca]=Groc sobre blau d'alt contrast
+Name[cs]=Vysoký kontrast, žlutá na modré
+Name[csb]=Żôłti na mòdrim z wësoczim kòntrastã
+Name[da]=Gult på blåt med høj kontrast
+Name[de]=Hoher Kontrast, Gelb auf Blau
+Name[el]=Κίτρινο σε μπλε υψηλής αντίθεσης
+Name[eo]=Alt-kontrasta Flavo sur Bluo
+Name[es]=Amarillo sobre azul de alto contraste
+Name[et]=Väga kontrastne kollane sinisel
+Name[eu]=Kontraste handiko horia urdinaren gainean
+Name[fa]=زرد با سایه روشن بالا روی آبی
+Name[fi]=Suuren kontrastin keltainen teksti sinisellä pohjalla
+Name[fr]=Jaune sur bleu avec contraste élevé
+Name[fy]=Heech kontrast giel op blau
+Name[gl]=Amarelo sobre Azul con Alto Contraste
+Name[he]=ניגודיות גבוהה צהוב על גבי כחול
+Name[hr]=Žuto na plavome visokog kontrasta
+Name[hu]=Erősen kontrasztos sárga, kék alapon
+Name[is]=Há birtuskila gult á bláu
+Name[it]=Testo ad alto contrasto giallo su blu
+Name[ja]=青地にハイコントラストの黄色
+Name[ka]=მაღალკონსტრასტული ყვითელი ლურჯ ფონზე
+Name[kk]=Контрастығы жоғары көктегі сары
+Name[km]=លឿង​លើខៀវ កម្រិត​ពណ៌​ខ្ពស់
+Name[lt]=Didelio kontrasto geltona ant mėlyno
+Name[mk]=Жолто на сино со висок контраст
+Name[ms]=Kuning Atas Biru Kontras Tinggi
+Name[nb]=Høykontrast gult på blått
+Name[nds]=Hogen Kontrast, Geel op Blaag
+Name[ne]=निलोमा उच्च व्यतिरेक पहेँलो
+Name[nl]=Hoog contrast geel op blauw
+Name[nn]=Høgkontrast gult på blått
+Name[pa]=ਨੀਲੇ 'ਤੇ ਗੂਡ਼ਾ ਪੀਲਾ
+Name[pl]=Żółty na niebieskim z wysokim kontrastem
+Name[pt]=Alto Contraste Amarelo em Azul
+Name[pt_BR]=Alto Contraste do Texto Amarelo ou Azul
+Name[ro]=Contrast mare galben pe albastru
+Name[ru]=Высококонтрастный жёлтый на синем
+Name[rw]=Umwandiko w'Umuhondo Inyuranyamigaragarire yo Hejuru
+Name[se]=Alla vuostálašvuohta, fiskat alida alde
+Name[sk]=Vysokokontrastná žltá na modrej
+Name[sl]=Visoko kontrastna rumena na modrem
+Name[sr]=Жута на плавој високог контраста
+Name[sr@Latn]=Žuta na plavoj visokog kontrasta
+Name[sv]=Gul på blå med hög kontrast
+Name[ta]=நீலத்தின் மீது மாறுபட்ட மஞ்சள்
+Name[tg]=Баландсифати зард дар боли кабуд
+Name[th]=เหลืองบนพื้นน้ำเงิน
+Name[tr]=Yüksek Kontrast Mavi Üzeri Sarı
+Name[tt]=Zäñgär östendä Kisken Sarı
+Name[uk]=Висококонтрастний чорний жовтий на синьому
+Name[uz]=Yuqori kontrastli sariq koʻkda
+Name[uz@cyrillic]=Юқори контрастли сариқ кўкда
+Name[vi]=Chữ vàng trên nền xanh
+Name[wa]=Djaene so bleu
+Name[zh_CN]=高对比蓝底黄字
+Name[zh_TW]=高對比藍底黃字
+activeBackground=0,0,180
+activeBlend=0,0,180
+activeForeground=255,255,0
+activeTitleBtnBg=255,255,0
+activeForeground=255,255,0
+alternateBackground=0,0,215
+background=0,0,255
+buttonBackground=0,0,255
+buttonForeground=255,255,0
+contrast=7
+foreground=255,255,0
+frame=0,0,122
+handle=0,0,122
+inactiveBackground=30,30,225
+inactiveBlend=30,30,225
+inactiveForeground=128,128,128
+inactiveFrame=30,30,225
+inactiveHandle=30,30,225
+inactiveTitleBtnBg=170,170,85
+linkColor=255,255,0
+selectBackground=0,0,180
+selectForeground=255,255,0
+visitedLinkColor=255,255,0
+windowBackground=0,0,255
+windowForeground=255,255,0
diff --git a/kcontrol/krdb/krdb.cpp b/kcontrol/krdb/krdb.cpp
new file mode 100644
index 000000000..690dbce9a
--- /dev/null
+++ b/kcontrol/krdb/krdb.cpp
@@ -0,0 +1,612 @@
+/****************************************************************************
+**
+**
+** KRDB - puts current KDE color scheme into preprocessor statements
+** cats specially written application default files and uses xrdb -merge to
+** write to RESOURCE_MANAGER. Thus it gives a simple way to make non-KDE
+** applications fit in with the desktop
+**
+** Copyright (C) 1998 by Mark Donohoe
+** Copyright (C) 1999 by Dirk A. Mueller (reworked for KDE 2.0)
+** Copyright (C) 2001 by Matthias Ettrich (add support for GTK applications )
+** Copyright (C) 2001 by Waldo Bastian <bastian@kde.org>
+** Copyright (C) 2002 by Karol Szwed <gallium@kde.org>
+** This application is freely distributable under the GNU Public License.
+**
+*****************************************************************************/
+
+#include <config.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#undef Unsorted
+#include <qbuffer.h>
+#include <qdir.h>
+#include <qsettings.h>
+#include <qtooltip.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kglobalsettings.h>
+#include <kstandarddirs.h>
+#include <kprocio.h>
+#include <ksavefile.h>
+#include <ktempfile.h>
+#include <klocale.h>
+#include <kstyle.h>
+
+#include "krdb.h"
+
+#include <X11/Xlib.h>
+
+inline const char * gtkEnvVar(int version)
+{
+ return 2==version ? "GTK2_RC_FILES" : "GTK_RC_FILES";
+}
+
+inline const char * sysGtkrc(int version)
+{
+ if(2==version)
+ {
+ if(access("/etc/opt/gnome/gtk-2.0", F_OK) == 0)
+ return "/etc/opt/gnome/gtk-2.0/gtkrc";
+ else
+ return "/etc/gtk-2.0/gtkrc";
+ }
+ else
+ {
+ if(access("/etc/opt/gnome/gtk", F_OK) == 0)
+ return "/etc/opt/gnome/gtk/gtkrc";
+ else
+ return "/etc/gtk/gtkrc";
+ }
+}
+
+inline const char * userGtkrc(int version)
+{
+ return 2==version ? "/.gtkrc-2.0" : "/.gtkrc";
+}
+
+// -----------------------------------------------------------------------------
+static void applyGtkStyles(bool active, int version)
+{
+ QString gtkkde = locateLocal("config", 2==version?"gtkrc-2.0":"gtkrc");
+ QCString gtkrc = getenv(gtkEnvVar(version));
+ QStringList list = QStringList::split(':', QFile::decodeName(gtkrc));
+ if (list.count() == 0)
+ {
+ list.append(QString::fromLatin1(sysGtkrc(version)));
+ list.append(QDir::homeDirPath()+userGtkrc(version));
+ }
+ list.remove(gtkkde);
+ list.append(gtkkde);
+ if (!active)
+ ::unlink(QFile::encodeName(gtkkde));
+
+ // Pass env. var to kdeinit.
+ QCString name = gtkEnvVar(version);
+ QCString value = QFile::encodeName(list.join(":"));
+ QByteArray params;
+ QDataStream stream(params, IO_WriteOnly);
+ stream << name << value;
+ kapp->dcopClient()->send("klauncher", "klauncher", "setLaunchEnv(QCString,QCString)", params);
+}
+
+// -----------------------------------------------------------------------------
+
+static void applyQtColors( KConfig& kglobals, QSettings& settings, QPalette& newPal )
+{
+ QStringList actcg, inactcg, discg;
+
+ /* export kde color settings */
+ int i;
+ for (i = 0; i < QColorGroup::NColorRoles; i++)
+ actcg << newPal.color(QPalette::Active,
+ (QColorGroup::ColorRole) i).name();
+ for (i = 0; i < QColorGroup::NColorRoles; i++)
+ inactcg << newPal.color(QPalette::Inactive,
+ (QColorGroup::ColorRole) i).name();
+ for (i = 0; i < QColorGroup::NColorRoles; i++)
+ discg << newPal.color(QPalette::Disabled,
+ (QColorGroup::ColorRole) i).name();
+
+ while (!settings.writeEntry("/qt/Palette/active", actcg)) ;
+ settings.writeEntry("/qt/Palette/inactive", inactcg);
+ settings.writeEntry("/qt/Palette/disabled", discg);
+
+ // export kwin's colors to qtrc for kstyle to use
+ kglobals.setGroup("WM");
+
+ // active colors
+ QColor clr = newPal.active().background();
+ clr = kglobals.readColorEntry("activeBackground", &clr);
+ settings.writeEntry("/qt/KWinPalette/activeBackground", clr.name());
+ if (QPixmap::defaultDepth() > 8)
+ clr = clr.dark(110);
+ clr = kglobals.readColorEntry("activeBlend", &clr);
+ settings.writeEntry("/qt/KWinPalette/activeBlend", clr.name());
+ clr = newPal.active().highlightedText();
+ clr = kglobals.readColorEntry("activeForeground", &clr);
+ settings.writeEntry("/qt/KWinPalette/activeForeground", clr.name());
+ clr = newPal.active().background();
+ clr = kglobals.readColorEntry("frame", &clr);
+ settings.writeEntry("/qt/KWinPalette/frame", clr.name());
+ clr = kglobals.readColorEntry("activeTitleBtnBg", &clr);
+ settings.writeEntry("/qt/KWinPalette/activeTitleBtnBg", clr.name());
+
+ // inactive colors
+ clr = newPal.inactive().background();
+ clr = kglobals.readColorEntry("inactiveBackground", &clr);
+ settings.writeEntry("/qt/KWinPalette/inactiveBackground", clr.name());
+ if (QPixmap::defaultDepth() > 8)
+ clr = clr.dark(110);
+ clr = kglobals.readColorEntry("inactiveBlend", &clr);
+ settings.writeEntry("/qt/KWinPalette/inactiveBlend", clr.name());
+ clr = newPal.inactive().background().dark();
+ clr = kglobals.readColorEntry("inactiveForeground", &clr);
+ settings.writeEntry("/qt/KWinPalette/inactiveForeground", clr.name());
+ clr = newPal.inactive().background();
+ clr = kglobals.readColorEntry("inactiveFrame", &clr);
+ settings.writeEntry("/qt/KWinPalette/inactiveFrame", clr.name());
+ clr = kglobals.readColorEntry("inactiveTitleBtnBg", &clr);
+ settings.writeEntry("/qt/KWinPalette/inactiveTitleBtnBg", clr.name());
+
+ kglobals.setGroup("KDE");
+ settings.writeEntry("/qt/KDE/contrast", kglobals.readNumEntry("contrast", 7));
+}
+
+// -----------------------------------------------------------------------------
+
+static void applyQtSettings( KConfig& kglobals, QSettings& settings )
+{
+ /* export kde's plugin library path to qtrc */
+
+ QMap <QString, bool> pathDb;
+ // OK, this isn't fun at all.
+ // KApp adds paths ending with /, QApp those without slash, and if
+ // one gives it something that is other way around, it will complain and scare
+ // users. So we need to know whether a path being added is from KApp, and in this case
+ // end it with.. So keep a QMap to bool, specifying whether the path is KDE-specified..
+
+ QString qversion = qVersion();
+ if ( qversion.contains( '.' ) > 1 )
+ qversion.truncate( qversion.findRev( '.' ) );
+ if ( qversion.contains( '-' ) )
+ qversion.truncate( qversion.findRev( '-' ) );
+
+ QStringList kdeAdded =
+ settings.readListEntry("/qt/KDE/kdeAddedLibraryPaths");
+ QString libPathKey =
+ QString("/qt/%1/libraryPath").arg( qversion );
+
+ //Read qt library path..
+ QStringList plugins = settings.readListEntry(libPathKey, ':');
+ for (QStringList::ConstIterator it = plugins.begin(); it != plugins.end(); ++it)
+ {
+ QString path = *it;
+ if (path.endsWith("/"))
+ path.truncate(path.length()-1);
+
+ pathDb[path]=false;
+ }
+
+ //Get rid of old KDE-added ones...
+ for (QStringList::ConstIterator it = kdeAdded.begin(); it != kdeAdded.end(); ++it)
+ {
+ //Normalize..
+ QString path = *it;
+ if (path.endsWith("/"))
+ path.truncate(path.length()-1);
+
+ //Remove..
+ pathDb.remove(path);
+ }
+
+ kdeAdded.clear();
+
+ //Merge in KDE ones..
+ plugins = KGlobal::dirs()->resourceDirs( "qtplugins" );
+
+ for (QStringList::ConstIterator it = plugins.begin(); it != plugins.end(); ++it)
+ {
+ QString path = *it;
+ if (path.endsWith("/"))
+ path.truncate(path.length()-1);
+
+ pathDb[path]=true;
+
+ if(path.contains("/lib64/"))
+ path.replace("/lib64/","/lib/");
+ pathDb[path]=true;
+ }
+
+ QStringList paths;
+ for (QMap <QString, bool>::ConstIterator it = pathDb.begin();
+ it != pathDb.end(); ++it)
+ {
+ QString path = it.key();
+ bool fromKDE = it.data();
+
+ char new_path[PATH_MAX+1];
+ if (realpath(QFile::encodeName(path), new_path))
+ path = QFile::decodeName(new_path);
+
+ if (fromKDE)
+ {
+ if (!path.endsWith("/"))
+ path += "/";
+ kdeAdded.push_back(path); //Add for the new list -- do it here to have it in the right form..
+ }
+
+ paths.append(path);
+ }
+
+ //Write the list out..
+ settings.writeEntry("/qt/KDE/kdeAddedLibraryPaths", kdeAdded);
+ settings.writeEntry(libPathKey, paths, ':');
+
+ /* export widget style */
+ kglobals.setGroup("General");
+ QString style = kglobals.readEntry("widgetStyle", KStyle::defaultStyle() );
+ if (!style.isEmpty())
+ settings.writeEntry("/qt/style", style);
+
+ /* export font settings */
+ settings.writeEntry("/qt/font", KGlobalSettings::generalFont().toString());
+
+ /* ##### looks like kcmfonts skips this, so we don't do this here */
+/*bool usexft = kglobals.readBoolEntry("AntiAliasing", false);
+ kconfig.setGroup("General");
+ settings.writeEntry("/qt/enableXft", usexft);
+ settings.writeEntry("/qt/useXft", usexft); */
+
+ /* export effects settings */
+ kglobals.setGroup("KDE");
+ bool effectsEnabled = kglobals.readBoolEntry("EffectsEnabled", false);
+ bool fadeMenus = kglobals.readBoolEntry("EffectFadeMenu", false);
+ bool fadeTooltips = kglobals.readBoolEntry("EffectFadeTooltip", false);
+ bool animateCombobox = kglobals.readBoolEntry("EffectAnimateCombo", false);
+
+ QStringList guieffects;
+ if (effectsEnabled) {
+ guieffects << QString("general");
+ if (fadeMenus)
+ guieffects << QString("fademenu");
+ if (animateCombobox)
+ guieffects << QString("animatecombo");
+ if (fadeTooltips)
+ guieffects << QString("fadetooltip");
+ }
+ else
+ guieffects << QString("none");
+
+ settings.writeEntry("/qt/GUIEffects", guieffects);
+}
+
+// -----------------------------------------------------------------------------
+
+static void addColorDef(QString& s, const char* n, const QColor& col)
+{
+ QString tmp;
+
+ tmp.sprintf("#define %s #%02x%02x%02x\n",
+ n, col.red(), col.green(), col.blue());
+
+ s += tmp;
+}
+
+
+// -----------------------------------------------------------------------------
+
+static void copyFile(QFile& tmp, QString const& filename, bool )
+{
+ QFile f( filename );
+ if ( f.open(IO_ReadOnly) ) {
+ QCString buf( 8192 );
+ while ( !f.atEnd() ) {
+ int read = f.readBlock( buf.data(), buf.size() );
+ if ( read > 0 )
+ tmp.writeBlock( buf.data(), read );
+ }
+ }
+}
+
+
+// -----------------------------------------------------------------------------
+
+static QString item( int i ) {
+ return QString::number( i / 255.0, 'f', 3 );
+}
+
+static QString color( const QColor& col )
+{
+ return QString( "{ %1, %2, %3 }" ).arg( item( col.red() ) ).arg( item( col.green() ) ).arg( item( col.blue() ) );
+}
+
+static void createGtkrc( bool exportColors, const QColorGroup& cg, int version )
+{
+ // lukas: why does it create in ~/.kde/share/config ???
+ // pfeiffer: so that we don't overwrite the user's gtkrc.
+ // it is found via the GTK_RC_FILES environment variable.
+ KSaveFile saveFile( locateLocal( "config", 2==version?"gtkrc-2.0":"gtkrc" ) );
+ if ( saveFile.status() != 0 || saveFile.textStream() == 0L )
+ return;
+
+ QTextStream& t = *saveFile.textStream();
+ t.setEncoding( QTextStream::Locale );
+
+ t << i18n(
+ "# created by KDE, %1\n"
+ "#\n"
+ "# If you do not want KDE to override your GTK settings, select\n"
+ "# Appearance & Themes -> Colors in the Control Center and disable the checkbox\n"
+ "# \"Apply colors to non-KDE applications\"\n"
+ "#\n"
+ "#\n").arg(QDateTime::currentDateTime().toString());
+
+ t << "style \"default\"" << endl;
+ t << "{" << endl;
+ if (exportColors)
+ {
+ t << " bg[NORMAL] = " << color( cg.background() ) << endl;
+ t << " bg[SELECTED] = " << color( cg.highlight() ) << endl;
+ t << " bg[INSENSITIVE] = " << color( cg.background() ) << endl;
+ t << " bg[ACTIVE] = " << color( cg.mid() ) << endl;
+ t << " bg[PRELIGHT] = " << color( cg.background() ) << endl;
+ t << endl;
+ t << " base[NORMAL] = " << color( cg.base() ) << endl;
+ t << " base[SELECTED] = " << color( cg.highlight() ) << endl;
+ t << " base[INSENSITIVE] = " << color( cg.background() ) << endl;
+ t << " base[ACTIVE] = " << color( cg.highlight() ) << endl;
+ t << " base[PRELIGHT] = " << color( cg.highlight() ) << endl;
+ t << endl;
+ t << " text[NORMAL] = " << color( cg.text() ) << endl;
+ t << " text[SELECTED] = " << color( cg.highlightedText() ) << endl;
+ t << " text[INSENSITIVE] = " << color( cg.mid() ) << endl;
+ t << " text[ACTIVE] = " << color( cg.highlightedText() ) << endl;
+ t << " text[PRELIGHT] = " << color( cg.highlightedText() ) << endl;
+ t << endl;
+ t << " fg[NORMAL] = " << color( cg.foreground() ) << endl;
+ t << " fg[SELECTED] = " << color( cg.highlightedText() ) << endl;
+ t << " fg[INSENSITIVE] = " << color( cg.mid() ) << endl;
+ t << " fg[ACTIVE] = " << color( cg.foreground() ) << endl;
+ t << " fg[PRELIGHT] = " << color( cg.foreground() ) << endl;
+ }
+
+ t << "}" << endl;
+ t << endl;
+ t << "class \"*\" style \"default\"" << endl;
+ t << endl;
+ if ( 2==version ) { // we should maybe check for MacOS settings here
+ t << "gtk-alternative-button-order = 1" << endl;
+ t << endl;
+ }
+
+ if (exportColors)
+ {
+ // tooltips don't have the standard background color
+ t << "style \"ToolTip\"" << endl;
+ t << "{" << endl;
+ QColorGroup group = QToolTip::palette().active();
+ t << " bg[NORMAL] = " << color( group.background() ) << endl;
+ t << " base[NORMAL] = " << color( group.base() ) << endl;
+ t << " text[NORMAL] = " << color( group.text() ) << endl;
+ t << " fg[NORMAL] = " << color( group.foreground() ) << endl;
+ t << "}" << endl;
+ t << endl;
+ t << "widget \"gtk-tooltip\" style \"ToolTip\"" << endl;
+ t << "widget \"gtk-tooltips\" style \"ToolTip\"" << endl;
+ t << endl;
+
+
+ // highlight the current (mouse-hovered) menu-item
+ // not every button, checkbox, etc.
+ t << "style \"MenuItem\"" << endl;
+ t << "{" << endl;
+ t << " bg[PRELIGHT] = " << color( cg.highlight() ) << endl;
+ t << " fg[PRELIGHT] = " << color( cg.highlightedText() ) << endl;
+ t << "}" << endl;
+ t << endl;
+ t << "class \"*MenuItem\" style \"MenuItem\"" << endl;
+ t << endl;
+ }
+}
+
+// -----------------------------------------------------------------------------
+
+void runRdb( uint flags )
+{
+ // Obtain the application palette that is about to be set.
+ QPalette newPal = KApplication::createApplicationPalette();
+ bool exportColors = flags & KRdbExportColors;
+ bool exportQtColors = flags & KRdbExportQtColors;
+ bool exportQtSettings = flags & KRdbExportQtSettings;
+ bool exportXftSettings = flags & KRdbExportXftSettings;
+
+ KConfig kglobals("kdeglobals", true, false);
+ kglobals.setGroup("KDE");
+
+ KTempFile tmpFile;
+
+ if (tmpFile.status() != 0)
+ {
+ kdDebug() << "Couldn't open temp file" << endl;
+ exit(0);
+ }
+
+ QFile &tmp = *(tmpFile.file());
+
+ // Export colors to non-(KDE/Qt) apps (e.g. Motif, GTK+ apps)
+ if (exportColors)
+ {
+ KGlobal::dirs()->addResourceType("appdefaults", KStandardDirs::kde_default("data") + "kdisplay/app-defaults/");
+ QColorGroup cg = newPal.active();
+ KGlobal::locale()->insertCatalogue("krdb");
+ createGtkrc( true, cg, 1 );
+ createGtkrc( true, cg, 2 );
+
+ QString preproc;
+ QColor backCol = cg.background();
+ addColorDef(preproc, "FOREGROUND" , cg.foreground());
+ addColorDef(preproc, "BACKGROUND" , backCol);
+ addColorDef(preproc, "HIGHLIGHT" , backCol.light(100+(2*KGlobalSettings::contrast()+4)*16/1));
+ addColorDef(preproc, "LOWLIGHT" , backCol.dark(100+(2*KGlobalSettings::contrast()+4)*10));
+ addColorDef(preproc, "SELECT_BACKGROUND" , cg.highlight());
+ addColorDef(preproc, "SELECT_FOREGROUND" , cg.highlightedText());
+ addColorDef(preproc, "WINDOW_BACKGROUND" , cg.base());
+ addColorDef(preproc, "WINDOW_FOREGROUND" , cg.foreground());
+ addColorDef(preproc, "INACTIVE_BACKGROUND", KGlobalSettings::inactiveTitleColor());
+ addColorDef(preproc, "INACTIVE_FOREGROUND", KGlobalSettings::inactiveTitleColor());
+ addColorDef(preproc, "ACTIVE_BACKGROUND" , KGlobalSettings::activeTitleColor());
+ addColorDef(preproc, "ACTIVE_FOREGROUND" , KGlobalSettings::activeTitleColor());
+ //---------------------------------------------------------------
+
+ tmp.writeBlock( preproc.latin1(), preproc.length() );
+
+ QStringList list;
+
+ QStringList adPaths = KGlobal::dirs()->findDirs("appdefaults", "");
+ for (QStringList::ConstIterator it = adPaths.begin(); it != adPaths.end(); ++it) {
+ QDir dSys( *it );
+
+ if ( dSys.exists() ) {
+ dSys.setFilter( QDir::Files );
+ dSys.setSorting( QDir::Name );
+ dSys.setNameFilter("*.ad");
+ list += dSys.entryList();
+ }
+ }
+
+ for (QStringList::ConstIterator it = list.begin(); it != list.end(); it++)
+ copyFile(tmp, locate("appdefaults", *it ), true);
+ }
+
+ // Merge ~/.Xresources or fallback to ~/.Xdefaults
+ QString homeDir = QDir::homeDirPath();
+ QString xResources = homeDir + "/.Xresources";
+
+ // very primitive support for ~/.Xresources by appending it
+ if ( QFile::exists( xResources ) )
+ copyFile(tmp, xResources, true);
+ else
+ copyFile(tmp, homeDir + "/.Xdefaults", true);
+
+ // Export the Xcursor theme & size settings
+ KConfig mousecfg( "kcminputrc" );
+ mousecfg.setGroup( "Mouse" );
+ QString theme = mousecfg.readEntry("cursorTheme", QString());
+ QString size = mousecfg.readEntry("cursorSize", QString());
+ QString contents;
+
+ if (!theme.isNull())
+ contents = "Xcursor.theme: " + theme + '\n';
+
+ if (!size.isNull())
+ contents += "Xcursor.size: " + size + '\n';
+
+ if (exportXftSettings)
+ {
+ kglobals.setGroup("General");
+
+ if (kglobals.hasKey("XftAntialias"))
+ {
+ contents += "Xft.antialias: ";
+ if(kglobals.readBoolEntry("XftAntialias", true))
+ contents += "1\n";
+ else
+ contents += "0\n";
+ }
+
+ if (kglobals.hasKey("XftHintStyle"))
+ {
+ QString hintStyle = kglobals.readEntry("XftHintStyle", "hintmedium");
+ contents += "Xft.hinting: ";
+ if(hintStyle.isEmpty())
+ contents += "-1\n";
+ else
+ {
+ if(hintStyle!="hintnone")
+ contents += "1\n";
+ else
+ contents += "0\n";
+ contents += "Xft.hintstyle: " + hintStyle + '\n';
+ }
+ }
+
+ if (kglobals.hasKey("XftSubPixel"))
+ {
+ QString subPixel = kglobals.readEntry("XftSubPixel");
+ if(!subPixel.isEmpty())
+ contents += "Xft.rgba: " + subPixel + '\n';
+ }
+
+ KConfig cfgfonts("kcmfonts", true);
+ cfgfonts.setGroup("General");
+ if( cfgfonts.readNumEntry( "forceFontDPI", 0 ) != 0 )
+ contents += "Xft.dpi: " + cfgfonts.readEntry( "forceFontDPI" ) + '\n';
+ }
+
+ if (contents.length() > 0)
+ tmp.writeBlock( contents.latin1(), contents.length() );
+
+ tmpFile.close();
+
+ KProcess proc;
+#ifndef NDEBUG
+ proc << "xrdb" << "-merge" << tmpFile.name();
+#else
+ proc << "xrdb" << "-quiet" << "-merge" << tmpFile.name();
+#endif
+ proc.start( KProcess::Block, KProcess::Stdin );
+
+ tmpFile.unlink();
+
+ applyGtkStyles(exportColors, 1);
+ applyGtkStyles(exportColors, 2);
+
+ /* Qt exports */
+ if ( exportQtColors || exportQtSettings )
+ {
+ QSettings* settings = new QSettings;
+
+ if ( exportQtColors )
+ applyQtColors( kglobals, *settings, newPal ); // For kcmcolors
+
+ if ( exportQtSettings )
+ applyQtSettings( kglobals, *settings ); // For kcmstyle
+
+ delete settings;
+ QApplication::flushX();
+
+ // We let KIPC take care of ourselves, as we are in a KDE app with
+ // QApp::setDesktopSettingsAware(false);
+ // Instead of calling QApp::x11_apply_settings() directly, we instead
+ // modify the timestamp which propagates the settings changes onto
+ // Qt-only apps without adversely affecting ourselves.
+
+ // Cheat and use the current timestamp, since we just saved to qtrc.
+ QDateTime settingsstamp = QDateTime::currentDateTime();
+
+ static Atom qt_settings_timestamp = 0;
+ if (!qt_settings_timestamp) {
+ QString atomname("_QT_SETTINGS_TIMESTAMP_");
+ atomname += XDisplayName( 0 ); // Use the $DISPLAY envvar.
+ qt_settings_timestamp = XInternAtom( qt_xdisplay(), atomname.latin1(), False);
+ }
+
+ QBuffer stamp;
+ QDataStream s(stamp.buffer(), IO_WriteOnly);
+ s << settingsstamp;
+ XChangeProperty( qt_xdisplay(), qt_xrootwin(), qt_settings_timestamp,
+ qt_settings_timestamp, 8, PropModeReplace,
+ (unsigned char*) stamp.buffer().data(),
+ stamp.buffer().size() );
+ QApplication::flushX();
+ }
+}
+
diff --git a/kcontrol/krdb/krdb.h b/kcontrol/krdb/krdb.h
new file mode 100644
index 000000000..a1780ce99
--- /dev/null
+++ b/kcontrol/krdb/krdb.h
@@ -0,0 +1,33 @@
+/*
+ This file is part of the KDE base distribution
+ Copyright (c) 2001 Waldo Bastian <bastian@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _KRDB_H_
+#define _KRDB_H_
+
+enum KRdbAction
+{
+ KRdbExportColors = 0x0001, // Export colors to non-(KDE/Qt) apps
+ KRdbExportQtColors = 0x0002, // Export KDE's colors to qtrc
+ KRdbExportQtSettings = 0x0004, // Export all possible qtrc settings, excluding colors
+ KRdbExportXftSettings = 0x0008 // Export KDE's Xft (anti-alias) settings
+};
+
+void runRdb( uint flags );
+
+#endif
diff --git a/kcontrol/krdb/pics/Makefile.am b/kcontrol/krdb/pics/Makefile.am
new file mode 100644
index 000000000..f8316f0fd
--- /dev/null
+++ b/kcontrol/krdb/pics/Makefile.am
@@ -0,0 +1,6 @@
+
+pics_DATA = logo.png mini-world.png
+picsdir = $(kde_datadir)/kcontrol/pics
+
+EXTRA_DIST = $(pics_DATA)
+
diff --git a/kcontrol/krdb/pics/lo-energy.png b/kcontrol/krdb/pics/lo-energy.png
new file mode 100644
index 000000000..c30be6021
--- /dev/null
+++ b/kcontrol/krdb/pics/lo-energy.png
Binary files differ
diff --git a/kcontrol/krdb/pics/logo.png b/kcontrol/krdb/pics/logo.png
new file mode 100644
index 000000000..126a0032a
--- /dev/null
+++ b/kcontrol/krdb/pics/logo.png
Binary files differ
diff --git a/kcontrol/krdb/pics/mini-world.png b/kcontrol/krdb/pics/mini-world.png
new file mode 100644
index 000000000..eae412a41
--- /dev/null
+++ b/kcontrol/krdb/pics/mini-world.png
Binary files differ
diff --git a/kcontrol/krdb/themes/HighContrastDark-big/HighContrastDark-big.preview.png b/kcontrol/krdb/themes/HighContrastDark-big/HighContrastDark-big.preview.png
new file mode 100644
index 000000000..89eacd8c1
--- /dev/null
+++ b/kcontrol/krdb/themes/HighContrastDark-big/HighContrastDark-big.preview.png
Binary files differ
diff --git a/kcontrol/krdb/themes/HighContrastDark-big/HighContrastDark-big.xml b/kcontrol/krdb/themes/HighContrastDark-big/HighContrastDark-big.xml
new file mode 100644
index 000000000..1c5b0a50b
--- /dev/null
+++ b/kcontrol/krdb/themes/HighContrastDark-big/HighContrastDark-big.xml
@@ -0,0 +1,158 @@
+<!DOCTYPE ktheme>
+<ktheme version="1" >
+ <general>
+ <author value="Gunnar Schmi Dt" />
+ <email value="gunnar@schmi-dt.de" />
+ <homepage value="http://www.schmi-dt.de/" />
+ <comment value="This high contrast desktop theme with large and light text on dark background is intended for low-vision users." />
+ <version value="1.0" />
+ </general>
+ <desktop number="0" common="1" >
+ <mode id="Flat" />
+ <color1 rgb="#000033" />
+ <color2 rgb="#000033" />
+ <blending mode="NoBlending" balance="-50" reverse="0" />
+ <pattern name="pavement" />
+ <wallpaper mode="NoWallpaper" url="" />
+ </desktop>
+ <screensaver name="" />
+ <icons name="mono" >
+ <Animated value="1" object="desktop" />
+ <DoublePixels value="0" object="desktop" />
+ <Size value="56" object="desktop" />
+ <ActiveColor rgb="#ffff66" object="desktop" />
+ <ActiveColor2 rgb="#000066" object="desktop" />
+ <ActiveEffect name="tomonochrome" object="desktop" />
+ <ActiveSemiTransparent value="0" object="desktop" />
+ <ActiveValue value="1" object="desktop" />
+ <DefaultColor rgb="#ffffff" object="desktop" />
+ <DefaultColor2 rgb="#000000" object="desktop" />
+ <DefaultEffect name="tomonochrome" object="desktop" />
+ <DefaultSemiTransparent value="0" object="desktop" />
+ <DefaultValue value="1" object="desktop" />
+ <DisabledColor rgb="#808080" object="desktop" />
+ <DisabledColor2 rgb="#333333" object="desktop" />
+ <DisabledEffect name="tomonochrome" object="desktop" />
+ <DisabledSemiTransparent value="0" object="desktop" />
+ <DisabledValue value="1" object="desktop" />
+ <Animated value="0" object="mainToolbar" />
+ <DoublePixels value="0" object="mainToolbar" />
+ <Size value="44" object="mainToolbar" />
+ <ActiveColor rgb="#ffff66" object="mainToolbar" />
+ <ActiveColor2 rgb="#000066" object="mainToolbar" />
+ <ActiveEffect name="tomonochrome" object="mainToolbar" />
+ <ActiveSemiTransparent value="0" object="mainToolbar" />
+ <ActiveValue value="1" object="mainToolbar" />
+ <DefaultColor rgb="#ffffff" object="mainToolbar" />
+ <DefaultColor2 rgb="#000000" object="mainToolbar" />
+ <DefaultEffect name="tomonochrome" object="mainToolbar" />
+ <DefaultSemiTransparent value="0" object="mainToolbar" />
+ <DefaultValue value="1" object="mainToolbar" />
+ <DisabledColor rgb="#808080" object="mainToolbar" />
+ <DisabledColor2 rgb="#333333" object="mainToolbar" />
+ <DisabledEffect name="tomonochrome" object="mainToolbar" />
+ <DisabledSemiTransparent value="0" object="mainToolbar" />
+ <DisabledValue value="1" object="mainToolbar" />
+ <Animated value="0" object="panel" />
+ <DoublePixels value="0" object="panel" />
+ <Size value="32" object="panel" />
+ <ActiveColor rgb="#ffff66" object="panel" />
+ <ActiveColor2 rgb="#000066" object="panel" />
+ <ActiveEffect name="tomonochrome" object="panel" />
+ <ActiveSemiTransparent value="0" object="panel" />
+ <ActiveValue value="1" object="panel" />
+ <DefaultColor rgb="#ffffff" object="panel" />
+ <DefaultColor2 rgb="#000000" object="panel" />
+ <DefaultEffect name="tomonochrome" object="panel" />
+ <DefaultSemiTransparent value="0" object="panel" />
+ <DefaultValue value="1" object="panel" />
+ <DisabledColor rgb="#808080" object="panel" />
+ <DisabledColor2 rgb="#333333" object="panel" />
+ <DisabledEffect name="tomonochrome" object="panel" />
+ <DisabledSemiTransparent value="0" object="panel" />
+ <DisabledValue value="1" object="panel" />
+ <Animated value="0" object="small" />
+ <DoublePixels value="1" object="small" />
+ <Size value="16" object="small" />
+ <ActiveColor rgb="#ffff66" object="small" />
+ <ActiveColor2 rgb="#000066" object="small" />
+ <ActiveEffect name="tomonochrome" object="small" />
+ <ActiveSemiTransparent value="0" object="small" />
+ <ActiveValue value="1" object="small" />
+ <DefaultColor rgb="#ffffff" object="small" />
+ <DefaultColor2 rgb="#000000" object="small" />
+ <DefaultEffect name="tomonochrome" object="small" />
+ <DefaultSemiTransparent value="0" object="small" />
+ <DefaultValue value="1" object="small" />
+ <DisabledColor rgb="#808080" object="small" />
+ <DisabledColor2 rgb="#333333" object="small" />
+ <DisabledEffect name="tomonochrome" object="small" />
+ <DisabledSemiTransparent value="0" object="small" />
+ <DisabledValue value="1" object="small" />
+ <Animated value="0" object="toolbar" />
+ <DoublePixels value="0" object="toolbar" />
+ <Size value="44" object="toolbar" />
+ <ActiveColor rgb="#ffff66" object="toolbar" />
+ <ActiveColor2 rgb="#000066" object="toolbar" />
+ <ActiveEffect name="tomonochrome" object="toolbar" />
+ <ActiveSemiTransparent value="0" object="toolbar" />
+ <ActiveValue value="1" object="toolbar" />
+ <DefaultColor rgb="#ffffff" object="toolbar" />
+ <DefaultColor2 rgb="#000000" object="toolbar" />
+ <DefaultEffect name="tomonochrome" object="toolbar" />
+ <DefaultSemiTransparent value="0" object="toolbar" />
+ <DefaultValue value="1" object="toolbar" />
+ <DisabledColor rgb="#808080" object="toolbar" />
+ <DisabledColor2 rgb="#333333" object="toolbar" />
+ <DisabledEffect name="tomonochrome" object="toolbar" />
+ <DisabledSemiTransparent value="0" object="toolbar" />
+ <DisabledValue value="1" object="toolbar" />
+ </icons>
+ <sounds/>
+ <colors contrast="7" >
+ <background rgb="#000000" object="global" />
+ <selectBackground rgb="#00005a" object="global" />
+ <foreground rgb="#ffffff" object="global" />
+ <windowForeground rgb="#ffffff" object="global" />
+ <windowBackground rgb="#000000" object="global" />
+ <selectForeground rgb="#ffffff" object="global" />
+ <buttonBackground rgb="#000000" object="global" />
+ <buttonForeground rgb="#ffffff" object="global" />
+ <linkColor rgb="#ffffff" object="global" />
+ <visitedLinkColor rgb="#ffffff" object="global" />
+ <alternateBackground rgb="#000028" object="global" />
+ <activeForeground rgb="#ffffff" object="kwin" />
+ <inactiveBackground rgb="#1e1e1e" object="kwin" />
+ <inactiveBlend rgb="#1e1e1e" object="kwin" />
+ <activeBackground rgb="#00005a" object="kwin" />
+ <activeBlend rgb="#00005a" object="kwin" />
+ <inactiveForeground rgb="#808080" object="kwin" />
+ <activeTitleBtnBg rgb="#ffffff" object="kwin" />
+ <inactiveTitleBtnBg rgb="#aaaaaa" object="kwin" />
+ <frame rgb="#000085" object="kwin" />
+ <inactiveFrame rgb="#1e1e1e" object="kwin" />
+ <handle rgb="#000085" object="kwin" />
+ <inactiveHandle rgb="#1e1e1e" object="kwin" />
+ </colors>
+ <cursors name="" />
+ <wm type="builtin" name="kwin3_plastik" >
+ <border size="3" />
+ </wm>
+ <konqueror>
+ <wallpaper url="" />
+ <bgcolor rgb="#000000" />
+ </konqueror>
+ <panel>
+ <transparent value="0" />
+ </panel>
+ <widgets name="highcontrast" />
+ <fonts>
+ <font value="Arial,24,-1,5,50,0,0,0,0,0" object="General" />
+ <fixed value="Courier New,20,-1,5,50,0,0,0,0,0" object="General" />
+ <toolBarFont value="Arial,24,-1,5,50,0,0,0,0,0" object="General" />
+ <menuFont value="Arial,24,-1,5,50,0,0,0,0,0" object="General" />
+ <activeFont value="Arial,24,-1,5,75,0,0,0,0,0" object="WM" />
+ <taskbarFont value="Arial,22,-1,5,50,0,0,0,0,0" object="General" />
+ <StandardFont value="helvetica,24,-1,5,50,0,0,0,0,0" object="FMSettings" />
+ </fonts>
+</ktheme>
diff --git a/kcontrol/krdb/themes/HighContrastDark-big/Makefile.am b/kcontrol/krdb/themes/HighContrastDark-big/Makefile.am
new file mode 100644
index 000000000..736f811a6
--- /dev/null
+++ b/kcontrol/krdb/themes/HighContrastDark-big/Makefile.am
@@ -0,0 +1,6 @@
+
+kthememanager_theme_data_DATA = HighContrastDark-big.preview.png HighContrastDark-big.xml
+
+kthememanager_theme_datadir = $(kde_datadir)/kthememanager/themes/HighContrastDark-big
+
+EXTRA_DIST = $(kthememanager_theme_data_DATA)
diff --git a/kcontrol/krdb/themes/HighContrastDark/HighContrastDark.preview.png b/kcontrol/krdb/themes/HighContrastDark/HighContrastDark.preview.png
new file mode 100644
index 000000000..0e58ca152
--- /dev/null
+++ b/kcontrol/krdb/themes/HighContrastDark/HighContrastDark.preview.png
Binary files differ
diff --git a/kcontrol/krdb/themes/HighContrastDark/HighContrastDark.xml b/kcontrol/krdb/themes/HighContrastDark/HighContrastDark.xml
new file mode 100644
index 000000000..0dde3eb7b
--- /dev/null
+++ b/kcontrol/krdb/themes/HighContrastDark/HighContrastDark.xml
@@ -0,0 +1,158 @@
+<!DOCTYPE ktheme>
+<ktheme version="1" >
+ <general>
+ <author value="Gunnar Schmi Dt" />
+ <email value="gunnar@schmi-dt.de" />
+ <homepage value="http://www.schmi-dt.de/" />
+ <comment value="This high contrast desktop theme with light text on dark background is intended for low-vision users." />
+ <version value="1.0" />
+ </general>
+ <desktop number="0" common="1" >
+ <mode id="Flat" />
+ <color1 rgb="#000033" />
+ <color2 rgb="#000033" />
+ <blending mode="NoBlending" balance="-50" reverse="0" />
+ <pattern name="pavement" />
+ <wallpaper mode="NoWallpaper" url="" />
+ </desktop>
+ <screensaver name="" />
+ <icons name="mono" >
+ <Animated value="1" object="desktop" />
+ <DoublePixels value="0" object="desktop" />
+ <Size value="32" object="desktop" />
+ <ActiveColor rgb="#ffff66" object="desktop" />
+ <ActiveColor2 rgb="#000066" object="desktop" />
+ <ActiveEffect name="tomonochrome" object="desktop" />
+ <ActiveSemiTransparent value="0" object="desktop" />
+ <ActiveValue value="1" object="desktop" />
+ <DefaultColor rgb="#ffffff" object="desktop" />
+ <DefaultColor2 rgb="#000000" object="desktop" />
+ <DefaultEffect name="tomonochrome" object="desktop" />
+ <DefaultSemiTransparent value="0" object="desktop" />
+ <DefaultValue value="1" object="desktop" />
+ <DisabledColor rgb="#808080" object="desktop" />
+ <DisabledColor2 rgb="#333333" object="desktop" />
+ <DisabledEffect name="tomonochrome" object="desktop" />
+ <DisabledSemiTransparent value="0" object="desktop" />
+ <DisabledValue value="1" object="desktop" />
+ <Animated value="0" object="mainToolbar" />
+ <DoublePixels value="0" object="mainToolbar" />
+ <Size value="22" object="mainToolbar" />
+ <ActiveColor rgb="#ffff66" object="mainToolbar" />
+ <ActiveColor2 rgb="#000066" object="mainToolbar" />
+ <ActiveEffect name="tomonochrome" object="mainToolbar" />
+ <ActiveSemiTransparent value="0" object="mainToolbar" />
+ <ActiveValue value="1" object="mainToolbar" />
+ <DefaultColor rgb="#ffffff" object="mainToolbar" />
+ <DefaultColor2 rgb="#000000" object="mainToolbar" />
+ <DefaultEffect name="tomonochrome" object="mainToolbar" />
+ <DefaultSemiTransparent value="0" object="mainToolbar" />
+ <DefaultValue value="1" object="mainToolbar" />
+ <DisabledColor rgb="#808080" object="mainToolbar" />
+ <DisabledColor2 rgb="#333333" object="mainToolbar" />
+ <DisabledEffect name="tomonochrome" object="mainToolbar" />
+ <DisabledSemiTransparent value="0" object="mainToolbar" />
+ <DisabledValue value="1" object="mainToolbar" />
+ <Animated value="0" object="panel" />
+ <DoublePixels value="0" object="panel" />
+ <Size value="32" object="panel" />
+ <ActiveColor rgb="#ffff66" object="panel" />
+ <ActiveColor2 rgb="#000066" object="panel" />
+ <ActiveEffect name="tomonochrome" object="panel" />
+ <ActiveSemiTransparent value="0" object="panel" />
+ <ActiveValue value="1" object="panel" />
+ <DefaultColor rgb="#ffffff" object="panel" />
+ <DefaultColor2 rgb="#000000" object="panel" />
+ <DefaultEffect name="tomonochrome" object="panel" />
+ <DefaultSemiTransparent value="0" object="panel" />
+ <DefaultValue value="1" object="panel" />
+ <DisabledColor rgb="#808080" object="panel" />
+ <DisabledColor2 rgb="#333333" object="panel" />
+ <DisabledEffect name="tomonochrome" object="panel" />
+ <DisabledSemiTransparent value="0" object="panel" />
+ <DisabledValue value="1" object="panel" />
+ <Animated value="0" object="small" />
+ <DoublePixels value="0" object="small" />
+ <Size value="16" object="small" />
+ <ActiveColor rgb="#ffff66" object="small" />
+ <ActiveColor2 rgb="#000066" object="small" />
+ <ActiveEffect name="tomonochrome" object="small" />
+ <ActiveSemiTransparent value="0" object="small" />
+ <ActiveValue value="1" object="small" />
+ <DefaultColor rgb="#ffffff" object="small" />
+ <DefaultColor2 rgb="#000000" object="small" />
+ <DefaultEffect name="tomonochrome" object="small" />
+ <DefaultSemiTransparent value="0" object="small" />
+ <DefaultValue value="1" object="small" />
+ <DisabledColor rgb="#808080" object="small" />
+ <DisabledColor2 rgb="#333333" object="small" />
+ <DisabledEffect name="tomonochrome" object="small" />
+ <DisabledSemiTransparent value="0" object="small" />
+ <DisabledValue value="1" object="small" />
+ <Animated value="0" object="toolbar" />
+ <DoublePixels value="0" object="toolbar" />
+ <Size value="22" object="toolbar" />
+ <ActiveColor rgb="#ffff66" object="toolbar" />
+ <ActiveColor2 rgb="#000066" object="toolbar" />
+ <ActiveEffect name="tomonochrome" object="toolbar" />
+ <ActiveSemiTransparent value="0" object="toolbar" />
+ <ActiveValue value="1" object="toolbar" />
+ <DefaultColor rgb="#ffffff" object="toolbar" />
+ <DefaultColor2 rgb="#000000" object="toolbar" />
+ <DefaultEffect name="tomonochrome" object="toolbar" />
+ <DefaultSemiTransparent value="0" object="toolbar" />
+ <DefaultValue value="1" object="toolbar" />
+ <DisabledColor rgb="#808080" object="toolbar" />
+ <DisabledColor2 rgb="#333333" object="toolbar" />
+ <DisabledEffect name="tomonochrome" object="toolbar" />
+ <DisabledSemiTransparent value="0" object="toolbar" />
+ <DisabledValue value="1" object="toolbar" />
+ </icons>
+ <sounds/>
+ <colors contrast="7" >
+ <background rgb="#000000" object="global" />
+ <selectBackground rgb="#00005a" object="global" />
+ <foreground rgb="#ffffff" object="global" />
+ <windowForeground rgb="#ffffff" object="global" />
+ <windowBackground rgb="#000000" object="global" />
+ <selectForeground rgb="#ffffff" object="global" />
+ <buttonBackground rgb="#000000" object="global" />
+ <buttonForeground rgb="#ffffff" object="global" />
+ <linkColor rgb="#ffffff" object="global" />
+ <visitedLinkColor rgb="#ffffff" object="global" />
+ <alternateBackground rgb="#000028" object="global" />
+ <activeForeground rgb="#ffffff" object="kwin" />
+ <inactiveBackground rgb="#1e1e1e" object="kwin" />
+ <inactiveBlend rgb="#1e1e1e" object="kwin" />
+ <activeBackground rgb="#00005a" object="kwin" />
+ <activeBlend rgb="#00005a" object="kwin" />
+ <inactiveForeground rgb="#808080" object="kwin" />
+ <activeTitleBtnBg rgb="#ffffff" object="kwin" />
+ <inactiveTitleBtnBg rgb="#aaaaaa" object="kwin" />
+ <frame rgb="#000085" object="kwin" />
+ <inactiveFrame rgb="#1e1e1e" object="kwin" />
+ <handle rgb="#000085" object="kwin" />
+ <inactiveHandle rgb="#1e1e1e" object="kwin" />
+ </colors>
+ <cursors name="" />
+ <wm type="builtin" name="kwin3_plastik" >
+ <border size="3" />
+ </wm>
+ <konqueror>
+ <wallpaper url="" />
+ <bgcolor rgb="#000000" />
+ </konqueror>
+ <panel>
+ <transparent value="0" />
+ </panel>
+ <widgets name="highcontrast" />
+ <fonts>
+ <font value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <fixed value="Courier New,10,-1,5,50,0,0,0,0,0" object="General" />
+ <toolBarFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <menuFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <activeFont value="Arial,12,-1,5,75,0,0,0,0,0" object="WM" />
+ <taskbarFont value="Arial,11,-1,5,50,0,0,0,0,0" object="General" />
+ <StandardFont value="" object="FMSettings" />
+ </fonts>
+</ktheme>
diff --git a/kcontrol/krdb/themes/HighContrastDark/Makefile.am b/kcontrol/krdb/themes/HighContrastDark/Makefile.am
new file mode 100644
index 000000000..8a428795d
--- /dev/null
+++ b/kcontrol/krdb/themes/HighContrastDark/Makefile.am
@@ -0,0 +1,6 @@
+
+kthememanager_theme_data_DATA = HighContrastDark.preview.png HighContrastDark.xml
+
+kthememanager_theme_datadir = $(kde_datadir)/kthememanager/themes/HighContrastDark
+
+EXTRA_DIST = $(kthememanager_theme_data_DATA)
diff --git a/kcontrol/krdb/themes/HighContrastLight-big/HighContrastLight-big.preview.png b/kcontrol/krdb/themes/HighContrastLight-big/HighContrastLight-big.preview.png
new file mode 100644
index 000000000..fe1d62a26
--- /dev/null
+++ b/kcontrol/krdb/themes/HighContrastLight-big/HighContrastLight-big.preview.png
Binary files differ
diff --git a/kcontrol/krdb/themes/HighContrastLight-big/HighContrastLight-big.xml b/kcontrol/krdb/themes/HighContrastLight-big/HighContrastLight-big.xml
new file mode 100644
index 000000000..6f9b75099
--- /dev/null
+++ b/kcontrol/krdb/themes/HighContrastLight-big/HighContrastLight-big.xml
@@ -0,0 +1,158 @@
+<!DOCTYPE ktheme>
+<ktheme version="1" >
+ <general>
+ <author value="Gunnar Schmi Dt" />
+ <email value="gunnar@schmi-dt.de" />
+ <homepage value="http://www.schmi-dt.de/" />
+ <comment value="This high contrast desktop theme with large and dark text on light background is intended for low-vision users." />
+ <version value="1.0" />
+ </general>
+ <desktop number="0" common="1" >
+ <mode id="Flat" />
+ <color1 rgb="#ffffcc" />
+ <color2 rgb="#ffffcc" />
+ <blending mode="FlatBlending" balance="-50" reverse="0" />
+ <pattern name="" />
+ <wallpaper mode="NoWallpaper" url="" />
+ </desktop>
+ <screensaver name="" />
+ <icons name="mono" >
+ <Animated value="1" object="desktop" />
+ <DoublePixels value="0" object="desktop" />
+ <Size value="56" object="desktop" />
+ <ActiveColor rgb="#000066" object="desktop" />
+ <ActiveColor2 rgb="#ffff66" object="desktop" />
+ <ActiveEffect name="tomonochrome" object="desktop" />
+ <ActiveSemiTransparent value="0" object="desktop" />
+ <ActiveValue value="1" object="desktop" />
+ <DefaultColor rgb="#000000" object="desktop" />
+ <DefaultColor2 rgb="#ffffff" object="desktop" />
+ <DefaultEffect name="tomonochrome" object="desktop" />
+ <DefaultSemiTransparent value="0" object="desktop" />
+ <DefaultValue value="1" object="desktop" />
+ <DisabledColor rgb="#808080" object="desktop" />
+ <DisabledColor2 rgb="#cccccc" object="desktop" />
+ <DisabledEffect name="tomonochrome" object="desktop" />
+ <DisabledSemiTransparent value="0" object="desktop" />
+ <DisabledValue value="1" object="desktop" />
+ <Animated value="0" object="mainToolbar" />
+ <DoublePixels value="0" object="mainToolbar" />
+ <Size value="44" object="mainToolbar" />
+ <ActiveColor rgb="#000066" object="mainToolbar" />
+ <ActiveColor2 rgb="#ffff66" object="mainToolbar" />
+ <ActiveEffect name="tomonochrome" object="mainToolbar" />
+ <ActiveSemiTransparent value="0" object="mainToolbar" />
+ <ActiveValue value="1" object="mainToolbar" />
+ <DefaultColor rgb="#000000" object="mainToolbar" />
+ <DefaultColor2 rgb="#ffffff" object="mainToolbar" />
+ <DefaultEffect name="tomonochrome" object="mainToolbar" />
+ <DefaultSemiTransparent value="0" object="mainToolbar" />
+ <DefaultValue value="1" object="mainToolbar" />
+ <DisabledColor rgb="#808080" object="mainToolbar" />
+ <DisabledColor2 rgb="#cccccc" object="mainToolbar" />
+ <DisabledEffect name="tomonochrome" object="mainToolbar" />
+ <DisabledSemiTransparent value="0" object="mainToolbar" />
+ <DisabledValue value="1" object="mainToolbar" />
+ <Animated value="0" object="panel" />
+ <DoublePixels value="0" object="panel" />
+ <Size value="32" object="panel" />
+ <ActiveColor rgb="#000066" object="panel" />
+ <ActiveColor2 rgb="#ffff66" object="panel" />
+ <ActiveEffect name="tomonochrome" object="panel" />
+ <ActiveSemiTransparent value="0" object="panel" />
+ <ActiveValue value="1" object="panel" />
+ <DefaultColor rgb="#000000" object="panel" />
+ <DefaultColor2 rgb="#ffffff" object="panel" />
+ <DefaultEffect name="tomonochrome" object="panel" />
+ <DefaultSemiTransparent value="0" object="panel" />
+ <DefaultValue value="1" object="panel" />
+ <DisabledColor rgb="#808080" object="panel" />
+ <DisabledColor2 rgb="#cccccc" object="panel" />
+ <DisabledEffect name="tomonochrome" object="panel" />
+ <DisabledSemiTransparent value="0" object="panel" />
+ <DisabledValue value="1" object="panel" />
+ <Animated value="0" object="small" />
+ <DoublePixels value="1" object="small" />
+ <Size value="16" object="small" />
+ <ActiveColor rgb="#000066" object="small" />
+ <ActiveColor2 rgb="#ffff66" object="small" />
+ <ActiveEffect name="tomonochrome" object="small" />
+ <ActiveSemiTransparent value="0" object="small" />
+ <ActiveValue value="1" object="small" />
+ <DefaultColor rgb="#000000" object="small" />
+ <DefaultColor2 rgb="#ffffff" object="small" />
+ <DefaultEffect name="tomonochrome" object="small" />
+ <DefaultSemiTransparent value="0" object="small" />
+ <DefaultValue value="1" object="small" />
+ <DisabledColor rgb="#808080" object="small" />
+ <DisabledColor2 rgb="#cccccc" object="small" />
+ <DisabledEffect name="tomonochrome" object="small" />
+ <DisabledSemiTransparent value="0" object="small" />
+ <DisabledValue value="1" object="small" />
+ <Animated value="0" object="toolbar" />
+ <DoublePixels value="0" object="toolbar" />
+ <Size value="44" object="toolbar" />
+ <ActiveColor rgb="#000066" object="toolbar" />
+ <ActiveColor2 rgb="#ffff66" object="toolbar" />
+ <ActiveEffect name="tomonochrome" object="toolbar" />
+ <ActiveSemiTransparent value="0" object="toolbar" />
+ <ActiveValue value="1" object="toolbar" />
+ <DefaultColor rgb="#000000" object="toolbar" />
+ <DefaultColor2 rgb="#ffffff" object="toolbar" />
+ <DefaultEffect name="tomonochrome" object="toolbar" />
+ <DefaultSemiTransparent value="0" object="toolbar" />
+ <DefaultValue value="1" object="toolbar" />
+ <DisabledColor rgb="#808080" object="toolbar" />
+ <DisabledColor2 rgb="#cccccc" object="toolbar" />
+ <DisabledEffect name="tomonochrome" object="toolbar" />
+ <DisabledSemiTransparent value="0" object="toolbar" />
+ <DisabledValue value="1" object="toolbar" />
+ </icons>
+ <sounds/>
+ <colors contrast="7" >
+ <background rgb="#ffffff" object="global" />
+ <selectBackground rgb="#a5a5ff" object="global" />
+ <foreground rgb="#000000" object="global" />
+ <windowForeground rgb="#000000" object="global" />
+ <windowBackground rgb="#ffffff" object="global" />
+ <selectForeground rgb="#000000" object="global" />
+ <buttonBackground rgb="#ffffff" object="global" />
+ <buttonForeground rgb="#000000" object="global" />
+ <linkColor rgb="#000000" object="global" />
+ <visitedLinkColor rgb="#000000" object="global" />
+ <alternateBackground rgb="#d7d7ff" object="global" />
+ <activeForeground rgb="#000000" object="kwin" />
+ <inactiveBackground rgb="#e1e1e1" object="kwin" />
+ <inactiveBlend rgb="#e1e1e1" object="kwin" />
+ <activeBackground rgb="#a5a5ff" object="kwin" />
+ <activeBlend rgb="#a5a5ff" object="kwin" />
+ <inactiveForeground rgb="#808080" object="kwin" />
+ <activeTitleBtnBg rgb="#000000" object="kwin" />
+ <inactiveTitleBtnBg rgb="#555555" object="kwin" />
+ <frame rgb="#7a7aff" object="kwin" />
+ <inactiveFrame rgb="#e1e1e1" object="kwin" />
+ <handle rgb="#7a7aff" object="kwin" />
+ <inactiveHandle rgb="#e1e1e1" object="kwin" />
+ </colors>
+ <cursors name="" />
+ <wm type="builtin" name="kwin3_plastik" >
+ <border size="3" />
+ </wm>
+ <konqueror>
+ <wallpaper url="" />
+ <bgcolor rgb="#ffffff" />
+ </konqueror>
+ <panel>
+ <transparent value="0" />
+ </panel>
+ <widgets name="highcontrast" />
+ <fonts>
+ <font value="Arial,24,-1,5,50,0,0,0,0,0" object="General" />
+ <fixed value="Courier New,20,-1,5,50,0,0,0,0,0" object="General" />
+ <toolBarFont value="Arial,24,-1,5,50,0,0,0,0,0" object="General" />
+ <menuFont value="Arial,24,-1,5,50,0,0,0,0,0" object="General" />
+ <activeFont value="Arial,24,-1,5,75,0,0,0,0,0" object="WM" />
+ <taskbarFont value="Arial,22,-1,5,50,0,0,0,0,0" object="General" />
+ <StandardFont value="helvetica,24,-1,5,50,0,0,0,0,0" object="FMSettings" />
+ </fonts>
+</ktheme>
diff --git a/kcontrol/krdb/themes/HighContrastLight-big/Makefile.am b/kcontrol/krdb/themes/HighContrastLight-big/Makefile.am
new file mode 100644
index 000000000..0027c65e5
--- /dev/null
+++ b/kcontrol/krdb/themes/HighContrastLight-big/Makefile.am
@@ -0,0 +1,6 @@
+
+kthememanager_theme_data_DATA = HighContrastLight-big.preview.png HighContrastLight-big.xml
+
+kthememanager_theme_datadir = $(kde_datadir)/kthememanager/themes/HighContrastLight-big
+
+EXTRA_DIST = $(kthememanager_theme_data_DATA)
diff --git a/kcontrol/krdb/themes/HighContrastLight/HighContrastLight.preview.png b/kcontrol/krdb/themes/HighContrastLight/HighContrastLight.preview.png
new file mode 100644
index 000000000..4d0cae329
--- /dev/null
+++ b/kcontrol/krdb/themes/HighContrastLight/HighContrastLight.preview.png
Binary files differ
diff --git a/kcontrol/krdb/themes/HighContrastLight/HighContrastLight.xml b/kcontrol/krdb/themes/HighContrastLight/HighContrastLight.xml
new file mode 100644
index 000000000..01b3001d9
--- /dev/null
+++ b/kcontrol/krdb/themes/HighContrastLight/HighContrastLight.xml
@@ -0,0 +1,158 @@
+<!DOCTYPE ktheme>
+<ktheme version="1" >
+ <general>
+ <author value="Gunnar Schmi Dt" />
+ <email value="gunnar@schmi-dt.de" />
+ <homepage value="http://www.schmi-dt.de/" />
+ <comment value="This high contrast desktop theme with dark text on light background is intended for low-vision users." />
+ <version value="1.0" />
+ </general>
+ <desktop number="0" common="1" >
+ <mode id="Flat" />
+ <color1 rgb="#ffffcc" />
+ <color2 rgb="#ffffcc" />
+ <blending mode="FlatBlending" balance="-50" reverse="0" />
+ <pattern name="" />
+ <wallpaper mode="NoWallpaper" url="" />
+ </desktop>
+ <screensaver name="" />
+ <icons name="mono" >
+ <Animated value="1" object="desktop" />
+ <DoublePixels value="0" object="desktop" />
+ <Size value="32" object="desktop" />
+ <ActiveColor rgb="#000066" object="desktop" />
+ <ActiveColor2 rgb="#ffff66" object="desktop" />
+ <ActiveEffect name="tomonochrome" object="desktop" />
+ <ActiveSemiTransparent value="0" object="desktop" />
+ <ActiveValue value="1" object="desktop" />
+ <DefaultColor rgb="#000000" object="desktop" />
+ <DefaultColor2 rgb="#ffffff" object="desktop" />
+ <DefaultEffect name="tomonochrome" object="desktop" />
+ <DefaultSemiTransparent value="0" object="desktop" />
+ <DefaultValue value="1" object="desktop" />
+ <DisabledColor rgb="#808080" object="desktop" />
+ <DisabledColor2 rgb="#cccccc" object="desktop" />
+ <DisabledEffect name="tomonochrome" object="desktop" />
+ <DisabledSemiTransparent value="0" object="desktop" />
+ <DisabledValue value="1" object="desktop" />
+ <Animated value="0" object="mainToolbar" />
+ <DoublePixels value="0" object="mainToolbar" />
+ <Size value="22" object="mainToolbar" />
+ <ActiveColor rgb="#000066" object="mainToolbar" />
+ <ActiveColor2 rgb="#ffff66" object="mainToolbar" />
+ <ActiveEffect name="tomonochrome" object="mainToolbar" />
+ <ActiveSemiTransparent value="0" object="mainToolbar" />
+ <ActiveValue value="1" object="mainToolbar" />
+ <DefaultColor rgb="#000000" object="mainToolbar" />
+ <DefaultColor2 rgb="#ffffff" object="mainToolbar" />
+ <DefaultEffect name="tomonochrome" object="mainToolbar" />
+ <DefaultSemiTransparent value="0" object="mainToolbar" />
+ <DefaultValue value="1" object="mainToolbar" />
+ <DisabledColor rgb="#808080" object="mainToolbar" />
+ <DisabledColor2 rgb="#cccccc" object="mainToolbar" />
+ <DisabledEffect name="tomonochrome" object="mainToolbar" />
+ <DisabledSemiTransparent value="0" object="mainToolbar" />
+ <DisabledValue value="1" object="mainToolbar" />
+ <Animated value="0" object="panel" />
+ <DoublePixels value="0" object="panel" />
+ <Size value="32" object="panel" />
+ <ActiveColor rgb="#000066" object="panel" />
+ <ActiveColor2 rgb="#ffff66" object="panel" />
+ <ActiveEffect name="tomonochrome" object="panel" />
+ <ActiveSemiTransparent value="0" object="panel" />
+ <ActiveValue value="1" object="panel" />
+ <DefaultColor rgb="#000000" object="panel" />
+ <DefaultColor2 rgb="#ffffff" object="panel" />
+ <DefaultEffect name="tomonochrome" object="panel" />
+ <DefaultSemiTransparent value="0" object="panel" />
+ <DefaultValue value="1" object="panel" />
+ <DisabledColor rgb="#808080" object="panel" />
+ <DisabledColor2 rgb="#cccccc" object="panel" />
+ <DisabledEffect name="tomonochrome" object="panel" />
+ <DisabledSemiTransparent value="0" object="panel" />
+ <DisabledValue value="1" object="panel" />
+ <Animated value="0" object="small" />
+ <DoublePixels value="0" object="small" />
+ <Size value="16" object="small" />
+ <ActiveColor rgb="#000066" object="small" />
+ <ActiveColor2 rgb="#ffff66" object="small" />
+ <ActiveEffect name="tomonochrome" object="small" />
+ <ActiveSemiTransparent value="0" object="small" />
+ <ActiveValue value="1" object="small" />
+ <DefaultColor rgb="#000000" object="small" />
+ <DefaultColor2 rgb="#ffffff" object="small" />
+ <DefaultEffect name="tomonochrome" object="small" />
+ <DefaultSemiTransparent value="0" object="small" />
+ <DefaultValue value="1" object="small" />
+ <DisabledColor rgb="#808080" object="small" />
+ <DisabledColor2 rgb="#cccccc" object="small" />
+ <DisabledEffect name="tomonochrome" object="small" />
+ <DisabledSemiTransparent value="0" object="small" />
+ <DisabledValue value="1" object="small" />
+ <Animated value="0" object="toolbar" />
+ <DoublePixels value="0" object="toolbar" />
+ <Size value="22" object="toolbar" />
+ <ActiveColor rgb="#000066" object="toolbar" />
+ <ActiveColor2 rgb="#ffff66" object="toolbar" />
+ <ActiveEffect name="tomonochrome" object="toolbar" />
+ <ActiveSemiTransparent value="0" object="toolbar" />
+ <ActiveValue value="1" object="toolbar" />
+ <DefaultColor rgb="#000000" object="toolbar" />
+ <DefaultColor2 rgb="#ffffff" object="toolbar" />
+ <DefaultEffect name="tomonochrome" object="toolbar" />
+ <DefaultSemiTransparent value="0" object="toolbar" />
+ <DefaultValue value="1" object="toolbar" />
+ <DisabledColor rgb="#808080" object="toolbar" />
+ <DisabledColor2 rgb="#cccccc" object="toolbar" />
+ <DisabledEffect name="tomonochrome" object="toolbar" />
+ <DisabledSemiTransparent value="0" object="toolbar" />
+ <DisabledValue value="1" object="toolbar" />
+ </icons>
+ <sounds/>
+ <colors contrast="7" >
+ <background rgb="#ffffff" object="global" />
+ <selectBackground rgb="#a5a5ff" object="global" />
+ <foreground rgb="#000000" object="global" />
+ <windowForeground rgb="#000000" object="global" />
+ <windowBackground rgb="#ffffff" object="global" />
+ <selectForeground rgb="#000000" object="global" />
+ <buttonBackground rgb="#ffffff" object="global" />
+ <buttonForeground rgb="#000000" object="global" />
+ <linkColor rgb="#000000" object="global" />
+ <visitedLinkColor rgb="#000000" object="global" />
+ <alternateBackground rgb="#d7d7ff" object="global" />
+ <activeForeground rgb="#000000" object="kwin" />
+ <inactiveBackground rgb="#e1e1e1" object="kwin" />
+ <inactiveBlend rgb="#e1e1e1" object="kwin" />
+ <activeBackground rgb="#a5a5ff" object="kwin" />
+ <activeBlend rgb="#a5a5ff" object="kwin" />
+ <inactiveForeground rgb="#808080" object="kwin" />
+ <activeTitleBtnBg rgb="#000000" object="kwin" />
+ <inactiveTitleBtnBg rgb="#555555" object="kwin" />
+ <frame rgb="#7a7aff" object="kwin" />
+ <inactiveFrame rgb="#e1e1e1" object="kwin" />
+ <handle rgb="#7a7aff" object="kwin" />
+ <inactiveHandle rgb="#e1e1e1" object="kwin" />
+ </colors>
+ <cursors name="" />
+ <wm type="builtin" name="kwin3_plastik" >
+ <border size="1" />
+ </wm>
+ <konqueror>
+ <wallpaper url="" />
+ <bgcolor rgb="#ffffff" />
+ </konqueror>
+ <panel>
+ <transparent value="0" />
+ </panel>
+ <widgets name="highcontrast" />
+ <fonts>
+ <font value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <fixed value="Courier New,10,-1,5,50,0,0,0,0,0" object="General" />
+ <toolBarFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <menuFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <activeFont value="Arial,12,-1,5,75,0,0,0,0,0" object="WM" />
+ <taskbarFont value="Arial,11,-1,5,50,0,0,0,0,0" object="General" />
+ <StandardFont value="" object="FMSettings" />
+ </fonts>
+</ktheme>
diff --git a/kcontrol/krdb/themes/HighContrastLight/Makefile.am b/kcontrol/krdb/themes/HighContrastLight/Makefile.am
new file mode 100644
index 000000000..9d752d530
--- /dev/null
+++ b/kcontrol/krdb/themes/HighContrastLight/Makefile.am
@@ -0,0 +1,6 @@
+
+kthememanager_theme_data_DATA = HighContrastLight.preview.png HighContrastLight.xml
+
+kthememanager_theme_datadir = $(kde_datadir)/kthememanager/themes/HighContrastLight
+
+EXTRA_DIST = $(kthememanager_theme_data_DATA)
diff --git a/kcontrol/krdb/themes/KDE_Classic/KDE_Classic.preview.png b/kcontrol/krdb/themes/KDE_Classic/KDE_Classic.preview.png
new file mode 100644
index 000000000..40b294fcb
--- /dev/null
+++ b/kcontrol/krdb/themes/KDE_Classic/KDE_Classic.preview.png
Binary files differ
diff --git a/kcontrol/krdb/themes/KDE_Classic/KDE_Classic.xml b/kcontrol/krdb/themes/KDE_Classic/KDE_Classic.xml
new file mode 100644
index 000000000..78d258374
--- /dev/null
+++ b/kcontrol/krdb/themes/KDE_Classic/KDE_Classic.xml
@@ -0,0 +1,124 @@
+<!DOCTYPE ktheme>
+<ktheme version="1" >
+ <general>
+ <author value="" />
+ <email value="" />
+ <homepage value="" />
+ <comment value="" />
+ <version value="" />
+ </general>
+ <desktop number="0" common="1" >
+ <mode id="VerticalGradient" />
+ <color1 rgb="#1e72a0" />
+ <color2 rgb="#c0c0c0" />
+ <blending mode="NoBlending" balance="100" reverse="0" />
+ <pattern name="" />
+ <wallpaper mode="Scaled" url="KDE34.png" />
+ </desktop>
+ <screensaver name="" />
+ <icons name="kdeclassic" >
+ <Animated value="1" object="desktop" />
+ <DoublePixels value="0" object="desktop" />
+ <Size value="32" object="desktop" />
+ <ActiveEffect name="togamma" object="desktop" />
+ <ActiveSemiTransparent value="0" object="desktop" />
+ <ActiveValue value="1" object="desktop" />
+ <DefaultEffect name="none" object="desktop" />
+ <DefaultSemiTransparent value="0" object="desktop" />
+ <DefaultValue value="1" object="desktop" />
+ <DisabledEffect name="togray" object="desktop" />
+ <DisabledSemiTransparent value="0" object="desktop" />
+ <DisabledValue value="1" object="desktop" />
+ <Animated value="0" object="mainToolbar" />
+ <DoublePixels value="0" object="mainToolbar" />
+ <Size value="22" object="mainToolbar" />
+ <ActiveEffect name="none" object="mainToolbar" />
+ <ActiveSemiTransparent value="0" object="mainToolbar" />
+ <ActiveValue value="1" object="mainToolbar" />
+ <DefaultEffect name="none" object="mainToolbar" />
+ <DefaultSemiTransparent value="0" object="mainToolbar" />
+ <DefaultValue value="1" object="mainToolbar" />
+ <DisabledEffect name="togray" object="mainToolbar" />
+ <DisabledSemiTransparent value="0" object="mainToolbar" />
+ <DisabledValue value="1" object="mainToolbar" />
+ <Animated value="0" object="panel" />
+ <DoublePixels value="0" object="panel" />
+ <Size value="32" object="panel" />
+ <ActiveEffect name="togamma" object="panel" />
+ <ActiveSemiTransparent value="0" object="panel" />
+ <ActiveValue value="1" object="panel" />
+ <DefaultEffect name="none" object="panel" />
+ <DefaultSemiTransparent value="0" object="panel" />
+ <DefaultValue value="1" object="panel" />
+ <DisabledEffect name="togray" object="panel" />
+ <DisabledSemiTransparent value="0" object="panel" />
+ <DisabledValue value="1" object="panel" />
+ <Animated value="0" object="small" />
+ <DoublePixels value="0" object="small" />
+ <Size value="16" object="small" />
+ <ActiveEffect name="none" object="small" />
+ <ActiveSemiTransparent value="0" object="small" />
+ <ActiveValue value="1" object="small" />
+ <DefaultEffect name="none" object="small" />
+ <DefaultSemiTransparent value="0" object="small" />
+ <DefaultValue value="1" object="small" />
+ <DisabledEffect name="togray" object="small" />
+ <DisabledSemiTransparent value="0" object="small" />
+ <DisabledValue value="1" object="small" />
+ <Animated value="0" object="toolbar" />
+ <DoublePixels value="0" object="toolbar" />
+ <Size value="22" object="toolbar" />
+ <ActiveEffect name="none" object="toolbar" />
+ <ActiveSemiTransparent value="0" object="toolbar" />
+ <ActiveValue value="1" object="toolbar" />
+ <DefaultEffect name="none" object="toolbar" />
+ <DefaultSemiTransparent value="0" object="toolbar" />
+ <DefaultValue value="1" object="toolbar" />
+ <DisabledEffect name="togray" object="toolbar" />
+ <DisabledSemiTransparent value="0" object="toolbar" />
+ <DisabledValue value="1" object="toolbar" />
+ </icons>
+ <sounds/>
+ <colors contrast="7" >
+ <background rgb="#dcdcdc" object="global" />
+ <selectBackground rgb="#0a5f89" object="global" />
+ <foreground rgb="#000000" object="global" />
+ <windowForeground rgb="#000000" object="global" />
+ <windowBackground rgb="#ffffff" object="global" />
+ <selectForeground rgb="#ffffff" object="global" />
+ <buttonBackground rgb="#e4e4e4" object="global" />
+ <buttonForeground rgb="#000000" object="global" />
+ <linkColor rgb="#0000c0" object="global" />
+ <visitedLinkColor rgb="#800080" object="global" />
+ <activeForeground rgb="#ffffff" object="kwin" />
+ <inactiveBackground rgb="#dcdcdc" object="kwin" />
+ <inactiveBlend rgb="#dcdcdc" object="kwin" />
+ <activeBackground rgb="#0a5f89" object="kwin" />
+ <activeBlend rgb="#0a5f89" object="kwin" />
+ <inactiveForeground rgb="#000000" object="kwin" />
+ <activeTitleBtnBg rgb="#c0c0c0" object="kwin" />
+ <inactiveTitleBtnBg rgb="#a7b5c7" object="kwin" />
+ </colors>
+ <cursors name="" />
+ <wm type="builtin" name="kwin3_default" >
+ <border size="1" />
+ </wm>
+ <konqueror>
+ <wallpaper url="kde4ever.png" />
+ <bgcolor rgb="#000000" />
+ </konqueror>
+ <panel>
+ <background colorize="0" url="" />
+ <transparent value="0" />
+ </panel>
+ <widgets name="HighColor" />
+ <fonts>
+ <font value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <fixed value="Courier New,10,-1,5,50,0,0,0,0,0" object="General" />
+ <toolBarFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <menuFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <activeFont value="Arial,12,-1,5,75,0,0,0,0,0" object="WM" />
+ <taskbarFont value="Arial,11,-1,5,50,0,0,0,0,0" object="General" />
+ <StandardFont value="" object="FMSettings" />
+ </fonts>
+</ktheme>
diff --git a/kcontrol/krdb/themes/KDE_Classic/Makefile.am b/kcontrol/krdb/themes/KDE_Classic/Makefile.am
new file mode 100644
index 000000000..66e8ac20a
--- /dev/null
+++ b/kcontrol/krdb/themes/KDE_Classic/Makefile.am
@@ -0,0 +1,6 @@
+
+kthememanager_theme_data_DATA = KDE_Classic.xml KDE_Classic.preview.png
+
+kthememanager_theme_datadir = $(kde_datadir)/kthememanager/themes/KDE_Classic
+
+EXTRA_DIST = $(kthememanager_theme_data_DATA)
diff --git a/kcontrol/krdb/themes/Keramik/Keramik.preview.png b/kcontrol/krdb/themes/Keramik/Keramik.preview.png
new file mode 100644
index 000000000..0f34a3c4e
--- /dev/null
+++ b/kcontrol/krdb/themes/Keramik/Keramik.preview.png
Binary files differ
diff --git a/kcontrol/krdb/themes/Keramik/Keramik.xml b/kcontrol/krdb/themes/Keramik/Keramik.xml
new file mode 100644
index 000000000..cd50d7b56
--- /dev/null
+++ b/kcontrol/krdb/themes/Keramik/Keramik.xml
@@ -0,0 +1,124 @@
+<!DOCTYPE ktheme>
+<ktheme version="1" >
+ <general>
+ <author value="" />
+ <email value="" />
+ <homepage value="" />
+ <comment value="" />
+ <version value="" />
+ </general>
+ <desktop number="0" common="1" >
+ <mode id="VerticalGradient" />
+ <color1 rgb="#1e72a0" />
+ <color2 rgb="#c0c0c0" />
+ <blending mode="NoBlending" balance="100" reverse="0" />
+ <pattern name="" />
+ <wallpaper mode="Scaled" url="KDE34.png" />
+ </desktop>
+ <screensaver name="" />
+ <icons name="crystalsvg" >
+ <Animated value="1" object="desktop" />
+ <DoublePixels value="0" object="desktop" />
+ <Size value="32" object="desktop" />
+ <ActiveEffect name="togamma" object="desktop" />
+ <ActiveSemiTransparent value="0" object="desktop" />
+ <ActiveValue value="1" object="desktop" />
+ <DefaultEffect name="none" object="desktop" />
+ <DefaultSemiTransparent value="0" object="desktop" />
+ <DefaultValue value="1" object="desktop" />
+ <DisabledEffect name="togray" object="desktop" />
+ <DisabledSemiTransparent value="0" object="desktop" />
+ <DisabledValue value="1" object="desktop" />
+ <Animated value="0" object="mainToolbar" />
+ <DoublePixels value="0" object="mainToolbar" />
+ <Size value="22" object="mainToolbar" />
+ <ActiveEffect name="none" object="mainToolbar" />
+ <ActiveSemiTransparent value="0" object="mainToolbar" />
+ <ActiveValue value="1" object="mainToolbar" />
+ <DefaultEffect name="none" object="mainToolbar" />
+ <DefaultSemiTransparent value="0" object="mainToolbar" />
+ <DefaultValue value="1" object="mainToolbar" />
+ <DisabledEffect name="togray" object="mainToolbar" />
+ <DisabledSemiTransparent value="0" object="mainToolbar" />
+ <DisabledValue value="1" object="mainToolbar" />
+ <Animated value="0" object="panel" />
+ <DoublePixels value="0" object="panel" />
+ <Size value="32" object="panel" />
+ <ActiveEffect name="togamma" object="panel" />
+ <ActiveSemiTransparent value="0" object="panel" />
+ <ActiveValue value="1" object="panel" />
+ <DefaultEffect name="none" object="panel" />
+ <DefaultSemiTransparent value="0" object="panel" />
+ <DefaultValue value="1" object="panel" />
+ <DisabledEffect name="togray" object="panel" />
+ <DisabledSemiTransparent value="0" object="panel" />
+ <DisabledValue value="1" object="panel" />
+ <Animated value="0" object="small" />
+ <DoublePixels value="0" object="small" />
+ <Size value="16" object="small" />
+ <ActiveEffect name="none" object="small" />
+ <ActiveSemiTransparent value="0" object="small" />
+ <ActiveValue value="1" object="small" />
+ <DefaultEffect name="none" object="small" />
+ <DefaultSemiTransparent value="0" object="small" />
+ <DefaultValue value="1" object="small" />
+ <DisabledEffect name="togray" object="small" />
+ <DisabledSemiTransparent value="0" object="small" />
+ <DisabledValue value="1" object="small" />
+ <Animated value="0" object="toolbar" />
+ <DoublePixels value="0" object="toolbar" />
+ <Size value="22" object="toolbar" />
+ <ActiveEffect name="none" object="toolbar" />
+ <ActiveSemiTransparent value="0" object="toolbar" />
+ <ActiveValue value="1" object="toolbar" />
+ <DefaultEffect name="none" object="toolbar" />
+ <DefaultSemiTransparent value="0" object="toolbar" />
+ <DefaultValue value="1" object="toolbar" />
+ <DisabledEffect name="togray" object="toolbar" />
+ <DisabledSemiTransparent value="0" object="toolbar" />
+ <DisabledValue value="1" object="toolbar" />
+ </icons>
+ <sounds/>
+ <colors contrast="7" >
+ <background rgb="#eae9e8" object="global" />
+ <selectBackground rgb="#a9d1ff" object="global" />
+ <foreground rgb="#000000" object="global" />
+ <windowForeground rgb="#000000" object="global" />
+ <windowBackground rgb="#ffffff" object="global" />
+ <selectForeground rgb="#030303" object="global" />
+ <buttonBackground rgb="#e6f0f9" object="global" />
+ <buttonForeground rgb="#000000" object="global" />
+ <linkColor rgb="#0000c0" object="global" />
+ <visitedLinkColor rgb="#800080" object="global" />
+ <activeForeground rgb="#ffffff" object="kwin" />
+ <inactiveBackground rgb="#afd6ff" object="kwin" />
+ <inactiveBlend rgb="#afd6ff" object="kwin" />
+ <activeBackground rgb="#3e91eb" object="kwin" />
+ <activeBlend rgb="#3e91eb" object="kwin" />
+ <inactiveForeground rgb="#ffffff" object="kwin" />
+ <activeTitleBtnBg rgb="#dcdcdc" object="kwin" />
+ <inactiveTitleBtnBg rgb="#dcdcdc" object="kwin" />
+ </colors>
+ <cursors name="" />
+ <wm type="builtin" name="kwin3_keramik" >
+ <border size="1" />
+ </wm>
+ <konqueror>
+ <wallpaper url="kde4ever.png" />
+ <bgcolor rgb="#000000" />
+ </konqueror>
+ <panel>
+ <background colorize="0" url="" />
+ <transparent value="0" />
+ </panel>
+ <widgets name="Keramik" />
+ <fonts>
+ <font value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <fixed value="Courier New,10,-1,5,50,0,0,0,0,0" object="General" />
+ <toolBarFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <menuFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <activeFont value="Arial,12,-1,5,75,0,0,0,0,0" object="WM" />
+ <taskbarFont value="Arial,11,-1,5,50,0,0,0,0,0" object="General" />
+ <StandardFont value="" object="FMSettings" />
+ </fonts>
+</ktheme>
diff --git a/kcontrol/krdb/themes/Keramik/Makefile.am b/kcontrol/krdb/themes/Keramik/Makefile.am
new file mode 100644
index 000000000..d7ab00fa0
--- /dev/null
+++ b/kcontrol/krdb/themes/Keramik/Makefile.am
@@ -0,0 +1,6 @@
+
+kthememanager_theme_data_DATA = Keramik.xml Keramik.preview.png
+
+kthememanager_theme_datadir = $(kde_datadir)/kthememanager/themes/Keramik
+
+EXTRA_DIST = $(kthememanager_theme_data_DATA)
diff --git a/kcontrol/krdb/themes/Makefile.am b/kcontrol/krdb/themes/Makefile.am
new file mode 100644
index 000000000..7723ea9af
--- /dev/null
+++ b/kcontrol/krdb/themes/Makefile.am
@@ -0,0 +1,4 @@
+SUBDIRS = HighContrastDark HighContrastDark-big \
+ HighContrastLight HighContrastLight-big \
+ YellowOnBlue YellowOnBlue-big \
+ KDE_Classic Keramik Plastik Platinum Sunshine Redmond \ No newline at end of file
diff --git a/kcontrol/krdb/themes/Plastik/Makefile.am b/kcontrol/krdb/themes/Plastik/Makefile.am
new file mode 100644
index 000000000..6cb02d183
--- /dev/null
+++ b/kcontrol/krdb/themes/Plastik/Makefile.am
@@ -0,0 +1,6 @@
+
+kthememanager_theme_data_DATA = Plastik.xml Plastik.preview.png
+
+kthememanager_theme_datadir = $(kde_datadir)/kthememanager/themes/Plastik
+
+EXTRA_DIST = $(kthememanager_theme_data_DATA)
diff --git a/kcontrol/krdb/themes/Plastik/Plastik.preview.png b/kcontrol/krdb/themes/Plastik/Plastik.preview.png
new file mode 100644
index 000000000..6315c046e
--- /dev/null
+++ b/kcontrol/krdb/themes/Plastik/Plastik.preview.png
Binary files differ
diff --git a/kcontrol/krdb/themes/Plastik/Plastik.xml b/kcontrol/krdb/themes/Plastik/Plastik.xml
new file mode 100644
index 000000000..4e317ed59
--- /dev/null
+++ b/kcontrol/krdb/themes/Plastik/Plastik.xml
@@ -0,0 +1,124 @@
+<!DOCTYPE ktheme>
+<ktheme version="1" >
+ <general>
+ <author value="" />
+ <email value="" />
+ <homepage value="" />
+ <comment value="" />
+ <version value="" />
+ </general>
+ <desktop number="0" common="1" >
+ <mode id="Flat" />
+ <color1 rgb="#003082" />
+ <color2 rgb="#6c8bb9" />
+ <blending mode="NoBlending" balance="100" reverse="0" />
+ <pattern name="" />
+ <wallpaper mode="Scaled" url="KDE34.png" />
+ </desktop>
+ <screensaver name="" />
+ <icons name="crystalsvg" >
+ <Animated value="1" object="desktop" />
+ <DoublePixels value="0" object="desktop" />
+ <Size value="32" object="desktop" />
+ <ActiveEffect name="togamma" object="desktop" />
+ <ActiveSemiTransparent value="0" object="desktop" />
+ <ActiveValue value="1" object="desktop" />
+ <DefaultEffect name="none" object="desktop" />
+ <DefaultSemiTransparent value="0" object="desktop" />
+ <DefaultValue value="1" object="desktop" />
+ <DisabledEffect name="togray" object="desktop" />
+ <DisabledSemiTransparent value="0" object="desktop" />
+ <DisabledValue value="1" object="desktop" />
+ <Animated value="0" object="mainToolbar" />
+ <DoublePixels value="0" object="mainToolbar" />
+ <Size value="22" object="mainToolbar" />
+ <ActiveEffect name="none" object="mainToolbar" />
+ <ActiveSemiTransparent value="0" object="mainToolbar" />
+ <ActiveValue value="1" object="mainToolbar" />
+ <DefaultEffect name="none" object="mainToolbar" />
+ <DefaultSemiTransparent value="0" object="mainToolbar" />
+ <DefaultValue value="1" object="mainToolbar" />
+ <DisabledEffect name="togray" object="mainToolbar" />
+ <DisabledSemiTransparent value="0" object="mainToolbar" />
+ <DisabledValue value="1" object="mainToolbar" />
+ <Animated value="0" object="panel" />
+ <DoublePixels value="0" object="panel" />
+ <Size value="32" object="panel" />
+ <ActiveEffect name="togamma" object="panel" />
+ <ActiveSemiTransparent value="0" object="panel" />
+ <ActiveValue value="1" object="panel" />
+ <DefaultEffect name="none" object="panel" />
+ <DefaultSemiTransparent value="0" object="panel" />
+ <DefaultValue value="1" object="panel" />
+ <DisabledEffect name="togray" object="panel" />
+ <DisabledSemiTransparent value="0" object="panel" />
+ <DisabledValue value="1" object="panel" />
+ <Animated value="0" object="small" />
+ <DoublePixels value="0" object="small" />
+ <Size value="16" object="small" />
+ <ActiveEffect name="none" object="small" />
+ <ActiveSemiTransparent value="0" object="small" />
+ <ActiveValue value="1" object="small" />
+ <DefaultEffect name="none" object="small" />
+ <DefaultSemiTransparent value="0" object="small" />
+ <DefaultValue value="1" object="small" />
+ <DisabledEffect name="togray" object="small" />
+ <DisabledSemiTransparent value="0" object="small" />
+ <DisabledValue value="1" object="small" />
+ <Animated value="0" object="toolbar" />
+ <DoublePixels value="0" object="toolbar" />
+ <Size value="22" object="toolbar" />
+ <ActiveEffect name="none" object="toolbar" />
+ <ActiveSemiTransparent value="0" object="toolbar" />
+ <ActiveValue value="1" object="toolbar" />
+ <DefaultEffect name="none" object="toolbar" />
+ <DefaultSemiTransparent value="0" object="toolbar" />
+ <DefaultValue value="1" object="toolbar" />
+ <DisabledEffect name="togray" object="toolbar" />
+ <DisabledSemiTransparent value="0" object="toolbar" />
+ <DisabledValue value="1" object="toolbar" />
+ </icons>
+ <sounds/>
+ <colors contrast="7" >
+ <background rgb="#efefef" object="global" />
+ <selectBackground rgb="#678db2" object="global" />
+ <foreground rgb="#000000" object="global" />
+ <windowForeground rgb="#000000" object="global" />
+ <windowBackground rgb="#ffffff" object="global" />
+ <selectForeground rgb="#ffffff" object="global" />
+ <buttonBackground rgb="#dddfe4" object="global" />
+ <buttonForeground rgb="#000000" object="global" />
+ <linkColor rgb="#0000ee" object="global" />
+ <visitedLinkColor rgb="#52188b" object="global" />
+ <activeForeground rgb="#ffffff" object="kwin" />
+ <inactiveBackground rgb="#9daaba" object="kwin" />
+ <inactiveBlend rgb="#9daaba" object="kwin" />
+ <activeBackground rgb="#418edc" object="kwin" />
+ <activeBlend rgb="#6b91b8" object="kwin" />
+ <inactiveForeground rgb="#dddddd" object="kwin" />
+ <activeTitleBtnBg rgb="#dcdcdc" object="kwin" />
+ <inactiveTitleBtnBg rgb="#dcdcdc" object="kwin" />
+ </colors>
+ <cursors name="" />
+ <wm type="builtin" name="kwin3_plastik" >
+ <border size="1" />
+ </wm>
+ <konqueror>
+ <wallpaper url="kde4ever.png" />
+ <bgcolor rgb="#000000" />
+ </konqueror>
+ <panel>
+ <background colorize="0" url="" />
+ <transparent value="0" />
+ </panel>
+ <widgets name="Plastik" />
+ <fonts>
+ <font value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <fixed value="Courier New,10,-1,5,50,0,0,0,0,0" object="General" />
+ <toolBarFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <menuFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <activeFont value="Arial,12,-1,5,75,0,0,0,0,0" object="WM" />
+ <taskbarFont value="Arial,11,-1,5,50,0,0,0,0,0" object="General" />
+ <StandardFont value="" object="FMSettings" />
+ </fonts>
+</ktheme>
diff --git a/kcontrol/krdb/themes/Platinum/Makefile.am b/kcontrol/krdb/themes/Platinum/Makefile.am
new file mode 100644
index 000000000..dbb6bdddf
--- /dev/null
+++ b/kcontrol/krdb/themes/Platinum/Makefile.am
@@ -0,0 +1,6 @@
+
+kthememanager_theme_data_DATA = Platinum.xml Platinum.preview.png
+
+kthememanager_theme_datadir = $(kde_datadir)/kthememanager/themes/Platinum
+
+EXTRA_DIST = $(kthememanager_theme_data_DATA)
diff --git a/kcontrol/krdb/themes/Platinum/Platinum.preview.png b/kcontrol/krdb/themes/Platinum/Platinum.preview.png
new file mode 100644
index 000000000..bec6cd2d1
--- /dev/null
+++ b/kcontrol/krdb/themes/Platinum/Platinum.preview.png
Binary files differ
diff --git a/kcontrol/krdb/themes/Platinum/Platinum.xml b/kcontrol/krdb/themes/Platinum/Platinum.xml
new file mode 100644
index 000000000..2fc50ba36
--- /dev/null
+++ b/kcontrol/krdb/themes/Platinum/Platinum.xml
@@ -0,0 +1,124 @@
+<!DOCTYPE ktheme>
+<ktheme version="1" >
+ <general>
+ <author value="" />
+ <email value="" />
+ <homepage value="" />
+ <comment value="" />
+ <version value="" />
+ </general>
+ <desktop number="0" common="1" >
+ <mode id="VerticalGradient" />
+ <color1 rgb="#2a569d" />
+ <color2 rgb="#6c8bb9" />
+ <blending mode="NoBlending" balance="100" reverse="0" />
+ <pattern name="" />
+ <wallpaper mode="NoWallpaper" url="KDE34.png" />
+ </desktop>
+ <screensaver name="" />
+ <icons name="crystalsvg" >
+ <Animated value="1" object="desktop" />
+ <DoublePixels value="0" object="desktop" />
+ <Size value="32" object="desktop" />
+ <ActiveEffect name="togamma" object="desktop" />
+ <ActiveSemiTransparent value="0" object="desktop" />
+ <ActiveValue value="1" object="desktop" />
+ <DefaultEffect name="none" object="desktop" />
+ <DefaultSemiTransparent value="0" object="desktop" />
+ <DefaultValue value="1" object="desktop" />
+ <DisabledEffect name="togray" object="desktop" />
+ <DisabledSemiTransparent value="0" object="desktop" />
+ <DisabledValue value="1" object="desktop" />
+ <Animated value="0" object="mainToolbar" />
+ <DoublePixels value="0" object="mainToolbar" />
+ <Size value="22" object="mainToolbar" />
+ <ActiveEffect name="none" object="mainToolbar" />
+ <ActiveSemiTransparent value="0" object="mainToolbar" />
+ <ActiveValue value="1" object="mainToolbar" />
+ <DefaultEffect name="none" object="mainToolbar" />
+ <DefaultSemiTransparent value="0" object="mainToolbar" />
+ <DefaultValue value="1" object="mainToolbar" />
+ <DisabledEffect name="togray" object="mainToolbar" />
+ <DisabledSemiTransparent value="0" object="mainToolbar" />
+ <DisabledValue value="1" object="mainToolbar" />
+ <Animated value="0" object="panel" />
+ <DoublePixels value="0" object="panel" />
+ <Size value="32" object="panel" />
+ <ActiveEffect name="togamma" object="panel" />
+ <ActiveSemiTransparent value="0" object="panel" />
+ <ActiveValue value="1" object="panel" />
+ <DefaultEffect name="none" object="panel" />
+ <DefaultSemiTransparent value="0" object="panel" />
+ <DefaultValue value="1" object="panel" />
+ <DisabledEffect name="togray" object="panel" />
+ <DisabledSemiTransparent value="0" object="panel" />
+ <DisabledValue value="1" object="panel" />
+ <Animated value="0" object="small" />
+ <DoublePixels value="0" object="small" />
+ <Size value="16" object="small" />
+ <ActiveEffect name="none" object="small" />
+ <ActiveSemiTransparent value="0" object="small" />
+ <ActiveValue value="1" object="small" />
+ <DefaultEffect name="none" object="small" />
+ <DefaultSemiTransparent value="0" object="small" />
+ <DefaultValue value="1" object="small" />
+ <DisabledEffect name="togray" object="small" />
+ <DisabledSemiTransparent value="0" object="small" />
+ <DisabledValue value="1" object="small" />
+ <Animated value="0" object="toolbar" />
+ <DoublePixels value="0" object="toolbar" />
+ <Size value="22" object="toolbar" />
+ <ActiveEffect name="none" object="toolbar" />
+ <ActiveSemiTransparent value="0" object="toolbar" />
+ <ActiveValue value="1" object="toolbar" />
+ <DefaultEffect name="none" object="toolbar" />
+ <DefaultSemiTransparent value="0" object="toolbar" />
+ <DefaultValue value="1" object="toolbar" />
+ <DisabledEffect name="togray" object="toolbar" />
+ <DisabledSemiTransparent value="0" object="toolbar" />
+ <DisabledValue value="1" object="toolbar" />
+ </icons>
+ <sounds/>
+ <colors contrast="7" >
+ <background rgb="#e6dedc" object="global" />
+ <selectBackground rgb="#0a5f89" object="global" />
+ <foreground rgb="#000000" object="global" />
+ <windowForeground rgb="#000000" object="global" />
+ <windowBackground rgb="#ffffff" object="global" />
+ <selectForeground rgb="#ffffff" object="global" />
+ <buttonBackground rgb="#e4e4e4" object="global" />
+ <buttonForeground rgb="#000000" object="global" />
+ <linkColor rgb="#0000c0" object="global" />
+ <visitedLinkColor rgb="#800080" object="global" />
+ <activeForeground rgb="#020202" object="kwin" />
+ <inactiveBackground rgb="#96a7ca" object="kwin" />
+ <inactiveBlend rgb="#9db0d0" object="kwin" />
+ <activeBackground rgb="#e9e9e9" object="kwin" />
+ <activeBlend rgb="#e9e9e9" object="kwin" />
+ <inactiveForeground rgb="#5d7091" object="kwin" />
+ <activeTitleBtnBg rgb="#dcdcdc" object="kwin" />
+ <inactiveTitleBtnBg rgb="#dcdcdc" object="kwin" />
+ </colors>
+ <cursors name="" />
+ <wm type="builtin" name="kwin3_system" >
+ <border size="1" />
+ </wm>
+ <konqueror>
+ <wallpaper url="kde4ever.png" />
+ <bgcolor rgb="#000000" />
+ </konqueror>
+ <panel>
+ <background colorize="0" url="" />
+ <transparent value="0" />
+ </panel>
+ <widgets name="Platinum" />
+ <fonts>
+ <font value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <fixed value="Courier New,10,-1,5,50,0,0,0,0,0" object="General" />
+ <toolBarFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <menuFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <activeFont value="Arial,12,-1,5,75,0,0,0,0,0" object="WM" />
+ <taskbarFont value="Arial,11,-1,5,50,0,0,0,0,0" object="General" />
+ <StandardFont value="" object="FMSettings" />
+ </fonts>
+</ktheme>
diff --git a/kcontrol/krdb/themes/Redmond/Makefile.am b/kcontrol/krdb/themes/Redmond/Makefile.am
new file mode 100644
index 000000000..726e8776c
--- /dev/null
+++ b/kcontrol/krdb/themes/Redmond/Makefile.am
@@ -0,0 +1,6 @@
+
+kthememanager_theme_data_DATA = Redmond.xml Redmond.preview.png
+
+kthememanager_theme_datadir = $(kde_datadir)/kthememanager/themes/Redmond
+
+EXTRA_DIST = $(kthememanager_theme_data_DATA)
diff --git a/kcontrol/krdb/themes/Redmond/Redmond.preview.png b/kcontrol/krdb/themes/Redmond/Redmond.preview.png
new file mode 100644
index 000000000..d1f787a9b
--- /dev/null
+++ b/kcontrol/krdb/themes/Redmond/Redmond.preview.png
Binary files differ
diff --git a/kcontrol/krdb/themes/Redmond/Redmond.xml b/kcontrol/krdb/themes/Redmond/Redmond.xml
new file mode 100644
index 000000000..4ec27ceee
--- /dev/null
+++ b/kcontrol/krdb/themes/Redmond/Redmond.xml
@@ -0,0 +1,124 @@
+<!DOCTYPE ktheme>
+<ktheme version="1" >
+ <general>
+ <author value="" />
+ <email value="" />
+ <homepage value="" />
+ <comment value="" />
+ <version value="" />
+ </general>
+ <desktop number="0" common="1" >
+ <mode id="Flat" />
+ <color1 rgb="#008183" />
+ <color2 rgb="#c0c0c0" />
+ <blending mode="NoBlending" balance="100" reverse="0" />
+ <pattern name="" />
+ <wallpaper mode="NoWallpaper" url="KDE34.png" />
+ </desktop>
+ <screensaver name="" />
+ <icons name="kdeclassic" >
+ <Animated value="1" object="desktop" />
+ <DoublePixels value="0" object="desktop" />
+ <Size value="32" object="desktop" />
+ <ActiveEffect name="togamma" object="desktop" />
+ <ActiveSemiTransparent value="0" object="desktop" />
+ <ActiveValue value="1" object="desktop" />
+ <DefaultEffect name="none" object="desktop" />
+ <DefaultSemiTransparent value="0" object="desktop" />
+ <DefaultValue value="1" object="desktop" />
+ <DisabledEffect name="togray" object="desktop" />
+ <DisabledSemiTransparent value="0" object="desktop" />
+ <DisabledValue value="1" object="desktop" />
+ <Animated value="0" object="mainToolbar" />
+ <DoublePixels value="0" object="mainToolbar" />
+ <Size value="22" object="mainToolbar" />
+ <ActiveEffect name="none" object="mainToolbar" />
+ <ActiveSemiTransparent value="0" object="mainToolbar" />
+ <ActiveValue value="1" object="mainToolbar" />
+ <DefaultEffect name="none" object="mainToolbar" />
+ <DefaultSemiTransparent value="0" object="mainToolbar" />
+ <DefaultValue value="1" object="mainToolbar" />
+ <DisabledEffect name="togray" object="mainToolbar" />
+ <DisabledSemiTransparent value="0" object="mainToolbar" />
+ <DisabledValue value="1" object="mainToolbar" />
+ <Animated value="0" object="panel" />
+ <DoublePixels value="0" object="panel" />
+ <Size value="32" object="panel" />
+ <ActiveEffect name="togamma" object="panel" />
+ <ActiveSemiTransparent value="0" object="panel" />
+ <ActiveValue value="1" object="panel" />
+ <DefaultEffect name="none" object="panel" />
+ <DefaultSemiTransparent value="0" object="panel" />
+ <DefaultValue value="1" object="panel" />
+ <DisabledEffect name="togray" object="panel" />
+ <DisabledSemiTransparent value="0" object="panel" />
+ <DisabledValue value="1" object="panel" />
+ <Animated value="0" object="small" />
+ <DoublePixels value="0" object="small" />
+ <Size value="16" object="small" />
+ <ActiveEffect name="none" object="small" />
+ <ActiveSemiTransparent value="0" object="small" />
+ <ActiveValue value="1" object="small" />
+ <DefaultEffect name="none" object="small" />
+ <DefaultSemiTransparent value="0" object="small" />
+ <DefaultValue value="1" object="small" />
+ <DisabledEffect name="togray" object="small" />
+ <DisabledSemiTransparent value="0" object="small" />
+ <DisabledValue value="1" object="small" />
+ <Animated value="0" object="toolbar" />
+ <DoublePixels value="0" object="toolbar" />
+ <Size value="22" object="toolbar" />
+ <ActiveEffect name="none" object="toolbar" />
+ <ActiveSemiTransparent value="0" object="toolbar" />
+ <ActiveValue value="1" object="toolbar" />
+ <DefaultEffect name="none" object="toolbar" />
+ <DefaultSemiTransparent value="0" object="toolbar" />
+ <DefaultValue value="1" object="toolbar" />
+ <DisabledEffect name="togray" object="toolbar" />
+ <DisabledSemiTransparent value="0" object="toolbar" />
+ <DisabledValue value="1" object="toolbar" />
+ </icons>
+ <sounds/>
+ <colors contrast="7" >
+ <background rgb="#d4d0c8" object="global" />
+ <selectBackground rgb="#002468" object="global" />
+ <foreground rgb="#000000" object="global" />
+ <windowForeground rgb="#000000" object="global" />
+ <windowBackground rgb="#ffffff" object="global" />
+ <selectForeground rgb="#ffffff" object="global" />
+ <buttonBackground rgb="#d4d0c8" object="global" />
+ <buttonForeground rgb="#000000" object="global" />
+ <linkColor rgb="#0000c0" object="global" />
+ <visitedLinkColor rgb="#800080" object="global" />
+ <activeForeground rgb="#ffffff" object="kwin" />
+ <inactiveBackground rgb="#dcdcdc" object="kwin" />
+ <inactiveBlend rgb="#dcdcdc" object="kwin" />
+ <activeBackground rgb="#002468" object="kwin" />
+ <activeBlend rgb="#a8ccf0" object="kwin" />
+ <inactiveForeground rgb="#000000" object="kwin" />
+ <activeTitleBtnBg rgb="#dcdcdc" object="kwin" />
+ <inactiveTitleBtnBg rgb="#dcdcdc" object="kwin" />
+ </colors>
+ <cursors name="" />
+ <wm type="builtin" name="kwin3_redmond" >
+ <border size="1" />
+ </wm>
+ <konqueror>
+ <wallpaper url="kde4ever.png" />
+ <bgcolor rgb="#000000" />
+ </konqueror>
+ <panel>
+ <background colorize="0" url="" />
+ <transparent value="0" />
+ </panel>
+ <widgets name="Windows" />
+ <fonts>
+ <font value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <fixed value="Courier New,10,-1,5,50,0,0,0,0,0" object="General" />
+ <toolBarFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <menuFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <activeFont value="Arial,12,-1,5,75,0,0,0,0,0" object="WM" />
+ <taskbarFont value="Arial,11,-1,5,50,0,0,0,0,0" object="General" />
+ <StandardFont value="" object="FMSettings" />
+ </fonts>
+</ktheme>
diff --git a/kcontrol/krdb/themes/Sunshine/Makefile.am b/kcontrol/krdb/themes/Sunshine/Makefile.am
new file mode 100644
index 000000000..9594c2c40
--- /dev/null
+++ b/kcontrol/krdb/themes/Sunshine/Makefile.am
@@ -0,0 +1,6 @@
+
+kthememanager_theme_data_DATA = Sunshine.xml Sunshine.preview.png
+
+kthememanager_theme_datadir = $(kde_datadir)/kthememanager/themes/Sunshine
+
+EXTRA_DIST = $(kthememanager_theme_data_DATA)
diff --git a/kcontrol/krdb/themes/Sunshine/Sunshine.preview.png b/kcontrol/krdb/themes/Sunshine/Sunshine.preview.png
new file mode 100644
index 000000000..0402460f8
--- /dev/null
+++ b/kcontrol/krdb/themes/Sunshine/Sunshine.preview.png
Binary files differ
diff --git a/kcontrol/krdb/themes/Sunshine/Sunshine.xml b/kcontrol/krdb/themes/Sunshine/Sunshine.xml
new file mode 100644
index 000000000..92a4a8bf0
--- /dev/null
+++ b/kcontrol/krdb/themes/Sunshine/Sunshine.xml
@@ -0,0 +1,124 @@
+<!DOCTYPE ktheme>
+<ktheme version="1" >
+ <general>
+ <author value="" />
+ <email value="" />
+ <homepage value="" />
+ <comment value="" />
+ <version value="" />
+ </general>
+ <desktop number="0" common="1" >
+ <mode id="Flat" />
+ <color1 rgb="#718ba5" />
+ <color2 rgb="#c0c0c0" />
+ <blending mode="NoBlending" balance="100" reverse="0" />
+ <pattern name="" />
+ <wallpaper mode="NoWallpaper" url="" />
+ </desktop>
+ <screensaver name="" />
+ <icons name="kdeclassic" >
+ <Animated value="1" object="desktop" />
+ <DoublePixels value="0" object="desktop" />
+ <Size value="32" object="desktop" />
+ <ActiveEffect name="togamma" object="desktop" />
+ <ActiveSemiTransparent value="0" object="desktop" />
+ <ActiveValue value="1" object="desktop" />
+ <DefaultEffect name="none" object="desktop" />
+ <DefaultSemiTransparent value="0" object="desktop" />
+ <DefaultValue value="1" object="desktop" />
+ <DisabledEffect name="togray" object="desktop" />
+ <DisabledSemiTransparent value="0" object="desktop" />
+ <DisabledValue value="1" object="desktop" />
+ <Animated value="0" object="mainToolbar" />
+ <DoublePixels value="0" object="mainToolbar" />
+ <Size value="22" object="mainToolbar" />
+ <ActiveEffect name="none" object="mainToolbar" />
+ <ActiveSemiTransparent value="0" object="mainToolbar" />
+ <ActiveValue value="1" object="mainToolbar" />
+ <DefaultEffect name="none" object="mainToolbar" />
+ <DefaultSemiTransparent value="0" object="mainToolbar" />
+ <DefaultValue value="1" object="mainToolbar" />
+ <DisabledEffect name="togray" object="mainToolbar" />
+ <DisabledSemiTransparent value="0" object="mainToolbar" />
+ <DisabledValue value="1" object="mainToolbar" />
+ <Animated value="0" object="panel" />
+ <DoublePixels value="0" object="panel" />
+ <Size value="32" object="panel" />
+ <ActiveEffect name="togamma" object="panel" />
+ <ActiveSemiTransparent value="0" object="panel" />
+ <ActiveValue value="1" object="panel" />
+ <DefaultEffect name="none" object="panel" />
+ <DefaultSemiTransparent value="0" object="panel" />
+ <DefaultValue value="1" object="panel" />
+ <DisabledEffect name="togray" object="panel" />
+ <DisabledSemiTransparent value="0" object="panel" />
+ <DisabledValue value="1" object="panel" />
+ <Animated value="0" object="small" />
+ <DoublePixels value="0" object="small" />
+ <Size value="16" object="small" />
+ <ActiveEffect name="none" object="small" />
+ <ActiveSemiTransparent value="0" object="small" />
+ <ActiveValue value="1" object="small" />
+ <DefaultEffect name="none" object="small" />
+ <DefaultSemiTransparent value="0" object="small" />
+ <DefaultValue value="1" object="small" />
+ <DisabledEffect name="togray" object="small" />
+ <DisabledSemiTransparent value="0" object="small" />
+ <DisabledValue value="1" object="small" />
+ <Animated value="0" object="toolbar" />
+ <DoublePixels value="0" object="toolbar" />
+ <Size value="22" object="toolbar" />
+ <ActiveEffect name="none" object="toolbar" />
+ <ActiveSemiTransparent value="0" object="toolbar" />
+ <ActiveValue value="1" object="toolbar" />
+ <DefaultEffect name="none" object="toolbar" />
+ <DefaultSemiTransparent value="0" object="toolbar" />
+ <DefaultValue value="1" object="toolbar" />
+ <DisabledEffect name="togray" object="toolbar" />
+ <DisabledSemiTransparent value="0" object="toolbar" />
+ <DisabledValue value="1" object="toolbar" />
+ </icons>
+ <sounds/>
+ <colors contrast="7" >
+ <background rgb="#aeb2c3" object="global" />
+ <selectBackground rgb="#718ba5" object="global" />
+ <foreground rgb="#000000" object="global" />
+ <windowForeground rgb="#000000" object="global" />
+ <windowBackground rgb="#9397a5" object="global" />
+ <selectForeground rgb="#ffffff" object="global" />
+ <buttonBackground rgb="#aeb2c3" object="global" />
+ <buttonForeground rgb="#000000" object="global" />
+ <linkColor rgb="#0000ff" object="global" />
+ <visitedLinkColor rgb="#c0ffff" object="global" />
+ <activeForeground rgb="#ffffff" object="kwin" />
+ <inactiveBackground rgb="#aeb2c3" object="kwin" />
+ <inactiveBlend rgb="#aeb2c3" object="kwin" />
+ <activeBackground rgb="#b24d7a" object="kwin" />
+ <activeBlend rgb="#aeb2c3" object="kwin" />
+ <inactiveForeground rgb="#000000" object="kwin" />
+ <activeTitleBtnBg rgb="#aeb2c3" object="kwin" />
+ <inactiveTitleBtnBg rgb="#aeb2c3" object="kwin" />
+ </colors>
+ <cursors name="" />
+ <wm type="builtin" name="kwin3_cde" >
+ <border size="1" />
+ </wm>
+ <konqueror>
+ <wallpaper url="kde4ever.png" />
+ <bgcolor rgb="#000000" />
+ </konqueror>
+ <panel>
+ <background colorize="0" url="" />
+ <transparent value="0" />
+ </panel>
+ <widgets name="Motif" />
+ <fonts>
+ <font value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <fixed value="Courier New,10,-1,5,50,0,0,0,0,0" object="General" />
+ <toolBarFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <menuFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <activeFont value="Arial,12,-1,5,75,0,0,0,0,0" object="WM" />
+ <taskbarFont value="Arial,11,-1,5,50,0,0,0,0,0" object="General" />
+ <StandardFont value="" object="FMSettings" />
+ </fonts>
+</ktheme>
diff --git a/kcontrol/krdb/themes/YellowOnBlue-big/Makefile.am b/kcontrol/krdb/themes/YellowOnBlue-big/Makefile.am
new file mode 100644
index 000000000..dedb23a60
--- /dev/null
+++ b/kcontrol/krdb/themes/YellowOnBlue-big/Makefile.am
@@ -0,0 +1,6 @@
+
+kthememanager_theme_data_DATA = YellowOnBlue-big.preview.png YellowOnBlue-big.xml
+
+kthememanager_theme_datadir = $(kde_datadir)/kthememanager/themes/YellowOnBlue-big
+
+EXTRA_DIST = $(kthememanager_theme_data_DATA)
diff --git a/kcontrol/krdb/themes/YellowOnBlue-big/YellowOnBlue-big.preview.png b/kcontrol/krdb/themes/YellowOnBlue-big/YellowOnBlue-big.preview.png
new file mode 100644
index 000000000..b3814c7af
--- /dev/null
+++ b/kcontrol/krdb/themes/YellowOnBlue-big/YellowOnBlue-big.preview.png
Binary files differ
diff --git a/kcontrol/krdb/themes/YellowOnBlue-big/YellowOnBlue-big.xml b/kcontrol/krdb/themes/YellowOnBlue-big/YellowOnBlue-big.xml
new file mode 100644
index 000000000..20138db4a
--- /dev/null
+++ b/kcontrol/krdb/themes/YellowOnBlue-big/YellowOnBlue-big.xml
@@ -0,0 +1,158 @@
+<!DOCTYPE ktheme>
+<ktheme version="1" >
+ <general>
+ <author value="Gunnar Schmi Dt" />
+ <email value="gunnar@schmi-dt.de" />
+ <homepage value="http://www.schmi-dt.de/" />
+ <comment value="This high contrast desktop theme with large yellow text on blue background is intended for low-vision users." />
+ <version value="1.0" />
+ </general>
+ <desktop number="0" common="1" >
+ <mode id="HorizontalGradient" />
+ <color1 rgb="#3333cc" />
+ <color2 rgb="#3333cc" />
+ <blending mode="FlatBlending" balance="-30" reverse="0" />
+ <pattern name="" />
+ <wallpaper mode="NoWallpaper" url="" />
+ </desktop>
+ <screensaver name="" />
+ <icons name="mono" >
+ <Animated value="1" object="desktop" />
+ <DoublePixels value="0" object="desktop" />
+ <Size value="56" object="desktop" />
+ <ActiveColor rgb="#ffff00" object="desktop" />
+ <ActiveColor2 rgb="#333399" object="desktop" />
+ <ActiveEffect name="tomonochrome" object="desktop" />
+ <ActiveSemiTransparent value="0" object="desktop" />
+ <ActiveValue value="1" object="desktop" />
+ <DefaultColor rgb="#ffff00" object="desktop" />
+ <DefaultColor2 rgb="#0000ff" object="desktop" />
+ <DefaultEffect name="tomonochrome" object="desktop" />
+ <DefaultSemiTransparent value="0" object="desktop" />
+ <DefaultValue value="1" object="desktop" />
+ <DisabledColor rgb="#808080" object="desktop" />
+ <DisabledColor2 rgb="#3333cc" object="desktop" />
+ <DisabledEffect name="tomonochrome" object="desktop" />
+ <DisabledSemiTransparent value="0" object="desktop" />
+ <DisabledValue value="1" object="desktop" />
+ <Animated value="0" object="mainToolbar" />
+ <DoublePixels value="0" object="mainToolbar" />
+ <Size value="44" object="mainToolbar" />
+ <ActiveColor rgb="#ffff00" object="mainToolbar" />
+ <ActiveColor2 rgb="#333399" object="mainToolbar" />
+ <ActiveEffect name="tomonochrome" object="mainToolbar" />
+ <ActiveSemiTransparent value="0" object="mainToolbar" />
+ <ActiveValue value="1" object="mainToolbar" />
+ <DefaultColor rgb="#ffff00" object="mainToolbar" />
+ <DefaultColor2 rgb="#0000ff" object="mainToolbar" />
+ <DefaultEffect name="tomonochrome" object="mainToolbar" />
+ <DefaultSemiTransparent value="0" object="mainToolbar" />
+ <DefaultValue value="1" object="mainToolbar" />
+ <DisabledColor rgb="#808080" object="mainToolbar" />
+ <DisabledColor2 rgb="#3333cc" object="mainToolbar" />
+ <DisabledEffect name="tomonochrome" object="mainToolbar" />
+ <DisabledSemiTransparent value="0" object="mainToolbar" />
+ <DisabledValue value="1" object="mainToolbar" />
+ <Animated value="0" object="panel" />
+ <DoublePixels value="0" object="panel" />
+ <Size value="32" object="panel" />
+ <ActiveColor rgb="#ffff00" object="panel" />
+ <ActiveColor2 rgb="#333399" object="panel" />
+ <ActiveEffect name="tomonochrome" object="panel" />
+ <ActiveSemiTransparent value="0" object="panel" />
+ <ActiveValue value="1" object="panel" />
+ <DefaultColor rgb="#ffff00" object="panel" />
+ <DefaultColor2 rgb="#0000ff" object="panel" />
+ <DefaultEffect name="tomonochrome" object="panel" />
+ <DefaultSemiTransparent value="0" object="panel" />
+ <DefaultValue value="1" object="panel" />
+ <DisabledColor rgb="#808080" object="panel" />
+ <DisabledColor2 rgb="#3333cc" object="panel" />
+ <DisabledEffect name="tomonochrome" object="panel" />
+ <DisabledSemiTransparent value="0" object="panel" />
+ <DisabledValue value="1" object="panel" />
+ <Animated value="0" object="small" />
+ <DoublePixels value="1" object="small" />
+ <Size value="16" object="small" />
+ <ActiveColor rgb="#ffff00" object="small" />
+ <ActiveColor2 rgb="#333399" object="small" />
+ <ActiveEffect name="tomonochrome" object="small" />
+ <ActiveSemiTransparent value="0" object="small" />
+ <ActiveValue value="1" object="small" />
+ <DefaultColor rgb="#ffff00" object="small" />
+ <DefaultColor2 rgb="#0000ff" object="small" />
+ <DefaultEffect name="tomonochrome" object="small" />
+ <DefaultSemiTransparent value="0" object="small" />
+ <DefaultValue value="1" object="small" />
+ <DisabledColor rgb="#808080" object="small" />
+ <DisabledColor2 rgb="#3333cc" object="small" />
+ <DisabledEffect name="tomonochrome" object="small" />
+ <DisabledSemiTransparent value="0" object="small" />
+ <DisabledValue value="1" object="small" />
+ <Animated value="0" object="toolbar" />
+ <DoublePixels value="0" object="toolbar" />
+ <Size value="44" object="toolbar" />
+ <ActiveColor rgb="#ffff00" object="toolbar" />
+ <ActiveColor2 rgb="#333399" object="toolbar" />
+ <ActiveEffect name="tomonochrome" object="toolbar" />
+ <ActiveSemiTransparent value="0" object="toolbar" />
+ <ActiveValue value="1" object="toolbar" />
+ <DefaultColor rgb="#ffff00" object="toolbar" />
+ <DefaultColor2 rgb="#0000ff" object="toolbar" />
+ <DefaultEffect name="tomonochrome" object="toolbar" />
+ <DefaultSemiTransparent value="0" object="toolbar" />
+ <DefaultValue value="1" object="toolbar" />
+ <DisabledColor rgb="#808080" object="toolbar" />
+ <DisabledColor2 rgb="#3333cc" object="toolbar" />
+ <DisabledEffect name="tomonochrome" object="toolbar" />
+ <DisabledSemiTransparent value="0" object="toolbar" />
+ <DisabledValue value="1" object="toolbar" />
+ </icons>
+ <sounds/>
+ <colors contrast="7" >
+ <background rgb="#0000ff" object="global" />
+ <selectBackground rgb="#0000b4" object="global" />
+ <foreground rgb="#ffff00" object="global" />
+ <windowForeground rgb="#ffff00" object="global" />
+ <windowBackground rgb="#0000ff" object="global" />
+ <selectForeground rgb="#ffff00" object="global" />
+ <buttonBackground rgb="#0000ff" object="global" />
+ <buttonForeground rgb="#ffff00" object="global" />
+ <linkColor rgb="#ffff00" object="global" />
+ <visitedLinkColor rgb="#ffff00" object="global" />
+ <alternateBackground rgb="#0000d7" object="global" />
+ <activeForeground rgb="#ffff00" object="kwin" />
+ <inactiveBackground rgb="#1e1ee1" object="kwin" />
+ <inactiveBlend rgb="#1e1ee1" object="kwin" />
+ <activeBackground rgb="#0000b4" object="kwin" />
+ <activeBlend rgb="#0000b4" object="kwin" />
+ <inactiveForeground rgb="#808080" object="kwin" />
+ <activeTitleBtnBg rgb="#ffff00" object="kwin" />
+ <inactiveTitleBtnBg rgb="#aaaa55" object="kwin" />
+ <frame rgb="#00007a" object="kwin" />
+ <inactiveFrame rgb="#1e1ee1" object="kwin" />
+ <handle rgb="#00007a" object="kwin" />
+ <inactiveHandle rgb="#1e1ee1" object="kwin" />
+ </colors>
+ <cursors name="" />
+ <wm type="builtin" name="kwin3_quartz" >
+ <border size="1" />
+ </wm>
+ <konqueror>
+ <wallpaper url="" />
+ <bgcolor rgb="#ffffff" />
+ </konqueror>
+ <panel>
+ <transparent value="0" />
+ </panel>
+ <widgets name="highcontrast" />
+ <fonts>
+ <font value="Arial,24,-1,5,50,0,0,0,0,0" object="General" />
+ <fixed value="Courier New,20,-1,5,50,0,0,0,0,0" object="General" />
+ <toolBarFont value="Arial,24,-1,5,50,0,0,0,0,0" object="General" />
+ <menuFont value="Arial,24,-1,5,50,0,0,0,0,0" object="General" />
+ <activeFont value="Arial,24,-1,5,75,0,0,0,0,0" object="WM" />
+ <taskbarFont value="Arial,22,-1,5,50,0,0,0,0,0" object="General" />
+ <StandardFont value="helvetica,24,-1,5,50,0,0,0,0,0" object="FMSettings" />
+ </fonts>
+</ktheme>
diff --git a/kcontrol/krdb/themes/YellowOnBlue/Makefile.am b/kcontrol/krdb/themes/YellowOnBlue/Makefile.am
new file mode 100644
index 000000000..cbad47f2a
--- /dev/null
+++ b/kcontrol/krdb/themes/YellowOnBlue/Makefile.am
@@ -0,0 +1,6 @@
+
+kthememanager_theme_data_DATA = YellowOnBlue.preview.png YellowOnBlue.xml
+
+kthememanager_theme_datadir = $(kde_datadir)/kthememanager/themes/YellowOnBlue
+
+EXTRA_DIST = $(kthememanager_theme_data_DATA)
diff --git a/kcontrol/krdb/themes/YellowOnBlue/YellowOnBlue.preview.png b/kcontrol/krdb/themes/YellowOnBlue/YellowOnBlue.preview.png
new file mode 100644
index 000000000..25809cb50
--- /dev/null
+++ b/kcontrol/krdb/themes/YellowOnBlue/YellowOnBlue.preview.png
Binary files differ
diff --git a/kcontrol/krdb/themes/YellowOnBlue/YellowOnBlue.xml b/kcontrol/krdb/themes/YellowOnBlue/YellowOnBlue.xml
new file mode 100644
index 000000000..a1e6fd5e4
--- /dev/null
+++ b/kcontrol/krdb/themes/YellowOnBlue/YellowOnBlue.xml
@@ -0,0 +1,158 @@
+<!DOCTYPE ktheme>
+<ktheme version="1" >
+ <general>
+ <author value="Gunnar Schmi Dt" />
+ <email value="gunnar@schmi-dt.de" />
+ <homepage value="http://www.schmi-dt.de/" />
+ <comment value="This high contrast desktop theme with yellow text on blue background is intended for low-vision users." />
+ <version value="1.0" />
+ </general>
+ <desktop number="0" common="1" >
+ <mode id="HorizontalGradient" />
+ <color1 rgb="#3333cc" />
+ <color2 rgb="#3333cc" />
+ <blending mode="FlatBlending" balance="-30" reverse="0" />
+ <pattern name="" />
+ <wallpaper mode="NoWallpaper" url="" />
+ </desktop>
+ <screensaver name="" />
+ <icons name="mono" >
+ <Animated value="1" object="desktop" />
+ <DoublePixels value="0" object="desktop" />
+ <Size value="32" object="desktop" />
+ <ActiveColor rgb="#ffff00" object="desktop" />
+ <ActiveColor2 rgb="#333399" object="desktop" />
+ <ActiveEffect name="tomonochrome" object="desktop" />
+ <ActiveSemiTransparent value="0" object="desktop" />
+ <ActiveValue value="1" object="desktop" />
+ <DefaultColor rgb="#ffff00" object="desktop" />
+ <DefaultColor2 rgb="#0000ff" object="desktop" />
+ <DefaultEffect name="tomonochrome" object="desktop" />
+ <DefaultSemiTransparent value="0" object="desktop" />
+ <DefaultValue value="1" object="desktop" />
+ <DisabledColor rgb="#808080" object="desktop" />
+ <DisabledColor2 rgb="#3333cc" object="desktop" />
+ <DisabledEffect name="tomonochrome" object="desktop" />
+ <DisabledSemiTransparent value="0" object="desktop" />
+ <DisabledValue value="1" object="desktop" />
+ <Animated value="0" object="mainToolbar" />
+ <DoublePixels value="0" object="mainToolbar" />
+ <Size value="22" object="mainToolbar" />
+ <ActiveColor rgb="#ffff00" object="mainToolbar" />
+ <ActiveColor2 rgb="#333399" object="mainToolbar" />
+ <ActiveEffect name="tomonochrome" object="mainToolbar" />
+ <ActiveSemiTransparent value="0" object="mainToolbar" />
+ <ActiveValue value="1" object="mainToolbar" />
+ <DefaultColor rgb="#ffff00" object="mainToolbar" />
+ <DefaultColor2 rgb="#0000ff" object="mainToolbar" />
+ <DefaultEffect name="tomonochrome" object="mainToolbar" />
+ <DefaultSemiTransparent value="0" object="mainToolbar" />
+ <DefaultValue value="1" object="mainToolbar" />
+ <DisabledColor rgb="#808080" object="mainToolbar" />
+ <DisabledColor2 rgb="#3333cc" object="mainToolbar" />
+ <DisabledEffect name="tomonochrome" object="mainToolbar" />
+ <DisabledSemiTransparent value="0" object="mainToolbar" />
+ <DisabledValue value="1" object="mainToolbar" />
+ <Animated value="0" object="panel" />
+ <DoublePixels value="0" object="panel" />
+ <Size value="32" object="panel" />
+ <ActiveColor rgb="#ffff00" object="panel" />
+ <ActiveColor2 rgb="#333399" object="panel" />
+ <ActiveEffect name="tomonochrome" object="panel" />
+ <ActiveSemiTransparent value="0" object="panel" />
+ <ActiveValue value="1" object="panel" />
+ <DefaultColor rgb="#ffff00" object="panel" />
+ <DefaultColor2 rgb="#0000ff" object="panel" />
+ <DefaultEffect name="tomonochrome" object="panel" />
+ <DefaultSemiTransparent value="0" object="panel" />
+ <DefaultValue value="1" object="panel" />
+ <DisabledColor rgb="#808080" object="panel" />
+ <DisabledColor2 rgb="#3333cc" object="panel" />
+ <DisabledEffect name="tomonochrome" object="panel" />
+ <DisabledSemiTransparent value="0" object="panel" />
+ <DisabledValue value="1" object="panel" />
+ <Animated value="0" object="small" />
+ <DoublePixels value="0" object="small" />
+ <Size value="16" object="small" />
+ <ActiveColor rgb="#ffff00" object="small" />
+ <ActiveColor2 rgb="#333399" object="small" />
+ <ActiveEffect name="tomonochrome" object="small" />
+ <ActiveSemiTransparent value="0" object="small" />
+ <ActiveValue value="1" object="small" />
+ <DefaultColor rgb="#ffff00" object="small" />
+ <DefaultColor2 rgb="#0000ff" object="small" />
+ <DefaultEffect name="tomonochrome" object="small" />
+ <DefaultSemiTransparent value="0" object="small" />
+ <DefaultValue value="1" object="small" />
+ <DisabledColor rgb="#808080" object="small" />
+ <DisabledColor2 rgb="#3333cc" object="small" />
+ <DisabledEffect name="tomonochrome" object="small" />
+ <DisabledSemiTransparent value="0" object="small" />
+ <DisabledValue value="1" object="small" />
+ <Animated value="0" object="toolbar" />
+ <DoublePixels value="0" object="toolbar" />
+ <Size value="22" object="toolbar" />
+ <ActiveColor rgb="#ffff00" object="toolbar" />
+ <ActiveColor2 rgb="#333399" object="toolbar" />
+ <ActiveEffect name="tomonochrome" object="toolbar" />
+ <ActiveSemiTransparent value="0" object="toolbar" />
+ <ActiveValue value="1" object="toolbar" />
+ <DefaultColor rgb="#ffff00" object="toolbar" />
+ <DefaultColor2 rgb="#0000ff" object="toolbar" />
+ <DefaultEffect name="tomonochrome" object="toolbar" />
+ <DefaultSemiTransparent value="0" object="toolbar" />
+ <DefaultValue value="1" object="toolbar" />
+ <DisabledColor rgb="#808080" object="toolbar" />
+ <DisabledColor2 rgb="#3333cc" object="toolbar" />
+ <DisabledEffect name="tomonochrome" object="toolbar" />
+ <DisabledSemiTransparent value="0" object="toolbar" />
+ <DisabledValue value="1" object="toolbar" />
+ </icons>
+ <sounds/>
+ <colors contrast="7" >
+ <background rgb="#0000ff" object="global" />
+ <selectBackground rgb="#0000b4" object="global" />
+ <foreground rgb="#ffff00" object="global" />
+ <windowForeground rgb="#ffff00" object="global" />
+ <windowBackground rgb="#0000ff" object="global" />
+ <selectForeground rgb="#ffff00" object="global" />
+ <buttonBackground rgb="#0000ff" object="global" />
+ <buttonForeground rgb="#ffff00" object="global" />
+ <linkColor rgb="#ffff00" object="global" />
+ <visitedLinkColor rgb="#ffff00" object="global" />
+ <alternateBackground rgb="#0000d7" object="global" />
+ <activeForeground rgb="#ffff00" object="kwin" />
+ <inactiveBackground rgb="#1e1ee1" object="kwin" />
+ <inactiveBlend rgb="#1e1ee1" object="kwin" />
+ <activeBackground rgb="#0000b4" object="kwin" />
+ <activeBlend rgb="#0000b4" object="kwin" />
+ <inactiveForeground rgb="#808080" object="kwin" />
+ <activeTitleBtnBg rgb="#ffff00" object="kwin" />
+ <inactiveTitleBtnBg rgb="#aaaa55" object="kwin" />
+ <frame rgb="#00007a" object="kwin" />
+ <inactiveFrame rgb="#1e1ee1" object="kwin" />
+ <handle rgb="#00007a" object="kwin" />
+ <inactiveHandle rgb="#1e1ee1" object="kwin" />
+ </colors>
+ <cursors name="" />
+ <wm type="builtin" name="kwin3_quartz" >
+ <border size="1" />
+ </wm>
+ <konqueror>
+ <wallpaper url="" />
+ <bgcolor rgb="#ffffff" />
+ </konqueror>
+ <panel>
+ <transparent value="0" />
+ </panel>
+ <widgets name="highcontrast" />
+ <fonts>
+ <font value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <fixed value="Courier New,10,-1,5,50,0,0,0,0,0" object="General" />
+ <toolBarFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <menuFont value="Arial,12,-1,5,50,0,0,0,0,0" object="General" />
+ <activeFont value="Arial,12,-1,5,75,0,0,0,0,0" object="WM" />
+ <taskbarFont value="Arial,11,-1,5,50,0,0,0,0,0" object="General" />
+ <StandardFont value="" object="FMSettings" />
+ </fonts>
+</ktheme>
diff --git a/kcontrol/kthememanager/Makefile.am b/kcontrol/kthememanager/Makefile.am
new file mode 100644
index 000000000..be71094cb
--- /dev/null
+++ b/kcontrol/kthememanager/Makefile.am
@@ -0,0 +1,21 @@
+AM_CPPFLAGS = $(all_includes)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = kcm_kthememanager.la
+
+kcm_kthememanager_la_SOURCES = kthemedlg.ui newthemewidget.ui knewthemedlg.cpp ktheme.cpp kthememanager.cpp
+kcm_kthememanager_la_LIBADD = $(LIB_KIO)
+kcm_kthememanager_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module
+
+noinst_HEADERS = kthememanager.h ktheme.h knewthemedlg.h kthemedlg.ui.h
+
+xdg_apps_DATA = kthememanager.desktop installktheme.desktop
+
+# MIME type
+kthememime_DATA = x-ktheme.desktop
+kthememimedir = $(kde_mimedir)/application
+
+bin_SCRIPTS = kdeinstallktheme
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kthememanager.pot
diff --git a/kcontrol/kthememanager/NEWS b/kcontrol/kthememanager/NEWS
new file mode 100644
index 000000000..23cd860ee
--- /dev/null
+++ b/kcontrol/kthememanager/NEWS
@@ -0,0 +1,26 @@
+Version 0.4
+===========
+- added support for screensaver
+- fixed Kicker transparency not being saved correctly
+
+Version 0.3
+===========
+- the theme manager now correctly handles installing and creating
+ new themes over existing ones
+- support for widget styles (or the name thereof)
+- added new details buttons to launch idividual kcm style-related
+ modules
+- write/read the current theme and preselect it at startup
+- the preview pixmap is now generated dynamically
+ and taken at full size
+
+Version 0.2
+===========
+- support for colorizing the Kicker background
+- support for relative URLs, as the README states
+- installing themes via DnD, even remote ones
+- installing themes via context (service) menu from Konqueror
+
+Version 0.1
+===========
+- first release
diff --git a/kcontrol/kthememanager/README b/kcontrol/kthememanager/README
new file mode 100644
index 000000000..0fe235115
--- /dev/null
+++ b/kcontrol/kthememanager/README
@@ -0,0 +1,99 @@
+This theme manager should handle installing, removing
+and creating global visual KDE themes. It's written
+from scratch, totally unrelated to the old kthememgr
+which was not maintained and obsolete.
+
+*** WARNING ***
+The XML file format is still subject to change!
+*** WARNING ***
+
+(c) 2003, 2004 Lukas Tinkl <lukas@kde.org>
+
+
+A KDE theme consists of:
+========================
+- wallpapers or bg colors
+- icons
+- sounds
+- color scheme
+- cursor theme
+- window decorations
+- screensaver
+- name of the widget theme
+- themed apps (mainly Konqueror and Kicker)
+
+
+Sample XML theme config file:
+=============================
+<ktheme version="1">
+<general>
+ <author value="Me" />
+ <email value="me@home.com" />
+ <homepage value="http://me.home.com" />
+ <version value="0.1" />
+ <comment value="this is a nice theme, bla bla" />
+</general>
+<desktop number="0" common="true|false">
+ <mode id="Flat|Pattern|*Gradient" />
+ <color1 rgb="#123456" />
+ <color2 rgb="#123456" />
+ <blending mode="" balance="" reverse="true|false" />
+ <pattern name="fish" />
+ <wallpaper url="theme:/wallpapers/desktop/image.jpg"
+ mode="Centred|Tiled|CenterTiled|CentredMaxpect|TiledMaxpect|Scaled|CentredAutoFit" />
+</desktop>
+<icons name="crystalsvg" />
+<sounds>
+ <event object="global|kwin" name="eventname" url="theme:/sounds/file.wav" />
+ ...
+</sounds>
+<colors contrast="7">
+ <alternateBackground rgb="#123456" object="global|kwin"/>
+ ...
+</colors>
+<cursors name="theme_name" />
+<wm type="builtin|custom" name="kwin_lib_name">
+ <buttons left="M" right="HIAX" />
+ <border size="number" />
+</wm>
+<konqueror>
+ <wallpaper url="" />
+ <bgcolor rgb="#123456" />
+</konqueror>
+<panel>
+ <background url="theme:/wallpapers/panel.png" colorize="true|false" />
+ <!-- or -->
+ <transparent value="true|false" />
+</panel>
+<widgets name="Style Name" />
+<screensaver name="saver.desktop" />
+</kdetheme>
+
+
+Theme storage:
+==============
+- a gzipped tarball, directory tree based (e.g. theme.kth)
+
+
+Sample dir tree:
+================
+-- mytheme.kth
+ - mytheme.xml
+ - mytheme.preview.png
+ - sounds/
+ - wallpapers/
+ - konqueror/
+ - desktop/
+ - panel/
+
+
+The notion of "url" here:
+=========================
+- local: points to an already installed file in the system
+ (must be a sole filename, e.g. "background.png"); this differs
+ according to the theme part (ie. can be different for sounds
+ and/or wallpapers)
+- theme: relative to the root of the theme tarball or directory
+ (e.g. theme:/wallpapers/desktop/image.png)
+- other URLs are not allowed, the file must be contained
+ either in the theme or in the target system
diff --git a/kcontrol/kthememanager/TODO b/kcontrol/kthememanager/TODO
new file mode 100644
index 000000000..944f79b78
--- /dev/null
+++ b/kcontrol/kthememanager/TODO
@@ -0,0 +1,9 @@
+- use KHotNewStuff for directly downloading themes from kde-look.org
+- custom pixmap kwin themes (requires kwmtheme to be ported first)
+- write user and theme developer documentation
+
+Handle:
+- splash screen (+ copying?)
+- K Menu sidebar pixmap
+- bundling the cursor theme
+- slideshow and "active" background program
diff --git a/kcontrol/kthememanager/installktheme.desktop b/kcontrol/kthememanager/installktheme.desktop
new file mode 100644
index 000000000..51e5f75a6
--- /dev/null
+++ b/kcontrol/kthememanager/installktheme.desktop
@@ -0,0 +1,78 @@
+[Desktop Entry]
+Name=Install KDE Theme
+Name[af]=Installeer KDE temas
+Name[ar]=ثبِت سمة KDE
+Name[az]=KDE Örtüyünü Qur
+Name[be]=Устаноўка тэмы KDE
+Name[bg]=Инсталиране на тема
+Name[bn]=কে.ডি.ই. থীম ইনস্টল করো
+Name[br]=Staliañ ar c'hiz KDE
+Name[bs]=Instaliraj KDE temu
+Name[ca]=Instal·la tema KDE
+Name[cs]=Instalovat KDE motiv
+Name[csb]=Instalëjë témã KDE
+Name[cy]=Gosod Thema KDE
+Name[da]=Installér KDE-tema
+Name[de]=KDE-Design installieren
+Name[el]=Εγκατάσταση θέματος του KDE
+Name[eo]=Instali KDEan etoson
+Name[es]=Instalar tema de KDE
+Name[et]=KDE teema paigaldamine
+Name[eu]=Instalatu KDE gaia
+Name[fa]=نصب چهرۀ KDE
+Name[fi]=Asenna KDE-teema
+Name[fr]=Installer des thèmes KDE
+Name[fy]=KDE-tema ynstallearje
+Name[ga]=Suiteáil Téama KDE
+Name[gl]=Instalar tema de KDE
+Name[he]=התקנה של ערכת נושא עבור KDE
+Name[hi]=केडीई प्रसंग संस्थापित करें
+Name[hr]=Instaliranje KDE teme
+Name[hu]=KDE-téma telepítése
+Name[is]=Setja inn KDE þemu
+Name[it]=Installa tema di KDE
+Name[ja]=KDE テーマのインストール
+Name[ka]=KDE-ს თემების დაყენება
+Name[kk]=KDE нақыштарын орнату
+Name[km]=ដំឡើង​ស្បែក KDE
+Name[ko]=KDE 테마 설치
+Name[lt]=Įdiegti KDE temą
+Name[lv]=Instalēt KDE tēmu
+Name[mk]=Инсталирај KDE Тема
+Name[ms]=Pasang Tema KDE
+Name[mt]=Installa Tema KDE
+Name[nb]=Legg inn KDE-tema
+Name[nds]=KDE-Muster installeren
+Name[ne]=KDE विषयवस्तु स्थापना गर्नुहोस्
+Name[nl]=KDE-thema installeren
+Name[nn]=Installer KDE-tema
+Name[pa]=KDE ਸਰੂਪ ਇੰਸਟਾਲ
+Name[pl]=Instaluj motyw KDE
+Name[pt]=Instalar um Tema do KDE
+Name[pt_BR]=Instalar Tema do KDE
+Name[ro]=Instalează tematică KDE
+Name[ru]=Установка тем KDE
+Name[rw]=Kwinjiza Insanganyamatsiko KDE
+Name[se]=Sajáiduhte KDE-fáttá
+Name[sk]=Inštalovať tému KDE
+Name[sl]=Namesti temo KDE
+Name[sr]=Инсталирај KDE тему
+Name[sr@Latn]=Instaliraj KDE temu
+Name[sv]=Installera KDE-tema
+Name[ta]=KDE பொருளை நிறுவு
+Name[tg]=Мавзӯъи KDE сабт кунед
+Name[th]=ติดตั้งชุดตกแต่ง KDE
+Name[tr]=KDE Teması Yükle
+Name[tt]=KDE Tışlaw quyu
+Name[uk]=Встановлення теми KDE
+Name[uz]=KDE mavzusini oʻrnatish
+Name[uz@cyrillic]=KDE мавзусини ўрнатиш
+Name[vi]=Cài đặt Sắc thái KDE
+Name[wa]=Astaler on tinme KDE
+Name[zh_CN]=安装 KDE 主题
+Name[zh_TW]=安裝 KDE 佈景
+MimeType=application/x-ktheme;
+Icon=kthememgr
+Type=Application
+NoDisplay=true
+Exec=kdeinstallktheme %f
diff --git a/kcontrol/kthememanager/kdeinstallktheme b/kcontrol/kthememanager/kdeinstallktheme
new file mode 100755
index 000000000..b606fe16b
--- /dev/null
+++ b/kcontrol/kthememanager/kdeinstallktheme
@@ -0,0 +1,14 @@
+#!/bin/sh
+# Installs a KDE theme (into the user's theme dir)
+appsdir=`kde-config --path data | sed -e 's/:.*//'`
+themedir=$appsdir"/kthememanager/themes/"`basename "$1" ".kth"`
+if test -n "$appsdir"; then
+ test -d "$themedir" || mkdir -p "$themedir"
+ #echo "$themedir"
+ cp -f "$1" "$themedir"
+ cd "$themedir"
+ tarball=`basename "$1"`
+ #echo $tarball
+ tar xzf "$tarball"
+ rm -f "$tarball"
+fi
diff --git a/kcontrol/kthememanager/knewthemedlg.cpp b/kcontrol/kthememanager/knewthemedlg.cpp
new file mode 100644
index 000000000..1514ed453
--- /dev/null
+++ b/kcontrol/kthememanager/knewthemedlg.cpp
@@ -0,0 +1,96 @@
+// -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
+/* Copyright (C) 2003 Lukas Tinkl <lukas@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include "knewthemedlg.h"
+#include "newthemewidget.h"
+
+#include <qlineedit.h>
+#include <qtextedit.h>
+
+#include <klocale.h>
+
+KNewThemeDlg::KNewThemeDlg( QWidget * parent, const char * name )
+ : KDialogBase(parent, name, true, i18n("New Theme"), Ok|Cancel, Ok)
+{
+ m_base = new NewThemeWidget( this, "new_theme_base" );
+ setMainWidget( m_base );
+ connect( m_base->leName, SIGNAL( textChanged ( const QString & ) ), this, SLOT( slotThemeNameChanged( const QString & ) ) );
+ slotThemeNameChanged( m_base->leName->text() );
+}
+
+KNewThemeDlg::~KNewThemeDlg()
+{
+ delete m_base;
+}
+
+void KNewThemeDlg::slotThemeNameChanged( const QString &_text )
+{
+ enableButtonOK( !_text.isEmpty() );
+}
+
+QString KNewThemeDlg::getName() const
+{
+ return m_base->leName->text();
+}
+
+QString KNewThemeDlg::getAuthor() const
+{
+ return m_base->leAuthor->text();
+}
+
+QString KNewThemeDlg::getEmail() const
+{
+ return m_base->leEmail->text();
+}
+
+QString KNewThemeDlg::getHomepage() const
+{
+ return m_base->leHomepage->text();
+}
+
+QString KNewThemeDlg::getComment() const
+{
+ return m_base->teComment->text();
+}
+
+QString KNewThemeDlg::getVersion() const
+{
+ return m_base->leVersion->text();
+}
+
+void KNewThemeDlg::setAuthor( const QString & author )
+{
+ m_base->leAuthor->setText( author );
+}
+
+void KNewThemeDlg::setEmail( const QString & email )
+{
+ m_base->leEmail->setText( email );
+}
+
+void KNewThemeDlg::setVersion( const QString & version )
+{
+ m_base->leVersion->setText( version );
+}
+
+void KNewThemeDlg::setName( const QString & name )
+{
+ m_base->leName->setText( name );
+}
+
+#include "knewthemedlg.moc"
diff --git a/kcontrol/kthememanager/knewthemedlg.h b/kcontrol/kthememanager/knewthemedlg.h
new file mode 100644
index 000000000..52fd0816f
--- /dev/null
+++ b/kcontrol/kthememanager/knewthemedlg.h
@@ -0,0 +1,58 @@
+// -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
+/* Copyright (C) 2003 Lukas Tinkl <lukas@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#ifndef KNEWTHEMEDLG_H
+#define KNEWTHEMEDLG_H
+
+#include <qstring.h>
+
+#include <kdialogbase.h>
+
+class NewThemeWidget;
+
+/**
+ * Dialog for creating new themes, contains just
+ * getters and setters used for the theme general properties
+ * @author Lukas Tinkl <lukas@kde.org>
+ */
+class KNewThemeDlg: public KDialogBase
+{
+ Q_OBJECT
+public:
+ KNewThemeDlg( QWidget * parent = 0, const char * name = 0);
+ ~KNewThemeDlg();
+
+ QString getName() const;
+ QString getAuthor() const;
+ QString getEmail() const;
+ QString getHomepage() const;
+ QString getComment() const;
+ QString getVersion() const;
+
+ void setName( const QString & name );
+ void setAuthor( const QString & author );
+ void setEmail( const QString & email );
+ void setVersion( const QString & version );
+private:
+ NewThemeWidget * m_base;
+
+private slots:
+ void slotThemeNameChanged( const QString &_text );
+};
+
+#endif
diff --git a/kcontrol/kthememanager/ktheme.cpp b/kcontrol/kthememanager/ktheme.cpp
new file mode 100644
index 000000000..241aac132
--- /dev/null
+++ b/kcontrol/kthememanager/ktheme.cpp
@@ -0,0 +1,897 @@
+// -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
+/* Copyright (C) 2003 Lukas Tinkl <lukas@kde.org>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include "ktheme.h"
+
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qregexp.h>
+#include <qtextstream.h>
+#include <qdir.h>
+
+#include <dcopclient.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdatastream.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kio/job.h>
+#include <kio/netaccess.h>
+#include <kipc.h>
+#include <klocale.h>
+#include <kservice.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+#include <ktar.h>
+#include <kstyle.h>
+
+KTheme::KTheme( QWidget *parent, const QString & xmlFile )
+ : m_parent(parent)
+{
+ QFile file( xmlFile );
+ file.open( IO_ReadOnly );
+ m_dom.setContent( file.readAll() );
+ file.close();
+
+ //kdDebug() << m_dom.toString( 2 ) << endl;
+
+ setName( QFileInfo( file ).baseName() );
+ m_kgd = KGlobal::dirs();
+}
+
+KTheme::KTheme( QWidget *parent, bool create )
+ : m_parent(parent)
+{
+ if ( create )
+ {
+ m_dom = QDomDocument( "ktheme" );
+
+ m_root = m_dom.createElement( "ktheme" );
+ m_root.setAttribute( "version", SYNTAX_VERSION );
+ m_dom.appendChild( m_root );
+
+ m_general = m_dom.createElement( "general" );
+ m_root.appendChild( m_general );
+ }
+
+ m_kgd = KGlobal::dirs();
+}
+
+KTheme::~KTheme()
+{
+}
+
+void KTheme::setName( const QString & name )
+{
+ m_name = name;
+}
+
+bool KTheme::load( const KURL & url )
+{
+ kdDebug() << "Loading theme from URL: " << url << endl;
+
+ QString tmpFile;
+ if ( !KIO::NetAccess::download( url, tmpFile, 0L ) )
+ return false;
+
+ kdDebug() << "Theme is in temp file: " << tmpFile << endl;
+
+ // set theme's name
+ setName( QFileInfo( url.fileName() ).baseName() );
+
+ // unpack the tarball
+ QString location = m_kgd->saveLocation( "themes", m_name + "/" );
+ KTar tar( tmpFile );
+ tar.open( IO_ReadOnly );
+ tar.directory()->copyTo( location );
+ tar.close();
+
+ // create the DOM
+ QFile file( location + m_name + ".xml" );
+ file.open( IO_ReadOnly );
+ m_dom.setContent( file.readAll() );
+ file.close();
+
+ // remove the temp file
+ KIO::NetAccess::removeTempFile( tmpFile );
+
+ return true;
+}
+
+QString KTheme::createYourself( bool pack )
+{
+ // start with empty dir for orig theme
+ if ( !pack )
+ KTheme::remove( name() );
+
+ // 1. General stuff set by methods setBlah()
+
+ // 2. Background theme
+ KConfig * globalConf = KGlobal::config();
+
+ KConfig kwinConf( "kwinrc", true );
+ kwinConf.setGroup( "Desktops" );
+ uint numDesktops = kwinConf.readUnsignedNumEntry( "Number", 4 );
+
+ KConfig desktopConf( "kdesktoprc", true );
+ desktopConf.setGroup( "Background Common" );
+ bool common = desktopConf.readBoolEntry( "CommonDesktop", true );
+
+ for ( uint i=0; i < numDesktops-1; i++ )
+ {
+ QDomElement desktopElem = m_dom.createElement( "desktop" );
+ desktopElem.setAttribute( "number", i );
+ desktopElem.setAttribute( "common", common );
+
+ desktopConf.setGroup( "Desktop" + QString::number( i ) );
+
+ QDomElement modeElem = m_dom.createElement( "mode" );
+ modeElem.setAttribute( "id", desktopConf.readEntry( "BackgroundMode", "Flat" ) );
+ desktopElem.appendChild( modeElem );
+
+ QDomElement c1Elem = m_dom.createElement( "color1" );
+ c1Elem.setAttribute( "rgb", desktopConf.readColorEntry( "Color1" ).name() );
+ desktopElem.appendChild( c1Elem );
+
+ QDomElement c2Elem = m_dom.createElement( "color2" );
+ c2Elem.setAttribute( "rgb", desktopConf.readColorEntry( "Color2" ).name() );
+ desktopElem.appendChild( c2Elem );
+
+ QDomElement blendElem = m_dom.createElement( "blending" );
+ blendElem.setAttribute( "mode", desktopConf.readEntry( "BlendMode", QString( "NoBlending" ) ) );
+ blendElem.setAttribute( "balance", desktopConf.readEntry( "BlendBalance", QString::number( 100 ) ) );
+ blendElem.setAttribute( "reverse", desktopConf.readBoolEntry( "ReverseBlending", false ) );
+ desktopElem.appendChild( blendElem );
+
+ QDomElement patElem = m_dom.createElement( "pattern" );
+ patElem.setAttribute( "name", desktopConf.readEntry( "Pattern" ) );
+ desktopElem.appendChild( patElem );
+
+ QDomElement wallElem = m_dom.createElement( "wallpaper" );
+ wallElem.setAttribute( "url", processFilePath( "desktop", desktopConf.readPathEntry( "Wallpaper" ) ) );
+ wallElem.setAttribute( "mode", desktopConf.readEntry( "WallpaperMode" ) );
+ desktopElem.appendChild( wallElem );
+
+ // TODO handle multi wallpapers (aka slideshow)
+
+ m_root.appendChild( desktopElem );
+
+ if ( common ) // generate only one node
+ break;
+ }
+
+ // 11. Screensaver
+ desktopConf.setGroup( "ScreenSaver" );
+ QDomElement saverElem = m_dom.createElement( "screensaver" );
+ saverElem.setAttribute( "name", desktopConf.readEntry( "Saver" ) );
+ m_root.appendChild( saverElem );
+
+ // 3. Icons
+ globalConf->setGroup( "Icons" );
+ QDomElement iconElem = m_dom.createElement( "icons" );
+ iconElem.setAttribute( "name", globalConf->readEntry( "Theme",KIconTheme::current() ) );
+ createIconElems( "DesktopIcons", "desktop", iconElem, globalConf );
+ createIconElems( "MainToolbarIcons", "mainToolbar", iconElem, globalConf );
+ createIconElems( "PanelIcons", "panel", iconElem, globalConf );
+ createIconElems( "SmallIcons", "small", iconElem, globalConf );
+ createIconElems( "ToolbarIcons", "toolbar", iconElem, globalConf );
+ m_root.appendChild( iconElem );
+
+ // 4. Sounds
+ // 4.1 Global sounds
+ KConfig * soundConf = new KConfig( "knotify.eventsrc", true );
+ QStringList stdEvents;
+ stdEvents << "cannotopenfile" << "catastrophe" << "exitkde" << "fatalerror"
+ << "notification" << "printerror" << "startkde" << "warning"
+ << "messageCritical" << "messageInformation" << "messageWarning"
+ << "messageboxQuestion";
+
+ // 4.2 KWin sounds
+ KConfig * kwinSoundConf = new KConfig( "kwin.eventsrc", true );
+ QStringList kwinEvents;
+ kwinEvents << "activate" << "close" << "delete" <<
+ "desktop1" << "desktop2" << "desktop3" << "desktop4" <<
+ "desktop5" << "desktop6" << "desktop7" << "desktop8" <<
+ "maximize" << "minimize" << "moveend" << "movestart" <<
+ "new" << "not_on_all_desktops" << "on_all_desktops" <<
+ "resizeend" << "resizestart" << "shadedown" << "shadeup" <<
+ "transdelete" << "transnew" << "unmaximize" << "unminimize";
+
+ QDomElement soundsElem = m_dom.createElement( "sounds" );
+ createSoundList( stdEvents, "global", soundsElem, soundConf );
+ createSoundList( kwinEvents, "kwin", soundsElem, kwinSoundConf );
+ m_root.appendChild( soundsElem );
+ delete soundConf;
+ delete kwinSoundConf;
+
+
+ // 5. Colors
+ QDomElement colorsElem = m_dom.createElement( "colors" );
+ globalConf->setGroup( "KDE" );
+ colorsElem.setAttribute( "contrast", globalConf->readNumEntry( "contrast", 7 ) );
+ QStringList stdColors;
+ stdColors << "background" << "selectBackground" << "foreground" << "windowForeground"
+ << "windowBackground" << "selectForeground" << "buttonBackground"
+ << "buttonForeground" << "linkColor" << "visitedLinkColor" << "alternateBackground";
+
+ globalConf->setGroup( "General" );
+ for ( QStringList::Iterator it = stdColors.begin(); it != stdColors.end(); ++it )
+ createColorElem( ( *it ), "global", colorsElem, globalConf );
+
+ QStringList kwinColors;
+ kwinColors << "activeForeground" << "inactiveBackground" << "inactiveBlend" << "activeBackground"
+ << "activeBlend" << "inactiveForeground" << "activeTitleBtnBg" << "inactiveTitleBtnBg"
+ << "frame" << "inactiveFrame" << "handle" << "inactiveHandle";
+ globalConf->setGroup( "WM" );
+ for ( QStringList::Iterator it = kwinColors.begin(); it != kwinColors.end(); ++it )
+ createColorElem( ( *it ), "kwin", colorsElem, globalConf );
+
+ m_root.appendChild( colorsElem );
+
+ // 6. Cursors
+ KConfig* mouseConf = new KConfig( "kcminputrc", true );
+ mouseConf->setGroup( "Mouse" );
+ QDomElement cursorsElem = m_dom.createElement( "cursors" );
+ cursorsElem.setAttribute( "name", mouseConf->readEntry( "cursorTheme" ) );
+ m_root.appendChild( cursorsElem );
+ delete mouseConf;
+ // TODO copy the cursor theme?
+
+ // 7. KWin
+ kwinConf.setGroup( "Style" );
+ QDomElement wmElem = m_dom.createElement( "wm" );
+ wmElem.setAttribute( "name", kwinConf.readEntry( "PluginLib" ) );
+ wmElem.setAttribute( "type", "builtin" ); // TODO support pixmap themes when the kwin client gets ported
+ if ( kwinConf.readBoolEntry( "CustomButtonPositions" ) )
+ {
+ QDomElement buttonsElem = m_dom.createElement( "buttons" );
+ buttonsElem.setAttribute( "left", kwinConf.readEntry( "ButtonsOnLeft" ) );
+ buttonsElem.setAttribute( "right", kwinConf.readEntry( "ButtonsOnRight" ) );
+ wmElem.appendChild( buttonsElem );
+ }
+ QDomElement borderElem = m_dom.createElement( "border" );
+ borderElem.setAttribute( "size", kwinConf.readNumEntry( "BorderSize", 1 ) );
+ wmElem.appendChild( borderElem );
+ m_root.appendChild( wmElem );
+
+ // 8. Konqueror
+ KConfig konqConf( "konquerorrc", true );
+ konqConf.setGroup( "Settings" );
+ QDomElement konqElem = m_dom.createElement( "konqueror" );
+ QDomElement konqWallElem = m_dom.createElement( "wallpaper" );
+ QString bgImagePath = konqConf.readPathEntry( "BgImage" );
+ konqWallElem.setAttribute( "url", processFilePath( "konqueror", bgImagePath ) );
+ konqElem.appendChild( konqWallElem );
+ QDomElement konqBgColorElem = m_dom.createElement( "bgcolor" );
+ konqBgColorElem.setAttribute( "rgb", konqConf.readColorEntry( "BgColor" ).name() );
+ konqElem.appendChild( konqBgColorElem );
+ m_root.appendChild( konqElem );
+
+ // 9. Kicker (aka KDE Panel)
+ KConfig kickerConf( "kickerrc", true );
+ kickerConf.setGroup( "General" );
+
+ QDomElement panelElem = m_dom.createElement( "panel" );
+
+ if ( kickerConf.readBoolEntry( "UseBackgroundTheme" ) )
+ {
+ QDomElement backElem = m_dom.createElement( "background" );
+ QString kbgPath = kickerConf.readPathEntry( "BackgroundTheme" );
+ backElem.setAttribute( "url", processFilePath( "panel", kbgPath ) );
+ backElem.setAttribute( "colorize", kickerConf.readBoolEntry( "ColorizeBackground" ) );
+ panelElem.appendChild( backElem );
+ }
+
+ QDomElement transElem = m_dom.createElement( "transparent" );
+ transElem.setAttribute( "value", kickerConf.readBoolEntry( "Transparent" ) );
+ panelElem.appendChild( transElem );
+
+ QDomElement posElem = m_dom.createElement( "position" );
+ posElem.setAttribute( "value", kickerConf.readEntry( "Position" ) );
+ panelElem.appendChild( posElem );
+
+
+ QDomElement showLeftHideButtonElem = m_dom.createElement( "showlefthidebutton" );
+ showLeftHideButtonElem.setAttribute( "value", kickerConf.readBoolEntry( "ShowLeftHideButton" ) );
+ panelElem.appendChild( showLeftHideButtonElem );
+
+ QDomElement showRightHideButtonElem = m_dom.createElement( "showrighthidebutton" );
+ showRightHideButtonElem.setAttribute( "value", kickerConf.readBoolEntry( "ShowRightHideButton" ) );
+ panelElem.appendChild( showRightHideButtonElem );
+
+
+
+ m_root.appendChild( panelElem );
+
+ // 10. Widget style
+ globalConf->setGroup( "General" );
+ QDomElement widgetsElem = m_dom.createElement( "widgets" );
+ widgetsElem.setAttribute( "name", globalConf->readEntry( "widgetStyle",KStyle::defaultStyle() ) );
+ m_root.appendChild( widgetsElem );
+
+ // 12.
+ QDomElement fontsElem = m_dom.createElement( "fonts" );
+ QStringList fonts;
+ fonts << "General" << "font"
+ << "General" << "fixed"
+ << "General" << "toolBarFont"
+ << "General" << "menuFont"
+ << "WM" << "activeFont"
+ << "General" << "taskbarFont"
+ << "FMSettings" << "StandardFont";
+
+ for ( QStringList::Iterator it = fonts.begin(); it != fonts.end(); ++it ) {
+ QString group = *it; ++it;
+ QString key = *it;
+ QString value;
+
+ if ( group == "FMSettings" ) {
+ desktopConf.setGroup( group );
+ value = desktopConf.readEntry( key );
+ }
+ else {
+ globalConf->setGroup( group );
+ value = globalConf->readEntry( key );
+ }
+ QDomElement fontElem = m_dom.createElement( key );
+ fontElem.setAttribute( "object", group );
+ fontElem.setAttribute( "value", value );
+ fontsElem.appendChild( fontElem );
+ }
+ m_root.appendChild( fontsElem );
+
+ // Save the XML
+ QFile file( m_kgd->saveLocation( "themes", m_name + "/" ) + m_name + ".xml" );
+ if ( file.open( IO_WriteOnly ) ) {
+ QTextStream stream( &file );
+ m_dom.save( stream, 2 );
+ file.close();
+ }
+
+ QString result;
+ if ( pack )
+ {
+ // Pack the whole theme
+ KTar tar( m_kgd->saveLocation( "themes" ) + m_name + ".kth", "application/x-gzip" );
+ tar.open( IO_WriteOnly );
+
+ kdDebug() << "Packing everything under: " << m_kgd->saveLocation( "themes", m_name + "/" ) << endl;
+
+ if ( tar.addLocalDirectory( m_kgd->saveLocation( "themes", m_name + "/" ), QString::null ) )
+ result = tar.fileName();
+
+ tar.close();
+ }
+
+ //kdDebug() << m_dom.toString( 2 ) << endl;
+
+ return result;
+}
+
+void KTheme::apply()
+{
+ kdDebug() << "Going to apply theme: " << m_name << endl;
+
+ QString themeDir = m_kgd->findResourceDir( "themes", m_name + "/" + m_name + ".xml") + m_name + "/";
+ kdDebug() << "Theme dir: " << themeDir << endl;
+
+ // 2. Background theme
+
+ QDomNodeList desktopList = m_dom.elementsByTagName( "desktop" );
+ KConfig desktopConf( "kdesktoprc" );
+ desktopConf.setGroup( "Background Common" );
+
+ for ( uint i = 0; i <= desktopList.count(); i++ )
+ {
+ QDomElement desktopElem = desktopList.item( i ).toElement();
+ if ( !desktopElem.isNull() )
+ {
+ // TODO optimize, don't write several times the common section
+ bool common = static_cast<bool>( desktopElem.attribute( "common", "true" ).toUInt() );
+ desktopConf.writeEntry( "CommonDesktop", common );
+ desktopConf.writeEntry( "DeskNum", desktopElem.attribute( "number", "0" ).toUInt() );
+
+ desktopConf.setGroup( QString( "Desktop%1" ).arg( i ) );
+ desktopConf.writeEntry( "BackgroundMode", getProperty( desktopElem, "mode", "id" ) );
+ desktopConf.writeEntry( "Color1", QColor( getProperty( desktopElem, "color1", "rgb" ) ) );
+ desktopConf.writeEntry( "Color2", QColor( getProperty( desktopElem, "color2", "rgb" ) ) );
+ desktopConf.writeEntry( "BlendMode", getProperty( desktopElem, "blending", "mode" ) );
+ desktopConf.writeEntry( "BlendBalance", getProperty( desktopElem, "blending", "balance" ) );
+ desktopConf.writeEntry( "ReverseBlending",
+ static_cast<bool>( getProperty( desktopElem, "blending", "reverse" ).toUInt() ) );
+ desktopConf.writeEntry( "Pattern", getProperty( desktopElem, "pattern", "name" ) );
+ desktopConf.writeEntry( "Wallpaper",
+ unprocessFilePath( "desktop", getProperty( desktopElem, "wallpaper", "url" ) ) );
+ desktopConf.writeEntry( "WallpaperMode", getProperty( desktopElem, "wallpaper", "mode" ) );
+
+ if ( common )
+ break; // stop here
+ }
+ }
+
+ // 11. Screensaver
+ QDomElement saverElem = m_dom.elementsByTagName( "screensaver" ).item( 0 ).toElement();
+
+ if ( !saverElem.isNull() )
+ {
+ desktopConf.setGroup( "ScreenSaver" );
+ desktopConf.writeEntry( "Saver", saverElem.attribute( "name" ) );
+ }
+
+ desktopConf.sync(); // TODO sync and signal only if <desktop> elem present
+ // reconfigure kdesktop. kdesktop will notify all clients
+ DCOPClient *client = kapp->dcopClient();
+ if ( !client->isAttached() )
+ client->attach();
+ client->send("kdesktop", "KBackgroundIface", "configure()", "");
+ // FIXME Xinerama
+
+ // 3. Icons
+ QDomElement iconElem = m_dom.elementsByTagName( "icons" ).item( 0 ).toElement();
+ if ( !iconElem.isNull() )
+ {
+ KConfig * iconConf = KGlobal::config();
+ iconConf->setGroup( "Icons" );
+ iconConf->writeEntry( "Theme", iconElem.attribute( "name", "crystalsvg" ), true, true );
+
+ QDomNodeList iconList = iconElem.childNodes();
+ for ( uint i = 0; i < iconList.count(); i++ )
+ {
+ QDomElement iconSubElem = iconList.item( i ).toElement();
+ QString object = iconSubElem.attribute( "object" );
+ if ( object == "desktop" )
+ iconConf->setGroup( "DesktopIcons" );
+ else if ( object == "mainToolbar" )
+ iconConf->setGroup( "MainToolbarIcons" );
+ else if ( object == "panel" )
+ iconConf->setGroup( "PanelIcons" );
+ else if ( object == "small" )
+ iconConf->setGroup( "SmallIcons" );
+ else if ( object == "toolbar" )
+ iconConf->setGroup( "ToolbarIcons" );
+
+ QString iconName = iconSubElem.tagName();
+ if ( iconName.contains( "Color" ) )
+ {
+ QColor iconColor = QColor( iconSubElem.attribute( "rgb" ) );
+ iconConf->writeEntry( iconName, iconColor, true, true );
+ }
+ else if ( iconName.contains( "Value" ) || iconName == "Size" )
+ iconConf->writeEntry( iconName, iconSubElem.attribute( "value" ).toUInt(), true, true );
+ else if ( iconName.contains( "Effect" ) )
+ iconConf->writeEntry( iconName, iconSubElem.attribute( "name" ), true, true );
+ else
+ iconConf->writeEntry( iconName, static_cast<bool>( iconSubElem.attribute( "value" ).toUInt() ), true, true );
+ }
+ iconConf->sync();
+
+ for ( int i = 0; i < KIcon::LastGroup; i++ )
+ KIPC::sendMessageAll( KIPC::IconChanged, i );
+ KService::rebuildKSycoca( m_parent );
+ }
+
+ // 4. Sounds
+ QDomElement soundsElem = m_dom.elementsByTagName( "sounds" ).item( 0 ).toElement();
+ if ( !soundsElem.isNull() )
+ {
+ KConfig soundConf( "knotify.eventsrc" );
+ KConfig kwinSoundConf( "kwin.eventsrc" );
+ QDomNodeList eventList = soundsElem.elementsByTagName( "event" );
+ for ( uint i = 0; i < eventList.count(); i++ )
+ {
+ QDomElement eventElem = eventList.item( i ).toElement();
+ QString object = eventElem.attribute( "object" );
+
+ if ( object == "global" )
+ {
+ soundConf.setGroup( eventElem.attribute( "name" ) );
+ soundConf.writeEntry( "soundfile", unprocessFilePath( "sounds", eventElem.attribute( "url" ) ) );
+ soundConf.writeEntry( "presentation", soundConf.readNumEntry( "presentation" ) | 1 );
+ }
+ else if ( object == "kwin" )
+ {
+ kwinSoundConf.setGroup( eventElem.attribute( "name" ) );
+ kwinSoundConf.writeEntry( "soundfile", unprocessFilePath( "sounds", eventElem.attribute( "url" ) ) );
+ kwinSoundConf.writeEntry( "presentation", soundConf.readNumEntry( "presentation" ) | 1 );
+ }
+ }
+
+ soundConf.sync();
+ kwinSoundConf.sync();
+ client->send("knotify", "", "reconfigure()", "");
+ // TODO signal kwin sounds change?
+ }
+
+ // 5. Colors
+ QDomElement colorsElem = m_dom.elementsByTagName( "colors" ).item( 0 ).toElement();
+
+ if ( !colorsElem.isNull() )
+ {
+ QDomNodeList colorList = colorsElem.childNodes();
+ KConfig * colorConf = KGlobal::config();
+
+ QString sCurrentScheme = locateLocal("data", "kdisplay/color-schemes/thememgr.kcsrc");
+ KSimpleConfig *colorScheme = new KSimpleConfig( sCurrentScheme );
+ colorScheme->setGroup("Color Scheme" );
+
+ for ( uint i = 0; i < colorList.count(); i++ )
+ {
+ QDomElement colorElem = colorList.item( i ).toElement();
+ QString object = colorElem.attribute( "object" );
+ if ( object == "global" )
+ colorConf->setGroup( "General" );
+ else if ( object == "kwin" )
+ colorConf->setGroup( "WM" );
+
+ QString colName = colorElem.tagName();
+ QColor curColor = QColor( colorElem.attribute( "rgb" ) );
+ colorConf->writeEntry( colName, curColor, true, true ); // kdeglobals
+ colorScheme->writeEntry( colName, curColor ); // thememgr.kcsrc
+ }
+
+ colorConf->setGroup( "KDE" );
+ colorConf->writeEntry( "colorScheme", "thememgr.kcsrc", true, true );
+ colorConf->writeEntry( "contrast", colorsElem.attribute( "contrast", "7" ), true, true );
+ colorScheme->writeEntry( "contrast", colorsElem.attribute( "contrast", "7" ) );
+ colorConf->sync();
+ delete colorScheme;
+
+ KIPC::sendMessageAll( KIPC::PaletteChanged );
+ }
+
+ // 6.Cursors
+ QDomElement cursorsElem = m_dom.elementsByTagName( "cursors" ).item( 0 ).toElement();
+
+ if ( !cursorsElem.isNull() )
+ {
+ KConfig mouseConf( "kcminputrc" );
+ mouseConf.setGroup( "Mouse" );
+ mouseConf.writeEntry( "cursorTheme", cursorsElem.attribute( "name" ));
+ // FIXME is there a way to notify KDE of cursor changes?
+ }
+
+ // 7. KWin
+ QDomElement wmElem = m_dom.elementsByTagName( "wm" ).item( 0 ).toElement();
+
+ if ( !wmElem.isNull() )
+ {
+ KConfig kwinConf( "kwinrc" );
+ kwinConf.setGroup( "Style" );
+ QString type = wmElem.attribute( "type" );
+ if ( type == "builtin" )
+ kwinConf.writeEntry( "PluginLib", wmElem.attribute( "name" ) );
+ //else // TODO support custom themes
+ QDomNodeList buttons = wmElem.elementsByTagName ("buttons");
+ if ( buttons.count() > 0 )
+ {
+ kwinConf.writeEntry( "CustomButtonPositions", true );
+ kwinConf.writeEntry( "ButtonsOnLeft", getProperty( wmElem, "buttons", "left" ) );
+ kwinConf.writeEntry( "ButtonsOnRight", getProperty( wmElem, "buttons", "right" ) );
+ }
+ else
+ {
+ kwinConf.writeEntry( "CustomButtonPositions", false );
+ }
+ kwinConf.writeEntry( "BorderSize", getProperty( wmElem, "border", "size" ) );
+
+ kwinConf.sync();
+ client->send( "kwin", "", "reconfigure()", "" );
+ }
+
+ // 8. Konqueror
+ QDomElement konqElem = m_dom.elementsByTagName( "konqueror" ).item( 0 ).toElement();
+
+ if ( !konqElem.isNull() )
+ {
+ KConfig konqConf( "konquerorrc" );
+ konqConf.setGroup( "Settings" );
+ konqConf.writeEntry( "BgImage", unprocessFilePath( "konqueror", getProperty( konqElem, "wallpaper", "url" ) ) );
+ konqConf.writeEntry( "BgColor", QColor( getProperty( konqElem, "bgcolor", "rgb" ) ) );
+
+ konqConf.sync();
+ client->send("konqueror*", "KonquerorIface", "reparseConfiguration()", ""); // FIXME seems not to work :(
+ }
+
+ // 9. Kicker
+ QDomElement panelElem = m_dom.elementsByTagName( "panel" ).item( 0 ).toElement();
+
+ if ( !panelElem.isNull() )
+ {
+ KConfig kickerConf( "kickerrc" );
+ kickerConf.setGroup( "General" );
+ QString kickerBgUrl = getProperty( panelElem, "background", "url" );
+ if ( !kickerBgUrl.isEmpty() )
+ {
+ kickerConf.writeEntry( "UseBackgroundTheme", true );
+ kickerConf.writeEntry( "BackgroundTheme", unprocessFilePath( "panel", kickerBgUrl ) );
+ kickerConf.writeEntry( "ColorizeBackground",
+ static_cast<bool>( getProperty( panelElem, "background", "colorize" ).toUInt() ) );
+ }
+ kickerConf.writeEntry( "Transparent",
+ static_cast<bool>( getProperty( panelElem, "transparent", "value" ).toUInt() ) );
+
+ kickerConf.writeEntry( "Position", static_cast<int> (getProperty( panelElem, "position", "value" ).toUInt() ));
+
+ kickerConf.writeEntry( "ShowLeftHideButton", static_cast<bool>( getProperty( panelElem, "showlefthidebutton", "value").toInt()));
+
+ kickerConf.writeEntry( "ShowRightHideButton", static_cast<bool>( getProperty( panelElem, "showrighthidebutton", "value").toInt()));
+
+ kickerConf.sync();
+ client->send("kicker", "Panel", "configure()", "");
+ }
+
+ // 10. Widget style
+ QDomElement widgetsElem = m_dom.elementsByTagName( "widgets" ).item( 0 ).toElement();
+
+ if ( !widgetsElem.isNull() )
+ {
+ KConfig * widgetConf = KGlobal::config();
+ widgetConf->setGroup( "General" );
+ widgetConf->writeEntry( "widgetStyle", widgetsElem.attribute( "name" ), true, true );
+ widgetConf->sync();
+ KIPC::sendMessageAll( KIPC::StyleChanged );
+ }
+
+ // 12. Fonts
+ QDomElement fontsElem = m_dom.elementsByTagName( "fonts" ).item( 0 ).toElement();
+ if ( !fontsElem.isNull() )
+ {
+ KConfig * fontsConf = KGlobal::config();
+ KConfig * kde1xConf = new KSimpleConfig( QDir::homeDirPath() + "/.kderc" );
+ kde1xConf->setGroup( "General" );
+
+ QDomNodeList fontList = fontsElem.childNodes();
+ for ( uint i = 0; i < fontList.count(); i++ )
+ {
+ QDomElement fontElem = fontList.item( i ).toElement();
+ QString fontName = fontElem.tagName();
+ QString fontValue = fontElem.attribute( "value" );
+ QString fontObject = fontElem.attribute( "object" );
+
+ if ( fontObject == "FMSettings" ) {
+ desktopConf.setGroup( fontObject );
+ desktopConf.writeEntry( fontName, fontValue, true, true );
+ desktopConf.sync();
+ }
+ else {
+ fontsConf->setGroup( fontObject );
+ fontsConf->writeEntry( fontName, fontValue, true, true );
+ }
+ kde1xConf->writeEntry( fontName, fontValue, true, true );
+ }
+
+ fontsConf->sync();
+ kde1xConf->sync();
+ KIPC::sendMessageAll( KIPC::FontChanged );
+ }
+
+}
+
+bool KTheme::remove( const QString & name )
+{
+ kdDebug() << "Going to remove theme: " << name << endl;
+ return KIO::NetAccess::del( KGlobal::dirs()->saveLocation( "themes", name + "/" ), 0L );
+}
+
+void KTheme::setProperty( const QString & name, const QString & value, QDomElement parent )
+{
+ QDomElement tmp = m_dom.createElement( name );
+ tmp.setAttribute( "value", value );
+ parent.appendChild( tmp );
+}
+
+QString KTheme::getProperty( const QString & name ) const
+{
+ QDomNodeList _list = m_dom.elementsByTagName( name );
+ if ( _list.count() != 0 )
+ return _list.item( 0 ).toElement().attribute( "value" );
+ else
+ {
+ kdWarning() << "Found no such property: " << name << endl;
+ return QString::null;
+ }
+}
+
+QString KTheme::getProperty( QDomElement parent, const QString & tag,
+ const QString & attr ) const
+{
+ QDomNodeList _list = parent.elementsByTagName( tag );
+
+ if ( _list.count() != 0 )
+ return _list.item( 0 ).toElement().attribute( attr );
+ else
+ {
+ kdWarning() << QString( "No such property found: %1->%2->%3" )
+ .arg( parent.tagName() ).arg( tag ).arg( attr ) << endl;
+ return QString::null;
+ }
+}
+
+void KTheme::createIconElems( const QString & group, const QString & object,
+ QDomElement parent, KConfig * cfg )
+{
+ cfg->setGroup( group );
+ QStringList elemNames;
+ elemNames << "Animated" << "DoublePixels" << "Size"
+ << "ActiveColor" << "ActiveColor2" << "ActiveEffect"
+ << "ActiveSemiTransparent" << "ActiveValue"
+ << "DefaultColor" << "DefaultColor2" << "DefaultEffect"
+ << "DefaultSemiTransparent" << "DefaultValue"
+ << "DisabledColor" << "DisabledColor2" << "DisabledEffect"
+ << "DisabledSemiTransparent" << "DisabledValue";
+ for ( QStringList::ConstIterator it = elemNames.begin(); it != elemNames.end(); ++it ) {
+ if ( (*it).contains( "Color" ) )
+ createColorElem( *it, object, parent, cfg );
+ else
+ {
+ QDomElement tmpCol = m_dom.createElement( *it );
+ tmpCol.setAttribute( "object", object );
+
+ if ( (*it).contains( "Value" ) || *it == "Size" )
+ tmpCol.setAttribute( "value", cfg->readNumEntry( *it, 1 ) );
+ else if ( (*it).contains( "DisabledEffect" ) )
+ tmpCol.setAttribute( "name", cfg->readEntry( *it, "togray" ) );
+ else if ( (*it).contains( "Effect" ) )
+ tmpCol.setAttribute( "name", cfg->readEntry( *it, "none" ) );
+ else
+ tmpCol.setAttribute( "value", cfg->readBoolEntry( *it, false ) );
+ parent.appendChild( tmpCol );
+ }
+ }
+}
+
+void KTheme::createColorElem( const QString & name, const QString & object,
+ QDomElement parent, KConfig * cfg )
+{
+ QColor color = cfg->readColorEntry( name );
+ if ( color.isValid() )
+ {
+ QDomElement tmpCol = m_dom.createElement( name );
+ tmpCol.setAttribute( "rgb", color.name() );
+ tmpCol.setAttribute( "object", object );
+ parent.appendChild( tmpCol );
+ }
+}
+
+void KTheme::createSoundList( const QStringList & events, const QString & object,
+ QDomElement parent, KConfig * cfg )
+{
+ for ( QStringList::ConstIterator it = events.begin(); it != events.end(); ++it )
+ {
+ QString group = ( *it );
+ if ( cfg->hasGroup( group ) )
+ {
+ cfg->setGroup( group );
+ QString soundURL = cfg->readPathEntry( "soundfile" );
+ int pres = cfg->readNumEntry( "presentation", 0 );
+ if ( !soundURL.isEmpty() && ( ( pres & 1 ) == 1 ) )
+ {
+ QDomElement eventElem = m_dom.createElement( "event" );
+ eventElem.setAttribute( "object", object );
+ eventElem.setAttribute( "name", group );
+ eventElem.setAttribute( "url", processFilePath( "sounds", soundURL ) );
+ parent.appendChild( eventElem );
+ }
+ }
+ }
+}
+
+QString KTheme::processFilePath( const QString & section, const QString & path )
+{
+ QFileInfo fi( path );
+
+ if ( fi.isRelative() )
+ fi.setFile( findResource( section, path ) );
+
+ kdDebug() << "Processing file: " << fi.absFilePath() << ", " << fi.fileName() << endl;
+
+ if ( section == "desktop" )
+ {
+ if ( copyFile( fi.absFilePath(), m_kgd->saveLocation( "themes", m_name + "/wallpapers/desktop/" ) + "/" + fi.fileName() ) )
+ return "theme:/wallpapers/desktop/" + fi.fileName();
+ }
+ else if ( section == "sounds" )
+ {
+ if ( copyFile( fi.absFilePath(), m_kgd->saveLocation( "themes", m_name + "/sounds/" ) + "/" + fi.fileName() ) )
+ return "theme:/sounds/" + fi.fileName();
+ }
+ else if ( section == "konqueror" )
+ {
+ if ( copyFile( fi.absFilePath(), m_kgd->saveLocation( "themes", m_name + "/wallpapers/konqueror/" ) + "/" + fi.fileName() ) )
+ return "theme:/wallpapers/konqueror/" + fi.fileName();
+ }
+ else if ( section == "panel" )
+ {
+ if ( copyFile( fi.absFilePath(), m_kgd->saveLocation( "themes", m_name + "/wallpapers/panel/" ) + "/" + fi.fileName() ) )
+ return "theme:/wallpapers/panel/" + fi.fileName();
+ }
+ else
+ kdWarning() << "Unsupported theme resource type" << endl;
+
+ return QString::null; // an error occured or the resource doesn't exist
+}
+
+QString KTheme::unprocessFilePath( const QString & section, QString path )
+{
+ if ( path.startsWith( "theme:/" ) )
+ return path.replace( QRegExp( "^theme:/" ), m_kgd->findResourceDir( "themes", m_name + "/" + m_name + ".xml") + m_name + "/" );
+
+ if ( QFile::exists( path ) )
+ return path;
+ else // try to find it in the system
+ return findResource( section, path );
+}
+
+void KTheme::setAuthor( const QString & author )
+{
+ setProperty( "author", author, m_general );
+}
+
+void KTheme::setEmail( const QString & email )
+{
+ setProperty( "email", email, m_general );
+}
+
+void KTheme::setHomepage( const QString & homepage )
+{
+ setProperty( "homepage", homepage, m_general );
+}
+
+void KTheme::setComment( const QString & comment )
+{
+ setProperty( "comment", comment, m_general );
+}
+
+void KTheme::setVersion( const QString & version )
+{
+ setProperty( "version", version, m_general );
+}
+
+void KTheme::addPreview()
+{
+ QString file = m_kgd->saveLocation( "themes", m_name + "/" ) + m_name + ".preview.png";
+ kdDebug() << "Adding preview: " << file << endl;
+ QPixmap snapshot = QPixmap::grabWindow( qt_xrootwin() );
+ snapshot.save( file, "PNG" );
+}
+
+bool KTheme::copyFile( const QString & from, const QString & to )
+{
+ // we overwrite b/c of restoring the "original" theme
+ return KIO::NetAccess::file_copy( from, to, -1, true /*overwrite*/ );
+}
+
+QString KTheme::findResource( const QString & section, const QString & path )
+{
+ if ( section == "desktop" )
+ return m_kgd->findResource( "wallpaper", path );
+ else if ( section == "sounds" )
+ return m_kgd->findResource( "sound", path );
+ else if ( section == "konqueror" )
+ return m_kgd->findResource( "data", "konqueror/tiles/" + path );
+ else if ( section == "panel" )
+ return m_kgd->findResource( "data", "kicker/wallpapers/" + path );
+ else
+ {
+ kdWarning() << "Requested unknown resource: " << section << endl;
+ return QString::null;
+ }
+}
diff --git a/kcontrol/kthememanager/ktheme.h b/kcontrol/kthememanager/ktheme.h
new file mode 100644
index 000000000..1401b49e7
--- /dev/null
+++ b/kcontrol/kthememanager/ktheme.h
@@ -0,0 +1,224 @@
+// -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
+/* Copyright (C) 2003 Lukas Tinkl <lukas@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#ifndef KTHEME_H
+#define KTHEME_H
+
+#include <qdom.h>
+#include <qguardedptr.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qwidget.h>
+
+#include <kurl.h>
+
+class KStandardDirs;
+class KConfig;
+
+/// defines the syntax version used by the XML
+#define SYNTAX_VERSION 1
+
+/**
+ * The base class representing a KDE theme. The data are stored internally
+ * in a DOM tree and accessed using the member methods.
+ *
+ * @brief Class representing a theme
+ * @author Lukas Tinkl <lukas@kde.org>
+ */
+class KTheme
+{
+public:
+ /**
+ * Constructs KTheme using an installed theme
+ * @param xmlFile The theme's XML file
+ */
+ KTheme( QWidget *parent, const QString & xmlFile );
+
+ /**
+ * Constructs an empty theme, to be used with
+ * #createYourself()
+ * @param create Whether to start the DOM tree
+ */
+ KTheme( QWidget *parent, bool create = false );
+
+ /**
+ * Destructor
+ */
+ ~KTheme();
+
+ /**
+ * Download from @p url, unpack the tarball and load the theme definition
+ *
+ * @return true on success
+ */
+ bool load( const KURL & url );
+
+ /**
+ * Creates a snapshot of the current configuration in the work directory
+ * (used for getting the defaults or to create a new user theme).
+ * @param pack Whether to also pack the theme in tar.gz format
+ * @return The path to the newly created tarball with theme (if @p pack == true)
+ */
+ QString createYourself( bool pack = false );
+
+ /**
+ * Apply the theme to the system, ie. set the config variables and
+ * adjust file paths
+ */
+ void apply();
+
+ /**
+ * Uninstall the theme from the system
+ * @param name The name of the theme
+ * @return true on success
+ */
+ static bool remove( const QString & name );
+
+ /**
+ * @return the theme name
+ */
+ QString name() const { return m_name; }
+ /**
+ * Set the theme name
+ */
+ void setName( const QString & name );
+
+ QString author() const {
+ return getProperty( "author" );
+ }
+ void setAuthor( const QString & author );
+
+ QString email() const {
+ return getProperty( "email" );
+ }
+ void setEmail( const QString & email );
+
+ QString homepage() const {
+ return getProperty( "homepage" );
+ }
+ void setHomepage( const QString & homepage );
+
+ QString comment() const {
+ return getProperty( "comment" );
+ }
+ void setComment ( const QString & comment );
+
+ QString version() const {
+ return getProperty( "version" );
+ }
+ void setVersion ( const QString & version );
+
+ /**
+ * Creates a preview file called theme_name.preview.png
+ * (i.e. takes a snapshot of the current desktop)
+ */
+ void addPreview();
+
+private:
+ /**
+ * Create a property with @p name, value @p value
+ * and append it to @p parent element
+ */
+ void setProperty( const QString & name,
+ const QString & value,
+ QDomElement parent );
+ /**
+ * Get a simple property from the "general" section of the DOM tree
+ */
+ QString getProperty( const QString & name ) const;
+
+ /**
+ * Get a property from the DOM tree, based on:
+ * @param parent Parent tag
+ * @param tag From the this tag
+ * @param attr From this attribute
+ */
+ QString getProperty( QDomElement parent, const QString & tag,
+ const QString & attr ) const;
+
+ /**
+ * Creates a list of "icon" elements based on:
+ * @param group The group in the KConfig object @p cfg
+ * @param object Specifier (similiar, but not identical to @p group)
+ * @param parent Parent element to append to
+ * @param cfg The KConfig object to work with
+ */
+ void createIconElems( const QString & group, const QString & object,
+ QDomElement parent, KConfig * cfg );
+
+ /**
+ * Creates a color DOM element @p name, with a specifier @p object,
+ * appends it to @p parent; used when creating themes
+ * @param cfg The KConfig object to work with
+ */
+ void createColorElem( const QString & name, const QString & object,
+ QDomElement parent, KConfig * cfg );
+ /**
+ * Creates a list of "event" elements based on:
+ * @param events The list of events to work on
+ * @param object Specifier (currently "global" or "kwin")
+ * @param parent Parent element to append to
+ * @param cfg The KConfig object to work with
+ */
+ void createSoundList( const QStringList & events, const QString & object,
+ QDomElement parent, KConfig * cfg );
+
+ /**
+ * Tries to find out absolute path to a resource and copy it to the theme's temp dir;
+ * used when creating themes
+ * @param section The theme section to work on, corresponds to toplevel XML tags
+ * @param path The original path, relative or absolute
+ * @return an internal path suitable for writing into the XML file or QString::null
+ * in case the resource couldn't be found
+ */
+ QString processFilePath( const QString & section, const QString & path );
+
+ /**
+ * Converts an internal theme:/ representation of a resource
+ * to a real path
+ */
+ QString unprocessFilePath( const QString & section, QString path );
+
+ /**
+ * Wrapper around KIO::NetAccess::file_copy
+ */
+ bool copyFile( const QString & from, const QString & to );
+
+ /**
+ * Wrapper around KGlobal::dirs()->findResource()
+ * @param section Section to work on (desktop, sounds, panel etc)
+ * @param path The file to find
+ */
+ QString findResource( const QString & section, const QString & path );
+
+ /// name of the theme
+ QString m_name;
+
+ /// DOM holding the theme
+ QDomDocument m_dom;
+ /// the DOM root element
+ QDomElement m_root;
+ /// "general" section
+ QDomElement m_general;
+
+ KStandardDirs * m_kgd;
+
+ QGuardedPtr<QWidget> m_parent;
+};
+
+#endif
diff --git a/kcontrol/kthememanager/kthemedlg.ui b/kcontrol/kthememanager/kthemedlg.ui
new file mode 100644
index 000000000..4b46fdc26
--- /dev/null
+++ b/kcontrol/kthememanager/kthemedlg.ui
@@ -0,0 +1,518 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KThemeDlg</class>
+<author>Lukas Tinkl &lt;lukas@kde.org&gt;</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KThemeDlg</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>687</width>
+ <height>382</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="text">
+ <string>Choose your visual KDE theme:</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>170</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KURLLabel">
+ <property name="name">
+ <cstring>lbGet</cstring>
+ </property>
+ <property name="text">
+ <string>Get new themes...</string>
+ </property>
+ <property name="url" stdset="0">
+ <string>http://themes.kde.org</string>
+ </property>
+ <property name="tipText">
+ <string>Go to the KDE themes website</string>
+ </property>
+ <property name="useTips">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="1" rowspan="4" colspan="1">
+ <property name="name">
+ <cstring>lbPreview</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>btnRemove</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove Theme</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="0">
+ <property name="name">
+ <cstring>btnCreate</cstring>
+ </property>
+ <property name="text">
+ <string>Create &amp;New Theme...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>btnInstall</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Install New Theme...</string>
+ </property>
+ </widget>
+ <widget class="QListView" row="0" column="0">
+ <column>
+ <property name="text">
+ <string>Theme</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>false</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>lvThemes</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="Line" row="2" column="0">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Customize your theme:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="4" column="0">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>btnBackground</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="usesTextLabel">
+ <bool>true</bool>
+ </property>
+ <property name="textLabel">
+ <string>Background</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Customize the desktop background</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>btnColors</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="usesTextLabel">
+ <bool>true</bool>
+ </property>
+ <property name="textLabel">
+ <string>Colors</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Customize colors</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>btnStyle</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="usesTextLabel">
+ <bool>true</bool>
+ </property>
+ <property name="textLabel">
+ <string>Style</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Customize the widget style</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>btnIcons</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="usesTextLabel">
+ <bool>true</bool>
+ </property>
+ <property name="textLabel">
+ <string>Icons</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Customize the icon theme</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>btnFonts</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="usesTextLabel">
+ <bool>true</bool>
+ </property>
+ <property name="textLabel">
+ <string>Fonts</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Customize the font theme</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>btnSaver</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>60</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="usesTextLabel">
+ <bool>true</bool>
+ </property>
+ <property name="textLabel">
+ <string>Screen Saver</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Customize the screen saver</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>lbGet</sender>
+ <signal>leftClickedURL(const QString&amp;)</signal>
+ <receiver>KThemeDlg</receiver>
+ <slot>startKonqui(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>btnBackground</sender>
+ <signal>clicked()</signal>
+ <receiver>KThemeDlg</receiver>
+ <slot>startBackground()</slot>
+ </connection>
+ <connection>
+ <sender>btnColors</sender>
+ <signal>clicked()</signal>
+ <receiver>KThemeDlg</receiver>
+ <slot>startColors()</slot>
+ </connection>
+ <connection>
+ <sender>btnStyle</sender>
+ <signal>clicked()</signal>
+ <receiver>KThemeDlg</receiver>
+ <slot>startStyle()</slot>
+ </connection>
+ <connection>
+ <sender>btnIcons</sender>
+ <signal>clicked()</signal>
+ <receiver>KThemeDlg</receiver>
+ <slot>startIcons()</slot>
+ </connection>
+ <connection>
+ <sender>btnFonts</sender>
+ <signal>clicked()</signal>
+ <receiver>KThemeDlg</receiver>
+ <slot>startFonts()</slot>
+ </connection>
+ <connection>
+ <sender>btnSaver</sender>
+ <signal>clicked()</signal>
+ <receiver>KThemeDlg</receiver>
+ <slot>startSaver()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>lvThemes</tabstop>
+ <tabstop>btnInstall</tabstop>
+ <tabstop>btnRemove</tabstop>
+ <tabstop>btnCreate</tabstop>
+ <tabstop>btnBackground</tabstop>
+ <tabstop>btnColors</tabstop>
+ <tabstop>btnStyle</tabstop>
+ <tabstop>btnIcons</tabstop>
+ <tabstop>btnFonts</tabstop>
+ <tabstop>btnSaver</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">kthemedlg.ui.h</include>
+</includes>
+<slots>
+ <slot specifier="non virtual">startKonqui( const QString &amp; url )</slot>
+ <slot specifier="non virtual">startBackground()</slot>
+ <slot specifier="non virtual">startColors()</slot>
+ <slot specifier="non virtual">startStyle()</slot>
+ <slot specifier="non virtual">startIcons()</slot>
+ <slot specifier="non virtual">startFonts()</slot>
+ <slot specifier="non virtual">startSaver()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurllabel.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/kthememanager/kthemedlg.ui.h b/kcontrol/kthememanager/kthemedlg.ui.h
new file mode 100644
index 000000000..53f296a1c
--- /dev/null
+++ b/kcontrol/kthememanager/kthemedlg.ui.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+#include <krun.h>
+
+void KThemeDlg::startKonqui( const QString & url )
+{
+ (void) new KRun(url);
+}
+
+
+void KThemeDlg::startBackground()
+{
+ KRun::runCommand("kcmshell kde-background");
+}
+
+
+void KThemeDlg::startColors()
+{
+ KRun::runCommand("kcmshell kde-colors");
+}
+
+
+void KThemeDlg::startStyle()
+{
+ KRun::runCommand("kcmshell kde-style");
+}
+
+
+void KThemeDlg::startIcons()
+{
+ KRun::runCommand("kcmshell kde-icons");
+}
+
+void KThemeDlg::startFonts()
+{
+ KRun::runCommand("kcmshell kde-fonts");
+}
+
+
+void KThemeDlg::startSaver()
+{
+ KRun::runCommand("kcmshell kde-screensaver");
+}
diff --git a/kcontrol/kthememanager/kthememanager.cpp b/kcontrol/kthememanager/kthememanager.cpp
new file mode 100644
index 000000000..d5efc65cd
--- /dev/null
+++ b/kcontrol/kthememanager/kthememanager.cpp
@@ -0,0 +1,425 @@
+// -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
+/* Copyright (C) 2003 Lukas Tinkl <lukas@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+#include <qtooltip.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kemailsettings.h>
+#include <kfiledialog.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kservicegroup.h>
+#include <kstandarddirs.h>
+#include <kurldrag.h>
+
+#include "kthememanager.h"
+#include "knewthemedlg.h"
+#include "config.h"
+
+kthememanager::kthememanager( QWidget *parent, const char *name )
+ : KCModule( parent, name ), m_theme( 0 ), m_origTheme( 0 )
+{
+
+ KAboutData *about = new KAboutData("kthememanager", I18N_NOOP("KDE Theme Manager"),
+ "0.4", I18N_NOOP("This control module handles installing, removing and "
+ "creating visual KDE themes."),
+ KAboutData::License_GPL, "(c) 2003, 2004, 2006 Lukáš Tinkl", 0,
+ "http://developer.kde.org/~lukas/kthememanager");
+ setAboutData( about );
+
+ setQuickHelp( i18n("This control module handles installing, removing and "
+ "creating visual KDE themes."));
+
+ setButtons( KCModule::Default|KCModule::Apply|KCModule::Help );
+
+ setAcceptDrops( true );
+ init();
+
+ QBoxLayout *top = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ dlg = new KThemeDlg(this);
+ top->addWidget( dlg );
+
+ dlg->lvThemes->setColumnWidthMode( 0, QListView::Maximum );
+
+ connect( ( QObject * )dlg->btnInstall, SIGNAL( clicked() ),
+ this, SLOT( slotInstallTheme() ) );
+
+ connect( ( QObject * )dlg->btnRemove, SIGNAL( clicked() ),
+ this, SLOT( slotRemoveTheme() ) );
+
+ connect( ( QObject * )dlg->btnCreate, SIGNAL( clicked() ),
+ this, SLOT( slotCreateTheme() ) );
+
+ connect( ( QObject * )dlg->lvThemes, SIGNAL( clicked( QListViewItem * ) ),
+ this, SLOT( slotThemeChanged( QListViewItem * ) ) );
+
+ connect( ( QObject * )dlg->lvThemes, SIGNAL( currentChanged( QListViewItem * ) ),
+ this, SLOT( slotThemeChanged( QListViewItem * ) ) );
+
+ connect( this, SIGNAL( filesDropped( const KURL::List& ) ),
+ this, SLOT( updateButton() ) );
+
+ connect( ( QObject * )dlg->lvThemes, SIGNAL( clicked( QListViewItem * ) ),
+ this, SLOT( updateButton() ) );
+
+ m_origTheme = new KTheme( this, true ); // stores the defaults to get back to
+ m_origTheme->setName( ORIGINAL_THEME );
+ m_origTheme->createYourself();
+
+ load();
+ queryLNFModules();
+ updateButton();
+}
+
+kthememanager::~kthememanager()
+{
+ delete m_theme;
+ delete m_origTheme;
+}
+
+void kthememanager::init()
+{
+ KGlobal::dirs()->addResourceType( "themes", KStandardDirs::kde_default("data") +
+ "kthememanager/themes/" );
+}
+
+void kthememanager::updateButton()
+{
+ QListViewItem * cur = dlg->lvThemes->currentItem();
+ bool enable = (cur != 0);
+ if (enable) {
+ enable = QFile(KGlobal::dirs()->saveLocation( "themes", cur->text( 0 ) + "/"+ cur->text( 0 )+ ".xml" ,false)).exists() ;
+ }
+ dlg->btnRemove->setEnabled(enable);
+}
+
+void kthememanager::load()
+{
+ load( false );
+}
+
+void kthememanager::load(bool useDefaults)
+{
+ listThemes();
+
+ // Load the current theme name
+ KConfig conf("kcmthememanagerrc", false, false);
+
+ conf.setReadDefaults( useDefaults );
+
+ conf.setGroup( "General" );
+ QString themeName = conf.readEntry( "CurrentTheme" );
+ QListViewItem * cur = dlg->lvThemes->findItem( themeName, 0 );
+ if ( cur )
+ {
+ dlg->lvThemes->setSelected( cur, true );
+ dlg->lvThemes->ensureItemVisible( cur );
+ slotThemeChanged( cur );
+ }
+
+ emit changed( true );
+}
+
+void kthememanager::defaults()
+{
+ load( true );
+}
+
+void kthememanager::save()
+{
+ QListViewItem * cur = dlg->lvThemes->currentItem();
+
+ if ( cur )
+ {
+ QString themeName = cur->text( 0 );
+
+ m_theme = new KTheme( this, KGlobal::dirs()->findResource( "themes", themeName + "/" + themeName + ".xml") );
+ m_theme->apply();
+
+ // Save the current theme name
+ KConfig conf("kcmthememanagerrc", false, false);
+ conf.setGroup( "General" );
+ conf.writeEntry( "CurrentTheme", themeName );
+ conf.sync();
+
+ delete m_theme;
+ m_theme = 0;
+
+ }
+}
+
+void kthememanager::listThemes()
+{
+ dlg->lvThemes->clear();
+ dlg->lbPreview->setPixmap( QPixmap() );
+
+ QStringList themes = KGlobal::dirs()->findAllResources( "themes", "*.xml", true /*recursive*/ );
+
+ QStringList::const_iterator it;
+
+ for ( it = themes.begin(); it != themes.end(); ++it )
+ {
+ KTheme theme( this, ( *it ) );
+ QString name = theme.name();
+ if ( name != ORIGINAL_THEME ) // skip the "original" theme
+ ( void ) new QListViewItem( dlg->lvThemes, name, theme.comment() );
+ }
+
+ kdDebug() << "Available themes: " << themes << endl;
+}
+
+float kthememanager::getThemeVersion( const QString & themeName )
+{
+ QStringList themes = KGlobal::dirs()->findAllResources( "themes", "*.xml", true /*recursive*/ );
+
+ QStringList::const_iterator it;
+
+ for ( it = themes.begin(); it != themes.end(); ++it )
+ {
+ KTheme theme( 0L, ( *it ) );
+ QString name = theme.name();
+ bool ok = false;
+ float version = theme.version().toFloat( &ok );
+ if ( name == themeName && ok )
+ return version;
+ }
+
+ return -1;
+}
+
+void kthememanager::slotInstallTheme()
+{
+ addNewTheme( KFileDialog::getOpenURL( ":themes", "*.kth|" + i18n("Theme Files"), this,
+ i18n( "Select Theme File" ) ) );
+}
+
+void kthememanager::addNewTheme( const KURL & url )
+{
+ if ( url.isValid() )
+ {
+ QString themeName = QFileInfo( url.fileName() ).baseName();
+ if ( getThemeVersion( themeName ) != -1 ) // theme exists already
+ {
+ KTheme::remove( themeName ); // remove first
+ }
+
+ m_theme = new KTheme(this);
+ if ( m_theme->load( url ) )
+ {
+ listThemes();
+ emit changed( true );
+ }
+
+ delete m_theme;
+ m_theme = 0;
+ updateButton();
+ }
+}
+
+void kthememanager::slotRemoveTheme()
+{
+ // get the selected item from the listview
+ QListViewItem * cur = dlg->lvThemes->currentItem();
+ // ask and remove it
+ if ( cur )
+ {
+ QString themeName = cur->text( 0 );
+ if ( KMessageBox::warningContinueCancel( this, "<qt>" + i18n( "Do you really want to remove the theme <b>%1</b>?" ).arg( themeName ),
+ i18n( "Remove Theme" ), KGuiItem( i18n( "&Remove" ), "editdelete" ) )
+ == KMessageBox::Continue )
+ {
+ KTheme::remove( themeName );
+ listThemes();
+ }
+ updateButton();
+ }
+}
+
+bool kthememanager::themeExist(const QString &_themeName)
+{
+ return ( dlg->lvThemes->findItem( _themeName, 0 )!=0 );
+}
+
+void kthememanager::slotCreateTheme()
+{
+ KNewThemeDlg dlg( this );
+
+ KEMailSettings es;
+ es.setProfile( es.defaultProfileName() );
+
+ dlg.setName( i18n( "My Theme" ) );
+ dlg.setAuthor( es.getSetting( KEMailSettings::RealName ) ) ;
+ dlg.setEmail( es.getSetting( KEMailSettings::EmailAddress ) );
+ dlg.setVersion( "0.1" );
+
+ if ( dlg.exec() == QDialog::Accepted )
+ {
+
+ QString themeName = dlg.getName();
+ if ( themeExist(themeName) )
+ {
+ KMessageBox::information( this, i18n( "Theme %1 already exists." ).arg( themeName ) );
+ }
+ else
+ {
+ if ( getThemeVersion( themeName ) != -1 ) // remove the installed theme first
+ {
+ KTheme::remove( themeName );
+ }
+ m_theme = new KTheme( this, true );
+ m_theme->setName( dlg.getName() );
+ m_theme->setAuthor( dlg.getAuthor() );
+ m_theme->setEmail( dlg.getEmail() );
+ m_theme->setHomepage( dlg.getHomepage() );
+ m_theme->setComment( dlg.getComment().replace( "\n", "" ) );
+ m_theme->setVersion( dlg.getVersion() );
+
+ QString result = m_theme->createYourself( true );
+ m_theme->addPreview();
+
+ if ( !result.isEmpty() )
+ KMessageBox::information( this, i18n( "Your theme has been successfully created in %1." ).arg( result ),
+ i18n( "Theme Created" ), "theme_created_ok" );
+ else
+ KMessageBox::error( this, i18n( "An error occurred while creating your theme." ),
+ i18n( "Theme Not Created" ) );
+ delete m_theme;
+ m_theme = 0;
+
+ listThemes();
+ }
+ }
+}
+
+void kthememanager::slotThemeChanged( QListViewItem * item )
+{
+ if ( item )
+ {
+ QString themeName = item->text(0);
+ kdDebug() << "Activated theme: " << themeName << endl;
+
+ QString themeDir = KGlobal::dirs()->findResourceDir( "themes", themeName + "/" + themeName + ".xml") + themeName + "/";
+
+ QString pixFile = themeDir + themeName + ".preview.png";
+
+ if ( QFile::exists( pixFile ) )
+ {
+ updatePreview( pixFile );
+ }
+ else
+ {
+ dlg->lbPreview->setPixmap( QPixmap() );
+ dlg->lbPreview->setText( i18n( "This theme does not contain a preview." ) );
+ }
+
+ KTheme theme( this, themeDir + themeName + ".xml" );
+ QToolTip::remove( dlg->lbPreview );
+ QToolTip::add( dlg->lbPreview, "<qt>" + i18n( "Author: %1<br>Email: %2<br>Version: %3<br>Homepage: %4" )
+ .arg( theme.author() ).arg( theme.email() )
+ .arg( theme.version() ).arg( theme.homepage() ) + "</qt>");
+
+ emit changed( true );
+ }
+}
+
+void kthememanager::dragEnterEvent( QDragEnterEvent * ev )
+{
+ ev->accept( KURLDrag::canDecode( ev ) );
+}
+
+void kthememanager::dropEvent( QDropEvent * ev )
+{
+ KURL::List urls;
+ if ( KURLDrag::decode( ev, urls ) )
+ {
+ emit filesDropped( urls );
+ }
+}
+
+void kthememanager::slotFilesDropped( const KURL::List & urls )
+{
+ for ( KURL::List::ConstIterator it = urls.begin(); it != urls.end(); ++it )
+ addNewTheme( *it );
+}
+
+void kthememanager::queryLNFModules()
+{
+ /*KServiceGroup::Ptr settings = KServiceGroup::group( "Settings/LookNFeel/" );
+ if ( !settings || !settings->isValid() )
+ return;
+
+ KServiceGroup::List list = settings->entries();
+
+ // Iterate over all entries in the group
+ for( KServiceGroup::List::ConstIterator it = list.begin();
+ it != list.end(); it++ )
+ {
+ KSycocaEntry *p = ( *it );
+ if ( p->isType( KST_KService ) )
+ {
+ KService *s = static_cast<KService *>( p );
+ ( void ) new KThemeDetailsItem( dlg->lvDetails, s->name(), s->pixmap( KIcon::Desktop ), s->exec() );
+ }
+ }
+
+ dlg->lvDetails->sort();*/
+
+ // For now use a static list
+ KIconLoader * il = KGlobal::iconLoader();
+ dlg->btnBackground->setIconSet( il->loadIconSet( "background", KIcon::Desktop, 32 ) );
+ dlg->btnColors->setIconSet( il->loadIconSet( "colorscm", KIcon::Desktop, 32 ) );
+ dlg->btnStyle->setIconSet( il->loadIconSet( "style", KIcon::Desktop, 32 ) );
+ dlg->btnIcons->setIconSet( il->loadIconSet( "icons", KIcon::Desktop, 32 ) );
+ dlg->btnFonts->setIconSet( il->loadIconSet( "fonts", KIcon::Desktop, 32 ) );
+ dlg->btnSaver->setIconSet( il->loadIconSet( "kscreensaver", KIcon::Desktop, 32 ) );
+}
+
+void kthememanager::updatePreview( const QString & pixFile )
+{
+ kdDebug() << "Preview is in file: " << pixFile << endl;
+ QImage preview( pixFile, "PNG" );
+ if (preview.width()>dlg->lbPreview->contentsRect().width() ||
+ preview.height()>dlg->lbPreview->contentsRect().height() )
+ preview = preview.smoothScale( dlg->lbPreview->contentsRect().size(), QImage::ScaleMin );
+ QPixmap pix;
+ pix.convertFromImage( preview );
+ dlg->lbPreview->setPixmap( pix );
+}
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_kthememanager(QWidget *parent, const char *)
+ {
+ KGlobal::locale()->insertCatalogue( "kthememanager" );
+ return new kthememanager( parent, "kthememanager" );
+ }
+}
+
+#include "kthememanager.moc"
diff --git a/kcontrol/kthememanager/kthememanager.desktop b/kcontrol/kthememanager/kthememanager.desktop
new file mode 100644
index 000000000..d4c37c965
--- /dev/null
+++ b/kcontrol/kthememanager/kthememanager.desktop
@@ -0,0 +1,220 @@
+[Desktop Entry]
+Comment=Manage global KDE visual themes
+Comment[af]=Bestuurder KDE se globale visuele temas
+Comment[az]=Qlobal KDE əyani örtüklərini idarə et
+Comment[be]=Кіраванне глабальнымі візуальнымі тэмамі KDE
+Comment[bg]=Управление на темите
+Comment[bn]=গ্লোবাল কে.ডি.ই. ভিসুয়াল থীম ব্যবস্থাপনা
+Comment[bs]=Upravljanje globalnim KDE vizuelnim temama
+Comment[ca]=Gestiona els temes visuals globals del KDE
+Comment[cs]=Správce motivů pracovní plochy
+Comment[csb]=Sprôwiôj témą KDE
+Comment[cy]=Rheoli themau gweledol KDE eang
+Comment[da]=Håndtering af globale visuelle temaer for KDE
+Comment[de]=Globale KDE-Designs verwalten
+Comment[el]=Διαχειριστής καθολικών οπτικών θεμάτων του KDE
+Comment[eo]=Administras mondan KDEan etosoj
+Comment[es]=Gestión global de los temas visuales de KDE
+Comment[et]=KDE globaalsete teemade haldur
+Comment[eu]=Kudeatu KDEren gai bisual orokorrak
+Comment[fa]=مدیریت چهره‌های مرئی KDE سراسری
+Comment[fi]=Ylläpidä KDE:n teemoja
+Comment[fr]=Gestionnaire de thèmes visuels globaux de KDE
+Comment[fy]=Algemiene fisuele tema's fan KDE beheare
+Comment[gl]=Xestionar temas visuais globais de KDE
+Comment[he]=מנהל ערכות נושא גלובליות עבור KDE
+Comment[hi]=वैश्विक केडीई दृश्यमय प्रसंग प्रबंधित करें
+Comment[hr]=Upravljanje općim KDE vizualnim temama
+Comment[hu]=KDE-témák kezelése
+Comment[is]=Stjórna víðværum KDE þemum
+Comment[it]=Gestore dei temi globali di KDE
+Comment[ja]=グローバル KDE 外観テーマの管理
+Comment[ka]=KDE-ს ვიზუალური თემბის გლობალური მენეჯმენტი
+Comment[kk]=KDE жалпы көрініс нақыштарын басқару
+Comment[km]=គ្រប់គ្រង​ស្បែក​រូបភាព KDE ទាំងអស់
+Comment[ko]=전역 KDE 시각 테마 관리
+Comment[lt]=Globaliai tvarkyti KDE vizualines temas
+Comment[lv]=KDE izskata tēmu pārvaldīšana
+Comment[mk]=Менаџирајте ги глобалните KDE визуелни теми
+Comment[ms]=Urus tema visual KDE global
+Comment[mt]=Immaniġġja temi viżwali globali tal-KDE
+Comment[nb]=Velg blant KDE-temaer for hele brukerflaten
+Comment[nds]=Globale KDE-Muster instellen
+Comment[ne]=विश्वव्यापी KDE दृश्य विषयवस्तु व्यवस्थापन गर्नुहोस्
+Comment[nl]=Algemene visuele thema's van KDE beheren
+Comment[nn]=Vel mellom KDE-tema for heile brukarflata
+Comment[pa]=ਮੁੱਢਲੇ KDE ਦਿੱਖ ਸਰੂਪ ਪਰਬੰਧ
+Comment[pl]=Zarządzaj motywami KDE
+Comment[pt]=Gestão global de temas visuais do KDE
+Comment[pt_BR]=Gerencia temas globais do KDE
+Comment[ro]=Administrează tematicile vizuale KDE globale
+Comment[ru]=Менеджер глобальных визуальных тем KDE
+Comment[rw]=Kuyobora insanganyamatsiko igaragara KDE rusange
+Comment[se]=Hálddaš oppalaš visuella KDE-fáttáid
+Comment[sk]=Globálny správca tém
+Comment[sl]=Upravitelj vizualnih tem za KDE
+Comment[sr]=Управљање KDE-овим визуелним темама
+Comment[sr@Latn]=Upravljanje KDE-ovim vizuelnim temama
+Comment[sv]=Hantera KDE:s allmänna visuella teman
+Comment[ta]=பொது KDE காட்சி பொருளை மேல்பார்வையிடு
+Comment[tg]=Мудири мавзӯъҳои визуалии KDE дар шабака
+Comment[th]=จัดการชุดตกแต่งของ KDE
+Comment[tr]=Evrensel KDE ekran temalarını yönet
+Comment[tt]=KDE'nıñ tışlaw törlären caylaw idäräse
+Comment[uk]=Керування глобальними темами KDE
+Comment[vi]=Trình quản lý các sắc thái của KDE
+Comment[wa]=Manaedjî tinmes pol rivnance globåle di KDE
+Comment[zh_CN]=管理全局 KDE 视觉主题
+Comment[zh_TW]=管理全域 KDE 視覺佈景
+Exec=kcmshell kthememanager
+Icon=kthememgr
+Keywords=themes,look and feel
+Keywords[af]=themes,look and feel,temas
+Keywords[ar]=سمات,المظهر و الإحساس
+Keywords[az]=örtüklər,görünüş,örtük,theme,look
+Keywords[be]=Тэмы,Вонкавы выгляд,themes,look and feel
+Keywords[bg]=теми, вид, themes, look and feel
+Keywords[br]=gizioù,Neuz ha feson
+Keywords[bs]=themes,look and feel,teme,izgled,osjećaj
+Keywords[ca]=temes,aspecte i efecte
+Keywords[cs]=motivy,vzhled a chování
+Keywords[csb]=téma,wëzdrzatk
+Keywords[cy]=themau,golwg a theimlad
+Keywords[da]=temaer,udseende
+Keywords[de]=Designs,Themes,Erscheinungsbild
+Keywords[el]=θέματα,εμφάνιση και αίσθηση
+Keywords[eo]=etoso,etosoj,videbleco,uzebleco
+Keywords[es]=temas,aspecto y comportamiento
+Keywords[et]=teemad,välimus
+Keywords[eu]=gaiak,itxura eta portaera
+Keywords[fa]=چهره‌ها، ظاهر و احساس
+Keywords[fi]=teemat,ulkonäkö ja tuntuma
+Keywords[fr]=thèmes,apparence et ergonomie
+Keywords[fy]=tema's,úterlik en gedrach
+Keywords[ga]=téamaí,cuma
+Keywords[gl]=temas,apariencia
+Keywords[he]=ערכות, מראה ותחושה, themes,look and feel
+Keywords[hi]=प्रसंग, रूप तथा आकार
+Keywords[hr]=themes,look and feel,izgled i osjećaj,teme
+Keywords[hu]=témák,megjelenés
+Keywords[it]=temi,aspetto
+Keywords[ja]=テーマ,look and feel,外観,ルックアンドフィール
+Keywords[km]=ស្បែក,រូបរាង និង​មុខងារ
+Keywords[lt]=themes,look and feel,temos,išvaizda ir jausena
+Keywords[lv]=tēmas,izskats un sajūtas
+Keywords[mk]=themes,look and feel,теми,изглед и чувство
+Keywords[ms]=tema, rupa dan rasa
+Keywords[mt]=themes,look and feel,temi,dehra
+Keywords[nb]=temaer,utseende og oppførsel
+Keywords[nds]=Muster,themes,Themas,look and feel,Achtergrund,Klören,Klöörschemas,Schemas,Klöörschema
+Keywords[ne]=विषयवस्तु, हेराइ र बुझाइ
+Keywords[nl]=thema's,uiterlijk en gedrag
+Keywords[nn]=tema,utsjånad og åtferd
+Keywords[pa]=ਸਰੂਪ,ਦਿੱਖ ਅਤੇ ਛੋਹ
+Keywords[pl]=motywy,wygląd
+Keywords[pt]=temas,aparência e comportamento
+Keywords[pt_BR]=temas,aparência
+Keywords[ro]=tematici,apect,grafică
+Keywords[rw]=Insanganyamatsiko,imboneko n'ukumva
+Keywords[se]=fáttát,fárda ja láhtten
+Keywords[sk]=témy,vzhľad
+Keywords[sl]=teme,videz in občutek
+Keywords[sr]=themes,look and feel,теме,изглед и осећај,изглед
+Keywords[sr@Latn]=themes,look and feel,teme,izgled i osećaj,izgled
+Keywords[sv]=teman,utseende och känsla
+Keywords[ta]=உரைபொருள்,பார் மற்றும் உணர்ணர்
+Keywords[th]=ชุดตกแต่ง,รูปแบบและสัมผัส
+Keywords[tr]=temalar,görünüm ve hisset
+Keywords[uk]=теми,вигляд та поведінка
+Keywords[uz]=mavzular,tashqi koʻrinishi
+Keywords[uz@cyrillic]=мавзулар,ташқи кўриниши
+Keywords[vi]=sắc thái,cảm nhận
+Keywords[wa]=tinmes,rivnance
+Keywords[zh_CN]=themes,look and feel,主题,观感
+Keywords[zh_TW]=themes,look and feel,主題,外觀與感覺
+Name=Theme Manager
+Name[af]=Tema Bestuurder
+Name[ar]=مسيير السمات
+Name[az]=Örtük İdarəcisi
+Name[be]=Кіраванне тэмамі
+Name[bg]=Мениджър на теми
+Name[bn]=থীম ম্যানেজার
+Name[br]=Merour gwiskadoù
+Name[bs]=Upravitelj temama
+Name[ca]=Gestor de temes
+Name[cs]=Správce motivů
+Name[csb]=Menedżer témów
+Name[cy]=Rheolwr Thema
+Name[da]=Temahåndtering
+Name[de]=Designverwaltung
+Name[el]=Διαχειριστής θεμάτων
+Name[eo]=Etosadministrilo
+Name[es]=Gestor de temas
+Name[et]=Teemahaldur
+Name[eu]=Gai kudeatzailea
+Name[fa]=مدیر چهره
+Name[fi]=Teemanhallinta
+Name[fr]=Gestionnaire de thèmes
+Name[fy]=Temabehearder
+Name[ga]=Bainisteoir na dTéamaí
+Name[gl]=Xestor de Temas
+Name[he]=מנהל ערכות נושא
+Name[hi]=प्रसंग प्रबंधक
+Name[hr]=Upravljanje temama
+Name[hu]=Témák
+Name[id]=Manajer Theme
+Name[is]=Þemustjóri
+Name[it]=Gestore dei temi
+Name[ja]=テーママネージャ
+Name[ka]=თემების მენეჯერი
+Name[kk]=Нақыштар менеджері
+Name[km]=កម្មវិធី​គ្រប់គ្រង​ស្បែក
+Name[ko]=테마 관리자
+Name[lo]=ເຄື່ອງມືຈັດການ ທີມ
+Name[lt]=Temų tvarkyklė
+Name[lv]=Tēmu Menedžeris
+Name[mk]=Менаџер на теми
+Name[mn]=Загвар-Удирлагч
+Name[ms]=Pengurus Tema
+Name[mt]=Manager tat-Temi
+Name[nb]=Temabehandler
+Name[nds]=Musterpleger
+Name[ne]=विषयवस्तु प्रबन्धक
+Name[nl]=Themabeheerder
+Name[nn]=Temahandsamar
+Name[nso]=Molaodi wa Molaetsa
+Name[oc]=Gestionari de temes
+Name[pa]=ਸਰੂਪ ਮੈਨੇਜਰ
+Name[pl]=Menedżer motywów
+Name[pt]=Gestor de Temas
+Name[pt_BR]=Gerenciador de Temas
+Name[ro]=Managerul de tematică
+Name[ru]=Менеджер тем
+Name[rw]=Mugenga Insanganyamatsiko
+Name[se]=Fáddagieđahalli
+Name[sk]=Správca tém
+Name[sl]=Upravitelj tem
+Name[sr]=Менаџер тема
+Name[sr@Latn]=Menadžer tema
+Name[ss]=Siphatsi sendzikimba
+Name[sv]=Temahanterare
+Name[ta]=பொருள் மேலாளர்
+Name[tg]=Мудири мавзӯъ
+Name[th]=เครื่องมือจัดการชุดตกแต่ง
+Name[tr]=Tema Yöneticisi
+Name[tt]=Tışlaw İdäräçe
+Name[uk]=Менеджер тем
+Name[uz]=Mavzu boshqaruvchisi
+Name[uz@cyrillic]=Мавзу бошқарувчиси
+Name[ven]=Mulanguli wa thero
+Name[vi]=Trình quản lí sắc thái
+Name[wa]=Manaedjeu di tinmes
+Name[xh]=Umphathi Womxholo
+Name[zh_CN]=主题管理器
+Name[zh_TW]=佈景管理程式
+Name[zu]=Imenenja Yengqikithi
+Terminal=false
+Type=Application
+X-KDE-FactoryName=kthememanager
+X-KDE-Library=kthememanager
+Categories=Qt;KDE;X-KDE-settings-looknfeel;
diff --git a/kcontrol/kthememanager/kthememanager.h b/kcontrol/kthememanager/kthememanager.h
new file mode 100644
index 000000000..972251f6a
--- /dev/null
+++ b/kcontrol/kthememanager/kthememanager.h
@@ -0,0 +1,157 @@
+// -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
+/* Copyright (C) 2003 Lukas Tinkl <lukas@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#ifndef KTHEMEMANAGER_H
+#define KTHEMEMANAGER_H
+
+#include <kcmodule.h>
+#include <krun.h>
+#include <kservice.h>
+#include <kurl.h>
+
+#include "kthemedlg.h"
+#include "ktheme.h"
+
+class QString;
+
+class KAboutData;
+
+#define ORIGINAL_THEME "original" // no i18n() here!!!
+
+/*
+class KIconViewItem;
+
+class KThemeDetailsItem: public KIconViewItem
+{
+public:
+ KThemeDetailsItem( KIconView * parent, const QString & text, const QPixmap & icon, const QString & execString )
+ : KIconViewItem( parent, text, icon ) { m_exec = execString; }
+ virtual ~KThemeDetailsItem() { };
+
+ void exec() {
+ ( void ) new KRun( m_exec );
+ }
+private:
+ QString m_exec;
+};
+*/
+
+/**
+ *
+ * This is the for KControl config module for installing,
+ * creating and removing visual themes.
+ *
+ * @brief The Theme Manager config module.
+ * @author Lukas Tinkl <lukas@kde.org>
+ */
+class kthememanager: public KCModule
+{
+ Q_OBJECT
+public:
+ kthememanager( QWidget *parent=0, const char *name=0 );
+ virtual ~kthememanager();
+
+ /**
+ * Called on module startup
+ */
+ virtual void load();
+ virtual void load(bool useDefaults);
+ /**
+ * Called when applying the changes
+ */
+ virtual void save();
+ /**
+ * Called when the user requests the default values
+ */
+ virtual void defaults();
+
+protected:
+ void dragEnterEvent ( QDragEnterEvent * ev );
+ void dropEvent ( QDropEvent * ev );
+
+signals:
+ /**
+ * Emitted when some @p urls are dropped onto the kcm
+ */
+ void filesDropped(const KURL::List &urls);
+
+private slots:
+ /**
+ * Install a theme from a tarball (*.kth)
+ */
+ void slotInstallTheme();
+
+ /**
+ * Remove an installed theme
+ */
+ void slotRemoveTheme();
+
+ /**
+ * Create a new theme
+ */
+ void slotCreateTheme();
+
+ /**
+ * Update the theme's info and preview
+ */
+ void slotThemeChanged( QListViewItem * item );
+
+ /**
+ * Invoked when one drag and drops @p urls onto the kcm
+ * @see signal filesDropped
+ */
+ void slotFilesDropped( const KURL::List & urls );
+ void updateButton();
+
+private:
+ /**
+ * List themes available in the system and insert them into the listview.
+ */
+ void listThemes();
+
+ /**
+ * Performs the actual theme installation.
+ */
+ void addNewTheme( const KURL & url );
+
+ /**
+ * Perform internal initialization of paths.
+ */
+ void init();
+
+ /**
+ * Try to find out whether a theme is installed and get its version number
+ * @param themeName The theme name
+ * @return The theme's version number or -1 if not installed
+ */
+ static float getThemeVersion( const QString & themeName );
+
+ void queryLNFModules();
+
+ /**
+ * Updates the preview widget
+ */
+ void updatePreview( const QString & pixFile );
+ bool themeExist(const QString &_themeName);
+ KThemeDlg * dlg;
+
+ KTheme * m_theme;
+ KTheme * m_origTheme;
+};
+
+#endif
diff --git a/kcontrol/kthememanager/newthemewidget.ui b/kcontrol/kthememanager/newthemewidget.ui
new file mode 100644
index 000000000..905b0749a
--- /dev/null
+++ b/kcontrol/kthememanager/newthemewidget.ui
@@ -0,0 +1,130 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>NewThemeWidget</class>
+<author>Lukas Tinkl &lt;lukas@kde.org&gt;</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>NewThemeWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>537</width>
+ <height>431</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Theme name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leName</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Author:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leAuthor</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Email:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leEmail</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Homepage:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leHomepage</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>leEmail</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>leName</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>leHomepage</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>leAuthor</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Co&amp;mment:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignTop</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>teComment</cstring>
+ </property>
+ </widget>
+ <widget class="QTextEdit" row="5" column="1">
+ <property name="name">
+ <cstring>teComment</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>leVersion</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Version:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leVersion</cstring>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<tabstops>
+ <tabstop>leName</tabstop>
+ <tabstop>leAuthor</tabstop>
+ <tabstop>leEmail</tabstop>
+ <tabstop>leHomepage</tabstop>
+ <tabstop>leVersion</tabstop>
+ <tabstop>teComment</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kcontrol/kthememanager/x-ktheme.desktop b/kcontrol/kthememanager/x-ktheme.desktop
new file mode 100644
index 000000000..6efaa20d6
--- /dev/null
+++ b/kcontrol/kthememanager/x-ktheme.desktop
@@ -0,0 +1,84 @@
+[Desktop Entry]
+MimeType=application/x-ktheme
+Comment=KDE Theme
+Comment[af]=KDE Tema
+Comment[ar]=سمة KDE
+Comment[az]=KDE Örtüyü
+Comment[be]=Тэма KDE
+Comment[bg]=Тема за KDE
+Comment[bn]=কে.ডি.ই. থীম
+Comment[br]=Giz KDE
+Comment[bs]=KDE tema
+Comment[ca]=Tema KDE
+Comment[cs]=KDE motiv
+Comment[csb]=Téma KDE
+Comment[cy]=Thema KDE
+Comment[da]=KDE-tema
+Comment[de]=KDE-Design
+Comment[el]=Θέμα του KDE
+Comment[eo]=KDEa etoso
+Comment[es]=Tema de KDE
+Comment[et]=KDE teema
+Comment[fa]=چهرۀ KDE
+Comment[fi]=KDE-teema
+Comment[fr]=Thème KDE
+Comment[fy]=KDE-tema
+Comment[ga]=Téama KDE
+Comment[gl]=Tema de KDE
+Comment[he]=ערכת נושא של KDE
+Comment[hi]=केडीई प्रसंग
+Comment[hr]=KDE tema
+Comment[hu]=KDE-téma
+Comment[id]=Tema KDE
+Comment[is]=KDE þema
+Comment[it]=Tema KDE
+Comment[ja]=KDE テーマ
+Comment[ka]=KDE-ს თემა
+Comment[kk]=KDE нақышы
+Comment[km]=ស្បែក KDE
+Comment[ko]=KDE 테마 설치
+Comment[lo]=ທີມຂອງ KDE
+Comment[lt]=KDE Tema
+Comment[lv]=KDE Tēma
+Comment[mk]=KDE-тема
+Comment[mn]=КДЭ-Хэлбэр
+Comment[ms]=Tema KDE
+Comment[mt]=Tema KDE
+Comment[nb]=KDE-tema
+Comment[nds]=KDE Muster
+Comment[ne]=KDE विषयवस्तु
+Comment[nl]=KDE-thema
+Comment[nn]=KDE-tema
+Comment[nso]=Molaetsa wa KDE
+Comment[pa]=KDE ਸਰੂਪ
+Comment[pl]=Motywy KDE
+Comment[pt]=Tema do KDE
+Comment[pt_BR]=Tema do KDE
+Comment[ro]=Tematică KDE
+Comment[ru]=Тема KDE
+Comment[rw]=Insanganyamatsiko za KDE
+Comment[se]=KDE-fáddá
+Comment[sk]=Téma KDE
+Comment[sl]=Tema KDE
+Comment[sr]=KDE тема
+Comment[sr@Latn]=KDE tema
+Comment[sv]=KDE-tema
+Comment[ta]=KDE பொருள்
+Comment[tg]=Мавзӯъи KDE
+Comment[th]=ชุดตกแต่ง KDE
+Comment[tr]=KDE Teması
+Comment[tt]=KDE Tışlawı
+Comment[uk]=Тема KDE
+Comment[uz]=KDE mavzusi
+Comment[uz@cyrillic]=KDE мавзуси
+Comment[ven]=Thero ya KDE
+Comment[vi]=Sắc thái KDE
+Comment[wa]=Tinme KDE
+Comment[xh]=Umxholo we KDE
+Comment[zh_CN]=KDE 主题
+Comment[zh_TW]=KDE 主題
+Comment[zu]=Ingqikithi ye-KDE
+Icon=kthememgr
+Type=MimeType
+Patterns=*.kth;
+X-KDE-AutoEmbed=false
diff --git a/kcontrol/launch/Makefile.am b/kcontrol/launch/Makefile.am
new file mode 100644
index 000000000..ce246f3d2
--- /dev/null
+++ b/kcontrol/launch/Makefile.am
@@ -0,0 +1,13 @@
+
+kde_module_LTLIBRARIES = kcm_launch.la
+AM_CPPFLAGS = $(all_includes)
+kcm_launch_la_SOURCES = kcmlaunch.cpp
+kcm_launch_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module
+kcm_launch_la_LIBADD = $(LIB_KDEUI)
+METASOURCES = AUTO
+noinst_HEADERS = kcmlaunch.h
+xdg_apps_DATA = kcmlaunch.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmlaunch.pot
+
diff --git a/kcontrol/launch/kcmlaunch.cpp b/kcontrol/launch/kcmlaunch.cpp
new file mode 100644
index 000000000..24623a7ea
--- /dev/null
+++ b/kcontrol/launch/kcmlaunch.cpp
@@ -0,0 +1,275 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdialog.h>
+#include <kgenericfactory.h>
+#include <knuminput.h>
+
+#include "kcmlaunch.h"
+
+typedef KGenericFactory<LaunchConfig, QWidget> LaunchFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_launch, LaunchFactory("kcmlaunch") )
+
+
+LaunchConfig::LaunchConfig(QWidget * parent, const char * name, const QStringList &)
+ : KCModule(LaunchFactory::instance(), parent, name)
+{
+ QVBoxLayout* Form1Layout = new QVBoxLayout( this, 0,
+ KDialog::spacingHint() );
+
+ setQuickHelp( i18n ( "<h1>Launch Feedback</h1>"
+ " You can configure the application-launch feedback here."));
+
+ QGroupBox* GroupBox1 = new QGroupBox( this, "GroupBox1" );
+ GroupBox1->setTitle( i18n( "Bus&y Cursor" ) );
+ QWhatsThis::add(GroupBox1, i18n(
+ "<h1>Busy Cursor</h1>\n"
+ "KDE offers a busy cursor for application startup notification.\n"
+ "To enable the busy cursor, select one kind of visual feedback\n"
+ "from the combobox.\n"
+ "It may occur, that some applications are not aware of this startup\n"
+ "notification. In this case, the cursor stops blinking after the time\n"
+ "given in the section 'Startup indication timeout'"));
+
+ GroupBox1->setColumnLayout(0, Qt::Vertical );
+ GroupBox1->layout()->setSpacing( 0 );
+ GroupBox1->layout()->setMargin( 0 );
+ Form1Layout->addWidget( GroupBox1 );
+ QGridLayout* GroupBox1Layout = new QGridLayout( GroupBox1->layout(), 3, 2 );
+ GroupBox1Layout->setSpacing( 6 );
+ GroupBox1Layout->setMargin( 11 );
+ GroupBox1Layout->setColStretch( 1, 1 );
+
+ cb_busyCursor = new QComboBox( GroupBox1, "cb_busyCursor" );
+ cb_busyCursor->insertItem( i18n( "No Busy Cursor" ), 0 );
+ cb_busyCursor->insertItem( i18n( "Passive Busy Cursor" ), 1 );
+ cb_busyCursor->insertItem( i18n( "Blinking Cursor" ), 2 );
+ cb_busyCursor->insertItem( i18n( "Bouncing Cursor" ), 3 );
+ GroupBox1Layout->addWidget( cb_busyCursor, 0, 0 );
+ connect( cb_busyCursor, SIGNAL( activated(int) ),
+ SLOT ( slotBusyCursor(int)));
+ connect( cb_busyCursor, SIGNAL( activated(int) ), SLOT( checkChanged() ) );
+
+ lbl_cursorTimeout = new QLabel( GroupBox1, "TextLabel1" );
+ lbl_cursorTimeout->setText( i18n( "&Startup indication timeout:" ) );
+ GroupBox1Layout->addWidget( lbl_cursorTimeout, 2, 0 );
+ sb_cursorTimeout = new KIntNumInput( GroupBox1, "sb_cursorTimeout" );
+ sb_cursorTimeout->setRange( 0, 99, 1, true );
+ sb_cursorTimeout->setSuffix( i18n(" sec") );
+ GroupBox1Layout->addWidget( sb_cursorTimeout, 2, 1 );
+ lbl_cursorTimeout->setBuddy( sb_cursorTimeout );
+ connect( sb_cursorTimeout, SIGNAL( valueChanged(int) ),
+ SLOT( checkChanged() ) );
+
+ QGroupBox* GroupBox2 = new QGroupBox( this, "GroupBox2" );
+ GroupBox2->setTitle( i18n( "Taskbar &Notification" ) );
+ QWhatsThis::add(GroupBox2, i18n("<H1>Taskbar Notification</H1>\n"
+ "You can enable a second method of startup notification which is\n"
+ "used by the taskbar where a button with a rotating hourglass appears,\n"
+ "symbolizing that your started application is loading.\n"
+ "It may occur, that some applications are not aware of this startup\n"
+ "notification. In this case, the button disappears after the time\n"
+ "given in the section 'Startup indication timeout'"));
+
+ GroupBox2->setColumnLayout( 0, Qt::Vertical );
+ GroupBox2->layout()->setSpacing( 0 );
+ GroupBox2->layout()->setMargin( 0 );
+ Form1Layout->addWidget( GroupBox2 );
+ QGridLayout* GroupBox2Layout = new QGridLayout( GroupBox2->layout(), 2, 2 );
+ GroupBox2Layout->setSpacing( 6 );
+ GroupBox2Layout->setMargin( 11 );
+ GroupBox2Layout->setColStretch( 1, 1 );
+
+ cb_taskbarButton = new QCheckBox( GroupBox2, "cb_taskbarButton" );
+ cb_taskbarButton->setText( i18n( "Enable &taskbar notification" ) );
+ GroupBox2Layout->addMultiCellWidget( cb_taskbarButton, 0, 0, 0, 1 );
+ connect( cb_taskbarButton, SIGNAL( toggled(bool) ),
+ SLOT( slotTaskbarButton(bool)));
+ connect( cb_taskbarButton, SIGNAL( toggled(bool) ), SLOT( checkChanged()));
+
+ lbl_taskbarTimeout = new QLabel( GroupBox2, "TextLabel2" );
+ lbl_taskbarTimeout->setText( i18n( "Start&up indication timeout:" ) );
+ GroupBox2Layout->addWidget( lbl_taskbarTimeout, 1, 0 );
+ sb_taskbarTimeout = new KIntNumInput( GroupBox2, "sb_taskbarTimeout" );
+ sb_taskbarTimeout->setRange( 0, 99, 1, true );
+ sb_taskbarTimeout->setSuffix( i18n(" sec") );
+ GroupBox2Layout->addWidget( sb_taskbarTimeout, 1, 1 );
+ lbl_taskbarTimeout->setBuddy( sb_taskbarTimeout );
+ connect( sb_taskbarTimeout, SIGNAL( valueChanged(int) ),
+ SLOT( checkChanged() ) );
+
+ Form1Layout->addStretch();
+
+ load();
+}
+
+LaunchConfig::~LaunchConfig()
+{
+}
+
+ void
+LaunchConfig::slotBusyCursor(int i)
+{
+ lbl_cursorTimeout->setEnabled( i != 0 );
+ sb_cursorTimeout->setEnabled( i != 0 );
+}
+
+ void
+LaunchConfig::slotTaskbarButton(bool b)
+{
+ lbl_taskbarTimeout->setEnabled( b );
+ sb_taskbarTimeout->setEnabled( b );
+}
+
+void
+LaunchConfig::load()
+{
+ load( false );
+}
+
+void
+LaunchConfig::load(bool useDefaults)
+{
+ KConfig c("klaunchrc", false, false);
+
+ c.setReadDefaults( useDefaults );
+
+ c.setGroup("FeedbackStyle");
+
+ bool busyCursor =
+ c.readBoolEntry("BusyCursor", Default & BusyCursor);
+
+ bool taskbarButton =
+ c.readBoolEntry("TaskbarButton", Default & TaskbarButton);
+
+ cb_taskbarButton->setChecked(taskbarButton);
+
+ c.setGroup( "BusyCursorSettings" );
+ sb_cursorTimeout->setValue( c.readUnsignedNumEntry( "Timeout", 30 ));
+ bool busyBlinking =c.readBoolEntry("Blinking", false);
+ bool busyBouncing =c.readBoolEntry("Bouncing", true);
+ if ( !busyCursor )
+ cb_busyCursor->setCurrentItem(0);
+ else if ( busyBlinking )
+ cb_busyCursor->setCurrentItem(2);
+ else if ( busyBouncing )
+ cb_busyCursor->setCurrentItem(3);
+ else
+ cb_busyCursor->setCurrentItem(1);
+
+ c.setGroup( "TaskbarButtonSettings" );
+ sb_taskbarTimeout->setValue( c.readUnsignedNumEntry( "Timeout", 30 ));
+
+ slotBusyCursor( cb_busyCursor->currentItem() );
+ slotTaskbarButton( taskbarButton );
+
+ emit changed( useDefaults );
+}
+
+ void
+LaunchConfig::save()
+{
+ KConfig c("klaunchrc", false, false);
+
+ c.setGroup("FeedbackStyle");
+ c.writeEntry("BusyCursor", cb_busyCursor->currentItem() != 0);
+ c.writeEntry("TaskbarButton", cb_taskbarButton->isChecked());
+
+ c.setGroup( "BusyCursorSettings" );
+ c.writeEntry( "Timeout", sb_cursorTimeout->value());
+ c.writeEntry("Blinking", cb_busyCursor->currentItem() == 2);
+ c.writeEntry("Bouncing", cb_busyCursor->currentItem() == 3);
+
+ c.setGroup( "TaskbarButtonSettings" );
+ c.writeEntry( "Timeout", sb_taskbarTimeout->value());
+
+ c.sync();
+
+ emit changed( false );
+
+ if (!kapp->dcopClient()->isAttached())
+ kapp->dcopClient()->attach();
+ QByteArray data;
+ kapp->dcopClient()->send( "kicker", "Panel", "restart()", data );
+ kapp->dcopClient()->send( "kdesktop", "", "configure()", data );
+}
+
+ void
+LaunchConfig::defaults()
+{
+ load( true );
+}
+
+ void
+LaunchConfig::checkChanged()
+{
+ KConfig c("klaunchrc", false, false);
+
+ c.setGroup("FeedbackStyle");
+
+ bool savedBusyCursor =
+ c.readBoolEntry("BusyCursor", Default & BusyCursor);
+
+ bool savedTaskbarButton =
+ c.readBoolEntry("TaskbarButton", Default & TaskbarButton);
+
+ c.setGroup( "BusyCursorSettings" );
+ unsigned int savedCursorTimeout = c.readUnsignedNumEntry( "Timeout", 30 );
+ bool savedBusyBlinking =c.readBoolEntry("Blinking", false);
+ bool savedBusyBouncing =c.readBoolEntry("Bouncing", true);
+
+ c.setGroup( "TaskbarButtonSettings" );
+ unsigned int savedTaskbarTimeout = c.readUnsignedNumEntry( "Timeout", 30 );
+
+ bool newBusyCursor =cb_busyCursor->currentItem()!=0;
+
+ bool newTaskbarButton =cb_taskbarButton->isChecked();
+
+ bool newBusyBlinking= cb_busyCursor->currentItem()==2;
+ bool newBusyBouncing= cb_busyCursor->currentItem()==3;
+
+ unsigned int newCursorTimeout = sb_cursorTimeout->value();
+
+ unsigned int newTaskbarTimeout = sb_taskbarTimeout->value();
+
+ emit changed(
+ savedBusyCursor != newBusyCursor
+ ||
+ savedTaskbarButton != newTaskbarButton
+ ||
+ savedCursorTimeout != newCursorTimeout
+ ||
+ savedTaskbarTimeout != newTaskbarTimeout
+ ||
+ savedBusyBlinking != newBusyBlinking
+ ||
+ savedBusyBouncing != newBusyBouncing
+ );
+}
+
+#include "kcmlaunch.moc"
diff --git a/kcontrol/launch/kcmlaunch.desktop b/kcontrol/launch/kcmlaunch.desktop
new file mode 100644
index 000000000..0e96a2d25
--- /dev/null
+++ b/kcontrol/launch/kcmlaunch.desktop
@@ -0,0 +1,225 @@
+[Desktop Entry]
+Icon=launch
+Type=Application
+DocPath=kcontrol/kcmlaunch/index.html
+Exec=kcmshell kcmlaunch
+
+
+X-KDE-Library=launch
+X-KDE-FactoryName=launch
+X-KDE-ParentApp=kcontrol
+
+Name=Launch Feedback
+Name[af]=Lanseer Terugvoer
+Name[az]=Bildirişi Başlat
+Name[be]=Зваротнае ўздзеянне падчас запуску
+Name[bg]=Обратна връзка
+Name[bn]=লঞ্চ ফীডব্যাক
+Name[bs]=Odziv pri pokretanju
+Name[ca]=Engegador ràpid
+Name[cs]=Odezva při spouštění aplikací
+Name[csb]=Zrëszanié programów
+Name[cy]=Adborth wrth Gychwyn
+Name[da]=Starttilbagemelding
+Name[de]=Programmstartanzeige
+Name[el]=Ειδοποίηση εκκίνησης
+Name[eo]=Lanĉosignilo
+Name[es]=Notificación de lanzamiento
+Name[et]=Käivitamise tagasiside
+Name[eu]=Abiatze jakinarazpena
+Name[fa]=راه‌اندازی بازخورد
+Name[fi]=Käynnistyksen ilmaiseminen
+Name[fr]=Témoin de démarrage
+Name[fy]=Begjinmelding
+Name[ga]=Tosaigh Aisfhotha
+Name[gl]=Indicación de Lanzamento
+Name[he]=משוב לגבי הפעלה
+Name[hi]=फ़ीडबैक चलाएँ
+Name[hr]=Potvrda pokretanja
+Name[hu]=Alkalmazásindítási effektus
+Name[is]=Upplýsingar um ræsingu
+Name[it]=Segnalazione avvio applicazioni
+Name[ja]=起動フィードバック
+Name[ka]=პროგრამის გაშვება
+Name[kk]=Жегу барысы
+Name[km]=ប្រតិកម្ម​ពេល​ចាប់ផ្ដើម
+Name[ko]=실행 피드백
+Name[lo]=ຕົວທຳອິດທຳງານຢ່າງວ່ອງໄວ
+Name[lt]=Paleidimo atgalinis ryšys
+Name[lv]=Atbildes palaidējs
+Name[mk]=Повратна инфо. за старт
+Name[mn]=Ажилуулах хүсэлт
+Name[ms]=Lancar Maklum Balas
+Name[mt]=Feedback tħaddim ta' programmi
+Name[nb]=Oppstartsmelding
+Name[nds]=Startanimatschoon
+Name[ne]=पृष्ठपोषण सुरुआत गर्नुहोस्
+Name[nl]=Opstartnotificatie
+Name[nn]=Programstartmelding
+Name[nso]=Ngwadisaleswa Phetolo
+Name[pa]=ਫੀਡਬੈਕ ਜਾਰੀ ਕਰੋ
+Name[pl]=Uruchamianie programów
+Name[pt]=Comportamento da Execução
+Name[pt_BR]=Lançador rápido - Histórico
+Name[ro]=Indicator de execuție
+Name[ru]=Запуск приложений
+Name[rw]=Gutangiza Inkurikizi
+Name[se]=Prográmmaálggahan ávaštus
+Name[sk]=Štart programov
+Name[sl]=Povratna informacija zagona
+Name[sr]=Индикатор покретања
+Name[sr@Latn]=Indikator pokretanja
+Name[sv]=Gensvar vid programstart
+Name[ta]=கருத்தை தொடங்கு
+Name[tg]=Иҷрои баёния
+Name[th]=การตอบสนองเวลาเรียกโปรแกรม
+Name[tr]=Başlatma Simgesi
+Name[tt]=Cibärü Tärtibe
+Name[uk]=Відображення запуску
+Name[uz]=Dastur ishga tushish xabarnomasi
+Name[uz@cyrillic]=Дастур ишга тушиш хабарномаси
+Name[ven]=U fara phindulo
+Name[vi]=Phản hồi quá trình khởi động
+Name[wa]=Lancî on rtour
+Name[zh_CN]=启动反馈
+Name[zh_TW]=程式啟動回饋風格
+Name[zu]=Qalisa umphumela obuyayo
+
+Comment=Choose application-launch feedback style
+Comment[af]=Kies application-launch terugvoer styl
+Comment[az]=Proqramın əks tə'sir tərzini seçin.
+Comment[be]=Выбар стылю зваротнага дзеяння падчас запуску
+Comment[bg]=Настройване на известяването при стартиране
+Comment[bn]=নতুন অ্যাপলিকেশন চালু করা হলে কিভাবে তা জানানো হবে নির্বাচন করুন
+Comment[bs]=Odaberite stil odziva aplikacija prilikom pokretanja
+Comment[ca]=Escull l'estil per a carregar ràpidament una aplicació
+Comment[cs]=Vyberte styl odezvy při spouštění aplikací
+Comment[csb]=Wëbierzë ôrt dôwaniô wiédzë ò zrëszaniô programë
+Comment[cy]=Dewis arddull adborth wrth gychwyn rhaglen
+Comment[da]=Vælg tilbagemeldingsstil for programopstart
+Comment[de]=Wählen Sie die Rückmeldung aus, die ein Programm beim Starten gibt
+Comment[el]=Επιλέξτε στυλ για την ειδοποίηση εκκίνησης των εφαρμογών
+Comment[eo]=Signado de lanĉiĝantaj aplikaĵoj
+Comment[es]=Elija el estilo de notificación de lanzamiento de las aplicaciones
+Comment[et]=Rakenduste käivitamisel kasutajale antava tagasiside seadistamine
+Comment[eu]=Aukeratu aplikazioen abiatze-jakinarazpenen estiloa
+Comment[fa]=انتخاب سبک بازخورد راه‌اندازی کاربرد
+Comment[fi]=Valitse ohjelmien käynnistymisestä kertovan tiedon tyyli
+Comment[fr]=Définit le style du témoin de démarrage des applications
+Comment[fy]=Hjir kinne jo bepale wat fisueel te sjen is by it begjinnen fan in applikaasje.
+Comment[gl]=Escoller o estilo de indicación do lanzamento dunha aplicación
+Comment[he]=שינוי הגדרות סגנון המשוב לגבי הפעלת יישומים
+Comment[hi]=अनुप्रयोग-प्रारंभ फ़ीडबैक शैली चुनें
+Comment[hr]=Odaberite stil potvrde pokretanja aplikacije
+Comment[hu]=Az alkalmazásindítási effektust lehet itt kiválasztani
+Comment[is]=Veldu hvernig upplýsingar þú færð um ræsingu forrits
+Comment[it]=Scegli come KDE ti segnala l'avvio di un'applicazione
+Comment[ja]=アプリケーション起動フィードバックのスタイルを選択
+Comment[ka]=აირჩიეთ პროგრამის შესრულების პასუხის სტილი
+Comment[kk]=Қолданбаны жегу барысын баптау
+Comment[km]=ជ្រើស​រចនាប័ទ្ម​ប្រតិកម្ម​ពេល​ចាប់ផ្ដើម​កម្មវិធី
+Comment[ko]=프로그램 실행 피드백 형태 설정
+Comment[lt]=Pasirinkite programų paleidimo atgalinio ryšio stilių
+Comment[lv]=Izvēlieties aplikācijas-palaišanas atbildes stilu
+Comment[mk]=Изберете го стилот на повратна информација од стартот на апликациите
+Comment[mn]=Та эхлэлдээ эгэх бүртгэл бүхий програм сонго
+Comment[ms]=Pilih gaya maklum balas lancar aplikasi
+Comment[mt]=Agħżel stil ta' feedback meta tħaddem programm
+Comment[nb]=Velg stil på tilbakemelding ved programstart
+Comment[nds]=Söök de Startanimatschoon för Programmen ut
+Comment[ne]=अनुप्रयोग-सुरुआत पृष्ठपोषण शैली रोज्नुहोस्
+Comment[nl]=Hier kunt u bepalen hoe u visueel wordt geattendeerd op het opstarten van een toepassing.
+Comment[nn]=Vel meldingsstil ved programstart
+Comment[nso]=Kgetha mokgwa wa phetolo ya ngwadisoleswa ya tshomiso
+Comment[pa]=ਕਾਰਜ-ਸ਼ੁਰੂ ਫੀਡਬੈਕ ਸ਼ੈਲੀ ਚੁਣੋ
+Comment[pl]=Wybierz sposób informowania o uruchamianiu programu
+Comment[pt]=Escolher a reacção ao lançamento das aplicações
+Comment[pt_BR]=Escolha o estilo do histórico de lançamento de aplicativos
+Comment[ro]=Alegeți modul de notificare a pornirii aplicațiilor
+Comment[ru]=Выбор типа отклика приложений при запуске
+Comment[rw]=Guhitamo imisusire y'inkurikizi ugutangira-porogaramu
+Comment[se]=Vállje makkár ávaštus galga leat prográmmaid álggahettiin
+Comment[sk]=Vyberte štýl odozvy pri štarte aplikácií
+Comment[sl]=Izberite program - stil pošiljanja povratne informacije
+Comment[sr]=Изаберите стил индикатора покретања
+Comment[sr@Latn]=Izaberite stil indikatora pokretanja
+Comment[sv]=Välj typ av gensvar vid programstart
+Comment[ta]=பயன்பாடு-தொடக்கத்துக்கான கருத்து பாணியை தேர்ந்தெடு
+Comment[tg]= Навъи баёнияи иҷрои-барномаро интихоб кунед
+Comment[th]=เลือกลักษณะการตอบสนองเวลาเรียกแอพพลิเคชั่น
+Comment[tr]=Uygulama başlatıcı geri besleme biçimini seç
+Comment[tt]=Yazılım cibärgändä endtäşü tärtiben caylaw
+Comment[uk]=Вибір стилю відображення запуску програм
+Comment[uz]=Dastur ishga tushish xabarnomasining turini tanlash
+Comment[uz@cyrillic]=Дастур ишга тушиш хабарномасининг турини танлаш
+Comment[ven]=Nangani tshitaela tsha phindulo tshau fara apulifikhesheni
+Comment[vi]=Chọn kiểu mà chương trình sẽ gửi phản hồi về khi khởi động
+Comment[wa]=Tchoezi li sôre di rtour di lançmint d' programes
+Comment[xh]=Khetha isicelo-yenza uhlobo lwesiphumo seLaunch
+Comment[zh_CN]=选择程序启动反馈风格
+Comment[zh_TW]=選擇程式啟動時的回饋風格
+Comment[zu]=Khetha isitayela somphumela obuyayo sokuqalisa-umyaleli
+Keywords=application,start,launch,busy,cursor,feedback,mouse,pointer,rotating,spinning,disk,startup,program,report
+Keywords[az]=proqramı tə'minatı,başla,başlat,məşğul,ox,kursor,əks tə'sir,siçan,nişanci,döndərmə,fırlatma,disk,başlanğıc,proqram,raport
+Keywords[be]=Праграма,Запуск,Выкананне,Заняты,Курсор,Мыш,Указальнік,Перагортванне,Дыск,Запуск,Дастасаванне,Справаздача,application,start,launch,busy,cursor,feedback,mouse,pointer,rotating,spinning,disk,startup,program,report
+Keywords[bg]=програма, приложение, стартиране, зает, показалец, курсор, мишка, показалеца, application, start, launch, busy, cursor, feedback, mouse, pointer, rotating, spinning, disk, startup, program, report
+Keywords[ca]=aplicació,iniciar,carregar,ocupat,cursor,notificació,ratolí,punter,rotació,gir,disc,arrencar,programa,informe
+Keywords[cs]=aplikace,spuštění,start,pracuje,kurzor,reakce,odezva,myš,otáčení,rotace,disk,startování,program,oznámení
+Keywords[csb]=programa,sztart,zrëszanié,òbczas,kùrsor,pòkrok,mësz,kùrsor,rotujący,krãceniowi,disk,programa,rapòrt
+Keywords[cy]=cymhwysiad,cychwyn,lawnsio,prysur,cyrchydd,adborth,llygoden,pwyntydd,cylchdroi,troelli,disc,dechrau,rhaglen,adroddiad
+Keywords[da]=program,start,optaget,markør,tilbagemelding,mus,peger, roterende,spinnende,disk,opstart,rapport
+Keywords[de]=Anwendungen,Start,Programmstart,Cursor,Aktivierung,Mauszeiger,Anzeige
+Keywords[el]=εφαρμογή,έναρξη,εκκίνηση,απασχολημένο,δρομέας,ανάδραση,ποντίκι,δείκτης,περιστροφή,περιστρεφόμενος,δίσκος,έναρξη,πρόγραμμα,αναφορά
+Keywords[eo]=aplikaĵo,lanĉo,komenco,okupita,kursilo,reago,muso,montrilo,rotacio,turniĝo,disketo,programo,raporto
+Keywords[es]=aplicación,iniciar,lanzar,ocupado,cursor,notificación,ratón,puntero,rotación,giro,disco,arrancar,programa,informar
+Keywords[et]=rakendus,käivitamine,hõivatud,kursor,tagasiside,hiir,hiirekursor
+Keywords[eu]=aplikazioa,abiatu,lanpetuta,kurtsorea,jakinarazpena,sagua,gezia,errotazioa,itzulbira,diskoa,programa,jakinarazi
+Keywords[fa]=کاربرد، آغاز، راه‌انداختن، مشغول، مکان‌نما، بازخورد، موشی، اشاره‌گر، چرخش، دوار، دیسک، راه‌اندازی، برنامه، گزارش
+Keywords[fi]=sovellus,käynnistyminen,käynnistäminen,varattu,osoitin,palaute,hiiri, pyörivä,levy,ohjelma
+Keywords[fr]=application,démarrage,occupé,curseur,souris,pointeur,rotation,disque,programme,rapport
+Keywords[fy]=applikaasje,start,begjinne,dwaande,rinnerke,feedback,mûs,wizer,rotaasje,rûndraaie,skiif,begjinne,programma,rapport
+Keywords[ga]=feidhmchlár,tosach,tosaigh,gafa,cúrsóir,aisfhotha,luch,luchóg,pointeoir,rothlú,casadh,diosca,tosú,clár,tuairisc
+Keywords[gl]=aplicación,início,executar,ocupado,ponteiro,execución,rato,ponteiro,rotación,xiro,disco,início,programa,informe
+Keywords[he]=עכבר,מצביע,מסתובב,דיסק,תוכנית,דיווח,יישום,הפעלה,אתחול,עסוק,סמן,משוב,application,start,launch,busy,cursor,feedback,mouse,pointer,rotating,spinning,disk,startup,program,report
+Keywords[hi]=अनुप्रयोग,प्रारंभ,शुरू,व्यस्त,संकेतक,फ़ीडबैक,माउस,प्वाइंटर,घूमता,चक्कर लगाता,डिस्क,प्रारंभ में,प्रोग्राम,रिपोर्ट
+Keywords[hr]=application,start,launch,busy,cursor,feedback,mouse,pointer,rotating,spinning,disk,startup,program,report,aplikacija,pokretanje,započinjanje,zauzet,pokazivač,povratni podaci,potvrda,miš,vrtnja,disk,izvještaj
+Keywords[hu]=alkalmazás,start,indítás,elfoglalt,egérmutató,visszajelzés,egér,effektus,forgó,pörgő,lemez,indulás,program,jelzés
+Keywords[is]=forrit,start,keyrsla,upptekin,bendill,upplýsingar,mús,pointer,rotating,spinning,disk,startup,program,report
+Keywords[it]=applicazione,avvio,lancio,occupato,cursore,feedback,segnalazione,mouse,puntatore,rotazione,disco,programma,segnale
+Keywords[ja]=アプリケーション,開始,起動,ビジー,カーソル,フィードバック,マウス,ポインタ,回転,スピン,開始,プログラム,レポート
+Keywords[km]=កម្មវិធី,ចាប់ផ្ដើម,បើក​ដំណើរការ,រវល់,ទស្សន៍​ទ្រនិច,ប្រតិកម្ម,កណ្ដុរ,ទ្រនិច,ការ​បង្វិល,រិះគន់,ថាស,ចាប់ផ្ដើម​ឡើង,កម្មវិធី,របាយការណ៍
+Keywords[lt]=application,start,launch,busy,cursor,feedback,mouse,pointer,rotating,spinning,disk,startup,program,report, programa,startas,paleisti,užimtas,kursorius,atgalinis ryšys, pelė, sukimasis, diskas, paleidimas, raportas
+Keywords[lv]=aplikācija,startēt,palaist,aizņemts,kursors,atbilde,pele,bultiņa,rotēšana,sagriešanās,disks,startēšana,programma,reports
+Keywords[mk]=application,start,launch,busy,cursor,feedback,mouse,pointer,rotating,spinning,disk,startup,program,report,апликација,старт,зафатен,курсор,глушец,покажувач,ротирачки,вртечки,диск,програма,извештај
+Keywords[mn]=application,Эхлэл,Програм эхлэл,Түүчээ,Идэвхижүүлэл, Хулгана заагч,тайлан
+Keywords[nb]=program,start,åpne,opptatt,markør,mus,peker,rotere,spinne,disk,oppstart,rapport
+Keywords[nds]=Programm,start,launch,busy,Blinker,feedback,Muus,Wieser,dreihen,spinning,Diskett,Hoochfohren,Programm,Bericht
+Keywords[ne]=अनुप्रयोग, सुरु, सुरुआत, व्यस्त, कर्सर, पृष्ठपोषण, माउस, सूचक, घुमाउने, स्पाइनिङ, डिस्क, सुरु, कार्यक्रम, प्रतिवेदन
+Keywords[nn]=program,start,oppstart,oppteken,peikar,mus,musepeikar,tilbakemelding,disk
+Keywords[nso]=tshomiso,thoma,ngwadisoleswa,swaregile,cursor,phetolo,mouse,sesupi,rarela,dikologa,disk,thomiso,lenaneo,pego
+Keywords[pa]=application,start,launch,busy,cursor,feedback,mouse,pointer,rotating,spinning,disk,startup,program,report,ਕਾਰਜ, ਸ਼ੁਰੂ,ਰੁਝਿਆ,ਫੀਡਬੈਕ,ਮਾਊਸ,ਬਿੰਦੂ,ਡਿਸਕ,ਕਾਰਜ,ਰਿਪੋਰਟ
+Keywords[pl]=program,start,uruchomienie,w trakcie,kursor,postęp,mysz,wskażnik,obracający się,wirujący,dysk,program,raport
+Keywords[pt]=aplicação,iniciar,lançar,ocupado,cursor,comportamento,feedback,rato,rodar,disco,início,programa,comunicar,reacção
+Keywords[pt_BR]=aplicativo,iniciar,lançar,ocupado,cursor,mouse,ponteiro,rotacionar,rotação,disco,inicializar,programa,relatório
+Keywords[ro]=aplicație,start,pornire,cursor,mouse,indicator,rotire,disc,program,raportare
+Keywords[rw]=porogaramu,gutangira,gutangiza,gihuze,inyoboyandika,inkurikizi,imbeba,mweretsi,kuzenguruka,kuzengurutsa,itangira,porogaramu,raporo
+Keywords[se]=prográmma,álggaheapmi,rahpat,geavahusas,sieván,sáhpán,jorahit,skearru,raporta
+Keywords[sk]=aplikácia,spustenie,štart,pracuje,kurzor,reakcia,odozva,myš,otáčanie,rotácia,disk,pri štarte,program,oznámenie
+Keywords[sl]=program,začetek,zagon,zaposlen,utripač,povratna informacija,miška,kazalec,vrteče,disk,aplikacija,poročilo
+Keywords[sr]=application,старт,launch,busy,cursor,feedback,mouse,pointer,rotating,spinning,диск,startup,програм,report,показивач,disk,program,покретање
+Keywords[sr@Latn]=application,start,launch,busy,cursor,feedback,mouse,pointer,rotating,spinning,disk,startup,program,report,pokazivač,disk,program,pokretanje
+Keywords[sv]=program,start,upptagen,markör,gensvar,mus,pekare,roterande,snurrande,disk,uppstart,rapport
+Keywords[ta]=பயன்பாடு, துவக்கம், தொடக்கம், நேரமின்மை,கருத்து,நிலைக்காட்டடி,சுட்டி,சுழற்று,சுழல்,வட்டு,துவக்கம்,நிரல்,அறிக்கை
+Keywords[th]=แอพพลิเคชัน,เริ่ม,เรียกทำงาน,ไม่ว่าง,เคอร์เซอร์,ตอบสนอง,เม้าส์,ตัวชี้,การวน,การหมุน,ดิสก์,เริ่มทำงาน,โปรแกรม,รายงาน
+Keywords[tr]=uygulama,başlat,hızlı başlat,meşgul,imleç,geri besleme,fare,gösterici,dönen,fırıl fırıl dönen,disk,Başlangıç,program,rapor
+Keywords[uk]=програма,старт,пуск,працюю,курсор,відображення,мишка,вказівник,обертання,крутіння,диск,запуск,звіт
+Keywords[uz]=dastur,ishga tushirish,band,kursor,sichqchoncha,disk,aylanuvchi,spinning,ishga tushish,hisobot
+Keywords[uz@cyrillic]=дастур,ишга тушириш,банд,курсор,сичқчонча,диск,айланувчи,spinning,ишга тушиш,ҳисобот
+Keywords[vi]=chương trình ứng dụng,bắt đầu,khởi đầu,bận,con trỏ,chuột,con trỏ,quay,quay tròn,đĩa,khởi động,chương trình,báo cáo
+Keywords[wa]=programe,enonder,lancî,ocupé,fletche,ritour,sori,toune,plake,enonde tot seu,aplicåcion,rapoirt
+Keywords[xh]=isicelo,qala,launch,xakekile,isalathisi,isiphumo,imouse,isalathisi,iyajikeleza,qulukubhede,idiski,qala,udweliso lwenkqubo,ingxelo
+Keywords[zh_CN]=application,start,launch,busy,cursor,feedback,mouse,pointer,rotating,spinning,disk,startup,program,report,程序,启动,忙,光标,反馈,鼠标指针,旋转,磁盘,启动,报告
+Keywords[zh_TW]=application,start,launch,busy,cursor,feedback,mouse,pointer,rotating,spinning,disk,startup,program,report,應用程式,開始,啟動,忙碌,游標,回饋,滑鼠,指標,回轉,旋轉,磁碟,啟動,程式,報告
+Keywords[zu]=umyaleli,qala,qalisa,kumatasatasa,inkomba,umphumela obuyayo,i-mouse,inkomba yendawo yokubhala,iyajikeleza,iyajikeleza,i-disk qalisa,uhlelo lwemisebenzi,umbiko
+
+Categories=Qt;KDE;X-KDE-settings-looknfeel;
diff --git a/kcontrol/launch/kcmlaunch.h b/kcontrol/launch/kcmlaunch.h
new file mode 100644
index 000000000..c69bef943
--- /dev/null
+++ b/kcontrol/launch/kcmlaunch.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#ifndef __kcmlaunch_h__
+#define __kcmlaunch_h__
+
+#include <kcmodule.h>
+
+class QCheckBox;
+class QComboBox;
+class QGroupBox;
+
+class KIntNumInput;
+
+class LaunchConfig : public KCModule
+{
+ Q_OBJECT
+
+ public:
+
+ LaunchConfig(QWidget * parent = 0, const char * name = 0, const QStringList &list = QStringList() );
+
+ virtual ~LaunchConfig();
+
+ void load();
+ void load(bool useDefaults);
+ void save();
+ void defaults();
+
+ protected slots:
+
+ void checkChanged();
+ void slotBusyCursor(int);
+ void slotTaskbarButton(bool);
+
+ protected:
+
+ enum FeedbackStyle
+ {
+ BusyCursor = 1 << 0,
+ TaskbarButton = 1 << 1,
+
+ Default = BusyCursor | TaskbarButton
+ };
+
+
+ private:
+
+ QLabel * lbl_cursorTimeout;
+ QLabel * lbl_taskbarTimeout;
+ QComboBox * cb_busyCursor;
+ QCheckBox * cb_taskbarButton;
+ KIntNumInput * sb_cursorTimeout;
+ KIntNumInput * sb_taskbarTimeout;
+
+};
+
+#endif
diff --git a/kcontrol/locale/AUTHORS b/kcontrol/locale/AUTHORS
new file mode 100644
index 000000000..74a381b48
--- /dev/null
+++ b/kcontrol/locale/AUTHORS
@@ -0,0 +1,2 @@
+Matthias Hoelzer (hoelzer@physik.uni-wuerzburg.de)
+Hans Petter Bieker <bieker@kde.org>
diff --git a/kcontrol/locale/Makefile.am b/kcontrol/locale/Makefile.am
new file mode 100644
index 000000000..8ca082408
--- /dev/null
+++ b/kcontrol/locale/Makefile.am
@@ -0,0 +1,32 @@
+#AM_CPPFLAGS = -DQT_NO_CAST_ASCII -DQT_NO_COMPAT
+
+AM_CPPFLAGS = $(all_includes)
+
+SUBDIRS = default pics
+
+kde_module_LTLIBRARIES = kcm_locale.la
+kcm_locale_la_SOURCES = main.cpp toplevel.cpp kcmlocale.cpp klocalesample.cpp localenum.cpp localemon.cpp localetime.cpp localeother.cpp
+METASOURCES = AUTO
+noinst_HEADERS = toplevel.h kcmlocale.h klocalesample.h localenum.h localemon.h localetime.h localeother.h
+
+kcm_locale_la_LDFLAGS = -module -avoid-version $(all_libraries) -no-undefined
+kcm_locale_la_LIBADD = $(LIB_KIO)
+
+# Note: newer glibc (e.g. zonetab version 1.31 (cvs revision 1.22) have more/other data than older ones (e.g. zonetab version 1.28)
+
+# timezones-manual is for adding entried from a zone.tab downloaded from glibc's CVS
+timezones-manual:
+ grep -v '^#' zone.tab | tr ' ' ' ' | sed -e "s# *# #" | cut -d' ' -f3 | sed -e 's,^,i18n(",; s,$$,");,' >> $(srcdir)/TIMEZONES
+ sort -u $(srcdir)/TIMEZONES > t && mv t $(srcdir)/TIMEZONES
+
+timezones:
+ grep -v '^#' /usr/share/zoneinfo/zone.tab | tr ' ' ' ' | sed -e "s# *# #" | cut -d' ' -f3 | sed -e 's,^,i18n(",; s,$$,");,' >> $(srcdir)/TIMEZONES
+ sort -u $(srcdir)/TIMEZONES > t && mv t $(srcdir)/TIMEZONES
+
+
+messages:
+ $(XGETTEXT) -ktranslate $(kcm_locale_la_SOURCES) -o $(podir)/kcmlocale.pot
+ $(XGETTEXT) TIMEZONES -o $(podir)/../kdelibs/timezones.pot
+
+xdg_apps_DATA = language.desktop
+
diff --git a/kcontrol/locale/TIMEZONES b/kcontrol/locale/TIMEZONES
new file mode 100644
index 000000000..49839aea4
--- /dev/null
+++ b/kcontrol/locale/TIMEZONES
@@ -0,0 +1,392 @@
+i18n("Africa/Abidjan");
+i18n("Africa/Accra");
+i18n("Africa/Addis_Ababa");
+i18n("Africa/Algiers");
+i18n("Africa/Asmera");
+i18n("Africa/Bamako");
+i18n("Africa/Bangui");
+i18n("Africa/Banjul");
+i18n("Africa/Bissau");
+i18n("Africa/Blantyre");
+i18n("Africa/Brazzaville");
+i18n("Africa/Bujumbura");
+i18n("Africa/Cairo");
+i18n("Africa/Casablanca");
+i18n("Africa/Ceuta");
+i18n("Africa/Conakry");
+i18n("Africa/Dakar");
+i18n("Africa/Dar_es_Salaam");
+i18n("Africa/Djibouti");
+i18n("Africa/Douala");
+i18n("Africa/El_Aaiun");
+i18n("Africa/Freetown");
+i18n("Africa/Gaborone");
+i18n("Africa/Harare");
+i18n("Africa/Johannesburg");
+i18n("Africa/Kampala");
+i18n("Africa/Khartoum");
+i18n("Africa/Kigali");
+i18n("Africa/Kinshasa");
+i18n("Africa/Lagos");
+i18n("Africa/Libreville");
+i18n("Africa/Lome");
+i18n("Africa/Luanda");
+i18n("Africa/Lubumbashi");
+i18n("Africa/Lusaka");
+i18n("Africa/Malabo");
+i18n("Africa/Maputo");
+i18n("Africa/Maseru");
+i18n("Africa/Mbabane");
+i18n("Africa/Mogadishu");
+i18n("Africa/Monrovia");
+i18n("Africa/Nairobi");
+i18n("Africa/Ndjamena");
+i18n("Africa/Niamey");
+i18n("Africa/Nouakchott");
+i18n("Africa/Ouagadougou");
+i18n("Africa/Porto-Novo");
+i18n("Africa/Sao_Tome");
+i18n("Africa/Timbuktu");
+i18n("Africa/Tripoli");
+i18n("Africa/Tunis");
+i18n("Africa/Windhoek");
+i18n("America/Adak");
+i18n("America/Anchorage");
+i18n("America/Anguilla");
+i18n("America/Antigua");
+i18n("America/Araguaina");
+i18n("America/Argentina/Buenos_Aires");
+i18n("America/Argentina/Catamarca");
+i18n("America/Argentina/ComodRivadavia");
+i18n("America/Argentina/Cordoba");
+i18n("America/Argentina/Jujuy");
+i18n("America/Argentina/La_Rioja");
+i18n("America/Argentina/Mendoza");
+i18n("America/Argentina/Rio_Gallegos");
+i18n("America/Argentina/San_Juan");
+i18n("America/Argentina/Tucuman");
+i18n("America/Argentina/Ushuaia");
+i18n("America/Aruba");
+i18n("America/Asuncion");
+i18n("America/Bahia");
+i18n("America/Barbados");
+i18n("America/Belem");
+i18n("America/Belize");
+i18n("America/Boa_Vista");
+i18n("America/Bogota");
+i18n("America/Boise");
+i18n("America/Buenos_Aires");
+i18n("America/Cambridge_Bay");
+i18n("America/Campo_Grande");
+i18n("America/Cancun");
+i18n("America/Caracas");
+i18n("America/Catamarca");
+i18n("America/Cayenne");
+i18n("America/Cayman");
+i18n("America/Chicago");
+i18n("America/Chihuahua");
+i18n("America/Cordoba");
+i18n("America/Costa_Rica");
+i18n("America/Cuiaba");
+i18n("America/Curacao");
+i18n("America/Danmarkshavn");
+i18n("America/Dawson");
+i18n("America/Dawson_Creek");
+i18n("America/Denver");
+i18n("America/Detroit");
+i18n("America/Dominica");
+i18n("America/Edmonton");
+i18n("America/Eirunepe");
+i18n("America/El_Salvador");
+i18n("America/Fortaleza");
+i18n("America/Glace_Bay");
+i18n("America/Godthab");
+i18n("America/Goose_Bay");
+i18n("America/Grand_Turk");
+i18n("America/Grenada");
+i18n("America/Guadeloupe");
+i18n("America/Guatemala");
+i18n("America/Guayaquil");
+i18n("America/Guyana");
+i18n("America/Halifax");
+i18n("America/Havana");
+i18n("America/Hermosillo");
+i18n("America/Indiana/Knox");
+i18n("America/Indiana/Marengo");
+i18n("America/Indiana/Vevay");
+i18n("America/Indianapolis");
+i18n("America/Inuvik");
+i18n("America/Iqaluit");
+i18n("America/Jamaica");
+i18n("America/Jujuy");
+i18n("America/Juneau");
+i18n("America/Kentucky/Monticello");
+i18n("America/La_Paz");
+i18n("America/Lima");
+i18n("America/Los_Angeles");
+i18n("America/Louisville");
+i18n("America/Maceio");
+i18n("America/Managua");
+i18n("America/Manaus");
+i18n("America/Martinique");
+i18n("America/Mazatlan");
+i18n("America/Mendoza");
+i18n("America/Menominee");
+i18n("America/Merida");
+i18n("America/Mexico_City");
+i18n("America/Miquelon");
+i18n("America/Monterrey");
+i18n("America/Montevideo");
+i18n("America/Montreal");
+i18n("America/Montserrat");
+i18n("America/Nassau");
+i18n("America/New_York");
+i18n("America/Nipigon");
+i18n("America/Nome");
+i18n("America/Noronha");
+i18n("America/North_Dakota/Center");
+i18n("America/Panama");
+i18n("America/Pangnirtung");
+i18n("America/Paramaribo");
+i18n("America/Phoenix");
+i18n("America/Port-au-Prince");
+i18n("America/Port_of_Spain");
+i18n("America/Porto_Velho");
+i18n("America/Puerto_Rico");
+i18n("America/Rainy_River");
+i18n("America/Rankin_Inlet");
+i18n("America/Recife");
+i18n("America/Regina");
+i18n("America/Rio_Branco");
+i18n("America/Rosario");
+i18n("America/Santiago");
+i18n("America/Santo_Domingo");
+i18n("America/Sao_Paulo");
+i18n("America/Scoresbysund");
+i18n("America/Shiprock");
+i18n("America/St_Johns");
+i18n("America/St_Kitts");
+i18n("America/St_Lucia");
+i18n("America/St_Thomas");
+i18n("America/St_Vincent");
+i18n("America/Swift_Current");
+i18n("America/Tegucigalpa");
+i18n("America/Thule");
+i18n("America/Thunder_Bay");
+i18n("America/Tijuana");
+i18n("America/Toronto");
+i18n("America/Tortola");
+i18n("America/Vancouver");
+i18n("America/Whitehorse");
+i18n("America/Winnipeg");
+i18n("America/Yakutat");
+i18n("America/Yellowknife");
+i18n("Antarctica/Casey");
+i18n("Antarctica/Davis");
+i18n("Antarctica/DumontDUrville");
+i18n("Antarctica/Mawson");
+i18n("Antarctica/McMurdo");
+i18n("Antarctica/Palmer");
+i18n("Antarctica/Rothera");
+i18n("Antarctica/South_Pole");
+i18n("Antarctica/Syowa");
+i18n("Antarctica/Vostok");
+i18n("Arctic/Longyearbyen");
+i18n("Asia/Aden");
+i18n("Asia/Almaty");
+i18n("Asia/Amman");
+i18n("Asia/Anadyr");
+i18n("Asia/Aqtau");
+i18n("Asia/Aqtobe");
+i18n("Asia/Ashgabat");
+i18n("Asia/Baghdad");
+i18n("Asia/Bahrain");
+i18n("Asia/Baku");
+i18n("Asia/Bangkok");
+i18n("Asia/Beirut");
+i18n("Asia/Bishkek");
+i18n("Asia/Brunei");
+i18n("Asia/Calcutta");
+i18n("Asia/Choibalsan");
+i18n("Asia/Chongqing");
+i18n("Asia/Colombo");
+i18n("Asia/Damascus");
+i18n("Asia/Dhaka");
+i18n("Asia/Dili");
+i18n("Asia/Dubai");
+i18n("Asia/Dushanbe");
+i18n("Asia/Gaza");
+i18n("Asia/Harbin");
+i18n("Asia/Hong_Kong");
+i18n("Asia/Hovd");
+i18n("Asia/Irkutsk");
+i18n("Asia/Jakarta");
+i18n("Asia/Jayapura");
+i18n("Asia/Jerusalem");
+i18n("Asia/Kabul");
+i18n("Asia/Kamchatka");
+i18n("Asia/Karachi");
+i18n("Asia/Kashgar");
+i18n("Asia/Katmandu");
+i18n("Asia/Krasnoyarsk");
+i18n("Asia/Kuala_Lumpur");
+i18n("Asia/Kuching");
+i18n("Asia/Kuwait");
+i18n("Asia/Macau");
+i18n("Asia/Magadan");
+i18n("Asia/Makassar");
+i18n("Asia/Manila");
+i18n("Asia/Muscat");
+i18n("Asia/Nicosia");
+i18n("Asia/Novosibirsk");
+i18n("Asia/Omsk");
+i18n("Asia/Oral");
+i18n("Asia/Phnom_Penh");
+i18n("Asia/Pontianak");
+i18n("Asia/Pyongyang");
+i18n("Asia/Qatar");
+i18n("Asia/Qyzylorda");
+i18n("Asia/Rangoon");
+i18n("Asia/Riyadh");
+i18n("Asia/Saigon");
+i18n("Asia/Sakhalin");
+i18n("Asia/Samarkand");
+i18n("Asia/Seoul");
+i18n("Asia/Shanghai");
+i18n("Asia/Singapore");
+i18n("Asia/Taipei");
+i18n("Asia/Tashkent");
+i18n("Asia/Tbilisi");
+i18n("Asia/Tehran");
+i18n("Asia/Thimphu");
+i18n("Asia/Tokyo");
+i18n("Asia/Ujung_Pandang");
+i18n("Asia/Ulaanbaatar");
+i18n("Asia/Urumqi");
+i18n("Asia/Vientiane");
+i18n("Asia/Vladivostok");
+i18n("Asia/Yakutsk");
+i18n("Asia/Yekaterinburg");
+i18n("Asia/Yerevan");
+i18n("Atlantic/Azores");
+i18n("Atlantic/Bermuda");
+i18n("Atlantic/Canary");
+i18n("Atlantic/Cape_Verde");
+i18n("Atlantic/Faeroe");
+i18n("Atlantic/Jan_Mayen");
+i18n("Atlantic/Madeira");
+i18n("Atlantic/Reykjavik");
+i18n("Atlantic/South_Georgia");
+i18n("Atlantic/St_Helena");
+i18n("Atlantic/Stanley");
+i18n("Australia/Adelaide");
+i18n("Australia/Brisbane");
+i18n("Australia/Broken_Hill");
+i18n("Australia/Darwin");
+i18n("Australia/Hobart");
+i18n("Australia/Lindeman");
+i18n("Australia/Lord_Howe");
+i18n("Australia/Melbourne");
+i18n("Australia/Perth");
+i18n("Australia/Sydney");
+i18n("Europe/Amsterdam");
+i18n("Europe/Andorra");
+i18n("Europe/Athens");
+i18n("Europe/Belfast");
+i18n("Europe/Belgrade");
+i18n("Europe/Berlin");
+i18n("Europe/Bratislava");
+i18n("Europe/Brussels");
+i18n("Europe/Bucharest");
+i18n("Europe/Budapest");
+i18n("Europe/Chisinau");
+i18n("Europe/Copenhagen");
+i18n("Europe/Dublin");
+i18n("Europe/Gibraltar");
+i18n("Europe/Helsinki");
+i18n("Europe/Istanbul");
+i18n("Europe/Kaliningrad");
+i18n("Europe/Kiev");
+i18n("Europe/Lisbon");
+i18n("Europe/Ljubljana");
+i18n("Europe/London");
+i18n("Europe/Luxembourg");
+i18n("Europe/Madrid");
+i18n("Europe/Malta");
+i18n("Europe/Mariehamn");
+i18n("Europe/Minsk");
+i18n("Europe/Monaco");
+i18n("Europe/Moscow");
+i18n("Europe/Oslo");
+i18n("Europe/Paris");
+i18n("Europe/Prague");
+i18n("Europe/Riga");
+i18n("Europe/Rome");
+i18n("Europe/Samara");
+i18n("Europe/San_Marino");
+i18n("Europe/Sarajevo");
+i18n("Europe/Simferopol");
+i18n("Europe/Skopje");
+i18n("Europe/Sofia");
+i18n("Europe/Stockholm");
+i18n("Europe/Tallinn");
+i18n("Europe/Tirane");
+i18n("Europe/Uzhgorod");
+i18n("Europe/Vaduz");
+i18n("Europe/Vatican");
+i18n("Europe/Vienna");
+i18n("Europe/Vilnius");
+i18n("Europe/Warsaw");
+i18n("Europe/Zagreb");
+i18n("Europe/Zaporozhye");
+i18n("Europe/Zurich");
+i18n("Indian/Antananarivo");
+i18n("Indian/Chagos");
+i18n("Indian/Christmas");
+i18n("Indian/Cocos");
+i18n("Indian/Comoro");
+i18n("Indian/Kerguelen");
+i18n("Indian/Mahe");
+i18n("Indian/Maldives");
+i18n("Indian/Mauritius");
+i18n("Indian/Mayotte");
+i18n("Indian/Reunion");
+i18n("Pacific/Apia");
+i18n("Pacific/Auckland");
+i18n("Pacific/Chatham");
+i18n("Pacific/Easter");
+i18n("Pacific/Efate");
+i18n("Pacific/Enderbury");
+i18n("Pacific/Fakaofo");
+i18n("Pacific/Fiji");
+i18n("Pacific/Funafuti");
+i18n("Pacific/Galapagos");
+i18n("Pacific/Gambier");
+i18n("Pacific/Guadalcanal");
+i18n("Pacific/Guam");
+i18n("Pacific/Honolulu");
+i18n("Pacific/Johnston");
+i18n("Pacific/Kiritimati");
+i18n("Pacific/Kosrae");
+i18n("Pacific/Kwajalein");
+i18n("Pacific/Majuro");
+i18n("Pacific/Marquesas");
+i18n("Pacific/Midway");
+i18n("Pacific/Nauru");
+i18n("Pacific/Niue");
+i18n("Pacific/Norfolk");
+i18n("Pacific/Noumea");
+i18n("Pacific/Pago_Pago");
+i18n("Pacific/Palau");
+i18n("Pacific/Pitcairn");
+i18n("Pacific/Ponape");
+i18n("Pacific/Port_Moresby");
+i18n("Pacific/Rarotonga");
+i18n("Pacific/Saipan");
+i18n("Pacific/Tahiti");
+i18n("Pacific/Tarawa");
+i18n("Pacific/Tongatapu");
+i18n("Pacific/Truk");
+i18n("Pacific/Wake");
+i18n("Pacific/Wallis");
+i18n("Pacific/Yap");
diff --git a/kcontrol/locale/default/Makefile.am b/kcontrol/locale/default/Makefile.am
new file mode 100644
index 000000000..dce42537e
--- /dev/null
+++ b/kcontrol/locale/default/Makefile.am
@@ -0,0 +1,2 @@
+kcm_locale_data_DATA = entry.desktop
+kcm_locale_datadir = $(kde_locale)/en_US
diff --git a/kcontrol/locale/default/entry.desktop b/kcontrol/locale/default/entry.desktop
new file mode 100644
index 000000000..4b105a8b2
--- /dev/null
+++ b/kcontrol/locale/default/entry.desktop
@@ -0,0 +1,72 @@
+[KCM Locale]
+Name=US English
+Name[af]=Amerikaanse Engels
+Name[ar]=إنكليزية الولايات المتحدة الأمريكية
+Name[az]=ABŞ İngiliscəsi
+Name[be]=Ангельская (ЗША)
+Name[bg]=Американски английски
+Name[br]=Saozneg SUA
+Name[bs]=Engleski US
+Name[ca]=Anglès US
+Name[cs]=Americká angličtina
+Name[csb]=Amerikańsczi anielsczi
+Name[cy]=Saesneg UD
+Name[da]=Engelsk US
+Name[de]=US-Englisch
+Name[el]=Αγγλική ΗΠΑ
+Name[eo]=Usona anglo
+Name[es]=Inglés de EEUU
+Name[et]=Inglise (US)
+Name[eu]=EEBBetako ingelesa
+Name[fa]=انگلیسی امریکایی
+Name[fi]=Yhdysvaltain englanti
+Name[fr]=Anglais US
+Name[fy]=VS Ingelsk
+Name[gl]=Inglés de EEUU
+Name[he]=אנגלית ארה"ב
+Name[hi]=यूएस अंग्रेजी
+Name[hr]=Američki engleski
+Name[hu]=Amerikai angol
+Name[is]=Enska (BNA)
+Name[it]=Inglese US
+Name[ja]=英語 (アメリカ)
+Name[ka]=ინგლისური (აშშ)
+Name[kk]=Ағылшын (АҚШ)
+Name[km]=អង់គ្លេស អាមេរិក
+Name[ko]=미국 영어
+Name[lt]=JAV anglų
+Name[lv]=ASV Angļu
+Name[mk]=Англиски (САД)
+Name[ms]=Bahasa Inggeris AS
+Name[mt]=Ingliż Amerikan
+Name[nb]=Engelsk (USA)
+Name[nds]=Engelsch (US)
+Name[ne]=US अङ्ग्रेजी
+Name[nl]=VS Engels
+Name[nn]=Engelsk (USA)
+Name[pa]=ਅਮਰੀਕੀ ਅੰਗਰੇਜ਼ੀ
+Name[pl]=Amerykański angielski
+Name[pt]=Inglês dos Estados Unidos
+Name[pt_BR]=Inglês dos EUA
+Name[ro]=Engleză US
+Name[ru]=Английский (США)
+Name[rw]=Icyongereza US
+Name[se]=Eŋgelasgiella (USA)
+Name[sk]=Anglický US
+Name[sl]=Angleško ZDA
+Name[sr]=Амерички енглески
+Name[sr@Latn]=Američki engleski
+Name[sv]=Amerikansk engelska
+Name[ta]=US ஆங்கிலம்
+Name[te]=యూఎస్ ఆంగ్లం
+Name[tg]=Англисии (ШМА)
+Name[th]=อังกฤษ อเมริกัน
+Name[tr]=Amerikan İngilizcesi
+Name[tt]=AQŞ İnglizçäse
+Name[uk]=Англійська (США)
+Name[uz]=Inglizcha AQSH
+Name[uz@cyrillic]=Инглизча AҚШ
+Name[vi]=Tiếng Anh-Mĩ
+Name[wa]=Inglès (USA)
+Name[zh_CN]=美国英语
+Name[zh_TW]=英語 - US
diff --git a/kcontrol/locale/kcmlocale.cpp b/kcontrol/locale/kcmlocale.cpp
new file mode 100644
index 000000000..5d746212e
--- /dev/null
+++ b/kcontrol/locale/kcmlocale.cpp
@@ -0,0 +1,473 @@
+/*
+ * locale.cpp
+ *
+ * Copyright (c) 1998 Matthias Hoelzer (hoelzer@physik.uni-wuerzburg.de)
+ * Copyright (c) 1999 Preston Brown <pbrown@kde.org>
+ * Copyright (c) 1999-2003 Hans Petter Bieker <bieker@kde.org>
+ *
+ * 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 <qhbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlistbox.h>
+#include <qpushbutton.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kiconloader.h>
+#include <klanguagebutton.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+
+#include "kcmlocale.h"
+#include "kcmlocale.moc"
+#include "toplevel.h"
+
+KLocaleConfig::KLocaleConfig(KLocale *locale,
+ QWidget *parent, const char *name)
+ : QWidget (parent, name),
+ m_locale(locale)
+{
+ QGridLayout *lay = new QGridLayout(this, 3, 3,
+ KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ m_labCountry = new QLabel(this, I18N_NOOP("Country or region:"));
+ m_comboCountry = new KLanguageButton( this );
+ m_labCountry->setBuddy(m_comboCountry);
+ connect( m_comboCountry, SIGNAL(activated(const QString &)),
+ this, SLOT(changedCountry(const QString &)) );
+
+ m_labLang = new QLabel(this, I18N_NOOP("Languages:"));
+ m_labLang->setAlignment( AlignTop );
+
+ m_languages = new QListBox(this);
+ connect(m_languages, SIGNAL(selectionChanged()),
+ SLOT(slotCheckButtons()));
+
+ QWidget * vb = new QWidget(this);
+ QVBoxLayout * boxlay = new QVBoxLayout(vb, 0, KDialog::spacingHint());
+ m_addLanguage = new KLanguageButton(QString::null, vb, I18N_NOOP("Add Language"));
+ boxlay->add(m_addLanguage);
+ connect(m_addLanguage, SIGNAL(activated(const QString &)),
+ SLOT(slotAddLanguage(const QString &)));
+ m_removeLanguage = new QPushButton(vb, I18N_NOOP("Remove Language"));
+ m_upButton = new QPushButton(vb, I18N_NOOP("Move Up"));
+ m_downButton = new QPushButton(vb, I18N_NOOP("Move Down"));
+ boxlay->add(m_removeLanguage);
+ boxlay->add(m_upButton);
+ boxlay->add(m_downButton);
+ connect(m_removeLanguage, SIGNAL(clicked()),
+ SLOT(slotRemoveLanguage()));
+ connect(m_upButton, SIGNAL(clicked()),
+ SLOT(slotLanguageUp()));
+ connect(m_downButton, SIGNAL(clicked()),
+ SLOT(slotLanguageDown()));
+ boxlay->insertStretch(-1);
+
+ // #### HPB: This should be implemented for KDE 3
+ // new QLabel(this, I18N_NOOP("Encoding:"));
+ //QComboBox * cb = new QComboBox( this );
+ //cb->insertStringList( KGlobal::charsets()->descriptiveEncodingNames() );
+
+ lay->addMultiCellWidget(m_labCountry, 0, 0, 0, 1);
+ lay->addWidget(m_comboCountry, 0, 2);
+ lay->addWidget(m_labLang, 1, 0);
+ lay->addWidget(m_languages, 1, 1);
+ lay->addWidget(vb, 1, 2);
+
+ lay->setRowStretch(2, 5);
+
+ lay->setColStretch(1, 1);
+ lay->setColStretch(2, 1);
+}
+
+void KLocaleConfig::slotAddLanguage(const QString & code)
+{
+ QStringList languageList = m_locale->languageList();
+
+ int pos = m_languages->currentItem();
+ if ( pos < 0 )
+ pos = 0;
+
+ // If it's already in list, just move it (delete the old, then insert a new)
+ int oldPos = languageList.findIndex( code );
+ if ( oldPos != -1 )
+ languageList.remove( languageList.at(oldPos) );
+
+ if ( oldPos != -1 && oldPos < pos )
+ --pos;
+
+ QStringList::Iterator it = languageList.at( pos );
+
+ languageList.insert( it, code );
+
+ m_locale->setLanguage( languageList );
+
+ emit localeChanged();
+ if ( pos == 0 )
+ emit languageChanged();
+}
+
+void KLocaleConfig::slotRemoveLanguage()
+{
+ QStringList languageList = m_locale->languageList();
+ int pos = m_languages->currentItem();
+
+ QStringList::Iterator it = languageList.at( pos );
+
+ if ( it != languageList.end() )
+ {
+ languageList.remove( it );
+
+ m_locale->setLanguage( languageList );
+
+ emit localeChanged();
+ if ( pos == 0 )
+ emit languageChanged();
+ }
+}
+
+void KLocaleConfig::slotLanguageUp()
+{
+ QStringList languageList = m_locale->languageList();
+ int pos = m_languages->currentItem();
+
+ QStringList::Iterator it1 = languageList.at( pos - 1 );
+ QStringList::Iterator it2 = languageList.at( pos );
+
+ if ( it1 != languageList.end() && it2 != languageList.end() )
+ {
+ QString str = *it1;
+ *it1 = *it2;
+ *it2 = str;
+
+ m_locale->setLanguage( languageList );
+
+ emit localeChanged();
+ if ( pos == 1 ) // at the lang before the top
+ emit languageChanged();
+ }
+}
+
+void KLocaleConfig::slotLanguageDown()
+{
+ QStringList languageList = m_locale->languageList();
+ int pos = m_languages->currentItem();
+
+ QStringList::Iterator it1 = languageList.at( pos );
+ QStringList::Iterator it2 = languageList.at( pos + 1 );
+
+ if ( it1 != languageList.end() && it2 != languageList.end() )
+ {
+ QString str = *it1;
+ *it1 = *it2;
+ *it2 = str;
+
+ m_locale->setLanguage( languageList );
+
+ emit localeChanged();
+ if ( pos == 0 ) // at the top
+ emit languageChanged();
+ }
+}
+
+void KLocaleConfig::loadLanguageList()
+{
+ // temperary use of our locale as the global locale
+ KLocale *lsave = KGlobal::_locale;
+ KGlobal::_locale = m_locale;
+
+ // clear the list
+ m_addLanguage->clear();
+
+ QStringList first = languageList();
+
+ QStringList prilang;
+ // add the primary languages for the country to the list
+ for ( QStringList::ConstIterator it = first.begin();
+ it != first.end();
+ ++it )
+ {
+ QString str = locate("locale", QString::fromLatin1("%1/entry.desktop")
+ .arg(*it));
+ if (!str.isNull())
+ prilang << str;
+ }
+
+ // add all languages to the list
+ QStringList alllang = KGlobal::dirs()->findAllResources("locale",
+ QString::fromLatin1("*/entry.desktop"),
+ false, true);
+ QStringList langlist = prilang;
+ if (langlist.count() > 0)
+ langlist << QString::null; // separator
+ langlist += alllang;
+
+ int menu_index = -2;
+ QString submenu; // we are working on this menu
+ for ( QStringList::ConstIterator it = langlist.begin();
+ it != langlist.end(); ++it )
+ {
+ if ((*it).isNull())
+ {
+ m_addLanguage->insertSeparator();
+ submenu = QString::fromLatin1("other");
+ m_addLanguage->insertSubmenu(m_locale->translate("Other"),
+ submenu, QString::null, -1);
+ menu_index = -2; // first entries should _not_ be sorted
+ continue;
+ }
+ KSimpleConfig entry(*it);
+ entry.setGroup("KCM Locale");
+ QString name = entry.readEntry("Name",
+ m_locale->translate("without name"));
+
+ QString tag = *it;
+ int index = tag.findRev('/');
+ tag = tag.left(index);
+ index = tag.findRev('/');
+ tag = tag.mid(index + 1);
+ m_addLanguage->insertItem(name, tag, submenu, menu_index);
+ }
+
+ // restore the old global locale
+ KGlobal::_locale = lsave;
+}
+
+void KLocaleConfig::loadCountryList()
+{
+ // temperary use of our locale as the global locale
+ KLocale *lsave = KGlobal::_locale;
+ KGlobal::_locale = m_locale;
+
+ QString sub = QString::fromLatin1("l10n/");
+
+ // clear the list
+ m_comboCountry->clear();
+
+ QStringList regionlist = KGlobal::dirs()->findAllResources("locale",
+ sub + QString::fromLatin1("*.desktop"),
+ false, true );
+
+ for ( QStringList::ConstIterator it = regionlist.begin();
+ it != regionlist.end();
+ ++it )
+ {
+ QString tag = *it;
+ int index;
+
+ index = tag.findRev('/');
+ if (index != -1)
+ tag = tag.mid(index + 1);
+
+ index = tag.findRev('.');
+ if (index != -1)
+ tag.truncate(index);
+
+ KSimpleConfig entry(*it);
+ entry.setGroup("KCM Locale");
+ QString name = entry.readEntry("Name",
+ m_locale->translate("without name"));
+
+ QString map( locate( "locale",
+ QString::fromLatin1( "l10n/%1.png" )
+ .arg(tag) ) );
+ QIconSet icon;
+ if ( !map.isNull() )
+ icon = KGlobal::iconLoader()->loadIconSet(map, KIcon::Small);
+ m_comboCountry->insertSubmenu( icon, name, tag, sub, -2 );
+ }
+
+ // add all languages to the list
+ QStringList countrylist = KGlobal::dirs()->findAllResources
+ ("locale", sub + QString::fromLatin1("*/entry.desktop"), false, true);
+
+ for ( QStringList::ConstIterator it = countrylist.begin();
+ it != countrylist.end(); ++it )
+ {
+ KSimpleConfig entry(*it);
+ entry.setGroup("KCM Locale");
+ QString name = entry.readEntry("Name",
+ m_locale->translate("without name"));
+ QString submenu = entry.readEntry("Region");
+
+ QString tag = *it;
+ int index = tag.findRev('/');
+ tag.truncate(index);
+ index = tag.findRev('/');
+ tag = tag.mid(index + 1);
+ int menu_index = submenu.isEmpty() ? -1 : -2;
+
+ QString flag( locate( "locale",
+ QString::fromLatin1( "l10n/%1/flag.png" )
+ .arg(tag) ) );
+ QIconSet icon( KGlobal::iconLoader()->loadIconSet(flag, KIcon::Small) );
+ m_comboCountry->insertItem( icon, name, tag, submenu, menu_index );
+ }
+
+ // restore the old global locale
+ KGlobal::_locale = lsave;
+}
+
+void KLocaleConfig::readLocale(const QString &path, QString &name,
+ const QString &sub) const
+{
+ // temperary use of our locale as the global locale
+ KLocale *lsave = KGlobal::_locale;
+ KGlobal::_locale = m_locale;
+
+ // read the name
+ QString filepath = QString::fromLatin1("%1%2/entry.desktop")
+ .arg(sub)
+ .arg(path);
+
+ KSimpleConfig entry(locate("locale", filepath));
+ entry.setGroup("KCM Locale");
+ name = entry.readEntry("Name");
+
+ // restore the old global locale
+ KGlobal::_locale = lsave;
+}
+
+void KLocaleConfig::save()
+{
+ KConfigBase *config = KGlobal::config();
+
+ config->setGroup("Locale");
+
+ config->writeEntry("Country", m_locale->country(), true, true);
+ if ( m_locale->languageList().isEmpty() )
+ config->writeEntry("Language", QString::fromLatin1(""), true, true);
+ else
+ config->writeEntry("Language",
+ m_locale->languageList(), ':', true, true);
+
+ config->sync();
+}
+
+void KLocaleConfig::slotCheckButtons()
+{
+ m_removeLanguage->setEnabled( m_languages->currentItem() != -1 );
+ m_upButton->setEnabled( m_languages->currentItem() > 0 );
+ m_downButton->setEnabled( m_languages->currentItem() != -1 &&
+ m_languages->currentItem() < (signed)(m_languages->count() - 1) );
+}
+
+void KLocaleConfig::slotLocaleChanged()
+{
+ loadLanguageList();
+ loadCountryList();
+
+ // update language widget
+ m_languages->clear();
+ QStringList languageList = m_locale->languageList();
+ for ( QStringList::Iterator it = languageList.begin();
+ it != languageList.end();
+ ++it )
+ {
+ QString name;
+ readLocale(*it, name, QString::null);
+
+ m_languages->insertItem(name);
+ }
+ slotCheckButtons();
+
+ m_comboCountry->setCurrentItem( m_locale->country() );
+}
+
+void KLocaleConfig::slotTranslate()
+{
+ kdDebug() << "slotTranslate()" << endl;
+
+ QToolTip::add(m_comboCountry, m_locale->translate
+ ( "This is where you live. KDE will use the defaults for "
+ "this country or region.") );
+ QToolTip::add(m_addLanguage, m_locale->translate
+ ( "This will add a language to the list. If the language is already "
+ "in the list, the old one will be moved instead." ) );
+
+ QToolTip::add(m_removeLanguage, m_locale->translate
+ ( "This will remove the highlighted language from the list." ) );
+
+ QToolTip::add(m_languages, m_locale->translate
+ ( "KDE programs will be displayed in the first available language in "
+ "this list.\nIf none of the languages are available, US English "
+ "will be used.") );
+
+ QString str;
+
+ str = m_locale->translate
+ ( "Here you can choose your country or region. The settings "
+ "for languages, numbers etc. will automatically switch to the "
+ "corresponding values." );
+ QWhatsThis::add( m_labCountry, str );
+ QWhatsThis::add( m_comboCountry, str );
+
+ str = m_locale->translate
+ ( "Here you can choose the languages that will be used by KDE. If the "
+ "first language in the list is not available, the second will be used, "
+ "etc. If only US English is available, no translations "
+ "have been installed. You can get translation packages for many "
+ "languages from the place you got KDE from.<p>"
+ "Note that some applications may not be translated to your languages; "
+ "in this case, they will automatically fall back to US English." );
+ QWhatsThis::add( m_labLang, str );
+ QWhatsThis::add( m_languages, str );
+ QWhatsThis::add( m_addLanguage, str );
+ QWhatsThis::add( m_removeLanguage, str );
+}
+
+QStringList KLocaleConfig::languageList() const
+{
+ QString fileName = locate("locale",
+ QString::fromLatin1("l10n/%1/entry.desktop")
+ .arg(m_locale->country()));
+
+ KSimpleConfig entry(fileName);
+ entry.setGroup("KCM Locale");
+
+ return entry.readListEntry("Languages");
+}
+
+void KLocaleConfig::changedCountry(const QString & code)
+{
+ m_locale->setCountry(code);
+
+ // change to the preferred languages in that country, installed only
+ QStringList languages = languageList();
+ QStringList newLanguageList;
+ for ( QStringList::Iterator it = languages.begin();
+ it != languages.end();
+ ++it )
+ {
+ QString name;
+ readLocale(*it, name, QString::null);
+
+ if (!name.isEmpty())
+ newLanguageList += *it;
+ }
+ m_locale->setLanguage( newLanguageList );
+
+ emit localeChanged();
+ emit languageChanged();
+}
diff --git a/kcontrol/locale/kcmlocale.h b/kcontrol/locale/kcmlocale.h
new file mode 100644
index 000000000..f71193418
--- /dev/null
+++ b/kcontrol/locale/kcmlocale.h
@@ -0,0 +1,95 @@
+/*
+ * kcmlocale.h
+ *
+ * Copyright (c) 1998 Matthias Hoelzer <hoelzer@physik.uni-wuerzburg.de>
+ * Copyright (c) 1999-2003 Hans Petter Bieker <bieker@kde.org>
+ *
+ * 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.
+ */
+
+#ifndef KCMLOCALE_H
+#define KCMLOCALE_H
+
+#include <qwidget.h>
+#include <qstringlist.h>
+
+class KAddButton;
+class KLanguageButton;
+class KLocale;
+class KLocaleSample;
+
+class QLabel;
+class QListBox;
+class QPushButton;
+
+class KLocaleConfig : public QWidget
+{
+ Q_OBJECT
+
+public:
+ KLocaleConfig( KLocale *_locale,
+ QWidget *parent = 0, const char *name = 0);
+
+ void save();
+
+public slots:
+ /**
+ * Loads all settings from the current locale into the current widget.
+ */
+ void slotLocaleChanged();
+ /**
+ * Retranslate all objects owned by this object using the current locale.
+ */
+ void slotTranslate();
+
+signals:
+ void localeChanged();
+ void languageChanged();
+
+private slots:
+ void loadLanguageList();
+ void loadCountryList();
+
+ void changedCountry(const QString & code);
+ void readLocale(const QString &path, QString &name,
+ const QString &sub) const;
+
+ void slotAddLanguage(const QString & id);
+ void slotRemoveLanguage();
+ void slotLanguageUp();
+ void slotLanguageDown();
+ void slotCheckButtons();
+
+private:
+ QStringList languageList() const;
+
+ KLocale *m_locale;
+
+ KLanguageButton *m_comboCountry;
+
+ QLabel *m_labCountry;
+ QLabel *m_labLang;
+
+ QListBox * m_languages;
+ KLanguageButton * m_addLanguage;
+ QPushButton * m_removeLanguage;
+ QPushButton * m_upButton;
+ QPushButton * m_downButton;
+};
+
+#endif
diff --git a/kcontrol/locale/klocalesample.cpp b/kcontrol/locale/klocalesample.cpp
new file mode 100644
index 000000000..e78ae966c
--- /dev/null
+++ b/kcontrol/locale/klocalesample.cpp
@@ -0,0 +1,132 @@
+/*
+ * klocalesample.cpp
+ *
+ * Copyright (c) 1998 Matthias Hoelzer (hoelzer@physik.uni-wuerzburg.de)
+ * Copyright (c) 1999 Preston Brown <pbrown@kde.org>
+ * Copyright (c) 1999-2003 Hans Petter Bieker <bieker@kde.org>
+ *
+ * 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 <qdatetime.h>
+#include <qlabel.h>
+#include <qwhatsthis.h>
+#include <qlayout.h>
+#include <qtimer.h>
+
+#include <stdio.h>
+
+#include <klocale.h>
+
+#include "klocalesample.h"
+#include "klocalesample.moc"
+
+KLocaleSample::KLocaleSample(KLocale *locale,
+ QWidget *parent, const char*name)
+ : QWidget(parent, name),
+ m_locale(locale)
+{
+ QGridLayout *lay = new QGridLayout(this, 5, 2);
+ lay->setAutoAdd(TRUE);
+
+ // Whatever the color scheme is, we want black text
+ QColorGroup a = palette().active();
+ a.setColor(QColorGroup::Foreground, Qt::black);
+ QPalette pal(a, a, a);
+
+ m_labNumber = new QLabel(this, I18N_NOOP("Numbers:"));
+ m_labNumber->setPalette(pal);
+ m_numberSample = new QLabel(this);
+ m_numberSample->setPalette(pal);
+
+ m_labMoney = new QLabel(this, I18N_NOOP("Money:"));
+ m_labMoney->setPalette(pal);
+ m_moneySample = new QLabel(this);
+ m_moneySample->setPalette(pal);
+
+ m_labDate = new QLabel(this, I18N_NOOP("Date:"));
+ m_labDate->setPalette(pal);
+ m_dateSample = new QLabel(this);
+ m_dateSample->setPalette(pal);
+
+ m_labDateShort = new QLabel(this, I18N_NOOP("Short date:"));
+ m_labDateShort->setPalette(pal);
+ m_dateShortSample = new QLabel(this);
+ m_dateShortSample->setPalette(pal);
+
+ m_labTime = new QLabel(this, I18N_NOOP("Time:"));
+ m_labTime->setPalette(pal);
+ m_timeSample = new QLabel(this);
+ m_timeSample->setPalette(pal);
+
+ lay->setColStretch(0, 1);
+ lay->setColStretch(1, 3);
+
+ QTimer *timer = new QTimer(this, "clock_timer");
+ connect(timer, SIGNAL(timeout()), this, SLOT(slotUpdateTime()));
+ timer->start(1000);
+}
+
+KLocaleSample::~KLocaleSample()
+{
+}
+
+void KLocaleSample::slotUpdateTime()
+{
+ QDateTime dt = QDateTime::currentDateTime();
+
+ m_dateSample->setText(m_locale->formatDate(dt.date(), false));
+ m_dateShortSample->setText(m_locale->formatDate(dt.date(), true));
+ m_timeSample->setText(m_locale->formatTime(dt.time(), true));
+}
+
+void KLocaleSample::slotLocaleChanged()
+{
+ m_numberSample->setText(m_locale->formatNumber(1234567.89) +
+ QString::fromLatin1(" / ") +
+ m_locale->formatNumber(-1234567.89));
+
+ m_moneySample->setText(m_locale->formatMoney(123456789.00) +
+ QString::fromLatin1(" / ") +
+ m_locale->formatMoney(-123456789.00));
+
+ slotUpdateTime();
+
+ QString str;
+
+ str = m_locale->translate("This is how numbers will be displayed.");
+ QWhatsThis::add( m_labNumber, str );
+ QWhatsThis::add( m_numberSample, str );
+
+ str = m_locale->translate("This is how monetary values will be displayed.");
+ QWhatsThis::add( m_labMoney, str );
+ QWhatsThis::add( m_moneySample, str );
+
+ str = m_locale->translate("This is how date values will be displayed.");
+ QWhatsThis::add( m_labDate, str );
+ QWhatsThis::add( m_dateSample, str );
+
+ str = m_locale->translate("This is how date values will be displayed using "
+ "a short notation.");
+ QWhatsThis::add( m_labDateShort, str );
+ QWhatsThis::add( m_dateShortSample, str );
+
+ str = m_locale->translate("This is how the time will be displayed.");
+ QWhatsThis::add( m_labTime, str );
+ QWhatsThis::add( m_timeSample, str );
+}
diff --git a/kcontrol/locale/klocalesample.h b/kcontrol/locale/klocalesample.h
new file mode 100644
index 000000000..bf1cd7462
--- /dev/null
+++ b/kcontrol/locale/klocalesample.h
@@ -0,0 +1,58 @@
+/*
+ * locale.cpp
+ *
+ * Copyright (c) 1998 Matthias Hoelzer (hoelzer@physik.uni-wuerzburg.de)
+ * Copyright (c) 1999-2003 Hans Petter Bieker <bieker@kde.org>
+ *
+ * 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.
+ */
+
+#ifndef __KLOCALESAMPLE_H__
+#define __KLOCALESAMPLE_H__
+
+#include <qwidget.h>
+
+class QLabel;
+class QResizeEvent;
+
+class KLocale;
+
+class KLocaleSample : public QWidget
+{
+ Q_OBJECT
+public:
+ KLocaleSample(KLocale *_locale,
+ QWidget *parent = 0, const char*name = 0);
+ virtual ~KLocaleSample();
+
+public slots:
+ void slotLocaleChanged();
+
+protected slots:
+ void slotUpdateTime();
+
+private:
+ KLocale *m_locale;
+ QLabel *m_numberSample, *m_labNumber;
+ QLabel *m_moneySample, *m_labMoney;
+ QLabel *m_timeSample, *m_labTime;
+ QLabel *m_dateSample, *m_labDate;
+ QLabel *m_dateShortSample, *m_labDateShort;
+};
+
+#endif
diff --git a/kcontrol/locale/language.desktop b/kcontrol/locale/language.desktop
new file mode 100644
index 000000000..9bab97b21
--- /dev/null
+++ b/kcontrol/locale/language.desktop
@@ -0,0 +1,236 @@
+[Desktop Entry]
+Exec=kcmshell language
+Icon=locale
+Type=Application
+DocPath=kcontrol/language/index.html
+
+
+X-KDE-Library=locale
+X-KDE-FactoryName=locale
+X-KDE-ParentApp=kcontrol
+
+Name=Country/Region & Language
+Name[af]=Land/Streek & Taal
+Name[ar]=البلد/المنطقة و اللغة
+Name[az]=Ölkə/Bölgə və Dil
+Name[be]=Краіна/Рэгіён і Мова
+Name[bg]=Държава и език
+Name[bn]=দেশ/এলাকা ও ভাষা
+Name[br]=Bro/Rann-vro & yezh
+Name[bs]=Zemlja/region i jezik
+Name[ca]=País/Regió i idioma
+Name[cs]=Země/region a jazyk
+Name[csb]=Kraj/dzél kraju ë jãzëk
+Name[cy]=Gwlad/Rhanbarth ac Iaith
+Name[da]=Land/Område & sprog
+Name[de]=Land/Region & Sprache
+Name[el]=Χώρα/Περιοχή & Γλώσσα
+Name[eo]=Lando/Regiono & Lingvo
+Name[es]=País/Región e idioma
+Name[et]=Riik/regioon ja keel
+Name[eu]=Herrialdea eta hizkuntza
+Name[fa]=کشور/منطقه و زبان
+Name[fi]=Maa tai alue ja kieli
+Name[fr]=Pays & langue
+Name[fy]=Lân/regio en taal
+Name[ga]=Tír/Réigiún agus Teanga
+Name[gl]=País/Rexión e Lingua
+Name[he]=מדינה\אזור ושפה
+Name[hi]=देश/क्षेत्र व भाषा
+Name[hr]=Zemlja i jezik
+Name[hu]=Ország/régió és nyelv
+Name[is]=Land & tungumál
+Name[it]=Lingua e paese
+Name[ja]=国と言語
+Name[ka]=ქვეყანა/რეგიონი და ენა
+Name[kk]=Ел/өлке және тіл
+Name[km]=ប្រទេស/តំបន់ & ភាសា
+Name[ko]=국가, 지역 및 언어
+Name[lo]=ປະເທດແລະພາສາ
+Name[lt]=Šalis-regionas ir kalba
+Name[lv]=Valsts/Reģions un Valoda
+Name[mk]=Земја/регион и јазик
+Name[mn]=Орон/Бүс & Хэл
+Name[ms]=Negara/Rantau & Bahasa
+Name[mt]=Pajjiż/Reġjun u Lingwa
+Name[nb]=Land/region og språk
+Name[nds]=Land/Regioon & Spraak
+Name[ne]=देश/क्षेत्र र भाषा
+Name[nl]=Land/regio en taal
+Name[nn]=Land/region og språk
+Name[nso]=Naga/Lefelo & Leleme
+Name[pa]=ਦੇਸ਼/ਖੇਤਰ ਅਤੇ ਭਾਸ਼ਾ
+Name[pl]=Kraj/region i język
+Name[pt]=País/Região e Língua
+Name[pt_BR]=País/Região & Idioma
+Name[ro]=Țara/regiunea și limba
+Name[ru]=Язык и стандарты
+Name[rw]=Ururimi & Igihugu/Agace
+Name[se]=Riika/guovla ja giella
+Name[sk]=Krajina/Region a Jazyk
+Name[sl]=Država/regija in jezik
+Name[sr]=Држава/регион и језик
+Name[sr@Latn]=Država/region i jezik
+Name[sv]=Land/region och språk
+Name[ta]=நாடு/இடம் மற்றும் மொழி
+Name[te]=దేశం/రాజ్యం & భాష
+Name[tg]=Кишвар/Забон ва Минтақа
+Name[th]=ประเทศและภาษา
+Name[tr]=Ülke/Bölge ve Dil
+Name[tt]=İl/Töbäk belän Tel
+Name[uk]=Країна/регіон та мова
+Name[uz]=Davlat/region va til
+Name[uz@cyrillic]=Давлат/регион ва тил
+Name[ven]=Shango/Fhethu & Luambo
+Name[vi]=Quốc gia và Ngôn ngữ
+Name[wa]=Payis & lingaedje
+Name[xh]=Ilizwe/Ummandla & Ulwimi
+Name[zh_CN]=国家/地区和语言
+Name[zh_TW]=國家/地區與語言
+Name[zu]=Izwe/Isifunda & Ulimi
+
+Comment=Language, numeric, and time settings for your particular region
+Comment[af]=Taal, numeries, en tyd instellings vir jou spesifieke streek
+Comment[ar]=ضبط اللغة, و التقويم, و الأرقام الخاصة بمنطقتك
+Comment[az]=Bölgənizə xas dil, sayı və vaxt qurğuları
+Comment[be]=Моўныя, лічбавыя і часавыя настаўленні для вашага канкрэтнага рэгіёну
+Comment[bg]=Настройване на държавата, езика, формата на датата и часа и др.
+Comment[bn]=আপনার স্থানীয় ভাষা, সময় এবং সংখ্যা বর্ণনা সম্বন্ধীয় নিয়মাবলী
+Comment[br]=Kefluniadur yezh, sifroù hag eur evit ho rannved-c'hwi
+Comment[bs]=Jezik, format brojeva i podešavanje vremena za određenu regiju
+Comment[ca]=Arranjaments d'idioma, numèric i d'hora per a la vostra regió
+Comment[cs]=Nastavení jazyka, formátu čísel a času pro váš region
+Comment[csb]=Jãzëk, fòrmat wielënów é czasu dlô Twòji òbeńdë
+Comment[cy]=Gosodiadu iaith,rhifau,ac amser i'ch rhanbarth
+Comment[da]=Sprog-, tal-, og tidsindstillinger for din region
+Comment[de]=Sprache, Zahlen- und Zeitformate für Ihr Land
+Comment[el]=Αριθμητικές, γλωσσικές και ωρολογιακές ρυθμίσεις για την περιοχή σας
+Comment[eo]=Agordo de lingvoj, nombroj, tempindikoj
+Comment[es]=Preferencias del idioma, formato numérico y fecha/hora para su región particular.
+Comment[et]=Sinu regiooni keele, numbrite ja kellaaja seadistused
+Comment[eu]=Zure herrialdeari dagozkion hizkuntza, zenbaki, eta denbora ezarpenak
+Comment[fa]=زبان، عدد، و تنظیمات زمان برای منطقۀ خاص شما
+Comment[fi]=Alueen kielen, ajan ja lukujen asetukset
+Comment[fr]=Configuration de la langue, des nombres, et du format d'heure
+Comment[fy]=Taal-, numeryk, en tiidsynstelling foar jo eigen regio
+Comment[gl]=Lingua e parámetros numéricos/horarios para a sua rexión particular
+Comment[he]=שינוי הגדרות השפה, המספרים והשעה עבור האזור הייחודי שלך
+Comment[hi]=भाषा,अंकीय, तथा आपके विशेष क्षेत्र के लिए समय विन्यास
+Comment[hr]=Jezik, oblik brojeva i vremenska postavke za određenu regiju
+Comment[hu]=Nyelv-, szám- és időbeállítások
+Comment[id]=Bahasa, penomoran dan seting waktu untuk wilayah anda
+Comment[is]=Tungumál og framsetning talna og dagssetninga
+Comment[it]=Impostazioni nazionali per la lingua, i numeri, la data e l'ora
+Comment[ja]=地域特有の言語と数値や日付書式を設定
+Comment[ka]=თქვენი რეგიონისთვის ენის, თარიღის და ციფრული ფორმატის კონფიგურაცია
+Comment[kk]=Өлкеңіздің тіл, сан және уақыт пішімін орнату
+Comment[km]=ការ​កំណត់​ភាសា, លេខ និង​ពេលវេលា សម្រាប់​តំបន់​ជាក់លាក់​របស់​អ្នក
+Comment[ko]=살고 있는 지역의 언어, 수, 시간 설정
+Comment[lo]=ຮູບແບບພາສາ, ຕົວເລກແລະພື້ນທີ່ເວລາສຳລັບตัวเลข ພື້ນທີ່ທ່ານຢູ່
+Comment[lt]=Kalba, skaitiniai ir laiko nustatymai Jūsų individualiam regionui
+Comment[lv]=Valodas, numuru, un laika uzstādījumi jūsu konkrētajam reģionam
+Comment[mk]=Поставувања на јазикот, броевите и времето за вашиот регион
+Comment[mn]=Хэл, Тоо- ба танай орны цагийн хэлбэр
+Comment[mt]=Lingwa, u setings tan-numri u ħin għar-reġjun tiegħek
+Comment[nb]=Språk-, tall- og tidsinnstillinger for ditt område
+Comment[nds]=Spraak, Tallen un Tietformaat för Dien Land instellen
+Comment[ne]=तपाईँको बिशेष क्षेत्रका लागि भाषा, सङ्ख्यात्मक, र समय सेटिङ
+Comment[nl]=Taal-, numerieke, en tijdsinstelling voor uw eigen regio
+Comment[nn]=Innstillingar for språk, tal og tid i regionen din
+Comment[nso]=Leleme, dinomoro, le dipeakanyo tsa nako go lefelo la gago le itsego
+Comment[oc]=Arranjaments d'idioma, numèric e d'ora pel vostre pais
+Comment[pa]=ਆਪਣੇ ਖਾਸ ਖੇਤਰ ਲਈ ਭਾਸ਼ਾ, ਅੰਕੀ ਤੇ ਸਮਾਂ ਸੈਟ ਕਰੋ
+Comment[pl]=Ustawienia języka, formatu liczb i czasu dla Twojego regionu
+Comment[pt]=Configuração da língua e dos parâmetros numéricos/horários para a sua região
+Comment[pt_BR]=Preferências de idioma, formatos de data e hora de sua região
+Comment[ro]=Setează limbajul, afișarea numerelor și timpului în modul specific regiunii unde locuiți
+Comment[ru]=Настройки языка, даты и времени для вашего региона
+Comment[rw]=Ururimi,bikurikije umubare,n'amagenamiterere y'igihe y'agace kihariye
+Comment[se]=Báikkalaš giella-,lohko- ja áigeheivehusat
+Comment[sk]=Jazyk, čísla, a nastavenia časového regiónu
+Comment[sl]=Jezikovne, številske in časovne nastavitve za vaše območje
+Comment[sr]=Језик, нумеричка и временска подешавања према вашем региону
+Comment[sr@Latn]=Jezik, numerička i vremenska podešavanja prema vašem regionu
+Comment[sv]=Ställ in språk, numeriskt format och tid för din speciella region
+Comment[ta]= குறிப்பிட்ட பகுதிக்கான மொழி, எண் மற்றும் நேர அமைப்புகள்
+Comment[tg]=Танзимоти забон, рақам ва вақт барои минтақаи шумо
+Comment[th]=รูปแบบภาษา, ตัวเลข และพื้นที่เวลาสำหรับพื้นที่ที่คุณอยู่
+Comment[tr]=Bölgenize özgü dil, sayı ve zaman ayarları
+Comment[tt]=Töbägeñ öçen tel, san, waqıt caylawları
+Comment[uk]=Налаштування мови, відображення чисел та часу для вашого регіону
+Comment[uz]=Davlatingiz uchun til, son va vaqt moslamalari
+Comment[uz@cyrillic]=Давлатингиз учун тил, сон ва вақт мосламалари
+Comment[ven]=Luambo, Mbalo, na mavhekanyele a tshifhinga a vhupo hahanu
+Comment[vi]=Ngôn ngữ, số và các thiết lập về thời gian cho vùng cụ thể
+Comment[wa]=Apontiaedje do lingaedje et des preferinces (prezintaedje des limeros, des dates, evnd.) po vosse payis
+Comment[xh]=Ulwimi, amanani, kunye nezicwangciso zexesha zommandla wakho
+Comment[zh_CN]=您所在地区的语言、数字和时间设置
+Comment[zh_TW]=您所在地區的語言、數字和時間設定
+Comment[zu]=Ulimi, okuyizinombolo, kanye nezilungiselelo zesikhathi zesifunda sakho esithile
+
+Keywords=language,translation,number format,currency,time,date,formats,locale,Country,charsets,character sets,Decimal symbol,Thousands separator,symbol,separator,sign,positive,negative,fractional digits,week,week start
+Keywords[af]=language,translation,number format,currency,time,date,formats,locale,Country,charsets,character sets,Decimal symbol,Thousands separator,symbol,separator,sign,positive,negative,fractional digits,week,week begin
+Keywords[az]=dil,tərcümə,sayı şəkli,pul,saat,tarix,şəkillər,yerli,ölkə,hərf kömələri,hərf kömələri,onluq simvolu,minlər ayırıcısı,simvol,ayırıcı,işarət,müsbət,mənfi,onluq pillələr,həftə,həftə başı
+Keywords[be]=Мова,Пераклад,Фармат лікаў,Валюта,Час,Дата,Фарматы,Мясцовасць,Лакаль,Краіна,Знаказбор,Знаказборы,Сімвал дзесятковай коскі,Падзяляльнік тысяч,Сімвал,Знак,Падзяляльнік,Дадатны,Адмоўны,Тыдзень,Пачатак тыдня,language,translation,number format,currency,time,date,formats,locale,Country,charsets,character sets,Decimal symbol,Thousands separator,symbol,separator,sign,positive,negative,fractional digits,week,week start
+Keywords[bg]=език, страна, регион, превод, числа, формат, дата, час, пари, валута, единица, локал, локализация, language, translation, number format, currency, time, date, formats, locale, Country, charsets, character sets, Decimal symbol, Thousands separator, symbol, separator, sign, positive, negative, fractional digits, week, week start
+Keywords[ca]=llengua,traducció,format numèric,moneda,hora,data,formats,locale,País,caràcters,jocs de caràcters,Símbol decimal,Separador de mils,símbol,separador,signe,positiu,negatiu,dígits fraccionaris,setmana,inici de la setmana
+Keywords[cs]=Jazyk,Překlad,Formát čísel,Měna,Čas,Datum,Formát,Locale,Země,Znaková sada,Oddělovač tisíců,Oddělovač desetinných míst,Kladný,Záporný,Desetinná místa,Začátek týdne
+Keywords[csb]=jãzëk,dolmaczënk,fòrmat wielënów,waluta,pieniądze,czas,datum,fòrmatë,òbeńdowé nastôwë,kraj,zestôwë merków,dzesãtny symbòl,merk rozdzelający tësãce,symbòla,separatora,merk,dodatny,ujimny,kawelkòwé lëczbë,tidzéń,zôczątk tidzénia
+Keywords[cy]=iaith,cyfieithiad,fformat rhif,arian cyfred,amser,dyddiad,fformatiau,lleoliad,Gwlad,set nodau,setiau nodau,Symbol degol,Gwahanydd miloedd,symbol,gwahanydd,arwydd,positif,negatif,digidau ffracsiynol,wythnos,cychwyn wythnos
+Keywords[da]=sprog,oversættelse,talformat,mønt,tid,dato,formater,sted,Land,tegnsæt,Decimalsymbol,Tusindeadskiller,symbol, adskiller,fortegn,positiv,negativ,brøkcifre ,uge,ugebegyndelse
+Keywords[de]=Sprachen,Übersetzung,Zahlenformat,Währung,Zeit,Datum,Formate,Regionales,Land,Zeichensätze,Dezimalzeichen,Symbole,Zeichen,Positiv,Negativ,Bruchzahlen,Wochenanfang
+Keywords[el]=γλώσσα,μετάφραση,μορφή αριθμού,συνάλλαγμα,ώρα,ημερομηνία,μορφές,εντοπιότητα,Χώρα,σύνολα χαρακτήρων,σύνολα χαρακτήρων,Σύμβολο υποδιαστολής,Διαχωριστικό χιλιάδων,σύμβολο,διαχωριστικό,πρόσημο,θετικός,αρνητικός,δεκαδικά ψηφία,εβδομάδα,αρχή εβδομάδας
+Keywords[eo]=lingvo,traduko,nombro,mono,tempo,formato,lokaĵo,lando,komo,punkto,onpunkto,decimalsigno,milosigno,signo,pozitiva,negativa,frakcio,semajno,semajnkomenco
+Keywords[es]=idioma,traducción,formato numérico,moneda,hora,fecha,formatos,ambiente,País,mapas de caracteres,Símbolo decimal,Separador de miles,símbolo,separador,signo,positivo,negativo,dígitos fraccionarios,semana,inicio de la semana
+Keywords[et]=keel,tõlge,numbrite vorming,valuuta,kellaaeg,kuupäev,vormingud,lokaale,riik,kooditabelid, kümnendkoha eraldaja,tuhandete eraldaja,sümbol,eraldaja,märk,positiivne,negatiivne,murdarvud, nädal,nädala algus
+Keywords[eu]=hizkuntza,itzulpena,zenbakien formatua,txanpona,denbora,data,formatuak,localea,herrialdea,karaktere-multzoak, karaktere ezarpenak,sinbolo hamartarra,Milakaden banatzailea, sinboloa,banatzailea,zeinua,positiboa,negatiboa,zatikizko zenbakiak,astea,astearen hasiera
+Keywords[fa]=زبان، ترجمه، قالب عدد، پول، زمان، تاریخ، قالبها، محلی، کشور، نویسه‌گان، نویسه‌گان، نماد ده‌دهی، جداساز هزارگان، نماد، جداساز، علامت، مثبت، منفی، اعداد کسری، هفته، آغاز هفته
+Keywords[fi]=kieli,käännös,lukujen muoto,valuutta,aika,päivämäärä,formaatit,muodot,locale,maa,merkistöt,desimaalierotin,tuhansien erotin,symbooli,erotin,etumerkki,positiivinen,negatiivinen,viikko,viikon alku
+Keywords[fr]=langage,langue,traduction,nombres,formats de nombre,format de nombre,monnaie,symbole monétaire,date,heure,formats,localisation,régionalisation,pays,jeu de caractères,table de caractères,jeux de caractères,symbole décimal,virgule,séparateur des milliers,milliers,symbole,séparateur,signe,positif,négatif,nombre de décimales,semaine,début de la semaine,jours de la semaine
+Keywords[fy]=language,oersetting,taal,getalopmaak,valuta,valutasymbool,tijd,datum, opmaak,lokaal,locale,land,tekensets,charsets,karakterverzamelingen,Decimaalsymbool, scheidingsteken,duizendtallen,symbool,symbolen,gulden,teken,positief,negatief,wieke,wieken,jild,bedragen
+Keywords[gl]=lingua,tradución,formato numérico,hora,data,formatos,locale,País,conxuntos de carácteres,charset,símbolo decimal,separador de milleiros,símbolo,separador,signo,positivo,negativo,díxitos fraccionarios,semana,início da semana
+Keywords[he]=עברית,שפה,תרגום,תבנית מספרים,מטבע,שעה,תאריך,תבניות,אזור,מיקום,מדינה,מערכי תווים,סימן עשרוני,מפריד,אלפים,סימן,מפריד,חיובי,שלילי,נקודות עשרוניות,שבוע,תחילת שבוע, language,translation,number format, currency,time,date,formats,locale, Country,charsets,character sets,Decimal symbol,Thousands separator, symbol, separator,sign,positive,negative,fractional digits,week,week start
+Keywords[hi]=भाषा,अनुवाद,संख्या फार्मेट,करेंसी,समय,तारीख़,फार्मेट्स,लोकेल,देश,अक्षरमाला,अक्षर माला,दशमलव प्रतीक,हजार पृथक करने वाला,चिह्न,पृथक करने वाला,निशान,धनात्मक,ऋणात्मक,फ्रेक्शनल अंक,सप्ताह,सप्ताह प्रारंभ
+Keywords[hr]=language,translation,number format,currency,time,date,formats,locale,Country,charsets,character sets,Decimal symbol,Thousands separator,symbol,separator,sign,positive,negative,fractional digits,week,week start,jezik,prijevod,oblik brojeva,valuta,vrijeme,datum,oblik,lokalizacija,Država,Zemlja,znakovi,kodna stranica,decimalni znakovi,razdjelnik tisućica,znak,razdjelnik,pozitivno,negativno,decimale,tjedan,početak tjedna
+Keywords[hu]=nyelv,fordítás,számformátum,pénznem,idő,dátum,formátumok,nyelvi beállítások,ország,karakterkészletek,tizedesjel,ezres elválasztó,jel,elválasztó,szimbólum,pozitív,negatív,tizedesjegyek,hét,a hét első napja
+Keywords[is]=tungumál,þýðing,númer,gjaldeyrir,klukka,tími,dagsetning,staðværar stillingar,locale,land,stafatöflur,stafróf,jákvætt,neikvætt, jákvæð,neiðkvæð,brot,tugabrot,vika,helgi,vikudagur,vikudagar
+Keywords[it]=lingua,traduzione,formato numeri,moneta,valuta,ora,data,formati,impostazioni nazionali,paese,charset,insieme di caratteri,virgola,separatore migliaia,simbolo,separatore,segno,più,meno,cifre decimali,settimana,inizio settimana
+Keywords[ja]=言語,翻訳,数値の書式,通貨,時刻,日付,フォーマット,地域,国,文字コード,文字セット,小数点,1000での区切り,記号,区切り文字,符号,正数,負数,小数桁数,週,週初
+Keywords[km]=ភាសា,បកប្រែ,ទ្រង់ទ្រាយ​លេខ,រូបិយប័ណ្ណ,ពេលវេលា,កាលបរិច្ឆេទ,ទ្រង់ទ្រាយ,មូលដ្ឋាន,ប្រទេស,សំណុំ​តួអក្សរ,សញ្ញា​ទសភាគ,អ្នក​បំបែក​ខ្ទង់​ពាន់,និមិត្ត​សញ្ញា,អ្នក​បំបែក,សញ្ញា,វិជ្ជមាន,អវិជ្ជមាន,ខ្ទង់​ទសភាគ,សប្ដាហ៍,ដើម​សប្ដាហ៍
+Keywords[lt]=language,translation,number format,currency,time,date,formats,locale,Country,charsets,character sets,Decimal symbol,Thousands separator,symbol,separator,sign,positive,negative,fractional digits,week,week start,kalba,vertimas,skaičių formatas,valiuta,laikas,data,formatai,lokalė,Šalis,koduotės,kodavimai,Dešimtainis simbolis,Tūkstančių skirtukas,simbolis,skirtukas,požymis,teigiamas,neigiamas,trupmenų skaitmenys,savaitė,savaitės pradžia
+Keywords[lv]=valoda,tulkojums,numuru formāts,valūta,laiks,datums,formāts,lokāle,Valsts,čārsets,simbolu komplekts,Decimāl simbols,Tūkstošu atdalītājs,simbols,atdalītājs,zīme,pozitīvs,negatīvs,frakciju cipari,nedēļa,nedēļa sākas
+Keywords[mk]=language,translation,number format,currency,time,date,formats,locale,Country,charsets,character sets,Decimal symbol,Thousands separator,symbol,separator,sign,positive,negative,fractional digits,week,week start,јазик,превод,формат на бројки,валута,време,дата,формати,локал,земја,знаковни множества,Децимален симбол,Граничник за илјади,симбол,граничник,знак,позитивен,негативен,дропки,недела,почеток на недела
+Keywords[mn]=Хэл,Орчуулга,Тооны хэлбэр,Мөнгөн нэгж,Цаг,Огноо,Хэлбэр, Бүс,Орон, Тэмдэгт олонлог,Аравтын тэмдэглэгээ,Тэмдэг,Тэмдэгт, Таслал, Нэмэх, Хасах,Бутархай тоо, Долоо хоног,Долоо хоногийн эхлэл
+Keywords[nb]=språk,oversettelse,tallformat,valuta,tid,dato,formater,lokal,land,symbol,separator,tegn,positiv,negativ,uke,ukestart,desimaltegn,skilletegn,brøk
+Keywords[nds]=Spraak,Översetten,Tallenformaat,Tahlmiddel,Tiet,Datum,Formaten,locale,Land,Tekensetten,Tekensett,Dezimaalsymbool,Trennteken,Symbool,Dusend,Vörteken,Positiv,Negativ,Brooktallen,Week,Wekenanfang
+Keywords[ne]=भाषा, अनुवाद, सङ्ख्या ढाँचा, मुद्रा, समय, ढाँचा, स्थान, देश, चारसेटहरू, क्यारेक्टर सेट, दशमलव सङ्केत, हजार विभाजक, सङ्केत, विभाजक, चिन्ह, घनात्मक, ऋणात्मक, भिन्न अङ्कहरू, हप्ता, हप्ताकको सुरु
+Keywords[nl]=language,vertaling,taal,getallenopmaak,valuta,valutasymbool,tijd,datum, opmaak,lokaal,locale,land,tekensets,charsets,tekenverzamelingen,Decimaalsymbool, scheidingsteken,duizendtallen,symbool,symbolen,gulden,teken,positief,negatief,week,weken,geld,bedragen
+Keywords[nn]=språk,omsetjing,talformat,valuta,pengar,tid,dato,format,lokale,land,teiknsett,desimalteikn,skiljeteikn,symbol,teikn,positiv,negativ,desimaltal,veke,vekestart
+Keywords[nso]=leleme,tiragatso,thlolego ya dinomoro,currency,nako,tsatsikgwedi,dithlolego,tulo,Naga,charsets,dipeakanyo tsa dihlaka,Leswao la decimal,Searoganyi sa Dikete, leswao,searoganyi,leswao,dumela,ganetsa,dinomoro tsa fraction,beke,thomiso ya beke
+Keywords[pa]=ਭਾਸ਼ਾ,ਅਨੁਵਾਦ,ਗਿਣਤੀ,ਕਰੰਸੀ,ਸਮਾਂ,ਮਿਤੀ,ਲੋਕੇਲ,ਦੇਸ਼,ਅੱਖਰ-ਸੈਟ, ਦਸ਼ਮਲਵ, ਹਜ਼ਾਰ ਵੱਖਰੇਵਾਂ,ਨਿਸ਼ਾਨ,ਰਿਣਾਤਮਕ,ਧਨਾਤਮਕ,ਭਿੰਨ ਅੰਕ,ਹਫ਼ਤਾ, ਹਫ਼ਤਾ ਸ਼ੁਰੂ
+Keywords[pl]=język,tłumaczenie,format liczb,jednostka walutowa,czas,data,formaty,ustawienia regionalne,kraj,zestawy znaków,symbol dziesiętny,znak rozdzielający tysiące,symbol,separator,znak,dodatni,ujemny,liczby ułamkowe,tydzień,początek tygodnia
+Keywords[pt]=língua,tradução,formato de número,monetário,hora,data,formatos,localização,País,charset,mapa de caracter,símbolo decimal,separador de milhares,símbolo,separador,sinal,positivo,negativo,dígitos fraccionários,semana,início de semana
+Keywords[pt_BR]=idioma,tradução,formato numérico,moeda,data,hora,formatos,localização,país,conjuntos de caracteres,conjunto de caracteres,símbolo decimal,separador de milhares,separador,sinal,positivo,negativo,dígitos de fração,semana,início da semana
+Keywords[ro]=limbaj,traducere,format numere,moneda,timp,dată,formate,localizare,țară,set de caractere,simbol zecimal,separator de mii,semn,pozitiv,negativ,cifre fracționale,săptămînă,început săptămînă
+Keywords[rw]=Ururimi,ivunura,imiterere y'umubare,ifaranga,igihe,itariki,imiterere,ikiranga hantu,igihugu,itsinda-inyuguti,amatsinda y'inyuguti,ikimenyetso binyacumi,igitandukanya ibinyagihumbi,ikimenyetso,igitandukanya,ikimenyetso,cyirenze zeru,hasi zeru,imibare y'umugabane,icyumweru,itangiriro y'icyumweru
+Keywords[se]=giella,jorgaleapmi,jorgalusat,lohkoformáta,valuhtta,ruđat,áigi,formáhtta,locale, eatnan,riika,desimálamearka,gaskamearka,symbola,mearka,positiiva,negatiiva,desimálalohku, vahkku,vahkkoálgu
+Keywords[sk]=jazyk,preklad,formát čísel,mena,čas,dátum,formáty,locale,krajina,znakové sady,kódovanie,desatinná čiarka,oddeľovač tisícov,symbol,oddeľovač,znamienko,kladný,záporný,desatinný,týždeň,začiatok týždňa
+Keywords[sl]=jezik,prevod,oblika števil,valuta,čas,datum,oblika,locale, država,nabor znakov,decimalni simbol,ločilo tisočic,simbol,separator, predznak,pozitivno,negativno,ulomki,teden,začetek tedna
+Keywords[sr]=language,translation,number формат,currency,time,date, formats,locale,Country,charsets,character sets,Decimal symbol,Thousands separator,symbol,separator,sign,positive,negative,fractional digits,week,week старт, језик,превод,формат бројева,новац,време,датум,формати,земља,скуп знакова, децимални знак,одвајач хиљада,знак,недеља,седмица,почетак недеље,почетак седмице
+Keywords[sr@Latn]=language,translation,number format,currency,time,date, formats,locale,Country,charsets,character sets,Decimal symbol,Thousands separator,symbol,separator,sign,positive,negative,fractional digits,week,week start, jezik,prevod,format brojeva,novac,vreme,datum,formati,zemlja,skup znakova, decimalni znak,odvajač hiljada,znak,nedelja,sedmica,početak nedelje,početak sedmice
+Keywords[sv]=språk,översättning,talformat,valuta,tid,datum,format,land,teckenuppsättningar,decimaltecken,tusentalsavskiljare,symbol,avskiljare,tecken,positivt,negativt,decimaler,vecka,första veckodag
+Keywords[ta]=மொழி,மொழிபெயர்ப்பு, எண்வடிவமைப்பு,நாணயம்,நேரம்,தேதி,வடிவமைப்புகள்,வட்டாரம்,நாடு,தகுதரம், தகுதரம், தசம குறியீடு,ஆயிரம் பிரிப்பான்,குறியீடு,பிரிப்பான், குறி, மிகை,குறை,பின்ன எண்ணியம்,வாரம், வார துவக்கம்
+Keywords[th]=ภาษา,การแปลภาษา,รูปแบบตัวเลข,รูปแบบเงินตรา,เวลา,วันทีึ่,รูปแบบ,ภาษาท้องถิ่น,ประเทศ,ชุดอักษร,ชุดอักขระ,สัญลักษณ์ทศนิยม,ตัวแบ่งหลักพัน,สัญลักษณ์,ตัวแบ่ง,เครื่องหมาย,ค่าบวก,ค่าลบ,เศษส่วน,เริ่มสัปดาห์,สัปดาห์
+Keywords[tr]=dil,çeviri,sayı biçimi,para,saat,tarih,biçimler,yerel,ülke,karakter kümeleri, ondalık sembolü,binler ayıracı,sembol,ayırıcı,işaret,pozitif,negatif,ondalık basamaklar,hafta,hafta başı
+Keywords[uk]=мова,переклад,формат чисел,валюта,час,гроші,формати,charset,локаль,країна,набори символів,роздільник тисяч,роздільник десятих,символ,роздільник,знак,додатне,від'ємне,дробові числа,тиждень,початок тижня
+Keywords[uz]=til,tarjima,sonlar formati,pul,vaqt,sana,losal,Davlat,belgilar toʻplami,Oʻnlik belgisi,Mingni ajratuvchi belgi,belgi,ajratuvchi belgi,musbat,manfiy,hafta,haftaning boshlanishi
+Keywords[uz@cyrillic]=тил,таржима,сонлар формати,пул,вақт,сана,лосал,Давлат,белгилар тўплами,Ўнлик белгиси,Мингни ажратувчи белги,белги,ажратувчи белги,мусбат,манфий,ҳафта,ҳафтанинг бошланиши
+Keywords[ven]=luambo,dologa,vhuvha ha nomboro,zwamasheleni,tshifhinga,datumu,vhuvha,henefhano,shango,tshasete,mavhekenyele a tshasete,zwiga zwa desimala,zwikhaukani zwa zwigidi,swiga,zwikhaukani,tshiga,zwavhudi,zwisizwavhudi,vhege,u thoma vhege
+Keywords[vi]=ngôn ngữ,dịch,dạng hiển thị số,tiền tệ,thời gian,ngày,định dạng,địa phương,Nước,bảng mã,bảng mã,ký hiệu thập phân,dấu cách hàng nghìn,ký hiệu,dấu phân cách,dấu,dương,âm,phân số,tuần,bắt đầu của tuần
+Keywords[wa]=lingaedje,ratournaedje,coigne di nombe,manoye,eure,date,locåle,payi,payis,charset,sets di caracteres,simbôle di decimåle,meteu a pårt des meyes,simbôle,meteu a pårt,sine,pozitif,negatif,samwinne,cominçmint del samwinne
+Keywords[xh]=ulwimi,uguqulelo kolunye ulwimi,ifomati yenani,okwangoku,ixesha,umhla,iifomati,locale,Ilizwe,charsets,amaqela abasebenzi,uphawu lwenani leshumi,Umahluli wamawaka,uphawu, umahluli,tyikitya,echaza uvumo,echaza ukhanyelo,amasuntswana angamaqhezu,iveki,isiqalo seveki
+Keywords[zh_CN]=language,translation,number format,currency,time,date,formats,locale,Country,charsets,character sets,Decimal symbol,Thousands separator,symbol,separator,sign,positive,negative,fractional digits,week,week start,语言,翻译,数字格式,货币,时间,日期,格式,区域设置,国家,字符集,千位分隔符,符号,分隔符,正,负,小数,星期
+Keywords[zh_TW]=language,translation,number format,currency,time,date,formats,locale,Country,charsets,character sets,Decimal symbol,Thousands separator,symbol,separator,sign,positive,negative,fractional digits,week,week start,語言,翻譯,數字格式,貨幣格式,時間格式,日期格式,格式,地區,國家,字元,字元集,小數點符號,千分位分隔,符號,分隔,符號,正數,負數,小數點位數,一週,由週日開始
+Keywords[zu]=ulimi,uguqulelo,isakhiwo senombolo, uphawu lwemali, isikhathi,usuku,izakhiwo,indawo,Izwe,charsets,amaqoqo ezimpawu,uphawu lwedesimali,umehlukanisi wezinkulungwane,uphawu,umehlukanisi,uphawu, okungaphezulu kuka-0,okungaphansi kuka-0,izinombolo azahlukanisiwe,isonto, ukuqala kwesonto
+
+Categories=Qt;KDE;X-KDE-settings-accessibility;
diff --git a/kcontrol/locale/localemon.cpp b/kcontrol/locale/localemon.cpp
new file mode 100644
index 000000000..504ce393c
--- /dev/null
+++ b/kcontrol/locale/localemon.cpp
@@ -0,0 +1,330 @@
+/*
+ * localemon.cpp
+ *
+ * Copyright (c) 1999-2003 Hans Petter Bieker <bieker@kde.org>
+ *
+ * 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 <qcheckbox.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qobjectlist.h>
+#include <qwhatsthis.h>
+#include <qlayout.h>
+#include <qvgroupbox.h>
+#include <qvbox.h>
+#include <qregexp.h>
+
+#include <knuminput.h>
+#include <kdialog.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+
+#include "toplevel.h"
+#include "localemon.h"
+#include "localemon.moc"
+
+KLocaleConfigMoney::KLocaleConfigMoney(KLocale *locale,
+ QWidget *parent, const char*name)
+ : QWidget(parent, name),
+ m_locale(locale)
+{
+ // Money
+ QGridLayout *lay = new QGridLayout(this, 6, 2,
+ KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ m_labMonCurSym = new QLabel(this, I18N_NOOP("Currency symbol:"));
+ lay->addWidget(m_labMonCurSym, 0, 0);
+ m_edMonCurSym = new QLineEdit(this);
+ lay->addWidget(m_edMonCurSym, 0, 1);
+ connect( m_edMonCurSym, SIGNAL( textChanged(const QString &) ),
+ SLOT( slotMonCurSymChanged(const QString &) ) );
+
+ m_labMonDecSym = new QLabel(this, I18N_NOOP("Decimal symbol:"));
+ lay->addWidget(m_labMonDecSym, 1, 0);
+ m_edMonDecSym = new QLineEdit(this);
+ lay->addWidget(m_edMonDecSym, 1, 1);
+ connect( m_edMonDecSym, SIGNAL( textChanged(const QString &) ),
+ SLOT( slotMonDecSymChanged(const QString &) ) );
+
+ m_labMonThoSep = new QLabel(this, I18N_NOOP("Thousands separator:"));
+ lay->addWidget(m_labMonThoSep, 2, 0);
+ m_edMonThoSep = new QLineEdit(this);
+ lay->addWidget(m_edMonThoSep, 2, 1);
+ connect( m_edMonThoSep, SIGNAL( textChanged(const QString &) ),
+ SLOT( slotMonThoSepChanged(const QString &) ) );
+
+ m_labMonFraDig = new QLabel(this, I18N_NOOP("Fract digits:"));
+ lay->addWidget(m_labMonFraDig, 3, 0);
+ m_inMonFraDig = new KIntNumInput(this);
+ m_inMonFraDig->setRange(0, 10, 1, false);
+ lay->addWidget(m_inMonFraDig, 3, 1);
+
+ connect( m_inMonFraDig, SIGNAL( valueChanged(int) ),
+ SLOT( slotMonFraDigChanged(int) ) );
+
+ QWidget *vbox = new QVBox(this);
+ lay->addMultiCellWidget(vbox, 4, 4, 0, 1);
+ QVGroupBox *vgrp;
+ vgrp = new QVGroupBox( vbox, I18N_NOOP("Positive") );
+ m_chMonPosPreCurSym = new QCheckBox(vgrp, I18N_NOOP("Prefix currency symbol"));
+ connect( m_chMonPosPreCurSym, SIGNAL( clicked() ),
+ SLOT( slotMonPosPreCurSymChanged() ) );
+
+ QHBox *hbox;
+ hbox = new QHBox( vgrp );
+ m_labMonPosMonSignPos = new QLabel(hbox, I18N_NOOP("Sign position:"));
+ m_cmbMonPosMonSignPos = new QComboBox(hbox, "signpos");
+ connect( m_cmbMonPosMonSignPos, SIGNAL( activated(int) ),
+ SLOT( slotMonPosMonSignPosChanged(int) ) );
+
+ vgrp = new QVGroupBox( vbox, I18N_NOOP("Negative") );
+ m_chMonNegPreCurSym = new QCheckBox(vgrp, I18N_NOOP("Prefix currency symbol"));
+ connect( m_chMonNegPreCurSym, SIGNAL( clicked() ),
+ SLOT( slotMonNegPreCurSymChanged() ) );
+
+ hbox = new QHBox( vgrp );
+ m_labMonNegMonSignPos = new QLabel(hbox, I18N_NOOP("Sign position:"));
+ m_cmbMonNegMonSignPos = new QComboBox(hbox, "signpos");
+ connect( m_cmbMonNegMonSignPos, SIGNAL( activated(int) ),
+ SLOT( slotMonNegMonSignPosChanged(int) ) );
+
+ // insert some items
+ int i = 5;
+ while (i--)
+ {
+ m_cmbMonPosMonSignPos->insertItem(QString::null);
+ m_cmbMonNegMonSignPos->insertItem(QString::null);
+ }
+
+ lay->setColStretch(1, 1);
+ lay->addRowSpacing(5, 0);
+
+ adjustSize();
+}
+
+KLocaleConfigMoney::~KLocaleConfigMoney()
+{
+}
+
+void KLocaleConfigMoney::save()
+{
+ KConfig *config = KGlobal::config();
+ KConfigGroupSaver saver(config, "Locale");
+
+ KSimpleConfig ent(locate("locale",
+ QString::fromLatin1("l10n/%1/entry.desktop")
+ .arg(m_locale->country())), true);
+ ent.setGroup("KCM Locale");
+
+ QString str;
+ int i;
+ bool b;
+
+ str = ent.readEntry("CurrencySymbol", QString::fromLatin1("$"));
+ config->deleteEntry("CurrencySymbol", false, true);
+ if (str != m_locale->currencySymbol())
+ config->writeEntry("CurrencySymbol",
+ m_locale->currencySymbol(), true, true);
+
+ str = ent.readEntry("MonetaryDecimalSymbol", QString::fromLatin1("."));
+ config->deleteEntry("MonetaryDecimalSymbol", false, true);
+ if (str != m_locale->monetaryDecimalSymbol())
+ config->writeEntry("MonetaryDecimalSymbol",
+ m_locale->monetaryDecimalSymbol(), true, true);
+
+ str = ent.readEntry("MonetaryThousandsSeparator", QString::fromLatin1(","));
+ str.replace(QString::fromLatin1("$0"), QString::null);
+ config->deleteEntry("MonetaryThousandsSeparator", false, true);
+ if (str != m_locale->monetaryThousandsSeparator())
+ config->writeEntry("MonetaryThousandsSeparator",
+ QString::fromLatin1("$0%1$0")
+ .arg(m_locale->monetaryThousandsSeparator()),
+ true, true);
+
+ i = ent.readNumEntry("FracDigits", 2);
+ config->deleteEntry("FracDigits", false, true);
+ if (i != m_locale->fracDigits())
+ config->writeEntry("FracDigits", m_locale->fracDigits(), true, true);
+
+ b = ent.readBoolEntry("PositivePrefixCurrencySymbol", true);
+ config->deleteEntry("PositivePrefixCurrencySymbol", false, true);
+ if (b != m_locale->positivePrefixCurrencySymbol())
+ config->writeEntry("PositivePrefixCurrencySymbol",
+ m_locale->positivePrefixCurrencySymbol(), true, true);
+
+ b = ent.readBoolEntry("NegativePrefixCurrencySymbol", true);
+ config->deleteEntry("NegativePrefixCurrencySymbol", false, true);
+ if (b != m_locale->negativePrefixCurrencySymbol())
+ config->writeEntry("NegativePrefixCurrencySymbol",
+ m_locale->negativePrefixCurrencySymbol(), true, true);
+
+ i = ent.readNumEntry("PositiveMonetarySignPosition",
+ (int)KLocale::BeforeQuantityMoney);
+ config->deleteEntry("PositiveMonetarySignPosition", false, true);
+ if (i != m_locale->positiveMonetarySignPosition())
+ config->writeEntry("PositiveMonetarySignPosition",
+ (int)m_locale->positiveMonetarySignPosition(),
+ true, true);
+
+ i = ent.readNumEntry("NegativeMonetarySignPosition",
+ (int)KLocale::ParensAround);
+ config->deleteEntry("NegativeMonetarySignPosition", false, true);
+ if (i != m_locale->negativeMonetarySignPosition())
+ config->writeEntry("NegativeMonetarySignPosition",
+ (int)m_locale->negativeMonetarySignPosition(),
+ true, true);
+
+ config->sync();
+}
+
+void KLocaleConfigMoney::slotLocaleChanged()
+{
+ m_edMonCurSym->setText( m_locale->currencySymbol() );
+ m_edMonDecSym->setText( m_locale->monetaryDecimalSymbol() );
+ m_edMonThoSep->setText( m_locale->monetaryThousandsSeparator() );
+ m_inMonFraDig->setValue( m_locale->fracDigits() );
+
+ m_chMonPosPreCurSym->setChecked( m_locale->positivePrefixCurrencySymbol() );
+ m_chMonNegPreCurSym->setChecked( m_locale->negativePrefixCurrencySymbol() );
+ m_cmbMonPosMonSignPos->setCurrentItem( m_locale->positiveMonetarySignPosition() );
+ m_cmbMonNegMonSignPos->setCurrentItem( m_locale->negativeMonetarySignPosition() );
+}
+
+void KLocaleConfigMoney::slotMonCurSymChanged(const QString &t)
+{
+ m_locale->setCurrencySymbol(t);
+ emit localeChanged();
+}
+
+void KLocaleConfigMoney::slotMonDecSymChanged(const QString &t)
+{
+ m_locale->setMonetaryDecimalSymbol(t);
+ emit localeChanged();
+}
+
+void KLocaleConfigMoney::slotMonThoSepChanged(const QString &t)
+{
+ m_locale->setMonetaryThousandsSeparator(t);
+ emit localeChanged();
+}
+
+void KLocaleConfigMoney::slotMonFraDigChanged(int value)
+{
+ m_locale->setFracDigits(value);
+ emit localeChanged();
+}
+
+void KLocaleConfigMoney::slotMonPosPreCurSymChanged()
+{
+ m_locale->setPositivePrefixCurrencySymbol(m_chMonPosPreCurSym->isChecked());
+ emit localeChanged();
+}
+
+void KLocaleConfigMoney::slotMonNegPreCurSymChanged()
+{
+ m_locale->setNegativePrefixCurrencySymbol(m_chMonNegPreCurSym->isChecked());
+ emit localeChanged();
+}
+
+void KLocaleConfigMoney::slotMonPosMonSignPosChanged(int i)
+{
+ m_locale->setPositiveMonetarySignPosition((KLocale::SignPosition)i);
+ emit localeChanged();
+}
+
+void KLocaleConfigMoney::slotMonNegMonSignPosChanged(int i)
+{
+ m_locale->setNegativeMonetarySignPosition((KLocale::SignPosition)i);
+ emit localeChanged();
+}
+
+void KLocaleConfigMoney::slotTranslate()
+{
+ QObjectList list;
+ list.append(m_cmbMonPosMonSignPos);
+ list.append(m_cmbMonNegMonSignPos);
+
+ QComboBox *wc;
+ for (QObjectListIt li(list) ; (wc = (QComboBox *)li.current()) != 0; ++li)
+ {
+ wc->changeItem(m_locale->translate("Parentheses Around"), 0);
+ wc->changeItem(m_locale->translate("Before Quantity Money"), 1);
+ wc->changeItem(m_locale->translate("After Quantity Money"), 2);
+ wc->changeItem(m_locale->translate("Before Money"), 3);
+ wc->changeItem(m_locale->translate("After Money"), 4);
+ }
+
+ QString str;
+
+ str = m_locale->translate( "Here you can enter your usual currency "
+ "symbol, e.g. $ or DM."
+ "<p>Please note that the Euro symbol may not be "
+ "available on your system, depending on the "
+ "distribution you use." );
+ QWhatsThis::add( m_labMonCurSym, str );
+ QWhatsThis::add( m_edMonCurSym, str );
+ str = m_locale->translate( "Here you can define the decimal separator used "
+ "to display monetary values."
+ "<p>Note that the decimal separator used to "
+ "display other numbers has to be defined "
+ "separately (see the 'Numbers' tab)." );
+ QWhatsThis::add( m_labMonDecSym, str );
+ QWhatsThis::add( m_edMonDecSym, str );
+
+ str = m_locale->translate( "Here you can define the thousands separator "
+ "used to display monetary values."
+ "<p>Note that the thousands separator used to "
+ "display other numbers has to be defined "
+ "separately (see the 'Numbers' tab)." );
+ QWhatsThis::add( m_labMonThoSep, str );
+ QWhatsThis::add( m_edMonThoSep, str );
+
+ str = m_locale->translate( "This determines the number of fract digits for "
+ "monetary values, i.e. the number of digits you "
+ "find <em>behind</em> the decimal separator. "
+ "Correct value is 2 for almost all people." );
+ QWhatsThis::add( m_labMonFraDig, str );
+ QWhatsThis::add( m_inMonFraDig, str );
+
+ str = m_locale->translate( "If this option is checked, the currency sign "
+ "will be prefixed (i.e. to the left of the "
+ "value) for all positive monetary values. If "
+ "not, it will be postfixed (i.e. to the right)." );
+ QWhatsThis::add( m_chMonPosPreCurSym, str );
+
+ str = m_locale->translate( "If this option is checked, the currency sign "
+ "will be prefixed (i.e. to the left of the "
+ "value) for all negative monetary values. If "
+ "not, it will be postfixed (i.e. to the right)." );
+ QWhatsThis::add( m_chMonNegPreCurSym, str );
+
+ str = m_locale->translate( "Here you can select how a positive sign will be "
+ "positioned. This only affects monetary values." );
+ QWhatsThis::add( m_labMonPosMonSignPos, str );
+ QWhatsThis::add( m_cmbMonPosMonSignPos, str );
+
+ str = m_locale->translate( "Here you can select how a negative sign will "
+ "be positioned. This only affects monetary "
+ "values." );
+ QWhatsThis::add( m_labMonNegMonSignPos, str );
+ QWhatsThis::add( m_cmbMonNegMonSignPos, str );
+}
diff --git a/kcontrol/locale/localemon.h b/kcontrol/locale/localemon.h
new file mode 100644
index 000000000..e772af4d3
--- /dev/null
+++ b/kcontrol/locale/localemon.h
@@ -0,0 +1,93 @@
+/*
+ * localemon.h
+ *
+ * Copyright (c) 1999-2003 Hans Petter Bieker <bieker@kde.org>
+ *
+ * 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.
+ */
+
+
+#ifndef __KLOCALECONFIGMON_H__
+#define __KLOCALECONFIGMON_H__
+
+#include <qwidget.h>
+
+class QCheckBox;
+class QComboBox;
+class QLineEdit;
+
+class KIntNumInput;
+class KLocale;
+class KLanguageCombo;
+
+class KLocaleConfigMoney : public QWidget
+{
+ Q_OBJECT
+
+public:
+ KLocaleConfigMoney(KLocale *locale, QWidget *parent = 0, const char *name = 0);
+ virtual ~KLocaleConfigMoney();
+
+ void save();
+
+public slots:
+ /**
+ * Loads all settings from the current locale into the current widget.
+ */
+ void slotLocaleChanged();
+ /**
+ * Retranslate all objects owned by this object using the current locale.
+ */
+ void slotTranslate();
+
+signals:
+ void localeChanged();
+
+private slots:
+ // Money
+ void slotMonCurSymChanged(const QString &t);
+ void slotMonDecSymChanged(const QString &t);
+ void slotMonThoSepChanged(const QString &t);
+ void slotMonFraDigChanged(int value);
+ void slotMonPosPreCurSymChanged();
+ void slotMonNegPreCurSymChanged();
+ void slotMonPosMonSignPosChanged(int i);
+ void slotMonNegMonSignPosChanged(int i);
+
+private:
+ KLocale *m_locale;
+
+ // Money
+ QLabel *m_labMonCurSym;
+ QLineEdit *m_edMonCurSym;
+ QLabel *m_labMonDecSym;
+ QLineEdit *m_edMonDecSym;
+ QLabel *m_labMonThoSep;
+ QLineEdit *m_edMonThoSep;
+ QLabel *m_labMonFraDig;
+ KIntNumInput * m_inMonFraDig;
+
+ QCheckBox *m_chMonPosPreCurSym;
+ QCheckBox *m_chMonNegPreCurSym;
+ QLabel *m_labMonPosMonSignPos;
+ QComboBox *m_cmbMonPosMonSignPos;
+ QLabel *m_labMonNegMonSignPos;
+ QComboBox *m_cmbMonNegMonSignPos;
+};
+
+#endif
diff --git a/kcontrol/locale/localenum.cpp b/kcontrol/locale/localenum.cpp
new file mode 100644
index 000000000..9e5445ded
--- /dev/null
+++ b/kcontrol/locale/localenum.cpp
@@ -0,0 +1,194 @@
+/*
+ * localenum.cpp
+ *
+ * Copyright (c) 1999-2003 Hans Petter Bieker <bieker@kde.org>
+ *
+ * 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 <qlabel.h>
+#include <qlineedit.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+#include <qregexp.h>
+
+#include <kdialog.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+
+#include "toplevel.h"
+#include "localenum.h"
+#include "localenum.moc"
+
+KLocaleConfigNumber::KLocaleConfigNumber(KLocale *locale,
+ QWidget *parent, const char*name)
+ : QWidget(parent, name),
+ m_locale(locale)
+{
+ QGridLayout *lay = new QGridLayout(this, 5, 2,
+ KDialog::marginHint(),
+ KDialog::spacingHint());
+ lay->setAutoAdd(TRUE);
+
+ m_labDecSym = new QLabel(this, I18N_NOOP("&Decimal symbol:"));
+ m_edDecSym = new QLineEdit(this);
+ connect( m_edDecSym, SIGNAL( textChanged(const QString &) ),
+ this, SLOT( slotDecSymChanged(const QString &) ) );
+ m_labDecSym->setBuddy(m_edDecSym);
+
+ m_labThoSep = new QLabel(this, I18N_NOOP("Tho&usands separator:"));
+ m_edThoSep = new QLineEdit(this);
+ connect( m_edThoSep, SIGNAL( textChanged(const QString &) ),
+ this, SLOT( slotThoSepChanged(const QString &) ) );
+ m_labThoSep->setBuddy(m_edThoSep);
+
+ m_labMonPosSign = new QLabel(this, I18N_NOOP("Positive si&gn:"));
+ m_edMonPosSign = new QLineEdit(this);
+ connect( m_edMonPosSign, SIGNAL( textChanged(const QString &) ),
+ this, SLOT( slotMonPosSignChanged(const QString &) ) );
+ m_labMonPosSign->setBuddy(m_edMonPosSign);
+
+ m_labMonNegSign = new QLabel(this, I18N_NOOP("&Negative sign:"));
+ m_edMonNegSign = new QLineEdit(this);
+ connect( m_edMonNegSign, SIGNAL( textChanged(const QString &) ),
+ this, SLOT( slotMonNegSignChanged(const QString &) ) );
+ m_labMonNegSign->setBuddy(m_edMonNegSign);
+
+ lay->setColStretch(1, 1);
+
+ connect(this, SIGNAL(localeChanged()),
+ SLOT(slotLocaleChanged()));
+}
+
+KLocaleConfigNumber::~KLocaleConfigNumber()
+{
+}
+
+void KLocaleConfigNumber::save()
+{
+ // temperary use of our locale as the global locale
+ KLocale *lsave = KGlobal::_locale;
+ KGlobal::_locale = m_locale;
+
+ KConfig *config = KGlobal::config();
+ KConfigGroupSaver saver(config, "Locale");
+
+ KSimpleConfig ent(locate("locale",
+ QString::fromLatin1("l10n/%1/entry.desktop")
+ .arg(m_locale->country())), true);
+ ent.setGroup("KCM Locale");
+
+ QString str;
+
+ str = ent.readEntry("DecimalSymbol",
+ QString::fromLatin1("."));
+ config->deleteEntry("DecimalSymbol", false, true);
+ if (str != m_locale->decimalSymbol())
+ config->writeEntry("DecimalSymbol",
+ m_locale->decimalSymbol(), true, true);
+
+ str = ent.readEntry("ThousandsSeparator",
+ QString::fromLatin1(","));
+ config->deleteEntry("ThousandsSeparator", false, true);
+ str.replace(QString::fromLatin1("$0"), QString::null);
+ if (str != m_locale->thousandsSeparator())
+ config->writeEntry("ThousandsSeparator",
+ QString::fromLatin1("$0%1$0")
+ .arg(m_locale->thousandsSeparator()), true, true);
+
+ str = ent.readEntry("PositiveSign");
+ config->deleteEntry("PositiveSign", false, true);
+ if (str != m_locale->positiveSign())
+ config->writeEntry("PositiveSign", m_locale->positiveSign(), true, true);
+
+ str = ent.readEntry("NegativeSign", QString::fromLatin1("-"));
+ config->deleteEntry("NegativeSign", false, true);
+ if (str != m_locale->negativeSign())
+ config->writeEntry("NegativeSign", m_locale->negativeSign(), true, true);
+
+ // restore the old global locale
+ KGlobal::_locale = lsave;
+}
+
+void KLocaleConfigNumber::slotLocaleChanged()
+{
+ // #### load all settings here
+ m_edDecSym->setText( m_locale->decimalSymbol() );
+ m_edThoSep->setText( m_locale->thousandsSeparator() );
+ m_edMonPosSign->setText( m_locale->positiveSign() );
+ m_edMonNegSign->setText( m_locale->negativeSign() );
+}
+
+void KLocaleConfigNumber::slotDecSymChanged(const QString &t)
+{
+ m_locale->setDecimalSymbol(t);
+ emit localeChanged();
+}
+
+void KLocaleConfigNumber::slotThoSepChanged(const QString &t)
+{
+ m_locale->setThousandsSeparator(t);
+ emit localeChanged();
+}
+
+void KLocaleConfigNumber::slotMonPosSignChanged(const QString &t)
+{
+ m_locale->setPositiveSign(t);
+ emit localeChanged();
+}
+
+void KLocaleConfigNumber::slotMonNegSignChanged(const QString &t)
+{
+ m_locale->setNegativeSign(t);
+ emit localeChanged();
+}
+
+void KLocaleConfigNumber::slotTranslate()
+{
+ QString str;
+
+ str = m_locale->translate( "Here you can define the decimal separator used "
+ "to display numbers (i.e. a dot or a comma in "
+ "most countries).<p>"
+ "Note that the decimal separator used to "
+ "display monetary values has to be set "
+ "separately (see the 'Money' tab)." );
+ QWhatsThis::add( m_labDecSym, str );
+ QWhatsThis::add( m_edDecSym, str );
+
+ str = m_locale->translate( "Here you can define the thousands separator "
+ "used to display numbers.<p>"
+ "Note that the thousands separator used to "
+ "display monetary values has to be set "
+ "separately (see the 'Money' tab)." );
+ QWhatsThis::add( m_labThoSep, str );
+ QWhatsThis::add( m_edThoSep, str );
+
+ str = m_locale->translate( "Here you can specify text used to prefix "
+ "positive numbers. Most people leave this "
+ "blank." );
+ QWhatsThis::add( m_labMonPosSign, str );
+ QWhatsThis::add( m_edMonPosSign, str );
+
+ str = m_locale->translate( "Here you can specify text used to prefix "
+ "negative numbers. This should not be empty, so "
+ "you can distinguish positive and negative "
+ "numbers. It is normally set to minus (-)." );
+ QWhatsThis::add( m_labMonNegSign, str );
+ QWhatsThis::add( m_edMonNegSign, str );
+}
diff --git a/kcontrol/locale/localenum.h b/kcontrol/locale/localenum.h
new file mode 100644
index 000000000..da75dc708
--- /dev/null
+++ b/kcontrol/locale/localenum.h
@@ -0,0 +1,82 @@
+/*
+ * localenum.h
+ *
+ * Copyright (c) 1999-2003 Hans Petter Bieker <bieker@kde.org>
+ *
+ * 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.
+ */
+
+
+#ifndef __KLOCALECONFIGNUM_H__
+#define __KLOCALECONFIGNUM_H__
+
+#include <qwidget.h>
+
+class QCheckBox;
+class QComboBox;
+class QLineEdit;
+
+class KLocale;
+class KLanguageCombo;
+
+class KLocaleConfigNumber : public QWidget
+{
+ Q_OBJECT
+
+public:
+ KLocaleConfigNumber( KLocale *_locale,
+ QWidget *parent=0, const char *name=0);
+ virtual ~KLocaleConfigNumber( );
+
+ void save();
+
+public slots:
+ /**
+ * Loads all settings from the current locale into the current widget.
+ */
+ void slotLocaleChanged();
+ /**
+ * Retranslate all objects owned by this object using the current locale.
+ */
+ void slotTranslate();
+
+signals:
+ void localeChanged();
+
+private slots:
+ // Numbers
+ void slotMonPosSignChanged(const QString &t);
+ void slotMonNegSignChanged(const QString &t);
+ void slotDecSymChanged(const QString &t);
+ void slotThoSepChanged(const QString &t);
+
+private:
+ KLocale *m_locale;
+
+ // Numbers
+ QLabel *m_labDecSym;
+ QLineEdit *m_edDecSym;
+ QLabel *m_labThoSep;
+ QLineEdit *m_edThoSep;
+ QLabel *m_labMonPosSign;
+ QLineEdit *m_edMonPosSign;
+ QLabel *m_labMonNegSign;
+ QLineEdit *m_edMonNegSign;
+};
+
+#endif
diff --git a/kcontrol/locale/localeother.cpp b/kcontrol/locale/localeother.cpp
new file mode 100644
index 000000000..97f97ba2f
--- /dev/null
+++ b/kcontrol/locale/localeother.cpp
@@ -0,0 +1,142 @@
+/*
+ * localeother.cpp
+ *
+ * Copyright (c) 2001-2003 Hans Petter Bieker <bieker@kde.org>
+ *
+ * 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 <qcombobox.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qprinter.h>
+
+#include <kdialog.h>
+#include <klocale.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+
+#include "localeother.h"
+#include "localeother.moc"
+
+
+KLocaleConfigOther::KLocaleConfigOther(KLocale *locale,
+ QWidget *parent, const char*name)
+ : QWidget(parent, name),
+ m_locale(locale)
+{
+ // Other
+ QGridLayout *lay = new QGridLayout(this, 3, 2,
+ KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ m_labPageSize = new QLabel(this, I18N_NOOP("Paper format:"));
+ lay->addWidget(m_labPageSize, 0, 0);
+ m_combPageSize = new QComboBox(this);
+ lay->addWidget(m_combPageSize, 0, 1);
+ connect( m_combPageSize, SIGNAL( activated(int) ),
+ SLOT( slotPageSizeChanged(int) ) );
+
+ m_labMeasureSystem = new QLabel(this, I18N_NOOP("Measure system:"));
+ lay->addWidget(m_labMeasureSystem, 1, 0);
+ m_combMeasureSystem = new QComboBox(this);
+ lay->addWidget(m_combMeasureSystem, 1, 1);
+ connect( m_combMeasureSystem, SIGNAL( activated(int) ),
+ SLOT( slotMeasureSystemChanged(int) ) );
+
+ m_combPageSize->insertItem(QString::null);
+ m_combPageSize->insertItem(QString::null);
+ m_combMeasureSystem->insertItem(QString::null);
+ m_combMeasureSystem->insertItem(QString::null);
+
+ lay->setColStretch(1, 1);
+ lay->addRowSpacing(2, 0);
+
+ adjustSize();
+}
+
+KLocaleConfigOther::~KLocaleConfigOther()
+{
+}
+
+void KLocaleConfigOther::save()
+{
+ KConfig *config = KGlobal::config();
+ KConfigGroupSaver saver(config, "Locale");
+
+ KSimpleConfig ent(locate("locale",
+ QString::fromLatin1("l10n/%1/entry.desktop")
+ .arg(m_locale->country())), true);
+ ent.setGroup("KCM Locale");
+
+ // ### HPB: Add code here
+ int i;
+ i = ent.readNumEntry("PageSize", (int)QPrinter::A4);
+ config->deleteEntry("PageSize", false, true);
+ if (i != m_locale->pageSize())
+ config->writeEntry("PageSize",
+ m_locale->pageSize(), true, true);
+
+ i = ent.readNumEntry("MeasureSystem", (int)KLocale::Metric);
+ config->deleteEntry("MeasureSystem", false, true);
+ if (i != m_locale->measureSystem())
+ config->writeEntry("MeasureSystem",
+ m_locale->measureSystem(), true, true);
+
+ config->sync();
+}
+
+void KLocaleConfigOther::slotLocaleChanged()
+{
+ m_combMeasureSystem->setCurrentItem(m_locale->measureSystem());
+
+ int pageSize = m_locale->pageSize();
+
+ int i = 0; // default to A4
+ if ( pageSize == (int)QPrinter::Letter )
+ i = 1;
+ m_combPageSize->setCurrentItem(i);
+}
+
+void KLocaleConfigOther::slotTranslate()
+{
+ m_combMeasureSystem->changeItem( m_locale->translate("The Metric System",
+ "Metric"), 0 );
+ m_combMeasureSystem->changeItem( m_locale->translate("The Imperial System",
+ "Imperial"), 1 );
+
+ m_combPageSize->changeItem( m_locale->translate("A4"), 0 );
+ m_combPageSize->changeItem( m_locale->translate("US Letter"), 1 );
+}
+
+void KLocaleConfigOther::slotPageSizeChanged(int i)
+{
+ QPrinter::PageSize pageSize = QPrinter::A4;
+
+ if ( i == 1 )
+ pageSize = QPrinter::Letter;
+
+ m_locale->setPageSize((int)pageSize);
+ emit localeChanged();
+}
+
+void KLocaleConfigOther::slotMeasureSystemChanged(int i)
+{
+ m_locale->setMeasureSystem((KLocale::MeasureSystem)i);
+ emit localeChanged();
+}
diff --git a/kcontrol/locale/localeother.h b/kcontrol/locale/localeother.h
new file mode 100644
index 000000000..1c6ec0b48
--- /dev/null
+++ b/kcontrol/locale/localeother.h
@@ -0,0 +1,70 @@
+/*
+ * localeother.h
+ *
+ * Copyright (c) 2001-2003 Hans Petter Bieker <bieker@kde.org>
+ *
+ * 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.
+ */
+
+#ifndef __KLOCALECONFIGOTHER_H__
+#define __KLOCALECONFIGOTHER_H__
+
+#include <qwidget.h>
+
+class QLabel;
+class QComboBox;
+
+class KLocale;
+
+class KLocaleConfigOther : public QWidget
+{
+ Q_OBJECT
+
+public:
+ KLocaleConfigOther(KLocale *locale, QWidget *parent = 0, const char *name = 0);
+ virtual ~KLocaleConfigOther();
+
+ void save();
+
+public slots:
+ /**
+ * Loads all settings from the current locale into the current widget.
+ */
+ void slotLocaleChanged();
+ /**
+ * Retranslate all objects owned by this object using the current locale.
+ */
+ void slotTranslate();
+
+signals:
+ void localeChanged();
+
+private slots:
+ void slotPageSizeChanged(int i);
+ void slotMeasureSystemChanged(int i);
+
+private:
+ KLocale *m_locale;
+
+ QLabel *m_labMeasureSystem;
+ QComboBox *m_combMeasureSystem;
+ QLabel *m_labPageSize;
+ QComboBox *m_combPageSize;
+};
+
+#endif
diff --git a/kcontrol/locale/localetime.cpp b/kcontrol/locale/localetime.cpp
new file mode 100644
index 000000000..ea077ac89
--- /dev/null
+++ b/kcontrol/locale/localetime.cpp
@@ -0,0 +1,556 @@
+/*
+ * localetime.cpp
+ *
+ * Copyright (c) 1999-2003 Hans Petter Bieker <bieker@kde.org>
+ *
+ * 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 <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+#include <qcombobox.h>
+#include <qvaluevector.h>
+
+#include <kdialog.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+#include <kcalendarsystem.h>
+
+#include "toplevel.h"
+#include "localetime.h"
+#include "localetime.moc"
+
+class StringPair
+{
+public:
+ QChar storeName;
+ QString userName;
+
+ static StringPair find( const QValueList <StringPair> &list, const QChar &c)
+ {
+ for ( QValueList<StringPair>::ConstIterator it = list.begin();
+ it != list.end();
+ ++it )
+ if ((*it).storeName==c) return (*it);
+
+ StringPair r;
+ return r;
+ }
+
+};
+
+/* Sort the string pairs with qHeapSort in the order we want
+ ( relative to the userName value and with "MESCORTO" before "MES" )
+ */
+bool operator< (const StringPair &p1, const StringPair &p2)
+{
+ return ! (p1.userName<p2.userName);
+}
+
+bool operator<= (const StringPair &p1, const StringPair &p2)
+{
+ return ! (p1.userName<=p2.userName);
+}
+
+bool operator> (const StringPair &p1, const StringPair &p2)
+{
+ return ! (p1.userName>p2.userName);
+}
+
+bool operator>= (const StringPair &p1, const StringPair &p2)
+{
+ return ! (p1.userName>=p2.userName);
+}
+
+StringPair KLocaleConfigTime::buildStringPair(const QChar &c, const QString &s) const
+{
+ StringPair pair;
+ pair.storeName=c;
+ pair.userName=s;
+ return pair;
+}
+
+QValueList<StringPair> KLocaleConfigTime::timeMap() const
+{
+ QValueList < StringPair > list;
+ list+=buildStringPair('H',m_locale->translate("HH"));
+ list+=buildStringPair('k',m_locale->translate("hH"));
+ list+=buildStringPair('I',m_locale->translate("PH"));
+ list+=buildStringPair('l',m_locale->translate("pH"));
+ list+=buildStringPair('M',m_locale->translate("Minute", "MM"));
+ list+=buildStringPair('S',m_locale->translate("SS"));
+ list+=buildStringPair('p',m_locale->translate("AMPM"));
+
+ qHeapSort( list );
+
+ return list;
+}
+
+QValueList <StringPair> KLocaleConfigTime::dateMap() const
+{
+ QValueList < StringPair > list;
+ list+=buildStringPair('Y',m_locale->translate("YYYY"));
+ list+=buildStringPair('y',m_locale->translate("YY"));
+ list+=buildStringPair('n',m_locale->translate("mM"));
+ list+=buildStringPair('m',m_locale->translate("Month", "MM"));
+ list+=buildStringPair('b',m_locale->translate("SHORTMONTH"));
+ list+=buildStringPair('B',m_locale->translate("MONTH"));
+ list+=buildStringPair('e',m_locale->translate("dD"));
+ list+=buildStringPair('d',m_locale->translate("DD"));
+ list+=buildStringPair('a',m_locale->translate("SHORTWEEKDAY"));
+ list+=buildStringPair('A',m_locale->translate("WEEKDAY"));
+
+ qHeapSort( list );
+
+ return list;
+}
+
+QString KLocaleConfigTime::userToStore(const QValueList<StringPair> & list,
+ const QString & userFormat) const
+{
+ QString result;
+
+ for ( uint pos = 0; pos < userFormat.length(); ++pos )
+ {
+ bool bFound = false;
+ for ( QValueList<StringPair>::ConstIterator it = list.begin();
+ it != list.end() && !bFound;
+ ++it )
+ {
+ QString s = (*it).userName;
+
+ if ( userFormat.mid( pos, s.length() ) == s )
+ {
+ result += '%';
+ result += (*it).storeName;
+
+ pos += s.length() - 1;
+
+ bFound = true;
+ }
+ }
+
+ if ( !bFound )
+ {
+ QChar c = userFormat.at( pos );
+ if ( c == '%' )
+ result += c;
+
+ result += c;
+ }
+ }
+
+ return result;
+}
+
+QString KLocaleConfigTime::storeToUser(const QValueList<StringPair> & list,
+ const QString & storeFormat) const
+{
+ QString result;
+
+ bool escaped = false;
+ for ( uint pos = 0; pos < storeFormat.length(); ++pos )
+ {
+ QChar c = storeFormat.at(pos);
+ if ( escaped )
+ {
+ StringPair it = StringPair::find( list, c );
+ if ( !it.userName.isEmpty() )
+ result += it.userName;
+ else
+ result += c;
+
+ escaped = false;
+ }
+ else if ( c == '%' )
+ escaped = true;
+ else
+ result += c;
+ }
+
+ return result;
+}
+
+KLocaleConfigTime::KLocaleConfigTime(KLocale *_locale,
+ QWidget *parent, const char*name)
+ : QWidget(parent, name),
+ m_locale(_locale)
+{
+ // Time
+ QGridLayout *lay = new QGridLayout(this, 7, 2,
+ KDialog::marginHint(),
+ KDialog::spacingHint());
+ lay->setAutoAdd(TRUE);
+
+ m_labCalendarSystem = new QLabel(this, I18N_NOOP("Calendar system:"));
+ m_comboCalendarSystem = new QComboBox(false, this);
+ connect(m_comboCalendarSystem, SIGNAL(activated(int)),
+ this, SLOT(slotCalendarSystemChanged(int)));
+ QStringList tmpCalendars;
+ tmpCalendars << QString::null << QString::null;
+ m_comboCalendarSystem->insertStringList(tmpCalendars);
+
+ m_labTimeFmt = new QLabel(this, I18N_NOOP("Time format:"));
+ m_comboTimeFmt = new QComboBox(true, this);
+ //m_edTimeFmt = m_comboTimeFmt->lineEdit();
+ //m_edTimeFmt = new QLineEdit(this);
+ connect( m_comboTimeFmt, SIGNAL( textChanged(const QString &) ),
+ this, SLOT( slotTimeFmtChanged(const QString &) ) );
+
+ m_labDateFmt = new QLabel(this, I18N_NOOP("Date format:"));
+ m_comboDateFmt = new QComboBox(true, this);
+ connect( m_comboDateFmt, SIGNAL( textChanged(const QString &) ),
+ this, SLOT( slotDateFmtChanged(const QString &) ) );
+
+ m_labDateFmtShort = new QLabel(this, I18N_NOOP("Short date format:"));
+ m_comboDateFmtShort = new QComboBox(true, this);
+ connect( m_comboDateFmtShort, SIGNAL( textChanged(const QString &) ),
+ this, SLOT( slotDateFmtShortChanged(const QString &) ) );
+
+ m_labWeekStartDay = new QLabel(this, I18N_NOOP("First day of the week:"));
+ m_comboWeekStartDay = new QComboBox(false, this);
+ connect (m_comboWeekStartDay, SIGNAL(activated(int)),
+ this, SLOT(slotWeekStartDayChanged(int)));
+
+ updateWeekDayNames();
+
+ m_chDateMonthNamePossessive = new QCheckBox(this, I18N_NOOP("Use declined form of month name"));
+ connect( m_chDateMonthNamePossessive, SIGNAL( clicked() ),
+ SLOT( slotDateMonthNamePossChanged() ) );
+
+ lay->setColStretch(1, 1);
+}
+
+KLocaleConfigTime::~KLocaleConfigTime()
+{
+}
+
+void KLocaleConfigTime::save()
+{
+ // temperary use of our locale as the global locale
+ KLocale *lsave = KGlobal::_locale;
+ KGlobal::_locale = m_locale;
+
+ KConfig *config = KGlobal::config();
+ KConfigGroupSaver saver(config, "Locale");
+
+ KSimpleConfig ent(locate("locale",
+ QString::fromLatin1("l10n/%1/entry.desktop")
+ .arg(m_locale->country())), true);
+ ent.setGroup("KCM Locale");
+
+ QString str;
+
+ str = ent.readEntry("CalendarSystem", QString::fromLatin1("gregorian"));
+ config->deleteEntry("CalendarSystem", false, true);
+ if (str != m_locale->calendarType())
+ config->writeEntry("CalendarSystem", m_locale->calendarType(), true, true);
+
+ str = ent.readEntry("TimeFormat", QString::fromLatin1("%H:%M:%S"));
+ config->deleteEntry("TimeFormat", false, true);
+ if (str != m_locale->timeFormat())
+ config->writeEntry("TimeFormat", m_locale->timeFormat(), true, true);
+
+ str = ent.readEntry("DateFormat", QString::fromLatin1("%A %d %B %Y"));
+ config->deleteEntry("DateFormat", false, true);
+ if (str != m_locale->dateFormat())
+ config->writeEntry("DateFormat", m_locale->dateFormat(), true, true);
+
+ str = ent.readEntry("DateFormatShort", QString::fromLatin1("%Y-%m-%d"));
+ config->deleteEntry("DateFormatShort", false, true);
+ if (str != m_locale->dateFormatShort())
+ config->writeEntry("DateFormatShort",
+ m_locale->dateFormatShort(), true, true);
+
+ int firstDay;
+ firstDay = ent.readNumEntry("WeekStartDay", 1);
+ config->deleteEntry("WeekStartDay", false, true);
+ if (firstDay != m_locale->weekStartDay())
+ config->writeEntry("WeekStartDay", m_locale->weekStartDay(), true, true);
+
+ if ( m_locale->nounDeclension() )
+ {
+ bool b;
+ b = ent.readBoolEntry("DateMonthNamePossessive", false);
+ config->deleteEntry("DateMonthNamePossessive", false, true);
+ if (b != m_locale->dateMonthNamePossessive())
+ config->writeEntry("DateMonthNamePossessive",
+ m_locale->dateMonthNamePossessive(), true, true);
+ }
+
+ config->sync();
+
+ // restore the old global locale
+ KGlobal::_locale = lsave;
+}
+
+void KLocaleConfigTime::showEvent( QShowEvent *e )
+{
+ // This option makes sense only for languages where nouns are declined
+ if ( !m_locale->nounDeclension() )
+ m_chDateMonthNamePossessive->hide();
+ QWidget::showEvent( e );
+}
+
+void KLocaleConfigTime::slotCalendarSystemChanged(int calendarSystem)
+{
+ kdDebug() << "CalendarSystem: " << calendarSystem << endl;
+
+ typedef QValueVector<QString> CalendarVector;
+ CalendarVector calendars(4);
+ calendars[0] = "gregorian";
+ calendars[1] = "hijri";
+ calendars[2] = "hebrew";
+ calendars[3] = "jalali";
+
+ QString calendarType;
+ bool ok;
+ calendarType = calendars.at(calendarSystem, &ok);
+ if ( !ok )
+ calendarType = calendars.first();
+
+ m_locale->setCalendar(calendarType);
+
+ updateWeekDayNames();
+ emit localeChanged();
+}
+
+void KLocaleConfigTime::slotLocaleChanged()
+{
+ typedef QValueVector<QString> CalendarVector;
+ CalendarVector calendars(4);
+ calendars[0] = "gregorian";
+ calendars[1] = "hijri";
+ calendars[2] = "hebrew";
+ calendars[3] = "jalali";
+
+ QString calendarType = m_locale->calendarType();
+ int calendarSystem = 0;
+
+ CalendarVector::iterator it = qFind(calendars.begin(), calendars.end(),
+calendarType);
+ if ( it != calendars.end() )
+ calendarSystem = it - calendars.begin();
+
+ kdDebug() << "calSys: " << calendarSystem << ": " << calendarType << endl;
+ m_comboCalendarSystem->setCurrentItem( calendarSystem );
+
+ // m_edTimeFmt->setText( m_locale->timeFormat() );
+ m_comboTimeFmt->setEditText( storeToUser( timeMap(),
+ m_locale->timeFormat() ) );
+ // m_edDateFmt->setText( m_locale->dateFormat() );
+ m_comboDateFmt->setEditText( storeToUser( dateMap(),
+ m_locale->dateFormat() ) );
+ //m_edDateFmtShort->setText( m_locale->dateFormatShort() );
+ m_comboDateFmtShort->setEditText( storeToUser( dateMap(),
+ m_locale->dateFormatShort() ) );
+ m_comboWeekStartDay->setCurrentItem( m_locale->weekStartDay() - 1 );
+
+ if ( m_locale->nounDeclension() )
+ m_chDateMonthNamePossessive->setChecked( m_locale->dateMonthNamePossessive() );
+
+ kdDebug(173) << "converting: " << m_locale->timeFormat() << endl;
+ kdDebug(173) << storeToUser(timeMap(),
+ m_locale->timeFormat()) << endl;
+ kdDebug(173) << userToStore(timeMap(),
+ QString::fromLatin1("HH:MM:SS AMPM test")) << endl;
+
+}
+
+void KLocaleConfigTime::slotTimeFmtChanged(const QString &t)
+{
+ // m_locale->setTimeFormat(t);
+ m_locale->setTimeFormat( userToStore( timeMap(), t ) );
+
+ emit localeChanged();
+}
+
+void KLocaleConfigTime::slotDateFmtChanged(const QString &t)
+{
+ // m_locale->setDateFormat(t);
+ m_locale->setDateFormat( userToStore( dateMap(), t ) );
+ emit localeChanged();
+}
+
+void KLocaleConfigTime::slotDateFmtShortChanged(const QString &t)
+{
+ //m_locale->setDateFormatShort(t);
+ m_locale->setDateFormatShort( userToStore( dateMap(), t ) );
+ emit localeChanged();
+}
+
+void KLocaleConfigTime::slotWeekStartDayChanged(int firstDay) {
+ kdDebug(173) << k_funcinfo << "first day is now: " << firstDay << endl;
+ m_locale->setWeekStartDay(m_comboWeekStartDay->currentItem() + 1);
+ emit localeChanged();
+}
+
+void KLocaleConfigTime::slotDateMonthNamePossChanged()
+{
+ if (m_locale->nounDeclension())
+ {
+ m_locale->setDateMonthNamePossessive(m_chDateMonthNamePossessive->isChecked());
+ emit localeChanged();
+ }
+}
+
+void KLocaleConfigTime::slotTranslate()
+{
+ QString str;
+
+ QString sep = QString::fromLatin1("\n");
+
+ QString old;
+
+ // clear() and insertStringList also changes the current item, so
+ // we better use save and restore here..
+ old = m_comboTimeFmt->currentText();
+ m_comboTimeFmt->clear();
+ str = i18n("some reasonable time formats for the language",
+ "HH:MM:SS\n"
+ "pH:MM:SS AMPM");
+ m_comboTimeFmt->insertStringList(QStringList::split(sep, str));
+ m_comboTimeFmt->setEditText(old);
+
+ old = m_comboDateFmt->currentText();
+ m_comboDateFmt->clear();
+ str = i18n("some reasonable date formats for the language",
+ "WEEKDAY MONTH dD YYYY\n"
+ "SHORTWEEKDAY MONTH dD YYYY");
+ m_comboDateFmt->insertStringList(QStringList::split(sep, str));
+ m_comboDateFmt->setEditText(old);
+
+ old = m_comboDateFmtShort->currentText();
+ m_comboDateFmtShort->clear();
+ str = i18n("some reasonable short date formats for the language",
+ "YYYY-MM-DD\n"
+ "dD.mM.YYYY\n"
+ "DD.MM.YYYY");
+ m_comboDateFmtShort->insertStringList(QStringList::split(sep, str));
+ m_comboDateFmtShort->setEditText(old);
+
+ updateWeekDayNames();
+
+ while ( m_comboCalendarSystem->count() < 4 )
+ m_comboCalendarSystem->insertItem(QString::null);
+ m_comboCalendarSystem->changeItem
+ (m_locale->translate("Calendar System Gregorian", "Gregorian"), 0);
+ m_comboCalendarSystem->changeItem
+ (m_locale->translate("Calendar System Hijri", "Hijri"), 1);
+ m_comboCalendarSystem->changeItem
+ (m_locale->translate("Calendar System Hebrew", "Hebrew"), 2);
+ m_comboCalendarSystem->changeItem
+ (m_locale->translate("Calendar System Jalali", "Jalali"), 3);
+
+ str = m_locale->translate
+ ("<p>The text in this textbox will be used to format "
+ "time strings. The sequences below will be replaced:</p>"
+ "<table>"
+ "<tr><td><b>HH</b></td><td>The hour as a decimal number using a 24-hour "
+ "clock (00-23).</td></tr>"
+ "<tr><td><b>hH</b></td><td>The hour (24-hour clock) as a decimal number "
+ "(0-23).</td></tr>"
+ "<tr><td><b>PH</b></td><td>The hour as a decimal number using a 12-hour "
+ "clock (01-12).</td></tr>"
+ "<tr><td><b>pH</b></td><td>The hour (12-hour clock) as a decimal number "
+ "(1-12).</td></tr>"
+ "<tr><td><b>MM</b></td><td>The minutes as a decimal number (00-59)."
+ "</td><tr>"
+ "<tr><td><b>SS</b></td><td>The seconds as a decimal number (00-59)."
+ "</td></tr>"
+ "<tr><td><b>AMPM</b></td><td>Either \"am\" or \"pm\" according to the "
+ "given time value. Noon is treated as \"pm\" and midnight as \"am\"."
+ "</td></tr>"
+ "</table>");
+ QWhatsThis::add( m_labTimeFmt, str );
+ QWhatsThis::add( m_comboTimeFmt, str );
+
+ QString datecodes = m_locale->translate(
+ "<table>"
+ "<tr><td><b>YYYY</b></td><td>The year with century as a decimal number."
+ "</td></tr>"
+ "<tr><td><b>YY</b></td><td>The year without century as a decimal number "
+ "(00-99).</td></tr>"
+ "<tr><td><b>MM</b></td><td>The month as a decimal number (01-12)."
+ "</td></tr>"
+ "<tr><td><b>mM</b></td><td>The month as a decimal number (1-12).</td></tr>"
+ "<tr><td><b>SHORTMONTH</b></td><td>The first three characters of the month name. "
+ "</td></tr>"
+ "<tr><td><b>MONTH</b></td><td>The full month name.</td></tr>"
+ "<tr><td><b>DD</b></td><td>The day of month as a decimal number (01-31)."
+ "</td></tr>"
+ "<tr><td><b>dD</b></td><td>The day of month as a decimal number (1-31)."
+ "</td></tr>"
+ "<tr><td><b>SHORTWEEKDAY</b></td><td>The first three characters of the weekday name."
+ "</td></tr>"
+ "<tr><td><b>WEEKDAY</b></td><td>The full weekday name.</td></tr>"
+ "</table>");
+
+ str = m_locale->translate
+ ( "<p>The text in this textbox will be used to format long "
+ "dates. The sequences below will be replaced:</p>") + datecodes;
+ QWhatsThis::add( m_labDateFmt, str );
+ QWhatsThis::add( m_comboDateFmt, str );
+
+ str = m_locale->translate
+ ( "<p>The text in this textbox will be used to format short "
+ "dates. For instance, this is used when listing files. "
+ "The sequences below will be replaced:</p>") + datecodes;
+ QWhatsThis::add( m_labDateFmtShort, str );
+ QWhatsThis::add( m_comboDateFmtShort, str );
+
+ str = m_locale->translate
+ ("<p>This option determines which day will be considered as "
+ "the first one of the week.</p>");
+ QWhatsThis::add( m_comboWeekStartDay, str );
+
+ if ( m_locale->nounDeclension() )
+ {
+ str = m_locale->translate
+ ("<p>This option determines whether possessive form of month "
+ "names should be used in dates.</p>");
+ QWhatsThis::add( m_chDateMonthNamePossessive, str );
+ }
+}
+
+void KLocaleConfigTime::updateWeekDayNames()
+{
+ const KCalendarSystem * calendar = m_locale->calendar();
+
+ for ( int i = 1; ; ++i )
+ {
+ QString str = calendar->weekDayName(i);
+ bool outsideComboList = m_comboWeekStartDay->count() < i;
+
+ if ( str.isNull() )
+ {
+ if ( outsideComboList )
+ break;
+ else
+ m_comboWeekStartDay->removeItem(i - 1);
+ }
+
+ if ( outsideComboList )
+ m_comboWeekStartDay->insertItem(str, i - 1);
+ else
+ m_comboWeekStartDay->changeItem(str, i - 1);
+ }
+}
diff --git a/kcontrol/locale/localetime.h b/kcontrol/locale/localetime.h
new file mode 100644
index 000000000..c77f00cd3
--- /dev/null
+++ b/kcontrol/locale/localetime.h
@@ -0,0 +1,102 @@
+/*
+ * localetime.h
+ *
+ * Copyright (c) 1999-2003 Hans Petter Bieker <bieker@kde.org>
+ *
+ * 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.
+ */
+
+#ifndef __KLOCALECONFIGTIME_H__
+#define __KLOCALECONFIGTIME_H__
+
+#include <qwidget.h>
+
+#include <qmap.h>
+
+class QCheckBox;
+class QComboBox;
+
+class KLocale;
+class KLanguageCombo;
+
+class StringPair;
+
+class KLocaleConfigTime : public QWidget
+{
+ Q_OBJECT
+
+public:
+ KLocaleConfigTime( KLocale *_locale, QWidget *parent=0, const char *name=0);
+ virtual ~KLocaleConfigTime( );
+
+ void save();
+
+protected:
+ void showEvent( QShowEvent *e );
+
+public slots:
+ /**
+ * Loads all settings from the current locale into the current widget.
+ */
+ void slotLocaleChanged();
+ /**
+ * Retranslate all objects owned by this object using the current locale.
+ */
+ void slotTranslate();
+
+signals:
+ void localeChanged();
+
+private slots:
+ // Time & dates
+ void slotTimeFmtChanged(const QString &t);
+ void slotDateFmtChanged(const QString &t);
+ void slotDateFmtShortChanged(const QString &t);
+ void slotWeekStartDayChanged(int firstDay);
+ void slotDateMonthNamePossChanged();
+ void slotCalendarSystemChanged(int calendarSystem);
+
+private:
+ void updateWeekDayNames();
+
+ QValueList<StringPair> timeMap() const;
+ QValueList<StringPair> dateMap() const;
+
+ QString storeToUser(const QValueList<StringPair> & map,
+ const QString & storeFormat) const;
+ QString userToStore(const QValueList<StringPair> & map,
+ const QString & userFormat) const;
+ StringPair buildStringPair(const QChar &storeName, const QString &userName) const;
+
+ KLocale *m_locale;
+
+ // Time & dates
+ QLabel *m_labTimeFmt;
+ QComboBox *m_comboTimeFmt;
+ QLabel *m_labDateFmt;
+ QComboBox * m_comboDateFmt;
+ QLabel *m_labDateFmtShort;
+ QComboBox * m_comboDateFmtShort;
+ QLabel * m_labWeekStartDay;
+ QComboBox * m_comboWeekStartDay;
+ QCheckBox *m_chDateMonthNamePossessive;
+ QLabel * m_labCalendarSystem;
+ QComboBox * m_comboCalendarSystem;
+};
+
+#endif
diff --git a/kcontrol/locale/main.cpp b/kcontrol/locale/main.cpp
new file mode 100644
index 000000000..7a861495b
--- /dev/null
+++ b/kcontrol/locale/main.cpp
@@ -0,0 +1,38 @@
+/*
+ main.cpp - A KControl Application
+
+ Copyright 1999-2003 Hans Petter Bieker <bieker@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include "toplevel.h"
+
+extern "C" {
+ KDE_EXPORT void *init_kcm_locale() {
+ KLocale::setMainCatalogue("kcmlocale");
+ return new KLocaleFactory("kcmlocale");
+ }
+}
+
+/*
+extern "C" {
+ KCModule *create_locale(QWidget *parent, const char* name) {
+ KLocale::setMainCatalogue("kcmlocale");
+ return new KLocaleApplication(parent, "kcmlocale");
+ }
+}
+*/
diff --git a/kcontrol/locale/pics/Makefile.am b/kcontrol/locale/pics/Makefile.am
new file mode 100644
index 000000000..4929480b0
--- /dev/null
+++ b/kcontrol/locale/pics/Makefile.am
@@ -0,0 +1,2 @@
+pics_DATA = background.png
+picsdir = $(kde_datadir)/kcmlocale/pics
diff --git a/kcontrol/locale/pics/background.png b/kcontrol/locale/pics/background.png
new file mode 100644
index 000000000..d9d64462b
--- /dev/null
+++ b/kcontrol/locale/pics/background.png
Binary files differ
diff --git a/kcontrol/locale/toplevel.cpp b/kcontrol/locale/toplevel.cpp
new file mode 100644
index 000000000..4ba70e1ed
--- /dev/null
+++ b/kcontrol/locale/toplevel.cpp
@@ -0,0 +1,276 @@
+/*
+ toplevel.cpp - A KControl Application
+
+ Copyright 1998 Matthias Hoelzer
+ Copyright 1999-2003 Hans Petter Bieker <bieker@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qobjectlist.h>
+#include <qpushbutton.h>
+#include <qtabwidget.h>
+#include <qvgroupbox.h>
+
+#include <kaboutdata.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <kservice.h>
+
+#include "localenum.h"
+#include "localemon.h"
+#include "localetime.h"
+#include "localeother.h"
+#include "klocalesample.h"
+#include "toplevel.h"
+#include "kcmlocale.h"
+#include "toplevel.moc"
+
+KLocaleApplication::KLocaleApplication(QWidget *parent, const char* /*name*/,
+ const QStringList &args)
+ : KCModule( KLocaleFactory::instance(), parent, args)
+{
+ KAboutData* aboutData = new KAboutData("kcmlocale",
+ I18N_NOOP("KCMLocale"),
+ "3.0",
+ I18N_NOOP("Regional settings"),
+ KAboutData::License_GPL,
+ "(C) 1998 Matthias Hoelzer, "
+ "(C) 1999-2003 Hans Petter Bieker",
+ 0, 0, "bieker@kde.org");
+ setAboutData( aboutData );
+
+ m_nullConfig = new KConfig(QString::null, false, false);
+ m_globalConfig = new KConfig(QString::null, false, true);
+
+ m_locale = new KLocale(QString::fromLatin1("kcmlocale"), m_nullConfig);
+ QVBoxLayout *l = new QVBoxLayout(this, 0, KDialog::spacingHint());
+ l->setAutoAdd(TRUE);
+
+ m_tab = new QTabWidget(this);
+
+ m_localemain = new KLocaleConfig(m_locale, this);
+ m_tab->addTab( m_localemain, QString::null);
+ m_localenum = new KLocaleConfigNumber(m_locale, this);
+ m_tab->addTab( m_localenum, QString::null );
+ m_localemon = new KLocaleConfigMoney(m_locale, this);
+ m_tab->addTab( m_localemon, QString::null );
+ m_localetime = new KLocaleConfigTime(m_locale, this);
+ m_tab->addTab( m_localetime, QString::null );
+ m_localeother = new KLocaleConfigOther(m_locale, this);
+ m_tab->addTab( m_localeother, QString::null );
+
+ // Examples
+ m_gbox = new QVGroupBox(this);
+ m_sample = new KLocaleSample(m_locale, m_gbox);
+
+ // getting signals from childs
+ connect(m_localemain, SIGNAL(localeChanged()),
+ this, SIGNAL(localeChanged()));
+ connect(m_localemain, SIGNAL(languageChanged()),
+ this, SIGNAL(languageChanged()));
+
+ // run the slots on the childs
+ connect(this, SIGNAL(localeChanged()),
+ m_localemain, SLOT(slotLocaleChanged()));
+ connect(this, SIGNAL(localeChanged()),
+ m_localenum, SLOT(slotLocaleChanged()));
+ connect(this, SIGNAL(localeChanged()),
+ m_localemon, SLOT(slotLocaleChanged()));
+ connect(this, SIGNAL(localeChanged()),
+ m_localetime, SLOT(slotLocaleChanged()));
+ connect(this, SIGNAL(localeChanged()),
+ m_localeother, SLOT(slotLocaleChanged()));
+
+ // keep the example up to date
+ // NOTE: this will make the sample be updated 6 times the first time
+ // because combo boxes++ emits the change signal not only when the user changes
+ // it, but also when it's changed by the program.
+ connect(m_localenum, SIGNAL(localeChanged()),
+ m_sample, SLOT(slotLocaleChanged()));
+ connect(m_localemon, SIGNAL(localeChanged()),
+ m_sample, SLOT(slotLocaleChanged()));
+ connect(m_localetime, SIGNAL(localeChanged()),
+ m_sample, SLOT(slotLocaleChanged()));
+ // No examples for this yet
+ //connect(m_localeother, SIGNAL(slotLocaleChanged()),
+ //m_sample, SLOT(slotLocaleChanged()));
+ connect(this, SIGNAL(localeChanged()),
+ m_sample, SLOT(slotLocaleChanged()));
+
+ // make sure we always have translated interface
+ connect(this, SIGNAL(languageChanged()),
+ this, SLOT(slotTranslate()));
+ connect(this, SIGNAL(languageChanged()),
+ m_localemain, SLOT(slotTranslate()));
+ connect(this, SIGNAL(languageChanged()),
+ m_localenum, SLOT(slotTranslate()));
+ connect(this, SIGNAL(languageChanged()),
+ m_localemon, SLOT(slotTranslate()));
+ connect(this, SIGNAL(languageChanged()),
+ m_localetime, SLOT(slotTranslate()));
+ connect(this, SIGNAL(languageChanged()),
+ m_localeother, SLOT(slotTranslate()));
+
+ // mark it as changed when we change it.
+ connect(m_localemain, SIGNAL(localeChanged()),
+ SLOT(slotChanged()));
+ connect(m_localenum, SIGNAL(localeChanged()),
+ SLOT(slotChanged()));
+ connect(m_localemon, SIGNAL(localeChanged()),
+ SLOT(slotChanged()));
+ connect(m_localetime, SIGNAL(localeChanged()),
+ SLOT(slotChanged()));
+ connect(m_localeother, SIGNAL(localeChanged()),
+ SLOT(slotChanged()));
+
+ load();
+}
+
+KLocaleApplication::~KLocaleApplication()
+{
+ delete m_locale;
+ delete m_globalConfig;
+ delete m_nullConfig;
+}
+
+void KLocaleApplication::load()
+{
+ load( false );
+}
+
+void KLocaleApplication::load( bool useDefaults )
+{
+ m_globalConfig->setReadDefaults( useDefaults );
+ m_globalConfig->reparseConfiguration();
+ *m_locale = KLocale(QString::fromLatin1("kcmlocale"), m_globalConfig);
+
+ emit localeChanged();
+ emit languageChanged();
+ emit changed(useDefaults);
+}
+
+void KLocaleApplication::save()
+{
+ // temperary use of our locale as the global locale
+ KLocale *lsave = KGlobal::_locale;
+ KGlobal::_locale = m_locale;
+ KMessageBox::information(this, m_locale->translate
+ ("Changed language settings apply only to "
+ "newly started applications.\nTo change the "
+ "language of all programs, you will have to "
+ "logout first."),
+ m_locale->translate("Applying Language Settings"),
+ QString::fromLatin1("LanguageChangesApplyOnlyToNewlyStartedPrograms"));
+ // restore the old global locale
+ KGlobal::_locale = lsave;
+
+ KConfig *config = KGlobal::config();
+ KConfigGroupSaver saver(config, "Locale");
+
+ // ##### this doesn't make sense
+ bool langChanged = config->readEntry("Language")
+ != m_locale->language();
+
+ m_localemain->save();
+ m_localenum->save();
+ m_localemon->save();
+ m_localetime->save();
+ m_localeother->save();
+
+ // rebuild the date base if language was changed
+ if (langChanged)
+ {
+ KService::rebuildKSycoca(this);
+ }
+
+ emit changed(false);
+}
+
+void KLocaleApplication::defaults()
+{
+ load( true );
+}
+
+QString KLocaleApplication::quickHelp() const
+{
+ return m_locale->translate("<h1>Country/Region & Language</h1>\n"
+ "<p>From here you can configure language, numeric, and time \n"
+ "settings for your particular region. In most cases it will be \n"
+ "sufficient to choose the country you live in. For instance KDE \n"
+ "will automatically choose \"German\" as language if you choose \n"
+ "\"Germany\" from the list. It will also change the time format \n"
+ "to use 24 hours and and use comma as decimal separator.</p>\n");
+}
+
+void KLocaleApplication::slotTranslate()
+{
+ // The untranslated string for QLabel are stored in
+ // the name() so we use that when retranslating
+ QObject *wc;
+ QObjectList *list = queryList("QWidget");
+ QObjectListIt it(*list);
+ while ( (wc = it.current()) != 0 )
+ {
+ ++it;
+
+ // unnamed labels will cause errors and should not be
+ // retranslated. E.g. the example box should not be
+ // retranslated from here.
+ if (wc->name() == 0)
+ continue;
+ if (::qstrcmp(wc->name(), "") == 0)
+ continue;
+ if (::qstrcmp(wc->name(), "unnamed") == 0)
+ continue;
+
+ if (::qstrcmp(wc->className(), "QLabel") == 0)
+ ((QLabel *)wc)->setText( m_locale->translate( wc->name() ) );
+ else if (::qstrcmp(wc->className(), "QGroupBox") == 0 ||
+ ::qstrcmp(wc->className(), "QVGroupBox") == 0)
+ ((QGroupBox *)wc)->setTitle( m_locale->translate( wc->name() ) );
+ else if (::qstrcmp(wc->className(), "QPushButton") == 0 ||
+ ::qstrcmp(wc->className(), "KMenuButton") == 0)
+ ((QPushButton *)wc)->setText( m_locale->translate( wc->name() ) );
+ else if (::qstrcmp(wc->className(), "QCheckBox") == 0)
+ ((QCheckBox *)wc)->setText( m_locale->translate( wc->name() ) );
+ }
+ delete list;
+
+ // Here we have the pointer
+ m_gbox->setCaption(m_locale->translate("Examples"));
+ m_tab->changeTab(m_localemain, m_locale->translate("&Locale"));
+ m_tab->changeTab(m_localenum, m_locale->translate("&Numbers"));
+ m_tab->changeTab(m_localemon, m_locale->translate("&Money"));
+ m_tab->changeTab(m_localetime, m_locale->translate("&Time && Dates"));
+ m_tab->changeTab(m_localeother, m_locale->translate("&Other"));
+
+ // FIXME: All widgets are done now. However, there are
+ // still some problems. Popup menus from the QLabels are
+ // not retranslated.
+}
+
+void KLocaleApplication::slotChanged()
+{
+ emit changed(true);
+}
+
diff --git a/kcontrol/locale/toplevel.h b/kcontrol/locale/toplevel.h
new file mode 100644
index 000000000..746f22a69
--- /dev/null
+++ b/kcontrol/locale/toplevel.h
@@ -0,0 +1,87 @@
+/*
+ toplevel.h - A KControl Application
+
+ written 1998 by Matthias Hoelzer
+
+ Copyright 1998 Matthias Hoelzer.
+ Copyright 1999-2003 Hans Petter Bieker <bieker@kde.org>.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#ifndef __TOPLEVEL_H__
+#define __TOPLEVEL_H__
+
+#include <kcmodule.h>
+#include <kgenericfactory.h>
+
+class QTabWidget;
+class QGroupBox;
+
+class KConfig;
+class KLocale;
+class KLocaleConfig;
+class KLocaleConfigMoney;
+class KLocaleConfigNumber;
+class KLocaleConfigTime;
+class KLocaleConfigOther;
+class KLocaleSample;
+
+class KLocaleApplication : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KLocaleApplication(QWidget *parent, const char *name, const QStringList &);
+ virtual ~KLocaleApplication();
+
+ virtual void load();
+ virtual void load(bool useDefault);
+ virtual void save();
+ virtual void defaults();
+ virtual QString quickHelp() const;
+
+signals:
+ void languageChanged();
+ void localeChanged();
+
+public slots:
+ /**
+ * Retranslates the current widget.
+ */
+ void slotTranslate();
+ void slotChanged();
+
+private:
+ KLocale *m_locale;
+
+ QTabWidget *m_tab;
+ KLocaleConfig *m_localemain;
+ KLocaleConfigNumber *m_localenum;
+ KLocaleConfigMoney *m_localemon;
+ KLocaleConfigTime *m_localetime;
+ KLocaleConfigOther *m_localeother;
+
+ QGroupBox *m_gbox;
+ KLocaleSample *m_sample;
+
+ KConfig * m_globalConfig;
+ KConfig * m_nullConfig;
+};
+
+typedef KGenericFactory<KLocaleApplication, QWidget > KLocaleFactory;
+
+#endif
diff --git a/kcontrol/nics/AUTHORS b/kcontrol/nics/AUTHORS
new file mode 100644
index 000000000..2bda83486
--- /dev/null
+++ b/kcontrol/nics/AUTHORS
@@ -0,0 +1,2 @@
+ Alexander Neundorf <neundorf@kde.org>
+
diff --git a/kcontrol/nics/Makefile.am b/kcontrol/nics/Makefile.am
new file mode 100644
index 000000000..9cd225329
--- /dev/null
+++ b/kcontrol/nics/Makefile.am
@@ -0,0 +1,15 @@
+kde_module_LTLIBRARIES = kcm_nic.la
+
+kcm_nic_la_SOURCES = nic.cpp
+
+kcm_nic_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_nic_la_LIBADD = -lkdeui $(LIB_KIO) $(LIBSOCKET)
+
+AM_CPPFLAGS= $(all_includes)
+
+METASOURCES = AUTO
+
+messages:
+ $(XGETTEXT) $(kcm_nic_la_SOURCES) -o $(podir)/kcmnic.pot
+
+xdg_apps_DATA = nic.desktop
diff --git a/kcontrol/nics/configure.in.in b/kcontrol/nics/configure.in.in
new file mode 100644
index 000000000..e08832ebc
--- /dev/null
+++ b/kcontrol/nics/configure.in.in
@@ -0,0 +1,4 @@
+AC_CHECK_FUNCS(getifaddrs getnameinfo)
+AC_CHECK_MEMBERS([struct sockaddr.sa_len],,,[
+#include <sys/types.h>
+#include <sys/socket.h>])
diff --git a/kcontrol/nics/nic.cpp b/kcontrol/nics/nic.cpp
new file mode 100644
index 000000000..97bb9f42b
--- /dev/null
+++ b/kcontrol/nics/nic.cpp
@@ -0,0 +1,323 @@
+/*
+ * nic.cpp
+ *
+ * Copyright (C) 2001 Alexander Neundorf <neundorf@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <config.h>
+#ifdef HAVE_SYS_SOCKIO_H
+#include <sys/sockio.h>
+#endif
+
+#include <kaboutdata.h>
+#include <kdialog.h>
+#include <kgenericfactory.h>
+#include <kglobal.h>
+
+#include <qlayout.h>
+#include <qlistview.h>
+#include <qpushbutton.h>
+#include <qtabwidget.h>
+#include <qtimer.h>
+
+#include "nic.h"
+
+#ifdef USE_SOLARIS
+/* net/if.h is incompatible with STL on Solaris 2.6 - 2.8, redefine
+ map in the header file because we don't need it. -- Simon Josefsson */
+#define map junkmap
+#endif
+# include <net/if.h>
+#ifdef USE_SOLARIS
+#undef map
+#endif
+
+#include <sys/ioctl.h>
+
+#ifndef HAVE_STRUCT_SOCKADDR_SA_LEN
+ #undef HAVE_GETNAMEINFO
+ #undef HAVE_GETIFADDRS
+#endif
+
+#if defined(HAVE_GETNAMEINFO) && defined(HAVE_GETIFADDRS)
+ #include <ifaddrs.h>
+ #include <netdb.h>
+
+ QString flags_tos (unsigned int flags);
+#endif
+
+typedef KGenericFactory<KCMNic, QWidget> KCMNicFactory;
+K_EXPORT_COMPONENT_FACTORY (kcm_nic, KCMNicFactory("kcmnic"))
+
+struct MyNIC
+{
+ QString name;
+ QString addr;
+ QString netmask;
+ QString state;
+ QString type;
+ QString HWaddr;
+};
+
+typedef QPtrList<MyNIC> NICList;
+
+NICList* findNICs();
+
+KCMNic::KCMNic(QWidget *parent, const char * name, const QStringList &)
+ :KCModule(KCMNicFactory::instance(), parent,name)
+{
+ QVBoxLayout *box=new QVBoxLayout(this, 0, KDialog::spacingHint());
+ m_list=new QListView(this);
+ box->addWidget(m_list);
+ m_list->addColumn(i18n("Name"));
+ m_list->addColumn(i18n("IP Address"));
+ m_list->addColumn(i18n("Network Mask"));
+ m_list->addColumn(i18n("Type"));
+ m_list->addColumn(i18n("State"));
+ m_list->addColumn(i18n("HWaddr"));
+ m_list->setAllColumnsShowFocus(true);
+ QHBoxLayout *hbox=new QHBoxLayout(box);
+ m_updateButton=new QPushButton(i18n("&Update"),this);
+ hbox->addWidget(m_updateButton);
+ hbox->addStretch(1);
+ QTimer* timer=new QTimer(this);
+ timer->start(60000);
+ connect(m_updateButton,SIGNAL(clicked()),this,SLOT(update()));
+ connect(timer,SIGNAL(timeout()),this,SLOT(update()));
+ update();
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcminfo"),
+ I18N_NOOP("KDE Panel System Information Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2001 - 2002 Alexander Neundorf"));
+
+ about->addAuthor("Alexander Neundorf", 0, "neundorf@kde.org");
+ setAboutData( about );
+
+}
+
+void KCMNic::update()
+{
+ m_list->clear();
+ NICList *nics=findNICs();
+ nics->setAutoDelete(true);
+ for (MyNIC* tmp=nics->first(); tmp!=0; tmp=nics->next())
+ new QListViewItem(m_list,tmp->name, tmp->addr, tmp->netmask, tmp->type, tmp->state, tmp->HWaddr);
+ delete nics;
+}
+
+static QString HWaddr2String( char *hwaddr )
+{
+ QString ret;
+ int i;
+ for (i=0; i<6; i++, hwaddr++) {
+ int v = (*hwaddr & 0xff);
+ QString num = QString("%1").arg(v,0,16);
+ if (num.length() < 2)
+ num.prepend("0");
+ if (i>0)
+ ret.append(":");
+ ret.append(num);
+ }
+ return ret;
+}
+
+NICList* findNICs()
+{
+ QString upMessage( i18n("State of network card is connected", "Up") );
+ QString downMessage( i18n("State of network card is disconnected", "Down") );
+
+ NICList* nl=new NICList;
+ nl->setAutoDelete(true);
+
+#if !defined(HAVE_GETIFADDRS) || !defined(HAVE_GETNAMEINFO)
+
+ int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+
+ char buf[8*1024];
+ struct ifconf ifc;
+ ifc.ifc_len = sizeof(buf);
+ ifc.ifc_req = (struct ifreq *) buf;
+ int result=ioctl(sockfd, SIOCGIFCONF, &ifc);
+
+ for (char* ptr = buf; ptr < buf + ifc.ifc_len; )
+ {
+ struct ifreq *ifr =(struct ifreq *) ptr;
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ int len = sizeof(struct sockaddr);
+ if (ifr->ifr_addr.sa_len > len)
+ len = ifr->ifr_addr.sa_len; /* length > 16 */
+ ptr += sizeof(ifr->ifr_name) + len; /* for next one in buffer */
+#else
+ ptr += sizeof(*ifr); /* for next one in buffer */
+#endif
+
+ int flags;
+ struct sockaddr_in *sinptr;
+ MyNIC *tmp=0;
+ switch (ifr->ifr_addr.sa_family)
+ {
+ case AF_INET:
+ sinptr = (struct sockaddr_in *) &ifr->ifr_addr;
+ flags=0;
+
+ struct ifreq ifcopy;
+ ifcopy=*ifr;
+ result=ioctl(sockfd,SIOCGIFFLAGS,&ifcopy);
+ flags=ifcopy.ifr_flags;
+
+ tmp=new MyNIC;
+ tmp->name=ifr->ifr_name;
+ tmp->state= ((flags & IFF_UP) == IFF_UP) ? upMessage : downMessage;
+
+ if ((flags & IFF_BROADCAST) == IFF_BROADCAST)
+ tmp->type=i18n("Broadcast");
+ else if ((flags & IFF_POINTOPOINT) == IFF_POINTOPOINT)
+ tmp->type=i18n("Point to Point");
+#ifndef _AIX
+ else if ((flags & IFF_MULTICAST) == IFF_MULTICAST)
+ tmp->type=i18n("Multicast");
+#endif
+ else if ((flags & IFF_LOOPBACK) == IFF_LOOPBACK)
+ tmp->type=i18n("Loopback");
+ else
+ tmp->type=i18n("Unknown");
+
+ tmp->addr=inet_ntoa(sinptr->sin_addr);
+
+ ifcopy=*ifr;
+ result=ioctl(sockfd,SIOCGIFNETMASK,&ifcopy);
+ if (result==0)
+ {
+ sinptr = (struct sockaddr_in *) &ifcopy.ifr_addr;
+ tmp->netmask=inet_ntoa(sinptr->sin_addr);
+ }
+ else
+ tmp->netmask=i18n("Unknown");
+
+ ifcopy=*ifr;
+ result=-1; // if none of the two #ifs below matches, ensure that result!=0 so that "Unknown" is returned as result
+#ifdef SIOCGIFHWADDR
+ result=ioctl(sockfd,SIOCGIFHWADDR,&ifcopy);
+ if (result==0)
+ {
+ char *n = &ifcopy.ifr_ifru.ifru_hwaddr.sa_data[0];
+ tmp->HWaddr = HWaddr2String(n);
+ }
+#elif defined SIOCGENADDR
+ result=ioctl(sockfd,SIOCGENADDR,&ifcopy);
+ if (result==0)
+ {
+ char *n = &ifcopy.ifr_ifru.ifru_enaddr[0];
+ tmp->HWaddr = HWaddr2String(n);
+ }
+#endif
+ if (result!=0)
+ {
+ tmp->HWaddr = i18n("Unknown");
+ }
+
+ nl->append(tmp);
+ break;
+
+ default:
+ break;
+ }
+ }
+#else
+ struct ifaddrs *ifap, *ifa;
+ if (getifaddrs(&ifap) != 0) {
+ return nl;
+ }
+
+ MyNIC *tmp=0;
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+ switch (ifa->ifa_addr->sa_family) {
+ case AF_INET6:
+ case AF_INET: {
+ tmp = new MyNIC;
+ tmp->name = ifa->ifa_name;
+
+ char buf[128];
+
+ bzero(buf, 128);
+ getnameinfo(ifa->ifa_addr, ifa->ifa_addr->sa_len, buf, 127, 0, 0, NI_NUMERICHOST);
+ tmp->addr = buf;
+
+ if (ifa->ifa_netmask != NULL) {
+ bzero(buf, 128);
+ getnameinfo(ifa->ifa_netmask, ifa->ifa_netmask->sa_len, buf, 127, 0, 0, NI_NUMERICHOST);
+ tmp->netmask = buf;
+ }
+
+ tmp->state= (ifa->ifa_flags & IFF_UP) ? upMessage : downMessage;
+ tmp->type = flags_tos(ifa->ifa_flags);
+
+ nl->append(tmp);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ freeifaddrs(ifap);
+#endif
+ return nl;
+}
+
+
+#if defined(HAVE_GETNAMEINFO) && defined(HAVE_GETIFADDRS)
+QString flags_tos (unsigned int flags)
+{
+ QString tmp;
+ if (flags & IFF_POINTOPOINT) {
+ tmp += i18n("Point to Point");
+ }
+
+ if (flags & IFF_BROADCAST) {
+ if (tmp.length()) {
+ tmp += QString::fromLatin1(", ");
+ }
+ tmp += i18n("Broadcast");
+ }
+
+ if (flags & IFF_MULTICAST) {
+ if (tmp.length()) {
+ tmp += QString::fromLatin1(", ");
+ }
+ tmp += i18n("Multicast");
+ }
+
+ if (flags & IFF_LOOPBACK) {
+ if (tmp.length()) {
+ tmp += QString::fromLatin1(", ");
+ }
+ tmp += i18n("Loopback");
+ }
+ return tmp;
+}
+#endif
+
+#include "nic.moc"
diff --git a/kcontrol/nics/nic.desktop b/kcontrol/nics/nic.desktop
new file mode 100644
index 000000000..cddf242f6
--- /dev/null
+++ b/kcontrol/nics/nic.desktop
@@ -0,0 +1,173 @@
+[Desktop Entry]
+Exec=kcmshell nic
+Type=Application
+DocPath=kinfocenter/nics/index.html
+Icon=network
+
+
+X-KDE-Library=nic
+X-KDE-FactoryName=nic
+X-KDE-ParentApp=kinfocenter
+
+Name=Network Interfaces
+Name[af]=Netwerk Koppelvlakke
+Name[ar]=واجهات الشبكة
+Name[az]=Şəbəkə Ara Üzləri
+Name[be]=Сеткавыя інтэрфейсы
+Name[bg]=Мрежа
+Name[bn]=নেটওয়ার্ক ইন্টারফেস
+Name[br]=Etrefasoù Rouedad
+Name[bs]=Mrežni interfejsi
+Name[ca]=Interfícies de xarxa
+Name[cs]=Síťová rozhraní
+Name[csb]=Sécowé interfejsë
+Name[cy]=Rhyngwynebau Rhwydwaith
+Name[da]=Netværksgrænseflade
+Name[de]=Netzwerkschnittstellen
+Name[el]=Δικτυακές διασυνδέσεις
+Name[eo]=Retinterfacoj
+Name[es]=Interfaces de red
+Name[et]=Võrguliidesed
+Name[eu]=Sare interfazeak
+Name[fa]=واسطهای شبکه
+Name[fi]=Verkkoliitynnät
+Name[fr]=Interfaces réseau
+Name[fy]=Netwurkynterfaces
+Name[ga]=Comhéadain Líonra
+Name[gl]=Interfaces de Rede
+Name[he]=ממשקי רשת
+Name[hi]=नेटवर्क इंटरफेसेस
+Name[hr]=Mrežna sučelja
+Name[hu]=Hálózati kártyák
+Name[is]=Netkort
+Name[it]=Interfacce di rete
+Name[ja]=ネットワークインターフェース
+Name[ka]=ქსელური ინტერფეისები
+Name[kk]=Желі интерфейстері
+Name[km]=ចំណុច​ប្រទាក់​បណ្ដាញ
+Name[ko]=네트워크 인터페이스
+Name[lo]=ແຜງວົງຈອນເຄືອຂ່າຍ
+Name[lt]=Tinklo sąsajos
+Name[lv]=Tīkla iekārtas
+Name[mk]=Мрежни интерфејси
+Name[mn]=Сүлжээ-харьцах хэсэг
+Name[ms]=Antara Muka Rangkaian
+Name[mt]=Interfaċċja tan-network
+Name[nb]=Nettverksgrensesnitt
+Name[nds]=Nettwark-Koppelsteden
+Name[ne]=सञ्जाल इन्टरफेस
+Name[nl]=Netwerkinterfaces
+Name[nn]=Nettverksgrensesnitt
+Name[nso]=Difahlego tsa Kgokagano
+Name[pa]=ਨੈਟਵਰਕ ਇੰਟਰਫੇਸ
+Name[pl]=Interfejsy sieciowe
+Name[pt]=Interfaces de Rede
+Name[pt_BR]=Interfaces de Rede
+Name[ro]=Interfețe de rețea
+Name[ru]=Сетевые интерфейсы
+Name[rw]=Imigaragarire y'Urusobemiyoboro
+Name[se]=Fierbmelavttat
+Name[sk]=Sieťové rozhrania
+Name[sl]=Omrežni vmesniki
+Name[sr]=Мрежни интерфејси
+Name[sr@Latn]=Mrežni interfejsi
+Name[ss]=Sichumanisi seluchungechunge
+Name[sv]=Nätverksgränssnitt
+Name[ta]=வலைதள இடைமுகங்கள்
+Name[te]=నెట్వర్క్ ఇంటర్ ఫెస్
+Name[tg]=Воситаҳои шабака
+Name[th]=แผงวงจรเครือข่าย
+Name[tr]=Ağ Arayüzleri
+Name[tt]=Çeltär Yözaraları
+Name[uk]=Мережеві інтерфейси
+Name[uz]=Tarmoq interfeyslari
+Name[uz@cyrillic]=Тармоқ интерфейслари
+Name[ven]=Vhukwamani ha tshifhatuwo
+Name[vi]=Giao diện Mạng
+Name[wa]=Eterfaces rantoele
+Name[xh]=Ujongano Lomsebenzi womnatha
+Name[zh_CN]=网络接口
+Name[zh_TW]=網路界面
+Name[zu]=Abaxhumanisi boxhumano olusakazekile
+
+Comment=Network interface information
+Comment[af]=Netwerk koppelvlak informasie
+Comment[ar]=معلومات حول واجهة الشبكة
+Comment[az]=Şəbəkə ara üzü mə'lumatı
+Comment[be]=Інфармацыя аб сеткавых інтэрфейсах
+Comment[bg]=Информация за мрежовите интерфейси
+Comment[bn]=নেটওয়ার্ক ইন্টারফেস সংক্রান্ত তথ্য
+Comment[br]=Titouroù diwar-benn an etrefasoù rouedad
+Comment[bs]=Informacije o mrežnom interfejsu
+Comment[ca]=Informació de la interfície de xarxa
+Comment[cs]=Informace o síťových rozhraních
+Comment[csb]=Wëdowiédzô ò sécowim interfejse
+Comment[cy]=Gwybodaeth rhyngwynebau rhwydwaith
+Comment[da]=Information om netværksgrænseflade
+Comment[de]=Informationen über die Netzwerkanschlüsse
+Comment[el]=Πληροφορίες δικτυακής διασύνδεσης
+Comment[eo]=Informo pri retinterfaco
+Comment[es]=Información sobre la interfaz de red
+Comment[et]=Võrguliideste info
+Comment[eu]=Sare interfazeari buruzko informazioa
+Comment[fa]=اطلاعات واسط شبکه
+Comment[fi]=Verkkoliityntöjen tiedot
+Comment[fr]=Informations sur l'interface réseau
+Comment[fy]=Netwurkynterface-ynformaasje
+Comment[ga]=Eolas faoin gcomhéadan gréasáin
+Comment[gl]=Información da interface de rede
+Comment[he]=מידע על ממשקי רשת
+Comment[hi]=नेटवर्क इंटरफेस जानकारी
+Comment[hr]=Podaci o mrežnom sučelju
+Comment[hu]=A hálózati kártyák jellemzői
+Comment[is]=Upplýsingar um Netkort
+Comment[it]=Informazioni sulle interfacce di rete
+Comment[ja]=ネットワークインターフェースの情報
+Comment[ka]=ცნობები ქსელური ინტერფეისების შესახებ
+Comment[kk]=Желі интерфейсінің мәліметі
+Comment[km]=ព័ត៌មាន​ចំណុច​ប្រទាក់​បណ្ដាញ
+Comment[ko]=네트워크 인터페이스 정보
+Comment[lo]=ຂໍ້ມູນລະບົບເຄືອຂ່າຍ
+Comment[lt]=Tinklo sąsajos informacija
+Comment[lv]=Tīkla iekārtu informācija
+Comment[mk]=Информации за мрежните интерфејси
+Comment[mn]=Сүлжээний холболтын мэдээлэл
+Comment[ms]=Maklumat antara muka rangkaian
+Comment[mt]=Informazzjoni dwar interfaċċji tan-network
+Comment[nb]=Informasjon om nettverksgrensesnitt
+Comment[nds]=Informatschoon över de Nettwark-Koppelsteden
+Comment[ne]=सञ्जाल इन्टरफेस सूचना
+Comment[nl]=Netwerkinterface-informatie
+Comment[nn]=Informasjon om nettverksgrensesnitt
+Comment[nso]=Tshedimoso ya Difahlego tsa Kgokagano
+Comment[pa]=ਨੈੱਟਵਰਕ ਇੰਟਰਫੇਸ ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o interfejsie sieciowym
+Comment[pt]=Informações sobre as interfaces de rede
+Comment[pt_BR]=Informações sobre rede
+Comment[ro]=Afișează informații despre interfețele de rețea
+Comment[ru]=Сведения о сетевых интерфейсах
+Comment[rw]=Ibisobanuro by'imigaragarire y'urusobemiyoboro
+Comment[se]=Fierbmalaktadiehtu
+Comment[sk]=Informácie o sieťových rozhraniach
+Comment[sl]=Podatki o omrežnih vmesnikih
+Comment[sr]=Информације о мрежним интерфејсима
+Comment[sr@Latn]=Informacije o mrežnim interfejsima
+Comment[sv]=Information om nätverksgränssnitt
+Comment[ta]=வலைதள இடைமுகத் தகவல்
+Comment[te]=నెట్వర్క్ ఇంటర్ ఫెస్ సమాచారం
+Comment[tg]=Иттилооти шабака
+Comment[th]=ข้อมูลแผงวงจรเครือข่าย
+Comment[tr]=Ağ arayüz bilgisi
+Comment[tt]=Çeltär yözaraları turında
+Comment[uk]=Інформація щодо інтерфейсів мережі
+Comment[uz]=Tarmoq interfeyslari haqida maʼlumot
+Comment[uz@cyrillic]=Тармоқ интерфейслари ҳақида маълумот
+Comment[ven]=Mafhungo a vhukwamani
+Comment[vi]=Thông tin giao diện mạng
+Comment[wa]=Informåcion so l' eterface rantoele
+Comment[xh]=Ulwazi lojongano lomsebenzi womnatha
+Comment[zh_CN]=网络接口信息
+Comment[zh_TW]=網路界面資訊
+Comment[zu]=Ulwazi lomxhumanisi woxhumano olusakazekile
+
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/nics/nic.h b/kcontrol/nics/nic.h
new file mode 100644
index 000000000..c7711701a
--- /dev/null
+++ b/kcontrol/nics/nic.h
@@ -0,0 +1,45 @@
+/*
+ * nic.h
+ *
+ * Copyright (C) 2001 Alexander Neundorf <neundorf@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef KCONTROL_NIC_H
+#define KCONTROL_NIC_H
+
+#include <kcmodule.h>
+
+class QStringList;
+class QPushButton;
+class QListView;
+
+class KCMNic:public KCModule
+{
+ Q_OBJECT
+ public:
+ KCMNic(QWidget *parent=0, const char * name=0, const QStringList &list = QStringList( ));
+
+ protected slots:
+ void update();
+
+ protected:
+ QListView *m_list;
+ QPushButton *m_updateButton;
+};
+
+#endif
+
diff --git a/kcontrol/performance/Makefile.am b/kcontrol/performance/Makefile.am
new file mode 100644
index 000000000..5ae59d89e
--- /dev/null
+++ b/kcontrol/performance/Makefile.am
@@ -0,0 +1,20 @@
+kde_module_LTLIBRARIES = kcm_performance.la
+
+kcm_performance_la_SOURCES = kcmperformance.cpp konqueror.cpp konqueror_ui.ui system.cpp system_ui.ui
+kcm_performance_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_performance_la_LIBADD = -lkdeui
+AM_CPPFLAGS= $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = konqueror.h system.h
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmperformance.pot
+
+xdg_apps_DATA = kcmperformance.desktop
+
+kcmperformance_hidden_data_DATA = kcmkonqyperformance.desktop
+kcmperformance_hidden_datadir = $(kde_appsdir)/.hidden
+
+EXTRA_DIST = $(xdg_apps_DATA)
diff --git a/kcontrol/performance/kcmkonqyperformance.desktop b/kcontrol/performance/kcmkonqyperformance.desktop
new file mode 100644
index 000000000..32ca6873e
--- /dev/null
+++ b/kcontrol/performance/kcmkonqyperformance.desktop
@@ -0,0 +1,207 @@
+[Desktop Entry]
+Icon=launch
+Type=Application
+Exec=kcmshell kcmkonqyperformance
+
+
+X-KDE-Library=performance
+X-KDE-FactoryName=konqueror
+X-KDE-ParentApp=kcontrol
+
+Name=Performance
+Name[af]=Werkverrigting
+Name[ar]=الأداء
+Name[az]=Keyfiyyət
+Name[be]=Хуткасць працы
+Name[bg]=Производителност
+Name[bn]=কার্যকারীতা
+Name[bs]=Performanse
+Name[ca]=Rendiment
+Name[cs]=Výkon
+Name[csb]=Spòrosc
+Name[cy]=Perfformiad
+Name[da]=Ydelse
+Name[de]=Leistung
+Name[el]=Απόδοση
+Name[eo]=Potenco
+Name[es]=Rendimiento
+Name[et]=Jõudlus
+Name[eu]=Performantzia
+Name[fa]=کارایی
+Name[fi]=Suorituskyky
+Name[fy]=Prestaasje
+Name[ga]=Feidhmiúchán
+Name[gl]=Rendemento
+Name[he]=ביצועים
+Name[hi]=परफार्मेंस
+Name[hr]=Performanse
+Name[hu]=Teljesítmény
+Name[is]=Afköst
+Name[it]=Prestazioni
+Name[ja]=パフォーマンス
+Name[ka]=წარმადობა
+Name[kk]=Жылдамдылығы
+Name[km]=ដំណើរការ
+Name[ko]=성능
+Name[lt]=Veikimo sparta
+Name[lv]=Veiktspēja
+Name[mk]=Перформанси
+Name[mn]=Чадал
+Name[ms]=Prestasi
+Name[mt]=Effiċjenza
+Name[nb]=Ytelse
+Name[nds]=Leisten
+Name[ne]=सम्पादन
+Name[nl]=Prestatie
+Name[nn]=Yting
+Name[pa]=ਪਰਦਰਸ਼ਨ
+Name[pl]=Wydajność
+Name[pt_BR]=Perfomance
+Name[ro]=Performanță
+Name[ru]=Быстродействие
+Name[rw]=Ugukora neza
+Name[se]=Buktu
+Name[sk]=Výkon
+Name[sl]=Zmogljivost
+Name[sr]=Перформансе
+Name[sr@Latn]=Performanse
+Name[sv]=Prestanda
+Name[ta]=செயல்திறன்
+Name[tg]=Амалкард
+Name[th]=ประสิทธิภาพ
+Name[tr]=Performans
+Name[tt]=Citezlek
+Name[uk]=Швидкодія
+Name[uz]=Unumdorlik
+Name[uz@cyrillic]=Унумдорлик
+Name[vi]=Hiệu năng
+Name[wa]=Fé kine
+Name[zh_CN]=性能
+Name[zh_TW]=偏好設定
+
+Comment=Configure settings that can improve Konqueror performance
+Comment[af]=Stel instellings op wat Konqueror se werkverrigting kan verhoog
+Comment[ar]=إعداد تعيينات تحسّن إداء Konqueror
+Comment[be]=Настаўленне параметраў, якія могуць павялічыць хуткасць працы Konqueror
+Comment[bg]=Настройване производителността на браузъра
+Comment[bn]=কনকরার-এর কার্যকারীতা বর্ধন করতে পারে এমন সব সেটিংস কনফিগার করুন
+Comment[bs]=Postavke koje mogu unaprijediti performanse Konquerora
+Comment[ca]=Configura les opcions per a millorar el rendiment del Konqueror
+Comment[cs]=Zde můžete vylepšit výkon aplikace Konqueror
+Comment[csb]=Kònfigùracëjô nastôwów Konquerora jaczé nają cësk na spòrosc
+Comment[cy]=Ffurfweddu gosodiadau sy'n gallu gwella perfformiad Konqueror
+Comment[da]=Indstil opsætning for at forbedre Konquerors ydelse
+Comment[de]=Einstellungen vornehmen, die Konquerors Leistungsfähigkeit erhöhen können
+Comment[el]=Αλλάξτε ρυθμίσεις που μπορεί να βελτιώσουν την απόδοση του Konqueror
+Comment[eo]=Agordo de Konkeranto por plibonigi la potencon
+Comment[es]=Configuraciones que pueden mejorar el rendimiento de Konqueror
+Comment[et]=Siin saad seadistada, kuidas Konqueror kõigega paremini toime tuleks
+Comment[eu]=Konfiguratu Konquerorren performantzia hobe dezaketen ezarpenak
+Comment[fa]=پیکربندی تنظیماتی که کارایی Konqueror را بهبود می‌بخشد.
+Comment[fi]=Muokkaa Konquerorin suorituskykyyn liittyviä asetuksia
+Comment[fr]=Amélioration des performances de Konqueror
+Comment[fy]=Hjir kinne jo ynstellings kieze die de prestaasje fan Konqueror ferbetterje
+Comment[ga]=Cumraigh socruithe a chuirfidh feabhas ar fheidhmiúchán Konqueror
+Comment[gl]=Configurar as opcións que poden mellorar o rendemento de Konqueror
+Comment[he]=הגדר הגדרות העשויות לשפר את ביצועי Konqueror
+Comment[hi]=विन्यास कॉन्फ़िगर करें ताकि कॉन्करर का कार्य बेहतर हो सके
+Comment[hr]=Konfiguriranje postavki koje mogu poboljšati performanse Konquerora
+Comment[hu]=A Konqueror böngésző teljesítményét befolyásoló paraméterek beállítása
+Comment[is]=Stillingar Konqueror er varða afköst
+Comment[it]=Configura le impostazioni che possono migliorare le prestazioni di Konqueror
+Comment[ja]=Konqueror のパフォーマンスを改善
+Comment[ka]=Konqueror-ის სისწრაფეზე მოქმედი პარამეტრების კონფიგურაცია
+Comment[kk]=Konqueror жылдамдығын арттыратын параметрлерді баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ការ​កំណត់ ដែល​អាច​បង្កើន​​ដំណើរការ Konqueror
+Comment[ko]=Konqueror 성능 향상 설정
+Comment[lt]=Konfigūruokite nustatymus, kurie gali įtakoti Konqueror veikimo spartą
+Comment[lv]=Šeit Jūs varat konfigurēt Iekarotāja parametrus, kas ietekmē tā veiktspēju
+Comment[mk]=Конфигурирајте ги поставувањата што може да ги\nподобрат перформансите на Konqueror
+Comment[mn]=Конкюрор вэб-Хөтөчийн самбар сайжруулалтыг тохируулах
+Comment[ms]=Konfigur seting yang meningkatkan prestasi Konqueror
+Comment[mt]=Ikkonfigura setings li jistgħu itejbu l-veloċità ta' Konqueror
+Comment[nb]=Tilpass innstillinger som kan forbedre Konquerors ytelse
+Comment[nds]=Mit disse Instellen kannst Du de Leisten vun Konqueror verbetern
+Comment[ne]=कन्क्वेरर सम्पादन सुधार गर्न सक्ने सेटिङ कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u instellingen kiezen die de prestaties van Konqueror verbeteren
+Comment[nn]=Innstillingar som kan forbetra ytinga til Konqueror
+Comment[pa]=ਸੰਰਚਨਾ ਸੈਟ ਕਰੋ, ਜਿਸ ਨਾਲ ਕੋਨਕਿਉਰਰ ਦਾ ਪਰਦਰਸ਼ਨ ਵਧਿਆ ਹੋ ਸਕੇ
+Comment[pl]=Konfiguracja ustawień Konquerora mających wpływ na wydajność
+Comment[pt]=Configuração das opções que podem aumentar a performance do Konqueror
+Comment[pt_BR]=Configurações que podem aumentar a performance do Konqueror
+Comment[ro]=Configurează setări care pot îmbunătăți performanța Konqueror
+Comment[ru]=Настройка параметров, которые влияют на быстродействие Konqueror
+Comment[rw]=Kuboneza amagenamiterere ashobora kuvugurura imikorere ya Konqueror
+Comment[se]=Heivet Konqueror:a vai das šaddá buoret buvttu
+Comment[sk]=Nastavenie, ktoré môže vylepšiť výkon prehliadača Konqueror
+Comment[sl]=Nastavitve, ki izboljšajo delovanje Konquerorja
+Comment[sr]=Подешавање поставки које могу да побољшају Konqueror-ове перформансе
+Comment[sr@Latn]=Podešavanje postavki koje mogu da poboljšaju Konqueror-ove performanse
+Comment[sv]=Anpassa inställningar som kan förbättra Konquerors prestanda
+Comment[ta]=கான்கொரர் செயல்திறனை அதிகப்படுத்த அமைப்புகளை வடிவமை
+Comment[tg]= Танзимоте ки метавонанд амалкарди Konqueror-ро беҳбуд бахшанд, танзим кунед
+Comment[th]=ปรับแต่งตั้งค่าที่จะช่วยให้คอนเควอร์เรอร์มีประสิทธิภาพดีขึ้น
+Comment[tr]=Konqueror'un performansını artıracak ayarlamaları yap
+Comment[tt]=Konqueror citezlegen arttıra ala torğan köyläwlär
+Comment[uk]=Тут можна налаштувати швидкодію Konqueror
+Comment[uz]=Konqueror unumdorligini oshirishi mumkin boʻlgan moslamalarni moslash
+Comment[uz@cyrillic]=Konqueror унумдорлигини ошириши мумкин бўлган мосламаларни мослаш
+Comment[vi]=Các thiết lập nâng cao khả năng của Konqueror
+Comment[wa]=Tchuzes d' apontiaedje ki plèt improuver Konqueror
+Comment[zh_CN]=配置提高 Konqueror 性能的设置
+Comment[zh_TW]=可增進 Konqueror 效能的設定
+
+Keywords=konqueror,reuse,preloading
+Keywords[ar]=كونكيورر,اعادة استخدام,تحميل تمهيدي
+Keywords[az]=konqueror,yenidən işlətmə,önyükləmə
+Keywords[be]=Папярэдняя загрузка,konqueror,reuse,preloading
+Keywords[bg]=предварително, зареждане, използване, повторно, konqueror, reuse, preloading
+Keywords[ca]=konqueror,torna a emprar,carrega prèviament
+Keywords[cs]=konqueror,využití,preload
+Keywords[csb]=konqueror,brëkòwanié znowa,wstãpné wczëtanié
+Keywords[cy]=konqueror,ailddefnyddio,cynlwytho
+Keywords[da]=konqueror,genbrug,forudindlæsning
+Keywords[de]=konqueror,wiederverwenden
+Keywords[el]=konqueror,επαναχρησιμοποίηση,προφόρτωση
+Keywords[eo]=konkeranto,antaŭŝarĝi
+Keywords[et]=konqueror,taaskasutamine,eellaadimine
+Keywords[eu]=konqueror,berrerabili,prekargatu
+Keywords[fa]=konqueror، استفادۀ مجدد، پیش‌بارگذاری
+Keywords[fi]=konqueror,reuse,esilataus
+Keywords[fr]=konqueror,réutilisation,préchargement
+Keywords[fy]=konqueror,hergebûk,foarútlade
+Keywords[ga]=konqueror,athúsáid,réamhluchtú
+Keywords[gl]=konqueror,reuso,precarga
+Keywords[he]=konqueror,שימוש חוזר,טעינה מוקדמת, reuse,preloading,מחדש, שוב
+Keywords[hi]=कॉन्करर,फिर से उपयोग,प्रि-लोडिंग
+Keywords[hr]=konqueror,reuse,preloading,ponovna upotreba,prethodno učitavanje
+Keywords[hu]=konqueror,ujrafelhasználás,előtöltés
+Keywords[it]=konqueror,riutilizzo,precaricamento,prestazioni,preloading
+Keywords[ja]=konqueror,再使用,事前読み込み
+Keywords[km]=konqueror,ប្រើ​ឡើង​វិញ,ប្រុងប្រៀប​ផ្ទុក
+Keywords[lv]=iekarotājs,reuse,priekšielāde
+Keywords[mk]=konqueror,reuse,preloading,користи,повторно користи,предвчитување
+Keywords[mn]=Конкюрор,reuse,preloading
+Keywords[nb]=konqueror,gjenbruk,forhåndslasting
+Keywords[nds]=Konqueror,wedder bruken,vörladen
+Keywords[ne]=विजय/प्राप्ति, पुन: प्रयोग, पूर्व-लोडिङ
+Keywords[nl]=konqueror,hergebruik,preloading
+Keywords[nn]=Konqueror,gjenbruk,førehandslasting
+Keywords[pa]=konqueror,reuse,preloading, ਕੋਨਕਿਉਰਰ, ਮੁੜ ਲੋਡ
+Keywords[pl]=konqueror,ponowne użycie,wstępne wczytywanie
+Keywords[pt]=konqueror,reutilização,pré-carregamento
+Keywords[pt_BR]=konqueror,reuso,pré-carregamento
+Keywords[ro]=konqueror,reutilizare,preîncărcare
+Keywords[rw]=Konqueror,kongera gukoresha,gutangizambere
+Keywords[sl]=konqueror,recikliranje,prednalaganje
+Keywords[sr]=konqueror,reuse,preloading,поново коришћење,преучитавање
+Keywords[sr@Latn]=konqueror,reuse,preloading,ponovo korišćenje,preučitavanje
+Keywords[sv]=konqueror,återanvändning,förladdning
+Keywords[ta]=கான்கொரர்,திரும்ப பயன்படுத்து,முன்ஏற்றுதல்
+Keywords[th]=คอนเควอร์เรอร์,นำมาใช้ใหม่,เตรียมโหลดไว้ก่อน
+Keywords[tr]=konqueror,yeniden kullanım,ön yükleme
+Keywords[uk]=konqueror,повторне використання,попереднє завантаження
+Keywords[vi]=konqueror,tái sử dụng,tải về sẵn trước
+Keywords[zh_CN]=konqueror,reuse,preloading,再利用,预加载
+Keywords[zh_TW]=konqueror,reuse,preloading,重用,預先載入
+
diff --git a/kcontrol/performance/kcmperformance.cpp b/kcontrol/performance/kcmperformance.cpp
new file mode 100644
index 000000000..be4b57387
--- /dev/null
+++ b/kcontrol/performance/kcmperformance.cpp
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2003 Lubos Lunak <l.lunak@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <qlayout.h>
+#include <qtabwidget.h>
+
+#include <klocale.h>
+#include <kdialog.h>
+
+#include "kcmperformance.h"
+#include "konqueror.h"
+#include "system.h"
+
+extern "C"
+{
+ KDE_EXPORT KCModule* create_performance( QWidget* parent_P, const char* name_P )
+ {
+ return new KCMPerformance::Config( parent_P, name_P );
+ }
+
+ KDE_EXPORT KCModule* create_konqueror( QWidget* parent_P, const char* name_P )
+ {
+ return new KCMPerformance::KonquerorConfig( parent_P, name_P );
+ }
+}
+
+namespace KCMPerformance
+{
+
+Config::Config( QWidget* parent_P, const char* )
+ : KCModule( parent_P, "kcmperformance" )
+ {
+ setQuickHelp( i18n( "<h1>KDE Performance</h1>"
+ " You can configure settings that improve KDE performance here." ));
+
+ QVBoxLayout *topLayout = new QVBoxLayout( this );
+ QTabWidget* tabs = new QTabWidget( this );
+ konqueror_widget = new Konqueror( tabs );
+ konqueror_widget->layout()->setMargin( KDialog::marginHint() );
+ connect( konqueror_widget, SIGNAL( changed()), SLOT( changed()));
+ tabs->addTab( konqueror_widget, i18n( "Konqueror" ));
+ system_widget = new SystemWidget( tabs );
+ system_widget->layout()->setMargin( KDialog::marginHint() );
+ connect( system_widget, SIGNAL( changed()), SLOT( changed()));
+ tabs->addTab( system_widget, i18n( "System" ));
+ topLayout->add( tabs );
+ load();
+ }
+
+void Config::load()
+ {
+ load( false );
+ }
+
+void Config::load( bool useDefaults)
+ {
+ konqueror_widget->load( useDefaults );
+ system_widget->load( useDefaults );
+ emit changed( useDefaults );
+ }
+
+void Config::save()
+ {
+ konqueror_widget->save();
+ system_widget->save();
+ }
+
+void Config::defaults()
+ {
+ load( true );
+ }
+
+KonquerorConfig::KonquerorConfig( QWidget* parent_P, const char* )
+ : KCModule( parent_P, "kcmperformance" )
+ {
+ setQuickHelp( i18n( "<h1>Konqueror Performance</h1>"
+ " You can configure several settings that improve Konqueror performance here."
+ " These include options for reusing already running instances"
+ " and for keeping instances preloaded." ));
+
+ QVBoxLayout *topLayout = new QVBoxLayout( this );
+ widget = new Konqueror( this );
+ connect( widget, SIGNAL( changed()), SLOT( changed()));
+ topLayout->add( widget );
+ load();
+ }
+
+void KonquerorConfig::load()
+ {
+ load( false );
+ }
+
+void KonquerorConfig::load(bool useDefaults)
+ {
+ widget->load( useDefaults );
+ emit changed( useDefaults );
+ }
+
+void KonquerorConfig::save()
+ {
+ widget->save();
+ }
+
+void KonquerorConfig::defaults()
+ {
+ load( true );
+ }
+
+} // namespace
+
+#include "kcmperformance.moc"
diff --git a/kcontrol/performance/kcmperformance.desktop b/kcontrol/performance/kcmperformance.desktop
new file mode 100644
index 000000000..bcc60face
--- /dev/null
+++ b/kcontrol/performance/kcmperformance.desktop
@@ -0,0 +1,215 @@
+[Desktop Entry]
+Icon=launch
+Type=Application
+Exec=kcmshell kcmperformance
+
+
+X-KDE-Library=performance
+X-KDE-FactoryName=performance
+X-KDE-ParentApp=kcontrol
+
+Name=KDE Performance
+Name[af]=KDE Werkverrigting
+Name[ar]=إداء KDE
+Name[az]=KDE Keyfiyyəti
+Name[be]=Хуткасць працы KDE
+Name[bg]=Производителност
+Name[bn]=কে.ডি.ই. কার্যকারীতা
+Name[bs]=KDE performanse
+Name[ca]=Rendiment del KDE
+Name[cs]=Výkon KDE
+Name[csb]=Spòrosc KDE
+Name[cy]=Perfformiad KDE
+Name[da]=KDE's ydelse
+Name[de]=KDE-Leistung
+Name[el]=Απόδοση του KDE
+Name[eo]=KDEa potenco
+Name[es]=Rendimiento de KDE
+Name[et]=KDE jõudlus
+Name[eu]=KDEren performantzia
+Name[fa]=کارایی KDE
+Name[fi]=Suorituskyky
+Name[fr]=Performance de KDE
+Name[fy]=KDE-prestaasjes
+Name[ga]=Feidhmiúchán KDE
+Name[gl]=Rendemento de KDE
+Name[he]=ביצועי KDE
+Name[hi]=केडीई परफार्मेंस
+Name[hr]=KDE performanse
+Name[hu]=Teljesítményhangolás
+Name[is]=Afkastastillingar KDE
+Name[it]=Prestazioni di KDE
+Name[ja]=KDE パフォーマンス
+Name[ka]=KDE-ს წარმადობა
+Name[kk]=KDE жылдамдығы
+Name[km]=ដំណើរការ​របស់ KDE
+Name[ko]=KDE 성능
+Name[lt]=KDE našumas
+Name[lv]=KDE Veiktspēja
+Name[mk]=Перформанси на KDE
+Name[mn]=КДЭ-Удирдлагын самбар
+Name[ms]=Prestasi KDE
+Name[mt]=Effiċjenza KDE
+Name[nb]=KDE-ytelse
+Name[nds]=KDE-Leisten
+Name[ne]=KDE सम्पादन
+Name[nl]=KDE-prestaties
+Name[nn]=KDE-yting
+Name[pa]=KDE ਪਰਦਰਸ਼ਨ
+Name[pl]=Wydajność KDE
+Name[pt]=Performance do KDE
+Name[pt_BR]=Performance do KDE
+Name[ro]=Performanță KDE
+Name[ru]=Быстродействие
+Name[rw]=Imikorere ya KDE
+Name[se]=KDE-buktu
+Name[sk]=Výkon KDE
+Name[sl]=Zmogljivost KDE
+Name[sr]=KDE перформансе
+Name[sr@Latn]=KDE performanse
+Name[sv]=KDE-prestanda
+Name[ta]=KDE செயல்திறன்
+Name[tg]=Амалкарди KDE
+Name[th]=ประสิทธิภาพของ KDE
+Name[tr]=KDE Performansı
+Name[tt]=KDE Citezlege
+Name[uk]=Швидкодія KDE
+Name[uz]=KDE unumdorligi
+Name[uz@cyrillic]=KDE унумдорлиги
+Name[vi]=Hiệu năng KDE
+Name[wa]=Improuver KDE
+Name[zh_CN]=KDE 性能
+Name[zh_TW]=KDE 效能
+
+Comment=Configure settings that can improve KDE performance
+Comment[af]=Stel instellings op wat KDE se werkverrigting kan verhoog
+Comment[ar]=إعداد تعيينات تحسّن إداء KDE
+Comment[be]=Настаўленне параметраў, якія могуць павялічыць хуткасць працы KDE
+Comment[bg]=Настройване производителността на системата
+Comment[bn]=কে.ডি.ই-এর কার্যকারীতা বর্ধন করতে পারে এমন সব সেটিংস কনফিগার করুন
+Comment[bs]=Postavke koje mogu unaprijediti performanse KDEa
+Comment[ca]=Configura les opcions per a millorar el rendiment del KDE
+Comment[cs]=Nastavení vylepšující výkon KDE
+Comment[csb]=Kònfigùracëjô nastôwów Konquerora jaczé nają cësk na spòrosc KDE
+Comment[cy]=Ffurfweddu gosodiadau sy'n gallu gwella perfformiad KDE
+Comment[da]=Indstil opsætning for at forbedre KDE's ydelse
+Comment[de]=Einstellungen vornehmen, die die Leistungsfähigkeit von KDE erhöhen können
+Comment[el]=Αλλάξτε ρυθμίσεις που μπορεί να βελτιώσουν την απόδοση του KDE
+Comment[eo]=Agordo de plibonigo de la KDEa potenco
+Comment[es]=Configura opciones que pueden mejorar el rendimiento de KDE
+Comment[et]=Siin saad seadistada, kuidas KDE kõigega paremini toime tuleks
+Comment[eu]=Konfiguratu Konquerorren performantzia hobe dezaketen ezarpenak
+Comment[fa]=پیکربندی تنظیماتی که کارایی KDE را بهبود می‌بخشد
+Comment[fi]=Muokkaa KDE:n suorituskykyyn liittyviä asetuksia
+Comment[fr]=Configuration de paramètres qui peuvent améliorer les performances de KDE
+Comment[fy]=Hjir kinne jo ynstellings kiezen die de prestaasje fan KDE kinne ferbetterje
+Comment[ga]=Cumraigh socruithe a chuirfidh feabhas ar fheidhmiúchán KDE
+Comment[gl]=Configuración das opcións que poden mellorar o rendemento de KDE
+Comment[he]=הגדר הגדרות שעשויות לשפר את ביצועי KDE
+Comment[hi]=विन्यास कॉन्फ़िगर करें ताकि केडीई का कार्य बेहतर हो सके
+Comment[hr]=Konfiguriranje postavi koje mogu poboljšati performanse KDE-a
+Comment[hu]=A KDE teljesítményét befolyásoló paraméterek beállítása
+Comment[is]=Stillingar sem varða afköst KDE
+Comment[it]=Configura le impostazioni che possono migliorare le prestazioni di KDE
+Comment[ja]=KDE のパフォーマンスを改善
+Comment[ka]=KDE-ს სისწრაფეზე მოქმედი პარამეტრების კონფიგურაცია
+Comment[kk]=KDE жылдамдығын арттыратын параметрлерді баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ការ​កំណត់​ដែល​អាច​បង្កើន​ដំណើរការ​របស់ KDE
+Comment[ko]=KDE 성능 향상 설정
+Comment[lt]=Konfigūruoti nustatymus, kurie gali pagerinti KDE veikimo spartą
+Comment[lv]=Konfigurē parametrus, kas ietekmē Iekarotāja veiktspēju
+Comment[mk]=Конфигурирајте ги поставувањата што може да ги подобрат перформансите на KDE
+Comment[mn]=Comment=КДЭ чадал сайжруулалтыг тохируулах
+Comment[ms]=Konfigur seting yang boleh meningkatkan prestasi KDE
+Comment[mt]=Ikkonfigura setings li jistgħu itejbu l-veloċità ta' KDE
+Comment[nb]=Innstillinger som kan forbedre KDEs ytelse
+Comment[nds]=Mit disse Instellen kannst Du de Leisten vun KDE verbetern
+Comment[ne]=KDE सम्पादन सुधार गर्न सक्ने सेटिङ कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u instellingen kiezen die de prestaties van KDE kunnen verbeteren
+Comment[nn]=Innstillingar som kan forbetra ytinga til KDE
+Comment[pa]=ਸੰਰਚਨਾ ਸੈਟ ਕਰੋ, ਜਿਸ ਨਾਲ KDE ਦਾ ਪਰਦਰਸ਼ਨ ਵਧਿਆ ਹੋ ਸਕਦਾ ਹੈ
+Comment[pl]=Konfiguracja ustawień, które mogą mieć wpływ na wydajność KDE
+Comment[pt]=Configura as opções que podem aumentar a performance do KDE
+Comment[pt_BR]=Configurações que podem aumentar a performance do KDE
+Comment[ro]=Configurează setări care pot îmbunătăți performanța Konqueror
+Comment[ru]=Настройка параметров, которые могут повлиять на быстродействие KDE
+Comment[rw]=Kuboneza amagenamiterere ashobora kuvugurura imikorere ya KDE
+Comment[se]=Heivehusat mat buoridit KDE:a buvttu
+Comment[sk]=Nastavenie, ktoré môže vylepšiť výkon KDE
+Comment[sl]=Nastavite možnosti za pohitritev KDE
+Comment[sr]=Подешавање поставки које могу да побољшају перформансе KDE-а
+Comment[sr@Latn]=Podešavanje postavki koje mogu da poboljšaju performanse KDE-a
+Comment[sv]=Anpassa inställningar som kan förbättra KDE:s prestanda
+Comment[ta]=KDE செயல்திறனை அதிகப்படுத்தும் அமைப்புகளை அமை
+Comment[tg]= Танзимоте ки метавонанд амалкарди KDE-ро беҳбуд бахшанд, танзим кунед
+Comment[th]=ปรับแต่งตั้งค่าที่จะช่วยปรับประสิทธิภาพของ KDE
+Comment[tr]=KDE'nin performansını artıracak ayarlamaları yap
+Comment[tt]=KDE citezlegen arttıra ala torğan köyläwlär
+Comment[uk]=Налаштування параметрів для покращання швидкодії KDE
+Comment[uz]=KDE unumdorligini oshirishi mumkin boʻlgan moslamalarni moslash
+Comment[uz@cyrillic]=KDE унумдорлигини ошириши мумкин бўлган мосламаларни мослаш
+Comment[vi]=Các thiết lập nâng cao khả năng của Konqueror
+Comment[wa]=Tchuzes d' apontiaedje ki plèt improuver KDE
+Comment[zh_CN]=配置提高 KDE 性能的设置
+Comment[zh_TW]=可增進 KDE 效能的設定
+
+Keywords=performance,speed,memory,improve
+Keywords[ar]=performance,speed,memory,improve,أداء,سرعة,ذاكرة,تحسين
+Keywords[be]=Хуткасць працы,Прадукцыйнасць,Хуткасць,Памяць,Палепшыць,Паляпшэнне,performance,speed,memory,improve
+Keywords[bg]=производителност, памет, скорост, подобряване, подобрение, performance, speed, memory, improve
+Keywords[ca]=rendiment,velocitat,memòria,millora
+Keywords[cs]=výkon,rychlost,paměť,zlepšení
+Keywords[csb]=spòrosc, chùtkòsc, pamiãc,zlepszenié
+Keywords[cy]=perfformiad,cyflymder,cof,gwella
+Keywords[da]=ydelse,hastighed,hukommelse,forbedre
+Keywords[de]=leistung,geschwindigkeit,speichern,optimieren
+Keywords[el]=απόδοση,ταχύτητα,μνήμη,βελτίωση
+Keywords[eo]=potenco,rapideco,memoro,plibonigo,plibonigi
+Keywords[es]=rendimiento,velocidad,memoria,mejora
+Keywords[et]=jõudlus,kiirus,mälu,parandamine
+Keywords[eu]=performantzia,abiadura,memoria,hobetu
+Keywords[fa]=کارایی، سرعت، حافظه، بهبود
+Keywords[fi]=suorituskyky, nopeus, muisti, parannus
+Keywords[fr]=performances,vitesse,mémoire,améliorer
+Keywords[fy]=fluggens,prestaasjes,ûnthâld,ferbetterje
+Keywords[ga]=oibriú,luas,cuimhne,feabhsaigh,feabhsú
+Keywords[gl]=rendemento,velocidade,memoria,mellora
+Keywords[he]=ביצועים,מהירות,זיכרון,שפר, performance,speed,memory,improve
+Keywords[hi]=परफार्मेंस,गति,मेमोरी,बेहतर
+Keywords[hr]=performance,speed,memory,improve,performanse,brzina,memorija,unaprijediti
+Keywords[hu]=teljesítmény,sebesség,memória,hangolás
+Keywords[it]=prestazioni,velocità,memoria,migliora
+Keywords[ja]=パフォーマンス,速度,メモリ,改善
+Keywords[km]=ដំណើរការ,ល្បឿន,សតិ,បង្កើន
+Keywords[lt]=performance,speed,memory,improve,veikimas,greitis,atmintis,pagerinti
+Keywords[lv]=veiktspēja,ātrums,atmiņa,uzlabot
+Keywords[mk]=performance,speed,memory,improve,перформанси,брзина,меморија,подобри
+Keywords[mn]=чадал,хурд,санах ой,сайжруулалт
+Keywords[nb]=ytelse,hastighet,minne,forbedre
+Keywords[nds]=Leisten,performance,Gauheit,Spieker,verbetern
+Keywords[ne]=सम्पादन,गति, स्मृति, सुधार
+Keywords[nl]=snelheid,prestaties,geheugen,verbeteren
+Keywords[nn]=yting,fart,minne,forbetra
+Keywords[pa]=performance,speed,memory,improve, ਪਰਦਰਸ਼ਨ, ਗਤੀ, ਮੈਮੋਰੀ, ਸੁਧਾਰ
+Keywords[pl]=wydajność,szybkość,pamięć,polepszenie
+Keywords[pt]=performance,velocidade,memória,melhorar
+Keywords[pt_BR]=performance,velocidade,memória,aumento
+Keywords[ro]=performanță,viteză,memorie,îmbunătățire
+Keywords[rw]=imikorere,umuvuduko,umwanyabubiko,kuvugurura
+Keywords[se]=buktu,leahttu,muitu,buoridit
+Keywords[sl]=zmogljivost,hitrost,pomnilnik,izboljšanje
+Keywords[sr]=performance,speed,memory,improve,перформансе,брзина,меморија,унапређивање,унапреди
+Keywords[sr@Latn]=performance,speed,memory,improve,performanse,brzina,memorija,unapređivanje,unapredi
+Keywords[sv]=prestanda,hastighet,minne,förbättra
+Keywords[ta]=செயல்திறன்,வேகம்,நினைவகம்,முன்னேற்றம்
+Keywords[th]=ประสิทธิภาพ,ความเร็ว,หน่วยความจำ,ปรับปรุง
+Keywords[tr]=performans,hız,bellek,geliştirme
+Keywords[uk]=швидкодія,швидкість,пам'ять,покращення
+Keywords[uz]=unumdorlik,tezlik,xotira,oshirish
+Keywords[uz@cyrillic]=унумдорлик,тезлик,хотира,ошириш
+Keywords[vi]=hiệu năng,tốc độ,bộ nhớ,nâng cao
+Keywords[wa]=improuver,fé kine,roedeu,memwere,improuver,amidrer
+Keywords[zh_CN]=performance,speed,memory,improve,性能,速度,内存,提高
+Keywords[zh_TW]=performance,speed,memory,improve,效能,速度,記憶體,增進
+
+Categories=Qt;KDE;X-KDE-settings-components;
diff --git a/kcontrol/performance/kcmperformance.h b/kcontrol/performance/kcmperformance.h
new file mode 100644
index 000000000..13c3f9465
--- /dev/null
+++ b/kcontrol/performance/kcmperformance.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2003 Lubos Lunak <l.lunak@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _KCM_PERFORMANCE_H
+#define _KCM_PERFORMANCE_H
+
+#include <kcmodule.h>
+
+namespace KCMPerformance
+{
+
+class Konqueror;
+class SystemWidget;
+
+class Config
+ : public KCModule
+ {
+ Q_OBJECT
+ public:
+ Config( QWidget* parent_P, const char* name_P );
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+ private:
+ Konqueror* konqueror_widget;
+ SystemWidget* system_widget;
+ };
+
+class KonquerorConfig
+ : public KCModule
+ {
+ Q_OBJECT
+ public:
+ KonquerorConfig( QWidget* parent_P, const char* name_P );
+ virtual void load();
+ virtual void load( bool useDefaults );
+ virtual void save();
+ virtual void defaults();
+ private:
+ Konqueror* widget;
+ };
+
+} // namespace
+
+#endif
diff --git a/kcontrol/performance/konqueror.cpp b/kcontrol/performance/konqueror.cpp
new file mode 100644
index 000000000..02dde4cce
--- /dev/null
+++ b/kcontrol/performance/konqueror.cpp
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2003 Lubos Lunak <l.lunak@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "konqueror.h"
+
+#include <dcopref.h>
+#include <kconfig.h>
+#include <qwhatsthis.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <klocale.h>
+
+namespace KCMPerformance
+{
+
+Konqueror::Konqueror( QWidget* parent_P )
+ : Konqueror_ui( parent_P )
+ {
+ QWhatsThis::add( rb_never_reuse,
+ i18n( "Disables the minimization of memory usage and allows you "
+ "to make each browsing activity independent from the others" ));
+ QWhatsThis::add( rb_file_browsing_reuse,
+ i18n( "With this option activated, only one instance of Konqueror "
+ "used for file browsing will exist in the memory of your computer "
+ "at any moment, "
+ "no matter how many file browsing windows you open, "
+ "thus reducing resource requirements."
+ "<p>Be aware that this also means that, if something goes wrong, "
+ "all your file browsing windows will be closed simultaneously" ));
+ QWhatsThis::add( rb_always_reuse,
+ i18n( "With this option activated, only one instance of Konqueror "
+ "will exist in the memory of your computer at any moment, "
+ "no matter how many browsing windows you open, "
+ "thus reducing resource requirements."
+ "<p>Be aware that this also means that, if something goes wrong, "
+ "all your browsing windows will be closed simultaneously." ));
+ connect( rb_never_reuse, SIGNAL( clicked()), SIGNAL( changed()));
+ connect( rb_file_browsing_reuse, SIGNAL( clicked()), SIGNAL( changed()));
+ connect( rb_always_reuse, SIGNAL( clicked()), SIGNAL( changed()));
+ rb_file_browsing_reuse->setChecked( true );
+
+ QString tmp =
+ i18n( "If non-zero, this option allows keeping Konqueror instances "
+ "in memory after all their windows have been closed, up to the "
+ "number specified in this option."
+ "<p>When a new Konqueror instance is needed, one of these preloaded "
+ "instances will be reused instead, improving responsiveness at "
+ "the expense of the memory required by the preloaded instances." );
+ QWhatsThis::add( sb_preload_count, tmp );
+ QWhatsThis::add( lb_preload_count, tmp );
+ QWhatsThis::add( cb_preload_on_startup,
+ i18n( "If enabled, an instance of Konqueror will be preloaded after the ordinary KDE "
+ "startup sequence."
+ "<p>This will make the first Konqueror window open faster, but "
+ "at the expense of longer KDE startup times (but you will be able to work "
+ "while it is loading, so you may not even notice that it is taking longer)." ));
+ QWhatsThis::add( cb_always_have_preloaded,
+ i18n( "If enabled, KDE will always try to have one preloaded Konqueror instance ready; "
+ "preloading a new instance in the background whenever there is not one available, "
+ "so that windows will always open quickly."
+ "<p><b>Warning:</b> In some cases, it is actually possible that this will "
+ "reduce perceived performance." ));
+ connect( sb_preload_count, SIGNAL( valueChanged( int )), SLOT( preload_count_changed( int )));
+ connect( sb_preload_count, SIGNAL( valueChanged( int )), SIGNAL( changed()));
+ connect( cb_preload_on_startup, SIGNAL( clicked()), SIGNAL( changed()));
+ connect( cb_always_have_preloaded, SIGNAL( clicked()), SIGNAL( changed()));
+ defaults();
+ }
+
+void Konqueror::preload_count_changed( int count )
+ {
+ cb_preload_on_startup->setEnabled( count >= 1 );
+ // forcing preloading with count == 1 can often do more harm than good, because
+ // if there's one konqy preloaded, and the user requests "starting" new konqueror,
+ // the preloaded instance will be used, new one will be preloaded, and if the user soon
+ // "quits" konqueror, one of the instances will have to be terminated
+ cb_always_have_preloaded->setEnabled( count >= 2 );
+ }
+
+void Konqueror::load( bool useDefaults )
+ {
+ KConfig cfg( "konquerorrc", true );
+ cfg.setReadDefaults( useDefaults );
+ cfg.setGroup( "Reusing" );
+ allowed_parts = cfg.readEntry( "SafeParts", "SAFE" );
+ if( allowed_parts == "ALL" )
+ rb_always_reuse->setChecked( true );
+ else if( allowed_parts.isEmpty())
+ rb_never_reuse->setChecked( true );
+ else
+ rb_file_browsing_reuse->setChecked( true );
+ sb_preload_count->setValue( cfg.readNumEntry( "MaxPreloadCount", 1 ));
+ cb_always_have_preloaded->setChecked( cfg.readBoolEntry( "AlwaysHavePreloaded", false ));
+ cb_preload_on_startup->setChecked( cfg.readBoolEntry( "PreloadOnStartup", false ));
+ }
+
+void Konqueror::save()
+ {
+ KConfig cfg( "konquerorrc" );
+ cfg.setGroup( "Reusing" );
+ if( rb_always_reuse->isChecked())
+ allowed_parts = "ALL";
+ else if( rb_never_reuse->isChecked())
+ allowed_parts = "";
+ else
+ {
+ if( allowed_parts.isEmpty() || allowed_parts == "ALL" )
+ allowed_parts = "SAFE";
+ // else - keep allowed_parts as read from the file, as the user may have modified the list there
+ }
+ cfg.writeEntry( "SafeParts", allowed_parts );
+ int count = sb_preload_count->value();
+ cfg.writeEntry( "MaxPreloadCount", count );
+ cfg.writeEntry( "PreloadOnStartup", cb_preload_on_startup->isChecked() && count >= 1 );
+ cfg.writeEntry( "AlwaysHavePreloaded", cb_always_have_preloaded->isChecked() && count >= 2 );
+ cfg.sync();
+ DCOPRef ref1( "konqueror*", "KonquerorIface" );
+ ref1.send( "reparseConfiguration()" );
+ DCOPRef ref2( "kded", "konqy_preloader" );
+ ref2.send( "reconfigure()" );
+ }
+
+void Konqueror::defaults()
+ {
+ load( true );
+ }
+
+} // namespace
+
+#include "konqueror.moc"
diff --git a/kcontrol/performance/konqueror.h b/kcontrol/performance/konqueror.h
new file mode 100644
index 000000000..bc17d2e4e
--- /dev/null
+++ b/kcontrol/performance/konqueror.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2003 Lubos Lunak <l.lunak@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _KCM_PERF_KONQUEROR_H
+#define _KCM_PERF_KONQUEROR_H
+
+#include "konqueror_ui.h"
+
+namespace KCMPerformance
+{
+
+class Konqueror
+ : public Konqueror_ui
+ {
+ Q_OBJECT
+ public:
+ Konqueror( QWidget* parent_P = NULL );
+ void load(bool useDefaults);
+ void save();
+ void defaults();
+ signals:
+ void changed();
+ private slots:
+ void preload_count_changed( int );
+ private:
+ QString allowed_parts;
+ };
+
+} // namespace
+
+#endif
diff --git a/kcontrol/performance/konqueror_ui.ui b/kcontrol/performance/konqueror_ui.ui
new file mode 100644
index 000000000..3ace0b5db
--- /dev/null
+++ b/kcontrol/performance/konqueror_ui.ui
@@ -0,0 +1,155 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KCMPerformance::Konqueror_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Konqueror_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>reuse_group</cstring>
+ </property>
+ <property name="title">
+ <string>Minimize Memory Usage</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rb_never_reuse</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Never</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rb_file_browsing_reuse</cstring>
+ </property>
+ <property name="text">
+ <string>For &amp;file browsing only (recommended)</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rb_always_reuse</cstring>
+ </property>
+ <property name="text">
+ <string>Alwa&amp;ys (use with care)</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Preloading</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lb_preload_count</cstring>
+ </property>
+ <property name="text">
+ <string>Maximum number of instances kept &amp;preloaded:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>sb_preload_count</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>sb_preload_count</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cb_preload_on_startup</cstring>
+ </property>
+ <property name="text">
+ <string>Preload an instance after KDE startup</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cb_always_have_preloaded</cstring>
+ </property>
+ <property name="text">
+ <string>Always try to have at least one preloaded instance</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>160</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/performance/system.cpp b/kcontrol/performance/system.cpp
new file mode 100644
index 000000000..97b5c5709
--- /dev/null
+++ b/kcontrol/performance/system.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "system.h"
+
+#include <kconfig.h>
+#include <qwhatsthis.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <klocale.h>
+
+namespace KCMPerformance
+{
+
+SystemWidget::SystemWidget( QWidget* parent_P )
+ : System_ui( parent_P )
+ {
+ QString tmp =
+ i18n( "<p>During startup KDE needs to perform a check of its system configuration"
+ " (mimetypes, installed applications, etc.), and in case the configuration"
+ " has changed since the last time, the system configuration cache (KSyCoCa)"
+ " needs to be updated.</p>"
+ "<p>This option delays the check, which avoid scanning all directories containing"
+ " files describing the system during KDE startup, thus"
+ " making KDE startup faster. However, in the rare case the system configuration"
+ " has changed since the last time, and the change is needed before this"
+ " delayed check takes place, this option may lead to various problems"
+ " (missing applications in the K Menu, reports from applications about missing"
+ " required mimetypes, etc.).</p>"
+ "<p>Changes of system configuration mostly happen by (un)installing applications."
+ " It is therefore recommended to turn this option temporarily off while"
+ " (un)installing applications.</p>"
+ "<p>For this reason, usage of this option is not recommended. The KDE crash"
+ " handler will refuse to provide backtrace for the bugreport with this option"
+ " turned on (you will need to reproduce it again with this option turned off,"
+ " or turn on the developer mode for the crash handler).</p>" );
+ QWhatsThis::add( cb_disable_kbuildsycoca, tmp );
+ QWhatsThis::add( label_kbuildsycoca, tmp );
+ connect( cb_disable_kbuildsycoca, SIGNAL( clicked()), SIGNAL( changed()));
+ defaults();
+ }
+
+void SystemWidget::load(bool useDefaults )
+ {
+ KConfig cfg( "kdedrc", true );
+ cfg.setReadDefaults( useDefaults );
+ cfg.setGroup( "General" );
+ cb_disable_kbuildsycoca->setChecked( cfg.readBoolEntry( "DelayedCheck", false ));
+ }
+
+void SystemWidget::save()
+ {
+ KConfig cfg( "kdedrc" );
+ cfg.setGroup( "General" );
+ cfg.writeEntry( "DelayedCheck", cb_disable_kbuildsycoca->isChecked());
+ }
+
+void SystemWidget::defaults()
+ {
+ load( true );
+ }
+
+} // namespace
+
+#include "system.moc"
diff --git a/kcontrol/performance/system.h b/kcontrol/performance/system.h
new file mode 100644
index 000000000..d788b2073
--- /dev/null
+++ b/kcontrol/performance/system.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2004 Lubos Lunak <l.lunak@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _KCM_PERF_SYSTEM_H
+#define _KCM_PERF_SYSTEM_H
+
+#include <kcmodule.h>
+
+#include "system_ui.h"
+
+namespace KCMPerformance
+{
+
+class SystemWidget
+ : public System_ui
+ {
+ Q_OBJECT
+ public:
+ SystemWidget( QWidget* parent_P = NULL );
+ void load( bool useDefaults );
+ void save();
+ void defaults();
+ signals:
+ void changed();
+ };
+
+} // namespace
+
+#endif
diff --git a/kcontrol/performance/system_ui.ui b/kcontrol/performance/system_ui.ui
new file mode 100644
index 000000000..a8d0e7956
--- /dev/null
+++ b/kcontrol/performance/system_ui.ui
@@ -0,0 +1,69 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>System_ui</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>System_ui</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>gb_</cstring>
+ </property>
+ <property name="title">
+ <string>System Configuration</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>cb_disable_kbuildsycoca</cstring>
+ </property>
+ <property name="text">
+ <string>Disable &amp;system configuration startup check</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>label_kbuildsycoca</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;WARNING:&lt;/b&gt; This option may in rare cases lead to various problems. Consult the What's This? (Shift+F1) help for details.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/pics/Makefile.am b/kcontrol/pics/Makefile.am
new file mode 100644
index 000000000..a4b97f06a
--- /dev/null
+++ b/kcontrol/pics/Makefile.am
@@ -0,0 +1 @@
+KDE_ICON=AUTO
diff --git a/kcontrol/pics/cr128-app-access.png b/kcontrol/pics/cr128-app-access.png
new file mode 100644
index 000000000..5405523ea
--- /dev/null
+++ b/kcontrol/pics/cr128-app-access.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-arts.png b/kcontrol/pics/cr128-app-arts.png
new file mode 100644
index 000000000..d22e0e65d
--- /dev/null
+++ b/kcontrol/pics/cr128-app-arts.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-background.png b/kcontrol/pics/cr128-app-background.png
new file mode 100644
index 000000000..dc35d81eb
--- /dev/null
+++ b/kcontrol/pics/cr128-app-background.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-bell.png b/kcontrol/pics/cr128-app-bell.png
new file mode 100644
index 000000000..530fbf64a
--- /dev/null
+++ b/kcontrol/pics/cr128-app-bell.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-cache.png b/kcontrol/pics/cr128-app-cache.png
new file mode 100644
index 000000000..f9261381d
--- /dev/null
+++ b/kcontrol/pics/cr128-app-cache.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-clock.png b/kcontrol/pics/cr128-app-clock.png
new file mode 100644
index 000000000..692b0502e
--- /dev/null
+++ b/kcontrol/pics/cr128-app-clock.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-colors.png b/kcontrol/pics/cr128-app-colors.png
new file mode 100644
index 000000000..2f6bf1640
--- /dev/null
+++ b/kcontrol/pics/cr128-app-colors.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-date.png b/kcontrol/pics/cr128-app-date.png
new file mode 100644
index 000000000..1e34bb233
--- /dev/null
+++ b/kcontrol/pics/cr128-app-date.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-energy.png b/kcontrol/pics/cr128-app-energy.png
new file mode 100644
index 000000000..4186ee48d
--- /dev/null
+++ b/kcontrol/pics/cr128-app-energy.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-energy_star.png b/kcontrol/pics/cr128-app-energy_star.png
new file mode 100644
index 000000000..d9460449c
--- /dev/null
+++ b/kcontrol/pics/cr128-app-energy_star.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-filetypes.png b/kcontrol/pics/cr128-app-filetypes.png
new file mode 100644
index 000000000..144482335
--- /dev/null
+++ b/kcontrol/pics/cr128-app-filetypes.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-fonts.png b/kcontrol/pics/cr128-app-fonts.png
new file mode 100644
index 000000000..f859e33e7
--- /dev/null
+++ b/kcontrol/pics/cr128-app-fonts.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-help_index.png b/kcontrol/pics/cr128-app-help_index.png
new file mode 100644
index 000000000..9a1ee3fe5
--- /dev/null
+++ b/kcontrol/pics/cr128-app-help_index.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-hwinfo.png b/kcontrol/pics/cr128-app-hwinfo.png
new file mode 100644
index 000000000..d7a3052c5
--- /dev/null
+++ b/kcontrol/pics/cr128-app-hwinfo.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-kcmdevices.png b/kcontrol/pics/cr128-app-kcmdevices.png
new file mode 100644
index 000000000..0dd12a56a
--- /dev/null
+++ b/kcontrol/pics/cr128-app-kcmdevices.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-kcmdf.png b/kcontrol/pics/cr128-app-kcmdf.png
new file mode 100644
index 000000000..cbec02996
--- /dev/null
+++ b/kcontrol/pics/cr128-app-kcmdf.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-kcmkwm.png b/kcontrol/pics/cr128-app-kcmkwm.png
new file mode 100644
index 000000000..c632bfd45
--- /dev/null
+++ b/kcontrol/pics/cr128-app-kcmkwm.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-kcmmemory.png b/kcontrol/pics/cr128-app-kcmmemory.png
new file mode 100644
index 000000000..8088fef9b
--- /dev/null
+++ b/kcontrol/pics/cr128-app-kcmmemory.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-kcmpartitions.png b/kcontrol/pics/cr128-app-kcmpartitions.png
new file mode 100644
index 000000000..627c52fe7
--- /dev/null
+++ b/kcontrol/pics/cr128-app-kcmpartitions.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-kcmpci.png b/kcontrol/pics/cr128-app-kcmpci.png
new file mode 100644
index 000000000..efed93129
--- /dev/null
+++ b/kcontrol/pics/cr128-app-kcmpci.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-kdmconfig.png b/kcontrol/pics/cr128-app-kdmconfig.png
new file mode 100644
index 000000000..f28f704f7
--- /dev/null
+++ b/kcontrol/pics/cr128-app-kdmconfig.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-key_bindings.png b/kcontrol/pics/cr128-app-key_bindings.png
new file mode 100644
index 000000000..4c24fa0e4
--- /dev/null
+++ b/kcontrol/pics/cr128-app-key_bindings.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-kscreensaver.png b/kcontrol/pics/cr128-app-kscreensaver.png
new file mode 100644
index 000000000..e8f036fe3
--- /dev/null
+++ b/kcontrol/pics/cr128-app-kscreensaver.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-kthememgr.png b/kcontrol/pics/cr128-app-kthememgr.png
new file mode 100644
index 000000000..8c496e5d3
--- /dev/null
+++ b/kcontrol/pics/cr128-app-kthememgr.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-locale.png b/kcontrol/pics/cr128-app-locale.png
new file mode 100644
index 000000000..25403acc9
--- /dev/null
+++ b/kcontrol/pics/cr128-app-locale.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-looknfeel.png b/kcontrol/pics/cr128-app-looknfeel.png
new file mode 100644
index 000000000..cd1a36b9a
--- /dev/null
+++ b/kcontrol/pics/cr128-app-looknfeel.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-multimedia.png b/kcontrol/pics/cr128-app-multimedia.png
new file mode 100644
index 000000000..5543818ba
--- /dev/null
+++ b/kcontrol/pics/cr128-app-multimedia.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-personal.png b/kcontrol/pics/cr128-app-personal.png
new file mode 100644
index 000000000..9e033dfcc
--- /dev/null
+++ b/kcontrol/pics/cr128-app-personal.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-proxy.png b/kcontrol/pics/cr128-app-proxy.png
new file mode 100644
index 000000000..ec18d5a92
--- /dev/null
+++ b/kcontrol/pics/cr128-app-proxy.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-samba.png b/kcontrol/pics/cr128-app-samba.png
new file mode 100644
index 000000000..e4867d188
--- /dev/null
+++ b/kcontrol/pics/cr128-app-samba.png
Binary files differ
diff --git a/kcontrol/pics/cr128-app-stylesheet.png b/kcontrol/pics/cr128-app-stylesheet.png
new file mode 100644
index 000000000..bc911a9c9
--- /dev/null
+++ b/kcontrol/pics/cr128-app-stylesheet.png
Binary files differ
diff --git a/kcontrol/pics/cr128-device-laptop.png b/kcontrol/pics/cr128-device-laptop.png
new file mode 100644
index 000000000..0fef41bc3
--- /dev/null
+++ b/kcontrol/pics/cr128-device-laptop.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-access.png b/kcontrol/pics/cr16-app-access.png
new file mode 100644
index 000000000..a952d7786
--- /dev/null
+++ b/kcontrol/pics/cr16-app-access.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-agent.png b/kcontrol/pics/cr16-app-agent.png
new file mode 100644
index 000000000..9826d3457
--- /dev/null
+++ b/kcontrol/pics/cr16-app-agent.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-arts.png b/kcontrol/pics/cr16-app-arts.png
new file mode 100644
index 000000000..cc030d391
--- /dev/null
+++ b/kcontrol/pics/cr16-app-arts.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-background.png b/kcontrol/pics/cr16-app-background.png
new file mode 100644
index 000000000..f4ef81c60
--- /dev/null
+++ b/kcontrol/pics/cr16-app-background.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-bell.png b/kcontrol/pics/cr16-app-bell.png
new file mode 100644
index 000000000..188410853
--- /dev/null
+++ b/kcontrol/pics/cr16-app-bell.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-cache.png b/kcontrol/pics/cr16-app-cache.png
new file mode 100644
index 000000000..9d3f243ab
--- /dev/null
+++ b/kcontrol/pics/cr16-app-cache.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-clock.png b/kcontrol/pics/cr16-app-clock.png
new file mode 100644
index 000000000..dca2c7ef8
--- /dev/null
+++ b/kcontrol/pics/cr16-app-clock.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-colors.png b/kcontrol/pics/cr16-app-colors.png
new file mode 100644
index 000000000..c0a67bb90
--- /dev/null
+++ b/kcontrol/pics/cr16-app-colors.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-cookie.png b/kcontrol/pics/cr16-app-cookie.png
new file mode 100644
index 000000000..16617b9f4
--- /dev/null
+++ b/kcontrol/pics/cr16-app-cookie.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-date.png b/kcontrol/pics/cr16-app-date.png
new file mode 100644
index 000000000..fbf29f521
--- /dev/null
+++ b/kcontrol/pics/cr16-app-date.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-energy.png b/kcontrol/pics/cr16-app-energy.png
new file mode 100644
index 000000000..ebad43996
--- /dev/null
+++ b/kcontrol/pics/cr16-app-energy.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-energy_star.png b/kcontrol/pics/cr16-app-energy_star.png
new file mode 100644
index 000000000..52507f80a
--- /dev/null
+++ b/kcontrol/pics/cr16-app-energy_star.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-enhanced_browsing.png b/kcontrol/pics/cr16-app-enhanced_browsing.png
new file mode 100644
index 000000000..d9023041c
--- /dev/null
+++ b/kcontrol/pics/cr16-app-enhanced_browsing.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-filetypes.png b/kcontrol/pics/cr16-app-filetypes.png
new file mode 100644
index 000000000..e6d7266cf
--- /dev/null
+++ b/kcontrol/pics/cr16-app-filetypes.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-fonts.png b/kcontrol/pics/cr16-app-fonts.png
new file mode 100644
index 000000000..78d71d03a
--- /dev/null
+++ b/kcontrol/pics/cr16-app-fonts.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-help_index.png b/kcontrol/pics/cr16-app-help_index.png
new file mode 100644
index 000000000..1cb23431b
--- /dev/null
+++ b/kcontrol/pics/cr16-app-help_index.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-hwinfo.png b/kcontrol/pics/cr16-app-hwinfo.png
new file mode 100644
index 000000000..99889980d
--- /dev/null
+++ b/kcontrol/pics/cr16-app-hwinfo.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-icons.png b/kcontrol/pics/cr16-app-icons.png
new file mode 100644
index 000000000..10d2a2d63
--- /dev/null
+++ b/kcontrol/pics/cr16-app-icons.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-iconthemes.png b/kcontrol/pics/cr16-app-iconthemes.png
new file mode 100644
index 000000000..4a9081564
--- /dev/null
+++ b/kcontrol/pics/cr16-app-iconthemes.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-ieee1394.png b/kcontrol/pics/cr16-app-ieee1394.png
new file mode 100644
index 000000000..b7cec0007
--- /dev/null
+++ b/kcontrol/pics/cr16-app-ieee1394.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-input_devices_settings.png b/kcontrol/pics/cr16-app-input_devices_settings.png
new file mode 100644
index 000000000..18b3f92eb
--- /dev/null
+++ b/kcontrol/pics/cr16-app-input_devices_settings.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kcmdevices.png b/kcontrol/pics/cr16-app-kcmdevices.png
new file mode 100644
index 000000000..c7c34a1a7
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kcmdevices.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kcmkicker.png b/kcontrol/pics/cr16-app-kcmkicker.png
new file mode 100644
index 000000000..5bd927ea6
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kcmkicker.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kcmkwm.png b/kcontrol/pics/cr16-app-kcmkwm.png
new file mode 100644
index 000000000..996c4c68a
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kcmkwm.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kcmmemory.png b/kcontrol/pics/cr16-app-kcmmemory.png
new file mode 100644
index 000000000..6ddeddb68
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kcmmemory.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kcmmidi.png b/kcontrol/pics/cr16-app-kcmmidi.png
new file mode 100644
index 000000000..4283b35f3
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kcmmidi.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kcmpartitions.png b/kcontrol/pics/cr16-app-kcmpartitions.png
new file mode 100644
index 000000000..5b6eb8764
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kcmpartitions.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kcmpci.png b/kcontrol/pics/cr16-app-kcmpci.png
new file mode 100644
index 000000000..0ac401c6f
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kcmpci.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kcmprocessor.png b/kcontrol/pics/cr16-app-kcmprocessor.png
new file mode 100644
index 000000000..b7dc9b4d1
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kcmprocessor.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kcmscsi.png b/kcontrol/pics/cr16-app-kcmscsi.png
new file mode 100644
index 000000000..2ac53532a
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kcmscsi.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kcmsound.png b/kcontrol/pics/cr16-app-kcmsound.png
new file mode 100644
index 000000000..dbf51d203
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kcmsound.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kcmsystem.png b/kcontrol/pics/cr16-app-kcmsystem.png
new file mode 100644
index 000000000..b97bfb434
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kcmsystem.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kcmx.png b/kcontrol/pics/cr16-app-kcmx.png
new file mode 100644
index 000000000..29ea2da85
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kcmx.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kdmconfig.png b/kcontrol/pics/cr16-app-kdmconfig.png
new file mode 100644
index 000000000..8f69e2b99
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kdmconfig.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-key_bindings.png b/kcontrol/pics/cr16-app-key_bindings.png
new file mode 100644
index 000000000..26266f1b1
--- /dev/null
+++ b/kcontrol/pics/cr16-app-key_bindings.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-keyboard.png b/kcontrol/pics/cr16-app-keyboard.png
new file mode 100644
index 000000000..198d20221
--- /dev/null
+++ b/kcontrol/pics/cr16-app-keyboard.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-keyboard_layout.png b/kcontrol/pics/cr16-app-keyboard_layout.png
new file mode 100644
index 000000000..efbbcda82
--- /dev/null
+++ b/kcontrol/pics/cr16-app-keyboard_layout.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-knotify.png b/kcontrol/pics/cr16-app-knotify.png
new file mode 100644
index 000000000..a893d6229
--- /dev/null
+++ b/kcontrol/pics/cr16-app-knotify.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kscreensaver.png b/kcontrol/pics/cr16-app-kscreensaver.png
new file mode 100644
index 000000000..200fe3dcc
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kscreensaver.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-kthememgr.png b/kcontrol/pics/cr16-app-kthememgr.png
new file mode 100644
index 000000000..2b3588a05
--- /dev/null
+++ b/kcontrol/pics/cr16-app-kthememgr.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-locale.png b/kcontrol/pics/cr16-app-locale.png
new file mode 100644
index 000000000..0dfece4d3
--- /dev/null
+++ b/kcontrol/pics/cr16-app-locale.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-looknfeel.png b/kcontrol/pics/cr16-app-looknfeel.png
new file mode 100644
index 000000000..fb4181004
--- /dev/null
+++ b/kcontrol/pics/cr16-app-looknfeel.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-multimedia.png b/kcontrol/pics/cr16-app-multimedia.png
new file mode 100644
index 000000000..d2bf93a19
--- /dev/null
+++ b/kcontrol/pics/cr16-app-multimedia.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-panel_settings.png b/kcontrol/pics/cr16-app-panel_settings.png
new file mode 100644
index 000000000..e66dd216a
--- /dev/null
+++ b/kcontrol/pics/cr16-app-panel_settings.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-personal.png b/kcontrol/pics/cr16-app-personal.png
new file mode 100644
index 000000000..83e5b318b
--- /dev/null
+++ b/kcontrol/pics/cr16-app-personal.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-proxy.png b/kcontrol/pics/cr16-app-proxy.png
new file mode 100644
index 000000000..69f8bb745
--- /dev/null
+++ b/kcontrol/pics/cr16-app-proxy.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-samba.png b/kcontrol/pics/cr16-app-samba.png
new file mode 100644
index 000000000..3d2e6885a
--- /dev/null
+++ b/kcontrol/pics/cr16-app-samba.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-style.png b/kcontrol/pics/cr16-app-style.png
new file mode 100644
index 000000000..b727f8f60
--- /dev/null
+++ b/kcontrol/pics/cr16-app-style.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-stylesheet.png b/kcontrol/pics/cr16-app-stylesheet.png
new file mode 100644
index 000000000..6fdea61e2
--- /dev/null
+++ b/kcontrol/pics/cr16-app-stylesheet.png
Binary files differ
diff --git a/kcontrol/pics/cr16-app-usb.png b/kcontrol/pics/cr16-app-usb.png
new file mode 100644
index 000000000..b772ba541
--- /dev/null
+++ b/kcontrol/pics/cr16-app-usb.png
Binary files differ
diff --git a/kcontrol/pics/cr16-device-laptop.png b/kcontrol/pics/cr16-device-laptop.png
new file mode 100644
index 000000000..9e221e632
--- /dev/null
+++ b/kcontrol/pics/cr16-device-laptop.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-access.png b/kcontrol/pics/cr22-app-access.png
new file mode 100644
index 000000000..ba7027a14
--- /dev/null
+++ b/kcontrol/pics/cr22-app-access.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-agent.png b/kcontrol/pics/cr22-app-agent.png
new file mode 100644
index 000000000..6009bf34a
--- /dev/null
+++ b/kcontrol/pics/cr22-app-agent.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-arts.png b/kcontrol/pics/cr22-app-arts.png
new file mode 100644
index 000000000..2a1a4ceb0
--- /dev/null
+++ b/kcontrol/pics/cr22-app-arts.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-background.png b/kcontrol/pics/cr22-app-background.png
new file mode 100644
index 000000000..1dd1253a1
--- /dev/null
+++ b/kcontrol/pics/cr22-app-background.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-bell.png b/kcontrol/pics/cr22-app-bell.png
new file mode 100644
index 000000000..f4dd1afd5
--- /dev/null
+++ b/kcontrol/pics/cr22-app-bell.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-cache.png b/kcontrol/pics/cr22-app-cache.png
new file mode 100644
index 000000000..509009956
--- /dev/null
+++ b/kcontrol/pics/cr22-app-cache.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-colors.png b/kcontrol/pics/cr22-app-colors.png
new file mode 100644
index 000000000..84fb0b922
--- /dev/null
+++ b/kcontrol/pics/cr22-app-colors.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-cookie.png b/kcontrol/pics/cr22-app-cookie.png
new file mode 100644
index 000000000..eb11b7605
--- /dev/null
+++ b/kcontrol/pics/cr22-app-cookie.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-date.png b/kcontrol/pics/cr22-app-date.png
new file mode 100644
index 000000000..cb1f8455a
--- /dev/null
+++ b/kcontrol/pics/cr22-app-date.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-energy.png b/kcontrol/pics/cr22-app-energy.png
new file mode 100644
index 000000000..2893c77bf
--- /dev/null
+++ b/kcontrol/pics/cr22-app-energy.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-enhanced_browsing.png b/kcontrol/pics/cr22-app-enhanced_browsing.png
new file mode 100644
index 000000000..c7281f352
--- /dev/null
+++ b/kcontrol/pics/cr22-app-enhanced_browsing.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-filetypes.png b/kcontrol/pics/cr22-app-filetypes.png
new file mode 100644
index 000000000..71e4ae8a2
--- /dev/null
+++ b/kcontrol/pics/cr22-app-filetypes.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-fonts.png b/kcontrol/pics/cr22-app-fonts.png
new file mode 100644
index 000000000..19fccc6c5
--- /dev/null
+++ b/kcontrol/pics/cr22-app-fonts.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-hwinfo.png b/kcontrol/pics/cr22-app-hwinfo.png
new file mode 100644
index 000000000..9eb787ef2
--- /dev/null
+++ b/kcontrol/pics/cr22-app-hwinfo.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-icons.png b/kcontrol/pics/cr22-app-icons.png
new file mode 100644
index 000000000..211feae8d
--- /dev/null
+++ b/kcontrol/pics/cr22-app-icons.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-iconthemes.png b/kcontrol/pics/cr22-app-iconthemes.png
new file mode 100644
index 000000000..b9ade4896
--- /dev/null
+++ b/kcontrol/pics/cr22-app-iconthemes.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-ieee1394.png b/kcontrol/pics/cr22-app-ieee1394.png
new file mode 100644
index 000000000..184c283bf
--- /dev/null
+++ b/kcontrol/pics/cr22-app-ieee1394.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-kcmdevices.png b/kcontrol/pics/cr22-app-kcmdevices.png
new file mode 100644
index 000000000..49d63884d
--- /dev/null
+++ b/kcontrol/pics/cr22-app-kcmdevices.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-kcmkicker.png b/kcontrol/pics/cr22-app-kcmkicker.png
new file mode 100644
index 000000000..f96549b24
--- /dev/null
+++ b/kcontrol/pics/cr22-app-kcmkicker.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-kcmkwm.png b/kcontrol/pics/cr22-app-kcmkwm.png
new file mode 100644
index 000000000..a7227f3ef
--- /dev/null
+++ b/kcontrol/pics/cr22-app-kcmkwm.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-kcmx.png b/kcontrol/pics/cr22-app-kcmx.png
new file mode 100644
index 000000000..fdab29916
--- /dev/null
+++ b/kcontrol/pics/cr22-app-kcmx.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-kdmconfig.png b/kcontrol/pics/cr22-app-kdmconfig.png
new file mode 100644
index 000000000..399978a99
--- /dev/null
+++ b/kcontrol/pics/cr22-app-kdmconfig.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-key_bindings.png b/kcontrol/pics/cr22-app-key_bindings.png
new file mode 100644
index 000000000..732f4d9c1
--- /dev/null
+++ b/kcontrol/pics/cr22-app-key_bindings.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-keyboard.png b/kcontrol/pics/cr22-app-keyboard.png
new file mode 100644
index 000000000..4360481af
--- /dev/null
+++ b/kcontrol/pics/cr22-app-keyboard.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-kscreensaver.png b/kcontrol/pics/cr22-app-kscreensaver.png
new file mode 100644
index 000000000..7448fe237
--- /dev/null
+++ b/kcontrol/pics/cr22-app-kscreensaver.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-kthememgr.png b/kcontrol/pics/cr22-app-kthememgr.png
new file mode 100644
index 000000000..f3aef6eed
--- /dev/null
+++ b/kcontrol/pics/cr22-app-kthememgr.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-locale.png b/kcontrol/pics/cr22-app-locale.png
new file mode 100644
index 000000000..827360a8b
--- /dev/null
+++ b/kcontrol/pics/cr22-app-locale.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-personal.png b/kcontrol/pics/cr22-app-personal.png
new file mode 100644
index 000000000..6b7153767
--- /dev/null
+++ b/kcontrol/pics/cr22-app-personal.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-proxy.png b/kcontrol/pics/cr22-app-proxy.png
new file mode 100644
index 000000000..e8fef4233
--- /dev/null
+++ b/kcontrol/pics/cr22-app-proxy.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-samba.png b/kcontrol/pics/cr22-app-samba.png
new file mode 100644
index 000000000..32b5972e9
--- /dev/null
+++ b/kcontrol/pics/cr22-app-samba.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-style.png b/kcontrol/pics/cr22-app-style.png
new file mode 100644
index 000000000..f8810f245
--- /dev/null
+++ b/kcontrol/pics/cr22-app-style.png
Binary files differ
diff --git a/kcontrol/pics/cr22-app-stylesheet.png b/kcontrol/pics/cr22-app-stylesheet.png
new file mode 100644
index 000000000..625688457
--- /dev/null
+++ b/kcontrol/pics/cr22-app-stylesheet.png
Binary files differ
diff --git a/kcontrol/pics/cr22-device-laptop.png b/kcontrol/pics/cr22-device-laptop.png
new file mode 100644
index 000000000..db7f61e89
--- /dev/null
+++ b/kcontrol/pics/cr22-device-laptop.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-access.png b/kcontrol/pics/cr32-app-access.png
new file mode 100644
index 000000000..c83070ca3
--- /dev/null
+++ b/kcontrol/pics/cr32-app-access.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-agent.png b/kcontrol/pics/cr32-app-agent.png
new file mode 100644
index 000000000..d10a80c61
--- /dev/null
+++ b/kcontrol/pics/cr32-app-agent.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-arts.png b/kcontrol/pics/cr32-app-arts.png
new file mode 100644
index 000000000..378cce9a6
--- /dev/null
+++ b/kcontrol/pics/cr32-app-arts.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-background.png b/kcontrol/pics/cr32-app-background.png
new file mode 100644
index 000000000..45d81edef
--- /dev/null
+++ b/kcontrol/pics/cr32-app-background.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-bell.png b/kcontrol/pics/cr32-app-bell.png
new file mode 100644
index 000000000..8d4079b99
--- /dev/null
+++ b/kcontrol/pics/cr32-app-bell.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-cache.png b/kcontrol/pics/cr32-app-cache.png
new file mode 100644
index 000000000..7700fd9ad
--- /dev/null
+++ b/kcontrol/pics/cr32-app-cache.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-clock.png b/kcontrol/pics/cr32-app-clock.png
new file mode 100644
index 000000000..0f93b36cc
--- /dev/null
+++ b/kcontrol/pics/cr32-app-clock.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-colors.png b/kcontrol/pics/cr32-app-colors.png
new file mode 100644
index 000000000..e5aa87cbd
--- /dev/null
+++ b/kcontrol/pics/cr32-app-colors.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-cookie.png b/kcontrol/pics/cr32-app-cookie.png
new file mode 100644
index 000000000..0879588c8
--- /dev/null
+++ b/kcontrol/pics/cr32-app-cookie.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-date.png b/kcontrol/pics/cr32-app-date.png
new file mode 100644
index 000000000..54b320347
--- /dev/null
+++ b/kcontrol/pics/cr32-app-date.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-energy.png b/kcontrol/pics/cr32-app-energy.png
new file mode 100644
index 000000000..e796c0528
--- /dev/null
+++ b/kcontrol/pics/cr32-app-energy.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-energy_star.png b/kcontrol/pics/cr32-app-energy_star.png
new file mode 100644
index 000000000..c26cf4cee
--- /dev/null
+++ b/kcontrol/pics/cr32-app-energy_star.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-enhanced_browsing.png b/kcontrol/pics/cr32-app-enhanced_browsing.png
new file mode 100644
index 000000000..00be47e24
--- /dev/null
+++ b/kcontrol/pics/cr32-app-enhanced_browsing.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-filetypes.png b/kcontrol/pics/cr32-app-filetypes.png
new file mode 100644
index 000000000..53d0099be
--- /dev/null
+++ b/kcontrol/pics/cr32-app-filetypes.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-fonts.png b/kcontrol/pics/cr32-app-fonts.png
new file mode 100644
index 000000000..9ace98c25
--- /dev/null
+++ b/kcontrol/pics/cr32-app-fonts.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-help_index.png b/kcontrol/pics/cr32-app-help_index.png
new file mode 100644
index 000000000..d5af86353
--- /dev/null
+++ b/kcontrol/pics/cr32-app-help_index.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-hwinfo.png b/kcontrol/pics/cr32-app-hwinfo.png
new file mode 100644
index 000000000..dfb9a1c14
--- /dev/null
+++ b/kcontrol/pics/cr32-app-hwinfo.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-icons.png b/kcontrol/pics/cr32-app-icons.png
new file mode 100644
index 000000000..a12f847d9
--- /dev/null
+++ b/kcontrol/pics/cr32-app-icons.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-iconthemes.png b/kcontrol/pics/cr32-app-iconthemes.png
new file mode 100644
index 000000000..c5326752a
--- /dev/null
+++ b/kcontrol/pics/cr32-app-iconthemes.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-ieee1394.png b/kcontrol/pics/cr32-app-ieee1394.png
new file mode 100644
index 000000000..0253e7976
--- /dev/null
+++ b/kcontrol/pics/cr32-app-ieee1394.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-input_devices_settings.png b/kcontrol/pics/cr32-app-input_devices_settings.png
new file mode 100644
index 000000000..785b8a0fc
--- /dev/null
+++ b/kcontrol/pics/cr32-app-input_devices_settings.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmdevices.png b/kcontrol/pics/cr32-app-kcmdevices.png
new file mode 100644
index 000000000..d6354ad28
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmdevices.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmdrkonqi.png b/kcontrol/pics/cr32-app-kcmdrkonqi.png
new file mode 100644
index 000000000..26bb684cb
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmdrkonqi.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmkicker.png b/kcontrol/pics/cr32-app-kcmkicker.png
new file mode 100644
index 000000000..0863d4032
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmkicker.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmkwm.png b/kcontrol/pics/cr32-app-kcmkwm.png
new file mode 100644
index 000000000..7b1cbeb43
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmkwm.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmmemory.png b/kcontrol/pics/cr32-app-kcmmemory.png
new file mode 100644
index 000000000..8b50f37c9
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmmemory.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmmidi.png b/kcontrol/pics/cr32-app-kcmmidi.png
new file mode 100644
index 000000000..8430f26fb
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmmidi.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmpartitions.png b/kcontrol/pics/cr32-app-kcmpartitions.png
new file mode 100644
index 000000000..e5a746f31
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmpartitions.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmpci.png b/kcontrol/pics/cr32-app-kcmpci.png
new file mode 100644
index 000000000..fbde5bd3f
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmpci.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmprocessor.png b/kcontrol/pics/cr32-app-kcmprocessor.png
new file mode 100644
index 000000000..72b2b4691
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmprocessor.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmscsi.png b/kcontrol/pics/cr32-app-kcmscsi.png
new file mode 100644
index 000000000..d09ff08a2
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmscsi.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmsound.png b/kcontrol/pics/cr32-app-kcmsound.png
new file mode 100644
index 000000000..c122c880b
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmsound.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmsystem.png b/kcontrol/pics/cr32-app-kcmsystem.png
new file mode 100644
index 000000000..726784a4d
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmsystem.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kcmx.png b/kcontrol/pics/cr32-app-kcmx.png
new file mode 100644
index 000000000..4157c391d
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kcmx.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kdmconfig.png b/kcontrol/pics/cr32-app-kdmconfig.png
new file mode 100644
index 000000000..a5cbf22d3
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kdmconfig.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-key_bindings.png b/kcontrol/pics/cr32-app-key_bindings.png
new file mode 100644
index 000000000..6a3438d92
--- /dev/null
+++ b/kcontrol/pics/cr32-app-key_bindings.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-keyboard.png b/kcontrol/pics/cr32-app-keyboard.png
new file mode 100644
index 000000000..3bbc80536
--- /dev/null
+++ b/kcontrol/pics/cr32-app-keyboard.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-keyboard_layout.png b/kcontrol/pics/cr32-app-keyboard_layout.png
new file mode 100644
index 000000000..672c59310
--- /dev/null
+++ b/kcontrol/pics/cr32-app-keyboard_layout.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-knotify.png b/kcontrol/pics/cr32-app-knotify.png
new file mode 100644
index 000000000..ede0d8ed1
--- /dev/null
+++ b/kcontrol/pics/cr32-app-knotify.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kscreensaver.png b/kcontrol/pics/cr32-app-kscreensaver.png
new file mode 100644
index 000000000..f527126bc
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kscreensaver.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-kthememgr.png b/kcontrol/pics/cr32-app-kthememgr.png
new file mode 100644
index 000000000..2bf6a7782
--- /dev/null
+++ b/kcontrol/pics/cr32-app-kthememgr.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-locale.png b/kcontrol/pics/cr32-app-locale.png
new file mode 100644
index 000000000..96b4201ac
--- /dev/null
+++ b/kcontrol/pics/cr32-app-locale.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-looknfeel.png b/kcontrol/pics/cr32-app-looknfeel.png
new file mode 100644
index 000000000..75e29219b
--- /dev/null
+++ b/kcontrol/pics/cr32-app-looknfeel.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-multimedia.png b/kcontrol/pics/cr32-app-multimedia.png
new file mode 100644
index 000000000..1e397c524
--- /dev/null
+++ b/kcontrol/pics/cr32-app-multimedia.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-personal.png b/kcontrol/pics/cr32-app-personal.png
new file mode 100644
index 000000000..4f1959142
--- /dev/null
+++ b/kcontrol/pics/cr32-app-personal.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-proxy.png b/kcontrol/pics/cr32-app-proxy.png
new file mode 100644
index 000000000..46f68b243
--- /dev/null
+++ b/kcontrol/pics/cr32-app-proxy.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-samba.png b/kcontrol/pics/cr32-app-samba.png
new file mode 100644
index 000000000..0d79e5c83
--- /dev/null
+++ b/kcontrol/pics/cr32-app-samba.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-style.png b/kcontrol/pics/cr32-app-style.png
new file mode 100644
index 000000000..2e29a93a0
--- /dev/null
+++ b/kcontrol/pics/cr32-app-style.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-stylesheet.png b/kcontrol/pics/cr32-app-stylesheet.png
new file mode 100644
index 000000000..ab8918c30
--- /dev/null
+++ b/kcontrol/pics/cr32-app-stylesheet.png
Binary files differ
diff --git a/kcontrol/pics/cr32-app-usb.png b/kcontrol/pics/cr32-app-usb.png
new file mode 100644
index 000000000..c7601cb87
--- /dev/null
+++ b/kcontrol/pics/cr32-app-usb.png
Binary files differ
diff --git a/kcontrol/pics/cr32-device-laptop.png b/kcontrol/pics/cr32-device-laptop.png
new file mode 100644
index 000000000..866f3aae1
--- /dev/null
+++ b/kcontrol/pics/cr32-device-laptop.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-access.png b/kcontrol/pics/cr48-app-access.png
new file mode 100644
index 000000000..c74f3d99f
--- /dev/null
+++ b/kcontrol/pics/cr48-app-access.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-agent.png b/kcontrol/pics/cr48-app-agent.png
new file mode 100644
index 000000000..50864ebc1
--- /dev/null
+++ b/kcontrol/pics/cr48-app-agent.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-arts.png b/kcontrol/pics/cr48-app-arts.png
new file mode 100644
index 000000000..462eff9a2
--- /dev/null
+++ b/kcontrol/pics/cr48-app-arts.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-background.png b/kcontrol/pics/cr48-app-background.png
new file mode 100644
index 000000000..7b7bf37dd
--- /dev/null
+++ b/kcontrol/pics/cr48-app-background.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-bell.png b/kcontrol/pics/cr48-app-bell.png
new file mode 100644
index 000000000..0c4b6c5e3
--- /dev/null
+++ b/kcontrol/pics/cr48-app-bell.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-cache.png b/kcontrol/pics/cr48-app-cache.png
new file mode 100644
index 000000000..df779f4b3
--- /dev/null
+++ b/kcontrol/pics/cr48-app-cache.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-clock.png b/kcontrol/pics/cr48-app-clock.png
new file mode 100644
index 000000000..b97479759
--- /dev/null
+++ b/kcontrol/pics/cr48-app-clock.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-colors.png b/kcontrol/pics/cr48-app-colors.png
new file mode 100644
index 000000000..4be4e3501
--- /dev/null
+++ b/kcontrol/pics/cr48-app-colors.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-cookie.png b/kcontrol/pics/cr48-app-cookie.png
new file mode 100644
index 000000000..b3dc63ebc
--- /dev/null
+++ b/kcontrol/pics/cr48-app-cookie.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-date.png b/kcontrol/pics/cr48-app-date.png
new file mode 100644
index 000000000..a510951db
--- /dev/null
+++ b/kcontrol/pics/cr48-app-date.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-energy.png b/kcontrol/pics/cr48-app-energy.png
new file mode 100644
index 000000000..269eb4435
--- /dev/null
+++ b/kcontrol/pics/cr48-app-energy.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-energy_star.png b/kcontrol/pics/cr48-app-energy_star.png
new file mode 100644
index 000000000..5ed89d5ae
--- /dev/null
+++ b/kcontrol/pics/cr48-app-energy_star.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-enhanced_browsing.png b/kcontrol/pics/cr48-app-enhanced_browsing.png
new file mode 100644
index 000000000..e9d926489
--- /dev/null
+++ b/kcontrol/pics/cr48-app-enhanced_browsing.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-filetypes.png b/kcontrol/pics/cr48-app-filetypes.png
new file mode 100644
index 000000000..37f365e21
--- /dev/null
+++ b/kcontrol/pics/cr48-app-filetypes.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-fonts.png b/kcontrol/pics/cr48-app-fonts.png
new file mode 100644
index 000000000..a17a1f282
--- /dev/null
+++ b/kcontrol/pics/cr48-app-fonts.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-help_index.png b/kcontrol/pics/cr48-app-help_index.png
new file mode 100644
index 000000000..418e1daf8
--- /dev/null
+++ b/kcontrol/pics/cr48-app-help_index.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-hwinfo.png b/kcontrol/pics/cr48-app-hwinfo.png
new file mode 100644
index 000000000..a7f8b281e
--- /dev/null
+++ b/kcontrol/pics/cr48-app-hwinfo.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-icons.png b/kcontrol/pics/cr48-app-icons.png
new file mode 100644
index 000000000..a9100e732
--- /dev/null
+++ b/kcontrol/pics/cr48-app-icons.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-iconthemes.png b/kcontrol/pics/cr48-app-iconthemes.png
new file mode 100644
index 000000000..3ae2864a2
--- /dev/null
+++ b/kcontrol/pics/cr48-app-iconthemes.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-ieee1394.png b/kcontrol/pics/cr48-app-ieee1394.png
new file mode 100644
index 000000000..e5dd54b89
--- /dev/null
+++ b/kcontrol/pics/cr48-app-ieee1394.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-input_devices_settings.png b/kcontrol/pics/cr48-app-input_devices_settings.png
new file mode 100644
index 000000000..5c1e16a5b
--- /dev/null
+++ b/kcontrol/pics/cr48-app-input_devices_settings.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmdevices.png b/kcontrol/pics/cr48-app-kcmdevices.png
new file mode 100644
index 000000000..59f5d185a
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmdevices.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmdf.png b/kcontrol/pics/cr48-app-kcmdf.png
new file mode 100644
index 000000000..29d351f8b
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmdf.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmdrkonqi.png b/kcontrol/pics/cr48-app-kcmdrkonqi.png
new file mode 100644
index 000000000..54d7ce45f
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmdrkonqi.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmkwm.png b/kcontrol/pics/cr48-app-kcmkwm.png
new file mode 100644
index 000000000..21fb61e09
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmkwm.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmmemory.png b/kcontrol/pics/cr48-app-kcmmemory.png
new file mode 100644
index 000000000..3424cfa33
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmmemory.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmmidi.png b/kcontrol/pics/cr48-app-kcmmidi.png
new file mode 100644
index 000000000..8d716aca4
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmmidi.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmopengl.png b/kcontrol/pics/cr48-app-kcmopengl.png
new file mode 100644
index 000000000..ae934924c
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmopengl.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmpartitions.png b/kcontrol/pics/cr48-app-kcmpartitions.png
new file mode 100644
index 000000000..bddfa43e8
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmpartitions.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmpci.png b/kcontrol/pics/cr48-app-kcmpci.png
new file mode 100644
index 000000000..51215dddf
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmpci.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmprocessor.png b/kcontrol/pics/cr48-app-kcmprocessor.png
new file mode 100644
index 000000000..34e98e2f9
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmprocessor.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmscsi.png b/kcontrol/pics/cr48-app-kcmscsi.png
new file mode 100644
index 000000000..d2abcebcf
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmscsi.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmsystem.png b/kcontrol/pics/cr48-app-kcmsystem.png
new file mode 100644
index 000000000..3ed096d9d
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmsystem.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kcmx.png b/kcontrol/pics/cr48-app-kcmx.png
new file mode 100644
index 000000000..99a635905
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kcmx.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kdmconfig.png b/kcontrol/pics/cr48-app-kdmconfig.png
new file mode 100644
index 000000000..d8b241ca9
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kdmconfig.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-key_bindings.png b/kcontrol/pics/cr48-app-key_bindings.png
new file mode 100644
index 000000000..e4134ce3e
--- /dev/null
+++ b/kcontrol/pics/cr48-app-key_bindings.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-keyboard.png b/kcontrol/pics/cr48-app-keyboard.png
new file mode 100644
index 000000000..04c821147
--- /dev/null
+++ b/kcontrol/pics/cr48-app-keyboard.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-keyboard_layout.png b/kcontrol/pics/cr48-app-keyboard_layout.png
new file mode 100644
index 000000000..ba0359447
--- /dev/null
+++ b/kcontrol/pics/cr48-app-keyboard_layout.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-knotify.png b/kcontrol/pics/cr48-app-knotify.png
new file mode 100644
index 000000000..b0aa6e8fa
--- /dev/null
+++ b/kcontrol/pics/cr48-app-knotify.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kscreensaver.png b/kcontrol/pics/cr48-app-kscreensaver.png
new file mode 100644
index 000000000..749f42253
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kscreensaver.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-kthememgr.png b/kcontrol/pics/cr48-app-kthememgr.png
new file mode 100644
index 000000000..50430c726
--- /dev/null
+++ b/kcontrol/pics/cr48-app-kthememgr.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-locale.png b/kcontrol/pics/cr48-app-locale.png
new file mode 100644
index 000000000..e7defacbc
--- /dev/null
+++ b/kcontrol/pics/cr48-app-locale.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-looknfeel.png b/kcontrol/pics/cr48-app-looknfeel.png
new file mode 100644
index 000000000..342ebd7af
--- /dev/null
+++ b/kcontrol/pics/cr48-app-looknfeel.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-multimedia.png b/kcontrol/pics/cr48-app-multimedia.png
new file mode 100644
index 000000000..dc766a89c
--- /dev/null
+++ b/kcontrol/pics/cr48-app-multimedia.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-personal.png b/kcontrol/pics/cr48-app-personal.png
new file mode 100644
index 000000000..90aedf0f8
--- /dev/null
+++ b/kcontrol/pics/cr48-app-personal.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-proxy.png b/kcontrol/pics/cr48-app-proxy.png
new file mode 100644
index 000000000..3683e298c
--- /dev/null
+++ b/kcontrol/pics/cr48-app-proxy.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-samba.png b/kcontrol/pics/cr48-app-samba.png
new file mode 100644
index 000000000..d980263d8
--- /dev/null
+++ b/kcontrol/pics/cr48-app-samba.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-style.png b/kcontrol/pics/cr48-app-style.png
new file mode 100644
index 000000000..5d8af7e87
--- /dev/null
+++ b/kcontrol/pics/cr48-app-style.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-stylesheet.png b/kcontrol/pics/cr48-app-stylesheet.png
new file mode 100644
index 000000000..f74586b3c
--- /dev/null
+++ b/kcontrol/pics/cr48-app-stylesheet.png
Binary files differ
diff --git a/kcontrol/pics/cr48-app-usb.png b/kcontrol/pics/cr48-app-usb.png
new file mode 100644
index 000000000..4260b8259
--- /dev/null
+++ b/kcontrol/pics/cr48-app-usb.png
Binary files differ
diff --git a/kcontrol/pics/cr48-device-laptop.png b/kcontrol/pics/cr48-device-laptop.png
new file mode 100644
index 000000000..380f8ba0b
--- /dev/null
+++ b/kcontrol/pics/cr48-device-laptop.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-access.png b/kcontrol/pics/cr64-app-access.png
new file mode 100644
index 000000000..1d932d01d
--- /dev/null
+++ b/kcontrol/pics/cr64-app-access.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-arts.png b/kcontrol/pics/cr64-app-arts.png
new file mode 100644
index 000000000..cab3cd94a
--- /dev/null
+++ b/kcontrol/pics/cr64-app-arts.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-background.png b/kcontrol/pics/cr64-app-background.png
new file mode 100644
index 000000000..617f37ba7
--- /dev/null
+++ b/kcontrol/pics/cr64-app-background.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-bell.png b/kcontrol/pics/cr64-app-bell.png
new file mode 100644
index 000000000..f83c4092e
--- /dev/null
+++ b/kcontrol/pics/cr64-app-bell.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-cache.png b/kcontrol/pics/cr64-app-cache.png
new file mode 100644
index 000000000..a49b55d1d
--- /dev/null
+++ b/kcontrol/pics/cr64-app-cache.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-clock.png b/kcontrol/pics/cr64-app-clock.png
new file mode 100644
index 000000000..5698b5e05
--- /dev/null
+++ b/kcontrol/pics/cr64-app-clock.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-colors.png b/kcontrol/pics/cr64-app-colors.png
new file mode 100644
index 000000000..bf01037f5
--- /dev/null
+++ b/kcontrol/pics/cr64-app-colors.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-cookie.png b/kcontrol/pics/cr64-app-cookie.png
new file mode 100644
index 000000000..3988e0f23
--- /dev/null
+++ b/kcontrol/pics/cr64-app-cookie.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-date.png b/kcontrol/pics/cr64-app-date.png
new file mode 100644
index 000000000..06761d77e
--- /dev/null
+++ b/kcontrol/pics/cr64-app-date.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-energy.png b/kcontrol/pics/cr64-app-energy.png
new file mode 100644
index 000000000..5223681ff
--- /dev/null
+++ b/kcontrol/pics/cr64-app-energy.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-energy_star.png b/kcontrol/pics/cr64-app-energy_star.png
new file mode 100644
index 000000000..13a4640ab
--- /dev/null
+++ b/kcontrol/pics/cr64-app-energy_star.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-enhanced_browsing.png b/kcontrol/pics/cr64-app-enhanced_browsing.png
new file mode 100644
index 000000000..e52328a77
--- /dev/null
+++ b/kcontrol/pics/cr64-app-enhanced_browsing.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-filetypes.png b/kcontrol/pics/cr64-app-filetypes.png
new file mode 100644
index 000000000..6f723a9cc
--- /dev/null
+++ b/kcontrol/pics/cr64-app-filetypes.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-fonts.png b/kcontrol/pics/cr64-app-fonts.png
new file mode 100644
index 000000000..6fdab333d
--- /dev/null
+++ b/kcontrol/pics/cr64-app-fonts.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-help_index.png b/kcontrol/pics/cr64-app-help_index.png
new file mode 100644
index 000000000..56be1b7b0
--- /dev/null
+++ b/kcontrol/pics/cr64-app-help_index.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-hwinfo.png b/kcontrol/pics/cr64-app-hwinfo.png
new file mode 100644
index 000000000..bb3ac3019
--- /dev/null
+++ b/kcontrol/pics/cr64-app-hwinfo.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-icons.png b/kcontrol/pics/cr64-app-icons.png
new file mode 100644
index 000000000..3891bc74d
--- /dev/null
+++ b/kcontrol/pics/cr64-app-icons.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-ieee1394.png b/kcontrol/pics/cr64-app-ieee1394.png
new file mode 100644
index 000000000..eb8d540b2
--- /dev/null
+++ b/kcontrol/pics/cr64-app-ieee1394.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-kcmdevices.png b/kcontrol/pics/cr64-app-kcmdevices.png
new file mode 100644
index 000000000..396b3d3ba
--- /dev/null
+++ b/kcontrol/pics/cr64-app-kcmdevices.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-kcmdf.png b/kcontrol/pics/cr64-app-kcmdf.png
new file mode 100644
index 000000000..58378b148
--- /dev/null
+++ b/kcontrol/pics/cr64-app-kcmdf.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-kcmkwm.png b/kcontrol/pics/cr64-app-kcmkwm.png
new file mode 100644
index 000000000..0fef5f1d0
--- /dev/null
+++ b/kcontrol/pics/cr64-app-kcmkwm.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-kcmmemory.png b/kcontrol/pics/cr64-app-kcmmemory.png
new file mode 100644
index 000000000..61f7cc517
--- /dev/null
+++ b/kcontrol/pics/cr64-app-kcmmemory.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-kcmpartitions.png b/kcontrol/pics/cr64-app-kcmpartitions.png
new file mode 100644
index 000000000..1bcce6d00
--- /dev/null
+++ b/kcontrol/pics/cr64-app-kcmpartitions.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-kcmpci.png b/kcontrol/pics/cr64-app-kcmpci.png
new file mode 100644
index 000000000..6fae64367
--- /dev/null
+++ b/kcontrol/pics/cr64-app-kcmpci.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-kcmx.png b/kcontrol/pics/cr64-app-kcmx.png
new file mode 100644
index 000000000..64e33b953
--- /dev/null
+++ b/kcontrol/pics/cr64-app-kcmx.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-kdmconfig.png b/kcontrol/pics/cr64-app-kdmconfig.png
new file mode 100644
index 000000000..57c5726d0
--- /dev/null
+++ b/kcontrol/pics/cr64-app-kdmconfig.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-key_bindings.png b/kcontrol/pics/cr64-app-key_bindings.png
new file mode 100644
index 000000000..ca5090329
--- /dev/null
+++ b/kcontrol/pics/cr64-app-key_bindings.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-knotify.png b/kcontrol/pics/cr64-app-knotify.png
new file mode 100644
index 000000000..3a4d918ae
--- /dev/null
+++ b/kcontrol/pics/cr64-app-knotify.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-kscreensaver.png b/kcontrol/pics/cr64-app-kscreensaver.png
new file mode 100644
index 000000000..69c8214fb
--- /dev/null
+++ b/kcontrol/pics/cr64-app-kscreensaver.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-kthememgr.png b/kcontrol/pics/cr64-app-kthememgr.png
new file mode 100644
index 000000000..784b5aef3
--- /dev/null
+++ b/kcontrol/pics/cr64-app-kthememgr.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-locale.png b/kcontrol/pics/cr64-app-locale.png
new file mode 100644
index 000000000..042c0d345
--- /dev/null
+++ b/kcontrol/pics/cr64-app-locale.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-looknfeel.png b/kcontrol/pics/cr64-app-looknfeel.png
new file mode 100644
index 000000000..b73346e44
--- /dev/null
+++ b/kcontrol/pics/cr64-app-looknfeel.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-multimedia.png b/kcontrol/pics/cr64-app-multimedia.png
new file mode 100644
index 000000000..406aad0f1
--- /dev/null
+++ b/kcontrol/pics/cr64-app-multimedia.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-personal.png b/kcontrol/pics/cr64-app-personal.png
new file mode 100644
index 000000000..136dcfe11
--- /dev/null
+++ b/kcontrol/pics/cr64-app-personal.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-proxy.png b/kcontrol/pics/cr64-app-proxy.png
new file mode 100644
index 000000000..9b5f5b6a8
--- /dev/null
+++ b/kcontrol/pics/cr64-app-proxy.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-samba.png b/kcontrol/pics/cr64-app-samba.png
new file mode 100644
index 000000000..2bade600c
--- /dev/null
+++ b/kcontrol/pics/cr64-app-samba.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-style.png b/kcontrol/pics/cr64-app-style.png
new file mode 100644
index 000000000..d3f70b0cb
--- /dev/null
+++ b/kcontrol/pics/cr64-app-style.png
Binary files differ
diff --git a/kcontrol/pics/cr64-app-stylesheet.png b/kcontrol/pics/cr64-app-stylesheet.png
new file mode 100644
index 000000000..ac393bc3e
--- /dev/null
+++ b/kcontrol/pics/cr64-app-stylesheet.png
Binary files differ
diff --git a/kcontrol/pics/cr64-device-laptop.png b/kcontrol/pics/cr64-device-laptop.png
new file mode 100644
index 000000000..6084660cc
--- /dev/null
+++ b/kcontrol/pics/cr64-device-laptop.png
Binary files differ
diff --git a/kcontrol/pics/crsc-app-access.svgz b/kcontrol/pics/crsc-app-access.svgz
new file mode 100644
index 000000000..7aafb4143
--- /dev/null
+++ b/kcontrol/pics/crsc-app-access.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-arts.svgz b/kcontrol/pics/crsc-app-arts.svgz
new file mode 100644
index 000000000..8263c19da
--- /dev/null
+++ b/kcontrol/pics/crsc-app-arts.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-background.svgz b/kcontrol/pics/crsc-app-background.svgz
new file mode 100644
index 000000000..2a757c585
--- /dev/null
+++ b/kcontrol/pics/crsc-app-background.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-bell.svgz b/kcontrol/pics/crsc-app-bell.svgz
new file mode 100644
index 000000000..dc331c0a7
--- /dev/null
+++ b/kcontrol/pics/crsc-app-bell.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-cache.svgz b/kcontrol/pics/crsc-app-cache.svgz
new file mode 100644
index 000000000..4ec2d9b06
--- /dev/null
+++ b/kcontrol/pics/crsc-app-cache.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-colors.svgz b/kcontrol/pics/crsc-app-colors.svgz
new file mode 100644
index 000000000..322036ae5
--- /dev/null
+++ b/kcontrol/pics/crsc-app-colors.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-date.svgz b/kcontrol/pics/crsc-app-date.svgz
new file mode 100644
index 000000000..c82b7efa6
--- /dev/null
+++ b/kcontrol/pics/crsc-app-date.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-energy.svgz b/kcontrol/pics/crsc-app-energy.svgz
new file mode 100644
index 000000000..049021cb2
--- /dev/null
+++ b/kcontrol/pics/crsc-app-energy.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-filetypes.svgz b/kcontrol/pics/crsc-app-filetypes.svgz
new file mode 100644
index 000000000..0b696b3b8
--- /dev/null
+++ b/kcontrol/pics/crsc-app-filetypes.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-fonts.svgz b/kcontrol/pics/crsc-app-fonts.svgz
new file mode 100644
index 000000000..763c75685
--- /dev/null
+++ b/kcontrol/pics/crsc-app-fonts.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-hwinfo.svgz b/kcontrol/pics/crsc-app-hwinfo.svgz
new file mode 100644
index 000000000..5054c4182
--- /dev/null
+++ b/kcontrol/pics/crsc-app-hwinfo.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-ieee1394.svgz b/kcontrol/pics/crsc-app-ieee1394.svgz
new file mode 100644
index 000000000..4f9031e0a
--- /dev/null
+++ b/kcontrol/pics/crsc-app-ieee1394.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-kcmdevices.svgz b/kcontrol/pics/crsc-app-kcmdevices.svgz
new file mode 100644
index 000000000..973f200d4
--- /dev/null
+++ b/kcontrol/pics/crsc-app-kcmdevices.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-kcmkwm.svgz b/kcontrol/pics/crsc-app-kcmkwm.svgz
new file mode 100644
index 000000000..f9993b78c
--- /dev/null
+++ b/kcontrol/pics/crsc-app-kcmkwm.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-kcmx.svgz b/kcontrol/pics/crsc-app-kcmx.svgz
new file mode 100644
index 000000000..e255c0d54
--- /dev/null
+++ b/kcontrol/pics/crsc-app-kcmx.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-locale.svgz b/kcontrol/pics/crsc-app-locale.svgz
new file mode 100644
index 000000000..1b6708853
--- /dev/null
+++ b/kcontrol/pics/crsc-app-locale.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-samba.svgz b/kcontrol/pics/crsc-app-samba.svgz
new file mode 100644
index 000000000..0dd9383b8
--- /dev/null
+++ b/kcontrol/pics/crsc-app-samba.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-app-stylesheet.svgz b/kcontrol/pics/crsc-app-stylesheet.svgz
new file mode 100644
index 000000000..44354465d
--- /dev/null
+++ b/kcontrol/pics/crsc-app-stylesheet.svgz
Binary files differ
diff --git a/kcontrol/pics/crsc-device-laptop.svgz b/kcontrol/pics/crsc-device-laptop.svgz
new file mode 100644
index 000000000..1cd92961c
--- /dev/null
+++ b/kcontrol/pics/crsc-device-laptop.svgz
Binary files differ
diff --git a/kcontrol/privacy/Makefile.am b/kcontrol/privacy/Makefile.am
new file mode 100644
index 000000000..82ac0d2a6
--- /dev/null
+++ b/kcontrol/privacy/Makefile.am
@@ -0,0 +1,16 @@
+AM_CPPFLAGS = $(all_includes)
+kde_module_LTLIBRARIES = kcm_privacy.la
+
+kcm_privacy_la_SOURCES = privacy.cpp kprivacysettings.ui kcmprivacydialog.ui kprivacymanager.cpp
+
+kcm_privacy_la_LDFLAGS = -module -avoid-version $(all_libraries) -no-undefined
+kcm_privacy_la_LIBADD = $(LIB_KDEUI) -lkio
+
+METASOURCES = AUTO
+
+noinst_HEADERS = privacy.h
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/privacy.pot
+
+xdg_apps_DATA = privacy.desktop
diff --git a/kcontrol/privacy/kcmprivacydialog.ui b/kcontrol/privacy/kcmprivacydialog.ui
new file mode 100644
index 000000000..df79e2ec1
--- /dev/null
+++ b/kcontrol/privacy/kcmprivacydialog.ui
@@ -0,0 +1,201 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KCMPrivacyDialog</class>
+<author>Ralf Hoelzer</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KCMPrivacyDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>452</width>
+ <height>226</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="sizeIncrement">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>400</width>
+ <height>550</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>Privacy</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>splitter1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <widget class="KListView">
+ <property name="name">
+ <cstring>privacyListView</cstring>
+ </property>
+ <property name="showSortIndicator">
+ <bool>false</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ <property name="autoOpen">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="KTextEdit">
+ <property name="name">
+ <cstring>statusTextEdit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>200</height>
+ </size>
+ </property>
+ <property name="resizePolicy">
+ <enum>Manual</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>selectAllButton</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Select All</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>selectNoneButton</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Select None</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Maximum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>80</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cleanupButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Clean Up</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<includes>
+ <include location="global" impldecl="in implementation">klistview.h</include>
+ <include location="global" impldecl="in implementation">ktextedit.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kcontrol/privacy/kprivacymanager.cpp b/kcontrol/privacy/kprivacymanager.cpp
new file mode 100644
index 000000000..cad01a169
--- /dev/null
+++ b/kcontrol/privacy/kprivacymanager.cpp
@@ -0,0 +1,169 @@
+/**
+ * kprivacymanager.cpp
+ *
+ * Copyright (c) 2003 Ralf Hoelzer <ralf@well.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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 "kprivacymanager.h"
+#include <kapplication.h>
+#include <dcopclient.h>
+#include <kconfig.h>
+#include <ksimpleconfig.h>
+#include <kprocess.h>
+#include <kglobal.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <krecentdocument.h>
+#include <kstandarddirs.h>
+
+#include <qstringlist.h>
+#include <qfile.h>
+#include <qdir.h>
+
+KPrivacyManager::KPrivacyManager()
+{
+ if (!kapp->dcopClient()->isAttached())
+ kapp->dcopClient()->attach();
+
+ m_error = false;
+}
+
+
+KPrivacyManager::~KPrivacyManager()
+{
+}
+
+bool KPrivacyManager::clearThumbnails()
+{
+ // http://freedesktop.org/Standards/Home
+ // http://triq.net/~jens/thumbnail-spec/index.html
+
+ QDir thumbnailDir( QDir::homeDirPath() + "/.thumbnails/normal");
+ thumbnailDir.setFilter( QDir::Files );
+ QStringList entries = thumbnailDir.entryList();
+ for( QStringList::Iterator it = entries.begin() ; it != entries.end() ; ++it)
+ if(!thumbnailDir.remove(*it)) m_error = true;
+ if(m_error) return m_error;
+
+ thumbnailDir.setPath(QDir::homeDirPath() + "/.thumbnails/large");
+ entries = thumbnailDir.entryList();
+ for( QStringList::Iterator it = entries.begin() ; it != entries.end() ; ++it)
+ if(!thumbnailDir.remove(*it)) m_error = true;
+ if(m_error) return m_error;
+
+ thumbnailDir.setPath(QDir::homeDirPath() + "/.thumbnails/fail");
+ entries = thumbnailDir.entryList();
+ for( QStringList::Iterator it = entries.begin() ; it != entries.end() ; ++it)
+ if(!thumbnailDir.remove(*it)) m_error = true;
+
+ return m_error;
+}
+
+bool KPrivacyManager::clearRunCommandHistory() const
+{
+ return kapp->dcopClient()->send( "kdesktop", "KDesktopIface", "clearCommandHistory()", "" );
+}
+
+bool KPrivacyManager::clearAllCookies() const
+{
+ return kapp->dcopClient()->send( "kded", "kcookiejar", "deleteAllCookies()", "" );
+}
+
+bool KPrivacyManager::clearSavedClipboardContents()
+{
+ if(!isApplicationRegistered("klipper"))
+ {
+ KConfig *c = new KConfig("klipperrc", false, false);
+
+ {
+ KConfigGroupSaver saver(c, "General");
+ c->deleteEntry("ClipboardData");
+ c->sync();
+ }
+ delete c;
+ return true;
+ }
+
+ return kapp->dcopClient()->send( "klipper", "klipper", "clearClipboardHistory()", "" );
+}
+
+bool KPrivacyManager::clearFormCompletion() const
+{
+ QFile completionFile(locateLocal("data", "khtml/formcompletions"));
+
+ return completionFile.remove();
+}
+
+bool KPrivacyManager::clearWebCache() const
+{
+ KProcess process;
+ process << "kio_http_cache_cleaner" << "--clear-all";
+ return process.start(KProcess::DontCare);
+}
+
+bool KPrivacyManager::clearRecentDocuments() const
+{
+ KRecentDocument::clear();
+ return KRecentDocument::recentDocuments().isEmpty();
+}
+
+bool KPrivacyManager::clearQuickStartMenu() const
+{
+ return kapp->dcopClient()->send( "kicker", "kicker", "clearQuickStartMenu()", "" );
+}
+
+bool KPrivacyManager::clearWebHistory()
+{
+ QStringList args("--preload");
+
+ // preload Konqueror if it is not running
+ if(!isApplicationRegistered("konqueror"))
+ {
+ kdDebug() << "couldn't find Konqueror instance, preloading." << endl;
+ kapp->kdeinitExec("konqueror", args, 0,0);
+ }
+
+ return kapp->dcopClient()->send( "konqueror*", "KonqHistoryManager",
+ "notifyClear(QCString)", "" );
+}
+
+bool KPrivacyManager::clearFavIcons()
+{
+ QDir favIconDir(KGlobal::dirs()->saveLocation( "cache", "favicons/" ));
+ favIconDir.setFilter( QDir::Files );
+
+ QStringList entries = favIconDir.entryList();
+
+ // erase all files in favicon directory
+ for( QStringList::Iterator it = entries.begin() ; it != entries.end() ; ++it)
+ if(!favIconDir.remove(*it)) m_error = true;
+ return m_error;
+}
+
+
+bool KPrivacyManager::isApplicationRegistered(const QString &appName)
+{
+
+ QCStringList regApps = kapp->dcopClient()->registeredApplications();
+
+ for ( QCStringList::Iterator it = regApps.begin(); it != regApps.end(); ++it )
+ if((*it).find(appName.latin1()) != -1) return true;
+
+ return false;
+}
+
+#include "kprivacymanager.moc"
diff --git a/kcontrol/privacy/kprivacymanager.h b/kcontrol/privacy/kprivacymanager.h
new file mode 100644
index 000000000..114618577
--- /dev/null
+++ b/kcontrol/privacy/kprivacymanager.h
@@ -0,0 +1,55 @@
+/**
+ * kprivacymanager.h
+ *
+ * Copyright (c) 2003 Ralf Hoelzer <ralf@well.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef KPRIVACYMANAGER_H
+#define KPRIVACYMANAGER_H
+
+#include <qobject.h>
+
+/**
+@author Ralf Hoelzer
+*/
+
+class KPrivacyManager : public QObject
+{
+Q_OBJECT
+public:
+ KPrivacyManager();
+
+ ~KPrivacyManager();
+
+ bool clearAllCookies() const;
+ bool clearSavedClipboardContents();
+ bool clearThumbnails();
+ bool clearRunCommandHistory() const;
+ bool clearFormCompletion() const;
+ bool clearWebHistory();
+ bool clearWebCache() const;
+ bool clearQuickStartMenu() const;
+ bool clearRecentDocuments() const;
+ bool clearFavIcons();
+
+private:
+ bool isApplicationRegistered(const QString &appName);
+ bool m_error;
+
+};
+
+#endif
diff --git a/kcontrol/privacy/kprivacysettings.ui b/kcontrol/privacy/kprivacysettings.ui
new file mode 100644
index 000000000..93afe5dff
--- /dev/null
+++ b/kcontrol/privacy/kprivacysettings.ui
@@ -0,0 +1,308 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>KPrivacySettings</class>
+<comment>KDE Privacy Settings Widget
+Licensed under the terms of the LGPL.
+Derived from AT&amp;T's Privacy Bird settings panel screenshot originally.
+</comment>
+<author>George Staikos &lt;staikos@kde.org&gt;</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KPrivacySettings</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>905</width>
+ <height>724</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Privacy Settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="Line" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Network privacy level:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>_privacyLevel</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>Low</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Medium</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>High</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Custom</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>_privacyLevel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QButtonGroup" row="6" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>buttonGroup1_2</cstring>
+ </property>
+ <property name="title">
+ <string>Financial Information</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Warn me when I visit a site that uses my financial or purchase information:</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_warnFinancialMarketeer</cstring>
+ </property>
+ <property name="text">
+ <string>For marketing or advertising purposes</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_warnFinancialSpammer</cstring>
+ </property>
+ <property name="text">
+ <string>To share with other companies</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup" row="5" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Health Information</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Warn me when I visit a site that uses my health or medical information: </string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_warnHealthMarketeer</cstring>
+ </property>
+ <property name="text">
+ <string>For marketing or advertising purposes</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_warnHealthSpammer</cstring>
+ </property>
+ <property name="text">
+ <string>To share with other companies</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup" row="7" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>buttonGroup1_2_2</cstring>
+ </property>
+ <property name="title">
+ <string>Demographics</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2_3</cstring>
+ </property>
+ <property name="text">
+ <string>Warn me when I visit a site that uses my non-personally identifiable information:</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_warnDemographicsBigBrother</cstring>
+ </property>
+ <property name="text">
+ <string>To determine my interests, habits or general behavior</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_warnDemographicsSpammer</cstring>
+ </property>
+ <property name="text">
+ <string>To share with other companies</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>_warnSpammers</cstring>
+ </property>
+ <property name="text">
+ <string>Warn me when I visit a site that shares my personal information with other companies</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>_warnShady</cstring>
+ </property>
+ <property name="text">
+ <string>Warn me when I visit a site that does not let me know what information they have about me</string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup" row="4" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>buttonGroup4</cstring>
+ </property>
+ <property name="title">
+ <string>Personal Information</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel2_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Warn me when I visit a site that may contact me about other products or services:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel2_2_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Warn me when I visit a site that may use my personal information to:</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>_warnPersonalHabits</cstring>
+ </property>
+ <property name="text">
+ <string>Determine my habits, interests or general behavior</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_warnPersonalTelephone</cstring>
+ </property>
+ <property name="text">
+ <string>Via telephone</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_warnPersonalMail</cstring>
+ </property>
+ <property name="text">
+ <string>Via mail</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_warnPersonalEmail</cstring>
+ </property>
+ <property name="text">
+ <string>Via email</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_warnPersonalBigBrother</cstring>
+ </property>
+ <property name="text">
+ <string>And do not allow me to remove my contact information</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/privacy/privacy.cpp b/kcontrol/privacy/privacy.cpp
new file mode 100644
index 000000000..c0287ceba
--- /dev/null
+++ b/kcontrol/privacy/privacy.cpp
@@ -0,0 +1,319 @@
+/**
+ * privacy.cpp
+ *
+ * Copyright (c) 2003 Ralf Hoelzer <ralf@well.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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 <qcheckbox.h>
+#include <qlayout.h>
+#include <qptrlist.h>
+#include <qpushbutton.h>
+#include <qtabwidget.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+
+#include <kaboutdata.h>
+#include <kconfig.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <ktextedit.h>
+
+#include "privacy.h"
+
+Privacy::Privacy(QWidget *parent, const char *name)
+ : KCModule(parent, name)
+{
+ setQuickHelp( i18n("The privacy module allows a user to erase traces which KDE leaves on "
+ "the system, such as command histories or browser caches."));
+
+ setButtons( KCModule::Default|KCModule::Apply|KCModule::Help );
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcm_privacy"), I18N_NOOP("KDE Privacy Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2003 Ralf Hoelzer"));
+
+ about->addAuthor("Ralf Hoelzer", 0, "ralf@well.com");
+ about->addAuthor("Benjamin Meyer", I18N_NOOP("Thumbnail Cache"), "ben+kdeprivacy@meyerhome.net");
+ setAboutData( about );
+
+ m_privacymanager = new KPrivacyManager();
+
+ QBoxLayout *top = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ // add this once the P3P stuff is finished
+ //QTabWidget *privacyTabs = new QTabWidget(this, "privacytabs");
+
+ cleaningDialog = new KCMPrivacyDialog(this);
+ //p3pSettings = new KPrivacySettings(this);
+
+ top->addWidget(cleaningDialog);
+
+ //top->addWidget(privacyTabs);
+ //privacyTabs->addTab(cleaningDialog, i18n("Cleanup"));
+ //privacyTabs->addTab(p3pSettings, i18n("Privacy Settings"));
+
+
+ KListView *sw = cleaningDialog->privacyListView;
+
+ sw->addColumn(i18n("Privacy Settings"));
+ sw->addColumn(i18n("Description"));
+
+ sw->setRootIsDecorated(true);
+ sw->setTooltipColumn(1);
+ sw->setColumnWidthMode(0, QListView::Maximum);
+
+
+
+ generalCLI = new KListViewItem(sw, i18n("General") );
+ webbrowsingCLI = new KListViewItem(sw, i18n("Web Browsing") );
+
+ generalCLI->setOpen(true);
+ webbrowsingCLI->setOpen(true);
+
+ clearThumbnails = new QCheckListItem(generalCLI,
+ i18n("Thumbnail Cache"),QCheckListItem::CheckBox);
+ clearRunCommandHistory = new QCheckListItem(generalCLI,
+ i18n("Run Command History"),QCheckListItem::CheckBox);
+ clearAllCookies = new QCheckListItem(webbrowsingCLI,
+ i18n("Cookies"),QCheckListItem::CheckBox);
+ clearSavedClipboardContents = new QCheckListItem(generalCLI,
+ i18n("Saved Clipboard Contents"),QCheckListItem::CheckBox);
+ clearWebHistory = new QCheckListItem(webbrowsingCLI,
+ i18n("Web History"),QCheckListItem::CheckBox);
+ clearWebCache = new QCheckListItem(webbrowsingCLI,
+ i18n("Web Cache"),QCheckListItem::CheckBox);
+ clearFormCompletion = new QCheckListItem(webbrowsingCLI,
+ i18n("Form Completion Entries"),QCheckListItem::CheckBox);
+ clearRecentDocuments = new QCheckListItem(generalCLI,
+ i18n("Recent Documents"),QCheckListItem::CheckBox);
+ clearQuickStartMenu = new QCheckListItem(generalCLI,
+ i18n("Quick Start Menu"),QCheckListItem::CheckBox);
+ clearFavIcons = new QCheckListItem(webbrowsingCLI,
+ i18n("Favorite Icons"),QCheckListItem::CheckBox);
+
+ QWhatsThis::add(sw, i18n("Check all cleanup actions you would like to perform. These will be executed by pressing the button below"));
+ QWhatsThis::add(cleaningDialog->cleanupButton, i18n("Immediately performs the cleanup actions selected above"));
+
+ clearThumbnails->setText(1, i18n("Clears all cached thumbnails"));
+ clearRunCommandHistory->setText(1, i18n("Clears the history of commands run through the Run Command tool on the desktop"));
+ clearAllCookies->setText(1, i18n("Clears all stored cookies set by websites"));
+ clearWebHistory->setText(1, i18n("Clears the history of visited websites"));
+ clearSavedClipboardContents->setText(1, i18n("Clears the clipboard contents stored by Klipper"));
+ clearWebCache->setText(1, i18n("Clears the temporary cache of websites visited"));
+ clearFormCompletion->setText(1, i18n("Clears values which were entered into forms on websites"));
+ clearRecentDocuments->setText(1, i18n("Clears the list of recently used documents from the KDE applications menu"));
+ clearQuickStartMenu->setText(1, i18n("Clears the entries from the list of recently started applications"));
+ clearFavIcons->setText(1, i18n("Clears the FavIcons cached from visited websites"));
+
+ connect(sw, SIGNAL(selectionChanged()), SLOT(changed()));
+
+ // store all entries in a list for easy access later on
+ checklist.append(clearThumbnails);
+ checklist.append(clearRunCommandHistory);
+ checklist.append(clearAllCookies);
+ checklist.append(clearSavedClipboardContents);
+ checklist.append(clearWebHistory);
+ checklist.append(clearWebCache);
+ checklist.append(clearFormCompletion);
+ checklist.append(clearRecentDocuments);
+ checklist.append(clearQuickStartMenu);
+ checklist.append(clearFavIcons);
+
+ connect(cleaningDialog->cleanupButton, SIGNAL(clicked()), SLOT(cleanup()));
+ connect(cleaningDialog->selectAllButton, SIGNAL(clicked()), SLOT(selectAll()));
+ connect(cleaningDialog->selectNoneButton, SIGNAL(clicked()), SLOT(selectNone()));
+
+ load();
+}
+
+
+Privacy::~Privacy()
+{
+ delete m_privacymanager;
+}
+
+void Privacy::load()
+{
+ load( false );
+}
+
+void Privacy::load(bool useDefaults)
+{
+ KConfig *c = new KConfig("kprivacyrc", false, false);
+
+ c->setReadDefaults( useDefaults );
+
+ // get general privacy settings
+ {
+ KConfigGroupSaver saver(c, "Cleaning");
+
+ clearThumbnails->setOn(c->readBoolEntry("ClearThumbnails", true));
+ clearRunCommandHistory->setOn(c->readBoolEntry("ClearRunCommandHistory", true));
+ clearAllCookies->setOn(c->readBoolEntry("ClearAllCookies", true));
+ clearSavedClipboardContents->setOn(c->readBoolEntry("ClearSavedClipboardContents", true));
+ clearWebHistory->setOn(c->readBoolEntry("ClearWebHistory", true));
+ clearWebCache->setOn(c->readBoolEntry("ClearWebCache", true));
+ clearFormCompletion->setOn(c->readBoolEntry("ClearFormCompletion", true));
+ clearRecentDocuments->setOn(c->readBoolEntry("ClearRecentDocuments", true));
+ clearQuickStartMenu->setOn(c->readBoolEntry("ClearQuickStartMenu", true));
+ clearFavIcons->setOn(c->readBoolEntry("ClearFavIcons", true));
+ }
+
+ {
+ KConfigGroupSaver saver(c, "P3P");
+
+ // TODO: add P3P settings here
+ }
+
+ delete c;
+ emit changed( useDefaults );
+}
+
+
+void Privacy::defaults()
+{
+ load( true );
+}
+
+
+void Privacy::save()
+{
+ KConfig *c = new KConfig("kprivacyrc", false, false);
+ {
+ KConfigGroupSaver saver(c, "Cleaning");
+
+ c->writeEntry("ClearThumbnails", clearThumbnails->isOn());
+ c->writeEntry("ClearRunCommandHistory", clearRunCommandHistory->isOn());
+ c->writeEntry("ClearAllCookies", clearAllCookies->isOn());
+ c->writeEntry("ClearSavedClipboardContents", clearSavedClipboardContents->isOn());
+ c->writeEntry("ClearWebCache", clearWebCache->isOn());
+ c->writeEntry("ClearWebHistory", clearWebHistory->isOn());
+ c->writeEntry("ClearFormCompletion", clearFormCompletion->isOn());
+ c->writeEntry("ClearRecentDocuments", clearRecentDocuments->isOn());
+ c->writeEntry("ClearQuickStartMenu", clearQuickStartMenu->isOn());
+ c->writeEntry("ClearFavIcons", clearFavIcons->isOn());
+ }
+
+ {
+ KConfigGroupSaver saver(c, "P3P");
+
+ // TODO: add settings for P3P
+ }
+
+ c->sync();
+
+ delete c;
+ emit changed(false);
+
+}
+
+void Privacy::selectAll()
+{
+ QCheckListItem *item;
+
+ for ( item = checklist.first(); item; item = checklist.next() )
+ item->setOn(true);
+
+ emit changed(true);
+}
+
+void Privacy::selectNone()
+{
+ QCheckListItem *item;
+
+ for ( item = checklist.first(); item; item = checklist.next() )
+ item->setOn(false);
+
+ emit changed(true);
+}
+
+
+void Privacy::cleanup()
+{
+ if (KMessageBox::warningContinueCancel(this, i18n("You are deleting data that is potentially valuable to you. Are you sure?")) != KMessageBox::Continue) return;
+
+ cleaningDialog->statusTextEdit->clear();
+ cleaningDialog->statusTextEdit->setText(i18n("Starting cleanup..."));
+
+ QCheckListItem *item;
+ bool error = false;
+
+ for ( item = checklist.first(); item; item = checklist.next() )
+ {
+ if(item->isOn())
+ {
+ QString statusText = i18n("Clearing %1...").arg(item->text());
+ cleaningDialog->statusTextEdit->append(statusText);
+
+ if(item == clearThumbnails)
+ error = m_privacymanager->clearThumbnails();
+
+ if(item == clearRunCommandHistory)
+ error = !m_privacymanager->clearRunCommandHistory();
+
+ if(item == clearSavedClipboardContents)
+ error = !m_privacymanager->clearSavedClipboardContents();
+
+ if(item == clearAllCookies)
+ error = !m_privacymanager->clearAllCookies();
+
+ if(item == clearFormCompletion)
+ error = !m_privacymanager->clearFormCompletion();
+
+ if(item == clearWebCache)
+ error = !m_privacymanager->clearWebCache();
+
+ if(item == clearWebHistory)
+ error = !m_privacymanager->clearWebHistory();
+
+ if(item == clearRecentDocuments)
+ error = !m_privacymanager->clearRecentDocuments();
+
+ if(item == clearQuickStartMenu)
+ error = !m_privacymanager->clearQuickStartMenu();
+
+ if(item == clearFavIcons)
+ error = m_privacymanager->clearFavIcons();
+
+ if(error)
+ {
+ QString errorText = i18n("Clearing of %1 failed").arg(item->text());
+ cleaningDialog->statusTextEdit->append(errorText);
+ }
+ }
+ }
+
+
+ cleaningDialog->statusTextEdit->append(i18n("Clean up finished."));
+
+}
+
+extern "C"
+{
+
+ KDE_EXPORT KCModule *create_privacy(QWidget *parent, const char * /*name*/)
+ {
+ KGlobal::locale()->insertCatalogue("privacy");
+ return new Privacy(parent, "Privacy");
+ }
+}
+
+#include "privacy.moc"
diff --git a/kcontrol/privacy/privacy.desktop b/kcontrol/privacy/privacy.desktop
new file mode 100644
index 000000000..f47b2dd0e
--- /dev/null
+++ b/kcontrol/privacy/privacy.desktop
@@ -0,0 +1,204 @@
+[Desktop Entry]
+Icon=trashcan_empty
+Comment=Privacy - a kcontrol module to clean unwanted traces the user leaves on the system
+Comment[af]=Privaatheid - 'n Beheer module wat voetspore wat deur gebruikers op die stelsel gelaat word skoon maak
+Comment[ar]=الخصوصية - وحدة kcontrol لتنظيف الآثار غير المرغوب بها التي يتركها المستخدم على النظام
+Comment[be]=Модуль захавання прыватнасці. Выдаляе файлы, што застаюцца пасля працы карыстальніка на кампутары
+Comment[bg]=Настройване заличаването на личната информация
+Comment[bn]=প্রাইভেসি - একটি কে-কন্ট্রোল মডিউল যার কাজব্যবহারের পর অবশিষ্ট চিহ্নগুলি পরিশোধন করা
+Comment[bs]=Privatnost - KControl modul koji čisti neželjene tragove koje korisnik ostavlja na sistemu
+Comment[ca]=Privacitat - un mòdul de kcontrol per a netejar les traces no desitjades que va deixant un usuari pel sistema
+Comment[cs]=Soukromí - modul pro čištění citlivých údajů
+Comment[csb]=Priwatny nastôw - mòduł, chtëren zezwôlô remac niepòrządané szlachë jaczé òstałë pò brëkòwnikù w systemie
+Comment[cy]=Preifatrwydd - modiwl krheoli i glanhau olion nas dymunir y mae'r defnyddiwr yn eu gadael ar y cysawd
+Comment[da]=Privacy - et kcontrol-modul der kan rense systemet for uønskede spor som brugeren efterlader.
+Comment[de]=Privatsphäre: Ein Kontrollmodul, das unerwünschte Spuren von Benutzern auf dem System beseitigt
+Comment[el]=Προσωπικό απόρρητο - ένα άρθρωμα του kcontrol για τον καθαρισμό των ιχνών που ο χρήστης αφήνει στο σύστημα
+Comment[eo]=Privataj aferoj - modulo de la KDEa administrilo, kiu forigas uzantajn spurojn
+Comment[es]=Privacy - un módulo de kcontrol para limpiar pistas que el usuario deja en el sistema sin querer
+Comment[et]=Privaatsus on juhtimismoodul, mis aitab kõrvaldada süsteemist kasutaja jäetud jäljed
+Comment[eu]=Pribatutasuna - Erabiltzaileek sisteman zehar nahi izan gabe uzten dituzten aztarnak garbitzen dituen kcontrol modulua
+Comment[fa]=محرمانگی - یک پیمانه kcontrol برای پاک کردن ردیابیهای ناخواسته، که کاربر در سیستم به جا می‌گذارد.
+Comment[fi]=Yksityisyys - Ohjauskeskuksen moduuli ei-toivottujen jälkien siivoamiseen järjestelmästä
+Comment[fr]=Confidentialité - Un module externe du Centre de configuration pour effacer les traces indésirables qu'un utilisateur laisse sur le système
+Comment[fy]=Privacy - in Konfiguraasjemodule wêrmei jo ûnwenste efterbluiwende sporen fan brûkers wiskje kinne
+Comment[gl]=Intimidade - un módulo de kcontrol para limpar os rastos non desexados que o usuario deixa no sistema
+Comment[he]=פרטיות - מודול ב־kcontrol המשתמש למחיקת עקבות לא רצויים שמשתמש משאיר אחריו במערכת
+Comment[hi]=गोपनीयता- उपयोक्ता द्वारा तंत्र में छोड़े गए अवांछित पदचिह्नों को साफ करने का एक के-कंट्रोल मॉड्यूल
+Comment[hr]=Privatnost - Modul kcontrol za brisanje neželjenih tragova koje su korisnici ostavili na sustavu
+Comment[hu]=A rendszerben létrejött, privát adatok biztonságos törlése
+Comment[is]=Einkamál - stjórneining fyrir kcontrol til að hreinsa burt upplýsingar og gögn sem ekki er æskilegt að verði eftir á vélinni
+Comment[it]=Privacy - un modulo di controllo per cancellare le tracce indesiderate che l'utente lascia nel sistema
+Comment[ja]=システムの利用を終えた後の不要な利用形跡を削除
+Comment[ka]=კონფიდენციალურობა - მოდული kcontrol, წმენდს მომხმარებლის არასასურველ ნაკვალევს სისტემაში
+Comment[kk]=Зиянды пайдаланушының қалдырған іздерді өшіретін kcontrol модулі
+Comment[km]=Privacy - ម៉ូឌុល kcontrol មួយ​ដែល​ប្រើ​ដើម្បី​សម្អាត​ដាន ដែល​អ្នក​ប្រើ​បន្សល់​ទុក​លើ​ប្រព័ន្ធ
+Comment[lt]=Privatumas - kcontrol modulis, padedantis išvalyti nepageidaujamus naudotojo veiklos sistemoje pėdsakus
+Comment[lv]=Privātums - kontrolcentra modulis, kas ļauj iztīrīt nevēlamas pēdas, ko atstāj lietotājs sistēmā
+Comment[mk]=Приватност - kcontrol модул кој ги чисти несаканите траги кои ги остава корисникот на системот
+Comment[mn]=Privacy - систем дэх хэрэглэгчийн хэрэглэхгүй охрисон хог цэвэрлэгчийн хяналтын модул
+Comment[mt]=Privatezza - modulu ta' kcontrol biex tnaddaf traċċi li l-user jista' jħalli fuq is-sistema
+Comment[nb]=Personvern – en kcontrol-modul som fjerner uønskede spor som brukeren etterlater i systemet
+Comment[nds]=Privaatrebeet - Mit dit Moduul kannst Du de Bruuksporen vun't Systeem wegmaken
+Comment[ne]=गोप्यता - प्रयोगकर्ताले प्रणालीमा छोडेका नचाहेका पदचिन्ह हटाउन के नियन्त्रण मोड्युल
+Comment[nl]=Privacy - een configuratiemodule waarmee u ongewenste sporen die gebruikers achterlaten kunt wissen.
+Comment[nn]=Personvern – ein kontrollmodul som fjernar uønskte spor som brukeren etterlèt seg i systemet
+Comment[pa]=ਰਹੱਸ - ਇੱਕ ਕੰਟਰੋਲ ਮੈਡੀਊਲ ਹੈ, ਜੋ ਕਿ ਸਿਸਟਮ 'ਤੇ ਉਪਭੋਗੀ ਦੀ ਨਾ-ਲੋੜੀਦੀ ਪਛਾਣ ਨੂੰ ਸਮਾਪਤ ਕਰਦਾ ਹੈ।
+Comment[pl]=Ustawienia prywatności - moduł, który pozwala usunąć niepożądane ślady pozostawiane przez użytkownika w systemie
+Comment[pt]=Privacidade - um módulo do kcontrol para limpar os registos indesejáveis que o utilizador deixa no sistema
+Comment[pt_BR]=Privacidade - um módulo de controle do KDE para limpar traços não-desejados do usuário no sistema
+Comment[ro]=Șterge urmele nedorite pe care le lasă un utilizator în sistem
+Comment[ru]=Модуль kcontrol, очищающий нежелательные следы, оставленные пользователем в операционной системе
+Comment[rw]=Umwihariko - igice k-igenzura ryo gusiba ibirango bidakenewe ukoresha yasize kuri sisitemu
+Comment[se]=Iežassuodjaleapmi – kcontrolmoduvla mii váldá eret luottaid maid geavaheaddji guođđa vuogádahkii
+Comment[sk]=Modul na vyčistenie nežiadúcich infomácií, ktoré používateľ necháva v systéme
+Comment[sl]=Zasebnost - nadzorni modul, ki počisti nezaželene sledi, ki jih uporabnik pusti na sistemu
+Comment[sr]=Приватност — kcontrol модул који уклања трагове активности корисника на систему
+Comment[sr@Latn]=Privatnost — kcontrol modul koji uklanja tragove aktivnosti korisnika na sistemu
+Comment[sv]=Integritet - en modul i Inställningscentralen för att ta bort oönskade spår användaren lämnat i systemet
+Comment[ta]=தனிப்பட்ட- பயனீட்டாளர் விட்டுவைத்த தேவை இல்லாத சுவடுகளை kcontrol பகுதி நீக்கும்.
+Comment[tg]=Барномаи kcontrol барои тоза кардани дирагуниҳои номатлуб, ки бо корбарон дар система монда шудаанд
+Comment[th]=ความเป็นส่วนตัว - โมดูลของศูนย์ควบคุม KDE ที่จะทำความสะอาดร่องรอยไม่พึงประสงค์ที่ผู้ใช้ปล่อยเอาไว้บนระบบ
+Comment[tr]=Gizlilik - kullanıcının sistemde bıraktığı iztenilmeyen izlemeleri temizleyen kcontrol modülü
+Comment[tt]=Xosusílıq – qullanuçıdan soñ sistem eçendä qalğan ezlär beterüçe kcontrol modulı
+Comment[uk]=Конфіденційність - модуль керування для очищення небажаної інформації залишеної користувачем у системі
+Comment[vi]=Riêng tư - trình điều khiển giúp xoá các dấu vết mà người sử dụng để lại trên hệ thống
+Comment[wa]=Vikereye da vosse - on module di kcontrol po rnetyî les passêyes nén volowes ki l' uzeu leye sol sistinme
+Comment[zh_CN]=隐私 - 清除用户留在系统中痕迹的 kcontrol 模块
+Comment[zh_TW]=隱私權 - 一個控制模組用來清除使用者不希望留在系統中的痕跡
+Exec=kcmshell privacy
+Keywords=Privacy,privacy
+Keywords[ar]=خصوصية، الخصوصية
+Keywords[az]=Gizlilik,gizlilik
+Keywords[be]=Бяспека,Прыватнасць,Privacy,privacy
+Keywords[bg]=анонимност, лична, информация, тайна, Privacy, privacy
+Keywords[br]=Buhez prevez,buhez prevez
+Keywords[bs]=Privacy,privacy,privatnost
+Keywords[ca]=Privacitat,privacitat
+Keywords[cs]=soukromí
+Keywords[csb]=Priwatnosc,prowatno,swòjno, swòjnosc,priwatny nastôw
+Keywords[cy]=Preifatrwydd, preifatrwydd
+Keywords[de]=privatsphäre
+Keywords[el]=Προσωπικό απόρρητο,προσωπικό απόρρητο
+Keywords[eo]=privataj aferoj,privataj aferoj
+Keywords[es]=Privacidad,privacidad
+Keywords[et]=Privaatsus,privaatsus
+Keywords[eu]=Pribatutasuna,pribatutasuna
+Keywords[fa]=محرمانگی، محرمانگی
+Keywords[fi]=Yksityisyys, yksityisyys
+Keywords[fr]=Confidentialité,confidentialité
+Keywords[fy]=privacy
+Keywords[ga]=Príobháideachas,príobháideachas
+Keywords[gl]=Intimidade,intimidade
+Keywords[he]=פרטיות,פרטיות, Privacy,privacy
+Keywords[hi]=गोपनीय,गोपनीयता
+Keywords[hr]=Privacy,privacy,Privatnost,privatnost,privatno
+Keywords[hu]=adatvédelem,adatbiztonság
+Keywords[is]=Privacy,privacy,einkamál
+Keywords[it]=privacy,riservatezza
+Keywords[ja]=プライバシー
+Keywords[km]=ភាព​ឯកជន
+Keywords[lt]=Privacy,privacy,privatumas,Privatumas
+Keywords[lv]=Privāts,privātums
+Keywords[mk]=Privacy,privacy,Приватност,приватност
+Keywords[mt]=Privacy,privacy,privatezza
+Keywords[nb]=personvern,privat
+Keywords[nds]=Privaatrebeet
+Keywords[ne]=गोप्यता, गोप्यता
+Keywords[nl]=privacy
+Keywords[nn]=personvern,privat
+Keywords[pa]=Privacy,ਰਹੱਸ, ਨਿੱਜੀ
+Keywords[pl]=Prywatność,prywatność,ustawienia prywatności
+Keywords[pt]=privacidade
+Keywords[pt_BR]=Privacidade,privacidade
+Keywords[ro]=intimitate
+Keywords[rw]=Umwihariko,umwihariko
+Keywords[se]=Iežassuodjaleapmi,iežassuodjaleapmi
+Keywords[sk]=Privacy,privacy,súkromie
+Keywords[sl]=Zasebnost,zasebnost
+Keywords[sr]=Privacy,privacy,Приватност,приватност,приватно
+Keywords[sr@Latn]=Privacy,privacy,Privatnost,privatnost,privatno
+Keywords[sv]=Integritet,privatliv
+Keywords[ta]=தனிப்பட்ட,தனிப்பட்ட
+Keywords[te]=ప్రైవసి
+Keywords[th]=ความเป็นส่วนตัว
+Keywords[tr]=gizlilik
+Keywords[uk]=Конфіденційність
+Keywords[uz]=Shaxsiy maʼlumot,shaxsiy maʼlumot
+Keywords[uz@cyrillic]=Шахсий маълумот,шахсий маълумот
+Keywords[vi]=Riêng tư,riêng tư
+Keywords[wa]=privé,privêye vikereye,vikerêye da vosse
+Keywords[zh_CN]=Privacy,privacy,隐私
+Keywords[zh_TW]=Privacy,privacy,隱私權
+Name=Privacy
+Name[af]=Privaatheid
+Name[ar]=الخصوصية
+Name[az]=Gizlilik
+Name[be]=Прыватнасць
+Name[bg]=Анонимност
+Name[bn]=প্রাইভেসি
+Name[br]=Buhez prevez
+Name[bs]=Privatnost
+Name[ca]=Privacitat
+Name[cs]=Soukromí
+Name[csb]=Priwatnosc
+Name[cy]=Preifatrwydd
+Name[de]=Privatsphäre
+Name[el]=Προσωπικό απόρρητο
+Name[eo]=Privataj aferoj
+Name[es]=Privacidad
+Name[et]=Privaatsus
+Name[eu]=Pribatutasuna
+Name[fa]=محرمانگی
+Name[fi]=Yksityisyys
+Name[fr]=Confidentialité
+Name[ga]=Príobháideachas
+Name[gl]=Intimidade
+Name[he]=פרטיות
+Name[hi]=गोपनीयता
+Name[hr]=Privatnost
+Name[hu]=Magánjellegű adatok törlése
+Name[is]=Einkamál
+Name[ja]=プライバシー
+Name[ka]=კონფიდენციალურობა
+Name[kk]=Қарақшылыққа қарсылық
+Name[km]=ភាព​ឯកជន
+Name[lt]=Privatumas
+Name[lv]=Privātums
+Name[mk]=Приватност
+Name[ms]=Privasi
+Name[mt]=Privatezza
+Name[nb]=Personvern
+Name[nds]=Privaatrebeet
+Name[ne]=गोप्यता
+Name[nn]=Personvern
+Name[pa]=ਰਹੱਸ
+Name[pl]=Prywatność
+Name[pt]=Privacidade
+Name[pt_BR]=Privacidade
+Name[ro]=Intimitate
+Name[ru]=Конфиденциальность
+Name[rw]=Umwihariko
+Name[se]=Iežassuodjaleapmi
+Name[sk]=Súkromie
+Name[sl]=Zasebnost
+Name[sr]=Приватност
+Name[sr@Latn]=Privatnost
+Name[sv]=Integritet
+Name[ta]=தனிமை
+Name[te]=ప్రైవసి
+Name[th]=ความเป็นส่วนตัว
+Name[tr]=Gizlilik
+Name[tt]=Xosusílıq
+Name[uk]=Конфіденційність
+Name[uz]=Shaxsiy maʼlumot
+Name[uz@cyrillic]=Шахсий маълумот
+Name[vi]=Riêng tư
+Name[wa]=Vikereye da vosse
+Name[zh_CN]=隐私
+Name[zh_TW]=隱私權
+Terminal=false
+Type=Application
+X-KDE-FactoryName=privacy
+X-KDE-Library=privacy
+Categories=Qt;KDE;X-KDE-settings-security;
diff --git a/kcontrol/privacy/privacy.h b/kcontrol/privacy/privacy.h
new file mode 100644
index 000000000..fcec193c7
--- /dev/null
+++ b/kcontrol/privacy/privacy.h
@@ -0,0 +1,74 @@
+/**
+ * privacy.h
+ *
+ * Copyright (c) 2003 Ralf Hoelzer <ralf@well.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _PRIVACY_H_
+#define _PRIVACY_H_
+
+#include <kcmodule.h>
+#include <klistview.h>
+
+#include "kcmprivacydialog.h"
+#include "kprivacymanager.h"
+#include "kprivacysettings.h"
+
+class Privacy: public KCModule
+{
+ Q_OBJECT
+
+public:
+ Privacy( QWidget *parent=0, const char *name=0 );
+ ~Privacy();
+
+ virtual void load();
+ virtual void load(bool useDefaults);
+ virtual void save();
+ virtual void defaults();
+
+public slots:
+ void cleanup();
+ void selectAll();
+ void selectNone();
+
+private:
+ KCMPrivacyDialog *cleaningDialog;
+ KPrivacySettings *p3pSettings;
+ KPrivacyManager *m_privacymanager;
+
+ QPtrList<QCheckListItem> checklist;
+
+ KListViewItem *generalCLI;
+ KListViewItem *webbrowsingCLI;
+
+ QCheckListItem *clearThumbnails;
+ QCheckListItem *clearRunCommandHistory;
+ QCheckListItem *clearAllCookies;
+ QCheckListItem *clearSavedClipboardContents;
+ QCheckListItem *clearWebHistory;
+ QCheckListItem *clearWebCache;
+ QCheckListItem *clearFormCompletion;
+ QCheckListItem *clearRecentDocuments;
+ QCheckListItem *clearQuickStartMenu;
+ QCheckListItem *clearFavIcons;
+ //QCheckListItem *clearFileDialogHistory;
+
+
+};
+
+#endif
diff --git a/kcontrol/randr/Makefile.am b/kcontrol/randr/Makefile.am
new file mode 100644
index 000000000..6707a380d
--- /dev/null
+++ b/kcontrol/randr/Makefile.am
@@ -0,0 +1,36 @@
+AM_CPPFLAGS = $(all_includes)
+
+lib_LTLIBRARIES =
+kde_module_LTLIBRARIES = kcm_randr.la
+
+noinst_LTLIBRARIES = librandrinternal.la
+
+librandrinternal_la_SOURCES = ktimerdialog.cpp randr.cpp
+METASOURCES = AUTO
+
+kcm_randr_la_SOURCES = krandrmodule.cpp
+kcm_randr_la_LDFLAGS = -module -avoid-version $(all_libraries) -no-undefined
+kcm_randr_la_LIBADD = librandrinternal.la $(LIB_KDEUI) $(LIB_XRANDR)
+
+noinst_HEADERS = randr.h krandrmodule.h krandrtray.h krandrapp.h ktimerdialog.h \
+ krandrpassivepopup.h
+
+xdg_apps_DATA = krandrtray.desktop
+
+krandr_data_DATA = randr.desktop
+krandr_datadir = $(kde_appsdir)/.hidden
+
+
+#install-data-local: uninstall.desktop
+# $(mkinstalldirs) $(DESTDIR)$(kde_appsdir)/Settings/Desktop
+# $(INSTALL_DATA) $(srcdir)/uninstall.desktop
+# $(DESTDIR)$(kde_appsdir)/Settings/Desktop/krandrmodule.desktop
+
+bin_PROGRAMS = krandrtray
+
+krandrtray_SOURCES = main.cpp krandrtray.cpp krandrapp.cpp krandrpassivepopup.cpp
+krandrtray_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+krandrtray_LDADD = librandrinternal.la $(LIB_KFILE) $(LIB_KUTILS) $(LIB_XRANDR)
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/krandr.pot
diff --git a/kcontrol/randr/TODO b/kcontrol/randr/TODO
new file mode 100644
index 000000000..1b7e03c3b
--- /dev/null
+++ b/kcontrol/randr/TODO
@@ -0,0 +1,14 @@
+Remaining known issues
+
+General
+ Not tested with multiple screens (but should support them)
+
+Qt
+ Font sizes on newly started apps after a resolution change are incorrect
+ This doesn't appear to happen with non-Xft font rendering, Xft/Qt interaction?
+
+Kwin
+ Support different sized virtual desktops
+
+RandR programs
+ Support configuring different sized virtual desktops
diff --git a/kcontrol/randr/configure.in.in b/kcontrol/randr/configure.in.in
new file mode 100644
index 000000000..24a978198
--- /dev/null
+++ b/kcontrol/randr/configure.in.in
@@ -0,0 +1,18 @@
+dnl -----------------------------------------------------
+dnl X Resize and Rotate extension library check
+dnl -----------------------------------------------------
+
+KDE_CHECK_HEADERS(X11/extensions/Xrandr.h, [xrandr_h=yes], [xrandr_h=no], [#include <X11/Xlib.h>])
+if test "$xrandr_h" = yes; then
+ KDE_CHECK_LIB(Xrandr, XRRSetScreenConfigAndRate, [
+ LIB_XRANDR=-lXrandr
+ AC_DEFINE_UNQUOTED(XRANDR_SUPPORT, 1, [Defined if your system has XRandR support])
+ RANDR_SUBDIR="randr"
+ ], [
+ RANDR_SUBDIR=""
+ ], -lXrender -lXext $X_EXTRA_LIBS)
+else
+ LIB_XRANDR=
+fi
+AC_SUBST(LIB_XRANDR)
+AM_CONDITIONAL(include_kcontrol_randr, test -n "$RANDR_SUBDIR")
diff --git a/kcontrol/randr/krandrapp.cpp b/kcontrol/randr/krandrapp.cpp
new file mode 100644
index 000000000..2d773dd22
--- /dev/null
+++ b/kcontrol/randr/krandrapp.cpp
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2002,2003 Hamish Rodda <rodda@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <kdebug.h>
+
+#include "krandrapp.h"
+#include "krandrapp.moc"
+
+#include "krandrtray.h"
+
+#include <X11/Xlib.h>
+
+KRandRApp::KRandRApp()
+ : m_tray(new KRandRSystemTray(0L, "RANDRTray"))
+{
+ m_tray->show();
+}
+
+bool KRandRApp::x11EventFilter(XEvent* e)
+{
+ if (e->type == m_tray->screenChangeNotifyEvent()) {
+ m_tray->configChanged();
+ }
+ return KApplication::x11EventFilter( e );
+}
diff --git a/kcontrol/randr/krandrapp.h b/kcontrol/randr/krandrapp.h
new file mode 100644
index 000000000..3b8895fc8
--- /dev/null
+++ b/kcontrol/randr/krandrapp.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2002 Hamish Rodda <rodda@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef KRANDRAPP_H
+#define KRANDRAPP_H
+
+#include <kuniqueapplication.h>
+
+class KRandRSystemTray;
+
+class KRandRApp : public KUniqueApplication
+{
+ Q_OBJECT
+
+public:
+ KRandRApp();
+
+ virtual bool x11EventFilter(XEvent * e);
+
+private:
+ KRandRSystemTray* m_tray;
+};
+
+#endif
diff --git a/kcontrol/randr/krandrinithack.cpp b/kcontrol/randr/krandrinithack.cpp
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/kcontrol/randr/krandrinithack.cpp
diff --git a/kcontrol/randr/krandrmodule.cpp b/kcontrol/randr/krandrmodule.cpp
new file mode 100644
index 000000000..d1d7ec73f
--- /dev/null
+++ b/kcontrol/randr/krandrmodule.cpp
@@ -0,0 +1,364 @@
+/*
+ * Copyright (c) 2002,2003 Hamish Rodda <rodda@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qdesktopwidget.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qvbox.h>
+#include <qvbuttongroup.h>
+#include <qwhatsthis.h>
+
+#include <kcmodule.h>
+#include <kcombobox.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kgenericfactory.h>
+#include <kglobal.h>
+#include <klocale.h>
+
+#include "krandrmodule.h"
+#include "krandrmodule.moc"
+
+#include <X11/Xlib.h>
+#include <X11/extensions/Xrandr.h>
+
+// DLL Interface for kcontrol
+typedef KGenericFactory<KRandRModule, QWidget > KSSFactory;
+K_EXPORT_COMPONENT_FACTORY (kcm_randr, KSSFactory("krandr") )
+extern "C"
+
+{
+ KDE_EXPORT void init_randr()
+ {
+ KRandRModule::performApplyOnStartup();
+ }
+
+ KDE_EXPORT bool test_randr()
+ {
+ int eventBase, errorBase;
+ if( XRRQueryExtension(qt_xdisplay(), &eventBase, &errorBase ) )
+ return true;
+ return false;
+ }
+}
+
+void KRandRModule::performApplyOnStartup()
+{
+ KConfig config("kcmrandrrc", true);
+ if (RandRDisplay::applyOnStartup(config))
+ {
+ // Load settings and apply appropriate config
+ RandRDisplay display;
+ if (display.isValid() && display.loadDisplay(config))
+ display.applyProposed(false);
+ }
+}
+
+KRandRModule::KRandRModule(QWidget *parent, const char *name, const QStringList&)
+ : KCModule(parent, name)
+ , m_changed(false)
+{
+ if (!isValid()) {
+ QVBoxLayout *topLayout = new QVBoxLayout(this);
+ topLayout->addWidget(new QLabel(i18n("<qt>Your X server does not support resizing and rotating the display. Please update to version 4.3 or greater. You need the X Resize And Rotate extension (RANDR) version 1.1 or greater to use this feature.</qt>"), this));
+ kdWarning() << "Error: " << errorCode() << endl;
+ return;
+ }
+
+ QVBoxLayout* topLayout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+ QHBox* screenBox = new QHBox(this);
+ topLayout->addWidget(screenBox);
+ QLabel *screenLabel = new QLabel(i18n("Settings for screen:"), screenBox);
+ m_screenSelector = new KComboBox(screenBox);
+
+ for (int s = 0; s < numScreens(); s++) {
+ m_screenSelector->insertItem(i18n("Screen %1").arg(s+1));
+ }
+
+ m_screenSelector->setCurrentItem(currentScreenIndex());
+ screenLabel->setBuddy( m_screenSelector );
+ QWhatsThis::add(m_screenSelector, i18n("The screen whose settings you would like to change can be selected using this drop-down list."));
+
+ connect(m_screenSelector, SIGNAL(activated(int)), SLOT(slotScreenChanged(int)));
+
+ if (numScreens() <= 1)
+ m_screenSelector->setEnabled(false);
+
+ QHBox* sizeBox = new QHBox(this);
+ topLayout->addWidget(sizeBox);
+ QLabel *sizeLabel = new QLabel(i18n("Screen size:"), sizeBox);
+ m_sizeCombo = new KComboBox(sizeBox);
+ QWhatsThis::add(m_sizeCombo, i18n("The size, otherwise known as the resolution, of your screen can be selected from this drop-down list."));
+ connect(m_sizeCombo, SIGNAL(activated(int)), SLOT(slotSizeChanged(int)));
+ sizeLabel->setBuddy( m_sizeCombo );
+
+ QHBox* refreshBox = new QHBox(this);
+ topLayout->addWidget(refreshBox);
+ QLabel *rateLabel = new QLabel(i18n("Refresh rate:"), refreshBox);
+ m_refreshRates = new KComboBox(refreshBox);
+ QWhatsThis::add(m_refreshRates, i18n("The refresh rate of your screen can be selected from this drop-down list."));
+ connect(m_refreshRates, SIGNAL(activated(int)), SLOT(slotRefreshChanged(int)));
+ rateLabel->setBuddy( m_refreshRates );
+
+ m_rotationGroup = new QButtonGroup(2, Qt::Horizontal, i18n("Orientation (degrees counterclockwise)"), this);
+ topLayout->addWidget(m_rotationGroup);
+ m_rotationGroup->setRadioButtonExclusive(true);
+ QWhatsThis::add(m_rotationGroup, i18n("The options in this section allow you to change the rotation of your screen."));
+
+ m_applyOnStartup = new QCheckBox(i18n("Apply settings on KDE startup"), this);
+ topLayout->addWidget(m_applyOnStartup);
+ QWhatsThis::add(m_applyOnStartup, i18n("If this option is enabled the size and orientation settings will be used when KDE starts."));
+ connect(m_applyOnStartup, SIGNAL(clicked()), SLOT(setChanged()));
+
+ QHBox* syncBox = new QHBox(this);
+ syncBox->layout()->addItem(new QSpacerItem(20, 1, QSizePolicy::Maximum));
+ m_syncTrayApp = new QCheckBox(i18n("Allow tray application to change startup settings"), syncBox);
+ topLayout->addWidget(syncBox);
+ QWhatsThis::add(m_syncTrayApp, i18n("If this option is enabled, options set by the system tray applet will be saved and loaded when KDE starts instead of being temporary."));
+ connect(m_syncTrayApp, SIGNAL(clicked()), SLOT(setChanged()));
+
+ topLayout->addStretch(1);
+
+ // just set the "apply settings on startup" box
+ load();
+ m_syncTrayApp->setEnabled(m_applyOnStartup->isChecked());
+
+ slotScreenChanged(QApplication::desktop()->primaryScreen());
+
+ setButtons(KCModule::Apply);
+}
+
+void KRandRModule::addRotationButton(int thisRotation, bool checkbox)
+{
+ Q_ASSERT(m_rotationGroup);
+ if (!checkbox) {
+ QRadioButton* thisButton = new QRadioButton(RandRScreen::rotationName(thisRotation), m_rotationGroup);
+ thisButton->setEnabled(thisRotation & currentScreen()->rotations());
+ connect(thisButton, SIGNAL(clicked()), SLOT(slotRotationChanged()));
+ } else {
+ QCheckBox* thisButton = new QCheckBox(RandRScreen::rotationName(thisRotation), m_rotationGroup);
+ thisButton->setEnabled(thisRotation & currentScreen()->rotations());
+ connect(thisButton, SIGNAL(clicked()), SLOT(slotRotationChanged()));
+ }
+}
+
+void KRandRModule::slotScreenChanged(int screen)
+{
+ setCurrentScreen(screen);
+
+ // Clear resolutions
+ m_sizeCombo->clear();
+
+ // Add new resolutions
+ for (int i = 0; i < currentScreen()->numSizes(); i++) {
+ m_sizeCombo->insertItem(i18n("%1 x %2").arg(currentScreen()->pixelSize(i).width()).arg(currentScreen()->pixelSize(i).height()));
+
+ // Aspect ratio
+ /* , aspect ratio %5)*/
+ /*.arg((double)currentScreen()->size(i).mwidth / (double)currentScreen()->size(i).mheight))*/
+ }
+
+ // Clear rotations
+ for (int i = m_rotationGroup->count() - 1; i >= 0; i--)
+ m_rotationGroup->remove(m_rotationGroup->find(i));
+
+ // Create rotations
+ for (int i = 0; i < RandRScreen::OrientationCount; i++)
+ addRotationButton(1 << i, i > RandRScreen::RotationCount - 1);
+
+ populateRefreshRates();
+
+ update();
+
+ setChanged();
+}
+
+void KRandRModule::slotRotationChanged()
+{
+ if (m_rotationGroup->find(0)->isOn())
+ currentScreen()->proposeRotation(RandRScreen::Rotate0);
+ else if (m_rotationGroup->find(1)->isOn())
+ currentScreen()->proposeRotation(RandRScreen::Rotate90);
+ else if (m_rotationGroup->find(2)->isOn())
+ currentScreen()->proposeRotation(RandRScreen::Rotate180);
+ else {
+ Q_ASSERT(m_rotationGroup->find(3)->isOn());
+ currentScreen()->proposeRotation(RandRScreen::Rotate270);
+ }
+
+ if (m_rotationGroup->find(4)->isOn())
+ currentScreen()->proposeRotation(currentScreen()->proposedRotation() ^ RandRScreen::ReflectX);
+
+ if (m_rotationGroup->find(5)->isOn())
+ currentScreen()->proposeRotation(currentScreen()->proposedRotation() ^ RandRScreen::ReflectY);
+
+ setChanged();
+}
+
+void KRandRModule::slotSizeChanged(int index)
+{
+ int oldProposed = currentScreen()->proposedSize();
+
+ currentScreen()->proposeSize(index);
+
+ if (currentScreen()->proposedSize() != oldProposed) {
+ currentScreen()->proposeRefreshRate(0);
+
+ populateRefreshRates();
+
+ // Item with index zero is already selected
+ }
+
+ setChanged();
+}
+
+void KRandRModule::slotRefreshChanged(int index)
+{
+ currentScreen()->proposeRefreshRate(index);
+
+ setChanged();
+}
+
+void KRandRModule::populateRefreshRates()
+{
+ m_refreshRates->clear();
+
+ QStringList rr = currentScreen()->refreshRates(currentScreen()->proposedSize());
+
+ m_refreshRates->setEnabled(rr.count());
+
+ for (QStringList::Iterator it = rr.begin(); it != rr.end(); ++it)
+ m_refreshRates->insertItem(*it);
+}
+
+
+void KRandRModule::defaults()
+{
+ load( true );
+}
+
+void KRandRModule::load()
+{
+ load( false );
+}
+
+void KRandRModule::load( bool useDefaults )
+{
+ if (!isValid())
+ return;
+
+ // Don't load screen configurations:
+ // It will be correct already if they wanted to retain their settings over KDE restarts,
+ // and if it isn't correct they have changed a) their X configuration, b) the screen
+ // with another program, or c) their hardware.
+ KConfig config("kcmrandrrc", true);
+
+ config.setReadDefaults( useDefaults );
+
+ m_oldApply = loadDisplay(config, false);
+ m_oldSyncTrayApp = syncTrayApp(config);
+
+ m_applyOnStartup->setChecked(m_oldApply);
+ m_syncTrayApp->setChecked(m_oldSyncTrayApp);
+
+ emit changed( useDefaults );
+}
+
+void KRandRModule::save()
+{
+ if (!isValid())
+ return;
+
+ apply();
+
+ m_oldApply = m_applyOnStartup->isChecked();
+ m_oldSyncTrayApp = m_syncTrayApp->isChecked();
+ KConfig config("kcmrandrrc");
+ saveDisplay(config, m_oldApply, m_oldSyncTrayApp);
+
+ setChanged();
+}
+
+void KRandRModule::setChanged()
+{
+ bool isChanged = (m_oldApply != m_applyOnStartup->isChecked()) || (m_oldSyncTrayApp != m_syncTrayApp->isChecked());
+ m_syncTrayApp->setEnabled(m_applyOnStartup->isChecked());
+
+ if (!isChanged)
+ for (int screenIndex = 0; screenIndex < numScreens(); screenIndex++) {
+ if (screen(screenIndex)->proposedChanged()) {
+ isChanged = true;
+ break;
+ }
+ }
+
+ if (isChanged != m_changed) {
+ m_changed = isChanged;
+ emit changed(m_changed);
+ }
+}
+
+void KRandRModule::apply()
+{
+ if (m_changed) {
+ applyProposed();
+
+ update();
+ }
+}
+
+
+void KRandRModule::update()
+{
+ m_sizeCombo->blockSignals(true);
+ m_sizeCombo->setCurrentItem(currentScreen()->proposedSize());
+ m_sizeCombo->blockSignals(false);
+
+ m_rotationGroup->blockSignals(true);
+ switch (currentScreen()->proposedRotation() & RandRScreen::RotateMask) {
+ case RandRScreen::Rotate0:
+ m_rotationGroup->setButton(0);
+ break;
+ case RandRScreen::Rotate90:
+ m_rotationGroup->setButton(1);
+ break;
+ case RandRScreen::Rotate180:
+ m_rotationGroup->setButton(2);
+ break;
+ case RandRScreen::Rotate270:
+ m_rotationGroup->setButton(3);
+ break;
+ default:
+ // Shouldn't hit this one
+ Q_ASSERT(currentScreen()->proposedRotation() & RandRScreen::RotateMask);
+ break;
+ }
+ m_rotationGroup->find(4)->setDown(currentScreen()->proposedRotation() & RandRScreen::ReflectX);
+ m_rotationGroup->find(5)->setDown(currentScreen()->proposedRotation() & RandRScreen::ReflectY);
+ m_rotationGroup->blockSignals(false);
+
+ m_refreshRates->blockSignals(true);
+ m_refreshRates->setCurrentItem(currentScreen()->proposedRefreshRate());
+ m_refreshRates->blockSignals(false);
+}
+
diff --git a/kcontrol/randr/krandrmodule.h b/kcontrol/randr/krandrmodule.h
new file mode 100644
index 000000000..cd50f05d5
--- /dev/null
+++ b/kcontrol/randr/krandrmodule.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2002 Hamish Rodda <rodda@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef KRANDRMODULE_H
+#define KRANDRMODULE_H
+
+#include "randr.h"
+
+class QButtonGroup;
+class KComboBox;
+class QCheckBox;
+
+class KRandRModule : public KCModule, public RandRDisplay
+{
+ Q_OBJECT
+
+public:
+ KRandRModule(QWidget *parent, const char *name, const QStringList& _args);
+
+ virtual void load();
+ virtual void load(bool useDefaults);
+ virtual void save();
+ virtual void defaults();
+
+ static void performApplyOnStartup();
+
+protected slots:
+ void slotScreenChanged(int screen);
+ void slotRotationChanged();
+ void slotSizeChanged(int index);
+ void slotRefreshChanged(int index);
+ void setChanged();
+
+protected:
+ void apply();
+ void update();
+
+ void addRotationButton(int thisRotation, bool checkbox);
+ void populateRefreshRates();
+
+ KComboBox* m_screenSelector;
+ KComboBox* m_sizeCombo;
+ QButtonGroup* m_rotationGroup;
+ KComboBox* m_refreshRates;
+ QCheckBox* m_applyOnStartup;
+ QCheckBox* m_syncTrayApp;
+ bool m_oldApply;
+ bool m_oldSyncTrayApp;
+
+ bool m_changed;
+};
+
+#endif
diff --git a/kcontrol/randr/krandrpassivepopup.cpp b/kcontrol/randr/krandrpassivepopup.cpp
new file mode 100644
index 000000000..858014014
--- /dev/null
+++ b/kcontrol/randr/krandrpassivepopup.cpp
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2003 Lubos Lunak <l.lunak@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "krandrpassivepopup.h"
+
+#include <kapplication.h>
+
+// this class is just like KPassivePopup, but it keeps track of the widget
+// it's supposed to be positioned next to, and adjust its position if that
+// widgets moves (needed because after a resolution switch Kicker will
+// reposition itself, causing normal KPassivePopup to stay at weird places)
+
+KRandrPassivePopup::KRandrPassivePopup( QWidget *parent, const char *name, WFlags f )
+ : KPassivePopup( parent, name, f )
+ {
+ connect( &update_timer, SIGNAL( timeout()), SLOT( slotPositionSelf()));
+ }
+
+KRandrPassivePopup* KRandrPassivePopup::message( const QString &caption, const QString &text,
+ const QPixmap &icon, QWidget *parent, const char *name, int timeout )
+ {
+ KRandrPassivePopup *pop = new KRandrPassivePopup( parent, name );
+ pop->setAutoDelete( true );
+ pop->setView( caption, text, icon );
+ pop->setTimeout( timeout );
+ pop->show();
+ pop->startWatchingWidget( parent );
+ return pop;
+ }
+
+void KRandrPassivePopup::startWatchingWidget( QWidget* widget_P )
+ {
+ static Atom wm_state = XInternAtom( qt_xdisplay() , "WM_STATE", False );
+ Window win = widget_P->winId();
+ bool x11_events = false;
+ for(;;)
+ {
+ Window root, parent;
+ Window* children;
+ unsigned int nchildren;
+ XQueryTree( qt_xdisplay(), win, &root, &parent, &children, &nchildren );
+ if( children != NULL )
+ XFree( children );
+ if( win == root ) // huh?
+ break;
+ win = parent;
+
+ QWidget* widget = QWidget::find( win );
+ if( widget != NULL )
+ {
+ widget->installEventFilter( this );
+ watched_widgets.append( widget );
+ }
+ else
+ {
+ XWindowAttributes attrs;
+ XGetWindowAttributes( qt_xdisplay(), win, &attrs );
+ XSelectInput( qt_xdisplay(), win, attrs.your_event_mask | StructureNotifyMask );
+ watched_windows.append( win );
+ x11_events = true;
+ }
+ Atom type;
+ int format;
+ unsigned long nitems, after;
+ unsigned char* data;
+ if( XGetWindowProperty( qt_xdisplay(), win, wm_state, 0, 0, False, AnyPropertyType,
+ &type, &format, &nitems, &after, &data ) == Success )
+ {
+ if( data != NULL )
+ XFree( data );
+ if( type != None ) // toplevel window
+ break;
+ }
+ }
+ if( x11_events )
+ kapp->installX11EventFilter( this );
+ }
+
+bool KRandrPassivePopup::eventFilter( QObject* o, QEvent* e )
+ {
+ if( e->type() == QEvent::Move && o->isWidgetType()
+ && watched_widgets.contains( static_cast< QWidget* >( o )))
+ QTimer::singleShot( 0, this, SLOT( slotPositionSelf()));
+ return false;
+ }
+
+bool KRandrPassivePopup::x11Event( XEvent* e )
+ {
+ if( e->type == ConfigureNotify && watched_windows.contains( e->xconfigure.window ))
+ {
+ if( !update_timer.isActive())
+ update_timer.start( 10, true );
+ return false;
+ }
+ return KPassivePopup::x11Event( e );
+ }
+
+void KRandrPassivePopup::slotPositionSelf()
+ {
+ positionSelf();
+ }
+
+#include "krandrpassivepopup.moc"
diff --git a/kcontrol/randr/krandrpassivepopup.h b/kcontrol/randr/krandrpassivepopup.h
new file mode 100644
index 000000000..6e86c336c
--- /dev/null
+++ b/kcontrol/randr/krandrpassivepopup.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2003 Lubos Lunak <l.lunak@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RANDRPASSIVEPOPUP_H__
+#define __RANDRPASSIVEPOPUP_H__
+
+#include <kpassivepopup.h>
+#include <qvaluelist.h>
+#include <qtimer.h>
+#include <X11/Xlib.h>
+
+class KRandrPassivePopup
+ : public KPassivePopup
+ {
+ Q_OBJECT
+ public:
+ static KRandrPassivePopup *message( const QString &caption, const QString &text,
+ const QPixmap &icon, QWidget *parent, const char *name=0, int timeout = -1 );
+ protected:
+ virtual bool eventFilter( QObject* o, QEvent* e );
+ virtual bool x11Event( XEvent* e );
+ private slots:
+ void slotPositionSelf();
+ private:
+ KRandrPassivePopup( QWidget *parent=0, const char *name=0, WFlags f=0 );
+ void startWatchingWidget( QWidget* w );
+ QValueList< QWidget* > watched_widgets;
+ QValueList< Window > watched_windows;
+ QTimer update_timer;
+ };
+
+#endif
diff --git a/kcontrol/randr/krandrtray.cpp b/kcontrol/randr/krandrtray.cpp
new file mode 100644
index 000000000..8e80c7cc6
--- /dev/null
+++ b/kcontrol/randr/krandrtray.cpp
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2002,2003 Hamish Rodda <rodda@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <qtimer.h>
+#include <qtooltip.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kcmultidialog.h>
+#include <kdebug.h>
+#include <khelpmenu.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kstdaction.h>
+#include <kstdguiitem.h>
+
+#include "krandrtray.h"
+#include "krandrpassivepopup.h"
+#include "krandrtray.moc"
+
+KRandRSystemTray::KRandRSystemTray(QWidget* parent, const char *name)
+ : KSystemTray(parent, name)
+ , m_popupUp(false)
+ , m_help(new KHelpMenu(this, KGlobal::instance()->aboutData(), false, actionCollection()))
+{
+ setPixmap(KSystemTray::loadIcon("randr"));
+ setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
+ connect(this, SIGNAL(quitSelected()), kapp, SLOT(quit()));
+ QToolTip::add(this, i18n("Screen resize & rotate"));
+}
+
+void KRandRSystemTray::mousePressEvent(QMouseEvent* e)
+{
+ // Popup the context menu with left-click
+ if (e->button() == LeftButton) {
+ contextMenuAboutToShow(contextMenu());
+ contextMenu()->popup(e->globalPos());
+ e->accept();
+ return;
+ }
+
+ KSystemTray::mousePressEvent(e);
+}
+
+void KRandRSystemTray::contextMenuAboutToShow(KPopupMenu* menu)
+{
+ int lastIndex = 0;
+
+ menu->clear();
+ menu->setCheckable(true);
+
+ if (!isValid()) {
+ lastIndex = menu->insertItem(i18n("Required X Extension Not Available"));
+ menu->setItemEnabled(lastIndex, false);
+
+ } else {
+ m_screenPopups.clear();
+ for (int s = 0; s < numScreens() /*&& numScreens() > 1 */; s++) {
+ setCurrentScreen(s);
+ if (s == screenIndexOfWidget(this)) {
+ /*lastIndex = menu->insertItem(i18n("Screen %1").arg(s+1));
+ menu->setItemEnabled(lastIndex, false);*/
+ } else {
+ KPopupMenu* subMenu = new KPopupMenu(menu, QString("screen%1").arg(s+1).latin1());
+ m_screenPopups.append(subMenu);
+ populateMenu(subMenu);
+ lastIndex = menu->insertItem(i18n("Screen %1").arg(s+1), subMenu);
+ connect(subMenu, SIGNAL(activated(int)), SLOT(slotScreenActivated()));
+ }
+ }
+
+ setCurrentScreen(screenIndexOfWidget(this));
+ populateMenu(menu);
+ }
+
+ menu->insertSeparator();
+
+ KAction *actPrefs = new KAction( i18n( "Configure Display..." ),
+ SmallIconSet( "configure" ), KShortcut(), this, SLOT( slotPrefs() ),
+ actionCollection() );
+ actPrefs->plug( menu );
+
+ menu->insertItem(SmallIcon("help"),KStdGuiItem::help().text(), m_help->menu());
+ KAction *quitAction = actionCollection()->action(KStdAction::name(KStdAction::Quit));
+ quitAction->plug(menu);
+}
+
+void KRandRSystemTray::slotScreenActivated()
+{
+ setCurrentScreen(m_screenPopups.find(static_cast<const KPopupMenu*>(sender())));
+}
+
+void KRandRSystemTray::configChanged()
+{
+ refresh();
+
+ static bool first = true;
+
+ if (!first)
+ KRandrPassivePopup::message(
+ i18n("Screen configuration has changed"),
+ currentScreen()->changedMessage(), SmallIcon("window_fullscreen"),
+ this, "ScreenChangeNotification");
+
+ first = false;
+}
+
+void KRandRSystemTray::populateMenu(KPopupMenu* menu)
+{
+ int lastIndex = 0;
+
+ menu->insertTitle(SmallIcon("window_fullscreen"), i18n("Screen Size"));
+
+ int numSizes = currentScreen()->numSizes();
+ int* sizeSort = new int[numSizes];
+
+ for (int i = 0; i < numSizes; i++) {
+ sizeSort[i] = currentScreen()->pixelCount(i);
+ }
+
+ for (int j = 0; j < numSizes; j++) {
+ int highest = -1, highestIndex = -1;
+
+ for (int i = 0; i < numSizes; i++) {
+ if (sizeSort[i] && sizeSort[i] > highest) {
+ highest = sizeSort[i];
+ highestIndex = i;
+ }
+ }
+ sizeSort[highestIndex] = -1;
+ Q_ASSERT(highestIndex != -1);
+
+ lastIndex = menu->insertItem(i18n("%1 x %2").arg(currentScreen()->pixelSize(highestIndex).width()).arg(currentScreen()->pixelSize(highestIndex).height()));
+
+ if (currentScreen()->proposedSize() == highestIndex)
+ menu->setItemChecked(lastIndex, true);
+
+ menu->setItemParameter(lastIndex, highestIndex);
+ menu->connectItem(lastIndex, this, SLOT(slotResolutionChanged(int)));
+ }
+ delete [] sizeSort;
+ sizeSort = 0L;
+
+ // Don't display the rotation options if there is no point (ie. none are supported)
+ // XFree86 4.3 does not include rotation support.
+ if (currentScreen()->rotations() != RandRScreen::Rotate0) {
+ menu->insertTitle(SmallIcon("reload"), i18n("Orientation"));
+
+ for (int i = 0; i < 6; i++) {
+ if ((1 << i) & currentScreen()->rotations()) {
+ lastIndex = menu->insertItem(currentScreen()->rotationIcon(1 << i), RandRScreen::rotationName(1 << i));
+
+ if (currentScreen()->proposedRotation() & (1 << i))
+ menu->setItemChecked(lastIndex, true);
+
+ menu->setItemParameter(lastIndex, 1 << i);
+ menu->connectItem(lastIndex, this, SLOT(slotOrientationChanged(int)));
+ }
+ }
+ }
+
+ QStringList rr = currentScreen()->refreshRates(currentScreen()->proposedSize());
+
+ if (rr.count())
+ menu->insertTitle(SmallIcon("clock"), i18n("Refresh Rate"));
+
+ int i = 0;
+ for (QStringList::Iterator it = rr.begin(); it != rr.end(); ++it, i++) {
+ lastIndex = menu->insertItem(*it);
+
+ if (currentScreen()->proposedRefreshRate() == i)
+ menu->setItemChecked(lastIndex, true);
+
+ menu->setItemParameter(lastIndex, i);
+ menu->connectItem(lastIndex, this, SLOT(slotRefreshRateChanged(int)));
+ }
+}
+
+void KRandRSystemTray::slotResolutionChanged(int parameter)
+{
+ if (currentScreen()->currentSize() == parameter)
+ return;
+
+ currentScreen()->proposeSize(parameter);
+
+ currentScreen()->proposeRefreshRate(-1);
+
+ if (currentScreen()->applyProposedAndConfirm()) {
+ KConfig config("kcmrandrrc");
+ if (syncTrayApp(config))
+ currentScreen()->save(config);
+ }
+}
+
+void KRandRSystemTray::slotOrientationChanged(int parameter)
+{
+ int propose = currentScreen()->currentRotation();
+
+ if (parameter & RandRScreen::RotateMask)
+ propose &= RandRScreen::ReflectMask;
+
+ propose ^= parameter;
+
+ if (currentScreen()->currentRotation() == propose)
+ return;
+
+ currentScreen()->proposeRotation(propose);
+
+ if (currentScreen()->applyProposedAndConfirm()) {
+ KConfig config("kcmrandrrc");
+ if (syncTrayApp(config))
+ currentScreen()->save(config);
+ }
+}
+
+void KRandRSystemTray::slotRefreshRateChanged(int parameter)
+{
+ if (currentScreen()->currentRefreshRate() == parameter)
+ return;
+
+ currentScreen()->proposeRefreshRate(parameter);
+
+ if (currentScreen()->applyProposedAndConfirm()) {
+ KConfig config("kcmrandrrc");
+ if (syncTrayApp(config))
+ currentScreen()->save(config);
+ }
+}
+
+void KRandRSystemTray::slotPrefs()
+{
+ KCMultiDialog *kcm = new KCMultiDialog( KDialogBase::Plain, i18n( "Configure" ), this );
+
+ kcm->addModule( "display" );
+ kcm->setPlainCaption( i18n( "Configure Display" ) );
+ kcm->exec();
+}
diff --git a/kcontrol/randr/krandrtray.desktop b/kcontrol/randr/krandrtray.desktop
new file mode 100644
index 000000000..7cb52a44b
--- /dev/null
+++ b/kcontrol/randr/krandrtray.desktop
@@ -0,0 +1,141 @@
+[Desktop Entry]
+Name=KRandRTray
+Name[be]=Змена параметраў манітора
+Name[hu]=Képernyőfelbontás
+Name[ne]=KRandR ट्रे
+Name[pt_BR]=Ícone do KRandR
+Name[sv]=Krandrtray
+Name[vi]=Khay KRandR
+GenericName=Screen Resize & Rotate
+GenericName[af]=Skerm Hervergroot & Roteer
+GenericName[be]=Змена памераў экрана і перагортванне
+GenericName[bg]=Размер и ротация на екрана
+GenericName[bn]=পর্দা মাপবদল ও আবর্তন
+GenericName[br]=Adventañ ha treiñ ar skramm
+GenericName[bs]=Veličina i rotacija ekrana
+GenericName[ca]=Amida i gira la pantalla
+GenericName[cs]=Změna velikosti a rotace obrazovky
+GenericName[csb]=Òbrócenié ë zjinaka miarë ekranu
+GenericName[cy]=Newid Maint a Cylchdroi'r Sgrîn
+GenericName[da]=Ændr størrelse på skærm & Rotér
+GenericName[de]=Bildschirmgröße & -ausrichtung ändern
+GenericName[el]=Αλλαγή μεγέθους & Περιστροφή οθόνης
+GenericName[eo]=Regrandigi kaj Turni Ekranon
+GenericName[es]=Redimensionar y rotar pantalla
+GenericName[et]=Ekraani suuruse muutmine ja pööramine
+GenericName[eu]=Pantailaren tamaina aldaketa eta biraketa
+GenericName[fa]=تغییر اندازه و چرخش پرده
+GenericName[fi]=Näytön kuvan koon muuttaminen ja kuvan kääntäminen
+GenericName[fr]=Redimensionnement et rotation de l'écran
+GenericName[fy]=Skerm rotearje en grutte wizigje
+GenericName[gl]=Rotación e Redimensionamento da Pantallla
+GenericName[he]=שינוי גודל המסך וסיבובו
+GenericName[hr]=Veličine i orijentacija zaslona
+GenericName[hu]=Képernyőbeállító
+GenericName[is]=Stærð og snúningur skjáa
+GenericName[it]=Ruota e ridimensiona lo schermo
+GenericName[ja]=スクリーンのリサイズと回転
+GenericName[ka]=ეკრანის ზომა და ორიენტაცია
+GenericName[kk]=Экранды өзгерту және бұрау
+GenericName[km]=ប្ដូរ​ទំហំ & បង្វិល​អេក្រង់
+GenericName[ko]=화면 크기 조정 및 회전
+GenericName[lt]=Ekrano dydžio keitimas ir pasukimas
+GenericName[mk]=Големина и ротација на екранот
+GenericName[ms]=Saiz Semula Skrin & Putar
+GenericName[nb]=Endre størrelsen på og rotere skjermbildet
+GenericName[nds]=Schirmgrött un -utrichten ännern
+GenericName[ne]=पर्दा रिसाइज र परिक्रमण
+GenericName[nl]=Scherm roteren en grootte wijzigen
+GenericName[nn]=Endra storleiken på og roter skjermbiletet
+GenericName[pa]=ਪਰਦਾ ਮੁੜ ਆਕਾਰ ਤੇ ਘੁੰਮਾਓ
+GenericName[pl]=Obrót i zmiana rozmiaru ekranu
+GenericName[pt]=Mudar o Tamanho e Rodar o Ecrã
+GenericName[pt_BR]=Redimensionar Tela & Rotacionar
+GenericName[ro]=Redimensionare și rotire ecran
+GenericName[ru]=Изменение размера и ориентации экрана
+GenericName[rw]=Kuhindura ingano & Kuzengurutsa Mugaragaza
+GenericName[se]=Rievdat šearbmagova sturrodaga ja jorat dan
+GenericName[sk]=Zmena veľkosti a otočenia obrazovky
+GenericName[sl]=Spreminjanje velikosti in obračanje zaslona
+GenericName[sr]=Промена величине и ротација екрана
+GenericName[sr@Latn]=Promena veličine i rotacija ekrana
+GenericName[sv]=Ändra skärmstorlek och rotera
+GenericName[ta]=திரை அளவு மாற்று & சுழற்று
+GenericName[tg]=Ивази андоза ва мавқеи экран
+GenericName[th]=ปรับขนาดและหมุนหน้าจอ
+GenericName[tr]=Ekran Boyutlandır ve Döndür
+GenericName[tt]=Küräk Ülçäme & Borılışı
+GenericName[uk]=Зміна розміру та обертання екрана
+GenericName[uz]=Ekraning oʻlchamini oʻzgartirish va burish
+GenericName[uz@cyrillic]=Экранинг ўлчамини ўзгартириш ва буриш
+GenericName[vi]=Thay đổi cỡ màn hình & Quay
+GenericName[wa]=Candjî l' grandeu del waitroûle eyet l' tourner
+GenericName[zh_CN]=屏幕大小和旋转
+GenericName[zh_TW]=螢幕調整大小及旋轉
+Comment=Resize and rotate X screens.
+Comment[af]=Hervergroot en roteer X skerms.
+Comment[ar]=غيير القياس و الدوران للشاشات X.
+Comment[be]=Змена памераў і перагортванне экранаў X.
+Comment[bg]=Размер и ротация на екрана.
+Comment[bn]=আপনার এক্স-স্ক্রীণ-এর আকৃতি এবং দিশা পরিবর্তন করুন
+Comment[br]=Adventañ ha treiñ ho diskweloù X.
+Comment[bs]=Podesite veličinu i rotirajte vaš ekran.
+Comment[ca]=Gira i amida les pantalles X.
+Comment[cs]=Změna velikosti a rotace obrazovky.
+Comment[csb]=Zjinaka miarë ë pòłożenia ekranów.
+Comment[da]=Ændrer størrelse og roterer X-skærme
+Comment[de]=Die Größe und Ausrichtung der Anzeige ändern
+Comment[el]=Αλλαγή μεγέθους και περιστροφή της οθόνης.
+Comment[eo]=Regrandigi kaj turni X ekranojn.
+Comment[es]=Ajustar el tamaño y rotar las pantallas X.
+Comment[et]=X'i ekraani muutmine ja pööramine
+Comment[eu]=Aldatu tamaina eta biratu zure X pantailak.
+Comment[fa]=تغییر‌ اندازه و چرخش پرده‌های X.
+Comment[fi]=Näytön kuvan koon muuttaminen ja kuvan kääntäminen
+Comment[fr]=Redimensionner et retourner votre affichage.
+Comment[fy]=Skermgrutte wizigje en rotearje X skermen
+Comment[ga]=Athraigh an méid agus rothlaigh scáileáin X.
+Comment[gl]=Redimensionar e rotar pantallas
+Comment[he]=שנה את גודלה של התצוגה שלך וסובב אותה.
+Comment[hr]=Promjena veličine i orijentacije X zaslona
+Comment[hu]=A képernyő átméretezése, elforgatása
+Comment[is]=Breyta stærð skjásins og snúa honum.
+Comment[it]=Ridimensiona e ruota gli schermi di X.
+Comment[ja]=X スクリーンのリサイズと回転。
+Comment[ka]=ეკრანის ზომის და ორიენტაციის შეცვლა
+Comment[kk]=Экранның өлшемін және бағытын өзгерту
+Comment[km]=ប្ដូរ​ទំហំ និង​បង្វិល​អេក្រង់ X ។
+Comment[lt]=Keisti X ekrano dydį ir orientaciją.
+Comment[mk]=Сменете ја големината и ротацијата на вашиот екран
+Comment[nb]=Endrer størrelsen på og roterer X-skjermbildet
+Comment[nds]=Grött un Utrichten vun den X-Schirm ännern
+Comment[ne]=X पर्दा रिसाइज गर्नुहोस् र घुमाउनुहोस्
+Comment[nl]=Scherm roteren en van grootte veranderen
+Comment[nn]=Endra storleiken på og roter X-skjermbiletet.
+Comment[pa]=X ਸਕਰੀਨ ਨੂੰ ਮੁੜ-ਅਕਾਰ ਅਤੇ ਘੁੰਮਾਓ।
+Comment[pl]=Zmiana rozmiaru i orientacji ekranów.
+Comment[pt]=Mudar o tamanho e rodar os ecrãs do X.
+Comment[pt_BR]=Redimensiona e rotaciona as tela do X.
+Comment[ro]=Redimensionează și rotește ecranele X.
+Comment[ru]=Изменение размера и ориентации экранов X.
+Comment[se]=Rievdat X-šearpmaid sturrodaga ja joraheami.
+Comment[sk]=Zmení veľkosť a otočí obrazovky
+Comment[sl]=Spremenite velikost in obrnite zaslon.
+Comment[sr]=Промените величину и оријентацију екрана
+Comment[sr@Latn]=Promenite veličinu i orijentaciju ekrana
+Comment[sv]=Storleksändring och rotation av X-skärmar.
+Comment[tg]=Ивази андоза ва мавқеи экранҳои Х.
+Comment[th]=ปรับแต่งการแสดงผลของ X
+Comment[tr]=Ekranı boyutlandır ve çevir.
+Comment[uk]=Зміна розміру та обертання екранів X.
+Comment[uz]=Ekraning oʻlchamini oʻzgartirish va burish
+Comment[uz@cyrillic]=Экранинг ўлчамини ўзгартириш ва буриш
+Comment[vi]=Đổi cỡ và quay màn hình X.
+Comment[wa]=Candjî l' grandeu eyet tourner les waitroûles X.
+Comment[zh_CN]=更改 X 屏幕的大小和旋转。
+Comment[zh_TW]=調整大小及旋轉 X 螢幕。
+Exec=krandrtray
+Icon=randr
+Type=Application
+OnlyShowIn=KDE;
+Categories=Qt;KDE;System;
diff --git a/kcontrol/randr/krandrtray.h b/kcontrol/randr/krandrtray.h
new file mode 100644
index 000000000..829306437
--- /dev/null
+++ b/kcontrol/randr/krandrtray.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2002 Hamish Rodda <rodda@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef KRANDRTRAY_H
+#define KRANDRTRAY_H
+
+#include <qptrlist.h>
+
+#include <ksystemtray.h>
+
+#include "randr.h"
+
+class KHelpMenu;
+class KPopupMenu;
+
+class KRandRSystemTray : public KSystemTray, public RandRDisplay
+{
+ Q_OBJECT
+
+public:
+ KRandRSystemTray(QWidget* parent = 0, const char *name = 0);
+
+ virtual void contextMenuAboutToShow(KPopupMenu* menu);
+
+ void configChanged();
+
+protected slots:
+ void slotScreenActivated();
+ void slotResolutionChanged(int parameter);
+ void slotOrientationChanged(int parameter);
+ void slotRefreshRateChanged(int parameter);
+ void slotPrefs();
+
+protected:
+ void mousePressEvent( QMouseEvent *e );
+
+private:
+ void populateMenu(KPopupMenu* menu);
+
+ bool m_popupUp;
+ KHelpMenu* m_help;
+ QPtrList<KPopupMenu> m_screenPopups;
+};
+
+#endif
diff --git a/kcontrol/randr/ktimerdialog.cpp b/kcontrol/randr/ktimerdialog.cpp
new file mode 100644
index 000000000..071088e9b
--- /dev/null
+++ b/kcontrol/randr/ktimerdialog.cpp
@@ -0,0 +1,205 @@
+/*
+ * This file is part of the KDE Libraries
+ * Copyright (C) 2002 Hamish Rodda <rodda@kde.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <qhbox.h>
+#include <qlayout.h>
+#include <qvbox.h>
+#include <qtimer.h>
+#include <qprogressbar.h>
+#include <qlabel.h>
+
+#include <kwin.h>
+#include <kiconloader.h>
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include "ktimerdialog.h"
+#include "ktimerdialog.moc"
+
+KTimerDialog::KTimerDialog( int msec, TimerStyle style, QWidget *parent,
+ const char *name, bool modal,
+ const QString &caption,
+ int buttonMask, ButtonCode defaultButton,
+ bool separator,
+ const KGuiItem &user1,
+ const KGuiItem &user2,
+ const KGuiItem &user3 )
+ : KDialogBase(parent, name, modal, caption, buttonMask, defaultButton,
+ separator, user1, user2, user3 )
+{
+ totalTimer = new QTimer( this );
+ updateTimer = new QTimer( this );
+ msecTotal = msecRemaining = msec;
+ updateInterval = 1000;
+ tStyle = style;
+ KWin::setIcons( winId(), DesktopIcon("randr"), SmallIcon("randr") );
+ // default to cancelling the dialog on timeout
+ if ( buttonMask & Cancel )
+ buttonOnTimeout = Cancel;
+
+ connect( totalTimer, SIGNAL( timeout() ), SLOT( slotInternalTimeout() ) );
+ connect( updateTimer, SIGNAL( timeout() ), SLOT( slotUpdateTime() ) );
+
+ // create the widgets
+ mainWidget = new QVBox( this, "mainWidget" );
+ timerWidget = new QHBox( mainWidget, "timerWidget" );
+ timerLabel = new QLabel( timerWidget );
+ timerProgress = new QProgressBar( timerWidget );
+ timerProgress->setTotalSteps( msecTotal );
+ timerProgress->setPercentageVisible( false );
+
+ KDialogBase::setMainWidget( mainWidget );
+
+ slotUpdateTime( false );
+}
+
+KTimerDialog::~KTimerDialog()
+{
+}
+
+void KTimerDialog::show()
+{
+ KDialogBase::show();
+ totalTimer->start( msecTotal, true );
+ updateTimer->start( updateInterval, false );
+}
+
+int KTimerDialog::exec()
+{
+ totalTimer->start( msecTotal, true );
+ updateTimer->start( updateInterval, false );
+ return KDialogBase::exec();
+}
+
+void KTimerDialog::setMainWidget( QWidget *widget )
+{
+ // yuck, here goes.
+ QVBox *newWidget = new QVBox( this );
+
+ if ( widget->parentWidget() != mainWidget ) {
+ widget->reparent( newWidget, 0, QPoint(0,0) );
+ } else {
+ newWidget->insertChild( widget );
+ }
+
+ timerWidget->reparent( newWidget, 0, QPoint(0, 0) );
+
+ delete mainWidget;
+ mainWidget = newWidget;
+ KDialogBase::setMainWidget( mainWidget );
+}
+
+void KTimerDialog::setRefreshInterval( int msec )
+{
+ updateInterval = msec;
+ if ( updateTimer->isActive() )
+ updateTimer->changeInterval( updateInterval );
+}
+
+int KTimerDialog::timeoutButton() const
+{
+ return buttonOnTimeout;
+}
+
+void KTimerDialog::setTimeoutButton( const ButtonCode newButton )
+{
+ buttonOnTimeout = newButton;
+}
+
+int KTimerDialog::timerStyle() const
+{
+ return tStyle;
+}
+
+void KTimerDialog::setTimerStyle( const TimerStyle newStyle )
+{
+ tStyle = newStyle;
+}
+
+void KTimerDialog::slotUpdateTime( bool update )
+{
+ if ( update )
+ switch ( tStyle ) {
+ case CountDown:
+ msecRemaining -= updateInterval;
+ break;
+ case CountUp:
+ msecRemaining += updateInterval;
+ break;
+ case Manual:
+ break;
+ }
+
+ timerProgress->setProgress( msecRemaining );
+
+ timerLabel->setText( i18n("1 second remaining:","%n seconds remaining:",msecRemaining/1000) );
+}
+
+void KTimerDialog::slotInternalTimeout()
+{
+ emit timerTimeout();
+ switch ( buttonOnTimeout ) {
+ case Help:
+ slotHelp();
+ break;
+ case Default:
+ slotDefault();
+ break;
+ case Ok:
+ slotOk();
+ break;
+ case Apply:
+ applyPressed();
+ break;
+ case Try:
+ slotTry();
+ break;
+ case Cancel:
+ slotCancel();
+ break;
+ case Close:
+ slotClose();
+ break;
+ /*case User1:
+ slotUser1();
+ break;
+ case User2:
+ slotUser2();
+ break;*/
+ case User3:
+ slotUser3();
+ break;
+ case No:
+ slotNo();
+ break;
+ case Yes:
+ slotCancel();
+ break;
+ case Details:
+ slotDetails();
+ break;
+ case Filler:
+ case Stretch:
+ kdDebug() << "Cannot execute button code " << buttonOnTimeout << endl;
+ break;
+ }
+}
diff --git a/kcontrol/randr/ktimerdialog.h b/kcontrol/randr/ktimerdialog.h
new file mode 100644
index 000000000..23b4a92b0
--- /dev/null
+++ b/kcontrol/randr/ktimerdialog.h
@@ -0,0 +1,170 @@
+/*
+ * This file is part of the KDE Libraries
+ * Copyright (C) 2002 Hamish Rodda <rodda@kde.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+#ifndef _KTIMERDIALOG_H_
+#define _KTIMERDIALOG_H_
+
+#include <kdialogbase.h>
+
+class QTimer;
+class QHBox;
+class QProgressBar;
+class QLabel;
+
+/**
+ * Provides a dialog that is only available for a specified amount
+ * of time, and reports the time remaining to the user.
+ *
+ * The timer is capable of counting up or down, for any number of milliseconds.
+ *
+ * The button which is activated upon timeout can be specified, as can the
+ * update interval for the dialog box.
+ *
+ * In addition, this class retains all of the functionality of @see KDialogBase .
+ *
+ * @short A dialog with a time limit and corresponding UI features.
+ * @author Hamish Rodda <rodda@kde.org>
+ */
+class KTimerDialog : public KDialogBase
+{
+ Q_OBJECT
+
+ public:
+
+ /**
+ * @li @p CountDown - The timer counts downwards from the seconds given.
+ * @li @p CountUp - The timer counts up to the number of seconds given.
+ * @li @p Manual - The timer is not invoked; the caller must update the
+ * progress.
+ */
+ enum TimerStyle
+ {
+ CountDown,
+ CountUp,
+ Manual
+ };
+
+ /**
+ * Constructor for the standard mode where you must specify the main
+ * widget with @ref setMainWidget() . See @see KDialogBase for further details.
+ *
+ * For the rest of the arguments, See @see KDialogBase .
+ */
+ KTimerDialog( int msec, TimerStyle style=CountDown, QWidget *parent=0,
+ const char *name=0, bool modal=true,
+ const QString &caption=QString::null,
+ int buttonMask=Ok|Apply|Cancel, ButtonCode defaultButton=Ok,
+ bool separator=false,
+ const KGuiItem &user1=KGuiItem(),
+ const KGuiItem &user2=KGuiItem(),
+ const KGuiItem &user3=KGuiItem() );
+
+ /**
+ * Destructor.
+ */
+ ~KTimerDialog();
+
+ /**
+ * Execute the dialog modelessly - see @see QDialog .
+ */
+ virtual void show();
+
+ /**
+ * Set the refresh interval for the timer progress. Defaults to one second.
+ */
+ void setRefreshInterval( int msec );
+
+ /**
+ * Retrieves the @ref ButtonCode which will be activated once the timer
+ * times out. @see setTimeoutButton
+ */
+ int timeoutButton() const;
+
+ /**
+ * Sets the @ref ButtonCode to determine which button will be activated
+ * once the timer times out. @see timeoutButton
+ */
+ void setTimeoutButton( ButtonCode newButton );
+
+ /**
+ * Retrieves the current @ref TimerStyle. @see setTimerStyle
+ */
+ int timerStyle() const;
+
+ /**
+ * Sets the @ref TimerStyle. @see timerStyle
+ */
+ void setTimerStyle( TimerStyle newStyle );
+
+ /**
+ * Overridden function which is used to set the main widget of the dialog.
+ * @see KDialogBase::setMainWidget.
+ */
+ void setMainWidget( QWidget *widget );
+
+ signals:
+ /**
+ * Signal which is emitted once the timer has timed out.
+ */
+ void timerTimeout();
+
+ public slots:
+ /**
+ * Execute the dialog modally - see @see QDialog .
+ */
+ int exec();
+
+ private slots:
+ /**
+ * Updates the dialog with the current progress levels.
+ */
+ void slotUpdateTime( bool update = true );
+
+ /**
+ * The internal
+ */
+ void slotInternalTimeout();
+
+ private:
+ /**
+ * Prepares the layout that manages the widgets of the dialog
+ */
+ void setupLayout();
+
+ QTimer *totalTimer;
+ QTimer *updateTimer;
+ int msecRemaining, updateInterval, msecTotal;
+
+ ButtonCode buttonOnTimeout;
+ TimerStyle tStyle;
+
+ QHBox *timerWidget;
+ QProgressBar *timerProgress;
+ QLabel *timerLabel;
+ QVBox *mainWidget;
+
+ class KTimerDialogPrivate;
+ KTimerDialogPrivate *d;
+};
+
+#endif
+
+
+
diff --git a/kcontrol/randr/main.cpp b/kcontrol/randr/main.cpp
new file mode 100644
index 000000000..f2de7f146
--- /dev/null
+++ b/kcontrol/randr/main.cpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2002,2003 Hamish Rodda <rodda@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <stdlib.h>
+#include <kdebug.h>
+
+#include <klocale.h>
+#include <kcmdlineargs.h>
+#include <kaboutdata.h>
+#include <kglobal.h>
+
+#include "krandrapp.h"
+
+static const char krandrtrayVersion[] = "0.5";
+static const KCmdLineOptions options[] =
+{
+ { "login", I18N_NOOP("Application is being auto-started at KDE session start"), 0L },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ KAboutData aboutData("randr", I18N_NOOP("Resize and Rotate"), krandrtrayVersion, I18N_NOOP("Resize and Rotate System Tray App"), KAboutData::License_GPL, "(c) 2002,2003 Hamish Rodda", 0L, "");
+ aboutData.addAuthor("Hamish Rodda",I18N_NOOP("Maintainer"), "rodda@kde.org");
+ aboutData.addCredit("Lubos Lunak",I18N_NOOP("Many fixes"), "l.lunak@suse.cz");
+ aboutData.setProductName("krandr/krandrtray");
+ KGlobal::locale()->setMainCatalogue("krandr");
+
+ KCmdLineArgs::init(argc,argv,&aboutData);
+ KCmdLineArgs::addCmdLineOptions(options);
+ KApplication::addCmdLineOptions();
+
+ KRandRApp app;
+
+ return app.exec();
+}
diff --git a/kcontrol/randr/randr.cpp b/kcontrol/randr/randr.cpp
new file mode 100644
index 000000000..63c5c0450
--- /dev/null
+++ b/kcontrol/randr/randr.cpp
@@ -0,0 +1,703 @@
+/*
+ * Copyright (c) 2002,2003 Hamish Rodda <rodda@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "randr.h"
+
+#include <qtimer.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <dcopclient.h>
+#include <kipc.h>
+#include <kactivelabel.h>
+
+#include "ktimerdialog.h"
+
+#include <X11/Xlib.h>
+#define INT8 _X11INT8
+#define INT32 _X11INT32
+#include <X11/Xproto.h>
+#undef INT8
+#undef INT32
+#include <X11/extensions/Xrandr.h>
+
+class RandRScreenPrivate
+{
+public:
+ RandRScreenPrivate() : config(0L) {};
+ ~RandRScreenPrivate()
+ {
+ if (config)
+ XRRFreeScreenConfigInfo(config);
+ }
+
+ XRRScreenConfiguration* config;
+};
+
+RandRScreen::RandRScreen(int screenIndex)
+ : d(new RandRScreenPrivate())
+ , m_screen(screenIndex)
+ , m_shownDialog(NULL)
+{
+ loadSettings();
+ setOriginal();
+}
+
+RandRScreen::~RandRScreen()
+{
+ delete d;
+}
+
+void RandRScreen::loadSettings()
+{
+ if (d->config)
+ XRRFreeScreenConfigInfo(d->config);
+
+ d->config = XRRGetScreenInfo(qt_xdisplay(), RootWindow(qt_xdisplay(), m_screen));
+ Q_ASSERT(d->config);
+
+ Rotation rotation;
+ m_currentSize = m_proposedSize = XRRConfigCurrentConfiguration(d->config, &rotation);
+ m_currentRotation = m_proposedRotation = rotation;
+
+ m_pixelSizes.clear();
+ m_mmSizes.clear();
+ int numSizes;
+ XRRScreenSize* sizes = XRRSizes(qt_xdisplay(), m_screen, &numSizes);
+ for (int i = 0; i < numSizes; i++) {
+ m_pixelSizes.append(QSize(sizes[i].width, sizes[i].height));
+ m_mmSizes.append(QSize(sizes[i].mwidth, sizes[i].mheight));
+ }
+
+ m_rotations = XRRRotations(qt_xdisplay(), m_screen, &rotation);
+
+ m_currentRefreshRate = m_proposedRefreshRate = refreshRateHzToIndex(m_currentSize, XRRConfigCurrentRate(d->config));
+}
+
+void RandRScreen::setOriginal()
+{
+ m_originalSize = m_currentSize;
+ m_originalRotation = m_currentRotation;
+ m_originalRefreshRate = m_currentRefreshRate;
+}
+
+bool RandRScreen::applyProposed()
+{
+ //kdDebug() << k_funcinfo << " size " << (SizeID)proposedSize() << ", rotation " << proposedRotation() << ", refresh " << refreshRateIndexToHz(proposedSize(), proposedRefreshRate()) << endl;
+
+ Status status;
+
+ if (proposedRefreshRate() < 0)
+ status = XRRSetScreenConfig(qt_xdisplay(), d->config, DefaultRootWindow(qt_xdisplay()), (SizeID)proposedSize(), (Rotation)proposedRotation(), CurrentTime);
+ else {
+ if( refreshRateIndexToHz(proposedSize(), proposedRefreshRate()) <= 0 ) {
+ m_proposedRefreshRate = 0;
+ }
+ status = XRRSetScreenConfigAndRate(qt_xdisplay(), d->config, DefaultRootWindow(qt_xdisplay()), (SizeID)proposedSize(), (Rotation)proposedRotation(), refreshRateIndexToHz(proposedSize(), proposedRefreshRate()), CurrentTime);
+ }
+
+ //kdDebug() << "New size: " << WidthOfScreen(ScreenOfDisplay(QPaintDevice::x11AppDisplay(), screen)) << ", " << HeightOfScreen(ScreenOfDisplay(QPaintDevice::x11AppDisplay(), screen)) << endl;
+
+ if (status == RRSetConfigSuccess) {
+ m_currentSize = m_proposedSize;
+ m_currentRotation = m_proposedRotation;
+ m_currentRefreshRate = m_proposedRefreshRate;
+ return true;
+ }
+
+ return false;
+}
+
+bool RandRScreen::applyProposedAndConfirm()
+{
+ if (proposedChanged()) {
+ setOriginal();
+
+ if (applyProposed()) {
+ if (!confirm()) {
+ proposeOriginal();
+ applyProposed();
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool RandRScreen::confirm()
+{
+ // uncomment the line below and edit out the KTimerDialog stuff to get
+ // a version which works on today's kdelibs (no accept dialog is presented)
+
+ // FIXME remember to put the dialog on the right screen
+
+ KTimerDialog acceptDialog ( 15000, KTimerDialog::CountDown,
+ KApplication::kApplication()->mainWidget(),
+ "mainKTimerDialog",
+ true,
+ i18n("Confirm Display Setting Change"),
+ KTimerDialog::Ok|KTimerDialog::Cancel,
+ KTimerDialog::Cancel);
+
+ acceptDialog.setButtonOK(KGuiItem(i18n("&Accept Configuration"), "button_ok"));
+ acceptDialog.setButtonCancel(KGuiItem(i18n("&Return to Previous Configuration"), "button_cancel"));
+
+ KActiveLabel *label = new KActiveLabel(i18n("Your screen orientation, size and refresh rate "
+ "have been changed to the requested settings. Please indicate whether you wish to "
+ "keep this configuration. In 15 seconds the display will revert to your previous "
+ "settings."), &acceptDialog, "userSpecifiedLabel");
+
+ acceptDialog.setMainWidget(label);
+
+ KDialog::centerOnScreen(&acceptDialog, m_screen);
+
+ m_shownDialog = &acceptDialog;
+ connect( m_shownDialog, SIGNAL( destroyed()), this, SLOT( shownDialogDestroyed()));
+ connect( kapp->desktop(), SIGNAL( resized(int)), this, SLOT( desktopResized()));
+
+ return acceptDialog.exec();
+}
+
+void RandRScreen::shownDialogDestroyed()
+{
+ m_shownDialog = NULL;
+ disconnect( kapp->desktop(), SIGNAL( resized(int)), this, SLOT( desktopResized()));
+}
+
+void RandRScreen::desktopResized()
+{
+ if( m_shownDialog != NULL )
+ KDialog::centerOnScreen(m_shownDialog, m_screen);
+}
+
+QString RandRScreen::changedMessage() const
+{
+ if (currentRefreshRate() == -1)
+ return i18n("New configuration:\nResolution: %1 x %2\nOrientation: %3")
+ .arg(currentPixelWidth())
+ .arg(currentPixelHeight())
+ .arg(currentRotationDescription());
+ else
+ return i18n("New configuration:\nResolution: %1 x %2\nOrientation: %3\nRefresh rate: %4")
+ .arg(currentPixelWidth())
+ .arg(currentPixelHeight())
+ .arg(currentRotationDescription())
+ .arg(currentRefreshRateDescription());
+}
+
+bool RandRScreen::changedFromOriginal() const
+{
+ return m_currentSize != m_originalSize || m_currentRotation != m_originalRotation || m_currentRefreshRate != m_originalRefreshRate;
+}
+
+void RandRScreen::proposeOriginal()
+{
+ m_proposedSize = m_originalSize;
+ m_proposedRotation = m_originalRotation;
+ m_proposedRefreshRate = m_originalRefreshRate;
+}
+
+bool RandRScreen::proposedChanged() const
+{
+ return m_currentSize != m_proposedSize || m_currentRotation != m_proposedRotation || m_currentRefreshRate != m_proposedRefreshRate;
+}
+
+QString RandRScreen::rotationName(int rotation, bool pastTense, bool capitalised)
+{
+ if (!pastTense)
+ switch (rotation) {
+ case RR_Rotate_0:
+ return i18n("Normal");
+ case RR_Rotate_90:
+ return i18n("Left (90 degrees)");
+ case RR_Rotate_180:
+ return i18n("Upside-down (180 degrees)");
+ case RR_Rotate_270:
+ return i18n("Right (270 degrees)");
+ case RR_Reflect_X:
+ return i18n("Mirror horizontally");
+ case RR_Reflect_Y:
+ return i18n("Mirror vertically");
+ default:
+ return i18n("Unknown orientation");
+ }
+
+ switch (rotation) {
+ case RR_Rotate_0:
+ return i18n("Normal");
+ case RR_Rotate_90:
+ return i18n("Rotated 90 degrees counterclockwise");
+ case RR_Rotate_180:
+ return i18n("Rotated 180 degrees counterclockwise");
+ case RR_Rotate_270:
+ return i18n("Rotated 270 degrees counterclockwise");
+ default:
+ if (rotation & RR_Reflect_X)
+ if (rotation & RR_Reflect_Y)
+ if (capitalised)
+ return i18n("Mirrored horizontally and vertically");
+ else
+ return i18n("mirrored horizontally and vertically");
+ else
+ if (capitalised)
+ return i18n("Mirrored horizontally");
+ else
+ return i18n("mirrored horizontally");
+ else if (rotation & RR_Reflect_Y)
+ if (capitalised)
+ return i18n("Mirrored vertically");
+ else
+ return i18n("mirrored vertically");
+ else
+ if (capitalised)
+ return i18n("Unknown orientation");
+ else
+ return i18n("unknown orientation");
+ }
+}
+
+QPixmap RandRScreen::rotationIcon(int rotation) const
+{
+ // Adjust icons for current screen orientation
+ if (!(m_currentRotation & RR_Rotate_0) && rotation & (RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270)) {
+ int currentAngle = m_currentRotation & (RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270);
+ switch (currentAngle) {
+ case RR_Rotate_90:
+ rotation <<= 3;
+ break;
+ case RR_Rotate_180:
+ rotation <<= 2;
+ break;
+ case RR_Rotate_270:
+ rotation <<= 1;
+ break;
+ }
+
+ // Fix overflow
+ if (rotation > RR_Rotate_270) {
+ rotation >>= 4;
+ }
+ }
+
+ switch (rotation) {
+ case RR_Rotate_0:
+ return SmallIcon("up");
+ case RR_Rotate_90:
+ return SmallIcon("back");
+ case RR_Rotate_180:
+ return SmallIcon("down");
+ case RR_Rotate_270:
+ return SmallIcon("forward");
+ case RR_Reflect_X:
+ case RR_Reflect_Y:
+ default:
+ return SmallIcon("stop");
+ }
+}
+
+QString RandRScreen::currentRotationDescription() const
+{
+ QString ret = rotationName(m_currentRotation & RotateMask);
+
+ if (m_currentRotation != m_currentRotation & RotateMask)
+ if (m_currentRotation & RR_Rotate_0)
+ ret = rotationName(m_currentRotation & (RR_Reflect_X + RR_Reflect_X), true, true);
+ else
+ ret += ", " + rotationName(m_currentRotation & (RR_Reflect_X + RR_Reflect_X), true, false);
+
+ return ret;
+}
+
+int RandRScreen::rotationIndexToDegree(int rotation) const
+{
+ switch (rotation & RotateMask) {
+ case RR_Rotate_90:
+ return 90;
+
+ case RR_Rotate_180:
+ return 180;
+
+ case RR_Rotate_270:
+ return 270;
+
+ default:
+ return 0;
+ }
+}
+
+int RandRScreen::rotationDegreeToIndex(int degree) const
+{
+ switch (degree) {
+ case 90:
+ return RR_Rotate_90;
+
+ case 180:
+ return RR_Rotate_180;
+
+ case 270:
+ return RR_Rotate_270;
+
+ default:
+ return RR_Rotate_0;
+ }
+}
+
+int RandRScreen::currentPixelWidth() const
+{
+ return m_pixelSizes[m_currentSize].width();
+}
+
+int RandRScreen::currentPixelHeight() const
+{
+ return m_pixelSizes[m_currentSize].height();
+}
+
+int RandRScreen::currentMMWidth() const
+{
+ return m_pixelSizes[m_currentSize].width();
+}
+
+int RandRScreen::currentMMHeight() const
+{
+ return m_pixelSizes[m_currentSize].height();
+}
+
+QStringList RandRScreen::refreshRates(int size) const
+{
+ int nrates;
+ short* rates = XRRRates(qt_xdisplay(), m_screen, (SizeID)size, &nrates);
+
+ QStringList ret;
+ for (int i = 0; i < nrates; i++)
+ ret << refreshRateDirectDescription(rates[i]);
+
+ return ret;
+}
+
+QString RandRScreen::refreshRateDirectDescription(int rate) const
+{
+ return i18n("Refresh rate in Hertz (Hz)", "%1 Hz").arg(rate);
+}
+
+QString RandRScreen::refreshRateIndirectDescription(int size, int index) const
+{
+ return i18n("Refresh rate in Hertz (Hz)", "%1 Hz").arg(refreshRateIndexToHz(size, index));
+}
+
+QString RandRScreen::refreshRateDescription(int size, int index) const
+{
+ return refreshRates(size)[index];
+}
+
+bool RandRScreen::proposeRefreshRate(int index)
+{
+ if (index >= 0 && (int)refreshRates(proposedSize()).count() > index) {
+ m_proposedRefreshRate = index;
+ return true;
+ }
+
+ return false;
+}
+
+int RandRScreen::currentRefreshRate() const
+{
+ return m_currentRefreshRate;
+}
+
+QString RandRScreen::currentRefreshRateDescription() const
+{
+ return refreshRateIndirectDescription(m_currentSize, m_currentRefreshRate);
+}
+
+int RandRScreen::proposedRefreshRate() const
+{
+ return m_proposedRefreshRate;
+}
+
+int RandRScreen::refreshRateHzToIndex(int size, int hz) const
+{
+ int nrates;
+ short* rates = XRRRates(qt_xdisplay(), m_screen, (SizeID)size, &nrates);
+
+ for (int i = 0; i < nrates; i++)
+ if (hz == rates[i])
+ return i;
+
+ if (nrates != 0)
+ // Wrong input Hz!
+ Q_ASSERT(false);
+
+ return -1;
+}
+
+int RandRScreen::refreshRateIndexToHz(int size, int index) const
+{
+ int nrates;
+ short* rates = XRRRates(qt_xdisplay(), m_screen, (SizeID)size, &nrates);
+
+ if (nrates == 0 || index < 0)
+ return 0;
+
+ // Wrong input Hz!
+ if(index >= nrates)
+ return 0;
+
+ return rates[index];
+}
+
+int RandRScreen::numSizes() const
+{
+ return m_pixelSizes.count();
+}
+
+const QSize& RandRScreen::pixelSize(int index) const
+{
+ return m_pixelSizes[index];
+}
+
+const QSize& RandRScreen::mmSize(int index) const
+{
+ return m_mmSizes[index];
+}
+
+int RandRScreen::sizeIndex(QSize pixelSize) const
+{
+ for (uint i = 0; i < m_pixelSizes.count(); i++)
+ if (m_pixelSizes[i] == pixelSize)
+ return i;
+
+ return -1;
+}
+
+int RandRScreen::rotations() const
+{
+ return m_rotations;
+}
+
+int RandRScreen::currentRotation() const
+{
+ return m_currentRotation;
+}
+
+int RandRScreen::currentSize() const
+{
+ return m_currentSize;
+}
+
+int RandRScreen::proposedRotation() const
+{
+ return m_proposedRotation;
+}
+
+void RandRScreen::proposeRotation(int newRotation)
+{
+ m_proposedRotation = newRotation & OrientationMask;
+}
+
+int RandRScreen::proposedSize() const
+{
+ return m_proposedSize;
+}
+
+bool RandRScreen::proposeSize(int newSize)
+{
+ if ((int)m_pixelSizes.count() > newSize) {
+ m_proposedSize = newSize;
+ return true;
+ }
+
+ return false;
+}
+
+void RandRScreen::load(KConfig& config)
+{
+ config.setGroup(QString("Screen%1").arg(m_screen));
+
+ if (proposeSize(sizeIndex(QSize(config.readNumEntry("width", currentPixelWidth()), config.readNumEntry("height", currentPixelHeight())))))
+ proposeRefreshRate(refreshRateHzToIndex(proposedSize(), config.readNumEntry("refresh", currentRefreshRate())));
+
+ proposeRotation(rotationDegreeToIndex(config.readNumEntry("rotation", 0)) + (config.readBoolEntry("reflectX") ? ReflectX : 0) + (config.readBoolEntry("reflectY") ? ReflectY : 0));
+}
+
+void RandRScreen::save(KConfig& config) const
+{
+ config.setGroup(QString("Screen%1").arg(m_screen));
+ config.writeEntry("width", currentPixelWidth());
+ config.writeEntry("height", currentPixelHeight());
+ config.writeEntry("refresh", refreshRateIndexToHz(currentSize(), currentRefreshRate()));
+ config.writeEntry("rotation", rotationIndexToDegree(currentRotation()));
+ config.writeEntry("reflectX", (bool)(currentRotation() & ReflectMask) == ReflectX);
+ config.writeEntry("reflectY", (bool)(currentRotation() & ReflectMask) == ReflectY);
+}
+
+RandRDisplay::RandRDisplay()
+ : m_valid(true)
+{
+ // Check extension
+ Status s = XRRQueryExtension(qt_xdisplay(), &m_eventBase, &m_errorBase);
+ if (!s) {
+ m_errorCode = QString("%1, base %1").arg(s).arg(m_errorBase);
+ m_valid = false;
+ return;
+ }
+
+ int major_version, minor_version;
+ XRRQueryVersion(qt_xdisplay(), &major_version, &minor_version);
+
+ m_version = QString("X Resize and Rotate extension version %1.%1").arg(major_version).arg(minor_version);
+
+ m_numScreens = ScreenCount(qt_xdisplay());
+
+ // This assumption is WRONG with Xinerama
+ // Q_ASSERT(QApplication::desktop()->numScreens() == ScreenCount(qt_xdisplay()));
+
+ m_screens.setAutoDelete(true);
+ for (int i = 0; i < m_numScreens; i++) {
+ m_screens.append(new RandRScreen(i));
+ }
+
+ setCurrentScreen(QApplication::desktop()->primaryScreen());
+}
+
+bool RandRDisplay::isValid() const
+{
+ return m_valid;
+}
+
+const QString& RandRDisplay::errorCode() const
+{
+ return m_errorCode;
+}
+
+int RandRDisplay::eventBase() const
+{
+ return m_eventBase;
+}
+
+int RandRDisplay::screenChangeNotifyEvent() const
+{
+ return m_eventBase + RRScreenChangeNotify;
+}
+
+int RandRDisplay::errorBase() const
+{
+ return m_errorBase;
+}
+
+const QString& RandRDisplay::version() const
+{
+ return m_version;
+}
+
+void RandRDisplay::setCurrentScreen(int index)
+{
+ m_currentScreenIndex = index;
+ m_currentScreen = m_screens.at(m_currentScreenIndex);
+ Q_ASSERT(m_currentScreen);
+}
+
+int RandRDisplay::screenIndexOfWidget(QWidget* widget)
+{
+ int ret = QApplication::desktop()->screenNumber(widget);
+ return ret != -1 ? ret : QApplication::desktop()->primaryScreen();
+}
+
+int RandRDisplay::currentScreenIndex() const
+{
+ return m_currentScreenIndex;
+}
+
+void RandRDisplay::refresh()
+{
+ for (RandRScreen* s = m_screens.first(); s; s = m_screens.next())
+ s->loadSettings();
+}
+
+int RandRDisplay::numScreens() const
+{
+ return m_numScreens;
+}
+
+RandRScreen* RandRDisplay::screen(int index)
+{
+ return m_screens.at(index);
+}
+
+RandRScreen* RandRDisplay::currentScreen()
+{
+ return m_currentScreen;
+}
+
+bool RandRDisplay::loadDisplay(KConfig& config, bool loadScreens)
+{
+ if (loadScreens)
+ for (RandRScreen* s = m_screens.first(); s; s = m_screens.next())
+ s->load(config);
+
+ return applyOnStartup(config);
+}
+
+bool RandRDisplay::applyOnStartup(KConfig& config)
+{
+ config.setGroup("Display");
+ return config.readBoolEntry("ApplyOnStartup", false);
+}
+
+bool RandRDisplay::syncTrayApp(KConfig& config)
+{
+ config.setGroup("Display");
+ return config.readBoolEntry("SyncTrayApp", false);
+}
+
+void RandRDisplay::saveDisplay(KConfig& config, bool applyOnStartup, bool syncTrayApp)
+{
+ Q_ASSERT(!config.isReadOnly());
+
+ config.setGroup("Display");
+ config.writeEntry("ApplyOnStartup", applyOnStartup);
+ config.writeEntry("SyncTrayApp", syncTrayApp);
+
+ for (RandRScreen* s = m_screens.first(); s; s = m_screens.next())
+ s->save(config);
+}
+
+void RandRDisplay::applyProposed(bool confirm)
+{
+ for (int screenIndex = 0; screenIndex < numScreens(); screenIndex++) {
+ if (screen(screenIndex)->proposedChanged()) {
+ if (confirm)
+ screen(screenIndex)->applyProposedAndConfirm();
+ else
+ screen(screenIndex)->applyProposed();
+ }
+ }
+}
+
+int RandRScreen::pixelCount( int index ) const
+{
+ QSize sz = pixelSize(index);
+ return sz.width() * sz.height();
+}
+
+#include "randr.moc"
diff --git a/kcontrol/randr/randr.desktop b/kcontrol/randr/randr.desktop
new file mode 100644
index 000000000..f67165d20
--- /dev/null
+++ b/kcontrol/randr/randr.desktop
@@ -0,0 +1,216 @@
+[Desktop Entry]
+Icon=randr
+Type=Application
+Exec=kcmshell randr
+X-KDE-Library=randr
+#X-KDE-Init=randr
+X-KDE-Test-Module=true
+
+Name=Size & Orientation
+Name[af]=Grootte & Ooriëntasie
+Name[ar]=القياس و الإتجاه
+Name[be]=Памеры і арыентацыя
+Name[bg]=Размер и ротация на екрана
+Name[bn]=আকৃতি এবং দিশা
+Name[br]=Ment ha reteradur
+Name[bs]=Veličina i orijentacija
+Name[ca]=Mida i orientació
+Name[cs]=Velikost a orientace
+Name[csb]=Miara ë pòłóżenié
+Name[cy]=Maint & Cyfeiriad
+Name[da]=Størrelse & Orientering
+Name[de]=Größe & Orientierung
+Name[el]=Μέγεθος & Προσανατολισμός
+Name[eo]=Grandeco kaj direkto
+Name[es]=Tamaño y orientación
+Name[et]=Suurus ja orientatsioon
+Name[eu]=Tamaina eta orientazioa
+Name[fa]=اندازه و جهت
+Name[fi]=Koko ja suunta
+Name[fr]=Taille et orientation
+Name[fy]=Grutte en oriïntaasje
+Name[ga]=Méid agus Treoshuíomh
+Name[gl]=Tamaño e Orientación
+Name[he]=גודל וכיוון
+Name[hi]=आकार व दिशा निर्धारण
+Name[hr]=Veličina i orijentacija
+Name[hu]=Képernyőfelbontás
+Name[is]=Stærð og snúningur
+Name[it]=Dimensione e orientazione
+Name[ja]=サイズと配置
+Name[ka]=ზომა და ორიენტაცია
+Name[kk]=Өлшем және бағыт
+Name[km]=ទំហំ & ទិស
+Name[ko]=해상도와 회전
+Name[lt]=Dydis ir orientacija
+Name[lv]=Izmērs un orientācija
+Name[mk]=Големина и ориентација
+Name[mn]=Хэмжээ & Чиглэл
+Name[ms]=Saiz & Orientasi
+Name[mt]=Daqs u Orjentazzjoni
+Name[nb]=Størrelse og retning
+Name[nds]=Grött & Utrichten
+Name[ne]=साइज र अभिमुखीकरण
+Name[nl]=Grootte en oriëntatie
+Name[nn]=Storleik og retning
+Name[pa]=ਆਕਾਰ ਅਤੇ ਸਥਿਤੀ
+Name[pl]=Rozmiar i orientacja
+Name[pt]=Tamanho e Orientação
+Name[pt_BR]=Tamanho & Orientação
+Name[ro]=Mărime și orientare
+Name[ru]=Размер и ориентация
+Name[rw]=Ingano & Icyerekezo
+Name[se]=Sturrodat ja joraheapmi
+Name[sk]=Veľkosť a orientácia
+Name[sl]=Velikost in orientacija
+Name[sr]=Величина и оријентација
+Name[sr@Latn]=Veličina i orijentacija
+Name[sv]=Storlek och orientering
+Name[ta]=அளவும் திசையும்
+Name[tg]=Андоза ва шиносоӣ
+Name[th]=ขนาดและการวางแนว
+Name[tr]=Konum ve Boyut
+Name[tt]=Ülçäm belän Yünälü
+Name[uk]=Розмір та орієнтація
+Name[uz]=Oʻlchami va joylashishi
+Name[uz@cyrillic]=Ўлчами ва жойлашиши
+Name[vi]=Cỡ & Hướng
+Name[wa]=Grandeu eyet oryintåcion
+Name[zh_CN]=大小和方向
+Name[zh_TW]=尺寸及定位
+
+Comment=Resize and Rotate your display
+Comment[af]=Hervergroot en Roteer jou skerm
+Comment[ar]=غيّر القياس و دوران شاشتك
+Comment[be]=Змяняе памеры і перагортвае ваш экран
+Comment[bg]=Настройване на размера и завъртането на екрана
+Comment[bn]=আপনার ডিসপ্লের আকৃতি এবং দিশা পরিবর্তন করুন
+Comment[br]=Adventañ ha treiñ ho skramm
+Comment[bs]=Podesite veličinu i rotirajte vaš ekran
+Comment[ca]=Amida i gira la vostra pantalla
+Comment[cs]=Změna velikosti a rotace obrazovky
+Comment[csb]=Zjinaka miarë ë pòłożenia ekranu
+Comment[cy]=Newid Maint a Cylchdroi eich dangosydd
+Comment[da]=Ændrer størrelse og roterer din visning
+Comment[de]=Die Größe und Ausrichtung der Anzeige ändern
+Comment[el]=Αλλαγή μεγέθους και Περιστροφή της οθόνης σας
+Comment[eo]=Grandigi kaj turni vian ekranblokon
+Comment[es]=Ajustar el tamaño y rotar la pantalla
+Comment[et]=Oma vaate suuruse muutmine ja pööramine
+Comment[eu]=Aldatu tamaina eta biratu zure pantaila
+Comment[fa]=تغییر اندازه و چرخش صفحه نمایش شما
+Comment[fi]=Resoluution muuttaminen ja ruudun kääntäminen
+Comment[fr]=Redimensionner et Tourner votre affichage
+Comment[fy]=Wizigje it skermgrutte en rotearje dizze
+Comment[gl]=Redimensionar e rotar a sua pantalla
+Comment[he]=שנה את גודלה של התצוגה שלך וסובב אותה
+Comment[hi]=अपने शक्ल-सूरत(डिस्प्ले) का आकार बदलें तथा घुमाएँ
+Comment[hr]=Promijena veličine i orijentacije zaslona
+Comment[hu]=A képernyő átméretezése, elforgatása
+Comment[is]=Breyta stærð skjásins og snúa honum
+Comment[it]=Ridimensiona e ruota il tuo display
+Comment[ja]=ディスプレイのリサイズと回転
+Comment[ka]=ეკრანის ზომის და ორიენტაციის შეცვლა
+Comment[kk]=Дисплейдің өлшемін және бағытын өзгерту
+Comment[km]=ប្ដូរ​ទំហំ និង​បង្វិល​ការ​បង្ហាញ​របស់​អ្នក
+Comment[ko]=디스플레이의 크기와 방향 조정
+Comment[lt]=Keisti ekrano dydį ir orientaciją
+Comment[lv]=Maina izmēru un rotē Jūsu ekrānu
+Comment[mk]=Сменете ја големината и ротацијата на вашиот екран
+Comment[mn]=Дэлгэцийнхээ хэмжээг өөрчилөх ба эргүүлэх
+Comment[ms]=Saiz Semula dan Putar paparan anda
+Comment[mt]=Ibdel id-daqs jew dawwar l-iskrin
+Comment[nb]=Endre størrelsen på og rotere skjermbildet
+Comment[nds]=Grött un Utrichten vun den Schirm ännern
+Comment[ne]=तपाईँको प्रदर्शन रिसाइज गर्नुहोस् र घुमाउनुहोस्
+Comment[nl]=Wijzig de schermgrootte en roteer deze
+Comment[nn]=Endra storleiken på og roter skjermbiletet
+Comment[pa]=ਆਪਣੀ ਝਲਕ ਨੂੰ ਮੁੜ-ਆਕਾਰ ਕਰੋ ਤੇ ਘੁੰਮਾਓ
+Comment[pl]=Zmiana rozmiaru i orientacji ekranu
+Comment[pt]=Dimensione e rode o seu ecrã
+Comment[pt_BR]=Redimensiona e Rotaciona a sua tela
+Comment[ro]=Redimensionează și rotește ecranul dumneavoastră
+Comment[ru]=Изменение размера и ориентации экрана
+Comment[rw]=Guhindura ingano no Kuzengurutsa iyerekana ryawe
+Comment[se]=Rievdat šearpma sturrodaga ja joraheami
+Comment[sk]=Zmení veľkosť a otočí váš displej
+Comment[sl]=Spremenite velikost in obrnite zaslon
+Comment[sr]=Промените величину и оријентацију вашег екрана
+Comment[sr@Latn]=Promenite veličinu i orijentaciju vašeg ekrana
+Comment[sv]=Storleksändring och rotation av skärmen
+Comment[ta]=தங்கள் காட்சியை அளவு மாற்று மற்றும் சுழற்று
+Comment[tg]=Андозаи намоиши худро дигаргун созед ва чаппа кунед
+Comment[th]=ปรับแต่งการแสดงผลของคุณ
+Comment[tr]=Ekranı boyutlandır ve çevir
+Comment[tt]=Kürägeñneñ Ülçäme belän Borılışı
+Comment[uk]=Зміна розміру та обертання дисплею
+Comment[uz]=Ekraning oʻlchamini oʻzgartirish va burish
+Comment[uz@cyrillic]=Экранинг ўлчамини ўзгартириш ва буриш
+Comment[vi]=Đổi cỡ và Quay màn hình của bạn
+Comment[wa]=Candjî l' grandeu eyet tourner li håynaedje
+Comment[zh_CN]=更改显示大小和旋转显示
+Comment[zh_TW]=調整大小及旋轉你的螢幕
+
+Keywords=resize,rotate,display,color,depth,size,horizontal,vertical
+Keywords[ar]=تغيير حجم، تدوير، لف، عرض، لون، عمق، حجم، أفقي، عمودي
+Keywords[be]=Змена памеру,Перагортванне,Дысплей,Экран,Колер,Глыбіня,Памер,Гарызантальны,Вертыкальны,resize,rotate,display,color,depth,size,horizontal,vertical
+Keywords[bg]=ротация, завъртане, екран, размер, промяна, resize, rotate, display, color, depth, size, horizontal, vertical
+Keywords[bs]=resize,rotate,display,color,depth,size,horizontal,vertical,veličina,rotacija,ekran,boja,dubina,uspravno,vodoravno
+Keywords[ca]=amida,gira,pantalla,color,profunditat,mida,horitzontal,vertical
+Keywords[cs]=velikost,rotace,obrazovka,barva,hloubka,horizontální,vertikální
+Keywords[csb]=zjinaka miarë,òbrócenié,pòłożenié,miara,ekran,farwa,farwë,głãbòkòsc farwów,wielëna farwów,knôdno,hòrizontalno
+Keywords[cy]=newid maint,cylchdroi,dangos,lliw,dyfnder,maint,llorweddol,fertigol
+Keywords[da]=ændr,rotér,visning,farve,dybde,størrelse,vandret,lodret
+Keywords[de]=Größe ändern,rotieren,anzeigen,Farbe,Tiefe,Größe,horizontal,vertikal,waagrecht,senkrecht
+Keywords[el]=αλλαγή μεγέθους,περιστροφή,οθόνη,χρώμα,βάθος,μέγεθος,οριζόντια,κατακόρυφα
+Keywords[en_GB]=resize,rotate,display,colour,depth,size,horizontal,vertical
+Keywords[eo]=grandigi,turni,direkto,ekrano,ekranbloko,grandeco,koloro,horizontala,vertikala
+Keywords[es]=redimensionar,rotar,mostrar,color,colores,tamaño,horizontal,vertical
+Keywords[et]=suuruse muutmine,pööramine,monitor,ekraan,värv,sügavus,suurus,horisontaalne,vertikaalne
+Keywords[eu]=tamaina aldatu,biratu,pantaila,kolorea,sakonera,tamaina,horizontala, bertikala
+Keywords[fa]=تغییر اندازه، چرخش، نمایش، رنگ، عمق، اندازه، افقی، عمودی
+Keywords[fi]=vaihda kokoa,käännä,näyttö,väri,syvyys,koko,vaakasuora,pystysuora
+Keywords[fr]=redimensionner,rotation,affichage,couleur,profondeur,taille, horizontal,vertical
+Keywords[fy]=grutte wizigje,rotearje,draaie,display,byldskerm,skerm,monitor,djipte,grutte,horizontaal,vertikaal
+Keywords[ga]=athraigh méid,rothlaigh,scáileán,dath,doimhneacht,méid,cothrománach,ingearach
+Keywords[gl]=redimensionar,rotar,pantalla,cor,resolución,tamaño,horizontal,vertical
+Keywords[he]=שנה גודל,סובב,תצוגה,צבע,עומק,גודל,אופקי,אנכי, resize,rotate,display,color,depth,size,horizontal,vertical
+Keywords[hi]=नया-आकार,घुमाएँ,प्रकटन,रंग,गहराई,आकार,आड़ा,खड़ा
+Keywords[hr]=resize,rotate,display,color,depth,size,horizontal,vertical,promjena,veličina,rotacija,zaslon,boja,dubina,vodoravno,uspravno
+Keywords[hu]=átméretezés,elforgatás,képernyő,szín,színmélység,vízszintes,függőleges
+Keywords[is]=resize,rotate,display,color,depth,size,horizontal,vertical,stækka,minnka,snúa
+Keywords[it]=ridimensiona,ruota,schermo,colori,profondità di colore,dimensione,orizzontale,verticale
+Keywords[ja]=リサイズ,回転,ディスプレイ,色,深度,サイズ,水平,垂直
+Keywords[km]=ប្ដូរ​ទំហំ,បង្វិល,បង្ហាញ,ពណ៌,ជម្រៅ,ទំហំ,ផ្ដេក,បញ្ឈរ
+Keywords[lt]=resize,rotate,display,color,depth,size,horizontal,vertical,keisti dydį,pasukti,sukti,ekranas,spalva,gylis,dydis,horizontalus,vertikalus
+Keywords[lv]=mainīt izmēru,rotēt,ekrāns,krāsa,dziļums,izmērs,horizontāls,vertikāls
+Keywords[mk]=resize,rotate,display,color,depth,size,horizontal,vertical,смени големина,ротира,прикажи,екран,боја,длабочина,големина,хоризонтално,вертикално
+Keywords[mn]=хэмжээ өөрчилөх,эргүүлэх,дэлгэц,өнгө,гүн,хэмжээ,хэвтээ,босоо
+Keywords[nb]=størrelse,rotere,skjerm,farge,dybde,vannrett,loddrett
+Keywords[nds]=Grött ännern,dreihen,display,Dorstellen,Klöör,Deep,Grött,waagrecht,pielliek
+Keywords[ne]=रिसाइज, घुमाउनुहोस्, प्रदर्शन, गहिराइ, साइज, तेर्सो, ठाडो
+Keywords[nl]=grootte wijzigen,roteren,draaien,display,beeldscherm,scherm,monitor,diepte,grootte,horizontaal,verticaal
+Keywords[nn]=storleik,rotera,skjerm,farge,djupn,vassrett,loddrett
+Keywords[pa]=ਮੁੜ-ਅਕਾਰ,ਘੁੰਮਾਉ,ਝਲਕ,ਰੰਗ,ਡੂੰਘਾਈ,ਅਕਾਰ,ਖਿਤਿਜੀ,ਲੰਬਕਾਰੀ
+Keywords[pl]=zmiana rozmiaru,obrót,orientacja,rozmiar,ekran,kolor,kolory,głębokość kolorów,liczba kolorów,pionowo,poziomo
+Keywords[pt]=redimensionar,rodar,ecrã,cor,profundidade,tamanho,horizontal,vertical
+Keywords[pt_BR]=redimensionar,rotacionar,display,cor,produndidade,tamanho,horizontal,vertical
+Keywords[ro]=redimensionare,rotire,ecran,monitor,culoare,adîncime,mărime,orizontal,vertical
+Keywords[ru]=resize,rotate,display,color,depth,size,horizontal,vertical,экран
+Keywords[rw]=guhindura ingano,kuzengurutsa,kwerekana,ibara,ubujyakuzimu,ingano,bitambitse,bihagaritse
+Keywords[se]=sturrodat,jorahit,šearbma,ivdni,čikŋodat,láskut,ceaggut
+Keywords[sk]=zmena veľkosti,rotácia,displej,farba,hĺbka,veľkosť,horizontálne,vertikálne
+Keywords[sl]=spremeni,velikost,zavrti,zaslon,barva,globina,navpičn,vodoravn
+Keywords[sr]=resize,rotate,display,color,depth,size,horizontal,vertical,промена,величина,ротација,екран,боја,дубина,водоравно,усправно
+Keywords[sr@Latn]=resize,rotate,display,color,depth,size,horizontal,vertical,promena,veličina,rotacija,ekran,boja,dubina,vodoravno,uspravno
+Keywords[sv]=ändra storlek,rotera,skärm,färg,djup,storlek,horisontell,vertikal
+Keywords[ta]=அளவுமாற்று, சுழற்று, காட்டு,வண்ணம், ஆழம்,அளவு,இடவலம்,மேலிருந்து கீழ்
+Keywords[th]=ปรับขนาด,หมุน,จอภาพ,สี,ความลึก,ขนาด,แนวราบ,แนวดิ่ง
+Keywords[tr]=boyutlandır,çevir,görünüm,renk,derinlik,boyut,dikey,yatay
+Keywords[uk]=зміна розміру,розмір,обертання,дисплей,колір,глибина,горизонтальний,вертикальний
+Keywords[uz]=oʻlchamini oʻzgartirish,burish,ekran,rang,chuqurlik,oʻlcham,gorizantal,vertikal
+Keywords[uz@cyrillic]=ўлчамини ўзгартириш,буриш,экран,ранг,чуқурлик,ўлчам,горизантал,вертикал
+Keywords[vi]=đổi cỡ,quay,hiển thị,màu,độ sâu,cỡ,ngang,dọc
+Keywords[wa]=candjî l' grandeu,tourner,håynaedje,coleur,parfondeu,grandeu,di coûtchî,d' astampé
+Keywords[zh_CN]=resize,rotate,display,color,depth,size,horizontal,vertical,更改大小,旋转,显示,颜色,深度,大小,垂直,水平
+Keywords[zh_TW]=resize,rotate,display,color,depth,size,horizontal,vertical,調整大小,旋轉,螢幕,顏色,深度,尺寸,垂直,水平
diff --git a/kcontrol/randr/randr.h b/kcontrol/randr/randr.h
new file mode 100644
index 000000000..c7eb240cf
--- /dev/null
+++ b/kcontrol/randr/randr.h
@@ -0,0 +1,235 @@
+/*
+ * Copyright (c) 2002,2003 Hamish Rodda <rodda@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __RANDR_H__
+#define __RANDR_H__
+
+#include <qobject.h>
+#include <qstringlist.h>
+#include <qptrlist.h>
+
+#include <kcmodule.h>
+#include <kconfig.h>
+
+class KTimerDialog;
+class RandRScreenPrivate;
+
+class RandRScreen : public QObject
+{
+ Q_OBJECT
+
+public:
+ enum orientations {
+ Rotate0 = 0x1,
+ Rotate90 = 0x2,
+ Rotate180 = 0x4,
+ Rotate270 = 0x8,
+ RotateMask = 15,
+ RotationCount = 4,
+ ReflectX = 0x10,
+ ReflectY = 0x20,
+ ReflectMask = 48,
+ OrientationMask = 63,
+ OrientationCount = 6
+ };
+
+ RandRScreen(int screenIndex);
+ ~RandRScreen();
+
+ void loadSettings();
+ void setOriginal();
+
+ bool applyProposed();
+
+ /**
+ * @returns false if the user did not confirm in time, or cancelled, or the change failed
+ */
+ bool applyProposedAndConfirm();
+
+public slots:
+ bool confirm();
+
+public:
+ QString changedMessage() const;
+
+ bool changedFromOriginal() const;
+ void proposeOriginal();
+
+ bool proposedChanged() const;
+
+ static QString rotationName(int rotation, bool pastTense = false, bool capitalised = true);
+ QPixmap rotationIcon(int rotation) const;
+ QString currentRotationDescription() const;
+
+ int rotationIndexToDegree(int rotation) const;
+ int rotationDegreeToIndex(int degree) const;
+
+ /**
+ * Refresh rate functions.
+ */
+ QStringList refreshRates(int size) const;
+
+ QString refreshRateDirectDescription(int rate) const;
+ QString refreshRateIndirectDescription(int size, int index) const;
+ QString refreshRateDescription(int size, int index) const;
+
+ int currentRefreshRate() const;
+ QString currentRefreshRateDescription() const;
+
+ // Refresh rate hz <==> index conversion
+ int refreshRateHzToIndex(int size, int hz) const;
+ int refreshRateIndexToHz(int size, int index) const;
+
+ /**
+ * Screen size functions.
+ */
+ int numSizes() const;
+ const QSize& pixelSize(int index) const;
+ const QSize& mmSize(int index) const;
+ int pixelCount(int index) const;
+
+ /**
+ * Retrieve the index of a screen size with a specified pixel size.
+ *
+ * @param pixelSize dimensions of the screen in pixels
+ * @returns the index of the requested screen size
+ */
+ int sizeIndex(QSize pixelSize) const;
+
+ int rotations() const;
+
+ /**
+ * Current setting functions.
+ */
+ int currentPixelWidth() const;
+ int currentPixelHeight() const;
+ int currentMMWidth() const;
+ int currentMMHeight() const;
+
+ int currentRotation() const;
+ int currentSize() const;
+
+ /**
+ * Proposed setting functions.
+ */
+ int proposedSize() const;
+ bool proposeSize(int newSize);
+
+ int proposedRotation() const;
+ void proposeRotation(int newRotation);
+
+ int proposedRefreshRate() const;
+ /**
+ * Propose a refresh rate.
+ * Please note that you must propose the target size first for this to work.
+ *
+ * @param index the index of the refresh rate (not a refresh rate in hz!)
+ * @returns true if successful, false otherwise.
+ */
+ bool proposeRefreshRate(int index);
+
+ /**
+ * Configuration functions.
+ */
+ void load(KConfig& config);
+ void save(KConfig& config) const;
+
+private:
+ RandRScreenPrivate* d;
+
+ int m_screen;
+
+ QValueList<QSize> m_pixelSizes;
+ QValueList<QSize> m_mmSizes;
+ int m_rotations;
+
+ int m_originalRotation;
+ int m_originalSize;
+ int m_originalRefreshRate;
+
+ int m_currentRotation;
+ int m_currentSize;
+ int m_currentRefreshRate;
+
+ int m_proposedRotation;
+ int m_proposedSize;
+ int m_proposedRefreshRate;
+
+ KTimerDialog* m_shownDialog;
+
+private slots:
+ void desktopResized();
+ void shownDialogDestroyed();
+};
+
+typedef QPtrList<RandRScreen> ScreenList;
+
+class RandRDisplay
+{
+public:
+ RandRDisplay();
+
+ bool isValid() const;
+ const QString& errorCode() const;
+ const QString& version() const;
+
+ int eventBase() const;
+ int screenChangeNotifyEvent() const;
+ int errorBase() const;
+
+ int screenIndexOfWidget(QWidget* widget);
+
+ int numScreens() const;
+ RandRScreen* screen(int index);
+
+ void setCurrentScreen(int index);
+ int currentScreenIndex() const;
+ RandRScreen* currentScreen();
+
+ void refresh();
+
+ /**
+ * Loads saved settings.
+ *
+ * @param config the KConfig object to load from
+ * @param loadScreens whether to call RandRScreen::load() for each screen
+ * @retuns true if the settings should be applied on KDE startup.
+ */
+ bool loadDisplay(KConfig& config, bool loadScreens = true);
+ void saveDisplay(KConfig& config, bool applyOnStartup, bool syncTrayApp);
+
+ static bool applyOnStartup(KConfig& config);
+ static bool syncTrayApp(KConfig& config);
+
+ void applyProposed(bool confirm = true);
+
+private:
+ int m_numScreens;
+ int m_currentScreenIndex;
+ RandRScreen* m_currentScreen;
+ ScreenList m_screens;
+
+ bool m_valid;
+ QString m_errorCode;
+ QString m_version;
+
+ int m_eventBase;
+ int m_errorBase;
+};
+
+#endif
diff --git a/kcontrol/samba/AUTHORS b/kcontrol/samba/AUTHORS
new file mode 100644
index 000000000..0bebeaa06
--- /dev/null
+++ b/kcontrol/samba/AUTHORS
@@ -0,0 +1,32 @@
+Samba Status Module:
+
+ Michael Glauche <glauche@isa.rwth-aachen.de>
+
+Conversion to kcontrol applet:
+
+ Matthias Hoelzer <hoelzer@physik.uni-wuerzburg.de>
+
+Use of KProcess instead of popen, and more error checking
+
+ David Faure <David.Faure@insa-lyon.fr>
+
+Added Window and Column resizing:
+
+ Harald Koschinski <Harald.Koschinski@arcormail.de>
+
+KTabListBox to QListView conversion and use of QLayout:
+
+ Wilco Greven <j.w.greven@student.utwente.nl>
+
+Conversion to KDE2 kcontrol module
+Corrected parsing of the smbstatus output
+ (now works also with shares containing spaces "a share name")
+Added three tab pages
+-one for viewing mounted network resources (Samba and NFS, works on Linux, maybe Solaris)
+-one for viewing samba logfile
+-one for some filtering of samba logfile
+Added support for viewing NFS-exports mounted by remote hosts on the first
+tab
+
+ Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>
+
diff --git a/kcontrol/samba/Makefile.am b/kcontrol/samba/Makefile.am
new file mode 100644
index 000000000..42c3f6618
--- /dev/null
+++ b/kcontrol/samba/Makefile.am
@@ -0,0 +1,15 @@
+kde_module_LTLIBRARIES = kcm_samba.la
+
+kcm_samba_la_SOURCES = main.cpp ksmbstatus.cpp kcmsambaimports.cpp kcmsambalog.cpp kcmsambastatistics.cpp
+
+kcm_samba_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_samba_la_LIBADD = $(LIB_KIO)
+
+AM_CPPFLAGS = $(all_includes)
+
+METASOURCES = AUTO
+
+messages:
+ $(XGETTEXT) $(kcm_samba_la_SOURCES) -o $(podir)/kcmsamba.pot
+
+xdg_apps_DATA = smbstatus.desktop
diff --git a/kcontrol/samba/kcmsambaimports.cpp b/kcontrol/samba/kcmsambaimports.cpp
new file mode 100644
index 000000000..a88e2448f
--- /dev/null
+++ b/kcontrol/samba/kcmsambaimports.cpp
@@ -0,0 +1,95 @@
+/*
+ * kcmsambaimports.cpp
+ *
+ * Copyright (c) 2000 Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>
+ *
+ * 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 "kcmsambaimports.h"
+#include "kcmsambaimports.moc"
+
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <klocale.h>
+#include <kdialog.h>
+
+#include <stdio.h>
+
+ImportsView::ImportsView(QWidget * parent, KConfig *config, const char * name )
+ : QWidget (parent, name)
+ ,configFile(config)
+ ,list(this)
+{
+ QBoxLayout *topLayout = new QVBoxLayout(this, KDialog::marginHint(),
+ KDialog::spacingHint());
+ topLayout->setAutoAdd(true);
+
+ list.setAllColumnsShowFocus(true);
+ list.setShowSortIndicator(true);
+ list.setMinimumSize(425,200);
+ list.addColumn(i18n("Type"), 50);
+ list.addColumn(i18n("Resource"), 200);
+ list.addColumn(i18n("Mounted Under"), 190);
+
+ QWhatsThis::add( this, i18n("This list shows the Samba and NFS shared"
+ " resources mounted on your system from other hosts. The \"Type\""
+ " column tells you whether the mounted resource is a Samba or an NFS"
+ " type of resource. The \"Resource\" column shows the descriptive name"
+ " of the shared resource. Finally, the third column, which is labeled"
+ " \"Mounted under\" shows the location on your system where the shared"
+ " resource is mounted.") );
+
+ timer.start(10000);
+ QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(updateList()));
+ updateList();
+}
+
+void ImportsView::updateList()
+{
+ list.clear();
+ char *e;
+ char buf[250];
+ QCString s(""),strSource, strMount, strType;
+ FILE *f=popen("mount","r");
+ if (f==0) return;
+ do
+ {
+ e=fgets(buf,250,f);
+ if (e!=0)
+ {
+ s=buf;
+ if ((s.contains(" nfs ")) || (s.contains(" smbfs ")))
+ {
+ strSource=s.left(s.find(" on /"));
+ strMount=s.mid(s.find(" on /")+4,s.length());
+ if ((s.contains(" nfs ")) || (s.contains("/remote on ")))
+ strType="NFS";
+ else if (s.contains(" smbfs "))
+ strType="SMB";
+ int pos(strMount.find(" type "));
+ if (pos==-1) pos=strMount.find(" read/");
+ strMount=strMount.left(pos);
+ new QListViewItem(&list,strType,strSource,strMount);
+ };
+ };
+ }
+ while (!feof(f));
+ pclose(f);
+}
+
diff --git a/kcontrol/samba/kcmsambaimports.h b/kcontrol/samba/kcmsambaimports.h
new file mode 100644
index 000000000..5cd1c5e92
--- /dev/null
+++ b/kcontrol/samba/kcmsambaimports.h
@@ -0,0 +1,47 @@
+/*
+ * kcmsambaimports.h
+ *
+ * Copyright (c) 2000 Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>
+ *
+ * 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.
+ */
+
+#ifndef kcmsambaimports_h_included
+#define kcmsambaimports_h_included
+
+#include <qtimer.h>
+#include <qlistview.h>
+#include <kconfig.h>
+
+class ImportsView: public QWidget
+{
+ Q_OBJECT
+ public:
+ ImportsView(QWidget *parent, KConfig *config=0, const char * name=0);
+ virtual ~ImportsView() {};
+ void saveSettings() {};
+ void loadSettings() {};
+private:
+ KConfig *configFile;
+ QListView list;
+ QTimer timer;
+private slots:
+ void updateList();
+};
+
+#endif // main_included
diff --git a/kcontrol/samba/kcmsambalog.cpp b/kcontrol/samba/kcmsambalog.cpp
new file mode 100644
index 000000000..c4f01b464
--- /dev/null
+++ b/kcontrol/samba/kcmsambalog.cpp
@@ -0,0 +1,253 @@
+/*
+ * kcmsambalog.cpp
+ *
+ * Copyright (c) 2000 Alexander Neundorf <neundorf@kde.org>
+ *
+ * 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 <qfile.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+
+#include <kmessagebox.h>
+#include <kdialog.h>
+#include <klocale.h>
+
+#include "kcmsambalog.h"
+#include "kcmsambalog.moc"
+
+#define LOG_SCREEN_XY_OFFSET 10
+
+LogView::LogView(QWidget *parent,KConfig *config, const char *name)
+: QWidget (parent, name)
+,configFile(config)
+,filesCount(0)
+,connectionsCount(0)
+,logFileName("/var/log/samba.log",this)
+,label(&logFileName,i18n("Samba log file: "),this)
+,viewHistory(this)
+,showConnOpen(i18n("Show opened connections"),this)
+,showConnClose(i18n("Show closed connections"),this)
+,showFileOpen(i18n("Show opened files"),this)
+,showFileClose(i18n("Show closed files"),this)
+,updateButton(i18n("&Update"),this)
+{
+ QVBoxLayout *mainLayout=new QVBoxLayout(this, KDialog::marginHint(),
+ KDialog::spacingHint());
+ QHBoxLayout *leLayout=new QHBoxLayout(mainLayout);
+ leLayout->addWidget(&label);
+ leLayout->addWidget(&logFileName,1);
+ mainLayout->addWidget(&viewHistory,1);
+ QGridLayout *subLayout=new QGridLayout(mainLayout,2,2);
+ subLayout->addWidget(&showConnOpen,0,0);
+ subLayout->addWidget(&showConnClose,1,0);
+ subLayout->addWidget(&showFileOpen,0,1);
+ subLayout->addWidget(&showFileClose,1,1);
+ mainLayout->addWidget(&updateButton,0,Qt::AlignLeft);
+
+ QWhatsThis::add( &logFileName, i18n("This page presents the contents of"
+ " your samba log file in a friendly layout. Check that the correct log"
+ " file for your computer is listed here. If you need to, correct the name"
+ " or location of the log file, and then click the \"Update\" button.") );
+
+ QWhatsThis::add( &showConnOpen, i18n("Check this option if you want to"
+ " view the details for connections opened to your computer.") );
+
+ QWhatsThis::add( &showConnClose, i18n("Check this option if you want to"
+ " view the events when connections to your computer were closed.") );
+
+ QWhatsThis::add( &showFileOpen, i18n("Check this option if you want to"
+ " see the files which were opened on your computer by remote users."
+ " Note that file open/close events are not logged unless the samba"
+ " log level is set to at least 2 (you cannot set the log level"
+ " using this module).") );
+
+ QWhatsThis::add( &showFileClose, i18n("Check this option if you want to"
+ " see the events when files opened by remote users were closed."
+ " Note that file open/close events are not logged unless the samba"
+ " log level is set to at least 2 (you cannot set the log level"
+ " using this module).") );
+
+ QWhatsThis::add( &updateButton, i18n("Click here to refresh the information"
+ " on this page. The log file (shown above) will be read to obtain the"
+ " events logged by samba.") );
+
+ logFileName.setURL("/var/log/samba.log");
+
+ viewHistory.setAllColumnsShowFocus(TRUE);
+ viewHistory.setFocusPolicy(QWidget::ClickFocus);
+ viewHistory.setShowSortIndicator(true);
+
+ viewHistory.addColumn(i18n("Date & Time"),130);
+ viewHistory.addColumn(i18n("Event"),150);
+ viewHistory.addColumn(i18n("Service/File"),210);
+ viewHistory.addColumn(i18n("Host/User"),150);
+
+ QWhatsThis::add( &viewHistory, i18n("This list shows details of the events"
+ " logged by samba. Note that events at the file level are not logged"
+ " unless you have configured the log level for samba to 2 or greater.<p>"
+ " As with many other lists in KDE, you can click on a column heading"
+ " to sort on that column. Click again to change the sorting direction"
+ " from ascending to descending or vice versa.<p>"
+ " If the list is empty, try clicking the \"Update\" button. The samba"
+ " log file will be read and the list refreshed.") );
+
+ showConnOpen.setChecked(TRUE);
+ showConnClose.setChecked(TRUE);
+ showFileOpen.setChecked(FALSE);
+ showFileClose.setChecked(FALSE);
+
+ connect(&updateButton,SIGNAL(clicked()),this,SLOT(updateList()));
+ emit contentsChanged(&viewHistory,0,0);
+
+ label.setMinimumSize(label.sizeHint());
+ logFileName.setMinimumSize(250,logFileName.sizeHint().height());
+ viewHistory.setMinimumSize(425,200);
+ showConnOpen.setMinimumSize(showConnOpen.sizeHint());
+ showConnClose.setMinimumSize(showConnClose.sizeHint());
+ showFileOpen.setMinimumSize(showFileOpen.sizeHint());
+ showFileClose.setMinimumSize(showFileClose.sizeHint());
+ updateButton.setFixedSize(updateButton.sizeHint());
+}
+
+void LogView::loadSettings()
+{
+ if (configFile==0) return;
+ configFile->setGroup(LOGGROUPNAME);
+ logFileName.setURL(configFile->readPathEntry( "SambaLogFile", "/var/log/samba.log"));
+
+ showConnOpen.setChecked(configFile->readBoolEntry( "ShowConnectionOpen", TRUE));
+ showConnClose.setChecked(configFile->readBoolEntry( "ShowConnectionClose", FALSE));
+ showFileOpen.setChecked(configFile->readBoolEntry( "ShowFileOpen", TRUE));
+ showFileClose.setChecked(configFile->readBoolEntry( "ShowFileClose", FALSE));
+}
+
+void LogView::saveSettings()
+{
+ if (configFile==0) return;
+ configFile->setGroup(LOGGROUPNAME);
+ configFile->writePathEntry( "SambaLogFile", logFileName.url());
+
+ configFile->writeEntry( "ShowConnectionOpen", showConnOpen.isChecked());
+ configFile->writeEntry( "ShowConnectionClose", showConnClose.isChecked());
+ configFile->writeEntry( "ShowFileOpen", showFileOpen.isChecked());
+ configFile->writeEntry( "ShowFileClose", showFileClose.isChecked());
+}
+
+#define CONN_OPEN " connect to service "
+#define CONN_CLOSE " closed connection to service "
+#define FILE_OPEN " opened file "
+#define FILE_CLOSE " closed file "
+
+//caution ! high optimized code :-)
+void LogView::updateList()
+{
+ QFile logFile(logFileName.url());
+ if (logFile.open(IO_ReadOnly))
+ {
+ QApplication::setOverrideCursor(waitCursor);
+ viewHistory.clear();
+ filesCount=0;
+ connectionsCount=0;
+
+ int connOpenLen(strlen(CONN_OPEN));
+ int connCloseLen(strlen(CONN_CLOSE));
+ int fileOpenLen(strlen(FILE_OPEN));
+ int fileCloseLen(strlen(FILE_CLOSE));
+
+ char buf[400];
+ char *c1, *c2, *c3, *c4, *c, time[25];
+ int timeRead(0);
+
+ while (!logFile.atEnd())
+ {
+ logFile.readLine(buf,sizeof(buf));
+ timeRead=0;
+ if (buf[0]=='[')
+ {
+ if (strlen(buf)>11)
+ if (buf[5]=='/')
+ {
+ buf[20]='\0';
+ strncpy(time,buf+1, sizeof(time));
+ time[sizeof(time)-1] = '\0';
+ timeRead=1;
+ };
+ };
+ if (timeRead==0)
+ {
+ c1=0;
+ c2=0;
+ c3=0;
+ c4=0;
+ if (showConnOpen.isChecked()) c1=strstr(buf,CONN_OPEN);
+ if (c1==0)
+ {
+ if (showConnClose.isChecked()) c2=strstr(buf,CONN_CLOSE);
+ if (c2==0)
+ {
+ if (showFileOpen.isChecked()) c3=strstr(buf,FILE_OPEN);
+ if (c3==0)
+ {
+ if (showFileClose.isChecked()) c4=strstr(buf,FILE_CLOSE);
+ if (c4==0) continue;
+ };
+ };
+ };
+ if (c1!=0)
+ {
+ c=strstr(buf," as user");
+ *c='\0';
+ *c1='\0';
+ new QListViewItemX(&viewHistory,time,I18N_NOOP("CONNECTION OPENED"),c1+connOpenLen,buf+2);
+ connectionsCount++;
+ }
+ else if (c2!=0)
+ {
+ *c2='\0';
+ new QListViewItemX(&viewHistory,time,I18N_NOOP("CONNECTION CLOSED"),c2+connCloseLen,buf+2);
+ }
+ else if (c3!=0)
+ {
+ c=strstr(buf," read=");
+ *c='\0';
+ *c3='\0';
+ new QListViewItemX(&viewHistory,time,I18N_NOOP(" FILE OPENED"),c3+fileOpenLen,buf+2);
+ filesCount++;
+ }
+ else if (c4!=0)
+ {
+ c=strstr(buf," (numopen=");
+ *c='\0';
+ *c4='\0';
+ new QListViewItemX(&viewHistory,time,I18N_NOOP(" FILE CLOSED"),c4+fileCloseLen,buf+2);
+ };
+ };
+ };
+ logFile.close();
+ emit contentsChanged(&viewHistory, filesCount, connectionsCount);
+ QApplication::restoreOverrideCursor();
+ }
+ else
+ {
+ QString tmp = i18n("Could not open file %1").arg(logFileName.url());
+ KMessageBox::error(this,tmp);
+ };
+}
+
diff --git a/kcontrol/samba/kcmsambalog.h b/kcontrol/samba/kcmsambalog.h
new file mode 100644
index 000000000..03e22f872
--- /dev/null
+++ b/kcontrol/samba/kcmsambalog.h
@@ -0,0 +1,86 @@
+/*
+ * kcmsambalog.h
+ *
+ * Copyright (c) 2000 Alexander Neundorf <neundorf@kde.org>
+*
+ * 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.
+ */
+#ifndef kcmsambalog_h_included
+#define kcmsambalog_h_included
+
+#include <qlabel.h>
+#include <qcstring.h>
+#include <qcheckbox.h>
+#include <qpushbutton.h>
+#include <qlistview.h>
+#include <qevent.h>
+#include <kconfig.h>
+
+#include <kurlrequester.h>
+
+#define LOGGROUPNAME "SambaLogFileSettings"
+
+class LogView: public QWidget
+{
+ Q_OBJECT
+ public:
+ LogView(QWidget *parent=0, KConfig *config=0, const char *name=0);
+ virtual ~LogView() {};
+ void saveSettings();
+ void loadSettings();
+ private:
+ KConfig *configFile;
+ int filesCount, connectionsCount;
+ KURLRequester logFileName;
+ QLabel label;
+ QListView viewHistory;
+ QCheckBox showConnOpen, showConnClose, showFileOpen, showFileClose;
+ QPushButton updateButton;
+ private slots:
+ void updateList();
+ signals:
+ void contentsChanged(QListView* list, int nrOfFiles, int nrOfConnections);
+};
+
+class QListViewItemX:public QListViewItem
+{
+ public:
+ //a faster constructor saves a lot time
+ QListViewItemX( QListView * parent,
+ const char *c0, const char *c1 = 0,
+ const char *c2 = 0, const char *c3 = 0,
+ const char *c4 = 0, const char *c5 = 0,
+ const char *c6 = 0, const char *c7 = 0 )
+ :QListViewItem(parent)
+ {
+ setText( 0, c0 );
+ setText( 1, c1 );
+ setText( 2, c2 );
+ setText( 3, c3 );
+ if (c4==0) return;
+ setText( 4, c4 );
+ if (c5==0) return;
+ setText( 5, c5 );
+ if (c6==0) return;
+ setText( 6, c6 );
+ if (c7==0) return;
+ setText( 7, c7 );
+ };
+};
+
+#endif // main_included
diff --git a/kcontrol/samba/kcmsambastatistics.cpp b/kcontrol/samba/kcmsambastatistics.cpp
new file mode 100644
index 000000000..ebdd1c092
--- /dev/null
+++ b/kcontrol/samba/kcmsambastatistics.cpp
@@ -0,0 +1,289 @@
+/*
+ * kcmsambastatistics.cpp
+ *
+ * Copyright (c) 2000 Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>
+ *
+ * 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 "kcmsambastatistics.h"
+#include "kcmsambastatistics.moc"
+
+#include <qlayout.h>
+#include <qlistview.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kdialog.h>
+
+StatisticsView::StatisticsView(QWidget *parent,KConfig *config, const char *name)
+ :QWidget (parent, name)
+ ,configFile(config)
+ ,dataList(0)
+ ,connectionsCount(0)
+ ,filesCount(0)
+ ,calcCount(0)
+{
+ viewStatistics = new QListView( this );
+ connectionsL = new QLabel( i18n( "Connections: 0" ), this );
+ filesL = new QLabel( i18n( "File accesses: 0" ), this );
+ eventCb = new QComboBox( false, this );
+ eventL = new QLabel( eventCb, i18n( "Event: " ), this );
+ serviceLe = new QLineEdit( this );
+ serviceL = new QLabel( serviceLe, i18n( "Service/File:" ), this );
+ hostLe = new QLineEdit( this );
+ hostL = new QLabel( hostLe, i18n( "Host/User:" ), this );
+ calcButton = new QPushButton( i18n( "&Search" ), this );
+ clearButton = new QPushButton( i18n( "Clear Results" ), this );
+ expandedInfoCb = new QCheckBox( i18n( "Show expanded service info" ), this );
+ expandedUserCb = new QCheckBox( i18n( "Show expanded host info" ), this );
+
+ viewStatistics->setAllColumnsShowFocus(TRUE);
+ viewStatistics->setFocusPolicy(QWidget::ClickFocus);
+ viewStatistics->setShowSortIndicator(true);
+
+ viewStatistics->addColumn(i18n("Nr"),30);
+ viewStatistics->addColumn(i18n("Event"),130);
+ viewStatistics->addColumn(i18n("Service/File"),200);
+ viewStatistics->addColumn(i18n("Host/User"),90);
+ viewStatistics->addColumn(i18n("Hits"),50);
+ //viewStatistics->addColumn(i18n("Percentage"),100);
+
+ eventCb->insertItem(i18n("Connection"));
+ eventCb->insertItem(i18n("File Access"));
+
+ expandedInfoCb->setChecked(FALSE);
+ expandedUserCb->setChecked(FALSE);
+ clearStatistics();
+ serviceLe->setText("*");
+ hostLe->setText("*");
+
+ viewStatistics->setMinimumSize(375,200);
+ connectionsL->setMinimumSize(connectionsL->sizeHint());
+ filesL->setMinimumSize(filesL->sizeHint());
+ eventL->setMinimumSize(eventL->sizeHint());
+ eventCb->setMinimumSize(eventCb->sizeHint());
+ hostL->setMinimumSize(hostL->sizeHint());
+ hostLe->setMinimumSize(120,hostLe->sizeHint().height());
+ serviceL->setMinimumSize(serviceL->sizeHint());
+ serviceLe->setMinimumSize(120,serviceLe->sizeHint().height());
+ calcButton->setMinimumSize(calcButton->sizeHint());
+ clearButton->setMinimumSize(clearButton->sizeHint());
+ expandedInfoCb->setMinimumSize(expandedInfoCb->sizeHint());
+ expandedUserCb->setMinimumSize(expandedUserCb->sizeHint());
+
+ QVBoxLayout *topLayout=new QVBoxLayout(this, KDialog::marginHint(),
+ KDialog::spacingHint());
+ topLayout->addWidget(viewStatistics,1);
+ QGridLayout *subLayout=new QGridLayout(topLayout,4,3);
+ subLayout->setColStretch(1,1);
+ subLayout->setColStretch(2,1);
+
+ QHBoxLayout *twoButtonsLayout=new QHBoxLayout;
+ twoButtonsLayout->addWidget(calcButton,1);
+ twoButtonsLayout->addWidget(clearButton,1);
+
+ subLayout->addWidget(connectionsL,0,0);
+ subLayout->addWidget(filesL,0,1);
+ subLayout->addWidget(eventL,1,0);
+ subLayout->addWidget(serviceL,1,1);
+ subLayout->addWidget(hostL,1,2);
+ subLayout->addWidget(eventCb,2,0);
+ subLayout->addWidget(serviceLe,2,1);
+ subLayout->addWidget(hostLe,2,2);
+ subLayout->addLayout(twoButtonsLayout,3,0);
+ subLayout->addWidget(expandedInfoCb,3,1);
+ subLayout->addWidget(expandedUserCb,3,2);
+
+ connect(clearButton,SIGNAL(clicked()),this,SLOT(clearStatistics()));
+ connect(calcButton,SIGNAL(clicked()),this,SLOT(calculate()));
+ setListInfo(0,0,0);
+}
+
+void StatisticsView::setListInfo(QListView *list, int nrOfFiles, int nrOfConnections)
+{
+ dataList=list;
+ filesCount=nrOfFiles;
+ connectionsCount=nrOfConnections;
+ connectionsL->setText(i18n("Connections: %1").arg(KGlobal::locale()->formatNumber(connectionsCount, 0)));
+ filesL->setText(i18n("File accesses: %1").arg(KGlobal::locale()->formatNumber(filesCount, 0)));
+ clearStatistics();
+}
+
+void StatisticsView::calculate()
+{
+ if (dataList==0) return;
+ QApplication::setOverrideCursor(waitCursor);
+ int connCount(0);
+ if (eventCb->currentText()==i18n("Connection"))
+ connCount=1;
+ //something has to be counted exactly
+ if ((expandedInfoCb->isChecked()) || (expandedUserCb->isChecked()))
+ {
+ SambaLog sLog;
+ QRegExp rService(serviceLe->text(),FALSE,TRUE);
+ QRegExp rHost(hostLe->text(),FALSE,TRUE);
+ QString item2, item3;
+ QListViewItem* item=dataList->firstChild();
+ while (item!=0)
+ {
+ if (connCount)
+ {
+ if ((QString(item->text(1)).contains(i18n("CONNECTION OPENED")))
+ && (QString(item->text(2)).contains(rService)) && (QString(item->text(3)).contains(rHost)))
+ {
+ if (expandedInfoCb->isChecked()) item2=item->text(2);
+ else item2=serviceLe->text();
+ if (expandedUserCb->isChecked()) item3=item->text(3);
+ else item3=hostLe->text();
+ sLog.addItem(item2,item3);
+ //count++;
+ };
+ }
+ else
+ {
+ if ((QString(item->text(1)).contains(i18n("FILE OPENED")))
+ && (QString(item->text(2)).contains(rService)) && (QString(item->text(3)).contains(rHost)))
+ {
+ if (expandedInfoCb->isChecked()) item2=item->text(2);
+ else item2=serviceLe->text();
+ if (expandedUserCb->isChecked()) item3=item->text(3);
+ else item3=hostLe->text();
+ sLog.addItem(item2,item3);
+
+ };
+ };
+ item=item->nextSibling();
+ };
+ for (LogItem* tmpItem=sLog.items.first();tmpItem!=0;tmpItem=sLog.items.next())
+ {
+ for (SmallLogItem *tmpStr=tmpItem->accessed.first();tmpStr!=0;tmpStr=tmpItem->accessed.next())
+ {
+ calcCount++;
+ QString number("");
+ number.sprintf("%6d",calcCount);
+ QString hits("");
+ hits.sprintf("%7d",tmpStr->count);
+ new QListViewItem(viewStatistics,number,eventCb->currentText(),tmpItem->name,tmpStr->name,hits);
+ };
+ };
+ }
+ //no expanded info needed
+ else
+ {
+ calcCount++;
+ int count(0);
+ QRegExp rService(serviceLe->text(),FALSE,TRUE);
+ QRegExp rHost(hostLe->text(),FALSE,TRUE);
+ QListViewItem* item=dataList->firstChild();
+ while (item!=0)
+ {
+ if (connCount)
+ {
+ if ((QString(item->text(1)).contains(i18n("CONNECTION OPENED")))
+ && (QString(item->text(2)).contains(rService)) && (QString(item->text(3)).contains(rHost)))
+ count++;
+ }
+ else
+ {
+ if ((QString(item->text(1)).contains(i18n("FILE OPENED")))
+ && (QString(item->text(2)).contains(rService)) && (QString(item->text(3)).contains(rHost)))
+ count++;
+ };
+ item=item->nextSibling();
+ };
+ QString number("");
+ number.sprintf("%6d",calcCount);
+ QString hits("");
+ hits.sprintf("%7d",count);
+ new QListViewItem(viewStatistics,number,eventCb->currentText(),serviceLe->text(),hostLe->text(),hits);
+ };
+ QApplication::restoreOverrideCursor();
+}
+
+void StatisticsView::clearStatistics()
+{
+ viewStatistics->clear();
+ calcCount=0;
+}
+
+void SambaLog::printItems()
+{
+ kdDebug() << "****** printing items: ******" << endl;
+ for (LogItem* tmpItem=items.first();tmpItem!=0;tmpItem=items.next())
+ {
+ kdDebug() << "SERVICE: " << tmpItem->name << endl;
+ for (SmallLogItem* tmpLog=tmpItem->accessed.first();tmpLog!=0;tmpLog=tmpItem->accessed.next())
+ kdDebug() << " accessed by: " << tmpLog->name << " " << tmpLog->count << endl;
+ };
+ kdDebug() << "------ end of printing ------" << endl << endl;
+}
+
+LogItem* SambaLog::itemInList(QString name)
+{
+ LogItem* tmpItem(items.first());
+ LogItem* foundItem(0);
+ while ((tmpItem!=0) && (foundItem==0))
+ {
+ if (tmpItem->name==name) foundItem=tmpItem;
+ tmpItem=items.next();
+ };
+ return foundItem;
+}
+
+void SambaLog::addItem(QString share, QString user)
+{
+ //cout<<" adding connection: -"<<share<<"- -"<<user<<"-"<<endl;
+ LogItem* tmp(itemInList(share));
+ if (tmp!=0)
+ {
+ tmp->count++;
+ tmp->addItem(user);
+ }
+ else
+ {
+ items.append(new LogItem(share,user));
+ };
+}
+
+SmallLogItem* LogItem::itemInList(QString name)
+{
+ SmallLogItem* tmpItem(accessed.first());
+ SmallLogItem* foundItem(0);
+ while ((tmpItem!=0) && (foundItem==0))
+ {
+ if (tmpItem->name==name) foundItem=tmpItem;
+ tmpItem=accessed.next();
+ };
+ return foundItem;
+}
+
+void LogItem::addItem (QString host)
+{
+ SmallLogItem* tmp(itemInList(host));
+ if (tmp!=0)
+ tmp->count++;
+ else
+ accessed.append(new SmallLogItem(host));
+}
diff --git a/kcontrol/samba/kcmsambastatistics.h b/kcontrol/samba/kcmsambastatistics.h
new file mode 100644
index 000000000..66a9474ab
--- /dev/null
+++ b/kcontrol/samba/kcmsambastatistics.h
@@ -0,0 +1,106 @@
+/*
+ * kcmsambastatistics.h
+ *
+ * Copyright (c) 2000 Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>
+ *
+ * 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.
+ */
+#ifndef kcmsambastatistics_h_included
+#define kcmsambastatistics_h_included
+
+#include <qwidget.h>
+#include <qptrlist.h>
+
+class QListView;
+class QLabel;
+class QComboBox;
+class QCheckBox;
+class QLineEdit;
+class QPushButton;
+
+class KConfig;
+
+class SmallLogItem
+{
+ public:
+ SmallLogItem():name(""),count(0){};
+ SmallLogItem(QString n):name(n),count(1){};
+ QString name;
+ int count;
+};
+
+class LogItem
+{
+ public:
+ LogItem():name(""), accessed(),count(0) {};
+ LogItem(QString n, QString a):name(n), accessed(), count(1)
+ {
+ accessed.setAutoDelete(TRUE);
+ accessed.append(new SmallLogItem(a));
+ };
+ QString name;
+ //QStrList accessedBy;
+ QPtrList<SmallLogItem> accessed;
+ int count;
+ SmallLogItem* itemInList(QString name);
+ void addItem (QString host);
+};
+
+class SambaLog
+{
+ public:
+ SambaLog()
+ {
+ items.setAutoDelete(TRUE);
+ };
+ QPtrList<LogItem> items;
+ void addItem (QString share, QString host);
+ void printItems();
+ private:
+ LogItem* itemInList(QString name);
+};
+
+class StatisticsView: public QWidget
+{
+ Q_OBJECT
+public:
+ StatisticsView(QWidget *parent=0, KConfig *config=0, const char *name=0);
+ virtual ~StatisticsView() {};
+ void saveSettings() {};
+ void loadSettings() {};
+ public slots:
+ void setListInfo(QListView *list, int nrOfFiles, int nrOfConnections);
+private:
+ KConfig *configFile;
+ QListView *dataList;
+ QListView* viewStatistics;
+ QLabel* connectionsL, *filesL;
+ QComboBox* eventCb;
+ QLabel* eventL;
+ QLineEdit* serviceLe;
+ QLabel* serviceL;
+ QLineEdit* hostLe;
+ QLabel* hostL;
+ QPushButton* calcButton, *clearButton;
+ QCheckBox* expandedInfoCb, *expandedUserCb;
+ int connectionsCount, filesCount, calcCount;
+private slots:
+ void clearStatistics();
+ void calculate();
+};
+#endif // main_included
diff --git a/kcontrol/samba/ksmbstatus.cpp b/kcontrol/samba/ksmbstatus.cpp
new file mode 100644
index 000000000..4866a3a1e
--- /dev/null
+++ b/kcontrol/samba/ksmbstatus.cpp
@@ -0,0 +1,225 @@
+/*
+ * ksmbstatus.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 <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include <qlayout.h>
+
+#include <klocale.h>
+#include <kdialog.h>
+
+#include "ksmbstatus.h"
+#include "ksmbstatus.moc"
+
+
+#define Before(ttf,in) in.left(in.find(ttf))
+#define After(ttf,in) (in.contains(ttf)?QString(in.mid(in.find(ttf)+QString(ttf).length())):QString(""))
+
+NetMon::NetMon( QWidget * parent, KConfig *config, const char * name )
+ : QWidget(parent, name)
+ ,configFile(config)
+ ,showmountProc(0)
+ ,strShare("")
+ ,strUser("")
+ ,strGroup("")
+ ,strMachine("")
+ ,strSince("")
+ ,strPid("")
+ ,iUser(0)
+ ,iGroup(0)
+ ,iMachine(0)
+ ,iPid(0)
+{
+ QBoxLayout *topLayout = new QVBoxLayout(this, KDialog::marginHint(),
+ KDialog::spacingHint());
+ topLayout->setAutoAdd(true);
+
+ list=new QListView(this,"Hello");
+ version=new QLabel(this);
+
+ list->setAllColumnsShowFocus(true);
+ list->setMinimumSize(425,200);
+ list->setShowSortIndicator(true);
+
+ list->addColumn(i18n("Type"));
+ list->addColumn(i18n("Service"));
+ list->addColumn(i18n("Accessed From"));
+ list->addColumn(i18n("UID"));
+ list->addColumn(i18n("GID"));
+ list->addColumn(i18n("PID"));
+ list->addColumn(i18n("Open Files"));
+
+ timer = new QTimer(this);
+ timer->start(15000);
+ QObject::connect(timer, SIGNAL(timeout()), this, SLOT(update()));
+ update();
+}
+
+void NetMon::processNFSLine(char *bufline, int)
+{
+ QCString line(bufline);
+ if (line.contains(":/"))
+ new QListViewItem(list,"NFS",After(":",line),Before(":/",line));
+}
+
+void NetMon::processSambaLine(char *bufline, int)
+{
+ QCString line(bufline);
+ rownumber++;
+ if (rownumber == 2)
+ version->setText(bufline); // second line = samba version
+ if ((readingpart==header) && line.contains("Service"))
+ {
+ iUser=line.find("uid");
+ iGroup=line.find("gid");
+ iPid=line.find("pid");
+ iMachine=line.find("machine");
+ }
+ else if ((readingpart==header) && (line.contains("---")))
+ {
+ readingpart=connexions;
+ }
+ else if ((readingpart==connexions) && (int(line.length())>=iMachine))
+ {
+ strShare=line.mid(0,iUser);
+ strUser=line.mid(iUser,iGroup-iUser);
+ strGroup=line.mid(iGroup,iPid-iGroup);
+ strPid=line.mid(iPid,iMachine-iPid);
+
+ line=line.mid(iMachine,line.length());
+ strMachine=line;
+ new QListViewItem(list,"SMB",strShare,strMachine, strUser,strGroup,strPid/*,strSince*/);
+ }
+ else if (readingpart==connexions)
+ readingpart=locked_files;
+ else if ((readingpart==locked_files) && (line.find("No ")==0))
+ readingpart=finished;
+ else if (readingpart==locked_files)
+ {
+ if ((strncmp(bufline,"Pi", 2) !=0) // "Pid DenyMode ..."
+ && (strncmp(bufline,"--", 2) !=0)) // "------------"
+ {
+ char *tok=strtok(bufline," ");
+ if (tok) {
+ int pid=atoi(tok);
+ (lo)[pid]++;
+ }
+ }
+ }
+}
+
+// called when we get some data from smbstatus
+// can be called for any size of buffer (one line, several lines,
+// half of one ...)
+void NetMon::slotReceivedData(KProcess *, char *buffer, int )
+{
+ //kdDebug()<<"received stuff"<<endl;
+ char s[250],*start,*end;
+ size_t len;
+ start = buffer;
+ while ((end = strchr(start,'\n'))) // look for '\n'
+ {
+ len = end-start;
+ if (len>=sizeof(s))
+ len=sizeof(s)-1;
+ strncpy(s,start,len);
+ s[len] = '\0';
+ //kdDebug() << "recived: "<<s << endl;
+ if (readingpart==nfs)
+ processNFSLine(s,len);
+ else
+ processSambaLine(s,len); // process each line
+ start=end+1;
+ }
+ if (readingpart==nfs)
+ {
+ list->viewport()->update();
+ list->update();
+ }
+ // here we could save the remaining part of line, if ever buffer
+ // doesn't end with a '\n' ... but will this happen ?
+}
+
+void NetMon::update()
+{
+ KProcess * process = new KProcess();
+
+ memset(&lo, 0, sizeof(lo));
+ list->clear();
+ /* Re-read the Contents ... */
+
+ QString path(::getenv("PATH"));
+ path += "/bin:/sbin:/usr/bin:/usr/sbin";
+
+ rownumber=0;
+ readingpart=header;
+ nrpid=0;
+ process->setEnvironment("PATH", path);
+ connect(process,
+ SIGNAL(receivedStdout(KProcess *, char *, int)),
+ SLOT(slotReceivedData(KProcess *, char *, int)));
+ *process << "smbstatus";
+ if (!process->start(KProcess::Block,KProcess::Stdout))
+ version->setText(i18n("Error: Unable to run smbstatus"));
+ else if (rownumber==0) // empty result
+ version->setText(i18n("Error: Unable to open configuration file \"smb.conf\""));
+ else
+ {
+ // ok -> count the number of locked files for each pid
+ for (QListViewItem *row=list->firstChild();row!=0;row=row->itemBelow())
+ {
+// cerr<<"NetMon::update: this should be the pid: "<<row->text(5)<<endl;
+ int pid=row->text(5).toInt();
+ row->setText(6,QString("%1").arg((lo)[pid]));
+ }
+ }
+ delete process;
+ process=0;
+
+ readingpart=nfs;
+ delete showmountProc;
+ showmountProc=new KProcess();
+ showmountProc->setEnvironment("PATH", path);
+ *showmountProc<<"showmount"<<"-a"<<"localhost";
+ connect(showmountProc,SIGNAL(receivedStdout(KProcess *, char *, int)),SLOT(slotReceivedData(KProcess *, char *, int)));
+ //without this timer showmount hangs up to 5 minutes
+ //if the portmapper daemon isn't running
+ QTimer::singleShot(5000,this,SLOT(killShowmount()));
+ //kdDebug()<<"starting kill timer with 5 seconds"<<endl;
+ connect(showmountProc,SIGNAL(processExited(KProcess*)),this,SLOT(killShowmount()));
+ if (!showmountProc->start(KProcess::NotifyOnExit,KProcess::Stdout)) // run showmount
+ {
+ delete showmountProc;
+ showmountProc=0;
+ }
+
+ version->adjustSize();
+ list->show();
+}
+
+void NetMon::killShowmount()
+{
+ //kdDebug()<<"killShowmount()"<<endl;
+ delete showmountProc;
+ showmountProc=0;
+}
+
diff --git a/kcontrol/samba/ksmbstatus.h b/kcontrol/samba/ksmbstatus.h
new file mode 100644
index 000000000..9d60e30c2
--- /dev/null
+++ b/kcontrol/samba/ksmbstatus.h
@@ -0,0 +1,65 @@
+/*
+ * ksmbstatus.h
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#ifndef ksmbstatus_h_included
+#define ksmbstatus_h_included
+
+#include <qtimer.h>
+#include <qlabel.h>
+#include <kprocess.h>
+#include <qcstring.h>
+#include <qlistview.h>
+#include <kconfig.h>
+
+#define SCREEN_XY_OFFSET 20
+
+class QListView;
+class QListViewItem;
+class KProcess;
+
+class NetMon : public QWidget
+{
+Q_OBJECT
+public:
+ NetMon(QWidget *parent, KConfig * config=0, const char * name=0);
+ void saveSettings() {};
+ void loadSettings() {};
+private:
+ KConfig *configFile;
+ KProcess *showmountProc;
+ QListView *list;
+ QLabel *version;
+ QTimer *timer;
+ QListViewItem *killrow;
+ int rownumber;
+ enum {header, connexions, locked_files, finished, nfs} readingpart;
+ int lo[65536];
+ int nrpid;
+ void processNFSLine(char *bufline, int linelen);
+ void processSambaLine(char *bufline, int linelen);
+
+ QCString strShare, strUser, strGroup, strMachine, strSince, strPid;
+ int iUser, iGroup, iMachine, iPid;
+
+private slots:
+ void killShowmount();
+ void update();
+ void slotReceivedData(KProcess *proc, char *buffer, int buflen);
+};
+
+#endif // main_included
diff --git a/kcontrol/samba/main.cpp b/kcontrol/samba/main.cpp
new file mode 100644
index 000000000..f6df8f91b
--- /dev/null
+++ b/kcontrol/samba/main.cpp
@@ -0,0 +1,119 @@
+/*
+ * main.cpp for the samba kcontrol module
+ *
+ * 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 <qlayout.h>
+#include <qtabwidget.h>
+
+#include <kaboutdata.h>
+#include <kcmodule.h>
+#include <kdialog.h>
+#include <kgenericfactory.h>
+
+#include "kcmsambaimports.h"
+#include "kcmsambalog.h"
+#include "kcmsambastatistics.h"
+#include "ksmbstatus.h"
+
+class SambaContainer:public KCModule
+{
+ public:
+ SambaContainer(QWidget *parent=0, const char * name=0, const QStringList &list = QStringList() );
+ virtual ~SambaContainer();
+ virtual void load();
+ virtual void save();
+
+ private:
+ KConfig config;
+ QTabWidget tabs;
+ NetMon status;
+ ImportsView imports;
+ LogView logView;
+ StatisticsView statisticsView;
+};
+
+typedef KGenericFactory<SambaContainer, QWidget > SambaFactory;
+K_EXPORT_COMPONENT_FACTORY (kcm_samba, SambaFactory("kcmsamba") )
+
+SambaContainer::SambaContainer(QWidget *parent, const char* name, const QStringList&)
+:KCModule(SambaFactory::instance(), parent,name)
+,config("kcmsambarc",false,true)
+,tabs(this)
+,status(&tabs,&config)
+,imports(&tabs,&config)
+,logView(&tabs,&config)
+,statisticsView(&tabs,&config)
+{
+ QVBoxLayout *layout = new QVBoxLayout( this, 0, KDialog::spacingHint() );
+ layout->addWidget(&tabs);
+ tabs.addTab(&status,i18n("&Exports"));
+ tabs.addTab(&imports,i18n("&Imports"));
+ tabs.addTab(&logView,i18n("&Log"));
+ tabs.addTab(&statisticsView,i18n("&Statistics"));
+ connect(&logView,SIGNAL(contentsChanged(QListView* , int, int)),&statisticsView,SLOT(setListInfo(QListView *, int, int)));
+ setButtons(Help);
+ load();
+
+ setQuickHelp( i18n("The Samba and NFS Status Monitor is a front end to the programs"
+ " <em>smbstatus</em> and <em>showmount</em>. Smbstatus reports on current"
+ " Samba connections, and is part of the suite of Samba tools, which"
+ " implements the SMB (Session Message Block) protocol, also called the"
+ " NetBIOS or LanManager protocol. This protocol can be used to provide"
+ " printer sharing or drive sharing services on a network including"
+ " machines running the various flavors of Microsoft Windows.<p>"
+ " Showmount is part of the NFS software package. NFS stands for Network"
+ " File System and is the traditional UNIX way to share directories over"
+ " the network. In this case the output of <em>showmount -a localhost</em>"
+ " is parsed. On some systems showmount is in /usr/sbin, check if you have"
+ " showmount in your PATH."));
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmsamba"),
+ I18N_NOOP("KDE Panel System Information Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2002 KDE Information Control Module Samba Team"));
+ about->addAuthor("Michael Glauche", 0, "glauche@isa.rwth-aachen.de");
+ about->addAuthor("Matthias Hoelzer", 0, "hoelzer@kde.org");
+ about->addAuthor("David Faure", 0, "faure@kde.org");
+ about->addAuthor("Harald Koschinski", 0, "Harald.Koschinski@arcormail.de");
+ about->addAuthor("Wilco Greven", 0, "greven@kde.org");
+ about->addAuthor("Alexander Neundorf", 0, "neundorf@kde.org");
+ setAboutData( about );
+}
+
+SambaContainer::~SambaContainer()
+{
+ save();
+}
+
+void SambaContainer::load()
+{
+ status.loadSettings();
+ imports.loadSettings();
+ logView.loadSettings();
+ statisticsView.loadSettings();
+}
+
+void SambaContainer::save()
+{
+ status.saveSettings();
+ imports.saveSettings();
+ logView.saveSettings();
+ statisticsView.saveSettings();
+ config.sync();
+}
+
diff --git a/kcontrol/samba/smbstatus.desktop b/kcontrol/samba/smbstatus.desktop
new file mode 100644
index 000000000..c0b6db58a
--- /dev/null
+++ b/kcontrol/samba/smbstatus.desktop
@@ -0,0 +1,241 @@
+[Desktop Entry]
+Exec=kcmshell smbstatus
+Icon=samba
+Type=Application
+DocPath=kinfocenter/samba/index.html
+
+
+X-KDE-Library=samba
+X-KDE-FactoryName=samba
+X-KDE-ParentApp=kinfocenter
+
+Name=Samba Status
+Name[ar]=حالة Samba
+Name[az]=Samba'nın Vəziyyəti
+Name[be]=Стан Samba
+Name[bg]=Сървър Samba
+Name[bn]=সাম্বা স্ট্যাটাস
+Name[br]=Saviad Samba
+Name[bs]=Status Sambe
+Name[ca]=Estat de Samba
+Name[cs]=Stav Samby
+Name[csb]=Sztaus Samba
+Name[cy]=Cyflwr Samba
+Name[da]=Samba-status
+Name[de]=Samba-Status
+Name[el]=Κατάσταση samba
+Name[eo]=Sambo-stato
+Name[es]=Estado de Samba
+Name[et]=Samba olek
+Name[eu]=Sambaren egoera
+Name[fa]=وضعیت Samba
+Name[fi]=Samban tila
+Name[fr]=État de Samba
+Name[fy]=Samba-tastân
+Name[ga]=Stádas Samba
+Name[gl]=Estado de Samba
+Name[he]=מצב Samba
+Name[hi]=साम्बा स्थिति
+Name[hr]=Stanje Sambe
+Name[hu]=Samba
+Name[id]=Status Samba
+Name[is]=Staða Samba
+Name[it]=Stato di Samba
+Name[ja]=Samba の状態
+Name[ka]=Samba-ს სტატუსი
+Name[kk]=Samba сервері
+Name[km]=ស្ថានភាព Samba
+Name[ko]=삼바 상태
+Name[lo]=ສະຖານະຂອງ Samba
+Name[lt]=Samba būsena
+Name[lv]=Samba Statuss
+Name[mk]=Статус на Samba
+Name[mn]=Samba-Төлөв
+Name[ms]=Status Samba
+Name[mt]=Stat tas-Samba
+Name[nb]=Samba-status
+Name[nds]=Samba-Status
+Name[ne]=साम्बा वस्तुस्थिति
+Name[nl]=Samba-status
+Name[nn]=Samba-status
+Name[nso]=Boemo bja Samba
+Name[oc]=Estat de Samba
+Name[pa]=ਸਾਂਬਾ ਸਥਿਤੀ
+Name[pt]=Samba
+Name[pt_BR]=Estado do Samba
+Name[ro]=Stare Samba
+Name[ru]=Сервер Samba
+Name[rw]=Imimerere Samba
+Name[se]=Samba stáhtus
+Name[sk]=Stav systému Samba
+Name[sl]=Status Sambe
+Name[sr]=Статус Самбе
+Name[sr@Latn]=Status Sambe
+Name[ss]=Simo se Samba
+Name[sv]=Samba-status
+Name[ta]=சம்பா நிலை
+Name[tg]=Шароити Samba
+Name[th]=สถานะของ Samba
+Name[tr]=Samba Servisi
+Name[tt]=Samba Xäläte
+Name[uk]=Стан Samba
+Name[uz]=Samba'ning holati
+Name[uz@cyrillic]=Samba'нинг ҳолати
+Name[ven]=Maimo a samba
+Name[vi]=Trạng thái của Samba
+Name[wa]=Estat di Samba
+Name[xh]=Isimo se Samba
+Name[zh_CN]=Samba 状态
+Name[zh_TW]=Samba 狀態
+Name[zu]=Isimo se-Samba
+
+Comment=Samba status monitor
+Comment[ar]=مراقب حالة Samba
+Comment[az]=Samba üçün vəziyyət izləyici
+Comment[be]=Назіральнік стану Samba
+Comment[bg]=Информация за състоянието на сървъра Samba
+Comment[bn]=সাম্বা স্ট্যাটাস নির্দেশক
+Comment[br]=Diskwel saviad Samba
+Comment[bs]=Nadzor statusa samba-e
+Comment[ca]=Monitor de l'estat de Samba
+Comment[cs]=Monitor stavu Samby
+Comment[csb]=Mònitor stónu Sambë
+Comment[cy]=Monitr cyflwr samba
+Comment[da]=Overvågning af samba-status
+Comment[de]=Samba-Statusmonitor
+Comment[el]=Εποπτεία της Samba
+Comment[eo]=Rigardilo por la stato de Sambo
+Comment[es]=Monitor de estado de Samba
+Comment[et]=Samba oleku monitooring
+Comment[eu]=Sambaren egoeraren monitorea
+Comment[fa]=نمایشگر وضعیت Samba
+Comment[fi]=Samban tilan näyttö
+Comment[fr]=Indicateur d'état de Samba
+Comment[fy]=Sambatastânmonitor
+Comment[gl]=Monitor do estado de Samba
+Comment[he]=מידע על המצב של Samba
+Comment[hi]=साम्बा स्थिति मॉनीटर
+Comment[hr]=Nadzor stanje Sambe
+Comment[hu]=Samba állapotmonitor
+Comment[id]=Monitor status Samba
+Comment[is]=Eftirlit með stöðu Samba
+Comment[it]=Controllo dello stato di Samba
+Comment[ja]=Samba の状態を監視します
+Comment[ka]=Samba-ს სტატუსის მონიტორი
+Comment[kk]=Samba күйін бақылау
+Comment[km]=កម្មវិធី​ត្រួត​ពិនិត្យ​ស្ថានភាព Samba
+Comment[ko]=삼바 상태 모니터
+Comment[lo]=ເຄື່ອງມືສອດສ່ອງສະຖານະຂອງເນັດ
+Comment[lt]=Samba būsenos monitorius
+Comment[lv]=Sambas statusa monitors
+Comment[mk]=Монитор на статусот на Samba
+Comment[mn]=Samba-Төлөв харуулагч
+Comment[ms]=Monitor status Samba
+Comment[mt]=Monitur tal-istat tas-Samba
+Comment[nb]=Overvåking av Samba-status
+Comment[nds]=Statuskieker för Samba
+Comment[ne]=साम्बा वस्तुस्थिति मोनिटर
+Comment[nl]=Sambastatusmonitor
+Comment[nn]=Overvaking av Samba-status
+Comment[nso]=Mohlokomedi wa boemo bja Samba
+Comment[oc]=Monitor de l'estat de Samba
+Comment[pa]=ਸਾਂਬਾ ਸਥਿਤੀ ਨਿਗਰਾਨ
+Comment[pl]=Monitor stanu Samby
+Comment[pt]=Monitor do estado do Samba
+Comment[pt_BR]=Monitor de estado do Samba
+Comment[ro]=Monitorizează starea serverului Samba
+Comment[ru]=Состояние сервера Samba
+Comment[rw]=Mugaragaza y'Imimerere Samba
+Comment[se]=Gozit Samba stáhtusa
+Comment[sk]=Monitor stavu Samby
+Comment[sl]=Nadzornik stanja Sambe
+Comment[sr]=Преглед статуса Самбе
+Comment[sr@Latn]=Pregled statusa Sambe
+Comment[sv]=Övervakar Samba-status
+Comment[ta]=சம்பா திரை நிலை
+Comment[tg]=Назорати вазъияти Samba
+Comment[th]=เฝ้าดูสถานะ Samba
+Comment[tr]=Samba için durum izleyici
+Comment[tt]=Samba xäläten küzätüçe
+Comment[uk]=Монітор стану Samba
+Comment[uz]=Samba'ning holatini nazorat qiluvchi vosita
+Comment[uz@cyrillic]=Samba'нинг ҳолатини назорат қилувчи восита
+Comment[ven]=Mutoli wa maimo a Samba
+Comment[vi]=Theo dõi trạng thái samba
+Comment[wa]=Corwaitoe di l' estat di Samba
+Comment[xh]=Umphathi wemeko we Samba
+Comment[zh_CN]=Samba 状态监视器
+Comment[zh_TW]=Samba 狀態監視器
+Comment[zu]=Umphathi wesimo se-samba
+
+Keywords=SMB,SAMBA,Windows network,LAN,System Information
+Keywords[af]=SMB,SAMBA,Windows network,LAN,System Informasie
+Keywords[ar]=SMB,SAMBA,شبكة Windows,شبكة محلية,معلومات النظام
+Keywords[az]=SMB,SAMBA,Pəncərə şəbəkəsi,LAN,Sistem Haqqında Mə'lumat
+Keywords[be]=Сетка Windows,Сетка,Сістэмная інфармацыя,SMB,SAMBA,Windows network,LAN,System Information
+Keywords[bg]=информация, система, системна, самба, сървър, статус, състояние, мрежа, SMB, SAMBA, Windows network, LAN, System Information
+Keywords[br]=SMB,SAMBA,rouedad Windows,LAN,titouroù reizhiad
+Keywords[bs]=SMB,SAMBA,Windows network,LAN,System Information,Windows mreža,mreža,informacije o sustavu
+Keywords[ca]=SMB,SAMBA,Xarxa Windows,LAN,Informació del sistema
+Keywords[cs]=SMB,Samba,Síť Microsoft Windows,LAN,Informace o systému
+Keywords[csb]=SMB,SAMBA,séc Windows,môlowô séc,LAN,wëdowiédzô ò systemie
+Keywords[cy]=SMB,SAMBA,Rhwydwaith Windows,LAN,Gwybodaeth Cysawd
+Keywords[da]=SMB,Samba,Windows-netværk,LAN,Systeminformation
+Keywords[de]=SMB,Samba,Windows-Netzwerk,LAN,Systeminformation
+Keywords[el]=SMB,SAMBA,Δίκτυο Windows,LAN,Πληροφορίες συστήματος
+Keywords[eo]=SMB,Sambo,Vindozo,reto,LAN,sistemo,operaciumo,informo
+Keywords[es]=SMB,SAMBA,Red Windows,LAN,Información del sistema
+Keywords[et]=SMB,SAMBA,Windowsi võrk,LAN,Süsteemi info
+Keywords[eu]=SMB,SAMBA,Windows sarea,LAN,Sistemaren informazioa
+Keywords[fa]=SMB، SAMBA، ویندوز، شبکه، شبکۀ داخلی، اطلاعات سیستم
+Keywords[fi]=SMB,SAMBA,Windows verkko,LAN,Järjestelmätiedot
+Keywords[fr]=réseau Windows,réseau local,informations système,smb,samba,lan,windows
+Keywords[fy]=SMB,SAMBA,Windows network,LAN,systeemynformaasje,Windows-netwurk
+Keywords[ga]=SMB,SAMBA,Líonra Windows,LAN,líonra logánta,Eolas faoin Chóras
+Keywords[gl]=SMB,SAMBA,Rede Windows,LAN,Información do Sistema
+Keywords[he]=רשת מקומית,מידע מערכת,רשת Windows,SAMBA,SMB, SMB,SAMBA,Windows network,LAN,System Information
+Keywords[hi]=एसएमबी,साम्बा,विंडोज़ नेटवर्क,लैन,तंत्र जानकारी
+Keywords[hr]=SMB,SAMBA,Windows network,LAN,System Information,Windows mreža,mreža,podaci o sustavu
+Keywords[hu]=SMB,Samba,Windows-hálózat,LAN,rendszerinformáció
+Keywords[id]=SMB,SAMBA,Windows network,LAN,Informasi Sistem
+Keywords[is]=Netdrif,windows net,kerfi,upplýsingar
+Keywords[it]=SMB,SAMBA,Rete Windows,LAN,Rete locale,Informazioni sul sistema
+Keywords[ja]=SMB,SAMBA,Windowsネットワーク,LAN,システムの情報
+Keywords[km]=SMB,SAMBA,បណ្ដាញ Windows,បណ្ដាញ​មូលដ្ឋាន,ព័ត៌មាន​បណ្ដាញ
+Keywords[lt]=SMB,SAMBA,Windows tinklas,LAN,Sistemos Informacija
+Keywords[lv]=SMB,SAMBA,Windows tīkls,LAN,Sistēmas Informācija
+Keywords[mk]=SMB,SAMBA,Windows network,LAN,System Information, Windows мрежа,Информации за системот,Виндоус мрежа
+Keywords[mn]=SMB,Samba,Виндовс-Сүлжээ,LAN,Системийн мэдээлэл
+Keywords[nb]=SMB,SAMBA,Windows-nettverk,LAN,Systeminformasjon
+Keywords[nds]=SMB,SAMBA,Windowsnettwark,LAN,Systeeminformatschoon
+Keywords[ne]=SMB,SAMBA, सञ्झ्याल सञ्जाल,LAN, प्रणाली सूचना
+Keywords[nl]=SMB,SAMBA,Windows network,LAN,systeeminformatie,Windows-netwerk
+Keywords[nn]=SMB,SAMBA,Windows-nettverk,LAN,systeminformasjon
+Keywords[nso]=SMB,SAMBA,kgokagano ya Windows,LAN,Tshedimoso ya System
+Keywords[oc]=SMB,SAMBA,xarxa Windows,LAN,Informacion dèu sistemo
+Keywords[pa]=SMB,SAMBA,Windows network,LAN,ਸਿਸਟਮ ਜਾਣਕਾਰੀ
+Keywords[pl]=SMB,SAMBA,sieć Windows,sieć lokalna,LAN,informacja o systemie
+Keywords[pt]=SMB,SAMBA,rede Windows,LAN,informações de sistema
+Keywords[pt_BR]=SMB,Samba,Rede Windows,LAN,Informações de sistema
+Keywords[ro]=SMB,SAMBA,rețea Windows,LAN,informații despre sistem
+Keywords[rw]=SMB,SAMBA,Urusobemiyoboro Windows,LAN,Amakuru ya Sisitemu
+Keywords[se]=SMB,SAMBA,Windows-fierbmi,LAN,vuogádatdiehtu
+Keywords[sk]=SMB,SAMBA,sieť Windows,LAN,Systémové Informácie
+Keywords[sl]=SMB,SAMBA,omrežje Windows,LAN,informacije o sistemu
+Keywords[sr]=SMB,SAMBA,Windows network,LAN,System Information,мрежа,системске информације
+Keywords[sr@Latn]=SMB,SAMBA,Windows network,LAN,System Information,mreža,sistemske informacije
+Keywords[sv]=SMB,Samba,Windows nätverk,LAN,Systeminformation
+Keywords[ta]=SMB,சாம்பா,சாளரங்களின் வலை,LAN,அமைப்பு தகவல்
+Keywords[th]=SMB,SAMBA,เครือข่ายวินโดว์ส,เครือข่ายท้องถิ่น,ข้อมูลระบบ
+Keywords[tr]=SMB,SAMBA,Pencere ağı,LAN,Sistem Hakkında Bilgi
+Keywords[uk]=SMB,SAMBA,мережа Windows,lan,ЛОМ,системна інформація
+Keywords[uz]=SMB,SAMBA,Windows tarmogʻi,Tizim haqida maʼlumot,LAN
+Keywords[uz@cyrillic]=SMB,SAMBA,Windows тармоғи,Тизим ҳақида маълумот,LAN
+Keywords[ven]=SMB,SAMBA,Mawindo a vhukwamani,LAN,Mafhungo a sisitemu
+Keywords[vi]=SMB,SAMBA,Mạng Windows,LAN,Thông tin hệ thống
+Keywords[wa]=SMB,SAMBA,rantoele Windows,LAN,rantoele locåle,informåcion do sistinme
+Keywords[xh]=SMB,SAMBA,umsebenzi womnatha wee window,LAN,Ulwazi lwendlela yokusebenza
+Keywords[zh_CN]=SMB,SAMBA,Windows network,LAN,System Information,局域网,系统信息
+Keywords[zh_TW]=SMB,SAMBA,Windows network,LAN,System Information,Windows 網路,區域網路,系統資訊
+Keywords[zu]=SMB,SAMBA,Uxhumano olusakazekile lwama-windows,LAN,Ulwazi lwesistimu
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/screensaver/Makefile.am b/kcontrol/screensaver/Makefile.am
new file mode 100644
index 000000000..f5fc4eec3
--- /dev/null
+++ b/kcontrol/screensaver/Makefile.am
@@ -0,0 +1,20 @@
+
+AM_CPPFLAGS = $(GLINC) $(all_includes)
+
+kde_module_LTLIBRARIES = kcm_screensaver.la
+
+kcm_screensaver_la_SOURCES = advanceddialogimpl.ui scrnsave.cpp testwin.cpp saverlist.cpp \
+ saverconfig.cpp advanceddialog.cpp kswidget.cpp
+kcm_screensaver_la_LDFLAGS = -module -avoid-version $(all_libraries) -no-undefined
+kcm_screensaver_la_LIBADD = $(LIB_KSYCOCA) $(DPMSLIB) $(GLLIB)
+METASOURCES = AUTO
+
+noinst_HEADERS = scrnsave.h
+
+messages: rc.cpp
+ sed 's/X-KDE-Category=\(.*\)/i18n\("Screen saver category","\1"\);/' < category_list > category_list.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmscreensaver.pot
+ -rm -f category_list.cpp
+
+xdg_apps_DATA = screensaver.desktop
+
diff --git a/kcontrol/screensaver/advanceddialog.cpp b/kcontrol/screensaver/advanceddialog.cpp
new file mode 100644
index 000000000..273888960
--- /dev/null
+++ b/kcontrol/screensaver/advanceddialog.cpp
@@ -0,0 +1,174 @@
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <qcombobox.h>
+#include <kdebug.h>
+
+#include <qwhatsthis.h>
+#include <qstring.h>
+
+#include <config.h>
+
+#include "advanceddialog.h"
+#include "advanceddialogimpl.h"
+#include "stdlib.h"
+
+#include "advanceddialog.moc"
+
+KScreenSaverAdvancedDialog::KScreenSaverAdvancedDialog(QWidget *parent, const char* name)
+ : KDialogBase( parent, name, true, i18n( "Advanced Options" ),
+ Ok | Cancel, Ok, true )
+{
+
+ dialog = new AdvancedDialog(this);
+ setMainWidget(dialog);
+
+ readSettings();
+
+ connect(dialog->qcbPriority, SIGNAL(activated(int)),
+ this, SLOT(slotPriorityChanged(int)));
+
+ connect(dialog->qcbTopLeft, SIGNAL(activated(int)),
+ this, SLOT(slotChangeTopLeftCorner(int)));
+ connect(dialog->qcbTopRight, SIGNAL(activated(int)),
+ this, SLOT(slotChangeTopLeftCorner(int)));
+ connect(dialog->qcbBottomLeft, SIGNAL(activated(int)),
+ this, SLOT(slotChangeTopLeftCorner(int)));
+ connect(dialog->qcbBottomRight, SIGNAL(activated(int)),
+ this, SLOT(slotChangeTopLeftCorner(int)));
+
+#ifndef HAVE_SETPRIORITY
+ dialog->qgbPriority->setEnabled(false);
+#endif
+}
+
+void KScreenSaverAdvancedDialog::readSettings()
+{
+ KConfig *config = new KConfig("kdesktoprc");
+ config->setGroup("ScreenSaver");
+
+ mPriority = config->readNumEntry("Priority", 19);
+ if (mPriority < 0) mPriority = 0;
+ if (mPriority > 19) mPriority = 19;
+
+ dialog->qcbTopLeft->setCurrentItem(config->readNumEntry("ActionTopLeft", 0));
+ dialog->qcbTopRight->setCurrentItem(config->readNumEntry("ActionTopRight", 0));
+ dialog->qcbBottomLeft->setCurrentItem(config->readNumEntry("ActionBottomLeft", 0));
+ dialog->qcbBottomRight->setCurrentItem(config->readNumEntry("ActionBottomRight", 0));
+
+
+ switch(mPriority)
+ {
+ case 19: // Low
+ dialog->qcbPriority->setCurrentItem(0);
+ kdDebug() << "setting low" << endl;
+ break;
+ case 10: // Medium
+ dialog->qcbPriority->setCurrentItem(1);
+ kdDebug() << "setting medium" << endl;
+ break;
+ case 0: // High
+ dialog->qcbPriority->setCurrentItem(2);
+ kdDebug() << "setting high" << endl;
+ break;
+ }
+
+ mChanged = false;
+ delete config;
+}
+
+void KScreenSaverAdvancedDialog::slotPriorityChanged(int val)
+{
+ switch (val)
+ {
+ case 0: // Low
+ mPriority = 19;
+ kdDebug() << "low priority" << endl;
+ break;
+ case 1: // Medium
+ mPriority = 10;
+ kdDebug() << "medium priority" << endl;
+ break;
+ case 2: // High
+ mPriority = 0;
+ kdDebug() << "high priority" << endl;
+ break;
+ }
+ mChanged = true;
+}
+
+void KScreenSaverAdvancedDialog::slotOk()
+{
+ if (mChanged)
+ {
+ KConfig *config = new KConfig("kdesktoprc");
+ config->setGroup( "ScreenSaver" );
+
+ config->writeEntry("Priority", mPriority);
+ config->writeEntry(
+ "ActionTopLeft", dialog->qcbTopLeft->currentItem());
+ config->writeEntry(
+ "ActionTopRight", dialog->qcbTopRight->currentItem());
+ config->writeEntry(
+ "ActionBottomLeft", dialog->qcbBottomLeft->currentItem());
+ config->writeEntry(
+ "ActionBottomRight", dialog->qcbBottomRight->currentItem());
+ config->sync();
+ delete config;
+ }
+ accept();
+}
+
+void KScreenSaverAdvancedDialog::slotChangeBottomRightCorner(int)
+{
+ mChanged = true;
+}
+
+void KScreenSaverAdvancedDialog::slotChangeBottomLeftCorner(int)
+{
+ mChanged = true;
+}
+
+void KScreenSaverAdvancedDialog::slotChangeTopRightCorner(int)
+{
+ mChanged = true;
+}
+
+void KScreenSaverAdvancedDialog::slotChangeTopLeftCorner(int)
+{
+ mChanged = true;
+}
+
+/* =================================================================================================== */
+
+AdvancedDialog::AdvancedDialog(QWidget *parent, const char *name) : AdvancedDialogImpl(parent, name)
+{
+ monitorLabel->setPixmap(QPixmap(locate("data", "kcontrol/pics/monitor.png")));
+ QWhatsThis::add(qcbPriority, "<qt>" + i18n("Specify the priority that the screensaver will run at. A higher priority may mean that the screensaver runs faster, though may reduce the speed that other programs run at while the screensaver is active.") + "</qt>");
+ QString qsTopLeft("<qt>" + i18n("The action to take when the mouse cursor is located in the top left corner of the screen for 15 seconds.") + "</qt>");
+ QString qsTopRight("<qt>" + i18n("The action to take when the mouse cursor is located in the top right corner of the screen for 15 seconds.") + "</qt>");
+ QString qsBottomLeft("<qt>" + i18n("The action to take when the mouse cursor is located in the bottom left corner of the screen for 15 seconds.") + "</qt>");
+ QString qsBottomRight("<qt>" + i18n("The action to take when the mouse cursor is located in the bottom right corner of the screen for 15 seconds.") + "</qt>");
+ QWhatsThis::add(qlTopLeft, qsTopLeft);
+ QWhatsThis::add(qcbTopLeft, qsTopLeft);
+ QWhatsThis::add(qlTopRight, qsTopRight);
+ QWhatsThis::add(qcbTopRight, qsTopRight);
+ QWhatsThis::add(qlBottomLeft, qsBottomLeft);
+ QWhatsThis::add(qcbBottomLeft, qsBottomLeft);
+ QWhatsThis::add(qlBottomRight, qsBottomRight);
+ QWhatsThis::add(qcbBottomRight, qsBottomRight);
+}
+
+AdvancedDialog::~AdvancedDialog()
+{
+
+}
+
+void AdvancedDialog::setMode(QComboBox *box, int i)
+{
+ box->setCurrentItem(i);
+}
+
+int AdvancedDialog::mode(QComboBox *box)
+{
+ return box->currentItem();
+}
diff --git a/kcontrol/screensaver/advanceddialog.h b/kcontrol/screensaver/advanceddialog.h
new file mode 100644
index 000000000..813c9fc82
--- /dev/null
+++ b/kcontrol/screensaver/advanceddialog.h
@@ -0,0 +1,61 @@
+#ifndef ADVANCEDDIALOG_H
+#define ADVANCEDDIALOG_H
+
+#include <kdialogbase.h>
+#include <qwidget.h>
+#include <kconfig.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qwhatsthis.h>
+#include <qgroupbox.h>
+#include <qobject.h>
+#include <qcheckbox.h>
+#include <qslider.h>
+
+#include "advanceddialogimpl.h"
+
+class AdvancedDialog : public AdvancedDialogImpl
+{
+public:
+ AdvancedDialog(QWidget *parent = 0, const char *name = 0);
+ ~AdvancedDialog();
+ void setMode(QComboBox *box, int i);
+ int mode(QComboBox *box);
+};
+
+/* =================================================================================================== */
+
+class KScreenSaverAdvancedDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ KScreenSaverAdvancedDialog(QWidget *parent, const char* name = 0);
+
+public slots:
+ void slotOk();
+
+protected slots:
+ void slotPriorityChanged(int val);
+ void slotChangeBottomRightCorner(int);
+ void slotChangeBottomLeftCorner(int);
+ void slotChangeTopRightCorner(int);
+ void slotChangeTopLeftCorner(int);
+
+private:
+ void readSettings();
+
+ QCheckBox *m_topLeftCorner;
+ QCheckBox *m_bottomLeftCorner;
+ QCheckBox *m_topRightCorner;
+ QCheckBox *m_bottomRightCorner;
+ QSlider *mPrioritySlider;
+
+ bool mChanged;
+ int mPriority;
+ AdvancedDialog *dialog;
+
+};
+
+
+#endif
+
diff --git a/kcontrol/screensaver/advanceddialogimpl.ui b/kcontrol/screensaver/advanceddialogimpl.ui
new file mode 100644
index 000000000..814a3867c
--- /dev/null
+++ b/kcontrol/screensaver/advanceddialogimpl.ui
@@ -0,0 +1,397 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AdvancedDialogImpl</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Form1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>403</width>
+ <height>399</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>qgbPriority</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>GroupBoxPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="title">
+ <string>Screen Saver Priority</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="0" column="0">
+ <item>
+ <property name="text">
+ <string>Low</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Medium</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>High</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>qcbPriority</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string></string>
+ </property>
+ </widget>
+ <spacer row="0" column="1">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Screen Corner Actions</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="3" column="0" rowspan="2" colspan="2">
+ <property name="name">
+ <cstring>qlMonitorLabel</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>qlTopLeft</cstring>
+ </property>
+ <property name="text">
+ <string>Top left:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>No Action</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Lock Screen</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Prevent Locking</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>qcbTopLeft</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>qlTopRight</cstring>
+ </property>
+ <property name="text">
+ <string>Top right:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>No Action</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Lock Screen</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Prevent Locking</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>qcbTopRight</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="5" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>qlBottomLeft</cstring>
+ </property>
+ <property name="text">
+ <string>Bottom left:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>No Action</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Lock Screen</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Prevent Locking</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>qcbBottomLeft</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>qlBottomRight</cstring>
+ </property>
+ <property name="text">
+ <string>Bottom right:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>No Action</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Lock Screen</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Prevent Locking</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>qcbBottomRight</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>monitorLabel</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer10</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kcontrol/screensaver/category_list b/kcontrol/screensaver/category_list
new file mode 100644
index 000000000..61115c0dc
--- /dev/null
+++ b/kcontrol/screensaver/category_list
@@ -0,0 +1,16 @@
+// This list contains all screen saver categories.
+// The categories are extracted for translation (see Makefile.am).
+
+// To show a screen saver in the list under a category, add the
+// category in the screen saver desktop file using the syntax below.
+
+X-KDE-Category=Banners & Pictures
+X-KDE-Category=Desktop Distortions
+X-KDE-Category=Flying Things
+X-KDE-Category=Fractals
+X-KDE-Category=Gadgets & Simulations
+X-KDE-Category=Illusions of Depth
+X-KDE-Category=Miscellaneous
+X-KDE-Category=OpenGL Screen Savers
+X-KDE-Category=Rapid Motion
+X-KDE-Category=Visit to Flatland
diff --git a/kcontrol/screensaver/configure.in.in b/kcontrol/screensaver/configure.in.in
new file mode 100644
index 000000000..3ea3b292d
--- /dev/null
+++ b/kcontrol/screensaver/configure.in.in
@@ -0,0 +1,8 @@
+AC_HAVE_GL(
+ [
+ AC_CHECK_LIB(GL,glXChooseVisual,
+ [
+ AC_DEFINE(HAVE_GLXCHOOSEVISUAL, 1, [Define if you have glXChooseVisual()])
+ ])
+ ],[]
+ )
diff --git a/kcontrol/screensaver/kssmonitor.h b/kcontrol/screensaver/kssmonitor.h
new file mode 100644
index 000000000..72122e979
--- /dev/null
+++ b/kcontrol/screensaver/kssmonitor.h
@@ -0,0 +1,15 @@
+#ifndef KSSMONITOR_H
+#define KSSMONITOR_H
+
+#include "kswidget.h"
+
+class KSSMonitor : public KSWidget
+{
+public:
+ KSSMonitor( QWidget *parent ) : KSWidget( parent ) {}
+
+ // we don't want no steenking palette change
+ virtual void setPalette( const QPalette & ) {}
+};
+
+#endif
diff --git a/kcontrol/screensaver/kswidget.cpp b/kcontrol/screensaver/kswidget.cpp
new file mode 100644
index 000000000..58f28ff31
--- /dev/null
+++ b/kcontrol/screensaver/kswidget.cpp
@@ -0,0 +1,71 @@
+#include <config.h>
+
+#include <kwin.h>
+#include "testwin.h"
+
+#ifdef HAVE_GLXCHOOSEVISUAL
+#include <GL/glx.h>
+#endif
+
+KSWidget::KSWidget( QWidget* parent, const char* name, int f )
+ : QXEmbed( parent, name, f ), colormap( None )
+{
+// use visual with support for double-buffering, for opengl
+// this code is duplicated in kdebase/kdesktop/lock/
+#ifdef HAVE_GLXCHOOSEVISUAL
+ Visual* visual = CopyFromParent;
+ XSetWindowAttributes attrs;
+ int flags = 0;
+ if( true /*mOpenGLVisual*/ )
+ {
+ static int attribs[][ 15 ] =
+ {
+ #define R GLX_RED_SIZE
+ #define G GLX_GREEN_SIZE
+ #define B GLX_BLUE_SIZE
+ { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, GLX_STENCIL_SIZE, 1, None },
+ { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, GLX_DOUBLEBUFFER, GLX_STENCIL_SIZE, 1, None },
+ { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, None },
+ { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, GLX_DOUBLEBUFFER, None },
+ { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, GLX_STENCIL_SIZE, 1, None },
+ { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, GLX_STENCIL_SIZE, 1, None },
+ { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, None },
+ { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, None },
+ { GLX_RGBA, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, GLX_STENCIL_SIZE, 1, None },
+ { GLX_RGBA, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, None },
+ { GLX_RGBA, GLX_DEPTH_SIZE, 8, GLX_STENCIL_SIZE, 1, None },
+ { GLX_RGBA, GLX_DEPTH_SIZE, 8, None }
+ #undef R
+ #undef G
+ #undef B
+ };
+ for( unsigned int i = 0;
+ i < sizeof( attribs ) / sizeof( attribs[ 0 ] );
+ ++i )
+ {
+ if( XVisualInfo* info = glXChooseVisual( x11Display(), x11Screen(), attribs[ i ] ))
+ {
+ visual = info->visual;
+ colormap = XCreateColormap( x11Display(), RootWindow( x11Display(), x11Screen()), visual, AllocNone );
+ attrs.colormap = colormap;
+ flags |= CWColormap;
+ XFree( info );
+ break;
+ }
+ }
+ }
+ Window w = XCreateWindow( x11Display(), parentWidget() ? parentWidget()->winId() : RootWindow( x11Display(), x11Screen()),
+ x(), y(), width(), height(), 0, x11Depth(), InputOutput, visual, flags, &attrs );
+ create( w );
+#endif
+}
+
+KSWidget::~KSWidget()
+{
+#ifdef HAVE_GLXCHOOSEVISUAL
+ if( colormap != None )
+ XFreeColormap( x11Display(), colormap );
+#endif
+}
+
+#include "kswidget.moc"
diff --git a/kcontrol/screensaver/kswidget.h b/kcontrol/screensaver/kswidget.h
new file mode 100644
index 000000000..56d731955
--- /dev/null
+++ b/kcontrol/screensaver/kswidget.h
@@ -0,0 +1,17 @@
+#ifndef KSWIDGET_H
+#define KSWIDGET_H
+
+#include <qxembed.h>
+#include <X11/X.h>
+
+class KSWidget : public QXEmbed
+{
+ Q_OBJECT
+public:
+ KSWidget( QWidget *parent = NULL, const char* name = NULL, int flags = 0 );
+ virtual ~KSWidget();
+private:
+ Colormap colormap;
+};
+
+#endif
diff --git a/kcontrol/screensaver/saverconfig.cpp b/kcontrol/screensaver/saverconfig.cpp
new file mode 100644
index 000000000..a32d61e0e
--- /dev/null
+++ b/kcontrol/screensaver/saverconfig.cpp
@@ -0,0 +1,38 @@
+#include <kdesktopfile.h>
+#include <klocale.h>
+
+#include "saverconfig.h"
+
+SaverConfig::SaverConfig()
+{
+}
+
+bool SaverConfig::read(const QString &file)
+{
+ KDesktopFile config(file, true);
+ if( !config.tryExec())
+ return false;
+ mExec = config.readPathEntry("Exec");
+ mName = config.readEntry("Name");
+ mCategory = i18n("Screen saver category", // Must be same in Makefile.am
+ config.readEntry("X-KDE-Category").utf8());
+
+ if (config.hasActionGroup("Setup"))
+ {
+ config.setActionGroup("Setup");
+ mSetup = config.readPathEntry("Exec");
+ }
+
+ if (config.hasActionGroup("InWindow"))
+ {
+ config.setActionGroup("InWindow");
+ mSaver = config.readPathEntry("Exec");
+ }
+
+ int indx = file.findRev('/');
+ if (indx >= 0) {
+ mFile = file.mid(indx+1);
+ }
+
+ return !mSaver.isEmpty();
+}
diff --git a/kcontrol/screensaver/saverconfig.h b/kcontrol/screensaver/saverconfig.h
new file mode 100644
index 000000000..1327dfdaa
--- /dev/null
+++ b/kcontrol/screensaver/saverconfig.h
@@ -0,0 +1,29 @@
+#ifndef SAVERCONFIG_H
+#define SAVERCONFIG_H
+
+#include <qstring.h>
+
+class SaverConfig
+{
+public:
+ SaverConfig();
+
+ bool read(const QString &file);
+
+ QString exec() const { return mExec; }
+ QString setup() const { return mSetup; }
+ QString saver() const { return mSaver; }
+ QString name() const { return mName; }
+ QString file() const { return mFile; }
+ QString category() const { return mCategory; }
+
+protected:
+ QString mExec;
+ QString mSetup;
+ QString mSaver;
+ QString mName;
+ QString mFile;
+ QString mCategory;
+};
+
+#endif
diff --git a/kcontrol/screensaver/saverlist.cpp b/kcontrol/screensaver/saverlist.cpp
new file mode 100644
index 000000000..6b27973e0
--- /dev/null
+++ b/kcontrol/screensaver/saverlist.cpp
@@ -0,0 +1,13 @@
+
+#include "saverlist.h"
+
+class SaverConfig;
+class QPtrCollection;
+
+int SaverList::compareItems(QPtrCollection::Item item1, QPtrCollection::Item item2)
+{
+ SaverConfig *s1 = (SaverConfig *)item1;
+ SaverConfig *s2 = (SaverConfig *)item2;
+
+ return s1->name().localeAwareCompare(s2->name());
+}
diff --git a/kcontrol/screensaver/saverlist.h b/kcontrol/screensaver/saverlist.h
new file mode 100644
index 000000000..e6f36be18
--- /dev/null
+++ b/kcontrol/screensaver/saverlist.h
@@ -0,0 +1,14 @@
+#ifndef SAVERLIST_H
+#define SAVERLIST_H
+
+#include <qptrlist.h>
+
+#include "saverconfig.h"
+
+class SaverList : public QPtrList<SaverConfig>
+{
+protected:
+ virtual int compareItems(QPtrCollection::Item item1, QPtrCollection::Item item2);
+};
+
+#endif
diff --git a/kcontrol/screensaver/screensaver.desktop b/kcontrol/screensaver/screensaver.desktop
new file mode 100644
index 000000000..faab59047
--- /dev/null
+++ b/kcontrol/screensaver/screensaver.desktop
@@ -0,0 +1,240 @@
+[Desktop Entry]
+Exec=kcmshell screensaver
+Icon=kscreensaver
+Type=Application
+DocPath=kcontrol/screensaver/index.html
+
+
+X-KDE-Library=screensaver
+X-KDE-FactoryName=screensaver
+X-KDE-ParentApp=kcontrol
+
+Name=Screen Saver
+Name[af]=Skerm Bewaarder
+Name[ar]=مدخِر الشاشة
+Name[be]=Зберагальнік экрана
+Name[bg]=Екранен предпазител
+Name[bn]=স্ক্রীন সেভার
+Name[br]=Damanter Skramm
+Name[bs]=Zaštita ekrana (screen saver)
+Name[ca]=Salvapantalles
+Name[cs]=Šetřič obrazovky
+Name[csb]=Wëgaszôcz ekranu
+Name[cy]=Arbedydd Sgrîn
+Name[da]=Pauseskærm
+Name[de]=Bildschirmschoner
+Name[el]=Προφύλαξη οθόνης
+Name[eo]=Ekrankurteno
+Name[es]=Salvapantallas
+Name[et]=Ekraanisäästja
+Name[eu]=Pantaila babeslea
+Name[fa]=محافظ صفحه نمایش
+Name[fi]=Näytönsäästäjä
+Name[fr]=Écran de veille
+Name[fy]=Skermbefeiliging
+Name[ga]=Spárálaí Scáileáin
+Name[gl]=Protector de Pantalla
+Name[he]=שומר מסך
+Name[hi]=स्क्रीन सेवर
+Name[hr]=Zaštita zaslona
+Name[hu]=Képernyővédők
+Name[is]=Skjásvæfur
+Name[it]=Salvaschermo
+Name[ja]=スクリーンセーバー
+Name[kk]=Экран қорғаушысы
+Name[km]=ធាតុ​សន្សំ​អេក្រង់
+Name[ko]=화면 보호기
+Name[lo]=ໂປຣແກຣມຮັກສາຫນ້າຈໍ
+Name[lt]=Ekrano užsklanda
+Name[lv]=Ekrāna saudzētāji
+Name[mk]=Екрански чувар
+Name[mn]=Дэлгэц гамнагч
+Name[mt]=Screen saver
+Name[nb]=Pauseskjerm
+Name[nds]=Pausschirm
+Name[ne]=स्क्रिनसेभर
+Name[nl]=Schermbeveiliging
+Name[nn]=Pauseskjerm
+Name[nso]=Seboloki sa Pontsho
+Name[pa]=ਸਕਰੀਨ-ਸੇਵਰ
+Name[pl]=Wygaszacz ekranu
+Name[pt]=Protector de Ecrã
+Name[pt_BR]=Protetor de Tela
+Name[ro]=Protecție de ecran
+Name[ru]=Хранитель экрана
+Name[rw]=Muzigama Mugaragaza
+Name[se]=Šearbmasiestejeaddji
+Name[sk]=Šetrič obrazovky
+Name[sl]=Ohranjevalnik zaslona
+Name[sr]=Чувар екрана
+Name[sr@Latn]=Čuvar ekrana
+Name[ss]=Sigcini-skrini
+Name[sv]=Skärmsläckare
+Name[ta]=திரைக் காப்பு
+Name[te]=స్క్రీన్ సేవర్
+Name[tg]=Ноҷи парда
+Name[th]=โปรแกรมรักษาหน้าจอ
+Name[tr]=Ekran Koruyucusu
+Name[tt]=Küräk Saqlağıç
+Name[uk]=Зберігач екрана
+Name[uz]=Ekran saqlovchisi
+Name[uz@cyrillic]=Экран сақловчиси
+Name[ven]=Tshivhulungi tsha tshikirini
+Name[vi]=Bảo vệ Màn hình
+Name[wa]=Sipårgneu di waitroûle
+Name[xh]=Umgcini Wekhusi
+Name[zh_CN]=屏幕保护程序
+Name[zh_TW]=螢幕保護程式
+Name[zu]=Umgcini skrini
+
+Comment=Screen Saver Settings
+Comment[af]=Skerm Bewaarder Instellings
+Comment[ar]=تعيينات مدخِر الشاشة
+Comment[be]=Настаўленні ахоўніка экрана
+Comment[bg]=Настройване предпазителя на екрана
+Comment[bn]=স্ক্রীন সেভার সেটিংস
+Comment[br]=Kefluniadur an Damanter Skramm
+Comment[bs]=Postavke screen savera
+Comment[ca]=Arranjament del salvapantalles
+Comment[cs]=Nastavení šetřiče obrazovky
+Comment[csb]=Nsatôw wëgaszôcza ekranu
+Comment[cy]=Gosodiadau Arbedydd Sgrîn
+Comment[da]=Opsætning af pauseskærm
+Comment[de]=Einstellungen für Bildschirmschoner
+Comment[el]=Ρυθμίσεις προφύλαξης οθόνης
+Comment[eo]=Agordo de la ekrankurteno
+Comment[es]=Preferencias del salvapantallas
+Comment[et]=Ekraanisäästja seadistused
+Comment[eu]=Pantaila babeslearen ezarpenak
+Comment[fa]=تنظیمات محافظ صفحه نمایش
+Comment[fi]=Näytönsäästäjän asetukset
+Comment[fr]=Configuration de l'écran de veille
+Comment[fy]=Skermbefeiliging ynstelle
+Comment[ga]=Socruithe na Spárálaithe Scáileáin
+Comment[gl]=Opcións do Protector de Pantalla
+Comment[he]=שינוי הגדרות שומר המסך
+Comment[hi]=स्क्रीन सेवर विन्यास
+Comment[hr]=Postavke zaštite zaslona
+Comment[hu]=A képernyővédő beállításai
+Comment[is]=Stillingar skjásvæfu
+Comment[it]=Impostazioni salvaschermo
+Comment[ja]=スクリーンセーバーの設定
+Comment[ka]=Screen Saver-ის კონფიგურაცია
+Comment[kk]=Экран қорғаушысының параметрлері
+Comment[km]=ការ​កំណត់​ធាតុ​សន្សំ​អេក្រង់
+Comment[ko]=화면 보호기 설정
+Comment[lo]=ຕົວຢ່າງໂປຣແກຣມຮັກສາຫນ້າຈໍ
+Comment[lt]=Ekrano užsklandos nustatymai
+Comment[lv]=Ekrāna saudzētāju parametri
+Comment[mk]=Поставувања на екранскиот чувар
+Comment[mn]=Дэлгэц гамнагчийн тохируулга
+Comment[ms]=Seting Screen Saver
+Comment[mt]=Setings tal-iscreensaver
+Comment[nb]=Tilpasning av pauseskjerm
+Comment[nds]=Instellen för den Pausschirm
+Comment[ne]=स्क्रिनसेभर सेटिङ
+Comment[nl]=Schermbeveiliging instellen
+Comment[nn]=Innstillingar for pauseskjerm
+Comment[nso]=Dipeakanyo tsa Seboloki sa Pontsho
+Comment[pa]=ਸਕਰੀਨ-ਸੇਵਰ (ਸਕਰੀਨ-ਸੇਵਰ) ਸੈਟਿੰਗ
+Comment[pl]=Ustawienia wygaszacza ekranu
+Comment[pt]=Configuração do Protector de Ecrã
+Comment[pt_BR]=Configurações do Protetor de Tela
+Comment[ro]=Configurează setările pentru protecția de ecran
+Comment[ru]=Настройка хранителя экрана
+Comment[rw]=Amagenamiterere Muzigama Mugaragaza
+Comment[se]=Šearbmasiestejeaddji heivehusat
+Comment[sk]=Nastavenie šetriča obrazovky
+Comment[sl]=Nastavitve za ohranjevalnik zaslona
+Comment[sr]=Поставке чувара екрана
+Comment[sr@Latn]=Postavke čuvara ekrana
+Comment[ss]=Kuhleleka kwesigcini-skrini
+Comment[sv]=Anpassa skärmsläckare
+Comment[ta]=திரை காப்பு அமைப்புகள்
+Comment[te]=స్క్రీన్ సేవర్ అమరికలు
+Comment[tg]=Танзимоти ноҷи парда
+Comment[th]=ตั้งค่าโปรแกรมรักษาหน้าจอ
+Comment[tr]=Ekran Koruyucusu Ayarları
+Comment[tt]=Küräk Saqlağıçın Caylaw
+Comment[uk]=Налаштування зберігача екрана
+Comment[uz]=Ekran saqlovchisining moslamalari
+Comment[uz@cyrillic]=Экран сақловчисининг мосламалари
+Comment[ven]=Mavhekanyele a tshivhulungo tsha tshikirini
+Comment[vi]=Thiết lập Trình bảo vệ Màn hình
+Comment[wa]=Apontiaedjes do spårgneu di waitroûle
+Comment[xh]=Izicwangciso Zomgcini Wekhusi
+Comment[zh_CN]=屏幕保护程序设置
+Comment[zh_TW]=螢幕保護程式設定
+Comment[zu]=Izilungiselelo Zomgcini skrini
+
+
+Keywords=screensavers,Priority
+Keywords[ar]=مدخري الشاشة,الأولوية
+Keywords[az]=ekran qoruyucular,Üstünlük,ekran qoruyucusu,ekran qoruyucuları
+Keywords[be]=Зберагальнік экрану.Прыярытэт,screensavers,Priority
+Keywords[bg]=предпазител, екран, приоритет, screensavers, Priority
+Keywords[ca]=salvapantalles,Prioritat
+Keywords[cs]=Šetřiče obrazovky,Priorita
+Keywords[csb]=wëgaszaczë ekranu,prioritet
+Keywords[cy]=arbedyddion sgrîn,Blaenoriaeth
+Keywords[da]=pauseskærme,Prioritet
+Keywords[de]=Bildschirmschoner,Priorität
+Keywords[el]=προφύλαξη οθόνης,Προτεραιότητα
+Keywords[eo]=ekrano,kurteno,prioritato
+Keywords[es]=salvapantallas,Prioridad
+Keywords[et]=ekraanisäästjad,prioriteet
+Keywords[eu]=pantaila babesleak,lehentasuna
+Keywords[fa]=محافظهای صفحه نمایش، اولویت
+Keywords[fi]=näytönsäästäjät,prioriteetti
+Keywords[fr]=écrans de veille,priorité,économiseur
+Keywords[fy]=screensavers,skermbefeiliging,prioriteit,skermferskoatteling
+Keywords[ga]=spárálaithe scáileáin,tosaíocht
+Keywords[gl]=protectores de pantalla,Prioridade
+Keywords[he]=שומרי מסך,עדיפות, screensavers,Priority
+Keywords[hi]=स्क्रीन-सेवर्स,प्राथमिकता
+Keywords[hr]=screensavers,Priority,zaštita zaslona,prioritet
+Keywords[hu]=képernyővédők,prioritás
+Keywords[id]=screensavers,Prioritas
+Keywords[is]=skjásvæfa,forgangur
+Keywords[it]=salvaschermi,priorità
+Keywords[ja]=スクリーンセーバー,優先度
+Keywords[km]=ធាតុ​សន្សំ​អេក្រង់,អាទិភាព
+Keywords[lo]=ຄວາມສຳຄັນຂອງໂປຣແກຣມຮັກສາຈໍພາບ
+Keywords[lt]=ekrano užsklanda,ekrano užsklandos,Pirmenybė
+Keywords[lv]=ekrāna saudzētāji,Prioritāte
+Keywords[mk]=screensavers,Priority,екран,екрански чувар,приоритет
+Keywords[mn]=Дэлгэц гамнагч,Давуу эрх
+Keywords[ms]=gantian skrin, Keutamaan
+Keywords[nb]=skjermbeskyttere,pauseskjerme,prioritet
+Keywords[nds]=screensavers,Pausschirmen,Prioriteet
+Keywords[ne]=स्क्रिनसेभर, प्राथमिकता
+Keywords[nl]=screensavers,schermbeveiliging,prioriteit,schermvergrendeling
+Keywords[nn]=pauseskjerm,prioritet
+Keywords[nso]=diboloki tsa pontsho,Kgethokgolo
+Keywords[pa]=ਸਕਰੀਨ-ਸੇਵਰ,ਦਰਜਾ
+Keywords[pl]=wygaszacze ekranu,priorytet
+Keywords[pt]=protectores de ecrã,prioridade
+Keywords[pt_BR]=protetores de tela,prioridade
+Keywords[ro]=protecție de ecran,prioritate
+Keywords[rw]=MuzigamaMugaragaza,Uburenganzira
+Keywords[se]=šearbmasiestejeaddji,ovdavuorru
+Keywords[sk]=Šetriče obrazovky, Priorita
+Keywords[sl]=ohranjevalniki zaslona,prednost
+Keywords[sr]=screensavers,Priority,чувари екрана,приоритет
+Keywords[sr@Latn]=screensavers,Priority,čuvari ekrana,prioritet
+Keywords[sv]=skärmsläckare,Prioritet
+Keywords[ta]=திரைக்காப்பு, முக்கியத்துவம்
+Keywords[th]=ความสำคัญ,โปรแกรมรักษาจอภาพ
+Keywords[tr]=ekran koruyucular,Öncelik,ekran koruyucusu,ekran koruyucuları
+Keywords[uk]=зберігачі екрана,пріоритет
+Keywords[uz]=ekran saqlovchilari,Muhimlik darajasi
+Keywords[uz@cyrillic]=экран сақловчилари,Муҳимлик даражаси
+Keywords[ven]=Tshifhatuwo tsha khomupwutha,Zwithogomelwaho
+Keywords[vi]=bảo vệ màn hình,Ưu tiên
+Keywords[wa]=sipårgneu di waitroûle,prumiristé
+Keywords[xh]=abagcini bekhusi,Ukubaluleka
+Keywords[zh_CN]=screensavers,Priority,优先级,屏幕保护程序
+Keywords[zh_TW]=screensavers,Priority,螢幕保護程式,優先權
+Keywords[zu]=abagcini zikrini,Ukubaluleka
+
+Categories=Qt;KDE;X-KDE-settings-looknfeel;
diff --git a/kcontrol/screensaver/scrnsave.cpp b/kcontrol/screensaver/scrnsave.cpp
new file mode 100644
index 000000000..a40c51919
--- /dev/null
+++ b/kcontrol/screensaver/scrnsave.cpp
@@ -0,0 +1,862 @@
+//-----------------------------------------------------------------------------
+//
+// KDE Display screen saver setup module
+//
+// Copyright (c) Martin R. Jones 1996,1999,2002
+//
+// Converted to a kcc module by Matthias Hoelzer 1997
+//
+
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qheader.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlistview.h>
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <qtimer.h>
+#include <qwhatsthis.h>
+
+#include <dcopclient.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kdialogbase.h>
+#include <kgenericfactory.h>
+#include <kiconloader.h>
+#include <knuminput.h>
+#include <kprocess.h>
+#include <kservicegroup.h>
+#include <kstandarddirs.h>
+
+#include <X11/Xlib.h>
+
+#include "scrnsave.h"
+
+#include <fixx11h.h>
+
+template class QPtrList<SaverConfig>;
+
+const uint widgetEventMask = // X event mask
+(uint)(
+ ExposureMask |
+ PropertyChangeMask |
+ StructureNotifyMask
+ );
+
+//===========================================================================
+// DLL Interface for kcontrol
+typedef KGenericFactory<KScreenSaver, QWidget > KSSFactory;
+K_EXPORT_COMPONENT_FACTORY (kcm_screensaver, KSSFactory("kcmscreensaver") )
+
+
+static QString findExe(const QString &exe) {
+ QString result = locate("exe", exe);
+ if (result.isEmpty())
+ result = KStandardDirs::findExe(exe);
+ return result;
+}
+
+KScreenSaver::KScreenSaver(QWidget *parent, const char *name, const QStringList&)
+ : KCModule(KSSFactory::instance(), parent, name)
+{
+ mSetupProc = 0;
+ mPreviewProc = 0;
+ mTestWin = 0;
+ mTestProc = 0;
+ mPrevSelected = -2;
+ mMonitor = 0;
+ mTesting = false;
+
+ // Add non-KDE path
+ KGlobal::dirs()->addResourceType("scrsav",
+ KGlobal::dirs()->kde_default("apps") +
+ "apps/ScreenSavers/");
+
+ setQuickHelp( i18n("<h1>Screen Saver</h1> This module allows you to enable and"
+ " configure a screen saver. Note that you can enable a screen saver"
+ " even if you have power saving features enabled for your display.<p>"
+ " Besides providing an endless variety of entertainment and"
+ " preventing monitor burn-in, a screen saver also gives you a simple"
+ " way to lock your display if you are going to leave it unattended"
+ " for a while. If you want the screen saver to lock the session, make sure you enable"
+ " the \"Require password\" feature of the screen saver; if you do not, you can still"
+ " explicitly lock the session using the desktop's \"Lock Session\" action."));
+
+ setButtons( KCModule::Help | KCModule::Default | KCModule::Apply );
+
+ // Add KDE specific screensaver path
+ QString relPath="System/ScreenSavers/";
+ KServiceGroup::Ptr servGroup = KServiceGroup::baseGroup( "screensavers" );
+ if (servGroup)
+ {
+ relPath=servGroup->relPath();
+ kdDebug() << "relPath=" << relPath << endl;
+ }
+
+ KGlobal::dirs()->addResourceType("scrsav",
+ KGlobal::dirs()->kde_default("apps") +
+ relPath);
+
+ readSettings( false );
+
+ mSetupProc = new KProcess;
+ connect(mSetupProc, SIGNAL(processExited(KProcess *)),
+ this, SLOT(slotSetupDone(KProcess *)));
+
+ mPreviewProc = new KProcess;
+ connect(mPreviewProc, SIGNAL(processExited(KProcess *)),
+ this, SLOT(slotPreviewExited(KProcess *)));
+
+ QBoxLayout *topLayout = new QHBoxLayout(this, 0, KDialog::spacingHint());
+
+ // left column
+ QVBoxLayout *leftColumnLayout =
+ new QVBoxLayout(topLayout, KDialog::spacingHint());
+ QBoxLayout *vLayout =
+ new QVBoxLayout(leftColumnLayout, KDialog::spacingHint());
+
+ mSaverGroup = new QGroupBox(i18n("Screen Saver"), this );
+ mSaverGroup->setColumnLayout( 0, Qt::Horizontal );
+ vLayout->addWidget(mSaverGroup);
+ vLayout->setStretchFactor( mSaverGroup, 10 );
+ QBoxLayout *groupLayout = new QVBoxLayout( mSaverGroup->layout(),
+ KDialog::spacingHint() );
+
+ mSaverListView = new QListView( mSaverGroup );
+ mSaverListView->setMinimumHeight( 120 );
+ mSaverListView->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+ mSaverListView->addColumn("");
+ mSaverListView->header()->hide();
+ mSelected = -1;
+ groupLayout->addWidget( mSaverListView, 10 );
+ connect( mSaverListView, SIGNAL(doubleClicked ( QListViewItem *)), this, SLOT( slotSetup()));
+ QWhatsThis::add( mSaverListView, i18n("Select the screen saver to use.") );
+
+ QBoxLayout* hlay = new QHBoxLayout(groupLayout, KDialog::spacingHint());
+ mSetupBt = new QPushButton( i18n("&Setup..."), mSaverGroup );
+ connect( mSetupBt, SIGNAL( clicked() ), SLOT( slotSetup() ) );
+ mSetupBt->setEnabled(false);
+ hlay->addWidget( mSetupBt );
+ QWhatsThis::add( mSetupBt, i18n("Configure the screen saver's options, if any.") );
+
+ mTestBt = new QPushButton( i18n("&Test"), mSaverGroup );
+ connect( mTestBt, SIGNAL( clicked() ), SLOT( slotTest() ) );
+ mTestBt->setEnabled(false);
+ hlay->addWidget( mTestBt );
+ QWhatsThis::add( mTestBt, i18n("Show a full screen preview of the screen saver.") );
+
+ mSettingsGroup = new QGroupBox( i18n("Settings"), this );
+ mSettingsGroup->setColumnLayout( 0, Qt::Vertical );
+ leftColumnLayout->addWidget( mSettingsGroup );
+ groupLayout = new QVBoxLayout( mSettingsGroup->layout(),
+ KDialog::spacingHint() );
+
+ mEnabledCheckBox = new QCheckBox(i18n(
+ "Start a&utomatically"), mSettingsGroup);
+ mEnabledCheckBox->setChecked(mEnabled);
+ QWhatsThis::add( mEnabledCheckBox, i18n(
+ "Automatically start the screen saver after a period of inactivity.") );
+ connect(mEnabledCheckBox, SIGNAL(toggled(bool)),
+ this, SLOT(slotEnable(bool)));
+ groupLayout->addWidget(mEnabledCheckBox);
+
+ QBoxLayout *hbox = new QHBoxLayout();
+ groupLayout->addLayout(hbox);
+ hbox->addSpacing(30);
+ mActivateLbl = new QLabel(i18n("After:"), mSettingsGroup);
+ mActivateLbl->setEnabled(mEnabled);
+ hbox->addWidget(mActivateLbl);
+ mWaitEdit = new QSpinBox(mSettingsGroup);
+ mWaitEdit->setSteps(1, 10);
+ mWaitEdit->setRange(1, INT_MAX);
+ mWaitEdit->setSuffix(i18n(" min"));
+ mWaitEdit->setValue(mTimeout/60);
+ mWaitEdit->setEnabled(mEnabled);
+ connect(mWaitEdit, SIGNAL(valueChanged(int)),
+ this, SLOT(slotTimeoutChanged(int)));
+ mActivateLbl->setBuddy(mWaitEdit);
+ hbox->addWidget(mWaitEdit);
+ hbox->addStretch(1);
+ QString wtstr = i18n(
+ "The period of inactivity "
+ "after which the screen saver should start.");
+ QWhatsThis::add( mActivateLbl, wtstr );
+ QWhatsThis::add( mWaitEdit, wtstr );
+
+ mLockCheckBox = new QCheckBox( i18n(
+ "&Require password to stop"), mSettingsGroup );
+ mLockCheckBox->setEnabled( mEnabled );
+ mLockCheckBox->setChecked( mLock );
+ connect( mLockCheckBox, SIGNAL( toggled( bool ) ),
+ this, SLOT( slotLock( bool ) ) );
+ groupLayout->addWidget(mLockCheckBox);
+ QWhatsThis::add( mLockCheckBox, i18n(
+ "Prevent potential unauthorized use by requiring a password"
+ " to stop the screen saver.") );
+ hbox = new QHBoxLayout();
+ groupLayout->addLayout(hbox);
+ hbox->addSpacing(30);
+ mLockLbl = new QLabel(i18n("After:"), mSettingsGroup);
+ mLockLbl->setEnabled(mEnabled && mLock);
+ QWhatsThis::add( mLockLbl, i18n(
+ "The amount of time, after the screen saver has started, to ask for the unlock password.") );
+ hbox->addWidget(mLockLbl);
+ mWaitLockEdit = new QSpinBox(mSettingsGroup);
+ mWaitLockEdit->setSteps(1, 10);
+ mWaitLockEdit->setRange(1, 300);
+ mWaitLockEdit->setSuffix(i18n(" sec"));
+ mWaitLockEdit->setValue(mLockTimeout/1000);
+ mWaitLockEdit->setEnabled(mEnabled && mLock);
+ if ( mWaitLockEdit->sizeHint().width() <
+ mWaitEdit->sizeHint().width() ) {
+ mWaitLockEdit->setFixedWidth( mWaitEdit->sizeHint().width() );
+ mWaitEdit->setFixedWidth( mWaitEdit->sizeHint().width() );
+ }
+ else {
+ mWaitEdit->setFixedWidth( mWaitLockEdit->sizeHint().width() );
+ mWaitLockEdit->setFixedWidth( mWaitLockEdit->sizeHint().width() );
+ }
+ connect(mWaitLockEdit, SIGNAL(valueChanged(int)),
+ this, SLOT(slotLockTimeoutChanged(int)));
+ mLockLbl->setBuddy(mWaitLockEdit);
+ hbox->addWidget(mWaitLockEdit);
+ hbox->addStretch(1);
+ QString wltstr = i18n(
+ "Choose the period "
+ "after which the display will be locked. ");
+ QWhatsThis::add( mLockLbl, wltstr );
+ QWhatsThis::add( mWaitLockEdit, wltstr );
+
+ // right column
+ QBoxLayout* rightColumnLayout =
+ new QVBoxLayout(topLayout, KDialog::spacingHint());
+
+ mMonitorLabel = new QLabel( this );
+ mMonitorLabel->setAlignment( AlignCenter );
+ mMonitorLabel->setPixmap( QPixmap(locate("data",
+ "kcontrol/pics/monitor.png")));
+ rightColumnLayout->addWidget(mMonitorLabel, 0);
+ QWhatsThis::add( mMonitorLabel, i18n("A preview of the selected screen saver.") );
+
+ QBoxLayout* advancedLayout = new QHBoxLayout( rightColumnLayout, 3 );
+ advancedLayout->addWidget( new QWidget( this ) );
+ QPushButton* advancedBt = new QPushButton(
+ i18n( "Advanced &Options" ), this, "advancedBtn" );
+ advancedBt->setSizePolicy( QSizePolicy(
+ QSizePolicy::Fixed, QSizePolicy::Fixed) );
+ connect( advancedBt, SIGNAL( clicked() ),
+ this, SLOT( slotAdvanced() ) );
+ advancedLayout->addWidget( advancedBt );
+ advancedLayout->addWidget( new QWidget( this ) );
+
+ rightColumnLayout->addStretch();
+
+ if (mImmutable)
+ {
+ setButtons(buttons() & ~Default);
+ mSettingsGroup->setEnabled(false);
+ mSaverGroup->setEnabled(false);
+ }
+
+ // finding the savers can take some time, so defer loading until
+ // we've started up.
+ mNumLoaded = 0;
+ mLoadTimer = new QTimer( this );
+ connect( mLoadTimer, SIGNAL(timeout()), SLOT(findSavers()) );
+ mLoadTimer->start( 100 );
+ mChanged = false;
+ emit changed(false);
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmscreensaver"), I18N_NOOP("KDE Screen Saver Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 1997-2002 Martin R. Jones\n"
+ "(c) 2003-2004 Chris Howells"));
+ about->addAuthor("Chris Howells", 0, "howells@kde.org");
+ about->addAuthor("Martin R. Jones", 0, "jones@kde.org");
+
+ setAboutData( about );
+
+ mSaverList.setAutoDelete(true);
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::resizeEvent( QResizeEvent * )
+{
+
+ if (mMonitor)
+ {
+ mMonitor->setGeometry( (mMonitorLabel->width()-200)/2+23,
+ (mMonitorLabel->height()-186)/2+14, 151, 115 );
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::mousePressEvent( QMouseEvent *)
+{
+ if ( mTesting )
+ slotStopTest();
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::keyPressEvent( QKeyEvent *)
+{
+ if ( mTesting )
+ slotStopTest();
+}
+//---------------------------------------------------------------------------
+//
+KScreenSaver::~KScreenSaver()
+{
+ if (mPreviewProc)
+ {
+ if (mPreviewProc->isRunning())
+ {
+ int pid = mPreviewProc->pid();
+ mPreviewProc->kill( );
+ waitpid(pid, (int *) 0,0);
+ }
+ delete mPreviewProc;
+ }
+
+ delete mTestProc;
+ delete mSetupProc;
+ delete mTestWin;
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::load()
+{
+ load( false );
+}
+
+void KScreenSaver::load( bool useDefaults )
+{
+ readSettings( useDefaults);
+
+//with the following line, the Test and Setup buttons are not enabled correctly
+//if no saver was selected, the "Reset" and the "Enable screensaver", it is only called when starting and when pressing reset, aleXXX
+// mSelected = -1;
+ int i = 0;
+ QListViewItem *selectedItem = 0;
+ for (SaverConfig* saver = mSaverList.first(); saver != 0; saver = mSaverList.next()) {
+ if (saver->file() == mSaver)
+ {
+ selectedItem = mSaverListView->findItem ( saver->name(), 0 );
+ if (selectedItem) {
+ mSelected = i;
+ break;
+ }
+ }
+ i++;
+ }
+ if ( selectedItem )
+ {
+ mSaverListView->setSelected( selectedItem, true );
+ mSaverListView->setCurrentItem( selectedItem );
+ slotScreenSaver( selectedItem );
+ }
+
+ updateValues();
+ mChanged = useDefaults;
+ emit changed( useDefaults );
+}
+
+//------------------------------------------------------------After---------------
+//
+void KScreenSaver::readSettings( bool useDefaults )
+{
+ KConfig *config = new KConfig( "kdesktoprc");
+
+ config->setReadDefaults( useDefaults );
+
+ mImmutable = config->groupIsImmutable("ScreenSaver");
+
+ config->setGroup( "ScreenSaver" );
+
+ mEnabled = config->readBoolEntry("Enabled", false);
+ mTimeout = config->readNumEntry("Timeout", 300);
+ mLockTimeout = config->readNumEntry("LockGrace", 60000);
+ mLock = config->readBoolEntry("Lock", false);
+ mSaver = config->readEntry("Saver");
+
+ if (mTimeout < 60) mTimeout = 60;
+ if (mLockTimeout < 0) mLockTimeout = 0;
+ if (mLockTimeout > 300000) mLockTimeout = 300000;
+
+ mChanged = false;
+ delete config;
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::updateValues()
+{
+ if (mEnabled)
+ {
+ mWaitEdit->setValue(mTimeout/60);
+ }
+ else
+ {
+ mWaitEdit->setValue(0);
+ }
+
+ mWaitLockEdit->setValue(mLockTimeout/1000);
+ mLockCheckBox->setChecked(mLock);
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::defaults()
+{
+ load( true );
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::save()
+{
+ if ( !mChanged )
+ return;
+
+ KConfig *config = new KConfig( "kdesktoprc");
+ config->setGroup( "ScreenSaver" );
+
+ config->writeEntry("Enabled", mEnabled);
+ config->writeEntry("Timeout", mTimeout);
+ config->writeEntry("LockGrace", mLockTimeout);
+ config->writeEntry("Lock", mLock);
+
+ if ( !mSaver.isEmpty() )
+ config->writeEntry("Saver", mSaver);
+ config->sync();
+ delete config;
+
+ // TODO (GJ): When you changed anything, these two lines will give a segfault
+ // on exit. I don't know why yet.
+
+ DCOPClient *client = kapp->dcopClient();
+ client->send("kdesktop", "KScreensaverIface", "configure()", "");
+
+ mChanged = false;
+ emit changed(false);
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::findSavers()
+{
+ if ( !mNumLoaded ) {
+ mSaverFileList = KGlobal::dirs()->findAllResources("scrsav",
+ "*.desktop", false, true);
+ new QListViewItem ( mSaverListView, i18n("Loading...") );
+ if ( mSaverFileList.isEmpty() )
+ mLoadTimer->stop();
+ else
+ mLoadTimer->start( 50 );
+ }
+
+ for ( int i = 0; i < 5 &&
+ (unsigned)mNumLoaded < mSaverFileList.count();
+ i++, mNumLoaded++ ) {
+ QString file = mSaverFileList[mNumLoaded];
+ SaverConfig *saver = new SaverConfig;
+ if (saver->read(file)) {
+ mSaverList.append(saver);
+ } else
+ delete saver;
+ }
+
+ if ( (unsigned)mNumLoaded == mSaverFileList.count() ) {
+ QListViewItem *selectedItem = 0;
+ int categoryCount = 0;
+ int indx = 0;
+
+ mLoadTimer->stop();
+ delete mLoadTimer;
+ mSaverList.sort();
+
+ mSelected = -1;
+ mSaverListView->clear();
+ for ( SaverConfig *s = mSaverList.first(); s != 0; s = mSaverList.next())
+ {
+ QListViewItem *item;
+ if (s->category().isEmpty())
+ item = new QListViewItem ( mSaverListView, s->name(), "2" + s->name() );
+ else
+ {
+ QListViewItem *categoryItem = mSaverListView->findItem( s->category(), 0 );
+ if ( !categoryItem ) {
+ categoryItem = new QListViewItem ( mSaverListView, s->category(), "1" + s->category() );
+ categoryItem->setPixmap ( 0, SmallIcon ( "kscreensaver" ) );
+ }
+ item = new QListViewItem ( categoryItem, s->name(), s->name() );
+ categoryCount++;
+ }
+ if (s->file() == mSaver) {
+ mSelected = indx;
+ selectedItem = item;
+ }
+ indx++;
+ }
+
+ // Delete categories with only one item
+ QListViewItemIterator it ( mSaverListView );
+ for ( ; it.current(); it++ )
+ if ( it.current()->childCount() == 1 ) {
+ QListViewItem *item = it.current()->firstChild();
+ it.current()->takeItem( item );
+ mSaverListView->insertItem ( item );
+ delete it.current();
+ categoryCount--;
+ }
+
+ mSaverListView->setRootIsDecorated ( categoryCount > 0 );
+ mSaverListView->setSorting ( 1 );
+
+ if ( mSelected > -1 )
+ {
+ mSaverListView->setSelected(selectedItem, true);
+ mSaverListView->setCurrentItem(selectedItem);
+ mSaverListView->ensureItemVisible(selectedItem);
+ mSetupBt->setEnabled(!mSaverList.at(mSelected)->setup().isEmpty());
+ mTestBt->setEnabled(true);
+ }
+
+ connect( mSaverListView, SIGNAL( currentChanged( QListViewItem * ) ),
+ this, SLOT( slotScreenSaver( QListViewItem * ) ) );
+
+ setMonitor();
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::setMonitor()
+{
+ if (mPreviewProc->isRunning())
+ // CC: this will automatically cause a "slotPreviewExited"
+ // when the viewer exits
+ mPreviewProc->kill();
+ else
+ slotPreviewExited(mPreviewProc);
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::slotPreviewExited(KProcess *)
+{
+ // Ugly hack to prevent continual respawning of savers that crash
+ if (mSelected == mPrevSelected)
+ return;
+
+ if ( mSaverList.isEmpty() ) // safety check
+ return;
+
+ // Some xscreensaver hacks do something nasty to the window that
+ // requires a new one to be created (or proper investigation of the
+ // problem).
+ delete mMonitor;
+
+ mMonitor = new KSSMonitor(mMonitorLabel);
+ mMonitor->setBackgroundColor(black);
+ mMonitor->setGeometry((mMonitorLabel->width()-200)/2+23,
+ (mMonitorLabel->height()-186)/2+14, 151, 115);
+ mMonitor->show();
+ // So that hacks can XSelectInput ButtonPressMask
+ XSelectInput(qt_xdisplay(), mMonitor->winId(), widgetEventMask );
+
+ if (mSelected >= 0) {
+ mPreviewProc->clearArguments();
+
+ QString saver = mSaverList.at(mSelected)->saver();
+ QTextStream ts(&saver, IO_ReadOnly);
+
+ QString word;
+ ts >> word;
+ QString path = findExe(word);
+
+ if (!path.isEmpty())
+ {
+ (*mPreviewProc) << path;
+
+ while (!ts.atEnd())
+ {
+ ts >> word;
+ if (word == "%w")
+ {
+ word = word.setNum(mMonitor->winId());
+ }
+ (*mPreviewProc) << word;
+ }
+
+ mPreviewProc->start();
+ }
+ }
+
+ mPrevSelected = mSelected;
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::slotEnable(bool e)
+{
+ mEnabled = e;
+ mActivateLbl->setEnabled( e );
+ mWaitEdit->setEnabled( e );
+ mLockCheckBox->setEnabled( e );
+ mLockLbl->setEnabled( e && mLock );
+ mWaitLockEdit->setEnabled( e && mLock );
+ mChanged = true;
+ emit changed(true);
+}
+
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::slotScreenSaver(QListViewItem *item)
+{
+ if (!item)
+ return;
+
+ int i = 0, indx = -1;
+ for (SaverConfig* saver = mSaverList.first(); saver != 0; saver = mSaverList.next()) {
+ if ( item->parent() )
+ {
+ if ( item->parent()->text( 0 ) == saver->category() && saver->name() == item->text (0))
+ {
+ indx = i;
+ break;
+ }
+ }
+ else
+ {
+ if ( saver->name() == item->text (0) )
+ {
+ indx = i;
+ break;
+ }
+ }
+ i++;
+ }
+ if (indx == -1) {
+ mSelected = -1;
+ return;
+ }
+
+ bool bChanged = (indx != mSelected);
+
+ if (!mSetupProc->isRunning())
+ mSetupBt->setEnabled(!mSaverList.at(indx)->setup().isEmpty());
+ mTestBt->setEnabled(true);
+ mSaver = mSaverList.at(indx)->file();
+
+ mSelected = indx;
+ setMonitor();
+ if (bChanged)
+ {
+ mChanged = true;
+ emit changed(true);
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::slotSetup()
+{
+ if ( mSelected < 0 )
+ return;
+
+ if (mSetupProc->isRunning())
+ return;
+
+ mSetupProc->clearArguments();
+
+ QString saver = mSaverList.at(mSelected)->setup();
+ if( saver.isEmpty())
+ return;
+ QTextStream ts(&saver, IO_ReadOnly);
+
+ QString word;
+ ts >> word;
+ bool kxsconfig = word == "kxsconfig";
+ QString path = findExe(word);
+
+ if (!path.isEmpty())
+ {
+ (*mSetupProc) << path;
+
+ // Add caption and icon to about dialog
+ if (!kxsconfig) {
+ word = "-caption";
+ (*mSetupProc) << word;
+ word = mSaverList.at(mSelected)->name();
+ (*mSetupProc) << word;
+ word = "-icon";
+ (*mSetupProc) << word;
+ word = "kscreensaver";
+ (*mSetupProc) << word;
+ }
+
+ while (!ts.atEnd())
+ {
+ ts >> word;
+ (*mSetupProc) << word;
+ }
+
+ // Pass translated name to kxsconfig
+ if (kxsconfig) {
+ word = mSaverList.at(mSelected)->name();
+ (*mSetupProc) << word;
+ }
+
+ mSetupBt->setEnabled( false );
+ kapp->flushX();
+
+ mSetupProc->start();
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::slotAdvanced()
+{
+ KScreenSaverAdvancedDialog dlg( topLevelWidget() );
+ if ( dlg.exec() ) {
+ mChanged = true;
+ emit changed(true);
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::slotTest()
+{
+ if ( mSelected == -1 )
+ return;
+
+ if (!mTestProc) {
+ mTestProc = new KProcess;
+ }
+
+ mTestProc->clearArguments();
+ QString saver = mSaverList.at(mSelected)->saver();
+ QTextStream ts(&saver, IO_ReadOnly);
+
+ QString word;
+ ts >> word;
+ QString path = findExe(word);
+
+ if (!path.isEmpty())
+ {
+ (*mTestProc) << path;
+
+ if (!mTestWin)
+ {
+ mTestWin = new TestWin();
+ mTestWin->setBackgroundMode(QWidget::NoBackground);
+ mTestWin->setGeometry(0, 0, kapp->desktop()->width(),
+ kapp->desktop()->height());
+ }
+
+ mTestWin->show();
+ mTestWin->raise();
+ mTestWin->setFocus();
+ // So that hacks can XSelectInput ButtonPressMask
+ XSelectInput(qt_xdisplay(), mTestWin->winId(), widgetEventMask );
+
+ grabMouse();
+ grabKeyboard();
+
+ mTestBt->setEnabled( FALSE );
+ mPreviewProc->kill();
+
+ while (!ts.atEnd())
+ {
+ ts >> word;
+ if (word == "%w")
+ {
+ word = word.setNum(mTestWin->winId());
+ }
+ (*mTestProc) << word;
+ }
+
+ mTesting = true;
+ mTestProc->start(KProcess::NotifyOnExit);
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::slotStopTest()
+{
+ if (mTestProc->isRunning()) {
+ mTestProc->kill();
+ }
+ releaseMouse();
+ releaseKeyboard();
+ mTestWin->hide();
+ mTestBt->setEnabled(true);
+ mPrevSelected = -1;
+ setMonitor();
+ mTesting = false;
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::slotTimeoutChanged(int to )
+{
+ mTimeout = to * 60;
+ mChanged = true;
+ emit changed(true);
+}
+
+//-----------------------------------------------------------------------
+//
+void KScreenSaver::slotLockTimeoutChanged(int to )
+{
+ mLockTimeout = to * 1000;
+ mChanged = true;
+ emit changed(true);
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::slotLock( bool l )
+{
+ mLock = l;
+ mLockLbl->setEnabled( l );
+ mWaitLockEdit->setEnabled( l );
+ mChanged = true;
+ emit changed(true);
+}
+
+//---------------------------------------------------------------------------
+//
+void KScreenSaver::slotSetupDone(KProcess *)
+{
+ mPrevSelected = -1; // see ugly hack in slotPreviewExited()
+ setMonitor();
+ mSetupBt->setEnabled( true );
+ emit changed(true);
+}
+
+#include "scrnsave.moc"
diff --git a/kcontrol/screensaver/scrnsave.h b/kcontrol/screensaver/scrnsave.h
new file mode 100644
index 000000000..28d05b73c
--- /dev/null
+++ b/kcontrol/screensaver/scrnsave.h
@@ -0,0 +1,113 @@
+//-----------------------------------------------------------------------------
+//
+// KDE Display screen saver setup module
+//
+// Copyright (c) Martin R. Jones 1996
+// Copyright (C) Chris Howells 2004
+//
+
+#ifndef __SCRNSAVE_H__
+#define __SCRNSAVE_H__
+
+#include <qwidget.h>
+#include <kcmodule.h>
+
+#include "kssmonitor.h"
+#include "saverconfig.h"
+#include "testwin.h"
+#include "advanceddialog.h"
+#include "kssmonitor.h"
+#include "saverlist.h"
+
+class QTimer;
+class QSpinBox;
+class QSlider;
+class QCheckBox;
+class QLabel;
+class QListView;
+class QListViewItem;
+class QPushButton;
+class KIntNumInput;
+class KProcess;
+
+//===========================================================================
+class KScreenSaver : public KCModule
+{
+ Q_OBJECT
+public:
+ KScreenSaver(QWidget *parent, const char *name, const QStringList &);
+ ~KScreenSaver();
+
+ virtual void load();
+ virtual void load(bool useDefaults);
+ virtual void save();
+ virtual void defaults();
+
+ void updateValues();
+ void readSettings(bool useDefaults);
+
+protected slots:
+ void slotEnable( bool );
+ void slotScreenSaver( QListViewItem* );
+ void slotSetup();
+ void slotAdvanced();
+ void slotTest();
+ void slotStopTest();
+ void slotTimeoutChanged( int );
+ void slotLockTimeoutChanged( int );
+ void slotLock( bool );
+ void slotSetupDone(KProcess*);
+ // when selecting a new screensaver, the old preview will
+ // be killed. -- This callback is responsible for restarting the
+ // new preview
+ void slotPreviewExited(KProcess *);
+ void findSavers();
+
+protected:
+ void writeSettings();
+ void getSaverNames();
+ void setMonitor();
+ void setDefaults();
+ void resizeEvent( QResizeEvent * );
+ void mousePressEvent(QMouseEvent *);
+ void keyPressEvent(QKeyEvent *);
+
+protected:
+ TestWin *mTestWin;
+ KProcess *mTestProc;
+ KProcess *mSetupProc;
+ KProcess *mPreviewProc;
+ KSSMonitor *mMonitor;
+ QPushButton *mSetupBt;
+ QPushButton *mTestBt;
+ QListView *mSaverListView;
+ QSpinBox *mWaitEdit;
+ QSpinBox *mWaitLockEdit;
+ QCheckBox *mLockCheckBox;
+ QCheckBox *mStarsCheckBox;
+ QCheckBox *mEnabledCheckBox;
+ QLabel *mMonitorLabel;
+ QLabel *mActivateLbl;
+ QLabel *mLockLbl;
+ QStringList mSaverFileList;
+ SaverList mSaverList;
+ QTimer *mLoadTimer;
+ QGroupBox *mSaverGroup;
+ QGroupBox *mSettingsGroup;
+
+ int mSelected;
+ int mPrevSelected;
+ int mNumLoaded;
+ bool mChanged;
+ bool mTesting;
+
+ // Settings
+ int mTimeout;
+ int mLockTimeout;
+ bool mLock;
+ bool mEnabled;
+ QString mSaver;
+ bool mImmutable;
+};
+
+#endif
diff --git a/kcontrol/screensaver/testwin.cpp b/kcontrol/screensaver/testwin.cpp
new file mode 100644
index 000000000..a5d316be5
--- /dev/null
+++ b/kcontrol/screensaver/testwin.cpp
@@ -0,0 +1,13 @@
+#include <kwin.h>
+#include "testwin.h"
+
+class QXEmbed;
+
+TestWin::TestWin()
+ : KSWidget(0, 0, WStyle_Customize | WStyle_NoBorder | WX11BypassWM )
+{
+ setFocusPolicy(StrongFocus);
+ KWin::setState( winId(), NET::StaysOnTop );
+}
+
+#include "testwin.moc"
diff --git a/kcontrol/screensaver/testwin.h b/kcontrol/screensaver/testwin.h
new file mode 100644
index 000000000..ff77b6b4d
--- /dev/null
+++ b/kcontrol/screensaver/testwin.h
@@ -0,0 +1,14 @@
+#ifndef TESTWIN_H
+#define TESTWIN_H
+
+#include "kswidget.h"
+
+class TestWin : public KSWidget
+{
+ Q_OBJECT
+public:
+ TestWin();
+};
+
+#endif
+
diff --git a/kcontrol/smartcard/Makefile.am b/kcontrol/smartcard/Makefile.am
new file mode 100644
index 000000000..940dfaacc
--- /dev/null
+++ b/kcontrol/smartcard/Makefile.am
@@ -0,0 +1,17 @@
+AM_CPPFLAGS = $(all_includes)
+kde_module_LTLIBRARIES = kcm_smartcard.la
+
+kcm_smartcard_la_SOURCES = smartcard.cpp smartcardbase.ui nosmartcardbase.ui smartcard.skel
+
+kcm_smartcard_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+
+kcm_smartcard_la_LIBADD = -lkdeui -lksmartcard $(LIB_KIO)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = smartcard.h
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmsmartcard.pot
+
+xdg_apps_DATA = smartcard.desktop
diff --git a/kcontrol/smartcard/configure.in.in b/kcontrol/smartcard/configure.in.in
new file mode 100644
index 000000000..e7e3ba1df
--- /dev/null
+++ b/kcontrol/smartcard/configure.in.in
@@ -0,0 +1,3 @@
+
+KDE_CHECK_HEADER(kcarddb.h, FOUND_KSMCARD="yes", FOUND_KSMCARD="no")
+AM_CONDITIONAL(include_kcontrol_smartcard, test "$FOUND_KSMCARD" = "yes")
diff --git a/kcontrol/smartcard/nosmartcardbase.ui b/kcontrol/smartcard/nosmartcardbase.ui
new file mode 100644
index 000000000..fe8c4fa06
--- /dev/null
+++ b/kcontrol/smartcard/nosmartcardbase.ui
@@ -0,0 +1,81 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>NoSmartcardBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>NoSmartcardBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>460</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Unable to contact the KDE smartcard service.&lt;/b&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Possible Reasons</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>
+1) The KDE daemon, 'kded' is not running. You can restart it by running the command 'kdeinit' and then try reloading the KDE Control Center to see if this message goes away.
+
+2) You don't appear to have smartcard support in the KDE libraries. You will need to recompile the kdelibs package with libpcsclite installed.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/smartcard/smartcard.cpp b/kcontrol/smartcard/smartcard.cpp
new file mode 100644
index 000000000..e56c72617
--- /dev/null
+++ b/kcontrol/smartcard/smartcard.cpp
@@ -0,0 +1,400 @@
+/**
+ * smartcard.cpp
+ *
+ * Copyright (c) 2001 George Staikos <staikos@kde.org>
+ * Copyright (c) 2001 Fernando Llobregat <fernando.llobregat@free.fr>
+ *
+ * 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 <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+
+#include <dcopclient.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kcarddb.h>
+#include <kcardfactory.h>
+#include <kcardgsm_impl.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpopupmenu.h>
+
+#include "smartcard.h"
+
+KSmartcardConfig::KSmartcardConfig(QWidget *parent, const char *name)
+ : KCModule(parent, name),DCOPObject(name)
+{
+
+ QVBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ config = new KConfig("ksmartcardrc", false, false);
+
+ DCOPClient *dc = KApplication::kApplication()->dcopClient();
+
+ _ok = false;
+ dc->remoteInterfaces("kded", "kardsvc", &_ok);
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmsmartcard"), I18N_NOOP("KDE Smartcard Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2001 George Staikos"));
+
+ about->addAuthor("George Staikos", 0, "staikos@kde.org");
+ setAboutData( about );
+
+ if (_ok) {
+
+
+ base = new SmartcardBase(this);
+ layout->add(base);
+
+ _popUpKardChooser = new KPopupMenu(this,"KpopupKardChooser");
+ _popUpKardChooser->insertItem(i18n("Change Module..."),
+ this,
+ SLOT(slotLaunchChooser()));
+ // The config backend
+
+ connect(base->launchManager, SIGNAL(clicked()), SLOT( changed() ));
+ connect(base->beepOnInsert, SIGNAL(clicked()), SLOT( changed() ));
+ connect(base->enableSupport, SIGNAL(clicked()), SLOT( changed() ));
+
+
+ connect(base->enablePolling, SIGNAL(clicked()), SLOT( changed() ));
+ connect(base->_readerHostsListView,
+ SIGNAL(rightButtonPressed(QListViewItem *,const QPoint &,int)),
+ this,
+ SLOT(slotShowPopup(QListViewItem *,const QPoint &,int)));
+
+
+
+ if (!connectDCOPSignal("",
+ "",
+ "signalReaderListChanged(QStringList)",
+ "loadReadersTab(QStringList)",
+ FALSE))
+
+ kdDebug()<<"Error connecting to DCOP server" <<endl;
+
+
+ if (!connectDCOPSignal("",
+ "",
+ "signalCardStateChanged(QString,bool,QString)",
+ "updateReadersState (QString,bool,QString) ",
+ FALSE))
+
+ kdDebug()<<"Error connecting to DCOP server" <<endl;
+ _cardDB= new KCardDB();
+ load();
+ } else {
+ layout->add(new NoSmartcardBase(this));
+ }
+}
+
+
+
+
+KSmartcardConfig::~KSmartcardConfig()
+{
+ delete config;
+ delete _cardDB;
+}
+
+void KSmartcardConfig::slotLaunchChooser(){
+
+
+ if ( KCardDB::launchSelector(base->_readerHostsListView->currentItem()->parent()->text(0))){
+
+ KMessageBox::sorry(this,i18n("Unable to launch KCardChooser"));
+ }
+
+
+}
+
+void KSmartcardConfig::slotShowPopup(QListViewItem * item ,const QPoint & _point,int i)
+{
+
+ //The popup only appears in cards, not in the slots1
+ if (item->isSelectable()) return;
+ _popUpKardChooser->exec(_point);
+
+}
+
+
+void KSmartcardConfig::updateReadersState (QString readerName,
+ bool isCardPresent,
+ QString atr) {
+
+ KListViewItem * tID=(KListViewItem *) base->_readerHostsListView->findItem(readerName, 0);
+ if (tID==0) return;
+
+ KListViewItem * tIDChild=(KListViewItem*) tID->firstChild();
+ if (tIDChild==NULL) return;
+
+ delete tIDChild;
+
+ if (!isCardPresent)
+ (void) new KListViewItem(tID,i18n("No card inserted"));
+ else{
+
+ getSupportingModule(tID,atr);
+ }
+
+
+}
+
+
+
+void KSmartcardConfig::loadReadersTab( QStringList lr){
+
+ //Prepare data for dcop calls
+ QByteArray data, retval;
+ QCString rettype;
+ QDataStream arg(data, IO_WriteOnly);
+ QCString modName = "kardsvc";
+ arg << modName;
+
+ // New view items
+ KListViewItem * temp;
+
+ //If the smartcard support is disabled we unload the kardsvc KDED module
+ // and return
+
+ base->_readerHostsListView->clear();
+
+ if (!config->readBoolEntry("Enable Support", false)){
+
+
+
+
+ // New view items
+ KListViewItem * temp;
+ kapp->dcopClient()->call("kded", "kded", "unloadModule(QCString)",
+ data, rettype, retval);
+
+ (void) new KListViewItem(base->_readerHostsListView,
+ i18n("Smart card support disabled"));
+
+
+ return;
+
+ }
+
+ if (lr.isEmpty()){
+
+
+ (void) new KListViewItem(base->_readerHostsListView,
+ i18n("No readers found. Check 'pcscd' is running"));
+ return;
+ }
+
+ for (QStringList::Iterator _slot=lr.begin();_slot!=lr.end();++_slot){
+
+ temp= new KListViewItem(base->_readerHostsListView,*_slot);
+
+
+ QByteArray dataATR;
+ QDataStream argATR(dataATR,IO_WriteOnly);
+ argATR << *_slot;
+
+ kapp->dcopClient()->call("kded", "kardsvc", "getCardATR(QString)",
+ dataATR, rettype, retval);
+
+
+ QString cardATR;
+ QDataStream retReaderATR(retval, IO_ReadOnly);
+ retReaderATR>>cardATR;
+
+ if (cardATR.isNull()){
+
+ (void) new KListViewItem(temp,i18n("NO ATR or no card inserted"));
+ continue;
+ }
+
+ getSupportingModule(temp,cardATR);
+
+
+
+
+ }
+
+}
+
+
+void KSmartcardConfig::getSupportingModule( KListViewItem * ant,
+ QString & cardATR) const{
+
+
+ if (cardATR.isNull()){
+
+ (void) new KListViewItem(ant,i18n("NO ATR or no card inserted"));
+ return;
+ }
+
+
+ QString modName=_cardDB->getModuleName(cardATR);
+ if (!modName.isNull()){
+ QStringList mng= QStringList::split(",",modName);
+ QString type=mng[0];
+ QString subType=mng[1];
+ QString subSubType=mng[2];
+ KListViewItem * hil =new KListViewItem(ant,
+ i18n("Managed by: "),
+ type,
+ subType,
+ subSubType);
+ hil->setSelectable(FALSE);
+ }
+ else{
+
+
+ KListViewItem * hil =new KListViewItem(ant,
+ i18n("No module managing this card"));
+ hil->setSelectable(FALSE);
+ }
+
+ }
+void KSmartcardConfig::load()
+{
+ load( false );
+
+void KSmartcardConfig::load(bool useDefaults )
+{
+
+ //Prepare data for dcop calls
+ QByteArray data, retval;
+ QCString rettype;
+ QDataStream arg(data, IO_WriteOnly);
+ QCString modName = "kardsvc";
+ arg << modName;
+
+ //Update the toggle buttons with the current configuration
+
+ config->setReadDefaults( useDefaults );
+
+ if (_ok) {
+ base->enableSupport->setChecked(config->readBoolEntry("Enable Support",
+ false));
+ base->enablePolling->setChecked(config->readBoolEntry("Enable Polling",
+ true));
+ base->beepOnInsert->setChecked(config->readBoolEntry("Beep on Insert",
+ true));
+ base->launchManager->setChecked(config->readBoolEntry("Launch Manager",
+ true));
+ }
+
+ // We call kardsvc to retrieve the current readers
+ kapp->dcopClient()->call("kded", "kardsvc", "getSlotList ()",
+ data, rettype, retval);
+ QStringList readers;
+ readers.clear();
+ QDataStream retReader(retval, IO_ReadOnly);
+ retReader>>readers;
+
+ //And we update the panel
+ loadReadersTab(readers);
+
+ emit changed(useDefaults);
+
+}
+
+
+void KSmartcardConfig::save()
+{
+if (_ok) {
+ config->writeEntry("Enable Support", base->enableSupport->isChecked());
+ config->writeEntry("Enable Polling", base->enablePolling->isChecked());
+ config->writeEntry("Beep on Insert", base->beepOnInsert->isChecked());
+ config->writeEntry("Launch Manager", base->launchManager->isChecked());
+
+
+ QByteArray data, retval;
+ QCString rettype;
+ QDataStream arg(data, IO_WriteOnly);
+ QCString modName = "kardsvc";
+ arg << modName;
+
+ // Start or stop the server as needed
+ if (base->enableSupport->isChecked()) {
+
+ kapp->dcopClient()->call("kded", "kded", "loadModule(QCString)",
+ data, rettype, retval);
+ config->sync();
+
+ kapp->dcopClient()->call("kded", "kardsvc", "reconfigure()",
+ data, rettype, retval);
+ } else {
+
+
+
+ kapp->dcopClient()->call("kded", "kded", "unloadModule(QCString)",
+ data, rettype, retval);
+ }
+
+
+}
+ emit changed(false);
+}
+
+void KSmartcardConfig::defaults()
+{
+ load( true );
+}
+
+
+
+QString KSmartcardConfig::quickHelp() const
+{
+ return i18n("<h1>smartcard</h1> This module allows you to configure KDE support"
+ " for smartcards. These can be used for various tasks such as storing"
+ " SSL certificates and logging in to the system.");
+}
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_smartcard(QWidget *parent, const char *)
+ {
+ return new KSmartcardConfig(parent, "kcmsmartcard");
+ }
+
+ KDE_EXPORT void init_smartcard()
+ {
+ KConfig *config = new KConfig("ksmartcardrc", false, false);
+ bool start = config->readBoolEntry("Enable Support", false);
+ delete config;
+
+ if (start) {
+ QByteArray data, retval;
+ QCString rettype;
+ QDataStream arg(data, IO_WriteOnly);
+ QCString modName = "kardsvc";
+ arg << modName;
+ kapp->dcopClient()->call("kded", "kded", "loadModule(QCString)",
+ data, rettype, retval);
+ }
+ }
+}
+
+
+#include "smartcard.moc"
+
diff --git a/kcontrol/smartcard/smartcard.desktop b/kcontrol/smartcard/smartcard.desktop
new file mode 100644
index 000000000..6933619c8
--- /dev/null
+++ b/kcontrol/smartcard/smartcard.desktop
@@ -0,0 +1,212 @@
+[Desktop Entry]
+Icon=identity
+Type=Application
+Exec=kcmshell smartcard
+DocPath=kcontrol/smartcard.html
+
+X-KDE-Library=smartcard
+X-KDE-Init=smartcard
+X-KDE-ParentApp=kcontrol
+Name=Smartcards
+Name[af]=Smartkaarte
+Name[ar]=البطاقات الذكية
+Name[be]=Смарткарткі
+Name[bn]=স্মার্টকার্ড
+Name[ca]=Targetes intel·ligents
+Name[csb]=Kartë bezpiekù
+Name[el]=Έξυπνες κάρτες
+Name[eo]=Memorkartoj
+Name[et]=Kiipkaardid
+Name[eu]=Txartel adimendunak
+Name[fa]=کارتهای هوشمند
+Name[fi]=Älykortit
+Name[fr]=Cartes à puce
+Name[fy]=Chipkaarten
+Name[ga]=Cártaí Cliste
+Name[he]=כרטיסים חכמים
+Name[hi]=स्मार्टकार्ड
+Name[hu]=Smartcard-beállítások
+Name[is]=Snjallkort
+Name[it]=Smartcard
+Name[ja]=スマートカード
+Name[ka]=სხარტი ბარათები
+Name[kk]=Смарт-карталар
+Name[ko]=스마트카드
+Name[lo]=ສະມາດຄາດ
+Name[lt]=Gudrios kortelės
+Name[lv]=Smartkartes
+Name[mk]=Паметни картички
+Name[ms]=Kad pintar
+Name[nb]=Smartkort
+Name[nds]=Smartkoorten
+Name[ne]=स्मार्टकार्ड
+Name[nl]=Chipkaarten
+Name[nn]=Smartkort
+Name[nso]=Dikarata ye botsana
+Name[pa]=ਸਮਾਟ-ਕਾਰਡ
+Name[pl]=Karty bezpieczeństwa
+Name[pt_BR]=Smart Cards
+Name[ro]=Smartcard-uri
+Name[ru]=Смарткарты
+Name[rw]=Amakaritarukuruzi
+Name[se]=Jierbmásgoarttat
+Name[sk]=Smartcard
+Name[sl]=Pametne kartice
+Name[sr]=Smart картице
+Name[sr@Latn]=Smart kartice
+Name[ss]=Smartcards
+Name[sv]=Smartkort
+Name[ta]=ஸ்மார்ட்கார்டுகள்
+Name[te]=స్మార్ట్ కార్డులు
+Name[tg]=Кортҳои боҳуш
+Name[th]=สมาร์ทการ์ด
+Name[tr]=Smartcard
+Name[tt]=Smartkard
+Name[uk]=Смарт-карти
+Name[uz]=Smartcard'lar
+Name[uz@cyrillic]=Smartcard'лар
+Name[ven]=Garata
+Name[vi]=Thẻ thông minh
+Name[zh_CN]=智能卡
+Name[zh_TW]=智慧卡
+Name[zu]=Amakhadi akhaliphile
+Comment=Configure smartcard support
+Comment[af]=Konfigureer smartkaart ondersteun
+Comment[ar]=إعداد دعم البطاقات الذكية
+Comment[az]=Smartcard dəstəyini quraşdır
+Comment[be]=Настаўленні падтрымкі смарткартак
+Comment[bg]=Настройване поддръжката на smartcard
+Comment[bn]=স্মার্টকার্ড সেটিংস কনফিগার করুন
+Comment[bs]=Podesite podršku za smartcard
+Comment[ca]=Configura el funcionament de les targetes intel·ligents
+Comment[cs]=Nastavení podpory smartcards
+Comment[csb]=Kònfigùracëjô kartów bezpiekù (SmartCards)
+Comment[cy]=Ffurfweddu cynhaliaeth cerdyn smart
+Comment[da]=Indstil smartcard-understøttelse
+Comment[de]=Smartcard-Unterstützung einrichten
+Comment[el]=Ρύθμιση υποστήριξης έξυπνων καρτών
+Comment[eo]=Agordi subtenon por memorkartoj
+Comment[es]=Configuración del soporte para tarjetas Smart
+Comment[et]=Kiipkaardi toetuse seadistamine
+Comment[eu]=Konfiguratu txartel adimendunen euskarria
+Comment[fa]=پیکربندی پشتیبانی کارت هوشمند
+Comment[fi]=Smartcard-tuki
+Comment[fr]=Configuration de la gestion des cartes à puce
+Comment[fy]=Chipkaartstipe ynstelle
+Comment[ga]=Cumraigh tacaíocht do Chártaí Cliste
+Comment[gl]=Configurar o soporte para smartcard
+Comment[he]=שינוי הגדרות התמיכה בכרטיסים חכמים
+Comment[hi]=स्मार्ट-कार्ड समर्थन कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje smartcard podrške
+Comment[hu]=A smartcard-támogatás beállításai
+Comment[is]=Stilla stuðning við snjallkort
+Comment[it]=Configura supporto smartcard
+Comment[ja]=スマートカードサポートの設定
+Comment[kk]=Смарт-карталарды қолдауын баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ការ​គាំទ្រ Smartcard
+Comment[ko]=스마트카드 지원 설정
+Comment[lo]=ປັບແຕ່ງການສະຫນັບສະຫນູນສະມາດຄາດ
+Comment[lt]=Konfigūruoti gudrių kortelių palaikymą
+Comment[lv]=Konfigurēt smārtkaršu atbalstu
+Comment[mk]=Конфигурирајте ја поддршката за паметни картички
+Comment[mn]=Smartcard дэмжилэг тохируулах
+Comment[ms]=Konfigur sokongan kad pintar
+Comment[mt]=Ikkonfigura s-sapport għal "smartcards"
+Comment[nb]=Oppsett av smartkortstøtte
+Comment[nds]=Ünnerstütten för Smartkoorten inrichten
+Comment[ne]=स्मार्टकार्ड समर्थन कन्फिगर गर्नुहोस्
+Comment[nl]=Chipkaartondersteuning instellen
+Comment[nn]=Oppsett av smartkortstøtte
+Comment[nso]=Beakanya thekgo ya karata ye botsana
+Comment[pa]=ਸਮਾਟ-ਕਾਰਡ ਸਹਾਇਤਾ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja kart bezpieczeństwa (SmartCards)
+Comment[pt]=Configurar o suporte de 'smartcards'
+Comment[pt_BR]=Configurar suporte a Smart Cards
+Comment[ro]=Configurează suportul pentru smartcard-uri
+Comment[ru]=Настройка поддержки смарткарт
+Comment[rw]=Kuboneza iyifashisha rya karitarukuruzi
+Comment[se]=Heivet jierbmásgoartadoarjja
+Comment[sk]=Nastavenie podpory smartcard
+Comment[sl]=Nastavi podporo pametnih kartic
+Comment[sr]=Подешавање подршке за smart картице
+Comment[sr@Latn]=Podešavanje podrške za smart kartice
+Comment[sv]=Anpassa stöd för smartkort
+Comment[ta]=ஸ்மார்ட் கார்டு ஆதரவை அமை
+Comment[tg]=Танзими пуштибонӣ аз кортҳои боҳуш
+Comment[th]=ปรับแต่งการสนับสนุนสมาร์ตการ์ด
+Comment[tr]=Smartcard desteğini yapılandır
+Comment[tt]=Smartkard totıluın caylaw
+Comment[uk]=Налаштування підтримки смарт-карт
+Comment[uz]=Smartcard'ni moslash
+Comment[uz@cyrillic]=Smartcard'ни мослаш
+Comment[ven]=Dzudzanyani thikhedzo ya garata
+Comment[vi]=Cấu hình các hỗ trợ thẻ thông minh
+Comment[wa]=Apontiaedjes so sopoirt di smartcard
+Comment[xh]=Qwalasela inkxaso ye smartcard
+Comment[zh_CN]=配置智能卡支持
+Comment[zh_TW]=設定智慧卡 (SmartCard) 支援
+Comment[zu]=Hlanganisela ukuxhaswa kwekhadi elikhaliphile
+Keywords=Smartcard,PKCS,SSL,reader,smart,card
+Keywords[ar]=بطاقة ذكية,PKCS,SSL,قارئ,ذكية,بطاقة
+Keywords[be]=Смарткарта,Смарткартка,Чытач,Карта,Смарт,Smartcard,PKCS,SSL,reader,smart,card
+Keywords[bg]=карти, поддръжка, Smartcard, PKCS, SSL, reader, smart, card
+Keywords[ca]=Targeta intel·ligent,PKCS,SSL,lector,smart,targeta
+Keywords[csb]=Smartcard,PKCS,SSL,czëtôrz,bezpiek,karta
+Keywords[cy]=Smartcard,PKCS,SSL,darllenydd,smart,cerdyn
+Keywords[da]=Smartcard,PKCS,SSL,læser,smart,card
+Keywords[de]=Smartcard,PKCS,SSL,Reader,Smart,Card,Leser
+Keywords[el]=Έξυπνη κάρτα,PKCS,SSL,αναγνώστης,έξυπνη,κάρτα
+Keywords[eo]=Memorkarto,PKCS,SSL,legilo,memoro,karto
+Keywords[es]=Smartcard,PKCS,SSL,lector,smart,tarjeta
+Keywords[et]=Smartcard,PKCS,SSL,lugeja,kiipkaart,kaart,kiip
+Keywords[eu]=Txartel adimenduna,PKCS,SSL,irakurgailua,adimenduna,txartela
+Keywords[fa]=کارت هوشمند، PKCS، SSL، خواننده، هوشمند، کارت
+Keywords[fi]=Älykortti,PKCS,SSL,lukija
+Keywords[fr]=carte à puce,puce,smartcard,pkcs,ssl,lecteur,carte
+Keywords[fy]=Smartcard,PKCS,SSL,reader,smart,card,chipkaart,kaart
+Keywords[ga]=Smartcard,PKCS,SSL,léitheoir,cliste,cárta
+Keywords[gl]=Smartcard,PKCS,SSL,lector,pequena,tarxeta
+Keywords[he]=כרטיסים חכמים,PKCS,SSL,קורא,כרטיס,חכם, Smartcard,reader,smart,card
+Keywords[hi]=स्मार्टकार्ड,पीकेसीएस,एसएसएल,रीडर,स्मार्ट,कार्ड
+Keywords[hr]=Smartcard,PKCS,SSL,reader,smart,card,čitač,kartica
+Keywords[hu]=smartcard,PKCS,SSL,olvasó,smart,kártya
+Keywords[is]=Snjallkort,PKCS,SSL,reader,smart,card,snjall,kort
+Keywords[it]=smartcard,PKCS,SSL,lettore
+Keywords[ja]=スマートカード,PKCS,SSL,リーダー,スマート,カード
+Keywords[km]=Smartcard,PKCS,SSL,ឧបករណ៍​អាន,smart,ប័ណ្ណ
+Keywords[lt]=Smartcard,PKCS,SSL,reader,smart,card, gudri kortelė,skaitytuvas,gudri,kortelė
+Keywords[mk]=Smartcard,PKCS,SSL,reader,smart,card,паметна картичка,читач,паметна,картичка
+Keywords[mn]=Smartcard,PKCS,SSL,Reader,Smart,Card,Уншигч
+Keywords[nb]=smartkort,PKCS,SSL,leser,smart,kort
+Keywords[nds]=Smartcard,PKCS,SSL,Leser,smart,card,Koort,Koorten
+Keywords[ne]=स्मार्टकार्ड,PKCS,SSL, रिडर, छरितो, कार्ड
+Keywords[nl]=Smartcard,PKCS,SSL,reader,smart,card,chipkaart,kaart
+Keywords[nn]=smartkort,PKCS,SSL,lesar,smart,kort
+Keywords[nso]=Karata ye botsana,PKCS,SSL,mmadi,botsana,karata
+Keywords[pa]=Smartcard,PKCS,SSL,reader,smart,card, ਰੀਡਰ, ਕਾਰਡ, ਸਮਾਟ
+Keywords[pl]=Smartcard,PKCS,SSL,czytnik,bezpieczeństwo,karta
+Keywords[pt]=smartcard,PKCS,SSL,leitor,smart,placa
+Keywords[pt_BR]=Smart Card,PKCS,SSL,leitor,smart,card
+Keywords[ro]=smartcard,PKCS,SSL,cititor,smart,card
+Keywords[rw]=Ikaritarukuruzi,PKCS,SSL,cyiza,ikarita
+Keywords[se]=jierbmásgoarta,PKCS,SSL,logan,jierbmái,goarta
+Keywords[sk]=Smartcard,PKCS,SSL,čítačka,karta,inteligentná
+Keywords[sl]=Smartcard,PKCS,SSL,bralnik,pamet,kartica
+Keywords[sr]=Smartcard,PKCS,SSL,reader,читач,smart,card,картица
+Keywords[sr@Latn]=Smartcard,PKCS,SSL,reader,čitač,smart,card,kartica
+Keywords[sv]=Smartkort,PKCS,SSL,läsare,smart,kort
+Keywords[ta]=ஸ்மார்ட்கார்டு,PKCS,SSL,படிப்பான்,புத்திசாலி,அட்டை
+Keywords[th]=สมาร์ตการ์ด,PKCS,SSL,เครื่องอ่าน,ฉลาด,การ์ด
+Keywords[tr]=Smartcard,PKCS,SSL,okuyucu,smart,kart,akıllıkart
+Keywords[uk]=Smartcard,PKCS,SSL,смарт-карта,зчитувач,картка
+Keywords[uz]=Smartcard,PKCS,SSL,oʻquvchi,smart,card
+Keywords[uz@cyrillic]=Smartcard,PKCS,SSL,ўқувчи,smart,card
+Keywords[ven]=Garata,PKCS,SSL,muvhali,zwavhudi,Garata
+Keywords[vi]=Thẻ thông minh,PKCS,SSL,đầu đọc,thông minh,thẻ
+Keywords[wa]=Smartcard,PKCS,SSL,léjheu,smart,card
+Keywords[xh]=Smartcard,PKCS,SSL,umfundi,bukeka,ikhadi
+Keywords[zh_CN]=Smartcard,PKCS,SSL,reader,smart,card,智能卡,智能,卡,读卡器
+Keywords[zh_TW]=Smartcard,PKCS,SSL,reader,smart,card,智慧卡,閱讀器,智慧,卡
+Keywords[zu]=Ikhadi elikhaliphile,PKCS,SSLumfundi,okukhaliphile,ikhadi
+
+Categories=Qt;KDE;X-KDE-settings-peripherals;
diff --git a/kcontrol/smartcard/smartcard.h b/kcontrol/smartcard/smartcard.h
new file mode 100644
index 000000000..63f7e1e11
--- /dev/null
+++ b/kcontrol/smartcard/smartcard.h
@@ -0,0 +1,89 @@
+/**
+ * smartcard.h
+ *
+ * Copyright (c) 2001 George Staikos <staikos@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _KCM_SMARTCARD_H
+#define _KCM_SMARTCARD_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <dcopobject.h>
+
+#include <kcmodule.h>
+
+#include "smartcardbase.h"
+#include "nosmartcardbase.h"
+
+class KConfig;
+class KCardDB;
+class KPopupMenu;
+class KListViewItem;
+
+class KSmartcardConfig : public KCModule, public DCOPObject
+{
+ K_DCOP
+ Q_OBJECT
+
+
+public:
+ KSmartcardConfig(QWidget *parent = 0L, const char *name = 0L);
+ virtual ~KSmartcardConfig();
+
+ SmartcardBase *base;
+
+ void load();
+ void load( bool useDefaults);
+ void save();
+ void defaults();
+
+ int buttons();
+ QString quickHelp() const;
+
+ k_dcop:
+
+
+ void updateReadersState (QString readerName,
+ bool isCardPresent,
+ QString atr);
+ void loadReadersTab (QStringList lr);
+
+ private slots:
+
+ void slotShowPopup(QListViewItem * item ,const QPoint & _point,int i);
+ void slotLaunchChooser();
+
+
+
+private:
+
+ KConfig *config;
+ bool _ok;
+ KCardDB * _cardDB;
+ KPopupMenu * _popUpKardChooser;
+
+ void getSupportingModule( KListViewItem * ant,
+ QString & cardATR) const ;
+
+
+};
+
+#endif
+
diff --git a/kcontrol/smartcard/smartcardbase.ui b/kcontrol/smartcard/smartcardbase.ui
new file mode 100644
index 000000000..b5dda006b
--- /dev/null
+++ b/kcontrol/smartcard/smartcardbase.ui
@@ -0,0 +1,310 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>SmartcardBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SmartcardBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>519</width>
+ <height>356</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>TabWidget2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Smartcard Support</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>enableSupport</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Enable smartcard support</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="1">
+ <property name="name">
+ <cstring>enablePolling</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Enable &amp;polling to autodetect card events</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>In most cases you should have this enabled. It allows KDE to automatically detect card insertion and reader hotplug events.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="0" rowspan="3" colspan="1">
+ <property name="name" stdset="0">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>15</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="2" column="1">
+ <property name="name">
+ <cstring>launchManager</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Automatically &amp;launch card manager if inserted card is unclaimed</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When you insert a smartcard, KDE can automatically launch a management tool if no other application attempts to use the card.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="1">
+ <property name="name">
+ <cstring>beepOnInsert</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Beep on card insert and removal</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name" stdset="0">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Readers</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Reader</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Subtype</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>SubSubtype</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizeable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>_readerHostsListView</cstring>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>Line1</cstring>
+ </property>
+ <property name="frameShape" stdset="0">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>PCSCLite Configuration</string>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>380</width>
+ <height>40</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>To add new readers you have to modify /etc/readers.conf file and re-start pcscd</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>enableSupport</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>enablePolling</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>enableSupport</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>beepOnInsert</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>enableSupport</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>launchManager</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>enableSupport</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SmartcardBase</receiver>
+ <slot>enableSupport_toggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>enablePolling</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SmartcardBase</receiver>
+ <slot>enablePolling_toggled(bool)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">smartcardbase.ui.h</include>
+</includes>
+<slots>
+ <slot>slotTestReader()</slot>
+ <slot>enableSupport_toggled(bool)</slot>
+ <slot>enablePolling_toggled(bool)</slot>
+</slots>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/smserver/Makefile.am b/kcontrol/smserver/Makefile.am
new file mode 100644
index 000000000..7cecaf66e
--- /dev/null
+++ b/kcontrol/smserver/Makefile.am
@@ -0,0 +1,17 @@
+kde_module_LTLIBRARIES = kcm_smserver.la
+
+kcm_smserver_la_SOURCES = kcmsmserver.cpp smserverconfigdlg.ui smserverconfigimpl.cpp
+kcm_smserver_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_smserver_la_LIBADD = -lkdeui
+AM_CPPFLAGS= $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = kcmsmserver.h smserverconfigimpl.h
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmsmserver.pot
+
+xdg_apps_DATA = kcmsmserver.desktop
+
+EXTRA_DIST = $(xdg_apps_DATA)
diff --git a/kcontrol/smserver/kcmsmserver.cpp b/kcontrol/smserver/kcmsmserver.cpp
new file mode 100644
index 000000000..9de1334b0
--- /dev/null
+++ b/kcontrol/smserver/kcmsmserver.cpp
@@ -0,0 +1,134 @@
+/*
+ * kcmsmserver.cpp
+ * Copyright (c) 2000,2002 Oswald Buddenhagen <ossi@kde.org>
+ *
+ * based on kcmtaskbar.cpp
+ * Copyright (c) 2000 Kurt Granroth <granroth@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kgenericfactory.h>
+#include <klineedit.h>
+
+#include "kcmsmserver.h"
+#include "smserverconfigimpl.h"
+
+typedef KGenericFactory<SMServerConfig, QWidget > SMSFactory;
+K_EXPORT_COMPONENT_FACTORY (kcm_smserver, SMSFactory("kcmsmserver") )
+
+SMServerConfig::SMServerConfig( QWidget *parent, const char* name, const QStringList & )
+ : KCModule (SMSFactory::instance(), parent, name)
+{
+ setQuickHelp( i18n("<h1>Session Manager</h1>"
+ " You can configure the session manager here."
+ " This includes options such as whether or not the session exit (logout)"
+ " should be confirmed, whether the session should be restored again when logging in"
+ " and whether the computer should be automatically shut down after session"
+ " exit by default."));
+
+ QVBoxLayout *topLayout = new QVBoxLayout(this);
+ dialog = new SMServerConfigImpl(this);
+ connect(dialog, SIGNAL(changed()), SLOT(changed()));
+
+ dialog->show();
+ topLayout->add(dialog);
+ load();
+
+}
+
+void SMServerConfig::load()
+{
+ load( false );
+}
+
+void SMServerConfig::load(bool useDefaults )
+{
+ KConfig *c = new KConfig("ksmserverrc", false, false);
+ c->setReadDefaults( useDefaults );
+ c->setGroup("General");
+ dialog->confirmLogoutCheck->setChecked(c->readBoolEntry("confirmLogout", true));
+ bool en = c->readBoolEntry("offerShutdown", true);
+ dialog->offerShutdownCheck->setChecked(en);
+ dialog->sdGroup->setEnabled(en);
+
+ QString s = c->readEntry( "loginMode" );
+ if ( s == "default" )
+ dialog->emptySessionRadio->setChecked(true);
+ else if ( s == "restoreSavedSession" )
+ dialog->savedSessionRadio->setChecked(true);
+ else // "restorePreviousLogout"
+ dialog->previousSessionRadio->setChecked(true);
+
+ switch (c->readNumEntry("shutdownType", int(KApplication::ShutdownTypeNone))) {
+ case int(KApplication::ShutdownTypeHalt):
+ dialog->haltRadio->setChecked(true);
+ break;
+ case int(KApplication::ShutdownTypeReboot):
+ dialog->rebootRadio->setChecked(true);
+ break;
+ default:
+ dialog->logoutRadio->setChecked(true);
+ break;
+ }
+ dialog->excludeLineedit->setText( c->readEntry("excludeApps"));
+
+ delete c;
+
+ emit changed(useDefaults);
+}
+
+void SMServerConfig::save()
+{
+ KConfig *c = new KConfig("ksmserverrc", false, false);
+ c->setGroup("General");
+ c->writeEntry( "confirmLogout", dialog->confirmLogoutCheck->isChecked());
+ c->writeEntry( "offerShutdown", dialog->offerShutdownCheck->isChecked());
+ QString s = "restorePreviousLogout";
+ if ( dialog->emptySessionRadio->isChecked() )
+ s = "default";
+ else if ( dialog->savedSessionRadio->isChecked() )
+ s = "restoreSavedSession";
+ c->writeEntry( "loginMode", s );
+
+ c->writeEntry( "shutdownType",
+ dialog->haltRadio->isChecked() ?
+ int(KApplication::ShutdownTypeHalt) :
+ dialog->rebootRadio->isChecked() ?
+ int(KApplication::ShutdownTypeReboot) :
+ int(KApplication::ShutdownTypeNone));
+ c->writeEntry("excludeApps", dialog->excludeLineedit->text());
+ c->sync();
+ delete c;
+
+ // update the k menu if necessary
+ QByteArray data;
+ kapp->dcopClient()->send( "kicker", "kicker", "configure()", data );
+}
+
+void SMServerConfig::defaults()
+{
+ load( true );
+}
+
+#include "kcmsmserver.moc"
+
diff --git a/kcontrol/smserver/kcmsmserver.desktop b/kcontrol/smserver/kcmsmserver.desktop
new file mode 100644
index 000000000..1fbb6d77e
--- /dev/null
+++ b/kcontrol/smserver/kcmsmserver.desktop
@@ -0,0 +1,236 @@
+[Desktop Entry]
+Icon=exit
+Type=Application
+DocPath=kcontrol/kcmsmserver/index.html
+Exec=kcmshell kcmsmserver
+
+
+X-KDE-Library=smserver
+X-KDE-FactoryName=smserver
+X-KDE-ParentApp=kcontrol
+
+Name=Session Manager
+Name[af]=Sessie Bestuurder
+Name[ar]=مسيير الجلسات
+Name[az]=İclas İdarəcisi
+Name[be]=Кіраўнік сесіяў
+Name[bg]=Системни сесии
+Name[bn]=সেশন ম্যানেজার
+Name[br]=Merour an dalc'hioù
+Name[bs]=Upravljanje sesijama
+Name[ca]=Gestor de la sessió
+Name[cs]=Správce relace
+Name[csb]=Menedżer sesëji
+Name[cy]=Rheolydd Sesiwn
+Name[da]=Sessionshåndtering
+Name[de]=Sitzungsverwaltung
+Name[el]=Διαχειριστής συνεδρίας
+Name[eo]=Seancokonservilo
+Name[es]=Gestor de sesiones
+Name[et]=Seansihaldur
+Name[eu]=Saio kudeatzailea
+Name[fa]=مدیر نشست
+Name[fi]=Istunnonhallinta
+Name[fr]=Gestionnaire de session
+Name[fy]=Sesjebehear
+Name[ga]=Bainisteoir Seisiúin
+Name[gl]=Xestor de Sesións
+Name[he]=מנהל ההפעלה
+Name[hi]=सत्र प्रबंधक
+Name[hr]=Upravitelj sesijama
+Name[hu]=Munkafolyamatok
+Name[id]=Manajer Sesi
+Name[is]=Setustjóri
+Name[it]=Gestione della sessione
+Name[ja]=セッションマネージャ
+Name[ka]=სეანსების მენეჯერი
+Name[kk]=Сеанс менеджері
+Name[km]=កម្មវិធី​គ្រប់គ្រង​សម័យ
+Name[ko]=세션 관리자
+Name[lo]=ເຄື່ອງມືຈັດການເຊສຊັນ
+Name[lt]=Sesijos valdyklė
+Name[lv]=Sesiju Menedžeris
+Name[mk]=Менаџер на сесии
+Name[mn]=Суулт удирдлага
+Name[ms]=Pengurus Sesi
+Name[mt]=Manager tas-sessjoni
+Name[nb]=Øktbehandler
+Name[nds]=Törnpleger
+Name[ne]=सत्र प्रबन्धक
+Name[nl]=Sessiebeheer
+Name[nn]=Økthandsamar
+Name[nso]=Molaodi wa Tiragalo
+Name[pa]=ਸ਼ੈਸ਼ਨ ਮੈਨੇਜਰ
+Name[pl]=Menedżer sesji
+Name[pt]=Gestor de Sessões
+Name[pt_BR]=Gerenciador de Sessão
+Name[ro]=Managerul de sesiune
+Name[ru]=Диспетчер сеансов
+Name[rw]=Mugenga Mukoro
+Name[se]=Bargovuorrogieđahalli
+Name[sk]=Správca relácie
+Name[sl]=Upravitelj sej
+Name[sr]=Менаџер сесија
+Name[sr@Latn]=Menadžer sesija
+Name[sv]=Sessionshanterare
+Name[ta]=அமர்வு மேலாளர்
+Name[tg]=Мудири нишаст
+Name[th]=ตัวจัดการวาระ
+Name[tr]=Oturum Yöneticisi
+Name[tt]=Sessi İdäräçe
+Name[uk]=Менеджер сеансів
+Name[uz]=Seans boshqaruvchisi
+Name[uz@cyrillic]=Сеанс бошқарувчиси
+Name[ven]=Mulanguli wa tshitenwa
+Name[vi]=Trình quản lí Phiên đăng nhập
+Name[wa]=Manaedjeu di sessions
+Name[xh]=Umphathi wesiqendu
+Name[zh_CN]=会话管理器
+Name[zh_TW]=工作階段管理程式
+Name[zu]=Imenenja yesiqendu
+
+Comment=Configure the session manager and logout settings
+Comment[af]=Konfigureer die sessie bestuurder en teken af instellings
+Comment[ar]=إعداد مسيير الجلسات و تعيينات تسجيل الخروج
+Comment[be]=Настаўленні кіраўніка сеансаў і параметраў выхаду
+Comment[bg]=Настройване сесиите на системата и поведението при изход
+Comment[bn]=সেশন ম্যানেজার এবং লগ-আউট সেটিংস কনফিগার করুন
+Comment[br]=Kefluniañ ar merour an dalc'hioù hag an doare mont kuit
+Comment[bs]=Podesite menadžer sesija i postavke odjave
+Comment[ca]=Aquí podeu configurar el gestor de la sessió i la sortida
+Comment[cs]=Nastavení správce relace a odhlašování
+Comment[csb]=Kònfigùracëjô menedżera sesëji ë nastôwów wëlogòwaniô
+Comment[cy]=Ffurfweddu'r rheolydd sesiwn a gosodiadau allgofnodi
+Comment[da]=Indstil sessionshåndterigen og opsætning for at logge af
+Comment[de]=Einstellungen für Sitzungsverwaltung und Abmeldung vornehmen
+Comment[el]=Ρυθμίστε το διαχειριστή συνεδρίας και τις επιλογές αποσύνδεσης
+Comment[eo]=Agordo de la seancokonservilo kaj la adiaŭa maniero
+Comment[es]=Configura el gestor de sesiones y las opciones de salida
+Comment[et]=Seansihalduri ja väljalogimise seadistamine
+Comment[eu]=Konfiguratu saio kudeatzailea eta saio amaieraren ezarpenak
+Comment[fa]=پیکربندی مدیر نشست و تنظیمات خروج
+Comment[fi]=Istunnonhallinnan ja uloskirjautumisen asetukset
+Comment[fr]=Configuration du gestionnaire de session et réglages de la sortie
+Comment[fy]=Hjir kinne jo it sesjebehear en ôfmeld-ynstellings fêststelle
+Comment[gl]=Configurar o xestor de sesións e as opcións de saída
+Comment[he]=שינוי הגדרות מנהל ההפעלה והיציאה מהמערכת
+Comment[hi]=सत्र प्रबंधक तथा लॉगआउट विन्यास कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje upravitelja sesijama i postavkama odjavljivanja
+Comment[hu]=A KDE munkafolyamat és a kijelentkezési mód beállításai
+Comment[is]=Stilla setustjóra og aðgerðir við útstimplun
+Comment[it]=Configura il gestore della sessione e le impostazioni di fine sessione
+Comment[ja]=セッションマネージャとログアウト時の設定
+Comment[ka]=სეანსების მენეჯერის და სისტემიდან გამოსვლის კონფიგურაცია
+Comment[kk]=Сеанс менеджерді және жүйеден шығу параметрлерін баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​កម្មវិធី​គ្រប់គ្រង​សម័យ និង​ការ​កំណត់​ពេល​ចេញ
+Comment[ko]=세션 관리자와 로그아웃 설정 관리
+Comment[lo]=ທ່ານສາມາດປັບແຕ່ງການທຳງານຂອງເຄື່ອງ ມືຈັດການເຊສຊັນໄດ້ທີ່ນີ້
+Comment[lt]=Čia galite konfigūruoti sesijos tvarkyklę ir išsiregistravimo nustatymus
+Comment[lv]=Šeit jūs varat konfigurēt sesiju menedžeri un pieteikšanās parametrus
+Comment[mk]=Конфигурирајте го менаџерот на сесии и поставувањата за одјавување
+Comment[mn]=Суулт удирдлага ба гаралтын тохиргоо хийх
+Comment[ms]=Konfigur seting pengurus sesi dan bentangan
+Comment[mt]=Ikkonfigura l-manager tas-sessjoni u tal-logout
+Comment[nb]=Her kan du tilpasse øktbehandleren og utlogginga
+Comment[nds]=Dat Afmellen un den Törnpleger instellen
+Comment[ne]=सत्र प्रबन्धक र लगआउट सेटिङ कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u het sessiebeheer en de afmeld-instellingen bepalen
+Comment[nn]=Oppsett av økthandsamar og utlogging
+Comment[nso]=Beakanya molaodi wa tiragalo le dipeakanyo tsa gotswa
+Comment[pa]=ਸ਼ੈਸ਼ਨ ਮੈਨੇਜਰ ਅਤੇ ਲਾਗਆਉਟ ਸੈਟਿੰਗ ਦੀ ਸਥਾਪਨ
+Comment[pl]=Konfiguracja menedżera sesji i ustawień wylogowania
+Comment[pt]=Configuração do gestor de sessões e das opções de encerramento
+Comment[pt_BR]=Configura o gerenciador de sessão e definições de logout
+Comment[ro]=Configurează managerul de sesiune și setările de ieșire
+Comment[ru]=Настройка диспетчера сеансов
+Comment[rw]=Umukoro Muyobozi no Gufunga Igenamiterere
+Comment[se]=Heivet bargovuorrogieđahalli ja olggosčáliheami
+Comment[sk]=Nastavenie správcu relácií a odhlásenia
+Comment[sl]=Tu lahko nastavite upravljalnik sej in nastavitve odjav
+Comment[sr]=Подешавање менаџера сесија и поставки одјављивања
+Comment[sr@Latn]=Podešavanje menadžera sesija i postavki odjavljivanja
+Comment[sv]=Anpassa sessionshanteraren och utloggningsinställningar
+Comment[ta]=அமர்வு மேளாலர் மற்றும் வெளிச்செல் அமைப்புகளை வடிவமை
+Comment[tg]= Метавонед мудири нишаст ва танзимоти хурӯҷро дар инҷо пахш кунед
+Comment[th]=ปรับแต่งการทำงานของเครื่องมือจัดการวาระและการล็อกเอาต์
+Comment[tr]=Oturum yöneticisi ve çıkış ayarlarını yapılandır
+Comment[tt]=Sessi idäräçen belän kerü/çığu tärtiben caylaw
+Comment[uk]=Налаштування менеджеру сеансів та параметри виходу з системи
+Comment[uz]=Seans boshqaruvchisini va chiqish moslamalarini moslash
+Comment[uz@cyrillic]=Сеанс бошқарувчисини ва чиқиш мосламаларини мослаш
+Comment[ven]=Dzudzanyani mulanguli wa ntshitenwa ni dovhe ni vale mavhekanyele
+Comment[vi]=Cấu hình trình quản lý phiên đăng nhập và các thiết lập đăng xuất
+Comment[wa]=Apontiaedje do manaedjeu si sessions eyet apontiaedjes do dislodjaedje
+Comment[xh]=Qwalasela umphathi wesiqendu nezicwangciso zokuphuma ngaphandle
+Comment[zh_CN]=配置会话管理器和注销设置
+Comment[zh_TW]=設定工作階段管理程式與登出設定值
+Comment[zu]=Hlanganisela imenenja yesiqendu kanye nezilungiselelo zokuphuma ngaphandle
+
+Keywords=ksmserver,session,logout,confirmation,save,restore
+Keywords[ar]=ksmserver,جلسة,خروج,تأكيد,حفظ,استعادة
+Keywords[az]=ksmserver,iclas,çıxış,qeyd et
+Keywords[be]=Сесія,Выхад,Канец сесіі,Пацверджанне,Захаванне,Захаваць,Аднавіць,Аднаўленне,ksmserver,session,logout,confirmation,save,restore
+Keywords[bg]=сесия, сесии, изход, запис, възстановяване, ksmserver, session, logout, confirmation, save, restore
+Keywords[ca]=ksmserver,sessió,sortida,confirmació,desa,restaura
+Keywords[cs]=Správce relace,Relace,Odhlášení,Potvrzení,Uložení,Obnovení
+Keywords[csb]=ksmserver,sesëjô,wëlogòwanié,pòcwierdzenié,zachòwanié stónu,òdtwòrzenié,kùńc robòtë,kùńc pracë
+Keywords[cy]=ksmserver,sesiwn,allgofnodi,cadarnhau,cadw,adfer
+Keywords[da]=ksmserver,session,log af,bekræftelse,gem,genopret
+Keywords[de]=Ksmserver,Sitzung,Abmelden,Logout,Bestätigung,Speichern,Wiederherstellen
+Keywords[el]=ksmserver,συνεδρία,αποσύνδεση,επιβεβαίωση,αποθήκευση,αποκατάσταση
+Keywords[eo]=seancokonservilo,seanco,adaiŭo,konfirmo,sekurigo,restarigo
+Keywords[es]=ksmserver,sesión,salida,confirmación,guardar,restaurar
+Keywords[et]=ksmserver,seanss,väljalogimine,kinnitus,salvestamine,taastamine
+Keywords[eu]=ksmserver,saioa,saio amaiera,berrespena,gorde,berrezarri
+Keywords[fa]=ksmserver، نشست، خروج، تأیید، ذخیره، بازنشانی
+Keywords[fi]=ksmserver,istunto,lopetus,vahvistus,tallenna,palauta
+Keywords[fr]=ksmserver,session,arrêt,logout,confirmation,enregistrement,enregistrer,restaurer,restauration,connexion,déconnexion
+Keywords[fy]=ksmserver,sesje,logout,ôfmelde,befêstiging,herstelle,opslaan,bewarje
+Keywords[ga]=ksmserver,seisiún,logáil amach,dearbhú,sábháil,athchóiriú
+Keywords[gl]=ksmserver,sesión,saída,confirmación,guardar,restaurar
+Keywords[he]=הפעלה,יציאה,אישור,שמירה,שיחזור,ksmserver, session,logout,confirmation,save,restore
+Keywords[hi]=केएसएम-सर्वर,सत्र,लॉगआउट,पुष्टि,सहेजें,बहाल करें
+Keywords[hr]=ksmserver,session,logout,confirmation,save,restore,sesija,odjava,potvrda,spremanje,obnavljanje
+Keywords[hu]=ksmserver,munkafolyamat,kijelentkezés,megerősítés,mentés,visszatöltés
+Keywords[is]=ksmserver,seta,stimpla út,innskráning,staðfesting,vista,endurheimta
+Keywords[it]=ksmserver,sessione,uscita,conferma,salva,ripristina
+Keywords[ja]=ksmserver,セッション,ログアウト,確認,保存,復旧
+Keywords[km]=ksmserver,សម័យ,ចេញ,ការ​អះអាង,រក្សាទុក,ស្ដារ​ឡើង​វិញ
+Keywords[lt]=ksmserver,sesija,išsiregistravimas,patvirtinimas,išsaugoti,atstatyti
+Keywords[lv]=ksmserveris,sesija,atteikšanās,apstiprinājums,saglabāt,atjaunot
+Keywords[mk]=ksmserver,session,logout,confirmation,save,restore, сесија,одјави се,потврда,сними,реконструирај
+Keywords[mn]=Ksmсервер,Суулт,Гарах,Logout,Бататгах,Хадгалах,Сэргээх
+Keywords[mt]=ksmserver,session,logout,temm is-sessjoni,confirmation,save,restore
+Keywords[nb]=ksmserver,økt,utlogging,lagre,gjenopprette
+Keywords[nds]=ksmserver,Törn,afmellen,nafragen,Nafraag,sekern,wedderherstellen
+Keywords[ne]=ksmserver,सत्र, लग आउट, यकीन, बचत गर्नुहोस्, पूर्वावस्थामा फर्काउनुहोस्
+Keywords[nl]=ksmserver,sessie,logout,uitloggen,afmelden,bevestiging,herstellen,opslaan
+Keywords[nn]=ksmserver,økt,utlogging,stadfesting,lagra,gjenopprett
+Keywords[nso]=ksmseabi,tiragalo,etswa,kgonthisiso,boloka,bolokaleswa
+Keywords[pa]=ksmserver,session,logout,confirmation,save,restore,ਸੰਭਾਲੋ,ਲਾਗਆਉਟ,ਪੁਸ਼ਟੀ
+Keywords[pl]=ksmserver,sesja,wylogowanie,potwierdzenie,zachowanie stanu,odtworzenie,kończenie pracy
+Keywords[pt]=ksmserver,sessão,terminar,confirmar,gravar,restaurar
+Keywords[pt_BR]=ksmserver,sessão,finalizar,sair,confirmação,salvar,restaurar
+Keywords[ro]=ksmserver,sesiune,ieșire,confirmare,salvare,refacere
+Keywords[rw]=ksm-seriveri,umukoro,gufunga,iyemeza,kubika,kugarura
+Keywords[se]=ksmserver,bargovuorru,olggosčáliheapmi,nannen,vurket,máhcahit
+Keywords[sk]=ksmserver,relácia,odhlásenie,potvrdenie,uloženie,obnovenie
+Keywords[sl]=ksmserver,seja,odjava,potrditev,shrani,obnovi
+Keywords[sr]=ksmserver,session,logout,confirmation,save,restore,сесија,одјављивање, потврда,снимање,обнављање
+Keywords[sr@Latn]=ksmserver,session,logout,confirmation,save,restore,sesija,odjavljivanje, potvrda,snimanje,obnavljanje
+Keywords[sv]=ksmserver,session,logga ut,bekräftelse,spara,återställa
+Keywords[ta]=ksmசேவகன்,அமர்வு,வெளிசெல்,உறுதி செய்,சேமி,திரும்ப பெறு
+Keywords[th]=ksmserver,วาระ,ล็อกเอาต์,การยืนยัน,บันทึก,เรียกค่าคืน
+Keywords[tr]=ksmserver,oturum,çıkış,kaydet
+Keywords[uk]=ksmserver,сеанс,кінець сеансу,підтвердження,збереження,відновлення
+Keywords[uz]=ksmserver,seans,chiqish,tasdiqlash,saqlash,tiklash
+Keywords[uz@cyrillic]=ksmserver,сеанс,чиқиш,тасдиқлаш,сақлаш,тиклаш
+Keywords[ven]=siva ya ksm,tshitenwa,tsimani,khwathisedzani,vhulunga,vhekanyani hafhu
+Keywords[vi]=ksmserver,phiên đăng nhập,đăng xuất,xác nhận,sao lưu,phục hồi
+Keywords[wa]=ksmserver,session,dislodjî,acertiner,schaper,ristorer
+Keywords[xh]=ksmserver,isiqendu,phuma ngaphandle,uqinisekiso,gcina,gcina kwakhona
+Keywords[zh_CN]=ksmserver,会话,注消,确认,保存,恢复
+Keywords[zh_TW]=ksmserver,session,logout,confirmation,save,restore,工作階段,登出,確認,儲存,回復
+Keywords[zu]=ksmserver,isiqendu,ukuphuma ngaphandle,ukuqiniseka,gcina,vuselela
+
+Categories=Qt;KDE;X-KDE-settings-components;
diff --git a/kcontrol/smserver/kcmsmserver.h b/kcontrol/smserver/kcmsmserver.h
new file mode 100644
index 000000000..4f51ab3d5
--- /dev/null
+++ b/kcontrol/smserver/kcmsmserver.h
@@ -0,0 +1,46 @@
+/*
+ * kcmsmserver.h
+ * Copyright (c) 2000 Oswald Buddenhagen <ob6@inf.tu-dresden.de>
+ *
+ * based on kcmtaskbar.h
+ * Copyright (c) 2000 Kurt Granroth <granroth@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+#ifndef __kcmsmserver_h__
+#define __kcmsmserver_h__
+
+#include <kcmodule.h>
+
+class SMServerConfigImpl;
+
+
+class SMServerConfig : public KCModule
+{
+ Q_OBJECT
+
+public:
+ SMServerConfig( QWidget *parent=0, const char* name=0, const QStringList &list=QStringList() );
+
+ void load();
+ void load(bool useDefaults);
+ void save();
+ void defaults();
+
+private:
+ SMServerConfigImpl* dialog;
+
+};
+
+#endif
diff --git a/kcontrol/smserver/smserverconfigdlg.ui b/kcontrol/smserver/smserverconfigdlg.ui
new file mode 100644
index 000000000..518052675
--- /dev/null
+++ b/kcontrol/smserver/smserverconfigdlg.ui
@@ -0,0 +1,248 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>SMServerConfigDlg</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SMServerConfigDlg</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>325</width>
+ <height>366</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Session Manager</string>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>topBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>General</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>confirmLogoutCheck</cstring>
+ </property>
+ <property name="text">
+ <string>Conf&amp;irm logout</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option if you want the session manager to display a logout confirmation dialog box.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>offerShutdownCheck</cstring>
+ </property>
+ <property name="text">
+ <string>O&amp;ffer shutdown options</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>loginGroup</cstring>
+ </property>
+ <property name="title">
+ <string>On Login</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;ul&gt;
+&lt;li&gt;&lt;b&gt;Restore previous session:&lt;/b&gt; Will save all applications running on exit and restore them when they next start up&lt;/li&gt;
+&lt;li&gt;&lt;b&gt;Restore manually saved session: &lt;/b&gt; Allows the session to be saved at any time via "Save Session" in the K-Menu. This means the currently started applications will reappear when they next start up.&lt;/li&gt;
+&lt;li&gt;&lt;b&gt;Start with an empty session:&lt;/b&gt; Do not save anything. Will come up with an empty desktop on next start.&lt;/li&gt;
+&lt;/ul&gt;</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>previousSessionRadio</cstring>
+ </property>
+ <property name="text">
+ <string>Restore &amp;previous session</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>savedSessionRadio</cstring>
+ </property>
+ <property name="text">
+ <string>Restore &amp;manually saved session</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>emptySessionRadio</cstring>
+ </property>
+ <property name="text">
+ <string>Start with an empty &amp;session</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>sdGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Default Shutdown Option</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can choose what should happen by default when you log out. This only has meaning, if you logged in through KDM.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>logoutRadio</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;End current session</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>haltRadio</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Turn off computer</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>rebootRadio</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Restart computer</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>advancedGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Advanced</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Applications to be e&amp;xcluded from sessions:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>excludeLineedit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>excludeLineedit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Here you can enter a comma-separated list of applications that should not be saved in sessions, and therefore will not be started when restoring a session. For example 'xterm,xconsole'.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>bottomSpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>130</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>confirmLogoutCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SMServerConfigDlg</receiver>
+ <slot>configChanged()</slot>
+ </connection>
+ <connection>
+ <sender>loginGroup</sender>
+ <signal>clicked(int)</signal>
+ <receiver>SMServerConfigDlg</receiver>
+ <slot>configChanged()</slot>
+ </connection>
+ <connection>
+ <sender>sdGroup</sender>
+ <signal>clicked(int)</signal>
+ <receiver>SMServerConfigDlg</receiver>
+ <slot>configChanged()</slot>
+ </connection>
+ <connection>
+ <sender>excludeLineedit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>SMServerConfigDlg</receiver>
+ <slot>configChanged()</slot>
+ </connection>
+ <connection>
+ <sender>offerShutdownCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>sdGroup</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>offerShutdownCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SMServerConfigDlg</receiver>
+ <slot>configChanged()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot>configChanged()</slot>
+</slots>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/smserver/smserverconfigimpl.cpp b/kcontrol/smserver/smserverconfigimpl.cpp
new file mode 100644
index 000000000..9a2afbd90
--- /dev/null
+++ b/kcontrol/smserver/smserverconfigimpl.cpp
@@ -0,0 +1,31 @@
+/***************************************************************************
+ smserverconfigimpl.cpp - description
+ -------------------
+ begin : Thu May 17 2001
+ copyright : (C) 2001 by stulle
+ email : stulle@tux
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "smserverconfigimpl.h"
+#include "smserverconfigimpl.moc"
+
+SMServerConfigImpl::SMServerConfigImpl(QWidget *parent, const char *name ) : SMServerConfigDlg(parent,name) {
+
+}
+SMServerConfigImpl::~SMServerConfigImpl(){
+}
+/** No descriptions */
+void SMServerConfigImpl::configChanged(){
+
+ emit changed();
+
+}
diff --git a/kcontrol/smserver/smserverconfigimpl.h b/kcontrol/smserver/smserverconfigimpl.h
new file mode 100644
index 000000000..d928c48ec
--- /dev/null
+++ b/kcontrol/smserver/smserverconfigimpl.h
@@ -0,0 +1,41 @@
+/***************************************************************************
+ smserverconfigimpl.h - description
+ -------------------
+ begin : Thu May 17 2001
+ copyright : (C) 2001 by stulle
+ email : stulle@tux
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef SMSERVERCONFIGIMPL_H
+#define SMSERVERCONFIGIMPL_H
+
+#include <qwidget.h>
+#include "smserverconfigdlg.h"
+
+/**
+ *@author stulle
+ */
+
+class SMServerConfigImpl : public SMServerConfigDlg {
+ Q_OBJECT
+public:
+ SMServerConfigImpl(QWidget *parent=0, const char *name=0);
+ ~SMServerConfigImpl();
+public slots: // Public slots
+ /** No descriptions */
+ void configChanged();
+signals: // Signals
+ /** No descriptions */
+ void changed();
+};
+
+#endif
diff --git a/kcontrol/spellchecking/Makefile.am b/kcontrol/spellchecking/Makefile.am
new file mode 100644
index 000000000..e4740eb8e
--- /dev/null
+++ b/kcontrol/spellchecking/Makefile.am
@@ -0,0 +1,16 @@
+kde_module_LTLIBRARIES = kcm_spellchecking.la
+
+kcm_spellchecking_la_SOURCES = spellchecking.cpp
+
+kcm_spellchecking_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_spellchecking_la_LIBADD = -lkdeui
+
+AM_CPPFLAGS= $(all_includes)
+
+METASOURCES = spellchecking.moc
+
+messages:
+ $(XGETTEXT) $(kcm_spellchecking_la_SOURCES) -o $(podir)/kcmspellchecking.pot
+
+xdg_apps_DATA = spellchecking.desktop
+
diff --git a/kcontrol/spellchecking/spellchecking.cpp b/kcontrol/spellchecking/spellchecking.cpp
new file mode 100644
index 000000000..d4e781844
--- /dev/null
+++ b/kcontrol/spellchecking/spellchecking.cpp
@@ -0,0 +1,74 @@
+/*
+ Copyright (c) 2001 Laurent Montel <lmontel@mandrakesoft.com>
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <qlayout.h>
+#include <qvgroupbox.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kdialog.h>
+#include <kgenericfactory.h>
+#include <kspell.h>
+
+#include "spellchecking.h"
+
+typedef KGenericFactory<KSpellCheckingConfig, QWidget > SpellFactory;
+K_EXPORT_COMPONENT_FACTORY (kcm_spellchecking, SpellFactory("kcmspellchecking") )
+
+
+KSpellCheckingConfig::KSpellCheckingConfig(QWidget *parent, const char *name, const QStringList &):
+ KCModule(SpellFactory::instance(), parent, name)
+{
+ QBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+ QGroupBox *box = new QVGroupBox( i18n("Spell Checking Settings"), this );
+ box->layout()->setSpacing( KDialog::spacingHint() );
+ layout->addWidget(box);
+
+ spellConfig = new KSpellConfig(box, 0L ,0L, false );
+ layout->addStretch(1);
+ connect(spellConfig,SIGNAL(configChanged()), SLOT( changed() ));
+
+ setQuickHelp( i18n("<h1>Spell Checker</h1><p>This control module allows you to configure the KDE spell checking system. You can configure:<ul><li> which spell checking program to use<li> which types of spelling errors are identified<li> which dictionary is used by default.</ul><br>The KDE spell checking system (KSpell) provides support for two common spell checking utilities: ASpell and ISpell. This allows you to share dictionaries between KDE applications and non-KDE applications.</p>"));
+
+}
+
+void KSpellCheckingConfig::load()
+{
+ spellConfig->readGlobalSettings();
+}
+
+void KSpellCheckingConfig::save()
+{
+ spellConfig->writeGlobalSettings();
+ QByteArray data;
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+ kapp->dcopClient()->send( "konqueror*", "KonquerorIface", "reparseConfiguration()", data );
+}
+
+void KSpellCheckingConfig::defaults()
+{
+ spellConfig->setNoRootAffix(0);
+ spellConfig->setRunTogether(0);
+ spellConfig->setDictionary("");
+ spellConfig->setDictFromList(FALSE);
+ spellConfig->setEncoding (KS_E_ASCII);
+ spellConfig->setClient (KS_CLIENT_ISPELL);
+}
+
+#include "spellchecking.moc"
diff --git a/kcontrol/spellchecking/spellchecking.desktop b/kcontrol/spellchecking/spellchecking.desktop
new file mode 100644
index 000000000..9c21a5756
--- /dev/null
+++ b/kcontrol/spellchecking/spellchecking.desktop
@@ -0,0 +1,232 @@
+[Desktop Entry]
+Exec=kcmshell spellchecking
+Icon=spellcheck
+Type=Application
+DocPath=kcontrol/spellchecking/index.html
+
+
+X-KDE-Library=spellchecking
+X-KDE-ParentApp=kcontrol
+
+Name=Spell Checker
+Name[af]=Spel Toetser
+Name[ar]=المدقق الإملائي
+Name[be]=Праверка правапісу
+Name[bg]=Проверка на правописа
+Name[bn]=বানান পরীক্ষক
+Name[br]=Gwirieker ar skritur
+Name[bs]=Provjera pravopisa
+Name[ca]=Comprovació de l'ortografia
+Name[cs]=Kontrola pravopisu
+Name[csb]=Sprôwdzanié pisënkù
+Name[cy]=Cywirydd Sillafu
+Name[da]=Stavekontrol
+Name[de]=Rechtschreibprüfung
+Name[el]=Ορθογραφικός έλεγχος
+Name[eo]=Literumilo
+Name[es]=Corrector ortográfico
+Name[et]=Õigekirja kontroll
+Name[eu]=Ortografia zuzentzailea
+Name[fa]=غلط‌گیر
+Name[fi]=Oikoluku
+Name[fr]=Vérificateur orthographique
+Name[fy]=Staveringshifker
+Name[ga]=Litreoir
+Name[gl]=Corrector Ortográfico
+Name[he]=בודק האיות
+Name[hi]=वर्तनी शोधक
+Name[hr]=Alat za provjeru pravopisa
+Name[hu]=Helyesírás-ellenőrző
+Name[is]=Stafsetningarleiðrétting
+Name[it]=Controllo ortografico
+Name[ja]=スペルチェッカー
+Name[ka]=მარლთწერის შემოწმება
+Name[kk]=Емле тексеруі
+Name[km]=កម្មវិធី​ពិនិត្យ​អក្ខរាវិរុទ្ធ
+Name[lo]=ເຄື່ອງມືກວດຄຳສະກົດ
+Name[lt]=Rašybos tikrinimo įrankis
+Name[lv]=Pareizrakstības pārbaudes rīks
+Name[mk]=Проверка на правопис
+Name[mn]=Зөв бичиг шалгалт
+Name[ms]=Penyemak Eja
+Name[nb]=Stavekontroll
+Name[nds]=Klookschriever
+Name[ne]=हिज्जे परीक्षक
+Name[nl]=Spellingcontrole
+Name[nn]=Stavekontroll
+Name[nso]=Molebeledi wa Mongwalo
+Name[pa]=ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚਕਾਰ
+Name[pl]=Sprawdzanie pisowni
+Name[pt]=Verificador Ortográfico
+Name[pt_BR]=Corretor Ortográfico
+Name[ro]=Verificatorul ortografic
+Name[ru]=Проверка орфографии
+Name[rw]=Igenzuranyuguti
+Name[se]=Čállindárkkisteapmi
+Name[sk]=Kontrola pravopisu
+Name[sl]=Preverjanje črkovanja
+Name[sr]=Провера правописа
+Name[sr@Latn]=Provera pravopisa
+Name[sv]=Stavningskontroll
+Name[ta]=எழுத்துப்பிழை திருத்துங்கருவி
+Name[tg]=Тафтиши Имло
+Name[th]=ตรวจคำสะกด
+Name[tr]=İmla Denetim Programı
+Name[tt]=Yazma Döreslege
+Name[uk]=Перевірка правопису
+Name[uz]=Imloni tekshiruvchi
+Name[uz@cyrillic]=Имлони текширувчи
+Name[ven]=Tshisedzi tsha tshipelini
+Name[vi]=Công cụ kiểm tra chính tả
+Name[wa]=Coridjrece ortografike
+Name[xh]=Umkhangeki Wopelo
+Name[zh_CN]=拼写检查工具
+Name[zh_TW]=拼字檢查工具
+Name[zu]=Umbheki wokubizelwa kwamagama
+
+Comment=Configure the spell checker
+Comment[af]=Konfigureer die spel toetser
+Comment[ar]=قم بإعداد المدقق الإملائي
+Comment[be]=Настаўленне спраўджвання правапісу
+Comment[bg]=Настройване проверката на правописа
+Comment[bn]=বানান পরীক্ষক কনফিগার করুন
+Comment[br]=Kefluniañ an ostilh gwiriekaat
+Comment[bs]=Podesite provjeru pravopisa
+Comment[ca]=Aquí podeu configurar el corrector ortogràfic
+Comment[cs]=Nastavení kontroly pravopisu
+Comment[csb]=Kònfigùracëjô sprôwdzaniô bezzmiłkòwòscë pisënkù
+Comment[cy]=Ffurfweddu'r cywirydd sillafu
+Comment[da]=Indstil stavekontrollen
+Comment[de]=Rechtschreibprüfung einrichten
+Comment[el]=Ρυθμίστε τον ελεγκτή ορθογραφίας
+Comment[eo]=Agordo de la literumilo
+Comment[es]=Configuración del corrector ortográfico
+Comment[et]=Õigekirja kontrolli seadistamine
+Comment[eu]=Konfiguratu ortografia zuzentzailea
+Comment[fa]=پیکربندی غلط‌گیر
+Comment[fi]=Oikolukuasetukset
+Comment[fr]=Configurer la vérification orthographique
+Comment[fy]=Hjir kinne jo de staveringshifker ynstelle
+Comment[ga]=Cumraigh an litreoir
+Comment[gl]=Configurar o corrector ortográfico
+Comment[he]=שינוי הגדרות בודק האיות
+Comment[hi]=वर्तनी शोधक कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje provjere pravopisa
+Comment[hu]=A helyesírás-ellenőrző beállításai
+Comment[is]=Stilla stafsetningarleiðréttingu
+Comment[it]=Configura il correttore ortografico
+Comment[ja]=スペルチェッカーの設定
+Comment[ka]=მარლთწერის სემოწმების კონფიგურაცია
+Comment[kk]=Емле тексерушіні баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​កម្មវិធី​ពិនិត្យ​អក្ខរាវិរុទ្ធ
+Comment[ko]=패널 작업 표시줄 설정
+Comment[lo]=ປັບແຕ່ງການຕັ້ງຄ່າລະບົບແຄຊທີ່ນີ້
+Comment[lt]=Konfigūruoti rašybos tikrinimą
+Comment[lv]=Šeit Jūs varat konfigurēt pareizrakstības pārbaudītāja parametrus
+Comment[mk]=Конфигурирајте ја проверката на правопис
+Comment[mn]=Зөв бичиг шалгалт тохируулах
+Comment[ms]=Konfigur penyemak eja
+Comment[mt]=Ikkonfigura l-iċċekkjar tal-ortografija
+Comment[nb]=Oppsett av stavekontroll
+Comment[nds]=Instellen för dat Kuntrulleren vun Schriefwiesen
+Comment[ne]=हिज्जे परीक्षक कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u de spellingcontrole instellen
+Comment[nn]=Oppsett av stavekontroll
+Comment[nso]=Beakanya molebeledi wa mongwalo
+Comment[pa]=ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚਕਾਰ ਦੀ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja sprawdzania poprawności pisowni
+Comment[pt]=Configuração do verificador ortográfico
+Comment[pt_BR]=Configura o corretor ortográfico
+Comment[ro]=Configurează opțiunile verificatorului ortografic
+Comment[ru]=Настройка проверки орфографии
+Comment[rw]=Kuboneza igenzuranyuguti
+Comment[se]=Heivet čállindárkkisteaddji
+Comment[sk]=Nastavenie kontroly pravopisu
+Comment[sl]=Tu lahko nastavite črkovalnik
+Comment[sr]=Подешавање провере правописа
+Comment[sr@Latn]=Podešavanje provere pravopisa
+Comment[sv]=Anpassa stavningskontroll
+Comment[ta]=சொல் திருத்தியை வடிவமை
+Comment[tg]=Танзими тафтиши имло
+Comment[th]=ปรับแต่งเครื่องมือตรวจคำสะกด
+Comment[tr]=İmla denetimini yapılandır
+Comment[tt]=Döresyazu qoralın caylaw
+Comment[uk]=Налаштування перевірки правопису
+Comment[uz]=Imlo tekshiruvchini moslash
+Comment[uz@cyrillic]=Имло текширувчини мослаш
+Comment[ven]=Dzudzanyani tshisedzi tsha tshipelini
+Comment[vi]=Cấu hình các bộ kiểm tra chính tả
+Comment[wa]=Apontyî l' coridjrece ortografike
+Comment[xh]=Qwalasela umkhangelo wopelo
+Comment[zh_CN]=配置拼写检查工具
+Comment[zh_TW]=設定拼字檢查程式
+Comment[zu]=Hlanganisela umbheki wokubizelwa kwamagama
+
+Keywords=Spell
+Keywords[af]=Spel
+Keywords[ar]=التهجئة و الإملاء
+Keywords[az]=İmla
+Keywords[be]=Правапіс,Праверка,Spell
+Keywords[bg]=проверка, правопис, коректор, правописен, Spell
+Keywords[ca]=Ortografia
+Keywords[cs]=Pravopis
+Keywords[csb]=Lëterówczi,bezzmiłkòwòsc pisënkù
+Keywords[cy]=Sillafu
+Keywords[da]=Stav
+Keywords[de]=Rechtschreibung
+Keywords[el]=Ορθογραφία
+Keywords[eo]=Literumo
+Keywords[es]=Ortografía
+Keywords[et]=õigekiri
+Keywords[eu]=Ortografia
+Keywords[fa]=هجی
+Keywords[fi]=Oikoluku
+Keywords[fr]=orthographe,vérification
+Keywords[ga]=Litriú
+Keywords[gl]=Ortografia
+Keywords[he]=איות, Spell
+Keywords[hi]=वर्तनी
+Keywords[hr]=Spell,Provjera pravopisa
+Keywords[hu]=Helyesírás-ellenőrző
+Keywords[is]=Stafsetning
+Keywords[it]=ortografia,controllo ortografico
+Keywords[ja]=スペル
+Keywords[km]=អក្ខរាវិរុទ្ធ
+Keywords[lo]=ສະກົດ
+Keywords[lt]=Spell, rašyba
+Keywords[lv]=Pareizrakstība
+Keywords[mk]=Правопис
+Keywords[mn]=Зөв бичиг
+Keywords[ms]=Eja
+Keywords[mt]=Spell,Spelli
+Keywords[nb]=Stavekontroll
+Keywords[nds]=schrieven,Rechtschrieven,kuntrulleren,Schriefwies
+Keywords[ne]=हिज्जे
+Keywords[nn]=Stavekontroll
+Keywords[nso]=Mongwalo
+Keywords[pl]=Literówki,Poprawność pisowni
+Keywords[pt]=Ortografia
+Keywords[pt_BR]=Verificação ortográfica
+Keywords[ro]=ortografie,scriere,verificare
+Keywords[rw]=Kuvuga inyuguti
+Keywords[se]=Čállindárkkisteapmi
+Keywords[sk]=Pravopis
+Keywords[sl]=Črkuj
+Keywords[ss]=Phimisa
+Keywords[sv]=Stava
+Keywords[ta]=உச்சரி
+Keywords[tg]=Имло
+Keywords[th]=สะกด
+Keywords[tr]=İmla
+Keywords[uk]=Правопис
+Keywords[uz]=Imlo
+Keywords[uz@cyrillic]=Имло
+Keywords[ven]=Tshipelini
+Keywords[vi]=Chính tả
+Keywords[wa]=coridjrece,ortografe,ortografike
+Keywords[xh]=Pela
+Keywords[zh_CN]=拼写
+Keywords[zh_TW]=拼字
+Keywords[zu]=Bizela
+
+Categories=Qt;KDE;X-KDE-settings-components;
diff --git a/kcontrol/spellchecking/spellchecking.h b/kcontrol/spellchecking/spellchecking.h
new file mode 100644
index 000000000..f709a873d
--- /dev/null
+++ b/kcontrol/spellchecking/spellchecking.h
@@ -0,0 +1,41 @@
+/*
+ Copyright (c) 2001 Laurent Montel <lmontel@mandrakesoft.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __spellchecking_h__
+#define __spellchecking_h__
+
+#include "kcmodule.h"
+
+class KSpellConfig;
+
+class KSpellCheckingConfig : public KCModule
+{
+ Q_OBJECT
+
+ public:
+ KSpellCheckingConfig(QWidget *parent, const char *name, const QStringList &);
+
+ void load();
+ void save();
+ void defaults();
+
+ protected:
+ KSpellConfig *spellConfig;
+};
+
+#endif
diff --git a/kcontrol/structure b/kcontrol/structure
new file mode 100644
index 000000000..10ce9f32c
--- /dev/null
+++ b/kcontrol/structure
@@ -0,0 +1,21 @@
+
+KControl is organized by "subject" instead of "category".
+
+The idea is that if the user wants to configure something, they should only
+have to search for its location in the desktop. Previously, they had to
+look for the category of the setting. It should be apparent that this
+isn't very efficient, as the category might be difficult to identify
+frequently.
+
+Also, we need to consider that each applet in kcontrol is very busy with
+many tabs, and many groups in each tab: this means that our users (and
+ourselves!) have to hunt around in several modules until the right
+module is found -- and this is in no way easy, seeing that you have to
+look at all the tabs.
+
+So, this new organization tries to limit the amount of tabs per module,
+and in addition, groups the module by application, rather than topic.
+
+And as an added bonus, it eliminates the Look & Feel group.
+
+
diff --git a/kcontrol/style/Makefile.am b/kcontrol/style/Makefile.am
new file mode 100644
index 000000000..27f38de72
--- /dev/null
+++ b/kcontrol/style/Makefile.am
@@ -0,0 +1,18 @@
+
+AM_CPPFLAGS = $(all_includes)
+SUBDIRS = keramik .
+
+kde_module_LTLIBRARIES = kcm_style.la
+
+kcm_style_la_SOURCES = kcmstyle.cpp stylepreview.ui menupreview.cpp styleconfdialog.cpp
+kcm_style_la_LDFLAGS = $(KDE_RPATH) -module -avoid-version $(all_libraries) -no-undefined
+kcm_style_la_LIBADD = $(LIB_KIO) ../krdb/libkrdb.la
+METASOURCES = AUTO
+
+noinst_HEADERS = kcmstyle.h stylepreview.h menupreview.h
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmstyle.pot
+
+xdg_apps_DATA = style.desktop
+
diff --git a/kcontrol/style/kcmstyle.cpp b/kcontrol/style/kcmstyle.cpp
new file mode 100644
index 000000000..9333c0f72
--- /dev/null
+++ b/kcontrol/style/kcmstyle.cpp
@@ -0,0 +1,1070 @@
+/*
+ * KCMStyle
+ * Copyright (C) 2002 Karol Szwed <gallium@kde.org>
+ * Copyright (C) 2002 Daniel Molkentin <molkentin@kde.org>
+ *
+ * Portions Copyright (C) 2000 TrollTech AS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <qcheckbox.h>
+#include <kcombobox.h>
+#include <qlistbox.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qslider.h>
+#include <qstylefactory.h>
+#include <qtabwidget.h>
+#include <qvbox.h>
+#include <qfile.h>
+#include <qsettings.h>
+#include <qobjectlist.h>
+#include <qpixmapcache.h>
+#include <qwhatsthis.h>
+#include <qpushbutton.h>
+
+#include <dcopclient.h>
+#include <kapplication.h>
+#include <kglobalsettings.h>
+#include <kdebug.h>
+#include <kipc.h>
+#include <kaboutdata.h>
+#include <kdialog.h>
+#include <klibloader.h>
+#include <klistview.h>
+#include <kmessagebox.h>
+#include <ksimpleconfig.h>
+#include <kstyle.h>
+#include <kstandarddirs.h>
+
+#include "../krdb/krdb.h"
+
+#include "kcmstyle.h"
+#include "styleconfdialog.h"
+
+#include <X11/Xlib.h>
+// X11 namespace cleanup
+#undef Below
+#undef KeyPress
+#undef KeyRelease
+
+
+/**** DLL Interface for kcontrol ****/
+
+// Plugin Interface
+// Danimo: Why do we use the old interface?!
+extern "C"
+{
+ KDE_EXPORT KCModule *create_style(QWidget *parent, const char*)
+ {
+ KGlobal::locale()->insertCatalogue("kcmstyle");
+ return new KCMStyle(parent, "kcmstyle");
+ }
+
+ KDE_EXPORT void init_style()
+ {
+ uint flags = KRdbExportQtSettings | KRdbExportQtColors | KRdbExportXftSettings;
+ KConfig config("kcmdisplayrc", true /*readonly*/, false /*don't read kdeglobals etc.*/);
+ config.setGroup("X11");
+
+ // This key is written by the "colors" module.
+ bool exportKDEColors = config.readBoolEntry("exportKDEColors", true);
+ if (exportKDEColors)
+ flags |= KRdbExportColors;
+ runRdb( flags );
+
+ // Write some Qt root property.
+#ifndef __osf__ // this crashes under Tru64 randomly -- will fix later
+ QByteArray properties;
+ QDataStream d(properties, IO_WriteOnly);
+ d.setVersion( 3 ); // Qt2 apps need this.
+ d << kapp->palette() << KGlobalSettings::generalFont();
+ Atom a = XInternAtom(qt_xdisplay(), "_QT_DESKTOP_PROPERTIES", false);
+
+ // do it for all root windows - multihead support
+ int screen_count = ScreenCount(qt_xdisplay());
+ for (int i = 0; i < screen_count; i++)
+ XChangeProperty(qt_xdisplay(), RootWindow(qt_xdisplay(), i),
+ a, a, 8, PropModeReplace,
+ (unsigned char*) properties.data(), properties.size());
+#endif
+ }
+}
+
+/*
+typedef KGenericFactory<KWidgetSettingsModule, QWidget> GeneralFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_kcmstyle, GeneralFactory )
+*/
+
+
+KCMStyle::KCMStyle( QWidget* parent, const char* name )
+ : KCModule( parent, name ), appliedStyle(NULL)
+{
+ setQuickHelp( i18n("<h1>Style</h1>"
+ "This module allows you to modify the visual appearance "
+ "of user interface elements, such as the widget style "
+ "and effects."));
+
+ m_bEffectsDirty = false;
+ m_bStyleDirty= false;
+ m_bToolbarsDirty = false;
+
+ KGlobal::dirs()->addResourceType("themes",
+ KStandardDirs::kde_default("data") + "kstyle/themes");
+
+ KAboutData *about =
+ new KAboutData( I18N_NOOP("kcmstyle"),
+ I18N_NOOP("KDE Style Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2002 Karol Szwed, Daniel Molkentin"));
+
+ about->addAuthor("Karol Szwed", 0, "gallium@kde.org");
+ about->addAuthor("Daniel Molkentin", 0, "molkentin@kde.org");
+ about->addAuthor("Ralf Nolden", 0, "nolden@kde.org");
+ setAboutData( about );
+
+ // Setup pages and mainLayout
+ mainLayout = new QVBoxLayout( this );
+ tabWidget = new QTabWidget( this );
+ mainLayout->addWidget( tabWidget );
+
+ page1 = new QWidget( tabWidget );
+ page1Layout = new QVBoxLayout( page1, KDialog::marginHint(), KDialog::spacingHint() );
+ page2 = new QWidget( tabWidget );
+ page2Layout = new QVBoxLayout( page2, KDialog::marginHint(), KDialog::spacingHint() );
+ page3 = new QWidget( tabWidget );
+ page3Layout = new QVBoxLayout( page3, KDialog::marginHint(), KDialog::spacingHint() );
+
+ // Add Page1 (Style)
+ // -----------------
+ gbWidgetStyle = new QGroupBox( i18n("Widget Style"), page1, "gbWidgetStyle" );
+ gbWidgetStyle->setColumnLayout( 0, Qt::Vertical );
+ gbWidgetStyle->layout()->setMargin( KDialog::marginHint() );
+ gbWidgetStyle->layout()->setSpacing( KDialog::spacingHint() );
+
+ gbWidgetStyleLayout = new QVBoxLayout( gbWidgetStyle->layout() );
+ gbWidgetStyleLayout->setAlignment( Qt::AlignTop );
+ hbLayout = new QHBoxLayout( KDialog::spacingHint(), "hbLayout" );
+
+ cbStyle = new KComboBox( gbWidgetStyle, "cbStyle" );
+ cbStyle->setEditable( FALSE );
+ hbLayout->addWidget( cbStyle );
+
+ pbConfigStyle = new QPushButton( i18n("Con&figure..."), gbWidgetStyle );
+ pbConfigStyle->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Minimum );
+ pbConfigStyle->setEnabled( FALSE );
+ hbLayout->addWidget( pbConfigStyle );
+
+ gbWidgetStyleLayout->addLayout( hbLayout );
+
+ lblStyleDesc = new QLabel( gbWidgetStyle );
+ lblStyleDesc->setTextFormat(Qt::RichText);
+ gbWidgetStyleLayout->addWidget( lblStyleDesc );
+
+ cbIconsOnButtons = new QCheckBox( i18n("Sho&w icons on buttons"), gbWidgetStyle );
+ gbWidgetStyleLayout->addWidget( cbIconsOnButtons );
+ cbEnableTooltips = new QCheckBox( i18n("E&nable tooltips"), gbWidgetStyle );
+ gbWidgetStyleLayout->addWidget( cbEnableTooltips );
+ cbTearOffHandles = new QCheckBox( i18n("Show tear-off handles in &popup menus"), gbWidgetStyle );
+ gbWidgetStyleLayout->addWidget( cbTearOffHandles );
+ cbTearOffHandles->hide(); // reenable when the corresponding Qt method is virtual and properly reimplemented
+
+ QGroupBox *gbPreview = new QGroupBox( i18n( "Preview" ), page1 );
+ gbPreview->setColumnLayout( 0, Vertical );
+ gbPreview->layout()->setMargin( 0 );
+ gbPreview->layout()->setSpacing( KDialog::spacingHint() );
+ gbPreview->setFlat( true );
+ stylePreview = new StylePreview( gbPreview );
+ gbPreview->layout()->add( stylePreview );
+
+ page1Layout->addWidget( gbWidgetStyle );
+ page1Layout->addWidget( gbPreview );
+
+ // Connect all required stuff
+ connect( cbStyle, SIGNAL(activated(int)), this, SLOT(styleChanged()) );
+ connect( cbStyle, SIGNAL(activated(int)), this, SLOT(updateConfigButton()));
+ connect( pbConfigStyle, SIGNAL(clicked()), this, SLOT(styleSpecificConfig()));
+
+ // Add Page2 (Effects)
+ // -------------------
+ cbEnableEffects = new QCheckBox( i18n("&Enable GUI effects"), page2 );
+ containerFrame = new QFrame( page2 );
+ containerFrame->setFrameStyle( QFrame::NoFrame | QFrame::Plain );
+ containerFrame->setMargin(0);
+ containerLayout = new QGridLayout( containerFrame, 1, 1, // rows, columns
+ KDialog::marginHint(), KDialog::spacingHint() );
+
+ comboComboEffect = new QComboBox( FALSE, containerFrame );
+ comboComboEffect->insertItem( i18n("Disable") );
+ comboComboEffect->insertItem( i18n("Animate") );
+ lblComboEffect = new QLabel( i18n("Combobo&x effect:"), containerFrame );
+ lblComboEffect->setBuddy( comboComboEffect );
+ containerLayout->addWidget( lblComboEffect, 0, 0 );
+ containerLayout->addWidget( comboComboEffect, 0, 1 );
+
+ comboTooltipEffect = new QComboBox( FALSE, containerFrame );
+ comboTooltipEffect->insertItem( i18n("Disable") );
+ comboTooltipEffect->insertItem( i18n("Animate") );
+ comboTooltipEffect->insertItem( i18n("Fade") );
+ lblTooltipEffect = new QLabel( i18n("&Tool tip effect:"), containerFrame );
+ lblTooltipEffect->setBuddy( comboTooltipEffect );
+ containerLayout->addWidget( lblTooltipEffect, 1, 0 );
+ containerLayout->addWidget( comboTooltipEffect, 1, 1 );
+
+ comboMenuEffect = new QComboBox( FALSE, containerFrame );
+ comboMenuEffect->insertItem( i18n("Disable") );
+ comboMenuEffect->insertItem( i18n("Animate") );
+ comboMenuEffect->insertItem( i18n("Fade") );
+ comboMenuEffect->insertItem( i18n("Make Translucent") );
+ lblMenuEffect = new QLabel( i18n("&Menu effect:"), containerFrame );
+ lblMenuEffect->setBuddy( comboMenuEffect );
+ containerLayout->addWidget( lblMenuEffect, 2, 0 );
+ containerLayout->addWidget( comboMenuEffect, 2, 1 );
+
+ comboMenuHandle = new QComboBox( FALSE, containerFrame );
+ comboMenuHandle->insertItem( i18n("Disable") );
+ comboMenuHandle->insertItem( i18n("Application Level") );
+// comboMenuHandle->insertItem( i18n("Enable") );
+ lblMenuHandle = new QLabel( i18n("Me&nu tear-off handles:"), containerFrame );
+ lblMenuHandle->setBuddy( comboMenuHandle );
+ containerLayout->addWidget( lblMenuHandle, 3, 0 );
+ containerLayout->addWidget( comboMenuHandle, 3, 1 );
+
+ cbMenuShadow = new QCheckBox( i18n("Menu &drop shadow"), containerFrame );
+ containerLayout->addWidget( cbMenuShadow, 4, 0 );
+
+ // Push the [label combo] to the left.
+ comboSpacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
+ containerLayout->addItem( comboSpacer, 1, 2 );
+
+ // Separator.
+ QFrame* hline = new QFrame ( page2 );
+ hline->setFrameStyle( QFrame::HLine | QFrame::Sunken );
+
+ // Now implement the Menu Transparency container.
+ menuContainer = new QFrame( page2 );
+ menuContainer->setFrameStyle( QFrame::NoFrame | QFrame::Plain );
+ menuContainer->setMargin(0);
+ menuContainerLayout = new QGridLayout( menuContainer, 1, 1, // rows, columns
+ KDialog::marginHint(), KDialog::spacingHint() );
+
+ menuPreview = new MenuPreview( menuContainer, /* opacity */ 90, MenuPreview::Blend );
+
+ comboMenuEffectType = new QComboBox( FALSE, menuContainer );
+ comboMenuEffectType->insertItem( i18n("Software Tint") );
+ comboMenuEffectType->insertItem( i18n("Software Blend") );
+#ifdef HAVE_XRENDER
+ comboMenuEffectType->insertItem( i18n("XRender Blend") );
+#endif
+
+ // So much stuffing around for a simple slider..
+ sliderBox = new QVBox( menuContainer );
+ sliderBox->setSpacing( KDialog::spacingHint() );
+ sliderBox->setMargin( 0 );
+ slOpacity = new QSlider( 0, 100, 5, /*opacity*/ 90, Qt::Horizontal, sliderBox );
+ slOpacity->setTickmarks( QSlider::Below );
+ slOpacity->setTickInterval( 10 );
+ QHBox* box1 = new QHBox( sliderBox );
+ box1->setSpacing( KDialog::spacingHint() );
+ box1->setMargin( 0 );
+ QLabel* lbl = new QLabel( i18n("0%"), box1 );
+ lbl->setAlignment( AlignLeft );
+ lbl = new QLabel( i18n("50%"), box1 );
+ lbl->setAlignment( AlignHCenter );
+ lbl = new QLabel( i18n("100%"), box1 );
+ lbl->setAlignment( AlignRight );
+
+ lblMenuEffectType = new QLabel( comboMenuEffectType, i18n("Menu trans&lucency type:"), menuContainer );
+ lblMenuEffectType->setAlignment( AlignBottom | AlignLeft );
+ lblMenuOpacity = new QLabel( slOpacity, i18n("Menu &opacity:"), menuContainer );
+ lblMenuOpacity->setAlignment( AlignBottom | AlignLeft );
+
+ menuContainerLayout->addWidget( lblMenuEffectType, 0, 0 );
+ menuContainerLayout->addWidget( comboMenuEffectType, 1, 0 );
+ menuContainerLayout->addWidget( lblMenuOpacity, 2, 0 );
+ menuContainerLayout->addWidget( sliderBox, 3, 0 );
+ menuContainerLayout->addMultiCellWidget( menuPreview, 0, 3, 1, 1 );
+
+ // Layout page2.
+ page2Layout->addWidget( cbEnableEffects );
+ page2Layout->addWidget( containerFrame );
+ page2Layout->addWidget( hline );
+ page2Layout->addWidget( menuContainer );
+
+ QSpacerItem* sp1 = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding );
+ page2Layout->addItem( sp1 );
+
+ // Data flow stuff.
+ connect( cbEnableEffects, SIGNAL(toggled(bool)), containerFrame, SLOT(setEnabled(bool)) );
+ connect( cbEnableEffects, SIGNAL(toggled(bool)), this, SLOT(menuEffectChanged(bool)) );
+ connect( slOpacity, SIGNAL(valueChanged(int)),menuPreview, SLOT(setOpacity(int)) );
+ connect( comboMenuEffect, SIGNAL(activated(int)), this, SLOT(menuEffectChanged()) );
+ connect( comboMenuEffect, SIGNAL(highlighted(int)), this, SLOT(menuEffectChanged()) );
+ connect( comboMenuEffectType, SIGNAL(activated(int)), this, SLOT(menuEffectTypeChanged()) );
+ connect( comboMenuEffectType, SIGNAL(highlighted(int)), this, SLOT(menuEffectTypeChanged()) );
+
+ // Add Page3 (Miscellaneous)
+ // -------------------------
+ cbHoverButtons = new QCheckBox( i18n("High&light buttons under mouse"), page3 );
+ cbTransparentToolbars = new QCheckBox( i18n("Transparent tool&bars when moving"), page3 );
+
+ QWidget * dummy = new QWidget( page3 );
+
+ QHBoxLayout* box2 = new QHBoxLayout( dummy, 0, KDialog::spacingHint() );
+ lbl = new QLabel( i18n("Text pos&ition:"), dummy );
+ comboToolbarIcons = new QComboBox( FALSE, dummy );
+ comboToolbarIcons->insertItem( i18n("Icons Only") );
+ comboToolbarIcons->insertItem( i18n("Text Only") );
+ comboToolbarIcons->insertItem( i18n("Text Alongside Icons") );
+ comboToolbarIcons->insertItem( i18n("Text Under Icons") );
+ lbl->setBuddy( comboToolbarIcons );
+
+ box2->addWidget( lbl );
+ box2->addWidget( comboToolbarIcons );
+ QSpacerItem* sp2 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
+ box2->addItem( sp2 );
+
+ page3Layout->addWidget( cbHoverButtons );
+ page3Layout->addWidget( cbTransparentToolbars );
+ page3Layout->addWidget( dummy );
+
+ // Layout page3.
+ QSpacerItem* sp3 = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding );
+ page3Layout->addItem( sp3 );
+
+ // Load settings
+ load();
+
+ // Do all the setDirty connections.
+ connect(cbStyle, SIGNAL(activated(int)), this, SLOT(setStyleDirty()));
+ // Page2
+ connect( cbEnableEffects, SIGNAL(toggled(bool)), this, SLOT(setEffectsDirty()));
+ connect( cbEnableEffects, SIGNAL(toggled(bool)), this, SLOT(setStyleDirty()));
+ connect( comboTooltipEffect, SIGNAL(activated(int)), this, SLOT(setEffectsDirty()));
+ connect( comboComboEffect, SIGNAL(activated(int)), this, SLOT(setEffectsDirty()));
+ connect( comboMenuEffect, SIGNAL(activated(int)), this, SLOT(setStyleDirty()));
+ connect( comboMenuHandle, SIGNAL(activated(int)), this, SLOT(setStyleDirty()));
+ connect( comboMenuEffectType, SIGNAL(activated(int)), this, SLOT(setStyleDirty()));
+ connect( slOpacity, SIGNAL(valueChanged(int)),this, SLOT(setStyleDirty()));
+ connect( cbMenuShadow, SIGNAL(toggled(bool)), this, SLOT(setStyleDirty()));
+ // Page3
+ connect( cbHoverButtons, SIGNAL(toggled(bool)), this, SLOT(setToolbarsDirty()));
+ connect( cbTransparentToolbars, SIGNAL(toggled(bool)), this, SLOT(setToolbarsDirty()));
+ connect( cbEnableTooltips, SIGNAL(toggled(bool)), this, SLOT(setEffectsDirty()));
+ connect( cbIconsOnButtons, SIGNAL(toggled(bool)), this, SLOT(setEffectsDirty()));
+ connect( cbTearOffHandles, SIGNAL(toggled(bool)), this, SLOT(setEffectsDirty()));
+ connect( comboToolbarIcons, SIGNAL(activated(int)), this, SLOT(setToolbarsDirty()));
+
+ addWhatsThis();
+
+ // Insert the pages into the tabWidget
+ tabWidget->insertTab( page1, i18n("&Style"));
+ tabWidget->insertTab( page2, i18n("&Effects"));
+ tabWidget->insertTab( page3, i18n("&Toolbar"));
+
+ //Enable/disable the button for the initial style
+ updateConfigButton();
+}
+
+
+KCMStyle::~KCMStyle()
+{
+ delete appliedStyle;
+}
+
+void KCMStyle::updateConfigButton()
+{
+ if (!styleEntries[currentStyle()] || styleEntries[currentStyle()]->configPage.isEmpty()) {
+ pbConfigStyle->setEnabled(false);
+ return;
+ }
+
+ // We don't check whether it's loadable here -
+ // lets us report an error and not waste time
+ // loading things if the user doesn't click the button
+ pbConfigStyle->setEnabled( true );
+}
+
+void KCMStyle::styleSpecificConfig()
+{
+ QString libname = styleEntries[currentStyle()]->configPage;
+
+ // Use KLibLoader to get the library, handling
+ // any errors that arise
+ KLibLoader* loader = KLibLoader::self();
+
+ KLibrary* library = loader->library( QFile::encodeName(libname) );
+ if (!library)
+ {
+ KMessageBox::detailedError(this,
+ i18n("There was an error loading the configuration dialog for this style."),
+ loader->lastErrorMessage(),
+ i18n("Unable to Load Dialog"));
+ return;
+ }
+
+ void* allocPtr = library->symbol("allocate_kstyle_config");
+
+ if (!allocPtr)
+ {
+ KMessageBox::detailedError(this,
+ i18n("There was an error loading the configuration dialog for this style."),
+ loader->lastErrorMessage(),
+ i18n("Unable to Load Dialog"));
+ return;
+ }
+
+ //Create the container dialog
+ StyleConfigDialog* dial = new StyleConfigDialog(this, styleEntries[currentStyle()]->name);
+ dial->enableButtonSeparator(true);
+
+ typedef QWidget*(* factoryRoutine)( QWidget* parent );
+
+ //Get the factory, and make the widget.
+ factoryRoutine factory = (factoryRoutine)(allocPtr); //Grmbl. So here I am on my
+ //"never use C casts" moralizing streak, and I find that one can't go void* -> function ptr
+ //even with a reinterpret_cast.
+
+ QWidget* pluginConfig = factory( dial );
+
+ //Insert it in...
+ dial->setMainWidget( pluginConfig );
+
+ //..and connect it to the wrapper
+ connect(pluginConfig, SIGNAL(changed(bool)), dial, SLOT(setDirty(bool)));
+ connect(dial, SIGNAL(defaults()), pluginConfig, SLOT(defaults()));
+ connect(dial, SIGNAL(save()), pluginConfig, SLOT(save()));
+
+ if (dial->exec() == QDialog::Accepted && dial->isDirty() ) {
+ // Force re-rendering of the preview, to apply settings
+ switchStyle(currentStyle(), true);
+
+ //For now, ask all KDE apps to recreate their styles to apply the setitngs
+ KIPC::sendMessageAll(KIPC::StyleChanged);
+
+ // We call setStyleDirty here to make sure we force style re-creation
+ setStyleDirty();
+ }
+
+ delete dial;
+}
+
+void KCMStyle::load()
+{
+ load( false );
+}
+
+void KCMStyle::load(bool useDefaults)
+{
+ KConfig config( "kdeglobals", true, false );
+
+ config.setReadDefaults( useDefaults );
+
+ // Page1 - Build up the Style ListBox
+ loadStyle( config );
+
+ // Page2 - Effects
+ loadEffects( config );
+
+ // Page3 - Misc.
+ loadMisc( config );
+
+ m_bEffectsDirty = false;
+ m_bStyleDirty= false;
+ m_bToolbarsDirty = false;
+
+ emit changed( useDefaults );
+}
+
+
+void KCMStyle::save()
+{
+ // Don't do anything if we don't need to.
+ if ( !(m_bToolbarsDirty | m_bEffectsDirty | m_bStyleDirty ) )
+ return;
+
+ bool allowMenuTransparency = false;
+ bool allowMenuDropShadow = false;
+
+ // Read the KStyle flags to see if the style writer
+ // has enabled menu translucency in the style.
+ if (appliedStyle && appliedStyle->inherits("KStyle"))
+ {
+ allowMenuDropShadow = true;
+ KStyle* style = dynamic_cast<KStyle*>(appliedStyle);
+ if (style) {
+ KStyle::KStyleFlags flags = style->styleFlags();
+ if (flags & KStyle::AllowMenuTransparency)
+ allowMenuTransparency = true;
+ }
+ }
+
+ QString warn_string( i18n("<qt>Selected style: <b>%1</b><br><br>"
+ "One or more effects that you have chosen could not be applied because the selected "
+ "style does not support them; they have therefore been disabled.<br>"
+ "<br>" ).arg( cbStyle->currentText()) );
+ bool show_warning = false;
+
+ // Warn the user if they're applying a style that doesn't support
+ // menu translucency and they enabled it.
+ if ( (!allowMenuTransparency) &&
+ (cbEnableEffects->isChecked()) &&
+ (comboMenuEffect->currentItem() == 3) ) // Make Translucent
+ {
+ warn_string += i18n("Menu translucency is not available.<br>");
+ comboMenuEffect->setCurrentItem(0); // Disable menu effect.
+ show_warning = true;
+ }
+
+ if (!allowMenuDropShadow && cbMenuShadow->isChecked())
+ {
+ warn_string += i18n("Menu drop-shadows are not available.");
+ cbMenuShadow->setChecked(false);
+ show_warning = true;
+ }
+
+ // Tell the user what features we could not apply on their behalf.
+ if (show_warning)
+ KMessageBox::information(this, warn_string);
+
+
+ // Save effects.
+ KConfig config( "kdeglobals" );
+ config.setGroup("KDE");
+
+ config.writeEntry( "EffectsEnabled", cbEnableEffects->isChecked());
+ int item = comboComboEffect->currentItem();
+ config.writeEntry( "EffectAnimateCombo", item == 1 );
+ item = comboTooltipEffect->currentItem();
+ config.writeEntry( "EffectAnimateTooltip", item == 1);
+ config.writeEntry( "EffectFadeTooltip", item == 2 );
+ item = comboMenuHandle->currentItem();
+ config.writeEntry( "InsertTearOffHandle", item );
+ item = comboMenuEffect->currentItem();
+ config.writeEntry( "EffectAnimateMenu", item == 1 );
+ config.writeEntry( "EffectFadeMenu", item == 2 );
+
+ // Handle KStyle's menu effects
+ QString engine("Disabled");
+ if (item == 3 && cbEnableEffects->isChecked()) // Make Translucent
+ switch( comboMenuEffectType->currentItem())
+ {
+ case 1: engine = "SoftwareBlend"; break;
+ case 2: engine = "XRender"; break;
+ default:
+ case 0: engine = "SoftwareTint"; break;
+ }
+
+ { // Braces force a QSettings::sync()
+ QSettings settings; // Only for KStyle stuff
+ settings.writeEntry("/KStyle/Settings/MenuTransparencyEngine", engine);
+ settings.writeEntry("/KStyle/Settings/MenuOpacity", slOpacity->value()/100.0);
+ settings.writeEntry("/KStyle/Settings/MenuDropShadow",
+ cbEnableEffects->isChecked() && cbMenuShadow->isChecked() );
+ }
+
+ // Misc page
+ config.writeEntry( "ShowIconsOnPushButtons", cbIconsOnButtons->isChecked(), true, true );
+ config.writeEntry( "EffectNoTooltip", !cbEnableTooltips->isChecked(), true, true );
+
+ config.setGroup("General");
+ config.writeEntry( "widgetStyle", currentStyle() );
+
+ config.setGroup("Toolbar style");
+ config.writeEntry( "Highlighting", cbHoverButtons->isChecked(), true, true );
+ config.writeEntry( "TransparentMoving", cbTransparentToolbars->isChecked(), true, true );
+ QString tbIcon;
+ switch( comboToolbarIcons->currentItem() )
+ {
+ case 1: tbIcon = "TextOnly"; break;
+ case 2: tbIcon = "IconTextRight"; break;
+ case 3: tbIcon = "IconTextBottom"; break;
+ case 0:
+ default: tbIcon = "IconOnly"; break;
+ }
+ config.writeEntry( "IconText", tbIcon, true, true );
+ config.sync();
+
+ // Export the changes we made to qtrc, and update all qt-only
+ // applications on the fly, ensuring that we still follow the user's
+ // export fonts/colors settings.
+ if (m_bStyleDirty | m_bEffectsDirty) // Export only if necessary
+ {
+ uint flags = KRdbExportQtSettings;
+ KConfig kconfig("kcmdisplayrc", true /*readonly*/, false /*no globals*/);
+ kconfig.setGroup("X11");
+ bool exportKDEColors = kconfig.readBoolEntry("exportKDEColors", true);
+ if (exportKDEColors)
+ flags |= KRdbExportColors;
+ runRdb( flags );
+ }
+
+ // Now allow KDE apps to reconfigure themselves.
+ if ( m_bStyleDirty )
+ KIPC::sendMessageAll(KIPC::StyleChanged);
+
+ if ( m_bToolbarsDirty )
+ // ##### FIXME - Doesn't apply all settings correctly due to bugs in
+ // KApplication/KToolbar
+ KIPC::sendMessageAll(KIPC::ToolbarStyleChanged);
+
+ if (m_bEffectsDirty) {
+ KIPC::sendMessageAll(KIPC::SettingsChanged);
+ kapp->dcopClient()->send("kwin*", "", "reconfigure()", "");
+ }
+ //update kicker to re-used tooltips kicker parameter otherwise, it overwritted
+ //by style tooltips parameters.
+ QByteArray data;
+ kapp->dcopClient()->send( "kicker", "kicker", "configure()", data );
+
+ // Clean up
+ m_bEffectsDirty = false;
+ m_bToolbarsDirty = false;
+ m_bStyleDirty = false;
+ emit changed( false );
+}
+
+
+bool KCMStyle::findStyle( const QString& str, int& combobox_item )
+{
+ StyleEntry* se = styleEntries.find(str.lower());
+
+ QString name = se ? se->name : str;
+
+ combobox_item = 0;
+
+ //look up name
+ for( int i = 0; i < cbStyle->count(); i++ )
+ {
+ if ( cbStyle->text(i) == name )
+ {
+ combobox_item = i;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+
+void KCMStyle::defaults()
+{
+ load( true );
+}
+
+void KCMStyle::setEffectsDirty()
+{
+ m_bEffectsDirty = true;
+ emit changed(true);
+}
+
+void KCMStyle::setToolbarsDirty()
+{
+ m_bToolbarsDirty = true;
+ emit changed(true);
+}
+
+void KCMStyle::setStyleDirty()
+{
+ m_bStyleDirty = true;
+ emit changed(true);
+}
+
+// ----------------------------------------------------------------
+// All the Style Switching / Preview stuff
+// ----------------------------------------------------------------
+
+void KCMStyle::loadStyle( KConfig& config )
+{
+ cbStyle->clear();
+
+ // Create a dictionary of WidgetStyle to Name and Desc. mappings,
+ // as well as the config page info
+ styleEntries.clear();
+ styleEntries.setAutoDelete(true);
+
+ QString strWidgetStyle;
+ QStringList list = KGlobal::dirs()->findAllResources("themes", "*.themerc", true, true);
+ for (QStringList::iterator it = list.begin(); it != list.end(); ++it)
+ {
+ KSimpleConfig config( *it, true );
+ if ( !(config.hasGroup("KDE") && config.hasGroup("Misc")) )
+ continue;
+
+ config.setGroup("KDE");
+
+ strWidgetStyle = config.readEntry("WidgetStyle");
+ if (strWidgetStyle.isNull())
+ continue;
+
+ // We have a widgetstyle, so lets read the i18n entries for it...
+ StyleEntry* entry = new StyleEntry;
+ config.setGroup("Misc");
+ entry->name = config.readEntry("Name");
+ entry->desc = config.readEntry("Comment", i18n("No description available."));
+ entry->configPage = config.readEntry("ConfigPage", QString::null);
+
+ // Check if this style should be shown
+ config.setGroup("Desktop Entry");
+ entry->hidden = config.readBoolEntry("Hidden", false);
+
+ // Insert the entry into our dictionary.
+ styleEntries.insert(strWidgetStyle.lower(), entry);
+ }
+
+ // Obtain all style names
+ QStringList allStyles = QStyleFactory::keys();
+
+ // Get translated names, remove all hidden style entries.
+ QStringList styles;
+ StyleEntry* entry;
+ for (QStringList::iterator it = allStyles.begin(); it != allStyles.end(); it++)
+ {
+ QString id = (*it).lower();
+ // Find the entry.
+ if ( (entry = styleEntries.find(id)) != 0 )
+ {
+ // Do not add hidden entries
+ if (entry->hidden)
+ continue;
+
+ styles += entry->name;
+
+ nameToStyleKey[entry->name] = id;
+ }
+ else
+ {
+ styles += (*it); //Fall back to the key (but in original case)
+ nameToStyleKey[*it] = id;
+ }
+ }
+
+ // Sort the style list, and add it to the combobox
+ styles.sort();
+ cbStyle->insertStringList( styles );
+
+ // Find out which style is currently being used
+ config.setGroup( "General" );
+ QString defaultStyle = KStyle::defaultStyle();
+ QString cfgStyle = config.readEntry( "widgetStyle", defaultStyle );
+
+ // Select the current style
+ // Do not use cbStyle->listBox() as this may be NULL for some styles when
+ // they use QPopupMenus for the drop-down list!
+
+ // ##### Since Trolltech likes to seemingly copy & paste code,
+ // QStringList::findItem() doesn't have a Qt::StringComparisonMode field.
+ // We roll our own (yuck)
+ cfgStyle = cfgStyle.lower();
+ int item = 0;
+ for( int i = 0; i < cbStyle->count(); i++ )
+ {
+ QString id = nameToStyleKey[cbStyle->text(i)];
+ item = i;
+ if ( id == cfgStyle ) // ExactMatch
+ break;
+ else if ( id.contains( cfgStyle ) )
+ break;
+ else if ( id.contains( QApplication::style().className() ) )
+ break;
+ item = 0;
+ }
+ cbStyle->setCurrentItem( item );
+
+ m_bStyleDirty = false;
+
+ switchStyle( currentStyle() ); // make resets visible
+}
+
+QString KCMStyle::currentStyle()
+{
+ return nameToStyleKey[cbStyle->currentText()];
+}
+
+
+void KCMStyle::styleChanged()
+{
+ switchStyle( currentStyle() );
+}
+
+
+void KCMStyle::switchStyle(const QString& styleName, bool force)
+{
+ // Don't flicker the preview if the same style is chosen in the cb
+ if (!force && appliedStyle && appliedStyle->name() == styleName)
+ return;
+
+ // Create an instance of the new style...
+ QStyle* style = QStyleFactory::create(styleName);
+ if (!style)
+ return;
+
+ // Prevent Qt from wrongly caching radio button images
+ QPixmapCache::clear();
+
+ setStyleRecursive( stylePreview, style );
+
+ // this flickers, but reliably draws the widgets correctly.
+ stylePreview->resize( stylePreview->sizeHint() );
+
+ delete appliedStyle;
+ appliedStyle = style;
+
+ // Set the correct style description
+ StyleEntry* entry = styleEntries.find( styleName );
+ QString desc;
+ desc = i18n("Description: %1").arg( entry ? entry->desc : i18n("No description available.") );
+ lblStyleDesc->setText( desc );
+}
+
+void KCMStyle::setStyleRecursive(QWidget* w, QStyle* s)
+{
+ // Don't let broken styles kill the palette
+ // for other styles being previewed. (e.g SGI style)
+ w->unsetPalette();
+
+ QPalette newPalette(KApplication::createApplicationPalette());
+ s->polish( newPalette );
+ w->setPalette(newPalette);
+
+ // Apply the new style.
+ w->setStyle(s);
+
+ // Recursively update all children.
+ const QObjectList *children = w->children();
+ if (!children)
+ return;
+
+ // Apply the style to each child widget.
+ QPtrListIterator<QObject> childit(*children);
+ QObject *child;
+ while ((child = childit.current()) != 0)
+ {
+ ++childit;
+ if (child->isWidgetType())
+ setStyleRecursive((QWidget *) child, s);
+ }
+}
+
+
+// ----------------------------------------------------------------
+// All the Effects stuff
+// ----------------------------------------------------------------
+
+void KCMStyle::loadEffects( KConfig& config )
+{
+ // Load effects.
+ config.setGroup("KDE");
+
+ cbEnableEffects->setChecked( config.readBoolEntry( "EffectsEnabled", false) );
+
+ if ( config.readBoolEntry( "EffectAnimateCombo", false) )
+ comboComboEffect->setCurrentItem( 1 );
+ else
+ comboComboEffect->setCurrentItem( 0 );
+
+ if ( config.readBoolEntry( "EffectAnimateTooltip", false) )
+ comboTooltipEffect->setCurrentItem( 1 );
+ else if ( config.readBoolEntry( "EffectFadeTooltip", false) )
+ comboTooltipEffect->setCurrentItem( 2 );
+ else
+ comboTooltipEffect->setCurrentItem( 0 );
+
+ if ( config.readBoolEntry( "EffectAnimateMenu", false) )
+ comboMenuEffect->setCurrentItem( 1 );
+ else if ( config.readBoolEntry( "EffectFadeMenu", false) )
+ comboMenuEffect->setCurrentItem( 2 );
+ else
+ comboMenuEffect->setCurrentItem( 0 );
+
+ comboMenuHandle->setCurrentItem(config.readNumEntry("InsertTearOffHandle", 0));
+
+ // KStyle Menu transparency and drop-shadow options...
+ QSettings settings;
+ QString effectEngine = settings.readEntry("/KStyle/Settings/MenuTransparencyEngine", "Disabled");
+
+#ifdef HAVE_XRENDER
+ if (effectEngine == "XRender") {
+ comboMenuEffectType->setCurrentItem(2);
+ comboMenuEffect->setCurrentItem(3);
+ } else if (effectEngine == "SoftwareBlend") {
+ comboMenuEffectType->setCurrentItem(1);
+ comboMenuEffect->setCurrentItem(3);
+#else
+ if (effectEngine == "XRender" || effectEngine == "SoftwareBlend") {
+ comboMenuEffectType->setCurrentItem(1); // Software Blend
+ comboMenuEffect->setCurrentItem(3);
+#endif
+ } else if (effectEngine == "SoftwareTint") {
+ comboMenuEffectType->setCurrentItem(0);
+ comboMenuEffect->setCurrentItem(3);
+ } else
+ comboMenuEffectType->setCurrentItem(0);
+
+ if (comboMenuEffect->currentItem() != 3) // If not translucency...
+ menuPreview->setPreviewMode( MenuPreview::Tint );
+ else if (comboMenuEffectType->currentItem() == 0)
+ menuPreview->setPreviewMode( MenuPreview::Tint );
+ else
+ menuPreview->setPreviewMode( MenuPreview::Blend );
+
+ slOpacity->setValue( (int)(100 * settings.readDoubleEntry("/KStyle/Settings/MenuOpacity", 0.90)) );
+
+ // Menu Drop-shadows...
+ cbMenuShadow->setChecked( settings.readBoolEntry("/KStyle/Settings/MenuDropShadow", false) );
+
+ if (cbEnableEffects->isChecked()) {
+ containerFrame->setEnabled( true );
+ menuContainer->setEnabled( comboMenuEffect->currentItem() == 3 );
+ } else {
+ menuContainer->setEnabled( false );
+ containerFrame->setEnabled( false );
+ }
+
+ m_bEffectsDirty = false;
+}
+
+
+void KCMStyle::menuEffectTypeChanged()
+{
+ MenuPreview::PreviewMode mode;
+
+ if (comboMenuEffect->currentItem() != 3)
+ mode = MenuPreview::Tint;
+ else if (comboMenuEffectType->currentItem() == 0)
+ mode = MenuPreview::Tint;
+ else
+ mode = MenuPreview::Blend;
+
+ menuPreview->setPreviewMode(mode);
+
+ m_bEffectsDirty = true;
+}
+
+
+void KCMStyle::menuEffectChanged()
+{
+ menuEffectChanged( cbEnableEffects->isChecked() );
+ m_bEffectsDirty = true;
+}
+
+
+void KCMStyle::menuEffectChanged( bool enabled )
+{
+ if (enabled &&
+ comboMenuEffect->currentItem() == 3) {
+ menuContainer->setEnabled(true);
+ } else
+ menuContainer->setEnabled(false);
+ m_bEffectsDirty = true;
+}
+
+
+// ----------------------------------------------------------------
+// All the Miscellaneous stuff
+// ----------------------------------------------------------------
+
+void KCMStyle::loadMisc( KConfig& config )
+{
+ // KDE's Part via KConfig
+ config.setGroup("Toolbar style");
+ cbHoverButtons->setChecked(config.readBoolEntry("Highlighting", true));
+ cbTransparentToolbars->setChecked(config.readBoolEntry("TransparentMoving", true));
+
+ QString tbIcon = config.readEntry("IconText", "IconOnly");
+ if (tbIcon == "TextOnly")
+ comboToolbarIcons->setCurrentItem(1);
+ else if (tbIcon == "IconTextRight")
+ comboToolbarIcons->setCurrentItem(2);
+ else if (tbIcon == "IconTextBottom")
+ comboToolbarIcons->setCurrentItem(3);
+ else
+ comboToolbarIcons->setCurrentItem(0);
+
+ config.setGroup("KDE");
+ cbIconsOnButtons->setChecked(config.readBoolEntry("ShowIconsOnPushButtons", false));
+ cbEnableTooltips->setChecked(!config.readBoolEntry("EffectNoTooltip", false));
+ cbTearOffHandles->setChecked(config.readBoolEntry("InsertTearOffHandle", false));
+
+ m_bToolbarsDirty = false;
+}
+
+void KCMStyle::addWhatsThis()
+{
+ // Page1
+ QWhatsThis::add( cbStyle, i18n("Here you can choose from a list of"
+ " predefined widget styles (e.g. the way buttons are drawn) which"
+ " may or may not be combined with a theme (additional information"
+ " like a marble texture or a gradient).") );
+ QWhatsThis::add( stylePreview, i18n("This area shows a preview of the currently selected style "
+ "without having to apply it to the whole desktop.") );
+
+ // Page2
+ QWhatsThis::add( page2, i18n("This page allows you to enable various widget style effects. "
+ "For best performance, it is advisable to disable all effects.") );
+ QWhatsThis::add( cbEnableEffects, i18n( "If you check this box, you can select several effects "
+ "for different widgets like combo boxes, menus or tooltips.") );
+ QWhatsThis::add( comboComboEffect, i18n( "<p><b>Disable: </b>do not use any combo box effects.</p>\n"
+ "<b>Animate: </b>Do some animation.") );
+ QWhatsThis::add( comboTooltipEffect, i18n( "<p><b>Disable: </b>do not use any tooltip effects.</p>\n"
+ "<p><b>Animate: </b>Do some animation.</p>\n"
+ "<b>Fade: </b>Fade in tooltips using alpha-blending.") );
+ QWhatsThis::add( comboMenuEffect, i18n( "<p><b>Disable: </b>do not use any menu effects.</p>\n"
+ "<p><b>Animate: </b>Do some animation.</p>\n"
+ "<p><b>Fade: </b>Fade in menus using alpha-blending.</p>\n"
+ "<b>Make Translucent: </b>Alpha-blend menus for a see-through effect. (KDE styles only)") );
+ QWhatsThis::add( cbMenuShadow, i18n( "When enabled, all popup menus will have a drop-shadow, otherwise "
+ "drop-shadows will not be displayed. At present, only KDE styles can have this "
+ "effect enabled.") );
+ QWhatsThis::add( comboMenuEffectType, i18n( "<p><b>Software Tint: </b>Alpha-blend using a flat color.</p>\n"
+ "<p><b>Software Blend: </b>Alpha-blend using an image.</p>\n"
+ "<b>XRender Blend: </b>Use the XFree RENDER extension for image blending (if available). "
+ "This method may be slower than the Software routines on non-accelerated displays, "
+ "but may however improve performance on remote displays.</p>\n") );
+ QWhatsThis::add( slOpacity, i18n("By adjusting this slider you can control the menu effect opacity.") );
+
+ // Page3
+ QWhatsThis::add( page3, i18n("<b>Note:</b> that all widgets in this combobox "
+ "do not apply to Qt-only applications.") );
+ QWhatsThis::add( cbHoverButtons, i18n("If this option is selected, toolbar buttons will change "
+ "their color when the mouse cursor is moved over them." ) );
+ QWhatsThis::add( cbTransparentToolbars, i18n("If you check this box, the toolbars will be "
+ "transparent when moving them around.") );
+ QWhatsThis::add( cbEnableTooltips, i18n( "If you check this option, the KDE application "
+ "will offer tooltips when the cursor remains over items in the toolbar." ) );
+ QWhatsThis::add( comboToolbarIcons, i18n( "<p><b>Icons only:</b> Shows only icons on toolbar buttons. "
+ "Best option for low resolutions.</p>"
+ "<p><b>Text only: </b>Shows only text on toolbar buttons.</p>"
+ "<p><b>Text alongside icons: </b> Shows icons and text on toolbar buttons. "
+ "Text is aligned alongside the icon.</p>"
+ "<b>Text under icons: </b> Shows icons and text on toolbar buttons. "
+ "Text is aligned below the icon.") );
+ QWhatsThis::add( cbIconsOnButtons, i18n( "If you enable this option, KDE Applications will "
+ "show small icons alongside some important buttons.") );
+ QWhatsThis::add( cbTearOffHandles, i18n( "If you enable this option some pop-up menus will "
+ "show so called tear-off handles. If you click them, you get the menu "
+ "inside a widget. This can be very helpful when performing "
+ "the same action multiple times.") );
+}
+
+#include "kcmstyle.moc"
+
+// vim: set noet ts=4:
diff --git a/kcontrol/style/kcmstyle.h b/kcontrol/style/kcmstyle.h
new file mode 100644
index 000000000..fb2909b1a
--- /dev/null
+++ b/kcontrol/style/kcmstyle.h
@@ -0,0 +1,163 @@
+/*
+ * KCMStyle
+ * Copyright (C) 2002 Karol Szwed <gallium@kde.org>
+ * Copyright (C) 2002 Daniel Molkentin <molkentin@kde.org>
+ *
+ * Portions Copyright (C) TrollTech AS.
+ *
+ * Based on kcmdisplay
+ * Copyright (C) 1997-2002 kcmdisplay Authors.
+ * (see Help -> About Style Settings)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __KCMSTYLE_H
+#define __KCMSTYLE_H
+
+#include <qstring.h>
+#include <qtimer.h>
+
+#include <kcmodule.h>
+
+#include "stylepreview.h"
+#include "menupreview.h"
+
+class KComboBox;
+class QCheckBox;
+class QComboBox;
+class QFrame;
+class QGroupBox;
+class QLabel;
+class QListBox;
+class QListViewItem;
+class QSettings;
+class QSlider;
+class QSpacerItem;
+class QStyle;
+class QTabWidget;
+class QVBoxLayout;
+class StyleConfigDialog;
+class WidgetPreview;
+
+struct StyleEntry {
+ QString name;
+ QString desc;
+ QString configPage;
+ bool hidden;
+};
+
+class KCMStyle : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KCMStyle( QWidget* parent = 0, const char* name = 0 );
+ ~KCMStyle();
+
+ virtual void load();
+ virtual void load(bool useDefaults);
+ virtual void save();
+ virtual void defaults();
+
+protected:
+ bool findStyle( const QString& str, int& combobox_item );
+ void switchStyle(const QString& styleName, bool force = false);
+ void setStyleRecursive(QWidget* w, QStyle* s);
+
+ void loadStyle( KConfig& config );
+ void loadEffects( KConfig& config );
+ void loadMisc( KConfig& config );
+ void addWhatsThis();
+
+protected slots:
+ void styleSpecificConfig();
+ void updateConfigButton();
+
+ void setEffectsDirty();
+ void setToolbarsDirty();
+ void setStyleDirty();
+
+ void styleChanged();
+ void menuEffectChanged( bool enabled );
+ void menuEffectChanged();
+ void menuEffectTypeChanged();
+
+private:
+ QString currentStyle();
+
+ bool m_bEffectsDirty, m_bStyleDirty, m_bToolbarsDirty;
+ QDict<StyleEntry> styleEntries;
+ QMap <QString,QString> nameToStyleKey;
+
+ QVBoxLayout* mainLayout;
+ QTabWidget* tabWidget;
+ QWidget *page1, *page2, *page3;
+ QVBoxLayout* page1Layout;
+ QVBoxLayout* page2Layout;
+ QVBoxLayout* page3Layout;
+
+ // Page1 widgets
+ QGroupBox* gbWidgetStyle;
+ QVBoxLayout* gbWidgetStyleLayout;
+ QHBoxLayout* hbLayout;
+ KComboBox* cbStyle;
+ QPushButton* pbConfigStyle;
+ QLabel* lblStyleDesc;
+ StylePreview* stylePreview;
+ QStyle* appliedStyle;
+ QPalette palette;
+
+ // Page2 widgets
+ QCheckBox* cbEnableEffects;
+
+ QFrame* containerFrame;
+ QGridLayout* containerLayout;
+ QComboBox* comboTooltipEffect;
+ QComboBox* comboComboEffect;
+ QComboBox* comboMenuEffect;
+ QComboBox* comboMenuHandle;
+
+ QLabel* lblTooltipEffect;
+ QLabel* lblComboEffect;
+ QLabel* lblMenuEffect;
+ QLabel* lblMenuHandle;
+ QSpacerItem* comboSpacer;
+
+ QFrame* menuContainer;
+ QGridLayout* menuContainerLayout;
+ MenuPreview* menuPreview;
+ QVBox* sliderBox;
+ QSlider* slOpacity;
+ QComboBox* comboMenuEffectType;
+ QLabel* lblMenuEffectType;
+ QLabel* lblMenuOpacity;
+ QCheckBox* cbMenuShadow;
+
+ // Page3 widgets
+ QGroupBox* gbVisualAppearance;
+
+ QCheckBox* cbHoverButtons;
+ QCheckBox* cbTransparentToolbars;
+ QCheckBox* cbEnableTooltips;
+ QComboBox* comboToolbarIcons;
+
+ QCheckBox* cbIconsOnButtons;
+ QCheckBox* cbTearOffHandles;
+};
+
+#endif // __KCMSTYLE_H
+
+// vim: set noet ts=4:
diff --git a/kcontrol/style/keramik/Makefile.am b/kcontrol/style/keramik/Makefile.am
new file mode 100644
index 000000000..028585373
--- /dev/null
+++ b/kcontrol/style/keramik/Makefile.am
@@ -0,0 +1,12 @@
+INCLUDES = $(all_includes)
+
+noinst_HEADERS = keramikconf.h
+kde_module_LTLIBRARIES = kstyle_keramik_config.la
+kstyle_keramik_config_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module
+kstyle_keramik_config_la_LIBADD = $(LIB_KDEUI)
+kstyle_keramik_config_la_SOURCES = keramikconf.cpp
+METASOURCES = AUTO
+
+
+messages:
+ $(XGETTEXT) *.cpp *.h -o $(podir)/kstyle_keramik_config.pot
diff --git a/kcontrol/style/keramik/keramikconf.cpp b/kcontrol/style/keramik/keramikconf.cpp
new file mode 100644
index 000000000..28e0ce424
--- /dev/null
+++ b/kcontrol/style/keramik/keramikconf.cpp
@@ -0,0 +1,103 @@
+/*
+Copyright (c) 2003 Maksim Orlovich <maksim.orlovich@kdemail.net>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qsettings.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <klocale.h>
+
+#include "keramikconf.h"
+
+extern "C"
+{
+ KDE_EXPORT QWidget* allocate_kstyle_config(QWidget* parent)
+ {
+ return new KeramikStyleConfig(parent);
+ }
+}
+
+KeramikStyleConfig::KeramikStyleConfig(QWidget* parent): QWidget(parent)
+{
+ //Should have no margins here, the dialog provides them
+ QVBoxLayout* layout = new QVBoxLayout(this, 0, 0);
+ KGlobal::locale()->insertCatalogue("kstyle_keramik_config");
+
+ //highlightLineEdits = new QCheckBox(i18n("Highlight active lineedits"), this);
+ highlightScrollBar = new QCheckBox(i18n("Highlight scroll bar handles"), this);
+ animateProgressBar = new QCheckBox(i18n("Animate progress bars"), this);
+
+ //layout->add(highlightLineEdits);
+ layout->add(highlightScrollBar);
+ layout->add(animateProgressBar);
+ layout->addStretch(1);
+
+ QSettings s;
+ //origHlLineEdit = s.readBoolEntry("/keramik/Settings/highlightLineEdits", false);
+ //highlightLineEdits->setChecked(origHlLineEdit);
+
+ origHlScrollbar = s.readBoolEntry("/keramik/Settings/highlightScrollBar", true);
+ highlightScrollBar->setChecked(origHlScrollbar);
+
+ origAnimProgressBar = s.readBoolEntry("/keramik/Settings/animateProgressBar", false);
+ animateProgressBar->setChecked(origAnimProgressBar);
+
+ //connect(highlightLineEdits, SIGNAL( toggled(bool) ), SLOT( updateChanged() ) );
+ connect(highlightScrollBar, SIGNAL( toggled(bool) ), SLOT( updateChanged() ) );
+ connect(animateProgressBar, SIGNAL( toggled(bool) ), SLOT( updateChanged() ) );
+}
+
+KeramikStyleConfig::~KeramikStyleConfig()
+{
+ KGlobal::locale()->removeCatalogue("kstyle_keramik_config");
+}
+
+
+void KeramikStyleConfig::save()
+{
+ QSettings s;
+ //s.writeEntry("/keramik/Settings/highlightLineEdits", highlightLineEdits->isChecked());
+ s.writeEntry("/keramik/Settings/highlightScrollBar", highlightScrollBar->isChecked());
+ s.writeEntry("/keramik/Settings/animateProgressBar", animateProgressBar->isChecked());
+}
+
+void KeramikStyleConfig::defaults()
+{
+ //highlightLineEdits->setChecked(false);
+ highlightScrollBar->setChecked(true);
+ animateProgressBar->setChecked(false);
+ //updateChanged would be done by setChecked already
+}
+
+void KeramikStyleConfig::updateChanged()
+{
+ if ( /*(highlightLineEdits->isChecked() == origHlLineEdit) &&*/
+ (highlightScrollBar->isChecked() == origHlScrollbar) &&
+ (animateProgressBar->isChecked() == origAnimProgressBar) )
+ emit changed(false);
+ else
+ emit changed(true);
+}
+
+#include "keramikconf.moc"
diff --git a/kcontrol/style/keramik/keramikconf.h b/kcontrol/style/keramik/keramikconf.h
new file mode 100644
index 000000000..f482fdb14
--- /dev/null
+++ b/kcontrol/style/keramik/keramikconf.h
@@ -0,0 +1,62 @@
+/*
+Copyright (c) 2003 Maksim Orlovich <maksim.orlovich@kdemail.net>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef KERAMIK_CONF_H
+#define KERAMIK_CONF_H
+
+class QCheckBox;
+
+class KeramikStyleConfig: public QWidget
+{
+ Q_OBJECT
+public:
+ KeramikStyleConfig(QWidget* parent);
+ ~KeramikStyleConfig();
+
+ //This signal and the next two slots are the plugin
+ //page interface
+signals:
+ void changed(bool);
+
+public slots:
+ void save();
+ void defaults();
+
+ //Everything below this is internal.
+protected slots:
+ void updateChanged();
+
+protected:
+ //We store settings directly in widgets to
+ //avoid the hassle of sync'ing things
+ //QCheckBox* highlightLineEdits;
+ QCheckBox* animateProgressBar;
+ QCheckBox* highlightScrollBar;
+
+ //Original settings, for accurate dirtiness tracking
+ //bool origHlLineEdit;
+ bool origAnimProgressBar;
+ bool origHlScrollbar;
+};
+
+#endif
diff --git a/kcontrol/style/main.cpp b/kcontrol/style/main.cpp
new file mode 100644
index 000000000..543685502
--- /dev/null
+++ b/kcontrol/style/main.cpp
@@ -0,0 +1,16 @@
+#include <kglobal.h>
+#include <klocale.h>
+#include <kgenericfactory.h>
+
+#include "kcmstyle.h"
+
+extern "C" {
+ KCModule *create_style(QWidget *parent, const char *) {
+ return new KCMStyle(parent, "kcmstyle");
+ }
+}
+
+/*
+typedef KGenericFactory<KWidgetSettingsModule, QWidget> GeneralFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_style, GeneralFactory )
+*/
diff --git a/kcontrol/style/menupreview.cpp b/kcontrol/style/menupreview.cpp
new file mode 100644
index 000000000..a8a74c981
--- /dev/null
+++ b/kcontrol/style/menupreview.cpp
@@ -0,0 +1,166 @@
+/*
+ * Menu Transparency Preview Widget
+ * Copyright (C) 2002 Karol Szwed <gallium@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "menupreview.h"
+
+#include <qpainter.h>
+#include <qimage.h>
+
+#include <kpixmap.h>
+#include <kpixmapeffect.h>
+#include <klocale.h>
+#include <kimageeffect.h>
+#include <kiconloader.h>
+
+
+MenuPreview::MenuPreview( QWidget* parent, int opacity, PreviewMode pvm )
+ : QWidget( parent, 0, WStyle_Customize | WRepaintNoErase ),
+ pixBackground(NULL), pixOverlay(NULL), pixBlended(NULL)
+{
+ setFixedSize(150, 150);
+ setFocusPolicy( NoFocus );
+
+ mode = pvm;
+ if (opacity < 0) opacity = 0;
+ if (opacity > 100) opacity = 100;
+ menuOpacity = opacity/100.0;
+
+ pixBackground = new KPixmap();
+ pixOverlay = new KPixmap();
+ pixBlended = new KPixmap();
+
+ createPixmaps();
+ blendPixmaps();
+}
+
+MenuPreview::~MenuPreview()
+{
+ delete pixBackground;
+ delete pixOverlay;
+ delete pixBlended;
+}
+
+void MenuPreview::createPixmaps()
+{
+ int w = width()-2;
+ int h = height()-2;
+
+ if (pixBackground)
+ pixBackground->resize( w, h );
+ if (pixOverlay)
+ pixOverlay->resize( w, h );
+ if (pixBlended)
+ pixBlended->resize( w, h );
+
+ QColorGroup cg = colorGroup();
+ QColor c1 = cg.background();
+ QColor c2 = cg.mid();
+
+ if (pixBackground) {
+ // Paint checkerboard
+ QPainter p;
+ p.begin(pixBackground);
+ for(int x=0; x < pixBackground->width(); x+=5)
+ for(int y=0; y < pixBackground->height(); y+=5)
+ p.fillRect( x, y, 5, 5,
+ (x % 2) ?
+ ((y % 2) ? c2 : c1 ) : // See the grid? ;-)
+ ((y % 2) ? c1 : c2 ) );
+ KIconLoader* icl = KGlobal::iconLoader();
+ QPixmap pix = icl->loadIcon("go", KIcon::Desktop, KIcon::SizeLarge, KIcon::ActiveState);
+ p.drawPixmap( (width()-2-pix.width())/2, (height()-2-pix.height())/2, pix );
+ }
+
+ if (pixOverlay) {
+ c1 = cg.button().light(110);
+ c2 = cg.button().dark(110);
+ KPixmapEffect::gradient( *pixOverlay, c1, c2, KPixmapEffect::VerticalGradient );
+ }
+}
+
+void MenuPreview::blendPixmaps()
+{
+ // Rebuild pixmaps, and repaint
+ if (pixBlended && pixBackground)
+ {
+ if (mode == Blend && pixOverlay) {
+ QImage src = pixOverlay->convertToImage();
+ QImage dst = pixBackground->convertToImage();
+ KImageEffect::blend(src, dst, menuOpacity);
+ pixBlended->convertFromImage( dst );
+ } else if (mode == Tint) {
+ QColor clr = colorGroup().button();
+ QImage dst = pixBackground->convertToImage();
+ KImageEffect::blend(clr, dst, menuOpacity);
+ pixBlended->convertFromImage( dst );
+ }
+ }
+}
+
+void MenuPreview::setOpacity( int opacity )
+{
+ if (opacity < 0 || opacity > 100)
+ return;
+
+ if ((int)(menuOpacity*100) != opacity) {
+ menuOpacity = opacity/100.0;
+ blendPixmaps();
+ repaint( false );
+ }
+}
+
+void MenuPreview::setPreviewMode( PreviewMode pvm )
+{
+ if (mode != pvm) {
+ mode = pvm;
+ blendPixmaps();
+ repaint( false );
+ }
+}
+
+void MenuPreview::paintEvent( QPaintEvent* /* pe */ )
+{
+ // Paint the frame and blended pixmap
+ QColorGroup cg = colorGroup();
+ int x2 = width()-1;
+ int y2 = height()-1;
+
+ QPainter p(this);
+ p.setPen(cg.dark());
+ p.drawLine(0, 0, x2, 0);
+ p.drawLine(0, 0, 0, y2);
+ p.setPen(cg.light());
+ p.drawLine(1, y2, x2, y2);
+ p.drawLine(x2, 1, x2, y2);
+
+ if (mode == NoEffect)
+ p.fillRect(1, 1, --x2, --y2, cg.button());
+ else if (mode != NoEffect && pixBlended)
+ p.drawPixmap(1, 1, *pixBlended, 0, 0, --x2, --y2);
+
+ QRect r = rect();
+ r.moveBy(6,3);
+ p.setPen( cg.text() );
+ p.drawText( r, AlignTop | AlignLeft, QString::number((int)(menuOpacity*100))+i18n("%") );
+}
+
+#include "menupreview.moc"
+
+// vim: set noet ts=4:
+
diff --git a/kcontrol/style/menupreview.h b/kcontrol/style/menupreview.h
new file mode 100644
index 000000000..2b7cb8bc8
--- /dev/null
+++ b/kcontrol/style/menupreview.h
@@ -0,0 +1,61 @@
+/*
+ * Menu Transparency Preview Widget
+ * Copyright (C) 2002 Karol Szwed <gallium@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __MENUPREVIEW_H
+#define __MENUPREVIEW_H
+
+#include <qwidget.h>
+
+class KPixmap;
+
+class MenuPreview : public QWidget
+{
+ Q_OBJECT
+
+public:
+ enum PreviewMode {
+ NoEffect = 0,
+ Tint,
+ Blend
+ };
+
+ MenuPreview( QWidget* parent, int opacity, PreviewMode pvm );
+ ~MenuPreview();
+
+public slots:
+ void setOpacity( int opacity );
+ void setPreviewMode( PreviewMode pvm );
+
+protected:
+ void paintEvent( QPaintEvent* pe );
+
+private:
+ void createPixmaps();
+ void blendPixmaps();
+
+ KPixmap* pixBackground;
+ KPixmap* pixOverlay;
+ KPixmap* pixBlended;
+ float menuOpacity;
+ PreviewMode mode;
+};
+
+// vim: set noet ts=4:
+#endif // __MENUPREVIEW_H
+
diff --git a/kcontrol/style/style.desktop b/kcontrol/style/style.desktop
new file mode 100644
index 000000000..648853ea1
--- /dev/null
+++ b/kcontrol/style/style.desktop
@@ -0,0 +1,234 @@
+[Desktop Entry]
+Exec=kcmshell style
+Icon=style
+Type=Application
+DocPath=kcontrol/kcmstyle/index.html
+
+
+X-KDE-Library=style
+X-KDE-FactoryName=style
+X-KDE-Init=style
+X-KDE-ParentApp=kcontrol
+
+Name=Style
+Name[af]=Styl
+Name[ar]=المظهر العام
+Name[az]=Tərz
+Name[be]=Стыль
+Name[bg]=Теми и стилове
+Name[bn]=স্টাইল
+Name[br]=Giz
+Name[bs]=Stil
+Name[ca]=Estil
+Name[cs]=Styl
+Name[csb]=Sztél
+Name[cy]=Arddull
+Name[da]=Stil
+Name[de]=Stil
+Name[el]=Στυλ
+Name[eo]=Stilo
+Name[es]=Estilo
+Name[et]=Stiil
+Name[eu]=Estiloa
+Name[fa]=سبک
+Name[fi]=Tyyli
+Name[fy]=Styl
+Name[ga]=Stíl
+Name[gl]=Estilo
+Name[he]=סגנון
+Name[hi]=शैली
+Name[hr]=Stil
+Name[hu]=Stílus
+Name[id]=Gaya
+Name[is]=Stíll
+Name[it]=Stile
+Name[ja]=スタイル
+Name[ka]=სტილი
+Name[kk]=Стилі
+Name[km]=រចនាប័ទ្ម
+Name[ko]=스타일
+Name[lo]=ລັກສະນະ
+Name[lt]=Stilius
+Name[lv]=Stils
+Name[mk]=Стил
+Name[mn]=Хэлбэр
+Name[ms]=Gaya
+Name[mt]=Stil
+Name[nb]=Stil
+Name[nds]=Stil
+Name[ne]=शैली
+Name[nl]=Stijl
+Name[nn]=Stil
+Name[nso]=Mokgwa
+Name[oc]=Estil
+Name[pa]=ਸ਼ੈਲੀ
+Name[pl]=Styl
+Name[pt]=Estilo
+Name[pt_BR]=Estilo
+Name[ro]=Stil
+Name[ru]=Стиль
+Name[rw]=Imisusire
+Name[se]=Stiila
+Name[sk]=Štýl
+Name[sl]=Slog
+Name[sr]=Стил
+Name[sr@Latn]=Stil
+Name[ss]=Sitayela
+Name[sv]=Stil
+Name[ta]=பாணி
+Name[tg]=Услуб
+Name[th]=ลักษณะ
+Name[tr]=Stil
+Name[tt]=Stil
+Name[uk]=Стиль
+Name[uz]=Uslub
+Name[uz@cyrillic]=Услуб
+Name[ven]=Tshitaela
+Name[vi]=Kiểu dáng
+Name[wa]=Stîle
+Name[xh]=Uhlobo
+Name[zh_CN]=风格
+Name[zh_TW]=風格
+Name[zu]=Isitayela
+Comment=Allows the manipulation of widget behavior and changing the Style for KDE
+Comment[af]=Laat toe die manipulasie van gui-element gedrag en verandering die Styl vir Kde
+Comment[be]=Дазваляе кіраваць паводзінамі віджэтаў і змяняць стыль KDE
+Comment[bg]=Настройване на стила
+Comment[bn]=উইজেট আচরণ নিয়ন্ত্রণ করুন এবং কে.ডি.ই-র স্টাইল পাল্টান
+Comment[bs]=Omogućuje upravljanje ponašanjem ukrasa i izmjenu stila za KDE
+Comment[ca]=Permet la manipulació del comportament dels estris i permet canviar-ne l'estil per al KDE
+Comment[cs]=Umožňuje upravit chování prvků grafického prostředí a změnu stylu KDE
+Comment[csb]=Zezwôlô na òpisanié zachòwaniô elementów interfejsu ë zmianã Sztélu KDE
+Comment[cy]=Yn caniatau trin ymddygiad teclyn a newid arddull KDE
+Comment[da]=Tillader manipulation af kontrolopførsel og ændring af stilen for KDE
+Comment[de]=Stile und das Verhalten von Bedienelementen verändern
+Comment[el]=Επιτρέπει τη διαχείριση της συμπεριφοράς των γραφικών συστατικών και την αλλαγή του Στυλ για το KDE
+Comment[en_GB]=Allows the manipulation of widget behaviour and changing the Style for KDE
+Comment[eo]=Aspekto kaj konduto de la fenestroelementoj
+Comment[es]=Permite la manipulación del comportamiento del widget y permite cambiar el estilo para KDE
+Comment[et]=Võimaldab muuta kasutajaliidese elementide käitumist ning välimust
+Comment[eu]=Widget-en portaera eta KDEren estiloa aldatzen uzten dizu
+Comment[fa]=اجازۀ دستکاری رفتار عنصر و تغییر سبک را برای KDE می‌دهد.
+Comment[fi]=Mahdollistaa kontrollien käyttäytymisen muokaamisen ja KDE:n tyylin vaihtamisen
+Comment[fr]=Permet la configuration du comportement des éléments graphiques et la modification des styles de KDE
+Comment[fy]=Hjirmei kinne jo it gedrach fan de widgets oanpasse en de styl fan KDE wizigje
+Comment[gl]=Permite a manipulación do comportamento dun widget e o cámbio de estilo de KDE
+Comment[he]=שינוי הגדרות פעולת הפריטים והסגנון של KDE
+Comment[hi]=केडीई की शैली तथा विजेट बर्ताव में परिवर्तन की स्वीकृति देता है
+Comment[hr]=Dopušta upravljanje ponašanja widgeta i izmjenu KDE stila
+Comment[hu]=Lehetővé teszi a grafikus alapelemek jellemzőinek megváltoztatását, a KDE stílusának módosítását
+Comment[is]=Leyfir hagræðingu á græjuhegðun og breytingu á KDE stílnum
+Comment[it]=Permette la configurazione del comportamento degli elementi grafici e il cambio dello stile di KDE
+Comment[ja]=ウィジェットの挙動と KDE のスタイルを変更
+Comment[ka]=KDE-ს ელემენტების სტილი და იერსახე
+Comment[kk]=KDE элементтерінің қасиеттері
+Comment[km]=អនុញ្ញាត​ឲ្យ​រៀបចំ​ឥរិយាបថ​វត្ថុ​មើលឃើញ និង​ប្ដូរ​រចនាប័ទ្ម​របស់ KDE
+Comment[ko]=KDE 위젯의 행동을 조정하고 스타일을 변경하기
+Comment[lt]=Leidžia manipuliuoti valdiklio elgsena ir leidžia pakeisti KDE stilių
+Comment[lv]=Atļauj manipulācijas ar logdaļu izturēšanos un ļauj mainīt Stilu priekš KDE
+Comment[mk]=Дозволува манипулација со однесувањата на графичките контроли и промена на стиловите во KDE
+Comment[mn]=Үйлчилгээний элементийн хэлбэр ба байдал өөрчилөх
+Comment[ms]=Membolehkan manipulasi kelakuan widget dan mengubah Gaya untuk KDE
+Comment[mt]=Hawn tista' timmanipula l-imġieba tal-kontrolli u tbiddel l-istil għall-KDE
+Comment[nb]=Her kan du endre oppførsel til skjermelementer, og endre stiler i KDE
+Comment[nds]=Hier kann dat Bedregen vun Bedeen-Elementen un ehr KDE-Stil ännert warrn
+Comment[ne]=KDE का लागि परिवर्तन शैली र विजेट व्यवहारको परिचालन गर्न अनुमति दिन्छ
+Comment[nl]=Hiermee kunt u het gedrag van de widgets aanpassen en de stijl van KDE wijzigen
+Comment[nn]=Let deg endra KDE-stilen og åtferda til skjermelementa
+Comment[nso]=Dumelela peakanyo ya mekgwa ya widget lego fetosa Mokgwa wa KDE
+Comment[pa]=KDE ਲਈ ਵਿਦਗਿਟ ਵਿਵਹਾਰ ਅਤੇ ਸ਼ੈਲੀ ਤਬਦੀਲ ਲਈ ਸਹਾਈ ਹੈ
+Comment[pl]=Pozwala na określenie zachowania elementów interfejsu i zmianę Stylu KDE
+Comment[pt]=Permite a manipulação do comportamento dos elementos gráficos e a mudança do estilo para o KDE
+Comment[pt_BR]=Permite a manipulação do comportamente de widgets e a escolha do estilo usado pelo KDE
+Comment[ro]=Modifică stilul grafic KDE și comportamentul elementelor grafice
+Comment[ru]=Стиль и облик элементов KDE
+Comment[rw]=Yemerera ikoreshwa ry'imyitwarire y'irenga no guhindura Imisusire ya KDE
+Comment[se]=Diktá du rievdadit KDE-stiilla ja šearbmaáđaid láhttema
+Comment[sk]=Umožňuje upraviť správanie prvkov a zmenu štýlu pre KDE
+Comment[sl]=Omogoča manipulacijo z gradniki in spreminjanje sloga KDE
+Comment[sr]=Омогућава подешавање понашања форми и промену стила за KDE
+Comment[sr@Latn]=Omogućava podešavanje ponašanja formi i promenu stila za KDE
+Comment[sv]=Tillåter manipulering av beteendet hos komponenter och ändring av stil på KDE
+Comment[ta]=KDEக்கான வளைவுகளின் இயக்கத்தை கையாளவும் பாணிகளை மாற்றவும் அனுமதிக்கிறது
+Comment[tg]= Тавоноии таъғир ва ислоҳи навъи рафтори тарҳ ва услуби KDE-ро ба шумо медиҳад
+Comment[th]=อนุญาตการปรับรพฤติกรรมขอวิตเจ็ตลและเปลี่ยนลักษณะของ KDE
+Comment[tr]=KDE için Aletlerin davranışlarını ve stili değiştirmeyi sağlar
+Comment[tt]=KDE yözara berämleklärneñ çağılışı belän küreneşe
+Comment[uk]=Керування поведінкою віджетів та зміна стилю KDE
+Comment[ven]=Tendela u tshinywa ha maitele a widget ni tendele nau shandukisa tshitaela tsha KDE
+Comment[vi]=Cho phép điều chỉnh ứng xử của các thành tố điều khiển và thay đổi kiểu dáng của KDE
+Comment[wa]=Permete d' eployî li dujhance des ahesses et d' candjî l' stîle po KDE
+Comment[xh]=Ivumela uhanahaniso lokuziphatha kwe widget kwaye itshintsha Uhlobo lwe KDE
+Comment[zh_CN]=允许操纵修饰行为和更改 KDE 的样式
+Comment[zh_TW]=讓您控制視窗元件 (widget) 的操作方式,以及更改 KDE 的風格
+Comment[zu]=Ivumela ukulawula kokuziphatha kwe-widget kanye nokushintsha isitayela se-KDE
+
+Keywords=style,styles,look,widget,icons,toolbars,text,highlight,apps,KDE applications
+Keywords[af]=style,styles,look,widget,icons,toolbars,text,highlight,apps,KDE programme
+Keywords[az]=tərz,tərzlər,görünüş,dekorlar,örtük,örtüklər,parçacıq,menyu,MacOS,menyu çubuğu,timsal,timsallar,vasitə çubuğu,mətn,düymə,siçan,şəffaf,hərəkət,ekran,proqram,proqramlar,KDE proqramları
+Keywords[be]=Стыль,Стылі,Выгляд,Вонкавы выгляд,Віджэт,Значкі,Панэлі начынняў,Тэкст,Падсвятленне,Праграмы,Праграмы KDE,style,styles,look,widget,icons,toolbars,text,highlight,apps,KDE applications
+Keywords[bg]=стил, тема, външен, вид, икони, текст, цветове, style, styles, look, widget, icons, toolbars, text, highlight, apps, KDE applications
+Keywords[br]=giz,gizioù,widget,neuz,arlunoù,barrennoù an ostilhoù,skrid,highlight,meziantoù,meziantoù KDE
+Keywords[ca]=estil,estils,temes,aspecte,objete visual,estri,icones,barres d'eines,text,ressaltat,aplicacions,aplicacions KDE
+Keywords[cs]=Styl,Témata,Motivy,Vzhled,Text,Zvýraznění,Tlačítka,Aplikace KDE
+Keywords[csb]=sztél,sztéle,wëzdrzatk,òkno,ikònë,lëstwë nôrzãdzów,tekstë,nôdpisë,pòdskrzënienié,programë,programë KDE
+Keywords[cy]=arddull,arddulliau,golwg,teclyn,celfigyn,eiconau,bar offer,testun,amlygu,rhaglenni,rhaglenni KDE
+Keywords[da]=stil,udseende,kontrol,ikoner,værktøjslinjer,tekst,fremhæv,prog,KDE-programmer
+Keywords[de]=Stile,Design,Themes,Schema,Elemente,Bildschirmelemente,Icons,Bedienelemente,Schriften,Symbole,Werkzeugleisten,Text,Hervorhebungen,Knöpfe,Anwendungen,Programme,KDE-Programme
+Keywords[el]=στυλ,στυλ,εμφάνιση,γραφικό συστατικό,εικονίδια,γραμμές εργαλείων,κείμενο,τονισμός,εφαρμογές,εφαρμογές KDE
+Keywords[eo]=stilo,aspekto,fenestraĵo,piktogramo,ilobreto,aplikaĵoj
+Keywords[es]=estilo,estilos,temas,aspecto,objeto visual,widget,texto,resaltado,botones, aplicaciones, aplicaciones KDE
+Keywords[et]=stiil,stiilid,teemad,välimus,elemendid,vidinad,menüüriba,ikoonid, tööriistaribad,rakendused,KDE rakendused
+Keywords[eu]=estiloa,estiloak,itxura,widget-a,ikonoak,tresna-barrak,testua, nabarmenketa,aplikazioak,KDE aplikazioak
+Keywords[fa]=سبک، سبکها، ظاهر، عنصر، شمایلها، میله‌ ابزارها، متن، مشخص، کاربردها، کاربردهای KDE
+Keywords[fi]=tyyli,tyylit,ulkonäkö,kontrolli,kuvakkeet,työkalurivit,teksti,korostus,sovellukset,KDE sovellukset
+Keywords[fr]=style,styles,thème,apparence,widget,élément graphique,barre demenus,MacOS,police,couleur,non KDE,icône,icônes,barre d'outils,barres d'outils,barres de menus,texte,surbrillance,sélection,bouton,souris,transparence,déplacement,écran,applications,programmes,programmes non KDE,applications non KDE
+Keywords[fy]=styl,stylen,look,üterlik,widget,icons,ikoan,ikoanen,wurkbalke,tekst,highlight,pljochtsje,apps,KDE-tapassingen,programma's,KDE-programma's,tapassingen
+Keywords[ga]=stíl,stíleanna,téama,cuma,giuirléid,deilbhíní,barraí uirlisí,téacs,aibhsiú,feidhmchláir,feidhmchláir KDE
+Keywords[gl]=estilo,estilos,apariencia,widget,iconas,barras de ferramentas,texto,resaltar,aplicacións,aplicacións KDE
+Keywords[he]=סגנון,מראה,פריטים,סמלים,סרגל כלים,טקסט,הדגשה,יישומים,יישומים של KDE,style,styles,look,widget,icons,toolbars,text,highlight,apps,KDE applications
+Keywords[hi]=शैली,शैलियाँ,रूप,विजेट,प्रतीक,औज़ार-पट्टी,पाठ,उभारें,एप्प्स,केडीई अनुप्रयोग
+Keywords[hr]=style,styles,look,widget,icons,toolbars,text,highlight,apps,KDE applications,stil,izgled,ikone,alatne trake,tekst,naglašavanje,KDE aplikacije
+Keywords[hu]=stílus,stílusok,kinézet,grafikus elem,ikonok,eszköztárak,szöveg,kiemelés,alkalmazások,KDE alkalmazások
+Keywords[is]=stíll,stílar,þemur,þema,útlit,valmyndir,valslá,MacOS,letur,leturgerðir,leturgerð,gegnsætt,skjár,forrit, táknmyndir,takkar,mús,takki,hnappur
+Keywords[it]=stile,stili,aspetto,widget,elemento grafico,icone,barre degli strumenti,testo,evidenziazione,applicazioni,applicazioni KDE
+Keywords[ja]=スタイル,スタイル,外観,ウィジェット,アイコン,ツールバー,テキスト,ハイライト,アプリ,KDEアプリケーション
+Keywords[km]=រចនាប័ទ្ម,រូបរាង,វត្ថុ​មើលឃើញ,រូបតំណាង,របារ​ឧបករណ៍,អត្ថបទ,បន្លិច,កម្មវិធី,កម្មវិធី KDE
+Keywords[lt]=style,styles,look,widget,icons,toolbars,text,highlight,apps,KDE applications, stilius,stiliai,išvaizda,valdiklis,ženkliukai,piktogramos,įrankių juostos,paryškinimas,KDE taikomosios programos
+Keywords[mk]=style,styles,look,widget,icons,toolbars,text,highlight,apps,KDE applications,стил,стилови,изглед,икони,алатници,текст,KDE апликации
+Keywords[mn]=Хэлбэр,Загвар,Themes,Схем,Элемент,Дэлгэцийн элемент,Icons, Үйлчилгээний элемент,Бичиг,Тэмдэг,Багаж самбар,Текст,Онцгойлолт,Товч, Хэрэглээний,Програм,КДЭ-Програм
+Keywords[mt]=style,styles,look,widget,icons,toolbars,text,highlight,apps,KDE applications,stili,dehra,ikoni,test,immarkar
+Keywords[nb]=stil,stiler,temaer,utseende,menylinje,skrifttype,farger,ikke-KDE,ikoner,verktøylinje,tekst,knapper,mus,flytting,skjerm,programmer,ikke-KDE programmer
+Keywords[nds]=Stil,Stilen,look,widget,Lüttbiller,Warktüüchbalken,Text,markeren,Programmen,KDE-Programmen,Bedeenelement
+Keywords[ne]=शैली, शैलीहरू, हेर्नुहोस्, विजेट, प्रतिमा, उपकरणपट्टी, पाठ, हाइलाइट,apps,KDE अनुप्रयोगहरू
+Keywords[nl]=stijl,stijlen,look,uiterlijk,widget,icons,iconen,pictogrammen,werkbalken,tekst,highlight,accentuatie,apps,KDE-toepassingen,programma's,KDE-programma's,toepassingen
+Keywords[nn]=stil,tema,utsjånad,bunad,element,skjermelement,verktøylinje,tekst,markering,program,KDE-program
+Keywords[nso]=mokgwa,mekgwa,tebelelo,widget,diemedi,di-bar tsa dibereka,sengwalwana,pontshwana,apps,KDE ditshomiso
+Keywords[pa]=style,styles,look,widget,icons,toolbars,text,highlight,apps,KDE applications,ਸ਼ੈਲੀ,ਸ਼ੈਲੀਆਂ,ਦਿੱਖ,ਆਈਕਾਨ,ਸੰਦ-ਪੱਟੀ,ਪਾਠ,ਉਘਾੜੋ,ਕਾਰਜ
+Keywords[pl]=styl,style,wygląd,okienko,ikony,paski narzędzi,tekst,napisy,podświetlenie,programy,programy KDE
+Keywords[pt]=estilo,estilos,aparência,elemento,ícones,ferramentas,texto,realce,aplicações,aplicações do KDE
+Keywords[pt_BR]=estilo,estilos,aparência,widget,ícones,barra de ferramentas,texto,realce,aplicativos,aplicativos não-KDE
+Keywords[ro]=stil,aspect,componentă,widget,iconițe,bare de unelte,text,evidențiere,aplicații,KDE
+Keywords[ru]=style,styles,look,widget,icons,toolbars,text,highlight,apps,KDE applications,стиль,стили,приложения
+Keywords[rw]=umususire,imisusire,imboneko,irenga,udushushondanga,umwanyabikoresho,umwandiko,gushimangira,porogaramu,Porogaramu KDE
+Keywords[se]=stiila,fáddá,fárda,áđat,govažat,neavvoholggat,teaksta,merken,prográmmat,KDE-prográmmat
+Keywords[sk]=štýl,štýly,vzhľad,prvok,ikony,KDE aplikácie,panely nástrojov,text,zvýraznenie,aplikácie
+Keywords[sl]=slog,slogi,stil,stili,teme,videz,izgled,gradnik,menujska vrstica,osvetlitev,programi,programi za KDEi
+Keywords[sr]=style,styles,look,widget,icons,toolbars,text,highlight,apps,стил,стилови,теме,изглед,форма,иконе,траке са алатима,текст,истицање,програми,KDE програми
+Keywords[sr@Latn]=style,styles,look,widget,icons,toolbars,text,highlight,apps,stil,stilovi,teme,izgled,forma,ikone,trake sa alatima,tekst,isticanje,programi,KDE programi
+Keywords[sv]=stil,stilar,utseende,komponent,ikoner,verktygrader,text,färgläggning, program,KDE-program
+Keywords[ta]=பாணி,பாணிகள்,பார்,வளைவு,சின்னம்,கருவிப்பட்டி,உரை,தனிப்படுத்து,பயன்பாடு,கேடியி பயன்பாடுகள்
+Keywords[th]=ลักษณะ,ที่มองเห็น,วิตเจ็ต,ไอคอน,แถบเครื่องมือ,ข้อความ,ทำตัวเน้น,โปรแกรม,แอพพลิเคชัน KDE
+Keywords[tr]=simgeler,stil,stiller,dekor,dekorlar,tema,temalar,görünüm,parçacık,menü,KDE uygulamaları,araç çubukları,uygulamalar
+Keywords[uk]=стиль,стилі,вигляд,віджет,піктограми,пенали, текст,виділення,програми KDE
+Keywords[uz]=uslub,uslublar,tashqi koʻrinishi,vidjet,nishonchalar,asboblar paneli,matn,belgilash,dasturlar,KDE dasturlari
+Keywords[uz@cyrillic]=услуб,услублар,ташқи кўриниши,виджет,нишончалар,асбоблар панели,матн,белгилаш,дастурлар,KDE дастурлари
+Keywords[ven]=Tshitaela,Zwitaela,sedza,widget,dziaikhono,bara ya tshishumiswa,manwalwa,bvisela khagala,apps,dziapulifikhesheni ya KDE
+Keywords[vi]=kiểu,các kiểu,nhìn,widget,biểu tượng,thanh công cụ,text,đánh dấu,apps,ứng dụng KDE
+Keywords[wa]=stîle,stîles,rivnance,ahesse,imådjete,Bårs ås usteyes,tecse,programes,programes KDE
+Keywords[xh]=uhlobo, iintlobo, jonga, widget, amaphawu emifanekiso, iibar zesixhobo, umbhalo, phawula, apps, izicelo ze KDE
+Keywords[zh_CN]=style,styles,look,widget,icons,toolbars,text,highlight,apps,KDE applications,风格,外观,窗口部件,图标,工具栏,文字,突出,KDE 程序,KDE 应用程序
+Keywords[zh_TW]=style,styles,look,widget,icons,toolbars,text,highlight,apps,KDE applications,風格,主題,外觀,視窗元件,圖示,工具列,文字,突出顯示,應用程式,KDE 應用程式
+Keywords[zu]=isitayela,izitayela,ukubukeka,widget,izimpawu zezithombe,amabha amathuluzi,umbhalo,ukugqamisa,apps,abayaleli be-KDE
+
+Categories=Qt;KDE;X-KDE-settings-looknfeel;
diff --git a/kcontrol/style/styleconfdialog.cpp b/kcontrol/style/styleconfdialog.cpp
new file mode 100644
index 000000000..6638b620d
--- /dev/null
+++ b/kcontrol/style/styleconfdialog.cpp
@@ -0,0 +1,46 @@
+/*
+ * KCMStyle's container dialog for custom style setup dialogs
+ *
+ * (c) 2003 Maksim Orlovich <maksim.orlovich@kdemail.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "styleconfdialog.h"
+#include <klocale.h>
+
+StyleConfigDialog::StyleConfigDialog(QWidget* parent, QString styleName):
+ KDialogBase(parent, "StyleConfigDialog",
+ true, /*modal*/
+ i18n("Configure %1").arg(styleName),
+ KDialogBase::Default | KDialogBase::Ok | KDialogBase::Cancel,
+ KDialogBase::Cancel)
+{
+ m_dirty = false;
+ connect( this, SIGNAL( defaultClicked() ), this, SIGNAL( defaults() ));
+ connect( this, SIGNAL( okClicked() ), this, SIGNAL( save() ));
+}
+
+bool StyleConfigDialog::isDirty() const
+{
+ return m_dirty;
+}
+
+void StyleConfigDialog::setDirty(bool dirty)
+{
+ m_dirty = dirty;
+}
+
+#include <styleconfdialog.moc>
diff --git a/kcontrol/style/styleconfdialog.h b/kcontrol/style/styleconfdialog.h
new file mode 100644
index 000000000..ab299225a
--- /dev/null
+++ b/kcontrol/style/styleconfdialog.h
@@ -0,0 +1,46 @@
+/*
+ * KCMStyle's container dialog for custom style setup dialogs
+ *
+ * (c) 2003 Maksim Orlovich <maksim.orlovich@kdemail.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef STYLE_CONF_DIALOG
+#define STYLE_CONF_DIALOG
+
+#include <kdialogbase.h>
+
+
+class StyleConfigDialog: public KDialogBase
+{
+ Q_OBJECT
+public:
+ StyleConfigDialog(QWidget* parent, QString styleName);
+
+ bool isDirty() const;
+
+public slots:
+ void setDirty(bool dirty);
+
+signals:
+ void defaults();
+ void save();
+
+private:
+ bool m_dirty;
+};
+
+#endif
diff --git a/kcontrol/style/stylepreview.ui b/kcontrol/style/stylepreview.ui
new file mode 100644
index 000000000..fbb4929f2
--- /dev/null
+++ b/kcontrol/style/stylepreview.ui
@@ -0,0 +1,285 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>StylePreview</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>StylePreview</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>483</width>
+ <height>254</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>50</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>TabWidget2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Tab 1</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup" row="0" column="0" rowspan="4" colspan="1">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Button Group</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RadioButton1</cstring>
+ </property>
+ <property name="text">
+ <string>Radio button</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RadioButton2</cstring>
+ </property>
+ <property name="text">
+ <string>Radio button</string>
+ </property>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>Line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>CheckBox1</cstring>
+ </property>
+ <property name="text">
+ <string>Checkbox</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="tristate">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QScrollBar" row="0" column="2" rowspan="4" colspan="1">
+ <property name="name">
+ <cstring>ScrollBar1</cstring>
+ </property>
+ <property name="maxValue">
+ <number>19</number>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="3" column="1">
+ <item>
+ <property name="text">
+ <string>Combobox</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>ComboBox1</cstring>
+ </property>
+ </widget>
+ <widget class="QProgressBar" row="0" column="1">
+ <property name="name">
+ <cstring>ProgressBar1</cstring>
+ </property>
+ <property name="progress">
+ <number>70</number>
+ </property>
+ </widget>
+ <widget class="QSlider" row="1" column="1">
+ <property name="name">
+ <cstring>Slider1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>SpinBox1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>999999</number>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>200</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Button</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>30</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Tab 2</string>
+ </attribute>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+ <include location="local" impldecl="in implementation">stylepreview.ui.h</include>
+</includes>
+<slots>
+ <slot>init()</slot>
+ <slot returnType="bool">eventFilter( QObject *, QEvent * ev )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="10"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/style/stylepreview.ui.h b/kcontrol/style/stylepreview.ui.h
new file mode 100644
index 000000000..09b50a0ce
--- /dev/null
+++ b/kcontrol/style/stylepreview.ui.h
@@ -0,0 +1,69 @@
+/*
+ * Style Preview Widget
+ * Copyright (C) 2002 Karol Szwed <gallium@kde.org>
+ * Copyright (C) 2002 Daniel Molkentin <molkentin@kde.org>
+ *
+ * Portions Copyright (C) 2000 TrollTech AS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ ***************************************************************************
+ ** ui.h extension file, included from the uic-generated form implementation.
+ **
+ ** If you wish to add, delete or rename slots use Qt Designer which will
+ ** update this file, preserving your code. Create an init() slot in place of
+ ** a constructor, and a destroy() slot in place of a destructor.
+ *****************************************************************************/
+
+#include <qobjectlist.h>
+
+void StylePreview::init()
+{
+ // Ensure that the user can't toy with the child widgets.
+ // Method borrowed from Qt's qtconfig.
+ QObjectList* l = queryList("QWidget");
+ QObjectListIt it(*l);
+ QObject* obj;
+ while ((obj = it.current()) != 0)
+ {
+ ++it;
+ obj->installEventFilter(this);
+ ((QWidget*)obj)->setFocusPolicy(NoFocus);
+ }
+ delete l;
+}
+
+bool StylePreview::eventFilter( QObject* /* obj */, QEvent* ev )
+{
+ switch( ev->type() )
+ {
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ case QEvent::MouseButtonDblClick:
+ case QEvent::MouseMove:
+ case QEvent::KeyPress:
+ case QEvent::KeyRelease:
+ case QEvent::Enter:
+ case QEvent::Leave:
+ case QEvent::Wheel:
+ case QEvent::ContextMenu:
+ return TRUE; // ignore
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+// vim: set noet ts=4:
diff --git a/kcontrol/taskbar/Makefile.am b/kcontrol/taskbar/Makefile.am
new file mode 100644
index 000000000..bd458e1be
--- /dev/null
+++ b/kcontrol/taskbar/Makefile.am
@@ -0,0 +1,21 @@
+kde_module_LTLIBRARIES = kcm_taskbar.la
+
+kcm_taskbar_la_SOURCES = kcmtaskbarui.ui kcmtaskbar.cpp
+kcm_taskbar_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_taskbar_la_LIBADD = $(top_builddir)/kicker/taskbar/libtaskbar.la -lkdeui
+AM_CPPFLAGS = -I$(top_builddir)/kicker/taskbar $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = kcmtaskbar.h
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmtaskbar.pot
+
+xdg_apps_DATA = kcmtaskbar.desktop
+
+install-data-local: uninstall.desktop
+ $(mkinstalldirs) $(DESTDIR)$(kde_appsdir)/Settings/LookNFeel
+ $(INSTALL_DATA) $(srcdir)/uninstall.desktop $(DESTDIR)$(kde_appsdir)/Settings/LookNFeel/kcmtaskbar.desktop
+
+kcmtaskbar.lo: ../../kicker/taskbar/taskbarsettings.h
diff --git a/kcontrol/taskbar/kcmtaskbar.cpp b/kcontrol/taskbar/kcmtaskbar.cpp
new file mode 100644
index 000000000..08139b607
--- /dev/null
+++ b/kcontrol/taskbar/kcmtaskbar.cpp
@@ -0,0 +1,291 @@
+/*
+ * Copyright (c) 2000 Kurt Granroth <granroth@kde.org>
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qlayout.h>
+#include <qtimer.h>
+#include <qvaluelist.h>
+
+#include <dcopclient.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdialog.h>
+#include <kgenericfactory.h>
+#include <kwin.h>
+#include <kcolorbutton.h>
+#include <qlabel.h>
+
+#define protected public
+#include "kcmtaskbarui.h"
+#undef protected
+#include "taskbarsettings.h"
+
+#include "kcmtaskbar.h"
+#include "kcmtaskbar.moc"
+
+typedef KGenericFactory<TaskbarConfig, QWidget > TaskBarFactory;
+K_EXPORT_COMPONENT_FACTORY (kcm_taskbar, TaskBarFactory("kcmtaskbar") )
+
+TaskbarAppearance::TaskbarAppearance(QString name,
+ bool drawButtons,
+ bool haloText,
+ bool showButtonOnHover)
+ : m_name(name),
+ m_drawButtons(drawButtons),
+ m_haloText(haloText),
+ m_showButtonOnHover(showButtonOnHover)
+{
+}
+
+TaskbarAppearance::TaskbarAppearance()
+ : m_drawButtons(false),
+ m_haloText(false),
+ m_showButtonOnHover(true)
+{
+}
+
+bool TaskbarAppearance::matchesSettings() const
+{
+ return TaskBarSettings::drawButtons() == m_drawButtons &&
+ TaskBarSettings::haloText() == m_haloText &&
+ TaskBarSettings::showButtonOnHover() == m_showButtonOnHover;
+}
+
+void TaskbarAppearance::alterSettings() const
+{
+ TaskBarSettings::self()->setDrawButtons(m_drawButtons);
+ TaskBarSettings::self()->setHaloText(m_haloText);
+ TaskBarSettings::self()->setShowButtonOnHover(m_showButtonOnHover);
+}
+
+// These are the strings that are actually stored in the config file.
+const QStringList& TaskbarConfig::actionList()
+{
+ static QStringList list(
+ QStringList() << I18N_NOOP("Show Task List") << I18N_NOOP("Show Operations Menu")
+ << I18N_NOOP("Activate, Raise or Minimize Task")
+ << I18N_NOOP("Activate Task") << I18N_NOOP("Raise Task")
+ << I18N_NOOP("Lower Task") << I18N_NOOP("Minimize Task")
+ << I18N_NOOP("To Current Desktop")
+ << I18N_NOOP("Close Task") );
+ return list;
+}
+
+// Get a translated version of the above string list.
+QStringList TaskbarConfig::i18nActionList()
+{
+ QStringList i18nList;
+ for( QStringList::ConstIterator it = actionList().begin(); it != actionList().end(); ++it ) {
+ i18nList << i18n((*it).latin1());
+ }
+ return i18nList;
+}
+
+// These are the strings that are actually stored in the config file.
+const QStringList& TaskbarConfig::groupModeList()
+{
+ static QStringList list(
+ QStringList() << I18N_NOOP("Never") << I18N_NOOP("When Taskbar Full")
+ << I18N_NOOP("Always"));
+ return list;
+}
+
+// Get a translated version of the above string list.
+QStringList TaskbarConfig::i18nGroupModeList()
+{
+ QStringList i18nList;
+ for( QStringList::ConstIterator it = groupModeList().begin(); it != groupModeList().end(); ++it ) {
+ i18nList << i18n((*it).latin1());
+ }
+ return i18nList;
+}
+
+TaskbarConfig::TaskbarConfig(QWidget *parent, const char* name, const QStringList&)
+ : KCModule(TaskBarFactory::instance(), parent, name)
+{
+ QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+ m_widget = new TaskbarConfigUI(this);
+ layout->addWidget(m_widget);
+
+ // TODO: Load these from .desktop files?
+ m_appearances.append(TaskbarAppearance(i18n("Elegant"), false, false, true));
+ m_appearances.append(TaskbarAppearance(i18n("Classic"), true, false, true));
+ m_appearances.append(TaskbarAppearance(i18n("For Transparency"), false, true, true));
+
+ for (TaskbarAppearance::List::const_iterator it = m_appearances.constBegin();
+ it != m_appearances.constEnd();
+ ++it)
+ {
+ m_widget->appearance->insertItem((*it).name());
+ }
+
+ connect(m_widget->appearance, SIGNAL(activated(int)),
+ this, SLOT(appearanceChanged(int)));
+ addConfig(TaskBarSettings::self(), m_widget);
+
+ setQuickHelp(i18n("<h1>Taskbar</h1> You can configure the taskbar here."
+ " This includes options such as whether or not the taskbar should show all"
+ " windows at once or only those on the current desktop."
+ " You can also configure whether or not the Window List button will be displayed."));
+
+ QStringList list = i18nActionList();
+ m_widget->kcfg_LeftButtonAction->insertStringList(list);
+ m_widget->kcfg_MiddleButtonAction->insertStringList(list);
+ m_widget->kcfg_RightButtonAction->insertStringList(list);
+ m_widget->kcfg_GroupTasks->insertStringList(i18nGroupModeList());
+
+ connect(m_widget->kcfg_GroupTasks, SIGNAL(activated(int)),
+ this, SLOT(slotUpdateComboBox()));
+ connect(m_widget->kcfg_UseCustomColors, SIGNAL(stateChanged(int)), this, SLOT(slotUpdateCustomColors()));
+
+ slotUpdateCustomColors();
+ updateAppearanceCombo();
+
+ if (KWin::numberOfDesktops() < 2)
+ {
+ m_widget->kcfg_ShowAllWindows->hide();
+ m_widget->kcfg_SortByDesktop->hide();
+ m_widget->spacer2->changeSize(0, 0);
+ }
+
+ if (!QApplication::desktop()->isVirtualDesktop() ||
+ QApplication::desktop()->numScreens() == 1) // No Ximerama
+ {
+ m_widget->showAllScreens->hide();
+ }
+ connect( m_widget->showAllScreens, SIGNAL( stateChanged( int )), SLOT( changed()));
+
+ KAboutData *about = new KAboutData(I18N_NOOP("kcmtaskbar"),
+ I18N_NOOP("KDE Taskbar Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2000 - 2001 Matthias Elter"));
+
+ about->addAuthor("Matthias Elter", 0, "elter@kde.org");
+ about->addCredit("Stefan Nikolaus", I18N_NOOP("KConfigXT conversion"),
+ "stefan.nikolaus@kdemail.net");
+ setAboutData(about);
+
+ load();
+ QTimer::singleShot(0, this, SLOT(notChanged()));
+}
+
+void TaskbarConfig::slotUpdateCustomColors()
+{
+ m_widget->kcfg_ActiveTaskTextColor->setEnabled(m_widget->kcfg_UseCustomColors->isChecked());
+ m_widget->activeTaskTextColorLabel->setEnabled(m_widget->kcfg_UseCustomColors->isChecked());
+
+ m_widget->kcfg_InactiveTaskTextColor->setEnabled(m_widget->kcfg_UseCustomColors->isChecked());
+ m_widget->inactiveTaskTextColorLabel->setEnabled(m_widget->kcfg_UseCustomColors->isChecked());
+
+ m_widget->kcfg_TaskBackgroundColor->setEnabled(m_widget->kcfg_UseCustomColors->isChecked());
+ m_widget->taskBackgroundColorLabel->setEnabled(m_widget->kcfg_UseCustomColors->isChecked());
+}
+
+void TaskbarConfig::slotUpdateComboBox()
+{
+ int pos = TaskBarSettings::ActivateRaiseOrMinimize;
+ // If grouping is enabled, call "Activate, Raise or Iconify something else,
+ // though the config key used is the same.
+ if(m_widget->kcfg_GroupTasks->currentItem() != TaskBarSettings::GroupNever)
+ {
+ m_widget->kcfg_LeftButtonAction->changeItem(i18n("Cycle Through Windows"), pos);
+ m_widget->kcfg_MiddleButtonAction->changeItem(i18n("Cycle Through Windows"), pos);
+ m_widget->kcfg_RightButtonAction->changeItem(i18n("Cycle Through Windows"), pos);
+ }
+ else
+ {
+ QString action = i18nActionList()[pos];
+ m_widget->kcfg_LeftButtonAction->changeItem(action,pos);
+ m_widget->kcfg_MiddleButtonAction->changeItem(action,pos);
+ m_widget->kcfg_RightButtonAction->changeItem(action,pos);
+ }
+}
+
+void TaskbarConfig::updateAppearanceCombo()
+{
+ unsigned int i = 0;
+ for (TaskbarAppearance::List::const_iterator it = m_appearances.constBegin();
+ it != m_appearances.constEnd();
+ ++it, ++i)
+ {
+ if ((*it).matchesSettings())
+ {
+ break;
+ }
+ }
+
+ if (i < m_appearances.count())
+ {
+ m_widget->appearance->setCurrentItem(i);
+ return;
+ }
+
+ if (m_widget->appearance->count() == m_appearances.count())
+ {
+ m_widget->appearance->insertItem(i18n("Custom"));
+ }
+
+ m_widget->appearance->setCurrentItem(m_appearances.count());
+}
+
+void TaskbarConfig::appearanceChanged(int selected)
+{
+ if (selected < m_appearances.count())
+ {
+ unmanagedWidgetChangeState(!m_appearances[selected].matchesSettings());
+ }
+}
+
+void TaskbarConfig::load()
+{
+ KCModule::load();
+ slotUpdateComboBox();
+ updateAppearanceCombo();
+ m_widget->showAllScreens->setChecked(!TaskBarSettings::self()->showCurrentScreenOnly());
+}
+
+void TaskbarConfig::save()
+{
+ TaskBarSettings::self()->setShowCurrentScreenOnly(!m_widget->showAllScreens->isChecked());
+ int selectedAppearance = m_widget->appearance->currentItem();
+ if (selectedAppearance < m_appearances.count())
+ {
+ m_appearances[selectedAppearance].alterSettings();
+ TaskBarSettings::self()->writeConfig();
+ }
+
+ KCModule::save();
+
+ QByteArray data;
+ kapp->dcopClient()->emitDCOPSignal("kdeTaskBarConfigChanged()", data);
+}
+
+void TaskbarConfig::defaults()
+{
+ KCModule::defaults();
+ slotUpdateComboBox();
+ updateAppearanceCombo();
+}
+
+void TaskbarConfig::notChanged()
+{
+ emit changed(false);
+}
diff --git a/kcontrol/taskbar/kcmtaskbar.desktop b/kcontrol/taskbar/kcmtaskbar.desktop
new file mode 100644
index 000000000..85085f9ad
--- /dev/null
+++ b/kcontrol/taskbar/kcmtaskbar.desktop
@@ -0,0 +1,229 @@
+[Desktop Entry]
+Icon=kmenu
+Type=Application
+DocPath=kcontrol/kcmtaskbar/index.html
+Exec=kcmshell kcmtaskbar
+
+
+X-KDE-Library=taskbar
+X-KDE-FactoryName=taskbar
+X-KDE-ParentApp=kcontrol
+
+Name=Taskbar
+Name[af]=Kasbar
+Name[ar]=شريط المهام
+Name[az]=Vəzifə Çubuğu
+Name[be]=Панэль заданняў
+Name[bg]=Панел за задачи
+Name[bn]=টাস্কবার
+Name[br]=Barrenn dleadoù
+Name[ca]=Barra de tasques
+Name[cs]=Pruh úloh
+Name[csb]=Lëstew dzejaniów
+Name[cy]=Bar tasgau
+Name[da]=Opgavelinje
+Name[de]=Fensterleiste
+Name[el]=Γραμμή εργασιών
+Name[eo]=Taskostrio
+Name[es]=Barra de tareas
+Name[et]=Tegumiriba
+Name[eu]=Ataza-barra
+Name[fa]=میله تکلیف
+Name[fi]=Tehtäväpalkki
+Name[fr]=Barre des tâches
+Name[fy]=Taakbalke
+Name[ga]=Tascbharra
+Name[gl]=Barra de tarefas
+Name[he]=שורת המשימות
+Name[hi]=कार्यपट्टी
+Name[hr]=Traka zadataka
+Name[hu]=Feladatlista
+Name[is]=Verkefnaslá
+Name[it]=Barra delle applicazioni
+Name[ja]=タスクバー
+Name[ka]=ამოცანათა პანელი
+Name[kk]=Тапсырмалар панелі
+Name[km]=របារ​ភារកិច្ច
+Name[ko]=작업 표시줄
+Name[lo]=ແຖບຫນ້າຕ່າງງານ
+Name[lt]=Užduočių juosta
+Name[lv]=Uzdevumjosla
+Name[mk]=Лента со програми
+Name[mn]=Цонхны самбар
+Name[nb]=Oppgavelinje
+Name[nds]=Programmbalken
+Name[ne]=कार्यपट्टी
+Name[nl]=Taakbalk
+Name[nn]=Oppgåvelinje
+Name[nso]=Bar ya Mosongwana
+Name[oc]=Barra de tasques
+Name[pa]=ਸੰਦਪੱਟੀ
+Name[pl]=Pasek zadań
+Name[pt]=Barra de Tarefas
+Name[pt_BR]=Barra de tarefas
+Name[ro]=Bara de procese
+Name[ru]=Панель задач
+Name[rw]=Umurongoibikorwa
+Name[se]=Bargoholga
+Name[sk]=Panel úloh
+Name[sl]=Opravilna vrstica
+Name[sr]=Трака задатака
+Name[sr@Latn]=Traka zadataka
+Name[ss]=Ibar yemsebenti
+Name[sv]=Aktivitetsfält
+Name[ta]=பணிப்பட்டி
+Name[tg]=Пайраҳаи вазифа
+Name[th]=แถบหน้าต่างงาน
+Name[tr]=Görev Çubuğu
+Name[tt]=Qoraltirä
+Name[uk]=Смужка задач
+Name[uz]=Vazifalar paneli
+Name[uz@cyrillic]=Вазифалар панели
+Name[ven]=Bara ya mushumo
+Name[vi]=Thanh tác vụ
+Name[wa]=Bår des bouyes
+Name[xh]=Ibar yomsebenzi
+Name[zh_CN]=任务条
+Name[zh_TW]=工作列
+Name[zu]=Ibha yemisebenzi
+
+Comment=Configure the panel taskbar
+Comment[af]=Stel die paneel taakbalk op
+Comment[ar]=إعداد شريط المهام اللوح
+Comment[be]=Настаўленні панэлі заданняў
+Comment[bg]=Настройване на панела за задачите
+Comment[bn]=প্যানেল টাস্কবার কনফিগার করুন
+Comment[br]=Kefluniañ barrenn dleadoù ar panell
+Comment[bs]=Podesite panel taskbara
+Comment[ca]=Configura el plafó barra de tasques
+Comment[cs]=Zde je možné nastavit pruh úloh panelu
+Comment[csb]=Kònfigùracëjô lëstwë dzejaniô panelu
+Comment[cy]=Ffurfweddu bar tasgau y panel
+Comment[da]=Indstil panelets opgavelinje
+Comment[de]=Den Programmbereich der Kontrollleiste einrichten
+Comment[el]=Ρυθμίστε τη γραμμή εργασιών του πίνακα
+Comment[eo]=Agordo de la panela taskostrio
+Comment[es]=Configuración de la barra de tareas del panel
+Comment[et]=Paneeli tegumiriba seadistamine
+Comment[eu]=Konfiguratu paneleko ataza-barra
+Comment[fa]=پیکربندی میله تکلیف
+Comment[fi]=Muokkaa paneelin tehtäväpalkkia
+Comment[fr]=Configuration de la barre des tâches du tableau de bord
+Comment[fy]=Hjir kinne jo de taakbalke fan it paniel ynstelle
+Comment[gl]=Configurar a barra de tarefas do painel
+Comment[he]=הגדר שורת המשימות של הלוח
+Comment[hi]=फलक कार्यपट्टी कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje trake zadataka na ploči
+Comment[hu]=A panel feladatlistájának beállításai
+Comment[is]=Hér getur þú stillt verkefnaslá spjaldsins
+Comment[it]=Configura la barra delle applicazioni nel pannello
+Comment[ja]=パネルのタスクバーを設定
+Comment[ka]=ამოცანათა პანელის კონფიგურაცია
+Comment[kk]=Тапсырмалар панелін баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​របារ​ភារកិច្ច​បន្ទះ
+Comment[ko]=패널 작업 표시줄 설정
+Comment[lt]=Čia galite konfigūruoti pulto užduočių juostą
+Comment[lv]=Šeit Jūs varat konfigurēt paneļa uzdevumjoslu
+Comment[mk]=Тука може да ја конфигурирате лентата со програми
+Comment[mn]=Цонхны самбар тохируулах
+Comment[ms]=Konfigur 'taskbar' panel
+Comment[mt]=Ikkonfigura t-taskbar tal-pannell
+Comment[nb]=Tilpass oppgavelinja i panelet
+Comment[nds]=Den Programmbalken in't Paneel instellen
+Comment[ne]=प्यानल कार्यपट्टी कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u de taakbalk van het paneel instellen
+Comment[nn]=Oppsett av oppgåvelinja i panelet
+Comment[pa]=ਪੈਨਲ ਸੰਦਪੱਟੀ ਸੰਰਚਨਾ
+Comment[pl]=Konfiguracja paska zadań panelu
+Comment[pt]=Configuração da barra de tarefas do painel
+Comment[pt_BR]=Configura a barra de tarefas
+Comment[ro]=Configurează bara de procese din panou
+Comment[ru]=Настройки панели задач
+Comment[rw]=Kuboneza umurongoibikorwa w'umwanya
+Comment[se]=Dáppe sáhtát heivehit panela bargoholgga.
+Comment[sk]=Tu môžete nastaviť vlastnosti panelu úloh
+Comment[sl]=Nastavite opravilno vrstico pulta
+Comment[sr]=Подешавање панела са списком послова
+Comment[sr@Latn]=Podešavanje panela sa spiskom poslova
+Comment[sv]=Anpassa panelens aktivitetsfält
+Comment[ta]=பலகச் பணிப்பட்டியை வடிவமை
+Comment[tg]=Панели пайраҳаи вазифаро танзим кунед
+Comment[th]=ปรับแต่งถาดหน้าต่างงานของพาเนล
+Comment[tr]=Panel görev çubuğunu yapılandır
+Comment[tt]=Eşlärtirä taqtasın caylaw
+Comment[uk]=Налаштування смужки задач
+Comment[uz]=Vazifalar panelini moslash
+Comment[uz@cyrillic]=Вазифалар панелини мослаш
+Comment[vi]=Cấu hình thanh tác vụ
+Comment[wa]=Apontyî li scriftôr bår des bouyes
+Comment[zh_CN]=配置面板的任务条
+Comment[zh_TW]=您可以在這裡設定面板工作列
+
+Keywords=kicker,panel,kpanel,taskbar,startbar,launchbar,windows
+Keywords[ar]=kicker,لوحة المهام,kpanel,شريط المهام, شريط البدء, شريط التشغيل, النوافذ
+Keywords[az]=kicker,panel,kpanel,vəzifə çubuğu,başlatma çubuğu,başlama çubuğu,pəncərələr
+Keywords[be]=Панэль,Панэль заданняў,Панэль стартавання,Вокны,Акно,kicker,panel,kpanel,taskbar,startbar,launchbar,windows
+Keywords[bg]=системен, панел, задачи, задача, прозорец, kicker, panel, kpanel, taskbar, startbar, launchbar, windows
+Keywords[ca]=kicker,plafó,kpanel,barra de tasques,barra d'inici,barra d'engegar,finestres
+Keywords[cs]=Kicker,Panel,Pruh úloh,Startovací lišta,Spouštěcí lišta,Okna
+Keywords[csb]=kicker,panel,kpanel,lëstew dzejaniów,sztartowô lëstew,zrëszanié,òkna
+Keywords[cy]=kicker,ciciwr,panel,kpanel,bar tasgau,bar cychwyn,bar lawnsio,ffenestri
+Keywords[da]=kicker,panel,kpanel,opgavelinje,startlinje,kørelinje,vinduer
+Keywords[de]=Kicker,Kontrollleiste,Panel,KPanel,Taskbar,Startleiste,Fensterleiste,Startleiste,Fenster
+Keywords[el]=kicker,πίνακας,kpanel,μπάρα εργασιών,μπάρα έναρξης,μπάρα εκκίνησης,παράθυρα
+Keywords[eo]=lanĉilo,panelo,taskostrio,lanĉostrio,fenestroj
+Keywords[es]=kicker,panel,kpanel,barra de tareas,barra de inicio,barra de lanzamiento,ventanas
+Keywords[et]=kicker,paneel,kpanel,tegumiriba,käivitusriba,aknad
+Keywords[eu]=kicker,panela,kpanela,ataza-barra,hasiera-barra,abiatze-barra,leihoak
+Keywords[fa]=kicker، تابلو، kpanel، میله تکلیف، میله آغازه میله راه‌اندازی، پنجره‌ها
+Keywords[fi]=kicker,paneeli,kpanel,tehtäväpalkki,käynnistys,käynnistyspalkki,ikkunat
+Keywords[fr]=kicker,tableau de bord,kpanel,barre des tâches,barre de démarrage,barre de lancement,fenêtres
+Keywords[fy]=kicker,panel,paniel,kpanel,taakbalke,startbalk,Begjinbalke,startmenu,finsters
+Keywords[gl]=kicker,painel,kpanel,barra de tarefas,startbar,launchbar,windows
+Keywords[he]=לוח,שורת משימות,שורת התחל,שורת הפעלה,חלונות, kicker,panel,kpanel,taskbar,startbar,launchbar,windows
+Keywords[hi]=किकर,फलक,केपेनल,औज़ार-पट्टी,प्रारंभ-पट्टी,चालक-पट्टी,विंडो
+Keywords[hr]=kicker,panel,kpanel,taskbar,startbar,launchbar,ploča,prozori,traka zadataka,ploča,traka pokretanja,windows
+Keywords[hu]=Kicker,panel,kpanel,feladatlista,indítómenü,ablakok
+Keywords[is]=spjald,kspjald,tækjaslá,forritaslá,gluggar,ræsingarslá
+Keywords[it]=kicker,pannello,kpanel,barra delle applicazioni,barra di avvio,finestre
+Keywords[ja]=kicker,パネル,kpanel,タスクバー,スタートバー,ラウンチバー,ウィンドウ
+Keywords[km]=kicker,បន្ទះ,kpanel,របារ​ភារកិច្ច,របារ​បើក​ដំណើរការ,បង្អួច
+Keywords[lt]=kicker,pultas,kpanel,užduočių juosta,startavimo juosta,paleisties juosta
+Keywords[lv]=kikers,panelis,kpanelis,uzdevumjosla,startjosla,palaišanasjosla,logi
+Keywords[mk]=kicker,panel,kpanel,taskbar,startbar,launchbar,windows,панел,прозорци
+Keywords[mn]=Kicker,Удирдах самбар,Самбар,KPanel,Taskbar,Эхлэл самбар,Цонхны самбар,Эхлэл самбар,Цонх
+Keywords[ms]=kicker,panel, kpanel, 'taskbar', bar mula, bar pelancar, tetingkap
+Keywords[nb]=kicker,panel,kpanel,oppgavelinje,startlinje,kjørelinje,programlinje,vinduer
+Keywords[nds]=kicker,Paneel,kpanel,Opgavenbalken,Startbalken,starten,Fnstern
+Keywords[ne]=हान्ने, प्यानल, के प्यानल, कार्यपट्टी, सुरुपट्टी, सुरुआतपट्टी, सञ्झ्याल
+Keywords[nl]=kicker,panel,paneel,kpanel,takenbalk,startbalk,launchbar,startmenu,vensters,taakbalk
+Keywords[nn]=kicker,panel,kpanel,oppgåvelinje,startlinje,programlinje,vindauge
+Keywords[nso]=seragi,panel,kpanel,bar ya mosongwana,bar ya thomiso,bar ya ngwadisoleswa,windows
+Keywords[pa]=kicker,panel,kpanel,taskbar,startbar,launchbar,windows,ਪੈਨਲ,ਕੇਪੈਨਲ,ਝਰੋਖੇ,ਸਥਿਤੀ-ਪੱਟੀ
+Keywords[pl]=kicker,panel,kpanel,pasek zadań,pasek startu,uruchamianie,okna
+Keywords[pt]=kicker,painel,kpanel,barra de tarefas,barra de arranque,janelas
+Keywords[pt_BR]=kicker,painel,kpanel,barra de tarefas,barra de início,barra de lançamento,janelas
+Keywords[ro]=kicker,panou,kpanel,bară de procese,bară de start,pornire,ferestre
+Keywords[ru]=kicker,panel,kpanel,taskbar,startbar,launchbar,windows,окно,панель
+Keywords[rw]=igitera,umwanya,k-umwanya,umurongoibikorwa,umurongogutangira,umurongogutangiza,amadirishya
+Keywords[se]=kicker,panela,kpanel,bargoholga,álggahanholga,láset
+Keywords[sk]=kicker,panel,kpanel,taskbar,startbar,launchbar,okná
+Keywords[sl]=kicker,panel,kpanel,opravilna vrstica,začetna vrstica,izstrelišče,okna
+Keywords[sr]=kicker,panel,kpanel,taskbar,startbar,launchbar,windows,панел,послови,трака задатака
+Keywords[sr@Latn]=kicker,panel,kpanel,taskbar,startbar,launchbar,windows,panel,poslovi,traka zadataka
+Keywords[sv]=kicker,panel,kpanel,aktivitetsfält,startrad,programrad,fönster
+Keywords[ta]= கிக்கர், பலகம்.kபலகம்,பணிப்பட்டி,துவக்கபட்டி, வெளியீட்டுப்பட்டி, சாளரம்
+Keywords[th]=kicker,ถาดพาเนล,kpanel,taskbar,startbar,แถบเรียกใช้งานด่วน,หน้าต่าง
+Keywords[tr]=kicker,panel,kpanel,görev çubuğu,başlangıç çubuğu,yükleme çubuğu,pencere,pencereler
+Keywords[uk]=kicker,панель,панель,kpanel,смужка задач,панель запуску,стартова панель,вікна
+Keywords[uz]=kicker,kpanel,panel,oynalar,vazifalar paneli
+Keywords[uz@cyrillic]=kicker,kpanel,панел,ойналар,вазифалар панели
+Keywords[ven]=murahi,phanele,phanele ya k,bara ya mushumo,thomani bara,thoma bara,dziwindo
+Keywords[vi]=kích hoạt,bảng điều khiển,bảng điều khiển KDE,thanh tác vụ,thanh khởi động,cửa sổ
+Keywords[wa]=kicker,kpanel,bår des bouyes,bår d' enondaedje,purneas
+Keywords[xh]=umkhabi,iwindowe eneenkcukacha,kpanel,ibar yomsebenzi,ibar yokuqalisa,ibar yelaunch,i windows
+Keywords[zh_CN]=kicker,panel,kpanel,taskbar,startbar,launchbar,windows,面板,任务栏,启动栏
+Keywords[zh_TW]=kicker,panel,kpanel,taskbar,startbar,launchbar,windows,控制面板,工作列,狀態列,快捷列,視窗
+Keywords[zu]=kicker,iwindi lemininingwane,kpanel,ibha yemisebenzi, ibha yokuqala,ibha yokuqalisa,ama-window
+
+Categories=Qt;KDE;X-KDE-settings-desktop;
diff --git a/kcontrol/taskbar/kcmtaskbar.h b/kcontrol/taskbar/kcmtaskbar.h
new file mode 100644
index 000000000..6fd28e92d
--- /dev/null
+++ b/kcontrol/taskbar/kcmtaskbar.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2000 Kurt Granroth <granroth@kde.org>
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#ifndef __kcmtaskbar_h__
+#define __kcmtaskbar_h__
+
+#include <qvaluelist.h>
+
+#include <kcmodule.h>
+
+class TaskbarConfigUI;
+
+class TaskbarAppearance
+{
+ public:
+ typedef QValueList<TaskbarAppearance> List;
+
+ TaskbarAppearance();
+ TaskbarAppearance(QString name,
+ bool drawButtons,
+ bool haloText,
+ bool showButtonOnHover);
+
+ bool matchesSettings() const;
+ void alterSettings() const;
+ QString name() const { return m_name; }
+
+ private:
+ QString m_name;
+ bool m_drawButtons;
+ bool m_haloText;
+ bool m_showButtonOnHover;
+};
+
+class TaskbarConfig : public KCModule
+{
+ Q_OBJECT
+
+public:
+ TaskbarConfig(QWidget *parent = 0, const char* name = 0,
+ const QStringList &list = QStringList());
+
+public slots:
+ void load();
+ void save();
+ void defaults();
+
+protected slots:
+ void slotUpdateComboBox();
+ void appearanceChanged(int);
+ void notChanged();
+ void slotUpdateCustomColors();
+
+private:
+ TaskbarAppearance::List m_appearances;
+ void updateAppearanceCombo();
+ static const QStringList& actionList();
+ static QStringList i18nActionList();
+ static const QStringList& groupModeList();
+ static QStringList i18nGroupModeList();
+ TaskbarConfigUI *m_widget;
+};
+
+#endif
diff --git a/kcontrol/taskbar/kcmtaskbarui.ui b/kcontrol/taskbar/kcmtaskbarui.ui
new file mode 100644
index 000000000..d234683ca
--- /dev/null
+++ b/kcontrol/taskbar/kcmtaskbarui.ui
@@ -0,0 +1,482 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>TaskbarConfigUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>TaskbarConfigUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>358</width>
+ <height>351</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Taskbar</string>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>taskbarGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Taskbar</string>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>kcfg_SortByDesktop</cstring>
+ </property>
+ <property name="text">
+ <string>Sort windows by desk&amp;top</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Selecting this option causes the taskbar to show windows in order of the desktop they appear on.
+
+By default this option is selected.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>kcfg_ShowAllWindows</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Show windows from all desktops</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Turning this option off will cause the taskbar to display &lt;b&gt;only&lt;/b&gt; the windows on the current desktop.
+
+By default, this option is selected and all windows are shown.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="6" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>kcfg_ShowWindowListBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Show window list &amp;button</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Selecting this option causes the taskbar to display a button that, when clicked, shows a list of all windows in a popup menu.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="7" column="2">
+ <property name="name">
+ <cstring>kcfg_GroupTasks</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The taskbar can group similar windows into single buttons. When one of these window group buttons are clicked on a menu appears showing all the windows in that group. This can be especially useful with the &lt;em&gt;Show all windows&lt;/em&gt; option.
+
+You can set the taskbar to &lt;strong&gt;Never&lt;/strong&gt; group windows, to &lt;strong&gt;Always&lt;/strong&gt; group windows or to group windows only &lt;strong&gt;When the Taskbar is Full&lt;/strong&gt;.
+
+By default the taskbar groups windows when it is full.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="7" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>groupTasksLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Group similar tasks:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kcfg_GroupTasks</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>kcfg_ShowOnlyIconified</cstring>
+ </property>
+ <property name="text">
+ <string>Show o&amp;nly minimized windows</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select this option if you want the taskbar to display &lt;b&gt;only&lt;/b&gt; minimized windows.
+
+By default, this option is not selected and the taskbar will show all windows.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="5" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>kcfg_ShowIcon</cstring>
+ </property>
+ <property name="text">
+ <string>Sho&amp;w application icons</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select this option if you want window icons to appear along with their titles in the taskbar.
+
+By default this option is selected.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>showAllScreens</cstring>
+ </property>
+ <property name="text">
+ <string>Show windows from all sc&amp;reens</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Turning this option off will cause the taskbar to display &lt;b&gt;only&lt;/b&gt; windows which are on the same Xinerama screen as the taskbar.
+
+By default, this option is selected and all windows are shown.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="8" column="2">
+ <property name="name">
+ <cstring>appearance</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="8" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>A&amp;ppearance:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>appearance</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="9" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>kcfg_UseCustomColors</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Use &amp;custom colors</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="10" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>spacer11_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>191</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KColorButton" row="0" column="1">
+ <property name="name">
+ <cstring>kcfg_InactiveTaskTextColor</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>191</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KColorButton" row="2" column="1">
+ <property name="name">
+ <cstring>kcfg_TaskBackgroundColor</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>taskBackgroundColorLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Background color:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kcfg_TaskBackgroundColor</cstring>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="1" column="1">
+ <property name="name">
+ <cstring>kcfg_ActiveTaskTextColor</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>inactiveTaskTextColorLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Inacti&amp;ve task text color:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kcfg_InactiveTaskTextColor</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>activeTaskTextColorLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Active task te&amp;xt color:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kcfg_ActiveTaskTextColor</cstring>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>191</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>kcfg_SortByApp</cstring>
+ </property>
+ <property name="text">
+ <string>Sort alphabeticall&amp;y by application name</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Actions</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>leftButtonLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Left button:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kcfg_LeftButtonAction</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>middleButtonLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Middle button:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kcfg_MiddleButtonAction</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>rightButtonLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Right b&amp;utton:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kcfg_RightButtonAction</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>kcfg_LeftButtonAction</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <property name="name">
+ <cstring>kcfg_MiddleButtonAction</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="1">
+ <property name="name">
+ <cstring>kcfg_RightButtonAction</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>kcfg_ShowAllWindows</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>kcfg_SortByDesktop</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>kcfg_ShowAllWindows</tabstop>
+ <tabstop>kcfg_SortByDesktop</tabstop>
+ <tabstop>showAllScreens</tabstop>
+ <tabstop>kcfg_SortByApp</tabstop>
+ <tabstop>kcfg_ShowOnlyIconified</tabstop>
+ <tabstop>kcfg_ShowIcon</tabstop>
+ <tabstop>kcfg_ShowWindowListBtn</tabstop>
+ <tabstop>kcfg_GroupTasks</tabstop>
+ <tabstop>appearance</tabstop>
+ <tabstop>kcfg_UseCustomColors</tabstop>
+ <tabstop>kcfg_InactiveTaskTextColor</tabstop>
+ <tabstop>kcfg_ActiveTaskTextColor</tabstop>
+ <tabstop>kcfg_TaskBackgroundColor</tabstop>
+ <tabstop>kcfg_LeftButtonAction</tabstop>
+ <tabstop>kcfg_MiddleButtonAction</tabstop>
+ <tabstop>kcfg_RightButtonAction</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kcontrol/taskbar/uninstall.desktop b/kcontrol/taskbar/uninstall.desktop
new file mode 100644
index 000000000..e1e3e1732
--- /dev/null
+++ b/kcontrol/taskbar/uninstall.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
diff --git a/kcontrol/usbview/Makefile.am b/kcontrol/usbview/Makefile.am
new file mode 100644
index 000000000..e43934b70
--- /dev/null
+++ b/kcontrol/usbview/Makefile.am
@@ -0,0 +1,21 @@
+kde_module_LTLIBRARIES = kcm_usb.la
+
+kcm_usb_la_SOURCES = kcmusb.cpp usbdevices.cpp usbdb.cpp
+
+kcm_usb_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_usb_la_LIBADD = $(LIB_KDEUI)
+
+AM_CPPFLAGS= $(all_includes)
+
+METASOURCES = AUTO
+
+messages:
+ $(XGETTEXT) *.cpp *.i18n -o $(podir)/kcmusb.pot
+
+xdg_apps_DATA = kcmusb.desktop
+
+if install_usbids
+usb_DATA = usb.ids
+usbdir = $(kde_datadir)/kcmusb
+endif
+
diff --git a/kcontrol/usbview/classes.i18n b/kcontrol/usbview/classes.i18n
new file mode 100644
index 000000000..e54d126cc
--- /dev/null
+++ b/kcontrol/usbview/classes.i18n
@@ -0,0 +1,48 @@
+i18n("AT-commands")
+i18n("ATM Networking")
+i18n("Abstract (modem)")
+i18n("Audio")
+i18n("Bidirectional")
+i18n("Boot Interface Subclass")
+i18n("Bulk (Zip)")
+i18n("CAPI 2.0")
+i18n("CAPI Control")
+i18n("CDC PUF")
+i18n("Communications")
+i18n("Control Device")
+i18n("Control/Bulk")
+i18n("Control/Bulk/Interrupt")
+i18n("Data")
+i18n("Direct Line")
+i18n("Ethernet Networking")
+i18n("Floppy")
+i18n("HDLC")
+i18n("Host Based Driver")
+i18n("Hub")
+i18n("Human Interface Devices")
+i18n("I.430 ISDN BRI")
+i18n("Interface")
+i18n("Keyboard")
+i18n("Mass Storage")
+i18n("Mouse")
+i18n("Multi-Channel")
+i18n("No Subclass")
+i18n("Non Streaming")
+i18n("None")
+i18n("Printer")
+i18n("Q.921")
+i18n("Q.921M")
+i18n("Q.921TM")
+i18n("Q.932 EuroISDN")
+i18n("SCSI")
+i18n("Streaming")
+i18n("Telephone")
+i18n("Transparent")
+i18n("Unidirectional")
+i18n("V.120 V.24 rate ISDN")
+i18n("V.42bis")
+i18n("Vendor Specific")
+i18n("Vendor Specific Class")
+i18n("Vendor Specific Protocol")
+i18n("Vendor Specific Subclass")
+i18n("Vendor specific")
diff --git a/kcontrol/usbview/configure.in.in b/kcontrol/usbview/configure.in.in
new file mode 100644
index 000000000..66271f7c2
--- /dev/null
+++ b/kcontrol/usbview/configure.in.in
@@ -0,0 +1,16 @@
+case "$host" in
+ *-*-linux*|*-*-freebsd*|*-*-kfreebsd*-gnu)
+ FOUND_USBVIEW=yes
+ ;;
+esac
+
+AM_CONDITIONAL(include_kcontrol_usbview, test "$FOUND_USBVIEW" = "yes")
+
+AC_ARG_WITH([usbids], AC_HELP_STRING([--with-usbids=PATH], [Use the usb.ids file at the specified path, instead of the local copy]))
+
+if test "x$with_usbids" != "x" && test "x$with_usbids" != "xno"; then
+ AC_DEFINE_UNQUOTED(USBIDS_FILE, "$with_usbids", [Path for the usb.ids file to use])
+ dont_install_usbids="yes"
+fi
+
+AM_CONDITIONAL(install_usbids, test "x$dont_install_usbids" != "xyes")
diff --git a/kcontrol/usbview/kcmusb.cpp b/kcontrol/usbview/kcmusb.cpp
new file mode 100644
index 000000000..24cb1f1bd
--- /dev/null
+++ b/kcontrol/usbview/kcmusb.cpp
@@ -0,0 +1,192 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Matthias Hoelzer-Kluepfel <mhk@caldera.de> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <qgroupbox.h>
+#include <qheader.h>
+#include <qlayout.h>
+#include <qlistview.h>
+#include <qsplitter.h>
+#include <qtextview.h>
+#include <qtimer.h>
+
+#include <kaboutdata.h>
+#include <kdialog.h>
+#include <kgenericfactory.h>
+
+#include "usbdevices.h"
+#include "kcmusb.moc"
+
+typedef KGenericFactory<USBViewer, QWidget > USBFactory;
+K_EXPORT_COMPONENT_FACTORY (kcm_usb, USBFactory("kcmusb") )
+
+USBViewer::USBViewer(QWidget *parent, const char *name, const QStringList &)
+ : KCModule(USBFactory::instance(), parent, name)
+{
+ setButtons(Help);
+
+ setQuickHelp( i18n("<h1>USB Devices</h1> This module allows you to see"
+ " the devices attached to your USB bus(es)."));
+
+ QVBoxLayout *vbox = new QVBoxLayout(this, 0, KDialog::spacingHint());
+ QGroupBox *gbox = new QGroupBox(i18n("USB Devices"), this);
+ gbox->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(gbox);
+
+ QVBoxLayout *vvbox = new QVBoxLayout(gbox->layout(), KDialog::spacingHint());
+
+ QSplitter *splitter = new QSplitter(gbox);
+ vvbox->addWidget(splitter);
+
+ _devices = new QListView(splitter);
+ _devices->addColumn(i18n("Device"));
+ _devices->setRootIsDecorated(true);
+ _devices->header()->hide();
+ _devices->setMinimumWidth(200);
+ _devices->setColumnWidthMode(0, QListView::Maximum);
+
+ QValueList<int> sizes;
+ sizes.append(200);
+ splitter->setSizes(sizes);
+
+ _details = new QTextView(splitter);
+
+ splitter->setResizeMode(_devices, QSplitter::KeepSize);
+
+ QTimer *refreshTimer = new QTimer(this);
+ // 1 sec seems to be a good compromise between latency and polling load.
+ refreshTimer->start(1000);
+
+ connect(refreshTimer, SIGNAL(timeout()), SLOT(refresh()));
+ connect(_devices, SIGNAL(selectionChanged(QListViewItem*)),
+ this, SLOT(selectionChanged(QListViewItem*)));
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmusb"), I18N_NOOP("KDE USB Viewer"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2001 Matthias Hoelzer-Kluepfel"));
+
+ about->addAuthor("Matthias Hoelzer-Kluepfel", 0, "mhk@kde.org");
+ about->addCredit("Leo Savernik", "Live Monitoring of USB Bus", "l.savernik@aon.at");
+ setAboutData( about );
+
+ load();
+}
+
+void USBViewer::load()
+{
+ _items.clear();
+ _devices->clear();
+
+ refresh();
+}
+
+static Q_UINT32 key( USBDevice &dev )
+{
+ return dev.bus()*256 + dev.device();
+}
+
+static Q_UINT32 key_parent( USBDevice &dev )
+{
+ return dev.bus()*256 + dev.parent();
+}
+
+static void delete_recursive( QListViewItem *item, const QIntDict<QListViewItem> &new_items )
+{
+ if (!item)
+ return;
+
+ QListViewItemIterator it( item );
+ while ( it.current() ) {
+ if (!new_items.find(it.current()->text(1).toUInt())) {
+ delete_recursive( it.current()->firstChild(), new_items);
+ delete it.current();
+ }
+ ++it;
+ }
+}
+
+void USBViewer::refresh()
+{
+ QIntDict<QListViewItem> new_items;
+
+ if (!USBDevice::parse("/proc/bus/usb/devices"))
+ USBDevice::parseSys("/sys/bus/usb/devices");
+
+ int level = 0;
+ bool found = true;
+
+ while (found)
+ {
+ found = false;
+
+ QPtrListIterator<USBDevice> it(USBDevice::devices());
+ for ( ; it.current(); ++it)
+ if (it.current()->level() == level)
+ {
+ Q_UINT32 k = key(*it.current());
+ if (level == 0)
+ {
+ QListViewItem *item = _items.find(k);
+ if (!item) {
+ item = new QListViewItem(_devices,
+ it.current()->product(),
+ QString::number(k));
+ }
+ new_items.insert(k, item);
+ found = true;
+ }
+ else
+ {
+ QListViewItem *parent = new_items.find(key_parent(*it.current()));
+ if (parent)
+ {
+ QListViewItem *item = _items.find(k);
+
+ if (!item) {
+ item = new QListViewItem(parent,
+ it.current()->product(),
+ QString::number(k) );
+ }
+ new_items.insert(k, item);
+ parent->setOpen(true);
+ found = true;
+ }
+ }
+ }
+
+ ++level;
+ }
+
+ // recursive delete all items not in new_items
+ delete_recursive( _devices->firstChild(), new_items );
+
+ _items = new_items;
+
+ if (!_devices->selectedItem())
+ selectionChanged(_devices->firstChild());
+}
+
+
+void USBViewer::selectionChanged(QListViewItem *item)
+{
+ if (item)
+ {
+ Q_UINT32 busdev = item->text(1).toUInt();
+ USBDevice *dev = USBDevice::find(busdev>>8, busdev&255);
+ if (dev)
+ {
+ _details->setText(dev->dump());
+ return;
+ }
+ }
+ _details->clear();
+}
+
+
diff --git a/kcontrol/usbview/kcmusb.desktop b/kcontrol/usbview/kcmusb.desktop
new file mode 100644
index 000000000..0ae4500f2
--- /dev/null
+++ b/kcontrol/usbview/kcmusb.desktop
@@ -0,0 +1,240 @@
+[Desktop Entry]
+Icon=usb
+Type=Application
+DocPath=kinfocenter/usb/index.html
+Exec=kcmshell kcmusb
+
+X-KDE-Library=usb
+X-KDE-ParentApp=kinfocenter
+
+Name=USB Devices
+Name[af]=USB Toestelle
+Name[ar]=أجهزة USB
+Name[az]=USB Avadanlıqlar
+Name[be]=Прылады USB
+Name[bg]=USB
+Name[bn]=ইউ-এস-বি ডিভাইস
+Name[br]=Trobarzhelloù USB
+Name[bs]=USB uređaji
+Name[ca]=Dispositius USB
+Name[cs]=USB zařízení
+Name[csb]=Ùrządzenia USB
+Name[cy]=Dyfeisiau USB
+Name[da]=USB-enheder
+Name[de]=USB-Geräte
+Name[el]=Συσκευές USB
+Name[eo]=USB-aparatoj
+Name[es]=Dispositivos USB
+Name[et]=USB seadmed
+Name[eu]=USB gailuak
+Name[fa]=دستگاههای گذرگاه سریال جهانی
+Name[fi]=USB-laitteet
+Name[fr]=Périphériques USB
+Name[fy]=USB-apparaten
+Name[ga]=Gléasanna USB
+Name[gl]=Dispositivos USB
+Name[he]=התקני USB
+Name[hi]=यूएसबी औज़ार
+Name[hr]=USB uređaji
+Name[hu]=USB-eszközök
+Name[is]=USB Tæki
+Name[it]=Dispositivi USB
+Name[ja]=USB デバイス
+Name[ka]=USB მოწყობილობები
+Name[kk]=USB құрылғылар
+Name[km]=ឧបករណ៍ USB
+Name[ko]=USB 장치
+Name[lo]=ອຸປະກອນ USB
+Name[lt]=USB įrenginiai
+Name[lv]=USB Iekārtas
+Name[mk]=USB-уреди
+Name[mn]=USB-Төхөөрөмж
+Name[ms]=Peranti USB
+Name[mt]=Apparat USB
+Name[nb]=USB-enheter
+Name[nds]=USB-Reedschappen
+Name[ne]=USB यन्त्र
+Name[nl]=USB-apparaten
+Name[nn]=USB-einingar
+Name[nso]=Maano a USB
+Name[pa]=USB ਜੰਤਰ
+Name[pl]=Urządzenia USB
+Name[pt]=Dispositivos USB
+Name[pt_BR]=Dispositivos USB
+Name[ro]=Dispozitive USB
+Name[ru]=Устройства USB
+Name[rw]=Apareye USB
+Name[se]=USB-ovttadagat
+Name[sk]=Zariadenia USB
+Name[sl]=Naprave USB
+Name[sr]=USB уређаји
+Name[sr@Latn]=USB uređaji
+Name[ss]=Tisetgjentiswa te USB
+Name[sv]=USB-enheter
+Name[ta]=USB சாதனங்கள்
+Name[te]=యూ ఎస్ బి పరికరాలు
+Name[tg]=Дастгоҳҳои USB
+Name[th]=อุปกรณ์ USB
+Name[tr]=USB Aygıtları
+Name[tt]=USB Cıhazlar
+Name[uk]=Пристрої USB
+Name[uz]=USB uskunalar
+Name[uz@cyrillic]=USB ускуналар
+Name[ven]=Maano a USB
+Name[vi]=Các thiết bị USB
+Name[wa]=Éndjins USB
+Name[xh]=Amacebo e USB
+Name[zh_CN]=USB 设备
+Name[zh_TW]=USB 裝置
+Name[zu]=Amathuluzi anenjongo e-USB
+
+Comment=View the USB devices attached to this computer
+Comment[af]=Besigtig die Usb toestelle gekoppelde na hierdie rekenaar
+Comment[ar]=أعرض أجهزة USB الموصولة في جهازك
+Comment[az]=Kompüterdəki USB avadanlıqları göstər
+Comment[be]=Паказвае прылады USB, далучаныя да гэтага кампутара
+Comment[bg]=Информация за USB устройствата
+Comment[bn]=এই কমপিউটারের সঙ্গে সংযুক্ত ইউ-এস-বি ডিভাইসগুলির তালিকা
+Comment[br]=Sellout ouzh trobarzhelloù USB kevreet ouzh an urzhiataer-mañ
+Comment[bs]=Pregledajte USB uređaje priključene na ovaj računar
+Comment[ca]=Veure els dispositius USB connectats a aquest ordinador
+Comment[cs]=Zobrazení USB zařízení připojených k tomuto počítači
+Comment[csb]=Wëdowiédzô ò ùrządzeniach USB przëłączonëch do tegò kòmpùtra
+Comment[cy]=Edrych ar y dyfeisiau USB sydd wedi eu cysylltu a'r cyfrifiadur
+Comment[da]=Se USB-enheder forbundet til denne computer
+Comment[de]=Die USB-Geräte anzeigen, die an den Rechner angeschlossen sind
+Comment[el]=Προβολή των συνδεδεμένων στο σύστημα συσκευών USB
+Comment[eo]=Montras la USB-aparatojn ĉe via komputilo
+Comment[es]=Muestra los dispositivos USB conectados a este equipo
+Comment[et]=Arvutiga ühendatud USB seadmete vaatamine
+Comment[eu]=Ikusi ordenagailu honetan konektaturik dauden USB gailuak
+Comment[fa]=نمای دستگاههای USB پیوست‌شده به این رایانه
+Comment[fi]=Näyttää tietokoneeseen liitetyt USB-laitteet
+Comment[fr]=Affiche les périphériques USB attachés à cet ordinateur
+Comment[fy]=Hjir konne jo de USB-apparaten besjen die op dizze kompjûter oansluten binne
+Comment[ga]=Taispeáin na gléasanna USB ceangailte leis an ríomhaire seo
+Comment[gl]=Ver os dispositivos USB conectados a este computador
+Comment[he]=מידע על התקני ה־USB המחוברים למחשב זה
+Comment[hi]=इस कम्प्यूटर से जुड़े यूएसबी औज़ारों को देखे
+Comment[hr]=Pregled USB uređaja spojenih na računalo
+Comment[hu]=Az USB-eszközök jellemzői
+Comment[is]=SKoða USB tækin sem eru tengd við þessa tölvu
+Comment[it]=Mostra i dispositivi USB collegati a questo computer
+Comment[ja]=コンピュータに接続されている USB デバイスの情報
+Comment[ka]=თქვენი კომპიუტერის USB მოწყობილობები
+Comment[kk]=Компьютерга тіркелген USB құрылғылары
+Comment[km]=មើល​ឧបករណ៍ USB ដែល​បាន​ភ្ជាប់​មក​កុំព្យូទ័រ​នេះ
+Comment[ko]=이 컴퓨터에 연결된 USB 장치 표시
+Comment[lo]=ສະແດງອຸປະກອນ USB ທີ່ເຊື່ອມຕໍ່ກັບຄອມພິວເຕີເຄື່ອງນີ້
+Comment[lt]=Žiūrėkite, kokie USB įrengimai prijungti prie šio kompiuterio
+Comment[lv]=Skatīt datoram pievienotās USB iekārtas
+Comment[mk]=Видете ги USB-уредите закачени на овој компјутер
+Comment[mn]=Энэ компьютерт залгагдсан USB-төхөөрөмж харуулах
+Comment[ms]=Papar peranti USB yang dilekapkan pada komputer
+Comment[mt]=Ara l-apparat USB imqabbad ma' dal-kompjuter
+Comment[nb]=Se hvilke USB-enheter som er koblet til denne maskinen
+Comment[nds]=de USB-Reedschappen ankieken, de dissen Reekner tokoppelt sünd
+Comment[ne]=यो कम्प्युटरमा सङ्लग्न गरिएका USB यन्त्र देखाउनुहोस्
+Comment[nl]=Hier kunt u de USB-apparaten die op deze computer zijn aangesloten bekijken
+Comment[nn]=Viser USB-einingane knytte til datamaskina
+Comment[nso]=Bona maano a USB ao a kgwathisitswego go computer ye
+Comment[pa]=ਇਸ ਕੰਪਿਊਟਰ ਨਾਲ ਜੁੜੇ USB ਜੰਤਰ ਵੇਖੋ
+Comment[pl]=Informacja o urządzeniach USB podłączonych do tego komputera
+Comment[pt]=Ver os dispositivos USB ligados a este computador
+Comment[pt_BR]=Ver os dispositivos USB conectados à este computador
+Comment[ro]=Afișează dispozitivele USB conectate la acest calculator
+Comment[ru]=Устройства USB вашего компьютера
+Comment[rw]=Kugaragaza apareye USB zifashe kuri mudasobwa
+Comment[se]=Čájeha USB-ovttadagaid mat leat laktašuvvan dihtoriidat
+Comment[sk]=Zobrazenie zariadení USB pripojených k tomuto počítači
+Comment[sl]=Prikaz naprav USB, ki so priključene na ta računalnik
+Comment[sr]=Прикажи USB уређаје повезане на овај рачунар
+Comment[sr@Latn]=Prikaži USB uređaje povezane na ovaj računar
+Comment[sv]=Visa USB-enheter anslutna till datorn
+Comment[ta]=கணினியோடு இணைக்கப்பட்ட யூ எஸ் பி சாதனங்களை பார்
+Comment[tg]= Намоиши дастгоҳҳои USB мутассал ба ин система
+Comment[th]=ดูอุปกรณ์ USB ที่เชื่อมต่ออยู่กับคอมพิวเตอร์เครื่องนี้
+Comment[tr]=Bu bilgisayara bağlanmış USB aygıtlarını gör
+Comment[tt]=Bu sanaqqa totaşqan USB cıhazlarnı qaraw
+Comment[uk]=Перегляд пристроїв USB, під'єднаних до комп'ютера
+Comment[uz]=Kompyuterga ulangan USB uskunalarni koʻrish
+Comment[uz@cyrillic]=Компьютерга уланган USB ускуналарни кўриш
+Comment[ven]=Sedzani maano a USB o tumanywaho na khomupwutha ino
+Comment[vi]=Xem các thiết bị USB nối với máy tính này
+Comment[wa]=Vey les éndjins USB raloyîs a cisse copiutrece chal
+Comment[xh]=Bonisela amacebo e USB afakelwe kule khompyutha
+Comment[zh_CN]=查看连接到该计算机的 USB 设备
+Comment[zh_TW]=查看連接到這台電腦的 USB 裝置
+Comment[zu]=Buka amathuluzi e-USB ananyathiselwe kule khomputha
+
+Keywords=USB,devices,viewer,control
+Keywords[ar]=USB,أجهزة,عارض,متحكم
+Keywords[az]=USB,avadanlıqlar,göstərici,idarə
+Keywords[be]=Прылады,Прагляд,Праглядальнік,Кіраванне,USB,devices,viewer,control
+Keywords[bg]=информация, система, системна, устройства, контрол, USB, devices, viewer, control
+Keywords[br]=USB,trobarzhelloù,gweller,ren
+Keywords[ca]=USB,dispositius,visor,control
+Keywords[cs]=USB,zařízení,prohlížeč,ovládání
+Keywords[csb]=USB,ùrządzenia,przezérnik,kòntrola
+Keywords[cy]=USB,dyfeisiau,gwelydd,gwyliwr,rheoli
+Keywords[da]=USB,enheder,fremviser,kontrol
+Keywords[de]=USB,Geräte
+Keywords[el]=USB,συσκευές,προβολέας,έλεγχος
+Keywords[eo]=USB,aparatoj,rigardilo,stirado
+Keywords[es]=USB,dispositivos,visor,control
+Keywords[et]=USB,seadmed,vaataja,juhtimine
+Keywords[eu]=USB,gailuak,ikustailua,kontrola
+Keywords[fa]=USB، دستگاهها، مشاهده‌گر، کنترل
+Keywords[fi]=USB,laitteet,näyttää,ohjaus
+Keywords[fr]=USB,périphériques,afficheur,contrôle
+Keywords[fy]=USB,devices,viewer,control,werjefteprogramma
+Keywords[ga]=USB,gléasanna,amharcán,rialú
+Keywords[gl]=USB,dispositivos,visor,control
+Keywords[he]=התקנים,מציג,בקרה,USB, devices,viewer,control
+Keywords[hi]=यूएसबी,औज़ार,प्रदर्शक,नियंत्रण
+Keywords[hr]=USB,devices,viewer,control,uređaji,preglednik,upravljanje
+Keywords[hu]=USB,eszközök,megnézés,vezérlés
+Keywords[is]=USB,tæki,skoðari,stilling
+Keywords[it]=USB,dispositivi,controllo
+Keywords[ja]=USB,デバイス,ビューア,コントロール
+Keywords[km]=USB,ឧបករណ៍,កម្មវិធី​មើល,បញ្ជា
+Keywords[lo]=ອຸປະກອນUSB,ອຸປະກອນ,ຕົວສະແດງຜົນ,ຄວບຄຸມ
+Keywords[lt]=USB,devices,viewer,control, įrengimai, žiūriklis, kontrolė
+Keywords[lv]=USB,iekārtas,skatītājs,vadība
+Keywords[mk]=USB,devices,viewer,control,уреди,прегледник,контрола
+Keywords[mn]=USB,Төхөөрөмж
+Keywords[ms]=USB,peranti, pemapar, kawalan
+Keywords[nb]=USB,enheter,fremviser,kontroll
+Keywords[nds]=USB, Reedschappen,Kieker,Kuntrull
+Keywords[ne]=USB,यन्त्र, दर्शक, नियन्त्रण
+Keywords[nl]=USB,devices,viewer,control,weergaveprogramma
+Keywords[nn]=USB,einingar,visar,kontroll
+Keywords[nso]=USB,maano,selebeledi,taolo
+Keywords[pa]=USB,ਜੰਤਰ,ਦਰਸ਼ਕ,ਕੰਟਰੋਲ
+Keywords[pl]=USB,urządzenia,przeglądarka,sterowanie
+Keywords[pt]=USB,dispositivos,visualizador,controlo
+Keywords[pt_BR]=USB,dispositivos,visualizador,controle
+Keywords[ro]=USB,dispozitive,vizualizor,control
+Keywords[ru]=USB,devices,viewer,control,утсройства
+Keywords[rw]=USB,apareye,mugaragaza,igenzura
+Keywords[se]=USB,ovttadagat,čájeheaddji,stivren
+Keywords[sk]=USB,zariadenie,prehliadač,ovládanie
+Keywords[sl]=USB,naprave,pregledovalnik,nadzor
+Keywords[sr]=USB,devices,viewer,control,уређаји,контрола,преглед
+Keywords[sr@Latn]=USB,devices,viewer,control,uređaji,kontrola,pregled
+Keywords[sv]=USB,enheter,visare,kontroll
+Keywords[ta]=யூ எஸ் பி,சாதனங்கள்,பார்வையாள்,கட்டுப்பாடு
+Keywords[th]=อุปกรณ์ USB,อุปกรณ์,ตัวแสดงผล,ควบคุม
+Keywords[tr]=USB,aygıtlar,görüntüleyici,kontrol
+Keywords[uk]=USB,пристрої,перегляд,керування
+Keywords[uz]=USB,uskunalar,koʻruvchi,boshqaruv
+Keywords[uz@cyrillic]=USB,ускуналар,кўрувчи,бошқарув
+Keywords[ven]=USB,Maano,musedzi,langula
+Keywords[vi]=USB,thiết bị,xem,điều khiển
+Keywords[wa]=USB,éndjins,håyneu,contrôle,corwaitaedje
+Keywords[xh]=USB,amacebo,umboniseli,ulawula
+Keywords[zh_CN]=USB,devices,viewer,control,设备,查看器,控制
+Keywords[zh_TW]=USB,devices,viewer,control,裝置,檢視器,控制
+Keywords[zu]=USB,amathukuzi ananjongo,umbukisi,lawula
+
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/usbview/kcmusb.h b/kcontrol/usbview/kcmusb.h
new file mode 100644
index 000000000..275431078
--- /dev/null
+++ b/kcontrol/usbview/kcmusb.h
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Matthias Hoelzer-Kluepfel <mhk@caldera.de> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef _KCMUSB_H
+#define _KCMUSB_H
+
+#include <qintdict.h>
+
+#include <kcmodule.h>
+
+class QListView;
+class QListViewItem;
+class QTextView;
+
+
+class USBViewer : public KCModule
+{
+ Q_OBJECT
+
+public:
+
+ USBViewer(QWidget *parent = 0L, const char *name = 0L, const QStringList &list=QStringList() );
+
+ void load();
+
+protected slots:
+
+ void selectionChanged(QListViewItem *item);
+ void refresh();
+
+private:
+
+ QIntDict<QListViewItem> _items;
+ QListView *_devices;
+ QTextView *_details;
+};
+
+
+#endif
diff --git a/kcontrol/usbview/usb.ids b/kcontrol/usbview/usb.ids
new file mode 100644
index 000000000..c2d3e4da9
--- /dev/null
+++ b/kcontrol/usbview/usb.ids
@@ -0,0 +1,6430 @@
+#
+# List of USB ID's
+#
+# Maintained by Stephen J. Gowdy <gowdy@slac.stanford.edu>
+# If you have any new entries, send them to the maintainer.
+# Send entries as patches (diff -u old new).
+# The latest version can be obtained from
+# http://www.linux-usb.org/usb.ids
+#
+# $Id$
+#
+
+# Vendors, devices and interfaces. Please keep sorted.
+
+# Syntax:
+# vendor vendor_name
+# device device_name <-- single tab
+# interface interface_name <-- two tabs
+
+0001 Fry's Electronics
+0002 Ingram
+0003 Club Mac
+0004 Nebraska Furniture Mart
+0204 Chipsbank Microelectronics Co., Ltd
+ 6025 CBM2080 Flash drive controller
+ 6026 CBM1180 Flash drive controller
+0386 LTS
+ 0001 PSX for USB Converter
+03e8 EndPoints, Inc.
+ 0004 SE401 WebCam
+ 0008 101 Ethernet [klsi]
+ 2123 SiPix StyleCam Deluxe
+03e9 Thesys Microelectronics
+03ea Data Broadcasting Corp.
+03eb Atmel Corp.
+ 2002 Mass Storage Device
+ 2015 at90usbkey sample firmware (HID keyboard)
+ 2018 at90usbkey sample firmware (CDC ACM)
+ 2019 stk525 sample firmware (microphone)
+ 201c at90usbkey sample firmware (HID mouse)
+ 201d at90usbkey sample firmware (HID generic)
+ 2022 at90usbkey sample firmware (composite device)
+ 2103 JTAG ICE mkII
+ 2104 AVR ISP mkII
+ 2107 AVR Dragon
+ 2ffb at90usb AVR DFU bootloader
+ 2ffd at89c5130/c5131 DFU bootloader
+ 2fff at89c5132/c51snd1c DFU bootloader
+ 3301 at43301 4-port Hub
+ 3312 4-port Hub
+ 5601 at76c510 Prism-II 802.11b Access Point
+ 5603 Cisco 7920 WiFi IP Phone
+ 6124 at91sam SAMBA bootloader
+ 7603 at76c503a D-Link DWL-120 802.11b Adapter
+ 7605 at76c503a 802.11b Adapter
+ 7606 at76c505 802.11b Adapter
+ 7611 at76c510 rfmd2948 802.11b Access Point
+03ec Iwatsu America, Inc.
+03ed Mitel Corp.
+03ee Mitsumi
+ 0000 CD-R/RW Drive
+ 641f WIF-0402C Bluetooth Adapter
+ 6440 WML-C52APR Bluetooth Adapter
+ 6901 SmartDisk FDD
+03f0 Hewlett-Packard
+ 0004 DeskJet 895c
+ 0101 ScanJet 4100c
+ 0102 PhotoSmart S20
+ 0104 DeskJet 880c/970c
+ 0105 ScanJet 4200c
+ 0107 CD-Writer Plus
+ 010c Multimedia Keyboard Hub
+ 0111 G55xi Printer/Scanner/Copier
+ 011c hn210w 802.11b Adapter
+ 0121 HP49g+ Calculator
+ 0201 ScanJet 6200c
+ 0202 PhotoSmart S20
+ 0204 DeskJet 815c
+ 0205 ScanJet 3300c
+ 0207 CD-Writer Plus 8200e
+ 020c Multimedia Keyboard
+ 0304 DeskJet 810c/812c
+ 0305 ScanJet 4300c
+ 0311 OfficeJet G85xi
+ 0317 LaserJet 1200
+ 0401 ScanJet 5200c
+ 0404 DeskJet 830c/832c
+ 0405 ScanJet 3400cse
+ 0417 LaserJet 1200 series
+ 0504 DeskJet 885c
+ 0505 ScanJet 2100c
+ 050c 5219 Wireless Keyboard
+ 0517 LaserJet 1000
+ 0601 ScanJet 6300c
+ 0604 DeskJet 840c
+ 0605 ScanJet 2200c
+ 0701 ScanJet 5300c/5370c
+ 0704 DeskJet 825c
+ 0705 ScanJet 4400c
+ 0712 DeskJet 1180c
+ 0801 ScanJet 7400c
+ 0804 DeskJet 816c
+ 0901 ScanJet 2300c
+ 0904 DeskJet 845c
+ 1004 DeskJet 970c/970cse
+ 1005 ScanJet 5400c
+ 1016 Jornada 548 / iPAQ HW6515 Pocket PC
+ 1104 DeskJet 959c
+ 1105 ScanJet 5470c
+ 1116 Jornada 568 Pocket PC
+ 1151 750xi Printer/Scanner/Copier
+ 1204 DeskJet 930c
+ 1305 ScanJet 4570c
+ 1312 Deskjet 460
+ 1317 LaserJet 1005
+ 1405 Scanjet 3670
+ 1424 f2105 Monitor Hub
+ 1504 DeskJet 920c
+ 1604 DeskJet 940c
+ 1617 LaserJet 3015
+ 1904 DeskJet 3820
+ 1c17 Color LaserJet 2550l
+ 1e11 PSC-950
+ 2002 Hub
+ 2004 DeskJet 640c
+ 2005 ScanJet 3570c
+ 2104 DeskJet 630c
+ 2205 ScanJet 3500c
+ 2304 DeskJet 656c
+ 2305 ScanJet 3970c
+ 2811 PSC-2100
+ 2d11 OfficeJet 6110
+ 3102 PhotoSmart P1100 Printer w/ Card Reader
+ 3104 DeskJet 960c
+ 3304 DeskJet 990c
+ 3404 DeskJet 6122
+ 3504 DeskJet 6127c
+ 3817 LaserJet P2015 Series
+ 3c02 PhotoSmart 7350
+ 3d11 OfficeJet 4215
+ 3f11 PSC-1315/PSC-1317
+ 4002 PhotoSmart 720 / PhotoSmart 935 (storage)
+ 4102 PhotoSmart 618
+ 4202 PhotoSmart 812
+ 4302 PhotoSmart 850 (ptp)
+ 4402 PhotoSmart 935 (ptp)
+ 4502 PhotoSmart 945 (PTP mode)
+ 5004 DeskJet 995c
+ 6004 DeskJet 5550
+ 6104 DeskJet 5650c
+ 6202 PhotoSmart 215
+ 6204 DeskJet 5150c
+ 6302 PhotoSmart 318/612
+ 6402 PhotoSmart 715 (ptp)
+ 6502 PhotoSmart 120 (ptp)
+ 6602 PhotoSmart 320
+ 6702 PhotoSmart 720 (ptp)
+ 6802 PhotoSmart 620 (ptp)
+ 6a02 PhotoSmart 735 (ptp)
+ 6b02 PhotoSmart R707 (PTP mode)
+ 7004 DeskJet 3320c
+ 7102 PhotoSmart 635 (PTP mode)
+ 7104 DeskJet 3420c
+ 7202 PhotoSmart 43x (ptp)
+ 7204 DeskJet 36xx
+ 7302 PhotoSmart M307 (PTP mode)
+ 7304 DeskJet 35xx
+ 7702 PhotoSmart R817 (PTP mode)
+ 7a02 PhotoSmart M415 (PTP mode)
+ 7b02 PhotoSmart M23 (PTP mode)
+ 8604 Deskjet 5440
+ a004 DeskJet 5850c
+ bef4 NEC Picty760
+ efbe NEC Picty900
+ f0be NEC Picty920
+ f1be NEC Picty800
+03f1 Genoa Technology
+03f2 Oak Technology, Inc.
+03f3 Adaptec, Inc.
+03f4 Diebold, Inc.
+03f5 Siemens Electromechanical
+03f8 Epson Imaging Technology Center
+03f9 KeyTronic Corp.
+03fb OPTi, Inc.
+03fc Elitegroup Computer Systems
+03fd Xilinx, Inc.
+03fe Farallon Comunications
+0400 National Semiconductor Corp.
+ 0807 Bluetooth Dongle
+ 1000 Mustek BearPaw 1200 Scanner
+ 1001 Mustek BearPaw 2400 Scanner
+0401 National Registry, Inc.
+0402 ALi Corp.
+ 5462 M5462 IDE Controller
+ 5602 Video Camera Controller
+ 5603 USB 2.0 Q-tec Webcam 300
+ 5621 USB 2.0 Storage Device
+ 5632 USB 2.0 Host-to-Host Link
+ 5635 USB 2.0 Flash Card Reader
+ 5636 USB 2.0 Storage Device
+ 5637 M5637 IDE Controller
+0403 Future Technology Devices International, Ltd
+ 0000 H4SMK 7 Port Hub
+ 6001 8-bit FIFO
+ 8040 4 Port Hub
+ 8070 7 Port Hub
+ 8370 7 Port Hub
+ 8371 PS/2 Keyboard And Mouse
+ 8372 FT8U100AX Serial Port
+ c630 lcd2usb interface
+ c7d0 RR-CirKits LocoBuffer-USB
+ ea90 Eclo 1-Wire Adapter
+ f208 Papenmeier Braille-Display
+ fc82 SEMC DSS-20 SyncStation
+ fd48 ShipModul MiniPlex-4xUSB NMEA Multiplexer
+ ff08 ToolHouse LoopBack Adapter
+0404 NCR Corp.
+ 0310 K590 Printer, Self-Service
+ 0311 7167 Printer, Receipt/Slip
+ 0312 7197 Printer Receipt
+ 0320 5932-USB Keyboard
+ 0321 5953-USB Dynakey
+ 0322 5932-USB Enhanced Keyboard
+ 0323 5932-USB Enhanced Keyboard, Flash-Recovery/Download
+ 0324 5953-USB Enhanced Dynakey
+ 0325 5953-USB Enhanced Dynakey Flash-Recovery/Download
+ 0328 K016: USB-MSR ISO 3-track MSR: POS Standard (See HID pages)
+ 0329 K018: USB-MSR JIS 2-Track MSR: POS Standard
+ 032a K016: USB-MSR ISO 3-Track MSR: HID Keyboard Mode
+ 032b K016/K018: USB-MSR Flash-Recovery/Download
+0405 Synopsys, Inc.
+0406 Fujitsu-ICL Computers
+0407 Fujitsu Personal Systems, Inc.
+0408 Quanta Computer, Inc.
+0409 NEC Corp.
+ 0012 ATerm IT75DSU ISDN TA
+ 0014 Japanese Keyboard
+ 0027 MultiSync Monitor
+ 0058 HighSpeed Hub
+ 0059 HighSpeed Hub
+ 006a Conceptronic USB Harddisk Box
+ 011d e228 Mobile Phone
+ 55aa Hub
+ 55ab Hub [iMac/iTouch kbd]
+ efbe P!cty 900 [HP DJ]
+ f0be P!cty 920 [HP DJ 812c]
+040a Kodak Co.
+ 0001 DVC-323
+ 0002 DVC-325
+ 0100 DC-220
+ 0110 DC-260
+ 0111 DC-265
+ 0112 DC-290
+ 0120 DC-240
+ 0121 DC-240 (PTP firmware)
+ 0130 DC-280
+ 0131 DC-5000
+ 0132 DC-3400
+ 0140 DC-4800
+ 0160 DC4800
+ 0170 DX3900
+ 0300 EZ-200
+ 0400 MC3
+ 0403 Z7590
+ 0500 DX3500
+ 0510 DX3600
+ 0525 DX3215
+ 0530 DX3700
+ 0535 EasyShare CX4230 Camera
+ 0540 LS420
+ 0550 DX4900
+ 0555 DX4330
+ 0560 CX4200
+ 0565 CX4210
+ 0566 CX4300
+ 0567 LS753
+ 0568 LS443
+ 0569 LS663
+ 0570 DX6340
+ 0571 CX6330
+ 0572 DX6440
+ 0573 CX6230
+ 0574 CX6200
+ 0575 DX6490
+ 0576 DX4530
+ 0577 DX7630
+ 0578 CX7300/CX7310
+ 0579 CX7220
+ 057a CX7330
+ 057b CX7430
+ 057c CX7530
+ 057d DX7440
+ 057e C300
+ 057f DX7590
+ 0580 Z730
+ 0584 CX6445
+ 0586 CX7525
+ 0589 EasyShare C360
+ 058a C310
+ 058c C330
+ 058d C340
+ 058e V530
+ 058f V550
+ 5010 Wireless Adapter
+040b Weltrend Semiconductor
+ 6510 Weltrend Bar Code Reader
+ 6520 XBOX Xploder
+040c VTech Computers, Ltd
+040d VIA Technologies, Inc.
+ 6205 USB 2.0 Card Reader
+040e MCCI
+040f Echo Speech Corp.
+0411 MelCo., Inc.
+ 0001 LUA-TX Ethernet [pegasus]
+ 0016 WLI-USB-S11 802.11b Adapter
+ 0027 WLI-USB-KS11G 802.11b Adapter
+0412 Award Software International
+0413 Leadtek Research, Inc.
+ 6025 WinFast DTV Dongle (cold state)
+ 6026 WinFast DTV Dongle (warm state)
+ 6f00 WinFast DTV Dongle (STK7700P based)
+0414 Giga-Byte Technology Co., Ltd
+0416 Winbond Electronics Corp.
+ 0961 AVL Flash Card Reader
+ 5518 4-Port Hub
+ 551a PC Sync Keypad
+ 551b PC Async Keypad
+ 551c Sync Tenkey
+ 551d Async Tenkey
+ 551e Keyboard
+ 551f Keyboard w/ Sys and Media
+ 5521 Keyboard
+ 7723 SD Card Reader
+ 6481 16-bit Scanner
+0417 Symbios Logic
+0418 AST Research
+0419 Samsung Info. Systems America, Inc.
+ 0001 IrDA Remote Controller
+ 3001 Xerox P1202 Laser Printer
+ 8002 SyncMaster 757DFX HID Device
+041a Phoenix Technologies, Ltd
+041b d'TV
+041d S3, Inc.
+041e Creative Technology, Ltd
+ 1002 Nomad II
+ 1003 Blaster GamePad Cobra
+ 1050 GamePad Cobra
+ 3010 SoundBlaster MP3+
+ 3020 SoundBlaster Audigy 2 NX
+ 4003 VideoBlaster WebCam Go Plus [W9967CF]
+ 4004 Nomad II MG
+ 4005 WebCam Blaster Go ES
+ 4007 Go Mini
+ 400a PC-Cam 300
+ 400b PC-Cam 600
+ 400c WebCam 5 [pwc]
+ 400d WebCam PD1001
+ 4011 WebCam PRO eX
+ 4012 PC-CAM350
+ 4013 PC-Cam 750
+ 4015 CardCam Value
+ 4016 CardCam
+ 4017 WebCam Mobile
+ 4018 WebCam Vista
+ 401c WebCam NX [PD1110]
+ 401d WebCam NX Ultra
+ 401e WebCam NX Pro
+ 401f Webcam Notebook
+ 4028 Vista Plus cam [VF0090]
+ 4036 Webcam Live!/Live! Pro
+ 403a WebCam NX Pro 2
+ 403c WebCam Live! Ultra
+ 403d WebCam Notebook Ultra
+ 4100 Nomad Jukebox 2
+ 4101 Nomad Jukebox 3
+ 4106 Nomad MuVo
+ 4108 Nomad Jukebox Zen
+ 4109 Nomad Jukebox Zen NX
+ 410b Nomad Jukebox Zen USB 2.0
+ 410c Nomad MuVo NX
+ 4110 Nomad Jukebox Zen Xtra
+ 4111 Dell Digital Jukebox
+ 4116 MuVo^2
+ 4117 Nomad MuVo TX
+ 411b Zen Touch
+ 411d Zen
+ 411e Zen Micro
+ 4123 Zen Portable Media Center
+ 4126 Dell DJ (2nd gen)
+ 4127 Dell DJ
+ 412b MuVo N200 with FM radio
+ 4130 Zen Micro (mtp)
+ 4131 Zen Touch (mtp)
+ 4134 Zen Neeon
+ 4136 Zen Sleek
+ 4137 Zen Sleek (mtp)
+ 4139 Zen Nano Plus
+ 413c Zen MicroPhoto
+041f LCS Telegraphics
+0420 Chips and Technologies
+0421 Nokia Mobile Phones
+ 0401 6650 GSM Phone
+ 0405 9500 GSM Communicator
+ 040b N-Gage GSM Phone
+ 040f 6230 GSM Phone
+ 0410 6630 Imaging Smartphone
+ 0415 9300 GSM Smartphone
+ 0418 E-70 (PC-Suite mode)
+ 041a 9500 GSM Communicator (RNDIS)
+ 041b 9300 GSM Smartphone (RNDIS)
+ 041e Nokia 6680
+ 0429 6230i Camera Phone
+ 0431 770 Internet Tablet
+ 0435 E-70 (IP Passthrough/RNDIS mode)
+ 043a Nokia N70 USB Phone Parent
+ 0800 Connectivity Cable DKU-5
+0422 ADI Systems, Inc.
+0423 Computer Access Technology Corp.
+ 000a NetMate Ethernet
+ 000c NetMate2 Ethernet
+ 000d USB Chief Analyzer
+ 1237 Andromeda Hub
+0424 Standard Microsystems Corp.
+ 20fc 6-in-1 Card Reader
+ 223a 8-in-1 Card Reader
+ 2524 USB MultiSwitch Hub
+0425 Motorola Semiconductors HK, Ltd
+ 0101 G-Tech Wireless Mouse & Keyboard
+0426 Integrated Device Technology, Inc.
+0427 Motorola Electronics Taiwan, Ltd
+0428 Advanced Gravis Computer Tech, Ltd
+ 4001 GamePad Pro
+0429 Cirrus Logic
+042a Ericsson Austrian, AG
+042b Intel Corp.
+042c Innovative Semiconductors, Inc.
+042d Micronics
+042e Acer, Inc.
+042f Molex, Inc.
+0430 Sun Microsystems, Inc.
+ 0005 Type 6 Keyboard
+ 0100 3-button Mouse
+0431 Itac Systems, Inc.
+ 0100 Mouse-Trak 3-button Track Ball
+0432 Unisys Corp.
+0433 Alps Electric, Inc.
+ 1101 IBM Game Controller
+0434 Samsung Info. Systems America, Inc.
+0435 Hyundai Electronics America
+0436 Taugagreining HF
+0437 Framatome Connectors USA
+0438 Advanced Micro Devices, Inc.
+0439 Voice Technologies Group
+043d Lexmark International, Inc.
+ 0002 Optra E310 Printer
+ 0009 Optra S2450 Printer
+ 000c Optra E312 Printer
+ 0017 Z32 printer
+ 0018 Z52 Printer
+ 001a Z65 Printer
+ 001c Kodak Personal Picture Maker 200 Printer
+ 001f Kodak Personal Picture Maker 200 Card Reader
+ 0020 Z51 Printer
+ 0021 Z33 Printer
+ 002d X70/X73 Scan/Print/Copy
+ 003d X83 Scan/Print/Copy
+ 0057 Z35 Printer
+ 0060 X74/X75 Scanner
+ 0061 X74 Hub
+ 0069 X74/X75 Printer
+ 0072 X6170 Printer
+ 0095 E220 Printer
+043e LG Electronics USA, Inc.
+ 42bd Flatron 795FT Plus Monitor
+ 4a4d Flatron 915FT Plus Monitor
+ 7001 MF-PD100 Soul Digital MP3 Player
+ 8484 LPC-U30 Webcam II
+ 8585 LPC-UC35 Webcam
+043f RadiSys Corp.
+0440 Eizo Nanao Corp.
+0441 Winbond Systems Lab.
+ 1456 Hub
+0442 Ericsson, Inc.
+0443 Gateway, Inc.
+0445 Lucent Technologies, Inc.
+0446 NMB Technologies Corp.
+0447 Momentum Microsystems
+044a Shamrock Tech. Co., Ltd
+044b WSI
+044c CCL/ITRI
+044d Siemens Nixdorf AG
+044e Alps Electric Co., Ltd
+ 2002 MD-5500 Printer
+ 3001 UGTZ4 Bluetooth
+044f ThrustMaster, Inc.
+ 0400 HOTAS Cougar
+ a0a3 Fusion Digital GamePad
+ b203 360 Modena Pro Wheel
+ b300 Firestorm Dual Power
+ b304 Firestorm Dual Power
+0450 DFI, Inc.
+0451 Texas Instruments, Inc.
+ 1428 Hub
+ 1446 TUSB2040/2070 Hub
+ 2036 TUSB2036 Hub
+ 2046 TUSB2046 Hub
+ 2077 TUSB2077 Hub
+ 3410 TUSB3410 Microcontroller
+ 5409 Frontier Labs NEX IA+ Digital Audio Player
+ 6000 AU5 ADSL Modem (pre-reenum)
+ 6001 AU5 ADSL Modem
+ 625f Trekstor USB-Stick 12 CS-D 12 GB
+ e001 GraphLink
+ e004 TI-89 Titanium Calculator
+ e008 TI-84 Plus Silver Calculator
+ f430 MSP-FET430UIF JTAG Tool
+0452 Mitsubishi Electronics America, Inc.
+ 0050 Diamond Pro 900u CRT Monitor
+ 0051 Integrated Hub
+0453 CMD Technology
+0454 Vobis Microcomputer AG
+0455 Telematics International, Inc.
+0456 Analog Devices, Inc.
+0457 Silicon Integrated Systems Corp.
+ 0150 Super Talent 1GB Flash Drive
+ 0151 Super Flash 1GB Flash Drive
+0458 KYE Systems Corp. (Mouse Systems)
+ 0001 Mouse
+ 0002 Genius NetMouse Pro
+ 0003 Genius NetScroll+
+ 000e VideoCAM Web
+ 001a Genius WebScroll+
+ 004c Slimstar Pro Keyboard
+ 0100 EasyPen Tablet
+ 0101 CueCat
+ 1003 Genius VideoCam
+ 1004 Flight2000 F-23 Joystick
+ 100a Aashima Technology Trust Sight Fighter Vibration Feedback Joystick
+ 2001 ColorPage-Vivid Pro Scanner
+ 2007 ColorPage-HR6 V2 Scanner
+ 2008 ColorPage-HR6 V2 Scanner
+ 2009 ColorPage-HR6A Scanner
+ 2011 ColorPage-Vivid3x Scanner
+ 2013 ColorPage-HR7 Scanner
+ 2015 ColorPage-HR7LE Scanner
+ 2016 ColorPage-HR6X Scanner
+ 301d Genius MaxFire MiniPad
+ 7004 VideoCAM Express
+ 7007 VideoCAM Web
+ 7012 WebCAM USB2.0
+0459 Adobe Systems, Inc.
+045a SONICblue, Inc.
+ 0b4a SupraMax 2890 56K Modem [Lucent Atlas]
+ 0b68 SupraMax 56K Modem
+ 5210 Rio Karma Music Player
+ 5220 Rio Nitrus MP3 Player
+045b Hitachi, Ltd
+045d Nortel Networks, Ltd
+045e Microsoft Corp.
+ 0007 SideWinder Game Pad
+ 0008 SideWinder Precision Pro
+ 0009 IntelliMouse
+ 000b Natural Keyboard Elite
+ 0014 Digital Sound System 80
+ 001a SideWinder Precision Racing Wheel
+ 001b SideWinder Force Feedback 2 Joystick
+ 001d Natural Keyboard Pro
+ 001e IntelliMouse Explorer
+ 0023 Trackball Optical
+ 0024 Trackball Explorer
+ 0025 IntelliEye Mouse
+ 0026 SideWinder GamePad Pro
+ 0027 SideWinder PnP GamePad
+ 0028 SideWinder Dual Strike
+ 0029 IntelliMouse Optical
+ 002b Internet Keyboard Pro
+ 0033 Sidewinder Strategic Commander
+ 0034 SideWinder Force Feedback Wheel
+ 0038 SideWinder Precision 2
+ 0039 IntelliMouse Optical
+ 003b SideWinder Game Voice
+ 003c SideWinder Joystick
+ 0040 Wheel Mouse Optical
+ 0047 IntelliMouse Explorer 3.0
+ 0059 Wireless IntelliMouse Explorer
+ 006e MN510 802.11b Adapter
+ 007d Notebook Optical Mouse
+ 007e Wireless Transceiver for Bluetooth
+ 0080 Digital Media Pro Keyboard
+ 0083 Basic Optical Mouse
+ 008a Wireless Keyboard and Mouse
+ 008c Wireless Intellimouse Explorer 2.0
+ 00b9 Wireless Optical Mouse 3.0
+ 00bd Fingerprint Reader
+ 00ce Generic PPC Flash device
+ 00db Natural Ergonomic Keyboard 4000 V1.0
+ 00e1 Wireless Laser Mouse 6000 Reciever
+ 0202 Xbox Controller
+ 0284 Xbox DVD Playback Kit
+ 0285 Xbox Controller S
+ 0288 Xbox Controller S Hub
+ 0289 Xbox Controller S
+ 028b Xbox360 DVD Emulator
+ 028d Xbox360 Memory Unit 64MB
+ 028e Xbox360 Controller
+ 028f Xbox360 Wireless Controller
+ 0290 Xbox360 Performance Pipe (PIX)
+ 0292 Xbox360 Wireless Networking Adapter
+ 029c Xbox360 HD-DVD Drive
+ 029d Xbox360 HD-DVD Drive
+ 029e Xbox360 HD-DVD Memory Unit
+0460 Ace Cad Enterprise Co., Ltd
+0461 Primax Electronics, Ltd
+ 0300 G2-300 Scanner
+ 0301 G2E-300 Scanner
+ 0302 G2-300 #2 Scanner
+ 0303 G2E-300 #2 Scanner
+ 0340 Colorado 9600 Scanner
+ 0341 Colorado 600u Scanner
+ 0345 Visioneer 6200 Scanner
+ 0346 Memorex Maxx 6136u Scanner
+ 0347 Primascan Colorado 2600u/Visioneer 4400 Scanner
+ 0360 Colorado 19200 Scanner
+ 0361 Colorado 1200u Scanner
+ 0364 LG Electronics Scanworks 600U Scanner
+ 0371 Visioneer Onetouch 8920 Scanner
+ 0377 Medion MD 5345 Scanner
+ 037b Medion MD 6190 Scanner
+ 0380 G2-600 Scanner
+ 0381 ReadyScan 636i Scanner
+ 0382 G2-600 #2 Scanner
+ 0383 G2E-600 Scanner
+ 0813 IBM UltraPort Camera
+ 0815 Micro Innovations WebCam
+ 0819 Fujifilm IX-30 Camera [webcam mode]
+ 081a Fujifilm IX-30 Camera [storage mode]
+ 081c Elitegroup ECS-C11 Camera
+ 081d Elitegroup ECS-C11 Storage
+ 4d01 Comfort Keyboard
+ 4d02 Mouse-in-a-Box
+ 4d03 Kensington Mouse-in-a-box
+ 4d04 Mouse
+0463 MGE UPS Systems
+ 0001 UPS
+ ffff UPS
+0464 AMP/Tycoelectronics Corp.
+0467 AT&T Paradyne
+0468 Wieson Technologies Co., Ltd
+046a Cherry GmbH
+ 0001 My3000 Keyboard
+ 0003 My3000 Hub
+ 0005 XX33 SmartCard Reader Keyboard
+ 0023 Cymotion Master Linux Keyboard
+046b American Megatrends, Inc.
+046c Toshiba Corp., Digital Media Equipment
+046d Logitech, Inc.
+ 0203 M2452 Keyboard
+ 0301 M4848 Mouse
+ 0401 HP PageScan
+ 0402 NEC PageScan
+ 040f Logitech/Storm PageScan
+ 0801 QuickCam Home
+ 0810 QuickCam Pro
+ 0840 QuickCam Express
+ 0850 QuickCam Web
+ 0870 QuickCam Express
+ 0890 QuickCam Traveler
+ 08a0 QuickCam IM
+ 08a2 Labtec WebCam Pro
+ 08b0 QuickCam 3000 Pro [pwc]
+ 08b1 QuickCam Notebook Pro
+ 08b2 QuickCam Pro 4000
+ 08b3 QuickCam Zoom
+ 08b4 QuickCam Zoom
+ 08b5 QuickCam Sphere
+ 08d9 QuickCam Connect
+ 08da QuickCam Messanger
+ 08f0 QuickCam Messenger
+ 0900 ClickSmart 310
+ 0901 ClickSmart 510
+ 0903 ClickSmart 820
+ 0905 ClickSmart 820
+ 0920 QuickCam Express
+ 0921 Labtec WebCam
+ 0928 Quickcam Express
+ 092a QuickCam for Notebooks
+ 092f QuickCam express Plus
+ 0950 Pocket Camera
+ 0960 ClickSmart 420
+ 0970 Pocket750
+ 0a01 Logitech USB Headset
+ 0b02 BT Mini-Receiver (HID proxy mode)
+ bfe4 Premium Optical Wheel Mouse
+ c000 N43 [Pilot Mouse]
+ c001 N48/M-BB48 [FirstMouse Plus]
+ c002 M-BA47 [MouseMan Plus]
+ c004 WingMan Gaming Mouse
+ c00b MouseMan Wheel
+ c00c Optical Wheel Mouse
+ c00e M-BJ69 Optical Wheel Mouse
+ c012 Optical Mouse
+ c016 M-UV69a Optical Wheel Mouse
+ c01b MX310 Optical Mouse
+ c01d MX510 Optical Mouse
+ c01e MX518 Optical Mouse
+ c025 MX500 Optical Mouse
+ c030 iFeel Mouse
+ c032 MouseMan iFeel
+ c03e Premium Optical Wheel Mouse
+ c202 WingMan Formula
+ c207 WingMan Extreme Digital 3D
+ c208 WingMan Gamepad Extreme
+ c209 WingMan Gamepad
+ c20a WingMan RumblePad
+ c20c WingMan Precision
+ c20d WingMan Attack 2
+ c211 iTouch Cordless Reciever
+ c216 Dual Action Gamepad
+ c218 Logitech RumblePad 2 USB
+ c281 WingMan Force
+ c283 WingMan Force 3D
+ c285 WingMan Strike Force 3D
+ c291 WingMan Formula Force
+ c293 WingMan Formula Force GP
+ c295 Momo Force Steering Wheel
+ c2a0 Wingman Force Feedback Mouse
+ c303 iTouch Keyboard
+ c308 Internet Navigator Keyboard
+ c309 Internet Keyboard
+ c401 TrackMan Marble Wheel
+ c402 Marble Mouse (2-button)
+ c404 TrackMan Wheel
+ c408 Marble Mouse (4-button)
+ c501 Cordless Mouse Receiver
+ c503 Cordless Mouse+Keyboard Receiver
+ c504 Cordless Mouse+Keyboard Receiver
+ c505 Cordless Mouse+Keyboard Receiver
+ c506 MX-700 Cordless Mouse Receiver
+ c50b Cordless Desktop Optical
+ c50e MX-1000 Cordless Mouse Receiver
+ c517 LX710 Cordless Desktop Laser
+ c518 MX610 Laser Cordless Mouse
+ c709 BT Mini-Receiver (HCI mode)
+ c70b BT Mini-Receiver (HID proxy mode)
+ c70c BT Mini-Receiver (HID proxy mode)
+ ca04 Formula Vibration Feedback Wheel
+ d001 QuickCam Pro
+046e Behavior Tech. Computer Corp.
+ 6782 BTC 7932 mouse+keyboard
+046f Crystal Semiconductor
+0471 Philips
+ 0101 DSS350 Digital Speaker System
+ 0104 DSS330 Digital Speaker System [uda1321]
+ 0201 Hub
+ 0222 Creative Nomad Jukebox
+ 0302 PCA645VC WebCam [pwc]
+ 0303 PCA646VC WebCam [pwc]
+ 0304 Askey VC010 WebCam [pwc]
+ 0307 PCVC675K WebCam [pwc]
+ 0308 PCVC680K WebCam [pwc]
+ 030c PCVC690K WebCam [pwc]
+ 0310 PCVC730K WebCam [pwc]
+ 0311 PCVC740K ToUcam Pro [pwc]
+ 0312 PCVC750K WebCam [pwc]
+ 0327 WEBc am SPC 6000 NC (WebCam w/ mic)
+ 0471 Digital Speaker System
+ 0601 OVU1020 IR Dongle (Kbd+Mouse)
+ 0701 150P1 TFT Display
+ 0811 JR24 CDRW
+ 1120 Creative Rhomba MP3 player
+ 1801 Diva MP3 player
+0472 Chicony Electronics Co., Ltd
+ 0065 PFU-65 Keyboard
+0473 Sanyo Information Business Co., Ltd
+0474 Sanyo Electric Co., Ltd
+ 0110 Digital Voice Recorder R200
+ 0217 Xacti J2
+ 022f C5 Digital Media Camera (mass storage mode)
+ 0230 C5 Digital Media Camera (PictBridge mode)
+ 0231 C5 Digital Media Camera (PC control mode)
+ 0701 SCP-4900 Cellphone
+0475 Relisys/Teco Information System
+0476 AESP
+0477 Seagate Technology, Inc.
+0478 Connectix Corp.
+ 0001 QuickCam
+ 0002 QuickClip
+0479 Advanced Peripheral Laboratories
+047a Semtech Corp.
+047b Silitek Corp.
+ 0002 Keyboard and Mouse
+ 0101 BlueTooth Keyboard and Mouse
+ 020b SK-3105 SmartCard Reader
+ 1002 HP ScanJet 4300c Parallel Port
+047c Dell Computer Corp.
+047d Kensington
+ 1003 Orbit TrackBall
+ 1005 TurboBall
+ 1009 Orbit TrackBall for Mac
+ 101f PocketMouse Pro
+ 2010 Wireless Presentation Remote
+ 4005 Gravis Eliminator GamePad Pro
+ 4006 Gravis Eliminator AfterShock
+ 4008 Gravis Destroyer TiltPad
+ 5002 VideoCam CABO II
+ 5003 VideoCam
+047e Agere Systems, Inc. (Lucent)
+ 1001 USS720 Parallel Port
+ f101 Atlas Modem
+047f Plantronics, Inc.
+0480 Toshiba America Info. Systems, Inc.
+0481 Zenith Data Systems
+0482 Kyocera Corp.
+ 000e FS-1020D Printer
+ 0103 Finecam S5
+0483 SGS Thomson Microelectronics
+ 1307 Cytronix 6in1 card reader
+ 163d Cool Icam Digi-MP3
+ 2016 Fingerprint Reader
+ 2017 Biometric Smart Card Reader
+ 7554 56k SoftModem
+0484 Specialix
+0485 Nokia Monitors
+0486 ASUS Computers, Inc.
+0487 Stewart Connector
+0488 Cirque Corp.
+0489 Foxconn / Hon Hai
+ 0502 SmartMedia Card Reader Firmware Loader
+ 0503 SmartMedia Card Reader
+048a S-MOS Systems, Inc.
+048c Alps Electric Ireland, Ltd
+048d Integrated Technology Express, Inc.
+048f Eicon Tech.
+0490 United Microelectronics Corp.
+0491 Capetronic
+0492 Samsung SemiConductor, Inc.
+0493 MAG Technology Co., Ltd
+0495 ESS Technology, Inc.
+0496 Micron Electronics
+0497 Smile International
+0498 Capetronic (Kaohsiung) Corp.
+0499 Yamaha Corp.
+ 6001 CRW2200UX Lightspeed 2 External CD-RW Drive
+049a Gandalf Technologies, Ltd
+049b Curtis Computer Products
+049c Acer Advanced Labs, Inc.
+ 0002 Keyboard (???)
+049d VLSI Technology
+049f Compaq Computer Corp.
+ 0003 iPAQ PocketPC
+ 000e Internet Keyboard
+ 0018 PA-1/PA-2 MP3 Player
+ 001a S4 100 Scanner
+ 0021 S200 Scanner
+ 0032 802.11b Adapter [ipaq h5400]
+ 0033 802.11b Adapter [orinoco]
+ 0051 KU-0133 Easy Access Interner Keyboard
+ 505a Linux-USB "CDC Subset" Device, or Itsy (experimental)
+ 8511 iPAQ Networking 10/100 Ethernet [pegasus2]
+04a0 Digital Equipment Corp.
+04a1 SystemSoft Corp.
+04a2 FirePower Systems
+04a3 Trident Microsystems, Inc.
+04a4 Hitachi, Ltd
+04a5 Acer Peripherals Inc. (now BenQ Corp.)
+ 0001 Keyboard
+ 12a6 AcerScan C310U
+ 1a20 Prisa 310U
+ 1a2a Prisa 620U
+ 2022 Prisa 320U/340U
+ 2040 Prisa 620UT
+ 2060 Prisa 620U+/640U
+ 207e Prisa 640BU
+ 20b0 S2W 3300U/4300U
+ 20be Prisa 640BT
+ 20c0 Prisa 1240UT
+ 20de S2W 4300U+
+ 20fc Benq 5000
+ 20fe SW2 5300U
+ 3003 Benq WebCam
+ 3008 Benq 1500
+ 300a Benq 3410
+ 300c Benq 1016
+ 3019 Benq DC C40
+ 9213 Kbd Hub
+04a6 Nokia Display Products
+04a7 Visioneer
+ 0211 OneTouch 7600 Scanner
+ 0221 OneTouch 5300 Scanner
+ 0224 OneTouch 4800 USB/Microtek Scanport 3000
+ 0226 OneTouch 5300 USB
+ 0231 6100 Scanner
+ 0311 6200 EPP/USB Scanner
+ 0321 OneTouch 8100 EPP/USB Scanner
+ 0331 OneTouch 8600 EPP/USB Scanner
+04a8 Multivideo Labs, Inc.
+04a9 Canon, Inc.
+ 1051 BJC-3000 Color Printer
+ 1056 BJC-2110 Color Printer
+ 105b S600 Printer
+ 105d S450 Printer
+ 1062 S500 Printer
+ 1064 S300 Printer
+ 106a S200 Printer
+ 106b S520 Printer
+ 106d S750 Printer
+ 1072 I850 Printer
+ 1073 I550 Printer
+ 1074 S330 Printer
+ 1090 i9900 Photo Printer
+ 1094 PIXMA iP3000x Printer
+ 10b6 PIXMA iP4300 Printer
+ 2201 CanoScan FB320U
+ 2202 CanoScan FB620U
+ 2204 CanoScan FB630U
+ 2205 CanoScan FB1210U
+ 2206 CanoScan N650U/N656U
+ 2207 CanoScan 1220U
+ 2208 CanoScan D660U
+ 220a CanoScan D2400UF
+ 220b CanoScan D646U
+ 220c CanoScan D1250U2
+ 220d CanoScan N670U/N676U/LiDE 20
+ 220e CanoScan N1240U/LiDE 30
+ 220f CanoScan 8000F
+ 2210 CanoScan 9900F
+ 2212 CanoScan 5000F
+ 2213 LiDE 50/LiDE 35
+ 2215 CanoScan 3000/3000F/3000ex
+ 2216 CanoScan 3200F
+ 2217 CanoScan 5200F
+ 221e CanoScan 8400F
+ 2225 CanoScan LiDE 70
+ 2611 SmartBase MPC400
+ 262b LaserShot LBP-1120 Printer
+ 3041 PowerShot S10
+ 3042 CanoScan FS4000US Film Scanner
+ 3043 PowerShot S20
+ 3044 EOS D30
+ 3045 PowerShot S100
+ 3046 IXY Digital
+ 3047 Digital IXUS
+ 3048 PowerShot G1
+ 3049 PowerShot Pro90 IS
+ 304b IXY Digital 300
+ 304c PowerShot S300
+ 304d Digital IXUS 300
+ 304e PowerShot A20
+ 304f PowerShot A10
+ 3050 PowerShot unknown 1
+ 3051 PowerShot S110
+ 3052 Digital IXUS V
+ 3055 PowerShot G2
+ 3056 PowerShot S40
+ 3057 PowerShot S30
+ 3058 PowerShot A40
+ 3059 PowerShot A30
+ 305b ZR45MC Digital Camcorder
+ 305c PowerShot unknown 2
+ 3060 EOS D60
+ 3061 PowerShot A100
+ 3062 PowerShot A200
+ 3065 PowerShot S200
+ 3066 Digital IXUS 330
+ 3067 MV550i Digital Video Camera
+ 3069 PowerShot G3
+ 306a Digital unknown 3
+ 306b MVX2i Digital Video Camera
+ 306c PowerShot S45
+ 306d PowerShot S45 PtP Mode
+ 306e PowerShot G3 (normal mode)
+ 306f PowerShot G3 (ptp)
+ 3070 PowerShot S230
+ 3071 PowerShot S230 (ptp)
+ 3072 PowerShot SD100 / Digital IXUS 2 (ptp)
+ 3073 PowerShot A70 (ptp)
+ 3074 PowerShot A60 (ptp)
+ 3075 IXUS 400 Camera
+ 3076 PowerShot A300
+ 3077 PowerShot S50
+ 3078 ZR70MC Digital Camcorder
+ 307a MV650i (normal mode)
+ 307b MV630i Difital Video Camera
+ 307c MV630i (normal mode)
+ 307f Optura 20
+ 3080 MVX150i (normal mode) / Optura 20 (normal mode)
+ 3081 Optura 10
+ 3082 MVX100i / Optura 10
+ 3083 EOS 10D
+ 3084 EOS 300D / EOS Digital Rebel
+ 3085 PowerShot G5
+ 3087 Elura 50 (PTP mode)
+ 3088 Elura 50 (normal mode)
+ 308d MVX3i
+ 308e FV M1 (normal mode) / MVX 3i (normal mode) / Optura Xi (normal mode)
+ 3093 Optura 300
+ 3096 IXY DV M2 (normal mode) / MVX 10i (normal mode)
+ 3099 EOS 300D (ptp)
+ 309a PowerShot A80
+ 309b Digital IXUS (ptp)
+ 309c PowerShot S1 IS
+ 30a8 Elura 60E/Optura 40 (ptp)
+ 30a9 MVX25i (normal mode) / Optura 40 (normal mode)
+ 30b1 PowerShot S70 (normal mode) / PowerShot S70 (PTP mode)
+ 30b2 PowerShot S60 (normal mode) / PowerShot S60 (PTP mode)
+ 30b3 PowerShot G6 (normal mode) / PowerShot G6 (PTP mode)
+ 30b4 PowerShot S500
+ 30b5 PowerShot A75
+ 30b6 Digital IXUS II2 / Digital IXUS II2 (PTP mode) / PowerShot SD110 (PTP mode) / PowerShot SD110 Digital ELPH
+ 30b7 PowerShot A400 / PowerShot A400 (PTP mode)
+ 30b8 PowerShot A310 / PowerShot A310 (PTP mode)
+ 30b9 Powershot A85
+ 30ba PowerShot S410 Digital Elph
+ 30bb PowerShot A95
+ 30bf Digital IXUS 40
+ 30c0 Digital IXUS 30 (PTP mode) / PowerShot SD200 (PTP mode)
+ 30c1 Digital IXUS 50 (normal mode) / IXY Digital 55 (normal mode) / PowerShot A520 (PTP mode) / PowerShot SD400 (normal mode)
+ 30c2 PowerShot A510 (normal mode) / PowerShot A510 (PTP mode)
+ 30c4 Digital IXUS i5 (normal mode) / IXY Digital L2 (normal mode) / PowerShot SD20 (normal mode)
+ 30ea EOS 1D Mark II (PTP mode)
+ 30eb EOS 20D
+ 30ec EOS 20D (ptp)
+ 30ee EOS 350D
+ 30ef EOS 350D (ptp)
+ 30f0 PowerShot S2 IS (PTP mode)
+ 30f2 Digital IXUS 700 (normal mode) / Digital IXUS 700 (PTP mode) / IXY Digital 600 (normal mode) / PowerShot SD500 (normal mode) / PowerShot SD500 (PTP mode)
+ 30f9 PowerShot A410 (PTP mode)
+ 30fc PowerShot A620 (PTP mode)
+ 30fd PowerShot A610 (normal mode)/PowerShot A610 (PTP mode)
+ 30ff Digital IXUS 55 (PTP mode)/PowerShot SD450 (PTP mode)
+ 310e Digital IXUS 50 (PTP mode)
+ 3116 Digital IXUS 750 (PTP mode)
+ 3117 PowerShot A700
+ 3138 PowerShot A710 IS
+ 31ff Digital IXUS 55
+04aa DaeWoo Telecom, Ltd
+04ab Chromatic Research
+04ac Micro Audiometrics Corp.
+04ad Dooin Electronics
+04af Winnov L.P.
+04b0 Nikon Corp.
+ 0102 Coolpix 990
+ 0103 Coolpix 880
+ 0104 Coolpix 995
+ 0106 Coolpix 775
+ 0107 Coolpix 5000
+ 0108 Coolpix 2500
+ 0109 Coolpix 2500 (ptp)
+ 010a Coolpix 4500
+ 010b Coolpix 4500 (ptp)
+ 010d Coolpix 5700 (ptp)
+ 010e Coolpix 4300 (storage)
+ 010f Coolpix 4300 (ptp)
+ 0110 Coolpix 3500 (Sierra Mode)
+ 0111 Coolpix 3500 (ptp)
+ 0112 Coolpix 885 (ptp)
+ 0113 Coolpix 5000 (ptp)
+ 0114 Coolpix 3100 (storage)
+ 0115 Coolpix 3100 (ptp)
+ 0117 Coolpix 2100 (ptp)
+ 0119 Coolpix 5400 (ptp)
+ 011d Coolpix 3700 (ptp)
+ 0121 Coolpix 3200 (ptp)
+ 0122 Coolpix 2200 (ptp)
+ 0126 Coolpix 8800
+ 0129 Coolpix 4800 (ptp)
+ 012c Coolpix 4100 (storage)
+ 012d Coolpix 4100 (ptp)
+ 012e Coolpix 5600 (ptp)
+ 0130 Coolpix 4600 (ptp)
+ 0135 Coolpix 5900 (ptp)
+ 0142 Coolpix P2 (ptp)
+ 0136 Coolpix 7900 (storage)
+ 0137 Coolpix 7900 (ptp)
+ 0202 Coolpix SQ (ptp)
+ 0203 Coolpix 4200 (mass storage mode)
+ 0204 Coolpix 4200 (ptp)
+ 0205 Coolpix 5200 (storage)
+ 0206 Coolpix 5200 (ptp)
+ 0301 Coolpix 2000 (storage)
+ 0302 Coolpix 2000 (ptp)
+ 0402 DSC D100 (ptp)
+ 0403 D2H (mass storage mode)
+ 0404 D2H SLR (ptp)
+ 0405 D70 (mass storage mode)
+ 0406 DSC D70 (ptp)
+ 0408 D2X SLR (ptp)
+ 0409 D50 digital camera
+ 040a D50 (ptp)
+ 040c D2Hs
+ 040e DSC D70s (ptp)
+ 4000 Coolscan LS 40 ED
+04b1 Pan International
+04b3 IBM Corp.
+ 3004 Media Access Pro Keyboard
+ 3016 UltraNav Keyboard Hub
+ 3018 UltraNav Keyboard
+ 301b SK-8815 Keyboard
+ 3100 NetVista Mouse
+ 3103 ScrollPoint Pro Mouse
+ 3107 ThinkPad 800dpi Optical Travel Mouse
+ 3108 800dpi Optical Mouse w/ Scroll Point
+ 3109 Optical ScrollPoint Pro Mouse
+ 310b Red Wheel Mouse
+ 4427 Portable CD ROM
+ 4525 Double sided CRT
+ 4550 NVRAM (128 KB)
+ 4554 Cash Drawer
+ 4580 Hub w/ NVRAM
+ 4581 4800-2xx Hub w/ Cash Drawer
+ 4604 Keyboard w/ Card Reader
+ 4671 4820 LCD w/ MSR/KB
+04b4 Cypress Semiconductor Corp.
+ 0000 Dacal DC-101 CD Library
+ 0001 Mouse
+ 0002 CY7C63x0x Thermometer
+ 1002 CY7C63001 R100 FM Radio
+ 5500 HID->COM RS232 Adapter
+ 6560 CY7C65640 USB-2.0 "TetraHub"
+ 6830 USB-2.0 IDE Adapter
+ 7417 Wireless PC Lock
+ 8613 CY7C68013 EZ-USB FX2 USB 2.0 Development Kit
+ cc04 Centor USB RACIA-ALVAR USB PORT
+ cc06 Centor-P RACIA-ALVAR USB PORT
+ d5d5 CY7C63x0x Zoltrix Z-Boxer GamePad
+ f000 CY30700 Licorice evaluation board
+04b5 ROHM LSI Systems USA, LLC
+04b6 Hint Corp.
+04b7 Compal Electronics, Inc.
+04b8 Seiko Epson Corp.
+ 0001 Stylus Color 740 / Photo 750
+ 0002 ISD Smart Cable for Mac
+ 0003 ISD Smart Cable
+ 0005 Stylus Printer
+ 0101 Perfection 636
+ 0102 GT-2200
+ 0103 Perfection 610
+ 0104 Perfection 1200
+ 0105 StylusScan 2000
+ 0106 Stylus Scan 2500
+ 0107 Expression 1600U
+ 0109 Expression 1640 XL
+ 010a Perfection 1640SU
+ 010b Perfection 1240
+ 010c Perfection 640
+ 010e Perfection 1680
+ 010f Perfection 1250
+ 0110 Perfection 1650
+ 0112 Perfection 2450
+ 0114 Perfection 660
+ 011b Perfection 2400 Photo
+ 011c Perfection 3200
+ 011d Perfection 1260 Photo
+ 011e Perfection 1660 Photo
+ 011f Perfection 1670
+ 0121 Perfection 2480 Photo
+ 0202 Receipt Printer M129C
+ 0402 PhotoPC 850z
+ 0403 PhotoPC 3000z
+ 0601 Stylus Photo 875DC Card Reader
+ 0602 Stylus Photo 895 Card Reader
+ 0801 Stylus CX5200
+ 0802 Stylus CX3200
+ 080c ME100
+ 0811 Stylus Photo RX620 all-in-one
+04b9 Rainbow Technologies, Inc.
+ 0300 SafeNet USB SuperPro/UltraPro
+ 1000 iKey 1000 Token
+ 1001 iKey 1200 Token
+ 1200 iKey 2000 Token
+ 1202 iKey 2032 Token
+ 1300 iKey 3000 Token
+04ba Toucan Systems, Ltd
+04bb I-O Data Device, Inc.
+ 0904 ET/TX Ethernet [pegasus]
+ 0913 ET/TX-S Ethernet [pegasus2]
+ 0922 IOData AirPort WN-B11/USBS 802.11b
+04bd Toshiba Electronics Taiwan Corp.
+04be Telia Research AB
+04bf TDK Corp.
+ 0100 MediaReader CF
+ 0320 Bluetooth Adapter
+04c1 U.S. Robotics (3Com)
+ 0082 OfficeConnect Analog Modem
+ 008f Pro ISDN TA
+ 009d HomeConnect WebCam [vicam]
+ 3021 56k Voice FaxModem Pro
+04c2 Methode Electronics Far East PTE, Ltd
+04c3 Maxi Switch, Inc.
+04c4 Lockheed Martin Energy Research
+04c5 Fujitsu, Ltd
+ 1029 fi-4010c Scanner
+ 1041 fi-4120c Scanner
+ 1042 fi-4220c Scanner
+ 10e0 fi-5120c Scanner
+04c6 Toshiba America Electronic Components
+04c7 Micro Macro Technologies
+04c8 Konica Corp.
+ 0720 Digital Color Camera
+ 0721 e-miniD Camera
+ 0722 e-mini
+ 0723 KD-200Z Camera
+ 0726 KD-310Z Camera
+ 072c Revio KD20M
+ 072d Revio KD410Z
+04ca Lite-On Technology Corp.
+04cb Fuji Photo Film Co., Ltd
+ 0100 FinePix 1300 / 1400 / 4700 Zoom digital camera
+ 0103 FinePix NX-700 printer
+ 0104 FinePix A101/2600 Zoom (PC-Cam Mode)
+ 0108 FinePix F601 Zoom (Disk mode)
+ 0109 FinePix F601 Zoom (PC-Cam mode)
+ 010a FinePix S602 Zoom (Disk mode)
+ 010b FinePix S602 Zoom (PC-Cam mode)
+ 0110 FinePix M603 (mass storage mode)
+ 0114 FinePix F401 Zoom (Disk mode)
+ 0115 FinePix F401 Zoom (PC-Cam mode)
+ 0116 FinePix A203 (Disk mode)
+ 0117 FinePix A203 (PC-Cam mode)
+ 011a FinePix S304/3800 (Disk mode)
+ 011b FinePix S304/3800 (PC-Cam mode)
+ 011c FinePix 2650 (Disk mode)
+ 012c FinePix S7000 Zoom (Disk mode)
+ 012d FinePix S7000 Zoom (PC-Cam mode)
+ 0130 Finepix S5000 Camera (Disk mode)
+ 0131 Finepix S5000 Camera (PC-Cam mode)
+ 0142 FinePix S7000 Zoom (PTP mode)/(PictBridge mode) / FinePix A330 (PictBridge mode)
+ 0148 FinePix A330 (mass storage mode)
+ 0168 FinePix E500
+ 0177 Finepix F10 Camera (Disk mode)
+ 0179 Finepix F10 Camera (PTP mode)
+ 0192 FinePix E900
+04cc Philips Semiconductors
+ 1122 Hub
+ 1521 USB 2.0 Hub
+ 8116 Camera
+04cd Tatung Co. Of America
+04ce ScanLogic Corp.
+ 0002 SL11R-IDE IDE Bridge
+04cf Myson Century, Inc.
+ 8818 USB2.0 to ATAPI Bridge Controller
+04d0 Digi International
+04d1 ITT Canon
+04d2 Altec Lansing Technologies
+ 0311 ADA-310 Speakers
+ ff05 ADA-305 Speakers
+04d3 VidUS, Inc.
+04d4 LSI Logic, Inc.
+04d5 Forte Technologies, Inc.
+04d6 Mentor Graphics
+04d7 Oki Semiconductor
+04d8 Microchip Technology, Inc.
+ 8000 In-Circuit Debugger
+04d9 Holtek Semiconductor, Inc.
+04da Panasonic (Matsushita)
+ 2121 EB-VS6
+ 2319 NV-GS15 (webcam mode)
+ 2372 Lumix DMC-FZ10 Camera
+ 2374 DMC-FZ20
+04db Hypertec Pty, Ltd
+04dc Huan Hsin Holdings, Ltd
+04dd Sharp Corp.
+ 7004 VE-CG40U Digital Still Camera
+ 7005 VE-CG30 Digital Still Camera
+ 7007 VL-Z7S Digital Camcorder
+ 8004 Zaurus SL-5000D/SL-5500 PDA
+ 8005 Zaurus A-300
+ 8006 Zaurus SL-B500/SL-5600 PDA
+ 8007 Zaurus C-700 PDA
+ 9014 IM-DR80 Portable NetMD Player
+ 9031 Zaurus C-750/C-760/C-860/SL-C3000 PDA
+ 9032 Zaurus SL-6000
+ 9050 Zaurus C-860 PDA
+ 9056 Viewcam Z
+ 90f2 Sharp 3G GSM USB Control
+04de MindShare, Inc.
+04df Interlink Electronics
+04e1 Iiyama North America, Inc.
+ 0201 Monitor Hub
+04e2 Exar Corp.
+04e3 Zilog, Inc.
+04e4 ACC Microelectronics
+04e5 Promise Technology
+04e6 SCM Microsystems, Inc.
+ 0001 E-USB ATA Bridge
+ 0002 eUSCSI SCSI Bridge
+ 0003 eUSB SmartMedia Card Reader
+ 0005 eUSB SmartMedia/CompactFlash Card Reader
+ 0006 eUSB SmartMedia Card Reader
+ 0007 Hifd
+ 0101 eUSB ATA Bridge
+ 0325 eUSB ORCA Quad Reader
+ 0500 Veridicom 5thSense Fingerprint Sensor and eUSB SmartCard
+ 1010 USBAT-2 CompactFlash Card Reader
+ 5111 SCR331-DI SmartCard Reader
+ 5113 SCR333 SmartCard Reader
+ 5115 SCR335 SmartCard Reader
+ 5116 SCR331-LC1 SmartCard Reader
+ e001 SCR331 SmartCard Reader
+ e003 SPR532 PinPad SmartCard Reader
+04e7 Elo TouchSystems
+ 0001 TouchScreen
+04e8 Samsung Electronics Co., Ltd
+ 0110 Connect3D Flash Drive
+ 0111 Connect3D Flash Drive
+ 1003 MP3 Player and Recorder
+ 300c ML-1210 Printer
+ 323a ML-1710 Printer
+ 324c ML-1740 Printer
+ 3260 CLP-510 Color Laser Printer
+ 3268 ML-1610 Mono Laser Printer
+ 5a03 Yepp MP3 Player
+ 6601 Z100 Mobile Phone
+ 663f SGH-E720
+04e9 PC-Tel, Inc.
+04ea Brooktree Corp.
+04eb Northstar Systems, Inc.
+04ec Tokyo Electron Device, Ltd
+04ed Annabooks
+04ef Pacific Electronic International, Inc.
+04f0 Daewoo Electronics Co., Ltd
+04f1 Victor Company of Japan, Ltd
+ 0001 GC-QX3 Digital Still Camera
+ 0004 GR-DVL815U Digital Video Camera
+ 0008 GZ-MG30AA/MC500E Digital Video Camera
+ 0009 GR-DX25EK Digital Video Camera
+ 000a GR-D72 Digital Video Camera
+04f2 Chicony Electronics Co., Ltd
+ 0001 KU-8933 Keyboard
+ 0002 NT68P81 Keyboard
+ 0110 KU-2971 Keyboard
+ 0112 KU-8933 Keyboard with PS/2 Mouse port
+ 0116 KU-2971 German Keyboard
+ a209 Labtec DC-2320
+04f3 Elan Microelectronics Corp.
+04f4 Harting Elektronik, Inc.
+04f5 Fujitsu-ICL Systems, Inc.
+04f6 Norand Corp.
+04f7 Newnex Technology Corp.
+04f8 FuturePlus Systems
+04f9 Brother Industries, Ltd
+ 0002 HL-1050 Laser Printer
+ 0006 HL-1240 Laser Printer
+ 0007 HL-1250 Laser Printer
+ 0008 HL-1270 Laser Printer
+ 000d HL-1440 Laser Printer
+ 010f MFC 5100C
+ 0111 MFC 6800
+ 2004 PT-2300/2310 p-Touch Laber Printer
+ 2015 QL-500 P-touch label printer
+04fa Dallas Semiconductor
+ 2490 DS1490F 2-in-1 Fob, 1-Wire adapter
+ 4201 DS4201 Audio DAC
+04fb Biostar Microtech International Corp.
+04fc Sunplus Technology Co., Ltd
+ 0003 CM1092 Optical Scroller Mouse
+ 0561 Flexcam 100
+ 504a SPCA504a Digital Camera
+ 504b Aiptek, 1.3 mega PockerCam
+ 5331 Vivitar Vivicam 10
+ 7333 Finet Technology Palmpix DC-85
+ ffff PureDigital Ritz Disposable
+04fd Soliton Systems, K.K.
+04fe PFU, Ltd
+04ff E-CMOS Corp.
+0500 Siam United Hi-Tech
+0501 Fujikura DDK, Ltd
+0502 Acer, Inc.
+ d001 Divio NW801/DVC-V6+ Digital Camera
+0503 Hitachi America, Ltd
+0504 Hayes Microcomputer Products
+0506 3Com Corp.
+ 00a0 3CREB96 Bluetooth Adapter
+ 03e8 3C19250 Ethernet [klsi]
+ 0a11 3CRWE254G72 802.11g Adapter
+ 00df 3Com Home Connect lite
+ 4601 3C460B 10/100 Ethernet Adapter
+ f002 3CP4218 ADSL Modem (pre-init)
+ f003 3CP4218 ADSL Modem
+ f100 3CP4218 ADSL Modem (pre-init)
+0507 Hosiden Corp.
+ 0011 Konami ParaParaParadise Controller
+0508 Clarion Co., Ltd
+0509 Aztech Systems, Ltd
+050a Cinch Connectors
+050b Cable System International
+050c InnoMedia, Inc.
+050d Belkin Components
+ 0012 Bluetooth USB Adapter F8T012
+ 0102 Flip KVM
+ 0103 F5U103 Serial Adapter [etek]
+ 0108 F1DE108B KVM
+ 0109 F5U109/F5U409 PDA Adapter
+ 0115 SCSI Adapter
+ 0121 F5D5050 100Mbps Ethernet
+ 0208 USBView II Video Adapter [nt1004]
+ 0224 F5U224 USB 2.0 4-Port Hub
+ 0234 F5U234 USB 2.0 4-Port Hub
+ 0803 Nostromo 1745 GamePad
+ 0805 Nostromo N50 GamePad
+ 1203 F5U120-PC Serial Port
+ 3101 F1DF102U Flip Hub
+ 3201 F1DF102U Flip KVM
+ 7050 F5D7050 ver 1000 WiFi
+050e Neon Technology, Inc.
+050f KC Technology, Inc.
+ 0003 KC82C160S Hub
+ 0180 KC-180 IrDA Dongle
+ 0190 KC2190 USB Host-to-Host cable
+0510 Sejin Electron, Inc.
+0511 N'Able (DataBook) Technologies, Inc.
+0512 Hualon Microelectronics Corp.
+0513 digital-X, Inc.
+0514 FCI Electronics
+0515 ACTC
+0516 Longwell Electronics
+0517 Butterfly Communications
+0518 EzKEY Corp.
+ 0001 USB to PS2 Adaptor v1.09
+0519 Star Micronics Co., Ltd
+ c002 Xlive Bluetooth XBM-100S MP3 Player
+051a WYSE Technology
+051b Silicon Graphics
+051c Shuttle, Inc.
+051d American Power Conversion
+ 0002 Uninterruptible Power Supply
+051e Scientific Atlanta, Inc.
+051f IO Systems (Elite Electronics), Inc.
+0520 Taiwan Semiconductor Manufacturing Co.
+0521 Airborn Connectors
+0522 Advanced Connectek, Inc.
+0523 ATEN GmbH
+0524 Sola Electronics
+0525 Netchip Technology, Inc.
+ 1080 NET1080 USB-USB Bridge
+ a4a0 Linux-USB "Gadget Zero"
+ a4a1 Linux-USB Ethernet Gadget
+ a4a2 Linux-USB Ethernet/RNDIS Gadget
+ a4a3 Linux-USB user-mode isochronous source/sink
+ a4a4 Linux-USB user-mode bulk source/sink
+ a4a5 Linux-USB File Storage Gadget
+ a4a6 Linux-USB Serial Gadget
+ a4a7 Linux-USB Serial Gadget (CDC ACM mode)
+ a4a8 Linux-USB Printer Gadget
+0526 Temic MHS S.A.
+0527 ALTRA
+0528 ATI Technologies, Inc.
+ 7561 TV Wonder
+0529 Aladdin Knowledge Systems
+ 0001 HASP v0.06
+ 030b eToken R1 v3.1.3.x
+ 0313 eToken R1 v3.2.3.x
+ 031b eToken R1 v3.3.3.x
+ 0323 eToken R1 v3.4.3.x
+ 0412 eToken R2 v2.2.4.x
+ 041a eToken R2 v2.2.4.x
+ 0422 eToken R2 v2.4.4.x
+ 042a eToken R2 v2.5.4.x
+ 050c eToken Pro v4.1.5.x
+ 0514 eToken Pro v4.2.5.4
+052a Crescent Heart Software
+052b Tekom Technologies, Inc.
+ 0801 Yakumo MegaImage 37
+ 1512 Yakumo MegaImage IV
+ 1513 Aosta CX100 WebCam
+ 1514 Aosta CX100 WebCam Storage
+ 1905 Yakumo MegaImage 47
+ 1911 Yakumo MegaImage 47 SL
+ 3a06 DigiLife DDV-5120A
+052c Canon Information Systems, Inc.
+052d Avid Electronics Corp.
+052e Standard Microsystems Corp.
+052f Unicore Software, Inc.
+0530 American Microsystems, Inc.
+0531 Wacom Technology Corp.
+0532 Systech Corp.
+0533 Alcatel Mobile Phones
+0534 Motorola, Inc.
+0535 LIH TZU Electric Co., Ltd
+0536 Hand Held Products (Welch Allyn, Inc.)
+0537 Inventec Corp.
+0538 Caldera International, Inc. (SCO)
+0539 Shyh Shiun Terminals Co., Ltd
+053a Preh Werke GmbH & Co. KG
+053b Global Village Communication
+053c Institut of Microelectronic & Mechatronic Systems
+053d Silicon Architect
+053e Mobility Electronics
+053f Synopsys, Inc.
+0540 UniAccess AB
+ 0101 Panache Surf ISDN TA
+0541 Sirf Technology, Inc.
+0543 ViewSonic Corp.
+ 00fe G773 Monitor Hub
+ 00ff P815 Monitor Hub
+ 4153 ViewSonic G773 Control (?)
+0544 Cristie Electronics, Ltd
+0545 Xirlink, Inc.
+ 8002 IBM NetCamera
+ 800c Veo StingRay
+ 8080 IBM C-It WebCam
+ 810a Veo Advanced Connect WebCam
+0546 Polaroid Corp.
+ 0daf PDC 2300Z
+ 1bed PDC 1320 Camera
+ 3097 PDC 310
+0547 Anchor Chips, Inc.
+ 2131 AN2131 EZUSB Microcontroller
+ 2235 AN2235 EZUSB-FX Microcontroller
+ 2720 AN2720 USB-USB Bridge
+ 2727 Xircom PGUNET USB-USB Bridge
+ 2810 Cypress USB ATAPI Bridge
+ 9999 AN2131 uninitialized (?)
+0548 Tyan Computer Corp.
+ 1005 EZ Cart II GameBoy Flash Programmer
+0549 Pixera Corp.
+054a Fujitsu Microelectronics, Inc.
+054b New Media Corp.
+054c Sony Corp.
+ 0010 DSC-S30/S70/S75/F505V/F505/FD92 Cybershot/Mavica Digital Camera
+ 0023 CD Writer
+ 0024 Mavica CD-1000 Camera
+ 0025 NW-MS7 Walkman MemoryStick Reader
+ 002c USB Floppy Disk Drive
+ 002d MSAC-US1 MemoryStick Reader
+ 002e Sony HandyCam MemoryStick Reader
+ 0032 MemoryStick MSC-U01 Reader
+ 0038 Clie PEG-S300/D PalmOS PDA
+ 004e DSC-xxx (ptp)
+ 0058 Clie PEG-N7x0C PalmOS PDA Mass Storage
+ 0066 Clie PEG-N7x0C/PEG-T425 PalmOS PDA Serial
+ 0069 Memorystick MSC-U03 Reader
+ 006d Clie PEG-T425 PDA Mass Storage
+ 008b Micro Vault 64M Mass Storage
+ 0099 Clie NR70 PDA Mass Storage
+ 009a Clie NR70 PDA Serial
+ 00c0 Handycam DCR-30
+ 00c8 MZ-N710 Minidisc Walkman
+ 00ca MZ-DN430 Minidisc Walkman
+ 00cb MSAC-US20 Memory Stick Reader
+ 0105 Micro Vault Hub
+ 0107 VCC-U01 Visual Communication Camera
+ 0144 Clie PEG-TH55 PDA
+ 014c Aiwa AM-NX9 Net MD Music Recorder MDLP
+ 014d Memory Stick Reader/Writer
+ 0169 Clie PEG-TJ35 PDA Serial
+ 016a Clie PEG-TJ35 PDA Mass Storage
+ 019e Micro Vault 1.0G Mass Storage
+ 01c3 NW-E55 Network Walkman
+ 01d0 DVD+RW External Drive DRU-700A
+ 01fa Sony IC Recorder (P)
+ 01fb NW-E405 Network Walkman
+ 023b DVD+RW External Drive DRU-800UL
+054d Try Corp.
+054e Proside Corp.
+054f WYSE Technology Taiwan
+0550 Fuji Xerox Co., Ltd
+0551 CompuTrend Systems, Inc.
+0552 Philips Monitors
+0553 STMicroelectronics Imaging Division (VLSI Vision)
+ 0002 CPiA WebCam
+ 0151 Digital Blue QX5 Microscope
+ 0202 Aiptek PenCam 1
+ 1002 Che-ez! Splash
+0554 Dictaphone Corp.
+0555 ANAM S&T Co., Ltd
+0556 Asahi Kasei Microsystems Co., Ltd
+ 0001 AK5370 I/F A/D Converter
+0557 ATEN International Co., Ltd
+ 2001 UC-1284 Printer Port
+ 2002 10Mbps Ethernet [klsi]
+ 2004 UC-100KM PS/2 Mouse and Keyboard adapter
+ 2006 UC-1284B Printer Port
+ 2007 UC-110T 100Mbps Ethernet [pegasus]
+ 2008 UC-232A Serial Port [pl2303]
+ 2202 CS124U Miniview II KVM Switch
+ 2600 IDE Bridge
+ 4000 DSB-650 10Mbps Ethernet [klsi]
+ 7000 Hub
+0558 Truevision, Inc.
+0559 Cadence Design Systems, Inc.
+055a Kenwood USA
+055b KnowledgeTek, Inc.
+055c Proton Electronic Ind.
+055d Samsung Electro-Mechanics Co.
+ 9000 AnyCam [pwc]
+ 9001 MPC-C30 AnyCam Premium for Notebooks [pwc]
+055e CTX Opto-Electronics Corp.
+055f Mustek Systems, Inc.
+ 0001 ScanExpress 1200 CU
+ 0002 ScanExpress 600 CU
+ 0003 ScanExpress 1200 USB
+ 0006 ScanExpress 1200 UB
+ 0007 ScanExpress 1200 USB Plus
+ 0008 ScanExpress 1200 CU Plus
+ 0010 BearPaw 1200F
+ 0210 ScanExpress A3 USB
+ 0218 BearPaw 2400 TA
+ 0219 BearPaw 2400 TA Plus
+ 021a BearPaw 2448 TA Plus
+ 021c BearPaw 1200 CU Plus
+ 021d BearPaw 2400 CU Plus
+ 021e BearPaw 1200 TA/CS
+ 0400 BearPaw 2400 TA Pro
+ 0401 P 3600 A3 Pro
+ 0873 ScanExpress 600 USB
+ 1000 BearPaw 4800 TA Pro
+ a350 gSmart 350
+ a800 MDC 800 Camera
+ b500 MDC 3000 Camera
+ c200 gSmart 300
+ c220 gSmart mini
+ c360 Mustek DV 4000
+ c420 gSmart mini 2
+ c440 Mustek DV 3000
+ c520 gSmart mini 3
+ c530 Mustek Gsmart LCD 2
+ c631 MDC-4000
+ c650 Mustek MDC5500Z
+ d001 WCam 300
+0560 Interface Corp.
+0561 Oasis Design, Inc.
+0562 Telex Communications, Inc.
+ 0001 Enhanced Microphone
+0563 Immersion Corp.
+0564 Chinon Industries, Inc.
+0565 Peracom Networks, Inc.
+ 0001 Serial Port [etek]
+ 0002 Enet Ethernet [klsi]
+ 0003 @Home Networks Ethernet [klsi]
+ 0005 Enet2 Ethernet [klsi]
+0566 Monterey International Corp.
+0567 Xyratex International, Ltd
+0568 Quartz Ingenierie
+0569 SegaSoft
+056a Wacom Co., Ltd
+ 0000 PenPartner
+ 0010 Graphire
+ 0011 Graphire 2
+ 0020 Intuos 4x5
+ 0021 Intuos 6x8
+ 0022 Intuos 9x12
+ 0023 Intuos 12x12
+ 0024 Intuos 12x18
+ 0031 PL500
+ 0042 Intuos 2 6x8
+ 0043 Intuos 2
+056b Decicon, Inc.
+056c eTEK Labs
+ 8007 Kwik232 Serial Port
+ 8101 KwikLink USB-USB Bridge
+056d EIZO Corp.
+ 0000 Hub
+ 0001 Monitor
+056e Elecom Co., Ltd
+ 0002 29UO Mouse
+ 4002 Laneed 100Mbps Ethernet LD-USB/TX [pegasus]
+056f Korea Data Systems Co., Ltd
+ cd00 CDM-751 CD organizer
+0570 Epson America
+0571 Interex, Inc.
+ 0002 echoFX InterView Lite
+0572 Conexant Systems (Rockwell), Inc.
+ 0001 Ezcam II WebCam
+ 0002 Ezcam II WebCam
+ 0040 Wondereye CP-115 WebCam
+ 1232 V.90 modem
+ cafe AccessRunner ADSL Modem
+ cb00 E-Tech ADSL Modem v2
+ cb01 GeekADSL Promax Q31 ADSL Modem
+0573 Zoran Co. Personal Media Division (Nogatech)
+ 0003 USBGear USBG-V1
+ 0400 D-Link V100
+ 2000 X10 va10a Wireless Camera
+ 2101 Zoran Co. PMD (Nogatech) AV-grabber Manhattan
+ 2d00 Osprey 50
+ 2d01 Hauppauge USB-Live Model 600
+ 4100 USB-TV FM (NTSC)
+ 4110 PNY USB-TV (NTSC) FM
+ 4450 PixelView PlayTv-USB PRO (PAL) FM
+ 4550 ZTV ZT-721 2.4GHz USB A/V Receiver
+ 4d00 Hauppauge WinTV-USB USA
+ 4d01 Hauppauge WinTV-USB
+ 4d02 Hauppauge WinTV-USB UK
+ 4d03 Hauppauge WinTV-USB France
+ 4d10 Hauppauge WinTV-USB with FM USA radio
+ 4d11 Hauppauge WinTV-USB (PAL) with FM radio
+ 4d12 Hauppauge WinTV-USB UK with FM Radio
+ 4d20 Hauppauge WinTV-USB II (PAL) with FM radio
+ 4d21 Hauppauge WinTV-USB II (PAL)
+ 4d22 Hauppauge WinTV-USB II (PAL) Model 566
+ 4d23 Hauppauge WinTV-USB France 4D23
+ 4d25 Hauppauge WinTV-USB Model 40209 rev B234
+ 4d26 Hauppauge WinTV-USB Model 40209 rev B243
+ 4d27 Hauppauge WinTV-USB Model 40204 Rev B281
+ 4d28 Hauppauge WinTV-USB Model 40204 rev B283
+ 4d29 Hauppauge WinTV-USB Model 40205 rev B298
+ 4d2a Hauppague WinTV-USB Model 602 Rev B285
+ 4d2b Hauppague WinTV-USB Model 602 Rev B282
+ 4d30 Hauppauge WinTV-USB FM Model 40211 Rev B123
+ 4d31 Hauppauge WinTV-USB III (PAL) with FM radio Model 568
+ 4d32 Hauppauge WinTV-USB III (PAL) FM Model 573
+ 4d35 Hauppauge WinTV-USB III (PAL) FM Model 597
+ 4d37 Hauppauge WinTV-USB Model 40219 rev E189
+0574 City University of Hong Kong
+0575 Philips Creative Display Solutions
+0576 BAFO/Quality Computer Accessories
+0577 ELSA
+0578 Intrinsix Corp.
+0579 GVC Corp.
+057a Samsung Electronics America
+057b Y-E Data, Inc.
+ 0000 FlashBuster-U Floppy
+ 0001 Tri-Media Reader Floppy
+ 0006 Tri-Media Reader Card Reader
+ 0010 Memory Stick Reader Writer
+ 0020 HEXA Media Drive 6-in-1 Card Reader Writer
+ 0030 Memory Card Viewer (TV)
+057c AVM GmbH
+ 2800 ISDN-Connector TA
+ 3800 BlueFRITZ! Bluetooth Stick
+ 3d00 Fritz!Box
+057d Shark Multimedia, Inc.
+057e Nintendo Co., Ltd
+057f QuickShot, Ltd
+0580 Denron, Inc.
+0581 Racal Data Group
+0582 Roland Corp.
+ 0002 MPU64 Midi Interface
+ 0003 Sound Canvas SC-8850
+ 0005 Edirol UM-2 MIDI Adapter
+ 0009 Edirol UM-1SX MIDI Adapter
+ 0011 Edirol UA-5 Sound Capture
+ 002d VX-2020 Synthesizer
+0583 Padix Co., Ltd (Rockfire)
+ 2030 RM-203 USB Nest [mode 1]
+ 2031 RM-203 USB Nest [mode 2]
+ 2032 RM-203 USB Nest [mode 3]
+ 2033 RM-203 USB Nest [mode 4]
+ 2050 PX-205 PSX Bridge
+ 3050 QF-305u Gamepad
+ 688f QF-688uv Windstorm Pro Joystick
+ 7070 QF-707u Bazooka Joystick
+0584 RATOC System, Inc.
+0585 FlashPoint Technology, Inc.
+0586 ZyXEL Communications Corp.
+ 1000 Omni NET Modem / ISDN TA
+ 330e USB Broadband ADSL Modem Rev 1.10
+ 3401 ZyAIR G-220
+0587 America Kotobuki Electronics Industries, Inc.
+0588 Sapien Design
+0589 Victron
+058a Nohau Corp.
+058b Infineon Technologies
+058c In Focus Systems
+058d Micrel Semiconductor
+058e Tripath Technology, Inc.
+058f Alcor Micro Corp.
+ 2802 Monterey Keyboard
+ 5492 Hub
+ 6232 Hi-Speed 16-in-1 Flash Card Reader/Writer
+ 6362 Hi-Speed Internal Multi-Card Reader/Writer
+ 9213 MacAlly Kbd Hub
+ 9215 AU9814 Hub
+ 9254 Hub
+ 9330 SD Reader
+ 9360 8-in-1 Media Card Reader
+ 9380 Flash drive
+ 9382 Acer/Sweex Flash drive
+ 9410 Keyboard
+ 9472 Keyboard Hub
+ 9720 USB-Serial Adapter
+0590 Omron Corp.
+ 0004 Cable Modem
+0591 Questra Consulting
+0592 Powerware Corp.
+0593 Incite
+0594 Princeton Graphic Systems
+0595 Zoran Microelectronics, Ltd
+ 1001 Digitrex DSC-1300/DSC-2100 (mass storage mode)
+0596 MicroTouch Systems, Inc.
+ 0001 Touchscreen
+0597 Trisignal Communications
+0598 Niigata Canotec Co., Inc.
+0599 Brilliance Semiconductor, Inc.
+059a Spectrum Signal Processing, Inc.
+059b Iomega Corp.
+ 0001 Zip 100 (Type 1)
+ 000b Zip 100 (Type 2)
+ 0030 Zip 250 (Ver 1)
+ 0031 Zip 100 (Type 3)
+ 0032 Zip 250 (Ver 2)
+ 0040 SCSI Bridge
+ 0050 Zip CD 650 Writer
+ 0053 CDRW55292EXT CD-RW External Drive
+ 006d HipZip MP3 Player
+ 015d Super DVD Writer
+ 1052 DVD+RW External Drive
+059c A-Trend Technology Co., Ltd
+059d Advanced Input Devices
+059e Intelligent Instrumentation
+059f LaCie, Ltd
+ 0211 PocketDrive
+ 0212 PocketDrive
+ 0323 LaCie d2 Drive USB2
+ 0641 Mobile Hard drvie
+ a601 HardDrive
+05a0 Vetronix Corp.
+05a1 USC Corp.
+05a2 Fuji Film Microdevices Co., Ltd
+05a3 ARC International
+05a4 Ortek Technology, Inc.
+ 9731 MCK-600W Keyboard
+05a5 Sampo Technology Corp.
+05a6 Cisco Systems, Inc.
+05a7 Bose Corp.
+05a8 Spacetec IMC Corp.
+05a9 OmniVision Technologies, Inc.
+ 0511 OV511 WebCam
+ 0518 OV518 WebCam
+ a511 OV511+ WebCam
+05aa Utilux South China, Ltd
+05ab In-System Design
+ 0002 Parallel Port
+ 0031 ATA Bridge
+ 0060 USB 2.0 ATA Bridge
+ 0200 USS725 ATA Bridge
+ 0202 ATA Bridge
+ 081a ATA Bridge
+ 0cda ATA Bridge for CD-R/RW
+05ac Apple Computer, Inc.
+ 0201 Apple USB Keyboard [Alps or Logitech, M2452]
+ 0202 Apple Keyboard [ALPS]
+ 0205 Apple Extended Keyboard [Mitsumi]
+ 0206 Apple Extended Keyboard [Mitsumi]
+ 020b Apple Pro Keyboard [Mitsumi, A1048/US layout]
+ 020d Apple Pro Keyboard [Mitsumi, A1048/JIS layout]
+ 020e Apple Internal Keyboard/Trackpad
+ 020f Apple Internal Keyboard/Trackpad
+ 0301 Apple USB Mouse [Mitsumi, M4848]
+ 0302 Apple Optical Mouse [Fujitsu]
+ 0304 Apple Optical USB Mouse [Mitsumi]
+ 0306 Apple Optical USB Mouse [Fujitsu]
+ 1001 Apple Keyboard Hub [ALPS]
+ 1002 Apple Extended Keyboard Hub [Mitsumi]
+ 1003 Hub in Apple Pro Keyboard [Mitsumi, A1048]
+ 1101 Speakers
+ 1201 3G iPod
+ 1204 iPod [Photo]
+ 120A iPod Nano
+ 1300 iPod Shuffle
+ 8202 HCF V.90 Data/Fax Modem
+ 8203 Bluetooth HCI
+ 8204 Bluetooth HCI [Bluetooth 2.0 + EDR, build-in]
+ 8240 IR Receiver [build-in]
+ 8501 Built-in iSight [Micron]
+05ad Y.C. Cable U.S.A., Inc.
+05ae Synopsys, Inc.
+05af Jing-Mold Enterprise Co., Ltd
+05b0 Fountain Technologies, Inc.
+05b1 First International Computer, Inc.
+05b4 LG Semicon Co., Ltd
+ 4857 M-Any DAH-210
+ 6001 Digisette DUO-MP3 AR-100
+05b5 Dialogic Corp.
+05b6 Proxima Corp.
+05b7 Medianix Semiconductor, Inc.
+05b8 Agiler, Inc.
+ 3002 Scroll Mouse
+05b9 Philips Research Laboratories
+05ba DigitalPersona, Inc.
+05bb Grey Cell Systems
+05bc 3G Green Green Globe Co., Ltd
+ 0004 Trackball
+05bd RAFI GmbH & Co. KG
+05be Tyco Electronics (Raychem)
+05bf S & S Research
+05c0 Keil Software
+05c1 Kawasaki Microelectronics, Inc.
+05c2 Media Phonics (Suisse) S.A.
+05c5 Digi International, Inc.
+05c6 Qualcomm, Inc.
+ 3100 CDMA Wireless Modem/Phone
+ 3196 CDMA Wireless Modem
+ 3197 CDMA Wireless Modem/Phone
+05c7 Qtronix Corp.
+ 1001 Lynx Mouse
+ 2011 SCorpius Keyboard
+05c8 Cheng Uei Precision Industry Co., Ltd (Foxlink)
+05c9 Semtech Corp.
+05ca Ricoh Co., Ltd
+ 0101 RDC-5300 Camera
+ 0325 Caplio GX (ptp)
+ 032d Caplio GX 8 (ptp)
+ 032f Caplio R3 (ptp)
+ 2201 RDC-7 Camera
+ 2202 Caplio RR30
+ 2203 Caplio 300G
+ 2204 Caplio G3
+ 2205 Caplio RR30 / Medion MD 6126 Camera
+ 2208 Caplio G4
+ 220b Caplio RX
+ 220c Caplio GX
+ 220d Caplio R1/RZ1
+ 220e Sea & Sea 5000G
+ 220f Rollei dr5 / Rollei dr5 (PTP mode)
+ 2212 Caplio R1v Camera
+ 2213 Caplio R2
+ 2214 Caplio GX 8
+ 2216 Caplio R3
+ 2222 RDC-i500
+05cb PowerVision Technologies, Inc.
+ 1483 PV8630 interface (scanners, webcams)
+05cc ELSA AG
+ 2100 MicroLink ISDN Office
+ 2219 MicroLink ISDN
+ 2265 MicroLink 56k
+ 2267 MicroLink 56k (V.250)
+ 2280 MicroLink 56k Fun
+ 3000 Micolink USB2Ethernet [pegasus]
+ 3363 MicroLink ADSL Fun
+05cd Silicom, Ltd
+05ce sci-worx GmbH
+05cf Sung Forn Co., Ltd
+05d0 GE Medical Systems Lunar
+05d1 Brainboxes, Ltd
+05d2 Wave Systems Corp.
+05d3 Tohoku Ricoh Co., Ltd
+05d5 Super Gate Technology Co., Ltd
+05d6 Philips Semiconductors, CICT
+05d7 Thomas & Betts Corp.
+ 0099 10Mbps Ethernet [klsi]
+05d8 Ultima Electronics Corp.
+ 4001 Artec Ultima 2000
+ 4002 Artec Ultima 2000 (GT6801 based)/Lifetec LT9385 Scanner
+ 4003 Artec E+ 48U
+ 4004 Artec E+ Pro
+ 4008 Trust Easy Webscan 19200
+ 4009 Umax Astraslim
+ 8105 Artec T1 USB TVBOX (cold)
+ 8106 Artec T1 USB TVBOX (warm)
+ 8107 Artec T1 USB TVBOX with AN2235 (cold)
+ 8108 Artec T1 USB TVBOX with AN2235 (warm)
+ 8109 Artec T1 USB2.0 TVBOX (cold
+05d9 Axiohm Transaction Solutions
+05da Microtek International, Inc.
+ 0093 ScanMaker V6USL
+ 0094 Phantom 336CX/C3
+ 0099 ScanMaker X6/X6U
+ 009a Phantom C6
+ 00a0 Phantom 336CX/C3 (#2)
+ 00b6 ScanMaker V6UPL
+ 1006 Jenoptik JD350 entrance
+ 1011 NHJ Che-ez! Kiss Digital Camera
+ 1018 Digital Dream Enigma 1.3
+ 1020 Digital Dream l'espion xtra
+ 1045 Take-it D1
+ 30ce ScanMaker 3800
+ 30cf ScanMaker 4800
+ 30e6 ScanMaker i320
+ 40ca ScanMaker 3600
+ 80a3 ScanMaker V6USL (#2)
+ 80ac ScanMaker V6UL/SpicyU
+05db Sun Corp. (Suntac?)
+05dc Lexar Media, Inc.
+ 0080 Jumpdrive Secure 64MB
+ 0200 JumpDrive 2.0 Pro
+ 0300 Jumpdrive Geysr
+ a410 JumpDrive 128MB/256MB
+ b018 Multi-Card Reader
+05dd Delta Electronics, Inc.
+05df Silicon Vision, Inc.
+05e0 Symbol Technologies
+05e1 Syntek Semiconductor Co., Ltd
+05e2 ElecVision, Inc.
+05e3 Genesys Logic, Inc.
+ 000a Keyboard with PS/2 Port
+ 000b Mouse
+ 0100 Nintendo Game Boy Advance SP
+ 0120 Pacific Image Electronics PrimeFilm 1800u slide/negative scanner
+ 0300 GLUSB98PT Parallel Port
+ 0406 Hub
+ 0502 GL620USB GeneLink USB-USB Bridge
+ 0604 USB 1.1 Hub
+ 0605 USB 2.0 Hub [ednet]
+ 0606 D-Link DUB-H4 USB 2.0 Hub
+ 0660 USB 2.0 Hub
+ 0700 SIIG US2256 CompactFlash Card Reader
+ 0701 USB 2.0 IDE Adapter
+ 0702 USB 2.0 IDE Adapter
+ 0703 Card Reader
+ 070e X-PRO CR20xA USB 2.0 Internal Card Reader
+ 0710 USB 2.0 33-in-1 Card Reader
+ 0715 USB 2.0 microSD Reader
+ 0760 USB 2.0 Card Reader/Writer
+ 07A0 Pen Flash
+ 1205 Afilias Optical Mouse H3003
+05e4 Red Wing Corp.
+05e5 Fuji Electric Co., Ltd
+05e6 Keithley Instruments
+05e8 ICC, Inc.
+05e9 Kawasaki LSI
+ 0008 KL5KUSB101B Ethernet [klsi]
+ 0009 Sony 10Mbps Ethernet [pegasus]
+05eb FFC, Ltd
+05ec COM21, Inc.
+05ee Cytechinfo Inc.
+05ef AVB, Inc. [anko?]
+ 020a Top Shot Pegasus Joystick
+ 8884 Mag Turbo Force Wheel
+ 8888 Top Shot Force Feedback Racing Wheel
+05f0 Canopus Co., Ltd
+ 0101 DA-Port DAC
+05f1 Compass Communications
+05f2 Dexin Corp., Ltd
+05f3 PI Engineering, Inc.
+ 0007 Kinesis Advantage PRO MPC/USB Keyboard
+ 0081 Kinesis Integrated Hub
+ 020b PS2 Adapter
+ 0232 X-Keys Switch Interface, Programming Mode
+ 0261 X-Keys Switch Interface, SPLAT Mode
+ 0264 X-Keys Switch Interface, Composite Mode
+05f5 Unixtar Technology, Inc.
+05f6 AOC International
+05f7 RFC Distribution(s) PTE, Ltd
+05f9 PSC Scanning, Inc.
+05fa Siemens Telecommunications Systems, Ltd
+05fc Harman Multimedia
+05fd InterAct, Inc.
+ 0251 Raider Pro
+ 0253 ProPad 8 Digital
+ 262a 3dfx HammerHead FX
+ daae Game Shark
+05fe Chic Technology Corp.
+ 0001 Mouse
+ 0005 Viewmaster 4D Browser Mouse
+ 0007 Twinhead Mouse
+ 0009 Inland Pro 4500/5000 Mouse
+ 0011 Browser Mouse
+05ff LeCroy Corp.
+0600 Barco Display Systems
+0601 Jazz Hipster Corp.
+0602 Vista Imaging, Inc.
+ 1001 ViCam WebCam
+0603 Novatek Microelectronics Corp.
+ 00f1 Keyboard
+ 6871 Mouse
+0604 Jean Co., Ltd
+0605 Anchor C&C Co., Ltd
+0606 Royal Information Electronics Co., Ltd
+0607 Bridge Information Co., Ltd
+0608 Genrad Ads
+0609 SMK Manufacturing, Inc.
+060a Worthington Data Solutions, Inc.
+060b Solid Year
+ 0001 MacAlly Keyboard
+ 2101 Keyboard
+ 5811 ACK-571U Wireless Keyboard
+ a001 Maxwell Compact Pc PM3
+060c EEH Datalink GmbH
+060d Auctor Corp.
+060e Transmonde Technologies, Inc.
+060f Joinsoon Electronics Mfg. Co., Ltd
+0610 Costar Electronics, Inc.
+0611 Totoku Electric Co., Ltd
+0613 TransAct Technologies, Inc.
+0614 Bio-Rad Laboratories
+0615 Quabbin Wire & Cable Co., Inc.
+0616 Future Techno Designs PVT, Ltd
+0617 Swiss Federal Insitute of Technology
+0618 MacAlly
+ 0101 Mouse
+0619 Seiko Instruments, Inc.
+061a Veridicom International, Inc.
+ 0110 5thSense Fingerprint Sensor
+ 0200 FPS200 Fingerprint Sensor
+ 8200 VKI-A Fingerprint Sensor/Flash Storage (dumb)
+ 9200 VKI-B Fingerprint Sensor/Flash Storage (smart)
+061b Promptus Communications, Inc.
+061c Act Labs, Ltd
+061d Quatech, Inc.
+061e Nissei Electric Co.
+0620 Alaris, Inc.
+0621 ODU-Steckverbindungssysteme GmbH & Co. KG
+0622 Iotech, Inc.
+0623 Littelfuse, Inc.
+0624 Avocent Corp.
+0625 TiMedia Technology Co., Ltd
+0626 Nippon Systems Development Co., Ltd
+0627 Adomax Technology Co., Ltd
+0628 Tasking Software, Inc.
+0629 Zida Technologies, Ltd
+062a Creative Labs
+ 0001 Notebook Optical Mouse
+ 9004 USR9602 USB Internet Mini Phone
+062b Greatlink Electronics Taiwan, Ltd
+062c Institute for Information Industry
+062d Taiwan Tai-Hao Enterprises Co., Ltd
+062e Mainsuper Enterprises Co., Ltd
+062f Sin Sheng Terminal & Machine, Inc.
+0631 JUJO Electronics Corp.
+0633 Cyrix Corp.
+0634 Micron Technology, Inc.
+0635 Methode Electronics, Inc.
+0636 Sierra Imaging, Inc.
+0638 Avision, Inc.
+ 0268 iVina 1200U Scanner
+ 026a Minolta Dimage Scan Dual II
+ 0a10 iVina FB1600/UMAX Astra 4500
+ 4004 Minolta Dimage Scan Elite II
+0639 Chrontel, Inc.
+063a Techwin Corp.
+063b Taugagreining HF
+063c Yamaichi Electronics Co., Ltd (Sakura)
+063d Fong Kai Industrial Co., Ltd
+063e RealMedia Technology, Inc.
+063f New Technology Cable, Ltd
+0640 Hitex Development Tools
+0641 Woods Industries, Inc.
+0642 VIA Medical Corp.
+0644 TEAC Corp.
+ 0000 Floppy
+ 800D TASCAM Portastudio DP-01FX
+0645 Who? Vision Systems, Inc.
+0646 UMAX
+0647 Acton Research Corp.
+ 0100 ARC SpectraPro UV/VIS/IR Monochromator/Spectrograph
+ 0101 ARC AM-VM Mono Airpath/Vacuum Monochromator/Spectrograph
+ 0102 ARC Inspectrum Mono
+ 0103 ARC Filterwheel
+ 03e9 Inspectrum 128x1024 F VIS Spectrograph
+ 03ea Inspectrum 256x1024 F VIS Spectrograph
+ 03eb Inspectrum 128x1024 B VIS Spectrograph
+ 03ec Inspectrum 256x1024 B VIS Spectrograph
+0648 Inside Out Networks
+0649 Weli Science Co., Ltd
+064b White Mountain DSP, Inc.
+064c Ji-Haw Industrial Co., Ltd
+064d TriTech Microelectronics, Ltd
+064e Suyin Corp.
+064f WIBU-Systems AG
+0650 Dynapro Systems
+0651 Likom Technology Sdn. Bhd.
+0652 Stargate Solutions, Inc.
+0653 CNF, Inc.
+0654 Granite Microsystems, Inc.
+0655 Space Shuttle Hi-Tech Co., Ltd
+0656 Glory Mark Electronic, Ltd
+0657 Tekcon Electronics Corp.
+0658 Sigma Designs, Inc.
+0659 Aethra
+065a Optoelectronics Co., Ltd
+ 0001 Barcode scanner
+065b Tracewell Systems
+065e Silicon Graphics
+065f Good Way Technology Co., Ltd & GWC technology Inc.
+0660 TSAY-E (BVI) International, Inc.
+0661 Hamamatsu Photonics K.K.
+0662 Kansai Electric Co., Ltd
+0663 Topmax Electronic Co., Ltd
+ 0103 CobraPad
+0667 Aiwa Co., Ltd
+ 0fa1 TD-U8000 Tape Drive
+0668 WordWand
+0669 Oce' Printing Systems GmbH
+066a Total Technologies, Ltd
+066b Linksys, Inc.
+ 0105 SCM eUSB SmartMedia Card Reader
+ 010a Melco MCR-U2 SmartMedia / CompactFlash Reader
+ 2202 USB10TX Ethernet [pegasus]
+ 2203 USB100TX Ethernet [pegasus]
+ 2204 USB100TX HomePNA Ethernet [pegasus]
+ 2206 USB Ethernet [pegasus]
+ 2211 WUSB11 802.11b Adapter
+ 2212 WUSB11v2.5 802.11b Adapter
+ 2213 WUSB12v1.1 802.11b Adapter
+066d Entrega, Inc.
+066e Acer Semiconductor America, Inc.
+066f SigmaTel, Inc.
+ 004b A-Max PA11 MP3 Player
+ 3400 STMP3400 D-Major MP3 Player
+ 3410 STMP3410 D-Major MP3 Player
+ 4200 STIr4200 IrDA Bridge
+ 4210 STIr4210 IrDA Bridge
+ 8004 MSCNMMC MP3 Player
+ 8202 Jens of Sweden / I-BEAD 150M/150H MP3 player
+ 8206 Digital MP3 Music Player
+0672 Labtec, Inc.
+ 1041 LCS1040 Speaker System
+ 5000 SpaceBall 4000 FLX
+0673 HCL
+ 5000 Keyboard
+0674 Key Mouse Electronic Enterprise Co., Ltd
+0675 Draytech
+ 0110 Vigor 128 ISDN TA
+0676 Teles AG
+0677 Aiwa Co., Ltd
+ 0fa1 TD-U8000 Tape Drive
+0678 ACard Technology Corp.
+067b Prolific Technology, Inc.
+ 0000 PL2301 USB-USB Bridge
+ 0001 PL2302 USB-USB Bridge
+ 2303 PL2303 Serial Port
+ 2305 PL2305 Parallel Port
+ 2307 PL2307 USB-ATAPI4 Bridge
+ 2315 Flash Disk Embedded Hub
+ 2316 Flash Disk Security Device
+ 2317 Mass Storage Device
+ 2501 PL2501 USB-USB Bridge (USB 2.0)
+ 2507 PL2507 Hi-speed USB to IDE bridge controller
+ 2515 Flash Disk Embedded Hub
+ 2517 Flash Disk Mass Storage Device
+ 3507 PL3507 ATAPI6 Bridge
+067c Efficient Networks, Inc.
+ 1001 Siemens SpeedStream 100MBps Ethernet
+ 1022 Siemens SpeedStream 1022 802.11b Adapter
+ 4060 Alcatel Speedstream 4060 ADSL Modem
+067d Hohner Corp.
+067e Intermec
+067f Virata, Ltd
+0680 Realtek Semiconductor Corp., CPP Div. (Avance Logic)
+ 0002 Arowana Optical Wheel Mouse MSOP-01
+0681 Siemens Information and Communication Products
+ 0002 Gigaset 3075 Passive ISDN
+ 0005 ID-Mouse with Fingerprint Reader
+ 0012 I-Gate 802.11b Adapter
+ 002b A-100-I ADSL Modem
+0682 Victor Company of Japan, Ltd
+0684 Actiontec Electronics, Inc.
+0686 Minolta Co., Ltd
+ 4003 Dimage 2330 Zoom Camera
+ 4004 Scan Elite II
+ 4006 Dimage 7 Camera
+ 4007 Dimage S304 Camera
+ 4008 Dimage 5 Camera
+ 4009 Dimage X Camera
+ 400a Dimage S404 Camera
+ 400b Dimage 7i Camera
+ 400c Dimage F100 Camera
+ 400d Scan Dual III
+ 400f Dimage 7Hi Camera
+ 4010 Dimage Xi Camera
+ 4011 Dimage F300 Camera
+ 4012 Dimage F200 Camera
+ 4014 Dimage S414 Camera
+ 4015 Dimage XT Camera [storage]
+ 4016 Dimage XT Camera [remote mode]
+ 4018 Dimage Z1 Camera
+ 401a Dimage A1 Camera
+ 401c Dimage X20 Camera
+ 401e Dimage E323 Camera
+068a Pertech, Inc.
+068b Potrans International, Inc.
+068e CH Products, Inc.
+ 00e2 HFX OEM Joystick
+ 00f2 Flight Sim Pedals
+ 00ff Flight Sim Yoke
+ 0500 GameStick 3D
+ 0501 CH Pro Pedals
+ 0504 F-16 Combat Stick
+0690 Golden Bridge Electech, Inc.
+0693 Hagiwara Sys-Com Co., Ltd
+ 0002 FlashGate SmartMedia Card Reader
+ 0003 FlashGate CompactFlash Card Reader
+ 0005 FlashGate
+0694 Lego Group
+ 0001 Mindstorms Tower
+0698 Chuntex (CTX)
+ 1786 1300ex Monitor
+ 9999 VLxxxx Monitor+Hub
+0699 Tektronix, Inc.
+069a Askey Computer Corp.
+ 0001 VC010 WebCam [pwc]
+ 0303 Cable Modem
+ 0321 Dynalink WLL013 / Compex WLU11A 802.11b Adapter
+ 0821 BT Voyager 1010 802.11b Adapter
+069b Thomson, Inc.
+ 0704 DCM245 Cable Modem
+ 070f RCA Lyra RD1071 MP3 Player
+ 2220 RCA Kazoo RD1000 MP3 Player
+ 300a RCA Lyra MP3 Player
+ 5557 RCA CDS6300
+069d Hughes Network Systems (HNS)
+ 0002 Satellite Device
+069e Marx
+ 0005 CryptoBox v1.2
+069f Allied Data Technologies BV
+ 0010 Tornado Speakerphone FaxModem 56.0
+ 0011 Tornado Speakerphone FaxModem 56.0
+06a2 Topro Technology, Inc.
+06a3 Saitek PLC
+ 0006 Cyborg Gold Joystick
+ 0200 Xbox Adrenalin Hub
+ 0241 Xbox Adrenalin Gamepad
+ 0422 ST90 Joystick
+ 052d P750 Gamepad
+ 053f X36F Flightstick
+ 100a SP550 Pad and Joystick Combo
+ 100b SP550 Pad
+ 3509 P3000 RF GamePad
+ ff0c Cyborg Force Rumble Pad
+ ffb5 Cyborg Evo Force Joystick
+06a4 Xiamen Doowell Electron Co., Ltd
+06a5 Divio
+ 0000 Typhoon Webcam 100k [nw8000]
+ d001 ProLink DS3303u WebCam
+ d800 Chicony TwinkleCam
+06a7 MicroStore, Inc.
+06a8 Topaz Systems, Inc.
+ 0042 SignatureGem 1X5 Pad
+ 0043 SignatureGem 1X5-HID Pad
+06a9 Westell
+06aa Sysgration, Ltd
+06ac Fujitsu Laboratories of America, Inc.
+06ad Greatland Electronics Taiwan, Ltd
+06ae Professional Multimedia Testing Centre
+06af Harting, Inc. of North America
+06b8 Pixela Corp.
+06b9 Alcatel Telecom
+ 0121 SpeedTouch 121g Wireless Dongle
+ 4061 SpeedTouch ISDN or ADSL Modem
+ a5a5 DynaMiTe Modem
+06ba Smooth Cord & Connector Co., Ltd
+06bb EDA, Inc.
+06bc Oki Data Corp.
+06bd AGFA-Gevaert NV
+ 0001 SnapScan 1212U
+ 0002 SnapScan 1236U
+ 0100 SnapScan Touch
+ 0400 CL30
+ 0403 ePhoto CL18 Camera
+ 0404 ePhoto CL20 Camera
+ 2061 SnapScan 1212U (?)
+ 208d Snapscan e40
+ 208f SnapScan e50
+ 2091 SnapScan e20
+ 2093 SnapScan e10
+ 2095 SnapScan e25
+ 2097 SnapScan e26
+ 20fd SnapScan e52
+ 20ff SnapScan e42
+06be AME Optimedia Technology Co., Ltd
+06bf Leoco Corp.
+06c2 Phidgets Inc. (formerly GLAB)
+ 0030 PhidgetRFID
+ 0038 4-Motor PhidgetServo v3.0
+ 0039 1-Motor PhidgetServo v3.0
+ 003a 8-Motor PhidgetAvancedServo
+ 0040 PhidgetInterface Kit 0-0-4
+ 0044 PhidgetInterface Kit 0-16-16
+ 0045 PhidgetInterface Kit 8-8-8
+ 0048 PhidgetStepper (Under Development)
+ 0049 PhidgetTextLED Ver 1.0
+ 004a PhidgetLED Ver 1.0
+ 004b PhidgetEncoder Ver 1.0
+ 0051 PhidgetInterface Kit 0-5-7 (Custom)
+ 0052 PhidgetTextLCD
+ 0053 PhidgetInterfaceKit 0-8-8
+ 0058 PhidgetMotorControl Ver 1.0
+ 0070 PhidgetTemperatureSensor Ver 1.0
+ 0071 PhidgetAccelerometer Ver 1.0
+ 0072 PhidgetWeightSensor Ver 1.0
+ 0073 PhidgetHumiditySensor
+ 0074 PhidgetPHSensor
+ 0075 PhidgetGyroscope
+06c4 Bizlink International Corp.
+06c5 Hagenuk, GmbH
+06c6 Infowave Software, Inc.
+06c8 SIIG, Inc.
+06c9 Taxan (Europe), Ltd
+06ca Newer Technology, Inc.
+06cb Synaptics, Inc.
+ 0009 Composite TouchPad and TrackPoint
+06cc Terayon Communication Systems
+06cd Keyspan
+ 0101 USA-28 PDA [no firmware]
+ 0102 USA-28X PDA [no firmware]
+ 0103 USA-19 PDA [no firmware]
+ 0104 PDA [prerenum]
+ 0105 USA-18X PDA [no firmware]
+ 0106 USA-19W PDA [no firmware]
+ 0107 USA-19 PDA
+ 0108 USA-19W PDA
+ 0109 USA-49W serial adapter [no firmware]
+ 010a USA-49W serial adapter
+ 010b USA-19Qi serial adapter [no firmware]
+ 010c USA-19Qi serial adapter
+ 010f USA-28 PDA
+ 0110 USA-28Xb PDA
+ 0112 USA-18X PDA
+ 0113 USA-28Xb PDA [no firmware]
+ 0114 USA-28Xa PDA [no firmware]
+ 0115 USA-28Xa PDA
+ 0118 USA-19QW PDA [no firmware]
+ 0119 USA-19QW PDA
+ 011a USA-49Wlc serial adapter [no firmware]
+ 012a USA-49Wlc serial adapter
+ 0121 USA-19hs serial adapter
+ 0201 Digital Media Remote
+06cf SpheronVR AG
+ 1010 PanoCam 10
+ 1012 PanoCam 12/12X
+06d0 LapLink, Inc.
+ 0622 LapLink Gold USB-USB Bridge [net1080]
+06d1 Daewoo Electronics Co., Ltd
+06d3 Mitsubishi Electric Corp.
+06d4 Cisco Systems
+06d5 Toshiba
+ 4000 Japanese Keyboard
+06d6 Aashima Technology B.V.
+ 002d Trust PowerC@m 350FT
+ 002e Trust PowerC@m 350FS
+ 003a Trust PowerC@m 770Z
+ 003c Trust 910z PowerC@m
+06d7 Network Computing Devices (NCD)
+06d8 Technical Marketing Research, Inc.
+06da Phoenixtec Power Co., Ltd
+06db Paradyne
+06dc Foxlink Image Technology Co., Ltd
+ 0014 Prolink Winscan Pro 2448U
+06de Heisei Electronics Co., Ltd
+06e0 Multi-Tech Systems, Inc.
+ f101 MT5634ZBA-USB MultiModemUSB (old firmware)
+ f103 MT5634MU MultiMobileUSB
+ f104 MT5634ZBA-USB MultiModemUSB (new firmware)
+ f107 MT5634ZBA-USB-V92 MultiModemUSB
+06e1 ADS Technologies, Inc.
+ 0008 UBS-10BT Ethernet [klsi]
+ a190 Instand VCD Usb Capture
+06e4 Alcatel Microelectronics
+06e6 Tiger Jet Network, Inc.
+06ea Sirius Technologies
+ 0001 NetCom Roadster II 56k
+ 0002 Roadster II 56k
+06eb PC Expert Tech. Co., Ltd
+06ef I.A.C. Geometrische Ingenieurs B.V.
+06f0 T.N.C Industrial Co., Ltd
+06f1 Opcode Systems, Inc.
+06f2 Emine Technology Co.
+06f6 Wintrend Technology Co., Ltd
+06f8 Guillemot Corp.
+ a300 Dual Analog Leader GamePad
+ c000 Hercules Muse Pocket
+06fa HSD S.r.L
+06fc Motorola Semiconductor Products Sector
+06fd Boston Acoustics
+06fe Gallant Computer, Inc.
+0701 Supercomal Wire & Cable SDN. BHD.
+0703 Bvtech Industry, Inc.
+0705 NKK Corp.
+0706 Ariel Corp.
+0707 Standard Microsystems Corp.
+ 0100 2202 Ethernet [klsi]
+ 0200 2202 Ethernet [pegasus]
+ ee06 EZ-Connect 802.11g Adapter
+ ee13 EZ-Connect 802.11g Adapter
+0708 Putercom Co., Ltd
+0709 Silicon Systems, Ltd (SSL)
+070a Oki Electric Industry Co., Ltd
+070d Comoss Electronic Co., Ltd
+070e Excel Cell Electronic Co., Ltd
+0710 Connect Tech, Inc.
+ 0001 WhiteHeat (fake ID)
+ 8001 WhiteHeat
+0711 Magic Control Technology Corp.
+ 0100 Hub
+ 0200 BAY-3U1S1P Serial Port
+ 0210 MCT1S Serial Port
+ 0230 MCT-232 Serial Port
+ 0231 PS/2 Mouse Port
+ 0240 PS/2 to USB Converter
+ 0300 BAY-3U1S1P Parallel Port
+ 0302 Parallel Port
+ 0900 SVGA Adapter
+0713 Interval Research Corp.
+0714 NewMotion, Inc.
+ 0003 ADB to USB convertor
+0717 ZNK Corp.
+0718 Imation Corp.
+0719 Tremon Enterprises Co., Ltd
+071b Domain Technologies, Inc.
+ 0002 DTI-56362-USB Digital Interface Unit
+ 0101 Audio4-USB DSP Data Acquisition Unit
+ 0201 Audio4-5410 DSP Data Acquisition Unit
+ 0301 SB-USB JTAG Emulator
+071c Xionics Document Technologies, Inc.
+071d Eicon Networks Corp.
+ 1000 Diva ISDN TA
+071e Ariston Technologies
+0723 Centillium Communications Corp.
+0726 Vanguard International Semiconductor-America
+0729 Amitm
+ 1000 USC-1000 Serial Port
+072e Sunix Co., Ltd
+072f Advanced Card Systems, Ltd
+ 0001 AC1030-based SmartCard Reader
+ 9000 ACR38 AC1038-based Smart Card Reader
+ 90cc ACR38 SmartCard Reader
+0731 Susteen, Inc.
+ 0528 SonyEricsson DCU-11 Cable
+0732 Goldfull Electronics & Telecommunications Corp.
+0733 ViewQuest Technologies, Inc.
+ 0110 VQ110
+ 1311 Digital Dream Epsilon 1.3
+ 2211 Jenoptik
+ 0401 CS330 WebCam
+ 0402 M-318B WebCam
+ 0430 Intel Pro Share WebCam
+ 0631 Hercules Dualpix
+ 1310 Epsilon 1.3/Jenoptik JD C1.3/UMAX AstraPix 470
+0734 Lasat Communications A/S
+ 0001 560V Modem
+0735 Asuscom Network
+ c541 ISDN TA 280
+0736 Lorom Industrial Co., Ltd
+0738 Mad Catz, Inc.
+073b Suncom Technologies
+073a Chaplet Systems, Inc.
+073d Eutron S.p.a.
+ 0005 Crypto Token
+073e NEC, Inc.
+ 0301 Game Pad
+0745 Syntech Information Co., Ltd
+0746 Onkyo Corp.
+0747 Labway Corp.
+0748 Strong Man Enterprise Co., Ltd
+0749 EVer Electronics Corp.
+074a Ming Fortune Industry Co., Ltd
+074b Polestar Tech. Corp.
+074c C-C-C Group PLC
+074d Micronas GmbH
+074e Digital Stream Corp.
+ 0001 PS/2 Adapter
+ 0002 PS/2 Adapter
+0755 Aureal Semiconductor
+0757 Network Technologies, Inc.
+075b Sophisticated Circuits, Inc.
+ 0001 Kick-off! Watchdog
+0763 Midiman
+ 1001 Midisport 2x2
+ 1010 Midisport 1x1
+ 1020 Midisport 4x4
+ 1030 Midisport 8x8
+0764 Cyber Power System, Inc.
+ 0005 Cyber Power UPS
+0765 X-Rite, Inc.
+0766 Jess-Link Products Co., Ltd
+0767 Tokheim Corp.
+0768 Camtel Technology Corp.
+ 0006 Camtel Technology USB TV Genie Pro FM Model TVB330
+0769 Surecom Technology Corp.
+076a Smart Technology Enablers, Inc.
+076b OmniKey AG
+ 0596 CardMan 2020
+ 1784 CardMan 6020
+ 3021 CardMan 3121
+076c Partner Tech
+076d Denso Corp.
+076e Kuan Tech Enterprise Co., Ltd
+076f Jhen Vei Electronic Co., Ltd
+0774 AmTRAN Technology Co., Ltd
+0775 Longshine Electronics Corp.
+0776 Inalways Corp.
+0777 Comda Enterprise Corp.
+0778 Volex, Inc.
+0779 Fairchild Semiconductor
+077a Sankyo Seiki Mfg. Co., Ltd
+077b Linksys
+ 2219 WUSB11 V2.6 802.11b Adapter
+ 2226 USB200M 100baseTX Adapter
+077c Forward Electronics Co., Ltd
+ 0005 NEC Keyboard
+077d Griffin Technology
+ 0410 PowerMate
+ 041a PowerWave
+ 0223 IMic Audio In/Out
+077f Well Excellent & Most Corp.
+0781 SanDisk Corp.
+ 0001 SDDR-05a ImageMate CompactFlash Reader
+ 0002 SDDR-31 ImageMate II CompactFlash Reader
+ 0005 SDDR-05b (CF II) ImageMate CompactFlash Reader
+ 0200 SDDR-09 (SSFDC) ImageMate SmartMedia Reader [eusb]
+ 0400 SecureMate SD/MMC Reader
+ 0621 SDDR-86 Imagemate 6-in-1 Reader
+ 0810 SDDR-75 ImageMate CF-SM Reader
+ 0830 ImageMate CF/MMC/SD Reader
+ 5150 SDCZ2 Cruzer Mini Flash Drive (thin)
+ 5151 Cruzer Micro 256/512MB Flash Drive
+ 7104 Cruzer Micro Mini 256MB Flash Drive
+ 7112 Cruzer Micro 128MB Flash Drive
+ 7113 Cruzer Micro 256MB Flash Drive
+ 8185 SDCZ2 Cruzer Mini Flash Drive (older, thick)
+ 8889 SDDR-88 Imagemate 8-in-1 Reader
+ 8989 ImageMate 12-in-1 Reader
+ 9999 SDDR-99 5-in-1 Reader
+0782 Trackerball
+0783 C3PO
+ 0003 LTC31 SmartCard Reader
+0784 Vivitar, Inc.
+ 0100 Vivicam 2655
+ 1310 Vivicam 3305
+ 1688 Vivicam 3665
+ 1689 Gateway DC-M42/Labtec DC-505/Vivitar Vivicam 3705
+ 2620 AOL Photocam Plus
+ 2888 Polaroid DC700
+ 3330 Nytec ND-3200 Camera
+ 4300 Traveler D1
+ 5260 Werlisa Sport PX 100 / JVC GC-A33 Camera
+ 5300 Pretec dc530
+0785 NTT-ME
+ 0001 MN128mini-V ISDN TA
+ 0003 MN128mini-J ISDN TA
+0789 Logitec Corp.
+078b Happ Controls, Inc.
+ 0010 Driving UGCI
+ 0020 Flying UGCI
+ 0030 Fighting UGCI
+078c GTCO/CalComp
+ 0400 Digitizer (Whiteboard)
+078e Brincom, Inc.
+0790 Pro-Image Manufacturing Co., Ltd
+0791 Copartner Wire and Cable Mfg. Corp.
+0792 Axis Communications AB
+0793 Wha Yu Industrial Co., Ltd
+0794 ABL Electronics Corp.
+0795 RealChip, Inc.
+0796 Certicom Corp.
+0797 Grandtech Semiconductor Corp.
+ 8001 SmartCam
+ 801a Typhoon StyloCam
+ 801c Meade Binoculars/Camera
+ 8901 ScanHex SX-35a
+ 8909 ScanHex SX-35b
+ 8911 ScanHex SX-35c
+079b Sagem
+079d Alfadata Computer Corp.
+ 0201 GamePort Adapter
+07a1 Digicom S.p.A.
+ d952 Palladio USB V.92 Modem
+07a2 National Technical Systems
+07a3 Onnto Corp.
+07a4 Be, Inc.
+07a6 ADMtek, Inc.
+ 0986 AN986 Pegasus Ethernet
+ 8511 ADM8511 Pegasus II Ethernet
+07aa Corega K.K.
+ 0001 Ether USB-T Ethernet [klsi]
+ 0004 FEther USB-TX Ethernet [pegasus]
+ 0012 Stick-11 802.11b Adapter
+ 7613 Stick-11 V2 802.11b Adapter
+07ab Freecom Technologies
+ fc01 IDE bridge
+ fc03 USB2-IDE IDE bridge
+07af Microtech
+ 0004 SCSI-DB25 SCSI Bridge [shuttle]
+ 0005 SCSI-HD50 SCSI Bridge [shuttle]
+ 0006 CameraMate SmartMedia and CompactFlash Card Reader [eusb/shuttle]
+07b0 Trust Technologies
+ 0001 ISDN TA
+07b1 IMP, Inc.
+07b2 Motorola BCS, Inc.
+ 4100 SurfBoard SB4100 Cable Modem
+ 4200 SurfBoard SB4200 Cable Modem
+ 5100 SurfBoard SB5100 Cable Modem
+ 5101 SurfBoard SB5101 Cable Modem
+ 5120 SurfBoard SB5120 Cable Modem (RNDIS)
+07b3 Plustek, Inc.
+ 0001 OpticPro 1212U Scanner
+ 0010 OpticPro U12 Scanner
+ 0011 OpticPro U24 Scanner
+ 0013 OpticPro UT12 Scanner
+ 0015 OpticPro U24 Scanner
+ 0017 OpticPro UT12/16/24 Scanner
+ 0400 OpticPro 1248U Scanner
+ 0401 OpticPro 1248U Scanner #2
+ 0403 OpticPro U16B Scanner
+07b4 Olympus Optical Co., Ltd
+ 0100 Camedia C-2100/C-3000 Ultra Zoom Camera
+ 0102 Camedia E-10/C-220/C-50 Camera
+ 0105 Camedia C-310Z/C-700/C-750UZ/C-755/C-765UZ/C-3040/C-4000/C-5050Z/D-560/C-3020Z Zoom Camera
+ 0109 C-370Z/D-535Z/X-450
+ 0112 MAUSB-100 xD Card Reader
+ 0113 mju 500
+ 0114 C-350Z Camera
+ 0118 Mju Digital 500
+ 0203 Digital Voice Recorder DW-90
+ 0206 Digital Voice Recorder DS-330
+ 0207 Digital Voice Recorder & Camera W-10
+ 0209 Digital Voice Recorder DM-20
+ 020d Digital Voice Recorder VN-240PC
+07b5 Mega World International, Ltd
+ 0213 Thrustmaster Firestorm Digital 3 Gamepad
+ 9902 GamePad
+07b6 Marubun Corp.
+07b7 TIME Interconnect, Ltd
+07b8 D-Link Corp.
+ 4000 DU-E10 Ethernet [klsi]
+ 4002 DU-E100 Ethernet [pegasus]
+ 4102 USB 1.1 10/100M Fast Ethernet Adapter
+ abc1 DU-E10 Ethernet [pegasus]
+ f101 DSB-560 Modem [atlas]
+07bc Canon Computer Systems, Inc.
+07bd Webgear, Inc.
+07be Veridicom
+07c0 Code Mercenaries Hard- und Software GmbH
+ 1121 The Claw
+ 1500 IO-Warrior 40
+ 1501 IO-Warrior 24
+ 1502 IO-Warrior 48
+ 1503 IO-Warrior 28
+07c4 Datafab Systems, Inc.
+ a000 CompactFlash Card Reader
+ a001 CompactFlash & SmartMedia Card Reader [eusb]
+ a002 Disk Drive
+ a005 CompactFlash & SmartMedia Card Reader
+ a006 SmartMedia Card Reader
+ a109 LC1 CompactFlash & SmartMedia Card Reader
+ a200 DF-UT-06 Hama MMC/SD Reader
+ a400 CompactFlash & Microdrive Reader
+ b004 MMC/SD Reader
+07c5 APG Cash Drawer
+07c6 ShareWave, Inc.
+07c7 Powertech Industrial Co., Ltd
+07c8 B.U.G., Inc.
+07c9 Allied Telesyn International
+07ca AVerMedia Technologies, Inc.
+07cb Kingmax Technology, Inc.
+07cc Carry Computer Eng., Co., Ltd
+ 0000 CF Card Reader
+ 0003 SM Card Reader
+ 0004 SM/CF/PCMCIA Card Reader
+ 0006 SM/CF/PCMCIA Card Reader
+ 000c SM/CF Card Reader
+ 000d SM/CF Card Reader
+ 0200 6-in-1 Card Reader
+ 0301 6-in-1 Card Reader
+07cd Elektor
+ 0001 USBuart Serial Port
+07cf Casio Computer Co., Ltd
+ 1001 QV-8000SX/5700/3000EX Digicam
+ 1003 Exilim EX-S500
+ 1004 Exilim EX-Z120
+ 2002 E-125 Cassiopeia Pocket PC
+ 3801 WMP-1 MP3-Watch
+ 4001 Label Printer KL-P1000
+ 4500 LV-20 Digital Camera
+07d0 Dazzle
+ 0001 Digital Video Creator I
+ 0002 Global Village VideoFX Grabber
+ 0003 Fusion Model DVC-50 Rev 1 (NTSC)
+ 0004 DVC-800 (PAL) Grabber
+07d1 D-Link System
+07d2 Aptio Products, Inc.
+07d3 Cyberdata Corp.
+07d7 GCC Technologies, Inc.
+07da Arasan Chip Systems
+07df David Electronics Co., Ltd
+07e1 Ambient Technologies, Inc.
+ 5201 V.90 Modem
+07e2 Elmeg GmbH & Co., Ltd
+07e3 Planex Communications, Inc.
+07e4 Movado Enterprise Co., Ltd
+07e5 QPS, Inc.
+ 5c01 Que! CDRW
+07e6 Allied Cable Corp.
+07e7 Mirvo Toys, Inc.
+07e8 Labsystems
+07ea Iwatsu Electric Co., Ltd
+07eb Double-H Technology Co., Ltd
+07ec Taiyo Electric Wire & Cable Co., Ltd
+07ee Torex Retail (formerly Logware)
+ 0002 Cash Drawer I/F
+07f6 Circuit Assembly Corp.
+07f7 Century Corp.
+07f9 Dotop Technology, Inc.
+07fa Draytek
+ 0778 miniVigor 128 ISDN TA
+07fd Mark of the Unicorn
+ 0000 FastLane MIDI Interface
+0801 Mag-Tek
+ 0002 Mini Swipe Reader
+0802 Mako Technologies, LLC
+0803 Zoom Telephonics, Inc.
+ 9700 2986L FaxModem
+0809 Genicom Technology, Inc.
+080a Evermuch Technology Co., Ltd
+080c Datalogic S.p.A.
+ 0300 Gryphon D120 Barcode Scanner
+ 0400 Gryphon D120 Barcode Scanner
+ 0500 Gryphon D120 Barcode Scanner
+ 0600 Gryphon M100 Barcode Scanner
+080d Teco Image Systems Co., Ltd
+ 0102 Hercules Scan@home 48
+0810 Personal Communication Systems, Inc.
+0813 Mattel, Inc.
+ 0001 Intel Play QX3 Microscope
+081a MG Logic
+ 1000 Duo Pen Tablet
+081b Indigita Corp.
+081c Mipsys
+081e AlphaSmart, Inc.
+0822 Reudo Corp.
+0825 GC Protronics
+0826 Data Transit
+0827 BroadLogic, Inc.
+0828 Sato Corp.
+0829 DirecTV Broadband, Inc. (Telocity)
+082d Handspring
+ 0100 Visor
+ 0300 Treo 600
+0830 Palm, Inc.
+ 0002 Palm M505
+ 0003 Palm M515
+ 0020 Palm I705
+ 0040 Palm M125
+ 0050 Palm M130
+ 0060 Palm Tungsten T / Zire 71
+ 0080 USB Serial Adapter [for Palm III series to sync via USB]
+0832 Kouwell Electronics Corp.
+0833 Sourcenext Corp.
+0835 Action Star Enterprise Co., Ltd
+0839 Samsung Techwin Co., Ltd
+ 0005 Digimax Camera
+ 0008 Digimax 230 Camera
+ 0009 Digimax 340
+ 000e Digimax 360
+ 0010 Digimax 300
+ 1003 Digimax 210SE
+ 1012 6500 Document Camera
+ 1542 Digimax 50 Duo
+ 3000 Digimax 35 MP3
+083a Accton Technology Corp.
+ 1046 10/100 Ethernet [pegasus]
+ 5046 SpeedStream 10/100 Ethernet [pegasus]
+083f Global Village
+ b100 TelePort V.90 Fax/Modem
+0840 Argosy Research, Inc.
+0841 Rioport.com, Inc.
+ 0001 Rio 500
+0844 Welland Industrial Co., Ltd
+0846 NetGear, Inc.
+ 1001 EA101 Ethernet [klsi]
+ 4110 MA111 WiFi (v1)
+ 4200 WG121 WiFi (v1)
+ 4210 WG121 WiFi (v2)
+ 4220 WG111 WiFi (v1)
+ 4230 MA111 WiFi
+ 4240 WG111 WiFi (v2)
+ 6a00 WG111 WiFi (v2)
+084d Minton Optic Industry Co., Inc.
+ 0001 Jenoptik JD800i
+ 0003 S-Cam F5 Digital Camera
+ 0011 Argus DC3500 Digital Camera
+ 0014 Praktica DC 32
+ 1001 ScanHex SX-35d
+084e KB Gear
+ 0001 KBGear JamCam
+ 1002 Pablo Tablet
+084f Empeg
+ 0001 Empeg-Car Mark I/II Player
+0850 Fast Point Technologies, Inc.
+0851 Macronix International Co., Ltd
+ 1542 SiPix Blink
+ 1543 Maxell WS30 Slim Digital Camera
+0852 CSEM
+0854 ActiveWire, Inc.
+ 0100 I/O Board
+ 0101 I/O Board, rev1
+0856 B&B Electronics
+ AC01 uLinks USOTL4 RS422/485 Adapter
+0858 Hitachi Maxell, Ltd
+0859 Minolta Systems Laboratory, Inc.
+085a Xircom
+ 0001 Portstation Dual Serial Port
+ 0003 Portstation Paraller Port
+ 000b Portstation Dual PS/2 Port
+ 0299 Colorvision, Inc. Monitor Spyder
+ 8027 PGSDB9 Serial Port
+085c ColorVision, Inc.
+ 0200 Monitor Spyder
+0862 Teletrol Systems, Inc.
+0863 Filanet Corp.
+0864 NetGear, Inc.
+ 4100 MA101 802.11b Adapter
+ 4102 MA101 802.11b Adapter
+0867 Data Translation, Inc.
+ 9812 ECON Data acquisition unit
+086a Emagic Soft-und Hardware GmbH
+086c DeTeWe - Deutsche Telephonwerke AG & Co.
+ 1001 Eumex 504PC ISDN TA
+ 1003 TA33 ISDN TA
+ 1055 Eumex 220 ISDN TA
+086e System TALKS, Inc.
+086f MEC IMEX, Inc.
+0870 Metricom
+0871 SanDisk, Inc.
+ 0001 SDDR-01 Compact Flash Reader
+ 0002 SDDR-31 Compact Flash Reader
+ 0005 SDDR-05 Compact Flash Reader
+0873 Xpeed, Inc.
+0874 A-Tec Subsystem, Inc.
+0879 Comtrol Corp.
+087c Adesso/Kbtek America, Inc.
+087d Jaton Corp.
+087e Fujitsu Computer Products of America
+087f Virtual IP Group, Inc.
+0880 APT Technologies, Inc.
+0883 Recording Industry Association of America (RIAA)
+0885 Boca Research, Inc.
+0886 XAC Automation Corp.
+ 0630 Intel PC Camera CS630
+0887 Hannstar Electronics Corp.
+088b MassWorks, Inc.
+ 4944 MassWorks ID-75 TouchScreen
+0892 DioGraphy, Inc.
+089c United Technologies Research Cntr.
+089d Icron Technologies Corp.
+089e NST Co., Ltd
+089f Primex Aerospace Co.
+08a5 e9, Inc.
+08a8 Andrea Electronics
+08ae Macally (Mace Group, Inc.)
+08b4 Sorenson Vision, Inc.
+08b8 J. Gordon Electronic Design, Inc.
+ 01f4 USBSIMM1
+08b9 RadioShack Corp. (Tandy)
+08bb Texas Instruments Japan
+ 2900 PCM2900 Audio Codec
+ 2904 PCM2904 Audio Codec
+08bd Citizen Watch Co., Ltd
+08c3 Precise Biometrics
+ 0101 Precise 100 MC FingerPrint and SmartCard Reader
+08c4 Proxim, Inc.
+08c7 Key Nice Enterprise Co., Ltd
+08c8 2Wire, Inc.
+08c9 Nippon Telegraph and Telephone Corp.
+08ca Aiptek International, Inc.
+ 0010 Tablet
+ 0020 APT-6000U Tablet
+ 0021 APT-2 Tablet
+ 0022 Tablet
+ 0023 Tablet
+ 0024 Tablet
+ 0102 DualCam
+ 0103 Pocket DV Digital Camera
+ 0104 Pocket DVII
+ 0106 Pocket DV3100+
+ 0107 Pocket DV 3100
+ 0111 PenCam VGA Plus
+ 2008 Mini PenCam 2
+ 2010 Pocket CAM 3 Mega (webcam)
+ 2011 Pocket CAM 3 Mega (storage)
+ 2018 Pencam SD 2
+ 2024 Pocket DV3500
+08cd Jue Hsun Ind. Corp.
+08ce Long Well Electronics Corp.
+08cf Productivity Enhancement Products
+08d1 smartBridges, Inc.
+ 0001 smartNIC Ethernet [catc]
+08d3 Virtual Ink
+08d4 Fujitsu Siemens Computers
+ 0009 SCR SmartCard Reader
+08d9 Increment P Corp.
+08dd Billionton Systems, Inc.
+ 0986 USB-100N Ethernet [pegasus]
+ 0987 USBLP-100 HomePNA Ethernet [pegasus]
+ 0988 USBEL-100 Ethernet [pegasus]
+ 8511 USBE-100 Ethernet [pegasus2]
+08de ???
+ 7a01 802.11b Adapter
+08df Spyrus, Inc.
+08e3 Olitec, Inc.
+ 0002 USB-RS232 Bridge
+08e4 Pioneer Corp.
+08e5 Litronic
+08e6 Gemplus
+ 0430 GemPC430 SmartCard Reader
+ 0432 GemPC432 SmartCard Reader
+ 0435 GemPC435 SmartCard Reader
+ 0437 GemPC433 SL SmartCard Reader
+ 3437 GemPC Twin SmartCard Reader
+ 3438 GemPC Key SmartCard Reader
+08e7 Pan-International Wire & Cable
+08e8 Integrated Memory Logic
+08e9 Extended Systems, Inc.
+ 0100 XTNDAccess IrDA Dongle
+08ea Ericsson, Inc., Blue Ridge Labs
+ abba USB Driver for Bluetooth Wireless Technology
+08ec M-Systems Flash Disk Pioneers
+ 0010 DiskOnKey
+08ee CCSI/Hesso
+08f0 Corex Technologies
+08f1 CTI Electronics Corp.
+08f5 SysTec Co., Ltd
+08f6 Logic 3 International, Ltd
+08f7 Vernier
+ 0001 LabPro
+ 0002 EasyTemp
+08f8 Keen Top International Enterprise Co., Ltd
+08f9 Wipro Technologies
+08fa Caere
+08fb Socket Communications
+08fc Sicon Cable Technology Co., Ltd
+08fd Digianswer A/S
+08ff AuthenTec, Inc.
+0900 Pinnacle Systems, Inc.
+0901 VST Technologies
+0906 Faraday Technology Corp.
+0909 Audio-Technica Corp.
+090a Trumpion Microelectronics, Inc.
+ 1540 Digitex Container Flash Disk
+090b Neurosmith
+090c Feiya Technology Corp.
+ 1000 Memory Bar
+090d Multiport Computer Vertriebs GmbH
+090e Shining Technology, Inc.
+090f Fujitsu Devices, Inc.
+0910 Alation Systems, Inc.
+0911 Philips Speech Processing
+0912 Voquette, Inc.
+0915 GlobeSpan, Inc.
+0917 SmartDisk Corp.
+0919 Tiger Electronics
+ 0100 Fast Flicks Digital Camera
+091e Garmin International
+ 0003 GPSmap (various models)
+ 0004 Garmin iQue 3600
+0920 Echelon Co.
+0921 GoHubs, Inc.
+0922 Dymo-CoStar Corp.
+ 0007 LabelWriter 330
+ 0009 LabelWriter 310
+0923 IC Media Corp.
+ 010f SIIG MobileCam
+0924 Xerox
+0925 Lakeview Research
+ 8101 Phidgets, Inc., 1-Motor PhidgetServo v2.0
+ 8104 Phidgets, Inc., 4-Motor PhidgetServo v2.0
+ 8800 WiseGroup Ltd, MP-8800 Quad Joypad
+ 8866 WiseGroup Ltd, MP-8866 Dual Joypad
+0927 Summus, Ltd
+0928 Oxford Semiconductor, Ltd
+0929 American Biometric Co.
+092a Toshiba Information & Industrial Sys. And Services
+092b Sena Technologies, Inc.
+0930 Toshiba Corp.
+ 0009 Toshiba Gigabeat (HDD audio player)
+ 6519 Kingston DataTraveler 2.0 USB Stick
+ 6533 512M USB Stick
+0931 Harmonic Data Systems, Ltd
+0932 Crescentec Corp.
+0933 Quantum Corp.
+0934 Netcom Systems
+0939 Lumberg, Inc.
+093a Pixart Imaging, Inc.
+ 010e Digital camera, CD302N/Elta Medi@ digi-cam/HE-501A
+ 010f Argus DC-1610/DC-1620/Emprex PCD3600/Philips P44417B keychain camera/Precision Mini,Model HA513A/Vivitar Vivicam 55
+ 2468 Easy Snap Snake Eye WebCam
+ 2500 USB Optical Mouse
+093b Plextor Corp.
+ 0042 PX-712UF DVD RW
+093c Intrepid Control Systems, Inc.
+ 0601 ValueCAN
+093d InnoSync, Inc.
+093e J.S.T. Mfg. Co., Ltd
+093f Olympia Telecom Vertriebs GmbH
+0940 Japan Storage Battery Co., Ltd
+0941 Photobit Corp.
+0942 i2Go.com, LLC
+0943 HCL Technologies India Private, Ltd
+0944 KORG, Inc.
+0945 Pasco Scientific
+0948 Kronauer music in digital
+ 0301 USB Pro (24/48)
+ 0302 USB Pro (24/96 playback)
+ 0303 USB Pro (24/96 record)
+ 0304 USB Pro (16/48)
+ 1105 USB One
+094b Linkup Systems Corp.
+094d Cable Television Laboratories
+0951 Kingston Technology
+ 000a KNU101TX 100baseTX Ethernet
+ 1600 Data Traveler II Pen Drive
+0954 RPM Systems Corp.
+0955 NVidia Corp.
+0956 BSquare Corp.
+0957 Agilent Technologies, Inc.
+0958 CompuLink Research, Inc.
+0959 Cologne Chip AG
+095a Portsmith
+095b Medialogic Corp.
+095c K-Tec Electronics
+095d Polycom, Inc.
+0967 Acer (??)
+ 0204 WarpLink 802.11b Adapter
+0968 Catalyst Enterprises, Inc.
+0971 Gretag-Macbeth AG
+0973 Schlumberger
+0974 Datagraphix, a business unit of Anacomp
+0975 OL'E Communications, Inc.
+0976 Adirondack Wire & Cable
+0977 Lightsurf Technologies
+0978 Beckhoff GmbH
+0979 Jeilin Technology Corp., Ltd
+097a Minds At Work LLC
+097b Knudsen Engineering, Ltd
+097c Marunix Co., Ltd
+097d Rosun Technologies, Inc.
+097f Barun Electronics Co., Ltd
+0981 Oak Technology, Ltd
+0984 Apricorn
+0985 cab Produkttechnik GmbH & Co KG
+ 00a3 A3/200 or A3/300 Label Printer
+098c Vitana Corp.
+098d INDesign
+098e Integrated Intellectual Property, Inc.
+098f Kenwood TMI Corp.
+0993 Gemstar eBook Group, Ltd
+ 0001 REB1100 eBook Reader
+0996 Integrated Telecom Express, Inc.
+099a Zippy Technology Corp.
+ 610c EL-610 Super Mini Electron luminescent Keyboard
+09a3 PairGain Technologies
+09a4 Contech Research, Inc.
+09a5 VCON Telecommunications
+09a6 Poinchips
+09a7 Data Transmission Network Corp.
+09a8 Lin Shiung Enterprise Co., Ltd
+09a9 Smart Card Technologies Co., Ltd
+09aa Intersil Corp.
+ 1000 Prism GT 802.11b/g Adapter
+ 3642 Prism 2.x 802.11b Adapter
+09ae Tripp Lite
+09b2 Franklin Electronic Publishers, Inc.
+ 0001 eBookman Palm Computer
+09b3 Altius Solutions, Inc.
+09b4 MDS Telephone Systems
+09b5 Celltrix Technology Co., Ltd
+09bc Grundig
+ 0002 MPaxx MP150 MP3 Player
+09be MySmart.Com
+ 0001 MySmartPad
+09bf Auerswald GmbH & Co. KG
+ 00c0 COMpact 2104 ISDN PBX
+ 00db COMpact 4410/2206 ISDN ISDN
+ 00f1 COMfort System Telephones
+09c1 Arris Interactive LLC
+09c2 Nisca Corp.
+09c3 ActivCard, Inc.
+ 0008 SmartCard Reader
+09c4 ACTiSYS Corp.
+ 0011 ACT-IR2000U IrDA Dongle
+09c5 Memory Corp.
+09cc Workbit Corp.
+09cd Psion Dacom Home Networks, Ltd
+09ce City Electronics, Ltd
+09cf Electronics Testing Center, Taiwan
+09d1 NeoMagic, Inc.
+09d2 Vreelin Engineering, Inc.
+09d3 Com One
+ 0001 ISDN TA
+09d9 KRF Tech, Ltd
+09da A4 Tech Co., Ltd
+ 0006 Optical Mouse WOP-35 / Trust 450L Optical Mouse
+ 001a Wireless Mouse & RXM-15 Receiver
+ 002a Wireless Optical Mouse NB-30
+09db Measurement Computing Corp.
+ 0075 MiniLab 1008
+ 0076 PMD-1024
+ 007A PMD-1208LS
+09dc Aimex Corp.
+09dd Fellowes, Inc.
+09df Addonics Technologies Corp.
+09e1 Intellon Corp.
+09e5 Jo-Dan International, Inc.
+09e6 Silutia, Inc.
+09e7 Real 3D, Inc.
+09e8 AKAI Professional M.I. Corp.
+09e9 Chen-Source, Inc.
+09eb IM Networks, Inc.
+ 4331 iRhythm Tuner Remote
+09ef Xitel
+ 0101 MD-Port DG2 MiniDisc Interface
+09f5 AresCom
+09f6 RocketChips, Inc.
+09f7 Edu-Science (H.K.), Ltd
+09f8 SoftConnex Technologies, Inc.
+09f9 Bay Associates
+09fa Mtek Vision
+09fb Altera
+09ff Gain Technology Corp.
+0a00 Liquid Audio
+0a01 ViA, Inc.
+0a07 Ontrak Control Systems Inc.
+ 0064 ADU100 Data Acquisition Interface
+ 00c8 ADU200 Relay I/O Interface
+ 00d0 ADU208 Data Acquisition Interface
+0a0b Cybex Computer Products Co.
+0a11 Xentec, Inc.
+0a12 Cambridge Silicon Radio, Ltd
+ 0001 Bluetooth Dongle (HCI mode)
+ 1000 Bluetooth Dongle (HID proxy mode)
+0a13 Telebyte, Inc.
+0a14 Spacelabs Medical, Inc.
+0a15 Scalar Corp.
+0a16 Trek Technology (S) PTE, Ltd
+ 9988 Trek2000 TD-G2
+0a17 Pentax Corp.
+ 0004 Pentax Optio 330
+ 0006 Pentax Optio S
+ 0007 Pentax Optio 550
+ 0009 Pentax Optio 33WR
+ 000a Pentax Optio 555
+ 000c Pentax Optio 43WR (mass storage mode)
+ 000d Pentax Optio 43WR
+ 0015 Pentax Optio S40/S5i
+ 003b Pentax Optio 50 (mass storage mode)
+ 003d Pentax Optio S55
+ 0043 Pentax *ist DL
+ 0047 Pentax Optio S60
+0a18 Heidelberger Druckmaschinen AG
+0a19 Hua Geng Technologies, Inc.
+0a21 Medtronic Physio Control Corp.
+0a22 Century Semiconductor USA, Inc.
+0a2c AK-Modul-Bus Computer GmbH
+ 0008 GPIO Ports
+0a39 Gilat Satellite Networks, Ltd
+0a3a PentaMedia Co., Ltd
+0a3c NTT DoCoMo, Inc.
+0a3d Varo Vision
+0a3f Swissonic AG
+0a43 Boca Systems, Inc.
+0a46 Davicom Semiconductor, Inc.
+0a47 Hirose Electric
+0a48 I/O Interconnect
+ 3258 Dane Elec zMate SD Reader
+ 3259 Dane Elec zMate CF Reader
+0a4b Fujitsu Media Devices, Ltd
+0a4c Computex Co., Ltd
+0a4d Evolution Electronics, Ltd
+ 008e MK-249C MIDI Keyboard
+ 00a3 MK-461C MIDI Keyboard
+ 00f5 UC-33e MIDI Controller
+0a4e Steinberg Soft-und Hardware GmbH
+0a4f Litton Systems, Inc.
+0a50 Mimaki Engineering Co., Ltd
+0a51 Sony Electronics, Inc.
+0a52 Jebsee Electronics Co., Ltd
+0a53 Portable Peripheral Co., Ltd
+0a5a Electronics For Imaging, Inc.
+0a5b EAsics NV
+0a5c Broadcom Corp.
+ 200a Bluetooth dongle
+ 2033 BCM2033 Bluetooth
+ 2035 BCM2035 Bluetooth
+0a5d Diatrend Corp.
+0a5f Zebra
+ 0009 LP2844 Printer
+0a62 MPMan
+ 0010 MPMan MP-F40 MP3 Player
+0a66 ClearCube Technology
+0a67 Medeli Electronics Co., Ltd
+0a68 Comaide Corp.
+0a69 Chroma ate, Inc.
+0a6b Green House Co., Ltd
+ 0001 Compact Flash R/W with MP3 player
+0a6c Integrated Circuit Systems, Inc.
+0a6d UPS Manufacturing
+0a6e Benwin
+0a6f Core Technology, Inc.
+ 0400 Xanboo
+0a70 International Game Technology
+0a72 Sanwa Denshi
+0a7d NSTL, Inc.
+0a7e Octagon Systems Corp.
+0a80 Rexon Technology Corp., Ltd
+0a81 Chesen Electronics Corp.
+ 0101 Keyboard
+ 0103 Keyboard
+ 0203 Mouse
+ 0205 PS/2 Keyboard+Mouse Adapter
+0a82 Syscan
+ 4600 TravelScan 460/464
+0a83 NextComm, Inc.
+0a84 Maui Innovative Peripherals
+0a85 Idexx Labs
+0a86 NITGen Co., Ltd
+0a8d Picturetel
+0a8e Japan Aviation Electronics Industry, Ltd
+0a90 Candy Technology Co., Ltd
+0a91 Globlink Technology, Inc.
+0a92 EGO SYStems, Inc.
+0a93 C Technologies AB
+0a94 Intersense
+0aa3 Lava Computer Mfg., Inc.
+0aa4 Develco Elektronik
+0aa5 First International Digital
+0aa6 Perception Digital, Ltd
+ 0101 Hercules Jukebox
+0aa7 Wincor Nixdorf GmbH & Co KG
+ 0200 POS Display BA63
+ 0201 POS Display BA66
+ 0300 POS Printer TH210
+ 0302 POS Printer TH220
+ 0305 Lottery Printer XiPrintPlus
+ 0306 POS Printer TH320
+ 0308 POS Printer TH420
+ 4304 Banking Printer TP07
+0aa8 TriGem Computer, Inc.
+0aa9 Baromtec Co.
+ f01b Medion MD 6242 MP3 Player
+0aaa Japan CBM Corp.
+0aab Vision Shape Europe SA
+0aac iCompression, Inc.
+0aad Rohde & Schwarz GmbH & Co. KG
+0aae NEC infrontia Corp. (Nitsuko)
+0aaf Digitalway Co., Ltd
+0ab0 Arrow Strong Electronics Co., Ltd
+0aba Ellisys
+ 8001 USB Tracker 110 Protocol Analyzer
+0abe Stereo-Link
+ 0101 SL1200 DAC
+0ac3 Sanyo Semiconductor Company Micro
+0ac4 Leco Corp.
+0ac5 I & C Corp.
+0ac6 Singing Electrons, Inc.
+0ac7 Panwest Corp.
+0ac8 Z-Star Microelectronics Corp.
+ 0302 ZC0302 WebCam
+ 0321 USB 2.0 Webcam
+ 301b ZC0301 WebCam
+ 303b ZC0303 WebCam
+ 305b ZC0305 WebCam
+0ac9 Micro Solutions, Inc.
+ 0000 Backpack CD-ReWriter
+ 0011 Backpack 40GB Hard Drive
+0aca OPEN Networks Ltd
+ 1060 OPEN NT1 Plus II
+0acc Koga Electronics Co.
+0acd ID Tech
+0ace ZyDAS
+ 1201 802.11b WiFi
+ 1211 802.11b/g USB2 WiFi
+0acf Intoto, Inc.
+0ad0 Intellix Corp.
+0ad1 Remotec Technology, Ltd
+0ad2 Service & Quality Technology Co., Ltd
+0ae3 Allion Computer, Inc.
+0ae4 Taito Corp.
+0ae7 Neodym Systems, Inc.
+0ae8 System Support Co., Ltd
+0ae9 North Shore Circuit Design L.L.P.
+0aea SciEssence, LLC
+0aeb TTP Communications, Ltd
+0aec Neodio Technologies Corp.
+ 3050 ND3050 8-in-1 Card Reader
+ 3260 7-in-1 Card Reader
+ 5010 ND5010 Card Reader
+0af0 Option
+ 5000 UMTS Card
+ 6300 GT 3G Quad UMTS/GPRS Card
+0af6 Silver I Co., Ltd
+0af7 B2C2, Inc.
+ 0101 Digital TV USB Receiver (DVB-S/T/C / ATSC)
+0af9 Hama, Inc.
+ 0010 USB SightCam 100
+ 0011 Micro Innovations IC50C WebCam
+0afc Zaptronix Ltd
+0afd Tateno Dennou, Inc.
+0afe Cummins Engine Co.
+0aff Jump Zone Network Products, Inc.
+0b05 ASUSTek Computer, Inc.
+ 1706 WL-167G 802.11g Adapter [ralink]
+0b0c Todos Data System AB
+ 0009 Todos Argos Mini II Smart Card Reader
+0b0e GN Netcom
+0b0f AVID Technology
+0b10 Pcally
+0b11 I Tech Solutions Co., Ltd
+0b1e Electronic Warfare Assoc., Inc. (EWA)
+0b1f Insyde Software Corp.
+0b20 TransDimension, Inc.
+0b21 Yokogawa Electric Corp.
+0b22 Japan System Development Co., Ltd
+0b23 Pan-Asia Electronics Co., Ltd
+0b24 Link Evolution Corp.
+0b27 Ritek Corp.
+0b28 Kenwood Corp.
+0b2c Village Center, Inc.
+0b30 PNY Technologies, Inc.
+ 0006 SM Media-Shuttle Card Reader
+0b33 Contour Design, Inc.
+0b37 Hitachi ULSI Systems Co., Ltd
+0b39 Omnidirectional Control Technology, Inc.
+0b3a IPaxess
+0b3b Tekram Technology Co., Ltd
+ 1601 Allnet 0193 802.11b Adapter
+ 1602 ZyXEL ZyAIR B200 802.11b Adapter
+ 1612 AIR.Mate 2@net 802.11b Adapter
+ 1620 Allnet USB 2.0 Wireless Network Adapter
+0b3c Olivetti Techcenter
+ a010 Simple_Way Printer/Scanner/Copier
+0b3e Kikusui Electronics Corp.
+0b41 Hal Corp.
+0b43 Play.com, Inc.
+ 0003 PS2 Controller Converter
+0b47 Sportbug.com, Inc.
+0b48 TechnoTrend AG
+ 1003 Technotrend/Hauppauge USB-Nova
+ 1005 Technotrend/Hauppauge USB-Nova
+ 1006 Technotrend/Hauppauge DEC3000-s
+ 1008 Technotrend/Hauppauge DEC2000-t
+ 1009 Technotrend/Hauppauge DEC2540-t
+0b49 ASCII Corp.
+ 064f Trance Vibrator
+0b4b Pine Corp. Ltd.
+ 0100 D'music MP3 Player
+0b4e Musical Electronics, Ltd
+0b50 Dumpries Co., Ltd
+0b51 Comfort Keyboard Co.
+ 0020 Comfort Keyboard
+0b52 Colorado MicroDisplay, Inc.
+0b54 Sinbon Electronics Co., Ltd
+0b56 TYI Systems, Ltd
+0b57 Beijing HanwangTechnology Co., Ltd
+0b59 Lake Communications, Ltd
+0b5a Corel Corp.
+0b5f Green Electronics Co., Ltd
+0b60 Nsine, Ltd
+0b61 NEC Viewtechnology, Ltd
+0b62 Orange Micro, Inc.
+ 0059 iBOT2 WebCam
+0b63 ADLink Technology, Inc.
+0b64 Wonderful Wire Cable Co., Ltd
+0b65 Expert Magnetics Corp.
+0b69 CacheVision
+0b6a Maxim Integrated Products
+0b6f Nagano Japan Radio Co., Ltd
+0b70 PortalPlayer, Inc.
+0b71 SHIN-EI Sangyo Co., Ltd
+0b72 Embedded Wireless Technology Co., Ltd
+0b73 Computone Corp.
+0b75 Roland DG Corp.
+0b79 Sunrise Telecom, Inc.
+0b7a Zeevo, Inc.
+0b7b Taiko Denki Co., Ltd
+0b7c ITRAN Communications, Ltd
+0b7d Astrodesign, Inc.
+0b84 Rextron Technology, Inc.
+0b85 Elkat Electronics, Sdn., Bhd.
+0b86 Exputer Systems, Inc.
+0b87 Plus-One I & T, Inc.
+0b88 Sigma Koki Co., Ltd, Technology Center
+0b89 Advanced Digital Broadcast, Ltd
+0b95 ASIX Electronics Corp.
+0b96 Sewon Telecom
+0b97 O2 Micro, Inc.
+ 7762 Oz776 SmartCard Reader
+0b98 Playmates Toys, Inc.
+0b99 Audio International, Inc.
+0b9b Dipl.-Ing. Stefan Kunde
+ 4012 Reflex RC-controller Interface
+0b9d Softprotec Co.
+0b9f Chippo Technologies
+0baf U.S. Robotics
+ 00eb USR1120 802.11b Adapter
+ 0118 U5 802.11g Adapter
+ 6112 FaxModem Model 5633
+0bb0 Concord Camera Corp.
+ 5007 3340z/Rollei DC3100
+0bb1 Infinilink Corp.
+0bb2 Ambit Microsystems Corp.
+ 6098 USB Cable Modem
+0bb3 Ofuji Technology
+0bb4 High Tech Computer Corp.
+ 00ce mmO2 XDA GSM/GPRS Pocket PC
+ 00cf SPV C500 Smart Phone
+ 0a02 Himalaya GSM/GPRS Pocket PC
+ 0a51 SPV C400 / T-Mobile SDA GSM/GPRS Pocket PC
+0bb5 Murata Manufacturing Co., Ltd
+0bb6 Network Alchemy
+0bb7 Joytech Computer Co., Ltd
+0bb8 Hitachi Semiconductor and Devices Sales Co., Ltd
+0bb9 Eiger M&C Co., Ltd
+0bba ZAccess Systems
+0bbb General Meters Corp.
+0bbc Assistive Technology, Inc.
+0bbd System Connection, Inc.
+0bc0 Knilink Technology, Inc.
+0bc1 Fuw Yng Electronics Co., Ltd
+0bc2 Seagate RSS LLC
+0bc3 IPWireless, Inc.
+0bc4 Microcube Corp.
+0bc5 JCN Co., Ltd
+0bc6 ExWAY, Inc.
+0bc7 X10 Wireless Technology, Inc.
+ 0004 X10 Receiver
+0bc8 Telmax Communications
+0bc9 ECI Telecom, Ltd
+0bca Startek Engineering, Inc.
+0bcb Perfect Technic Enterprise Co., Ltd
+0bd7 Andrew Pargeter & Associates
+ a021 Amptek DP4 multichannel signal analyzer
+0bda Realtek Semiconductor Corp.
+ 8150 RTL8150 Fast Ethernet Adapter
+ 8151 RTL8151 Adapteon Business Mobile Networks BV
+0bdb Ericsson Business Mobile Networks BV
+0bdc Y Media Corp.
+0bdd Orange PCS
+0be2 Kanda Tsushin Kogyo Co., Ltd
+0be3 TOYO Corp.
+0be4 Elka International, Ltd
+0be5 DOME imaging systems, Inc.
+0be6 Dong Guan Humen Wonderful Wire Cable Factory
+0bee LTK Industries, Ltd
+0bef Way2Call Communications
+0bf0 Pace Micro Technology PLC
+0bf1 Intracom S.A.
+0bf2 Konexx
+0bf6 Addonics Technologies, Inc.
+ a002 IDE Bridge
+0bf7 Sunny Giken, Inc.
+0bf8 Fujitsu Siemens Computers
+ 1001 Fujitsu Pocket Loox 600 PDA
+0c04 MOTO Development Group, Inc.
+0c05 Appian Graphics
+0c06 Hasbro Games, Inc.
+0c07 Infinite Data Storage, Ltd
+0c08 Agate
+ 0378 Q 16MB Storage Device
+0c09 Comjet Information System
+0c0a Highpoint Technologies, Inc.
+0c0b Dura Micro, Inc. (Acomdata)
+ 27cb 6-in-1 Flash Reader and Writer
+ a109 CF/SM Reader and Writer
+ a10c SD/MS Reader and Writer
+ b001 USB 2.0 Mass Storage IDE adapter
+ b004 MMC/SD Reader and Writer
+0c12 Zeroplus
+ 0005 PSX Vibration Feedback Converter
+ 8809 Red Octane Ignition Xbox DDR Pad
+0c15 Iris Graphics
+0c16 Gyration, Inc.
+0c17 Cyberboard A/S
+0c18 SynerTek Korea, Inc.
+0c19 cyberPIXIE, Inc.
+0c1a Silicon Motion, Inc.
+0c1b MIPS Technologies
+0c1c Hang Zhou Silan Electronics Co., Ltd
+0c22 Tally Printer Corp.
+0c23 Lernout + Hauspie
+0c24 Taiyo Yuden
+0c25 Sampo Corp.
+ 0310 Scream Cam
+0c2e Metro
+ 0200 Metrologic Scanner
+0c35 Eagletron, Inc.
+0c36 E Ink Corp.
+0c37 e.Digital
+0c38 Der An Electric Wire & Cable Co., Ltd
+0c39 IFR
+0c3a Furui Precise Component (Kunshan) Co., Ltd
+0c3b Komatsu, Ltd
+0c3c Radius Co., Ltd
+0c3d Innocom, Inc.
+0c3e Nextcell, Inc.
+0c44 Motorola iDEN
+0c45 Microdia
+ 1060 iFlash SM-Direct Card Reader
+ 6001 Genius VideoCAM NB
+ 6005 Sweex Mini WebCam
+ 6029 Triplex i-mini PC Camera
+ 602a Meade ETX-105EC Camera
+ 602c Clas Ohlson TWC-30XOP WebCam
+ 6270 U-CAM PC Camera NE878
+ 8000 DC31VC
+ 800a Vivitar Vivicam3350B
+0c46 WaveRider Communications, Inc.
+0c4b Reiner SCT Kartensysteme GmbH
+ 0100 cyberJack e-com/pinpad
+ 0300 cyberJack pinpad(a)
+0c52 Sealevel Systems, Inc.
+0c53 ViewPLUS, Inc.
+0c54 Glory, Ltd
+0c55 Spectrum Digital, Inc.
+ 0510 Spectrum Digital XDS510 JTAG Debugger
+0c56 Billion Bright, Ltd
+0c57 Imaginative Design Operation Co., Ltd
+0c58 Vidar Systems Corp.
+0c59 Dong Guan Shinko Wire Co., Ltd
+0c5a TRS International Mfg., Inc.
+0c5e Xytronix Research & Design
+0c62 Chant Sincere Co., Ltd
+0c63 Toko, Inc.
+0c64 Signality System Engineering Co., Ltd
+0c65 Eminence Enterprise Co., Ltd
+0c66 Rexon Electronics Corp.
+0c67 Concept Telecom, Ltd
+0c70 MCT Elektronikladen
+ 0000 USB08 Development board
+0c74 Optronic Laboratories Inc.
+ 0002 OL 700-30 Goniometer
+0c76 JMTek, LLC.
+ 0003 USBdisk
+ 0005 Transcend USB Flash disk
+ 0006 Transcend JetFlash
+0c77 Sipix Group, Ltd
+ 1001 SiPix Web2
+ 1002 SiPix SC2100
+ 1010 SiPix Snap
+ 1011 SiPix Blink 2
+ 1015 SiPix CAMeleon
+0c78 Detto Corp.
+0c79 NuConnex Technologies Pte., Ltd
+0c7a Wing-Span Enterprise Co., Ltd
+0c86 NDA Technologies, Inc.
+0c88 Kyocera Wireless Corp.
+0c89 Honda Tsushin Kogyo Co., Ltd
+0c8a Pathway Connectivity, Inc.
+0c8b Wavefly Corp.
+0c8c Coactive Networks
+0c8d Tempo
+0c8e Cesscom Co., Ltd
+0c8f Applied Microsystems
+0c99 Innochips Co., Ltd
+0c9a Hanwool Robotics Corp.
+0c9b Jobin Yvon, Inc.
+0c9d SemTek
+ 0170 3873 Manual Insert card reader
+0ca2 Zyfer
+0ca3 Sega Corp.
+0ca4 ST&T Instrument Corp.
+0ca5 BAE Systems Canada, Inc.
+0ca6 Castles Technology Co., Ltd
+0ca7 Information Systems Laboratories
+0cad Motorola CGISS
+0cae Ascom Business Systems, Ltd
+0caf Buslink
+ 2515 Flash Disk Embedded Hub
+ 2516 Flash Disk Security Device
+ 2517 Flash Disk Mass Storage Device
+ 3a00 Hard Drive
+0cb0 Flying Pig Systems
+0cb1 Innovonics, Inc.
+0cb6 Celestix Networks, Pte., Ltd
+0cb7 Singatron Enterprise Co., Ltd
+0cb8 Opticis Co., Ltd
+0cba Trust Electronic (Shanghai) Co., Ltd
+0cbb Shanghai Darong Electronics Co., Ltd
+0cbc Palmax Technology Co., Ltd
+0cbd Pentel Co., Ltd (Electronics Equipment Div.)
+0cbe Keryx Technologies, Inc.
+0cbf Union Genius Computer Co., Ltd
+0cc0 Kuon Yi Industrial Corp.
+0cc1 Given Imaging, Ltd
+0cc2 Timex Corp.
+0cc3 Rimage Corp.
+0cc4 emsys GmbH
+0cc5 Sendo
+0cc6 Intermagic Corp.
+0cc7 Kontron Medical AG
+0cc8 Technotools Corp.
+0cc9 BroadMAX Technologies, Inc.
+0cca Amphenol
+0ccb SKNet Co., Ltd
+0ccc Domex Technology Corp.
+0ccd TerraTec Electronic GmbH
+ 0038 Cinergy T^2 DVB-T Receiver
+0cd4 Bang Olufsen
+ 0101 BeolinkPC2
+0cd7 NewChip S.r.l.
+0cd8 JS Digitech, Inc.
+0cd9 Hitachi Shin Din Cable, Ltd
+0cde Z-Com
+ 0002 XI-725/726 Prism2.5 802.11b Adapter
+ 0005 XI-735 Prism3 802.11b Adapter
+ 0006 Medion 40900 802.11b Adapter
+0cf1 e-Conn Electronic Co., Ltd
+0cf2 ENE Technology, Inc.
+0cf3 Atheros Communications, Inc.
+0cf4 Fomtex Corp.
+0cf5 Cellink Co., Ltd
+0cf6 Compucable Corp.
+0cf7 ishoni Networks
+0cf8 Clarisys, Inc.
+0cf9 Central System Research Co., Ltd
+0cfa Inviso, Inc.
+0cfc Minolta-QMS, Inc.
+0cff SAFA MEDIA Co., Ltd.
+ 0320 SR-380N
+0d06 telos EDV Systementwicklung GmbH
+0d0b Contemporary Controls
+0d0c Astron Electronics Co., Ltd
+0d0d MKNet Corp.
+0d0e Hybrid Networks, Inc.
+0d0f Feng Shin Cable Co., Ltd
+0d10 Elastic Networks
+0d11 Maspro Denkoh Corp.
+0d12 Hansol Electronics, Inc.
+0d13 BMF Corp.
+0d14 Array Comm, Inc.
+0d15 OnStream b.v.
+0d16 Hi-Touch Imaging Technologies Co., Ltd
+0d17 NALTEC, Inc.
+0d18 coaXmedia
+0d19 Hank Connection Industrial Co., Ltd
+0d32 Leo Hui Electric Wire & Cable Co., Ltd
+0d33 AirSpeak, Inc.
+0d34 Rearden Steel Technologies
+0d35 Dah Kun Co., Ltd
+0d3c Sri Cable Technology, Ltd
+0d3d Tangtop Technology Co., Ltd
+0d3e Fitcom, inc.
+0d3f MTS Systems Corp.
+0d40 Ascor, Inc.
+0d41 Ta Yun Terminals Industrial Co., Ltd
+0d42 Full Der Co., Ltd
+0d46 Kobil Systems GmbH
+ 3003 mIDentity Light / KAAN SIM III
+ 4000 mIDentity (mass storage)
+ 4001 mIDentity Basic/Classic (composite device)
+ 4081 mIDentity Basic/Classic (installationless)
+0d49 Maxtor
+0d4a NF Corp.
+0d4b Grape Systems, Inc.
+0d4c Tedas AG
+0d4d Coherent, Inc.
+0d4e Agere Systems Netherland BV
+0d4f EADS Airbus France
+0d50 Cleware GmbH
+ 0011 USB-Temp2 Thermometer
+0d51 Volex (Asia) Pte., Ltd
+0d53 HMI Co., Ltd
+0d54 Holon Corp.
+0d55 ASKA Technologies, Inc.
+0d56 AVLAB Technology, Inc.
+0d57 Solomon Microtech, Ltd
+0d5c Belkin
+ a002 F5D6050 802.11b Adapter
+0d5e Myacom, Ltd
+0d5f CSI, Inc.
+0d60 IVL Technologies, Ltd
+0d61 Meilu Electronics (Shenzhen) Co., Ltd
+0d62 Darfon Electronics Corp.
+ a100 Benq Mouse
+0d63 Fritz Gegauf AG
+0d64 DXG Technology Corp.
+ 0107 Horus MT-409 Camera
+ 0303 DXG-305V Camera
+ 1001 SiPix Stylecam/UMAX AstraPix 320s
+ 1021 D-Link DSC 350F
+0d65 KMJP Co., Ltd
+0d66 TMT
+0d67 Advanet, Inc.
+0d68 Super Link Electronics Co., Ltd
+0d69 NSI
+0d6a Megapower International Corp.
+0d6b And-Or Logic
+0d70 Try Computer Co., Ltd
+0d71 Hirakawa Hewtech Corp.
+0d72 Winmate Communication, Inc.
+0d73 Hit's Communications, Inc.
+0d76 MFP Korea, Inc.
+0d77 Power Sentry/Newpoint
+0d78 Japan Distributor Corp.
+0d7a MARX Datentechnik GmbH
+0d7b Wellco Technology Co., Ltd
+0d7c Taiwan Line Tek Electronic Co., Ltd
+0d7d Phison Electronics Corp.
+ 0100 PS1001/1011/1006/1026 Flash Disk
+ 0110 Gigabyte FlexDrive
+ 0240 I/O-Magic/Transcend 6-in-1 Card Reader
+ 110E NEC uPD720121/130 USB-ATA/ATAPI Bridge
+ 1240 Apacer 6-in-1 Card Reader 2.0
+ 1270 Wolverine SixPac 6000
+ 1300 Flash Disk
+ 1320 PS2031 Flash Disk
+ 1420 PS2044 Pen Drive
+ 1470 Vosonic X's-Drive II+ VP2160
+ 1900 USB Thumb Drive
+0d7e American Computer & Digital Components
+0d7f Essential Reality LLC
+0d80 H.R. Silvine Electronics, Inc.
+0d81 TechnoVision
+0d83 Think Outside, Inc.
+0d89 Oz Software
+0d8a King Jim Co., Ltd
+0d8b Ascom Telecommunications, Ltd
+0d8c C-Media Electronics, Inc.
+ 000c Audio Adapter
+ 000e Audio Adapter (Planet UP-100 USB Phone)
+ 0103 Turtle Beach Audio Advantage Micro
+ b213 USB Phone CM109 (aka CT2000,VPT1000)
+0d8d Promotion & Display Technology, Ltd
+0d8e Global Sun Technology, Inc.
+ 7100 802.11b Adapter
+ 7a01 PRISM25 802.11b Adapter
+0d8f Pitney Bowes
+0d90 Sure-Fire Electrical Corp.
+0d96 Skanhex Technology, Inc.
+ 0000 Jenoptik JD350 video
+ 3300 SX330z Camera
+ 4100 SX410z Camera
+ 4102 MD 9700 Camera
+ 4104 Jenoptik JD-4100z3s
+ 410a Medion 9801/Novatech SX-410z
+ 5200 SX-520z Camera
+0d97 Santa Barbara Instrument Group
+ 0001 SBIG Astronomy Camera (without firmware)
+ 0101 SBIG Astronomy Camera (with firmware)
+0d98 Mars Semiconductor Corp.
+0d99 Trazer Technologies, Inc.
+0d9a RTX Telecom AS
+0d9b Tat Shing Electrical Co.
+0d9c Chee Chen Hi-Technology Co., Ltd
+0d9d Sanwa Supply, Inc.
+0d9e Avaya
+0d9f Powercom Co., Ltd
+0da0 Danger Research
+0da1 Suzhou Peter's Precise Industrial Co., Ltd
+0da2 Land Instruments International, Ltd
+0da3 Nippon Electro-Sensory Devices Corp.
+0da4 Polar Electro OY
+0da7 IOGear, Inc.
+0da8 softDSP Co., Ltd
+ 0001 SDS 200A Oscilloscope
+0dab Cubig Group
+ 0100 DVR/CVR-M140 MP3 Player
+0dad Westover Scientific
+0db0 Micro Star International
+ 1967 Bluetooth Dongle
+ 4011 Medion Flash XL V2.0 Card Reader
+ 697a Bluetooth Dongle
+ 6982 Medion Flash XL V2.7A Card Reader
+ a970 Bluetooth dongle
+0db1 Wen Te Electronics Co., Ltd
+0db2 Shian Hwi Plug Parts, Plastic Factory
+0db3 Tekram Technology Co., Ltd
+0db4 Chung Fu Chen Yeh Enterprise Corp.
+0dbe Jiuh Shiuh Precision Industry Co., Ltd
+0dbf Quik Tech Solutions
+0dc0 Great Notions
+0dc1 Tamagawa Seiki Co., Ltd
+0dc3 Athena Smartcard Solutions, Inc.
+0dc4 Macpower Peripherals, Ltd
+0dc5 SDK Co., Ltd
+0dc6 Precision Squared Technology Corp.
+0dc7 First Cable Line, Inc.
+0dcd NetworkFab Corp.
+ 0001 Remote Interface Adapter
+ 0002 High Bandwidth Codec
+0dd0 Access Solutions
+ 1002 Triple Talk Speech Synthesizer
+0dd1 Contek Electronics Co., Ltd
+0dd2 Power Quotient International Co., Ltd
+0dd3 MediaQ
+0dd4 Custom Engineering SPA
+0dd5 California Micro Devices
+0dd7 Kocom Co., Ltd
+0dd8 Netac Technology Co., Ltd
+ e007 OnlyDisk U222 Pendrive
+0dd9 HighSpeed Surfing
+0dda Integrated Circuit Solution, Inc.
+ 2026 USB2.0 Card Reader
+ 2027 USB 2.0 Card Reader
+0ddb Tamarack, Inc.
+0ddd Datelink Technology Co., Ltd
+0dde Ubicom, Inc.
+0de0 BD Consumer Healthcare
+0ded Novasonics
+0dee Lifetime Memory Products
+0def Full Rise Electronic Co., Ltd
+0df6 Sitecom Europe B.V.
+ 9071 zd1211 802.11g Adapter
+0df7 Mobile Action Technology, Inc.
+ 0620 MA-620 Infrared Adapter
+ 0700 MA-700 Bluetooth Adapter
+0dfa Toyo Communication Equipment Co., Ltd
+0dfc GeneralTouch Technology Co., Ltd
+ 0001 Touchscreen
+0e03 Nippon Systemware Co., Ltd
+0e08 Winbest Technology Co., Ltd
+0e0c Gesytec
+ 0101 LonUSB LonTalk Network Adapter
+0e16 JMTek, LLC
+0e17 Walex Electronic, Ltd
+0e1b Crewave
+0e21 Cowon Systems, Inc.
+ 0300 iAudio CW200
+ 0510 iAudio X5
+ 0700 iAudio U3
+0e23 Liou Yuane Enterprise Co., Ltd
+0e25 VinChip Systems, Inc.
+0e26 J-Phone East Co., Ltd
+0e30 HeartMath LLC
+0e34 Micro Computer Control Corp.
+0e35 3Pea Technologies, Inc.
+0e36 TiePie engineering
+ 0008 Handyscope HS3
+ 0009 Handyscope HS3 (br)
+ 000a Handyscope HS4
+ 000b Handyscope HS4 (br)
+ 000e Handyscope HS4 Diff
+ 000f Handyscope HS4 Diff (br)
+ 0010 Handyscope HS2
+ 0018 Handyprobe HP2
+ 0042 TiePieSCOPE HS801
+ 00fd USB To Parallel adapter
+ 00fe USB To Parallel adapter
+0e38 Stratitec, Inc.
+0e39 Smart Modular Technologies, Inc.
+0e3a Neostar Technology Co., Ltd
+ 1100 CW-1100 Wireless Network Adapter
+0e3b Mansella, Ltd
+0e41 Line6, Inc.
+ 4250 BassPODxt
+ 4252 BassPODxt Pro
+ 4642 BassPODxt Live
+ 4650 PODxt Live
+ 4750 GuitarPort
+ 5044 PODxt
+ 5050 PODxt Pro
+ 534D SeaMonkey
+0e48 Julia Corp., Ltd
+ 0100 CardPro SmartCard Reader
+0e4a Shenzhen Bao Hing Electric Wire & Cable Mfr. Co.
+0e4c Radica Games, Ltd
+0e55 Speed Dragon Multimedia, Ltd
+ 110b MS3303H USB-to-Serial Bridge
+0e5a Active Co., Ltd
+0e5b Union Power Information Industrial Co., Ltd
+0e5c Bitland Information Technology Co., Ltd
+0e5d Neltron Industrial Co., Ltd
+0e66 Hawking
+ 400c UF100 Ethernet [pegasus2]
+0e67 Fossil, Inc.
+ 0002 Wrist PDA
+0e6a Megawin Technology Co., Ltd
+0e70 Tokyo Electronic Industry Co., Ltd
+0e72 Hsi-Chin Electronics Co., Ltd
+0e75 TVS Electronics, Ltd
+0e7b On-Tech Industry Co., Ltd
+0e7e Gmate, Inc.
+ 0001 Yopy 3000 PDA
+0e82 Ching Tai Electric Wire & Cable Co., Ltd
+0e8c Well Force Electronic Co., Ltd
+0e90 WiebeTech, LLC
+0e91 VTech Engineering Canada, Ltd
+0e92 C's Glory Enterprise Co., Ltd
+0e93 eM Technics Co., Ltd
+0e95 Future Technology Co., Ltd
+0e96 Aplux Communications, Ltd
+0e97 Fingerworks, Inc.
+0e98 Advanced Analogic Technologies, Inc.
+0e99 Parallel Dice Co., Ltd
+0e9a TA HSING Industries, Ltd
+0e9b ADTEC Corp.
+0e9c Streamzap, Inc.
+ 0000 Streamzap Remote Control
+0e9f Tamura Corp.
+0ea0 Ours Technology, Inc.
+ 2126 7-in-1 Card Reader
+ 2168 Transcend JetFlash 2.0 / Astone USB Drive
+ 6803 OTI-6803 Flash Disk
+ 6808 OTI-6808 Flash Disk
+ 6828 OTI-6828 Flash Disk
+0ea6 Nihon Computer Co., Ltd
+0ea7 MSL Enterprises Corp.
+0ea8 CenDyne, Inc.
+0ead Humax Co., Ltd
+0eb1 WIS Technologies, Inc.
+0eb2 Y-S Electronic Co., Ltd
+0eb3 Saint Technology Corp.
+0eb7 Endor AG
+0ebe VWeb Corp.
+0ebf Omega Technology of Taiwan, Inc.
+0ec0 LHI Technology (China) Co., Ltd
+0ec1 Abit Computer Corp.
+0ec2 Sweetray Industrial, Ltd
+0ec3 Axell Co., Ltd
+0ec4 Ballracing Developments, Ltd
+0ec5 GT Information System Co., Ltd
+0ec6 InnoVISION Multimedia, Ltd
+0ec7 Theta Link Corp.
+ 1008 So., Show 301 Digital Camera
+0ecd Lite-On IT Corp.
+0ece TaiSol Electronics Co., Ltd
+0ecf Phogenix Imaging, LLC
+0ed1 WinMaxGroup
+ 6660 USB Flash Disk 64M-C
+ 6680 USB Flash Disk 64M-B
+0ed2 Kyoto Micro Computer Co., Ltd
+0ed3 Wing-Tech Enterprise Co., Ltd
+0eda Noriake Itron Corp.
+0edf e-MDT Co., Ltd
+0ee0 Shima Seiki Mfg., Ltd
+0ee1 Sarotech Co., Ltd
+0ee2 AMI Semiconductor, Inc.
+0ee3 ComTrue Technology Corp.
+ 1000 Image Tank 1.5
+0ee4 Sunrich Technology, Ltd
+0eee Digital Stream Technology, Inc.
+0eef D-WAV Scientific Co., Ltd
+ 0001 eGalax TouchScreen
+0ef0 Hitachi Cable, Ltd
+0ef1 Aichi Micro Intelligent Corp.
+0ef2 I/O Magic Corp.
+0ef3 Lynn Products, Inc.
+0ef4 DSI Datotech
+0ef5 PointChips
+ 2202 Flash Disk
+0ef6 Yield Microelectronics Corp.
+0ef7 SM Tech Co., Ltd (Tulip)
+0efe Wem Technology, Inc.
+0efd Oasis Semiconductor
+0f06 Visual Frontier Enterprise Co., Ltd
+0f08 CSL Wire & Plug (Shen Zhen) Co.
+0f0c CAS Corp.
+0f0d Hori Co., Ltd
+0f0e Energy Full Corp.
+0f12 Mars Engineering Corp.
+0f13 Acetek Technology Co., Ltd
+0f19 Oracom Co., Ltd
+0f1b Onset Computer Corp.
+0f1c Funai Electric Co., Ltd
+0f1d Iwill Corp.
+0f21 IOI Technology Corp.
+0f22 Senior Industries, Inc.
+0f23 Leader Tech Manufacturer Co., Ltd
+0f24 Flex-P Industries, Snd., Bhd.
+0f2d ViPower, Inc.
+0f2e Geniality Maple Technology Co., Ltd
+0f2f Priva Design Services
+0f30 Jess Technology Co., Ltd
+0f31 Chrysalis Development
+0f32 YFC-BonEagle Electric Co., Ltd
+0f37 Kokuyo Co., Ltd
+0f38 Nien-Yi Industrial Corp.
+0f3d Airprime, Incorporated
+ 0112 CDMA 1xEVDO PC Card, PC 5220
+0f41 RDC Semiconductor Co., Ltd
+0f42 Nital Consulting Services, Inc.
+0f4b St. John Technology Co., Ltd
+0f4c WorldWide Cable Opto Corp.
+0f4d Microtune, Inc.
+ 1000 Bluetooth Dongle
+0f4e Freedom Scientific
+0f52 Wing Key Electrical Co., Ltd
+0f53 Dongguan White Horse Cable Factory, Ltd
+0f54 Kawai Musical Instruments Mfg. Co., Ltd
+0f55 AmbiCom, Inc.
+0f5c Prairiecomm, Inc.
+0f5d NewAge International, LLC
+0f5f Key Technology Corp.
+0f60 NTK, Ltd
+0f61 Varian, Inc.
+0f62 Acrox Technologies Co., Ltd
+0f68 Kobe Steel, Ltd
+0f69 Dionex Corp.
+0f6a Vibren Technologies, Inc.
+0f6e INTELLIGENT SYSTEMS
+ 0100 GameBoy Color Emulator
+ 0201 GameBoy Advance Flash Gang Writer
+ 0202 GameBoy Advance Capture
+ 0300 Gamecube DOL Viewer
+ 0400 NDS Emulator
+ 0401 NDS UIC
+ 0402 NDS Writer
+ 0403 NDS Capture
+ 0404 NDS Emulator (Lite)
+0f73 DFI
+0f7c DQ Technology, Inc.
+0f7d NetBotz, Inc.
+0f7e Fluke Corp.
+0f88 VTech Holdings, Ltd
+0f8b Yazaki Corp.
+0f8c Young Generation International Corp.
+0f8d Uniwill Computer Corp.
+0f8e Kingnet Technology Co., Ltd
+0f8f Soma Networks
+0f97 CviLux Corp.
+0f98 CyberBank Corp.
+0f9c Hyun Won, Inc.
+ 0301 M-Any Premium DAH-610 MP3/WMA Player
+ 0332 mobiBLU DAH-1200 MP3/Ogg Player
+0f9e Lucent Technologies
+0fa3 Starconn Electronic Co., Ltd
+0fa4 ATL Technology
+0fa5 Sotec Co., Ltd
+0fa7 Epox Computer Co., Ltd
+0fa8 Logic Controls, Inc.
+0faf Winpoint Electronic Corp.
+0fb0 Haurtian Wire & Cable Co., Ltd
+0fb1 Inclose Design, Inc.
+0fb2 Juan-Chern Industrial Co., Ltd
+0fb8 Wistron Corp.
+0fb9 AACom Corp.
+0fba San Shing Electronics Co., Ltd
+0fbb Bitwise Systems, Inc.
+0fc1 Mitac Internatinal Corp.
+0fc2 Plug and Jack Industrial, Inc.
+0fc5 Delcom Engineering
+ 1222 I/O Development Board
+0fc6 Dataplus Supplies, Inc.
+0fca Research In Motion, Ltd.
+ 0001 Blackberry Handheld
+0fce Sony Ericsson Mobile Communications AB
+ d017 K608i Phone
+0fcf Dynastream Innovations, Inc.
+0fd0 Tulip Computers B.V.
+0fd4 Tenovis GmbH & Co., KG
+0fd5 Direct Access Technology, Inc.
+0fdc Micro Plus
+0fe4 IN-Tech Electronics, Ltd
+0fe5 Greenconn (U.S.A.), Inc.
+0fe9 DVICO
+ db00 FusionHDTV DVB-T (MT352+LgZ201) (uninitialized)
+ db01 FusionHDTV DVB-T (MT352+LgZ201) (initialized)
+ db10 FusionHDTV DVB-T (MT352+Thomson7579) (uninitialized)
+ db11 FusionHDTV DVB-T (MT352+Thomson7579) (initialized)
+0fea United Computer Accessories
+0feb CRS Electronic Co., Ltd
+0fec UMC Electronics Co., Ltd
+0fed Access Co., Ltd
+0fee Xsido Corp.
+0fef MJ Research, Inc.
+0ff6 Core Valley Co., Ltd
+0ff7 CHI SHING Computer Accessories Co., Ltd
+0fff Aopen, Inc.
+1000 Speed Tech Corp.
+1001 Ritronics Components (S) Pte., Ltd
+1003 Sigma Corp.
+ 0100 Sigma SD10
+1004 LG Electronics, Inc.
+ 1fae U8120 3G Cellphone
+ 6000 VX4400/VX6000 Cellphone
+ 6005 T5100
+ 6800 CDMA Modem
+1005 Apacer Technology, Inc.
+ b113 Handy Steno 2.0 (256MB)
+1006 iRiver, Ltd.
+ 3002 iHP-100/120/140 MP3 Player
+1009 Emuzed, Inc.
+100a AV Chaseway, Ltd
+100b Chou Chin Industrial Co., Ltd
+100d Netopia, Inc.
+ 3342 Cayman 3352 DSL Modem
+ cb01 Cayman 3341 Ethernet DSL Router
+1010 Fukuda Denshi Co., Ltd
+1011 Mobile Media Tech.
+1012 SDKM Fibres, Wires & Cables Berhad
+1013 TST-Touchless Sensor Technology AG
+1014 Densitron Technologies PLC
+1015 Softronics Pty., Ltd
+1016 Xiamen Hung's Enterprise Co., Ltd
+1017 Speedy Industrial Supplies, Pte., Ltd
+1019 Elitegroup Computer Systems (ECS)
+ 0c55 USB Flash Reader, Desknote UCR-61S2B
+1020 Labtec
+ 000a Wireless Optical Mouse
+1022 Shinko Shoji Co., Ltd
+1025 Hyper-Paltek
+ 005e USB DVB-T device
+ 005f USB DVB-T device
+1026 Newly Corp.
+1027 Time Domain
+1028 Inovys Corp.
+1029 Atlantic Coast Telesys
+102a Ramos Technology Co., Ltd
+102b Infotronic America, Inc.
+102c Etoms Electronics Corp.
+102d Winic Corp.
+1031 Comax Technology, Inc.
+1032 C-One Technology Corp.
+1033 Nucam Corp.
+1038 Ideazon, Inc.
+ 0100 Zboard
+1039 devolo AG
+ 2140 dsl+ 1100 duo
+1043 iCreate Technologies Corp.
+ 8006 Flash Disk 32-256 MB
+1044 Chu Yuen Enterprise Co., Ltd
+1046 Winbond Electronics Corp. [hex]
+ 9967 W9967CF/W9968CF WebCam IC
+104c AMCO TEC International, Inc.
+1053 Immanuel Electronics Co., Ltd
+1054 BMS International Beheer N.V.
+1055 Complex Micro Interconnection Co., Ltd
+1056 Hsin Chen Ent Co., Ltd
+1057 ON Semiconductor
+1058 Western Digital Technologies, Inc.
+1059 Giesecke & Devrient GmbH
+105c Hong Ji Electric Wire & Cable (Dongguan) Co., Ltd
+105d Delkin Devices, Inc.
+105e Valence Semiconductor Design, Ltd
+105f Chin Shong Enterprise Co., Ltd
+1060 Easthome Industrial Co., Ltd
+1063 Motorola Electronics Taiwan, Ltd [hex]
+ 1555 MC141555 Hub
+1065 CCYU Technology
+ 2136 EasyDisk ED1064
+106a Loyal Legend, Ltd
+106c Curitel Communications, Inc.
+ 2101 AudioVox 8900 Cell Phone
+106d San Chieh Manufacturing, Ltd
+106e ConectL
+106f Money Controls
+1076 GCT Semiconductor, Inc.
+107d Arlec Australia, Ltd
+107e Midoriya Electric Co., Ltd
+107f KidzMouse, Inc.
+1082 Shin-Etsukaken Co., Ltd
+1083 Canon Electronics, Inc.
+1084 Pantech Co., Ltd
+108a Chloride Power Protection
+108b Grand-tek Technology Co., Ltd
+108c Robert Bosch GmbH
+1099 Surface Optics Corp.
+109a DATASOFT Systems GmbH
+109f eSOL Co., Ltd
+10a0 Hirotech, Inc.
+10a3 Mitsubishi Materials Corp.
+10a9 SK Teletech Co., Ltd
+10aa Cables To Go
+10ab USI Co., Ltd
+ 10c5 Sony-Ericsson / Samsung DataCable
+10ac Honeywell, Inc.
+10ae Princeton Technology Corp.
+10b5 Comodo (PLX?)
+ 9060 Test Board
+10b8 DiBcom
+ 0bb8 DiBcom USB DVB-T reference design (MOD300) (cold)
+ 0bb9 DiBcom USB DVB-T reference design (MOD300) (warm)
+ 0bc6 DiBcom USB2.0 DVB-T reference design (MOD3000P) (cold)
+ 0bc7 DiBcom USB2.0 DVB-T reference design (MOD3000P) (warm)
+10bb TM Technology, Inc.
+10bc Dinging Technology Co., Ltd
+10bd TMT Technology, Inc.
+10bf SmartHome
+ 0001 SmartHome PowerLinc
+10c4 Cygnal Integrated Products, Inc.
+10c5 Sanei Electric, Inc.
+10c6 Intec, Inc.
+10cb Eratech
+10cc GBM Connector Co., Ltd
+10cd Kycon, Inc.
+10cf Velleman Components, Inc.
+ 5500 8055 Experiment Interface Board (address=0)
+ 5501 8055 Experiment Interface Board (address=1)
+ 5502 8055 Experiment Interface Board (address=2)
+ 5503 8055 Experiment Interface Board (address=3)
+10d1 Hottinger Baldwin Measurement
+ 0101 USB-Module for Spider8, CP32
+ 0202 CP22 - Communication Processor
+ 0301 CP42 - Communication Processor
+10d4 Man Boon Manufactory, Ltd
+10d5 Uni Class Technology Co., Ltd
+10d6 Actions Semiconductor Co., Ltd
+ 1000 MP3 Player
+ 1100 MPMan MP-Ki 128 MP3 Player/Recorder
+10de Authenex, Inc.
+10df In-Win Development, Inc.
+10e0 Post-Op Video, Inc.
+10e1 CablePlus, Ltd
+10e2 Nada Electronics, Ltd
+10ec Vast Technologies, Inc.
+10fb Pictos Technologies, Inc.
+10fd Anubis Electronics, Ltd
+ 804d Typhoon Webshot II Webcam [zc0301]
+1a0a ...
+ badd USB OTG Compliance test device
+1100 VirTouch, Ltd
+ 0001 VTPlayer VTP-1 Braille Mouse
+1101 EasyPass Industrial Co., Ltd
+ 0001 FSK Electronics Super GSM Reader
+1108 Brightcom Technologies, Ltd
+1110 Analog Devices Canada, Ltd (Allied Telesyn)
+ 900f AT-AR215 DSL Modem
+1111 Pandora International Ltd.
+ 8888 Evolution Device
+1112 YM ELECTRIC CO., Ltd
+1113 Medion AG
+111e VSO Electric Co., Ltd
+112e Master Hill Electric Wire and Cable Co., Ltd
+112f Cellon International, Inc.
+1130 Tenx Technology, Inc.
+1131 Integrated System Solution Corp.
+ 1001 KY-BT100 Bluetooth Adapter
+1132 Toshiba Corp., Digital Media Equipment [hex]
+ 4331 PDR-M4/M5/M70 Digital Camera
+ 4332 PDR-M60 Digital Camera
+ 4333 PDR-M2300/PDR-M700
+ 4334 PDR-M65
+ 4335 PDR-M61
+ 4337 PDR-M11
+ 4338 PDR-M25
+113c Arin Tech Co., Ltd
+113d Mapower Electronics Co., Ltd
+1141 V One Multimedia, Pte., Ltd
+1142 CyberScan Technologies, Inc.
+1147 Ever Great Electric Wire and Cable Co., Ltd
+114b Sphairon Access Systems GmbH
+ 0110 Turbolink UB801R WLAN USB Adapter
+114c Tinius Olsen Testing Machine Co., Inc.
+114d Alpha Imaging Technology Corp.
+1162 Secugen Corp.
+1163 DeLorme Publishing, Inc.
+1164 YUAN High-Tech Development Co., Ltd
+1165 Telson Electronics Co., Ltd
+1166 Bantam Interactive Technologies
+1167 Salient Systems Corp.
+1168 BizConn International Corp.
+116e Gigastorage Corp.
+116f Silicon 10 Technology Corp.
+1175 Shengyih Steel Mold Co., Ltd
+117d Santa Electronic, Inc.
+117e JNC, Inc.
+1182 Venture Corp., Ltd
+1183 Compaq Computer Corp. [hex] (Digital Dream ??)
+ 0001 DigitalDream l'espion XS
+ 19c7 ISDN TA
+ 4008 56k FaxModem
+ 504a PJB-100 Personal Jukebox
+1184 Kyocera Elco Corp.
+118f You Yang Technology Co., Ltd
+1190 Tripace
+1191 Loyalty Founder Enterprise Co., Ltd
+1196 Yankee Robotics, LLC
+ 0010 Trifid Camera without code
+ 0011 Trifid Camera
+1197 Technoimagia Co., Ltd
+1198 StarShine Technology Corp.
+1199 Sierra Wireless, Inc.
+ 0112 CDMA 1xEVDO PC Card, AirCard 580
+119a ZHAN QI Technology Co., Ltd
+119b ruwido austria GmbH
+ 0400 Infrared Keyboard V2.01
+11a0 Chipcon AS
+ eb11 CC2400EB 2.0 ZigBee Sniffer
+11a3 Technovas Co., Ltd
+11aa GlobalMedia Group, LLC
+11ab Exito Electronics Co., Ltd
+11db Topfield Co., Ltd.
+ 1000 PVR
+ 1100 PVR
+11f5 Siemens AG (?)
+ 0003 Mobile phone USB cable
+11f7 Alcatel (?)
+ 02df TD10 Mobile phone USB cable
+1209 InterBiometrics
+ 1001 USB Hub
+ 1002 USB Relais
+ 1003 IBSecureCam-P
+ 1004 IBSecureCam-O
+ 1005 IBSecureCam-N
+120e Hudson Soft Co., Ltd
+121e Jungsoft Co., Ltd
+ 3403 Muzio JM250 Audio Player
+1241 Belkin
+ 1111 Mouse
+ 1166 optical mouse w/ scrollwheel
+ 1177 F8E842-DL Mouse
+124a AirVast
+ 4017 PC-Chips 802.11b Adapter
+124b Nyko (Honey Bee)
+ 4d01 Airflo EX Joystick
+1267 Logic3 / SpectraVideo plc
+ 0201 A4Tech SWOP-3 Mouse
+ a001 JP260 PC Game Pad
+126e Strobe Data, Inc.
+126f TwinMOS
+ 1325 Mobile Disk
+ 2168 Mobile Disk III
+1275 Xaxero Marine Software Engineering, Ltd.
+ 0002 WeatherFax 2000 Demodulator
+ 0080 SkyEye Weather Satellite Receiver
+1286 Marvell Semiconductor, Inc.
+ 8001 BLOB boot loader firmware
+1292 Innomedia
+ 0258 Creative Labs VoIP Blaster
+1293 Belkin Components [hex]
+ 0002 F5U002 Parallel Port [uss720]
+ 2101 104-key keyboard
+12ef Tapwave, Inc.
+ 0100 Tapwave Handheld [Tapwave Zodiac]
+12fd AIN Comm. Technology Co., Ltd
+ 1001 AWU2000b 802.11b Stick
+1307 Transcend Information, Inc.
+ 1169 TS2GJF210 JetFlash 210 2GB
+1310 Roper
+ 0001 Class 1 Bluetooth Dongle
+1312 ICS Electronics
+131d Natural Point
+ 0155 TrackIR 3 Pro Head Tracker
+132b Konica Minolta
+ 0000 Dimage A2 Camera
+ 0001 Minolta DiMAGE A2 (ptp)
+ 0003 Dimage Xg Camera
+ 0006 Dimage Z2 Camera
+ 0007 Minolta DiMAGE Z2 (PictBridge mode)
+ 0008 Dimage X21 Camera
+ 000a Dimage Scan Dual IV
+ 000b Dimage Z10 Camera
+ 000d Dimage X50 Camera [storage?]
+ 000f Dimage X50 Camera [p2p?]
+ 0010 Dimage G600 Camera
+ 0012 Dimage Scan Elite5400 2
+ 0013 Dimage X31 Camera
+ 0015 Dimage G530 Camera
+ 0017 Dimage Z3 Camera
+ 0018 Minolta DiMAGE Z3 (PictBridge mode)
+ 0019 Dimage A200 Camera
+ 0021 Dimage Z5 Camera
+ 0022 Minolta DiMAGE Z5 (PictBridge mode)
+1342 Mobility
+ 0200 EasiDock 200 Hub
+ 0201 EasiDock 200 Keyboard and Mouse Port
+ 0202 EasiDock 200 Serial Port
+ 0203 EasiDock 200 Printer Port
+134e Digby's Bitpile, Inc. DBA D Bit
+1370 Swissbit
+ 6828 Victorinox Flash Drive
+1398 Q-tec
+ 2103 USB 2.0 Storage Device
+13b0 Alesis
+ 000a Photon X25 MIDI Controller
+13b1 Linksys
+ 000b WUSB11 v4.0 802.11b Adapter
+ 0011 WUSB54GP v4.0 802.11g Adapter
+ 0018 USB200M 10/100 Ethernet Adapter
+13d2 Shark Multimedia
+ 0400 Pocket Ethernet [klsi]
+13d3 IMC Networks
+ 3201 VisionDTV USB-Ter/HAMA USB DVB-T device cold
+ 3202 VisionDTV USB-Ter/HAMA USB DVB-T device warm
+13fe Kingston Technology Company Inc.
+ 1d00 DataTraveler 2.0 1GB Flash Drive
+1453 Radio Shack
+ 4026 26-183 Serial Cable
+1462 Micro Star International
+ 5512 MegaStick-1 Flash Stick
+147a Formosa Industrial Computing, Inc.
+1484 Elsa AG [hex]
+ 1746 Ecomo 19H99 Monitor
+ 7616 Elsa Hub
+148f Ralink Technology, Corp.
+ 2570 802.11g WiFi
+14aa AVerMedia (again) or C&E
+ 0001 Avermedia AverTV DVBT USB1.1 (cold)
+ 0002 Avermedia AverTV DVBT USB1.1 (warm)
+ 0201 AVermedia/Yakumo/Hama/Typhoon DVB-T USB2.0 (cold)
+ 0221 AVermedia DVBT Tuner Dongle
+ 0301 AVermedia/Yakumo/Hama/Typhoon DVB-T USB2.0 (warm)
+14b2 Atheros Communications Inc
+ 3a93 USB WLAN Device
+14c2 Gemlight Computer, Ltd
+1518 Cheshire Engineering Corp.
+ 0001 HDReye High Dynamic Range Camera
+ 0002 HDReye (before firmware loads)
+1520 Bitwire Corp.
+152d ???
+ 2338 USB to (S)ATA/ATAPI Bridge
+152e LG (HLDS)
+ e001 GSA-5120D DVD-RW
+1546 U-Blox AG
+1554 Prolink Microsystems Corp.
+1568 Sunf Pu Technology Co., Ltd
+15c2 SoundGraph Inc.
+ ffdc iMON PAD Remote Controller
+15c6 Laboratoires MXM
+ 1000 DigistimSP (cold)
+ 1001 DigistimSP (warm)
+ 1002 DigimapSP USB (cold)
+ 1003 DigimapSP USB (warm)
+15e1 RSA
+ 2007 RSA SecurID (R) Authenticator
+15e8 SohoWare
+ 9100 NUB100 Ethernet [pegasus]
+15e9 Pacific Digital Corp.
+15f4 HanfTek
+ 0001 HanfTek UMT-010 USB2.0 DVB-T (cold)
+ 0025 HanfTek UMT-010 USB2.0 DVB-T (warm)
+1604 Tascam
+ 8000 US-428 Audio/Midi Controller (without fw)
+ 8001 US-428 Audio/Midi Controller
+ 8004 US-224 Audio/Midi Controller (without fw)
+ 8005 US-224 Audio/Midi Controller
+ 8006 US-122 Audio/Midi Interface (without fw)
+ 8007 US-122 Audio/Midi Interface
+1606 Umax [hex]
+ 0010 Astra 1220U
+ 0030 Astra 2000U
+ 0060 Astra 3400U
+ 0130 Astra 2100U
+ 0160 Astra 5400U
+ 0230 Astra 2200/2200SU
+ 2020 AstraCam 1000
+1608 Inside Out Networks [hex]
+ 0001 EdgePort/4 Serial Port
+ 1403 MultiTech Systems MT4X56 Modem
+1645 Entrega [hex]
+ 0001 1S Serial Port
+ 0002 2S Serial Port
+ 0003 1S25 Serial Port
+ 0004 4S Serial Port
+ 0005 E45 Ethernet [klsi]
+ 0006 Parallel Port
+ 0007 U1-SC25 SCSI
+ 0093 1S9 Serial Port
+ 8000 EZ-USB
+ 8002 2x Serial Port
+ 8093 PortGear Serial Port
+1657 Struck Innovative Systeme GmbH
+ 3150 SIS3150 USB2.0 to VME interface
+1668 Actiontec Electronics, Inc. [hex]
+ 0333 Modem
+ 0408 Prism2.5 802.11b Adapter
+ 0421 Prism2.5 802.11b Adapter
+ 0500 BTM200B BlueTooth Adapter
+1690 Askey Computer Corp. [hex]
+ 0101 Creative Modem Blaster DE5670
+ 0103 Askey 1456 VQE-R3 Modem [conexant]
+ 0109 Askey MagicXpress V.90 Pocket Modem [conexant]
+1696 Hitachi Video and Information System, Inc.
+1697 VTec Test, Inc.
+1706 BlueView Technologies, Inc.
+1733 Cellink Technology Co., Ltd
+ 0101 RF Wireless Optical Mouse OP-701
+1781 MetaGeek
+ 083e Wi-Spy
+17b3 Grey Innovation
+ 0004 Linux-USB Midi Gadget
+17eb Cornice, Inc.
+1822 Twinhan
+ 3201 VisionDTV USB-Ter/HAMA USB DVB-T device cold
+ 3202 VisionDTV USB-Ter/HAMA USB DVB-T device warm
+185b Compro
+ d000 Compro Videomate DVB-U2000 - DVB-T USB cold
+ d001 Compro Videomate DVB-U2000 - DVB-T USB warm
+1894 Topseed
+ 5632 Atek Tote Remote
+ 5641 TSAM-004 Presentation Remote
+18d9 Kaba
+ 01xy LEGIC advant desktop reader
+1977 T-Logic
+ 0111 TL203 MP3 Player and Voice Recorder
+1995 Trillium Technology Pty. Ltd.
+ 3202 REC-ADPT-USB (recorder)
+ 3203 REC-A-ADPT-USB (recorder)
+1c87 2N TELEKOMUNIKACE a.s.
+1ebb NuCORE Technology, Inc.
+2001 D-Link Corp. [hex]
+ 3200 DWL-120 802.11b (Atmel RFMD503A) [usbvnetr]
+ 3700 DWL-122 802.11b
+ 3701 DWL-G120 Spinnaker 802.11b
+ 3703 DWL-122 802.11b
+ 3704 DWL-G122 802.11g rev. A2
+ 3c00 DWL-G122 802.11g rev. B1 [ralink]
+ 4000 DSB-650C Ethernet [klsi]
+ 4001 DSB-650TX Ethernet [pegasus]
+ 4002 DSB-650TX Ethernet [pegasus]
+ 4003 DSB-650TX-PNA Ethernet [pegasus]
+ abc1 DSB-650 Ethernet [pegasus]
+ f013 DLink 7 port USB2.0 Hub
+ f10d Accent Communications Modem
+ f111 DBT-122 Bluetooth adapter
+2040 Hauppauge
+ 7050 Hauppauge Nova-T Stick
+ 9300 Hauppauge WinTV NOVA-T USB2 (cold)
+ 9301 Hauppauge WinTV NOVA-T USB2 (warm)
+2101 ActionStar
+ 0201 SIIG 4-to-2 Printer Switch
+2162 Creative (?)
+ 500c DE5771 Modem Blaster
+2222 MacAlly
+ 0004 iWebKey Keyboard
+2233 RadioShack Corporation
+ 6323 USB Electronic Scale
+22b8 Motorola PCS
+ 0005 V.60c/V.60i GSM Phone
+ 1005 T280e GSM/GPRS Phone
+ 2821 T720 GSM Phone
+ 2822 V.120e GSM Phone
+ 2a21 V710 GSM Phone (P2K)
+ 2a22 V710 GSM Phone (AT)
+ 2a61 E815 GSM Phone (P2K)
+ 2a62 E815 GSM Phone (AT)
+ 3001 A835/E1000 GSM Phone (P2K)
+ 3002 A835/E1000 GSM Phone (AT)
+ 3801 C350L/C450 (P2K)
+ 3802 C330/C350L/C450/EZX GSM Phone (AT)
+ 4002 A920/A925 UMTS Phone
+ 4810 Triplet GSM Phone (storage)
+ 4901 Triplet GSM Phone (P2K)
+ 4902 Triplet GSM Phone (AT)
+ 4a32 L6-imode Phone
+ 6004 EZX GSM Phone (CDC Net)
+ 6009 EZX GSM Phone (P2K)
+ 600c EZX GSM Phone (USBLAN)
+ 604c EZX GSM Phone (Storage)
+ 6631 CDC Modem
+ 6604 Washington CDMA Phone
+22b9 eTurboTouch Technology, Inc.
+22ba Technology Innovation Holdings, Ltd
+2304 Pinnacle Systems, Inc. [hex]
+ 0109 Pinnacle Studio PCTV USB (SECAM)
+ 0110 Pinnacle Studio PCTV USB (PAL)
+ 0111 Miro PCTV USB
+ 0112 Pinnacle Studio PCTV USB (NTSC) with FM radio
+ 0208 Pinnacle Studio PCTV USB2
+ 0210 Pinnacle Studio PCTV USB (PAL) with FM radio
+ 0212 Pinnacle Studio PCTV USB (NTSC)
+ 0214 Pinnacle Studio PCTV USB (PAL) with FM radio
+ 0300 Pinnacle Studio Linx Video input cable (NTSC)
+ 0301 Pinnacle Studio Linx Video input cable (PAL)
+ 0419 Pinnacle PCTV Bungee USB (PAL) with FM radio
+2318 Shining Technologies, Inc. [hex]
+ 0011 CitiDISK Jr. IDE Enclosure
+2375 Digit@lway, Inc.
+ 0001 Digital Audio Player
+2406 SANHO Digital Electronics Co., Ltd.
+ 6688 PD7X Portable Storage
+2478 Tripp-Lite
+ 2008 U209-000-R Serial Port
+2632 TwinMOS
+ 3209 7-in-1 Card Reader
+2650 Electronics For Imaging, Inc. [hex]
+2770 NHJ, Ltd
+ 905c Che-Ez Snap SNAP-U/Digigr8/Soundstar TDC-35
+ 9120 Che-ez! Snap / iClick Tiny VGA Digital Camera
+ 913c Argus DC-1730
+ 9153 iClick 5X
+2899 Toptronic Industrial Co., Ltd
+2fb2 Fujitsu, Ltd
+3125 Eagletron
+ 0001 TrackerPod Camera Stand
+3176 Whanam Electronics Co., Ltd
+3340 Yakumo
+ 0e3a Pocket PC 300 GPS SL / Typhoon MyGuide 3500
+3504 Micro Star
+ f110 Security Key
+3538 Power Quotient International Co., Ltd
+ 0001 Travel Flash
+ 0042 Cool Drive U339 Flash Disk
+3579 DIVA
+ 6901 Media Reader
+3636 InVibro
+3838 WEM
+ 0001 5-in-1 Card Reader
+3923 National Instruments Corp.
+ 703c USB-485 RS485 Cable
+4102 iRiver, Ltd.
+ 1001 iFP-100 series mp3 player
+ 1003 iFP-300 series mp3 player
+ 1005 iFP-500 series mp3 player
+ 1007 iFP-700 series mp3/ogg vorbis player
+ 1008 iFP-800 series mp3/ogg vorbis player
+ 100A iFP-1000 series mp3/ogg vorbis player
+ 1101 iFP-100 series mp3 player (ums firmware)
+ 1103 iFP-300 series mp3 player (ums firmware)
+ 1105 iFP-500 series mp3 player (ums firmware)
+ 1113 T10 (alternate)
+ 1117 T10
+ 1119 T30 series mp3/ogg/wma player
+413c Dell Computer Corp.
+ 1002 Keyboard Hub
+ 2002 SK-8125 Keyboard
+ 2005 RT7D50 Keyboard
+ 2100 SK-3106 Keyboard
+ 2101 SmartCard Reader Keyboard
+ 2500 DRAC4 Remote Access Card
+ 3010 Optical Wheel Mouse
+ 4001 Axim X5
+ 4002 Axim X3
+ 4003 Axim X30
+ 8100 TrueMobile 1180 802.11b Adapter
+ 8103 Wireless 350 Bluetooth
+ a001 Hub
+ a700 Hub (in 1905FP LCD Monitor)
+4242 USB Design by Example
+ 4201 Buttons and Lights HID device
+ 4220 Echo 1 Camera
+4146 USBest Technology
+ 9281 Iomega Micro Mini 128MB Flash Drive
+ ba01 Intuix Flash Drive
+4572 Shuttle, Inc.
+ 4572 Shuttle PN31 Remote
+4586 Panram
+ 1026 Crystal Bar Flash Drive
+4670 EMS Production
+ 9394 Game Cube USB Memory Adaptor 64M
+5032 Grandtec
+ 0bb8 Grandtec USB1.1 DVB-T (cold)
+ 0bb9 Grandtec USB1.1 DVB-T (warm)
+ 0fa0 Grandtec USB1.1 DVB-T (cold)
+ 0fa1 Grandtec USB1.1 DVB-T (warm)
+5041 Linksys (?)
+ 2234 WUSB54G 802.11g Adapter
+544d Transmeta Corp.
+5543 UC-Logic Technology Corp.
+ 0002 SuperPen WP3325U Tablet
+ 0004 Genius MousePen 5x4 Tablet
+55aa OnSpec Electronic, Inc.
+ 1234 ATAPI Bridge
+ a103 Sandisk SDDR-55 SmartMedia Card Reader
+ b012 Mitsumi FA402M 8-in-2 Card Reader
+636c CoreLogic, Inc.
+6666 Prototype product Vendor ID
+ 0667 Smart Joy PSX, PS-PC Smart JoyPad
+6993 Freshtel
+ b001 FT-102 VoIP USB Phone
+6a75 Shanghai Jujo Electronics Co., Ltd
+8086 Intel Corp.
+ 0110 Easy PC Camera
+ 0431 Intel Pro Video PC Camera
+ 0510 Digital Movie Creator
+ 0630 Pocket PC Camera
+ 07d3 BLOB boot loader firmware
+ 1111 PRO/Wireless 2011B 802.11b Adapter
+ 9890 82930 Test Board
+ c013 Wireless HID Station
+8341 EGO Systems, Inc.
+ 2000 Flashdisk
+9710 MosChip Semiconductor
+ 7705 Printer cable
+ 7715 Printer cable
+ 7780 MS7780 4Mbps Fast IRDA Adapter
+c251 Keil Software, Inc.
+ 2710 ULink
+eb1a eMPIA Technology, Inc.
+ 17de KWorld V-Stream XPERT DTV - DVB-T USB cold
+ 17df KWorld V-Stream XPERT DTV - DVB-T USB warm
+ 2710 SilverCrest WebCam
+ 2750 ECS Elitegroup G220 integrated webcam
+ 2800 Terratec Cinergy 200
+ 2801 GrabBeeX+ Video Encoder
+
+# List of known device classes, subclasses and protocols
+
+# Syntax:
+# C class class_name
+# subclass subclass_name <-- single tab
+# protocol protocol_name <-- two tabs
+
+C 00 (Defined at Interface level)
+C 01 Audio
+ 01 Control Device
+ 02 Streaming
+ 03 MIDI Streaming
+C 02 Communications
+ 01 Direct Line
+ 02 Abstract (modem)
+ 00 None
+ 01 AT-commands (v.25ter)
+ 02 AT-commands (PCCA101)
+ 03 AT-commands (PCCA101 + wakeup)
+ 04 AT-commands (GSM)
+ 05 AT-commands (3G)
+ 06 AT-commands (CDMA)
+ fe Defined by command set descriptor
+ ff Vendor Specific (MSFT RNDIS?)
+ 03 Telephone
+ 04 Multi-Channel
+ 05 CAPI Control
+ 06 Ethernet Networking
+ 07 ATM Networking
+ 08 Wireless Handset Control
+ 09 Device Management
+ 0a Mobile Direct Line
+ 0b OBEX
+ 0c Ethernet Emulation
+ 07 Ethernet Emulation (EEM)
+C 03 Human Interface Devices
+ 00 No Subclass
+ 00 None
+ 01 Keyboard
+ 02 Mouse
+ 01 Boot Interface Subclass
+ 00 None
+ 01 Keyboard
+ 02 Mouse
+C 06 Imaging
+ 01 Still Image Capture
+ 01 Picture Transfer Protocol (PIMA 15470)
+C 07 Printer
+ 01 Printer
+ 00 Reserved/Undefined
+ 01 Unidirectional
+ 02 Bidirectional
+ 03 IEEE 1284.4 compatible bidirectional
+ ff Vendor Specific
+C 08 Mass Storage
+ 01 RBC (typically Flash)
+ 00 Control/Bulk/Interrupt
+ 01 Control/Bulk
+ 50 Bulk (Zip)
+ 02 SFF-8020i, MMC-2 (ATAPI)
+ 03 QIC-157
+ 04 Floppy (UFI)
+ 00 Control/Bulk/Interrupt
+ 01 Control/Bulk
+ 50 Bulk (Zip)
+ 05 SFF-8070i
+ 06 SCSI
+ 00 Control/Bulk/Interrupt
+ 01 Control/Bulk
+ 50 Bulk (Zip)
+C 09 Hub
+ 00 Unused
+ 00 Full speed (or root) hub
+ 01 Single TT
+ 02 TT per port
+C 0a CDC Data
+ 00 Unused
+ 30 I.430 ISDN BRI
+ 31 HDLC
+ 32 Transparent
+ 50 Q.921M
+ 51 Q.921
+ 52 Q.921TM
+ 90 V.42bis
+ 91 Q.932 EuroISDN
+ 92 V.120 V.24 rate ISDN
+ 93 CAPI 2.0
+ fd Host Based Driver
+ fe CDC PUF
+ ff Vendor specific
+C 0b Chip/SmartCard
+C 0d Content Security
+C 0e Video
+ 00 Undefined
+ 01 Video Control
+ 02 Video Streaming
+ 03 Video Interface Collection
+C dc Diagnostic
+ 01 Reprogrammable Diagnostics
+ 01 USB2 Compliance
+C e0 Wireless
+ 01 Radio Frequency
+ 01 Bluetooth
+ 02 Ultra WideBand Radio Control
+ 03 RNDIS
+ 02 Wireless USB Wire Adapter
+ 01 Host Wire Adapter Control/Data Streaming
+ 02 Device Wire Adapter Control/Data Streaming
+ 03 Device Wire Adapter Isochronous Streaming
+C ef Miscellaneous Device
+ 01 ?
+ 01 Microsoft ActiveSync
+ 02 Palm Sync
+ 02 Common Class
+ 01 Interface Association
+ 02 Wire Adapter Multifunction Peripheral
+ 03 ?
+ 01 Cable Based Association
+C fe Application Specific Interface
+ 01 Device Firmware Update
+ 02 IRDA Bridge
+ 03 Test and Measurement
+ 01 TMC
+ 02 USB488
+C ff Vendor Specific Class
+ ff Vendor Specific Subclass
+ ff Vendor Specific Protocol
+
+# List of Audio Class Terminal Types
+
+# Syntax:
+# AT terminal_type terminal_type_name
+
+AT 0100 USB Undefined
+AT 0101 USB Streaming
+AT 01ff USB Vendor Specific
+AT 0200 Input Undefined
+AT 0201 Microphone
+AT 0202 Desktop Microphone
+AT 0203 Personal Microphone
+AT 0204 Omni-directional Microphone
+AT 0205 Microphone Array
+AT 0206 Processing Microphone Array
+AT 0300 Output Undefined
+AT 0301 Speaker
+AT 0302 Headphones
+AT 0303 Head Mounted Display Audio
+AT 0304 Desktop Speaker
+AT 0305 Room Speaker
+AT 0306 Communication Speaker
+AT 0307 Low Frequency Effects Speaker
+AT 0400 Bidirectional Undefined
+AT 0401 Handset
+AT 0402 Headset
+AT 0403 Speakerphone, no echo reduction
+AT 0404 Echo-suppressing speakerphone
+AT 0405 Echo-canceling speakerphone
+AT 0500 Telephony Undefined
+AT 0501 Phone line
+AT 0502 Telephone
+AT 0503 Down Line Phone
+AT 0600 External Undefined
+AT 0601 Analog Connector
+AT 0602 Digital Audio Interface
+AT 0603 Line Connector
+AT 0604 Legacy Audio Connector
+AT 0605 SPDIF interface
+AT 0606 1394 DA stream
+AT 0607 1394 DV stream soundtrack
+AT 0700 Embedded Undefined
+AT 0701 Level Calibration Noise Source
+AT 0702 Equalization Noise
+AT 0703 CD Player
+AT 0704 DAT
+AT 0705 DCC
+AT 0706 MiniDisc
+AT 0707 Analog Tape
+AT 0708 Phonograph
+AT 0709 VCR Audio
+AT 070a Video Disc Audio
+AT 070b DVD Audio
+AT 070c TV Tuner Audio
+AT 070d Satellite Receiver Audio
+AT 070e Cable Tuner Audio
+AT 070f DSS Audio
+AT 0710 Radio Receiver
+AT 0711 Radio Transmitter
+AT 0712 Multitrack Recorder
+AT 0713 Synthesizer
+
+# List of HID Descriptor Types
+
+# Syntax:
+# HID descriptor_type descriptor_type_name
+
+HID 21 HID
+HID 22 Report
+HID 23 Physical
+
+# List of HID Descriptor Item Types
+# Note: 2 bits LSB encode data length following
+
+# Syntax:
+# R item_type item_type_name
+
+# Main Items
+R 80 Input
+R 90 Output
+R b0 Feature
+R a0 Collection
+R c0 End Collection
+
+# Global Items
+R 04 Usage Page
+R 14 Logical Minimum
+R 24 Logical Maximum
+R 34 Physical Minimum
+R 44 Physical Maximum
+R 54 Unit Exponent
+R 64 Unit
+R 74 Report Size
+R 84 Report ID
+R 94 Report Count
+R a4 Push
+R b4 Pop
+
+# Local Items
+R 08 Usage
+R 18 Usage Minimum
+R 28 Usage Maximum
+R 38 Designator Index
+R 48 Designator Minimum
+R 58 Designator Maximum
+R 78 String Index
+R 88 String Minimum
+R 98 String Maximum
+R a8 Delimiter
+
+# List of Physical Descriptor Bias Types
+
+# Syntax:
+# BIAS item_type item_type_name
+
+BIAS 0 Not Applicable
+BIAS 1 Right Hand
+BIAS 2 Left Hand
+BIAS 3 Both Hands
+BIAS 4 Either Hand
+
+# List of Physical Descriptor Item Types
+
+# Syntax:
+# PHY item_type item_type_name
+
+PHY 00 None
+PHY 01 Hand
+PHY 02 Eyeball
+PHY 03 Eyebrow
+PHY 04 Eyelid
+PHY 05 Ear
+PHY 06 Nose
+PHY 07 Mouth
+PHY 08 Upper Lip
+PHY 09 Lower Lip
+PHY 0a Jaw
+PHY 0b Neck
+PHY 0c Upper Arm
+PHY 0d Elbow
+PHY 0e Forearm
+PHY 0f Wrist
+PHY 10 Palm
+PHY 11 Thumb
+PHY 12 Index Finger
+PHY 13 Middle Finger
+PHY 14 Ring Finger
+PHY 15 Little Finger
+PHY 16 Head
+PHY 17 Shoulder
+PHY 18 Hip
+PHY 19 Waist
+PHY 1a Thigh
+PHY 1b Knee
+PHY 1c calf
+PHY 1d Ankle
+PHY 1e Foot
+PHY 1f Heel
+PHY 20 Ball of Foot
+PHY 21 Big Toe
+PHY 22 Second Toe
+PHY 23 Third Toe
+PHY 24 Fourth Toe
+PHY 25 Fifth Toe
+PHY 26 Brow
+PHY 27 Cheek
+
+# List of HID Usages
+
+# Syntax:
+# HUT hi _usage_page hid_usage_page_name
+# hid_usage hid_usage_name
+
+HUT 00 Undefined
+HUT 01 Generic Desktop Controls
+ 000 Undefined
+ 001 Pointer
+ 002 Mouse
+ 004 Joystick
+ 005 Gamepad
+ 006 Keyboard
+ 007 Keypad
+ 008 Multi-Axis Controller
+ 030 Direction-X
+ 031 Direction-Y
+ 032 Direction-Z
+ 033 Rotate-X
+ 034 Rotate-Y
+ 035 Rotate-Z
+ 036 Slider
+ 037 Dial
+ 038 Wheel
+ 039 Hat Switch
+ 03a Counted Buffer
+ 03b Byte Count
+ 03c Motion Wakeup
+ 03d Start
+ 03e Select
+ 040 Vector-X
+ 041 Vector-Y
+ 042 Vector-Z
+ 043 Vector-X relative Body
+ 044 Vector-Y relative Body
+ 045 Vector-Z relative Body
+ 046 Vector
+ 080 System Control
+ 081 System Power Down
+ 082 System Sleep
+ 083 System Wake Up
+ 084 System Context Menu
+ 085 System Main Menu
+ 086 System App Menu
+ 087 System Menu Help
+ 088 System Menu Exit
+ 089 System Menu Select
+ 08a System Menu Right
+ 08b System Menu Left
+ 08c System Menu Up
+ 08d System Menu Down
+ 090 Direction Pad Up
+ 091 Direction Pad Down
+ 092 Direction Pad Right
+ 093 Direction Pad Left
+HUT 02 Simulation Controls
+ 000 Undefined
+ 001 Flight Simulation Device
+ 002 Automobile Simulation Device
+ 003 Tank Simulation Device
+ 004 Spaceship Simulation Device
+ 005 Submarine Simulation Device
+ 006 Sailing Simulation Device
+ 007 Motorcycle Simulation Device
+ 008 Sports Simulation Device
+ 009 Airplane Simualtion Device
+ 00a Helicopter Simulation Device
+ 00b Magic Carpet Simulation Device
+ 00c Bicycle Simulation Device
+ 020 Flight Control Stick
+ 021 Flight Stick
+ 022 Cyclic Control
+ 023 Cyclic Trim
+ 024 Flight Yoke
+ 025 Track Control
+ 0b0 Aileron
+ 0b1 Aileron Trim
+ 0b2 Anti-Torque Control
+ 0b3 Autopilot Enable
+ 0b4 Chaff Release
+ 0b5 Collective Control
+ 0b6 Dive Break
+ 0b7 Electronic Countermeasures
+ 0b8 Elevator
+ 0b9 Elevator Trim
+ 0ba Rudder
+ 0bb Throttle
+ 0bc Flight COmmunications
+ 0bd Flare Release
+ 0be Landing Gear
+ 0bf Toe Break
+ 0c0 Trigger
+ 0c1 Weapon Arm
+ 0c2 Weapons Select
+ 0c3 Wing Flaps
+ 0c4 Accelerator
+ 0c5 Brake
+ 0c6 Clutch
+ 0c7 Shifter
+ 0c8 Steering
+ 0c9 Turret Direction
+ 0ca Barrel Elevation
+ 0cb Drive Plane
+ 0cc Ballast
+ 0cd Bicylce Crank
+ 0ce Handle Bars
+ 0cf Front Brake
+ 0d0 Rear Brake
+HUT 03 VR Controls
+ 000 Unidentified
+ 001 Belt
+ 002 Body Suit
+ 003 Flexor
+ 004 Glove
+ 005 Head Tracker
+ 006 Head Mounted Display
+ 007 Hand Tracker
+ 008 Oculometer
+ 009 Vest
+ 00a Animatronic Device
+ 020 Stereo Enable
+ 021 Display Enable
+HUT 04 Sport Controls
+ 000 Unidentified
+ 001 Baseball Bat
+ 002 Golf Club
+ 003 Rowing Machine
+ 004 Treadmill
+ 030 Oar
+ 031 Slope
+ 032 Rate
+ 033 Stick Speed
+ 034 Stick Face Angle
+ 035 Stick Heel/Toe
+ 036 Stick Follow Through
+ 047 Stick Temp
+ 038 Stick Type
+ 039 Stick Height
+ 050 Putter
+ 051 1 Iron
+ 052 2 Iron
+ 053 3 Iron
+ 054 4 Iron
+ 055 5 Iron
+ 056 6 Iron
+ 057 7 Iron
+ 058 8 Iron
+ 059 9 Iron
+ 05a 10 Iron
+ 05b 11 Iron
+ 05c Sand Wedge
+ 05d Loft Wedge
+ 05e Power Wedge
+ 05f 1 Wood
+ 060 3 Wood
+ 061 5 Wood
+ 062 7 Wood
+ 063 9 Wood
+HUT 05 Game Controls
+ 000 Undefined
+ 001 3D Game Controller
+ 002 Pinball Device
+ 003 Gun Device
+ 020 Point Of View
+ 021 Turn Right/Left
+ 022 Pitch Right/Left
+ 023 Roll Forward/Backward
+ 024 Move Right/Left
+ 025 Move Forward/Backward
+ 026 Move Up/Down
+ 027 Lean Right/Left
+ 028 Lean Forward/Backward
+ 029 Height of POV
+ 02a Flipper
+ 02b Secondary Flipper
+ 02c Bump
+ 02d New Game
+ 02e Shoot Ball
+ 02f Player
+ 030 Gun Bolt
+ 031 Gun Clip
+ 032 Gun Selector
+ 033 Gun Single Shot
+ 034 Gun Burst
+ 035 Gun Automatic
+ 036 Gun Safety
+ 037 Gamepad Fire/Jump
+ 038 Gamepad Fun
+ 039 Gamepad Trigger
+HUT 07 Keyboard
+ 000 No Event
+ 001 Keyboard ErrorRollOver
+ 002 Keyboard POSTfail
+ 003 Keyboard Error Undefined
+ 004 A
+ 005 B
+ 006 C
+ 007 D
+ 008 E
+ 009 F
+ 00a G
+ 00b H
+ 00c I
+ 00d J
+ 00e K
+ 00f L
+ 010 M
+ 011 N
+ 012 O
+ 013 P
+ 014 Q
+ 015 R
+ 016 S
+ 017 T
+ 018 U
+ 019 V
+ 01a W
+ 01b X
+ 01c Y
+ 01d Z
+ 01e 1 and ! (One and Exclamation)
+ 01f 2 and @ (2 and at)
+ 020 3 and # (3 and Hash)
+ 021 4 and $ (4 and Dollar Sign)
+ 022 5 and % (5 and Percent Sign)
+ 023 6 and ^ (6 and circumflex)
+ 024 7 and & (Seven and Ampersand)
+ 025 8 and * (Eight and asterisk)
+ 026 9 and ( (Nine and Parenthesis Left)
+ 027 0 and ) (Zero and Parenthesis Right)
+ 028 Return (Enter)
+ 029 Escape
+ 02a Delete (Backspace)
+ 02b Tab
+ 02c Space Bar
+ 02d - and _ (Minus and underscore)
+ 02e = and + (Equal and Plus)
+ 02f [ and { (Bracket and Braces Left)
+ 030 ] and } (Bracket and Braces Right)
+ 031 \ and | (Backslash and Bar)
+ 032 # and ~ (Hash and Tilde, Non-US Keyboard near right shift)
+ 033 ; and : (Semicolon and Colon)
+ 034 and " (Accent Acute and Double Quotes)
+ 035 ` and ~ (Accent Grace and Tilde)
+ 036 , and < (Comma and Less)
+ 037 . and > (Period and Greater)
+ 038 / and ? (Slash and Question Mark)
+ 039 Caps Lock
+ 03a F1
+ 03b F2
+ 03c F3
+ 03d F4
+ 03e F5
+ 03f F6
+ 040 F7
+ 041 F8
+ 042 F9
+ 043 F10
+ 044 F11
+ 045 F12
+ 046 Print Screen
+ 047 Scroll Lock
+ 048 Pause
+ 049 Insert
+ 04a Home
+ 04b Page Up
+ 04c Delete Forward (without Changing Position)
+ 04d End
+ 04e Page Down
+ 04f Right Arrow
+ 050 Left Arrow
+ 051 Down Arrow
+ 052 Up Arrow
+ 053 Num Lock and Clear
+ 054 Keypad / (Division Sign)
+ 055 Keypad * (Multiplication Sign)
+ 056 Keypad - (Subtraction Sign)
+ 057 Keypad + (Addition Sign)
+ 058 Keypad Enter
+ 059 Keypad 1 and END
+ 05a Keypad 2 and Down Arrow
+ 05b Keypad 3 and Page Down
+ 05c Keypad 4 and Left Arrow
+ 05d Keypad 5 (Tactilei Raised)
+ 05f Keypad 6 and Right Arrow
+ 060 Keypad 7 and Home
+ 061 Keypad 8 and Up Arrow
+ 062 Keypad 8 and Page Up
+ 063 Keypad . (decimal delimiter) and Delete
+ 064 \ and | (Backslash and Bar, UK and Non-US Keyboard near left shift)
+ 065 Keyboard Application (Windows Key for Win95 or Compose)
+ 066 Power (not a key)
+ 067 Keypad = (Equal Sign)
+ 068 F13
+ 069 F14
+ 06a F15
+ 06b F16
+ 06c F17
+ 06d F18
+ 06e F19
+ 06f F20
+ 070 F21
+ 071 F22
+ 072 F23
+ 073 F24
+ 074 Execute
+ 075 Help
+ 076 Menu
+ 077 Select
+ 078 Stop
+ 079 Again
+ 07a Undo
+ 07b Cut
+ 07c Copy
+ 07d Paste
+ 07e Find
+ 07f Mute
+ 080 Volume Up
+ 081 Volume Down
+ 082 Locking Caps Lock
+ 083 Locking Num Lock
+ 084 Locking Scroll Lock
+ 085 Keypad Comma
+ 086 Keypad Equal Sign (AS/400)
+ 087 International 1 (PC98)
+ 088 International 2 (PC98)
+ 089 International 3 (PC98)
+ 08a International 4 (PC98)
+ 08b International 5 (PC98)
+ 08c International 6 (PC98)
+ 08d International 7 (Toggle Single/Double Byte Mode)
+ 08e International 8
+ 08f International 9
+ 090 LANG 1 (Hangul/English Toggle, Korea)
+ 091 LANG 2 (Hanja Conversion, Korea)
+ 092 LANG 3 (Katakana, Japan)
+ 093 LANG 4 (Hiragana, Japan)
+ 094 LANG 5 (Zenkaku/Hankaku, Japan)
+ 095 LANG 6
+ 096 LANG 7
+ 097 LANG 8
+ 098 LANG 9
+ 099 Alternate Erase
+ 09a SysReq/Attention
+ 09b Cancel
+ 09c Clear
+ 09d Prior
+ 09e Return
+ 09f Separator
+ 0a0 Out
+ 0a1 Open
+ 0a2 Clear/Again
+ 0a3 CrSel/Props
+ 0a4 ExSel
+ 0e0 Control Left
+ 0e1 Shift Left
+ 0e2 Alt Left
+ 0e3 GUI Left
+ 0e4 Control Right
+ 0e5 Shift Right
+ 0e6 Alt Rigth
+ 0e7 GUI Right
+HUT 08 LEDs
+ 000 Undefined
+ 001 NumLock
+ 002 CapsLock
+ 003 Scroll Lock
+ 004 Compose
+ 005 Kana
+ 006 Power
+ 007 Shift
+ 008 Do not disturb
+ 009 Mute
+ 00a Tone Enabke
+ 00b High Cut Filter
+ 00c Low Cut Filter
+ 00d Equalizer Enable
+ 00e Sound Field ON
+ 00f Surround On
+ 010 Repeat
+ 011 Stereo
+ 012 Sampling Rate Detect
+ 013 Spinning
+ 014 CAV
+ 015 CLV
+ 016 Recording Format Detect
+ 017 Off-Hook
+ 018 Ring
+ 019 Message Waiting
+ 01a Data Mode
+ 01b Battery Operation
+ 01c Battery OK
+ 01d Battery Low
+ 01e Speaker
+ 01f Head Set
+ 020 Hold
+ 021 Microphone
+ 022 Coverage
+ 023 Night Mode
+ 024 Send Calls
+ 025 Call Pickup
+ 026 Conference
+ 027 Stand-by
+ 028 Camera On
+ 029 Camera Off
+ 02a On-Line
+ 02b Off-Line
+ 02c Busy
+ 02d Ready
+ 02e Paper-Out
+ 02f Paper-Jam
+ 030 Remote
+ 031 Forward
+ 032 Reverse
+ 033 Stop
+ 034 Rewind
+ 035 Fast Forward
+ 036 Play
+ 037 Pause
+ 038 Record
+ 039 Error
+ 03a Usage Selected Indicator
+ 03b Usage In Use Indicator
+ 03c Usage Multi Indicator
+ 03d Indicator On
+ 03e Indicator Flash
+ 03f Indicator Slow Blink
+ 040 Indicator Fast Blink
+ 041 Indicator Off
+ 042 Flash On Time
+ 043 Slow Blink On Time
+ 044 Slow Blink Off Time
+ 045 Fast Blink On Time
+ 046 Fast Blink Off Time
+ 047 Usage Color Indicator
+ 048 Indicator Red
+ 049 Indicator Green
+ 04a Indicator Amber
+ 04b Generic Indicator
+ 04c System Suspend
+ 04d External Power Connected
+HUT 09 Buttons
+ 000 No Button Pressed
+ 001 Button 1 (Primary)
+ 002 Button 2 (Secondary)
+ 003 Button 3 (Tertiary)
+ 004 Button 4
+ 005 Button 5
+HUT 0a Ordinal
+ 001 Instance 1
+ 002 Instance 2
+ 003 Instance 3
+HUT 0b Telephony
+ 000 Unassigned
+ 001 Phone
+ 002 Answering Machine
+ 003 Message Controls
+ 004 Handset
+ 005 Headset
+ 006 Telephony Key Pad
+ 007 Programmable Button
+ 020 Hook Switch
+ 021 Flash
+ 022 Feature
+ 023 Hold
+ 024 Redial
+ 025 Transfer
+ 026 Drop
+ 027 Park
+ 028 Forward Calls
+ 029 Alternate Function
+ 02a Line
+ 02b Speaker Phone
+ 02c Conference
+ 02d Ring Enable
+ 02e Ring Select
+ 02f Phone Mute
+ 030 Caller ID
+ 050 Speed Dial
+ 051 Store Number
+ 052 Recall Number
+ 053 Phone Directory
+ 070 Voice Mail
+ 071 Screen Calls
+ 072 Do Not Disturb
+ 073 Message
+ 074 Answer On/Offf
+ 090 Inside Dial Tone
+ 091 Outside Dial Tone
+ 092 Inside Ring Tone
+ 093 Outside Ring Tone
+ 094 Priority Ring Tone
+ 095 Inside Ringback
+ 096 Priority Ringback
+ 097 Line Busy Tone
+ 098 Recorder Tone
+ 099 Call Waiting Tone
+ 09a Confirmation Tone 1
+ 09b Confirmation Tone 2
+ 09c Tones Off
+ 09d Outside Ringback
+ 0b0 Key 1
+ 0b1 Key 2
+ 0b3 Key 3
+ 0b4 Key 4
+ 0b5 Key 5
+ 0b6 Key 6
+ 0b7 Key 7
+ 0b8 Key 8
+ 0b9 Key 9
+ 0ba Key Star
+ 0bb Key Pound
+ 0bc Key A
+ 0bd Key B
+ 0be Key C
+ 0bf Key D
+HUT 0c Consumer
+ 000 Unassigned
+ 001 Consumer Control
+ 002 Numeric Key Pad
+ 003 Programmable Buttons
+ 020 +10
+ 021 +100
+ 022 AM/PM
+ 030 Power
+ 031 Reset
+ 032 Sleep
+ 033 Sleep After
+ 034 Sleep Mode
+ 035 Illumination
+ 036 Function Buttons
+ 040 Menu
+ 041 Menu Pick
+ 042 Menu Up
+ 043 Menu Down
+ 044 Menu Left
+ 045 Menu Right
+ 046 Menu Escape
+ 047 Menu Value Increase
+ 048 Menu Value Decrease
+ 060 Data on Screen
+ 061 Closed Caption
+ 062 Closed Caption Select
+ 063 VCR/TV
+ 064 Broadcast Mode
+ 065 Snapshot
+ 066 Still
+ 080 Selection
+ 081 Assign Selection
+ 082 Mode Step
+ 083 Recall Last
+ 084 Enter Channel
+ 085 Order Movie
+ 086 Channel
+ 087 Media Selection
+ 088 Media Select Computer
+ 089 Media Select TV
+ 08a Media Select WWW
+ 08b Media Select DVD
+ 08c Media Select Telephone
+ 08d Media Select Program Guide
+ 08e Media Select Video Phone
+ 08f Media Select Games
+ 090 Media Select Messages
+ 091 Media Select CD
+ 092 Media Select VCR
+ 093 Media Select Tuner
+ 094 Quit
+ 095 Help
+ 096 Media Select Tape
+ 097 Media Select Cable
+ 098 Media Select Satellite
+ 099 Media Select Security
+ 09a Media Select Home
+ 09b Media Select Call
+ 09c Channel Increment
+ 09d Channel Decrement
+ 09e Media Select SAP
+ 0a0 VCR Plus
+ 0a1 Once
+ 0a2 Daily
+ 0a3 Weekly
+ 0a4 Monthly
+ 0b0 Play
+ 0b1 Pause
+ 0b2 Record
+ 0b3 Fast Forward
+ 0b4 Rewind
+ 0b5 Scan Next Track
+ 0b6 Scan Previous Track
+ 0b7 Stop
+ 0b8 Eject
+ 0b9 Random Play
+ 0ba Select Disc
+ 0bb Enter Disc
+ 0bc Repeat
+ 0bd Tracking
+ 0be Track Normal
+ 0bf Slow Tracking
+ 0c0 Frame Forward
+ 0c1 Frame Back
+ 0c2 Mark
+ 0c3 Clear Mark
+ 0c4 Repeat from Mark
+ 0c5 Return to Mark
+ 0c6 Search Mark Forward
+ 0c7 Search Mark Backward
+ 0c8 Counter Reset
+ 0c9 Show Counter
+ 0ca Tracking Increment
+ 0cb Tracking Decrement
+ 0cc Stop/Eject
+ 0cd Play/Pause
+ 0ce Play/Skip
+ 0e0 Volume
+ 0e1 Balance
+ 0e2 Mute
+ 0e3 Bass
+ 0e4 Treble
+ 0e5 Bass Boost
+ 0e6 Surround Mode
+ 0e7 Loudness
+ 0e8 MPX
+ 0e9 Volume Increment
+ 0ea Volume Decrement
+ 0f0 Speed Select
+ 0f1 Playback Speed
+ 0f2 Standard Play
+ 0f3 Long Play
+ 0f4 Extended Play
+ 0f5 Slow
+ 100 Fan Enable
+ 101 Fan Speed
+ 102 Light Enable
+ 103 Light Illumination Level
+ 104 Climate Control Enable
+ 105 Room Temperature
+ 106 Security Enable
+ 107 Fire Alarm
+ 108 Police Alarm
+ 150 Balance Right
+ 151 Balance Left
+ 152 Bass Increment
+ 153 Bass Decrement
+ 154 Treble Increment
+ 155 Treble Decrement
+ 160 Speaker System
+ 161 Channel Left
+ 162 Channel Right
+ 163 Channel Center
+ 164 Channel Front
+ 165 Channel Center Front
+ 166 Channel Side
+ 167 Channel Surround
+ 168 Channel Low Frequency Enhancement
+ 169 Channel Top
+ 16a Channel Unknown
+ 170 Sub-Channel
+ 171 Sub-Channel Increment
+ 172 Sub-Channel Decrement
+ 173 Alternative Audio Increment
+ 174 Alternative Audio Decrement
+ 180 Application Launch Buttons
+ 181 AL Launch Button Configuration Tool
+ 182 AL Launch Button Configuration
+ 183 AL Consumer Control Configuration
+ 184 AL Word Processor
+ 185 AL Text Editor
+ 186 AL Spreadsheet
+ 187 AL Graphics Editor
+ 188 AL Presentation App
+ 189 AL Database App
+ 18a AL Email Reader
+ 18b AL Newsreader
+ 18c AL Voicemail
+ 18d AL Contacts/Address Book
+ 18e AL Calendar/Schedule
+ 18f AL Task/Project Manager
+ 190 AL Log/Jounal/Timecard
+ 191 AL Checkbook/Finance
+ 192 AL Calculator
+ 193 AL A/V Capture/Playback
+ 194 AL Local Machine Browser
+ 195 AL LAN/Wan Browser
+ 196 AL Internet Browser
+ 197 AL Remote Networking/ISP Connect
+ 198 AL Network Conference
+ 199 AL Network Chat
+ 19a AL Telephony/Dialer
+ 19b AL Logon
+ 19c AL Logoff
+ 19d AL Logon/Logoff
+ 19e AL Terminal Local/Screensaver
+ 19f AL Control Panel
+ 1a0 AL Command Line Processor/Run
+ 1a1 AL Process/Task Manager
+ 1a2 AL Select Task/Application
+ 1a3 AL Next Task/Application
+ 1a4 AL Previous Task/Application
+ 1a5 AL Preemptive Halt Task/Application
+ 200 Generic GUI Application Controls
+ 201 AC New
+ 202 AC Open
+ 203 AC CLose
+ 204 AC Exit
+ 205 AC Maximize
+ 206 AC Minimize
+ 207 AC Save
+ 208 AC Print
+ 209 AC Properties
+ 21a AC Undo
+ 21b AC Copy
+ 21c AC Cut
+ 21d AC Paste
+ 21e AC Select All
+ 21f AC Find
+ 220 AC Find and Replace
+ 221 AC Search
+ 222 AC Go To
+ 223 AC Home
+ 224 AC Back
+ 225 AC Forward
+ 226 AC Stop
+ 227 AC Refresh
+ 228 AC Previous Link
+ 229 AC Next Link
+ 22b AC History
+ 22c AC Subscriptions
+ 22d AC Zoom In
+ 22e AC Zoom Out
+ 22f AC Zoom
+ 230 AC Full Screen View
+ 231 AC Normal View
+ 232 AC View Toggle
+ 233 AC Scroll Up
+ 234 AC Scroll Down
+ 235 AC Scroll
+ 236 AC Pan Left
+ 237 AC Pan Right
+ 238 AC Pan
+ 239 AC New Window
+ 23a AC Tile Horizontally
+ 23b AC Tile Vertically
+ 23c AC Format
+HUT 0d Digitizer
+ 000 Undefined
+ 001 Digitizer
+ 002 Pen
+ 003 Light Pen
+ 004 Touch Screen
+ 005 Touch Pad
+ 006 White Board
+ 007 Coordinate Measuring Machine
+ 008 3D Digitizer
+ 009 Stereo Plotter
+ 00a Articulated Arm
+ 00b Armature
+ 00c Multiple Point Digitizer
+ 00d Free Space Wand
+ 020 Stylus
+ 021 Puck
+ 022 Finger
+ 030 Tip Pressure
+ 031 Barrel Pressure
+ 032 In Range
+ 033 Touch
+ 034 Untouch
+ 035 Tap
+ 036 Quality
+ 037 Data Valid
+ 038 Transducer Index
+ 039 Tablet Function Keys
+ 03a Program Change Keys
+ 03b Battery Strength
+ 03c Invert
+ 03d X Tilt
+ 03e Y Tilt
+ 03f Azimuth
+ 040 Altitude
+ 041 Twist
+ 042 Tip Switch
+ 043 Secondary Tip Switch
+ 044 Barrel Switch
+ 045 Eraser
+ 046 Tablet Pick
+HUT 0f PID Page
+ 000 Undefined
+ 001 Physical Interface Device
+ 020 Normal
+ 021 Set Effect Report
+ 022 Effect Block Index
+ 023 Parameter Block Offset
+ 024 ROM Flag
+ 025 Effect Type
+ 026 ET Constant Force
+ 027 ET Ramp
+ 028 ET Custom Force Data
+ 030 ET Square
+ 031 ET Sine
+ 032 ET Triangle
+ 033 ET Sawtooth Up
+ 034 ET Sawtooth Down
+ 040 ET Spring
+ 041 ET Damper
+ 042 ET Inertia
+ 043 ET Friction
+ 050 Duration
+ 051 Sample Period
+ 052 Gain
+ 053 Trigger Button
+ 054 Trigger Repeat Interval
+ 055 Axes Enable
+ 056 Direction Enable
+ 057 Direction
+ 058 Type Specific Block Offset
+ 059 Block Type
+ 05A Set Envelope Report
+ 05B Attack Level
+ 05C Attack Time
+ 05D Fade Level
+ 05E Fade Time
+ 05F Set Condition Report
+ 060 CP Offset
+ 061 Positive Coefficient
+ 062 Negative Coefficient
+ 063 Positive Saturation
+ 064 Negative Saturation
+ 065 Dead Band
+ 066 Download Force Sample
+ 067 Isoch Custom Force Enable
+ 068 Custom Force Data Report
+ 069 Custom Force Data
+ 06A Custom Force Vendor Defined Data
+ 06B Set Custom Force Report
+ 06C Custom Force Data Offset
+ 06D Sample Count
+ 06E Set Periodic Report
+ 06F Offset
+ 070 Magnitude
+ 071 Phase
+ 072 Period
+ 073 Set Constant Force Report
+ 074 Set Ramp Force Report
+ 075 Ramp Start
+ 076 Ramp End
+ 077 Effect Operation Report
+ 078 Effect Operation
+ 079 Op Effect Start
+ 07A Op Effect Start Solo
+ 07B Op Effect Stop
+ 07C Loop Count
+ 07D Device Gain Report
+ 07E Device Gain
+ 07F PID Pool Report
+ 080 RAM Pool Size
+ 081 ROM Pool Size
+ 082 ROM Effect Block Count
+ 083 Simultaneous Effects Max
+ 084 Pool Alignment
+ 085 PID Pool Move Report
+ 086 Move Source
+ 087 Move Destination
+ 088 Move Length
+ 089 PID Block Load Report
+ 08B Block Load Status
+ 08C Block Load Success
+ 08D Block Load Full
+ 08E Block Load Error
+ 08F Block Handle
+ 090 PID Block Free Report
+ 091 Type Specific Block Handle
+ 092 PID State Report
+ 094 Effect Playing
+ 095 PID Device Control Report
+ 096 PID Device Control
+ 097 DC Enable Actuators
+ 098 DC Disable Actuators
+ 099 DC Stop All Effects
+ 09A DC Device Reset
+ 09B DC Device Pause
+ 09C DC Device Continue
+ 09F Device Paused
+ 0A0 Actuators Enabled
+ 0A4 Safety Switch
+ 0A5 Actuator Override Switch
+ 0A6 Actuator Power
+ 0A7 Start Delay
+ 0A8 Parameter Block Size
+ 0A9 Device Managed Pool
+ 0AA Shared Parameter Blocks
+ 0AB Create New Effect Report
+ 0AC RAM Pool Available
+HUT 10 Unicode
+HUT 14 Alphanumeric Display
+ 000 Undefined
+ 001 Alphanumeric Display
+ 020 Display Attributes Report
+ 021 ASCII Character Set
+ 022 Data Read Back
+ 023 Font Read Back
+ 024 Display Control Report
+ 025 Clear Display
+ 026 Display Enable
+ 027 Screen Saver Delay
+ 028 Screen Saver Enable
+ 029 Vertical Scroll
+ 02a Horizontal Scroll
+ 02b Character Report
+ 02c Display Data
+ 02d Display Status
+ 02e Stat Not Ready
+ 02f Stat Ready
+ 030 Err Not a loadable Character
+ 031 Err Font Data Cannot Be Read
+ 032 Cursur Position Report
+ 033 Row
+ 034 Column
+ 035 Rows
+ 036 Columns
+ 037 Cursor Pixel Positioning
+ 038 Cursor Mode
+ 039 Cursor Enable
+ 03a Cursor Blink
+ 03b Font Report
+ 03c Font Data
+ 03d Character Width
+ 03e Character Height
+ 03f Character Spacing Horizontal
+ 040 Character Spacing Vertical
+ 041 Unicode Character Set
+HUT 80 USB Monitor
+ 001 Monitor Control
+ 002 EDID Information
+ 003 VDIF Information
+ 004 VESA Version
+HUT 81 USB Monitor Enumerated Values
+HUT 82 Monitor VESA Virtual Controls
+ 001 Degauss
+ 010 Brightness
+ 012 Contrast
+ 016 Red Video Gain
+ 018 Green Video Gain
+ 01a Blue Video Gain
+ 01c Focus
+ 020 Horizontal Position
+ 022 Horizontal Size
+ 024 Horizontal Pincushion
+ 026 Horizontal Pincushion Balance
+ 028 Horizontal Misconvergence
+ 02a Horizontal Linearity
+ 02c Horizontal Linearity Balance
+ 030 Vertical Position
+ 032 Vertical Size
+ 034 Vertical Pincushion
+ 036 Vertical Pincushion Balance
+ 038 Vertical Misconvergence
+ 03a Vertical Linearity
+ 03c Vertical Linearity Balance
+ 040 Parallelogram Balance (Key Distortion)
+ 042 Trapezoidal Distortion (Key)
+ 044 Tilt (Rotation)
+ 046 Top Corner Distortion Control
+ 048 Top Corner Distortion Balance
+ 04a Bottom Corner Distortion Control
+ 04c Bottom Corner Distortion Balance
+ 056 Horizontal Moire
+ 058 Vertical Moire
+ 05e Input Level Select
+ 060 Input Source Select
+ 06c Red Video Black Level
+ 06e Green Video Black Level
+ 070 Blue Video Black Level
+ 0a2 Auto Size Center
+ 0a4 Polarity Horizontal Sychronization
+ 0a6 Polarity Vertical Synchronization
+ 0aa Screen Orientation
+ 0ac Horizontal Frequency in Hz
+ 0ae Vertical Frequency in 0.1 Hz
+ 0b0 Settings
+ 0ca On Screen Display (OSD)
+ 0d4 Stereo Mode
+HUT 84 Power Device Page
+ 000 Undefined
+ 001 iName
+ 002 Present Status
+ 003 Changed Status
+ 004 UPS
+ 005 Power Supply
+ 010 Battery System
+ 011 Battery System ID
+ 012 Battery
+ 013 Battery ID
+ 014 Charger
+ 015 Charger ID
+ 016 Power Converter
+ 017 Power Converter ID
+ 018 Outlet System
+ 019 Outlet System ID
+ 01a Input
+ 01b Input ID
+ 01c Output
+ 01d Output ID
+ 01e Flow
+ 01f Flow ID
+ 020 Outlet
+ 021 Outlet ID
+ 022 Gang
+ 023 Gang ID
+ 024 Power Summary
+ 025 Power Summary ID
+ 030 Voltage
+ 031 Current
+ 032 Frequency
+ 033 Apparent Power
+ 034 Active Power
+ 035 Percent Load
+ 036 Temperature
+ 037 Humidity
+ 038 Bad Count
+ 040 Config Voltage
+ 041 Config Current
+ 042 Config Frequency
+ 043 Config Apparent Power
+ 044 Config Active Power
+ 045 Config Percent Load
+ 046 Config Temperature
+ 047 Config Humidity
+ 050 Switch On Control
+ 051 Switch Off Control
+ 052 Toggle Control
+ 053 Low Voltage Transfer
+ 054 High Voltage Transfer
+ 055 Delay Before Reboot
+ 056 Delay Before Startup
+ 057 Delay Before Shutdown
+ 058 Test
+ 059 Module Reset
+ 05a Audible Alarm Control
+ 060 Present
+ 061 Good
+ 062 Internal Failure
+ 063 Voltage out of range
+ 064 Frequency out of range
+ 065 Overload
+ 066 Over Charged
+ 067 Over Temperature
+ 068 Shutdown Requested
+ 069 Shutdown Imminent
+ 06a Reserved
+ 06b Switch On/Off
+ 06c Switchable
+ 06d Used
+ 06e Boost
+ 06f Buck
+ 070 Initialized
+ 071 Tested
+ 072 Awaiting Power
+ 073 Communication Lost
+ 0fd iManufacturer
+ 0fe iProduct
+ 0ff iSerialNumber
+HUT 85 Battery System Page
+ 000 Undefined
+ 001 SMB Battery Mode
+ 002 SMB Battery Status
+ 003 SMB Alarm Warning
+ 004 SMB Charger Mode
+ 005 SMB Charger Status
+ 006 SMB Charger Spec Info
+ 007 SMB Selector State
+ 008 SMB Selector Presets
+ 009 SMB Selector Info
+ 010 Optional Mfg. Function 1
+ 011 Optional Mfg. Function 2
+ 012 Optional Mfg. Function 3
+ 013 Optional Mfg. Function 4
+ 014 Optional Mfg. Function 5
+ 015 Connection to SMBus
+ 016 Output Connection
+ 017 Charger Connection
+ 018 Battery Insertion
+ 019 Use Next
+ 01a OK to use
+ 01b Battery Supported
+ 01c SelectorRevision
+ 01d Charging Indicator
+ 028 Manufacturer Access
+ 029 Remaining Capacity Limit
+ 02a Remaining Time Limit
+ 02b At Rate
+ 02c Capacity Mode
+ 02d Broadcast To Charger
+ 02e Primary Battery
+ 02f Charge Controller
+ 040 Terminate Charge
+ 041 Terminate Discharge
+ 042 Below Remaining Capacity Limit
+ 043 Remaining Time Limit Expired
+ 044 Charging
+ 045 Discharging
+ 046 Fully Charged
+ 047 Fully Discharged
+ 048 Conditioning Flag
+ 049 At Rate OK
+ 04a SMB Error Code
+ 04b Need Replacement
+ 060 At Rate Time To Full
+ 061 At Rate Time To Empty
+ 062 Average Current
+ 063 Max Error
+ 064 Relative State Of Charge
+ 065 Absolute State Of Charge
+ 066 Remaining Capacity
+ 067 Full Charge Capacity
+ 068 Run Time To Empty
+ 069 Average Time To Empty
+ 06a Average Time To Full
+ 06b Cycle Count
+ 080 Batt. Pack Model Level
+ 081 Internal Charge Controller
+ 082 Primary Battery Support
+ 083 Design Capacity
+ 084 Specification Info
+ 085 Manufacturer Date
+ 086 Serial Number
+ 087 iManufacturerName
+ 088 iDeviceName
+ 089 iDeviceChemistry
+ 08a Manufacturer Data
+ 08b Rechargeable
+ 08c Warning Capacity Limit
+ 08d Capacity Granularity 1
+ 08e Capacity Granularity 2
+ 08f iOEMInformation
+ 0c0 Inhibit Charge
+ 0c1 Enable Polling
+ 0c2 Reset To Zero
+ 0d0 AC Present
+ 0d1 Battery Present
+ 0d2 Power Fail
+ 0d3 Alarm Inhibited
+ 0d4 Thermistor Under Range
+ 0d5 Thermistor Hot
+ 0d6 Thermistor Cold
+ 0d7 Thermistor Over Range
+ 0d8 Voltage Out Of Range
+ 0d9 Current Out Of Range
+ 0da Current Not Regulated
+ 0db Voltage Not Regulated
+ 0dc Master Mode
+ 0f0 Charger Selector Support
+ 0f1 Charger Spec
+ 0f2 Level 2
+ 0f3 Level 3
+HUT 86 Power Pages
+HUT 87 Power Pages
+HUT 8c Bar Code Scanner Page (POS)
+HUT 8d Scale Page (POS)
+HUT 90 Camera Control Page
+HUT 91 Arcade Control Page
+HUT f0 Cash Device
+ 0f1 Cash Drawer
+ 0f2 Cash Drawer Number
+ 0f3 Cash Drawer Set
+ 0f4 Cash Drawer Status
+HUT ff Vendor Specific
+
+# List of Languages
+
+# Syntax:
+# L language_id language_name
+# dialect_id dialect_name
+
+L 0001 Arabic
+ 01 Saudi Arabia
+ 02 Iraq
+ 03 Egypt
+ 04 Libya
+ 05 Algeria
+ 06 Morocco
+ 07 Tunesia
+ 08 Oman
+ 09 Yemen
+ 0a Syria
+ 0b Jordan
+ 0c Lebanon
+ 0d Kuwait
+ 0e U.A.E
+ 0f Bahrain
+ 10 Qatar
+L 0002 Bulgarian
+L 0003 Catalan
+L 0004 Chinese
+ 01 Traditional
+ 02 Simplified
+ 03 Hongkong SAR, PRC
+ 04 Singapore
+ 05 Macau SAR
+L 0005 Czech
+L 0006 Danish
+L 0007 German
+ 01 German
+ 02 Swiss
+ 03 Austrian
+ 04 Luxembourg
+ 05 Liechtenstein
+L 0008 Greek
+L 0009 English
+ 01 US
+ 02 UK
+ 03 Australian
+ 04 Canadian
+ 05 New Zealand
+ 06 Ireland
+ 07 South Africa
+ 08 Jamaica
+ 09 Carribean
+ 0a Belize
+ 0b Trinidad
+ 0c Zimbabwe
+ 0d Philippines
+L 000a Spanish
+ 01 Castilian
+ 02 Mexican
+ 03 Modern
+ 04 Guatemala
+ 05 Costa Rica
+ 06 Panama
+ 07 Dominican Republic
+ 08 Venzuela
+ 09 Colombia
+ 0a Peru
+ 0b Argentina
+ 0c Ecuador
+ 0d Chile
+ 0e Uruguay
+ 0f Paraguay
+ 10 Bolivia
+ 11 El Salvador
+ 12 Honduras
+ 13 Nicaragua
+ 14 Puerto Rico
+L 000b Finnish
+L 000c French
+ 01 French
+ 02 Belgian
+ 03 Canadian
+ 04 Swiss
+ 05 Luxembourg
+ 06 Monaco
+L 000d Hebrew
+L 000e Hungarian
+L 000f Idelandic
+L 0010 Italian
+ 01 Italian
+ 02 Swiss
+L 0011 Japanese
+L 0012 Korean
+ 01 Korean
+L 0013 Dutch
+ 01 Dutch
+ 02 Belgian
+L 0014 Norwegian
+ 01 Bokmal
+ 02 Nynorsk
+L 0015 Polish
+L 0016 Portuguese
+ 01 Portuguese
+ 02 Brazilian
+L 0017 forgotten
+L 0018 Romanian
+L 0019 Russian
+L 001a Serbian
+ 01 Croatian
+ 02 Latin
+ 03 Cyrillic
+L 001b Slovak
+L 001c Albanian
+L 001d Swedish
+ 01 Swedish
+ 02 Finland
+L 001e Thai
+L 001f Turkish
+L 0020 Urdu
+ 01 Pakistan
+ 02 India
+L 0021 Indonesian
+L 0022 Ukrainian
+L 0023 Belarusian
+L 0024 Slovenian
+L 0025 Estonian
+L 0026 Latvian
+L 0027 Lithuanian
+ 01 Lithuanian
+L 0028 forgotten
+L 0029 Farsi
+L 002a Vietnamese
+L 002b Armenian
+L 002c Azeri
+ 01 Cyrillic
+ 02 Latin
+L 002d Basque
+L 002e forgotten
+L 002f Macedonian
+L 0036 Afrikaans
+L 0037 Georgian
+L 0038 Faeroese
+L 0039 Hindi
+L 003e Malay
+ 01 Malaysia
+ 02 Brunei Darassalam
+L 003f Kazak
+L 0041 Awahili
+L 0043 Uzbek
+ 01 Latin
+ 02 Cyrillic
+L 0044 Tatar
+L 0045 Bengali
+L 0046 Punjabi
+L 0047 Gujarati
+L 0048 Oriya
+L 0049 Tamil
+L 004a Telugu
+L 004b Kannada
+L 004c Malayalam
+L 004d Assamese
+L 004e Marathi
+L 004f Sanskrit
+L 0057 Konkani
+L 0058 Manipuri
+L 0059 Sindhi
+L 0060 Kashmiri
+ 02 India
+L 0061 Nepali
+ 02 India
+
+# HID Descriptor bCountryCode
+# HID Specification 1.11 (2001-06-27) page 23
+#
+# Syntax:
+# HCC country_code keymap_type
+
+HCC 00 Not supported
+HCC 01 Arabic
+HCC 02 Belgian
+HCC 03 Canadian-Bilingual
+HCC 04 Canadian-French
+HCC 05 Czech Republic
+HCC 06 Danish
+HCC 07 Finnish
+HCC 08 French
+HCC 09 German
+HCC 10 Greek
+HCC 11 Hebrew
+HCC 12 Hungary
+HCC 13 International (ISO)
+HCC 14 Italian
+HCC 15 Japan (Katakana)
+HCC 16 Korean
+HCC 17 Latin American
+HCC 18 Netherlands/Dutch
+HCC 19 Norwegian
+HCC 20 Persian (Farsi)
+HCC 21 Poland
+HCC 22 Portuguese
+HCC 23 Russia
+HCC 24 Slovakia
+HCC 25 Spanish
+HCC 26 Swedish
+HCC 27 Swiss/French
+HCC 28 Swiss/German
+HCC 29 Switzerland
+HCC 30 Taiwan
+HCC 31 Turkish-Q
+HCC 32 UK
+HCC 33 US
+HCC 34 Yugoslavia
+HCC 35 Turkish-F
+
+# List of Video Class Terminal Types
+
+# Syntax:
+# VT terminal_type terminal_type_name
+
+VT 0100 USB Vendor Specific
+VT 0101 USB Streaming
+VT 0200 Input Vendor Specific
+VT 0201 Camera Sensor
+VT 0202 Sequential Media
+VT 0300 Output Vendor Specific
+VT 0301 Generic Display
+VT 0302 Sequential Media
+VT 0400 External Vendor Specific
+VT 0401 Composite Video
+VT 0402 S-Video
+VT 0403 Component Video
+
diff --git a/kcontrol/usbview/usbdb.cpp b/kcontrol/usbview/usbdb.cpp
new file mode 100644
index 000000000..89cf973ba
--- /dev/null
+++ b/kcontrol/usbview/usbdb.cpp
@@ -0,0 +1,150 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Matthias Hoelzer-Kluepfel <mhk@caldera.de> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <config.h>
+
+#include <iostream>
+
+
+#include <qfile.h>
+#include <qregexp.h>
+
+
+#include <kstandarddirs.h>
+
+
+#include "usbdb.h"
+
+
+USBDB::USBDB()
+{
+#ifndef USBIDS_FILE
+ QString db = "/usr/share/hwdata/usb.ids"; /* on Fedora */
+ if (!QFile::exists(db))
+ db = locate("data", "kcmusb/usb.ids");
+#else
+ QString db = USBIDS_FILE;
+#endif
+ if (db.isEmpty())
+ return;
+
+ _classes.setAutoDelete(true);
+ _ids.setAutoDelete(true);
+
+ QFile f(db);
+
+ if (f.open(IO_ReadOnly))
+ {
+ QTextStream ts(&f);
+
+ QString line, name;
+ int id=0, subid=0, protid=0;
+ QRegExp vendor("[0-9a-fA-F]+ ");
+ QRegExp product("\\s+[0-9a-fA-F]+ ");
+ QRegExp cls("C [0-9a-fA-F][0-9a-fA-F]");
+ QRegExp subclass("\\s+[0-9a-fA-F][0-9a-fA-F] ");
+ QRegExp prot("\\s+[0-9a-fA-F][0-9a-fA-F] ");
+ while (!ts.eof())
+ {
+ line = ts.readLine();
+ if (line.left(1) == "#" || line.stripWhiteSpace().isEmpty())
+ continue;
+
+ // skip AT lines
+ if (line.left(2) == "AT")
+ continue;
+
+ if (cls.search(line) == 0 && cls.matchedLength() == 4)
+ {
+ id = line.mid(2,2).toInt(0, 16);
+ name = line.mid(4).stripWhiteSpace();
+ _classes.insert(QString("%1").arg(id), new QString(name));
+ }
+ else if (prot.search(line) == 0 && prot.matchedLength() > 5)
+ {
+ line = line.stripWhiteSpace();
+ protid = line.left(2).toInt(0, 16);
+ name = line.mid(4).stripWhiteSpace();
+ _classes.insert(QString("%1-%2-%3").arg(id).arg(subid).arg(protid), new QString(name));
+ }
+ else if (subclass.search(line) == 0 && subclass.matchedLength() > 4)
+ {
+ line = line.stripWhiteSpace();
+ subid = line.left(2).toInt(0, 16);
+ name = line.mid(4).stripWhiteSpace();
+ _classes.insert(QString("%1-%2").arg(id).arg(subid), new QString(name));
+ }
+ else if (vendor.search(line) == 0 && vendor.matchedLength() == 5)
+ {
+ id = line.left(4).toInt(0,16);
+ name = line.mid(6);
+ _ids.insert(QString("%1").arg(id), new QString(name));
+ }
+ else if (product.search(line) == 0 && product.matchedLength() > 5 )
+ {
+ line = line.stripWhiteSpace();
+ subid = line.left(4).toInt(0,16);
+ name = line.mid(6);
+ _ids.insert(QString("%1-%2").arg(id).arg(subid), new QString(name));
+ }
+
+ }
+
+ f.close();
+ }
+}
+
+
+QString USBDB::vendor(int id)
+{
+ QString *s = _ids[QString("%1").arg(id)];
+ if ((id!= 0) && s)
+ {
+ return *s;
+ }
+ return QString::null;
+}
+
+
+QString USBDB::device(int vendor, int id)
+{
+ QString *s = _ids[QString("%1-%2").arg(vendor).arg(id)];
+ if ((id != 0) && (vendor != 0) && s)
+ return *s;
+ return QString::null;
+}
+
+
+QString USBDB::cls(int cls)
+{
+ QString *s = _classes[QString("%1").arg(cls)];
+ if (s)
+ return *s;
+ return QString::null;
+}
+
+
+QString USBDB::subclass(int cls, int sub)
+{
+ QString *s = _classes[QString("%1-%2").arg(cls).arg(sub)];
+ if (s)
+ return *s;
+ return QString::null;
+}
+
+
+QString USBDB::protocol(int cls, int sub, int prot)
+{
+ QString *s = _classes[QString("%1-%2-%2").arg(cls).arg(sub).arg(prot)];
+ if (s)
+ return *s;
+ return QString::null;
+}
+
diff --git a/kcontrol/usbview/usbdb.h b/kcontrol/usbview/usbdb.h
new file mode 100644
index 000000000..2b4226937
--- /dev/null
+++ b/kcontrol/usbview/usbdb.h
@@ -0,0 +1,39 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Matthias Hoelzer-Kluepfel <mhk@caldera.de> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef __USB_DB_H__
+#define __USB_DB_H__
+
+
+#include <qdict.h>
+
+
+class USBDB
+{
+public:
+
+ USBDB();
+
+ QString vendor(int id);
+ QString device(int vendor, int id);
+
+ QString cls(int cls);
+ QString subclass(int cls, int sub);
+ QString protocol(int cls, int sub, int prot);
+
+private:
+
+ QDict<QString> _classes, _ids;
+
+};
+
+
+#endif
diff --git a/kcontrol/usbview/usbdevices.cpp b/kcontrol/usbview/usbdevices.cpp
new file mode 100644
index 000000000..3d557a7ed
--- /dev/null
+++ b/kcontrol/usbview/usbdevices.cpp
@@ -0,0 +1,431 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Matthias Hoelzer-Kluepfel <mhk@caldera.de> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+
+#include <qfile.h>
+#include <qdir.h>
+#include <qregexp.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include "usbdb.h"
+#include "usbdevices.h"
+
+#include <math.h>
+
+#ifdef Q_OS_FREEBSD
+#include <sys/ioctl.h>
+#include <sys/param.h>
+#endif
+
+QPtrList<USBDevice> USBDevice::_devices;
+USBDB *USBDevice::_db;
+
+
+USBDevice::USBDevice()
+ : _bus(0), _level(0), _parent(0), _port(0), _count(0), _device(0),
+ _channels(0), _power(0), _speed(0.0),
+ _bwTotal(0), _bwUsed(0), _bwPercent(0), _bwIntr(0), _bwIso(0), _hasBW(false),
+ _verMajor(0), _verMinor(0), _class(0), _sub(0), _prot(0), _maxPacketSize(0), _configs(0),
+ _vendorID(0), _prodID(0), _revMajor(0), _revMinor(0)
+{
+ _devices.append(this);
+ _devices.setAutoDelete(true);
+
+ if (!_db)
+ _db = new USBDB;
+}
+
+static QString catFile(QString fname)
+{
+ char buffer[256];
+ QString result;
+ int fd = ::open(QFile::encodeName(fname), O_RDONLY);
+ if (fd<0)
+ return QString::null;
+
+ if (fd >= 0)
+ {
+ ssize_t count;
+ while ((count = ::read(fd, buffer, 256)) > 0)
+ result.append(QString(buffer).left(count));
+
+ ::close(fd);
+ }
+ return result.stripWhiteSpace();
+}
+
+void USBDevice::parseSysDir(int bus, int parent, int level, QString dname)
+{
+ _level = level;
+ _parent = parent;
+ _manufacturer = catFile(dname + "/manufacturer");
+ _product = catFile(dname + "/product");
+
+ _bus = bus;
+ _device = catFile(dname + "/devnum").toUInt();
+
+ if (_device == 1)
+ _product += QString(" (%1)").arg(_bus);
+
+ _vendorID = catFile(dname + "/idVendor").toUInt(0, 16);
+ _prodID = catFile(dname + "/idProduct").toUInt(0, 16);
+
+ _class = catFile(dname + "/bDeviceClass").toUInt(0, 16);
+ _sub = catFile(dname + "/bDeviceSubClass").toUInt(0, 16);
+ _maxPacketSize = catFile(dname + "/bMaxPacketSize0").toUInt();
+
+ _speed = catFile(dname + "/speed").toDouble();
+ _serial = catFile(dname + "/serial");
+ _channels = catFile(dname + "/maxchild").toUInt();
+
+ double version = catFile(dname + "/version").toDouble();
+ _verMajor = int(version);
+ _verMinor = int(10*(version - floor(version)));
+
+ QDir dir(dname);
+ dir.setNameFilter(QString("%1-*").arg(bus));
+ dir.setFilter(QDir::Dirs);
+ QStringList list = dir.entryList();
+
+ for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) {
+ if ((*it).contains(':'))
+ continue;
+
+ USBDevice* dev = new USBDevice();
+ dev->parseSysDir(bus, ++level, _device, dname + "/" + *it);
+ }
+}
+
+void USBDevice::parseLine(QString line)
+{
+ if (line.startsWith("T:"))
+ sscanf(line.local8Bit().data(),
+ "T: Bus=%2d Lev=%2d Prnt=%2d Port=%d Cnt=%2d Dev#=%3d Spd=%3f MxCh=%2d",
+ &_bus, &_level, &_parent, &_port, &_count, &_device, &_speed, &_channels);
+ else if (line.startsWith("S: Manufacturer"))
+ _manufacturer = line.mid(17);
+ else if (line.startsWith("S: Product")) {
+ _product = line.mid(12);
+ /* add bus number to root devices */
+ if (_device==1)
+ _product += QString(" (%1)").arg(_bus);
+ }
+ else if (line.startsWith("S: SerialNumber"))
+ _serial = line.mid(17);
+ else if (line.startsWith("B:"))
+ {
+ sscanf(line.local8Bit().data(),
+ "B: Alloc=%3d/%3d us (%2d%%), #Int=%3d, #Iso=%3d",
+ &_bwUsed, &_bwTotal, &_bwPercent, &_bwIntr, &_bwIso);
+ _hasBW = true;
+ }
+ else if (line.startsWith("D:"))
+ {
+ char buffer[11];
+ sscanf(line.local8Bit().data(),
+ "D: Ver=%x.%x Cls=%x(%10s) Sub=%x Prot=%x MxPS=%d #Cfgs=%d",
+ &_verMajor, &_verMinor, &_class, buffer, &_sub, &_prot, &_maxPacketSize, &_configs);
+ _className = buffer;
+ }
+ else if (line.startsWith("P:"))
+ sscanf(line.local8Bit().data(),
+ "P: Vendor=%x ProdID=%x Rev=%x.%x",
+ &_vendorID, &_prodID, &_revMajor, &_revMinor);
+}
+
+
+USBDevice *USBDevice::find(int bus, int device)
+{
+ QPtrListIterator<USBDevice> it(_devices);
+ for ( ; it.current(); ++it)
+ if (it.current()->bus() == bus && it.current()->device() == device)
+ return it.current();
+ return 0;
+}
+
+QString USBDevice::product()
+{
+ if (!_product.isEmpty())
+ return _product;
+ QString pname = _db->device(_vendorID, _prodID);
+ if (!pname.isEmpty())
+ return pname;
+ return i18n("Unknown");
+}
+
+
+QString USBDevice::dump()
+{
+ QString r;
+
+ r = "<qml><h2><center>" + product() + "</center></h2><br/><hl/>";
+
+ if (!_manufacturer.isEmpty())
+ r += i18n("<b>Manufacturer:</b> ") + _manufacturer + "<br/>";
+ if (!_serial.isEmpty())
+ r += i18n("<b>Serial #:</b> ") + _serial + "<br/>";
+
+ r += "<br/><table>";
+
+ QString c = QString("<td>%1</td>").arg(_class);
+ QString cname = _db->cls(_class);
+ if (!cname.isEmpty())
+ c += "<td>(" + i18n(cname.latin1()) +")</td>";
+ r += i18n("<tr><td><i>Class</i></td>%1</tr>").arg(c);
+ QString sc = QString("<td>%1</td>").arg(_sub);
+ QString scname = _db->subclass(_class, _sub);
+ if (!scname.isEmpty())
+ sc += "<td>(" + i18n(scname.latin1()) +")</td>";
+ r += i18n("<tr><td><i>Subclass</i></td>%1</tr>").arg(sc);
+ QString pr = QString("<td>%1</td>").arg(_prot);
+ QString prname = _db->protocol(_class, _sub, _prot);
+ if (!prname.isEmpty())
+ pr += "<td>(" + prname +")</td>";
+ r += i18n("<tr><td><i>Protocol</i></td>%1</tr>").arg(pr);
+#ifndef Q_OS_FREEBSD
+ r += i18n("<tr><td><i>USB Version</i></td><td>%1.%2</td></tr>")
+ .arg(_verMajor,0,16)
+ .arg(QString::number(_verMinor,16).prepend('0').right(2));
+#endif
+ r += "<tr><td></td></tr>";
+
+ QString v = QString::number(_vendorID,16);
+ QString name = _db->vendor(_vendorID);
+ if (!name.isEmpty())
+ v += "<td>(" + name +")</td>";
+ r += i18n("<tr><td><i>Vendor ID</i></td><td>0x%1</td></tr>").arg(v);
+ QString p = QString::number(_prodID,16);
+ QString pname = _db->device(_vendorID, _prodID);
+ if (!pname.isEmpty())
+ p += "<td>(" + pname +")</td>";
+ r += i18n("<tr><td><i>Product ID</i></td><td>0x%1</td></tr>").arg(p);
+ r += i18n("<tr><td><i>Revision</i></td><td>%1.%2</td></tr>")
+ .arg(_revMajor,0,16)
+ .arg(QString::number(_revMinor,16).prepend('0').right(2));
+ r += "<tr><td></td></tr>";
+
+ r += i18n("<tr><td><i>Speed</i></td><td>%1 Mbit/s</td></tr>").arg(_speed);
+ r += i18n("<tr><td><i>Channels</i></td><td>%1</td></tr>").arg(_channels);
+#ifdef Q_OS_FREEBSD
+ if ( _power )
+ r += i18n("<tr><td><i>Power Consumption</i></td><td>%1 mA</td></tr>").arg(_power);
+ else
+ r += i18n("<tr><td><i>Power Consumption</i></td><td>self powered</td></tr>");
+ r += i18n("<tr><td><i>Attached Devicenodes</i></td><td>%1</td></tr>").arg(*_devnodes.at(0));
+ if ( _devnodes.count() > 1 )
+ for ( QStringList::Iterator it = _devnodes.at(1); it != _devnodes.end(); ++it )
+ r += "<tr><td></td><td>" + *it + "</td></tr>";
+#else
+ r += i18n("<tr><td><i>Max. Packet Size</i></td><td>%1</td></tr>").arg(_maxPacketSize);
+#endif
+ r += "<tr><td></td></tr>";
+
+ if (_hasBW)
+ {
+ r += i18n("<tr><td><i>Bandwidth</i></td><td>%1 of %2 (%3%)</td></tr>").arg(_bwUsed).arg(_bwTotal).arg(_bwPercent);
+ r += i18n("<tr><td><i>Intr. requests</i></td><td>%1</td></tr>").arg(_bwIntr);
+ r += i18n("<tr><td><i>Isochr. requests</i></td><td>%1</td></tr>").arg(_bwIso);
+ r += "<tr><td></td></tr>";
+ }
+
+ r += "</table>";
+
+ return r;
+}
+
+
+#ifndef Q_OS_FREEBSD
+bool USBDevice::parse(QString fname)
+{
+ _devices.clear();
+
+ QString result;
+
+ // read in the complete file
+ //
+ // Note: we can't use a QTextStream, as the files in /proc
+ // are pseudo files with zero length
+ char buffer[256];
+ int fd = ::open(QFile::encodeName(fname), O_RDONLY);
+ if (fd<0)
+ return false;
+
+ if (fd >= 0)
+ {
+ ssize_t count;
+ while ((count = ::read(fd, buffer, 256)) > 0)
+ result.append(QString(buffer).left(count));
+
+ ::close(fd);
+ }
+
+ // read in the device infos
+ USBDevice *device = 0;
+ int start=0, end;
+ result.replace(QRegExp("^\n"),"");
+ while ((end = result.find('\n', start)) > 0)
+ {
+ QString line = result.mid(start, end-start);
+
+ if (line.startsWith("T:"))
+ device = new USBDevice();
+
+ if (device)
+ device->parseLine(line);
+
+ start = end+1;
+ }
+ return true;
+}
+
+bool USBDevice::parseSys(QString dname)
+{
+ QDir d(dname);
+ d.setNameFilter("usb*");
+ QStringList list = d.entryList();
+
+ for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) {
+ USBDevice* device = new USBDevice();
+
+ int bus = 0;
+ QRegExp bus_reg("[a-z]*([0-9]+)");
+ if (bus_reg.search(*it) != -1)
+ bus = bus_reg.cap(1).toInt();
+
+
+ device->parseSysDir(bus, 0, 0, d.absPath() + "/" + *it);
+ }
+
+ return d.count();
+}
+
+#else
+
+/*
+ * FreeBSD support by Markus Brueffer <markus@brueffer.de>
+ *
+ * Basic idea and some code fragments were taken from FreeBSD's usbdevs(8),
+ * originally developed for NetBSD, so this code should work with no or
+ * only little modification on NetBSD.
+ */
+
+void USBDevice::collectData( int fd, int level, usb_device_info &di, int parent)
+{
+ // determine data for this device
+ _level = level;
+ _parent = parent;
+
+ _bus = di.udi_bus;
+ _device = di.udi_addr;
+ _product = QString::fromLatin1(di.udi_product);
+ if ( _device == 1 )
+ _product += " " + QString::number( _bus );
+ _manufacturer = QString::fromLatin1(di.udi_vendor);
+ _prodID = di.udi_productNo;
+ _vendorID = di.udi_vendorNo;
+ _class = di.udi_class;
+ _sub = di.udi_subclass;
+ _prot = di.udi_protocol;
+ _power = di.udi_power;
+ _channels = di.udi_nports;
+
+ // determine the speed
+#if __FreeBSD_version > 490102
+ switch (di.udi_speed) {
+ case USB_SPEED_LOW: _speed = 1.5; break;
+ case USB_SPEED_FULL: _speed = 12.0; break;
+ case USB_SPEED_HIGH: _speed = 480.0; break;
+ }
+#else
+ _speed = di.udi_lowspeed ? 1.5 : 12.0;
+#endif
+
+ // Get all attached devicenodes
+ for ( int i = 0; i < USB_MAX_DEVNAMES; ++i )
+ if ( di.udi_devnames[i][0] )
+ _devnodes << di.udi_devnames[i];
+
+ // For compatibility, split the revision number
+ sscanf( di.udi_release, "%x.%x", &_revMajor, &_revMinor );
+
+ // Cycle through the attached devices if there are any
+ for ( int p = 0; p < di.udi_nports; ++p ) {
+ // Get data for device
+ struct usb_device_info di2;
+
+ di2.udi_addr = di.udi_ports[p];
+
+ if ( di2.udi_addr >= USB_MAX_DEVICES )
+ continue;
+
+ if ( ioctl(fd, USB_DEVICEINFO, &di2) == -1 )
+ continue;
+
+ // Only add the device if we didn't detect it, yet
+ if (!find( di2.udi_bus, di2.udi_addr ) )
+ {
+ USBDevice *device = new USBDevice();
+ device->collectData( fd, level + 1, di2, di.udi_addr );
+ }
+ }
+}
+
+
+
+bool USBDevice::parse(QString fname)
+{
+ static bool showErrorMessage = true;
+ bool error = false;
+ _devices.clear();
+
+ QFile controller("/dev/usb0");
+ int i = 1;
+ while ( controller.exists() )
+ {
+ // If the devicenode exists, continue with further inspection
+ if ( controller.open(IO_ReadOnly) )
+ {
+ for ( int addr = 1; addr < USB_MAX_DEVICES; ++addr )
+ {
+ struct usb_device_info di;
+
+ di.udi_addr = addr;
+ if ( ioctl(controller.handle(), USB_DEVICEINFO, &di) != -1 )
+ {
+ if (!find( di.udi_bus, di.udi_addr ) )
+ {
+ USBDevice *device = new USBDevice();
+ device->collectData( controller.handle(), 0, di, 0);
+ }
+ }
+ }
+ controller.close();
+ } else {
+ error = true;
+ }
+ controller.setName( QString::fromLocal8Bit("/dev/usb%1").arg(i++) );
+ }
+
+ if ( showErrorMessage && error ) {
+ showErrorMessage = false;
+ KMessageBox::error( 0, i18n("Could not open one or more USB controller. Make sure, you have read access to all USB controllers that should be listed here."));
+ }
+
+ return true;
+}
+#endif
diff --git a/kcontrol/usbview/usbdevices.h b/kcontrol/usbview/usbdevices.h
new file mode 100644
index 000000000..853df02b3
--- /dev/null
+++ b/kcontrol/usbview/usbdevices.h
@@ -0,0 +1,75 @@
+/***************************************************************************
+ * Copyright (C) 2001 by Matthias Hoelzer-Kluepfel <mhk@caldera.de> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef __USB_DEVICES_H__
+#define __USB_DEVICES_H__
+
+
+#include <qstring.h>
+#include <qptrlist.h>
+
+#ifdef Q_OS_FREEBSD
+#include <dev/usb/usb.h>
+#endif
+
+class USBDB;
+
+
+class USBDevice
+{
+public:
+
+ USBDevice();
+
+ void parseLine(QString line);
+ void parseSysDir(int bus, int parent, int level, QString line);
+
+ int level() { return _level; };
+ int device() { return _device; };
+ int parent() { return _parent; };
+ int bus() { return _bus; };
+ QString product();
+
+ QString dump();
+
+ static QPtrList<USBDevice> &devices() { return _devices; };
+ static USBDevice *find(int bus, int device);
+ static bool parse(QString fname);
+ static bool parseSys(QString fname);
+
+
+private:
+
+ static QPtrList<USBDevice> _devices;
+
+ static USBDB *_db;
+
+ int _bus, _level, _parent, _port, _count, _device, _channels, _power;
+ float _speed;
+
+ QString _manufacturer, _product, _serial;
+
+ int _bwTotal, _bwUsed, _bwPercent, _bwIntr, _bwIso;
+ bool _hasBW;
+
+ unsigned int _verMajor, _verMinor, _class, _sub, _prot, _maxPacketSize, _configs;
+ QString _className;
+
+ unsigned int _vendorID, _prodID, _revMajor, _revMinor;
+
+#ifdef Q_OS_FREEBSD
+ void collectData( int fd, int level, usb_device_info &di, int parent );
+ QStringList _devnodes;
+#endif
+};
+
+
+#endif
diff --git a/kcontrol/view1394/Makefile.am b/kcontrol/view1394/Makefile.am
new file mode 100644
index 000000000..88f2b37c7
--- /dev/null
+++ b/kcontrol/view1394/Makefile.am
@@ -0,0 +1,19 @@
+kde_module_LTLIBRARIES = kcm_view1394.la
+
+kcm_view1394_la_SOURCES = view1394widget.ui view1394.cpp
+
+kcm_view1394_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_view1394_la_LIBADD = $(LIB_KDEUI) -lraw1394
+
+AM_CPPFLAGS= $(all_includes)
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmview1394.pot
+
+xdg_apps_DATA = kcmview1394.desktop
+
+view1394_vendor_DATA = oui.db
+view1394_vendordir = $(kde_datadir)/kcmview1394
+
diff --git a/kcontrol/view1394/README b/kcontrol/view1394/README
new file mode 100644
index 000000000..e2dd6205e
--- /dev/null
+++ b/kcontrol/view1394/README
@@ -0,0 +1,13 @@
+this kcontrol module shows the current configuration of the IEEE 1394 bus.
+It uses libraw1394 (see www.linux1394.org). I don't know how the 1394 apis
+on other OS's look, feel free to port it :-)
+
+The file oui.db is generated from the file oui.txt which you can get at
+http://standards.ieee.org/regauth/oui/index.shtml
+
+It was generated using the following command:
+
+awk '/base 16/ { if (NF>3) {s=$1; for (i=4; i<=NF; i++) s=s " " $i; print s}}' oui.txt > oui.db
+
+Alex
+<neundorf@kde.org>
diff --git a/kcontrol/view1394/configure.in.in b/kcontrol/view1394/configure.in.in
new file mode 100644
index 000000000..d35bf61cc
--- /dev/null
+++ b/kcontrol/view1394/configure.in.in
@@ -0,0 +1,15 @@
+AC_ARG_WITH(libraw1394,
+ [AC_HELP_STRING(--with-libraw1394,
+ [enable visualization of ieee1394 devices through libraw1394 @<:@default=check@:>@])],
+ [], with_libraw1394=check)
+
+VIEW1394_SUBDIR=
+if test "x$with_libraw1394" != xno; then
+ KDE_CHECK_HEADER(libraw1394/raw1394.h, VIEW1394_SUBDIR=view1394)
+
+ if test "x$with_libraw1394" != xcheck && test -z "$VIEW1394_SUBDIR"; then
+ AC_MSG_ERROR([--with-libraw1394 was given, but test for libraw1394 failed])
+ fi
+fi
+
+AM_CONDITIONAL(include_kcontrol_view1394, test -n "$VIEW1394_SUBDIR")
diff --git a/kcontrol/view1394/kcmview1394.desktop b/kcontrol/view1394/kcmview1394.desktop
new file mode 100644
index 000000000..04a831f58
--- /dev/null
+++ b/kcontrol/view1394/kcmview1394.desktop
@@ -0,0 +1,219 @@
+[Desktop Entry]
+Icon=ieee1394
+Type=Application
+DocPath=kinfocenter/view1394/index.html
+Exec=kcmshell kcmview1394
+
+X-KDE-Library=view1394
+X-KDE-ParentApp=kinfocenter
+
+Name=IEEE 1394 Devices
+Name[af]=IEEE 1394 Toestelle
+Name[ar]=أجهزة IEEE 1394
+Name[be]=Прылады IEEE 1394
+Name[bg]=IEEE 1394
+Name[br]=Trobarzhelloù IEEE 1394
+Name[bs]=IEEE 1394 uređaji
+Name[ca]=Dispositius IEEE 1394
+Name[cs]=IEEE 1394 zařízení
+Name[csb]=Ùrządzenia IEEE 1394
+Name[cy]=Dyfeisiau IEE 1394
+Name[da]=IEEE 1394-enheder
+Name[de]=IEEE-1394-Geräte
+Name[el]=Συσκευές IEEE 1394
+Name[eo]=IEEE 1394 Aparatoj
+Name[es]=Dispositivos IEEE 1394
+Name[et]=IEEE 1394 seadmed
+Name[eu]=IEEE 1394 gailuak
+Name[fa]=دستگاههای IEEE 1394
+Name[fi]=IEEE 1394 (Firewire)-laitteet
+Name[fr]=Périphériques IEEE 1394
+Name[fy]=IEEE 1394-apparaten
+Name[ga]=Gléasanna IEEE 1394
+Name[gl]=Dispositivos IEEE 1394
+Name[he]=התקני IEEE 1394
+Name[hi]=आईईईई 1394 औज़ार
+Name[hr]=IEEE 1394 uređaji
+Name[hu]=IEEE 1394-eszközök
+Name[is]=IEEE 1394 Tæki
+Name[it]=Dispositivi IEEE 1394
+Name[ja]=IEEE 1394 デバイス
+Name[ka]=IEEE 1394 მოწყობილობები
+Name[kk]=IEEE 1394 құрылғылар
+Name[km]=ឧបករណ៍ IEEE 1394
+Name[ko]=IEEE 1394 장치
+Name[lt]=IEEE 1394 įrenginiai
+Name[lv]=IEEE 1394 (Fireware) iekārtas
+Name[mk]=IEEE 1394 Уреди
+Name[mn]=IEEE 1394 Төхөөрөмж
+Name[ms]=Peranti IEEE 1394
+Name[mt]=Apparat IEEE 1394
+Name[nb]=IEEE 1394-enheter
+Name[nds]=IEEE-1394-Reedschappen
+Name[ne]=IEEE 1394 यन्त्र
+Name[nl]=IEEE 1394-apparaten
+Name[nn]=IEEE 1394-einingar
+Name[pa]=IEEE 1394 ਜੰਤਰ
+Name[pl]=Urządzenia IEEE 1394
+Name[pt]=Dispositivos IEEE 1394
+Name[pt_BR]=Dispositivos IEEE 1394
+Name[ro]=Dispozitive IEEE 1394
+Name[ru]=Устройства IEEE 1394
+Name[rw]=Apareye IEEE 1394
+Name[se]=IEEE 1394-ovttadagat
+Name[sk]=Zariadenia IEEE 1394
+Name[sl]=Naprave IEEE 1394
+Name[sr]=IEEE 1394 уређаји
+Name[sr@Latn]=IEEE 1394 uređaji
+Name[sv]=IEEE 1394-enheter
+Name[ta]=IEEE 1394 சாதனங்கள்
+Name[te]=ఐఈఈఈ 1394 పరికరాలు
+Name[tg]=Дастгоҳҳои EEE 1394
+Name[th]=อุปกรณ์ IEEE 1394
+Name[tr]=IEEE 1394 Aygıtları
+Name[tt]=IEEE 1394 Cıhazları
+Name[uk]=Пристрої IEEE 1394
+Name[uz]=IEEE 1394 uskunalar
+Name[uz@cyrillic]=IEEE 1394 ускуналар
+Name[vi]=Thiết bị IEEE 1394
+Name[wa]=Éndjins IEEE 1394
+Name[zh_CN]=IEEE 1394 设备
+Name[zh_TW]=IEEE 1394 裝置
+
+Comment=View the IEEE 1394 devices attached to this computer
+Comment[af]=Besigtig die IEEE 1394 toestelle wat aan hierdie rekenaar gekoppel is
+Comment[ar]=إعرض أجهزة IEEE 1394 المتصلة بهذا الحاسوب
+Comment[be]=Паказвае прылады IEEE 1394, далучаныя да гэтага кампутара
+Comment[bg]=Информация за IEEE 1394 устройствата
+Comment[bn]=এই কমপিউটারের সঙ্গে সংযুক্ত IEEE 1394ডিভাইসগুলির তালিকা
+Comment[br]=Sellout ouzh trobarzhelloù IEEE 1394 kevreet ouzh an urzhiataer-mañ
+Comment[bs]=Pregledajte IEEE 1394 uređaje priključene na ovaj računar
+Comment[ca]=Veure els dispositius IEEE 1394 connectats a aquest ordinador
+Comment[cs]=Zobrazení IEEE 1394 zařízení připojených k tomuto počítači
+Comment[csb]=Wëdowiédzô ò ùrządzeniach IEEE 1394 przëłączonëch do tegò kòmpùtra
+Comment[cy]= Gweld y dyfeisiau IEE 1394 sydd wedi eu cysylltu i'r cyfrifiadur yma
+Comment[da]=Se IEEE 1394-enheder forbundet til denne computer
+Comment[de]=IEEE-1394-Geräte aufführen, die an den Rechner angeschlossen sind
+Comment[el]=Προβολή των συνδεδεμένων σε αυτό σύστημα συσκευών IEEE 1394
+Comment[eo]=Montras la IEEE 1394 aparatojn ĉe via komputilo
+Comment[es]=Muestra los dispositivos IEEE 1394 conectados a este equipo
+Comment[et]=Arvutiga ühendatud IEEE 1394 seadmete vaatamine
+Comment[eu]=Ilkusi ordenagailu honetan konektatuta dauden IEEE 1394 gailuak
+Comment[fa]=نمای دستگاههای IEEE 1394 پیوست‌شده به این رایانه
+Comment[fi]=Näyttää tietokoneeseen liitetyt IEEE 1394 (Firewire)-laitteet
+Comment[fr]=Affiche les périphériques IEEE 1394 rattachés à cet ordinateur
+Comment[fy]=Hjir kinne jo de IEEE 1394-apparaten besjen die op dizze kompjûter oansluten binne
+Comment[ga]=Taispeáin na gléasanna IEEE 1394 ceangailte leis an ríomhaire seo
+Comment[gl]=Ver os dispositivos IEEE 1394 conectados a este computador
+Comment[he]=צפה בהתקני IEEE 1394 המחוברים למחשב זה
+Comment[hi]=आईईईई 1394 औज़ारों को देखे जो इस कम्प्यूटर से जुड़े हैं
+Comment[hr]=Pregled IEEE 1394 uređaja spojenih na računalo
+Comment[hu]=Az IEEE 1394-es eszközök jellemzőinek megtekintése
+Comment[is]=SKoða IEEE 1394 tækin sem eru tengd við þessa tölvu
+Comment[it]=Mostra i dispositivi IEEE 1394 collegati a questo computer
+Comment[ja]=コンピュータに接続されている IEEE 1394 デバイスの情報
+Comment[ka]=ამ კომპიუტერზე შეერთებული IEEE 1394 მოწყობილობების დათვალიერება
+Comment[kk]=Компьютерге тіркелген IEEE 1394 құрылғылары
+Comment[km]=មើល​ឧបករណ៍ IEEE 1394 ដែល​បាន​ភ្ជាប់​មក​កុំព្យូទ័រ​នេះ
+Comment[ko]=이 컴퓨터에 연결된 IEEE 1394 장치 표시
+Comment[lt]=Žiūrėkite IEEE 1394 įrenginius, kurie prijungti prie šio kompiuterio
+Comment[lv]=Skatīt datoram pievienotās IEEE 1394 (Fireware) iekārtas
+Comment[mk]=Видете ги IEEE 1394 уредите закачени на овој компјутер
+Comment[mn]=Энэ компьютерт залгагдсан IEEE 1394-төхөөрөмж харуулах
+Comment[ms]=Papar peranti IEEE 1394 yang dilekapkan pada komputer ini
+Comment[mt]=Ara l-apparat IEEE 1394 imqabbad ma' dal-kompjuter
+Comment[nb]=Se hvilke IEEE 1394-enheter som er koblet til denne maskinen
+Comment[nds]=De IEEE1394-Reedschappen ankieken, de dissen Reekner tokoppelt sünd
+Comment[ne]=यो कम्प्युटरमा सङ्लग्न गरिएका IEEE 1394 यन्त्र देखाउनुहोस्
+Comment[nl]=Hier kunt u de IEEE 1394-apparaten die op deze computer zijn aangesloten bekijken
+Comment[nn]=Viser IEE 1394-einingane knytte til datamaskina
+Comment[pa]=ਆਪਣੇ ਕੰਪਿਊਟਰ ਨਾਲ ਜੁੜੇ IEEE 1394 ਜੰਤਰ ਵੇਖੋ
+Comment[pl]=Informacja o urządzeniach IEEE 1394 podłączonych do tego komputera
+Comment[pt]=Ver os dispositivos IEEE 1394 ligados a este computador
+Comment[pt_BR]=Ver os dispositivos IEEE 1394 conectados à este computador
+Comment[ro]=Afișează dispozitivele IEEE 1394 conectate la acest calculator
+Comment[ru]=Просмотр устройств IEEE 1394, подключенных к этому компьютеру
+Comment[rw]=Kugaragaza Amapareye IEEE 1394 zifashe kuri iyi mudasobwa
+Comment[se]=Čájeha IEEE 1394-ovttadagaid mat leat laktašuvvan dihtoriidat
+Comment[sk]=Zobrazí zariadenie IEEE 1394 pripojené k počítači
+Comment[sl]=Prikaz naprav IEEE 1394, ki so priključene na ta računalnik
+Comment[sr]=Прикажи IEEE 1394 уређаје повезане на овај рачунар
+Comment[sr@Latn]=Prikaži IEEE 1394 uređaje povezane na ovaj računar
+Comment[sv]=Visa IEEE 1394-enheter anslutna till datorn
+Comment[ta]=கணிப்பொறியோடு இணைக்கப்பட்ட IEEE 1394 சாதனத்தை பார்
+Comment[tg]= Намоиши дастгоҳҳои IEEE 1394 мутассал ба ин система
+Comment[th]=แสดงอุปกรณ์ IEEE 1394 ที่เชื่อมต่ออยู่กับคอมพิวเตอร์เครื่องนี้
+Comment[tr]=Bu bilgisayara bağlanmış IEEE 1394 aygıtlarını gör
+Comment[tt]=Bu sanaqqa totaşqan IEEE 1394 cıhazlarnı qaraw
+Comment[uk]=Перегляд пристроїв IEEE 1394, приєднаних до комп'ютера
+Comment[uz]=Kompyuterga ulangan IEEE 1394 uskunalarni koʻrish
+Comment[uz@cyrillic]=Компьютерга уланган IEEE 1394 ускуналарни кўриш
+Comment[vi]=Xem các thiết bị IEEE 1394 nối vào máy tính này
+Comment[wa]=Vey les éndjins IEEE 1394 raloyîs a cisse copiutrece chal
+Comment[zh_CN]=查看连接到该计算机的 IEEE 1394 设备
+Comment[zh_TW]=查看連接到這台電腦的 IEEE 1394 裝置
+
+Keywords=1394,Firewire,devices,viewer,control
+Keywords[ar]=1394،Firewire,أجهزة،عارض،تحكم
+Keywords[be]=Прылады,Прылада,Прагляд,Праглядальнік,Кіраванне,1394,Firewire,devices,viewer,control
+Keywords[bg]=информация, система, системна, устройства, контрол, 1394, Firewire, devices, viewer, control
+Keywords[br]=1394,Firewire,trobarzhelloù,gweller,ren
+Keywords[bs]=1394,Firewire,devices,viewer,control,uređaji
+Keywords[ca]=1394,Firewire,dispositius,visor,control
+Keywords[cs]=1394,Firewire,zařízení,prohlížeč,ovládání
+Keywords[csb]=1394,Firewire,ùrządzenia,przezéranié,kòntrola
+Keywords[cy]=1394,dyfeisiau,gwelydd,gwyliwr,rheoli
+Keywords[da]=1394,Firewire,enheder,fremviser,kontrol
+Keywords[de]=USB,Geräte,Geräte,Betrachter,Kontrolle
+Keywords[el]=1394,Firewire,συσκευές,προβολέας,έλεγχος
+Keywords[eo]=1394,aparatoj,rigardilo,stirado
+Keywords[es]=1394,Firewire,dispositivos,visor,control
+Keywords[et]=1394,Firewire,seadmed,vaataja,juhtimine
+Keywords[eu]=1394,Firewire,gailuak,ikustailua,kontrola
+Keywords[fa]=۱۳۹۴، Firewire، دستگاهها، مشاهده‌گر، کنترل
+Keywords[fi]=1394,Firewire,laitteet,katselija,hallinta
+Keywords[fr]=1394,Firewire,périphériques,afficheur,contrôle
+Keywords[fy]=1394,IEEE 1394,firewire,devices,viewer,control,werjefteprogramma,apparaten,râne apparatuur
+Keywords[ga]=1394,Firewire,gléasanna,amharcán,rialú
+Keywords[gl]=1394,Firewire,dispositivos,visor,control
+Keywords[he]=1394,Firewire, התקנים,מציג,בקרה, devices,viewer,control
+Keywords[hi]=1394,फायरवायर,औज़ारों,प्रदर्शक,नियंत्रण
+Keywords[hr]=1394,Firewire,devices,viewer,control,uređaji,pregled,nadzor
+Keywords[hu]=1394,Firewire,eszközök,megnézés,vezérlés
+Keywords[is]=1394,Firewire,tæki,skoðari,stilling
+Keywords[it]=1394,dispositivi,controllo,visualizza,firewire
+Keywords[ja]=1394,Firewire,デバイス,ビューア,コントロール
+Keywords[km]=1394,Firewire,ឧបករណ៍,កម្មវិធី​មើល,បញ្ជា
+Keywords[lt]=1394,Firewire,devices,viewer,control,žiūryklė,kontrolė,įrenginiai
+Keywords[lv]=1394,Fireware,iekārtas,skatītājs,vadība
+Keywords[mk]=1394,Firewire,devices,viewer,control,уреди,прегледник,контрола
+Keywords[mn]=1394,Файрвайрэ,харагч,хяналт,Төхөөрөмж
+Keywords[nb]=1394,Firewire,enheter,framviser,kontroll
+Keywords[nds]=1394,Firewire,Reedschappen,Kieker,Kuntrull
+Keywords[ne]=1394,फायर वायर, यन्त्र, दर्शक, नियन्त्रण
+Keywords[nl]=1394,IEEE 1394,firewire,devices,viewer,control,weergaveprogramma,apparaten,randapparatuur
+Keywords[nn]=1394,Firewire,einingar,framvisar,kontroll
+Keywords[pa]=1394,Firewire,ਫਾਇਰਵਾਇਰ,ਜੰਤਰ,ਦਰਸ਼ਕ,ਕੰਟਰੋਲ
+Keywords[pl]=1394,Firewire,urządzenia,przeglądanie,kontrola
+Keywords[pt]=1394,Firewire,dispositivos,visualizador,controlo
+Keywords[pt_BR]=1394,Firewire,dispositivos,visualizador,controle
+Keywords[ro]=1394,firewire,dispozitive,vizualizor,control
+Keywords[rw]=1394,Umugozimuriro,amapareye,mugaragaza,igenzura
+Keywords[se]=1394,Firewire,ovttadagat,čájeheaddji,stivren
+Keywords[sk]=zariadenie,prehliadač,ovládanie,1394,Firewire
+Keywords[sl]=1394,firewire,naprave,pregledovalnik,nadzor
+Keywords[sr]=1394,Firewire,devices,viewer,control,уређаји,преглед,контрола
+Keywords[sr@Latn]=1394,Firewire,devices,viewer,control,uređaji,pregled,kontrola
+Keywords[sv]=1394,Firewire,enheter,visare,kontroll
+Keywords[ta]=1394,ஃபயர்ஒயர்,சாதனங்கள்,காட்சி,கட்டுப்பாடு
+Keywords[th]=1394,ไฟร์ไวร์,อุปกรณ์,ตัวแสดงผล,ควบคุม
+Keywords[tr]=1394,firewire,aygıtlar,izleyici,denetim,kontrol
+Keywords[uk]=1394,Firewire,пристрої,перегляд,керування
+Keywords[uz]=1394,Firewire,uskunalar,koʻruvchi,boshqaruv
+Keywords[uz@cyrillic]=1394,Firewire,ускуналар,кўрувчи,бошқарув
+Keywords[vi]=1394,Firewire,thiết bị,trình xem,điều khiển
+Keywords[wa]=1394,IEEE 1394,Firewire,éndjins,håyneu,contrôle,corwaitaedje
+Keywords[zh_CN]=1394,Firewire,devices,viewer,control,设备,查看器,控制,火线
+Keywords[zh_TW]=1394,Firewire,devices,viewer,control,裝置,檢視器,控制
+
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/view1394/oui.db b/kcontrol/view1394/oui.db
new file mode 100644
index 000000000..76f80cc84
--- /dev/null
+++ b/kcontrol/view1394/oui.db
@@ -0,0 +1,7965 @@
+000000 XEROX CORPORATION
+000001 XEROX CORPORATION
+000002 XEROX CORPORATION
+000003 XEROX CORPORATION
+000004 XEROX CORPORATION
+000005 XEROX CORPORATION
+000006 XEROX CORPORATION
+000007 XEROX CORPORATION
+000008 XEROX CORPORATION
+000009 XEROX CORPORATION
+00000A OMRON TATEISI ELECTRONICS CO.
+00000B MATRIX CORPORATION
+00000C CISCO SYSTEMS, INC.
+00000D FIBRONICS LTD.
+00000E FUJITSU LIMITED
+00000F NEXT, INC.
+000010 SYTEK INC.
+000011 NORMEREL SYSTEMES
+000012 INFORMATION TECHNOLOGY LIMITED
+000013 CAMEX
+000014 NETRONIX
+000015 DATAPOINT CORPORATION
+000016 DU PONT PIXEL SYSTEMS .
+000017 TEKELEC
+000018 WEBSTER COMPUTER CORPORATION
+000019 APPLIED DYNAMICS INTERNATIONAL
+00001A ADVANCED MICRO DEVICES
+00001B NOVELL INC.
+00001C BELL TECHNOLOGIES
+00001D CABLETRON SYSTEMS, INC.
+00001E TELSIST INDUSTRIA ELECTRONICA
+00001F Telco Systems, Inc.
+000020 DATAINDUSTRIER DIAB AB
+000021 SUREMAN COMP. & COMMUN. CORP.
+000022 VISUAL TECHNOLOGY INC.
+000023 ABB INDUSTRIAL SYSTEMS AB
+000024 CONNECT AS
+000025 RAMTEK CORP.
+000026 SHA-KEN CO., LTD.
+000027 JAPAN RADIO COMPANY
+000028 PRODIGY SYSTEMS CORPORATION
+000029 IMC NETWORKS CORP.
+00002A TRW - SEDD/INP
+00002B CRISP AUTOMATION, INC
+00002C AUTOTOTE LIMITED
+00002D CHROMATICS INC
+00002E SOCIETE EVIRA
+00002F TIMEPLEX INC.
+000030 VG LABORATORY SYSTEMS LTD
+000031 QPSX COMMUNICATIONS PTY LTD
+000032 Marconi plc
+000033 EGAN MACHINERY COMPANY
+000034 NETWORK RESOURCES CORPORATION
+000035 SPECTRAGRAPHICS CORPORATION
+000036 ATARI CORPORATION
+000037 OXFORD METRICS LIMITED
+000038 CSS LABS
+000039 TOSHIBA CORPORATION
+00003A CHYRON CORPORATION
+00003B i Controls, Inc.
+00003C AUSPEX SYSTEMS INC.
+00003D UNISYS
+00003E SIMPACT
+00003F SYNTREX, INC.
+000040 APPLICON, INC.
+000041 ICE CORPORATION
+000042 METIER MANAGEMENT SYSTEMS LTD.
+000043 MICRO TECHNOLOGY
+000044 CASTELLE CORPORATION
+000045 FORD AEROSPACE & COMM. CORP.
+000046 OLIVETTI NORTH AMERICA
+000047 NICOLET INSTRUMENTS CORP.
+000048 SEIKO EPSON CORPORATION
+000049 APRICOT COMPUTERS, LTD
+00004A ADC CODENOLL TECHNOLOGY CORP.
+00004B ICL DATA OY
+00004C NEC CORPORATION
+00004D DCI CORPORATION
+00004E AMPEX CORPORATION
+00004F LOGICRAFT, INC.
+000050 RADISYS CORPORATION
+000051 HOB ELECTRONIC GMBH & CO. KG
+000052 Intrusion.com, Inc.
+000053 COMPUCORP
+000054 MODICON, INC.
+000055 COMMISSARIAT A L`ENERGIE ATOM.
+000056 DR. B. STRUCK
+000057 SCITEX CORPORATION LTD.
+000058 RACORE COMPUTER PRODUCTS INC.
+000059 HELLIGE GMBH
+00005A SysKonnect GmbH
+00005B ELTEC ELEKTRONIK AG
+00005C TELEMATICS INTERNATIONAL INC.
+00005D CS TELECOM
+00005E USC INFORMATION SCIENCES INST
+00005F SUMITOMO ELECTRIC IND., LTD.
+000060 KONTRON ELEKTRONIK GMBH
+000061 GATEWAY COMMUNICATIONS
+000062 BULL HN INFORMATION SYSTEMS
+000063 DR.ING.SEUFERT GMBH
+000064 YOKOGAWA DIGITAL COMPUTER CORP
+000065 NETWORK ASSOCIATES, INC.
+000066 TALARIS SYSTEMS, INC.
+000067 SOFT * RITE, INC.
+000068 ROSEMOUNT CONTROLS
+000069 CONCORD COMMUNICATIONS INC
+00006A COMPUTER CONSOLES INC.
+00006B SILICON GRAPHICS INC./MIPS
+00006D CRAY COMMUNICATIONS, LTD.
+00006E ARTISOFT, INC.
+00006F Madge Ltd.
+000070 HCL LIMITED
+000071 ADRA SYSTEMS INC.
+000072 MINIWARE TECHNOLOGY
+000073 SIECOR CORPORATION
+000074 RICOH COMPANY LTD.
+000075 Nortel Networks
+000076 ABEKAS VIDEO SYSTEM
+000077 INTERPHASE CORPORATION
+000078 LABTAM LIMITED
+000079 NETWORTH INCORPORATED
+00007A DANA COMPUTER INC.
+00007B RESEARCH MACHINES
+00007C AMPERE INCORPORATED
+00007D SUN MICROSYSTEMS, INC.
+00007E CLUSTRIX CORPORATION
+00007F LINOTYPE-HELL AG
+000080 CRAY COMMUNICATIONS A/S
+000081 BAY NETWORKS
+000082 LECTRA SYSTEMES SA
+000083 TADPOLE TECHNOLOGY PLC
+000084 SUPERNET
+000085 CANON INC.
+000086 MEGAHERTZ CORPORATION
+000087 HITACHI, LTD.
+000088 COMPUTER NETWORK TECH. CORP.
+000089 CAYMAN SYSTEMS INC.
+00008A DATAHOUSE INFORMATION SYSTEMS
+00008B INFOTRON
+00008C Alloy Computer Products (Australia) Pty Ltd
+00008D VERDIX CORPORATION
+00008E SOLBOURNE COMPUTER, INC.
+00008F RAYTHEON COMPANY
+000090 MICROCOM
+000091 ANRITSU CORPORATION
+000092 COGENT DATA TECHNOLOGIES
+000093 PROTEON INC.
+000094 ASANTE TECHNOLOGIES
+000095 SONY TEKTRONIX CORP.
+000096 MARCONI ELECTRONICS LTD.
+000097 EPOCH SYSTEMS
+000098 CROSSCOMM CORPORATION
+000099 MTX, INC.
+00009A RC COMPUTER A/S
+00009B INFORMATION INTERNATIONAL, INC
+00009C ROLM MIL-SPEC COMPUTERS
+00009D LOCUS COMPUTING CORPORATION
+00009E MARLI S.A.
+00009F AMERISTAR TECHNOLOGIES INC.
+0000A0 TOKYO SANYO ELECTRIC CO. LTD.
+0000A1 MARQUETTE ELECTRIC CO.
+0000A2 BAY NETWORKS
+0000A3 NETWORK APPLICATION TECHNOLOGY
+0000A4 ACORN COMPUTERS LIMITED
+0000A5 COMPATIBLE SYSTEMS CORP.
+0000A6 NETWORK GENERAL CORPORATION
+0000A7 NETWORK COMPUTING DEVICES INC.
+0000A8 STRATUS COMPUTER INC.
+0000A9 NETWORK SYSTEMS CORP.
+0000AA XEROX CORPORATION
+0000AB LOGIC MODELING CORPORATION
+0000AC CONWARE COMPUTER CONSULTING
+0000AD BRUKER INSTRUMENTS INC.
+0000AE DASSAULT ELECTRONIQUE
+0000AF NUCLEAR DATA INSTRUMENTATION
+0000B0 RND-RAD NETWORK DEVICES
+0000B1 ALPHA MICROSYSTEMS INC.
+0000B2 TELEVIDEO SYSTEMS, INC.
+0000B3 CIMLINC INCORPORATED
+0000B4 EDIMAX COMPUTER COMPANY
+0000B5 DATABILITY SOFTWARE SYS. INC.
+0000B6 MICRO-MATIC RESEARCH
+0000B7 DOVE COMPUTER CORPORATION
+0000B8 SEIKOSHA CO., LTD.
+0000B9 MCDONNELL DOUGLAS COMPUTER SYS
+0000BA SIIG, INC.
+0000BB TRI-DATA
+0000BC ALLEN-BRADLEY CO. INC.
+0000BD MITSUBISHI CABLE COMPANY
+0000BE THE NTI GROUP
+0000BF SYMMETRIC COMPUTER SYSTEMS
+0000C0 WESTERN DIGITAL CORPORATION
+0000C1 Madge Ltd.
+0000C2 INFORMATION PRESENTATION TECH.
+0000C3 HARRIS CORP COMPUTER SYS DIV
+0000C4 WATERS DIV. OF MILLIPORE
+0000C5 FARALLON COMPUTING/NETOPIA
+0000C6 EON SYSTEMS
+0000C7 ARIX CORPORATION
+0000C8 ALTOS COMPUTER SYSTEMS
+0000C9 EMULEX CORPORATION
+0000CA ARRIS International
+0000CB COMPU-SHACK ELECTRONIC GMBH
+0000CC DENSAN CO., LTD.
+0000CD Allied Telesyn Research Ltd.
+0000CE MEGADATA CORP.
+0000CF HAYES MICROCOMPUTER PRODUCTS
+0000D0 DEVELCON ELECTRONICS LTD.
+0000D1 ADAPTEC INCORPORATED
+0000D2 SBE, INC.
+0000D3 WANG LABORATORIES INC.
+0000D4 PURE DATA LTD.
+0000D5 MICROGNOSIS INTERNATIONAL
+0000D6 PUNCH LINE HOLDING
+0000D7 DARTMOUTH COLLEGE
+0000D8 NOVELL, INC.
+0000D9 NIPPON TELEGRAPH & TELEPHONE
+0000DA ATEX
+0000DB BRITISH TELECOMMUNICATIONS PLC
+0000DC HAYES MICROCOMPUTER PRODUCTS
+0000DD TCL INCORPORATED
+0000DE CETIA
+0000DF BELL & HOWELL PUB SYS DIV
+0000E0 QUADRAM CORP.
+0000E1 GRID SYSTEMS
+0000E2 ACER TECHNOLOGIES CORP.
+0000E3 INTEGRATED MICRO PRODUCTS LTD
+0000E4 IN2 GROUPE INTERTECHNIQUE
+0000E5 SIGMEX LTD.
+0000E6 APTOR PRODUITS DE COMM INDUST
+0000E7 STAR GATE TECHNOLOGIES
+0000E8 ACCTON TECHNOLOGY CORP.
+0000E9 ISICAD, INC.
+0000EA UPNOD AB
+0000EB MATSUSHITA COMM. IND. CO. LTD.
+0000EC MICROPROCESS
+0000ED APRIL
+0000EE NETWORK DESIGNERS, LTD.
+0000EF KTI
+0000F0 SAMSUNG ELECTRONICS CO., LTD.
+0000F1 MAGNA COMPUTER CORPORATION
+0000F2 SPIDER COMMUNICATIONS
+0000F3 GANDALF DATA LIMITED
+0000F4 ALLIED TELESYN INTERNATIONAL
+0000F5 DIAMOND SALES LIMITED
+0000F6 APPLIED MICROSYSTEMS CORP.
+0000F7 YOUTH KEEP ENTERPRISE CO LTD
+0000F8 DIGITAL EQUIPMENT CORPORATION
+0000F9 QUOTRON SYSTEMS INC.
+0000FA MICROSAGE COMPUTER SYSTEMS INC
+0000FB RECHNER ZUR KOMMUNIKATION
+0000FC MEIKO
+0000FD HIGH LEVEL HARDWARE
+0000FE ANNAPOLIS MICRO SYSTEMS
+0000FF CAMTEC ELECTRONICS LTD.
+000100 EQUIP'TRANS
+000102 3COM CORPORATION
+000103 3COM CORPORATION
+000104 DVICO Co., Ltd.
+000105 BECKHOFF GmbH
+000106 Tews Datentechnik GmbH
+000107 Leiser GmbH
+000108 AVLAB Technology, Inc.
+000109 Nagano Japan Radio Co., Ltd.
+00010A CIS TECHNOLOGY INC.
+00010B Space CyberLink, Inc.
+00010C System Talks Inc.
+00010D CORECO, INC.
+00010E Bri-Link Technologies Co., Ltd
+00010F Nishan Systems, Inc.
+000110 Gotham Networks
+000111 iDigm Inc.
+000112 Shark Multimedia Inc.
+000113 OLYMPUS CORPORATION
+000114 KANDA TSUSHIN KOGYO CO., LTD.
+000115 EXTRATECH CORPORATION
+000116 Netspect Technologies, Inc.
+000117 CANAL +
+000118 EZ Digital Co., Ltd.
+000119 Action Controls Pty. Ltd.
+00011A EEH DataLink GmbH
+00011B Unizone Technologies, Inc.
+00011C Universal Talkware Corporation
+00011D Centillium Communications
+00011E Precidia Technologies, Inc.
+00011F RC Networks, Inc.
+000120 OSCILLOQUARTZ S.A.
+000121 Watchguard Technologies, Inc.
+000122 Trend Communications, Ltd.
+000123 DIGITAL ELECTRONICS CORP.
+000124 Acer Incorporated
+000125 YAESU MUSEN CO., LTD.
+000126 PAC Labs
+000127 The OPEN Group Limited
+000128 EnjoyWeb, Inc.
+000129 DFI Inc.
+00012A Telematica Sistems Inteligente
+00012B TELENET Co., Ltd.
+00012C Aravox Technologies, Inc.
+00012D Komodo Technology
+00012E PC Partner Ltd.
+00012F Twinhead International Corp
+000130 Extreme Networks
+000131 Detection Systems, Inc.
+000132 Dranetz - BMI
+000133 KYOWA Electronic Instruments C
+000134 SIG Positec Systems AG
+000135 KDC Corp.
+000136 CyberTAN Technology, Inc.
+000137 IT Farm Corporation
+000138 XAVi Technologies Corp.
+000139 Point Multimedia Systems
+00013A SHELCAD COMMUNICATIONS, LTD.
+00013B BNA SYSTEMS
+00013C TIW SYSTEMS
+00013D RiscStation Ltd.
+00013E Ascom Tateco AB
+00013F Neighbor World Co., Ltd.
+000140 Sendtek Corporation
+000141 CABLE PRINT
+000142 Cisco Systems, Inc.
+000143 Cisco Systems, Inc.
+000144 EMC Corporation
+000145 WINSYSTEMS, INC.
+000146 Tesco Controls, Inc.
+000147 Zhone Technologies
+000148 X-traWeb Inc.
+000149 T.D.T. Transfer Data Test GmbH
+00014A Sony Corporation
+00014B Ennovate Networks, Inc.
+00014C Berkeley Process Control
+00014D Shin Kin Enterprises Co., Ltd
+00014E WIN Enterprises, Inc.
+00014F LUMINOUS Networks, Inc.
+000150 GILAT COMMUNICATIONS, LTD.
+000151 Ensemble Communications
+000152 CHROMATEK INC.
+000153 ARCHTEK TELECOM CORPORATION
+000154 G3M Corporation
+000155 Promise Technology, Inc.
+000156 FIREWIREDIRECT.COM, INC.
+000157 SYSWAVE CO., LTD
+000158 Electro Industries/Gauge Tech
+000159 S1 Corporation
+00015A Digital Video Broadcasting
+00015B ITALTEL S.p.A/RF-UP-I
+00015C CADANT INC.
+00015D Sun Microsystems, Inc
+00015E BEST TECHNOLOGY CO., LTD.
+00015F DIGITAL DESIGN GmbH
+000160 ELMEX Co., LTD.
+000161 Meta Machine Technology
+000162 Cygnet Technologies, Inc.
+000163 Cisco Systems, Inc.
+000164 Cisco Systems, Inc.
+000165 AirSwitch Corporation
+000166 TC GROUP A/S
+000167 HIOKI E.E. CORPORATION
+000168 VITANA CORPORATION
+000169 Celestix Networks Pte Ltd.
+00016A ALITEC
+00016B LightChip, Inc.
+00016C FOXCONN
+00016D CarrierComm Inc.
+00016E Conklin Corporation
+00016F HAITAI ELECTRONICS CO., LTD.
+000170 ESE Embedded System Engineer'g
+000171 Allied Data Technologies
+000172 TechnoLand Co., LTD.
+000173 AMCC
+000174 CyberOptics Corporation
+000175 Radiant Communications Corp.
+000176 Orient Silver Enterprises
+000177 EDSL
+000178 MARGI Systems, Inc.
+000179 WIRELESS TECHNOLOGY, INC.
+00017A Chengdu Maipu Electric Industrial Co., Ltd.
+00017B Heidelberger Druckmaschinen AG
+00017C AG-E GmbH
+00017D ThermoQuest
+00017E ADTEK System Science Co., Ltd.
+00017F Experience Music Project
+000180 AOpen, Inc.
+000181 Nortel Networks
+000182 DICA TECHNOLOGIES AG
+000183 ANITE TELECOMS
+000184 SIEB & MEYER AG
+000185 Aloka Co., Ltd.
+000186 DISCH GmbH
+000187 i2SE GmbH
+000188 LXCO Technologies ag
+000189 Refraction Technology, Inc.
+00018A ROI COMPUTER AG
+00018B NetLinks Co., Ltd.
+00018C Mega Vision
+00018D AudeSi Technologies
+00018E Logitec Corporation
+00018F Kenetec, Inc.
+000190 SMK-M
+000191 SYRED Data Systems
+000192 Texas Digital Systems
+000193 Hanbyul Telecom Co., Ltd.
+000194 Capital Equipment Corporation
+000195 Sena Technologies, Inc.
+000196 Cisco Systems, Inc.
+000197 Cisco Systems, Inc.
+000198 Darim Vision
+000199 HeiSei Electronics
+00019A LEUNIG GmbH
+00019B Kyoto Microcomputer Co., Ltd.
+00019C JDS Uniphase Inc.
+00019D E-Control Systems, Inc.
+00019E ESS Technology, Inc.
+00019F Phonex Broadband
+0001A0 Infinilink Corporation
+0001A1 Mag-Tek, Inc.
+0001A2 Logical Co., Ltd.
+0001A3 GENESYS LOGIC, INC.
+0001A4 Microlink Corporation
+0001A5 Nextcomm, Inc.
+0001A6 Scientific-Atlanta Arcodan A/S
+0001A7 UNEX TECHNOLOGY CORPORATION
+0001A8 Welltech Computer Co., Ltd.
+0001A9 BMW AG
+0001AA Airspan Communications, Ltd.
+0001AB Main Street Networks
+0001AC Sitara Networks, Inc.
+0001AD Coach Master International d.b.a. CMI Worldwide, Inc.
+0001AE Trex Enterprises
+0001AF Motorola Computer Group
+0001B0 Fulltek Technology Co., Ltd.
+0001B1 General Bandwidth
+0001B2 Digital Processing Systems, Inc.
+0001B3 Precision Electronic Manufacturing
+0001B4 Wayport, Inc.
+0001B5 Turin Networks, Inc.
+0001B6 SAEJIN T&M Co., Ltd.
+0001B7 Centos, Inc.
+0001B8 Netsensity, Inc.
+0001B9 SKF Condition Monitoring
+0001BA IC-Net, Inc.
+0001BB Frequentis
+0001BC Brains Corporation
+0001BD Peterson Electro-Musical Products, Inc.
+0001BE Gigalink Co., Ltd.
+0001BF Teleforce Co., Ltd.
+0001C0 CompuLab, Ltd.
+0001C1 Vitesse Semiconductor Corporation
+0001C2 ARK Research Corp.
+0001C3 Acromag, Inc.
+0001C4 NeoWave, Inc.
+0001C5 Simpler Networks
+0001C6 Quarry Technologies
+0001C7 Cisco Systems, Inc.
+0001C8 THOMAS CONRAD CORP.
+0001C8 CONRAD CORP.
+0001C9 Cisco Systems, Inc.
+0001CA Geocast Network Systems, Inc.
+0001CB EVR
+0001CC Japan Total Design Communication Co., Ltd.
+0001CD ARtem
+0001CE Custom Micro Products, Ltd.
+0001CF Alpha Data Parallel Systems, Ltd.
+0001D0 VitalPoint, Inc.
+0001D1 CoNet Communications, Inc.
+0001D2 MacPower Peripherals, Ltd.
+0001D3 PAXCOMM, Inc.
+0001D4 Leisure Time, Inc.
+0001D5 HAEDONG INFO & COMM CO., LTD
+0001D6 MAN Roland Druckmaschinen AG
+0001D7 F5 Networks, Inc.
+0001D8 Teltronics, Inc.
+0001D9 Sigma, Inc.
+0001DA WINCOMM Corporation
+0001DB Freecom Technologies GmbH
+0001DC Activetelco
+0001DD Avail Networks
+0001DE Trango Systems, Inc.
+0001DF ISDN Communications, Ltd.
+0001E0 Fast Systems, Inc.
+0001E1 Kinpo Electronics, Inc.
+0001E2 Ando Electric Corporation
+0001E3 Siemens AG
+0001E4 Sitera, Inc.
+0001E5 Supernet, Inc.
+0001E6 Hewlett-Packard Company
+0001E7 Hewlett-Packard Company
+0001E8 Force10 Networks, Inc.
+0001E9 Litton Marine Systems B.V.
+0001EA Cirilium Corp.
+0001EB C-COM Corporation
+0001EC Ericsson Group
+0001ED SETA Corp.
+0001EE Comtrol Europe, Ltd.
+0001EF Camtel Technology Corp.
+0001F0 Tridium, Inc.
+0001F1 Innovative Concepts, Inc.
+0001F2 Mark of the Unicorn, Inc.
+0001F3 QPS, Inc.
+0001F4 Enterasys Networks
+0001F5 ERIM S.A.
+0001F6 Association of Musical Electronics Industry
+0001F7 Image Display Systems, Inc.
+0001F8 Adherent Systems, Ltd.
+0001F9 TeraGlobal Communications Corp.
+0001FA HOROSCAS
+0001FB DoTop Technology, Inc.
+0001FC Keyence Corporation
+0001FD Digital Voice Systems, Inc.
+0001FE DIGITAL EQUIPMENT CORPORATION
+0001FF Data Direct Networks, Inc.
+000200 Net & Sys Co., Ltd.
+000201 IFM Electronic gmbh
+000202 Amino Communications, Ltd.
+000203 Woonsang Telecom, Inc.
+000204 Bodmann Industries Elektronik GmbH
+000205 Hitachi Denshi, Ltd.
+000206 Telital R&D Denmark A/S
+000207 VisionGlobal Network Corp.
+000208 Unify Networks, Inc.
+000209 Shenzhen SED Information Technology Co., Ltd.
+00020A Gefran Spa
+00020B Native Networks, Inc.
+00020C Metro-Optix
+00020D Micronpc.com
+00020E Laurel Networks, Inc.
+00020F AATR
+000210 Fenecom
+000211 Nature Worldwide Technology Corp.
+000212 SierraCom
+000213 S.D.E.L.
+000214 DTVRO
+000215 Cotas Computer Technology A/B
+000216 Cisco Systems, Inc.
+000217 Cisco Systems, Inc.
+000218 Advanced Scientific Corp
+000219 Paralon Technologies
+00021A Zuma Networks
+00021B Kollmorgen-Servotronix
+00021C Network Elements, Inc.
+00021D Data General Communication Ltd.
+00021E SIMTEL S.R.L.
+00021F Aculab PLC
+000220 Canon Aptex, Inc.
+000221 DSP Application, Ltd.
+000222 Chromisys, Inc.
+000223 ClickTV
+000224 Lantern Communications, Inc.
+000225 Certus Technology, Inc.
+000226 XESystems, Inc.
+000227 ESD GmbH
+000228 Necsom, Ltd.
+000229 Adtec Corporation
+00022A Asound Electronic
+00022B Tamura Electric Works, Ltd.
+00022C ABB Bomem, Inc.
+00022D Agere Systems
+00022E TEAC Corp. R& D
+00022F P-Cube, Ltd.
+000230 Intersoft Electronics
+000231 Ingersoll-Rand
+000232 Avision, Inc.
+000233 Mantra Communications, Inc.
+000234 Imperial Technology, Inc.
+000235 Paragon Networks International
+000236 INIT GmbH
+000237 Cosmo Research Corp.
+000238 Serome Technology, Inc.
+000239 Visicom
+00023A ZSK Stickmaschinen GmbH
+00023B Redback Networks
+00023C Creative Technology, Ltd.
+00023D NuSpeed, Inc.
+00023E Selta Telematica S.p.a
+00023F Compal Electronics, Inc.
+000240 Seedek Co., Ltd.
+000241 Amer.com
+000242 Videoframe Systems
+000243 Raysis Co., Ltd.
+000244 SURECOM Technology Co.
+000245 Lampus Co, Ltd.
+000246 All-Win Tech Co., Ltd.
+000247 Great Dragon Information Technology (Group) Co., Ltd.
+000248 Pilz GmbH & Co.
+000249 Aviv Infocom Co, Ltd.
+00024A Cisco Systems, Inc.
+00024B Cisco Systems, Inc.
+00024C SiByte, Inc.
+00024D Mannesman Dematic Colby Pty. Ltd.
+00024E Datacard Group
+00024F IPM Datacom S.R.L.
+000250 Geyser Networks, Inc.
+000251 Soma Networks, Inc.
+000252 Carrier Corporation
+000253 Televideo, Inc.
+000254 WorldGate
+000255 IBM Corporation
+000256 Alpha Processor, Inc.
+000257 Microcom Corp.
+000258 Flying Packets Communications
+000259 Tsann Kuen China (Shanghai)Enterprise Co., Ltd. IT Group
+00025A Catena Networks
+00025B Cambridge Silicon Radio
+00025C SCI Systems (Kunshan) Co., Ltd.
+00025D Calix Networks
+00025E High Technology Ltd
+00025F Nortel Networks
+000260 Accordion Networks, Inc.
+000261 i3 Micro Technology AB
+000262 Soyo Group Soyo Com Tech Co., Ltd
+000263 UPS Manufacturing SRL
+000264 AudioRamp.com
+000265 Virditech Co. Ltd.
+000266 Thermalogic Corporation
+000267 NODE RUNNER, INC.
+000268 Harris Government Communications
+000269 Nadatel Co., Ltd
+00026A Cocess Telecom Co., Ltd.
+00026B BCM Computers Co., Ltd.
+00026C Philips CFT
+00026D Adept Telecom
+00026E NeGeN Access, Inc.
+00026F Senao International Co., Ltd.
+000270 Crewave Co., Ltd.
+000271 Vpacket Communications
+000272 CC&C Technologies, Inc.
+000273 Coriolis Networks
+000274 Tommy Technologies Corp.
+000275 SMART Technologies, Inc.
+000276 Primax Electronics Ltd.
+000277 Cash Systemes Industrie
+000278 Samsung Electro-Mechanics Co., Ltd.
+000279 Control Applications, Ltd.
+00027A IOI Technology Corporation
+00027B Amplify Net, Inc.
+00027C Trilithic, Inc.
+00027D Cisco Systems, Inc.
+00027E Cisco Systems, Inc.
+00027F ask-technologies.com
+000280 Mu Net, Inc.
+000281 Madge Ltd.
+000282 ViaClix, Inc.
+000283 Spectrum Controls, Inc.
+000284 AREVA T&D
+000285 Riverstone Networks
+000286 Occam Networks
+000287 Adapcom
+000288 GLOBAL VILLAGE COMMUNICATION
+000289 DNE Technologies
+00028A Ambit Microsystems Corporation
+00028B VDSL Systems OY
+00028C Micrel-Synergy Semiconductor
+00028D Movita Technologies, Inc.
+00028E Rapid 5 Networks, Inc.
+00028F Globetek, Inc.
+000290 Woorigisool, Inc.
+000291 Open Network Co., Ltd.
+000292 Logic Innovations, Inc.
+000293 Solid Data Systems
+000294 Tokyo Sokushin Co., Ltd.
+000295 IP.Access Limited
+000296 Lectron Co,. Ltd.
+000297 C-COR.net
+000298 Broadframe Corporation
+000299 Apex, Inc.
+00029A Storage Apps
+00029B Kreatel Communications AB
+00029C 3COM
+00029D Merix Corp.
+00029E Information Equipment Co., Ltd.
+00029F L-3 Communication Aviation Recorders
+0002A0 Flatstack Ltd.
+0002A1 World Wide Packets
+0002A2 Hilscher GmbH
+0002A3 ABB Power Automation
+0002A4 AddPac Technology Co., Ltd.
+0002A5 Compaq Computer Corporation
+0002A6 Effinet Systems Co., Ltd.
+0002A7 Vivace Networks
+0002A8 Air Link Technology
+0002A9 RACOM, s.r.o.
+0002AA PLcom Co., Ltd.
+0002AB CTC Union Technologies Co., Ltd.
+0002AC 3PAR data
+0002AD Pentax Corpotation
+0002AE Scannex Electronics Ltd.
+0002AF TeleCruz Technology, Inc.
+0002B0 Hokubu Communication & Industrial Co., Ltd.
+0002B1 Anritsu, Ltd.
+0002B2 Cablevision
+0002B3 Intel Corporation
+0002B4 DAPHNE
+0002B5 Avnet, Inc.
+0002B6 Acrosser Technology Co., Ltd.
+0002B7 Watanabe Electric Industry Co., Ltd.
+0002B8 WHI KONSULT AB
+0002B9 Cisco Systems, Inc.
+0002BA Cisco Systems, Inc.
+0002BB Continuous Computing
+0002BC LVL 7 Systems, Inc.
+0002BD Bionet Co., Ltd.
+0002BE Totsu Engineering, Inc.
+0002BF dotRocket, Inc.
+0002C0 Bencent Tzeng Industry Co., Ltd.
+0002C1 Innovative Electronic Designs, Inc.
+0002C2 Net Vision Telecom
+0002C3 Arelnet Ltd.
+0002C4 Vector International BUBA
+0002C5 Evertz Microsystems Ltd.
+0002C6 Data Track Technology PLC
+0002C7 ALPS ELECTRIC Co., Ltd.
+0002C8 Technocom Communications Technology (pte) Ltd
+0002C9 Mellanox Technologies
+0002CA EndPoints, Inc.
+0002CB TriState Ltd.
+0002CC M.C.C.I
+0002CD TeleDream, Inc.
+0002CE FoxJet, Inc.
+0002CF ZyGate Communications, Inc.
+0002D0 Comdial Corporation
+0002D1 Vivotek, Inc.
+0002D2 Workstation AG
+0002D3 NetBotz, Inc.
+0002D4 PDA Peripherals, Inc.
+0002D5 ACR
+0002D6 NICE Systems
+0002D7 EMPEG Ltd
+0002D8 BRECIS Communications Corporation
+0002D9 Reliable Controls
+0002DA ExiO Communications, Inc.
+0002DB NETSEC
+0002DC Fujitsu General Limited
+0002DD Bromax Communications, Ltd.
+0002DE Astrodesign, Inc.
+0002DF Net Com Systems, Inc.
+0002E0 ETAS GmbH
+0002E1 Integrated Network Corporation
+0002E2 NDC Infared Engineering
+0002E3 LITE-ON Communications, Inc.
+0002E4 JC HYUN Systems, Inc.
+0002E5 Timeware Ltd.
+0002E6 Gould Instrument Systems, Inc.
+0002E7 CAB GmbH & Co KG
+0002E8 E.D.&A.
+0002E9 CS Systemes De Securite - C3S
+0002EA Focus Enhancements
+0002EB Pico Communications
+0002EC Maschoff Design Engineering
+0002ED DXO Telecom Co., Ltd.
+0002EE Nokia Danmark A/S
+0002EF CCC Network Systems Group Ltd.
+0002F0 AME Optimedia Technology Co., Ltd.
+0002F1 Pinetron Co., Ltd.
+0002F2 eDevice, Inc.
+0002F3 Media Serve Co., Ltd.
+0002F4 PCTEL, Inc.
+0002F5 VIVE Synergies, Inc.
+0002F6 Equipe Communications
+0002F7 ARM
+0002F8 SEAKR Engineering, Inc.
+0002F9 Mimos Semiconductor SDN BHD
+0002FA DX Antenna Co., Ltd.
+0002FB Baumuller Aulugen-Systemtechnik GmbH
+0002FC Cisco Systems, Inc.
+0002FD Cisco Systems, Inc.
+0002FE Viditec, Inc.
+0002FF Handan BroadInfoCom
+000300 NetContinuum, Inc.
+000301 Avantas Networks Corporation
+000302 Charles Industries, Ltd.
+000303 JAMA Electronics Co., Ltd.
+000304 Pacific Broadband Communications
+000305 Smart Network Devices GmbH
+000306 Fusion In Tech Co., Ltd.
+000307 Secure Works, Inc.
+000308 AM Communications, Inc.
+000309 Texcel Technology PLC
+00030A Argus Technologies
+00030B Hunter Technology, Inc.
+00030C Telesoft Technologies Ltd.
+00030D Uniwill Computer Corp.
+00030E Core Communications Co., Ltd.
+00030F Digital China (Shanghai) Networks Ltd.
+000310 Link Evolution Corp.
+000311 Micro Technology Co., Ltd.
+000312 TR-Systemtechnik GmbH
+000313 Access Media SPA
+000314 Teleware Network Systems
+000315 Cidco Incorporated
+000316 Nobell Communications, Inc.
+000317 Merlin Systems, Inc.
+000318 Cyras Systems, Inc.
+000319 Infineon AG
+00031A Beijing Broad Telecom Ltd., China
+00031B Cellvision Systems, Inc.
+00031C Svenska Hardvarufabriken AB
+00031D Taiwan Commate Computer, Inc.
+00031E Optranet, Inc.
+00031F Condev Ltd.
+000320 Xpeed, Inc.
+000321 Reco Research Co., Ltd.
+000322 IDIS Co., Ltd.
+000323 Cornet Technology, Inc.
+000324 SANYO Multimedia Tottori Co., Ltd.
+000325 Arima Computer Corp.
+000326 Iwasaki Information Systems Co., Ltd.
+000327 ACT'L
+000328 Mace Group, Inc.
+000329 F3, Inc.
+00032A UniData Communication Systems, Inc.
+00032B GAI Datenfunksysteme GmbH
+00032C ABB Industrie AG
+00032D IBASE Technology, Inc.
+00032E Scope Information Management, Ltd.
+00032F Global Sun Technology, Inc.
+000330 Imagenics, Co., Ltd.
+000331 Cisco Systems, Inc.
+000332 Cisco Systems, Inc.
+000333 Digitel Co., Ltd.
+000334 Newport Electronics
+000335 Mirae Technology
+000336 Zetes Technologies
+000337 Vaone, Inc.
+000338 Oak Technology
+000339 Eurologic Systems, Ltd.
+00033A Silicon Wave, Inc.
+00033B TAMI Tech Co., Ltd.
+00033C Daiden Co., Ltd.
+00033D ILSHin Lab
+00033E Tateyama System Laboratory Co., Ltd.
+00033F BigBand Networks, Ltd.
+000340 Floware Wireless Systems, Ltd.
+000341 Axon Digital Design
+000342 Nortel Networks
+000343 Martin Professional A/S
+000344 Tietech.Co., Ltd.
+000345 Routrek Networks Corporation
+000346 Hitachi Kokusai Electric, Inc.
+000347 Intel Corporation
+000348 Norscan Instruments, Ltd.
+000349 Vidicode Datacommunicatie B.V.
+00034A RIAS Corporation
+00034B Nortel Networks
+00034C Shanghai DigiVision Technology Co., Ltd.
+00034D Chiaro Networks, Ltd.
+00034E Pos Data Company, Ltd.
+00034F Sur-Gard Security
+000350 BTICINO SPA
+000351 Diebold, Inc.
+000352 Colubris Networks
+000353 Mitac, Inc.
+000354 Fiber Logic Communications
+000355 TeraBeam Internet Systems
+000356 Wincor Nixdorf GmbH & Co KG
+000357 Intervoice-Brite, Inc.
+000358 iCable System Co., Ltd.
+000359 DigitalSis
+00035A Photron Limited
+00035B BridgeWave Communications
+00035C Saint Song Corp.
+00035D Bosung Hi-Net Co., Ltd.
+00035E Metropolitan Area Networks, Inc.
+00035F Prueftechnik Condition Monitoring GmbH & Co. KG
+000360 PAC Interactive Technology, Inc.
+000361 Widcomm, Inc.
+000362 Vodtel Communications, Inc.
+000363 Miraesys Co., Ltd.
+000364 Scenix Semiconductor, Inc.
+000365 Kira Information & Communications, Ltd.
+000366 ASM Pacific Technology
+000367 Jasmine Networks, Inc.
+000368 Embedone Co., Ltd.
+000369 Nippon Antenna Co., Ltd.
+00036A Mainnet, Ltd.
+00036B Cisco Systems, Inc.
+00036C Cisco Systems, Inc.
+00036D Runtop, Inc.
+00036E Nicon Systems (Pty) Limited
+00036F Telsey SPA
+000370 NXTV, Inc.
+000371 Acomz Networks Corp.
+000372 ULAN
+000373 Aselsan A.S
+000374 Hunter Watertech
+000375 NetMedia, Inc.
+000376 Graphtec Technology, Inc.
+000377 Gigabit Wireless
+000378 HUMAX Co., Ltd.
+000379 Proscend Communications, Inc.
+00037A Taiyo Yuden Co., Ltd.
+00037B IDEC IZUMI Corporation
+00037C Coax Media
+00037D Stellcom
+00037E PORTech Communications, Inc.
+00037F Atheros Communications, Inc.
+000380 SSH Communications Security Corp.
+000381 Ingenico International
+000382 A-One Co., Ltd.
+000383 Metera Networks, Inc.
+000384 AETA
+000385 Actelis Networks, Inc.
+000386 Ho Net, Inc.
+000387 Blaze Network Products
+000388 Fastfame Technology Co., Ltd.
+000389 Plantronics
+00038A America Online, Inc.
+00038B PLUS-ONE I&T, Inc.
+00038C Total Impact
+00038D PCS Revenue Control Systems, Inc.
+00038E Atoga Systems, Inc.
+00038F Weinschel Corporation
+000390 Digital Video Communications, Inc.
+000391 Advanced Digital Broadcast, Ltd.
+000392 Hyundai Teletek Co., Ltd.
+000393 Apple Computer, Inc.
+000394 Connect One
+000395 California Amplifier
+000396 EZ Cast Co., Ltd.
+000397 Watchfront Electronics
+000398 WISI
+000399 Dongju Informations & Communications Co., Ltd.
+00039A nSine, Ltd.
+00039B NetChip Technology, Inc.
+00039C OptiMight Communications, Inc.
+00039D BENQ CORPORATION
+00039E Tera System Co., Ltd.
+00039F Cisco Systems, Inc.
+0003A0 Cisco Systems, Inc.
+0003A1 HIPER Information & Communication, Inc.
+0003A2 Catapult Communications
+0003A3 MAVIX, Ltd.
+0003A4 Data Storage and Information Management
+0003A5 Medea Corporation
+0003A6 Traxit Technology, Inc.
+0003A7 Unixtar Technology, Inc.
+0003A8 IDOT Computers, Inc.
+0003A9 AXCENT Media AG
+0003AA Watlow
+0003AB Bridge Information Systems
+0003AC Fronius Schweissmaschinen
+0003AD Emerson Energy Systems AB
+0003AE Allied Advanced Manufacturing Pte, Ltd.
+0003AF Paragea Communications
+0003B0 Xsense Technology Corp.
+0003B1 Abbott Laboratories HPD
+0003B2 Radware
+0003B3 IA Link Systems Co., Ltd.
+0003B4 Macrotek International Corp.
+0003B5 Entra Technology Co.
+0003B6 QSI Corporation
+0003B7 ZACCESS Systems
+0003B8 NetKit Solutions, LLC
+0003B9 Hualong Telecom Co., Ltd.
+0003BA Sun Microsystems
+0003BB Signal Communications Limited
+0003BC COT GmbH
+0003BD OmniCluster Technologies, Inc.
+0003BE Netility
+0003BF Centerpoint Broadband Technologies, Inc.
+0003C0 RFTNC Co., Ltd.
+0003C1 Packet Dynamics Ltd
+0003C2 Solphone K.K.
+0003C3 Micronik Multimedia
+0003C4 Tomra Systems ASA
+0003C5 Mobotix AG
+0003C6 ICUE Systems, Inc.
+0003C7 hopf Elektronik GmbH
+0003C8 CML Emergency Services
+0003C9 TECOM Co., Ltd.
+0003CA MTS Systems Corp.
+0003CB Nippon Systems Development Co., Ltd.
+0003CC Momentum Computer, Inc.
+0003CD Clovertech, Inc.
+0003CE ETEN Technologies, Inc.
+0003CF Muxcom, Inc.
+0003D0 KOANKEISO Co., Ltd.
+0003D1 Takaya Corporation
+0003D2 Crossbeam Systems, Inc.
+0003D3 Internet Energy Systems, Inc.
+0003D4 Alloptic, Inc.
+0003D5 Advanced Communications Co., Ltd.
+0003D6 RADVision, Ltd.
+0003D7 NextNet Wireless, Inc.
+0003D8 iMPath Networks, Inc.
+0003D9 Secheron SA
+0003DA Takamisawa Cybernetics Co., Ltd.
+0003DB Apogee Electronics Corp.
+0003DC Lexar Media, Inc.
+0003DD Comark Corp.
+0003DE OTC Wireless
+0003DF Desana Systems
+0003E0 RadioFrame Networks, Inc.
+0003E1 Winmate Communication, Inc.
+0003E2 Comspace Corporation
+0003E3 Cisco Systems, Inc.
+0003E4 Cisco Systems, Inc.
+0003E5 Hermstedt SG
+0003E6 Entone Technologies, Inc.
+0003E7 Logostek Co. Ltd.
+0003E8 Wavelength Digital Limited
+0003E9 Akara Canada, Inc.
+0003EA Mega System Technologies, Inc.
+0003EB Atrica
+0003EC ICG Research, Inc.
+0003ED Shinkawa Electric Co., Ltd.
+0003EE MKNet Corporation
+0003EF Oneline AG
+0003F0 Redfern Broadband Networks
+0003F1 Cicada Semiconductor, Inc.
+0003F2 Seneca Networks
+0003F3 Dazzle Multimedia, Inc.
+0003F4 NetBurner
+0003F5 Chip2Chip
+0003F6 Allegro Networks, Inc.
+0003F7 Plast-Control GmbH
+0003F8 SanCastle Technologies, Inc.
+0003F9 Pleiades Communications, Inc.
+0003FA TiMetra Networks
+0003FB Toko Seiki Company, Ltd.
+0003FC Intertex Data AB
+0003FD Cisco Systems, Inc.
+0003FE Cisco Systems, Inc.
+0003FF Microsoft Corporation
+000400 LEXMARK INTERNATIONAL, INC.
+000401 Osaki Electric Co., Ltd.
+000402 Nexsan Technologies, Ltd.
+000403 Nexsi Corporation
+000404 Makino Milling Machine Co., Ltd.
+000405 ACN Technologies
+000406 Fa. Metabox AG
+000407 Topcon Positioning Systems, Inc.
+000408 Sanko Electronics Co., Ltd.
+000409 Cratos Networks
+00040A Sage Systems
+00040B 3com Europe Ltd.
+00040C KANNO Work's Ltd.
+00040D Avaya, Inc.
+00040E AVM GmbH
+00040F Asus Network Technologies, Inc.
+000410 Spinnaker Networks, Inc.
+000411 Inkra Networks, Inc.
+000412 WaveSmith Networks, Inc.
+000413 SNOM Technology AG
+000414 Umezawa Musen Denki Co., Ltd.
+000415 Rasteme Systems Co., Ltd.
+000416 Parks S/A Comunicacoes Digitais
+000417 ELAU AG
+000418 Teltronic S.A.U.
+000419 Fibercycle Networks, Inc.
+00041A ines GmbH
+00041B Digital Interfaces Ltd.
+00041C ipDialog, Inc.
+00041D Corega of America
+00041E Shikoku Instrumentation Co., Ltd.
+00041F Sony Computer Entertainment, Inc.
+000420 Slim Devices, Inc.
+000421 Ocular Networks
+000422 Gordon Kapes, Inc.
+000423 Intel Corporation
+000424 TMC s.r.l.
+000425 Atmel Corporation
+000426 Autosys
+000427 Cisco Systems, Inc.
+000428 Cisco Systems, Inc.
+000429 Pixord Corporation
+00042A Wireless Networks, Inc.
+00042B IT Access Co., Ltd.
+00042C Minet, Inc.
+00042D Sarian Systems, Ltd.
+00042E Netous Technologies, Ltd.
+00042F International Communications Products, Inc.
+000430 Netgem
+000431 GlobalStreams, Inc.
+000432 Voyetra Turtle Beach, Inc.
+000433 Cyberboard A/S
+000434 Accelent Systems, Inc.
+000435 Comptek International, Inc.
+000436 ELANsat Technologies, Inc.
+000437 Powin Information Technology, Inc.
+000438 Nortel Networks
+000439 Rosco Entertainment Technology, Inc.
+00043A Intelligent Telecommunications, Inc.
+00043B Lava Computer Mfg., Inc.
+00043C SONOS Co., Ltd.
+00043D INDEL AG
+00043E Telencomm
+00043F Electronic Systems Technology, Inc.
+000440 cyberPIXIE, Inc.
+000441 Half Dome Systems, Inc.
+000442 NACT
+000443 Agilent Technologies, Inc.
+000444 Western Multiplex Corporation
+000445 LMS Skalar Instruments GmbH
+000446 CYZENTECH Co., Ltd.
+000447 Acrowave Systems Co., Ltd.
+000448 Polaroid Professional Imaging
+000449 Mapletree Networks
+00044A iPolicy Networks, Inc.
+00044B NVIDIA
+00044C JENOPTIK
+00044D Cisco Systems, Inc.
+00044E Cisco Systems, Inc.
+00044F Leukhardt Systemelektronik GmbH
+000450 DMD Computers SRL
+000451 Medrad, Inc.
+000452 RocketLogix, Inc.
+000453 YottaYotta, Inc.
+000454 Quadriga UK
+000455 ANTARA.net
+000456 PipingHot Networks
+000457 Universal Access Technology, Inc.
+000458 Fusion X Co., Ltd.
+000459 Veristar Corporation
+00045A The Linksys Group, Inc.
+00045B Techsan Electronics Co., Ltd.
+00045C Mobiwave Pte Ltd
+00045D BEKA Elektronik
+00045E PolyTrax Information Technology AG
+00045F Evalue Technology, Inc.
+000460 Knilink Technology, Inc.
+000461 EPOX Computer Co., Ltd.
+000462 DAKOS Data & Communication Co., Ltd.
+000463 Bosch Security Systems
+000464 Fantasma Networks, Inc.
+000465 i.s.t isdn-support technik GmbH
+000466 ARMITEL Co.
+000467 Wuhan Research Institute of MII
+000468 Vivity, Inc.
+000469 Innocom, Inc.
+00046A Navini Networks
+00046B Palm Wireless, Inc.
+00046C Cyber Technology Co., Ltd.
+00046D Cisco Systems, Inc.
+00046E Cisco Systems, Inc.
+00046F Digitel S/A Industria Eletronica
+000470 ipUnplugged AB
+000471 IPrad
+000472 Telelynx, Inc.
+000473 Photonex Corporation
+000474 LEGRAND
+000475 3 Com Corporation
+000476 3 Com Corporation
+000477 Scalant Systems, Inc.
+000478 G. Star Technology Corporation
+000479 Radius Co., Ltd.
+00047A AXXESSIT ASA
+00047B Schlumberger
+00047C Skidata AG
+00047D Pelco
+00047E NKF Electronics
+00047F Chr. Mayr GmbH & Co. KG
+000480 Foundry Networks, Inc.
+000481 Econolite Control Products, Inc.
+000482 Medialogic Corp.
+000483 Deltron Technology, Inc.
+000484 Amann GmbH
+000485 PicoLight
+000486 ITTC, University of Kansas
+000487 Cogency Semiconductor, Inc.
+000488 Eurotherm Controls
+000489 YAFO Networks, Inc.
+00048A Temia Vertriebs GmbH
+00048B Poscon Corporation
+00048C Nayna Networks, Inc.
+00048D Tone Commander Systems, Inc.
+00048E Ohm Tech Labs, Inc.
+00048F TD Systems Corp.
+000490 Optical Access
+000491 Technovision, Inc.
+000492 Hive Internet, Ltd.
+000493 Tsinghua Unisplendour Co., Ltd.
+000494 Breezecom, Ltd.
+000495 Tejas Networks
+000496 Extreme Networks
+000497 MacroSystem Digital Video AG
+000499 Chino Corporation
+00049A Cisco Systems, Inc.
+00049B Cisco Systems, Inc.
+00049C Surgient Networks, Inc.
+00049D Ipanema Technologies
+00049E Wirelink Co., Ltd.
+00049F Metrowerks
+0004A0 Verity Instruments, Inc.
+0004A1 Pathway Connectivity
+0004A2 L.S.I. Japan Co., Ltd.
+0004A3 Microchip Technology, Inc.
+0004A4 NetEnabled, Inc.
+0004A5 Barco Projection Systems NV
+0004A6 SAF Tehnika Ltd.
+0004A7 FabiaTech Corporation
+0004A8 Broadmax Technologies, Inc.
+0004A9 SandStream Technologies, Inc.
+0004AA Jetstream Communications
+0004AB Comverse Network Systems, Inc.
+0004AC IBM CORP.
+0004AD Malibu Networks
+0004AE Liquid Metronics
+0004AF Digital Fountain, Inc.
+0004B0 ELESIGN Co., Ltd.
+0004B1 Signal Technology, Inc.
+0004B2 ESSEGI SRL
+0004B3 Videotek, Inc.
+0004B4 CIAC
+0004B5 Equitrac Corporation
+0004B6 Stratex Networks, Inc.
+0004B7 AMB i.t. Holding
+0004B8 Kumahira Co., Ltd.
+0004B9 S.I. Soubou, Inc.
+0004BA KDD Media Will Corporation
+0004BB Bardac Corporation
+0004BC Giantec, Inc.
+0004BD Motorola BCS
+0004BE OptXCon, Inc.
+0004BF VersaLogic Corp.
+0004C0 Cisco Systems, Inc.
+0004C1 Cisco Systems, Inc.
+0004C2 Magnipix, Inc.
+0004C3 CASTOR Informatique
+0004C4 Allen & Heath Limited
+0004C5 ASE Technologies, USA
+0004C6 Yamaha Motor Co., Ltd.
+0004C7 NetMount
+0004C8 LIBA Maschinenfabrik GmbH
+0004C9 Micro Electron Co., Ltd.
+0004CA FreeMs Corp.
+0004CB Tdsoft Communication, Ltd.
+0004CC Peek Traffic B.V.
+0004CD Informedia Research Group
+0004CE Patria Ailon
+0004CF Seagate Technology
+0004D0 Softlink s.r.o.
+0004D1 Drew Technologies, Inc.
+0004D2 Adcon Telemetry GmbH
+0004D3 Toyokeiki Co., Ltd.
+0004D4 Proview Electronics Co., Ltd.
+0004D5 Hitachi Communication Systems, Inc.
+0004D6 Takagi Industrial Co., Ltd.
+0004D7 Omitec Instrumentation Ltd.
+0004D8 IPWireless, Inc.
+0004D9 Titan Electronics, Inc.
+0004DA Relax Technology, Inc.
+0004DB Tellus Group Corp.
+0004DC Nortel Networks
+0004DD Cisco Systems, Inc.
+0004DE Cisco Systems, Inc.
+0004DF Teracom Telematica Ltda.
+0004E0 Procket Networks
+0004E1 Infinior Microsystems
+0004E2 SMC Networks, Inc.
+0004E3 Accton Technology Corp.
+0004E4 Daeryung Ind., Inc.
+0004E5 Glonet Systems, Inc.
+0004E6 Banyan Network Private Limited
+0004E7 Lightpointe Communications, Inc
+0004E8 IER, Inc.
+0004E9 Infiniswitch Corporation
+0004EA Hewlett-Packard Company
+0004EB Paxonet Communications, Inc.
+0004EC Memobox SA
+0004ED Billion Electric Co., Ltd.
+0004EE Lincoln Electric Company
+0004EF Polestar Corp.
+0004F0 International Computers, Ltd
+0004F1 WhereNet
+0004F2 Circa Communications, Ltd.
+0004F3 FS FORTH-SYSTEME GmbH
+0004F4 Infinite Electronics Inc.
+0004F5 SnowShore Networks, Inc.
+0004F6 Amphus
+0004F7 Omega Band, Inc.
+0004F8 QUALICABLE TV Industria E Com., Ltda
+0004F9 Xtera Communications, Inc.
+0004FA MIST Inc.
+0004FB Commtech, Inc.
+0004FC Stratus Computer (DE), Inc.
+0004FD Japan Control Engineering Co., Ltd.
+0004FE Pelago Networks
+0004FF Acronet Co., Ltd.
+000500 Cisco Systems, Inc.
+000501 Cisco Systems, Inc.
+000502 APPLE COMPUTER
+000503 ICONAG
+000504 Naray Information & Communication Enterprise
+000505 Systems Integration Solutions, Inc.
+000506 Reddo Networks AB
+000507 Fine Appliance Corp.
+000508 Inetcam, Inc.
+000509 AVOC Nishimura Ltd.
+00050A ICS Spa
+00050B SICOM Systems, Inc.
+00050C Network Photonics, Inc.
+00050D Midstream Technologies, Inc.
+00050E 3ware, Inc.
+00050F Tanaka S/S Ltd.
+000510 Infinite Shanghai Communication Terminals Ltd.
+000511 Complementary Technologies Ltd
+000512 MeshNetworks, Inc.
+000513 VTLinx Multimedia Systems, Inc.
+000514 KDT Systems Co., Ltd.
+000515 Nuark Co., Ltd.
+000516 SMART Modular Technologies
+000517 Shellcomm, Inc.
+000518 Jupiters Technology
+000519 Siemens Building Technologies AG,
+00051A 3Com Europe Ltd.
+00051B Magic Control Technology Corporation
+00051C Xnet Technology Corp.
+00051D Airocon, Inc.
+00051E Brocade Communications Systems, Inc.
+00051F Taijin Media Co., Ltd.
+000520 Smartronix, Inc.
+000521 Control Microsystems
+000522 LEA*D Corporation, Inc.
+000523 AVL List GmbH
+000524 BTL System (HK) Limited
+000525 Puretek Industrial Co., Ltd.
+000526 IPAS GmbH
+000527 SJ Tek Co. Ltd
+000528 New Focus, Inc.
+000529 Shanghai Broadan Communication Technology Co., Ltd
+00052A Ikegami Tsushinki Co., Ltd.
+00052B HORIBA, Ltd.
+00052C Supreme Magic Corporation
+00052D Zoltrix International Limited
+00052E Cinta Networks
+00052F Leviton Voice and Data
+000530 Andiamo Systems, Inc.
+000531 Cisco Systems, Inc.
+000532 Cisco Systems, Inc.
+000533 Sanera Systems, Inc.
+000534 Northstar Engineering Ltd.
+000535 Chip PC Ltd.
+000536 Danam Communications, Inc.
+000537 Nets Technology Co., Ltd.
+000538 Merilus, Inc.
+000539 A Brand New World in Sweden AB
+00053A Willowglen Services Pte Ltd
+00053B Harbour Networks Ltd., Co. Beijing
+00053C Xircom
+00053D Agere Systems
+00053E KID Systeme GmbH
+00053F VisionTek, Inc.
+000540 FAST Corporation
+000541 Advanced Systems Co., Ltd.
+000542 Otari, Inc.
+000543 IQ Wireless GmbH
+000544 Valley Technologies, Inc.
+000545 Internet Photonics
+000546 KDDI Network & Solultions Inc.
+000547 Starent Networks
+000548 Disco Corporation
+000549 Salira Optical Network Systems
+00054A Ario Data Networks, Inc.
+00054B Micro Innovation AG
+00054C RF Innovations Pty Ltd
+00054D Brans Technologies, Inc.
+00054E Philips Components
+000550 Vcomms Limited
+000551 F & S Elektronik Systeme GmbH
+000552 Xycotec Computer GmbH
+000553 DVC Company, Inc.
+000554 Rangestar Wireless
+000555 Japan Cash Machine Co., Ltd.
+000556 360 Systems
+000557 Agile TV Corporation
+000558 Synchronous, Inc.
+000559 Intracom S.A.
+00055A Power Dsine Ltd.
+00055B Charles Industries, Ltd.
+00055C Kowa Company, Ltd.
+00055D D-Link Systems, Inc.
+00055E Cisco Systems, Inc.
+00055F Cisco Systems, Inc.
+000560 LEADER COMM.CO., LTD
+000561 nac Image Technology, Inc.
+000562 Digital View Limited
+000563 J-Works, Inc.
+000564 Tsinghua Bitway Co., Ltd.
+000565 Tailyn Communication Company Ltd.
+000566 Secui.com Corporation
+000567 Etymonic Design, Inc.
+000568 Piltofish Networks AB
+000569 VMWARE, Inc.
+00056A Heuft Systemtechnik GmbH
+00056B C.P. Technology Co., Ltd.
+00056C Hung Chang Co., Ltd.
+00056D Pacific Corporation
+00056E National Enhance Technology, Inc.
+00056F Innomedia Technologies Pvt. Ltd.
+000570 Baydel Ltd.
+000571 Seiwa Electronics Co.
+000572 Deonet Co., Ltd.
+000573 Cisco Systems, Inc.
+000574 Cisco Systems, Inc.
+000575 CDS-Electronics BV
+000576 NSM Technology Ltd.
+000577 SM Information & Communication
+000579 Universal Control Solution Corp.
+00057A Hatteras Networks
+00057B Chung Nam Electronic Co., Ltd.
+00057C RCO Security AB
+00057D Sun Communications, Inc.
+00057E Eckelmann Steuerungstechnik GmbH
+00057F Acqis Technology
+000580 Fibrolan Ltd.
+000581 Snell & Wilcox Ltd.
+000582 ClearCube Technology
+000583 ImageCom Limited
+000584 AbsoluteValue Systems, Inc.
+000585 Juniper Networks, Inc.
+000586 Lucent Technologies
+000587 Locus, Incorporated
+000588 Sensoria Corp.
+000589 National Datacomputer
+00058A Netcom Co., Ltd.
+00058B IPmental, Inc.
+00058C Opentech Inc.
+00058D Lynx Photonic Networks, Inc.
+00058E Flextronics International GmbH & Co. Nfg. KG
+00058F CLCsoft co.
+000590 Swissvoice Ltd.
+000591 Active Silicon Ltd.
+000592 Pultek Corp.
+000593 Grammar Engine Inc.
+000594 IXXAT Automation GmbH
+000595 Alesis Corporation
+000596 Genotech Co., Ltd.
+000597 Eagle Traffic Control Systems
+000598 CRONOS S.r.l.
+000599 DRS Test and Energy Management or DRS-TEM
+00059A Cisco Systems, Inc.
+00059B Cisco Systems, Inc.
+00059C Kleinknecht GmbH, Ing. Buero
+00059D Daniel Computing Systems, Inc.
+00059E Zinwell Corporation
+00059F Yotta Networks, Inc.
+0005A0 MOBILINE Kft.
+0005A1 Zenocom
+0005A2 CELOX Networks
+0005A3 QEI, Inc.
+0005A4 Lucid Voice Ltd.
+0005A5 KOTT
+0005A6 Extron Electronics
+0005A7 Hyperchip, Inc.
+0005A8 WYLE ELECTRONICS
+0005A9 Princeton Networks, Inc.
+0005AA Moore Industries International Inc.
+0005AB Cyber Fone, Inc.
+0005AC Northern Digital, Inc.
+0005AD Topspin Communications, Inc.
+0005AE Mediaport USA
+0005AF InnoScan Computing A/S
+0005B0 Korea Computer Technology Co., Ltd.
+0005B1 ASB Technology BV
+0005B2 Medison Co., Ltd.
+0005B3 Asahi-Engineering Co., Ltd.
+0005B4 Aceex Corporation
+0005B5 Broadcom Technologies
+0005B6 INSYS Microelectronics GmbH
+0005B7 Arbor Technology Corp.
+0005B8 Electronic Design Associates, Inc.
+0005B9 Airvana, Inc.
+0005BA Area Netwoeks, Inc.
+0005BB Myspace AB
+0005BC Resorsys Ltd.
+0005BD ROAX BV
+0005BE Kongsberg Seatex AS
+0005BF JustEzy Technology, Inc.
+0005C0 Digital Network Alacarte Co., Ltd.
+0005C1 A-Kyung Motion, Inc.
+0005C2 Soronti, Inc.
+0005C3 Pacific Instruments, Inc.
+0005C4 Telect, Inc.
+0005C5 Flaga HF
+0005C6 Triz Communications
+0005C7 I/F-COM A/S
+0005C8 VERYTECH
+0005C9 LG Innotek
+0005CA Hitron Technology, Inc.
+0005CB ROIS Technologies, Inc.
+0005CC Sumtel Communications, Inc.
+0005CD Denon, Ltd.
+0005CE Prolink Microsystems Corporation
+0005CF Thunder River Technologies, Inc.
+0005D0 Solinet Systems
+0005D1 Metavector Technologies
+0005D2 DAP Technologies
+0005D3 eProduction Solutions, Inc.
+0005D4 FutureSmart Networks, Inc.
+0005D5 Speedcom Wireless
+0005D6 Titan Wireless
+0005D7 Vista Imaging, Inc.
+0005D8 Arescom, Inc.
+0005D9 Techno Valley, Inc.
+0005DA Apex Automationstechnik
+0005DB Nentec GmbH
+0005DC Cisco Systems, Inc.
+0005DD Cisco Systems, Inc.
+0005DE Gi Fone Korea, Inc.
+0005DF Electronic Innovation, Inc.
+0005E0 Empirix Corp.
+0005E1 Trellis Photonics, Ltd.
+0005E2 Creativ Network Technologies
+0005E3 LightSand Communications, Inc.
+0005E4 Red Lion Controls L.P.
+0005E5 Renishaw PLC
+0005E6 Egenera, Inc.
+0005E7 Netrake Corp.
+0005E8 TurboWave, Inc.
+0005E9 Unicess Network, Inc.
+0005EA Rednix
+0005EB Blue Ridge Networks, Inc.
+0005EC Mosaic Systems Inc.
+0005ED Technikum Joanneum GmbH
+0005EE BEWATOR Group
+0005EF ADOIR Digital Technology
+0005F0 SATEC
+0005F1 Vrcom, Inc.
+0005F2 Power R, Inc.
+0005F3 Weboyn
+0005F4 System Base Co., Ltd.
+0005F5 OYO Geospace Corp.
+0005F6 Young Chang Co. Ltd.
+0005F7 Analog Devices, Inc.
+0005F8 Real Time Access, Inc.
+0005F9 TOA Corporation
+0005FA IPOptical, Inc.
+0005FB ShareGate, Inc.
+0005FC Schenck Pegasus Corp.
+0005FD PacketLight Networks Ltd.
+0005FE Traficon N.V.
+0005FF SNS Solutions, Inc.
+000600 Toshiba Teli Corporation
+000601 Otanikeiki Co., Ltd.
+000602 Cirkitech Electronics Co.
+000603 Baker Hughes Inc.
+000604 @Track Communications, Inc.
+000605 Inncom International, Inc.
+000606 RapidWAN, Inc.
+000607 Omni Directional Control Technology Inc.
+000608 At-Sky SAS
+000609 Crossport Systems
+00060A Blue2space
+00060B Paceline Systems Corporation
+00060C Melco Industries, Inc.
+00060D Wave7 Optics
+00060E IGYS Systems, Inc.
+00060F Narad Networks Inc
+000610 Abeona Networks Inc
+000611 Zeus Wireless, Inc.
+000612 Accusys, Inc.
+000613 Kawasaki Microelectronics Incorporated
+000614 Prism Holdings
+000615 Kimoto Electric Co., Ltd.
+000616 Tel Net Co., Ltd.
+000617 Redswitch Inc.
+000618 DigiPower Manufacturing Inc.
+000619 Connection Technology Systems
+00061A Zetari Inc.
+00061B Portable Systems, IBM Japan Co, Ltd
+00061C Hoshino Metal Industries, Ltd.
+00061D MIP Telecom, Inc.
+00061E Maxan Systems
+00061F Vision Components GmbH
+000620 Serial System Ltd.
+000621 Hinox, Co., Ltd.
+000622 Chung Fu Chen Yeh Enterprise Corp.
+000623 MGE UPS Systems France
+000624 Gentner Communications Corp.
+000625 The Linksys Group, Inc.
+000626 MWE GmbH
+000627 Uniwide Technologies, Inc.
+000628 Cisco Systems, Inc.
+000629 IBM CORPORATION
+00062A Cisco Systems, Inc.
+00062B INTRASERVER TECHNOLOGY
+00062C Network Robots, Inc.
+00062D TouchStar Technologies, L.L.C.
+00062E Aristos Logic Corp.
+00062F Pivotech Systems Inc.
+000630 Adtranz Sweden
+000631 Optical Solutions, Inc.
+000632 Mesco Engineering GmbH
+000633 Smiths Heimann Biometric Systems
+000634 GTE Airfone Inc.
+000635 PacketAir Networks, Inc.
+000636 Jedai Broadband Networks
+000637 Toptrend-Meta Information (ShenZhen) Inc.
+000638 Sungjin C&C Co., Ltd.
+000639 Newtec
+00063A Dura Micro, Inc.
+00063B Arcturus Networks, Inc.
+00063C NMI Electronics Ltd
+00063D Microwave Data Systems Inc.
+00063E Opthos Inc.
+00063F Everex Communications Inc.
+000640 White Rock Networks
+000641 ITCN
+000642 Genetel Systems Inc.
+000643 SONO Computer Co., Ltd.
+000644 NEIX Inc.
+000645 Meisei Electric Co. Ltd.
+000646 ShenZhen XunBao Network Technology Co Ltd
+000647 Etrali S.A.
+000648 Seedsware, Inc.
+000649 Quante
+00064A Honeywell Co., Ltd. (KOREA)
+00064B Alexon Co., Ltd.
+00064C Invicta Networks, Inc.
+00064D Sencore
+00064E Broad Net Technology Inc.
+00064F PRO-NETS Technology Corporation
+000650 Tiburon Networks, Inc.
+000651 Aspen Networks Inc.
+000652 Cisco Systems, Inc.
+000653 Cisco Systems, Inc.
+000654 Maxxio Technologies
+000655 Yipee, Inc.
+000656 Tactel AB
+000657 Market Central, Inc.
+000658 Helmut Fischer GmbH & Co. KG
+000659 EAL (Apeldoorn) B.V.
+00065A Strix Systems
+00065B Dell Computer Corp.
+00065C Malachite Technologies, Inc.
+00065D Heidelberg Web Systems
+00065E Photuris, Inc.
+00065F ECI Telecom - NGTS Ltd.
+000660 NADEX Co., Ltd.
+000661 NIA Home Technologies Corp.
+000662 MBM Technology Ltd.
+000663 Human Technology Co., Ltd.
+000664 Fostex Corporation
+000665 Sunny Giken, Inc.
+000666 Roving Networks
+000667 Tripp Lite
+000668 Vicon Industries Inc.
+000669 Datasound Laboratories Ltd
+00066A InfiniCon Systems, Inc.
+00066B Sysmex Corporation
+00066C Robinson Corporation
+00066D Compuprint S.P.A.
+00066E Delta Electronics, Inc.
+00066F Korea Data Systems
+000670 Upponetti Oy
+000671 Softing AG
+000672 Netezza
+000673 Optelecom, Inc.
+000674 Spectrum Control, Inc.
+000675 Banderacom, Inc.
+000676 Novra Technologies Inc.
+000677 SICK AG
+000678 Marantz Japan, Inc.
+000679 Konami Corporation
+00067A JMP Systems
+00067B Toplink C&C Corporation
+00067C CISCO SYSTEMS, INC.
+00067D Takasago Ltd.
+00067E WinCom Systems, Inc.
+00067F Rearden Steel Technologies
+000680 Card Access, Inc.
+000681 Goepel Electronic GmbH
+000682 Convedia
+000683 Bravara Communications, Inc.
+000684 Biacore AB
+000685 NetNearU Corporation
+000686 ZARDCOM Co., Ltd.
+000687 Omnitron Systems Technology, Inc.
+000688 Telways Communication Co., Ltd.
+000689 yLez Technologies Pte Ltd
+00068A NeuronNet Co. Ltd. R&D Center
+00068B AirRunner Technologies, Inc.
+00068C 3Com Corporation
+00068D SANgate Systems
+00068E HID Corporation
+00068F Telemonitor, Inc.
+000690 Euracom Communication GmbH
+000691 PT Inovacao
+000692 Intruvert Networks, Inc.
+000693 Flexus Computer Technology, Inc.
+000694 Mobillian Corporation
+000695 Ensure Technologies, Inc.
+000696 Advent Networks
+000697 R & D Center
+000698 egnite Software GmbH
+000699 Vida Design Co.
+00069A e & Tel
+00069B AVT Audio Video Technologies GmbH
+00069C Transmode Systems AB
+00069D Petards Mobile Intelligence
+00069E UNIQA, Inc.
+00069F Kuokoa Networks
+0006A0 Mx Imaging
+0006A1 Celsian Technologies, Inc.
+0006A2 Microtune, Inc.
+0006A3 Bitran Corporation
+0006A4 INNOWELL Corp.
+0006A5 PINON Corp.
+0006A6 Artistic Licence (UK) Ltd
+0006A7 Primarion
+0006A8 KC Technology, Inc.
+0006A9 Universal Instruments Corp.
+0006AA Miltope Corporation
+0006AB W-Link Systems, Inc.
+0006AC Intersoft Co.
+0006AD KB Electronics Ltd.
+0006AE Himachal Futuristic Communications Ltd
+0006B0 Comtech EF Data Corp.
+0006B1 Sonicwall
+0006B2 Linxtek Co.
+0006B3 Diagraph Corporation
+0006B4 Vorne Industries, Inc.
+0006B5 Luminent, Inc.
+0006B6 Nir-Or Israel Ltd.
+0006B7 TELEM GmbH
+0006B8 Bandspeed Pty Ltd
+0006B9 A5TEK Corp.
+0006BA Westwave Communications
+0006BB ATI Technologies Inc.
+0006BC Macrolink, Inc.
+0006BD BNTECHNOLOGY Co., Ltd.
+0006BE Baumer Optronic GmbH
+0006BF Accella Technologies Co., Ltd.
+0006C0 United Internetworks, Inc.
+0006C1 CISCO SYSTEMS, INC.
+0006C2 Smartmatic Corporation
+0006C3 Schindler Elevators Ltd.
+0006C4 Piolink Inc.
+0006C5 INNOVI Technologies Limited
+0006C6 lesswire AG
+0006C7 RFNET Technologies Pte Ltd (S)
+0006C8 Sumitomo Metal Micro Devices, Inc.
+0006C9 Technical Marketing Research, Inc.
+0006CA American Computer & Digital Components, Inc. (ACDC)
+0006CB Jotron Electronics A/S
+0006CC JMI Electronics Co., Ltd.
+0006CD Creo IL. Ltd.
+0006CE DATENO
+0006CF Thales Avionics In-Flight Systems, LLC
+0006D0 Elgar Electronics Corp.
+0006D1 Tahoe Networks, Inc.
+0006D2 Tundra Semiconductor Corp.
+0006D3 Alpha Telecom, Inc. U.S.A.
+0006D4 Interactive Objects, Inc.
+0006D5 Diamond Systems Corp.
+0006D6 Cisco Systems, Inc.
+0006D7 Cisco Systems, Inc.
+0006D8 Maple Optical Systems
+0006D9 IPM-Net S.p.A.
+0006DA ITRAN Communications Ltd.
+0006DB ICHIPS Co., Ltd.
+0006DC Syabas Technology (Amquest)
+0006DD AT & T Laboratories - Cambridge Ltd
+0006DE Flash Technology
+0006DF AIDONIC Corporation
+0006E0 MAT Co., Ltd.
+0006E1 Techno Trade s.a
+0006E2 Ceemax Technology Co., Ltd.
+0006E3 Quantitative Imaging Corporation
+0006E4 Citel Technologies Ltd.
+0006E5 Fujian Newland Computer Ltd. Co.
+0006E6 DongYang Telecom Co., Ltd.
+0006E7 Bit Blitz Communications Inc.
+0006E8 Optical Network Testing, Inc.
+0006E9 Intime Corp.
+0006EA ELZET80 Mikrocomputer GmbH&Co. KG
+0006EB Global Data
+0006EC M/A COM Private Radio System Inc.
+0006ED Inara Networks
+0006EE Shenyang Neu-era Information & Technology Stock Co., Ltd
+0006EF Maxxan Systems, Inc.
+0006F0 Digeo, Inc.
+0006F1 Optillion
+0006F2 Platys Communications
+0006F3 AcceLight Networks
+0006F4 Prime Electronics & Satellitics Inc.
+0006F9 Mitsui Zosen Systems Research Inc.
+0006FA IP SQUARE Co, Ltd.
+0006FB Hitachi Printing Solutions, Ltd.
+0006FC Fnet Co., Ltd.
+0006FD Comjet Information Systems Corp.
+0006FE Celion Networks, Inc.
+0006FF Sheba Systems Co., Ltd.
+000700 Zettamedia Korea
+000701 RACAL-DATACOM
+000702 Varian Medical Systems
+000703 CSEE Transport
+000705 Endress & Hauser GmbH & Co
+000706 Sanritz Corporation
+000707 Interalia Inc.
+000708 Bitrage Inc.
+000709 Westerstrand Urfabrik AB
+00070A Unicom Automation Co., Ltd.
+00070B Octal, SA
+00070C SVA-Intrusion.com Co. Ltd.
+00070D Cisco Systems Inc.
+00070E Cisco Systems Inc.
+00070F Fujant, Inc.
+000710 Adax, Inc.
+000711 Acterna
+000712 JAL Information Technology
+000713 IP One, Inc.
+000714 Brightcom
+000715 General Research of Electronics, Inc.
+000716 J & S Marine Ltd.
+000717 Wieland Electric GmbH
+000718 iCanTek Co., Ltd.
+000719 Mobiis Co., Ltd.
+00071A Finedigital Inc.
+00071B Position Technology Inc.
+00071C AT&T Fixed Wireless Services
+00071D Satelsa Sistemas Y Aplicaciones De Telecomunicaciones, S.A.
+00071E Tri-M Engineering / Nupak Dev. Corp.
+00071F European Systems Integration
+000720 Trutzschler GmbH & Co. KG
+000721 Formac Elektronik GmbH
+000722 Nielsen Media Research
+000723 ELCON Systemtechnik GmbH
+000724 Telemax Co., Ltd.
+000725 Bematech International Corp.
+000727 Zi Corporation (HK) Ltd.
+000728 Neo Telecom
+000729 Kistler Instrumente AG
+00072A Innovance Networks
+00072B Jung Myung Telecom Co., Ltd.
+00072C Fabricom
+00072D CNSystems
+00072E North Node AB
+00072F Instransa, Inc.
+000730 Hutchison OPTEL Telecom Technology Co., Ltd.
+000731 Spiricon, Inc.
+000732 AAEON Technology Inc.
+000733 DANCONTROL Engineering
+000734 ONStor, Inc.
+000735 Flarion Technologies, Inc.
+000736 Data Video Technologies Co., Ltd.
+000737 Soriya Co. Ltd.
+000738 Young Technology Co., Ltd.
+000739 Motion Media Technology Ltd.
+00073A Inventel Systemes
+00073B Tenovis GmbH & Co KG
+00073C Telecom Design
+00073D Nanjing Postel Telecommunications Co., Ltd.
+00073E China Great-Wall Computer Shenzhen Co., Ltd.
+00073F Woojyun Systec Co., Ltd.
+000740 Melco Inc.
+000741 Sierra Automated Systems
+000742 Current Technologies
+000743 Chelsio Communications
+000744 Unico, Inc.
+000745 Radlan Computer Communications Ltd.
+000746 Interlink BT, LLC
+000747 Mecalc
+000748 The Imaging Source Europe
+000749 CENiX Inc.
+00074A Carl Valentin GmbH
+00074B Daihen Corporation
+00074C Beicom Inc.
+00074D Zebra Technologies Corp.
+00074E Naughty boy co., Ltd.
+00074F Cisco Systems, Inc.
+000750 Cisco Systems, Inc.
+000751 m.u.t. - GmbH
+000752 Rhythm Watch Co., Ltd.
+000753 Beijing Qxcomm Technology Co., Ltd.
+000754 Xyterra Computing, Inc.
+000755 Lafon SA
+000756 Juyoung Telecom
+000757 Topcall International AG
+000758 Dragonwave
+000759 Boris Manufacturing Corp.
+00075A Air Products and Chemicals, Inc.
+00075B Gibson Guitars
+00075C ENCAD, Inc.
+00075D Celleritas Inc.
+00075E Pulsar Technologies, Inc.
+00075F VCS Video Communication Systems AG
+000760 TOMIS Information & Telecom Corp.
+000761 Logitech SA
+000762 Group Sense Limited
+000763 Sunniwell Cyber Tech. Co., Ltd.
+000764 YoungWoo Telecom Co. Ltd.
+000765 Jade Quantum Technologies, Inc.
+000766 Chou Chin Industrial Co., Ltd.
+000767 Yuxing Electronics Company Limited
+000768 Danfoss A/S
+000769 Italiana Macchi SpA
+00076A NEXTEYE Co., Ltd.
+00076B Stralfors AB
+00076C Daehanet, Inc.
+00076D Flexlight Networks
+00076E Sinetica Corporation Ltd.
+00076F Synoptics Limited
+000770 Locusnetworks Corporation
+000771 Embedded System Corporation
+000772 Alcatel Shanghai Bell Co., Ltd.
+000773 Ascom Powerline Communications Ltd.
+000774 GuangZhou Thinker Technology Co. Ltd.
+000775 Valence Semiconductor, Inc.
+000776 Federal APD
+000777 Motah Ltd.
+000778 GERSTEL GmbH & Co. KG
+000779 Sungil Telecom Co., Ltd.
+00077A Infoware System Co., Ltd.
+00077B Millimetrix Broadband Networks
+00077C OnTime Networks
+00077E Elrest GmbH
+00077F J Communications Co., Ltd.
+000780 Bluegiga Technologies OY
+000781 Itron Inc.
+000782 Nauticus Networks, Inc.
+000783 SynCom Network, Inc.
+000784 Cisco Systems Inc.
+000785 Cisco Systems Inc.
+000786 Wireless Networks Inc.
+000787 Idea System Co., Ltd.
+000788 Clipcomm, Inc.
+000789 Eastel Systems Corporation
+00078A Mentor Data System Inc.
+00078B Wegener Communications, Inc.
+00078C Elektronikspecialisten i Borlange AB
+00078D NetEngines Ltd.
+00078E Garz & Friche GmbH
+00078F Emkay Innovative Products
+000790 Tri-M Technologies (s) Limited
+000791 International Data Communications, Inc.
+000792 Suetron Electronic GmbH
+000793 Shin Satellite Public Company Limited
+000794 Simple Devices, Inc.
+000795 Elitegroup Computer System Co. (ECS)
+000796 LSI Systems, Inc.
+000797 Netpower Co., Ltd.
+000798 Selea SRL
+000799 Tipping Point Technologies, Inc.
+00079A SmartSight Networks Inc.
+00079B Aurora Networks
+00079C Golden Electronics Technology Co., Ltd.
+00079D Musashi Co., Ltd.
+00079E Ilinx Co., Ltd.
+00079F Action Digital Inc.
+0007A0 e-Watch Inc.
+0007A1 VIASYS Healthcare GmbH
+0007A2 Opteon Corporation
+0007A3 Ositis Software, Inc.
+0007A4 GN Netcom Ltd.
+0007A5 Y.D.K Co. Ltd.
+0007A6 Home Automation, Inc.
+0007A7 A-Z Inc.
+0007A8 Haier Group Technologies Ltd.
+0007A9 Novasonics
+0007AA Quantum Data Inc.
+0007AC Eolring
+0007AD Pentacon GmbH Foto-und Feinwerktechnik
+0007AE Layer N Networks
+0007AF N-Tron Corp.
+0007B0 Office Details, Inc.
+0007B1 Equator Technologies
+0007B2 Transaccess S.A.
+0007B3 Cisco Systems Inc.
+0007B4 Cisco Systems Inc.
+0007B5 Any One Wireless Ltd.
+0007B6 Telecom Technology Ltd.
+0007B7 Samurai Ind. Prods Eletronicos Ltda
+0007B8 American Predator Corp.
+0007B9 Ginganet Corporation
+0007BA Xebeo Communications, Inc.
+0007BB Candera Inc.
+0007BC Identix Inc.
+0007BD Radionet Ltd.
+0007BE DataLogic SpA
+0007BF Armillaire Technologies, Inc.
+0007C0 NetZerver Inc.
+0007C1 Overture Networks, Inc.
+0007C2 Netsys Telecom
+0007C3 Cirpack
+0007C4 JEAN Co. Ltd.
+0007C5 Gcom, Inc.
+0007C6 VDS Vosskuhler GmbH
+0007C7 Synectics Systems Limited
+0007C8 Brain21, Inc.
+0007C9 Technol Seven Co., Ltd.
+0007CA Creatix Polymedia Ges Fur Kommunikaitonssysteme
+0007CB Freebox SA
+0007CC Kaba Benzing GmbH
+0007CD NMTEL Co., Ltd.
+0007CE Cabletime Limited
+0007CF Anoto AB
+0007D0 Automat Engenharia de Automaoa Ltda.
+0007D1 Spectrum Signal Processing Inc.
+0007D2 Logopak Systeme
+0007D3 Stork Digital Imaging B.V.
+0007D4 Zhejiang Yutong Network Communication Co Ltd.
+0007D5 3e Technologies Int;., Inc.
+0007D6 Commil Ltd.
+0007D7 Caporis Networks AG
+0007D8 Hitron Systems Inc.
+0007D9 Splicecom
+0007DA Neuro Telecom Co., Ltd.
+0007DB Kirana Networks, Inc.
+0007DC Atek Co, Ltd.
+0007DD Cradle Technologies
+0007DE eCopilt AB
+0007DF Vbrick Systems Inc.
+0007E0 Palm Inc.
+0007E1 WIS Communications Co. Ltd.
+0007E2 Bitworks, Inc.
+0007E3 Navcom Technology, Inc.
+0007E4 SoftRadio Co., Ltd.
+0007E5 Coup Corporation
+0007E6 edgeflow Canada Inc.
+0007E7 FreeWave Technologies
+0007E8 St. Bernard Software
+0007E9 Intel Corporation
+0007EA Massana, Inc.
+0007EB Cisco Systems Inc.
+0007EC Cisco Systems Inc.
+0007ED Altera Corporation
+0007EE telco Informationssysteme GmbH
+0007EF Lockheed Martin Tactical Systems
+0007F0 LogiSync Corporation
+0007F1 TeraBurst Networks Inc.
+0007F2 IOA Corporation
+0007F3 Think Engine Networks
+0007F4 Eletex Co., Ltd.
+0007F5 Bridgeco Co AG
+0007F6 Qqest Software Systems
+0007F7 Galtronics
+0007F8 ITDevices, Inc.
+0007F9 Phonetics, Inc.
+0007FA ITT Co., Ltd.
+0007FB Giga Stream UMTS Technologies GmbH
+0007FC Adept Systems Inc.
+0007FD LANergy Ltd.
+0007FE Rigaku Corporation
+0007FF Gluon Networks
+000800 MULTITECH SYSTEMS, INC.
+000801 HighSpeed Surfing Inc.
+000802 Compaq Computer Corporation
+000803 Cos Tron
+000804 ICA Inc.
+000805 Techno-Holon Corporation
+000806 Raonet Systems, Inc.
+000807 Access Devices Limited
+000808 PPT Vision, Inc.
+000809 Systemonic AG
+00080A Espera-Werke GmbH
+00080B Birka BPA Informationssystem AB
+00080C VDA elettronica SrL
+00080D Toshiba
+00080E Motorola, BCS
+00080F Proximion Fiber Optics AB
+000810 Key Technology, Inc.
+000811 VOIX Corporation
+000812 GM-2 Corporation
+000813 Diskbank, Inc.
+000814 TIL Technologies
+000815 CATS Co., Ltd.
+000816 Bluetags A/S
+000817 EmergeCore Networks LLC
+000818 Pixelworks, Inc.
+000819 Banksys
+00081A Sanrad Intelligence Storage Communications (2000) Ltd.
+00081B Windigo Systems
+00081C @pos.com
+00081D Ipsil, Incorporated
+00081E Repeatit AB
+00081F Pou Yuen Tech Corp. Ltd.
+000820 Cisco Systems Inc.
+000821 Cisco Systems Inc.
+000822 InPro Comm
+000823 Texa Corp.
+000824 Promatek Industries Ltd.
+000825 Acme Packet
+000826 Colorado Med Tech
+000827 Pirelli Cables & Systems
+000828 Koei Engineering Ltd.
+000829 Aval Nagasaki Corporation
+00082A Powerwallz Network Security
+00082B Wooksung Electronics, Inc.
+00082C Homag AG
+00082D Indus Teqsite Private Limited
+00082E Multitone Electronics PLC
+00084E DivergeNet, Inc.
+00084F Qualstar Corporation
+000850 Arizona Instrument Corp.
+000851 Canadian Bank Note Company, Ltd.
+000852 Davolink Co. Inc.
+000853 Schleicher GmbH & Co. Relaiswerke KG
+000854 Netronix, Inc.
+000855 NASA-Goddard Space Flight Center
+000856 Gamatronic Electronic Industries Ltd.
+000857 Polaris Networks, Inc.
+000858 Novatechnology Inc.
+000859 ShenZhen Unitone Electronics Co., Ltd.
+00085A IntiGate Inc.
+00085B Hanbit Electronics Co., Ltd.
+00085C Shanghai Dare Technologies Co. Ltd.
+00085D Aastra
+00085E PCO AG
+00085F Picanol N.V.
+000860 LodgeNet Entertainment Corp.
+000861 SoftEnergy Co., Ltd.
+000862 NEC Eluminant Technologies, Inc.
+000863 Entrisphere Inc.
+000864 Fasy S.p.A.
+000865 JASCOM CO., LTD
+000866 DSX Access Systems, Inc.
+000867 Uptime Devices
+000868 PurOptix
+000869 Command-e Technology Co.,Ltd.
+00086A Industrie Technik IPS GmbH
+00086B MIPSYS
+00086C Plasmon LMS
+00086D Missouri FreeNet
+00086E Hyglo AB
+00086F Resources Computer Network Ltd.
+000870 Rasvia Systems, Inc.
+000871 NORTHDATA Co., Ltd.
+000872 Sorenson Technologies, Inc.
+000873 DAP Design B.V.
+000874 Dell Computer Corp.
+000875 Acorp Electronics Corp.
+000876 SDSystem
+000877 Liebert HIROSS S.p.A.
+000878 Benchmark Storage Innovations
+000879 CEM Corporation
+00087A Wipotec GmbH
+00087B RTX Telecom A/S
+00087C Cisco Systems, Inc.
+00087D Cisco Systems Inc.
+00087E Bon Electro-Telecom Inc.
+00087F SPAUN electronic GmbH & Co. KG
+000880 BroadTel Canada Communications inc.
+000881 DIGITAL HANDS CO.,LTD.
+000882 SIGMA CORPORATION
+000883 Hewlett-Packard Company
+000884 Index Braille AB
+000885 EMS Dr. Thomas Wuensche
+000886 Hansung Teliann, Inc.
+000887 Maschinenfabrik Reinhausen GmbH
+000888 OULLIM Information Technology Inc,.
+000889 Echostar Technologies Corp
+00088A Minds@Work
+00088B Tropic Networks Inc.
+00088C Quanta Network Systems Inc.
+00088D Sigma-Links Inc.
+00088E Nihon Computer Co., Ltd.
+00088F ADVANCED DIGITAL TECHNOLOGY
+000890 AVILINKS SA
+000891 Lyan Inc.
+000892 EM Solutions
+000894 InnoVISION Multimedia Ltd.
+000895 DIRC Technologie GmbH & Co.KG
+000896 Printronix, Inc.
+000897 Quake Technologies
+000898 Gigabit Optics Corporation
+000899 Netbind, Inc.
+00089A Alcatel Microelectronics
+00089B ICP Electronics Inc.
+00089C Elecs Industry Co., Ltd.
+00089D UHD-Elektronik
+00089E Beijing Enter-Net co.LTD
+00089F EFM Networks
+0008A0 Stotz Feinmesstechnik GmbH
+0008A1 CNet Technology Inc.
+0008A2 ADI Engineering, Inc.
+0008A3 Cisco Systems
+0008A4 Cisco Systems
+0008A5 Peninsula Systems Inc.
+0008A6 Multiware & Image Co., Ltd.
+0008A7 iLogic Inc.
+0008A8 Systec Co., Ltd.
+0008A9 SangSang Technology, Inc.
+0008AA KARAM
+0008AB EnerLinx.com, Inc.
+0008AD Toyo-Linx Co., Ltd.
+0008AE Packetfront
+0008AF Novatec Corporation
+0008B0 BKtel communications GmbH
+0008B1 ProQuent Systems
+0008B2 SHENZHEN COMPASS TECHNOLOGY DEVELOPMENT CO.,LTD
+0008B3 Fastwel
+0008B4 SYSPOL
+0008B5 TAI GUEN ENTERPRISE CO., LTD
+0008B6 RouteFree, Inc.
+0008B7 HIT Incorporated
+0008B8 E.F. Johnson
+0008B9 KAON MEDIA Co., Ltd.
+0008BA Erskine Systems Ltd
+0008BB NetExcell
+0008BC Ilevo AB
+0008BD TEPG-US
+0008BE XENPAK MSA Group
+0008BF Aptus Elektronik AB
+0008C0 ASA SYSTEMS
+0008C1 Avistar Communications Corporation
+0008C2 Cisco Systems
+0008C3 Contex A/S
+0008C4 Hikari Co.,Ltd.
+0008C5 Liontech Co., Ltd.
+0008C6 Philips Consumer Communications
+0008C7 COMPAQ COMPUTER CORPORATION
+0008C8 Soneticom, Inc.
+0008C9 TechniSat Digital GmbH
+0008CA TwinHan Technology Co.,Ltd
+0008CB Zeta Broadband Inc.
+0008CC Remotec, Inc.
+0008CD With-Net Inc
+0008CE IPMobileNet Inc.
+0008CF Nippon Koei Power Systems Co., Ltd.
+0008D0 Musashi Engineering Co., LTD.
+0008D1 KAREL INC.
+0008D2 ZOOM Networks Inc.
+0008D3 Hercules Technologies S.A.
+0008D4 IneoQuest Technologies, Inc
+0008D5 Vanguard Managed Solutions
+0008D6 HASSNET Inc.
+0008D7 HOW CORPORATION
+0008D8 Dowkey Microwave
+0008D9 Mitadenshi Co.,LTD
+0008DA SofaWare Technologies Ltd.
+0008DB Corrigent Systems
+0008DC Wiznet
+0008DD Telena Communications, Inc.
+0008DE 3UP Systems
+0008DF Alistel Inc.
+0008E0 ATO Technology Ltd.
+0008E1 Barix AG
+0008E2 Cisco Systems
+0008E3 Cisco Systems
+0008E4 Envenergy Inc
+0008E5 IDK Corporation
+0008E6 Littlefeet
+0008E7 SHI ControlSystems,Ltd.
+0008E8 Excel Master Ltd.
+0008E9 NextGig
+0008EA Motion Control Engineering, Inc
+0008EB ROMWin Co.,Ltd.
+0008EC Zonu, Inc.
+0008ED ST&T Instrument Corp.
+0008EE Logic Product Development
+0008EF DIBAL,S.A.
+0008F0 Next Generation Systems, Inc.
+0008F1 Voltaire
+0008F2 C&S Technology
+0008F3 WANY
+0008F4 Bluetake Technology Co., Ltd.
+0008F5 YESTECHNOLOGY Co.,Ltd.
+0008F6 SUMITOMO ELECTRIC HIGHTECHS.co.,ltd.
+0008F7 Hitachi Ltd, Semiconductor &amp; Integrated Circuits Gr
+0008F8 Guardall Ltd
+0008F9 Padcom, Inc.
+0008FA Karl E.Brinkmann GmbH
+0008FB SonoSite, Inc.
+0008FC Gigaphoton Inc.
+0008FD BlueKorea Co., Ltd.
+0008FE UNIK C&C Co.,Ltd.
+0008FF Trilogy Broadcast (Holdings) Ltd
+000900 TMT
+000901 Shenzhen Shixuntong Information & Technoligy Co
+000902 Redline Communications Inc.
+000903 Panasas, Inc
+000904 MONDIAL electronic
+000905 iTEC Technologies Ltd.
+000906 Esteem Networks
+000907 Chrysalis Development
+000908 VTech Technology Corp.
+000909 Telenor Connect A/S
+00090A SnedFar Technology Co., Ltd.
+00090B MTL Instruments PLC
+00090C Mayekawa Mfg. Co. Ltd.
+00090D LEADER ELECTRONICS CORP.
+00090E Helix Technology Inc.
+00090F Fortinet Inc.
+000910 Simple Access Inc.
+000911 Cisco Systems
+000912 Cisco Systems
+000914 COMPUTROLS INC.
+000915 CAS Corp.
+000916 Listman Home Technologies, Inc.
+000917 WEM Technology Inc
+000918 SAMSUNG TECHWIN CO.,LTD
+000919 MDS Gateways
+00091A Macat Optics & Electronics Co., Ltd.
+00091B Digital Generation Inc.
+00091C CacheVision, Inc
+00091D Proteam Computer Corporation
+00091E Firstech Technology Corp.
+00091F A&amp;D Co., Ltd.
+000920 EpoX COMPUTER CO.,LTD.
+000921 Planmeca Oy
+000922 Touchless Sensor Technology AG
+000923 Heaman System Co., Ltd
+000924 Telebau GmbH
+000925 VSN Systemen BV
+000926 YODA COMMUNICATIONS, INC.
+000927 TOYOKEIKI CO.,LTD.
+000928 Telecore Inc
+000929 Sanyo Industries (UK) Limited
+00092A MYTECS Co.,Ltd.
+00092B iQstor Networks, Inc.
+00092C Hitpoint Inc.
+00092D High Tech Computer, Corp.
+00092E B&Tech System Inc.
+00092F Akom Technology Corporation
+000930 AeroConcierge Inc.
+000931 Future Internet, Inc.
+000932 Omnilux
+000933 OPTOVALLEY Co. Ltd.
+000934 Dream-Multimedia-Tv GmbH
+000935 Sandvine Incorporated
+000936 Ipetronik GmbH & Co.KG
+000937 Inventec Appliance Corp
+000938 Allot Communications
+000939 ShibaSoku Co.,Ltd.
+00093A Molex Fiber Optics
+00093B HYUNDAI NETWORKS INC.
+00093C Jacques Technologies P/L
+00093D Newisys,Inc.
+00093E C&I Technologies
+00093F Double-Win Enterpirse CO., LTD
+000940 AGFEO GmbH & Co. KG
+000941 Allied Telesis K.K.
+000942 CRESCO, LTD.
+000943 Cisco Systems
+000944 Cisco Systems
+000945 Palmmicro Communications Inc
+000946 Cluster Labs GmbH
+000947 Aztek, Inc.
+000948 Vista Control Systems, Corp.
+000949 Glyph Technologies Inc.
+00094A Homenet Communications
+00094B FillFactory NV
+00094C Communication Weaver Co.,Ltd.
+00094D Braintree Communications Pty Ltd
+00094E BARTECH SYSTEMS INTERNATIONAL, INC
+00094F elmegt GmbH & Co. KG
+000950 Independent Storage Corporation
+000951 Apogee Instruments, Inc
+000952 Auerswald GmbH & Co. KG
+000953 Linkage System Integration Co.Ltd.
+000954 AMiT spol. s. r. o.
+000955 Young Generation International Corp.
+000956 Network Systems Group, Ltd. (NSG)
+000957 Supercaller, Inc.
+000958 INTELNET S.A.
+000959 Sitecsoft
+00095A RACEWOOD TECHNOLOGY
+00095B Netgear, Inc.
+00095C Philips Medical Systems - Cardiac and Monitoring Systems (CM
+00095D Dialogue Technology Corp.
+00095E Masstech Group Inc.
+00095F Telebyte, Inc.
+000960 YOZAN Inc.
+000961 Switchgear and Instrumentation Ltd
+000962 Filetrac AS
+000963 Dominion Lasercom Inc.
+000964 Hi-Techniques
+000966 Thales Navigation
+000967 Tachyon, Inc
+000968 TECHNOVENTURE, INC.
+000969 Meret Optical Communications
+00096A Cloverleaf Communications Inc.
+00096B IBM Corporation
+00096C Imedia Semiconductor Corp.
+00096D Powernet Technologies Corp.
+00096E GIANT ELECTRONICS LTD.
+00096F Beijing Zhongqing Elegant Tech. Corp.,Limited
+000970 Vibration Research Corporation
+000971 Time Management, Inc.
+000972 Securebase,Inc
+000973 Lenten Technology Co., Ltd.
+000974 Innopia Technologies, Inc.
+000975 fSONA Communications Corporation
+000976 Datasoft ISDN Systems GmbH
+000977 Brunner Elektronik AG
+000978 AIJI System Co., Ltd.
+000979 Advanced Television Systems Committee, Inc.
+00097A Louis Design Labs.
+00097B Cisco Systems
+00097C Cisco Systems
+00097D SecWell Networks Oy
+00097E IMI TECHNOLOGY CO., LTD
+00097F Vsecure 2000 LTD.
+000980 Power Zenith Inc.
+000981 Newport Networks
+000982 Loewe Opta GmbH
+000983 Gvision Incorporated
+000984 MyCasa Network Inc.
+000985 Auto Telecom Company
+000986 Metalink LTD.
+000987 NISHI NIPPON ELECTRIC WIRE & CABLE CO.,LTD.
+000988 Nudian Electron Co., Ltd.
+000989 VividLogic Inc.
+00098A EqualLogic Inc
+00098B Entropic Communications, Inc.
+00098C Possio AB
+00098D DCT Ltd (Digital Communication Technologies Ltd)
+00098E ipcas GmbH
+00098F Cetacean Networks
+000990 ACKSYS Communications & systems
+000991 GE Fanuc Automation Manufacturing, Inc.
+000992 InterEpoch Technology,INC.
+000993 Visteon Corporation
+000994 Cronyx Engineering
+000995 Castle Technology Ltd
+000996 RDI
+000997 Nortel Networks
+000998 Capinfo Company Limited
+000999 CP GEORGES RENAULT
+00099A ELMO COMPANY, LIMITED
+00099B Western Telematic Inc.
+00099C Naval Research Laboratory
+00099D Haliplex Communications
+00099E Testech, Inc.
+00099F VIDEX INC.
+0009A0 Microtechno Corporation
+0009A1 Telewise Communications, Inc.
+0009A2 Interface Co., Ltd.
+0009A3 Leadfly Techologies Corp. Ltd.
+0009A4 HARTEC Corporation
+0009A5 HANSUNG ELETRONIC INDUSTRIES DEVELOPMENT CO., LTD
+0009A6 Ignis Optics, Inc.
+0009A7 Bang & Olufsen A/S
+0009A8 Eastmode Pte Ltd
+0009A9 Ikanos Communications
+0009AA Data Comm for Business, Inc.
+0009AB Netcontrol Oy
+0009AC LANVOICE
+0009AD HYUNDAI SYSCOMM, INC.
+0009AE OKANO ELECTRIC CO.,LTD
+0009AF e-generis
+0009B0 Onkyo Corporation
+0009B1 Kanematsu Electronics, Ltd.
+0009B2 L&F Inc.
+0009B3 MCM Systems Ltd
+0009B4 KISAN TELECOM CO., LTD.
+0009B5 3J Tech. Co., Ltd.
+0009B6 Cisco Systems
+0009B7 Cisco Systems
+0009B8 Entise Systems
+0009B9 Action Imaging Solutions
+0009BA MAKU Informationstechik GmbH
+0009BB MathStar, Inc.
+0009BC Digital Safety Technologies Inc.
+0009BD Epygi Technologies, Ltd.
+0009BE Mamiya-OP Co.,Ltd.
+0009BF Nintendo Co.,Ltd.
+0009C0 6WIND
+0009C1 PROCES-DATA A/S
+0009C3 NETAS
+0009C4 Medicore Co., Ltd
+0009C5 KINGENE Technology Corporation
+0009C6 Visionics Corporation
+0009C7 Movistec
+0009C8 SINAGAWA TSUSHIN KEISOU SERVICE
+0009C9 BlueWINC Co., Ltd.
+0009CA iMaxNetworks(Shenzhen)Limited.
+0009CB HBrain
+0009CC Moog GmbH
+0009CD HUDSON SOFT CO.,LTD.
+0009CE SpaceBridge Semiconductor Corp.
+0009CF iAd GmbH
+0009D0 Versatel Networks
+0009D1 SERANOA NETWORKS INC
+0009D2 Mai Logic Inc.
+0009D3 Western DataCom Co., Inc.
+0009D4 Transtech Networks
+0009D5 Signal Communication, Inc.
+0009D6 KNC One GmbH
+0009D7 DC Security Products
+0009D9 Neoscale Systems, Inc
+0009DA Control Module Inc.
+0009DB eSpace
+0009DC Galaxis Technology AG
+0009DD Mavin Technology Inc.
+0009DE Samjin Information & Communications Co., Ltd.
+0009DF Vestel Komunikasyon Sanayi ve Ticaret A.S.
+0009E0 XEMICS S.A.
+0009E1 Gemtek Technology Co., Ltd.
+0009E2 Sinbon Electronics Co., Ltd.
+0009E3 Angel Iglesias S.A.
+0009E4 K Tech Infosystem Inc.
+0009E5 Hottinger Baldwin Messtechnik GmbH
+0009E6 Cyber Switching Inc.
+0009E7 ADC Techonology
+0009E8 Cisco Systems
+0009E9 Cisco Systems
+0009EA YEM Inc.
+0009EB HuMANDATA LTD.
+0009EC Daktronics, Inc.
+0009ED CipherOptics
+0009EE MEIKYO ELECTRIC CO.,LTD
+0009EF Vocera Communications
+0009F0 Shimizu Technology Inc.
+0009F1 Yamaki Electric Corporation
+0009F2 Cohu, Inc., Electronics Division
+0009F3 WELL Communication Corp.
+0009F4 Alcon Laboratories, Inc.
+0009F5 Emerson Network Power Co.,Ltd
+0009F6 Shenzhen Eastern Digital Tech Ltd.
+0009F7 SED, a division of Calian
+0009F8 UNIMO TECHNOLOGY CO., LTD.
+0009F9 ART JAPAN CO., LTD.
+0009FB Philips Medizinsysteme Boeblingen GmbH
+0009FC IPFLEX Inc.
+0009FD Ubinetics Limited
+0009FE Daisy Technologies, Inc.
+0009FF X.net 2000 GmbH
+000A00 Mediatek Corp.
+000A01 SOHOware, Inc.
+000A02 ANNSO CO., LTD.
+000A03 ENDESA SERVICIOS, S.L.
+000A04 3Com Europe Ltd
+000A05 Widax Corp.
+000A06 Teledex LLC
+000A07 WebWayOne Ltd
+000A08 ALPINE ELECTRONICS, INC.
+000A09 TaraCom Integrated Products, Inc.
+000A0A SUNIX Co., Ltd.
+000A0B Sealevel Systems, Inc.
+000A0C Scientific Research Corporation
+000A0D MergeOptics GmbH
+000A0E Invivo Research Inc.
+000A0F Ilryung Telesys, Inc
+000A10 FAST media integrations AG
+000A11 ExPet Technologies, Inc
+000A12 Azylex Technology, Inc
+000A13 Silent Witness
+000A14 TECO a.s.
+000A15 Silicon Data, Inc
+000A16 Lassen Research
+000A17 NESTAR COMMUNICATIONS, INC
+000A18 Vichel Inc.
+000A19 Valere Power, Inc.
+000A1A Imerge Ltd
+000A1B Stream Labs
+000A1C Bridge Information Co., Ltd.
+000A1D Optical Communications Products Inc.
+000A1E Red-M (Communications) Limited
+000A1F ART WARE Telecommunication Co., Ltd.
+000A20 SVA Networks, Inc.
+000A21 Integra Telecom Co. Ltd
+000A22 Amperion Inc
+000A23 Parama Networks Inc
+000A24 Octave Communications
+000A25 CERAGON NETWORKS
+000A26 CEIA S.p.A.
+000A27 Apple Computer, Inc.
+000A28 Motorola
+000A29 Pan Dacom Networking AG
+000A2A QSI Systems Inc.
+000A2B Etherstuff
+000A2C Active Tchnology Corporation
+000A2E MAPLE NETWORKS CO., LTD
+000A2F Artnix Inc.
+000A30 Johnson Controls-ASG
+000A31 HCV Wireless
+000A32 Xsido Corporation
+000A33 Sierra Logic, Inc.
+000A34 Identicard Systems Incorporated
+000A35 Xilinx
+000A36 Synelec Telecom Multimedia
+000A37 Procera Networks, Inc.
+000A38 Netlock Technologies, Inc.
+000A39 LoPA Information Technology
+000A3A J-THREE INTERNATIONAL Holding Co., Ltd.
+000A3B GCT Semiconductor, Inc
+000A3C Enerpoint Ltd.
+000A3D Elo Sistemas Eletronicos S.A.
+000A3E EADS Telecom
+000A3F Data East Corporation
+000A40 Crown Audio
+000A41 Cisco Systems
+000A42 Cisco Systems
+000A43 Chunghwa Telecom Co., Ltd.
+000A44 Avery Dennison Deutschland GmbH
+000A45 Audio-Technica Corp.
+000A46 ARO Controls SAS
+000A47 Allied Vision Technologies
+000A48 Albatron Technology
+000A49 Acopia Networks
+000A4A Targa Systems Ltd.
+000A4B DataPower Technology, Inc.
+000A4C Molecular Devices Corporation
+000A4D Noritz Corporation
+000A4E UNITEK Electronics INC.
+000A4F Brain Boxes Limited
+000A50 REMOTEK CORPORATION
+000A51 GyroSignal Technology Co., Ltd.
+000A52 Venitek Co. Ltd.
+000A53 Intronics, Incorporated
+000A54 Laguna Hills, Inc.
+000A55 MARKEM Corporation
+000A56 HITACHI Maxell Ltd.
+000A57 Hewlett-Packard Company - Standards
+000A58 Ingenieur-Buero Freyer & Siegel
+000A59 HW server
+000A5A GreenNET Technologies Co.,Ltd.
+000A5B Power-One as
+000A5C Carel s.p.a.
+000A5D PUC Founder (MSC) Berhad
+000A5E 3COM Corporation
+000A5F almedio inc.
+000A60 Autostar Technology Pte Ltd
+000A61 Cellinx Systems Inc.
+000A62 Crinis Networks, Inc.
+000A63 DHD GmbH
+000A64 Eracom Technologies
+000A65 GentechMedia.co.,ltd.
+000A66 MITSUBISHI ELECTRIC SYSTEM & SERVICE CO.,LTD.
+000A67 OngCorp
+000A68 SolarFlare Communications, Inc.
+000A69 SUNNY bell Technology Co., Ltd.
+000A6A SVM Microwaves s.r.o.
+000A6B Tadiran Telecom Business Systems LTD
+000A6C Walchem Corporation
+000A6D EKS Elektronikservice GmbH
+000A6E Broadcast Technology Limited
+000A6F ZyFLEX Technologies Inc
+000A70 MPLS Forum
+000A71 Avrio Technologies, Inc
+000A72 SimpleTech, Inc.
+000A73 Scientific Atlanta
+000A74 Manticom Networks Inc.
+000A75 Cat Electronics
+000A76 Beida Jade Bird Huaguang Technology Co.,Ltd
+000A77 Bluewire Technologies LLC
+000A78 OLITEC
+000A79 corega K.K.
+000A7A Kyoritsu Electric Co., Ltd.
+000A7B Cornelius Consult
+000A7C Tecton Ltd
+000A7D Valo, Inc.
+000A7E The Advantage Group
+000A7F Teradon Industries, Inc
+000A80 Telkonet Inc.
+000A81 TEIMA Audiotex S.L.
+000A82 TATSUTA SYSTEM ELECTRONICS CO.,LTD.
+000A83 SALTO SYSTEMS S.L.
+000A84 Rainsun Enterprise Co., Ltd.
+000A85 PLAT'C2,Inc
+000A86 Lenze
+000A87 Integrated Micromachines Inc.
+000A88 InCypher S.A.
+000A89 Creval Systems, Inc.
+000A8A Cisco Systems
+000A8B Cisco Systems
+000A8C Guardware Systems Ltd.
+000A8D EUROTHERM LIMITED
+000A8E Invacom Ltd
+000A8F Aska International Inc.
+000A90 Bayside Interactive, Inc.
+000A91 HemoCue AB
+000A92 Presonus Corporation
+000A93 W2 Networks, Inc.
+000A94 ShangHai cellink CO., LTD
+000A95 Apple Computer, Inc.
+000A96 MEWTEL TECHNOLOGY INC.
+000A97 SONICblue, Inc.
+000A98 M+F Gwinner GmbH & Co
+000A99 Dataradio Inc.
+000A9A Aiptek International Inc
+000A9B Towa Meccs Corporation
+000A9C Server Technology, Inc.
+000A9D King Young Technology Co. Ltd.
+000A9E BroadWeb Corportation
+000A9F Pannaway Technologies, Inc.
+000AA0 Cedar Point Communications
+000AA1 V V S Limited
+000AA2 SYSTEK INC.
+000AA3 SHIMAFUJI ELECTRIC CO.,LTD.
+000AA4 SHANGHAI SURVEILLANCE TECHNOLOGY CO,LTD
+000AA5 MAXLINK INDUSTRIES LIMITED
+000AA6 Hochiki Corporation
+000AA7 FEI Company
+000AA8 ePipe Pty. Ltd.
+000AA9 Brooks Automation GmbH
+000AAA AltiGen Communications Inc.
+000AAB TOYOTA MACS, INC.
+000AAC TerraTec Electronic GmbH
+000AAD Stargames Corporation
+000AAE Rosemount Process Analytical
+000AAF Pipal Systems
+000AB0 LOYTEC electronics GmbH
+000AB1 GENETEC Corporation
+000AB2 Fresnel Wireless Systems
+000AB3 Fa. GIRA
+000AB4 ETIC Telecommunications
+000AB5 Digital Electronic Network
+000AB6 COMPUNETIX, INC
+000AB7 Cisco Systems
+000AB8 Cisco Systems
+000AB9 Astera Technologies Corp.
+000ABA Arcon Technology Limited
+000ABB Taiwan Secom Co,. Ltd
+000ABC Seabridge Ltd.
+000ABD Rupprecht & Patashnick Co.
+000ABE OPNET Technologies CO., LTD.
+000ABF HIROTA SS
+000AC0 Fuyoh Video Industry CO., LTD.
+000AC1 Futuretel
+000AC2 FiberHome Telecommunication Technologies CO.,LTD
+000AC3 eM Technics Co., Ltd.
+000AC4 Daewoo Teletech Co., Ltd
+000AC5 Color Kinetics
+000AC7 Unication Group
+000AC8 ZPSYS CO.,LTD. (Planning&Management)
+000AC9 Zambeel Inc
+000ACA YOKOYAMA SHOKAI CO.,Ltd.
+000ACB XPAK MSA Group
+000ACC Winnow Networks, Inc.
+000ACD Sunrich Technology Limited
+000ACE RADIANTECH, INC.
+000ACF PROVIDEO Multimedia Co. Ltd.
+000AD0 Niigata Develoment Center, F.I.T. Co., Ltd.
+000AD1 MWS
+000AD2 JEPICO Corporation
+000AD3 INITECH Co., Ltd
+000AD4 CoreBell Systems Inc.
+000AD5 Brainchild Electronic Co., Ltd.
+000AD6 BeamReach Networks
+000AD8 IPCserv Technology Corp.
+000AD9 Sony Ericsson Mobile Communications AB
+000ADB SkyPilot Network, Inc
+000ADC RuggedCom Inc.
+000ADD InSciTek Microsystems, Inc.
+000ADE Happy Communication Co., Ltd.
+000ADF Gennum Corporation
+000AE0 Fujitsu Softek
+000AE1 EG Technology
+000AE2 Binatone Electronics International, Ltd
+000AE3 YANG MEI TECHNOLOGY CO., LTD
+000AE4 Wistron Corp.
+000AE5 ScottCare Corporation
+000AE6 Elitegroup Computer System Co. (ECS)
+000AE7 ELIOP S.A.
+000AE8 Cathay Roxus Information Technology Co. LTD
+000AE9 AirVast Technology Inc.
+000AEA ADAM ELEKTRONIK LTD.STI.
+000AEB Shenzhen Tp-link Technology Co; Ltd.
+000AEC Koatsu Gas Kogyo Co., Ltd.
+000AED HARTING Vending G.m.b.H. & CO KG
+000AEE GCD Hard- & Software GmbH
+000AEF OTRUM ASA
+000AF0 SHIN-OH ELECTRONICS CO., LTD. R&D
+000AF1 Clarity Design, Inc.
+000AF2 NeoAxiom Corp.
+000AF3 Cisco Systems
+000AF4 Cisco Systems
+000AF5 Airgo Networks, Inc.
+000AF6 Computer Process Controls
+000AF7 Broadcom Corp.
+000AF8 American Telecare Inc.
+000AF9 HiConnect, Inc.
+000AFA Traverse Technologies Australia
+000AFB Ambri Limited
+000AFC Core Tec Communications, LLC
+000AFD Viking Electronic Services
+000AFE NovaPal Ltd
+000AFF Kilchherr Elektronik AG
+000B00 FUJIAN START COMPUTER EQUIPMENT CO.,LTD
+000B01 DAIICHI ELECTRONICS CO., LTD.
+000B02 Dallmeier electronic
+000B03 Taekwang Industrial Co., Ltd
+000B04 Volktek Corporation
+000B05 Pacific Broadband Networks
+000B06 Motorola BCS
+000B07 Voxpath Networks
+000B08 Pillar Data Systems
+000B09 Ifoundry Systems Singapore
+000B0A dBm Optics
+000B0B Corrent Corporation
+000B0C Agile Systems Inc.
+000B0D Air2U, Inc.
+000B0E Trapeze Networks
+000B0F Nyquist Industrial Control BV
+000B10 11wave Technonlogy Co.,Ltd
+000B11 HIMEJI ABC TRADING CO.,LTD.
+000B12 NURI Telecom Co., Ltd.
+000B13 ZETRON INC
+000B14 ViewSonic Corporation
+000B15 Platypus Technology
+000B16 Communication Machinery Corporation
+000B17 MKS Instruments
+000B19 Vernier Networks, Inc.
+000B1A Teltone Corporation
+000B1B Systronix, Inc.
+000B1D LayerZero Power Systems, Inc.
+000B1E KAPPA opto-electronics GmbH
+000B1F I CON Computer Co.
+000B20 Hirata corporation
+000B21 G-Star Communications Inc.
+000B22 Environmental Systems and Services
+000B23 Siemens Subscriber Networks
+000B24 AirLogic
+000B25 Aeluros
+000B26 Wetek Corporation
+000B27 Scion Corporation
+000B28 Quatech Inc.
+000B29 LG Industrial Systems Co.,Ltd.
+000B2A HOWTEL Co., Ltd.
+000B2B HOSTNET CORPORATION
+000B2C Eiki Industrial Co. Ltd.
+000B2D Danfoss Inc.
+000B2E Cal-Comp Electronics (Thailand) Public Company Limited Taipe
+000B2F bplan GmbH
+000B30 Beijing Gongye Science & Technology Co.,Ltd
+000B31 Yantai ZhiYang Scientific and technology industry CO., LTD
+000B32 VORMETRIC, INC.
+000B33 Vivato
+000B34 ShangHai Broadband Technologies CO.LTD
+000B35 Quad Bit System co., Ltd.
+000B36 Productivity Systems, Inc.
+000B37 MANUFACTURE DES MONTRES ROLEX SA
+000B38 Knuerr AG
+000B39 Keisoku Giken Co.,Ltd.
+000B3A Fortel DTV, Inc.
+000B3B devolo AG
+000B3C Cygnal Integrated Products, Inc.
+000B3D CONTAL OK Ltd.
+000B3E BittWare, Inc
+000B3F Anthology Solutions Inc.
+000B40 OpNext Inc.
+000B41 Ing. Buero Dr. Beutlhauser
+000B42 commax Co., Ltd.
+000B43 Microscan Systems, Inc.
+000B44 Concord IDea Corp.
+000B45 Cisco
+000B46 Cisco
+000B47 Advanced Energy
+000B48 sofrel
+000B49 RF-Link System Inc.
+000B4A Visimetrics (UK) Ltd
+000B4B VISIOWAVE SA
+000B4C Clarion (M) Sdn Bhd
+000B4D Emuzed
+000B4E VertexRSI Antenna Products Division
+000B4F Verifone, INC.
+000B50 Oxygnet
+000B51 Micetek International Inc.
+000B52 JOYMAX ELECTRONICS CORP.
+000B53 INITIUM Co., Ltd.
+000B54 BiTMICRO Networks, Inc.
+000B55 ADInstruments
+000B56 Cybernetics
+000B57 Silicon Laboratories
+000B58 Astronautics C.A LTD
+000B59 ScriptPro, LLC
+000B5A HyperEdge
+000B5B Rincon Research Corporation
+000B5C Newtech Co.,Ltd
+000B5D FUJITSU LIMITED
+000B5E ATMAVA Ltd
+000B5F Cisco Systems
+000B60 Cisco Systems
+000B61 Friedrich Ltze GmbH &Co.
+000B62 Ingenieurbro Ingo Mohnen
+000B63 Kaleidescape
+000B64 Kieback & Peter GmbH & Co KG
+000B65 Sy.A.C. srl
+000B66 Teralink Communications
+000B67 Topview Technology Corporation
+000B68 Addvalue Communications Pte Ltd
+000B69 Franke Finland Oy
+000B6A Asiarock Incorporation
+000B6B Wistron Neweb Corp.
+000B6C Sychip Inc.
+000B6D SOLECTRON JAPAN NAKANIIDA
+000B6E Neff Instrument Corp.
+000B6F Media Streaming Networks Inc
+000B70 Load Technology, Inc.
+000B71 Litchfield Communications Inc.
+000B72 Lawo AG
+000B73 Kodeos Communications
+000B74 Kingwave Technology Co., Ltd.
+000B75 Iosoft Ltd.
+000B76 ET&T Co. Ltd.
+000B77 Cogent Systems, Inc.
+000B78 TAIFATECH INC.
+000B79 X-COM, Inc.
+000B7A Wave Science Inc.
+000B7B Test-Um Inc.
+000B7C Telex Communications
+000B7D SOLOMON EXTREME INTERNATIONAL LTD.
+000B7E SAGINOMIYA Seisakusho Inc.
+000B7F OmniWerks
+000B81 Kaparel Corporation
+000B82 Grandstream Networks, Inc.
+000B83 DATAWATT B.V.
+000B84 BODET
+000B85 Airespace, Inc.
+000B86 Aruba Networks
+000B87 American Reliance Inc.
+000B88 Vidisco ltd.
+000B89 Top Global Technology, Ltd.
+000B8A MITEQ Inc.
+000B8B KERAJET, S.A.
+000B8C flextronics israel
+000B8D Avvio Networks
+000B8E Ascent Corporation
+000B8F AKITA ELECTRONICS SYSTEMS CO.,LTD.
+000B90 Covaro Networks, Inc.
+000B91 Aglaia Gesellschaft fr Bildverarbeitung und Kommunikation m
+000B92 Ascom Danmark A/S
+000B93 Barmag Electronic
+000B94 Digital Monitoring Products, Inc.
+000B95 eBet Gaming Systems Pty Ltd
+000B96 Innotrac Diagnostics Oy
+000B97 Matsushita Electric Industrial Co.,Ltd.
+000B98 NiceTechVision
+000B99 SensAble Technologies, Inc.
+000B9A Shanghai Ulink Telecom Equipment Co. Ltd.
+000B9B Sirius System Co, Ltd.
+000B9C TriBeam Technologies, Inc.
+000B9D TwinMOS Technologies Inc.
+000B9E Yasing Technology Corp.
+000B9F Neue ELSA GmbH
+000BA0 T&L Information Inc.
+000BA1 SYSCOM Ltd.
+000BA2 Sumitomo Electric Networks, Inc
+000BA3 Siemens AG, I&S
+000BA4 Shiron Satellite Communications Ltd. (1996)
+000BA5 Quasar Cipta Mandiri, PT
+000BA6 Miyakawa Electric Works Ltd.
+000BA7 Maranti Networks
+000BA8 HANBACK ELECTRONICS CO., LTD.
+000BA9 CloudShield Technologies, Inc.
+000BAA Aiphone co.,Ltd
+000BAB Advantech Technology (CHINA) Co., Ltd.
+000BAC 3Com Europe Ltd.
+000BAD PC-PoS Inc.
+000BAE Vitals System Inc.
+000BAF WOOJU COMMUNICATIONS Co,.Ltd
+000BB0 Sysnet Telematica srl
+000BB1 Super Star Technology Co., Ltd.
+000BB2 SMALLBIG TECHNOLOGY
+000BB3 RiT technologies Ltd.
+000BB4 RDC Semiconductor Inc.,
+000BB5 nStor Technologies, Inc.
+000BB6 Mototech Inc.
+000BB7 Micro Systems Co.,Ltd.
+000BB8 Kihoku Electronic Co.
+000BB9 Imsys AB
+000BBA Harmonic Broadband Access Networks
+000BBB Etin Systems Co., Ltd
+000BBC En Garde Systems, Inc.
+000BBD Connexionz Limited
+000BBE Cisco Systems
+000BBF Cisco Systems
+000BC0 China IWNComm Co., Ltd.
+000BC1 Bay Microsystems, Inc.
+000BC2 Corinex Communication Corp.
+000BC3 Multiplex, Inc.
+000BC4 BIOTRONIK GmbH & Co
+000BC5 SMC Networks, Inc.
+000BC6 ISAC, Inc.
+000BC7 ICET S.p.A.
+000BC8 AirFlow Networks
+000BC9 Electroline Equipment
+000BCA DATAVAN International Corporation
+000BCB Fagor Automation , S. Coop
+000BCC JUSAN, S.A.
+000BCD Compaq (HP)
+000BCE Free2move AB
+000BCF AGFA NDT INC.
+000BD0 XiMeta Technology Americas Inc.
+000BD1 Aeronix, Inc.
+000BD2 Remopro Technology Inc.
+000BD3 cd3o
+000BD4 Beijing Wise Technology & Science Development Co.Ltd
+000BD5 Nvergence, Inc.
+000BD6 Paxton Access Ltd
+000BD7 MBB Gelma GmbH
+000BD8 Industrial Scientific Corp.
+000BD9 General Hydrogen
+000BDA EyeCross Co.,Inc.
+000BDB Dell ESG PCBA Test
+000BDC AKCP
+000BDD TOHOKU RICOH Co., LTD.
+000BDF Shenzhen RouterD Networks Limited
+000BE0 SercoNet Ltd.
+000BE2 Lumenera Corporation
+000BE3 Key Stream Co., Ltd.
+000BE4 Hosiden Corporation
+000BE5 HIMS Korea Co., Ltd.
+000BE6 Datel Electronics
+000BE7 COMFLUX TECHNOLOGY INC.
+000BE8 AOIP
+000BEA Zultys Technologies
+000BEB Systegra AG
+000BEC NIPPON ELECTRIC INSTRUMENT, INC.
+000BED ELM Inc.
+000BEE inc.jet, Incorporated
+000BEF Code Corporation
+000BF0 MoTEX Products Co., Ltd.
+000BF1 LAP Laser Applikations
+000BF2 Chih-Kan Technology Co., Ltd.
+000BF3 BAE SYSTEMS
+000BF5 Shanghai Sibo Telecom Technology Co.,Ltd
+000BF6 Nitgen Co., Ltd
+000BF7 NIDEK CO.,LTD
+000BF8 Infinera
+000BF9 Gemstone communications, Inc.
+000BFB D-NET International Corporation
+000BFC Cisco Systems
+000BFD Cisco Systems
+000BFE CASTEL Broadband Limited
+000BFF Berkeley Camera Engineering
+000C00 BEB Industrie-Elektronik AG
+000C01 Abatron AG
+000C02 ABB Oy
+000C03 HDMI Licensing, LLC
+000C04 Tecnova
+000C05 RPA Reserch Co., Ltd.
+000C06 Nixvue Systems Pte Ltd
+000C07 Iftest AG
+000C08 HUMEX Technologies Corp.
+000C09 Hitachi IE Systems Co., Ltd
+000C0A Guangdong Province Electronic Technology Research Institute
+000C0B Broadbus Technologies
+000C0C APPRO TECHNOLOGY INC.
+000C0D Communications & Power Industries / Satcom Division
+000C0E XtremeSpectrum, Inc.
+000C0F Techno-One Co., Ltd
+000C10 PNI Corporation
+000C11 NIPPON DEMPA CO.,LTD.
+000C12 Micro-Optronic-Messtechnik GmbH
+000C13 MediaQ
+000C14 Diagnostic Instruments, Inc.
+000C15 CyberPower Systems, Inc.
+000C16 Concorde Microsystems Inc.
+000C17 AJA Video Systems Inc
+000C18 Zenisu Keisoku Inc.
+000C19 Telio Communications GmbH
+000C1A Quest Technical Solutions Inc.
+000C1B ORACOM Co, Ltd.
+000C1C MicroWeb Co., Ltd.
+000C1D Mettler & Fuchs AG
+000C1E Global Cache
+000C1F Glimmerglass Networks
+000C20 Fi WIn, Inc.
+000C21 Faculty of Science and Technology, Keio University
+000C22 Double D Electronics Ltd
+000C23 Beijing Lanchuan Tech. Co., Ltd.
+000C25 Allied Telesyn Networks
+000C26 Weintek Labs. Inc.
+000C27 Sammy Corporation
+000C28 RIFATRON
+000C29 VMware, Inc.
+000C2A OCTTEL Communication Co., Ltd.
+000C2B ELIAS Technology, Inc.
+000C2C Enwiser Inc.
+000C2D FullWave Technology Co., Ltd.
+000C2E Openet information technology(shenzhen) Co., Ltd.
+000C2F SeorimTechnology Co.,Ltd.
+000C30 Cisco
+000C31 Cisco
+000C32 Avionic Design Development GmbH
+000C33 Compucase Enterprise Co. Ltd.
+000C34 Vixen Co., Ltd.
+000C35 KaVo Dental GmbH & Co. KG
+000C36 SHARP TAKAYA ELECTRONICS INDUSTRY CO.,LTD.
+000C37 Geomation, Inc.
+000C38 TelcoBridges Inc.
+000C39 Sentinel Wireless Inc.
+000C3A Oxance
+000C3B Orion Electric Co., Ltd.
+000C3C MediaChorus, Inc.
+000C3D Glsystech Co., Ltd.
+000C3E Crest Audio
+000C3F Cogent Defence & Security Networks,
+000C40 Altech Controls
+000C41 The Linksys Group, Inc.
+000C42 Routerboard.com
+000C43 Ralink Technology, Corp.
+000C44 Automated Interfaces, Inc.
+000C45 Animation Technologies Inc.
+000C46 Allied Telesyn Inc.
+000C47 SK Teletech(R&D Planning Team)
+000C48 QoStek Corporation
+000C49 Dangaard Telecom RTC Division A/S
+000C4A Cygnus Microsystems Private Limited
+000C4B Cheops Elektronik
+000C4C Arcor AG&Co.
+000C4D ACRA CONTROL
+000C4E Winbest Technology CO,LT
+000C4F UDTech Japan Corporation
+000C50 Seagate Technology
+000C51 Scientific Technologies Inc.
+000C52 Roll Systems Inc.
+000C54 Pedestal Networks, Inc
+000C55 Microlink Communications Inc.
+000C56 Megatel Computer (1986) Corp.
+000C57 MACKIE Engineering Services Belgium BVBA
+000C58 M&S Systems
+000C59 Indyme Electronics, Inc.
+000C5A IBSmm Industrieelektronik Multimedia
+000C5B HANWANG TECHNOLOGY CO.,LTD
+000C5C GTN Systems B.V.
+000C5D CHIC TECHNOLOGY (CHINA) CORP.
+000C5F Avtec, Inc.
+000C60 ACM Systems
+000C61 AC Tech corporation DBA Advanced Digital
+000C62 ABB Automation Technology Products AB, Control
+000C63 Zenith Electronics Corporation
+000C64 X2 MSA Group
+000C65 Sunin Telecom
+000C66 Pronto Networks Inc
+000C67 OYO ELECTRIC CO.,LTD
+000C68 Oasis Semiconductor, Inc.
+000C69 National Radio Astronomy Observatory
+000C6A MBARI
+000C6B Kurz Industrie-Elektronik GmbH
+000C6C Elgato Systems LLC
+000C6D BOC Edwards
+000C6E ASUSTEK COMPUTER INC.
+000C6F Amtek system co.,LTD.
+000C70 ACC GmbH
+000C71 Wybron, Inc
+000C72 Tempearl Industrial Co., Ltd.
+000C73 TELSON ELECTRONICS CO., LTD
+000C74 RIVERTEC CORPORATION
+000C75 Oriental integrated electronics. LTD
+000C76 MICRO-STAR INTERNATIONAL CO., LTD.
+000C77 Life Racing Ltd
+000C78 In-Tech Electronics Limited
+000C79 Extel Communications P/L
+000C7A DaTARIUS Technologies GmbH
+000C7B ALPHA PROJECT Co.,Ltd.
+000C7C Internet Information Image Inc.
+000C7D TEIKOKU ELECTRIC MFG. CO., LTD
+000C7E Tellium Incorporated
+000C7F synertronixx GmbH
+000C80 Opelcomm Inc.
+000C81 Nulec Industries Pty Ltd
+000C82 NETWORK TECHNOLOGIES INC
+000C83 Logical Solutions
+000C84 Eazix, Inc.
+000C85 Cisco Systems
+000C86 Cisco Systems
+000C87 ATI
+000C88 Apache Micro Peripherals, Inc.
+000C89 AC Electric Vehicles, Ltd.
+000C8A Bose Corporation
+000C8B Connect Tech Inc
+000C8C KODICOM CO.,LTD.
+000C8D MATRIX VISION GmbH
+000C8E Mentor Engineering Inc
+000C8F Nergal s.r.l.
+000C90 Octasic Inc.
+000C91 Riverhead Networks Inc.
+000C92 WolfVision Gmbh
+000C93 Xeline Co., Ltd.
+000C94 United Electronic Industries, Inc.
+000C95 PrimeNet
+000C96 OQO, Inc.
+000C97 NV ADB TTV Technologies SA
+000C98 LETEK Communications Inc.
+000C99 HITEL LINK Co.,Ltd
+000C9A Hitech Electronics Corp.
+000C9B EE Solutions, Inc
+000C9C Chongho information & communications
+000C9D AirWalk Communications, Inc.
+000C9E MemoryLink Corp.
+000C9F NKE Corporation
+000CA0 StorCase Technology, Inc.
+000CA1 SIGMACOM Co., LTD.
+000CA2 Scopus Network Technologies Ltd
+000CA3 Rancho Technology, Inc.
+000CA4 Prompttec Product Management GmbH
+000CA5 Naman NZ LTd
+000CA6 Mintera Corporation
+000CA7 Metro (Suzhou) Technologies Co., Ltd.
+000CA8 Garuda Networks Corporation
+000CA9 Ebtron Inc.
+000CAA Cubic Transportation Systems Inc
+000CAB COMMEND International
+000CAC Citizen Watch Co., Ltd.
+000CAD BTU International
+000CAE Ailocom Oy
+000CAF TRI TERM CO.,LTD.
+000CB0 Star Semiconductor Corporation
+000CB1 Salland Engineering (Europe) BV
+000CB2 safei Co., Ltd.
+000CB3 ROUND Co.,Ltd.
+000CB4 Propagate Networks, Inc
+000CB5 Premier Technolgies, Inc
+000CB6 NANJING SEU MOBILE & INTERNET TECHNOLOGY CO.,LTD
+000CB7 Nanjing Huazhuo Electronics Co., Ltd.
+000CB8 MEDION AG
+000CB9 LEA
+000CBA Jamex
+000CBB ISKRAEMECO
+000CBC Iscutum
+000CBD Interface Masters, Inc
+000CBF Holy Stone Ent. Co., Ltd.
+000CC0 Genera Oy
+000CC1 Cooper Industries Inc.
+000CC3 BeWAN systems
+000CC4 Tiptel AG
+000CC5 Nextlink Co., Ltd.
+000CC6 Ka-Ro electronics GmbH
+000CC7 Intelligent Computer Solutions Inc.
+000CC8 Xytronix Research & Design, Inc.
+000CC9 ILWOO DATA & TECHNOLOGY CO.,LTD
+000CCA Hitachi Global Storage Technologies
+000CCB Design Combus Ltd
+000CCC Bluesoft Ltd.
+000CCD IEC - TC57
+000CCE Cisco Systems
+000CCF Cisco Systems
+000CD0 Symetrix
+000CD1 SFOM Technology Corp.
+000CD2 Schaffner EMV AG
+000CD3 Prettl Elektronik Radeberg GmbH
+000CD4 Positron Public Safety Systems inc.
+000CD5 Passave Inc.
+000CD6 PARTNER TECH
+000CD7 Nallatech Ltd
+000CD8 M. K. Juchheim GmbH & Co
+000CD9 Itcare Co., Ltd
+000CDA FreeHand Systems, Inc.
+000CDB Foundry Networks
+000CDC BECS Technology, Inc
+000CDD AOS Technologies AG
+000CDE ABB STOTZ-KONTAKT GmbH
+000CDF PULNiX America, Inc
+000CE0 Trek Diagnostics Inc.
+000CE1 The Open Group
+000CE2 Rolls-Royce
+000CE3 Option International N.V.
+000CE4 NeuroCom International, Inc.
+000CE5 Motorola BCS
+000CE6 Meru Networks Inc
+000CE7 MediaTek Inc.
+000CE8 GuangZhou AnJuBao Co., Ltd
+000CE9 BLOOMBERG L.P.
+000CEA aphona Kommunikationssysteme
+000CEB CNMP Networks, Inc.
+000CEC Spectracom Corp.
+000CED Real Digital Media
+000CEE Q-Networks
+000CEF Open Networks Engineering Ltd
+000CF0 M & N GmbH
+000CF1 Intel Corporation
+000CF2 GAMESA ELICA
+000CF3 CALL IMAGE SA
+000CF4 AKATSUKI ELECTRIC MFG.CO.,LTD.
+000CF5 InfoExpress
+000CF6 Sitecom Europe BV
+000CF7 Nortel Networks
+000CF8 Nortel Networks
+000CF9 ITT Flygt AB
+000CFA Digital Systems Corp
+000CFB Korea Network Systems
+000CFC S2io Technologies Corp
+000CFE Grand Electronic Co., Ltd
+000CFF MRO-TEK LIMITED
+000D00 Seaway Networks Inc.
+000D01 P&E Microcomputer Systems, Inc.
+000D02 NEC Access Technica,Ltd
+000D03 Matrics, Inc.
+000D04 Foxboro Eckardt Development GmbH
+000D05 cybernet manufacturing inc.
+000D06 Compulogic Limited
+000D07 Calrec Audio Ltd
+000D08 AboveCable, Inc.
+000D09 Yuehua(Zhuhai) Electronic CO. LTD
+000D0A Projectiondesign as
+000D0B Melco Inc.
+000D0C MDI Security Systems
+000D0D ITSupported, LLC
+000D0E Inqnet Systems, Inc.
+000D0F Finlux Ltd
+000D10 Embedtronics Oy
+000D11 DENTSPLY - Gendex
+000D12 AXELL Corporation
+000D13 Wilhelm Rutenbeck GmbH&Co.
+000D14 Vtech Innovation LP dba Advanced American Telephones
+000D15 Voipac s.r.o.
+000D16 UHS Systems Pty Ltd
+000D17 Turbo Networks Co.Ltd
+000D18 Sunitec Enterprise Co., Ltd.
+000D19 ROBE Show lighting
+000D1A Mustek System Inc.
+000D1B Kyoto Electronics Manufacturing Co., Ltd.
+000D1C I2E TELECOM
+000D1D HIGH-TEK HARNESS ENT. CO., LTD.
+000D1E Control Techniques
+000D1F AV Digital
+000D20 ASAHIKASEI TECHNOSYSTEM CO.,LTD.
+000D21 WISCORE Inc.
+000D22 Unitronics
+000D23 Smart Solution, Inc
+000D24 SENTEC E&E CO., LTD.
+000D25 SANDEN CORPORATION
+000D26 Primagraphics Limited
+000D27 MICROPLEX Printware AG
+000D28 Cisco
+000D29 Cisco
+000D2A Scanmatic AS
+000D2B Racal Instruments
+000D2C Patapsco Designs Ltd
+000D2D NCT Deutschland GmbH
+000D2E Matsushita Avionics Systems Corporation
+000D2F AIN Comm.Tech.Co., LTD
+000D30 IceFyre Semiconductor
+000D31 Compellent Technologies, Inc.
+000D32 DispenseSource, Inc.
+000D33 Prediwave Corp.
+000D34 Shell International Exploration and Production, Inc.
+000D35 PAC International Ltd
+000D36 Wu Han Routon Electronic Co., Ltd
+000D37 WIPLUG
+000D38 NISSIN INC.
+000D39 Network Electronics
+000D3A Microsoft Corp.
+000D3B Microelectronics Technology Inc.
+000D3C i.Tech Dynamic Ltd
+000D3E APLUX Communications Ltd.
+000D3F VXI Technology
+000D40 Verint Loronix Video Solutions
+000D41 Siemens AG ICM MP UC RD IT KLF1
+000D42 Newbest Development Limited
+000D43 DRS Tactical Systems Inc.
+000D45 Tottori SANYO Electric Co., Ltd.
+000D46 Eurotherm Drives, Ltd.
+000D47 Collex
+000D48 AEWIN Technologies Co., Ltd.
+000D49 Triton Systems of Delaware, Inc.
+000D4A Steag ETA-Optik
+000D4B Roku, LLC
+000D4C Outline Electronics Ltd.
+000D4D Ninelanes
+000D4E NDR Co.,LTD.
+000D4F Kenwood Corporation
+000D50 Galazar Networks
+000D51 DIVR Systems, Inc.
+000D52 Comart system
+000D53 Beijing 5w Communication Corp.
+000D54 3Com Europe Ltd
+000D55 SANYCOM Technology Co.,Ltd
+000D56 Dell PCBA Test
+000D57 Fujitsu I-Network Systems Limited.
+000D59 Amity Systems, Inc.
+000D5A Tiesse SpA
+000D5B Smart Empire Investments Limited
+000D5C Robert Bosch GmbH, VT-ATMO
+000D5D Raritan Computer, Inc
+000D5E NEC CustomTechnica, Ltd.
+000D5F Minds Inc
+000D60 IBM Corporation
+000D61 Giga-Byte Technology Co., Ltd.
+000D62 Funkwerk Dabendorf GmbH
+000D63 DENT Instruments, Inc.
+000D64 COMAG Handels AG
+000D65 Cisco Systems
+000D66 Cisco Systems
+000D67 BelAir Networks Inc.
+000D68 Vinci Systems, Inc.
+000D69 TMT&D Corporation
+000D6A Redwood Technologies LTD
+000D6B Mita-Teknik A/S
+000D6C M-Audio
+000D6D K-Tech Devices Corp.
+000D6E K-Patents Oy
+000D6F Ember Corporation
+000D70 Datamax Corporation
+000D71 boca systems
+000D72 2Wire, Inc
+000D73 Technical Support, Inc.
+000D74 Sand Network Systems, Inc.
+000D75 Kobian Pte Ltd - Taiwan Branch
+000D76 Hokuto Denshi Co,. Ltd.
+000D77 FalconStor Software
+000D78 Engineering & Security
+000D79 Dynamic Solutions Co,.Ltd.
+000D7A DiGATTO Asia Pacific Pte Ltd
+000D7B Consensys Computers Inc.
+000D7C Codian Ltd
+000D7D Afco Systems
+000D7E Axiowave Networks, Inc.
+000D7F MIDAS COMMUNICATION TECHNOLOGIES PTE LTD ( Foreign Branch)
+000D80 Online Development Inc
+000D81 Pepperl+Fuchs GmbH
+000D82 PHS srl
+000D83 Sanmina-SCI Hungary Ltd.
+000D84 Seodu Inchip, Inc.
+000D85 Tapwave, Inc.
+000D86 Huber + Suhner AG
+000D87 Elitegroup Computer System Co. (ECS)
+000D88 D-Link Corporation
+000D89 Bils Technology Inc
+000D8A Winners Electronics Co., Ltd.
+000D8B T&D Corporation
+000D8C Shanghai Wedone Digital Ltd. CO.
+000D8D ProLinx Communication Gateways, Inc.
+000D8E Koden Electronics Co., Ltd.
+000D8F King Tsushin Kogyo Co., LTD.
+000D90 Factum Electronics AB
+000D91 Eclipse (HQ Espana) S.L.
+000D92 Arima Communication Corporation
+000D93 Apple Computer
+000D94 AFAR Communications,Inc
+000D95 Opti-cell, Inc.
+000D96 Vtera Technology Inc.
+000D97 Tropos Networks, Inc.
+000D98 S.W.A.C. Schmitt-Walter Automation Consult GmbH
+000D99 Orbital Sciences Corp.; Launch Systems Group
+000D9A INFOTEC LTD
+000D9C Elan GmbH & Co KG
+000D9D Hewlett Packard
+000D9E TOKUDEN OHIZUMI SEISAKUSYO Co.,Ltd.
+000D9F RF Micro Devices
+000DA0 NEDAP N.V.
+000DA1 MIRAE ITS Co.,LTD.
+000DA2 Infrant Technologies, Inc.
+000DA3 Emerging Technologies Limited
+000DA4 DOSCH & AMAND SYSTEMS AG
+000DA5 Fabric7 Systems, Inc
+000DA6 Universal Switching Corporation
+000DA8 Teletronics Technology Corporation
+000DA9 T.E.A.M. S.L.
+000DAA S.A.Tehnology co.,Ltd.
+000DAB Parker Hannifin GmbH Electromechanical Division Europe
+000DAC Japan CBM Corporation
+000DAD Dataprobe Inc
+000DAE SAMSUNG HEAVY INDUSTRIES CO., LTD.
+000DAF Plexus Corp (UK) Ltd
+000DB0 Olym-tech Co.,Ltd.
+000DB1 Japan Network Service Co., Ltd.
+000DB2 Ammasso, Inc.
+000DB3 SDO Communication Corperation
+000DB4 NETASQ
+000DB5 GLOBALSAT TECHNOLOGY CORPORATION
+000DB6 Teknovus, Inc.
+000DB7 SANKO ELECTRIC CO,.LTD
+000DB8 SCHILLER AG
+000DB9 PC Engines GmbH
+000DBA Oc Document Technologies GmbH
+000DBB Nippon Dentsu Co.,Ltd.
+000DBC Cisco Systems
+000DBD Cisco Systems
+000DBE Bel Fuse Europe Ltd.,UK
+000DBF TekTone Sound & Signal Mfg., Inc.
+000DC0 Spagat AS
+000DC1 SafeWeb Inc
+000DC3 First Communication, Inc.
+000DC4 Emcore Corporation
+000DC5 EchoStar International Corporation
+000DC6 DigiRose Technology Co., Ltd.
+000DC7 COSMIC ENGINEERING INC.
+000DC8 AirMagnet, Inc
+000DC9 THALES Elektronik Systeme GmbH
+000DCA Tait Electronics
+000DCB Petcomkorea Co., Ltd.
+000DCC NEOSMART Corp.
+000DCD GROUPE TXCOM
+000DCE Dynavac Technology Pte Ltd
+000DCF Cidra Corp.
+000DD0 TetraTec Instruments GmbH
+000DD1 Stryker Corporation
+000DD2 Simrad Optronics ASA
+000DD3 SAMWOO Telecommunication Co.,Ltd.
+000DD4 Revivio Inc.
+000DD5 O'RITE TECHNOLOGY CO.,LTD
+000DD6 ITI LTD
+000DD7 Bright
+000DD8 BBN
+000DD9 Anton Paar GmbH
+000DDA ALLIED TELESIS K.K.
+000DDB AIRWAVE TECHNOLOGIES INC.
+000DDC VAC
+000DDD PROFLO TELRA ELEKTRONK SANAY VE TCARET A..
+000DDE Joyteck Co., Ltd.
+000DDF Japan Image & Network Inc.
+000DE0 ICPDAS Co.,LTD
+000DE1 Control Products, Inc.
+000DE2 CMZ Sistemi Elettronici
+000DE3 AT Sweden AB
+000DE4 DIGINICS, Inc.
+000DE5 Samsung Thales
+000DE6 YOUNGBO ENGINEERING CO.,LTD
+000DE7 Snap-on OEM Group
+000DE8 Nasaco Electronics Pte. Ltd
+000DE9 Napatech Aps
+000DEA Kingtel Telecommunication Corp.
+000DEB CompXs Limited
+000DEC Cisco Systems
+000DED Cisco Systems
+000DEF Soc. Coop. Bilanciai
+000DF0 QCOM TECHNOLOGY INC.
+000DF1 IONIX INC.
+000DF3 Asmax Solutions
+000DF4 Watertek Co.
+000DF5 Teletronics International Inc.
+000DF6 Technology Thesaurus Corp.
+000DF7 Space Dynamics Lab
+000DF8 ORGA Kartensysteme GmbH
+000DF9 NDS Limited
+000DFA Micro Control Systems Ltd.
+000DFB Komax AG
+000DFC ITFOR Inc. resarch and development
+000DFD Huges Hi-Tech Inc.,
+000DFE Hauppauge Computer Works, Inc.
+000DFF CHENMING MOLD INDUSTRY CORP.
+000E01 ASIP Technologies Inc.
+000E02 Advantech AMT Inc.
+000E03 Aarohi Communications, Inc.
+000E05 WIRELESS MATRIX CORP.
+000E06 Team Simoco Ltd
+000E07 Sony Ericsson Mobile Communications AB
+000E08 Sipura Technology, Inc.
+000E09 Shenzhen Coship Software Co.,LTD.
+000E0B Netac Technology Co., Ltd.
+000E0C Intel Corporation
+000E0D HESCH Schrder GmbH
+000E0E ESA elettronica S.P.A.
+000E0F ERMME
+000E11 BDT Bro- und Datentechnik GmbH & Co. KG
+000E12 Adaptive Micro Systems Inc.
+000E13 Accu-Sort Systems inc.
+000E14 Visionary Solutions, Inc.
+000E15 Tadlys LTD
+000E16 SouthWing
+000E18 MyA Technology
+000E19 LogicaCMG Pty Ltd
+000E1A JPS Communications
+000E1B IAV GmbH
+000E1C Hach Company
+000E1F TCL Networks Equipment Co., Ltd.
+000E20 PalmSource, Inc.
+000E21 MTU Friedrichshafen GmbH
+000E23 Incipient, Inc.
+000E25 Hannae Technology Co., Ltd
+000E26 Gincom Technology Corp.
+000E27 Crere Networks, Inc.
+000E28 Dynamic Ratings P/L
+000E29 Shester Communications Inc
+000E2B Safari Technologies
+000E2C Netcodec co.
+000E2D Hyundai Digital Technology Co.,Ltd.
+000E2E Edimax Technology Co., Ltd.
+000E2F Disetronic Medical Systems AG
+000E30 AERAS Networks, Inc.
+000E31 Olympus BioSystems GmbH
+000E32 Kontron Medical
+000E33 Shuko Electronics Co.,Ltd
+000E34 NexGen City, LP
+000E35 Intel Corp
+000E36 HEINESYS, Inc.
+000E37 Harms & Wende GmbH & Co.KG
+000E38 Cisco Systems
+000E39 Cisco Systems
+000E3A Cirrus Logic
+000E3B Hawking Technologies, Inc.
+000E3C TransAct Technoloiges Inc.
+000E3D Televic N.V.
+000E3E Sun Optronics Inc
+000E3F Soronti, Inc.
+000E40 Nortel Networks
+000E41 NIHON MECHATRONICS CO.,LTD.
+000E42 Motic Incoporation Ltd.
+000E43 G-Tek Electronics Sdn. Bhd.
+000E44 Digital 5, Inc.
+000E45 Beijing Newtry Electronic Technology Ltd
+000E46 Niigata Seimitsu Co.,Ltd.
+000E47 NCI System Co.,Ltd.
+000E48 Lipman TransAction Solutions
+000E49 Forsway Scandinavia AB
+000E4A Changchun Huayu WEBPAD Co.,LTD
+000E4B atrium c and i
+000E4C Bermai Inc.
+000E4D Numesa Inc.
+000E4E Waveplus Technology Co., Ltd.
+000E4F Trajet GmbH
+000E50 Thomson Multi Media
+000E51 tecna elettronica srl
+000E52 Optium Corporation
+000E53 AV TECH CORPORATION
+000E54 AlphaCell Wireless Ltd.
+000E55 AUVITRAN
+000E56 4G Systems GmbH
+000E57 Iworld Networking, Inc.
+000E58 Rincon Networks
+000E5A TELEFIELD inc.
+000E5B ParkerVision - Direct2Data
+000E5C Motorola BCS
+000E5D Com-X Networks
+000E5E Beijing Raisecom Science & Technology Development Co.,Ltd
+000E5F activ-net GmbH & Co. KG
+000E60 360SUN Digital Broadband Corporation
+000E61 MICROTROL LIMITED
+000E62 Nortel Networks
+000E63 Lemke Diagnostics GmbH
+000E64 Elphel, Inc
+000E65 TransCore
+000E66 Hitachi Advanced Digital, Inc.
+000E67 Eltis Microelectronics Ltd.
+000E68 E-TOP Network Technology Inc.
+000E69 China Electric Power Research Institute
+000E6A 3COM EUROPE LTD
+000E6B Janitza electronics GmbH
+000E6C Device Drivers Limited
+000E6D Murata Manufacturing Co., Ltd.
+000E6E MICRELEC ELECTRONICS S.A
+000E6F IRIS Corporation Berhad
+000E70 in2 Networks
+000E71 Gemstar Technology Development Ltd.
+000E72 CTS electronics
+000E73 Tpack A/S
+000E74 Solar Telecom. Tech
+000E75 New York Air Brake Corp.
+000E76 GEMSOC INNOVISION INC.
+000E77 Decru, Inc.
+000E78 Amtelco
+000E79 Ample Communications Inc.
+000E7B Toshiba
+000E7D Electronics Line 3000 Ltd.
+000E7E Comprog Oy
+000E7F Hewlett Packard
+000E81 Instant802 Networks Inc.
+000E82 Commtech Wireless
+000E83 Cisco Systems
+000E84 Cisco Systems
+000E85 Catalyst Enterprises, Inc.
+000E86 Alcatel North America
+000E87 adp Gauselmann GmbH
+000E88 VIDEOTRON CORP.
+000E89 CLEMATIC
+000E8A Avara Technologies Pty. Ltd.
+000E8B Astarte Technology Co, Ltd.
+000E8C Siemens AG A&D ET
+000E8D Systems in Progress Holding GmbH
+000E8E SparkLAN Communications, Inc.
+000E8F Sercomm Corp.
+000E90 PONICO CORP.
+000E92 Millinet Co., Ltd.
+000E93 Milnio 3 Sistemas Electrnicos, Lda.
+000E94 Maas International BV
+000E95 Fujiya Denki Seisakusho Co.,Ltd.
+000E96 Cubic Defense Applications, Inc.
+000E97 Ultracker Technology CO., Inc
+000E98 Vitec CC, INC.
+000E99 Spectrum Digital, Inc
+000E9A BOE TECHNOLOGY GROUP CO.,LTD
+000E9C Pemstar
+000E9D Video Networks Ltd
+000E9E Topfield Co., Ltd
+000E9F TEMIC SDS GmbH
+000EA0 NetKlass Technology Inc.
+000EA1 Formosa Teletek Corporation
+000EA2 CyberGuard Corporation
+000EA3 CNCR-IT CO.,LTD,HangZhou P.R.CHINA
+000EA4 Certance Inc.
+000EA5 BLIP Systems
+000EA6 ASUSTEK COMPUTER INC.
+000EA7 Endace Inc Ltd.
+000EA8 United Technologists Europe Limited
+000EA9 Shanghai Xun Shi Communications Equipment Ltd. Co.
+000EAC MINTRON ENTERPRISE CO., LTD.
+000EAD Metanoia Technologies, Inc.
+000EAE GAWELL TECHNOLOGIES CORP.
+000EAF CASTEL
+000EB0 Solutions Radio BV
+000EB1 Newcotech,Ltd
+000EB2 Micro-Research Finland Oy
+000EB3 LeftHand Networks
+000EB4 GUANGZHOU GAOKE COMMUNICATIONS TECHNOLOGY CO.LTD.
+000EB5 Ecastle Electronics Co., Ltd.
+000EB6 Riverbed Technology, Inc.
+000EB7 Knovative, Inc.
+000EB8 Iiga co.,Ltd
+000EB9 HASHIMOTO Electronics Industry Co.,Ltd.
+000EBA HANMI SEMICONDUCTOR CO., LTD.
+000EBB Everbee Networks
+000EBC Cullmann GmbH
+000EBD Burdick, a Quinton Compny
+000EBE B&B Electronics Manufacturing Co.
+000EC0 Nortel Networks
+000EC1 MYNAH Technologies
+000EC2 Lowrance Electronics, Inc.
+000EC3 Logic Controls, Inc.
+000EC4 Iskra Transmission d.d.
+000EC6 ASIX ELECTRONICS CORP.
+000EC7 Appeal Telecom Co.,Ltd.
+000EC8 Zoran Corporation
+000EC9 YOKO Technology Corp.
+000ECB VineSys Technology
+000ECC Tableau
+000ECD SKOV A/S
+000ECE S.I.T.T.I. S.p.A.
+000ECF PROFIBUS Nutzerorganisation e.V.
+000ED0 Privaris, Inc.
+000ED1 Osaka Micro Computer.
+000ED2 Filtronic plc
+000ED3 Epicenter, Inc.
+000ED4 CRESITT INDUSTRIE
+000ED5 COPAN Systems Inc.
+000ED6 Cisco Systems
+000ED7 Cisco Systems
+000ED8 Aktino, Inc.
+000ED9 Aksys, Ltd.
+000EDA C-TECH UNITED CORP.
+000EDB XiNCOM Corp.
+000EDC Tellion INC.
+000EDD SHURE INCORPORATED
+000EDE REMEC, Inc.
+000EDF PLX Technology
+000EE0 Mcharge
+000EE1 ExtremeSpeed Inc.
+000EE2 Custom Engineering S.p.A.
+000EE3 Chiyu Technology Co.,Ltd
+000EE5 bitWallet, Inc.
+000EE6 Adimos Systems LTD
+000EE7 AAC ELECTRONICS CORP.
+000EE8 zioncom
+000EE9 WayTech Development, Inc.
+000EEA Shadong Luneng Jicheng Electronics,Co.,Ltd
+000EEB Sandmartin(zhong shan)Electronics Co.,Ltd
+000EEC Orban
+000EED Nokia Danmark A/S
+000EEE Muco Industrie BV
+000EF0 Festo AG & Co. KG
+000EF1 EZQUEST INC.
+000EF2 World Axle Corporation
+000EF3 Smarthome
+000EF4 Shenzhen Kasda Digital Technology Co.,Ltd
+000EF5 iPAC Technology Co., Ltd.
+000EF6 E-TEN Information Systems Co., Ltd.
+000EF7 Vulcan Portals Inc
+000EF8 SBC ASI
+000EF9 REA Elektronik GmbH
+000EFA Optoway Technology Incorporation
+000EFB Macey Enterprises
+000EFC JTAG Technologies B.V.
+000EFD FUJI PHOTO OPTICAL CO., LTD.
+000EFE EndRun Technologies LLC
+000EFF Megasolution,Inc.
+000F00 Legra Systems, Inc.
+000F01 DIGITALKS INC
+000F02 Digicube Technology Co., Ltd
+000F03 COM&C CO., LTD
+000F04 cim-usa inc
+000F05 3B SYSTEM INC.
+000F06 Nortel Networks
+000F07 Mangrove Systems, Inc.
+000F08 Indagon Oy
+000F0B Kentima Technologies AB
+000F0C SYNCHRONIC ENGINEERING
+000F0D Hunt Electronic Co., Ltd.
+000F0E WaveSplitter Technologies, Inc.
+000F0F Real ID Technology Co., Ltd.
+000F10 RDM Corporation
+000F11 Prodrive B.V.
+000F12 Panasonic AVC Networks Germany GmbH
+000F13 Nisca corporation
+000F14 Mindray Co., Ltd.
+000F15 Kjaerulff1 A/S
+000F16 JAY HOW TECHNOLOGY CO.,
+000F17 Insta Elektro GmbH
+000F18 Industrial Control Systems
+000F19 Guidant Corporation
+000F1A Gaming Support B.V.
+000F1B Ego Systems Inc.
+000F1C DigitAll World Co., Ltd
+000F1D Cosmo Techs Co., Ltd.
+000F1E Chengdu KT Electric Co.of High & New Technology
+000F1F WW PCBA Test
+000F20 Hewlett Packard
+000F21 Scientific Atlanta, Inc
+000F22 Helius, Inc.
+000F23 Cisco Systems
+000F24 Cisco Systems
+000F25 AimValley B.V.
+000F26 WorldAccxx LLC
+000F27 TEAL Electronics, Inc.
+000F28 Itronix Corporation
+000F29 Augmentix Corporation
+000F2A Cableware Electronics
+000F2B GREENBELL SYSTEMS
+000F2C Uplogix, Inc.
+000F2D CHUNG-HSIN ELECTRIC & MACHINERY MFG.CORP.
+000F2E Megapower International Corp.
+000F2F W-LINX TECHNOLOGY CO., LTD.
+000F30 Raza Microelectronics Inc
+000F31 Prosilica
+000F32 LuTong Electronic Technology Co.,Ltd
+000F33 DUALi Inc.
+000F34 Cisco Systems
+000F35 Cisco Systems
+000F36 Accurate Techhnologies, Inc.
+000F37 Xambala Incorporated
+000F38 Netstar
+000F39 IRIS SENSORS
+000F3A HISHARP
+000F3B Fuji System Machines Co., Ltd.
+000F3C Endeleo Limited
+000F3D D-Link Corporation
+000F3E CardioNet, Inc
+000F3F Big Bear Networks
+000F40 Optical Internetworking Forum
+000F41 Zipher Ltd
+000F42 Xalyo Systems
+000F43 Wasabi Systems Inc.
+000F44 Tivella Inc.
+000F45 Stretch, Inc.
+000F46 SINAR AG
+000F47 ROBOX SPA
+000F48 Polypix Inc.
+000F49 Northover Solutions Limited
+000F4A Kyushu-kyohan co.,ltd
+000F4B Katana Technology
+000F4C Elextech INC
+000F4D Centrepoint Technologies Inc.
+000F4E Cellink
+000F4F Cadmus Technology Ltd
+000F50 BraddaHead Limited
+000F52 YORK Refrigeration, Marine & Controls
+000F53 Level 5 Networks, Inc.
+000F54 Entrelogic Corporation
+000F55 Datawire Communication Networks Inc.
+000F56 Continuum Photonics Inc
+000F57 CABLELOGIC Co., Ltd.
+000F58 Adder Technology Limited
+000F59 Phonak Communications AG
+000F5A Peribit Networks
+000F5B Delta Information Systems, Inc.
+000F5C Day One Digital Media Limited
+000F5D 42Networks AB
+000F5E Veo
+000F5F Nicety Technologies Inc. (NTS)
+000F60 Lifetron Co.,Ltd
+000F61 Kiwi Networks
+000F62 Alcatel Bell Space N.V.
+000F63 Obzerv Technologies
+000F64 D&R Electronica Weesp BV
+000F65 icube Corp.
+000F66 Cisco-Linksys
+000F67 West Instruments
+000F68 Vavic Network Technology, Inc.
+000F69 SEW Eurodrive GmbH & Co. KG
+000F6A Nortel Networks
+000F6B GateWare Communications GmbH
+000F6C ADDI-DATA GmbH
+000F6D Midas Engineering
+000F6E BBox
+000F6F FTA Communication Technologies
+000F70 Wintec Industries, inc.
+000F71 Sanmei Electronics Co.,Ltd
+000F72 Sandburst
+000F73 Rockwell Samsung Automation
+000F74 Qamcom Technology AB
+000F75 First Silicon Solutions
+000F76 Digital Keystone, Inc.
+000F77 DENTUM CO.,LTD
+000F78 Datacap Systems Inc
+000F79 Bluetooth Interest Group Inc.
+000F7A BeiJing NuQX Technology CO.,LTD
+000F7B Arce Sistemas, S.A.
+000F7C ACTi Corporation
+000F7D Xirrus
+000F7E UIS Abler Electronics Co.,Ltd.
+000F7F UBSTORAGE Co.,Ltd.
+000F80 Trinity Security Systems,Inc.
+000F81 Secure Info Imaging
+000F82 Mortara Instrument, Inc.
+000F83 Brainium Technologies Inc.
+000F84 Astute Networks, Inc.
+000F85 ADDO-Japan Corporation
+000F87 Maxcess International
+000F88 AMETEK, Inc.
+000F89 Winnertec System Co., Ltd.
+000F8A WideView
+000F8B Orion MultiSystems Inc
+000F8C Gigawavetech Pte Ltd
+000F8D FAST TV-Server AG
+000F8E DONGYANG TELECOM CO.,LTD.
+000F8F Cisco Systems
+000F90 Cisco Systems
+000F91 Aerotelecom Co.,Ltd.
+000F92 Microhard Systems Inc.
+000F93 Landis+Gyr Ltd.
+000F94 Genexis
+000F95 ELECOM Co.,LTD Laneed Division
+000F96 Critical Telecom Corp.
+000F97 Avanex Corporation
+000F98 Avamax Co. Ltd.
+000F99 APAC opto Electronics Inc.
+000F9A Synchrony, Inc.
+000F9B Ross Video Limited
+000F9C Panduit Corp
+000F9D Newnham Research Ltd
+000F9E Murrelektronik GmbH
+000F9F Motorola BCS
+000FA0 Lotte Canon Co., Ltd.
+000FA1 Gigabit Systems Inc.
+000FA2 Digital Path Networks
+000FA3 Alpha Networks Inc.
+000FA4 Sprecher Automation GmbH
+000FA5 SMP / BWA Technology GmbH
+000FA6 S2 Security Corporation
+000FA7 Raptor Networks Technology
+000FA8 Photometrics, Inc.
+000FA9 PC Fabrik
+000FAA Nexus Technologies
+000FAB Kyushu Electronics Systems Inc.
+000FAC IEEE 802.11
+000FAD FMN communications GmbH
+000FAE E2O Communications
+000FAF Dialog Inc.
+000FB0 Compal Electronics,INC.
+000FB1 Cognio Inc.
+000FB2 Broadband Pacenet (India) Pvt. Ltd.
+000FB3 Actiontec Electronics, Inc
+000FB4 Timespace Technology
+000FB5 NETGEAR Inc
+000FB6 Europlex Technologies
+000FB7 Cavium Networks
+000FB8 CallURL Inc.
+000FB9 Adaptive Instruments
+000FBA Tevebox AB
+000FBB Siemens AG, ICN M&L TDC EP
+000FBC Onkey Technologies, Inc.
+000FBD MRV Communications (Networks) LTD
+000FBE e-w/you Inc.
+000FBF DGT Sp. z o.o.
+000FC0 DELCOMp
+000FC1 WAVE Corporation
+000FC2 Uniwell Corporation
+000FC3 PalmPalm Technology, Inc.
+000FC4 NST co.,LTD.
+000FC5 KeyMed Ltd
+000FC6 Eurocom Industries A/S
+000FC7 Dionica R&D Ltd.
+000FC8 Chantry Networks
+000FC9 Allnet GmbH
+000FCA A-JIN TECHLINE CO, LTD
+000FCB 3COM EUROPE LTD
+000FCC Netopia, Inc.
+000FCD Nortel Networks
+000FCE Kikusui Electronics Corp.
+000FCF Datawind Research
+000FD0 ASTRI
+000FD1 Applied Wireless Identifications Group, Inc.
+000FD2 EWA Technologies, Inc.
+000FD3 Digium
+000FD4 Soundcraft
+000FD5 Schwechat - RISE
+000FD6 Sarotech Co., Ltd
+000FD7 Harman Music Group
+000FD8 Force, Inc.
+000FD9 FlexDSL Telecommunications AG
+000FDA YAZAKI CORPORATION
+000FDB Westell Technologies
+000FDC Ueda Japan Radio Co., Ltd.
+000FDD SORDIN AB
+000FDE Sony Ericsson Mobile Communications AB
+000FDF SOLOMON Technology Corp.
+000FE0 NComputing Co.,Ltd.
+000FE1 ID DIGITAL CORPORATION
+000FE2 Hangzhou Huawei-3Com Tech. Co., Ltd.
+000FE3 Damm Cellular Systems A/S
+000FE4 Pantech Co.,Ltd
+000FE5 MERCURY SECURITY CORPORATION
+000FE6 MBTech Systems, Inc.
+000FE7 Lutron Electronics Co., Inc.
+000FE8 Lobos, Inc.
+000FE9 GW TECHNOLOGIES CO.,LTD.
+000FEA Giga-Byte Technology Co.,LTD.
+000FEB Cylon Controls
+000FEC Arkus Inc.
+000FED Anam Electronics Co., Ltd
+000FEE XTec, Incorporated
+000FEF Thales e-Transactions GmbH
+000FF0 Sunray Enterprise
+000FF1 nex-G Systems Pte.Ltd
+000FF2 Loud Technologies Inc.
+000FF3 Jung Myoung Communications&Technology
+000FF4 Guntermann & Drunck GmbH
+000FF5 GN&S company
+000FF6 Darfon Electronics Corp.
+000FF7 Cisco Systems
+000FF8 Cisco Systems
+000FF9 Valcretec, Inc.
+000FFA Optinel Systems, Inc.
+000FFB Nippon Denso Industry Co., Ltd.
+000FFC Merit Li-Lin Ent.
+000FFD Glorytek Network Inc.
+000FFE G-PRO COMPUTER
+000FFF Control4
+001000 CABLE TELEVISION LABORATORIES, INC.
+001001 MCK COMMUNICATIONS
+001002 ACTIA
+001003 IMATRON, INC.
+001004 THE BRANTLEY COILE COMPANY,INC
+001005 UEC COMMERCIAL
+001006 Thales Contact Solutions Ltd.
+001007 CISCO SYSTEMS, INC.
+001008 VIENNA SYSTEMS CORPORATION
+001009 HORO QUARTZ
+00100A WILLIAMS COMMUNICATIONS GROUP
+00100B CISCO SYSTEMS, INC.
+00100C ITO CO., LTD.
+00100D CISCO SYSTEMS, INC.
+00100E MICRO LINEAR COPORATION
+00100F INDUSTRIAL CPU SYSTEMS
+001010 INITIO CORPORATION
+001011 CISCO SYSTEMS, INC.
+001012 PROCESSOR SYSTEMS (I) PVT LTD
+001013 Kontron
+001014 CISCO SYSTEMS, INC.
+001015 OOmon Inc.
+001016 T.SQWARE
+001017 MICOS GmbH
+001018 BROADCOM CORPORATION
+001019 SIRONA DENTAL SYSTEMS GmbH & Co. KG
+00101A PictureTel Corp.
+00101B CORNET TECHNOLOGY, INC.
+00101C OHM TECHNOLOGIES INTL, LLC
+00101D WINBOND ELECTRONICS CORP.
+00101E MATSUSHITA ELECTRONIC INSTRUMENTS CORP.
+00101F CISCO SYSTEMS, INC.
+001020 WELCH ALLYN, DATA COLLECTION
+001021 ENCANTO NETWORKS, INC.
+001022 SatCom Media Corporation
+001023 FLOWWISE NETWORKS, INC.
+001024 NAGOYA ELECTRIC WORKS CO., LTD
+001025 GRAYHILL INC.
+001026 ACCELERATED NETWORKS, INC.
+001027 L-3 COMMUNICATIONS EAST
+001028 COMPUTER TECHNICA, INC.
+001029 CISCO SYSTEMS, INC.
+00102A ZF MICROSYSTEMS, INC.
+00102B UMAX DATA SYSTEMS, INC.
+00102C Lasat Networks A/S
+00102D HITACHI SOFTWARE ENGINEERING
+00102E NETWORK SYSTEMS & TECHNOLOGIES PVT. LTD.
+00102F CISCO SYSTEMS, INC.
+001030 Wi-LAN, Inc.
+001031 OBJECTIVE COMMUNICATIONS, INC.
+001032 ALTA TECHNOLOGY
+001033 ACCESSLAN COMMUNICATIONS, INC.
+001034 GNP Computers
+001035 ELITEGROUP COMPUTER SYSTEMS CO., LTD
+001036 INTER-TEL INTEGRATED SYSTEMS
+001037 CYQ've Technology Co., Ltd.
+001038 MICRO RESEARCH INSTITUTE, INC.
+001039 Vectron Systems AG
+00103A DIAMOND NETWORK TECH
+00103B HIPPI NETWORKING FORUM
+00103C IC ENSEMBLE, INC.
+00103D PHASECOM, LTD.
+00103E NETSCHOOLS CORPORATION
+00103F TOLLGRADE COMMUNICATIONS, INC.
+001040 INTERMEC CORPORATION
+001041 BRISTOL BABCOCK, INC.
+001042 AlacriTech
+001043 A2 CORPORATION
+001044 InnoLabs Corporation
+001045 Nortel Networks
+001046 ALCORN MCBRIDE INC.
+001047 ECHO ELETRIC CO. LTD.
+001048 HTRC AUTOMATION, INC.
+001049 SHORELINE TELEWORKS, INC.
+00104A THE PARVUC CORPORATION
+00104B 3COM CORPORATION
+00104C COMPUTER ACCESS TECHNOLOGY
+00104D SURTEC INDUSTRIES, INC.
+00104E CEOLOGIC
+00104F STORAGE TECHNOLOGY CORPORATION
+001050 RION CO., LTD.
+001051 CMICRO CORPORATION
+001052 METTLER-TOLEDO (ALBSTADT) GMBH
+001053 COMPUTER TECHNOLOGY CORP.
+001054 CISCO SYSTEMS, INC.
+001055 FUJITSU MICROELECTRONICS, INC.
+001056 SODICK CO., LTD.
+001057 Rebel.com, Inc.
+001058 ArrowPoint Communications
+001059 DIABLO RESEARCH CO. LLC
+00105A 3COM CORPORATION
+00105B NET INSIGHT AB
+00105C QUANTUM DESIGNS (H.K.) LTD.
+00105D Draeger Medical
+00105E HEKIMIAN LABORATORIES, INC.
+00105F IN-SNEC
+001060 BILLIONTON SYSTEMS, INC.
+001061 HOSTLINK CORP.
+001062 NX SERVER, ILNC.
+001063 STARGUIDE DIGITAL NETWORKS
+001064 DNPG, LLC
+001065 RADYNE CORPORATION
+001066 ADVANCED CONTROL SYSTEMS, INC.
+001067 REDBACK NETWORKS, INC.
+001068 COMOS TELECOM
+001069 HELIOSS COMMUNICATIONS, INC.
+00106A DIGITAL MICROWAVE CORPORATION
+00106B SONUS NETWORKS, INC.
+00106C INFRATEC PLUS GmbH
+00106D INTEGRITY COMMUNICATIONS, INC.
+00106E TADIRAN COM. LTD.
+00106F TRENTON TECHNOLOGY INC.
+001070 CARADON TREND LTD.
+001071 ADVANET INC.
+001072 GVN TECHNOLOGIES, INC.
+001073 TECHNOBOX, INC.
+001074 ATEN INTERNATIONAL CO., LTD.
+001075 Maxtor Corporation
+001076 EUREM GmbH
+001077 SAF DRIVE SYSTEMS, LTD.
+001078 NUERA COMMUNICATIONS, INC.
+001079 CISCO SYSTEMS, INC.
+00107A AmbiCom, Inc.
+00107B CISCO SYSTEMS, INC.
+00107C P-COM, INC.
+00107D AURORA COMMUNICATIONS, LTD.
+00107E BACHMANN ELECTRONIC GmbH
+00107F CRESTRON ELECTRONICS, INC.
+001080 METAWAVE COMMUNICATIONS
+001081 DPS, INC.
+001082 JNA TELECOMMUNICATIONS LIMITED
+001083 HEWLETT-PACKARD COMPANY
+001084 K-BOT COMMUNICATIONS
+001085 POLARIS COMMUNICATIONS, INC.
+001086 ATTO TECHNOLOGY, INC.
+001087 Xstreamis PLC
+001088 AMERICAN NETWORKS INC.
+001089 WebSonic
+00108A TeraLogic, Inc.
+00108B LASERANIMATION SOLLINGER GmbH
+00108C FUJITSU TELECOMMUNICATIONS EUROPE, LTD.
+00108D JOHNSON CONTROLS, INC.
+00108E HUGH SYMONS CONCEPT Technologies Ltd.
+00108F RAPTOR SYSTEMS
+001090 CIMETRICS, INC.
+001091 NO WIRES NEEDED BV
+001092 NETCORE INC.
+001093 CMS COMPUTERS, LTD.
+001094 Performance Analysis Broadband, Spirent plc
+001095 Thompson Inc.
+001096 TRACEWELL SYSTEMS, INC.
+001097 WinNet Metropolitan Communications Systems, Inc.
+001098 STARNET TECHNOLOGIES, INC.
+001099 InnoMedia, Inc.
+00109A NETLINE
+00109B Emulex Corporation
+00109C M-SYSTEM CO., LTD.
+00109D CLARINET SYSTEMS, INC.
+00109E AWARE, INC.
+00109F PAVO, INC.
+0010A0 INNOVEX TECHNOLOGIES, INC.
+0010A1 KENDIN SEMICONDUCTOR, INC.
+0010A2 TNS
+0010A3 OMNITRONIX, INC.
+0010A4 XIRCOM
+0010A5 OXFORD INSTRUMENTS
+0010A6 CISCO SYSTEMS, INC.
+0010A7 UNEX TECHNOLOGY CORPORATION
+0010A8 RELIANCE COMPUTER CORP.
+0010A9 ADHOC TECHNOLOGIES
+0010AA MEDIA4, INC.
+0010AB KOITO INDUSTRIES, LTD.
+0010AC IMCI TECHNOLOGIES
+0010AD SOFTRONICS USB, INC.
+0010AE SHINKO ELECTRIC INDUSTRIES CO.
+0010AF TAC SYSTEMS, INC.
+0010B0 MERIDIAN TECHNOLOGY CORP.
+0010B1 FOR-A CO., LTD.
+0010B2 COACTIVE AESTHETICS
+0010B3 NOKIA MULTIMEDIA TERMINALS
+0010B4 ATMOSPHERE NETWORKS
+0010B5 ACCTON TECHNOLOGY CORPORATION
+0010B6 ENTRATA COMMUNICATIONS CORP.
+0010B7 COYOTE TECHNOLOGIES, LLC
+0010B8 ISHIGAKI COMPUTER SYSTEM CO.
+0010B9 MAXTOR CORP.
+0010BA MARTINHO-DAVIS SYSTEMS, INC.
+0010BB DATA & INFORMATION TECHNOLOGY
+0010BC Aastra Telecom
+0010BD THE TELECOMMUNICATION TECHNOLOGY COMMITTEE
+0010BE TELEXIS CORP.
+0010BF InterAir Wireless
+0010C0 ARMA, INC.
+0010C1 OI ELECTRIC CO., LTD.
+0010C2 WILLNET, INC.
+0010C3 CSI-CONTROL SYSTEMS
+0010C4 MEDIA LINKS CO., LTD.
+0010C5 PROTOCOL TECHNOLOGIES, INC.
+0010C6 USI
+0010C7 DATA TRANSMISSION NETWORK
+0010C8 COMMUNICATIONS ELECTRONICS SECURITY GROUP
+0010C9 MITSUBISHI ELECTRONICS LOGISTIC SUPPORT CO.
+0010CA INTEGRAL ACCESS
+0010CB FACIT K.K.
+0010CC CLP COMPUTER LOGISTIK PLANUNG GmbH
+0010CD INTERFACE CONCEPT
+0010CE VOLAMP, LTD.
+0010CF FIBERLANE COMMUNICATIONS
+0010D0 WITCOM, LTD.
+0010D1 Top Layer Networks, Inc.
+0010D2 NITTO TSUSHINKI CO., LTD
+0010D3 GRIPS ELECTRONIC GMBH
+0010D4 STORAGE COMPUTER CORPORATION
+0010D5 IMASDE CANARIAS, S.A.
+0010D6 ITT - A/CD
+0010D7 ARGOSY RESEARCH INC.
+0010D8 CALISTA
+0010D9 IBM JAPAN, FUJISAWA MT+D
+0010DA MOTION ENGINEERING, INC.
+0010DB NetScreen Technologies, Inc.
+0010DC MICRO-STAR INTERNATIONAL CO., LTD.
+0010DD ENABLE SEMICONDUCTOR, INC.
+0010DE INTERNATIONAL DATACASTING CORPORATION
+0010DF RISE COMPUTER INC.
+0010E0 COBALT MICROSERVER, INC.
+0010E1 S.I. TECH, INC.
+0010E2 ArrayComm, Inc.
+0010E3 COMPAQ COMPUTER CORPORATION
+0010E4 NSI CORPORATION
+0010E5 SOLECTRON TEXAS
+0010E6 APPLIED INTELLIGENT SYSTEMS, INC.
+0010E7 BreezeCom
+0010E8 TELOCITY, INCORPORATED
+0010E9 RAIDTEC LTD.
+0010EA ADEPT TECHNOLOGY
+0010EB SELSIUS SYSTEMS, INC.
+0010EC RPCG, LLC
+0010ED SUNDANCE TECHNOLOGY, INC.
+0010EE CTI PRODUCTS, INC.
+0010EF DBTEL INCORPORATED
+0010F1 I-O CORPORATION
+0010F2 ANTEC
+0010F3 Nexcom International Co., Ltd.
+0010F4 VERTICAL NETWORKS, INC.
+0010F5 AMHERST SYSTEMS, INC.
+0010F6 CISCO SYSTEMS, INC.
+0010F7 IRIICHI TECHNOLOGIES Inc.
+0010F8 KENWOOD TMI CORPORATION
+0010F9 UNIQUE SYSTEMS, INC.
+0010FA ZAYANTE, INC.
+0010FB ZIDA TECHNOLOGIES LIMITED
+0010FC BROADBAND NETWORKS, INC.
+0010FD COCOM A/S
+0010FE DIGITAL EQUIPMENT CORPORATION
+0010FF CISCO SYSTEMS, INC.
+001100 RAM Industries, LLC
+001101 CET Technologies Pte Ltd
+001102 Aurora Multimedia Corp.
+001103 kawamura electric inc.
+001104 TELEXY
+001105 Sunplus Technology Co., Ltd.
+001106 Siemens NV (Belgium)
+001107 RGB Networks Inc.
+001108 Orbital Data Corporation
+001109 Micro-Star International
+00110A Hewlett Packard
+00110B Franklin Technology Systems
+00110C Atmark Techno, Inc.
+00110D SANBlaze Technology, Inc.
+00110E Tsurusaki Sealand Transportation Co. Ltd.
+00110F netplat,Inc.
+001110 Maxanna Technology Co., Ltd.
+001111 Intel Corporation
+001112 Honeywell CMSS
+001113 Fraunhofer FOKUS
+001114 EverFocus Electronics Corp.
+001115 EPIN Technologies, Inc.
+001116 COTEAU VERT CO., LTD.
+001117 CESNET
+001118 BLX IC Design Corp., Ltd.
+001119 Solteras, Inc.
+00111A Motorola BCS
+00111B Targa Systems Div L-3 Communications Canada
+00111C Pleora Technologies Inc.
+00111D Hectrix Limited
+00111E EPSG (Ethernet Powerlink Standardization Group)
+00111F Doremi Labs, Inc.
+001120 Cisco Systems
+001121 Cisco Systems
+001122 CIMSYS Inc
+001123 Appointech, Inc.
+001124 Apple Computer
+001125 IBM Corporation
+001126 Venstar Inc.
+001127 TASI, Inc
+001128 Streamit
+001129 Paradise Datacom Ltd.
+00112A Niko NV
+00112B NetModule
+00112C IZT GmbH
+00112D Guys Without Ties
+00112E CEICOM
+00112F ASUSTek Computer Inc.
+001130 Allied Telesis (Hong Kong) Ltd.
+001131 UNATECH. CO.,LTD
+001132 Synology Incorporated
+001133 Siemens Austria SIMEA
+001134 MediaCell, Inc.
+001135 Grandeye Ltd
+001136 Goodrich Sensor Systems
+001137 AICHI ELECTRIC CO., LTD.
+001138 TAISHIN CO., LTD.
+001139 STOEBER ANTRIEBSTECHNIK GmbH + Co. KG.
+00113A SHINBORAM
+00113B Micronet Communications Inc.
+00113C Micronas GmbH
+00113D KN SOLTEC CO.,LTD.
+00113E JL Corporation
+00113F Alcatel DI
+001140 Nanometrics Inc.
+001141 GoodMan Corporation
+001142 e-SMARTCOM INC.
+001143 DELL INC. (WW PCBA Test)
+001144 Assurance Technology Corp
+001145 ValuePoint Networks
+001147 Secom-Industry co.LTD.
+001148 Prolon Control Systems
+001149 Proliphix LLC
+00114A KAYABA INDUSTRY Co,.Ltd.
+00114B Francotyp-Postalia AG & Co. KG
+00114C caffeina applied research ltd.
+00114D Atsumi Electric Co.,LTD.
+00114E 690885 Ontario Inc.
+00114F US Digital Television, Inc
+001150 Belkin Corporation
+001151 Mykotronx
+001152 Eidsvoll Electronics AS
+001153 Trident Tek, Inc.
+001154 Webpro Technologies Inc.
+001155 Sevis Systems
+001156 Pharos Systems NZ
+001157 OF Networks Co., Ltd.
+001158 Nortel Networks
+001159 MATISSE NETWORKS INC
+00115A Ivoclar Vivadent AG
+00115B Elitegroup Computer System Co. (ECS)
+00115C Cisco
+00115D Cisco
+00115E ProMinent Dosiertechnik GmbH
+00115F Intellix Co., Ltd.
+001160 ARTDIO Company Co., LTD
+001161 NetStreams, LLC
+001162 STAR MICRONICS CO.,LTD.
+001163 SYSTEM SPA DEPT. ELECTRONICS
+001164 ACARD Technology Corp.
+001165 Znyx Networks
+001166 Taelim Electronics Co., Ltd.
+001167 Integrated System Solution Corp.
+001168 HomeLogic LLC
+001169 EMS Satcom
+00116A Domo Ltd
+00116B Digital Data Communications Asia Co.,Ltd
+00116C Nanwang Multimedia Inc.,Ltd
+00116D American Time and Signal
+00116E PePLink Ltd.
+00116F Netforyou Co., LTD.
+001170 GSC SRL
+001171 DEXTER Communications, Inc.
+001172 COTRON CORPORATION
+001173 Adtron Corporation
+001174 Wibhu Technologies, Inc.
+001175 PathScale, Inc.
+001176 Intellambda Systems, Inc.
+001177 COAXIAL NETWORKS, INC.
+001178 Chiron Technology Ltd
+001179 Singular Technology Co. Ltd.
+00117A Singim International Corp.
+00117B Bchi Labortechnik AG
+00117C e-zy.net
+00117D ZMD America, Inc.
+00117E Progeny Inc.
+00117F Neotune Information Technology Corporation,.LTD
+001180 Motorola BCS
+001181 InterEnergy Co.Ltd,
+001182 IMI Norgren Ltd
+001183 PSC Scanning, Inc
+001184 Humo Laboratory,Ltd.
+001185 Hewlett Packard
+001186 Prime Systems, Inc.
+001187 Category Solutions, Inc
+001188 Enterasys
+001189 Aerotech Inc
+00118A Viewtran Technology Limited
+00118B NetDevices Inc.
+00118C Missouri Department of Transportation
+00118D Hanchang System Corp.
+00118E Halytech Mace
+00118F EUTECH INSTRUMENTS PTE. LTD.
+001190 Digital Design Corporation
+001191 CTS-Clima Temperatur Systeme GmbH
+001192 Cisco Systems
+001193 Cisco Systems
+001194 Chi Mei Communication Systems, Inc.
+001195 Alpha Networks Inc.
+001196 Actuality Systems, Inc.
+001197 Monitoring Technologies Limited
+001198 Prism Media Products Limited
+001199 2wcom GmbH
+00119A Alkeria srl
+00119B Telesynergy Research Inc.
+00119C EP&T Energy
+00119D Diginfo Technology Corporation
+00119F Nokia Danmark A/S
+0011A0 Vtech Engineering Canada Ltd
+0011A1 VISION NETWARE CO.,LTD
+0011A2 Manufacturing Technology Inc
+0011A3 LanReady Technologies Inc.
+0011A4 JStream Technologies Inc.
+0011A5 Fortuna Electronic Corp.
+0011A6 Sypixx Networks
+0011A7 Infilco Degremont Inc.
+0011A8 Quest Technologies
+0011A9 MOIMSTONE Co., LTD
+0011AA Uniclass Technology, Co., LTD
+0011AB TRUSTABLE TECHNOLOGY CO.,LTD.
+0011AC Simtec Electronics
+0011AD Shanghai Ruijie Technology
+0011AE Motorola BCS
+0011AF Medialink-i,Inc
+0011B0 Fortelink Inc.
+0011B1 BlueExpert Technology Corp.
+0011B2 2001 Technology Inc.
+0011B3 YOSHIMIYA CO.,LTD.
+0011B4 Westermo Teleindustri AB
+0011B5 Shenzhen Powercom Co.,Ltd
+0011B6 Open Systems International
+0011B7 Melexis Nederland B.V.
+0011B8 Liebherr - Elektronik GmbH
+0011B9 Inner Range Pty. Ltd.
+0011BA Elexol Pty Ltd
+0011BB Cisco Systems
+0011BC Cisco Systems
+0011BD Bombardier Transportation
+0011BE AGP Telecom Co. Ltd
+0011BF AESYS S.p.A.
+0011C0 Aday Technology Inc
+0011C1 4P MOBILE DATA PROCESSING
+0011C2 United Fiber Optic Communication
+0011C3 Transceiving System Technology Corporation
+0011C4 Terminales de Telecomunicacion Terrestre, S.L.
+0011C5 TEN Technology
+0011C6 Seagate Technology LLC
+0011C7 RAYMARINE Group Ltd.
+0011C8 Powercom Co., Ltd.
+0011C9 MTT Corporation
+0011CA Long Range Systems, Inc.
+0011CB Jacobsons RKH AB
+0011CC Guangzhou Jinpeng Group Co.,Ltd.
+0011CD Axsun Technologies
+0011CE Ubisense Limited
+0011CF Thrane & Thrane A/S
+0011D0 Tandberg Data ASA
+0011D1 Soft Imaging System GmbH
+0011D2 Perception Digital Ltd
+0011D3 NextGenTel Holding ASA
+0011D4 NetEnrich, Inc
+0011D5 Hangzhou Sunyard System Engineering Co.,Ltd.
+0011D6 HandEra, Inc.
+0011D7 eWerks Inc
+0011D8 ASUSTek Computer Inc.
+0011D9 TiVo
+0011DA Vivaas Technology Inc.
+0011DB Land-Cellular Corporation
+0011DC Glunz & Jensen
+0011DD FROMUS TEC. Co., Ltd.
+0011DE EURILOGIC
+0011DF Arecont Systems
+0011E0 U-MEDIA Communications, Inc.
+0011E1 BEKO Electronics Co.
+0011E2 Hua Jung Components Co., Ltd.
+0011E3 Broadband Access Products
+0011E4 Danelec Electronics A/S
+0011E5 KCodes Corporation
+0011E6 Scientific Atlanta
+0011E7 WORLDSAT - Texas de France
+0011E8 Tixi.Com
+0011E9 STARNEX CO., LTD.
+0011EA IWICS Inc.
+0011EB Innovative Integration
+0011EC AVIX INC.
+0011ED 802 Global
+0011EE Estari, Inc.
+0011EF Conitec Datensysteme GmbH
+0011F0 Wideful Limited
+0011F1 QinetiQ Ltd
+0011F2 Institute of Network Technologies
+0011F3 Gavitec AG- mobile digit
+0011F4 woori-net
+0011F5 ASKEY COMPUTER CORP.
+0011F6 Asia Pacific Microsystems , Inc.
+0011F7 Shenzhen Forward Industry Co., Ltd
+0011F8 AIRAYA Corp
+0011F9 Nortel Networks
+0011FA Rane Corporation
+0011FB Heidelberg Engineering GmbH
+0011FC HARTING Electric Gmbh & Co.KG
+0011FD KORG INC.
+0011FE Keiyo System Research, Inc.
+0011FF Digitro Tecnologia Ltda
+001200 Cisco
+001201 Cisco
+001202 Audio International Inc.
+001203 Activ Networks
+001204 u10 Networks, Inc.
+001205 Terrasat Communications, Inc.
+001206 iQuest (NZ) Ltd
+001207 Head Strong International Limited
+001208 Gantner Electronic GmbH
+001209 Fastrax Ltd
+00120A Emerson Electric GmbH & Co. OHG
+00120B Chinasys Technologies Limited
+00120C CE-Infosys Pte Ltd
+00120D Advanced Telecommunication Technologies, Inc.
+00120E AboCom
+00120F IEEE 802.3
+001210 WideRay Corp
+001211 Protechna Herbst GmbH & Co. KG
+001212 PLUS Vision Corporation
+001213 Metrohm AG
+001214 Koenig & Bauer AG
+001215 iStor Networks, Inc.
+001216 ICP Internet Communication Payment AG
+001217 Cisco-Linksys, LLC
+001218 ARUZE Corporation
+001219 Ahead Communication Systems Inc
+00121A Techno Soft Systemnics Inc.
+00121B Sound Devices, LLC
+00121C PARROT S.A.
+00121D Netfabric Corporation
+00121E Juniper Networks, Inc.
+00121F Harding Intruments
+001220 Cadco Systems
+001221 B.Braun Melsungen AG
+001222 Skardin (UK) Ltd
+001223 Pixim
+001224 NexQL Corporation
+001225 Motorola BCS
+001226 Japan Direx Corporation
+001227 Franklin Electric Co., Inc.
+001228 Data Ltd.
+001229 BroadEasy Technologies Co.,Ltd
+00122A VTech Telecommunications Ltd.
+00122B Virbiage Pty Ltd
+00122C Soenen Controls N.V.
+00122D SiNett Corporation
+00122E Signal Technology - AISD
+00122F Sanei Electric Inc.
+001230 Picaso Infocommunication CO., LTD.
+001231 Motion Control Systems, Inc.
+001232 LeWiz Communications Inc.
+001233 JRC TOKKI Co.,Ltd.
+001234 Camille Bauer
+001235 Andrew Corporation
+001236 Tidal Networks
+001237 Texas Instruments
+001238 SetaBox Technology Co., Ltd.
+001239 S Net Systems Inc.
+00123A Posystech Inc., Co.
+00123B KeRo Systems ApS
+00123C IP3 Networks, Inc.
+00123D GES
+00123E ERUNE technology Co., Ltd.
+00123F Dell Inc
+001240 AMOI ELECTRONICS CO.,LTD
+001241 a2i marketing center
+001242 Millennial Net
+001243 Cisco
+001244 Cisco
+001245 Zellweger Analytics, Inc.
+001246 T.O.M TECHNOLOGY INC..
+001247 Samsung Electronics Co., Ltd.
+001248 Kashya Inc.
+001249 Delta Elettronica S.p.A.
+00124A Dedicated Devices, Inc.
+00124B Chipcon AS
+00124C BBWM Corporation
+00124D Inducon BV
+00124E XAC AUTOMATION CORP.
+00124F Tyco Thermal Controls LLC.
+001250 Tokyo Aircaft Instrument Co., Ltd.
+001251 SILINK
+001252 Citronix, LLC
+001253 AudioDev AB
+001254 Spectra Technologies Holdings Company Ltd
+001255 NetEffect Incorporated
+001256 LG INFORMATION & COMM.
+001257 LeapComm Communication Technologies Inc.
+001258 Activis Polska
+001259 THERMO ELECTRON KARLSRUHE
+00125A Microsoft Corporation
+00125B KAIMEI ELECTRONI
+00125C Green Hills Software, Inc.
+00125D CyberNet Inc.
+00125E CAEN
+00125F AWIND Inc.
+001260 Stanton Magnetics,inc.
+001261 Adaptix, Inc
+001262 Nokia Danmark A/S
+001263 Data Voice Technologies GmbH
+001264 daum electronic gmbh
+001265 Enerdyne Technologies, Inc.
+001267 Matsushita Electronic Components Co., Ltd.
+001268 IPS d.o.o.
+001269 Value Electronics
+00126A OPTOELECTRONICS Co., Ltd.
+00126B Ascalade Communications Limited
+00126C Visonic Ltd.
+00126D University of California, Berkeley
+00126E Seidel Elektronik GmbH Nfg.KG
+00126F Rayson Technology Co., Ltd.
+001270 NGES Denro Systems
+001271 Measurement Computing Corp
+001272 Redux Communications Ltd.
+001273 Stoke Inc
+001274 NIT lab
+001275 Moteiv Corporation
+001276 Microsol Holdings Ltd.
+001277 Korenix Technologies Co., Ltd.
+001278 International Bar Code
+001279 Hewlett Packard
+00127A Sanyu Industry Co.,Ltd.
+00127B VIA Networking Technologies, Inc.
+00127C PM-LUFT AB
+00127D MobileAria
+00127E Digital Lifestyles Group, Inc.
+00127F Cisco
+001280 Cisco
+001281 CIEFFE srl
+001282 Qovia
+001283 Nortel Networks
+001284 Lab33 Srl
+001285 Gizmondo Europe Ltd
+001286 ENDEVCO CORP
+001287 Digital Everywhere Unterhaltungselektronik GmbH
+001288 2Wire, Inc
+001289 Advance Sterilization Products
+00128A Motorola PCS
+00128B Sensory Networks Inc
+00128C Woodward Governor
+00128D STB Datenservice GmbH
+00128E Q-Free ASA
+00128F Montilio
+001290 KYOWA Electric & Machinery Corp.
+001291 KWS Computersysteme GmbH
+001292 Griffin Technology
+001293 GE Energy
+001294 Eudyna Devices Inc.
+001295 Aiware Inc.
+001296 Addlogix
+001297 O2Micro, Inc.
+001298 MICO ELECTRIC(SHENZHEN) LIMITED
+001299 Ktech Telecommunications Inc
+00129A IRT Electronics Pty Ltd
+00129B E2S Electronic Engineering Solutions, S.L.
+00129C Yulinet
+00129D FIRST INTERNATIONAL COMPUTER DO BRASIL LTDA
+00129E Surf Communications Inc.
+00129F RAE Systems, Inc.
+0012A0 NeoMeridian Sdn Bhd
+0012A1 BluePacket Communications Co., Ltd.
+0012A2 VITA
+0012A3 Trust International B.V.
+0012A4 ThingMagic, LLC
+0012A5 Stargen, Inc.
+0012A6 Lake Technology Ltd
+0012A7 ISR TECHNOLOGIES Inc
+0012A8 intec GmbH
+0012A9 3COM EUROPE LTD
+0012AA IEE, Inc.
+0012AB WiLife, Inc.
+0012AC ONTIMETEK INC.
+0012AD IDS GmbH
+0012AE HLS HARD-LINE Solutions Inc.
+0012AF ELPRO Technologies
+0012B0 Efore Oyj (Plc)
+0012B1 Dai Nippon Printing Co., Ltd
+0012B2 AVOLITES LTD.
+0012B3 Advance Wireless Technology Corp.
+0012B4 Work GmbH
+0012B5 Vialta, Inc.
+0012B6 Santa Barbara Infrared, Inc.
+0012B7 PTW Freiburg
+0012B8 G2 Microsystems
+0012B9 Fusion Digital Technology
+0012BA FSI Systems, Inc.
+0012BB Telecommunications Industry Association TR-41 Committee
+0012BC Echolab LLC
+0012BD Avantec Manufacturing Limited
+0012BE Astek Corporation
+0012BF Arcadyan Technology Corporation
+0012C0 HotLava Systems, Inc.
+0012C1 Check Point Software Technologies
+0012C2 Apex Electronics Factory
+0012C3 WIT S.A.
+0012C4 Viseon, Inc.
+0012C5 V-Show Technology Co.Ltd
+0012C6 TGC America, Inc
+0012C7 SECURAY Technologies Ltd.Co.
+0012C8 Perfect tech
+0012C9 Motorola BCS
+0012CA Hansen Telecom
+0012CB CSS Inc.
+0012CC Bitatek CO., LTD
+0012CD ASEM SpA
+0012CE Advanced Cybernetics Group
+0012CF Accton Technology Corporation
+0012D0 Gossen-Metrawatt-GmbH
+0012D1 Texas Instruments Inc
+0012D2 Texas Instruments
+0012D3 Zetta Systems, Inc.
+0012D4 Princeton Technology, Ltd
+0012D5 Motion Reality Inc.
+0012D6 Jiangsu Yitong High-Tech Co.,Ltd
+0012D7 Invento Networks, Inc.
+0012D8 International Games System Co., Ltd.
+0012D9 Cisco Systems
+0012DA Cisco Systems
+0012DC SunCorp Industrial Limited
+0012DD Shengqu Information Technology (Shanghai) Co., Ltd.
+0012DE Radio Components Sweden AB
+0012DF Novomatic AG
+0012E0 Codan Limited
+0012E1 Alliant Networks, Inc
+0012E2 ALAXALA Networks Corporation
+0012E3 Agat-RT, Ltd.
+0012E4 ZIEHL industrie-electronik GmbH + Co KG
+0012E5 Time America, Inc.
+0012E6 SPECTEC COMPUTER CO., LTD.
+0012E7 Projectek Networking Electronics Corp.
+0012E8 Fraunhofer IMS
+0012E9 Abbey Systems Ltd
+0012EA Trane
+0012EB R2DI, LLC
+0012EC Movacolor b.v.
+0012ED AVG Advanced Technologies
+0012EE Sony Ericsson Mobile Communications AB
+0012EF OneAccess SA
+0012F0 Intel Corporate
+0012F1 IFOTEC
+0012F2 Foundry Networks
+0012F3 connectBlue AB
+0012F4 Belco International Co.,Ltd.
+0012F5 Prolificx Ltd
+0012F6 MDK CO.,LTD.
+0012F7 Xiamen Xinglian Electronics Co., Ltd.
+0012F8 WNI Resources, LLC
+0012F9 URYU SEISAKU, LTD.
+0012FA THX LTD
+0012FB Samsung Electronics
+0012FC PLANET System Co.,LTD
+0012FD OPTIMUS IC S.A.
+0012FE Lenovo Mobile Communication Technology Ltd.
+0012FF Lely Industries N.V.
+001300 IT-FACTORY, INC.
+001301 IronGate S.L.
+001302 Intel Corporate
+001303 GateConnect Technologies GmbH
+001304 Flaircomm Technologies Co. LTD
+001305 Epicom, Inc.
+001306 Always On Wireless
+001307 Accenia, Inc.
+001308 Nuvera Fuel Cells
+001309 Ocean Broadband Networks
+00130A Nortel
+00130B Mextal B.V.
+00130C HF System Corporation
+00130D GALILEO AVIONICA
+00130E Focusrite Audio Engineering Limited
+00130F EGEMEN Bilgisayar Muh San ve Tic LTD STI
+001310 Cisco-Linksys, LLC
+001311 ARRIS International
+001312 Amedia Networks Inc.
+001313 GuangZhou Post & Telecom Equipment ltd
+001314 Asiamajor Inc.
+001315 SONY Computer Entertainment inc,
+001316 L-S-B GmbH
+001317 GN Netcom as
+001318 DGSTATION Co., Ltd.
+001319 Cisco Systems
+00131A Cisco Systems
+00131B BeCell Innovations Corp.
+00131C LiteTouch, Inc.
+00131D Scanvaegt International A/S
+00131E Peiker acustic GmbH & Co. KG
+00131F NxtPhase T&D, Corp.
+001320 Intel Corporate
+001321 Hewlett Packard
+001322 DAQ Electronics, Inc.
+001323 Cap Co., Ltd.
+001324 Schneider Electric Ultra Terminal
+001325 ImmenStar Inc.
+001326 ECM Systems Ltd
+001327 Data Acquisitions limited
+001328 Westech Korea Inc.,
+001329 VSST Co., LTD
+00132A STROM telecom, s. r. o.
+00132B Phoenix Digital
+00132C MAZ Brandenburg GmbH
+00132D iWise Communications Pty Ltd
+00132E ITian Coporation
+00132F Interactek
+001331 CellPoint Connect
+001332 Beijing Topsec Network Security Technology Co., Ltd.
+001333 Baud Technology Inc.
+001334 Arkados, Inc.
+001335 VS Industry Berhad
+001336 Tianjin 712 Communication Broadcasting co., ltd.
+001337 Orient Power Home Network Ltd.
+001338 FRESENIUS-VIAL
+001339 EL-ME AG
+00133A VadaTech Inc.
+00133B Speed Dragon Multimedia Limited
+00133C QUINTRON SYSTEMS INC.
+00133D Micro Memory LLC
+00133E MetaSwitch
+00133F Eppendorf Instrumente GmbH
+001340 AD.EL s.r.l.
+001341 Shandong New Beiyang Information Technology Co.,Ltd
+001342 Vision Research, Inc.
+001343 Matsushita Electronic Components (Europe) GmbH
+001344 Fargo Electronics Inc.
+001345 Eaton Corporation
+001346 D-Link Corporation
+001347 BlueTree Wireless Data Inc.
+001348 Artila Electronics Co., Ltd.
+001349 ZyXEL Communications Corporation
+00134A Engim, Inc.
+00134B ToGoldenNet Technology Inc.
+00134C YDT Technology International
+00134D IPC systems
+00134E Valox Systems, Inc.
+00134F Tranzeo Wireless Technologies Inc.
+001350 Silver Spring Networks, Inc
+001351 Niles Audio Corporation
+001352 Naztec, Inc.
+001353 HYDAC Filtertechnik GMBH
+001354 Zcomax Technologies, Inc.
+001355 TOMEN Cyber-business Solutions, Inc.
+001356 target systemelectronic gmbh
+001357 Soyal Technology Co., Ltd.
+001358 Realm Systems, Inc.
+001359 ProTelevision Technologies A/S
+00135A Project T&E Limited
+00135B PanelLink Cinema, LLC
+00135C OnSite Systems, Inc.
+00135D NTTPC Communications, Inc.
+00135E EAB/RWI/K
+00135F Cisco Systems
+001360 Cisco Systems
+001361 Biospace Co., Ltd.
+001362 ShinHeung Precision Co., Ltd.
+001363 Verascape, Inc.
+001364 Paradigm Technology Inc..
+001365 Nortel
+001366 Neturity Technologies Inc.
+001367 Narayon. Co., Ltd.
+001368 Maersk Data Defence
+001369 Honda Electron Co., LED.
+00136A Hach Ultra Analytics
+00136B E-TEC
+00136D Tentaculus AB
+00136E Techmetro Corp.
+00136F PacketMotion, Inc.
+001370 Nokia Danmark A/S
+001371 Motorola CHS
+001372 Dell Inc.
+001373 BLwave Electronics Co., Ltd
+001374 Attansic Technology Corp.
+001375 American Security Products Co.
+001376 Tabor Electronics Ltd.
+001377 Samsung Electronics CO., LTD
+001378 QSAN Technology, Inc.
+001379 PONDER INFORMATION INDUSTRIES LTD.
+00137A Netvox Technology Co., Ltd.
+00137B Movon Corporation
+00137C Kaicom co., Ltd.
+00137D Dynalab, Inc.
+00137E CorEdge Networks, Inc.
+00137F Cisco Systems
+001380 Cisco Systems
+001381 CHIPS & Systems, Inc.
+001382 Cetacea Networks Corporation
+001383 Application Technologies and Engineering Research Laboratory
+001384 Advanced Motion Controls
+001385 Add-On Technology Co., LTD.
+001386 ABB Inc./Totalflow
+001387 27M Technologies AB
+001388 WiMedia Alliance
+001389 Redes de Telefona Mvil S.A.
+00138A QINGDAO GOERTEK ELECTRONICS CO.,LTD.
+00138B Phantom Technologies LLC
+00138C Kumyoung.Co.Ltd
+00138D Kinghold
+00138E FOAB Elektronik AB
+00138F Asiarock Incorporation
+001390 Termtek Computer Co., Ltd
+001391 OUEN CO.,LTD.
+001392 Video54 Technologies, Inc
+001393 Panta Systems, Inc.
+001394 Infohand Co.,Ltd
+001395 congatec AG
+001396 Acbel Polytech Inc.
+001398 TrafficSim Co.,Ltd
+001399 STAC Corporation.
+00139A K-ubique ID Corp.
+00139B ioIMAGE Ltd.
+00139C Exavera Technologies, Inc.
+00139D Design of Systems on Silicon S.A.
+00139E Ciara Technologies Inc.
+00139F Electronics Design Services, Co., Ltd.
+0013A0 ALGOSYSTEM Co., Ltd.
+0013A1 Crow Electronic Engeneering
+0013A2 MaxStream, Inc
+0013A3 Siemens Com CPE Devices
+0013A4 KeyEye Communications
+0013A5 General Solutions, LTD.
+0013A6 Extricom Ltd
+0013A7 BATTELLE MEMORIAL INSTITUTE
+0013A8 Tanisys Technology
+0013A9 Sony Corporation
+0013AA ALS & TEC Ltd.
+0013AB Telemotive AG
+0013AC Sunmyung Electronics Co., LTD
+0013AD Sendo Ltd
+0013AE Radiance Technologies
+0013AF NUMA Technology,Inc.
+0013B0 Jablotron
+0013B1 Intelligent Control Systems (Asia) Pte Ltd
+0013B2 Carallon Limited
+0013B3 Beijing Ecom Communications Technology Co., Ltd.
+0013B4 Appear TV
+0013B5 Wavesat
+0013B6 Sling Media, Inc.
+0013B7 Scantech ID
+0013B8 RyCo Electronic Systems Limited
+0013B9 BM SPA
+001C7C PERQ SYSTEMS CORPORATION
+002000 LEXMARK INTERNATIONAL, INC.
+002001 DSP SOLUTIONS, INC.
+002002 SERITECH ENTERPRISE CO., LTD.
+002003 PIXEL POWER LTD.
+002004 YAMATAKE-HONEYWELL CO., LTD.
+002005 SIMPLE TECHNOLOGY
+002006 GARRETT COMMUNICATIONS, INC.
+002007 SFA, INC.
+002008 CABLE & COMPUTER TECHNOLOGY
+002009 PACKARD BELL ELEC., INC.
+00200A SOURCE-COMM CORP.
+00200B OCTAGON SYSTEMS CORP.
+00200C ADASTRA SYSTEMS CORP.
+00200D CARL ZEISS
+00200E SATELLITE TECHNOLOGY MGMT, INC
+00200F TANBAC CO., LTD.
+002010 JEOL SYSTEM TECHNOLOGY CO. LTD
+002011 CANOPUS CO., LTD.
+002012 CAMTRONICS MEDICAL SYSTEMS
+002013 DIVERSIFIED TECHNOLOGY, INC.
+002014 GLOBAL VIEW CO., LTD.
+002015 ACTIS COMPUTER SA
+002016 SHOWA ELECTRIC WIRE & CABLE CO
+002017 ORBOTECH
+002018 CIS TECHNOLOGY INC.
+002019 OHLER GmbH
+00201A MRV Communications, Inc.
+00201B NORTHERN TELECOM/NETWORK
+00201C EXCEL, INC.
+00201D KATANA PRODUCTS
+00201E NETQUEST CORPORATION
+00201F BEST POWER TECHNOLOGY, INC.
+002020 MEGATRON COMPUTER INDUSTRIES PTY, LTD.
+002021 ALGORITHMS SOFTWARE PVT. LTD.
+002022 TEKNIQUE, INC.
+002023 T.C. TECHNOLOGIES PTY. LTD
+002024 PACIFIC COMMUNICATION SCIENCES
+002025 CONTROL TECHNOLOGY, INC.
+002026 AMKLY SYSTEMS, INC.
+002027 MING FORTUNE INDUSTRY CO., LTD
+002028 WEST EGG SYSTEMS, INC.
+002029 TELEPROCESSING PRODUCTS, INC.
+00202A N.V. DZINE
+00202B ADVANCED TELECOMMUNICATIONS MODULES, LTD.
+00202C WELLTRONIX CO., LTD.
+00202D TAIYO CORPORATION
+00202E DAYSTAR DIGITAL
+00202F ZETA COMMUNICATIONS, LTD.
+002030 ANALOG & DIGITAL SYSTEMS
+002031 ERTEC GmbH
+002032 ALCATEL TAISEL
+002033 SYNAPSE TECHNOLOGIES, INC.
+002034 ROTEC INDUSTRIEAUTOMATION GMBH
+002035 IBM CORPORATION
+002036 BMC SOFTWARE
+002037 SEAGATE TECHNOLOGY
+002038 VME MICROSYSTEMS INTERNATIONAL CORPORATION
+002039 SCINETS
+00203A DIGITAL BI0METRICS INC.
+00203B WISDM LTD.
+00203C EUROTIME AB
+00203D NOVAR ELECTRONICS CORPORATION
+00203E LogiCan Technologies, Inc.
+00203F JUKI CORPORATION
+002040 Motorola Broadband Communications Sector
+002041 DATA NET
+002042 DATAMETRICS CORP.
+002043 NEURON COMPANY LIMITED
+002044 GENITECH PTY LTD
+002045 ION Networks, Inc.
+002046 CIPRICO, INC.
+002047 STEINBRECHER CORP.
+002048 Marconi Communications
+002049 COMTRON, INC.
+00204A PRONET GMBH
+00204B AUTOCOMPUTER CO., LTD.
+00204C MITRON COMPUTER PTE LTD.
+00204D INOVIS GMBH
+00204E NETWORK SECURITY SYSTEMS, INC.
+00204F DEUTSCHE AEROSPACE AG
+002050 KOREA COMPUTER INC.
+002051 Verilink Corporation
+002052 RAGULA SYSTEMS
+002053 HUNTSVILLE MICROSYSTEMS, INC.
+002054 EASTERN RESEARCH, INC.
+002055 ALTECH CO., LTD.
+002056 NEOPRODUCTS
+002057 TITZE DATENTECHNIK GmbH
+002058 ALLIED SIGNAL INC.
+002059 MIRO COMPUTER PRODUCTS AG
+00205A COMPUTER IDENTICS
+00205B Kentrox, LLC
+00205C InterNet Systems of Florida, Inc.
+00205D NANOMATIC OY
+00205E CASTLE ROCK, INC.
+00205F GAMMADATA COMPUTER GMBH
+002060 ALCATEL ITALIA S.p.A.
+002061 DYNATECH COMMUNICATIONS, INC.
+002062 SCORPION LOGIC, LTD.
+002063 WIPRO INFOTECH LTD.
+002064 PROTEC MICROSYSTEMS, INC.
+002065 SUPERNET NETWORKING INC.
+002066 GENERAL MAGIC, INC.
+002068 ISDYNE
+002069 ISDN SYSTEMS CORPORATION
+00206A OSAKA COMPUTER CORP.
+00206B KONICA MINOLTA HOLDINGS, INC.
+00206C EVERGREEN TECHNOLOGY CORP.
+00206D DATA RACE, INC.
+00206E XACT, INC.
+00206F FLOWPOINT CORPORATION
+002070 HYNET, LTD.
+002071 IBR GMBH
+002072 WORKLINK INNOVATIONS
+002073 FUSION SYSTEMS CORPORATION
+002074 SUNGWOON SYSTEMS
+002075 MOTOROLA COMMUNICATION ISRAEL
+002076 REUDO CORPORATION
+002077 KARDIOS SYSTEMS CORP.
+002078 RUNTOP, INC.
+002079 MIKRON GMBH
+00207A WiSE Communications, Inc.
+00207B Intel Corporation
+00207C AUTEC GmbH
+00207D ADVANCED COMPUTER APPLICATIONS
+00207E FINECOM Co., Ltd.
+00207F KYOEI SANGYO CO., LTD.
+002080 SYNERGY (UK) LTD.
+002081 TITAN ELECTRONICS
+002082 ONEAC CORPORATION
+002083 PRESTICOM INCORPORATED
+002084 OCE PRINTING SYSTEMS, GMBH
+002085 EXIDE ELECTRONICS
+002086 MICROTECH ELECTRONICS LIMITED
+002087 MEMOTEC COMMUNICATIONS CORP.
+002088 GLOBAL VILLAGE COMMUNICATION
+002089 T3PLUS NETWORKING, INC.
+00208A SONIX COMMUNICATIONS, LTD.
+00208B LAPIS TECHNOLOGIES, INC.
+00208C GALAXY NETWORKS, INC.
+00208D CMD TECHNOLOGY
+00208E CHEVIN SOFTWARE ENG. LTD.
+00208F ECI TELECOM LTD.
+002090 ADVANCED COMPRESSION TECHNOLOGY, INC.
+002091 J125, NATIONAL SECURITY AGENCY
+002092 CHESS ENGINEERING B.V.
+002093 LANDINGS TECHNOLOGY CORP.
+002094 CUBIX CORPORATION
+002095 RIVA ELECTRONICS
+002096 Invensys
+002097 APPLIED SIGNAL TECHNOLOGY
+002098 HECTRONIC AB
+002099 BON ELECTRIC CO., LTD.
+00209A THE 3DO COMPANY
+00209B ERSAT ELECTRONIC GMBH
+00209C PRIMARY ACCESS CORP.
+00209D LIPPERT AUTOMATIONSTECHNIK
+00209E BROWN'S OPERATING SYSTEM SERVICES, LTD.
+00209F MERCURY COMPUTER SYSTEMS, INC.
+0020A0 OA LABORATORY CO., LTD.
+0020A1 DOVATRON
+0020A2 GALCOM NETWORKING LTD.
+0020A3 DIVICOM INC.
+0020A4 MULTIPOINT NETWORKS
+0020A5 API ENGINEERING
+0020A6 PROXIM, INC.
+0020A7 PAIRGAIN TECHNOLOGIES, INC.
+0020A8 SAST TECHNOLOGY CORP.
+0020A9 WHITE HORSE INDUSTRIAL
+0020AA DIGIMEDIA VISION LTD.
+0020AB MICRO INDUSTRIES CORP.
+0020AC INTERFLEX DATENSYSTEME GMBH
+0020AD LINQ SYSTEMS
+0020AE ORNET DATA COMMUNICATION TECH.
+0020AF 3COM CORPORATION
+0020B0 GATEWAY DEVICES, INC.
+0020B1 COMTECH RESEARCH INC.
+0020B2 GKD Gesellschaft Fur Kommunikation Und Datentechnik
+0020B3 SCLTEC COMMUNICATIONS SYSTEMS
+0020B4 TERMA ELEKTRONIK AS
+0020B5 YASKAWA ELECTRIC CORPORATION
+0020B6 AGILE NETWORKS, INC.
+0020B7 NAMAQUA COMPUTERWARE
+0020B8 PRIME OPTION, INC.
+0020B9 METRICOM, INC.
+0020BA CENTER FOR HIGH PERFORMANCE
+0020BB ZAX CORPORATION
+0020BC Long Reach Networks Pty Ltd
+0020BD NIOBRARA R & D CORPORATION
+0020BE LAN ACCESS CORP.
+0020BF AEHR TEST SYSTEMS
+0020C0 PULSE ELECTRONICS, INC.
+0020C1 TAIKO ELECTRIC WORKS, LTD.
+0020C2 TEXAS MEMORY SYSTEMS, INC.
+0020C3 COUNTER SOLUTIONS LTD.
+0020C4 INET,INC.
+0020C5 EAGLE TECHNOLOGY
+0020C6 NECTEC
+0020C7 AKAI Professional M.I. Corp.
+0020C8 LARSCOM INCORPORATED
+0020C9 VICTRON BV
+0020CA DIGITAL OCEAN
+0020CB PRETEC ELECTRONICS CORP.
+0020CC DIGITAL SERVICES, LTD.
+0020CD HYBRID NETWORKS, INC.
+0020CE LOGICAL DESIGN GROUP, INC.
+0020CF TEST & MEASUREMENT SYSTEMS INC
+0020D0 VERSALYNX CORPORATION
+0020D1 MICROCOMPUTER SYSTEMS (M) SDN.
+0020D2 RAD DATA COMMUNICATIONS, LTD.
+0020D3 OST (OUEST STANDARD TELEMATIQU
+0020D4 CABLETRON - ZEITTNET INC.
+0020D5 VIPA GMBH
+0020D6 BREEZECOM
+0020D7 JAPAN MINICOMPUTER SYSTEMS CO., Ltd.
+0020D8 Nortel Networks
+0020D9 PANASONIC TECHNOLOGIES, INC./MIECO-US
+0020DA XYLAN CORPORATION
+0020DB XNET TECHNOLOGY, INC.
+0020DC DENSITRON TAIWAN LTD.
+0020DD Cybertec Pty Ltd
+0020DE JAPAN DIGITAL LABORAT'Y CO.LTD
+0020DF KYOSAN ELECTRIC MFG. CO., LTD.
+0020E0 Actiontec Electronics, Inc.
+0020E1 ALAMAR ELECTRONICS
+0020E2 INFORMATION RESOURCE ENGINEERING
+0020E3 MCD KENCOM CORPORATION
+0020E4 HSING TECH ENTERPRISE CO., LTD
+0020E5 APEX DATA, INC.
+0020E6 LIDKOPING MACHINE TOOLS AB
+0020E7 B&W NUCLEAR SERVICE COMPANY
+0020E8 DATATREK CORPORATION
+0020E9 DANTEL
+0020EA EFFICIENT NETWORKS, INC.
+0020EB CINCINNATI MICROWAVE, INC.
+0020EC TECHWARE SYSTEMS CORP.
+0020ED GIGA-BYTE TECHNOLOGY CO., LTD.
+0020EE GTECH CORPORATION
+0020EF USC CORPORATION
+0020F0 UNIVERSAL MICROELECTRONICS CO.
+0020F1 ALTOS INDIA LIMITED
+0020F2 SUN MICROSYSTEMS, INC.
+0020F3 RAYNET CORPORATION
+0020F4 SPECTRIX CORPORATION
+0020F5 PANDATEL AG
+0020F6 NET TEK AND KARLNET, INC.
+0020F7 CYBERDATA
+0020F8 CARRERA COMPUTERS, INC.
+0020F9 PARALINK NETWORKS, INC.
+0020FA GDE SYSTEMS, INC.
+0020FB OCTEL COMMUNICATIONS CORP.
+0020FC MATROX
+0020FD ITV TECHNOLOGIES, INC.
+0020FE TOPWARE INC. / GRAND COMPUTER
+0020FF SYMMETRICAL TECHNOLOGIES
+002654 3Com Corporation
+003000 ALLWELL TECHNOLOGY CORP.
+003001 SMP
+003002 Expand Networks
+003003 Phasys Ltd.
+003004 LEADTEK RESEARCH INC.
+003005 Fujitsu Siemens Computers
+003006 SUPERPOWER COMPUTER
+003007 OPTI, INC.
+003008 AVIO DIGITAL, INC.
+003009 Tachion Networks, Inc.
+00300A AZTECH SYSTEMS LTD.
+00300B mPHASE Technologies, Inc.
+00300C CONGRUENCY, LTD.
+00300D MMC Technology, Inc.
+00300E Klotz Digital AG
+00300F IMT - Information Management T
+003010 VISIONETICS INTERNATIONAL
+003011 HMS FIELDBUS SYSTEMS AB
+003012 DIGITAL ENGINEERING LTD.
+003013 NEC Corporation
+003014 DIVIO, INC.
+003015 CP CLARE CORP.
+003016 ISHIDA CO., LTD.
+003017 BlueArc UK Ltd
+003018 Jetway Information Co., Ltd.
+003019 CISCO SYSTEMS, INC.
+00301A SMARTBRIDGES PTE. LTD.
+00301B SHUTTLE, INC.
+00301C ALTVATER AIRDATA SYSTEMS
+00301D SKYSTREAM, INC.
+00301E 3COM Europe Ltd.
+00301F OPTICAL NETWORKS, INC.
+003020 TSI, Inc..
+003021 HSING TECH. ENTERPRISE CO.,LTD
+003022 Fong Kai Industrial Co., Ltd.
+003023 COGENT COMPUTER SYSTEMS, INC.
+003024 CISCO SYSTEMS, INC.
+003025 CHECKOUT COMPUTER SYSTEMS, LTD
+003026 HeiTel Digital Video GmbH
+003027 KERBANGO, INC.
+003028 FASE Saldatura srl
+003029 OPICOM
+00302A SOUTHERN INFORMATION
+00302B INALP NETWORKS, INC.
+00302C SYLANTRO SYSTEMS CORPORATION
+00302D QUANTUM BRIDGE COMMUNICATIONS
+00302E Hoft & Wessel AG
+00302F Smiths Industries
+003030 HARMONIX CORPORATION
+003031 LIGHTWAVE COMMUNICATIONS, INC.
+003032 MagicRam, Inc.
+003033 ORIENT TELECOM CO., LTD.
+003036 RMP ELEKTRONIKSYSTEME GMBH
+003037 Packard Bell Nec Services
+003038 XCP, INC.
+003039 SOFTBOOK PRESS
+00303A MAATEL
+00303B PowerCom Technology
+00303C ONNTO CORP.
+00303D IVA CORPORATION
+00303E Radcom Ltd.
+00303F TurboComm Tech Inc.
+003040 CISCO SYSTEMS, INC.
+003041 SAEJIN T & M CO., LTD.
+003042 DeTeWe-Deutsche Telephonwerke
+003043 IDREAM TECHNOLOGIES, PTE. LTD.
+003044 Portsmith LLC
+003045 Village Networks, Inc. (VNI)
+003046 Controlled Electronic Manageme
+003047 NISSEI ELECTRIC CO., LTD.
+003048 Supermicro Computer, Inc.
+003049 BRYANT TECHNOLOGY, LTD.
+00304A Fraunhofer IPMS
+00304B ORBACOM SYSTEMS, INC.
+00304C APPIAN COMMUNICATIONS, INC.
+00304D ESI
+00304E BUSTEC PRODUCTION LTD.
+00304F PLANET Technology Corporation
+003050 Versa Technology
+003051 ORBIT AVIONIC & COMMUNICATION
+003052 ELASTIC NETWORKS
+003053 Basler AG
+003054 CASTLENET TECHNOLOGY, INC.
+003055 Hitachi Semiconductor America,
+003056 Beck IPC GmbH
+003057 QTelNet, Inc.
+003058 API MOTION
+003059 DIGITAL-LOGIC AG
+00305A TELGEN CORPORATION
+00305B MODULE DEPARTMENT
+00305C SMAR Laboratories Corp.
+00305D DIGITRA SYSTEMS, INC.
+00305E Abelko Innovation
+00305F IMACON APS
+003060 STARMATIX, INC.
+003061 MobyTEL
+003062 PATH 1 NETWORK TECHNOL'S INC.
+003063 SANTERA SYSTEMS, INC.
+003064 ADLINK TECHNOLOGY, INC.
+003065 APPLE COMPUTER, INC.
+003066 DIGITAL WIRELESS CORPORATION
+003067 BIOSTAR MICROTECH INT'L CORP.
+003068 CYBERNETICS TECH. CO., LTD.
+003069 IMPACCT TECHNOLOGY CORP.
+00306A PENTA MEDIA CO., LTD.
+00306B CMOS SYSTEMS, INC.
+00306C Hitex Holding GmbH
+00306D LUCENT TECHNOLOGIES
+00306E HEWLETT PACKARD
+00306F SEYEON TECH. CO., LTD.
+003070 1Net Corporation
+003071 Cisco Systems, Inc.
+003072 INTELLIBYTE INC.
+003073 International Microsystems, In
+003074 EQUIINET LTD.
+003075 ADTECH
+003076 Akamba Corporation
+003077 ONPREM NETWORKS
+003078 Cisco Systems, Inc.
+003079 CQOS, INC.
+00307A Advanced Technology & Systems
+00307B Cisco Systems, Inc.
+00307C ADID SA
+00307D GRE AMERICA, INC.
+00307E Redflex Communication Systems
+00307F IRLAN LTD.
+003080 CISCO SYSTEMS, INC.
+003081 ALTOS C&C
+003082 TAIHAN ELECTRIC WIRE CO., LTD.
+003083 Ivron Systems
+003084 ALLIED TELESYN INTERNAIONAL
+003085 CISCO SYSTEMS, INC.
+003086 Transistor Devices, Inc.
+003087 VEGA GRIESHABER KG
+003088 Siara Systems, Inc.
+003089 Spectrapoint Wireless, LLC
+00308A NICOTRA SISTEMI S.P.A
+00308B Brix Networks
+00308C ADVANCED DIGITAL INFORMATION
+00308D PINNACLE SYSTEMS, INC.
+00308E CROSS MATCH TECHNOLOGIES, INC.
+00308F MICRILOR, Inc.
+003090 CYRA TECHNOLOGIES, INC.
+003091 TAIWAN FIRST LINE ELEC. CORP.
+003092 ModuNORM GmbH
+003093 SONNET TECHNOLOGIES, INC.
+003094 Cisco Systems, Inc.
+003095 Procomp Informatics, Ltd.
+003096 CISCO SYSTEMS, INC.
+003097 EXOMATIC AB
+003098 Global Converging Technologies
+003099 BOENIG UND KALLENBACH OHG
+00309A ASTRO TERRA CORP.
+00309B Smartware
+00309C Timing Applications, Inc.
+00309D Nimble Microsystems, Inc.
+00309E WORKBIT CORPORATION.
+00309F AMBER NETWORKS
+0030A0 TYCO SUBMARINE SYSTEMS, LTD.
+0030A1 WEBGATE Inc.
+0030A2 Lightner Engineering
+0030A3 CISCO SYSTEMS, INC.
+0030A4 Woodwind Communications System
+0030A5 ACTIVE POWER
+0030A6 VIANET TECHNOLOGIES, LTD.
+0030A7 SCHWEITZER ENGINEERING
+0030A8 OL'E COMMUNICATIONS, INC.
+0030A9 Netiverse, Inc.
+0030AA AXUS MICROSYSTEMS, INC.
+0030AB DELTA NETWORKS, INC.
+0030AC Systeme Lauer GmbH & Co., Ltd.
+0030AD SHANGHAI COMMUNICATION
+0030AE Times N System, Inc.
+0030AF Honeywell GmbH
+0030B0 Convergenet Technologies
+0030B1 aXess-pro networks GmbH
+0030B2 WESCAM - HEALDSBURG
+0030B3 San Valley Systems, Inc.
+0030B4 INTERSIL CORP.
+0030B5 Tadiran Microwave Networks
+0030B6 CISCO SYSTEMS, INC.
+0030B7 Teletrol Systems, Inc.
+0030B8 RiverDelta Networks
+0030B9 ECTEL
+0030BA AC&T SYSTEM CO., LTD.
+0030BB CacheFlow, Inc.
+0030BC Optronic AG
+0030BD BELKIN COMPONENTS
+0030BE City-Net Technology, Inc.
+0030BF MULTIDATA GMBH
+0030C0 Lara Technology, Inc.
+0030C1 HEWLETT-PACKARD
+0030C2 COMONE
+0030C3 FLUECKIGER ELEKTRONIK AG
+0030C4 Niigata Canotec Co., Inc.
+0030C5 CADENCE DESIGN SYSTEMS
+0030C6 CONTROL SOLUTIONS, INC.
+0030C7 MACROMATE CORP.
+0030C8 GAD LINE, LTD.
+0030C9 LuxN, N
+0030CA Discovery Com
+0030CB OMNI FLOW COMPUTERS, INC.
+0030CC Tenor Networks, Inc.
+0030CD CONEXANT SYSTEMS, INC.
+0030CE Zaffire
+0030CF TWO TECHNOLOGIES, INC.
+0030D0 Tellabs
+0030D1 INOVA CORPORATION
+0030D2 WIN TECHNOLOGIES, CO., LTD.
+0030D3 Agilent Technologies
+0030D4 COMTIER
+0030D5 DResearch GmbH
+0030D6 MSC VERTRIEBS GMBH
+0030D7 Innovative Systems, L.L.C.
+0030D8 SITEK
+0030D9 DATACORE SOFTWARE CORP.
+0030DA COMTREND CO.
+0030DB Mindready Solutions, Inc.
+0030DC RIGHTECH CORPORATION
+0030DD INDIGITA CORPORATION
+0030DE WAGO Kontakttechnik GmbH
+0030DF KB/TEL TELECOMUNICACIONES
+0030E0 OXFORD SEMICONDUCTOR LTD.
+0030E1 ACROTRON SYSTEMS, INC.
+0030E2 GARNET SYSTEMS CO., LTD.
+0030E3 SEDONA NETWORKS CORP.
+0030E4 CHIYODA SYSTEM RIKEN
+0030E5 Amper Datos S.A.
+0030E6 SIEMENS MEDICAL SYSTEMS
+0030E7 CNF MOBILE SOLUTIONS, INC.
+0030E8 ENSIM CORP.
+0030E9 GMA COMMUNICATION MANUFACT'G
+0030EA TeraForce Technology Corporation
+0030EB TURBONET COMMUNICATIONS, INC.
+0030EC BORGARDT
+0030ED Expert Magnetics Corp.
+0030EE DSG Technology, Inc.
+0030EF NEON TECHNOLOGY, INC.
+0030F0 Uniform Industrial Corp.
+0030F1 Accton Technology Corp.
+0030F2 CISCO SYSTEMS, INC.
+0030F3 At Work Computers
+0030F4 STARDOT TECHNOLOGIES
+0030F5 Wild Lab. Ltd.
+0030F6 SECURELOGIX CORPORATION
+0030F7 RAMIX INC.
+0030F8 Dynapro Systems, Inc.
+0030F9 Sollae Systems Co., Ltd.
+0030FA TELICA, INC.
+0030FB AZS Technology AG
+0030FC Terawave Communications, Inc.
+0030FD INTEGRATED SYSTEMS DESIGN
+0030FE DSA GmbH
+0030FF DATAFAB SYSTEMS, INC.
+004000 PCI COMPONENTES DA AMZONIA LTD
+004001 ZYXEL COMMUNICATIONS, INC.
+004002 PERLE SYSTEMS LIMITED
+004003 WESTINGHOUSE PROCESS CONTROL
+004004 ICM CO. LTD.
+004005 ANI COMMUNICATIONS INC.
+004006 SAMPO TECHNOLOGY CORPORATION
+004007 TELMAT INFORMATIQUE
+004008 A PLUS INFO CORPORATION
+004009 TACHIBANA TECTRON CO., LTD.
+00400A PIVOTAL TECHNOLOGIES, INC.
+00400B CISCO SYSTEMS, INC.
+00400C GENERAL MICRO SYSTEMS, INC.
+00400D LANNET DATA COMMUNICATIONS,LTD
+00400E MEMOTEC COMMUNICATIONS, INC.
+00400F DATACOM TECHNOLOGIES
+004010 SONIC SYSTEMS, INC.
+004011 ANDOVER CONTROLS CORPORATION
+004012 WINDATA, INC.
+004013 NTT DATA COMM. SYSTEMS CORP.
+004014 COMSOFT GMBH
+004015 ASCOM INFRASYS AG
+004016 HADAX ELECTRONICS, INC.
+004017 TROY Group, Inc.
+004018 ADOBE SYSTEMS, INC.
+004019 AEON SYSTEMS, INC.
+00401A FUJI ELECTRIC CO., LTD.
+00401B PRINTER SYSTEMS CORP.
+00401C AST RESEARCH, INC.
+00401D INVISIBLE SOFTWARE, INC.
+00401E ICC
+00401F COLORGRAPH LTD
+004020 PINACL COMMUNICATION
+004021 RASTER GRAPHICS
+004022 KLEVER COMPUTERS, INC.
+004023 LOGIC CORPORATION
+004024 COMPAC INC.
+004025 MOLECULAR DYNAMICS
+004026 MELCO, INC.
+004027 SMC MASSACHUSETTS, INC.
+004028 NETCOMM LIMITED
+004029 COMPEX
+00402A CANOGA-PERKINS
+00402B TRIGEM COMPUTER, INC.
+00402C ISIS DISTRIBUTED SYSTEMS, INC.
+00402D HARRIS ADACOM CORPORATION
+00402E PRECISION SOFTWARE, INC.
+00402F XLNT DESIGNS INC.
+004030 GK COMPUTER
+004031 KOKUSAI ELECTRIC CO., LTD
+004032 DIGITAL COMMUNICATIONS
+004033 ADDTRON TECHNOLOGY CO., LTD.
+004034 BUSTEK CORPORATION
+004035 OPCOM
+004036 TRIBE COMPUTER WORKS, INC.
+004037 SEA-ILAN, INC.
+004038 TALENT ELECTRIC INCORPORATED
+004039 OPTEC DAIICHI DENKO CO., LTD.
+00403A IMPACT TECHNOLOGIES
+00403B SYNERJET INTERNATIONAL CORP.
+00403C FORKS, INC.
+00403D TERADATA
+00403E RASTER OPS CORPORATION
+00403F SSANGYONG COMPUTER SYSTEMS
+004040 RING ACCESS, INC.
+004041 FUJIKURA LTD.
+004042 N.A.T. GMBH
+004043 NOKIA TELECOMMUNICATIONS
+004044 QNIX COMPUTER CO., LTD.
+004045 TWINHEAD CORPORATION
+004046 UDC RESEARCH LIMITED
+004047 WIND RIVER SYSTEMS
+004048 SMD INFORMATICA S.A.
+004049 TEGIMENTA AG
+00404A WEST AUSTRALIAN DEPARTMENT
+00404B MAPLE COMPUTER SYSTEMS
+00404C HYPERTEC PTY LTD.
+00404D TELECOMMUNICATIONS TECHNIQUES
+00404E FLUENT, INC.
+00404F SPACE & NAVAL WARFARE SYSTEMS
+004050 IRONICS, INCORPORATED
+004051 GRACILIS, INC.
+004052 STAR TECHNOLOGIES, INC.
+004053 AMPRO COMPUTERS
+004054 CONNECTION MACHINES SERVICES
+004055 METRONIX GMBH
+004056 MCM JAPAN LTD.
+004057 LOCKHEED - SANDERS
+004058 KRONOS, INC.
+004059 YOSHIDA KOGYO K. K.
+00405A GOLDSTAR INFORMATION & COMM.
+00405B FUNASSET LIMITED
+00405C FUTURE SYSTEMS, INC.
+00405D STAR-TEK, INC.
+00405E NORTH HILLS ISRAEL
+00405F AFE COMPUTERS LTD.
+004060 COMENDEC LTD
+004061 DATATECH ENTERPRISES CO., LTD.
+004062 E-SYSTEMS, INC./GARLAND DIV.
+004063 VIA TECHNOLOGIES, INC.
+004064 KLA INSTRUMENTS CORPORATION
+004065 GTE SPACENET
+004066 HITACHI CABLE, LTD.
+004067 OMNIBYTE CORPORATION
+004068 EXTENDED SYSTEMS
+004069 LEMCOM SYSTEMS, INC.
+00406A KENTEK INFORMATION SYSTEMS,INC
+00406B SYSGEN
+00406C COPERNIQUE
+00406D LANCO, INC.
+00406E COROLLARY, INC.
+00406F SYNC RESEARCH INC.
+004070 INTERWARE CO., LTD.
+004071 ATM COMPUTER GMBH
+004072 Applied Innovation Inc.
+004073 BASS ASSOCIATES
+004074 CABLE AND WIRELESS
+004075 M-TRADE (UK) LTD
+004076 Sun Conversion Technologies
+004077 MAXTON TECHNOLOGY CORPORATION
+004078 WEARNES AUTOMATION PTE LTD
+004079 JUKO MANUFACTURE COMPANY, LTD.
+00407A SOCIETE D'EXPLOITATION DU CNIT
+00407B SCIENTIFIC ATLANTA
+00407C QUME CORPORATION
+00407D EXTENSION TECHNOLOGY CORP.
+00407E EVERGREEN SYSTEMS, INC.
+00407F FLIR Systems
+004080 ATHENIX CORPORATION
+004081 MANNESMANN SCANGRAPHIC GMBH
+004082 LABORATORY EQUIPMENT CORP.
+004083 TDA INDUSTRIA DE PRODUTOS
+004084 HONEYWELL INC.
+004085 SAAB INSTRUMENTS AB
+004086 MICHELS & KLEBERHOFF COMPUTER
+004087 UBITREX CORPORATION
+004088 MOBIUS TECHNOLOGIES, INC.
+004089 MEIDENSHA CORPORATION
+00408A TPS TELEPROCESSING SYS. GMBH
+00408B RAYLAN CORPORATION
+00408C AXIS COMMUNICATIONS AB
+00408D THE GOODYEAR TIRE & RUBBER CO.
+00408E DIGILOG, INC.
+00408F WM-DATA MINFO AB
+004090 ANSEL COMMUNICATIONS
+004091 PROCOMP INDUSTRIA ELETRONICA
+004092 ASP COMPUTER PRODUCTS, INC.
+004093 PAXDATA NETWORKS LTD.
+004094 SHOGRAPHICS, INC.
+004095 R.P.T. INTERGROUPS INT'L LTD.
+004096 Aironet Wireless Communication
+004097 DATEX DIVISION OF
+004098 DRESSLER GMBH & CO.
+004099 NEWGEN SYSTEMS CORP.
+00409A NETWORK EXPRESS, INC.
+00409B HAL COMPUTER SYSTEMS INC.
+00409C TRANSWARE
+00409D DIGIBOARD, INC.
+00409E CONCURRENT TECHNOLOGIES LTD.
+00409F LANCAST/CASAT TECHNOLOGY, INC.
+0040A0 GOLDSTAR CO., LTD.
+0040A1 ERGO COMPUTING
+0040A2 KINGSTAR TECHNOLOGY INC.
+0040A3 MICROUNITY SYSTEMS ENGINEERING
+0040A4 ROSE ELECTRONICS
+0040A5 CLINICOMP INTL.
+0040A6 Cray, Inc.
+0040A7 ITAUTEC PHILCO S.A.
+0040A8 IMF INTERNATIONAL LTD.
+0040A9 DATACOM INC.
+0040AA VALMET AUTOMATION INC.
+0040AB ROLAND DG CORPORATION
+0040AC SUPER WORKSTATION, INC.
+0040AD SMA REGELSYSTEME GMBH
+0040AE DELTA CONTROLS, INC.
+0040AF DIGITAL PRODUCTS, INC.
+0040B0 BYTEX CORPORATION, ENGINEERING
+0040B1 CODONICS INC.
+0040B2 SYSTEMFORSCHUNG
+0040B3 PAR MICROSYSTEMS CORPORATION
+0040B4 NEXTCOM K.K.
+0040B5 VIDEO TECHNOLOGY COMPUTERS LTD
+0040B6 COMPUTERM CORPORATION
+0040B7 STEALTH COMPUTER SYSTEMS
+0040B8 IDEA ASSOCIATES
+0040B9 MACQ ELECTRONIQUE SA
+0040BA ALLIANT COMPUTER SYSTEMS CORP.
+0040BB GOLDSTAR CABLE CO., LTD.
+0040BC ALGORITHMICS LTD.
+0040BD STARLIGHT NETWORKS, INC.
+0040BE BOEING DEFENSE & SPACE
+0040BF CHANNEL SYSTEMS INTERN'L INC.
+0040C0 VISTA CONTROLS CORPORATION
+0040C1 BIZERBA-WERKE WILHEIM KRAUT
+0040C2 APPLIED COMPUTING DEVICES
+0040C3 FISCHER AND PORTER CO.
+0040C4 KINKEI SYSTEM CORPORATION
+0040C5 MICOM COMMUNICATIONS INC.
+0040C6 FIBERNET RESEARCH, INC.
+0040C7 RUBY TECH CORPORATION
+0040C8 MILAN TECHNOLOGY CORPORATION
+0040C9 NCUBE
+0040CA FIRST INTERNAT'L COMPUTER, INC
+0040CB LANWAN TECHNOLOGIES
+0040CC SILCOM MANUF'G TECHNOLOGY INC.
+0040CD TERA MICROSYSTEMS, INC.
+0040CE NET-SOURCE, INC.
+0040CF STRAWBERRY TREE, INC.
+0040D0 MITAC INTERNATIONAL CORP.
+0040D1 FUKUDA DENSHI CO., LTD.
+0040D2 PAGINE CORPORATION
+0040D3 KIMPSION INTERNATIONAL CORP.
+0040D4 GAGE TALKER CORP.
+0040D5 SARTORIUS AG
+0040D6 LOCAMATION B.V.
+0040D7 STUDIO GEN INC.
+0040D8 OCEAN OFFICE AUTOMATION LTD.
+0040D9 AMERICAN MEGATRENDS INC.
+0040DA TELSPEC LTD
+0040DB ADVANCED TECHNICAL SOLUTIONS
+0040DC TRITEC ELECTRONIC GMBH
+0040DD HONG TECHNOLOGIES
+0040DE ELETTRONICA SAN GIORGIO
+0040DF DIGALOG SYSTEMS, INC.
+0040E0 ATOMWIDE LTD.
+0040E1 MARNER INTERNATIONAL, INC.
+0040E2 MESA RIDGE TECHNOLOGIES, INC.
+0040E3 QUIN SYSTEMS LTD
+0040E4 E-M TECHNOLOGY, INC.
+0040E5 SYBUS CORPORATION
+0040E6 C.A.E.N.
+0040E7 ARNOS INSTRUMENTS & COMPUTER
+0040E8 CHARLES RIVER DATA SYSTEMS,INC
+0040E9 ACCORD SYSTEMS, INC.
+0040EA PLAIN TREE SYSTEMS INC
+0040EB MARTIN MARIETTA CORPORATION
+0040EC MIKASA SYSTEM ENGINEERING
+0040ED NETWORK CONTROLS INT'NATL INC.
+0040EE OPTIMEM
+0040EF HYPERCOM, INC.
+0040F0 MICRO SYSTEMS, INC.
+0040F1 CHUO ELECTRONICS CO., LTD.
+0040F2 JANICH & KLASS COMPUTERTECHNIK
+0040F3 NETCOR
+0040F4 CAMEO COMMUNICATIONS, INC.
+0040F5 OEM ENGINES
+0040F6 KATRON COMPUTERS INC.
+0040F7 POLAROID MEDICAL IMAGING SYS.
+0040F8 SYSTEMHAUS DISCOM
+0040F9 COMBINET
+0040FA MICROBOARDS, INC.
+0040FB CASCADE COMMUNICATIONS CORP.
+0040FC IBR COMPUTER TECHNIK GMBH
+0040FD LXE
+0040FE SYMPLEX COMMUNICATIONS
+0040FF TELEBIT CORPORATION
+004252 RLX Technologies
+005000 NEXO COMMUNICATIONS, INC.
+005001 YAMASHITA SYSTEMS CORP.
+005002 OMNISEC AG
+005003 GRETAG MACBETH AG
+005004 3COM CORPORATION
+005006 TAC AB
+005007 SIEMENS TELECOMMUNICATION SYSTEMS LIMITED
+005008 TIVA MICROCOMPUTER CORP. (TMC)
+005009 PHILIPS BROADBAND NETWORKS
+00500A IRIS TECHNOLOGIES, INC.
+00500B CISCO SYSTEMS, INC.
+00500C e-Tek Labs, Inc.
+00500D SATORI ELECTORIC CO., LTD.
+00500E CHROMATIS NETWORKS, INC.
+00500F CISCO SYSTEMS, INC.
+005010 NovaNET Learning, Inc.
+005012 CBL - GMBH
+005013 Chaparral Network Storage
+005014 CISCO SYSTEMS, INC.
+005015 BRIGHT STAR ENGINEERING
+005016 SST/WOODHEAD INDUSTRIES
+005017 RSR S.R.L.
+005018 AMIT, Inc.
+005019 SPRING TIDE NETWORKS, INC.
+00501A UISIQN
+00501B ABL CANADA, INC.
+00501C JATOM SYSTEMS, INC.
+00501E Miranda Technologies, Inc.
+00501F MRG SYSTEMS, LTD.
+005020 MEDIASTAR CO., LTD.
+005021 EIS INTERNATIONAL, INC.
+005022 ZONET TECHNOLOGY, INC.
+005023 PG DESIGN ELECTRONICS, INC.
+005024 NAVIC SYSTEMS, INC.
+005026 COSYSTEMS, INC.
+005027 GENICOM CORPORATION
+005028 AVAL COMMUNICATIONS
+005029 1394 PRINTER WORKING GROUP
+00502A CISCO SYSTEMS, INC.
+00502B GENRAD LTD.
+00502C SOYO COMPUTER, INC.
+00502D ACCEL, INC.
+00502E CAMBEX CORPORATION
+00502F TollBridge Technologies, Inc.
+005030 FUTURE PLUS SYSTEMS
+005031 AEROFLEX LABORATORIES, INC.
+005032 PICAZO COMMUNICATIONS, INC.
+005033 MAYAN NETWORKS
+005036 NETCAM, LTD.
+005037 KOGA ELECTRONICS CO.
+005038 DAIN TELECOM CO., LTD.
+005039 MARINER NETWORKS
+00503A DATONG ELECTRONICS LTD.
+00503B MEDIAFIRE CORPORATION
+00503C TSINGHUA NOVEL ELECTRONICS
+00503E CISCO SYSTEMS, INC.
+00503F ANCHOR GAMES
+005040 EMWARE, INC.
+005041 CTX OPTO ELECTRONIC CORP.
+005042 SCI MANUFACTURING SINGAPORE PTE, LTD.
+005043 MARVELL SEMICONDUCTOR, INC.
+005044 ASACA CORPORATION
+005045 RIOWORKS SOLUTIONS, INC.
+005046 MENICX INTERNATIONAL CO., LTD.
+005048 INFOLIBRIA
+005049 ELLACOYA NETWORKS, INC.
+00504A ELTECO A.S.
+00504B BARCONET N.V.
+00504C GALIL MOTION CONTROL, INC.
+00504D TOKYO ELECTRON DEVICE LTD.
+00504E SIERRA MONITOR CORP.
+00504F OLENCOM ELECTRONICS
+005050 CISCO SYSTEMS, INC.
+005051 IWATSU ELECTRIC CO., LTD.
+005052 TIARA NETWORKS, INC.
+005053 CISCO SYSTEMS, INC.
+005054 CISCO SYSTEMS, INC.
+005055 DOMS A/S
+005056 VMWare, Inc.
+005057 BROADBAND ACCESS SYSTEMS
+005058 VegaStream Limted
+005059 SUITE TECHNOLOGY SYSTEMS NETWORK
+00505A NETWORK ALCHEMY, INC.
+00505B KAWASAKI LSI U.S.A., INC.
+00505C TUNDO CORPORATION
+00505E DIGITEK MICROLOGIC S.A.
+00505F BRAND INNOVATORS
+005060 TANDBERG TELECOM AS
+005062 KOUWELL ELECTRONICS CORP. **
+005063 OY COMSEL SYSTEM AB
+005064 CAE ELECTRONICS
+005065 DENSEI-LAMBAD Co., Ltd.
+005066 AtecoM GmbH advanced telecomunication modules
+005067 AEROCOMM, INC.
+005068 ELECTRONIC INDUSTRIES ASSOCIATION
+005069 PixStream Incorporated
+00506A EDEVA, INC.
+00506B SPX-ATEG
+00506C G & L BEIJER ELECTRONICS AB
+00506D VIDEOJET SYSTEMS
+00506E CORDER ENGINEERING CORPORATION
+00506F G-CONNECT
+005070 CHAINTECH COMPUTER CO., LTD.
+005071 AIWA CO., LTD.
+005072 CORVIS CORPORATION
+005073 CISCO SYSTEMS, INC.
+005074 ADVANCED HI-TECH CORP.
+005075 KESTREL SOLUTIONS
+005076 IBM
+005077 PROLIFIC TECHNOLOGY, INC.
+005078 MEGATON HOUSE, LTD.
+00507A XPEED, INC.
+00507B MERLOT COMMUNICATIONS
+00507C VIDEOCON AG
+00507D IFP
+00507E NEWER TECHNOLOGY
+00507F DrayTek Corp.
+005080 CISCO SYSTEMS, INC.
+005081 MURATA MACHINERY, LTD.
+005082 FORESSON CORPORATION
+005083 GILBARCO, INC.
+005084 ATL PRODUCTS
+005086 TELKOM SA, LTD.
+005087 TERASAKI ELECTRIC CO., LTD.
+005088 AMANO CORPORATION
+005089 SAFETY MANAGEMENT SYSTEMS
+00508B COMPAQ COMPUTER CORPORATION
+00508C RSI SYSTEMS
+00508D ABIT COMPUTER CORPORATION
+00508E OPTIMATION, INC.
+00508F ASITA TECHNOLOGIES INT'L LTD.
+005090 DCTRI
+005091 NETACCESS, INC.
+005092 RIGAKU INDUSTRIAL CORPORATION
+005093 BOEING
+005094 PACE MICRO TECHNOLOGY PLC
+005095 PERACOM NETWORKS
+005096 SALIX TECHNOLOGIES, INC.
+005097 MMC-EMBEDDED COMPUTERTECHNIK GmbH
+005098 GLOBALOOP, LTD.
+005099 3COM EUROPE, LTD.
+00509A TAG ELECTRONIC SYSTEMS
+00509B SWITCHCORE AB
+00509C BETA RESEARCH
+00509D THE INDUSTREE B.V.
+00509E Les Technologies SoftAcoustik Inc.
+00509F HORIZON COMPUTER
+0050A0 DELTA COMPUTER SYSTEMS, INC.
+0050A1 CARLO GAVAZZI, INC.
+0050A2 CISCO SYSTEMS, INC.
+0050A3 TransMedia Communications, Inc.
+0050A4 IO TECH, INC.
+0050A5 CAPITOL BUSINESS SYSTEMS, LTD.
+0050A6 OPTRONICS
+0050A7 CISCO SYSTEMS, INC.
+0050A8 OpenCon Systems, Inc.
+0050A9 MOLDAT WIRELESS TECHNOLGIES
+0050AA KONICA MINOLTA HOLDINGS, INC.
+0050AB NALTEC, INC.
+0050AC MAPLE COMPUTER CORPORATION
+0050AD CommUnique Wireless Corp.
+0050AE IWAKI ELECTRONICS CO., LTD.
+0050AF INTERGON, INC.
+0050B0 TECHNOLOGY ATLANTA CORPORATION
+0050B1 GIDDINGS & LEWIS
+0050B2 BRODEL AUTOMATION
+0050B3 VOICEBOARD CORPORATION
+0050B4 SATCHWELL CONTROL SYSTEMS, LTD
+0050B5 FICHET-BAUCHE
+0050B6 GOOD WAY IND. CO., LTD.
+0050B7 BOSER TECHNOLOGY CO., LTD.
+0050B8 INOVA COMPUTERS GMBH & CO. KG
+0050B9 XITRON TECHNOLOGIES, INC.
+0050BA D-LINK
+0050BB CMS TECHNOLOGIES
+0050BC HAMMER STORAGE SOLUTIONS
+0050BD CISCO SYSTEMS, INC.
+0050BE FAST MULTIMEDIA AG
+0050BF MOTOTECH INC.
+0050C0 GATAN, INC.
+0050C1 GEMFLEX NETWORKS, LTD.
+0050C2 IEEE REGISTRATION AUTHORITY
+0050C4 IMD
+0050C5 ADS TECHNOLOGIES, INC.
+0050C6 LOOP TELECOMMUNICATION INTERNATIONAL, INC.
+0050C8 ADDONICS COMMUNICATIONS, INC.
+0050C9 MASPRO DENKOH CORP.
+0050CA NET TO NET TECHNOLOGIES
+0050CB JETTER
+0050CC XYRATEX
+0050CD DIGIANSWER A/S
+0050CE LG INTERNATIONAL CORP.
+0050CF VANLINK COMMUNICATION TECHNOLOGY RESEARCH INSTITUTE
+0050D0 MINERVA SYSTEMS
+0050D1 CISCO SYSTEMS, INC.
+0050D2 CMC Electronics Inc
+0050D3 DIGITAL AUDIO PROCESSING PTY. LTD.
+0050D4 JOOHONG INFORMATION &
+0050D5 AD SYSTEMS CORP.
+0050D6 ATLAS COPCO TOOLS AB
+0050D7 TELSTRAT
+0050D8 UNICORN COMPUTER CORP.
+0050D9 ENGETRON-ENGENHARIA ELETRONICA IND. e COM. LTDA
+0050DA 3COM CORPORATION
+0050DB CONTEMPORARY CONTROL
+0050DC TAS TELEFONBAU A. SCHWABE GMBH & CO. KG
+0050DD SERRA SOLDADURA, S.A.
+0050DE SIGNUM SYSTEMS CORP.
+0050DF AirFiber, Inc.
+0050E1 NS TECH ELECTRONICS SDN BHD
+0050E2 CISCO SYSTEMS, INC.
+0050E3 Terayon Communications Systems
+0050E4 APPLE COMPUTER, INC.
+0050E6 HAKUSAN CORPORATION
+0050E7 PARADISE INNOVATIONS (ASIA)
+0050E8 NOMADIX INC.
+0050EA XEL COMMUNICATIONS, INC.
+0050EB ALPHA-TOP CORPORATION
+0050EC OLICOM A/S
+0050ED ANDA NETWORKS
+0050EE TEK DIGITEL CORPORATION
+0050EF SPE Systemhaus GmbH
+0050F0 CISCO SYSTEMS, INC.
+0050F1 LIBIT SIGNAL PROCESSING, LTD.
+0050F2 MICROSOFT CORP.
+0050F3 GLOBAL NET INFORMATION CO., Ltd.
+0050F4 SIGMATEK GMBH & CO. KG
+0050F6 PAN-INTERNATIONAL INDUSTRIAL CORP.
+0050F7 VENTURE MANUFACTURING (SINGAPORE) LTD.
+0050F8 ENTREGA TECHNOLOGIES, INC.
+0050FA OXTEL, LTD.
+0050FB VSK ELECTRONICS
+0050FC EDIMAX TECHNOLOGY CO., LTD.
+0050FD VISIONCOMM CO., LTD.
+0050FE PCTVnet ASA
+0050FF HAKKO ELECTRONICS CO., LTD.
+006000 XYCOM INC.
+006001 InnoSys, Inc.
+006002 SCREEN SUBTITLING SYSTEMS, LTD
+006003 TERAOKA WEIGH SYSTEM PTE, LTD.
+006004 COMPUTADORES MODULARES SA
+006005 FEEDBACK DATA LTD.
+006006 SOTEC CO., LTD
+006007 ACRES GAMING, INC.
+006008 3COM CORPORATION
+006009 CISCO SYSTEMS, INC.
+00600A SORD COMPUTER CORPORATION
+00600B LOGWARE GmbH
+00600C APPLIED DATA SYSTEMS, INC.
+00600D Digital Logic GmbH
+00600E WAVENET INTERNATIONAL, INC.
+00600F WESTELL, INC.
+006010 NETWORK MACHINES, INC.
+006011 CRYSTAL SEMICONDUCTOR CORP.
+006012 POWER COMPUTING CORPORATION
+006013 NETSTAL MASCHINEN AG
+006014 EDEC CO., LTD.
+006015 NET2NET CORPORATION
+006016 CLARIION
+006017 TOKIMEC INC.
+006018 STELLAR ONE CORPORATION
+006019 Roche Diagnostics
+00601A KEITHLEY INSTRUMENTS
+00601B MESA ELECTRONICS
+00601C TELXON CORPORATION
+00601D LUCENT TECHNOLOGIES
+00601E SOFTLAB, INC.
+00601F STALLION TECHNOLOGIES
+006020 PIVOTAL NETWORKING, INC.
+006021 DSC CORPORATION
+006022 VICOM SYSTEMS, INC.
+006023 PERICOM SEMICONDUCTOR CORP.
+006024 GRADIENT TECHNOLOGIES, INC.
+006025 ACTIVE IMAGING PLC
+006026 VIKING COMPONENTS, INC.
+006027 Superior Modular Products
+006028 MACROVISION CORPORATION
+006029 CARY PERIPHERALS INC.
+00602A SYMICRON COMPUTER COMMUNICATIONS, LTD.
+00602B PEAK AUDIO
+00602C LINX Data Terminals, Inc.
+00602D ALERTON TECHNOLOGIES, INC.
+00602E CYCLADES CORPORATION
+00602F CISCO SYSTEMS, INC.
+006030 VILLAGE TRONIC ENTWICKLUNG
+006031 HRK SYSTEMS
+006032 I-CUBE, INC.
+006033 ACUITY IMAGING, INC.
+006034 ROBERT BOSCH GmbH
+006035 DALLAS SEMICONDUCTOR, INC.
+006036 AUSTRIAN RESEARCH CENTER SEIBERSDORF
+006037 PHILIPS SEMICONDUCTORS
+006038 Nortel Networks
+006039 SanCom Technology, Inc.
+00603A QUICK CONTROLS LTD.
+00603B AMTEC spa
+00603C HAGIWARA SYS-COM CO., LTD.
+00603D 3CX
+00603E CISCO SYSTEMS, INC.
+00603F PATAPSCO DESIGNS
+006040 NETRO CORP.
+006041 Yokogawa Electric Corporation
+006042 TKS (USA), INC.
+006043 ComSoft Systems, Inc.
+006044 LITTON/POLY-SCIENTIFIC
+006045 PATHLIGHT TECHNOLOGIES
+006046 VMETRO, INC.
+006047 CISCO SYSTEMS, INC.
+006048 EMC CORPORATION
+006049 VINA TECHNOLOGIES
+00604A SAIC IDEAS GROUP
+00604B BIODATA GmbH
+00604C SAGEM SA
+00604D MMC NETWORKS, INC.
+00604E CYCLE COMPUTER CORPORATION, INC.
+00604F SUZUKI MFG. CO., LTD.
+006050 INTERNIX INC.
+006051 QUALITY SEMICONDUCTOR
+006052 PERIPHERALS ENTERPRISE CO., Ltd.
+006053 TOYODA MACHINE WORKS, LTD.
+006054 CONTROLWARE GMBH
+006055 CORNELL UNIVERSITY
+006056 NETWORK TOOLS, INC.
+006057 MURATA MANUFACTURING CO., LTD.
+006058 COPPER MOUNTAIN COMMUNICATIONS, INC.
+006059 TECHNICAL COMMUNICATIONS CORP.
+00605A CELCORE, INC.
+00605B IntraServer Technology, Inc.
+00605C CISCO SYSTEMS, INC.
+00605D SCANIVALVE CORP.
+00605E LIBERTY TECHNOLOGY NETWORKING
+00605F NIPPON UNISOFT CORPORATION
+006060 DAWNING TECHNOLOGIES, INC.
+006061 WHISTLE COMMUNICATIONS CORP.
+006062 TELESYNC, INC.
+006063 PSION DACOM PLC.
+006064 NETCOMM LIMITED
+006065 BERNECKER & RAINER INDUSTRIE-ELEKTRONIC GmbH
+006066 LACROIX TECHNOLGIE
+006067 ACER NETXUS INC.
+006068 EICON TECHNOLOGY CORPORATION
+006069 BROCADE COMMUNICATIONS SYSTEMS, Inc.
+00606A MITSUBISHI WIRELESS COMMUNICATIONS. INC.
+00606B Synclayer Inc.
+00606C ARESCOM
+00606D DIGITAL EQUIPMENT CORP.
+00606E DAVICOM SEMICONDUCTOR, INC.
+00606F CLARION CORPORATION OF AMERICA
+006070 CISCO SYSTEMS, INC.
+006071 MIDAS LAB, INC.
+006072 VXL INSTRUMENTS, LIMITED
+006073 REDCREEK COMMUNICATIONS, INC.
+006074 QSC AUDIO PRODUCTS
+006075 PENTEK, INC.
+006076 SCHLUMBERGER TECHNOLOGIES RETAIL PETROLEUM SYSTEMS
+006077 PRISA NETWORKS
+006078 POWER MEASUREMENT LTD.
+006079 Mainstream Data, Inc.
+00607A DVS GmbH
+00607B FORE SYSTEMS, INC.
+00607C WaveAccess, Ltd.
+00607D SENTIENT NETWORKS INC.
+00607E GIGALABS, INC.
+00607F AURORA TECHNOLOGIES, INC.
+006080 MICROTRONIX DATACOM LTD.
+006081 TV/COM INTERNATIONAL
+006082 NOVALINK TECHNOLOGIES, INC.
+006083 CISCO SYSTEMS, INC.
+006084 DIGITAL VIDEO
+006085 Storage Concepts
+006086 LOGIC REPLACEMENT TECH. LTD.
+006087 KANSAI ELECTRIC CO., LTD.
+006088 WHITE MOUNTAIN DSP, INC.
+006089 XATA
+00608A CITADEL COMPUTER
+00608B ConferTech International
+00608C 3COM CORPORATION
+00608D UNIPULSE CORP.
+00608E HE ELECTRONICS, TECHNOLOGIE & SYSTEMTECHNIK GmbH
+00608F TEKRAM TECHNOLOGY CO., LTD.
+006090 ABLE COMMUNICATIONS, INC.
+006091 FIRST PACIFIC NETWORKS, INC.
+006092 MICRO/SYS, INC.
+006093 VARIAN
+006094 IBM CORP.
+006095 ACCU-TIME SYSTEMS, INC.
+006096 T.S. MICROTECH INC.
+006097 3COM CORPORATION
+006098 HT COMMUNICATIONS
+006099 SBE, Inc.
+00609A NJK TECHNO CO.
+00609B ASTRO-MED, INC.
+00609C Perkin-Elmer Incorporated
+00609D PMI FOOD EQUIPMENT GROUP
+00609E ASC X3 - INFORMATION TECHNOLOGY STANDARDS SECRETARIATS
+00609F PHAST CORPORATION
+0060A0 SWITCHED NETWORK TECHNOLOGIES, INC.
+0060A1 VPNet, Inc.
+0060A2 NIHON UNISYS LIMITED CO.
+0060A3 CONTINUUM TECHNOLOGY CORP.
+0060A4 GRINAKER SYSTEM TECHNOLOGIES
+0060A5 PERFORMANCE TELECOM CORP.
+0060A6 PARTICLE MEASURING SYSTEMS
+0060A7 MICROSENS GmbH & CO. KG
+0060A8 TIDOMAT AB
+0060A9 GESYTEC MbH
+0060AA INTELLIGENT DEVICES INC. (IDI)
+0060AB LARSCOM INCORPORATED
+0060AC RESILIENCE CORPORATION
+0060AD MegaChips Corporation
+0060AE TRIO INFORMATION SYSTEMS AB
+0060AF PACIFIC MICRO DATA, INC.
+0060B0 HEWLETT-PACKARD CO.
+0060B1 INPUT/OUTPUT, INC.
+0060B2 PROCESS CONTROL CORP.
+0060B3 Z-COM, INC.
+0060B4 GLENAYRE R&D INC.
+0060B5 KEBA GmbH
+0060B6 LAND COMPUTER CO., LTD.
+0060B7 CHANNELMATIC, INC.
+0060B8 CORELIS INC.
+0060B9 NITSUKO CORPORATION
+0060BA SAHARA NETWORKS, INC.
+0060BB CABLETRON - NETLINK, INC.
+0060BC KeunYoung Electronics & Communication Co., Ltd.
+0060BD HUBBELL-PULSECOM
+0060BE WEBTRONICS
+0060BF MACRAIGOR SYSTEMS, INC.
+0060C0 NERA AS
+0060C1 WaveSpan Corporation
+0060C2 MPL AG
+0060C3 NETVISION CORPORATION
+0060C4 SOLITON SYSTEMS K.K.
+0060C5 ANCOT CORP.
+0060C6 DCS AG
+0060C7 AMATI COMMUNICATIONS CORP.
+0060C8 KUKA WELDING SYSTEMS & ROBOTS
+0060C9 ControlNet, Inc.
+0060CA HARMONIC SYSTEMS INCORPORATED
+0060CB HITACHI ZOSEN CORPORATION
+0060CC EMTRAK, INCORPORATED
+0060CD VideoServer, Inc.
+0060CE ACCLAIM COMMUNICATIONS
+0060CF ALTEON NETWORKS, INC.
+0060D0 SNMP RESEARCH INCORPORATED
+0060D1 CASCADE COMMUNICATIONS
+0060D2 LUCENT TECHNOLOGIES TAIWAN TELECOMMUNICATIONS CO., LTD.
+0060D3 AT&T
+0060D4 ELDAT COMMUNICATION LTD.
+0060D5 MIYACHI TECHNOS CORP.
+0060D6 NovAtel Wireless Technologies Ltd.
+0060D7 ECOLE POLYTECHNIQUE FEDERALE DE LAUSANNE (EPFL)
+0060D8 ELMIC SYSTEMS, INC.
+0060D9 TRANSYS NETWORKS INC.
+0060DA JBM ELECTRONICS CO.
+0060DB NTP ELEKTRONIK A/S
+0060DC TOYO COMMUNICATION EQUIPMENT Co., Ltd.
+0060DD MYRICOM, INC.
+0060DE KAYSER-THREDE GmbH
+0060DF CNT Corporation
+0060E0 AXIOM TECHNOLOGY CO., LTD.
+0060E1 ORCKIT COMMUNICATIONS LTD.
+0060E2 QUEST ENGINEERING & DEVELOPMENT
+0060E3 ARBIN INSTRUMENTS
+0060E4 COMPUSERVE, INC.
+0060E5 FUJI AUTOMATION CO., LTD.
+0060E6 SHOMITI SYSTEMS INCORPORATED
+0060E7 RANDATA
+0060E8 HITACHI COMPUTER PRODUCTS (AMERICA), INC.
+0060E9 ATOP TECHNOLOGIES, INC.
+0060EA StreamLogic
+0060EB FOURTHTRACK SYSTEMS
+0060EC HERMARY OPTO ELECTRONICS INC.
+0060ED RICARDO TEST AUTOMATION LTD.
+0060EE APOLLO
+0060EF FLYTECH TECHNOLOGY CO., LTD.
+0060F0 JOHNSON & JOHNSON MEDICAL, INC
+0060F1 EXP COMPUTER, INC.
+0060F2 LASERGRAPHICS, INC.
+0060F3 Performance Analysis Broadband, Spirent plc
+0060F4 ADVANCED COMPUTER SOLUTIONS, Inc.
+0060F5 ICON WEST, INC.
+0060F6 NEXTEST COMMUNICATIONS PRODUCTS, INC.
+0060F7 DATAFUSION SYSTEMS
+0060F8 Loran International Technologies Inc.
+0060F9 DIAMOND LANE COMMUNICATIONS
+0060FA EDUCATIONAL TECHNOLOGY RESOURCES, INC.
+0060FB PACKETEER, INC.
+0060FC CONSERVATION THROUGH INNOVATION LTD.
+0060FD NetICs, Inc.
+0060FE LYNX SYSTEM DEVELOPERS, INC.
+0060FF QuVis, Inc.
+0070B0 M/A-COM INC. COMPANIES
+0070B3 DATA RECALL LTD.
+008000 MULTITECH SYSTEMS, INC.
+008001 PERIPHONICS CORPORATION
+008002 SATELCOM (UK) LTD
+008003 HYTEC ELECTRONICS LTD.
+008004 ANTLOW COMMUNICATIONS, LTD.
+008005 CACTUS COMPUTER INC.
+008006 COMPUADD CORPORATION
+008007 DLOG NC-SYSTEME
+008008 DYNATECH COMPUTER SYSTEMS
+008009 JUPITER SYSTEMS, INC.
+00800A JAPAN COMPUTER CORP.
+00800B CSK CORPORATION
+00800C VIDECOM LIMITED
+00800D VOSSWINKEL F.U.
+00800E ATLANTIX CORPORATION
+00800F STANDARD MICROSYSTEMS
+008010 COMMODORE INTERNATIONAL
+008011 DIGITAL SYSTEMS INT'L. INC.
+008012 INTEGRATED MEASUREMENT SYSTEMS
+008013 THOMAS-CONRAD CORPORATION
+008014 ESPRIT SYSTEMS
+008015 SEIKO SYSTEMS, INC.
+008016 WANDEL AND GOLTERMANN
+008017 PFU LIMITED
+008018 KOBE STEEL, LTD.
+008019 DAYNA COMMUNICATIONS, INC.
+00801A BELL ATLANTIC
+00801B KODIAK TECHNOLOGY
+00801C NEWPORT SYSTEMS SOLUTIONS
+00801D INTEGRATED INFERENCE MACHINES
+00801E XINETRON, INC.
+00801F KRUPP ATLAS ELECTRONIK GMBH
+008020 NETWORK PRODUCTS
+008021 Alcatel Canada Inc.
+008022 SCAN-OPTICS
+008023 INTEGRATED BUSINESS NETWORKS
+008024 KALPANA, INC.
+008025 STOLLMANN GMBH
+008026 NETWORK PRODUCTS CORPORATION
+008027 ADAPTIVE SYSTEMS, INC.
+008028 TRADPOST (HK) LTD
+008029 EAGLE TECHNOLOGY, INC.
+00802A TEST SYSTEMS & SIMULATIONS INC
+00802B INTEGRATED MARKETING CO
+00802C THE SAGE GROUP PLC
+00802D XYLOGICS INC
+00802E CASTLE ROCK COMPUTING
+00802F NATIONAL INSTRUMENTS CORP.
+008030 NEXUS ELECTRONICS
+008031 BASYS, CORP.
+008032 ACCESS CO., LTD.
+008033 FORMATION, INC.
+008034 SMT GOUPIL
+008035 TECHNOLOGY WORKS, INC.
+008036 REFLEX MANUFACTURING SYSTEMS
+008037 Ericsson Group
+008038 DATA RESEARCH & APPLICATIONS
+008039 ALCATEL STC AUSTRALIA
+00803A VARITYPER, INC.
+00803B APT COMMUNICATIONS, INC.
+00803C TVS ELECTRONICS LTD
+00803D SURIGIKEN CO., LTD.
+00803E SYNERNETICS
+00803F TATUNG COMPANY
+008040 JOHN FLUKE MANUFACTURING CO.
+008041 VEB KOMBINAT ROBOTRON
+008042 FORCE COMPUTERS
+008043 NETWORLD, INC.
+008044 SYSTECH COMPUTER CORP.
+008045 MATSUSHITA ELECTRIC IND. CO
+008046 UNIVERSITY OF TORONTO
+008047 IN-NET CORP.
+008048 COMPEX INCORPORATED
+008049 NISSIN ELECTRIC CO., LTD.
+00804A PRO-LOG
+00804B EAGLE TECHNOLOGIES PTY.LTD.
+00804C CONTEC CO., LTD.
+00804D CYCLONE MICROSYSTEMS, INC.
+00804E APEX COMPUTER COMPANY
+00804F DAIKIN INDUSTRIES, LTD.
+008050 ZIATECH CORPORATION
+008051 FIBERMUX
+008052 TECHNICALLY ELITE CONCEPTS
+008053 INTELLICOM, INC.
+008054 FRONTIER TECHNOLOGIES CORP.
+008055 FERMILAB
+008056 SPHINX ELEKTRONIK GMBH
+008057 ADSOFT, LTD.
+008058 PRINTER SYSTEMS CORPORATION
+008059 STANLEY ELECTRIC CO., LTD
+00805A TULIP COMPUTERS INTERNAT'L B.V
+00805B CONDOR SYSTEMS, INC.
+00805C AGILIS CORPORATION
+00805D CANSTAR
+00805E LSI LOGIC CORPORATION
+00805F COMPAQ COMPUTER CORPORATION
+008060 NETWORK INTERFACE CORPORATION
+008061 LITTON SYSTEMS, INC.
+008062 INTERFACE CO.
+008063 RICHARD HIRSCHMANN GMBH & CO.
+008064 WYSE TECHNOLOGY
+008065 CYBERGRAPHIC SYSTEMS PTY LTD.
+008066 ARCOM CONTROL SYSTEMS, LTD.
+008067 SQUARE D COMPANY
+008068 YAMATECH SCIENTIFIC LTD.
+008069 COMPUTONE SYSTEMS
+00806A ERI (EMPAC RESEARCH INC.)
+00806B SCHMID TELECOMMUNICATION
+00806C CEGELEC PROJECTS LTD
+00806D CENTURY SYSTEMS CORP.
+00806E NIPPON STEEL CORPORATION
+00806F ONELAN LTD.
+008070 COMPUTADORAS MICRON
+008071 SAI TECHNOLOGY
+008072 MICROPLEX SYSTEMS LTD.
+008073 DWB ASSOCIATES
+008074 FISHER CONTROLS
+008075 PARSYTEC GMBH
+008076 MCNC
+008077 BROTHER INDUSTRIES, LTD.
+008078 PRACTICAL PERIPHERALS, INC.
+008079 MICROBUS DESIGNS LTD.
+00807A AITECH SYSTEMS LTD.
+00807B ARTEL COMMUNICATIONS CORP.
+00807C FIBERCOM, INC.
+00807D EQUINOX SYSTEMS INC.
+00807E SOUTHERN PACIFIC LTD.
+00807F DY-4 INCORPORATED
+008080 DATAMEDIA CORPORATION
+008081 KENDALL SQUARE RESEARCH CORP.
+008082 PEP MODULAR COMPUTERS GMBH
+008083 AMDAHL
+008084 THE CLOUD INC.
+008085 H-THREE SYSTEMS CORPORATION
+008086 COMPUTER GENERATION INC.
+008087 OKI ELECTRIC INDUSTRY CO., LTD
+008088 VICTOR COMPANY OF JAPAN, LTD.
+008089 TECNETICS (PTY) LTD.
+00808A SUMMIT MICROSYSTEMS CORP.
+00808B DACOLL LIMITED
+00808C NetScout Systems, Inc.
+00808D WESTCOAST TECHNOLOGY B.V.
+00808E RADSTONE TECHNOLOGY
+00808F C. ITOH ELECTRONICS, INC.
+008090 MICROTEK INTERNATIONAL, INC.
+008091 TOKYO ELECTRIC CO.,LTD
+008092 JAPAN COMPUTER INDUSTRY, INC.
+008093 XYRON CORPORATION
+008094 ALFA LAVAL AUTOMATION AB
+008095 BASIC MERTON HANDELSGES.M.B.H.
+008096 HUMAN DESIGNED SYSTEMS, INC.
+008097 CENTRALP AUTOMATISMES
+008098 TDK CORPORATION
+008099 KLOCKNER MOELLER IPC
+00809A NOVUS NETWORKS LTD
+00809B JUSTSYSTEM CORPORATION
+00809C LUXCOM, INC.
+00809D Commscraft Ltd.
+00809E DATUS GMBH
+00809F ALCATEL BUSINESS SYSTEMS
+0080A0 EDISA HEWLETT PACKARD S/A
+0080A1 MICROTEST, INC.
+0080A2 CREATIVE ELECTRONIC SYSTEMS
+0080A3 LANTRONIX
+0080A4 LIBERTY ELECTRONICS
+0080A5 SPEED INTERNATIONAL
+0080A6 REPUBLIC TECHNOLOGY, INC.
+0080A7 MEASUREX CORP.
+0080A8 VITACOM CORPORATION
+0080A9 CLEARPOINT RESEARCH
+0080AA MAXPEED
+0080AB DUKANE NETWORK INTEGRATION
+0080AC IMLOGIX, DIVISION OF GENESYS
+0080AD CNET TECHNOLOGY, INC.
+0080AE HUGHES NETWORK SYSTEMS
+0080AF ALLUMER CO., LTD.
+0080B0 ADVANCED INFORMATION
+0080B1 SOFTCOM A/S
+0080B2 NETWORK EQUIPMENT TECHNOLOGIES
+0080B3 AVAL DATA CORPORATION
+0080B4 SOPHIA SYSTEMS
+0080B5 UNITED NETWORKS INC.
+0080B6 THEMIS COMPUTER
+0080B7 STELLAR COMPUTER
+0080B8 BUG, INCORPORATED
+0080B9 ARCHE TECHNOLIGIES INC.
+0080BA SPECIALIX (ASIA) PTE, LTD
+0080BB HUGHES LAN SYSTEMS
+0080BC HITACHI ENGINEERING CO., LTD
+0080BD THE FURUKAWA ELECTRIC CO., LTD
+0080BE ARIES RESEARCH
+0080BF TAKAOKA ELECTRIC MFG. CO. LTD.
+0080C0 PENRIL DATACOMM
+0080C1 LANEX CORPORATION
+0080C2 IEEE 802.1 COMMITTEE
+0080C3 BICC INFORMATION SYSTEMS & SVC
+0080C4 DOCUMENT TECHNOLOGIES, INC.
+0080C5 NOVELLCO DE MEXICO
+0080C6 NATIONAL DATACOMM CORPORATION
+0080C7 XIRCOM
+0080C8 D-LINK SYSTEMS, INC.
+0080C9 ALBERTA MICROELECTRONIC CENTRE
+0080CA NETCOM RESEARCH INCORPORATED
+0080CB FALCO DATA PRODUCTS
+0080CC MICROWAVE BYPASS SYSTEMS
+0080CD MICRONICS COMPUTER, INC.
+0080CE BROADCAST TELEVISION SYSTEMS
+0080CF EMBEDDED PERFORMANCE INC.
+0080D0 COMPUTER PERIPHERALS, INC.
+0080D1 KIMTRON CORPORATION
+0080D2 SHINNIHONDENKO CO., LTD.
+0080D3 SHIVA CORP.
+0080D4 CHASE RESEARCH LTD.
+0080D5 CADRE TECHNOLOGIES
+0080D6 NUVOTECH, INC.
+0080D7 Fantum Engineering
+0080D8 NETWORK PERIPHERALS INC.
+0080D9 EMK ELEKTRONIK
+0080DA BRUEL & KJAER
+0080DB GRAPHON CORPORATION
+0080DC PICKER INTERNATIONAL
+0080DD GMX INC/GIMIX
+0080DE GIPSI S.A.
+0080DF ADC CODENOLL TECHNOLOGY CORP.
+0080E0 XTP SYSTEMS, INC.
+0080E1 STMICROELECTRONICS
+0080E2 T.D.I. CO., LTD.
+0080E3 CORAL NETWORK CORPORATION
+0080E4 NORTHWEST DIGITAL SYSTEMS, INC
+0080E5 MYLEX CORPORATION
+0080E6 PEER NETWORKS, INC.
+0080E7 LYNWOOD SCIENTIFIC DEV. LTD.
+0080E8 CUMULUS CORPORATIION
+0080E9 Madge Ltd.
+0080EA ADVA Optical Networking Ltd.
+0080EB COMPCONTROL B.V.
+0080EC SUPERCOMPUTING SOLUTIONS, INC.
+0080ED IQ TECHNOLOGIES, INC.
+0080EE THOMSON CSF
+0080EF RATIONAL
+0080F0 Panasonic Communications Co., Ltd.
+0080F1 OPUS SYSTEMS
+0080F2 RAYCOM SYSTEMS INC
+0080F3 SUN ELECTRONICS CORP.
+0080F4 TELEMECANIQUE ELECTRIQUE
+0080F5 QUANTEL LTD
+0080F6 SYNERGY MICROSYSTEMS
+0080F7 ZENITH ELECTRONICS
+0080F8 MIZAR, INC.
+0080F9 HEURIKON CORPORATION
+0080FA RWT GMBH
+0080FB BVM LIMITED
+0080FC AVATAR CORPORATION
+0080FD EXSCEED CORPRATION
+0080FE AZURE TECHNOLOGIES, INC.
+0080FF SOC. DE TELEINFORMATIQUE RTC
+009000 DIAMOND MULTIMEDIA
+009001 NISHIMU ELECTRONICS INDUSTRIES CO., LTD.
+009002 ALLGON AB
+009003 APLIO
+009004 3COM EUROPE LTD.
+009005 PROTECH SYSTEMS CO., LTD.
+009006 HAMAMATSU PHOTONICS K.K.
+009007 DOMEX TECHNOLOGY CORP.
+009008 HanA Systems Inc.
+009009 i Controls, Inc.
+00900A PROTON ELECTRONIC INDUSTRIAL CO., LTD.
+00900B LANNER ELECTRONICS, INC.
+00900C CISCO SYSTEMS, INC.
+00900D OVERLAND DATA INC.
+00900E HANDLINK TECHNOLOGIES, INC.
+00900F KAWASAKI HEAVY INDUSTRIES, LTD
+009010 SIMULATION LABORATORIES, INC.
+009011 WAVTrace, Inc.
+009012 GLOBESPAN SEMICONDUCTOR, INC.
+009013 SAMSAN CORP.
+009014 ROTORK INSTRUMENTS, LTD.
+009015 CENTIGRAM COMMUNICATIONS CORP.
+009016 ZAC
+009017 ZYPCOM, INC.
+009018 ITO ELECTRIC INDUSTRY CO, LTD.
+009019 HERMES ELECTRONICS CO., LTD.
+00901A UNISPHERE SOLUTIONS
+00901B DIGITAL CONTROLS
+00901C mps Software Gmbh
+00901D PEC (NZ) LTD.
+00901E SELESTA INGEGNE RIA S.P.A.
+00901F ADTEC PRODUCTIONS, INC.
+009020 PHILIPS ANALYTICAL X-RAY B.V.
+009021 CISCO SYSTEMS, INC.
+009022 IVEX
+009023 ZILOG INC.
+009024 PIPELINKS, INC.
+009025 VISION SYSTEMS LTD. PTY
+009026 ADVANCED SWITCHING COMMUNICATIONS, INC.
+009027 INTEL CORPORATION
+009028 NIPPON SIGNAL CO., LTD.
+009029 CRYPTO AG
+00902A COMMUNICATION DEVICES, INC.
+00902B CISCO SYSTEMS, INC.
+00902C DATA & CONTROL EQUIPMENT LTD.
+00902D DATA ELECTRONICS (AUST.) PTY, LTD.
+00902E NAMCO LIMITED
+00902F NETCORE SYSTEMS, INC.
+009030 HONEYWELL-DATING
+009031 MYSTICOM, LTD.
+009032 PELCOMBE GROUP LTD.
+009033 INNOVAPHONE GmbH
+009034 IMAGIC, INC.
+009035 ALPHA TELECOM, INC.
+009036 ens, inc.
+009037 ACUCOMM, INC.
+009038 FOUNTAIN TECHNOLOGIES, INC.
+009039 SHASTA NETWORKS
+00903A NIHON MEDIA TOOL INC.
+00903B TriEMS Research Lab, Inc.
+00903C ATLANTIC NETWORK SYSTEMS
+00903D BIOPAC SYSTEMS, INC.
+00903E N.V. PHILIPS INDUSTRIAL ACTIVITIES
+00903F AZTEC RADIOMEDIA
+009040 Siemens Network Convergence LLC
+009041 APPLIED DIGITAL ACCESS
+009042 ECCS, Inc.
+009043 NICHIBEI DENSHI CO., LTD.
+009044 ASSURED DIGITAL, INC.
+009045 Marconi Communications
+009046 DEXDYNE, LTD.
+009047 GIGA FAST E. LTD.
+009048 ZEAL CORPORATION
+009049 ENTRIDIA CORPORATION
+00904A CONCUR SYSTEM TECHNOLOGIES
+00904B GemTek Technology Co., Ltd.
+00904C EPIGRAM, INC.
+00904D SPEC S.A.
+00904E DELEM BV
+00904F ABB POWER T&D COMPANY, INC.
+009050 TELESTE OY
+009051 ULTIMATE TECHNOLOGY CORP.
+009052 SELCOM ELETTRONICA S.R.L.
+009053 DAEWOO ELECTRONICS CO., LTD.
+009054 INNOVATIVE SEMICONDUCTORS, INC
+009055 PARKER HANNIFIN CORPORATION COMPUMOTOR DIVISION
+009056 TELESTREAM, INC.
+009057 AANetcom, Inc.
+009058 Ultra Electronics Ltd., Command and Control Systems
+009059 TELECOM DEVICE K.K.
+00905A DEARBORN GROUP, INC.
+00905B RAYMOND AND LAE ENGINEERING
+00905C EDMI
+00905D NETCOM SICHERHEITSTECHNIK GmbH
+00905E RAULAND-BORG CORPORATION
+00905F CISCO SYSTEMS, INC.
+009060 SYSTEM CREATE CORP.
+009061 PACIFIC RESEARCH & ENGINEERING CORPORATION
+009062 ICP VORTEX COMPUTERSYSTEME GmbH
+009063 COHERENT COMMUNICATIONS SYSTEMS CORPORATION
+009064 THOMSON BROADCAST SYSTEMS
+009065 FINISAR CORPORATION
+009066 Troika Networks, Inc.
+009067 WalkAbout Computers, Inc.
+009068 DVT CORP.
+009069 JUNIPER NETWORKS, INC.
+00906A TURNSTONE SYSTEMS, INC.
+00906B APPLIED RESOURCES, INC.
+00906C GWT GLOBAL WEIGHING TECHNOLOGIES GmbH
+00906D CISCO SYSTEMS, INC.
+00906E PRAXON, INC.
+00906F CISCO SYSTEMS, INC.
+009070 NEO NETWORKS, INC.
+009071 Applied Innovation Inc.
+009072 SIMRAD AS
+009073 GAIO TECHNOLOGY
+009074 ARGON NETWORKS, INC.
+009075 NEC DO BRASIL S.A.
+009076 FMT AIRCRAFT GATE SUPPORT SYSTEMS AB
+009077 ADVANCED FIBRE COMMUNICATIONS
+009078 MER TELEMANAGEMENT SOLUTIONS, LTD.
+009079 ClearOne, Inc.
+00907A SPECTRALINK CORP.
+00907B E-TECH, INC.
+00907C DIGITALCAST, INC.
+00907D Lake Communications
+00907E VETRONIX CORP.
+00907F WatchGuard Technologies, Inc.
+009080 NOT LIMITED, INC.
+009081 ALOHA NETWORKS, INC.
+009082 FORCE INSTITUTE
+009083 TURBO COMMUNICATION, INC.
+009084 ATECH SYSTEM
+009085 GOLDEN ENTERPRISES, INC.
+009086 CISCO SYSTEMS, INC.
+009087 ITIS
+009088 BAXALL SECURITY LTD.
+009089 SOFTCOM MICROSYSTEMS, INC.
+00908A BAYLY COMMUNICATIONS, INC.
+00908B CELL COMPUTING, INC.
+00908C ETREND ELECTRONICS, INC.
+00908D VICKERS ELECTRONICS SYSTEMS
+00908E Nortel Networks Broadband Access
+00908F AUDIO CODES LTD.
+009090 I-BUS
+009091 DigitalScape, Inc.
+009092 CISCO SYSTEMS, INC.
+009093 NANAO CORPORATION
+009094 OSPREY TECHNOLOGIES, INC.
+009095 UNIVERSAL AVIONICS
+009096 ASKEY COMPUTER CORP.
+009097 SYCAMORE NETWORKS
+009098 SBC DESIGNS, INC.
+009099 ALLIED TELESIS, K.K.
+00909A ONE WORLD SYSTEMS, INC.
+00909B MARKPOINT AB
+00909C Terayon Communications Systems
+00909D NovaTech Process Solutions, LLC
+00909E Critical IO, LLC
+00909F DIGI-DATA CORPORATION
+0090A0 8X8 INC.
+0090A1 FLYING PIG SYSTEMS, LTD.
+0090A2 CYBERTAN TECHNOLOGY, INC.
+0090A3 Corecess Inc.
+0090A4 ALTIGA NETWORKS
+0090A5 SPECTRA LOGIC
+0090A6 CISCO SYSTEMS, INC.
+0090A7 CLIENTEC CORPORATION
+0090A8 NineTiles Networks, Ltd.
+0090A9 WESTERN DIGITAL
+0090AA INDIGO ACTIVE VISION SYSTEMS LIMITED
+0090AB CISCO SYSTEMS, INC.
+0090AC OPTIVISION, INC.
+0090AD ASPECT ELECTRONICS, INC.
+0090AE ITALTEL S.p.A.
+0090AF J. MORITA MFG. CORP.
+0090B0 VADEM
+0090B1 CISCO SYSTEMS, INC.
+0090B2 AVICI SYSTEMS INC.
+0090B3 AGRANAT SYSTEMS
+0090B4 WILLOWBROOK TECHNOLOGIES
+0090B5 NIKON CORPORATION
+0090B6 FIBEX SYSTEMS
+0090B7 DIGITAL LIGHTWAVE, INC.
+0090B8 ROHDE & SCHWARZ GMBH & CO. KG
+0090B9 BERAN INSTRUMENTS LTD.
+0090BA VALID NETWORKS, INC.
+0090BB TAINET COMMUNICATION SYSTEM Corp.
+0090BC TELEMANN CO., LTD.
+0090BD OMNIA COMMUNICATIONS, INC.
+0090BE IBC/INTEGRATED BUSINESS COMPUTERS
+0090BF CISCO SYSTEMS, INC.
+0090C0 K.J. LAW ENGINEERS, INC.
+0090C1 Peco II, Inc.
+0090C2 JK microsystems, Inc.
+0090C3 TOPIC SEMICONDUCTOR CORP.
+0090C4 JAVELIN SYSTEMS, INC.
+0090C5 INTERNET MAGIC, INC.
+0090C6 OPTIM SYSTEMS, INC.
+0090C7 ICOM INC.
+0090C8 WAVERIDER COMMUNICATIONS (CANADA) INC.
+0090C9 DPAC Technologies
+0090CA ACCORD VIDEO TELECOMMUNICATIONS, LTD.
+0090CB Wireless OnLine, Inc.
+0090CC PLANET COMMUNICATIONS, INC.
+0090CD ENT-EMPRESA NACIONAL DE TELECOMMUNICACOES, S.A.
+0090CE TETRA GmbH
+0090CF NORTEL
+0090D0 Thomson Belgium
+0090D1 LEICHU ENTERPRISE CO., LTD.
+0090D2 ARTEL VIDEO SYSTEMS
+0090D3 GIESECKE & DEVRIENT GmbH
+0090D4 BindView Development Corp.
+0090D5 EUPHONIX, INC.
+0090D6 CRYSTAL GROUP
+0090D7 NetBoost Corp.
+0090D8 WHITECROSS SYSTEMS
+0090D9 CISCO SYSTEMS, INC.
+0090DA DYNARC, INC.
+0090DB NEXT LEVEL COMMUNICATIONS
+0090DC TECO INFORMATION SYSTEMS
+0090DD THE MIHARU COMMUNICATIONS CO., LTD.
+0090DE CARDKEY SYSTEMS, INC.
+0090DF MITSUBISHI CHEMICAL AMERICA, INC.
+0090E0 SYSTRAN CORP.
+0090E1 TELENA S.P.A.
+0090E2 DISTRIBUTED PROCESSING TECHNOLOGY
+0090E3 AVEX ELECTRONICS INC.
+0090E4 NEC AMERICA, INC.
+0090E5 TEKNEMA, INC.
+0090E6 ACER LABORATORIES, INC.
+0090E7 HORSCH ELEKTRONIK AG
+0090E8 MOXA TECHNOLOGIES CORP., LTD.
+0090E9 JANZ COMPUTER AG
+0090EA ALPHA TECHNOLOGIES, INC.
+0090EB SENTRY TELECOM SYSTEMS
+0090EC PYRESCOM
+0090ED CENTRAL SYSTEM RESEARCH CO., LTD.
+0090EE PERSONAL COMMUNICATIONS TECHNOLOGIES
+0090EF INTEGRIX, INC.
+0090F0 HARMONIC LIGHTWAVES, LTD.
+0090F1 DOT HILL SYSTEMS CORPORATION
+0090F2 CISCO SYSTEMS, INC.
+0090F3 ASPECT COMMUNICATIONS
+0090F4 LIGHTNING INSTRUMENTATION
+0090F5 CLEVO CO.
+0090F6 ESCALATE NETWORKS, INC.
+0090F7 NBASE COMMUNICATIONS LTD.
+0090F8 MEDIATRIX TELECOM
+0090F9 LEITCH
+0090FA EMULEX Corp
+0090FB PORTWELL, INC.
+0090FC NETWORK COMPUTING DEVICES
+0090FD CopperCom, Inc.
+0090FE ELECOM CO., LTD. (LANEED DIV.)
+0090FF TELLUS TECHNOLOGY INC.
+0091D6 Crystal Group, Inc.
+009D8E CARDIAC RECORDERS, INC.
+00A000 CENTILLION NETWORKS, INC.
+00A001 DRS Signal Solutions
+00A002 LEEDS & NORTHRUP AUSTRALIA PTY LTD
+00A003 STAEFA CONTROL SYSTEM
+00A004 NETPOWER, INC.
+00A005 DANIEL INSTRUMENTS, LTD.
+00A006 IMAGE DATA PROCESSING SYSTEM GROUP
+00A007 APEXX TECHNOLOGY, INC.
+00A008 NETCORP
+00A009 WHITETREE NETWORK
+00A00A R.D.C. COMMUNICATION
+00A00B COMPUTEX CO., LTD.
+00A00C KINGMAX TECHNOLOGY, INC.
+00A00D THE PANDA PROJECT
+00A00E VISUAL NETWORKS, INC.
+00A00F Broadband Technologies
+00A010 SYSLOGIC DATENTECHNIK AG
+00A011 MUTOH INDUSTRIES LTD.
+00A012 B.A.T.M. ADVANCED TECHNOLOGIES
+00A013 TELTREND LTD.
+00A014 CSIR
+00A015 WYLE
+00A016 MICROPOLIS CORP.
+00A017 J B M CORPORATION
+00A018 CREATIVE CONTROLLERS, INC.
+00A019 NEBULA CONSULTANTS, INC.
+00A01A BINAR ELEKTRONIK AB
+00A01B PREMISYS COMMUNICATIONS, INC.
+00A01C NASCENT NETWORKS CORPORATION
+00A01D SIXNET
+00A01E EST CORPORATION
+00A01F TRICORD SYSTEMS, INC.
+00A020 CITICORP/TTI
+00A021 General Dynamics
+00A022 CENTRE FOR DEVELOPMENT OF ADVANCED COMPUTING
+00A023 APPLIED CREATIVE TECHNOLOGY, INC.
+00A024 3COM CORPORATION
+00A025 REDCOM LABS INC.
+00A026 TELDAT, S.A.
+00A027 FIREPOWER SYSTEMS, INC.
+00A028 CONNER PERIPHERALS
+00A029 COULTER CORPORATION
+00A02A TRANCELL SYSTEMS
+00A02B TRANSITIONS RESEARCH CORP.
+00A02C interWAVE Communications
+00A02D 1394 Trade Association
+00A02E BRAND COMMUNICATIONS, LTD.
+00A02F PIRELLI CAVI
+00A030 CAPTOR NV/SA
+00A031 HAZELTINE CORPORATION, MS 1-17
+00A032 GES SINGAPORE PTE. LTD.
+00A033 imc MeBsysteme GmbH
+00A034 AXEL
+00A035 CYLINK CORPORATION
+00A036 APPLIED NETWORK TECHNOLOGY
+00A037 DATASCOPE CORPORATION
+00A038 EMAIL ELECTRONICS
+00A039 ROSS TECHNOLOGY, INC.
+00A03A KUBOTEK CORPORATION
+00A03B TOSHIN ELECTRIC CO., LTD.
+00A03C EG&G NUCLEAR INSTRUMENTS
+00A03D OPTO-22
+00A03E ATM FORUM
+00A03F COMPUTER SOCIETY MICROPROCESSOR & MICROPROCESSOR STANDARDS C
+00A040 APPLE COMPUTER
+00A041 INFICON
+00A042 SPUR PRODUCTS CORP.
+00A043 AMERICAN TECHNOLOGY LABS, INC.
+00A044 NTT IT CO., LTD.
+00A045 PHOENIX CONTACT GMBH & CO.
+00A046 SCITEX CORP. LTD.
+00A047 INTEGRATED FITNESS CORP.
+00A048 QUESTECH, LTD.
+00A049 DIGITECH INDUSTRIES, INC.
+00A04A NISSHIN ELECTRIC CO., LTD.
+00A04B TFL LAN INC.
+00A04C INNOVATIVE SYSTEMS & TECHNOLOGIES, INC.
+00A04D EDA INSTRUMENTS, INC.
+00A04E VOELKER TECHNOLOGIES, INC.
+00A04F AMERITEC CORP.
+00A050 CYPRESS SEMICONDUCTOR
+00A051 ANGIA COMMUNICATIONS. INC.
+00A052 STANILITE ELECTRONICS PTY. LTD
+00A053 COMPACT DEVICES, INC.
+00A055 Data Device Corporation
+00A056 MICROPROSS
+00A057 LANCOM Systems GmbH
+00A058 GLORY, LTD.
+00A059 HAMILTON HALLMARK
+00A05A KOFAX IMAGE PRODUCTS
+00A05B MARQUIP, INC.
+00A05C INVENTORY CONVERSION, INC./
+00A05D CS COMPUTER SYSTEME GmbH
+00A05E MYRIAD LOGIC INC.
+00A05F BTG ENGINEERING BV
+00A060 ACER PERIPHERALS, INC.
+00A061 PURITAN BENNETT
+00A062 AES PRODATA
+00A063 JRL SYSTEMS, INC.
+00A064 KVB/ANALECT
+00A065 Symantec Corporation
+00A066 ISA CO., LTD.
+00A067 NETWORK SERVICES GROUP
+00A068 BHP LIMITED
+00A069 Symmetricom, Inc.
+00A06A Verilink Corporation
+00A06B DMS DORSCH MIKROSYSTEM GMBH
+00A06C SHINDENGEN ELECTRIC MFG. CO., LTD.
+00A06D MANNESMANN TALLY CORPORATION
+00A06E AUSTRON, INC.
+00A06F THE APPCON GROUP, INC.
+00A070 COASTCOM
+00A071 VIDEO LOTTERY TECHNOLOGIES,INC
+00A072 OVATION SYSTEMS LTD.
+00A073 COM21, INC.
+00A074 PERCEPTION TECHNOLOGY
+00A075 MICRON TECHNOLOGY, INC.
+00A076 CARDWARE LAB, INC.
+00A077 FUJITSU NEXION, INC.
+00A078 Marconi Communications
+00A079 ALPS ELECTRIC (USA), INC.
+00A07A ADVANCED PERIPHERALS TECHNOLOGIES, INC.
+00A07B DAWN COMPUTER INCORPORATION
+00A07C TONYANG NYLON CO., LTD.
+00A07D SEEQ TECHNOLOGY, INC.
+00A07E AVID TECHNOLOGY, INC.
+00A07F GSM-SYNTEL, LTD.
+00A080 SBE, Inc.
+00A081 ALCATEL DATA NETWORKS
+00A082 NKT ELEKTRONIK A/S
+00A083 ASIMMPHONY TURKEY
+00A084 DATAPLEX PTY. LTD.
+00A086 AMBER WAVE SYSTEMS, INC.
+00A087 Zarlink Semiconductor Ltd.
+00A088 ESSENTIAL COMMUNICATIONS
+00A089 XPOINT TECHNOLOGIES, INC.
+00A08A BROOKTROUT TECHNOLOGY, INC.
+00A08B ASTON ELECTRONIC DESIGNS LTD.
+00A08C MultiMedia LANs, Inc.
+00A08D JACOMO CORPORATION
+00A08E Nokia Internet Communications
+00A08F DESKNET SYSTEMS, INC.
+00A090 TimeStep Corporation
+00A091 APPLICOM INTERNATIONAL
+00A092 H. BOLLMANN MANUFACTURERS, LTD
+00A093 B/E AEROSPACE, Inc.
+00A094 COMSAT CORPORATION
+00A095 ACACIA NETWORKS, INC.
+00A096 MITUMI ELECTRIC CO., LTD.
+00A097 JC INFORMATION SYSTEMS
+00A098 NETWORK APPLIANCE CORP.
+00A099 K-NET LTD.
+00A09A NIHON KOHDEN AMERICA
+00A09B QPSX COMMUNICATIONS, LTD.
+00A09C Xyplex, Inc.
+00A09D JOHNATHON FREEMAN TECHNOLOGIES
+00A09E ICTV
+00A09F COMMVISION CORP.
+00A0A0 COMPACT DATA, LTD.
+00A0A1 EPIC DATA INC.
+00A0A2 DIGICOM S.P.A.
+00A0A3 RELIABLE POWER METERS
+00A0A4 MICROS SYSTEMS, INC.
+00A0A5 TEKNOR MICROSYSTEME, INC.
+00A0A6 M.I. SYSTEMS, K.K.
+00A0A7 VORAX CORPORATION
+00A0A8 RENEX CORPORATION
+00A0A9 GN NETTEST (CANADA) NAVTEL DIVISION
+00A0AA SPACELABS MEDICAL
+00A0AB NETCS INFORMATIONSTECHNIK GMBH
+00A0AC GILAT SATELLITE NETWORKS, LTD.
+00A0AD MARCONI SPA
+00A0AE NUCOM SYSTEMS, INC.
+00A0AF WMS INDUSTRIES
+00A0B0 I-O DATA DEVICE, INC.
+00A0B1 FIRST VIRTUAL CORPORATION
+00A0B2 SHIMA SEIKI
+00A0B3 ZYKRONIX
+00A0B4 TEXAS MICROSYSTEMS, INC.
+00A0B5 3H TECHNOLOGY
+00A0B6 SANRITZ AUTOMATION CO., LTD.
+00A0B7 CORDANT, INC.
+00A0B8 SYMBIOS LOGIC INC.
+00A0B9 EAGLE TECHNOLOGY, INC.
+00A0BA PATTON ELECTRONICS CO.
+00A0BB HILAN GMBH
+00A0BC VIASAT, INCORPORATED
+00A0BD I-TECH CORP.
+00A0BE INTEGRATED CIRCUIT SYSTEMS, INC. COMMUNICATIONS GROUP
+00A0BF WIRELESS DATA GROUP MOTOROLA
+00A0C0 DIGITAL LINK CORP.
+00A0C1 ORTIVUS MEDICAL AB
+00A0C2 R.A. SYSTEMS CO., LTD.
+00A0C3 UNICOMPUTER GMBH
+00A0C4 CRISTIE ELECTRONICS LTD.
+00A0C5 ZYXEL COMMUNICATION
+00A0C6 QUALCOMM INCORPORATED
+00A0C7 TADIRAN TELECOMMUNICATIONS
+00A0C8 ADTRAN INC.
+00A0C9 INTEL CORPORATION - HF1-06
+00A0CA FUJITSU DENSO LTD.
+00A0CB ARK TELECOMMUNICATIONS, INC.
+00A0CC LITE-ON COMMUNICATIONS, INC.
+00A0CD DR. JOHANNES HEIDENHAIN GmbH
+00A0CE ASTROCOM CORPORATION
+00A0CF SOTAS, INC.
+00A0D0 TEN X TECHNOLOGY, INC.
+00A0D1 INVENTEC CORPORATION
+00A0D2 ALLIED TELESIS INTERNATIONAL CORPORATION
+00A0D3 INSTEM COMPUTER SYSTEMS, LTD.
+00A0D4 RADIOLAN, INC.
+00A0D5 SIERRA WIRELESS INC.
+00A0D6 SBE, INC.
+00A0D7 KASTEN CHASE APPLIED RESEARCH
+00A0D8 SPECTRA - TEK
+00A0D9 CONVEX COMPUTER CORPORATION
+00A0DA INTEGRATED SYSTEMS Technology, Inc.
+00A0DB FISHER & PAYKEL PRODUCTION
+00A0DC O.N. ELECTRONIC CO., LTD.
+00A0DD AZONIX CORPORATION
+00A0DE YAMAHA CORPORATION
+00A0DF STS TECHNOLOGIES, INC.
+00A0E0 TENNYSON TECHNOLOGIES PTY LTD
+00A0E1 WESTPORT RESEARCH ASSOCIATES, INC.
+00A0E2 KEISOKU GIKEN CORP.
+00A0E3 XKL SYSTEMS CORP.
+00A0E4 OPTIQUEST
+00A0E5 NHC COMMUNICATIONS
+00A0E6 DIALOGIC CORPORATION
+00A0E7 CENTRAL DATA CORPORATION
+00A0E8 REUTERS HOLDINGS PLC
+00A0E9 ELECTRONIC RETAILING SYSTEMS INTERNATIONAL
+00A0EA ETHERCOM CORP.
+00A0EB Encore Networks
+00A0EC TRANSMITTON LTD.
+00A0ED PRI AUTOMATION
+00A0EE NASHOBA NETWORKS
+00A0EF LUCIDATA LTD.
+00A0F0 TORONTO MICROELECTRONICS INC.
+00A0F1 MTI
+00A0F2 INFOTEK COMMUNICATIONS, INC.
+00A0F3 STAUBLI
+00A0F4 GE
+00A0F5 RADGUARD LTD.
+00A0F6 AutoGas Systems Inc.
+00A0F7 V.I COMPUTER CORP.
+00A0F8 SYMBOL TECHNOLOGIES, INC.
+00A0F9 BINTEC COMMUNICATIONS GMBH
+00A0FA Marconi Communication GmbH
+00A0FB TORAY ENGINEERING CO., LTD.
+00A0FC IMAGE SCIENCES, INC.
+00A0FD SCITEX DIGITAL PRINTING, INC.
+00A0FE BOSTON TECHNOLOGY, INC.
+00A0FF TELLABS OPERATIONS, INC.
+00AA00 INTEL CORPORATION
+00AA01 INTEL CORPORATION
+00AA02 INTEL CORPORATION
+00AA3C OLIVETTI TELECOM SPA (OLTECO)
+00B009 Grass Valley Group
+00B017 InfoGear Technology Corp.
+00B019 Casi-Rusco
+00B01C Westport Technologies
+00B01E Rantic Labs, Inc.
+00B02A ORSYS GmbH
+00B02D ViaGate Technologies, Inc.
+00B03B HiQ Networks
+00B048 Marconi Communications Inc.
+00B04A Cisco Systems, Inc.
+00B052 Intellon Corporation
+00B064 Cisco Systems, Inc.
+00B069 Honewell Oy
+00B06D Jones Futurex Inc.
+00B080 Mannesmann Ipulsys B.V.
+00B086 LocSoft Limited
+00B08E Cisco Systems, Inc.
+00B091 Transmeta Corp.
+00B094 Alaris, Inc.
+00B09A Morrow Technologies Corp.
+00B09D Point Grey Research Inc.
+00B0AC SIAE-Microelettronica S.p.A.
+00B0AE Symmetricom
+00B0B3 Xstreamis PLC
+00B0C2 Cisco Systems, Inc.
+00B0C7 Tellabs Operations, Inc.
+00B0CE TECHNOLOGY RESCUE
+00B0D0 Dell Computer Corp.
+00B0DB Nextcell, Inc.
+00B0DF Reliable Data Technology, Inc.
+00B0E7 British Federal Ltd.
+00B0EC EACEM
+00B0EE Ajile Systems, Inc.
+00B0F0 CALY NETWORKS
+00B0F5 NetWorth Technologies, Inc.
+00BB01 OCTOTHORPE CORP.
+00BBF0 UNGERMANN-BASS INC.
+00C000 LANOPTICS, LTD.
+00C001 DIATEK PATIENT MANAGMENT
+00C002 SERCOMM CORPORATION
+00C003 GLOBALNET COMMUNICATIONS
+00C004 JAPAN BUSINESS COMPUTER CO.LTD
+00C005 LIVINGSTON ENTERPRISES, INC.
+00C006 NIPPON AVIONICS CO., LTD.
+00C007 PINNACLE DATA SYSTEMS, INC.
+00C008 SECO SRL
+00C009 KT TECHNOLOGY (S) PTE LTD
+00C00A MICRO CRAFT
+00C00B NORCONTROL A.S.
+00C00C RELIA TECHNOLGIES
+00C00D ADVANCED LOGIC RESEARCH, INC.
+00C00E PSITECH, INC.
+00C00F QUANTUM SOFTWARE SYSTEMS LTD.
+00C010 HIRAKAWA HEWTECH CORP.
+00C011 INTERACTIVE COMPUTING DEVICES
+00C012 NETSPAN CORPORATION
+00C013 NETRIX
+00C014 TELEMATICS CALABASAS INT'L,INC
+00C015 NEW MEDIA CORPORATION
+00C016 ELECTRONIC THEATRE CONTROLS
+00C017 FORTE NETWORKS
+00C018 LANART CORPORATION
+00C019 LEAP TECHNOLOGY, INC.
+00C01A COROMETRICS MEDICAL SYSTEMS
+00C01B SOCKET COMMUNICATIONS, INC.
+00C01C INTERLINK COMMUNICATIONS LTD.
+00C01D GRAND JUNCTION NETWORKS, INC.
+00C01E LA FRANCAISE DES JEUX
+00C01F S.E.R.C.E.L.
+00C020 ARCO ELECTRONIC, CONTROL LTD.
+00C021 NETEXPRESS
+00C022 LASERMASTER TECHNOLOGIES, INC.
+00C023 TUTANKHAMON ELECTRONICS
+00C024 EDEN SISTEMAS DE COMPUTACAO SA
+00C025 DATAPRODUCTS CORPORATION
+00C026 LANS TECHNOLOGY CO., LTD.
+00C027 CIPHER SYSTEMS, INC.
+00C028 JASCO CORPORATION
+00C029 Nexans Deutschland AG - ANS
+00C02A OHKURA ELECTRIC CO., LTD.
+00C02B GERLOFF GESELLSCHAFT FUR
+00C02C CENTRUM COMMUNICATIONS, INC.
+00C02D FUJI PHOTO FILM CO., LTD.
+00C02E NETWIZ
+00C02F OKUMA CORPORATION
+00C030 INTEGRATED ENGINEERING B. V.
+00C031 DESIGN RESEARCH SYSTEMS, INC.
+00C032 I-CUBED LIMITED
+00C033 TELEBIT COMMUNICATIONS APS
+00C034 TRANSACTION NETWORK
+00C035 QUINTAR COMPANY
+00C036 RAYTECH ELECTRONIC CORP.
+00C037 DYNATEM
+00C038 RASTER IMAGE PROCESSING SYSTEM
+00C039 TDK SEMICONDUCTOR CORPORATION
+00C03A MEN-MIKRO ELEKTRONIK GMBH
+00C03B MULTIACCESS COMPUTING CORP.
+00C03C TOWER TECH S.R.L.
+00C03D WIESEMANN & THEIS GMBH
+00C03E FA. GEBR. HELLER GMBH
+00C03F STORES AUTOMATED SYSTEMS, INC.
+00C040 ECCI
+00C041 DIGITAL TRANSMISSION SYSTEMS
+00C042 DATALUX CORP.
+00C043 STRATACOM
+00C044 EMCOM CORPORATION
+00C045 ISOLATION SYSTEMS, LTD.
+00C046 KEMITRON LTD.
+00C047 UNIMICRO SYSTEMS, INC.
+00C048 BAY TECHNICAL ASSOCIATES
+00C049 U.S. ROBOTICS, INC.
+00C04A GROUP 2000 AG
+00C04B CREATIVE MICROSYSTEMS
+00C04C DEPARTMENT OF FOREIGN AFFAIRS
+00C04D MITEC, INC.
+00C04E COMTROL CORPORATION
+00C04F DELL COMPUTER CORPORATION
+00C050 TOYO DENKI SEIZO K.K.
+00C051 ADVANCED INTEGRATION RESEARCH
+00C052 BURR-BROWN
+00C053 DAVOX CORPORATION
+00C054 NETWORK PERIPHERALS, LTD.
+00C055 MODULAR COMPUTING TECHNOLOGIES
+00C056 SOMELEC
+00C057 MYCO ELECTRONICS
+00C058 DATAEXPERT CORP.
+00C059 NIPPON DENSO CO., LTD.
+00C05A SEMAPHORE COMMUNICATIONS CORP.
+00C05B NETWORKS NORTHWEST, INC.
+00C05C ELONEX PLC
+00C05D L&N TECHNOLOGIES
+00C05E VARI-LITE, INC.
+00C05F FINE-PAL COMPANY LIMITED
+00C060 ID SCANDINAVIA AS
+00C061 SOLECTEK CORPORATION
+00C062 IMPULSE TECHNOLOGY
+00C063 MORNING STAR TECHNOLOGIES, INC
+00C064 GENERAL DATACOMM IND. INC.
+00C065 SCOPE COMMUNICATIONS, INC.
+00C066 DOCUPOINT, INC.
+00C067 UNITED BARCODE INDUSTRIES
+00C068 PHILIP DRAKE ELECTRONICS LTD.
+00C069 Axxcelera Broadband Wireless
+00C06A ZAHNER-ELEKTRIK GMBH & CO. KG
+00C06B OSI PLUS CORPORATION
+00C06C SVEC COMPUTER CORP.
+00C06D BOCA RESEARCH, INC.
+00C06E HAFT TECHNOLOGY, INC.
+00C06F KOMATSU LTD.
+00C070 SECTRA SECURE-TRANSMISSION AB
+00C071 AREANEX COMMUNICATIONS, INC.
+00C072 KNX LTD.
+00C073 XEDIA CORPORATION
+00C074 TOYODA AUTOMATIC LOOM
+00C075 XANTE CORPORATION
+00C076 I-DATA INTERNATIONAL A-S
+00C077 DAEWOO TELECOM LTD.
+00C078 COMPUTER SYSTEMS ENGINEERING
+00C079 FONSYS CO.,LTD.
+00C07A PRIVA B.V.
+00C07B ASCEND COMMUNICATIONS, INC.
+00C07C HIGHTECH INFORMATION
+00C07D RISC DEVELOPMENTS LTD.
+00C07E KUBOTA CORPORATION ELECTRONIC
+00C07F NUPON COMPUTING CORP.
+00C080 NETSTAR, INC.
+00C081 METRODATA LTD.
+00C082 MOORE PRODUCTS CO.
+00C083 TRACE MOUNTAIN PRODUCTS, INC.
+00C084 DATA LINK CORP. LTD.
+00C085 ELECTRONICS FOR IMAGING, INC.
+00C086 THE LYNK CORPORATION
+00C087 UUNET TECHNOLOGIES, INC.
+00C088 EKF ELEKTRONIK GMBH
+00C089 TELINDUS DISTRIBUTION
+00C08A LAUTERBACH DATENTECHNIK GMBH
+00C08B RISQ MODULAR SYSTEMS, INC.
+00C08C PERFORMANCE TECHNOLOGIES, INC.
+00C08D TRONIX PRODUCT DEVELOPMENT
+00C08E NETWORK INFORMATION TECHNOLOGY
+00C08F MATSUSHITA ELECTRIC WORKS, LTD
+00C090 PRAIM S.R.L.
+00C091 JABIL CIRCUIT, INC.
+00C092 MENNEN MEDICAL INC.
+00C093 ALTA RESEARCH CORP.
+00C094 VMX INC.
+00C095 ZNYX
+00C096 TAMURA CORPORATION
+00C097 ARCHIPEL SA
+00C098 CHUNTEX ELECTRONIC CO., LTD.
+00C099 YOSHIKI INDUSTRIAL CO.,LTD.
+00C09A PHOTONICS CORPORATION
+00C09B RELIANCE COMM/TEC, R-TEC
+00C09C TOA ELECTRONIC LTD.
+00C09D DISTRIBUTED SYSTEMS INT'L, INC
+00C09E CACHE COMPUTERS, INC.
+00C09F QUANTA COMPUTER, INC.
+00C0A0 ADVANCE MICRO RESEARCH, INC.
+00C0A1 TOKYO DENSHI SEKEI CO.
+00C0A2 INTERMEDIUM A/S
+00C0A3 DUAL ENTERPRISES CORPORATION
+00C0A4 UNIGRAF OY
+00C0A5 DICKENS DATA SYSTEMS
+00C0A6 EXICOM AUSTRALIA PTY. LTD
+00C0A7 SEEL LTD.
+00C0A8 GVC CORPORATION
+00C0A9 BARRON MCCANN LTD.
+00C0AA SILICON VALLEY COMPUTER
+00C0AB Telco Systems, Inc.
+00C0AC GAMBIT COMPUTER COMMUNICATIONS
+00C0AD MARBEN COMMUNICATION SYSTEMS
+00C0AE TOWERCOM CO. INC. DBA PC HOUSE
+00C0AF TEKLOGIX INC.
+00C0B0 GCC TECHNOLOGIES,INC.
+00C0B1 GENIUS NET CO.
+00C0B2 NORAND CORPORATION
+00C0B3 COMSTAT DATACOMM CORPORATION
+00C0B4 MYSON TECHNOLOGY, INC.
+00C0B5 CORPORATE NETWORK SYSTEMS,INC.
+00C0B6 Snap Appliance, Inc.
+00C0B7 AMERICAN POWER CONVERSION CORP
+00C0B8 FRASER'S HILL LTD.
+00C0B9 FUNK SOFTWARE, INC.
+00C0BA NETVANTAGE
+00C0BB FORVAL CREATIVE, INC.
+00C0BC TELECOM AUSTRALIA/CSSC
+00C0BD INEX TECHNOLOGIES, INC.
+00C0BE ALCATEL - SEL
+00C0BF TECHNOLOGY CONCEPTS, LTD.
+00C0C0 SHORE MICROSYSTEMS, INC.
+00C0C1 QUAD/GRAPHICS, INC.
+00C0C2 INFINITE NETWORKS LTD.
+00C0C3 ACUSON COMPUTED SONOGRAPHY
+00C0C4 COMPUTER OPERATIONAL
+00C0C5 SID INFORMATICA
+00C0C6 PERSONAL MEDIA CORP.
+00C0C7 SPARKTRUM MICROSYSTEMS, INC.
+00C0C8 MICRO BYTE PTY. LTD.
+00C0C9 ELSAG BAILEY PROCESS
+00C0CA ALFA, INC.
+00C0CB CONTROL TECHNOLOGY CORPORATION
+00C0CC TELESCIENCES CO SYSTEMS, INC.
+00C0CD COMELTA, S.A.
+00C0CE CEI SYSTEMS & ENGINEERING PTE
+00C0CF IMATRAN VOIMA OY
+00C0D0 RATOC SYSTEM INC.
+00C0D1 COMTREE TECHNOLOGY CORPORATION
+00C0D2 SYNTELLECT, INC.
+00C0D3 OLYMPUS IMAGE SYSTEMS, INC.
+00C0D4 AXON NETWORKS, INC.
+00C0D5 QUANCOM ELECTRONIC GMBH
+00C0D6 J1 SYSTEMS, INC.
+00C0D7 TAIWAN TRADING CENTER DBA
+00C0D8 UNIVERSAL DATA SYSTEMS
+00C0D9 QUINTE NETWORK CONFIDENTIALITY
+00C0DA NICE SYSTEMS LTD.
+00C0DB IPC CORPORATION (PTE) LTD.
+00C0DC EOS TECHNOLOGIES, INC.
+00C0DD QLogic Corporation
+00C0DE ZCOMM, INC.
+00C0DF KYE Systems Corp.
+00C0E0 DSC COMMUNICATION CORP.
+00C0E1 SONIC SOLUTIONS
+00C0E2 CALCOMP, INC.
+00C0E3 OSITECH COMMUNICATIONS, INC.
+00C0E4 SIEMENS BUILDING
+00C0E5 GESPAC, S.A.
+00C0E6 Verilink Corporation
+00C0E7 FIBERDATA AB
+00C0E8 PLEXCOM, INC.
+00C0E9 OAK SOLUTIONS, LTD.
+00C0EA ARRAY TECHNOLOGY LTD.
+00C0EB SEH COMPUTERTECHNIK GMBH
+00C0EC DAUPHIN TECHNOLOGY
+00C0ED US ARMY ELECTRONIC
+00C0EE KYOCERA CORPORATION
+00C0EF ABIT CORPORATION
+00C0F0 KINGSTON TECHNOLOGY CORP.
+00C0F1 SHINKO ELECTRIC CO., LTD.
+00C0F2 TRANSITION NETWORKS
+00C0F3 NETWORK COMMUNICATIONS CORP.
+00C0F4 INTERLINK SYSTEM CO., LTD.
+00C0F5 METACOMP, INC.
+00C0F6 CELAN TECHNOLOGY INC.
+00C0F7 ENGAGE COMMUNICATION, INC.
+00C0F8 ABOUT COMPUTING INC.
+00C0F9 HARRIS AND JEFFRIES, INC.
+00C0FA CANARY COMMUNICATIONS, INC.
+00C0FB ADVANCED TECHNOLOGY LABS
+00C0FC ELASTIC REALITY, INC.
+00C0FD PROSUM
+00C0FE APTEC COMPUTER SYSTEMS, INC.
+00C0FF DOT HILL SYSTEMS CORPORATION
+00CBBD Cambridge Broadband Ltd.
+00CF1C COMMUNICATION MACHINERY CORP.
+00D000 FERRAN SCIENTIFIC, INC.
+00D001 VST TECHNOLOGIES, INC.
+00D002 DITECH CORPORATION
+00D003 COMDA ENTERPRISES CORP.
+00D004 PENTACOM LTD.
+00D005 ZHS ZEITMANAGEMENTSYSTEME
+00D006 CISCO SYSTEMS, INC.
+00D007 MIC ASSOCIATES, INC.
+00D008 MACTELL CORPORATION
+00D009 HSING TECH. ENTERPRISE CO. LTD
+00D00A LANACCESS TELECOM S.A.
+00D00B RHK TECHNOLOGY, INC.
+00D00C SNIJDER MICRO SYSTEMS
+00D00D MICROMERITICS INSTRUMENT
+00D00E PLURIS, INC.
+00D00F SPEECH DESIGN GMBH
+00D010 CONVERGENT NETWORKS, INC.
+00D011 PRISM VIDEO, INC.
+00D012 GATEWORKS CORP.
+00D013 PRIMEX AEROSPACE COMPANY
+00D014 ROOT, INC.
+00D015 UNIVEX MICROTECHNOLOGY CORP.
+00D016 SCM MICROSYSTEMS, INC.
+00D017 SYNTECH INFORMATION CO., LTD.
+00D018 QWES. COM, INC.
+00D019 DAINIPPON SCREEN CORPORATE
+00D01A URMET SUD S.P.A.
+00D01B MIMAKI ENGINEERING CO., LTD.
+00D01C SBS TECHNOLOGIES,
+00D01D FURUNO ELECTRIC CO., LTD.
+00D01E PINGTEL CORP.
+00D01F CTAM PTY. LTD.
+00D020 AIM SYSTEM, INC.
+00D021 REGENT ELECTRONICS CORP.
+00D022 INCREDIBLE TECHNOLOGIES, INC.
+00D023 INFORTREND TECHNOLOGY, INC.
+00D024 Cognex Corporation
+00D025 XROSSTECH, INC.
+00D026 HIRSCHMANN AUSTRIA GMBH
+00D027 APPLIED AUTOMATION, INC.
+00D028 OMNEON VIDEO NETWORKS
+00D029 WAKEFERN FOOD CORPORATION
+00D02A Voxent Systems Ltd.
+00D02B JETCELL, INC.
+00D02C CAMPBELL SCIENTIFIC, INC.
+00D02D ADEMCO
+00D02E COMMUNICATION AUTOMATION CORP.
+00D02F VLSI TECHNOLOGY INC.
+00D030 SAFETRAN SYSTEMS CORP.
+00D031 INDUSTRIAL LOGIC CORPORATION
+00D032 YANO ELECTRIC CO., LTD.
+00D033 DALIAN DAXIAN NETWORK
+00D034 ORMEC SYSTEMS CORP.
+00D035 BEHAVIOR TECH. COMPUTER CORP.
+00D036 TECHNOLOGY ATLANTA CORP.
+00D037 PHILIPS-DVS-LO BDR
+00D038 FIVEMERE, LTD.
+00D039 UTILICOM, INC.
+00D03A ZONEWORX, INC.
+00D03B VISION PRODUCTS PTY. LTD.
+00D03C Vieo, Inc.
+00D03D GALILEO TECHNOLOGY, LTD.
+00D03E ROCKETCHIPS, INC.
+00D03F AMERICAN COMMUNICATION
+00D040 SYSMATE CO., LTD.
+00D041 AMIGO TECHNOLOGY CO., LTD.
+00D042 MAHLO GMBH & CO. UG
+00D043 ZONAL RETAIL DATA SYSTEMS
+00D044 ALIDIAN NETWORKS, INC.
+00D045 KVASER AB
+00D046 DOLBY LABORATORIES, INC.
+00D047 XN TECHNOLOGIES
+00D048 ECTON, INC.
+00D049 IMPRESSTEK CO., LTD.
+00D04A PRESENCE TECHNOLOGY GMBH
+00D04B LA CIE GROUP S.A.
+00D04C EUROTEL TELECOM LTD.
+00D04D DIV OF RESEARCH & STATISTICS
+00D04E LOGIBAG
+00D04F BITRONICS, INC.
+00D050 ISKRATEL
+00D051 O2 MICRO, INC.
+00D052 ASCEND COMMUNICATIONS, INC.
+00D053 CONNECTED SYSTEMS
+00D054 SAS INSTITUTE INC.
+00D055 KATHREIN-WERKE KG
+00D056 SOMAT CORPORATION
+00D057 ULTRAK, INC.
+00D058 CISCO SYSTEMS, INC.
+00D059 AMBIT MICROSYSTEMS CORP.
+00D05A SYMBIONICS, LTD.
+00D05B ACROLOOP MOTION CONTROL
+00D05C TECHNOTREND SYSTEMTECHNIK GMBH
+00D05D INTELLIWORXX, INC.
+00D05E STRATABEAM TECHNOLOGY, INC.
+00D05F VALCOM, INC.
+00D060 PANASONIC EUROPEAN
+00D061 TREMON ENTERPRISES CO., LTD.
+00D062 DIGIGRAM
+00D063 CISCO SYSTEMS, INC.
+00D064 MULTITEL
+00D065 TOKO ELECTRIC
+00D066 WINTRISS ENGINEERING CORP.
+00D067 CAMPIO COMMUNICATIONS
+00D068 IWILL CORPORATION
+00D069 TECHNOLOGIC SYSTEMS
+00D06A LINKUP SYSTEMS CORPORATION
+00D06B SR TELECOM INC.
+00D06C SHAREWAVE, INC.
+00D06D ACRISON, INC.
+00D06E TRENDVIEW RECORDERS LTD.
+00D06F KMC CONTROLS
+00D070 LONG WELL ELECTRONICS CORP.
+00D071 ECHELON CORP.
+00D072 BROADLOGIC
+00D073 ACN ADVANCED COMMUNICATIONS
+00D074 TAQUA SYSTEMS, INC.
+00D075 ALARIS MEDICAL SYSTEMS, INC.
+00D076 MERRILL LYNCH & CO., INC.
+00D077 LUCENT TECHNOLOGIES
+00D078 ELTEX OF SWEDEN AB
+00D079 CISCO SYSTEMS, INC.
+00D07A AMAQUEST COMPUTER CORP.
+00D07B COMCAM INTERNATIONAL LTD.
+00D07C KOYO ELECTRONICS INC. CO.,LTD.
+00D07D COSINE COMMUNICATIONS
+00D07E KEYCORP LTD.
+00D07F STRATEGY & TECHNOLOGY, LIMITED
+00D080 EXABYTE CORPORATION
+00D081 REAL TIME DEVICES USA, INC.
+00D082 IOWAVE INC.
+00D083 INVERTEX, INC.
+00D084 NEXCOMM SYSTEMS, INC.
+00D085 OTIS ELEVATOR COMPANY
+00D086 FOVEON, INC.
+00D087 MICROFIRST INC.
+00D088 Terayon Communications Systems
+00D089 DYNACOLOR, INC.
+00D08A PHOTRON USA
+00D08B ADVA Limited
+00D08C GENOA TECHNOLOGY, INC.
+00D08D PHOENIX GROUP, INC.
+00D08E NVISION INC.
+00D08F ARDENT TECHNOLOGIES, INC.
+00D090 CISCO SYSTEMS, INC.
+00D091 SMARTSAN SYSTEMS, INC.
+00D092 GLENAYRE WESTERN MULTIPLEX
+00D093 TQ - COMPONENTS GMBH
+00D094 TIMELINE VISTA, INC.
+00D095 XYLAN CORPORATION
+00D096 3COM EUROPE LTD.
+00D097 CISCO SYSTEMS, INC.
+00D098 Photon Dynamics Canada Inc.
+00D099 ELCARD OY
+00D09A FILANET CORPORATION
+00D09B SPECTEL LTD.
+00D09C KAPADIA COMMUNICATIONS
+00D09D VERIS INDUSTRIES
+00D09E 2WIRE, INC.
+00D09F NOVTEK TEST SYSTEMS
+00D0A0 MIPS DENMARK
+00D0A1 OSKAR VIERLING GMBH + CO. KG
+00D0A2 INTEGRATED DEVICE
+00D0A3 VOCAL DATA, INC.
+00D0A4 ALANTRO COMMUNICATIONS
+00D0A5 AMERICAN ARIUM
+00D0A6 LANBIRD TECHNOLOGY CO., LTD.
+00D0A7 TOKYO SOKKI KENKYUJO CO., LTD.
+00D0A8 NETWORK ENGINES, INC.
+00D0A9 SHINANO KENSHI CO., LTD.
+00D0AA CHASE COMMUNICATIONS
+00D0AB DELTAKABEL TELECOM CV
+00D0AC GRAYSON WIRELESS
+00D0AD TL INDUSTRIES
+00D0AE ORESIS COMMUNICATIONS, INC.
+00D0AF CUTLER-HAMMER, INC.
+00D0B0 BITSWITCH LTD.
+00D0B1 OMEGA ELECTRONICS SA
+00D0B2 XIOTECH CORPORATION
+00D0B3 DRS FLIGHT SAFETY AND
+00D0B4 KATSUJIMA CO., LTD.
+00D0B5 IPricot formerly DotCom
+00D0B6 CRESCENT NETWORKS, INC.
+00D0B7 INTEL CORPORATION
+00D0B8 Iomega Corporation
+00D0B9 MICROTEK INTERNATIONAL, INC.
+00D0BA CISCO SYSTEMS, INC.
+00D0BB CISCO SYSTEMS, INC.
+00D0BC CISCO SYSTEMS, INC.
+00D0BD SICAN GMBH
+00D0BE EMUTEC INC.
+00D0BF PIVOTAL TECHNOLOGIES
+00D0C0 CISCO SYSTEMS, INC.
+00D0C1 HARMONIC DATA SYSTEMS, LTD.
+00D0C2 BALTHAZAR TECHNOLOGY AB
+00D0C3 VIVID TECHNOLOGY PTE, LTD.
+00D0C4 TERATECH CORPORATION
+00D0C5 COMPUTATIONAL SYSTEMS, INC.
+00D0C6 THOMAS & BETTS CORP.
+00D0C7 PATHWAY, INC.
+00D0C8 I/O CONSULTING A/S
+00D0C9 ADVANTECH CO., LTD.
+00D0CA INTRINSYC SOFTWARE INC.
+00D0CB DASAN CO., LTD.
+00D0CC TECHNOLOGIES LYRE INC.
+00D0CD ATAN TECHNOLOGY INC.
+00D0CE ASYST ELECTRONIC
+00D0CF MORETON BAY
+00D0D0 ZHONGXING TELECOM LTD.
+00D0D1 SIROCCO SYSTEMS, INC.
+00D0D2 EPILOG CORPORATION
+00D0D3 CISCO SYSTEMS, INC.
+00D0D4 V-BITS, INC.
+00D0D5 GRUNDIG AG
+00D0D6 AETHRA TELECOMUNICAZIONI
+00D0D7 B2C2, INC.
+00D0D8 3Com Corporation
+00D0D9 DEDICATED MICROCOMPUTERS
+00D0DA TAICOM DATA SYSTEMS CO., LTD.
+00D0DB MCQUAY INTERNATIONAL
+00D0DC MODULAR MINING SYSTEMS, INC.
+00D0DD SUNRISE TELECOM, INC.
+00D0DE PHILIPS MULTIMEDIA NETWORK
+00D0DF KUZUMI ELECTRONICS, INC.
+00D0E0 DOOIN ELECTRONICS CO.
+00D0E1 AVIONITEK ISRAEL INC.
+00D0E2 MRT MICRO, INC.
+00D0E3 ELE-CHEM ENGINEERING CO., LTD.
+00D0E4 CISCO SYSTEMS, INC.
+00D0E5 SOLIDUM SYSTEMS CORP.
+00D0E6 IBOND INC.
+00D0E7 VCON TELECOMMUNICATION LTD.
+00D0E8 MAC SYSTEM CO., LTD.
+00D0E9 ADVANTAGE CENTURY
+00D0EA NEXTONE COMMUNICATIONS, INC.
+00D0EB LIGHTERA NETWORKS, INC.
+00D0EC NAKAYO TELECOMMUNICATIONS, INC
+00D0ED XIOX
+00D0EE DICTAPHONE CORPORATION
+00D0EF IGT
+00D0F0 CONVISION TECHNOLOGY GMBH
+00D0F1 SEGA ENTERPRISES, LTD.
+00D0F2 MONTEREY NETWORKS
+00D0F3 SOLARI DI UDINE SPA
+00D0F4 CARINTHIAN TECH INSTITUTE
+00D0F5 ORANGE MICRO, INC.
+00D0F6 Alcatel Canada
+00D0F7 NEXT NETS CORPORATION
+00D0F8 FUJIAN STAR TERMINAL
+00D0F9 ACUTE COMMUNICATIONS CORP.
+00D0FA RACAL GUARDATA
+00D0FB TEK MICROSYSTEMS, INCORPORATED
+00D0FC GRANITE MICROSYSTEMS
+00D0FD OPTIMA TELE.COM, INC.
+00D0FE ASTRAL POINT
+00D0FF CISCO SYSTEMS, INC.
+00DD00 UNGERMANN-BASS INC.
+00DD01 UNGERMANN-BASS INC.
+00DD02 UNGERMANN-BASS INC.
+00DD03 UNGERMANN-BASS INC.
+00DD04 UNGERMANN-BASS INC.
+00DD05 UNGERMANN-BASS INC.
+00DD06 UNGERMANN-BASS INC.
+00DD07 UNGERMANN-BASS INC.
+00DD08 UNGERMANN-BASS INC.
+00DD09 UNGERMANN-BASS INC.
+00DD0A UNGERMANN-BASS INC.
+00DD0B UNGERMANN-BASS INC.
+00DD0C UNGERMANN-BASS INC.
+00DD0D UNGERMANN-BASS INC.
+00DD0E UNGERMANN-BASS INC.
+00DD0F UNGERMANN-BASS INC.
+00E000 FUJITSU, LTD
+00E001 STRAND LIGHTING LIMITED
+00E002 CROSSROADS SYSTEMS, INC.
+00E003 NOKIA WIRELESS BUSINESS COMMUN
+00E004 PMC-SIERRA, INC.
+00E005 TECHNICAL CORP.
+00E006 SILICON INTEGRATED SYS. CORP.
+00E007 NETWORK ALCHEMY LTD.
+00E008 AMAZING CONTROLS! INC.
+00E009 MARATHON TECHNOLOGIES CORP.
+00E00A DIBA, INC.
+00E00B ROOFTOP COMMUNICATIONS CORP.
+00E00C MOTOROLA
+00E00D RADIANT SYSTEMS
+00E00E AVALON IMAGING SYSTEMS, INC.
+00E00F SHANGHAI BAUD DATA
+00E010 HESS SB-AUTOMATENBAU GmbH
+00E011 UNIDEN SAN DIEGO R&D CENTER, INC.
+00E012 PLUTO TECHNOLOGIES INTERNATIONAL INC.
+00E013 EASTERN ELECTRONIC CO., LTD.
+00E014 CISCO SYSTEMS, INC.
+00E015 HEIWA CORPORATION
+00E016 RAPID CITY COMMUNICATIONS
+00E017 EXXACT GmbH
+00E018 ASUSTEK COMPUTER INC.
+00E019 ING. GIORDANO ELETTRONICA
+00E01A COMTEC SYSTEMS. CO., LTD.
+00E01B SPHERE COMMUNICATIONS, INC.
+00E01C MOBILITY ELECTRONICSY
+00E01D WebTV NETWORKS, INC.
+00E01E CISCO SYSTEMS, INC.
+00E01F AVIDIA Systems, Inc.
+00E020 TECNOMEN OY
+00E021 FREEGATE CORP.
+00E022 Analog Devices Inc.
+00E023 TELRAD
+00E024 GADZOOX NETWORKS
+00E025 dit CO., LTD.
+00E026 Redlake MASD LLC
+00E027 DUX, INC.
+00E028 APTIX CORPORATION
+00E029 STANDARD MICROSYSTEMS CORP.
+00E02A TANDBERG TELEVISION AS
+00E02B EXTREME NETWORKS
+00E02C AST COMPUTER
+00E02D InnoMediaLogic, Inc.
+00E02E SPC ELECTRONICS CORPORATION
+00E02F MCNS HOLDINGS, L.P.
+00E030 MELITA INTERNATIONAL CORP.
+00E031 HAGIWARA ELECTRIC CO., LTD.
+00E032 MISYS FINANCIAL SYSTEMS, LTD.
+00E033 E.E.P.D. GmbH
+00E034 CISCO SYSTEMS, INC.
+00E035 LOUGHBOROUGH SOUND IMAGES, PLC
+00E036 PIONEER CORPORATION
+00E037 CENTURY CORPORATION
+00E038 PROXIMA CORPORATION
+00E039 PARADYNE CORP.
+00E03A CABLETRON SYSTEMS, INC.
+00E03B PROMINET CORPORATION
+00E03C AdvanSys
+00E03D FOCON ELECTRONIC SYSTEMS A/S
+00E03E ALFATECH, INC.
+00E03F JATON CORPORATION
+00E040 DeskStation Technology, Inc.
+00E041 CSPI
+00E042 Pacom Systems Ltd.
+00E043 VitalCom
+00E044 LSICS CORPORATION
+00E045 TOUCHWAVE, INC.
+00E046 BENTLY NEVADA CORP.
+00E047 INFOCUS SYSTEMS
+00E048 SDL COMMUNICATIONS, INC.
+00E049 MICROWI ELECTRONIC GmbH
+00E04A ENHANCED MESSAGING SYSTEMS, INC
+00E04B JUMP INDUSTRIELLE COMPUTERTECHNIK GmbH
+00E04C REALTEK SEMICONDUCTOR CORP.
+00E04D INTERNET INITIATIVE JAPAN, INC
+00E04E SANYO DENKI CO., LTD.
+00E04F CISCO SYSTEMS, INC.
+00E050 EXECUTONE INFORMATION SYSTEMS, INC.
+00E051 TALX CORPORATION
+00E052 FOUNDRY NETWORKS, INC.
+00E053 CELLPORT LABS, INC.
+00E054 KODAI HITEC CO., LTD.
+00E055 INGENIERIA ELECTRONICA COMERCIAL INELCOM S.A.
+00E056 HOLONTECH CORPORATION
+00E057 HAN MICROTELECOM. CO., LTD.
+00E058 PHASE ONE DENMARK A/S
+00E059 CONTROLLED ENVIRONMENTS, LTD.
+00E05A GALEA NETWORK SECURITY
+00E05B WEST END SYSTEMS CORP.
+00E05C MATSUSHITA KOTOBUKI ELECTRONICS INDUSTRIES, LTD.
+00E05D UNITEC CO., LTD.
+00E05E JAPAN AVIATION ELECTRONICS INDUSTRY, LTD.
+00E05F e-Net, Inc.
+00E060 SHERWOOD
+00E061 EdgePoint Networks, Inc.
+00E062 HOST ENGINEERING
+00E063 CABLETRON - YAGO SYSTEMS, INC.
+00E064 SAMSUNG ELECTRONICS
+00E065 OPTICAL ACCESS INTERNATIONAL
+00E066 ProMax Systems, Inc.
+00E067 eac AUTOMATION-CONSULTING GmbH
+00E068 MERRIMAC SYSTEMS INC.
+00E069 JAYCOR
+00E06A KAPSCH AG
+00E06B W&G SPECIAL PRODUCTS
+00E06C AEP Systems International Ltd
+00E06D COMPUWARE CORPORATION
+00E06E FAR SYSTEMS S.p.A.
+00E06F Terayon Communications Systems
+00E070 DH TECHNOLOGY
+00E071 EPIS MICROCOMPUTER
+00E072 LYNK
+00E073 NATIONAL AMUSEMENT NETWORK, INC.
+00E074 TIERNAN COMMUNICATIONS, INC.
+00E075 Verilink Corporation
+00E076 DEVELOPMENT CONCEPTS, INC.
+00E077 WEBGEAR, INC.
+00E078 BERKELEY NETWORKS
+00E079 A.T.N.R.
+00E07A MIKRODIDAKT AB
+00E07B BAY NETWORKS
+00E07C METTLER-TOLEDO, INC.
+00E07D NETRONIX, INC.
+00E07E WALT DISNEY IMAGINEERING
+00E07F LOGISTISTEM s.r.l.
+00E080 CONTROL RESOURCES CORPORATION
+00E081 TYAN COMPUTER CORP.
+00E082 ANERMA
+00E083 JATO TECHNOLOGIES, INC.
+00E084 COMPULITE R&D
+00E085 GLOBAL MAINTECH, INC.
+00E086 CYBEX COMPUTER PRODUCTS
+00E087 LeCroy - Networking Productions Division
+00E088 LTX CORPORATION
+00E089 ION Networks, Inc.
+00E08A GEC AVERY, LTD.
+00E08B QLogic Corp.
+00E08C NEOPARADIGM LABS, INC.
+00E08D PRESSURE SYSTEMS, INC.
+00E08E UTSTARCOM
+00E08F CISCO SYSTEMS, INC.
+00E090 BECKMAN LAB. AUTOMATION DIV.
+00E091 LG ELECTRONICS, INC.
+00E092 ADMTEK INCORPORATED
+00E093 ACKFIN NETWORKS
+00E094 OSAI SRL
+00E095 ADVANCED-VISION TECHNOLGIES CORP.
+00E096 SHIMADZU CORPORATION
+00E097 CARRIER ACCESS CORPORATION
+00E098 AboCom Systems, Inc.
+00E099 SAMSON AG
+00E09A POSITRON INDUSTRIES, INC.
+00E09B ENGAGE NETWORKS, INC.
+00E09C MII
+00E09D SARNOFF CORPORATION
+00E09E QUANTUM CORPORATION
+00E09F PIXEL VISION
+00E0A0 WILTRON CO.
+00E0A1 HIMA PAUL HILDEBRANDT GmbH Co. KG
+00E0A2 MICROSLATE INC.
+00E0A3 CISCO SYSTEMS, INC.
+00E0A4 ESAOTE S.p.A.
+00E0A5 ComCore Semiconductor, Inc.
+00E0A6 TELOGY NETWORKS, INC.
+00E0A7 IPC INFORMATION SYSTEMS, INC.
+00E0A8 SAT GmbH & Co.
+00E0A9 FUNAI ELECTRIC CO., LTD.
+00E0AA ELECTROSONIC LTD.
+00E0AB DIMAT S.A.
+00E0AC MIDSCO, INC.
+00E0AD EES TECHNOLOGY, LTD.
+00E0AE XAQTI CORPORATION
+00E0AF GENERAL DYNAMICS INFORMATION SYSTEMS
+00E0B0 CISCO SYSTEMS, INC.
+00E0B1 PACKET ENGINES, INC.
+00E0B2 TELMAX COMMUNICATIONS CORP.
+00E0B3 EtherWAN Systems, Inc.
+00E0B4 TECHNO SCOPE CO., LTD.
+00E0B5 ARDENT COMMUNICATIONS CORP.
+00E0B6 Entrada Networks
+00E0B7 PI GROUP, LTD.
+00E0B8 GATEWAY 2000
+00E0B9 BYAS SYSTEMS
+00E0BA BERGHOF AUTOMATIONSTECHNIK GmbH
+00E0BB NBX CORPORATION
+00E0BC SYMON COMMUNICATIONS, INC.
+00E0BD INTERFACE SYSTEMS, INC.
+00E0BE GENROCO INTERNATIONAL, INC.
+00E0BF TORRENT NETWORKING TECHNOLOGIES CORP.
+00E0C0 SEIWA ELECTRIC MFG. CO., LTD.
+00E0C1 MEMOREX TELEX JAPAN, LTD.
+00E0C2 NECSY S.p.A.
+00E0C3 SAKAI SYSTEM DEVELOPMENT CORP.
+00E0C4 HORNER ELECTRIC, INC.
+00E0C5 BCOM ELECTRONICS INC.
+00E0C6 LINK2IT, L.L.C.
+00E0C7 EUROTECH SRL
+00E0C8 VIRTUAL ACCESS, LTD.
+00E0C9 AutomatedLogic Corporation
+00E0CA BEST DATA PRODUCTS
+00E0CB RESON, INC.
+00E0CC HERO SYSTEMS, LTD.
+00E0CD SENSIS CORPORATION
+00E0CE ARN
+00E0CF INTEGRATED DEVICE TECHNOLOGY, INC.
+00E0D0 NETSPEED, INC.
+00E0D1 TELSIS LIMITED
+00E0D2 VERSANET COMMUNICATIONS, INC.
+00E0D3 DATENTECHNIK GmbH
+00E0D4 EXCELLENT COMPUTER
+00E0D5 ARCXEL TECHNOLOGIES, INC.
+00E0D6 COMPUTER & COMMUNICATION RESEARCH LAB.
+00E0D7 SUNSHINE ELECTRONICS, INC.
+00E0D8 LANBit Computer, Inc.
+00E0D9 TAZMO CO., LTD.
+00E0DA ASSURED ACCESS TECHNOLOGY, INC.
+00E0DB ViaVideo Communications, Inc.
+00E0DC NEXWARE CORP.
+00E0DD ZENITH ELECTRONICS CORPORATION
+00E0DE DATAX NV
+00E0DF KE KOMMUNIKATIONS-ELECTRONIK
+00E0E0 SI ELECTRONICS, LTD.
+00E0E1 G2 NETWORKS, INC.
+00E0E2 INNOVA CORP.
+00E0E3 SK-ELEKTRONIK GmbH
+00E0E4 FANUC ROBOTICS NORTH AMERICA, Inc.
+00E0E5 CINCO NETWORKS, INC.
+00E0E6 INCAA DATACOM B.V.
+00E0E7 RAYTHEON E-SYSTEMS, INC.
+00E0E8 GRETACODER Data Systems AG
+00E0E9 DATA LABS, INC.
+00E0EA INNOVAT COMMUNICATIONS, INC.
+00E0EB DIGICOM SYSTEMS, INCORPORATED
+00E0EC CELESTICA INC.
+00E0ED SILICOM, LTD.
+00E0EE MAREL HF
+00E0EF DIONEX
+00E0F0 ABLER TECHNOLOGY, INC.
+00E0F1 THAT CORPORATION
+00E0F2 ARLOTTO COMNET, INC.
+00E0F3 WebSprint Communications, Inc.
+00E0F4 INSIDE Technology A/S
+00E0F5 TELES AG
+00E0F6 DECISION EUROPE
+00E0F7 CISCO SYSTEMS, INC.
+00E0F8 DICNA CONTROL AB
+00E0F9 CISCO SYSTEMS, INC.
+00E0FA TRL TECHNOLOGY, LTD.
+00E0FB LEIGHTRONIX, INC.
+00E0FC HUAWEI TECHNOLOGIES CO., LTD.
+00E0FD A-TREND TECHNOLOGY CO., LTD.
+00E0FE CISCO SYSTEMS, INC.
+00E0FF SECURITY DYNAMICS TECHNOLOGIES, Inc.
+00E6D3 NIXDORF COMPUTER CORP.
+020701 RACAL-DATACOM
+021C7C PERQ SYSTEMS CORPORATION
+026086 LOGIC REPLACEMENT TECH. LTD.
+02608C 3COM CORPORATION
+027001 RACAL-DATACOM
+0270B0 M/A-COM INC. COMPANIES
+0270B3 DATA RECALL LTD
+029D8E CARDIAC RECORDERS INC.
+02AA3C OLIVETTI TELECOMM SPA (OLTECO)
+02BB01 OCTOTHORPE CORP.
+02C08C 3COM CORPORATION
+02CF1C COMMUNICATION MACHINERY CORP.
+02E6D3 NIXDORF COMPUTER CORPORATION
+040AE0 XMIT AG COMPUTER NETWORKS
+04E0C4 TRIUMPH-ADLER AG
+080001 COMPUTERVISION CORPORATION
+080002 BRIDGE COMMUNICATIONS INC.
+080003 ADVANCED COMPUTER COMM.
+080004 CROMEMCO INCORPORATED
+080005 SYMBOLICS INC.
+080006 SIEMENS AG
+080007 APPLE COMPUTER INC.
+080008 BOLT BERANEK AND NEWMAN INC.
+080009 HEWLETT PACKARD
+08000A NESTAR SYSTEMS INCORPORATED
+08000B UNISYS CORPORATION
+08000C MIKLYN DEVELOPMENT CO.
+08000D INTERNATIONAL COMPUTERS LTD.
+08000E NCR CORPORATION
+08000F MITEL CORPORATION
+080011 TEKTRONIX INC.
+080012 BELL ATLANTIC INTEGRATED SYST.
+080013 EXXON
+080014 EXCELAN
+080015 STC BUSINESS SYSTEMS
+080016 BARRISTER INFO SYS CORP
+080017 NATIONAL SEMICONDUCTOR
+080018 PIRELLI FOCOM NETWORKS
+080019 GENERAL ELECTRIC CORPORATION
+08001A TIARA/ 10NET
+08001B DATA GENERAL
+08001C KDD-KOKUSAI DEBNSIN DENWA CO.
+08001D ABLE COMMUNICATIONS INC.
+08001E APOLLO COMPUTER INC.
+08001F SHARP CORPORATION
+080020 SUN MICROSYSTEMS INC.
+080021 3M COMPANY
+080022 NBI INC.
+080023 Panasonic Communications Co., Ltd.
+080024 10NET COMMUNICATIONS/DCA
+080025 CONTROL DATA
+080026 NORSK DATA A.S.
+080027 CADMUS COMPUTER SYSTEMS
+080028 Texas Instruments
+080029 MEGATEK CORPORATION
+08002A MOSAIC TECHNOLOGIES INC.
+08002B DIGITAL EQUIPMENT CORPORATION
+08002C BRITTON LEE INC.
+08002D LAN-TEC INC.
+08002E METAPHOR COMPUTER SYSTEMS
+08002F PRIME COMPUTER INC.
+080030 NETWORK RESEARCH CORPORATION
+080030 CERN
+080030 ROYAL MELBOURNE INST OF TECH
+080031 LITTLE MACHINES INC.
+080032 TIGAN INCORPORATED
+080033 BAUSCH & LOMB
+080034 FILENET CORPORATION
+080035 MICROFIVE CORPORATION
+080036 INTERGRAPH CORPORATION
+080037 FUJI-XEROX CO. LTD.
+080038 CII HONEYWELL BULL
+080039 SPIDER SYSTEMS LIMITED
+08003A ORCATECH INC.
+08003B TORUS SYSTEMS LIMITED
+08003C SCHLUMBERGER WELL SERVICES
+08003D CADNETIX CORPORATIONS
+08003E CODEX CORPORATION
+08003F FRED KOSCHARA ENTERPRISES
+080040 FERRANTI COMPUTER SYS. LIMITED
+080041 RACAL-MILGO INFORMATION SYS..
+080042 JAPAN MACNICS CORP.
+080043 PIXEL COMPUTER INC.
+080044 DAVID SYSTEMS INC.
+080045 CONCURRENT COMPUTER CORP.
+080046 SONY CORPORATION LTD.
+080047 SEQUENT COMPUTER SYSTEMS INC.
+080048 EUROTHERM GAUGING SYSTEMS
+080049 UNIVATION
+08004A BANYAN SYSTEMS INC.
+08004B PLANNING RESEARCH CORP.
+08004C HYDRA COMPUTER SYSTEMS INC.
+08004D CORVUS SYSTEMS INC.
+08004E 3COM EUROPE LTD.
+08004F CYGNET SYSTEMS
+080050 DAISY SYSTEMS CORP.
+080051 EXPERDATA
+080052 INSYSTEC
+080053 MIDDLE EAST TECH. UNIVERSITY
+080055 STANFORD TELECOMM. INC.
+080056 STANFORD LINEAR ACCEL. CENTER
+080057 EVANS & SUTHERLAND
+080058 SYSTEMS CONCEPTS
+080059 A/S MYCRON
+08005A IBM CORPORATION
+08005B VTA TECHNOLOGIES INC.
+08005C FOUR PHASE SYSTEMS
+08005D GOULD INC.
+08005E COUNTERPOINT COMPUTER INC.
+08005F SABER TECHNOLOGY CORP.
+080060 INDUSTRIAL NETWORKING INC.
+080061 JAROGATE LTD.
+080062 GENERAL DYNAMICS
+080063 PLESSEY
+080064 AUTOPHON AG
+080065 GENRAD INC.
+080066 AGFA CORPORATION
+080067 COMDESIGN
+080068 RIDGE COMPUTERS
+080069 SILICON GRAPHICS INC.
+08006A ATT BELL LABORATORIES
+08006B ACCEL TECHNOLOGIES INC.
+08006C SUNTEK TECHNOLOGY INT'L
+08006D WHITECHAPEL COMPUTER WORKS
+08006E MASSCOMP
+08006F PHILIPS APELDOORN B.V.
+080070 MITSUBISHI ELECTRIC CORP.
+080071 MATRA (DSIE)
+080072 XEROX CORP UNIV GRANT PROGRAM
+080073 TECMAR INC.
+080074 CASIO COMPUTER CO. LTD.
+080075 DANSK DATA ELECTRONIK
+080076 PC LAN TECHNOLOGIES
+080077 TSL COMMUNICATIONS LTD.
+080078 ACCELL CORPORATION
+080079 THE DROID WORKS
+08007A INDATA
+08007B SANYO ELECTRIC CO. LTD.
+08007C VITALINK COMMUNICATIONS CORP.
+08007E AMALGAMATED WIRELESS(AUS) LTD
+08007F CARNEGIE-MELLON UNIVERSITY
+080080 AES DATA INC.
+080081 ,ASTECH INC.
+080082 VERITAS SOFTWARE
+080083 Seiko Instruments Inc.
+080084 TOMEN ELECTRONICS CORP.
+080085 ELXSI
+080086 KONICA MINOLTA HOLDINGS, INC.
+080087 XYPLEX
+080088 MCDATA CORPORATION
+080089 KINETICS
+08008A PERFORMANCE TECHNOLOGY
+08008B PYRAMID TECHNOLOGY CORP.
+08008C NETWORK RESEARCH CORPORATION
+08008D XYVISION INC.
+08008E TANDEM COMPUTERS
+08008F CHIPCOM CORPORATION
+080090 SONOMA SYSTEMS
+081443 UNIBRAIN S.A.
+08BBCC AK-NORD EDV VERTRIEBSGES. mbH
+10005A IBM CORPORATION
+1000E8 NATIONAL SEMICONDUCTOR
+800010 ATT BELL LABORATORIES
+A06A00 Verilink Corporation
+AA0000 DIGITAL EQUIPMENT CORPORATION
+AA0001 DIGITAL EQUIPMENT CORPORATION
+AA0002 DIGITAL EQUIPMENT CORPORATION
+AA0003 DIGITAL EQUIPMENT CORPORATION
+AA0004 DIGITAL EQUIPMENT CORPORATION
diff --git a/kcontrol/view1394/view1394.cpp b/kcontrol/view1394/view1394.cpp
new file mode 100644
index 000000000..87089b321
--- /dev/null
+++ b/kcontrol/view1394/view1394.cpp
@@ -0,0 +1,334 @@
+/*
+ * view1394.cpp
+ *
+ * Copyright (C) 2003 Alexander Neundorf <neundorf@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qlistview.h>
+#include <qfile.h>
+#include <qtextstream.h>
+
+#include <kdialog.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+#include "view1394.h"
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <string.h>
+
+/* Get PRIX64 to output octlet_t */
+#define __STDC_FORMAT_MACROS
+#include <inttypes.h>
+
+#include <libraw1394/csr.h>
+#define CONFIGROM_BASE 0x00
+#define CONFIGROM_CAP 0x08
+#define CONFIGROM_GUID_HI 0x0c
+#define CONFIGROM_GUID_LO 0x10
+#define MAX_1394_PORTS 16
+
+int my_reset_handler(raw1394handle_t handle, unsigned int )
+{
+ View1394* view1394=(View1394*)raw1394_get_userdata(handle);
+ if (view1394!=0)
+ view1394->rescanBus();
+ return 0;
+}
+
+
+View1394::View1394(QWidget *parent, const char *name)
+:KCModule(parent,name)
+,m_insideRescanBus(false)
+{
+ setQuickHelp( i18n("On the right hand side you can see some information about "
+ "your IEEE 1394 configuration.<br>"
+ "The meaning of the columns:<br>"
+ "<b>Name</b>: port or node name, the number can change with each bus reset<br>"
+ "<b>GUID</b>: the 64 bit GUID of the node<br>"
+ "<b>Local</b>: checked if the node is an IEEE 1394 port of your computer<br>"
+ "<b>IRM</b>: checked if the node is isochronous resource manager capable<br>"
+ "<b>CRM</b>: checked if the node is cycle master capable<br>"
+ "<b>ISO</b>: checked if the node supports isochronous transfers<br>"
+ "<b>BM</b>: checked if the node is bus manager capable<br>"
+ "<b>PM</b>: checked if the node is power management capable<br>"
+ "<b>Acc</b>: the cycle clock accuracy of the node, valid from 0 to 100<br>"
+ "<b>Speed</b>: the speed of the node<br>"));
+
+ setButtons( KCModule::Help );
+
+ m_ouiDb=new OuiDb();
+ QVBoxLayout *box=new QVBoxLayout(this, 0, KDialog::spacingHint());
+ m_view=new View1394Widget(this);
+ for (int i=2; i<8; i++)
+ m_view->m_listview->setColumnAlignment(i, AlignHCenter);
+ m_view->m_listview->setColumnAlignment(8, AlignRight);
+ m_view->m_listview->setColumnAlignment(9, AlignRight);
+ box->addWidget(m_view);
+ connect(m_view->m_busResetPb, SIGNAL(clicked()), this, SLOT(generateBusReset()));
+ connect(&m_rescanTimer, SIGNAL(timeout()), this, SLOT(rescanBus()));
+ m_notifiers.setAutoDelete(true);
+ rescanBus();
+}
+
+View1394::~View1394()
+{
+}
+
+bool View1394::readConfigRom(raw1394handle_t handle, nodeid_t nodeid, quadlet_t& firstQuad, quadlet_t& cap, octlet_t& guid)
+{
+ quadlet_t q=0;
+ firstQuad=0;
+ cap=0;
+ guid=0;
+ nodeaddr_t addr=CSR_REGISTER_BASE + CSR_CONFIG_ROM + CONFIGROM_BASE;
+ for (int count=0; count<5; count++)
+ {
+ struct timeval tv;
+ q=0;
+ int res=raw1394_read(handle, nodeid|0xffc0, addr, sizeof(q), &q);
+ if (res==0)
+ {
+ firstQuad=ntohl(q);
+ break;
+ }
+ tv.tv_sec=0;
+ tv.tv_usec=10*1000;
+ select(0,0,0,0,&tv);
+ }
+ if (firstQuad==0)
+ return false;
+
+ addr=CSR_REGISTER_BASE + CSR_CONFIG_ROM + CONFIGROM_CAP;
+ if (raw1394_read(handle, nodeid|0xffc0, addr, sizeof(q), &q)!=0)
+ return false;
+
+ cap=ntohl(q);
+
+ addr=CSR_REGISTER_BASE + CSR_CONFIG_ROM + CONFIGROM_GUID_HI;
+ if (raw1394_read(handle, nodeid|0xffc0, addr, sizeof(q), &q)!=0)
+ return false;
+
+ guid=octlet_t(ntohl(q))<<32;
+
+ addr=CSR_REGISTER_BASE + CSR_CONFIG_ROM + CONFIGROM_GUID_LO;
+ if (raw1394_read(handle, nodeid|0xffc0, addr, sizeof(q), &q)!=0)
+ return false;
+
+ guid=guid|ntohl(q);
+
+ return true;
+}
+
+void View1394::callRaw1394EventLoop(int fd)
+{
+ for (QValueList<raw1394handle_t>::iterator it= m_handles.begin(); it!=m_handles.end(); ++it)
+ if (raw1394_get_fd(*it)==fd)
+ {
+ raw1394_loop_iterate(*it);
+ break;
+ }
+}
+
+void View1394::rescanBus()
+{
+ if (m_insideRescanBus)
+ {
+ m_rescanTimer.start(100, true);
+ return;
+ }
+ m_insideRescanBus=true;
+// static int depth=0;
+// depth++;
+ m_notifiers.clear();
+ for (QValueList<raw1394handle_t>::iterator it=m_handles.begin(); it!=m_handles.end(); ++it)
+ raw1394_destroy_handle(*it);
+ m_handles.clear();
+ m_view->m_listview->clear();
+
+ raw1394handle_t handle=raw1394_new_handle();
+ if (handle==NULL)
+ {
+ m_insideRescanBus=false;
+ return;
+ }
+ //now search for new stuff
+ struct raw1394_portinfo p_info[MAX_1394_PORTS];
+ int num_of_cards=raw1394_get_port_info(handle, p_info, MAX_1394_PORTS);
+ raw1394_destroy_handle(handle);
+ //iterate over all cards
+ for (int i=0; i<num_of_cards; i++)
+ {
+ handle=raw1394_new_handle();
+ if (raw1394_set_port(handle, i)!=0)
+ {
+ raw1394_destroy_handle(handle);
+ continue;
+ }
+ raw1394_set_userdata(handle, this);
+ raw1394_set_bus_reset_handler(handle, my_reset_handler);
+ QSocketNotifier *notif=new QSocketNotifier(raw1394_get_fd(handle),QSocketNotifier::Read);
+ connect(notif, SIGNAL(activated(int)), this, SLOT(callRaw1394EventLoop(int)));
+ m_notifiers.append(notif);
+ m_handles.append(handle);
+
+ QListViewItem *card=new QListViewItem(m_view->m_listview,i18n("Port %1:\"%2\"").arg(i).arg(p_info[i].name));
+ int num_of_nodes=raw1394_get_nodecount(handle);
+
+ int localNodeId=raw1394_get_local_id(handle);
+ //iterate over all nodes connected to this card
+ for (int j=0; j<num_of_nodes; j++)
+ {
+ //get the guid of the node
+ octlet_t guid=0;
+ quadlet_t firstQuad=0;
+ quadlet_t cap=0;
+ bool success=readConfigRom(handle, j, firstQuad, cap, guid);
+
+ QString nodeStr=i18n("Node %1").arg(j);
+ if (!success)
+ {
+ new QListViewItem(card,nodeStr, i18n("Not ready"));
+ continue;
+ }
+ if (((firstQuad>>24) & 0xff)==1) //minimal config rom
+ {
+ QString guidStr=QString::number(firstQuad,16);
+ guidStr="0x"+guidStr.rightJustify(6,'0');
+ new QListViewItem(card,nodeStr, guidStr);
+ }
+ else //general config rom
+ {
+ QString guidStr;
+ char buf[32];
+ snprintf(buf, 32, "%"PRIX64, guid);
+ guidStr=buf;
+ guidStr="0x"+guidStr.rightJustify(16,'0');
+ QString local=((j | 0xffc0) == localNodeId)?"X":"";
+ QString irmStr=(cap & 0x80000000) ? "X":"";
+ QString cmStr=(cap & 0x40000000) ? "X":"";
+ QString isStr=(cap & 0x20000000) ? "X":"";
+ QString bmStr=(cap & 0x10000000) ? "X":"";
+ QString pmStr=(cap & 0x08000000) ? "X":"";
+ QString accStr=QString::number((cap &0x00ff0000)>>16);
+ int speed=( cap & 0x00000007);
+ QString speedStr;
+ switch(speed)
+ {
+ case(3):
+ speedStr="800";
+ break;
+ case(2):
+ speedStr="400";
+ break;
+ case(1):
+ speedStr="200";
+ break;
+ case(0):
+ default:
+ speedStr="100";
+ break;
+ }
+ QListViewItem* node=new QListViewItem(card);
+ node->setText(0,nodeStr);
+ node->setText(1, guidStr);
+ node->setText(2,local);
+ node->setText(3, irmStr);
+ node->setText(4, cmStr);
+ node->setText(5,isStr);
+ node->setText(6,bmStr);
+ node->setText(7,pmStr);
+ node->setText(8, accStr);
+ node->setText(9, speedStr);
+ node->setText(10, m_ouiDb->vendor(guid));
+ }
+ }
+ card->setOpen(true);
+ }
+// depth--;
+ m_insideRescanBus=false;
+}
+
+void View1394::generateBusReset()
+{
+ for (QValueList<raw1394handle_t>::iterator it=m_handles.begin(); it!=m_handles.end(); ++it)
+ raw1394_reset_bus(*it);
+}
+
+
+OuiDb::OuiDb()
+{
+ QString filename=locate("data","kcmview1394/oui.db");
+ if (filename.isEmpty())
+ return;
+ QFile f(filename);
+ if (!f.open(IO_ReadOnly))
+ return;
+
+ QByteArray ba=f.readAll();
+ int bytesLeft=ba.size();
+ char* data=ba.data();
+ while(bytesLeft>8)
+ {
+ char *eol=(char*)memchr((const void*)data, '\n',bytesLeft);
+ if (eol==0)
+ break;
+ if ((eol-data)<8)
+ break;
+ data[6]='\0';
+ *eol='\0';
+ m_vendorIds.insert(data, data+7);
+ bytesLeft-=(eol+1-data);
+ data=eol+1;
+ }
+
+ f.close();
+}
+
+QString OuiDb::vendor(octlet_t guid)
+{
+ guid=(guid & 0xffffff0000000000LL)>>40;
+ QString key=QString::number((unsigned int)(guid),16);
+ key=key.rightJustify(6, '0').upper();
+ QString v=m_vendorIds[key];
+ if (v.isEmpty())
+ v=i18n("Unknown");
+ return v;
+}
+
+
+
+// ------------------------------------------------------------------------
+
+extern "C"
+{
+
+ KDE_EXPORT KCModule *create_view1394(QWidget *parent, const char *name)
+ {
+ KGlobal::locale()->insertCatalogue("kcmview1394");
+ return new View1394(parent, name);
+ }
+}
+
+#include "view1394.moc"
diff --git a/kcontrol/view1394/view1394.h b/kcontrol/view1394/view1394.h
new file mode 100644
index 000000000..b328363b4
--- /dev/null
+++ b/kcontrol/view1394/view1394.h
@@ -0,0 +1,67 @@
+/*
+ * view1394.h
+ *
+ * Copyright (C) 2003 Alexander Neundorf <neundorf@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef VIEW1394_H_
+#define VIEW1394_H_
+
+#include <kcmodule.h>
+
+#include <qmap.h>
+#include <qsocketnotifier.h>
+#include <qstring.h>
+#include <qtimer.h>
+#include <qvaluelist.h>
+
+#include "view1394widget.h"
+
+#include <libraw1394/raw1394.h>
+
+class OuiDb
+{
+ public:
+ OuiDb();
+ QString vendor(octlet_t guid);
+ private:
+ QMap<QString, QString> m_vendorIds;
+};
+
+class View1394: public KCModule
+{
+ Q_OBJECT
+ public:
+ View1394(QWidget *parent = 0L, const char *name = 0L);
+ virtual ~View1394();
+
+ public slots: // Public slots
+ void rescanBus();
+ void generateBusReset();
+
+ private:
+ View1394Widget *m_view;
+ QValueList<raw1394handle_t> m_handles;
+ QPtrList<QSocketNotifier> m_notifiers;
+ bool readConfigRom(raw1394handle_t handle, nodeid_t nodeid, quadlet_t& firstQuad, quadlet_t& cap, octlet_t& guid);
+ bool m_insideRescanBus;
+ QTimer m_rescanTimer;
+ OuiDb *m_ouiDb;
+ private slots:
+ void callRaw1394EventLoop(int fd);
+};
+#endif
diff --git a/kcontrol/view1394/view1394widget.ui b/kcontrol/view1394/view1394widget.ui
new file mode 100644
index 000000000..5b6ba13e8
--- /dev/null
+++ b/kcontrol/view1394/view1394widget.ui
@@ -0,0 +1,186 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>View1394Widget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>View1394Widget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>501</width>
+ <height>378</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>GUID</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Local</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>IRM</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>CRM</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>ISO</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>BM</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>PM</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Acc</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Speed</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Vendor</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_listview</cstring>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m_busResetPb</cstring>
+ </property>
+ <property name="text">
+ <string>Generate 1394 Bus Reset</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kcontrol/xinerama/Makefile.am b/kcontrol/xinerama/Makefile.am
new file mode 100644
index 000000000..5b0da6939
--- /dev/null
+++ b/kcontrol/xinerama/Makefile.am
@@ -0,0 +1,18 @@
+AM_CPPFLAGS = $(all_includes)
+
+kde_module_LTLIBRARIES = kcm_xinerama.la
+
+kcm_xinerama_la_SOURCES = kcmxinerama.cpp xineramawidget.ui
+
+kcm_xinerama_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_xinerama_la_LIBADD = -lkdeui
+
+METASOURCES = AUTO
+
+noinst_HEADERS = kcmxinerama.h
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmxinerama.pot
+
+xinerama_datadir = $(kde_appsdir)/.hidden
+xinerama_data_DATA = xinerama.desktop
diff --git a/kcontrol/xinerama/kcmxinerama.cpp b/kcontrol/xinerama/kcmxinerama.cpp
new file mode 100644
index 000000000..229672f6e
--- /dev/null
+++ b/kcontrol/xinerama/kcmxinerama.cpp
@@ -0,0 +1,254 @@
+/**
+ * kcmxinerama.cpp
+ *
+ * Copyright (c) 2002-2004 George Staikos <staikos@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#include "kcmxinerama.h"
+#include <dcopclient.h>
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kwin.h>
+
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qcombobox.h>
+#include <qtable.h>
+#include <qcolor.h>
+#include <qpushbutton.h>
+
+
+KCMXinerama::KCMXinerama(QWidget *parent, const char *name)
+ : KCModule(parent, name) {
+ _indicators.setAutoDelete(true);
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmxinerama"),
+ I18N_NOOP("KDE Multiple Monitor Configurator"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2002-2003 George Staikos"));
+
+ about->addAuthor("George Staikos", 0, "staikos@kde.org");
+ setAboutData( about );
+
+ setQuickHelp( i18n("<h1>Multiple Monitors</h1> This module allows you to configure KDE support"
+ " for multiple monitors."));
+
+ config = new KConfig("kdeglobals", false, false);
+ ksplashrc = new KConfig("ksplashrc", false, false);
+
+ connect(&_timer, SIGNAL(timeout()), this, SLOT(clearIndicator()));
+
+ QGridLayout *grid = new QGridLayout(this, 1, 1, KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ // Setup the panel
+ _displays = QApplication::desktop()->numScreens();
+
+ if (QApplication::desktop()->isVirtualDesktop()) {
+ QStringList dpyList;
+ xw = new XineramaWidget(this);
+ grid->addWidget(xw, 0, 0);
+ QString label = i18n("Display %1");
+
+ xw->headTable->setNumRows(_displays);
+
+ for (int i = 0; i < _displays; i++) {
+ QString l = label.arg(i+1);
+ QRect geom = QApplication::desktop()->screenGeometry(i);
+ xw->_unmanagedDisplay->insertItem(l);
+ xw->_ksplashDisplay->insertItem(l);
+ dpyList.append(l);
+ xw->headTable->setText(i, 0, QString::number(geom.x()));
+ xw->headTable->setText(i, 1, QString::number(geom.y()));
+ xw->headTable->setText(i, 2, QString::number(geom.width()));
+ xw->headTable->setText(i, 3, QString::number(geom.height()));
+ }
+
+ xw->_unmanagedDisplay->insertItem(i18n("Display Containing the Pointer"));
+
+ xw->headTable->setRowLabels(dpyList);
+
+ connect(xw->_ksplashDisplay, SIGNAL(activated(int)),
+ this, SLOT(windowIndicator(int)));
+ connect(xw->_unmanagedDisplay, SIGNAL(activated(int)),
+ this, SLOT(windowIndicator(int)));
+ connect(xw->_identify, SIGNAL(clicked()),
+ this, SLOT(indicateWindows()));
+
+ connect(xw, SIGNAL(configChanged()), this, SLOT(changed()));
+ } else { // no Xinerama
+ QLabel *ql = new QLabel(i18n("<qt><p>This module is only for configuring systems with a single desktop spread across multiple monitors. You do not appear to have this configuration.</p></qt>"), this);
+ grid->addWidget(ql, 0, 0);
+ }
+
+ grid->activate();
+
+ load();
+}
+
+KCMXinerama::~KCMXinerama() {
+ _timer.stop();
+ delete ksplashrc;
+ ksplashrc = 0;
+ delete config;
+ config = 0;
+ clearIndicator();
+}
+
+#define KWIN_XINERAMA "XineramaEnabled"
+#define KWIN_XINERAMA_MOVEMENT "XineramaMovementEnabled"
+#define KWIN_XINERAMA_PLACEMENT "XineramaPlacementEnabled"
+#define KWIN_XINERAMA_MAXIMIZE "XineramaMaximizeEnabled"
+#define KWIN_XINERAMA_FULLSCREEN "XineramaFullscreenEnabled"
+
+void KCMXinerama::load() {
+ load( false );
+}
+
+void KCMXinerama::load(bool useDefaults) {
+ if (QApplication::desktop()->isVirtualDesktop()) {
+ int item = 0;
+ config->setReadDefaults( useDefaults );
+ config->setGroup("Windows");
+ xw->_enableXinerama->setChecked(config->readBoolEntry(KWIN_XINERAMA, true));
+ xw->_enableResistance->setChecked(config->readBoolEntry(KWIN_XINERAMA_MOVEMENT, true));
+ xw->_enablePlacement->setChecked(config->readBoolEntry(KWIN_XINERAMA_PLACEMENT, true));
+ xw->_enableMaximize->setChecked(config->readBoolEntry(KWIN_XINERAMA_MAXIMIZE, true));
+ xw->_enableFullscreen->setChecked(config->readBoolEntry(KWIN_XINERAMA_FULLSCREEN, true));
+ item = config->readNumEntry("Unmanaged", QApplication::desktop()->primaryScreen());
+ if ((item < 0 || item >= _displays) && (item != -3))
+ xw->_unmanagedDisplay->setCurrentItem(QApplication::desktop()->primaryScreen());
+ else if (item == -3) // pointer warp
+ xw->_unmanagedDisplay->setCurrentItem(_displays);
+ else xw->_unmanagedDisplay->setCurrentItem(item);
+
+ ksplashrc->setGroup("Xinerama");
+ item = ksplashrc->readNumEntry("KSplashScreen", QApplication::desktop()->primaryScreen());
+ if (item < 0 || item >= _displays)
+ xw->_ksplashDisplay->setCurrentItem(QApplication::desktop()->primaryScreen());
+ else xw->_ksplashDisplay->setCurrentItem(item);
+
+ emit changed(useDefaults);
+ }
+ else
+ emit changed( false );
+}
+
+
+void KCMXinerama::save() {
+ if (QApplication::desktop()->isVirtualDesktop()) {
+ config->setGroup("Windows");
+ config->writeEntry(KWIN_XINERAMA,
+ xw->_enableXinerama->isChecked());
+ config->writeEntry(KWIN_XINERAMA_MOVEMENT,
+ xw->_enableResistance->isChecked());
+ config->writeEntry(KWIN_XINERAMA_PLACEMENT,
+ xw->_enablePlacement->isChecked());
+ config->writeEntry(KWIN_XINERAMA_MAXIMIZE,
+ xw->_enableMaximize->isChecked());
+ config->writeEntry(KWIN_XINERAMA_FULLSCREEN,
+ xw->_enableFullscreen->isChecked());
+ int item = xw->_unmanagedDisplay->currentItem();
+ config->writeEntry("Unmanaged", item == _displays ? -3 : item);
+ config->sync();
+
+ if (!kapp->dcopClient()->isAttached())
+ kapp->dcopClient()->attach();
+ kapp->dcopClient()->send("kwin", "", "reconfigure()", "");
+
+ ksplashrc->setGroup("Xinerama");
+ ksplashrc->writeEntry("KSplashScreen", xw->_enableXinerama->isChecked() ? xw->_ksplashDisplay->currentItem() : -2 /* ignore Xinerama */);
+ ksplashrc->sync();
+ }
+
+ KMessageBox::information(this, i18n("Your settings will only affect newly started applications."), i18n("KDE Multiple Monitors"), "nomorexineramaplease");
+
+ emit changed(false);
+}
+
+void KCMXinerama::defaults() {
+ load( true );
+}
+
+void KCMXinerama::indicateWindows() {
+ _timer.stop();
+
+ clearIndicator();
+ for (int i = 0; i < _displays; i++)
+ _indicators.append(indicator(i));
+
+ _timer.start(1500, true);
+}
+
+void KCMXinerama::windowIndicator(int dpy) {
+ if (dpy >= _displays)
+ return;
+
+ _timer.stop();
+
+ clearIndicator();
+ _indicators.append(indicator(dpy));
+
+ _timer.start(1500, true);
+}
+
+QWidget *KCMXinerama::indicator(int dpy) {
+ QLabel *si = new QLabel(QString::number(dpy+1), 0, "Screen Indicator", WX11BypassWM );
+
+ QFont fnt = KGlobalSettings::generalFont();
+ fnt.setPixelSize(100);
+ si->setFont(fnt);
+ si->setFrameStyle(QFrame::Panel);
+ si->setFrameShadow(QFrame::Plain);
+ si->setAlignment(Qt::AlignCenter);
+
+ QPoint screenCenter(QApplication::desktop()->screenGeometry(dpy).center());
+ QRect targetGeometry(QPoint(0,0), si->sizeHint());
+ targetGeometry.moveCenter(screenCenter);
+ si->setGeometry(targetGeometry);
+ si->show();
+
+ return si;
+}
+
+void KCMXinerama::clearIndicator() {
+ _indicators.clear();
+}
+
+extern "C" {
+ KDE_EXPORT KCModule *create_xinerama(QWidget *parent, const char *name) {
+ KGlobal::locale()->insertCatalogue("kcmxinerama");
+ return new KCMXinerama(parent, name);
+ }
+
+ KDE_EXPORT bool test_xinerama() {
+ return QApplication::desktop()->isVirtualDesktop();
+ }
+}
+
+
+#include "kcmxinerama.moc"
+
diff --git a/kcontrol/xinerama/kcmxinerama.h b/kcontrol/xinerama/kcmxinerama.h
new file mode 100644
index 000000000..07b835fbc
--- /dev/null
+++ b/kcontrol/xinerama/kcmxinerama.h
@@ -0,0 +1,62 @@
+/**
+ * kcmxinerama.h
+ *
+ * Copyright (c) 2002-2004 George Staikos <staikos@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _KCM_XINERAMA_H
+#define _KCM_XINERAMA_H
+
+#include <kcmodule.h>
+#include <qptrlist.h>
+#include <qtimer.h>
+
+#include "xineramawidget.h"
+
+class KConfig;
+class QWidget;
+
+class KCMXinerama : public KCModule {
+ Q_OBJECT
+public:
+ KCMXinerama(QWidget *parent = 0L, const char *name = 0L);
+ virtual ~KCMXinerama();
+
+ void load();
+ void load(bool useDefaults );
+ void save();
+ void defaults();
+
+public slots:
+ void windowIndicator(int dpy);
+ void clearIndicator();
+
+ void indicateWindows();
+
+private:
+ QWidget* indicator(int dpy);
+ KConfig *config, *ksplashrc;
+ XineramaWidget *xw;
+ QTimer _timer;
+ QPtrList<QWidget> _indicators;
+
+ int _displays;
+
+};
+
+#endif
+
diff --git a/kcontrol/xinerama/xinerama.desktop b/kcontrol/xinerama/xinerama.desktop
new file mode 100644
index 000000000..5adb0f363
--- /dev/null
+++ b/kcontrol/xinerama/xinerama.desktop
@@ -0,0 +1,202 @@
+[Desktop Entry]
+Icon=identity
+Type=Application
+Exec=kcmshell xinerama
+DocPath=kcontrol/multiplemonitors.html
+
+X-KDE-Library=xinerama
+X-KDE-Test-Module=true
+Name=Multiple Monitors
+Name[af]=Veelvuldige Skerms
+Name[ar]=شاشات متعددة
+Name[be]=Некалькі манітораў
+Name[bg]=Многомониторен режим
+Name[bn]=একাধিক মনিটর
+Name[br]=Lies skramm
+Name[bs]=Višestruki monitori
+Name[ca]=Múltiples monitors
+Name[cs]=Více monitorů
+Name[csb]=Wiele mònitorów
+Name[cy]=Dangosyddion Lluosol
+Name[da]=Flere skærme
+Name[de]=Mehrere Monitore
+Name[el]=Πολλαπλές οθόνες
+Name[eo]=Oblaj ekranoj
+Name[es]=Varios monitores
+Name[et]=Mitu monitori
+Name[eu]=Monitore anitz
+Name[fa]=نمایشگرهای چندگانه
+Name[fi]=Useita näyttöjä
+Name[fr]=Moniteurs multiples
+Name[fy]=Meardere byldskermen
+Name[ga]=Scáileáin Iomadúla
+Name[gl]=Múltiplos Monitores
+Name[he]=מספר מסכים
+Name[hi]=अनेक मॉनीटर्स
+Name[hr]=Višestruki monitori
+Name[hu]=Több képernyő kezelése
+Name[is]=Margir skjáir
+Name[it]=Monitor multipli
+Name[ja]=マルチモニタ
+Name[ka]=რამდენიმე მონიტორი
+Name[kk]=Бірнеше мониторлар
+Name[km]=ម៉ូនីទ័រ​ច្រើន
+Name[ko]=다중 모니터
+Name[lt]=Keli monitoriai
+Name[lv]=Vairāki monitori
+Name[mk]=Повеќе монитори
+Name[mn]=Олон монитор
+Name[ms]=Berbilang Monitor
+Name[mt]=Skrinijiet multipli
+Name[nb]=Flere skjermer
+Name[nds]=Mehr as een Schirm
+Name[ne]=बहुविध मोनिटर
+Name[nl]=Meerdere monitoren
+Name[nn]=Fleire skjermar
+Name[pa]=ਬਹੁ ਮਾਨੀਟਰ
+Name[pl]=Wiele monitorów
+Name[pt]=Vários Monitores
+Name[pt_BR]=Múltiplos Monitores
+Name[ro]=Monitoare multiple
+Name[ru]=Несколько мониторов
+Name[rw]=Mugaragaza Zitandukanye
+Name[se]=Máŋggaid searpma
+Name[sk]=Viac monitorov
+Name[sl]=Več zaslonov
+Name[sr]=Више монитора
+Name[sr@Latn]=Više monitora
+Name[sv]=Flera bildskärmar
+Name[ta]=பல திரைகள்
+Name[tg]=Чанд намоишгар
+Name[th]=หลายจอภาพ
+Name[tr]=Çoklu Monitör
+Name[tt]=Berniçä Küräk
+Name[uk]=Комбінація моніторів
+Name[uz]=Bir nechta monitor
+Name[uz@cyrillic]=Бир нечта монитор
+Name[vi]=Nhiều Màn hình
+Name[wa]=Multi-waitroûles
+Name[zh_CN]=多个监视器
+Name[zh_TW]=多重顯示器
+Comment=Configure KDE for multiple monitors
+Comment[af]=Stel KDE vir veelvuldige skerms op
+Comment[ar]=إعداد KDE لإستعمال الشاشات المتعددة
+Comment[be]=Настаўленні KDE для працы з некалькімі маніторамі
+Comment[bg]=Настройване на системата за поддръжка на много монитори
+Comment[bn]=একাধিক মনিটরের জন্য কে.ডি.ই কনফিগার করুন
+Comment[br]=Kefluniañ KDE gant meur a skrammoù
+Comment[bs]=Podesite KDE za više monitora
+Comment[ca]=Configura KDE per a múltiples monitors
+Comment[cs]=Nastavení KDE pro více monitorů
+Comment[csb]=Kònfigùracëjô KDE przë wielu mònitorach
+Comment[cy]=Ffurfweddu dangosyddion lluosol i KDE
+Comment[da]=Indstil KDE for flere skærme
+Comment[de]=KDE für mehrere Monitore einrichten
+Comment[el]=Ρύθμιση του KDE για πολλαπλές οθόνες
+Comment[eo]=Agordu KDE por oblaj ekranoj
+Comment[es]=Configuración de KDE para varios monitores
+Comment[et]=KDE seadistamine mitme monitori kasutamiseks
+Comment[eu]=Konfiguratu KDE monitore aniztasunerako
+Comment[fa]=پیکربندی نمایشگرهای چندگانه
+Comment[fi]=Muokkaa KDE sopivaksi usealle näytölle
+Comment[fr]=Configuration de KDE pour l'utilisation de moniteurs multiples
+Comment[fy]=Hjir kinne jo KDE foar meardere byldskermen ynstelle
+Comment[gl]=Configurar KDE para múltiplos monitores
+Comment[he]=הגדר את KDE לשימוש במספר מסכים
+Comment[hi]=अनेक मॉनीटर्स के लिए केडीई कॉन्फ़िगर करें
+Comment[hr]=Konfiguriranje KDE-a za više monitora
+Comment[hu]=Több monitor használata a KDE-ben
+Comment[is]=Stilla KDE fyrir marga skjái
+Comment[it]=Configura KDE per utilizzare più monitor
+Comment[ja]=KDE を複数のモニタ向けに設定
+Comment[ka]=რამდენიმე მონიტორისთვის KDE -ს კონფიგურაცია
+Comment[kk]=KDE-ні бірнеше мониторлар үшін баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ KDE សម្រាប់​ម៉ូនីទ័រ​ច្រើន
+Comment[ko]=KDE 다중 모니터 설정
+Comment[lt]=Konfigūruoti KDE keliems monitoriams
+Comment[lv]=Konfigure KDE priekš vairākiem monitoriem
+Comment[mk]=Конфигурирајте го KDE за повеќе монитори
+Comment[mn]=КДЭ олон монитор тохируулах
+Comment[ms]=Konfigur KDE untuk berbilang monitor
+Comment[mt]=Konfigurazzjoni tal-KDE għal skrinijiet multipli
+Comment[nb]=Tilpass KDE for flere skjermer
+Comment[nds]=KDE för mehr as een Schirm instellen
+Comment[ne]=बहुविध मोनिटरका लागि KDE कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u KDE voor meerdere monitoren instellen
+Comment[nn]=Set opp KDE for fleire skjermar
+Comment[pa]=ਕਈ ਮਾਨੀਟਰਾਂ ਲਈ KDE ਸੰਰਚਨਾ ਕਰੋ
+Comment[pl]=Konfiguracja KDE przy wielu monitorach
+Comment[pt]=Configuração do KDE para vários monitores
+Comment[pt_BR]=Configura o KDE para o uso de múltiplos monitores
+Comment[ro]=Configurează KDE pentru monitoare multiple
+Comment[ru]=Настройка KDE для нескольких мониторов
+Comment[rw]=Kuboneza KDE kuri mugaragaza zitandukanye
+Comment[se]=Heivet KDE:a máŋggaid šearpma várás
+Comment[sk]=Nastavenie KDE pre viac monitorov
+Comment[sl]=Nastavite KDE za več zaslonov
+Comment[sr]=Подешавање KDE-а за више монитора
+Comment[sr@Latn]=Podešavanje KDE-a za više monitora
+Comment[sv]=Anpassa KDE för flera bildskärmar
+Comment[ta]=பலவிதமான திரைகளுக்கு KDEஐ வடிவமை
+Comment[tg]=Танзими KDE барои намоишгарҳои виртуалӣ
+Comment[th]=ปรับแต่ง KDE สำหรับใช้กับจอภาพหลายจอ
+Comment[tr]=KDE'yi çoklu monitör kullanmak için yapılandır
+Comment[tt]=KDE'nıñ berniçä küräk belän eşläw caylawı
+Comment[uk]=Налаштування декількох моніторів для KDE
+Comment[uz]=KDE'ni bir nechta monitor uchun moslash
+Comment[uz@cyrillic]=KDE'ни бир нечта монитор учун мослаш
+Comment[vi]=Cấu hình KDE cho nhiều màn hình
+Comment[wa]=Apontyî KDE po on håynaedje so sacwantès waitroûles
+Comment[zh_CN]=配置 KDE 的多个监视器
+Comment[zh_TW]=設定 KDE 支援多重顯示器
+Keywords=Xinerama,dual head,multihead,monitor
+Keywords[ar]=Xinerama,dual head,multihead,monitor,ثنائي الرؤوس,متعدد الرؤوس,شاشة
+Keywords[be]=Два маніторы,Манітор,Некалькі манітораў,Дысплей,Xinerama,dual head,multihead,monitor
+Keywords[bg]=много, монитори, монитор, екран, дисплей, Xinerama, dual head, multihead, monitor
+Keywords[ca]=Xinerama,dual head,doble dispositiu,multihead,multiples dispositius,monitor
+Keywords[csb]=Xinerama,dwa mònitorë,wiele mònitorów,mònitor
+Keywords[cy]=Xinerama,pen deuol,amlben,dangosydd
+Keywords[da]=Xinerama,dualt hovede,multihovede,skærm
+Keywords[de]=inerama,dual head,multihead,monitor
+Keywords[el]=Xinerama,dual head,multihead,οθόνη
+Keywords[eo]=duobla,duoblaj,oblaj,ekrano,ekranoj
+Keywords[et]=Xinerama,kaks monitori,mitu monitori,monitor
+Keywords[eu]=Xinerama,dual head,multihead,monitorea
+Keywords[fa]=Xinerama، سرآیند دوگان، سرآیند چندگانه، نمایشگر
+Keywords[fi]=Xinerama,näyttö,kaksi näyttöä,useita näyttöjä
+Keywords[fr]=Xinerama,dual head,multihead,moniteur,multitête,double écran, multiécran
+Keywords[fy]=Xinerama,dual head,multihead,monitor,byldskerm
+Keywords[gl]=Xinerama,cabeza dual,cabeza múltiple,monitor
+Keywords[he]=Xinerama,דו ראשי,רב ראשי,מסך, dual head,multihead,monitor
+Keywords[hi]=सिनेरामा,ड्यूएल हेड,मल्टी-हेड,मॉनीटर
+Keywords[hr]=Xinerama,dual head,multihead,monitor,višestruki monitori
+Keywords[hu]=Xinerama,két fejes,két fej,monitor
+Keywords[it]=Xinerama,dual head,multihead,monitor,monitor multipli
+Keywords[ja]=Xinerama,デュアルヘッド,マルチヘッド,モニタ
+Keywords[km]=Xinerama,ក្បាល​ពីរ,ក្បាល​ច្រើន,ម៉ូនីទ័រ
+Keywords[lt]=Xinerama,dual head,multihead,monitor,dviejų monitorių,monitorius
+Keywords[lv]=Xinerama,dual head,multihead,monitori
+Keywords[mk]=Xinerama,dual head,multihead,monitor,монитор
+Keywords[mn]=Xinerama,dual head,multihead,монитор
+Keywords[nb]=Xinerama,to skjermer,flere skjermer,skjerm,monitor
+Keywords[nds]=Xinerama,dual head,multihead,monitor,Mehrschirmbedrief,Dubbelschirm
+Keywords[ne]=जिनेरामा, डअल हेड, मल्टिहेड, मनिटर
+Keywords[nl]=Xinerama,dual head,multihead,monitor,beeldscherm
+Keywords[nn]=Xinerama,to skjermar,fleire skjermar,skjerm,monitor
+Keywords[pa]=Xinerama,dual head,multihead,monitor, ਦੋ ਮਾਨੀਟਰ, ਮਾਨੀਟਰ
+Keywords[pl]=Xinerama,dwa monitory,wiele monitorów,monitor
+Keywords[pt]=xinerama,vários monitores,multihead,monitor
+Keywords[pt_BR]=Xinerama,monitores,multihead,monitor
+Keywords[rw]=Xinerama,umutwe nyabibiri,mitwemyinshi,mugaragaza
+Keywords[sl]=Xinerama,dual head,multihead,monitor,zaslon,dva
+Keywords[sr]=Xinerama,dual head,multihead,monitor,монитор,више монитора
+Keywords[sr@Latn]=Xinerama,dual head,multihead,monitor,monitor,više monitora
+Keywords[sv]=Xinerama,dubbla skärmar,flera skärmar,bildskärm
+Keywords[ta]= Xinerama,இரட்டை தலைப்பு,பலதலைப்பு,திரை
+Keywords[th]=Xinerama,หัวต่อคู่,หลายหัวต่อ,จอภาพ
+Keywords[tr]=Xinerama,çift ekran,çoklu ekran,monitör
+Keywords[uk]=Xinerama,dual head,multihead,монітор,комбінація моніторів
+Keywords[uz@cyrillic]=Xinerama,dual head,multihead,монитор
+Keywords[vi]=Xinerama,đầu kép,đa đầu,màn hình
+Keywords[wa]=Xinerama,deus waitroûles,multi-waitroûles,waitroûle,dual head,multihead
+Keywords[zh_CN]=Xinerama,dual head,multihead,monitor,双头,多头,监视器,显示器
diff --git a/kcontrol/xinerama/xineramawidget.ui b/kcontrol/xinerama/xineramawidget.ui
new file mode 100644
index 000000000..cab732afd
--- /dev/null
+++ b/kcontrol/xinerama/xineramawidget.ui
@@ -0,0 +1,326 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>XineramaWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>XineramaWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>658</width>
+ <height>389</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTable" row="1" column="0" rowspan="1" colspan="2">
+ <column>
+ <property name="text">
+ <string>X Coordinate</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Y Coordinate</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Width</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Height</string>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>headTable</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="vScrollBarMode">
+ <enum>Auto</enum>
+ </property>
+ <property name="hScrollBarMode">
+ <enum>Auto</enum>
+ </property>
+ <property name="numRows">
+ <number>2</number>
+ </property>
+ <property name="numCols">
+ <number>4</number>
+ </property>
+ <property name="showGrid">
+ <bool>true</bool>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode">
+ <enum>NoSelection</enum>
+ </property>
+ <property name="focusStyle">
+ <enum>FollowStyle</enum>
+ </property>
+ </widget>
+ <widget class="QButtonGroup" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Multiple Monitor Support</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_enableXinerama</cstring>
+ </property>
+ <property name="text">
+ <string>Enable multiple monitor virtual desktop support</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_enableResistance</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Enable multiple monitor window resistance support</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_enablePlacement</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Enable multiple monitor window placement support</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_enableMaximize</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Enable multiple monitor window maximize support</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>_enableFullscreen</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Enable multiple monitor window fullscreen support</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>_identify</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Identify All Displays</string>
+ </property>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>431</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Show unmanaged windows on:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>_unmanagedDisplay</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <property name="name">
+ <cstring>_ksplashDisplay</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel2_2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Show KDE splash screen on:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>_unmanagedDisplay</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>_unmanagedDisplay</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>_enableXinerama</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>_enableResistance</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>_enableXinerama</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>_enablePlacement</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>_enableXinerama</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>_enableMaximize</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>_enableXinerama</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>TextLabel2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>_enableXinerama</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>_unmanagedDisplay</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>_enableXinerama</sender>
+ <signal>clicked()</signal>
+ <receiver>XineramaWidget</receiver>
+ <slot>emitConfigChanged()</slot>
+ </connection>
+ <connection>
+ <sender>_enableResistance</sender>
+ <signal>clicked()</signal>
+ <receiver>XineramaWidget</receiver>
+ <slot>emitConfigChanged()</slot>
+ </connection>
+ <connection>
+ <sender>_enablePlacement</sender>
+ <signal>clicked()</signal>
+ <receiver>XineramaWidget</receiver>
+ <slot>emitConfigChanged()</slot>
+ </connection>
+ <connection>
+ <sender>_enableMaximize</sender>
+ <signal>clicked()</signal>
+ <receiver>XineramaWidget</receiver>
+ <slot>emitConfigChanged()</slot>
+ </connection>
+ <connection>
+ <sender>_unmanagedDisplay</sender>
+ <signal>activated(int)</signal>
+ <receiver>XineramaWidget</receiver>
+ <slot>emitConfigChanged()</slot>
+ </connection>
+ <connection>
+ <sender>_enableXinerama</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>TextLabel2_2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>_enableXinerama</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>_ksplashDisplay</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>_ksplashDisplay</sender>
+ <signal>activated(int)</signal>
+ <receiver>XineramaWidget</receiver>
+ <slot>emitConfigChanged()</slot>
+ </connection>
+ <connection>
+ <sender>_enableFullscreen</sender>
+ <signal>clicked()</signal>
+ <receiver>XineramaWidget</receiver>
+ <slot>emitConfigChanged()</slot>
+ </connection>
+ <connection>
+ <sender>_enableXinerama</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>_enableFullscreen</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+ <include location="local" impldecl="in implementation">xineramawidget.ui.h</include>
+</includes>
+<signals>
+ <signal>configChanged()</signal>
+</signals>
+<slots>
+ <slot access="private">emitConfigChanged()</slot>
+</slots>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kcontrol/xinerama/xineramawidget.ui.h b/kcontrol/xinerama/xineramawidget.ui.h
new file mode 100644
index 000000000..8373eadd2
--- /dev/null
+++ b/kcontrol/xinerama/xineramawidget.ui.h
@@ -0,0 +1,14 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+
+
+void XineramaWidget::emitConfigChanged()
+{
+emit configChanged();
+}