<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://techbase.kde.org/skins/common/feed.css?0.2"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://techbase.kde.org/api.php?action=feedcontributions&amp;user=Agateau&amp;feedformat=atom</id>
		<title>KDE TechBase - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://techbase.kde.org/api.php?action=feedcontributions&amp;user=Agateau&amp;feedformat=atom"/>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Special:Contributions/Agateau"/>
		<updated>2013-05-22T05:37:05Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.20.2</generator>

	<entry>
		<id>http://techbase.kde.org/Projects/PIM</id>
		<title>Projects/PIM</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/PIM"/>
				<updated>2013-04-29T15:50:56Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: fix broken link to ML&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
KDE PIM is a package that contains personal information management tools.&lt;br /&gt;
&lt;br /&gt;
The KDEPIM team develops the main application Kontact with all its plugins like KMail, KNode, KOrganizer, KAddressbook, Akregator, KJots and others.&lt;br /&gt;
&lt;br /&gt;
To join the team, simply email the [https://mail.kde.org/mailman/listinfo/kde-pim kde-pim] mailing list, and join the irc://freenode.net/kontact IRC channel.&lt;br /&gt;
&lt;br /&gt;
==Resources==&lt;br /&gt;
*[[/PIMsters | Who are we?]]&lt;br /&gt;
*[http://kdepim.kde.org Homepage of the KDE PIM]&lt;br /&gt;
*[http://kontact.kde.org/ Homepage of Kontact]&lt;br /&gt;
*[mailto:kdepim-users@kde.org kdepim-users@kde.org] mailing list (for users): [https://mail.kde.org/mailman/listinfo/kdepim-users subscribe], [http://lists.kde.org/?l=kdepim-users&amp;amp;r=1&amp;amp;w=2 archives]&lt;br /&gt;
*[mailto:kde-pim@kde.org kde-pim@kde.org] mailing list (for developers): [https://mail.kde.org/mailman/listinfo/kde-pim subscribe], [http://lists.kde.org/?l=kde-pim&amp;amp;r=1&amp;amp;w=2 archives]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
Much of the infrastructure of KDE PIM has been moved to kdepimlibs module as a framework for all KDE applications. Therefore we have two main modules within the KDE SVN: '''kdepim''' and '''kdepimlibs'''. The latter contains code that provides public APIs.&lt;br /&gt;
&lt;br /&gt;
Current development focus as of January 2009 is on the Akonadi service and porting existing applications to Akonadi and KMime and other frameworks.&lt;br /&gt;
&lt;br /&gt;
'''If you're looking into starting KMail development, have a look at the [[Projects/PIM/KMail Junior Jobs|list of KMail junior jobs]].'''&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
The KMail handbook is currently being rewritten, for more information look at the [[Projects/Documentation/KDE4/kdepim/kmail|documentation wiki page]].&lt;br /&gt;
===KDE PIM 4===&lt;br /&gt;
*README documents stored in the KDE GIT:&lt;br /&gt;
:*kdepim: &lt;br /&gt;
::*[https://projects.kde.org/projects/kde/kdepim/repository/revisions/master/entry/README README]&lt;br /&gt;
::*[https://projects.kde.org/projects/kde/kdepim/repository/revisions/master/entry/kmail/HACKING KMail's HACKING file]&lt;br /&gt;
&lt;br /&gt;
:*kdepimlibs&lt;br /&gt;
::*[https://projects.kde.org/projects/kde/kdepimlibs/repository/revisions/master/entry/README README]&lt;br /&gt;
::*[https://projects.kde.org/projects/kde/kdepimlibs/repository/revisions/master/entry/POLICIES POLICIES]&lt;br /&gt;
::*[https://projects.kde.org/projects/kde/kdepimlibs/repository/revisions/master/entry/PLAN PLAN]&lt;br /&gt;
*[http://api.kde.org/4.x-api/kdepimlibs-apidocs/ KDE PIM LIBS API Reference]&lt;br /&gt;
*[http://api.kde.org/4.x-api/kdepim-apidocs/ KDE PIM API Reference]&lt;br /&gt;
*[[/KDE 4-related bugs|List of KDE 4-specific bugs, regressions and junior jobs]]&lt;br /&gt;
*[[/KMail_SoC_regressions|List of regressions after the merge of the KMail SoC branch]]&lt;br /&gt;
*[[/MS Windows|MS Windows topics]]&lt;br /&gt;
*[[Development/Tutorials/Writing_kontact_plugins|Tutorial for writing a Kontact plugin]]&lt;br /&gt;
&lt;br /&gt;
====Planning====&lt;br /&gt;
*[[Schedules/KDE4/4.2_Feature_Plan#kdepim|Feature Plan]] (see also [[Schedules/KDE4/4.2_Feature_Plan#kdepimlibs|KDEPIMlibs feature plan]])&lt;br /&gt;
*Akonadi: [[Projects/PIM/Akonadi|Feature Plan]], [http://lists.kde.org/?l=kde-pim&amp;amp;m=120216697126489&amp;amp;w=2 Osnabrück Meeting Notes]&lt;br /&gt;
*[[Projects/PIM/Ideas|Ideas]]:&lt;br /&gt;
&lt;br /&gt;
===Other===&lt;br /&gt;
*[[/Development/SingleFileResourceRefactoring|SingleFileResource refactoring plan]]&lt;br /&gt;
* [[Projects/PIM/Mobile|KDE PIM for mobile devices]]&lt;br /&gt;
&lt;br /&gt;
===KDE PIM 3===&lt;br /&gt;
&lt;br /&gt;
The KDE PIM 3 branch is frozen and no longer actively maintained. Use the KDE 3 enterprise branch for a version of Kontact that is still being updated.&lt;br /&gt;
&lt;br /&gt;
*[[/Features_3.5.9|New Features included with KDE 3.5.9]]&lt;br /&gt;
*[[/Installing the KDE PIM 3.5.5+ feature branch|Installing the KDE PIM 3.5.5+ feature branch]]&lt;br /&gt;
&lt;br /&gt;
===Enterprise branches===&lt;br /&gt;
Kontact is the primary [http://kolab.org/ Kolab] client. There are different release cycles for the Kolab clients and for KDE, and therefore there are so-called &amp;lt;i&amp;gt;enterprise&amp;lt;/i&amp;gt; branches in SVN where the Kolab versions are maintained. Changes in the enterprise branches are regularly merged back to SVN trunk.&lt;br /&gt;
The enterprise branches are maintained by [http://www.klaralvdalens-datakonsult.se/ KDAB].&lt;br /&gt;
&lt;br /&gt;
More information about the enterprise branches can be found at:&lt;br /&gt;
*[http://websvn.kde.org/branches/kdepim/ KDEPIM branches in SVN (notably &amp;lt;i&amp;gt;enterprise&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;enterprise4&amp;lt;/i&amp;gt;)]&lt;br /&gt;
*[http://wiki.kolab.org/index.php/Kontact_for_Windows_(beta-huge-debug) Kontact on Windows (enterprise4 branch)]&lt;br /&gt;
*[http://kolab.org/roadmap.html Roadmap for the Kolab clients]&lt;br /&gt;
*[http://kolab.org/download.html Downloads of the Kolab clients]&lt;br /&gt;
*[http://wiki.kolab.org/index.php/Kontact Kontact wiki page]&lt;br /&gt;
*[http://kolab.org/documentation.html Various Kolab documents]&lt;br /&gt;
*[[Development/Tools/svnmerge.py|Merge Tracking with svnmerge.py]]&lt;br /&gt;
*[[Projects/PIM/Enterprise_Translation_Howto|Enterprise Translation Howto]]&lt;br /&gt;
&lt;br /&gt;
===Other Links===&lt;br /&gt;
*[http://techbase.kde.org/Category:PIM List of all KDE PIM related articles on TechBase]&lt;br /&gt;
*[[Projects/Oxygen/Missing_Icons#KDE_main_modules|Missing Icons in KDE PIM]]&lt;br /&gt;
*[http://www.englishbreakfastnetwork.org/krazy/index.php?component=kde-4.x&amp;amp;module=kdepimlibs KDE PIM libraries at the Krazy code checker]&lt;br /&gt;
*[http://www.englishbreakfastnetwork.org/krazy/index.php?component=kde-4.x&amp;amp;module=kdepim KDE PIM at the Krazy code checker]&lt;br /&gt;
*[http://cia.vc/stats/project/kde/kdepim KDE PIM on CIA]&lt;br /&gt;
*[http://cia.vc/account/bots/6503/ CIA commit bot for #kontact (account needed)]&lt;br /&gt;
*[http://cia.vc/account/bots/12872/ CIA commit bot for #akonadi (account needed)]&lt;br /&gt;
*[http://www.ohloh.net/p/kmail KMail on ohloh.net]&lt;br /&gt;
*[http://freshmeat.net/projects/kmail/ Totally outdated KMail freshmeat page]&lt;br /&gt;
&lt;br /&gt;
*[http://forum.kde.org/office-personal-information-management-f-20.html KDE PIM in the KDE forums]&lt;br /&gt;
*[http://userbase.kde.org/Applications/Office#Kontact KDE PIM on UserBase]&lt;br /&gt;
*[http://userbase.kde.org/Tutorials#In_Kontact KDE PIM tutorials on UserBase]&lt;br /&gt;
*[http://en.wikipedia.org/wiki/KDE_Personal_Information_Management KDE PIM on Wikipedia]&lt;br /&gt;
&lt;br /&gt;
===PIM SoC 2008 projects===&lt;br /&gt;
*[[/RSS_framework_for_Akonadi|RSS framework for Akonadi]]&lt;br /&gt;
[[Category:PIM]]&lt;br /&gt;
&lt;br /&gt;
===Technologies used in KDE PIM===&lt;br /&gt;
&lt;br /&gt;
This list is quite incomplete.&lt;br /&gt;
&lt;br /&gt;
* http://doc.trolltech.com/4.4/richtext.html - Used for the KMail composer. See also [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKRichTextWidget.html KRichTextWidget].&lt;br /&gt;
* http://doc.trolltech.com/4.4/model-view-programming.html - Used throughout KDEPIM including KMail tree views etc.&lt;br /&gt;
* Akonadi: [[Projects/PIM/Akonadi|Wiki]], [http://www.akonadi-project.org/ Website], [http://download.akonadi-project.org/ Tarballs]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Nepomuk/QuickStart</id>
		<title>Projects/Nepomuk/QuickStart</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Nepomuk/QuickStart"/>
				<updated>2013-01-08T15:51:03Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: typo--&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scope of this page == &amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
This page serves as a very simple overview to '''Nepomuk'''. It focuses on getting started with '''Nepomuk''' and tries not to deal with internal '''Nepomuk''' concepts. Please keep in the mind that the processes described here are targeted to the general use case. If you have a more specialized use case in mind, this might not be the best way to use the '''Nepomuk''' libraries.&lt;br /&gt;
&lt;br /&gt;
==Libraries and Headers== &amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
Most of the non graphic parts of '''Nepomuk''' are present in the [https://projects.kde.org/projects/kde/kdelibs/nepomuk-core NepomukCore repository]. It is shipped with KDE 4.9, and should be provided by your distribution. When starting with '''Nepomuk''' development, it would be better to stick with your distribution version.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
With KDE 4.9, the '''Nepomuk''' libraries moved to the Nepomuk2 namespace. The headers also follow a similar convention.&lt;br /&gt;
&lt;br /&gt;
=== Headers === &amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
All the '''Nepomuk''' headers in are preceded by Nepomuk2. Here are some common '''Nepomuk''' includes that are frequently used -&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Nepomuk2/Tag&amp;gt;&lt;br /&gt;
#include &amp;lt;Nepomuk2/Resource&amp;gt;&lt;br /&gt;
#include &amp;lt;Nepomuk2/ResourceManager&amp;gt;&lt;br /&gt;
#include &amp;lt;Nepomuk2/File&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CMake === &amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
KDE Projects generally use cmake as a build tool. '''Nepomuk''' is no different. In order to use '''Nepomuk''' you need to add the relevant macros for '''Nepomuk''' in your CMakeLists.txt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(NepomukCore REQUIRED)&lt;br /&gt;
target_link_libraries(myfile ${NEPOMUK_CORE_LIBRARY} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basic Terminology == &amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
At the lowest level '''Nepomuk''' is just a database which many applications use to store data. The main difference is that the data is not stored in rows and columns like traditional relational databases. Instead '''Nepomuk''' can be viewed as something similar to an object or document store. We store a large number of objects, and each of these objects have (key, value) pairs attached to them.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
Each object in our database is called a Resource. Everything in '''Nepomuk''' revolves around resources. All the higher level concepts such as files, tags, contacts, music albums, actors, etc. they are all Resources. Each of these resources has a number of (key, value) pairs associated with it. In the '''Nepomuk''' world, the keys are called properties or predicates, and have already been defined.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
'''Nepomuk''' is also based around a concept called the Semantic Web. However, understanding the ideas and details behind the Semantic Web is not necessary.&lt;br /&gt;
&lt;br /&gt;
== Tags and Ratings == &amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
Every tag in '''Nepomuk''' is a Resource. In fact the [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Tag.html Tag class] is also derived from the [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Resource.html Resource class].&lt;br /&gt;
&lt;br /&gt;
=== Setting Tags === &amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
Nepomuk2::Tag tag( &amp;quot;Awesome-Tag-Name&amp;quot; );&lt;br /&gt;
Nepomuk2::Resource res( url );&lt;br /&gt;
res.addTag( tag );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
The [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Tag.html &amp;lt;tt&amp;gt;Nepomuk2::Tag&amp;lt;/tt&amp;gt;] class will automatically look for a tag called &amp;quot;Awesome-Tag-Name&amp;quot;, if it finds it then [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Resource.html#a3c58ca2096f8424e12f31ddd73369597 Tag::exists()] will return true. Otherwise, the tag will be saved the first time the tag is used. In our case, when we add the tag to the Resource via [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Resource.html#a649e935b3557d0c5015ab7728f623f66 Resource::addTag()], the tag will be saved.&lt;br /&gt;
&lt;br /&gt;
=== Retrieving Tags === &amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
using namespace Nepomuk2;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
Resource res( url );&lt;br /&gt;
QList&amp;lt;Tag&amp;gt; tags = res.tags();&lt;br /&gt;
foreach(const Tag&amp;amp; tag, tags)&lt;br /&gt;
    kDebug() &amp;lt;&amp;lt; tag.genericLabel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
Every resource has a predefined function for retrieving all the Tags any resource is tagged with - [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Resource.html#a286c2e37f975e58e38aaa83903040910 Resource::tags()]. The [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Resource.html#ad8d16485bdc9788de60bf5784141bcac Resource::genericLabel()] function tries to find a presentable name for any resource. In the case of tags, it returns the tags name.&lt;br /&gt;
&lt;br /&gt;
=== Listing Tags === &amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
The simplest way to list all the tags that are present in '''Nepomuk''' is via a static function - [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Tag.html#a03bc6a42a14003aca17e8c3e02f43d17 Tag::allTags()]. You, however, need to be careful using this in a production environment as it executes a blocking query in the background. Depending on the number of tags on the system, it could take some time. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
using namespace Nepomuk2;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:28--&amp;gt;&lt;br /&gt;
QList&amp;lt;Tag&amp;gt; tags = Tag::allTags();&lt;br /&gt;
foreach(const Tag&amp;amp; tag, tags)&lt;br /&gt;
    kDebug() &amp;lt;&amp;lt; tag.genericLabel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:29--&amp;gt;&lt;br /&gt;
There are also convenience functions to list all the resources that have been assigned a particular tag - [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Tag.html#a04256e4dda504e5b021afcab0ba4b714 Tag::tagOf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:30--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
using namespace Nepomuk2;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
Tag tag(&amp;quot;Awesome-Tag-Name&amp;quot;);&lt;br /&gt;
QList&amp;lt;Resource&amp;gt; taggedResources = tag.tagOf();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
foreach(const Resource&amp;amp; res, taggedResources)&lt;br /&gt;
    kDebug() &amp;lt;&amp;lt; res.genericLabel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ratings === &amp;lt;!--T:33--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
Every resource in Nepomuk can be given a numeric rating. It is generally done on a scale of 0-10.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
using namespace Nepomuk2;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
File fileRes( urlOfTheFile );&lt;br /&gt;
int rating = fileRes.rating();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
rating = rating + 1;&lt;br /&gt;
fileRes.setRating( rating );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dealing with files == &amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
Every file in Nepomuk is represented as a resource. Since dealing with files is very common, we provide a special [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1File.html File class] which is derived from the Resource class. We also provide convenience functions for checking if a resource is a file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:40--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
using namespace Nepomuk2;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
File fileRes( urlOfTheFile );&lt;br /&gt;
kDebug() &amp;lt;&amp;lt; fileRes.url();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:42--&amp;gt;&lt;br /&gt;
Resource res( urlOfTheFile );&lt;br /&gt;
if( res.isFile() )&lt;br /&gt;
    kDebug() &amp;lt;&amp;lt; res.toFile().url();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:43--&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:44--&amp;gt;&lt;br /&gt;
Internally Nepomuk Files are not very different from other Resources.&lt;br /&gt;
&lt;br /&gt;
== Working Example == &amp;lt;!--T:45--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:46--&amp;gt;&lt;br /&gt;
We understand that using a new framework such as '''Nepomuk''' can be quite intimidating at times. Therefore, we though it would be nice to have a working example for you to get started with - [http://quickgit.kde.org/index.php?p=kdeexamples.git&amp;amp;a=tree&amp;amp;h=eddcb1707a9e600db49fafdcb5ed8e8a195bcaba&amp;amp;hb=80a322af2bc5975c01c704173e937ccb8df605e3&amp;amp;f=nepomuk%2Ftest kdeexamples/nepomuk/test]. This example does nothing but it creates an executable called &amp;lt;code&amp;gt;nepomuk-test&amp;lt;/code&amp;gt;. It serves as a simple starting point to '''Nepomuk''' where all the boiler plate code has been taken care of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:47--&amp;gt;&lt;br /&gt;
[[Category: Documentation]]&lt;br /&gt;
[[Category: Development]]&lt;br /&gt;
[[Category: Tutorials]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Nepomuk/QuickStart</id>
		<title>Projects/Nepomuk/QuickStart</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Nepomuk/QuickStart"/>
				<updated>2013-01-08T15:12:33Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: typo--&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scope of this page == &amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
This page serves as a very simple overview to '''Nepomuk'''. It focuses on getting started with '''Nepomuk''' and tries not to deal with internal '''Nepomuk''' concepts. Please keep in the mind that the processes described here are targeted to the general use case. If you have a more specialized use case in mind, this might not be the best way to use the '''Nepomuk''' libraries.&lt;br /&gt;
&lt;br /&gt;
==Libraries and Headers== &amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
Most of the non graphic parts of '''Nepomuk''' are present in the [https://projects.kde.org/projects/kde/kdelibs/nepomuk-core NepomukCore repository]. It is shipped with KDE 4.9, and should be provided by your distribution. When starting with '''Nepomuk''' development, it would be better to stick with your distribution version.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
With KDE 4.9, the '''Nepomuk''' libraries moved to the Nepomuk2 namespace. The headers also follow a similar convention.&lt;br /&gt;
&lt;br /&gt;
=== Headers === &amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
All the '''Nepomuk''' headers in are preceded by Nepomuk2. Here are some common '''Nepomuk''' includes that are frequently used -&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Nepomuk2/Tag&amp;gt;&lt;br /&gt;
#include &amp;lt;Nepomuk2/Resource&amp;gt;&lt;br /&gt;
#include &amp;lt;Nepomuk2/ResourceManager&amp;gt;&lt;br /&gt;
#include &amp;lt;Nepomuk2/File&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CMake === &amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
KDE Projects generally use cmake as a build tool. '''Nepomuk''' is no different. In order to use '''Nepomuk''' you need to add the relevant macros for '''Nepomuk''' in your CMakeLists.txt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(NepomukCore REQUIRED)&lt;br /&gt;
target_link_libraries(myfile ${NEPOMUK_CORE_LIBRARY} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basic Terminology == &amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
At the lowest level '''Nepomuk''' is just a database which many applications use to store data. The main difference is that the data is not stored in rows and columns like traditional relational databases. Instead '''Nepomuk''' can be viewed as something similar to an object or document store. We store a large number of objects, and each of these objects have (key, value) pairs attached to them.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
Each object in our database is called a Resource. Everything in '''Nepomuk''' revolves around resources. All the higher level concepts such as files, tags, contacts, music albums, actors, etc. they are all Resources. Each of these resources has a number of (key, value) pairs associated with it. In the '''Nepomuk''' world, the keys are called properties or predicates, and have already been defined.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
'''Nepomuk''' is also based around a concept called the Semantic Web. However, understanding the ideas and details behind the Semantic Web is not necessary.&lt;br /&gt;
&lt;br /&gt;
== Tags and Ratings == &amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
Every tag in '''Nepomuk''' is a Resource. In fact the [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Tag.html Tag class] is also derived from the [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Resource.html Resource class].&lt;br /&gt;
&lt;br /&gt;
=== Setting Tags === &amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
Nepomuk2::Tag tag( &amp;quot;Awesome-Tag-Name&amp;quot; );&lt;br /&gt;
Nepomuk2::Resource res( url );&lt;br /&gt;
res.addTag( tag );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
The [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Tag.html &amp;lt;tt&amp;gt;Nepomuk2::Tag&amp;lt;/tt&amp;gt;] class will automatically look for a tag called &amp;quot;Awesome-Tag-Name&amp;quot;, if it finds it then [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Resource.html#a3c58ca2096f8424e12f31ddd73369597 Tag::exists()] will return true. Otherwise, the tag will be saved the first time the tag is used. In our case, when we add the tag to the Resource via [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Resource.html#a649e935b3557d0c5015ab7728f623f66 Resource::addTag()], the tag will be saved.&lt;br /&gt;
&lt;br /&gt;
=== Retrieving Tags === &amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
using namespace Nepomuk2;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
Resource res( url );&lt;br /&gt;
QList&amp;lt;Tag&amp;gt; tags = res.tags();&lt;br /&gt;
foreach(const Tag&amp;amp; tag, tags)&lt;br /&gt;
    kDebug() &amp;lt;&amp;lt; tag.genericLabel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
Every resource has a predefined function for retrieving all the Tags any resource is tagged with - [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Resource.html#a286c2e37f975e58e38aaa83903040910 Resource::tags()]. The [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Resource.html#ad8d16485bdc9788de60bf5784141bcac Resource::genericLabel()] function tries to find a presentable name for any resource. In the case of tags, it returns the tags name.&lt;br /&gt;
&lt;br /&gt;
=== Listing Tags === &amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
The simplest way to list all the tags that are present in '''Nepomuk''' is via a static function - [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Tag.html#a03bc6a42a14003aca17e8c3e02f43d17 Tag::allTags()]. You, however, need to be careful using this in a production environment as it executes a blocking query in the background. Depending on the number of tags on the system, it could take some time. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
using namespace Nepomuk2;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:28--&amp;gt;&lt;br /&gt;
QList&amp;lt;Tag&amp;gt; tags = Tag::allTags();&lt;br /&gt;
foreach(const Tag&amp;amp; tag, tags)&lt;br /&gt;
    kDebug() &amp;lt;&amp;lt; tag.genericLabel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:29--&amp;gt;&lt;br /&gt;
There are also convenience functions to list all the resources that have been assigned a particular tag - [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1Tag.html#a04256e4dda504e5b021afcab0ba4b714 Tag::tagOf]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:30--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
using namespace Nepomuk2;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
Tag tag(&amp;quot;Awesome-Tag-Name&amp;quot;);&lt;br /&gt;
QList&amp;lt;Resoruce&amp;gt; taggedResources = tag.tagOf();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
foreach(const Resource&amp;amp; res, taggedResources)&lt;br /&gt;
    kDebug() &amp;lt;&amp;lt; res.genericLabel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ratings === &amp;lt;!--T:33--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
Every resource in Nepomuk can be given a numeric rating. It is generally done on a scale of 0-10.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
using namespace Nepomuk2;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
File fileRes( urlOfTheFile );&lt;br /&gt;
int rating = fileRes.rating();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
rating = rating + 1;&lt;br /&gt;
fileRes.setRating( rating );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dealing with files == &amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
Every file in Nepomuk is represented as a resource. Since dealing with files is very common, we provide a special [http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk-core/html/classNepomuk2_1_1File.html File class] which is derived from the Resource class. We also provide convenience functions for checking if a resource is a file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:40--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
using namespace Nepomuk2;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
File fileRes( urlOfTheFile );&lt;br /&gt;
kDebug() &amp;lt;&amp;lt; fileRes.url();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:42--&amp;gt;&lt;br /&gt;
Resource res( urlOfTheFile );&lt;br /&gt;
if( res.isFile() )&lt;br /&gt;
    kDebug() &amp;lt;&amp;lt; res.toFile().url();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:43--&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:44--&amp;gt;&lt;br /&gt;
Internally Nepomuk Files are not very different from other Resources.&lt;br /&gt;
&lt;br /&gt;
== Working Example == &amp;lt;!--T:45--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:46--&amp;gt;&lt;br /&gt;
We understand that using a new framework such as '''Nepomuk''' can be quite intimidating at times. Therefore, we though it would be nice to have a working example for you to get started with - [http://quickgit.kde.org/index.php?p=kdeexamples.git&amp;amp;a=tree&amp;amp;h=eddcb1707a9e600db49fafdcb5ed8e8a195bcaba&amp;amp;hb=80a322af2bc5975c01c704173e937ccb8df605e3&amp;amp;f=nepomuk%2Ftest kdeexamples/nepomuk/test]. This example does nothing but it creates an executable called &amp;lt;code&amp;gt;nepomuk-test&amp;lt;/code&amp;gt;. It serves as a simple starting point to '''Nepomuk''' where all the boiler plate code has been taken care of.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:47--&amp;gt;&lt;br /&gt;
[[Category: Documentation]]&lt;br /&gt;
[[Category: Development]]&lt;br /&gt;
[[Category: Tutorials]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.10_Feature_Plan</id>
		<title>Schedules/KDE4/4.10 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.10_Feature_Plan"/>
				<updated>2012-11-21T15:01:25Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* kdegraphics */ update gwenview features&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.10 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.10 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.9 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;b&amp;gt;NO NEW FEATURES ALLOWED&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-runtime =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|kio-mtp|KIO-Slave for MTP|philschmidt@gmx.net|Philipp Schmidt}}&lt;br /&gt;
{{FeatureDone|QML Containments|Making it possible to do full-featured containments in QML|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureDone|nepomuk-indexer|New Nepomuk Indexer|me@vhanda.in|Vishesh Handa}}&lt;br /&gt;
{{FeatureDone|nepomukbakcup|Nepomuk Backup rewritten from scratch|me@vhanda.in|Vishesh Handa}}&lt;br /&gt;
{{FeatureDone|nepomukcleaner|An application to port/clean invalid/legacy data in Nepomuk|me@vhanda.in|Vishesh Handa}}&lt;br /&gt;
{{FeatureDone|nepomuk KCM|Rewrite the Nepomuk KCM|me@vhanda.in|Vishesh Handa}}&lt;br /&gt;
{{FeatureDone|nepomuk tags|Nepomuk Tags KIO Slave|me@vhanda.in|Vishesh Handa}}&lt;br /&gt;
{{FeatureInProgress|nepomuk filemetadatawidget|Nepomuk Metadata Widget|me@vhanda.in|Vishesh Handa}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|ksmserver|Merge the new qml based screen locker|mart@kde.org|Marco Martin}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The following section of entries has been auto generated by ChangelogGenerator. Do not edit!&lt;br /&gt;
BEGIN GENERATED SECTION --&amp;gt;&lt;br /&gt;
{{FeatureTodo|kwin|windows that are moved to another desktop should be treated as sticky windows ({{bug |213847}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Fix fullscreen state handling: NETWM says it's bound to focus and not stacking order, also see bug #224600 ({{bug |296076}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Medium focus stealing prevention should also prevent focus stealing when the timestamp on the active window is uncertain ({{bug |304746}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Usability issue: &amp;quot;Attach as tab to&amp;quot; menu can be empty ({{bug |306451}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Display application menu and title bar side by side for maximized windows ({{bug |102607}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Add support for appmenu-qt ({{bug |266596}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Import Scripted Effect from All Effets Tab ({{bug |296772}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|GHNS support for Scripted Effects ({{bug |296773}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Window Tab support for QML based Aurorae ({{bug |299138}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureInProgress|kwin|Remove legacy window decorations ({{bug |299144}}, Review 104281)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Get rid of  &amp;quot;Display borders on maximized windows&amp;quot; setting ({{bug |299245}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Break NETWM to allow inner xinerama struts ({{bug |299247}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Cube animation on border approach should not be used unless the electric borders are actually in use and the config should be disabled, align or hint the electric border configuration ({{bug |299901}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Make ShaderManager act as a real stack ({{bug |300349}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|clientPopup: &amp;quot;'More actions' and &amp;quot;Attach as tab to&amp;quot;  lack mnemonics ({{bug |302833}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Make KWin compile with C++11 ({{bug |303313}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Copy all useful Client properties to Deleted ({{bug |303916}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Display content of resizing/moving windows: KDE-Help shows obsolete instructions ({{bug |305297}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Mouse action support for sending window to different activity ({{bug |305758}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Windows list icon does not show up in &amp;quot;Walk Through Desktop List&amp;quot; ({{bug |306187}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Game mode ({{bug |306448}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Animate Window Maximize/Restore ({{bug |308990}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Common animation settings for effects of same type ({{bug |308991}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Use Resize Area in Aurorae ({{bug |308992}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Configurable quick tile area config GUI ({{bug |308993}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Move ExtendedBorderRegion to stable  API ({{bug |308994}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Support shortened titles like in bespin in all decorations ({{bug |308995}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureInProgress|kwin|Mouse Click effect ({{bug |309006}}, Review 105780)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Decorations not visible ({{bug |305875}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|drag-and-drop between windows by cover switch alt-tab causes apps to crash ({{bug |179077}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Add a rule to select the screen ({{bug |183996}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|JJ: Need Mouse navigation in flip switch mode ({{bug |244439}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Request category for scripted KWin Effects on kde-(look&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;app).org ({{bug |297634}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Request category for KWin Scripts on kde-(look&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;app).org ({{bug |297635}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Request category for Window Switcher Layouts on kde-(look&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;app).org ({{bug |297637}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Allow direct rendering with fglrx ({{bug |301103}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Don't use OpenGL matrix stack in OpenGL 2 backend ({{bug |303093}}, Review 105455)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Refactor Screen/Window PaintData ({{bug |303314}}, Review 105141)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Rapid flickering in locked screen -- makes it difficult to unlock ({{bug |303579}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|double click menu to close needs GUI config ({{bug |305738}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Toplevel::windowType() needs performance improvements ({{bug |306384}}, Review 106349)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|GLPlatform should recommend either OpenGL1 or OpenGL2 compositing ({{bug |306436}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Zoom effect broken in master ({{bug |307609}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|kwin fails to build when the GLES support is disabled ({{bug |307866}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|[JJ] Some effect authors are listed as &amp;quot;Name1 &amp;amp; Name2&amp;quot; ({{bug |307928}}, Review 106880)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Add screen management actions to window context menus ({{bug |269207}}, Review 106065)|mgraesslin@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Move Workspace's compositing functionality to own class Compositor ({{bug |299277}}, Review 102420)|mgraesslin@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Option to disable close on double click in Aurorae ({{bug |301327}}, Review 106160)|mgraesslin@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Remove Tiling Support From KWin ({{bug |303090}}, Review 105546)|mgraesslin@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Allow Scripts to add menus to useractions menu ({{bug |303756}}, Review 106285)|mgraesslin@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Generic QML support for Aurorae Themes ({{bug |303810}}, Review 105768)|mgraesslin@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Split out Useractions Menu from Workspace ({{bug |305832}}, Review 106085)|mgraesslin@kde.org}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- END GENERATED SECTION --&amp;gt;&lt;br /&gt;
{{FeatureDone|kwin|Implement color correction|skeletk13@gmail.com|Casian Andrei}}&lt;br /&gt;
{{FeatureDone|oxygen decoration|Implement ExtendedBorderRegion support, to resize windows outside of their actual borders|hugo@oxygen-icons.org|Hugo Pereira Da Costa}}&lt;br /&gt;
{{FeatureDone|oxygen style|Implement BlurBehind semi-transparent tooltips when available|hugo@oxygen-icons.org|Hugo Pereira Da Costa}}&lt;br /&gt;
{{FeatureDone|plasma-wallpapers|Color wallpaper: add listview to display thumbnails for background mode|rshah0385@kireihana.com|Reza Fatahilah Shah}}&lt;br /&gt;
{{FeatureInProgress|plasma workspace|Port Notifications applet to QML|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|plasma workspace|Port Task Manager applets to QML|hein@kde.org|Eike Hein (Sho_)}}&lt;br /&gt;
{{FeatureInProgress|plasma workspace|refresh Air Plasma theme|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|plasma workspace|Port Kickoff to qml|yellowcake-@gmx.net|Greg T}}&lt;br /&gt;
{{FeatureTodo|systemsettings|Replace krandr KCM by libkscreen-based one|dvratil@redhat.com|Dan Vrátil}}&lt;br /&gt;
{{FeatureInProgress|plasma workspace|Port rssnow to qml|terietor@gmail.com|Giorgos Tsiapaliokas}}&lt;br /&gt;
{{FeatureInProgress|various|KActivities/SLC support for most our applications|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|plasma workspace|first desktop SLC applet release|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureDone|System Tray|System tray with interface in QML|dmitry.ashkadov@gmail.com|Dmitry Ashkadov}}&lt;br /&gt;
{{FeatureTodo|plasma workspace|Top-rated documents for Task Manager|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|systemsettings|Keyboard layout preview|amourphious1992@gmail.com|Shivam Makkar}}&lt;br /&gt;
{{FeatureInProgress|window manager|Rework and optimize vertex specification|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|window manager|Dynamic shader generation|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|window manager|Partial port to xcb|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|window manager|New launch feedback effect|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|activities|Encrypted activities|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|powerdevil|Overhaul powerdevil notifications|kde@privat.broulik.de|Kai Uwe Broulik}}&lt;br /&gt;
{{FeatureInProgress|powerdevil|Improve profile error handling (DPMS)|kde@privat.broulik.de|Kai Uwe Broulik}}&lt;br /&gt;
{{FeatureTodo|plasma workspace|Social Feed|mklapetek@kde.org|Martin Klapetek}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|FolderView|Split into PopupApplet and Containment|ignat.semenov@blue-systems.com|Ignat Semenov}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|FolderView|Port to QML|ignat.semenov@blue-systems.com|Ignat Semenov}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Dolphin|Implement files quick preview feature (named Klook)  |evgeniy.augin@osinit.ru|Evgeniy Auzhin}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Dolphin|Implement parallel sort algorithm|emmanuelpescosta099@gmail.com|Emmanuel Pescosta}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Dolphin|Add GUI option for the &amp;quot;Rename Inline&amp;quot; setting|frank78ac@googlemail.com|Frank Reininghaus}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Dolphin|Add &amp;quot;Icon Size&amp;quot; submenu to the Places Panel context menu|frank78ac@googlemail.com|Frank Reininghaus}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|print-manager|New Print manager KCM and applet (plasmoid) replacement, using C++  |dantti12@gmail.com|Daniel Nicoletti}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate|Support for Python plugins|srhaque@theiet.org|Shaheed Haque}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate|Advanced gid(1) plugin using both ID files and etags|srhaque@theiet.org|Shaheed Haque}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Kate|As-you-type search for the search plugin|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Kate|Session name API for plugins + automatic ctags database naming|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Kate|Add optional document &amp;quot;minimap&amp;quot; to the Symbols view plugin|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Kate|Vim Mode Macro support|kdedevel@etothepiplusone.com|Simon St James}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate|Built-in quick open (Ctrl+Alt+o)|kwrite-devel@kde.org|Christoph Cullmann}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate|[http://kate-editor.org/2012/11/02/using-the-projects-plugin-in-kate/ New Project Plugin]|kwrite-devel@kde.org|Christoph Cullmann}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|[http://kate-editor.org/2012/10/28/show-line-while-scrolling/ Show line while scrolling]|kwrite-devel@kde.org|D. Haumann/J. Wenninger}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|[http://kate-editor.org/2012/10/27/remove-trailing-spaces/ Improved remove trailing spaces on save]|kwrite-devel@kde.org|Dominik Haumann}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|[http://kate-editor.org/2012/11/07/default-color-schemas/ Predefined color schemes]|kwrite-devel@kde.org|C. Cullmann/D. Haumann}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|[http://kate-editor.org/2012/11/06/kate-scripting-updates-zen-like-quick-coding/ Improved Scripting Support]|kwrite-devel@kde.org|C. Cullmann/D. Haumann}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|[http://kate-editor.org/2012/11/06/passive-notifications-in-kate-part/ Passive Notification System]|kwrite-devel@kde.org|Dominik Haumann}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|[http://kate-editor.org/2012/11/05/loading-remote-files/ Loading Remote File Notification]|kwrite-devel@kde.org|Christoph Cullmann}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Kdialog|Add support for detailedsorry/detailederror messages|kde@privat.broulik.de|Kai Uwe Broulik}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Konsole|Improve the search filter bar|francesco.cecconi@gmail.com|Francesco Cecconi}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Konsole|Add the --separate cmdline option for running in new process|adaptee@gmail.com|Jekyll Wu}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Konsole|Make the d&amp;amp;d popup menu optional|adaptee@gmail.com|Jekyll Wu}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Konqueror|Settings for WebKit Part|sandfeld@kde.org|Allan Sandfeld}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Marble|Have support for &amp;quot;repeatX&amp;quot; in the projection classes|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Satellite Map NG|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Mars &amp;amp; Venus satellite plugin|rahn@kde.org|Torsten Rahn / Gerhard Holtkamp}}&lt;br /&gt;
{{FeatureTodo|Marble|Solar Eclipse Plugin|rahn@kde.org|Torsten Rahn / Gerhard Holtkamp}}&lt;br /&gt;
{{FeatureTodo|Marble|Help Menu polishing / Support page inclusion|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Toolbar polishing/refactoring|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Solar Eclipse Plugin|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Worldwide hillshading|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Extended library API (no MarbleWidget dependency for tasks like parsing, routing)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Marble Touch on Plasma Active|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Foursquare plugin|utkuaydin34@gmail.com|Utku Aydın}}&lt;br /&gt;
{{FeatureTodo|Marble|Marble Touch on Android (including SOK branch merge)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Support for loading geolocated photos (e.g. in a Gallery activity in Marble Touch)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Layer Management (by the user: Toggle layer visibility; maybe move layers from legend and layers in menus to one central place/tab)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|OSM vector rendering (GSOC branch merge)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Zoom to content of geo file after loading (at least on start-up)|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Marble|Geo files thumbnailer|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Marble|Geo files metadata extractor|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Rocs|Improve project handling: load/save dialogs, add project journal.|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Support TGF (trivial graph format) documents for import/export.|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Support core features for DOT/Graphvis documents for import/export.|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Add TikZ/PGF graphic export.|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Main Window UI Reorganization: Editor Toolbar, dialogs, Information Panel|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Configuration Dialog Optimizations: Code-Editor, Graph Editor|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Data Structure Backend wise iconsets and preconfigurations for types|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Printing and image export of graphs.|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Data Structure Snapshot and Recovery.|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Visual Graph Editor Handling: copy&amp;amp;paste, data structure focus, property display|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|KTouch|Ship ktouch/next|sebastiangottfried@web.de|Sebastian Gottfried}}&lt;br /&gt;
{{FeatureDone|KTouch|Smart resizing of training screen with aligned vertical lines|sebastiangottfried@web.de|Sebastian Gottfried}}&lt;br /&gt;
{{FeatureDone|KTouch|Prominent hint during training if the user makes repeatedly errors|sebastiangottfried@web.de|Sebastian Gottfried}}&lt;br /&gt;
{{FeatureDone|KTouch|Show course descriptions in course selector|sebastiangottfried@web.de|Sebastian Gottfried}}&lt;br /&gt;
{{FeatureDone|KTouch|Show a message when keyboard layout visualization isn't available due missing data|sebastiangottfried@web.de|Sebastian Gottfried}}&lt;br /&gt;
{{FeatureDone|Analitza|New plotting framework|percy.camilo.ta@gmail.com|Percy Camilo Triveño Aucahuasi}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Splitted the QML Components from KAlgebraMobile|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureDone|KAlgebra|New plotting plasmoid graphs, in QtQuick|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureDone|Pairs|Pairs Theme editor|marco.calignano@gmail.com|Marco Calignano}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Python backend|filipe@kde.org|Filipe Saraiva}}&lt;br /&gt;
{{FeatureInProgress|Kig|Mark right angles|david.narvaez@computer.org|David E. Narváez}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|libkdegames|[http://community.kde.org/KDE_Games/API_cleanup Major cleanup and rewrite] (done, except for the new highscore classes)&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;'''Release team:''' please link to the [[Projects/Games/Porting_to_libkdegames_v5|porting instructions]]  for third-party developers|stefan.majewsky@googlemail.com|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Use KGameRenderer and QGraphicsView for all graphics: the gameplay is the same as before.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Remove the status bar. All scores and status messages are in the viewport now.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Allow the displayed speed of moves to be adjusted.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Animate multi-stage moves, to make it easier for a human player to follow their progress.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Show multi-stage moves in an order that is easier to follow.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Validate the loading of saved games and report errors.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Rewrite the main AI class and make it use a true Minimax method.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Provide a choice of two AI styles, Kepler and Newton, with the possibility to add more.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Add settings to choose computer player, AI style and skill level for either or both of players 1 and 2.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Add board sizes 3x3 and 4x4, for simplified play.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Add a simple Print facility for KSudoku puzzles.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|libkipi|[http://www.google-melange.com/gsoc/proposal/review/google/gsoc2012/dodonvictor/10002 Porting libkipi to KDE-XML GUI]|dodonvictor@gmail.com|Victor Dodon}}&lt;br /&gt;
{{FeatureInProgress|okular|Tiled rendering|okular-devel@kde.org|Okular Developers}}&lt;br /&gt;
{{FeatureDone|Gwenview|Recursive importer|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureDone|Gwenview|Color profile support|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Juk|[http://community.kde.org/Juk#Porting_plan Port Juk away from kde3support]|martin.sandsmark@kde.org|Martin Sandsmark}}&lt;br /&gt;
{{FeatureDone|Juk|Add lyrics view|martin.sandsmark@kde.org|Martin Sandsmark}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KGet|Metalink/HTTP Support|dahalaishraj@gmail.com|Aish Raj Dahal}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Facebook resource|Include it in default install|martin.klapetek@gmail.com|Martin Klapetek}}&lt;br /&gt;
{{FeatureInProgress|Akregator2|Merge in kdepim|montel@kde.org|Montel Laurent}}&lt;br /&gt;
{{FeatureInProgress|Knode|Merge in KMail|montel@kde.org|Montel Laurent}}&lt;br /&gt;
{{FeatureInProgress|BackupMail|Extend backup to all kdepim apps|montel@kde.org|Montel Laurent}}&lt;br /&gt;
{{FeatureInProgress|Sieve|Rewrite dialogbox|montel@kde.org|Montel Laurent}}&lt;br /&gt;
{{FeatureInProgress|libs|Move folderview to kdepimlibs/akonadi|montel@kde.org|Montel Laurent}}&lt;br /&gt;
{{FeatureInProgress|kolab-resource|Make Kolab 3.0 option available|mollekopf@kolabsys.com|Christian Mollekopf}}&lt;br /&gt;
{{FeatureDone|KAlarm|Add command line and D-Bus option to output list of scheduled alarms|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Microblog|replace with QML version|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureTodo|StackFolder|Add applet for quick browse the stack of folders|ural.mullabaev@rosalab.ru|Ural Mullabaev}}&lt;br /&gt;
{{FeatureDone|ComicStrip|Replace with QML version|rshah0385@kireihana.com|Reza Fatahilah Shah}}&lt;br /&gt;
{{FeatureDone|Calculator|Replace with QML version|luizromario@gmail.com|Luiz Romário Santana Rios}}&lt;br /&gt;
{{FeatureDone|QML Wallpapers|Make it possible to have animated wallpapers written in QtQuick technologies.|aleixpol@blue-systems.com|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureDone|Dictionary KRunner|Look up words in the dictionary by typing in 'define {word}' in krunner.|Jason@zx2c4.com|Jason A. Donenfeld}}&lt;br /&gt;
{{FeatureInProgress|Eyes|replace with QML version|bettio@kde.org|Davide Bettio}}&lt;br /&gt;
{{FeatureInProgress|FifteenPuzzle|replace with QML version|bettio@kde.org|Davide Bettio}}&lt;br /&gt;
{{FeatureInProgress|Luna|replace with QML version|bettio@kde.org|Davide Bettio}}&lt;br /&gt;
{{FeatureInProgress|Timer|replace with QML version|bettio@kde.org|Davide Bettio}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureInProgress|Okteta|Add tagged unions to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureInProgress|Okteta|Add array indices to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureDone|Umbrello|Line based diagram grid |ralf.habacker@freenet.de|Ralf Habacker}}&lt;br /&gt;
{{FeatureTodo|Umbrello| widget resize and diagram auto resize feature |ralf.habacker@freenet.de|Ralf Habacker}}&lt;br /&gt;
{{FeatureTodo|Umbrello|add spline based association lines to avoid autolayout widget/line overlapping (needs volunteers)|ralf.habacker@freenet.de|Ralf Habacker}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Ark|Make it possible to disable internal previewer|kde@privat.broulik.de|Kai Uwe Broulik}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Getting_Started/Using_Project_Neon_to_contribute_to_KDE</id>
		<title>Getting Started/Using Project Neon to contribute to KDE</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Getting_Started/Using_Project_Neon_to_contribute_to_KDE"/>
				<updated>2012-11-20T14:54:01Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Using Project Neon version of KDE Workspace */ project-neon-session -&amp;gt; project-neon-base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://launchpad.net/project-neon Project Neon] is a nightly build of the latest KDE trunk for Ubuntu. It is an easy way for new contributors to KDE to get started without having to download and build the entire KDE source code tree. Additionally, dependencies are automatically handled and updated. This is suitable for new developers, translators, usability designers, documenters, promoters, bug triagers, etc. This process makes the steps detailed on [[Getting_Started/Build|this page]].&lt;br /&gt;
&lt;br /&gt;
However, for developers, it may at some point become necessary to build more components from source code as you become more involved in the project. The [[Getting_Started/Build/kdesrc-build|kdesrc-build]] script is an easy way to build all or parts of KDE from its source code repositories.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Project Neon always requires either the latest stable Kubuntu release or the development release. Previous versions of Kubuntu are not supported. &lt;br /&gt;
&lt;br /&gt;
== Installing Project Neon ==&lt;br /&gt;
&lt;br /&gt;
To use Project Neon, add the following PPA (Personal Package Archive) to your &amp;lt;tt&amp;gt;sources.list&amp;lt;/tt&amp;gt; using your preferred method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo add-apt-repository ppa:neon/ppa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Project neon nightly KDE4 build&lt;br /&gt;
deb http://ppa.launchpad.net/neon/ppa/ubuntu maverick main&lt;br /&gt;
&lt;br /&gt;
#above repository is PGP signed, refer to below link for getting PGP key&lt;br /&gt;
https://launchpad.net/~neon/+archive/ppa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After that, you can simply install the nightly package of whichever modules you want to work on. The packages are named project-neon-&amp;lt;git/svn module name&amp;gt;. The packages are installed in /opt/project-neon/ and won't affect your stable KDE install.&lt;br /&gt;
&lt;br /&gt;
You can install all of the packages or just the ones you are interested in, depending on what you want to use them for.&lt;br /&gt;
&lt;br /&gt;
=== Using Project Neon version of KDE Workspace ===&lt;br /&gt;
&lt;br /&gt;
To use Project Neon version of KDE Workspace, install the &amp;lt;tt&amp;gt;project-neon-base&amp;lt;/tt&amp;gt; package. You can then log out, select the &amp;quot;Project Neon&amp;quot; session in KDM session list and log in.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-base&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also install other KDE Workspace goodies, such as extra plasmoids, with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-kdeplasma-addons&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing individual applications ===&lt;br /&gt;
&lt;br /&gt;
If you are only interested in application development in another module, you can install just the module package.&lt;br /&gt;
&lt;br /&gt;
First install &amp;lt;tt&amp;gt;project-neon-utils&amp;lt;/tt&amp;gt;. This package contains a number of utilities among which &amp;lt;tt&amp;gt;neon-env&amp;lt;/tt&amp;gt;, which is needed to run Project Neon applications:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-utils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can then install the package for the module you are interested in. For example to test the latest version of kdepim applications:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-kdepim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That command will also install the &amp;lt;tt&amp;gt;kdelibs&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;kdepimlibs&amp;lt;/tt&amp;gt; and other dependencies too. In your regular (stable) KDE session you can now set up Project Neon environment and run the nightly version of your chosen application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
neon-env&lt;br /&gt;
kmail&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;neon-env&amp;lt;/tt&amp;gt; will setup the environment and start a subshell from which you can work with your project neon installation.&lt;br /&gt;
This will correctly use the nightly version of libraries instead of using the stable versions, so no other changes are necessary to your library path etc.&lt;br /&gt;
You'll need to close the terminal session for the settings to be undone.&lt;br /&gt;
&lt;br /&gt;
Note that settings for applications that you run from project neon do not conflict with your regular application settings and data. &amp;lt;tt&amp;gt;.project-neon-kde/&amp;lt;/tt&amp;gt; is used instead of &amp;lt;tt&amp;gt;.kde/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for development ==&lt;br /&gt;
&lt;br /&gt;
If you are joining one of the development teams in KDE, you will need a real SVN/GIT checkout in order to contribute your code back to the project and create patches easily. If you only code for KDE every now and then, Project Neon provides some extra tools for this purpose in the package &amp;lt;tt&amp;gt;project-neon-utils&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
NOTE: both neon-cmake and neonmake require neon-env to be run first!&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;neon-env&amp;lt;/tt&amp;gt; - sets up the necessary environment settings for project neon builds and opens a subshell.&lt;br /&gt;
* &amp;lt;tt&amp;gt;neon-cmake&amp;lt;/tt&amp;gt; - cmake wrapper with neon environment settings for cmake, same synopsis as cmake and passes arguments to cmake&lt;br /&gt;
* &amp;lt;tt&amp;gt;neonmake&amp;lt;/tt&amp;gt; - convenience script which will create a build folder, configure the source, build it and install it in /opt/project-neon/ so you can test your changes.&lt;br /&gt;
* &amp;lt;tt&amp;gt;neon-clean&amp;lt;/tt&amp;gt; - script that resets any changes you made to /opt/project-neon after installing the packages. Since this script reinstalls the packages it might require a working internet connection.&lt;br /&gt;
* &amp;lt;tt&amp;gt;neonbuild&amp;lt;/tt&amp;gt; - pbuilder/pdebuild wrapper to rebuild a neon package in a chroot. Takes the same options as pbuilder. If no pbuilder action is given pdebuild is run instead.&lt;br /&gt;
&lt;br /&gt;
=== Options for cmake/make ===&lt;br /&gt;
You can change the cmake and make options used by setting these variables in ~/.neonrc:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;NEON_CMAKE_OPTS=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt; - Here you can add additional cmake options that should be used together with the default neon options.&lt;br /&gt;
* &amp;lt;tt&amp;gt;NEON_CMAKE_OVERRIDE=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt; - If you set this variable cmake will ignore the default neon options and only use the ones in NEON_CMAKE_OVERRIDE.&lt;br /&gt;
* &amp;lt;tt&amp;gt;NEON_MAKE_OVERRIDE=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt; - If you set this variable make in neonmake will only use your options. By default make uses '-j CPUs+1'&lt;br /&gt;
&lt;br /&gt;
=== Debugging symbols ===&lt;br /&gt;
The debugging symbols for every package are in its corresponding &amp;lt;code&amp;gt;-dbg&amp;lt;/code&amp;gt; package, so to install the debugging symbols for kdelibs you can use&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-kdelibs-dbg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are already using a nightly package of the module you want to develop for, you should remove that and checkout the development version. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Remove the packaged nightly version&lt;br /&gt;
sudo apt-get purge project-neon-kdepim&lt;br /&gt;
&lt;br /&gt;
# Add below Project Neon source code repository to sources.list if you didn't use add-apt-repository&lt;br /&gt;
deb-src http://ppa.launchpad.net/neon/ppa/ubuntu maverick main&lt;br /&gt;
&lt;br /&gt;
# Get the dependencies for building kdepim&lt;br /&gt;
sudo apt-get build-dep project-neon-kdepim&lt;br /&gt;
cd ~&lt;br /&gt;
# You may choose to do your development in a different folder.&lt;br /&gt;
cd Development&lt;br /&gt;
# Gets the latest version of the kdepim module.&lt;br /&gt;
git clone git://anongit.kde.org/kdepim&lt;br /&gt;
cd kdepim&lt;br /&gt;
# Set up neon environment&lt;br /&gt;
neon-env&lt;br /&gt;
# Shortcut provided by Project Neon to make the module&lt;br /&gt;
# and install it to the prefix /opt/project-neon/&lt;br /&gt;
neonmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you should usually checkout a module from KDE, not an application. Most modules contain libraries shared within the module and which are necessary to build the applications in the module.&lt;br /&gt;
&lt;br /&gt;
Also note that when using apt-get build-dep it will always get all build-depends, so watch out that it doesn't install a component you want to build yourself as that would overwrite your changes should you install the packages after installing your build. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for translation ==&lt;br /&gt;
&lt;br /&gt;
The Project Neon nightly packages include English language strings only. Translated packages are not available. However, if you are translating KDE applications, you can install the translations from KDE SVN in your normal workflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
cd Translations&lt;br /&gt;
# The -N switch checks out only the top level directory from svn.&lt;br /&gt;
svn co -N svn://anonsvn.kde.org/home/kde/trunk/l10n-kde4&lt;br /&gt;
cd l10n-kde4&lt;br /&gt;
# scripts necessary to build translations.&lt;br /&gt;
svn up scripts&lt;br /&gt;
# Get the German translations&lt;br /&gt;
svn up de&lt;br /&gt;
# Generate the build files for the German language pack - if you get a message&lt;br /&gt;
# that revpath couldn't be found you need to install the xutils-dev package&lt;br /&gt;
./scripts/autogen.sh de&lt;br /&gt;
cd de&lt;br /&gt;
neon-env&lt;br /&gt;
neonmake&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After building the translations it is possible to either change the language in system settings, or run applications in another language using the environment variable &amp;lt;tt&amp;gt;KDE_LANG&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
switchtonightly # or neon-env&lt;br /&gt;
KDE_LANG=de kmail&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exit the shell to reset the settings.&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for documentation ==&lt;br /&gt;
&lt;br /&gt;
The Project Neon nightly source packages include the official KDE User Documentation in English.&lt;br /&gt;
&lt;br /&gt;
TODO: How to build user docs from SVN.&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for promotion ==&lt;br /&gt;
&lt;br /&gt;
If you are creating screenshots or screencasts of the latest version of KDE, project Neon is a simple and fast way of getting a default KDE4 session.&lt;br /&gt;
&lt;br /&gt;
The KDE Promotion team recommends using the default background, theme, icons etc when preparing official promotional materials (unless the feature you are showing is related to configuring KDE artwork). Project Neon uses the default artwork that comes with KDE4, so it is useful for creating promo materials.&lt;br /&gt;
&lt;br /&gt;
Here is a shortcut to get all available modules from the PPA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The application [http://ariya.blogspot.com/2008/06/creating-fancy-screenshots-with.html screenie] is provided since Kubuntu 8.10 as &amp;lt;tt&amp;gt;screenie-qt&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install screenie-qt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Contact the Team ==&lt;br /&gt;
&lt;br /&gt;
You can reach the Project Neon team on IRC in &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;#project-neon on irc.freenode.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
by mail at &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;neon@lists.launchpad.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or you can ask a question on [https://answers.launchpad.net/project-neon launchpad]&lt;br /&gt;
&lt;br /&gt;
If you think there is a bug in our packaging of the provided software you can file a bug on [https://bugs.launchpad.net/project-neon launchpad]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.kubuntu.org/Kubuntu/ProjectNeon Team page in the Kubuntu Wiki]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KIO_Slaves/Hello_World</id>
		<title>Development/Tutorials/KIO Slaves/Hello World</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KIO_Slaves/Hello_World"/>
				<updated>2012-11-20T12:34:19Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Compile the stuff */ fix typo &amp;amp; use generic way to find Qt include dir&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Understanding =&lt;br /&gt;
A kioslave allows you to represent any kind of storage in a way you want. As an example, the kio_http kioslave loads data from the network over the http (protocol) and shows it rendered as html. Technically, a kioslave is a shared object plus its description. E.g. the imap4 kioslave consist of the following files:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
tweedleburg:/usr/local # find -iname &amp;quot;*imap4*&amp;quot;&lt;br /&gt;
./lib/kde4/kio_imap4.so&lt;br /&gt;
./share/kde4/services/imap4.protocol&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= The files =&lt;br /&gt;
We want to write a &amp;quot;hello world&amp;quot; kioslave here. This can be seen as a learning exercise and as a template for future programming projects.&lt;br /&gt;
&lt;br /&gt;
== CMakeLists.txt ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
PROJECT( tutorial )&lt;br /&gt;
FIND_PACKAGE(KDE4 REQUIRED)&lt;br /&gt;
INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} . )&lt;br /&gt;
&lt;br /&gt;
set(kio_hello_PART_SRCS&lt;br /&gt;
   hello.cpp)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kio_hello ${kio_hello_PART_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kio_hello ${KDE4_KIO_LIBS})&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kio_hello  DESTINATION ${PLUGIN_INSTALL_DIR})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
########### install files ###############&lt;br /&gt;
&lt;br /&gt;
install(FILES hello.protocol DESTINATION ${SERVICES_INSTALL_DIR})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== hello.h ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef HELLO_H&lt;br /&gt;
#define HELLO_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;kio/slavebase.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
  This class implements a hello-world kioslave&lt;br /&gt;
 */&lt;br /&gt;
class hello : public KIO::SlaveBase&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    hello( const QByteArray &amp;amp;pool, const QByteArray &amp;amp;app );&lt;br /&gt;
    void get( const KUrl &amp;amp;url );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== hello.cpp ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;hello.h&amp;quot;&lt;br /&gt;
#include &amp;lt;kdebug.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kcomponentdata.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot; int KDE_EXPORT kdemain( int argc, char **argv )&lt;br /&gt;
{&lt;br /&gt;
  kDebug(7000) &amp;lt;&amp;lt; &amp;quot;Entering function&amp;quot;;&lt;br /&gt;
  KComponentData instance( &amp;quot;kio_hello&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
  if (argc != 4)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf( stderr, &amp;quot;Usage: kio_hello protocol domain-socket1 domain-socket2\n&amp;quot;);&lt;br /&gt;
    exit( -1 );&lt;br /&gt;
  }&lt;br /&gt;
  hello slave( argv[2], argv[3] );&lt;br /&gt;
  slave.dispatchLoop();&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void hello::get( const KUrl &amp;amp;url )&lt;br /&gt;
{&lt;br /&gt;
  kDebug(7000) &amp;lt;&amp;lt; &amp;quot;Entering function&amp;quot;;&lt;br /&gt;
  mimeType( &amp;quot;text/plain&amp;quot; );&lt;br /&gt;
  QByteArray str( &amp;quot;Hello_world&amp;quot; );&lt;br /&gt;
  data( str );&lt;br /&gt;
  finished();&lt;br /&gt;
  kDebug(7000) &amp;lt;&amp;lt; &amp;quot;Leaving function&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
hello::hello( const QByteArray &amp;amp;pool, const QByteArray &amp;amp;app )&lt;br /&gt;
: SlaveBase( &amp;quot;hello&amp;quot;, pool, app ) {}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== hello.protocol == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[Protocol]&lt;br /&gt;
DocPath=kioslave/kio_hello.html&lt;br /&gt;
exec=kio_hello&lt;br /&gt;
input=none&lt;br /&gt;
output=filesystem&lt;br /&gt;
protocol=hello&lt;br /&gt;
reading=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compile the stuff ==&lt;br /&gt;
Create a new Folder &amp;quot;build&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Run cmake and make&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cmake ..&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
now you can install it (maybe you should use an experimental setup?)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to do this by hand:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
g++ -shared -lkdeui -lkio -lkdecore -fPIC -I$(qmake -query QT_INSTALL_HEADERS) hello.cpp -o kio_hello.so&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Install the stuff ==&lt;br /&gt;
&lt;br /&gt;
Now you can install it (maybe you should use an experimental setup?):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or if you want to install it to your system:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course you can also do this by hand.&lt;br /&gt;
&lt;br /&gt;
Find out where your protocols are lying:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kde4-config --path services&lt;br /&gt;
  /usr/share/kde4/services/&lt;br /&gt;
&lt;br /&gt;
kde4-config --path module&lt;br /&gt;
  /usr/lib64/kde4/&lt;br /&gt;
&lt;br /&gt;
cp kio_hello.so /usr/local/lib/kde4/&lt;br /&gt;
cp kio_hello.so /usr/lib64/kde4/&lt;br /&gt;
cp kio_hello.protocol /usr/share/kde4/services/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Test it =&lt;br /&gt;
== In Konqueror ==&lt;br /&gt;
Start kinfocenter, choose hello as protocol. If this is possible, start konqueror, type hello:/// into the URL bar.&lt;br /&gt;
== On the command line ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kioclient 'cat' 'hello:///'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Getting_Started/Using_Project_Neon_to_contribute_to_KDE</id>
		<title>Getting Started/Using Project Neon to contribute to KDE</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Getting_Started/Using_Project_Neon_to_contribute_to_KDE"/>
				<updated>2012-11-19T17:17:40Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Installing Project Neon */ splitted &amp;quot;workspace&amp;quot; and &amp;quot;single-app&amp;quot; setup a bit more&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://launchpad.net/project-neon Project Neon] is a nightly build of the latest KDE trunk for Ubuntu. It is an easy way for new contributors to KDE to get started without having to download and build the entire KDE source code tree. Additionally, dependencies are automatically handled and updated. This is suitable for new developers, translators, usability designers, documenters, promoters, bug triagers, etc. This process makes the steps detailed on [[Getting_Started/Build|this page]].&lt;br /&gt;
&lt;br /&gt;
However, for developers, it may at some point become necessary to build more components from source code as you become more involved in the project. The [[Getting_Started/Build/kdesrc-build|kdesrc-build]] script is an easy way to build all or parts of KDE from its source code repositories.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Project Neon always requires either the latest stable Kubuntu release or the development release. Previous versions of Kubuntu are not supported. &lt;br /&gt;
&lt;br /&gt;
== Installing Project Neon ==&lt;br /&gt;
&lt;br /&gt;
To use Project Neon, add the following PPA (Personal Package Archive) to your &amp;lt;tt&amp;gt;sources.list&amp;lt;/tt&amp;gt; using your preferred method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo add-apt-repository ppa:neon/ppa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Project neon nightly KDE4 build&lt;br /&gt;
deb http://ppa.launchpad.net/neon/ppa/ubuntu maverick main&lt;br /&gt;
&lt;br /&gt;
#above repository is PGP signed, refer to below link for getting PGP key&lt;br /&gt;
https://launchpad.net/~neon/+archive/ppa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After that, you can simply install the nightly package of whichever modules you want to work on. The packages are named project-neon-&amp;lt;git/svn module name&amp;gt;. The packages are installed in /opt/project-neon/ and won't affect your stable KDE install.&lt;br /&gt;
&lt;br /&gt;
You can install all of the packages or just the ones you are interested in, depending on what you want to use them for.&lt;br /&gt;
&lt;br /&gt;
=== Using Project Neon version of KDE Workspace ===&lt;br /&gt;
&lt;br /&gt;
To use Project Neon version of KDE Workspace, install the &amp;lt;tt&amp;gt;project-neon-session&amp;lt;/tt&amp;gt; package. You can then log out, select the &amp;quot;Project Neon&amp;quot; session in KDM session list and log in.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-session&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also install other KDE Workspace goodies, such as extra plasmoids, with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-kdeplasma-addons&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing individual applications ===&lt;br /&gt;
&lt;br /&gt;
If you are only interested in application development in another module, you can install just the module package.&lt;br /&gt;
&lt;br /&gt;
First install &amp;lt;tt&amp;gt;project-neon-utils&amp;lt;/tt&amp;gt;. This package contains a number of utilities among which &amp;lt;tt&amp;gt;neon-env&amp;lt;/tt&amp;gt;, which is needed to run Project Neon applications:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-utils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can then install the package for the module you are interested in. For example to test the latest version of kdepim applications:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-kdepim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That command will also install the &amp;lt;tt&amp;gt;kdelibs&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;kdepimlibs&amp;lt;/tt&amp;gt; and other dependencies too. In your regular (stable) KDE session you can now set up Project Neon environment and run the nightly version of your chosen application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
neon-env&lt;br /&gt;
kmail&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;neon-env&amp;lt;/tt&amp;gt; will setup the environment and start a subshell from which you can work with your project neon installation.&lt;br /&gt;
This will correctly use the nightly version of libraries instead of using the stable versions, so no other changes are necessary to your library path etc.&lt;br /&gt;
You'll need to close the terminal session for the settings to be undone.&lt;br /&gt;
&lt;br /&gt;
Note that settings for applications that you run from project neon do not conflict with your regular application settings and data. &amp;lt;tt&amp;gt;.project-neon-kde/&amp;lt;/tt&amp;gt; is used instead of &amp;lt;tt&amp;gt;.kde/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for development ==&lt;br /&gt;
&lt;br /&gt;
If you are joining one of the development teams in KDE, you will need a real SVN/GIT checkout in order to contribute your code back to the project and create patches easily. If you only code for KDE every now and then, Project Neon provides some extra tools for this purpose in the package &amp;lt;tt&amp;gt;project-neon-utils&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
NOTE: both neon-cmake and neonmake require neon-env to be run first!&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;neon-env&amp;lt;/tt&amp;gt; - sets up the necessary environment settings for project neon builds and opens a subshell.&lt;br /&gt;
* &amp;lt;tt&amp;gt;neon-cmake&amp;lt;/tt&amp;gt; - cmake wrapper with neon environment settings for cmake, same synopsis as cmake and passes arguments to cmake&lt;br /&gt;
* &amp;lt;tt&amp;gt;neonmake&amp;lt;/tt&amp;gt; - convenience script which will create a build folder, configure the source, build it and install it in /opt/project-neon/ so you can test your changes.&lt;br /&gt;
* &amp;lt;tt&amp;gt;neon-clean&amp;lt;/tt&amp;gt; - script that resets any changes you made to /opt/project-neon after installing the packages. Since this script reinstalls the packages it might require a working internet connection.&lt;br /&gt;
* &amp;lt;tt&amp;gt;neonbuild&amp;lt;/tt&amp;gt; - pbuilder/pdebuild wrapper to rebuild a neon package in a chroot. Takes the same options as pbuilder. If no pbuilder action is given pdebuild is run instead.&lt;br /&gt;
&lt;br /&gt;
=== Options for cmake/make ===&lt;br /&gt;
You can change the cmake and make options used by setting these variables in ~/.neonrc:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;NEON_CMAKE_OPTS=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt; - Here you can add additional cmake options that should be used together with the default neon options.&lt;br /&gt;
* &amp;lt;tt&amp;gt;NEON_CMAKE_OVERRIDE=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt; - If you set this variable cmake will ignore the default neon options and only use the ones in NEON_CMAKE_OVERRIDE.&lt;br /&gt;
* &amp;lt;tt&amp;gt;NEON_MAKE_OVERRIDE=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt; - If you set this variable make in neonmake will only use your options. By default make uses '-j CPUs+1'&lt;br /&gt;
&lt;br /&gt;
=== Debugging symbols ===&lt;br /&gt;
The debugging symbols for every package are in its corresponding &amp;lt;code&amp;gt;-dbg&amp;lt;/code&amp;gt; package, so to install the debugging symbols for kdelibs you can use&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-kdelibs-dbg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are already using a nightly package of the module you want to develop for, you should remove that and checkout the development version. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Remove the packaged nightly version&lt;br /&gt;
sudo apt-get purge project-neon-kdepim&lt;br /&gt;
&lt;br /&gt;
# Add below Project Neon source code repository to sources.list if you didn't use add-apt-repository&lt;br /&gt;
deb-src http://ppa.launchpad.net/neon/ppa/ubuntu maverick main&lt;br /&gt;
&lt;br /&gt;
# Get the dependencies for building kdepim&lt;br /&gt;
sudo apt-get build-dep project-neon-kdepim&lt;br /&gt;
cd ~&lt;br /&gt;
# You may choose to do your development in a different folder.&lt;br /&gt;
cd Development&lt;br /&gt;
# Gets the latest version of the kdepim module.&lt;br /&gt;
git clone git://anongit.kde.org/kdepim&lt;br /&gt;
cd kdepim&lt;br /&gt;
# Set up neon environment&lt;br /&gt;
neon-env&lt;br /&gt;
# Shortcut provided by Project Neon to make the module&lt;br /&gt;
# and install it to the prefix /opt/project-neon/&lt;br /&gt;
neonmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you should usually checkout a module from KDE, not an application. Most modules contain libraries shared within the module and which are necessary to build the applications in the module.&lt;br /&gt;
&lt;br /&gt;
Also note that when using apt-get build-dep it will always get all build-depends, so watch out that it doesn't install a component you want to build yourself as that would overwrite your changes should you install the packages after installing your build. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for translation ==&lt;br /&gt;
&lt;br /&gt;
The Project Neon nightly packages include English language strings only. Translated packages are not available. However, if you are translating KDE applications, you can install the translations from KDE SVN in your normal workflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
cd Translations&lt;br /&gt;
# The -N switch checks out only the top level directory from svn.&lt;br /&gt;
svn co -N svn://anonsvn.kde.org/home/kde/trunk/l10n-kde4&lt;br /&gt;
cd l10n-kde4&lt;br /&gt;
# scripts necessary to build translations.&lt;br /&gt;
svn up scripts&lt;br /&gt;
# Get the German translations&lt;br /&gt;
svn up de&lt;br /&gt;
# Generate the build files for the German language pack - if you get a message&lt;br /&gt;
# that revpath couldn't be found you need to install the xutils-dev package&lt;br /&gt;
./scripts/autogen.sh de&lt;br /&gt;
cd de&lt;br /&gt;
neon-env&lt;br /&gt;
neonmake&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After building the translations it is possible to either change the language in system settings, or run applications in another language using the environment variable &amp;lt;tt&amp;gt;KDE_LANG&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
switchtonightly # or neon-env&lt;br /&gt;
KDE_LANG=de kmail&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exit the shell to reset the settings.&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for documentation ==&lt;br /&gt;
&lt;br /&gt;
The Project Neon nightly source packages include the official KDE User Documentation in English.&lt;br /&gt;
&lt;br /&gt;
TODO: How to build user docs from SVN.&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for promotion ==&lt;br /&gt;
&lt;br /&gt;
If you are creating screenshots or screencasts of the latest version of KDE, project Neon is a simple and fast way of getting a default KDE4 session.&lt;br /&gt;
&lt;br /&gt;
The KDE Promotion team recommends using the default background, theme, icons etc when preparing official promotional materials (unless the feature you are showing is related to configuring KDE artwork). Project Neon uses the default artwork that comes with KDE4, so it is useful for creating promo materials.&lt;br /&gt;
&lt;br /&gt;
Here is a shortcut to get all available modules from the PPA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The application [http://ariya.blogspot.com/2008/06/creating-fancy-screenshots-with.html screenie] is provided since Kubuntu 8.10 as &amp;lt;tt&amp;gt;screenie-qt&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install screenie-qt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Contact the Team ==&lt;br /&gt;
&lt;br /&gt;
You can reach the Project Neon team on IRC in &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;#project-neon on irc.freenode.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
by mail at &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;neon@lists.launchpad.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or you can ask a question on [https://answers.launchpad.net/project-neon launchpad]&lt;br /&gt;
&lt;br /&gt;
If you think there is a bug in our packaging of the provided software you can file a bug on [https://bugs.launchpad.net/project-neon launchpad]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.kubuntu.org/Kubuntu/ProjectNeon Team page in the Kubuntu Wiki]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Getting_Started/Using_Project_Neon_to_contribute_to_KDE</id>
		<title>Getting Started/Using Project Neon to contribute to KDE</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Getting_Started/Using_Project_Neon_to_contribute_to_KDE"/>
				<updated>2012-11-19T16:36:20Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Installing Project Neon */ Clarify where neon-env comes from (got bitten by that)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://launchpad.net/project-neon Project Neon] is a nightly build of the latest KDE trunk for Ubuntu. It is an easy way for new contributors to KDE to get started without having to download and build the entire KDE source code tree. Additionally, dependencies are automatically handled and updated. This is suitable for new developers, translators, usability designers, documenters, promoters, bug triagers, etc. This process makes the steps detailed on [[Getting_Started/Build|this page]].&lt;br /&gt;
&lt;br /&gt;
However, for developers, it may at some point become necessary to build more components from source code as you become more involved in the project. The [[Getting_Started/Build/kdesrc-build|kdesrc-build]] script is an easy way to build all or parts of KDE from its source code repositories.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Project Neon always requires either the latest stable Kubuntu release or the development release. Previous versions of Kubuntu are not supported. &lt;br /&gt;
&lt;br /&gt;
== Installing Project Neon ==&lt;br /&gt;
&lt;br /&gt;
To use Project Neon, add the following PPA (Personal Package Archive) to your &amp;lt;tt&amp;gt;sources.list&amp;lt;/tt&amp;gt; using your preferred method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo add-apt-repository ppa:neon/ppa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Project neon nightly KDE4 build&lt;br /&gt;
deb http://ppa.launchpad.net/neon/ppa/ubuntu maverick main&lt;br /&gt;
&lt;br /&gt;
#above repository is PGP signed, refer to below link for getting PGP key&lt;br /&gt;
https://launchpad.net/~neon/+archive/ppa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After that, you can simply install the nightly package of whichever modules you want to work on. The packages are named project-neon-&amp;lt;git/svn module name&amp;gt;. The packages are installed in /opt/project-neon/ and won't affect your stable KDE install.&lt;br /&gt;
&lt;br /&gt;
You can install all of the packages or just the ones you are interested in, depending on what you want to use them for. For example if you want to install the KDE Workspace with the extra plasmoids, you would install the &amp;lt;tt&amp;gt;project-neon-kdeplasma-addons&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;project-neon-session&amp;lt;/tt&amp;gt; so you get KDM support for Project Neon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-kdeplasma-addons project-neon-session&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are only interested in application development in another module, you can install just the module package.&lt;br /&gt;
&lt;br /&gt;
First install &amp;lt;tt&amp;gt;project-neon-utils&amp;lt;/tt&amp;gt;. This package installs a number of utilities, among which &amp;lt;tt&amp;gt;neon-env&amp;lt;/tt&amp;gt;, which is needed to run Project Neon applications:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-utils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can then install the package for the module you are interested in. For example to test the latest version of kdepim applications:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-kdepim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That command will also install the &amp;lt;tt&amp;gt;kdelibs&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;kdepimlibs&amp;lt;/tt&amp;gt; and other dependencies too. In your regular (stable) KDE session you can now set up Project Neon environment and run the nightly version of your chosen application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
neon-env&lt;br /&gt;
kmail&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;neon-env&amp;lt;/tt&amp;gt; will setup the environment and start a subshell from which you can work with your project neon installation.&lt;br /&gt;
This will correctly use the nightly version of libraries instead of using the stable versions, so no other changes are necessary to your library path etc.&lt;br /&gt;
You'll need to close the terminal session for the settings to be undone.&lt;br /&gt;
&lt;br /&gt;
Note that settings for applications that you run from project neon do not conflict with your regular application settings and data. &amp;lt;tt&amp;gt;.project-neon-kde/&amp;lt;/tt&amp;gt; is used instead of &amp;lt;tt&amp;gt;.kde/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for development ==&lt;br /&gt;
&lt;br /&gt;
If you are joining one of the development teams in KDE, you will need a real SVN/GIT checkout in order to contribute your code back to the project and create patches easily. If you only code for KDE every now and then, Project Neon provides some extra tools for this purpose in the package &amp;lt;tt&amp;gt;project-neon-utils&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
NOTE: both neon-cmake and neonmake require neon-env to be run first!&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;neon-env&amp;lt;/tt&amp;gt; - sets up the necessary environment settings for project neon builds and opens a subshell.&lt;br /&gt;
* &amp;lt;tt&amp;gt;neon-cmake&amp;lt;/tt&amp;gt; - cmake wrapper with neon environment settings for cmake, same synopsis as cmake and passes arguments to cmake&lt;br /&gt;
* &amp;lt;tt&amp;gt;neonmake&amp;lt;/tt&amp;gt; - convenience script which will create a build folder, configure the source, build it and install it in /opt/project-neon/ so you can test your changes.&lt;br /&gt;
* &amp;lt;tt&amp;gt;neon-clean&amp;lt;/tt&amp;gt; - script that resets any changes you made to /opt/project-neon after installing the packages. Since this script reinstalls the packages it might require a working internet connection.&lt;br /&gt;
* &amp;lt;tt&amp;gt;neonbuild&amp;lt;/tt&amp;gt; - pbuilder/pdebuild wrapper to rebuild a neon package in a chroot. Takes the same options as pbuilder. If no pbuilder action is given pdebuild is run instead.&lt;br /&gt;
&lt;br /&gt;
=== Options for cmake/make ===&lt;br /&gt;
You can change the cmake and make options used by setting these variables in ~/.neonrc:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;NEON_CMAKE_OPTS=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt; - Here you can add additional cmake options that should be used together with the default neon options.&lt;br /&gt;
* &amp;lt;tt&amp;gt;NEON_CMAKE_OVERRIDE=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt; - If you set this variable cmake will ignore the default neon options and only use the ones in NEON_CMAKE_OVERRIDE.&lt;br /&gt;
* &amp;lt;tt&amp;gt;NEON_MAKE_OVERRIDE=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt; - If you set this variable make in neonmake will only use your options. By default make uses '-j CPUs+1'&lt;br /&gt;
&lt;br /&gt;
=== Debugging symbols ===&lt;br /&gt;
The debugging symbols for every package are in its corresponding &amp;lt;code&amp;gt;-dbg&amp;lt;/code&amp;gt; package, so to install the debugging symbols for kdelibs you can use&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-kdelibs-dbg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are already using a nightly package of the module you want to develop for, you should remove that and checkout the development version. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Remove the packaged nightly version&lt;br /&gt;
sudo apt-get purge project-neon-kdepim&lt;br /&gt;
&lt;br /&gt;
# Add below Project Neon source code repository to sources.list if you didn't use add-apt-repository&lt;br /&gt;
deb-src http://ppa.launchpad.net/neon/ppa/ubuntu maverick main&lt;br /&gt;
&lt;br /&gt;
# Get the dependencies for building kdepim&lt;br /&gt;
sudo apt-get build-dep project-neon-kdepim&lt;br /&gt;
cd ~&lt;br /&gt;
# You may choose to do your development in a different folder.&lt;br /&gt;
cd Development&lt;br /&gt;
# Gets the latest version of the kdepim module.&lt;br /&gt;
git clone git://anongit.kde.org/kdepim&lt;br /&gt;
cd kdepim&lt;br /&gt;
# Set up neon environment&lt;br /&gt;
neon-env&lt;br /&gt;
# Shortcut provided by Project Neon to make the module&lt;br /&gt;
# and install it to the prefix /opt/project-neon/&lt;br /&gt;
neonmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you should usually checkout a module from KDE, not an application. Most modules contain libraries shared within the module and which are necessary to build the applications in the module.&lt;br /&gt;
&lt;br /&gt;
Also note that when using apt-get build-dep it will always get all build-depends, so watch out that it doesn't install a component you want to build yourself as that would overwrite your changes should you install the packages after installing your build. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for translation ==&lt;br /&gt;
&lt;br /&gt;
The Project Neon nightly packages include English language strings only. Translated packages are not available. However, if you are translating KDE applications, you can install the translations from KDE SVN in your normal workflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
cd Translations&lt;br /&gt;
# The -N switch checks out only the top level directory from svn.&lt;br /&gt;
svn co -N svn://anonsvn.kde.org/home/kde/trunk/l10n-kde4&lt;br /&gt;
cd l10n-kde4&lt;br /&gt;
# scripts necessary to build translations.&lt;br /&gt;
svn up scripts&lt;br /&gt;
# Get the German translations&lt;br /&gt;
svn up de&lt;br /&gt;
# Generate the build files for the German language pack - if you get a message&lt;br /&gt;
# that revpath couldn't be found you need to install the xutils-dev package&lt;br /&gt;
./scripts/autogen.sh de&lt;br /&gt;
cd de&lt;br /&gt;
neon-env&lt;br /&gt;
neonmake&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After building the translations it is possible to either change the language in system settings, or run applications in another language using the environment variable &amp;lt;tt&amp;gt;KDE_LANG&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
switchtonightly # or neon-env&lt;br /&gt;
KDE_LANG=de kmail&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exit the shell to reset the settings.&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for documentation ==&lt;br /&gt;
&lt;br /&gt;
The Project Neon nightly source packages include the official KDE User Documentation in English.&lt;br /&gt;
&lt;br /&gt;
TODO: How to build user docs from SVN.&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for promotion ==&lt;br /&gt;
&lt;br /&gt;
If you are creating screenshots or screencasts of the latest version of KDE, project Neon is a simple and fast way of getting a default KDE4 session.&lt;br /&gt;
&lt;br /&gt;
The KDE Promotion team recommends using the default background, theme, icons etc when preparing official promotional materials (unless the feature you are showing is related to configuring KDE artwork). Project Neon uses the default artwork that comes with KDE4, so it is useful for creating promo materials.&lt;br /&gt;
&lt;br /&gt;
Here is a shortcut to get all available modules from the PPA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The application [http://ariya.blogspot.com/2008/06/creating-fancy-screenshots-with.html screenie] is provided since Kubuntu 8.10 as &amp;lt;tt&amp;gt;screenie-qt&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install screenie-qt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Contact the Team ==&lt;br /&gt;
&lt;br /&gt;
You can reach the Project Neon team on IRC in &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;#project-neon on irc.freenode.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
by mail at &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;neon@lists.launchpad.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or you can ask a question on [https://answers.launchpad.net/project-neon launchpad]&lt;br /&gt;
&lt;br /&gt;
If you think there is a bug in our packaging of the provided software you can file a bug on [https://bugs.launchpad.net/project-neon launchpad]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.kubuntu.org/Kubuntu/ProjectNeon Team page in the Kubuntu Wiki]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Getting_Started/Using_Project_Neon_to_contribute_to_KDE</id>
		<title>Getting Started/Using Project Neon to contribute to KDE</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Getting_Started/Using_Project_Neon_to_contribute_to_KDE"/>
				<updated>2012-11-19T16:07:24Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: typos--&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://launchpad.net/project-neon Project Neon] is a nightly build of the latest KDE trunk for Ubuntu. It is an easy way for new contributors to KDE to get started without having to download and build the entire KDE source code tree. Additionally, dependencies are automatically handled and updated. This is suitable for new developers, translators, usability designers, documenters, promoters, bug triagers, etc. This process makes the steps detailed on [[Getting_Started/Build|this page]].&lt;br /&gt;
&lt;br /&gt;
However, for developers, it may at some point become necessary to build more components from source code as you become more involved in the project. The [[Getting_Started/Build/kdesrc-build|kdesrc-build]] script is an easy way to build all or parts of KDE from its source code repositories.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Project Neon always requires either the latest stable Kubuntu release or the development release. Previous versions of Kubuntu are not supported. &lt;br /&gt;
&lt;br /&gt;
== Installing Project Neon ==&lt;br /&gt;
&lt;br /&gt;
To use Project Neon, add the following PPA (Personal Package Archive) to your &amp;lt;tt&amp;gt;sources.list&amp;lt;/tt&amp;gt; using your preferred method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo add-apt-repository ppa:neon/ppa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Project neon nightly KDE4 build&lt;br /&gt;
deb http://ppa.launchpad.net/neon/ppa/ubuntu maverick main&lt;br /&gt;
&lt;br /&gt;
#above repository is PGP signed, refer to below link for getting PGP key&lt;br /&gt;
https://launchpad.net/~neon/+archive/ppa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After that, you can simply install the nightly package of whichever modules you want to work on. The packages are named project-neon-&amp;lt;git/svn module name&amp;gt;. The packages are installed in /opt/project-neon/ and won't affect your stable KDE install.&lt;br /&gt;
&lt;br /&gt;
You can install all of the packages or just the ones you are interested in, depending on what you want to use them for. For example if you want to install the KDE Workspace with the extra plasmoids, you would install the &amp;lt;tt&amp;gt;project-neon-kdeplasma-addons&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;project-neon-session&amp;lt;/tt&amp;gt; so you get KDM support for Project Neon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-kdeplasma-addons project-neon-session&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are only interested in application development in another module, you can install just the module package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-kdepim project-neon-utils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That command will also install the &amp;lt;tt&amp;gt;kdelibs&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;kdepimlibs&amp;lt;/tt&amp;gt; and other dependencies too. In your regular (stable) KDE session you can then run the nightly version of your chosen application after setting up the environment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
neon-env&lt;br /&gt;
kmail&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;neon-env&amp;lt;/tt&amp;gt; will setup the environment and start a subshell from which you can work with your project neon installation.&lt;br /&gt;
This will correctly use the nightly version of libraries instead of using the stable versions, so no other changes are necessary to your library path etc.&lt;br /&gt;
You'll need to close the terminal session for the settings to be undone.&lt;br /&gt;
&lt;br /&gt;
Note that settings for applications that you run from project neon do not conflict with your regular application settings and data. &amp;lt;tt&amp;gt;.project-neon-kde/&amp;lt;/tt&amp;gt; is used instead of &amp;lt;tt&amp;gt;.kde/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for development ==&lt;br /&gt;
&lt;br /&gt;
If you are joining one of the development teams in KDE, you will need a real SVN/GIT checkout in order to contribute your code back to the project and create patches easily. If you only code for KDE every now and then, Project Neon provides some extra tools for this purpose in the package &amp;lt;tt&amp;gt;project-neon-utils&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
NOTE: both neon-cmake and neonmake require neon-env to be run first!&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;neon-env&amp;lt;/tt&amp;gt; - sets up the necessary environment settings for project neon builds and opens a subshell.&lt;br /&gt;
* &amp;lt;tt&amp;gt;neon-cmake&amp;lt;/tt&amp;gt; - cmake wrapper with neon environment settings for cmake, same synopsis as cmake and passes arguments to cmake&lt;br /&gt;
* &amp;lt;tt&amp;gt;neonmake&amp;lt;/tt&amp;gt; - convenience script which will create a build folder, configure the source, build it and install it in /opt/project-neon/ so you can test your changes.&lt;br /&gt;
* &amp;lt;tt&amp;gt;neon-clean&amp;lt;/tt&amp;gt; - script that resets any changes you made to /opt/project-neon after installing the packages. Since this script reinstalls the packages it might require a working internet connection.&lt;br /&gt;
* &amp;lt;tt&amp;gt;neonbuild&amp;lt;/tt&amp;gt; - pbuilder/pdebuild wrapper to rebuild a neon package in a chroot. Takes the same options as pbuilder. If no pbuilder action is given pdebuild is run instead.&lt;br /&gt;
&lt;br /&gt;
=== Options for cmake/make ===&lt;br /&gt;
You can change the cmake and make options used by setting these variables in ~/.neonrc:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;NEON_CMAKE_OPTS=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt; - Here you can add additional cmake options that should be used together with the default neon options.&lt;br /&gt;
* &amp;lt;tt&amp;gt;NEON_CMAKE_OVERRIDE=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt; - If you set this variable cmake will ignore the default neon options and only use the ones in NEON_CMAKE_OVERRIDE.&lt;br /&gt;
* &amp;lt;tt&amp;gt;NEON_MAKE_OVERRIDE=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt; - If you set this variable make in neonmake will only use your options. By default make uses '-j CPUs+1'&lt;br /&gt;
&lt;br /&gt;
=== Debugging symbols ===&lt;br /&gt;
The debugging symbols for every package are in its corresponding &amp;lt;code&amp;gt;-dbg&amp;lt;/code&amp;gt; package, so to install the debugging symbols for kdelibs you can use&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-kdelibs-dbg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are already using a nightly package of the module you want to develop for, you should remove that and checkout the development version. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Remove the packaged nightly version&lt;br /&gt;
sudo apt-get purge project-neon-kdepim&lt;br /&gt;
&lt;br /&gt;
# Add below Project Neon source code repository to sources.list if you didn't use add-apt-repository&lt;br /&gt;
deb-src http://ppa.launchpad.net/neon/ppa/ubuntu maverick main&lt;br /&gt;
&lt;br /&gt;
# Get the dependencies for building kdepim&lt;br /&gt;
sudo apt-get build-dep project-neon-kdepim&lt;br /&gt;
cd ~&lt;br /&gt;
# You may choose to do your development in a different folder.&lt;br /&gt;
cd Development&lt;br /&gt;
# Gets the latest version of the kdepim module.&lt;br /&gt;
git clone git://anongit.kde.org/kdepim&lt;br /&gt;
cd kdepim&lt;br /&gt;
# Set up neon environment&lt;br /&gt;
neon-env&lt;br /&gt;
# Shortcut provided by Project Neon to make the module&lt;br /&gt;
# and install it to the prefix /opt/project-neon/&lt;br /&gt;
neonmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you should usually checkout a module from KDE, not an application. Most modules contain libraries shared within the module and which are necessary to build the applications in the module.&lt;br /&gt;
&lt;br /&gt;
Also note that when using apt-get build-dep it will always get all build-depends, so watch out that it doesn't install a component you want to build yourself as that would overwrite your changes should you install the packages after installing your build. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for translation ==&lt;br /&gt;
&lt;br /&gt;
The Project Neon nightly packages include English language strings only. Translated packages are not available. However, if you are translating KDE applications, you can install the translations from KDE SVN in your normal workflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
cd Translations&lt;br /&gt;
# The -N switch checks out only the top level directory from svn.&lt;br /&gt;
svn co -N svn://anonsvn.kde.org/home/kde/trunk/l10n-kde4&lt;br /&gt;
cd l10n-kde4&lt;br /&gt;
# scripts necessary to build translations.&lt;br /&gt;
svn up scripts&lt;br /&gt;
# Get the German translations&lt;br /&gt;
svn up de&lt;br /&gt;
# Generate the build files for the German language pack - if you get a message&lt;br /&gt;
# that revpath couldn't be found you need to install the xutils-dev package&lt;br /&gt;
./scripts/autogen.sh de&lt;br /&gt;
cd de&lt;br /&gt;
neon-env&lt;br /&gt;
neonmake&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After building the translations it is possible to either change the language in system settings, or run applications in another language using the environment variable &amp;lt;tt&amp;gt;KDE_LANG&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
switchtonightly # or neon-env&lt;br /&gt;
KDE_LANG=de kmail&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exit the shell to reset the settings.&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for documentation ==&lt;br /&gt;
&lt;br /&gt;
The Project Neon nightly source packages include the official KDE User Documentation in English.&lt;br /&gt;
&lt;br /&gt;
TODO: How to build user docs from SVN.&lt;br /&gt;
&lt;br /&gt;
== Using Project Neon for promotion ==&lt;br /&gt;
&lt;br /&gt;
If you are creating screenshots or screencasts of the latest version of KDE, project Neon is a simple and fast way of getting a default KDE4 session.&lt;br /&gt;
&lt;br /&gt;
The KDE Promotion team recommends using the default background, theme, icons etc when preparing official promotional materials (unless the feature you are showing is related to configuring KDE artwork). Project Neon uses the default artwork that comes with KDE4, so it is useful for creating promo materials.&lt;br /&gt;
&lt;br /&gt;
Here is a shortcut to get all available modules from the PPA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install project-neon-all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The application [http://ariya.blogspot.com/2008/06/creating-fancy-screenshots-with.html screenie] is provided since Kubuntu 8.10 as &amp;lt;tt&amp;gt;screenie-qt&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install screenie-qt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Contact the Team ==&lt;br /&gt;
&lt;br /&gt;
You can reach the Project Neon team on IRC in &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;#project-neon on irc.freenode.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
by mail at &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;neon@lists.launchpad.net&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
or you can ask a question on [https://answers.launchpad.net/project-neon launchpad]&lt;br /&gt;
&lt;br /&gt;
If you think there is a bug in our packaging of the provided software you can file a bug on [https://bugs.launchpad.net/project-neon launchpad]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.kubuntu.org/Kubuntu/ProjectNeon Team page in the Kubuntu Wiki]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.10_Feature_Plan</id>
		<title>Schedules/KDE4/4.10 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.10_Feature_Plan"/>
				<updated>2012-10-24T17:11:31Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* kdegraphics */ add Gwenview tasks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.10 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.10 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.9 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;b&amp;gt;NO NEW FEATURES ALLOWED&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-runtime =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|kio-mtp|KIO-Slave for MTP|philschmidt@gmx.net|Philipp Schmidt}}&lt;br /&gt;
{{FeatureInProgress|QML Containments|Making it possible to do full-featured containments in QML|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|nepomuk-indexer|New Nepomuk Indexer|me@vhanda.in|Vishesh Handa}}&lt;br /&gt;
{{FeatureInProgress|nepomukbakcup|Nepomuk Backup rewritten from scratch|me@vhanda.in|Vishesh Handa}}&lt;br /&gt;
{{FeatureInProgress|nepomukcleaner|An application to port/clean invalid/legacy data in Nepomuk|me@vhanda.in|Vishesh Handa}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|ksmserver|Merge the new qml based screen locker|mart@kde.org|Marco Martin}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The following section of entries has been auto generated by ChangelogGenerator. Do not edit!&lt;br /&gt;
BEGIN GENERATED SECTION --&amp;gt;&lt;br /&gt;
{{FeatureTodo|kwin|windows that are moved to another desktop should be treated as sticky windows ({{bug |213847}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Fix fullscreen state handling: NETWM says it's bound to focus and not stacking order, also see bug #224600 ({{bug |296076}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Lanczos Filter broken after screen size changes ({{bug |296065}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureInProgress|kwin|GHNS support for KWin Scripts ({{bug |296774}}, Review 104877)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|KConf Update Script for KWin 4.9 ({{bug |296775}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Request category for scripted KWin Effects on kde-(look&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;app).org ({{bug |297634}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Request category for KWin Scripts on kde-(look&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;app).org ({{bug |297635}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureInProgress|kwin|GHNS support for Window Switching Layouts ({{bug |297636}}, Review 104894)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Request category for Window Switcher Layouts on kde-(look&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;app).org ({{bug |297637}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Update Documentation for Window Switcher Layouts ({{bug |297638}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|ThumbnailItem allows upscaling of Windows ({{bug |297864}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Window Tab support for QML based Aurorae ({{bug |299138}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Increase ABI version for KDecorations ({{bug |299140}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Break NETWM to allow inner xinerama struts ({{bug |299247}})|kwin-bugs-null@kde.org}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- END GENERATED SECTION --&amp;gt;&lt;br /&gt;
{{FeatureDone|plasma-wallpapers|Color wallpaper: add listview to display thumbnails for background mode|rshah0385@kireihana.com|Reza Fatahilah Shah}}&lt;br /&gt;
{{FeatureInProgress|plasma workspace|Port Notifications applet to QML|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|plasma workspace|Port Task Manager applets to QML|hein@kde.org|Eike Hein (Sho_)}}&lt;br /&gt;
{{FeatureInProgress|plasma workspace|refresh Air Plasma theme|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|plasma workspace|Port Kickoff to qml|yellowcake-@gmx.net|Greg T}}&lt;br /&gt;
{{FeatureInProgress|systemsettings|Replace krandr KCM by libkscreen-based one|dvratil@redhat.com|Dan Vrátil}}&lt;br /&gt;
{{FeatureInProgress|plasma workspace|Port rssnow to qml|terietor@gmail.com|Giorgos Tsiapaliokas}}&lt;br /&gt;
{{FeatureInProgress|various|KActivities/SLC support for most our applications|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|plasma workspace|first desktop SLC applet release|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureDone|System Tray|System tray with interface in QML|dmitry.ashkadov@gmail.com|Dmitry Ashkadov}}&lt;br /&gt;
{{FeatureTodo|plasma workspace|Top-rated documents for Task Manager|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|systemsettings|Keyboard layout preview|amourphious1992@gmail.com|Shivam Makkar}}&lt;br /&gt;
{{FeatureInProgress|window manager|Rework and optimize vertex specification|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|window manager|Dynamic shader generation|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|window manager|Partial port to xcb|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|window manager|New launch feedback effect|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|FolderView|Split into PopupApplet and Containment|ignat.semenov@blue-systems.com|Ignat Semenov}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|FolderView|Port to QML|ignat.semenov@blue-systems.com|Ignat Semenov}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Dolphin|Implement files quick preview feature (named Klook)  |evgeniy.augin@osinit.ru|Evgeniy Auzhin}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|print-manager|New Print manager KCM and applet (plasmoid) replacement, using C++  |dantti12@gmail.com|Daniel Nicoletti}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate|Support for Python plugins|srhaque@theiet.org|Shaheed Haque}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate|Advanced gid(1) plugin using both ID files and etags|srhaque@theiet.org|Shaheed Haque}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Kate|As-you-type search for the search plugin|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Kate|Session name API for plugins + automatic ctags database naming|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Kate|Add optional document &amp;quot;minimap&amp;quot; to the Symbols view plugin|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Kate|Macro support|kdedevel@etothepiplusone.com|Simon St James}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Marble|Have support for &amp;quot;repeatX&amp;quot; in the projection classes|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Satellite Map NG|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Mars &amp;amp; Venus satellite plugin|rahn@kde.org|Torsten Rahn / Gerhard Holtkamp}}&lt;br /&gt;
{{FeatureTodo|Marble|Solar Eclipse Plugin|rahn@kde.org|Torsten Rahn / Gerhard Holtkamp}}&lt;br /&gt;
{{FeatureTodo|Marble|Help Menu polishing / Support page inclusion|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Toolbar polishing/refactoring|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Solar Eclipse Plugin|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Worldwide hillshading|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Extended library API (no MarbleWidget dependency for tasks like parsing, routing)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Marble Touch on Plasma Active|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Foursquare plugin|utkuaydin34@gmail.com|Utku Aydın}}&lt;br /&gt;
{{FeatureTodo|Marble|Marble Touch on Android|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Support for loading geolocated photos (e.g. in a Gallery activity in Marble Touch)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Layer Management (by the user: Toggle layer visibility; maybe move layers from legend and layers in menus to one central place/tab)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Rocs|Journal files for projects.|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureInProgress|Rocs|Revisit graph export/import functionality to fully support: TGF, DOT, GML, GraphML|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Printing and image export of graphs.|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Data Structure Snapshot and Recovery.|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureInProgress|Rocs|Main Window UI Reorganization|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Visual Graph Editor Handling: copy&amp;amp;paste, data structure focus, property display|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Visual Graph Editor Edit Menu|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Code Editor Configuration Dialog|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Data Structure Backend wise iconsets and preconfigurations for types|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|KTouch|Ship ktouch/next|sebastiangottfried@web.de|Sebastian Gottfried}}&lt;br /&gt;
{{FeatureTodo|KTouch|Smart resizing of training screen with aligned vertical lines|sebastiangottfried@web.de|Sebastian Gottfried}}&lt;br /&gt;
{{FeatureTodo|KTouch|Prominent hint during training if the user makes repeatedly errors|sebastiangottfried@web.de|Sebastian Gottfried}}&lt;br /&gt;
{{FeatureTodo|KTouch|Show course descriptions in course selector|sebastiangottfried@web.de|Sebastian Gottfried}}&lt;br /&gt;
{{FeatureTodo|KTouch|Show a message when keyboard layout visualizion isn't available due missing data|sebastiangottfried@web.de|Sebastian Gottfried}}&lt;br /&gt;
{{FeatureDone|Analitza|New plotting framework|percy.camilo.ta@gmail.com|Percy Camilo Triveño Aucahuasi}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Splitted the QML Components from KAlgebraMobile|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureDone|KAlgebra|New plotting plasmoid graphs, in QtQuick|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureInProgress|Pairs|Pairs Theme editor|marco.calignano@gmail.com|Marco Calignano}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Python backend|filipe@kde.org|Filipe Saraiva}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|libkdegames|[http://community.kde.org/KDE_Games/API_cleanup Major cleanup and rewrite] (done, except for the new highscore classes)&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;'''Release team:''' please link to the [[Projects/Games/Porting_to_libkdegames_v5|porting instructions]]  for third-party developers|stefan.majewsky@googlemail.com|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Use KGameRenderer and QGraphicsView for all graphics: the gameplay is the same as before.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Remove the status bar. All scores and status messages are in the viewport now.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Allow the displayed speed of moves to be adjusted.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Animate multi-stage moves, to make it easier for a human player to follow their progress.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Show multi-stage moves in an order that is easier to follow.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Validate the loading of saved games and report errors.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Rewrite the main AI class and make it use a true Minimax method.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Provide a choice of two AI styles, Kepler and Newton, with the possibility to add more.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Add settings to choose computer player, AI style and skill level for either or both of players 1 and 2.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KJumpingCube|Add board sizes 3x3 and 4x4, for simplified play.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureInProgress|KSudoku|Add a simple Print facility for KSudoku puzzles.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|libkipi|[http://www.google-melange.com/gsoc/proposal/review/google/gsoc2012/dodonvictor/10002 Porting libkipi to KDE-XML GUI]|dodonvictor@gmail.com|Victor Dodon}}&lt;br /&gt;
{{FeatureInProgress|okular|Tiled rendering|okular-devel@kde.org|Okular Developers}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Recursive importer|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Color profile support|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Juk|[http://community.kde.org/Juk#Porting_plan Port Juk away from kde3support]|martin.sandsmark@kde.org|Martin Sandsmark}}&lt;br /&gt;
{{FeatureDone|Juk|Add lyrics view|martin.sandsmark@kde.org|Martin Sandsmark}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Facebook resource|Include it in default install|martin.klapetek@gmail.com|Martin Klapetek}}&lt;br /&gt;
{{FeatureInProgress|Akregator2|Merge in kdepim|montel@kde.org|Montel Laurent}}&lt;br /&gt;
{{FeatureInProgress|Knode|Merge in KMail|montel@kde.org|Montel Laurent}}&lt;br /&gt;
{{FeatureInProgress|BackupMail|Extend backup to all kdepim apps|montel@kde.org|Montel Laurent}}&lt;br /&gt;
{{FeatureInProgress|Sieve|Rewrite dialogbox|montel@kde.org|Montel Laurent}}&lt;br /&gt;
{{FeatureInProgress|libs|Move folderview to kdepimlibs/akonadi|montel@kde.org|Montel Laurent}}&lt;br /&gt;
{{FeatureInProgress|kolab-resource|Make Kolab 3.0 option available|mollekopf@kolabsys.com|Christian Mollekopf}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Microblog|replace with QML version|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|StackFolder|Add applet for quick browse the stack of folders|ural.mullabaev@rosalab.ru|Ural Mullabaev}}&lt;br /&gt;
{{FeatureInProgress|ComicStrip|Replace with QML version|rshah0385@kireihana.com|Reza Fatahilah Shah}}&lt;br /&gt;
{{FeatureInProgress|Calculator|Replace with QML version|luizromario@gmail.com|Luiz Romário Santana Rios}}&lt;br /&gt;
{{FeatureDone|QML Wallpapers|Make it possible to have animated wallpapers written in QtQuick technologies.|aleixpol@blue-systems.com|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureDone|Dictionary KRunner|Look up words in the dictionary by typing in 'define {word}' in krunner.|Jason@zx2c4.com|Jason A. Donenfeld}}&lt;br /&gt;
{{FeatureInProgress|Calculator|replace with QML version|bettio@kde.org|Davide Bettio}}&lt;br /&gt;
{{FeatureInProgress|Eyes|replace with QML version|bettio@kde.org|Davide Bettio}}&lt;br /&gt;
{{FeatureInProgress|FifteenPuzzle|replace with QML version|bettio@kde.org|Davide Bettio}}&lt;br /&gt;
{{FeatureInProgress|Luna|replace with QML version|bettio@kde.org|Davide Bettio}}&lt;br /&gt;
{{FeatureInProgress|Timer|replace with QML version|bettio@kde.org|Davide Bettio}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Agateau</id>
		<title>User:Agateau</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Agateau"/>
				<updated>2012-09-23T12:59:58Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I am Gwenview main developer, and also try to help out polishing overall desktop experience in KDE.&lt;br /&gt;
&lt;br /&gt;
* blog: http://agateau.com&lt;br /&gt;
* mail: agateau (a) kde dot org&lt;br /&gt;
&lt;br /&gt;
== Drafts ==&lt;br /&gt;
&lt;br /&gt;
* [[User:Agateau/TooManyToolbars|Too Many Toolbars]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Agateau/KidMP</id>
		<title>User:Agateau/KidMP</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Agateau/KidMP"/>
				<updated>2012-09-23T12:59:06Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Moved to http://agateau.com/projects/kidmp&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Agateau/KidMP</id>
		<title>User:Agateau/KidMP</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Agateau/KidMP"/>
				<updated>2012-09-03T21:15:21Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KidMP is a kid-friendly media player.&lt;br /&gt;
&lt;br /&gt;
Learn more about it in the [http://quickgit.kde.org/index.php?p=scratch%2Fgateau%2Fkidmp.git&amp;amp;a=blob_plain&amp;amp;f=README.md README], then get a release from [http://kde-apps.org/content/show.php?content=153787 kde-apps.org] or clone the [http://quickgit.kde.org/index.php?p=scratch%2Fgateau%2Fkidmp.git&amp;amp;a=summary git repository].&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Agateau/KidMP</id>
		<title>User:Agateau/KidMP</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Agateau/KidMP"/>
				<updated>2012-09-03T20:13:09Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: Created page with &amp;quot;KidMP is a kid-friendly media player.  Learn more about it in the [http://quickgit.kde.org/index.php?p=scratch%2Fgateau%2Fkidmp.git&amp;amp;a=blob_plain&amp;amp;f=README.md README], then get ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KidMP is a kid-friendly media player.&lt;br /&gt;
&lt;br /&gt;
Learn more about it in the [http://quickgit.kde.org/index.php?p=scratch%2Fgateau%2Fkidmp.git&amp;amp;a=blob_plain&amp;amp;f=README.md README], then get a release from [http://kde-apps.org/ kde-apps.org] or clone the [http://quickgit.kde.org/index.php?p=scratch%2Fgateau%2Fkidmp.git&amp;amp;a=summary git repository].&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Agateau</id>
		<title>User:Agateau</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Agateau"/>
				<updated>2012-09-03T20:04:36Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I am Gwenview main developer, and also try to help out polishing overall desktop experience in KDE.&lt;br /&gt;
&lt;br /&gt;
* blog: http://agateau.com&lt;br /&gt;
* mail: agateau (a) kde dot org&lt;br /&gt;
&lt;br /&gt;
== Other Projects ==&lt;br /&gt;
&lt;br /&gt;
* [[User:Agateau/KidMP|KidMP]]&lt;br /&gt;
&lt;br /&gt;
== Drafts ==&lt;br /&gt;
&lt;br /&gt;
* [[User:Agateau/TooManyToolbars|Too Many Toolbars]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Agateau</id>
		<title>User:Agateau</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Agateau"/>
				<updated>2012-09-03T20:04:06Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I am Gwenview main developer, and also try to help out polishing overall desktop experience in KDE.&lt;br /&gt;
&lt;br /&gt;
* blog: http://agateau.com&lt;br /&gt;
* mail: agateau (a) kde dot org&lt;br /&gt;
&lt;br /&gt;
== Other Projects ==&lt;br /&gt;
&lt;br /&gt;
* [[KidMP|KidMP]]&lt;br /&gt;
&lt;br /&gt;
== Drafts ==&lt;br /&gt;
&lt;br /&gt;
* [[User:Agateau/TooManyToolbars|Too Many Toolbars]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Agateau</id>
		<title>User:Agateau</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Agateau"/>
				<updated>2012-09-03T19:59:31Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I am Gwenview main developer, and also try to help out polishing overall desktop experience in KDE.&lt;br /&gt;
&lt;br /&gt;
* blog: http://agateau.com&lt;br /&gt;
* mail: agateau (a) kde dot org&lt;br /&gt;
&lt;br /&gt;
== Drafts ==&lt;br /&gt;
&lt;br /&gt;
* [[User:Agateau/TooManyToolbars|Too Many Toolbars]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems</id>
		<title>Development/Tutorials/Localization/i18n Build Systems</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems"/>
				<updated>2012-08-03T15:31:49Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: Document how to test Messages.sh scripts&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Localization|&lt;br /&gt;
&lt;br /&gt;
name=Building KDE's l10n Module|&lt;br /&gt;
&lt;br /&gt;
pre=[[../i18n|Writing Applications With Localization in Mind]]|&lt;br /&gt;
next=[[../Language Change|Dealing with language changes]]|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Now that your application is ready to be localized, we next look at how to incorporate the necessary mechanisms into the CMake build system of your application.&lt;br /&gt;
&lt;br /&gt;
First we'll explain the &amp;quot;theory&amp;quot; of the steps that need to happen from extracting message strings to installing the generated .po files. After that we'll look at how to implement those steps ([[#Theory: The xgettext toolchain]]). If your application is developed in KDE's subversion repository, many of those steps will happen automatically (see [[#handling i18n in KDE's subversion repository]]). Else you will want to read on in the [[#handling i18n in third party applications]] section.&lt;br /&gt;
&lt;br /&gt;
== Theory: The xgettext toolchain ==&lt;br /&gt;
&lt;br /&gt;
Making translations work consists of the following steps:&lt;br /&gt;
# Extract the translatable strings&lt;br /&gt;
# Merge the new or changed strings with existing translations&lt;br /&gt;
# Compile the translations into message catalogs&lt;br /&gt;
# Install the message catalogs&lt;br /&gt;
# Use the message catalogs in the application&lt;br /&gt;
&lt;br /&gt;
=== Extracting the strings ===&lt;br /&gt;
&lt;br /&gt;
In this step, all the strings you marked as i18n()/ki18n()/etc. in your sources need to be collected into a translation template (.pot) file. Some translateable strings are also contained in .ui, .rc, or .kcfg files. Also tips-of-the-day need to be collected into the .pot file.&lt;br /&gt;
&lt;br /&gt;
These steps are handled by {{path|xgettext}}, {{path|extractrc}}, and {{path|preparetips}} programs, respectively. In some cases you may also need {{path|extractattr}}.&lt;br /&gt;
&lt;br /&gt;
=== Merging translations ===&lt;br /&gt;
&lt;br /&gt;
Generally, only a few translatable string will change at a time, in an application. Some will be removed, some will be added, some will be changed into different strings, and some will be moved around in the source files. These changes need to be reflected in the translations, but of course it would be a huge effort to redo the entire translation every time a string was changed. Rather the changes should be merged with the existing translations. This is the job of the {{path|msgmerge}} tool.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the translations ===&lt;br /&gt;
&lt;br /&gt;
In order to make message lookup fast, the .po files need to be compiled into so-called &amp;quot;message catalogs&amp;quot; (.mo / .gmo). This is done using the {{path|msgfmt}} tool.&lt;br /&gt;
&lt;br /&gt;
=== Installing the message catalogs ===&lt;br /&gt;
&lt;br /&gt;
The compiled message catalogs need to be installed alongside the application. In KDE, the standard location for message catalogs is {{path|$KDEDIR/share/locale/xx/LC_MESSAGES/}}.&lt;br /&gt;
&lt;br /&gt;
=== Using the message catalogs ===&lt;br /&gt;
&lt;br /&gt;
Finally, when the application is run, it needs to load the appropriate message catalog in order to be able to look up and show translated strings. In KDE applications, this is the job of the {{class|KLocale}} class, and in the great majority of cases happens automatically.&lt;br /&gt;
&lt;br /&gt;
For some special cases, such as plugins, look at [[#Runtime Loading Of Catalogs]].&lt;br /&gt;
&lt;br /&gt;
== handling i18n in KDE's subversion repository ==&lt;br /&gt;
&lt;br /&gt;
If your application is developed inside KDE's subversion repository, most of the steps outlined above are automated. In this case, generally, all you will need to do is provide a simple script called {{path|Messages.sh}}, which we will look at below.&lt;br /&gt;
&lt;br /&gt;
In addition, if your top-level folder and .pot file have the same name, the svn2dist script will automatically include .po files when you use it to make a source tarball for your app. &lt;br /&gt;
&lt;br /&gt;
Of course, for the curious, a more detailed account of what happens behind the scenes is also provided.&lt;br /&gt;
&lt;br /&gt;
=== Writing a Messages.sh script ===&lt;br /&gt;
&lt;br /&gt;
Basically, the only thing that is necessary to prepare and install translations for applications in KDE's subversion repository, is to provide information, which sources, ui-files or tips need to be translated. For this purpose, you write a small script called {{path|Messages.sh}} and place it in your sources. Here is an example with inline comments:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#!bin/sh&lt;br /&gt;
&lt;br /&gt;
# invoke the extractrc script on all .ui, .rc, and .kcfg files in the sources&lt;br /&gt;
# the results are stored in a pseudo .cpp file to be picked up by xgettext.&lt;br /&gt;
$EXTRACTRC `find . -name \*.rc -o -name \*.ui -o -name \*.kcfg` &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
# if your application contains tips-of-the-day, call preparetips as well.&lt;br /&gt;
$PREPARETIPS &amp;gt; tips.cpp&lt;br /&gt;
# call xgettext on all source files. If your sources have other filename&lt;br /&gt;
# extensions besides .cc, .cpp, and .h, just add them in the find call.&lt;br /&gt;
$XGETTEXT `find . -name \*.cc -o -name \*.cpp -o -name \*.h -name \*.qml` -o $podir/APPNAME.pot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, this script contains only three actual lines of code, and not all may even be needed. The $XGETTEXT, $PREPARETIPS, $EXTRACTRC, and $podir environment variables are predefined, you do not need to worry about setting these. The only thing that you will need to do is to replace &amp;quot;APPNAME&amp;quot; with the name of your application (but see [[#Naming .pot Files]] for exceptions).&lt;br /&gt;
&lt;br /&gt;
Translatable strings are automatically extracted from C++ files. For non-C++ files, the following scripts are used&lt;br /&gt;
* $EXTRACTRC - Extract translatable strings from xml configuration and ui files.&lt;br /&gt;
* $EXTRACT_GRANTLEE_TEMPLATE_STRINGS - Extract translatable strings from Grantlee template files.&lt;br /&gt;
&lt;br /&gt;
Try to make sure your Messages.sh script collects only those messages that are really needed. If in doubt, look at other Messages.sh files in the KDE subversion repository for inspiration, or -- of course -- ask.&lt;br /&gt;
&lt;br /&gt;
=== What's happening behind the scenes ===&lt;br /&gt;
&lt;br /&gt;
{{tip|If your application is in the KDE code repository, all this happens automatically. If your code is not in the KDE repository, you must perform these steps yourself. See [[#handling i18n in third party applications]].}}&lt;br /&gt;
&lt;br /&gt;
Periodically, the script {{path|extract-messages.sh}} (a.k.a. scripty) runs on the KDE server. This program basically calls all Messages.sh scripts in the repository with the appropriate parameters. The extracted messages are stored in template (.pot) files in the templates folder of the l10n module. See [[What Is Scripty]] for more information. &lt;br /&gt;
&lt;br /&gt;
The KDE translation teams translate the messages and commit them into a messages folder corresponding to the language, which is further broken down by module. For example, German translated messages for konqueror are committed to {{path|l10n/de/messages/kdebase/konqueror.po}}. &lt;br /&gt;
&lt;br /&gt;
When the l10n module is built, the .po files are compiled into a binary format for fast lookup and installed as .mo files to {{path|$KDEDIR/share/locale/xx/LC_MESSAGES/}}, where xx is the two-letter ISO 639 code for the language. These are called the message catalogs. &lt;br /&gt;
&lt;br /&gt;
At runtime, the &amp;lt;tt&amp;gt;i18n(...)&amp;lt;/tt&amp;gt; function, using the original string you coded, looks up the string in the message catalog of the user's desktop language and returns the translated string. If the message catalog is missing, or the specific string is not found, &amp;lt;tt&amp;gt;i18n(...)&amp;lt;/tt&amp;gt; falls back to the original string in your code. &lt;br /&gt;
&lt;br /&gt;
.desktop files in your project are handled separately. {{path|makemessages}} extracts strings, such as Name and Comment from the .desktop files and places them into a file named {{path|desktop_mmmm.pot}}, where mmmm is the module name, in the templates folder. Once translators have translated this file, makemessages inserts the translated strings back into the .desktop files. The list of strings extracted is in {{path|l10n/scripts/apply.cc}}. Here's the code that checks for them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
if (checkTag(&amp;quot;Name&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Comment&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Language&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Keywords&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;About&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Description&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;GenericName&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Query&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;ExtraNames&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing your Messages.sh script ===&lt;br /&gt;
&lt;br /&gt;
To test your Messages.sh script, you need a checkout of [http://websvn.kde.org/trunk/l10n-kde4/scripts/ the l10n scripts]. To get one:&lt;br /&gt;
&lt;br /&gt;
    svn checkout svn://anonsvn.kde.org/home/kde/trunk/l10n-kde4/scripts&lt;br /&gt;
&lt;br /&gt;
You can then go to your project dir and run:&lt;br /&gt;
&lt;br /&gt;
    mkdir po&lt;br /&gt;
    bash /path/to/l10n-kde4/scripts/extract-messages.sh&lt;br /&gt;
&lt;br /&gt;
When it is done, the po/ dir should contain the generated .pot files.&lt;br /&gt;
&lt;br /&gt;
== handling i18n in third party applications ==&lt;br /&gt;
&lt;br /&gt;
If your application is developed outside of KDE's subversion repository, you need to take care of generating and installing message catalogs yourself. This is not too hard to do, but you should make sure you have a basic understanding of all steps involved, so you will probably want to read [[#Theory: The xgettext toolchain]], first.&lt;br /&gt;
&lt;br /&gt;
Also, there is more than one way to deal with i18n in your application. We will outline one approach to do so for simple applications, but you may want to diverge from this, if you like to.&lt;br /&gt;
&lt;br /&gt;
=== General considerations ===&lt;br /&gt;
&lt;br /&gt;
The i18n generation process can roughly be divided into two steps:&lt;br /&gt;
&lt;br /&gt;
# Extracting and merging messages&lt;br /&gt;
# Compiling and installing message catalogs&lt;br /&gt;
&lt;br /&gt;
The first step really concerns the ''sources'', while the second step is a natural part of compiling and installing an application. Hence, while the second step should definitely be incorporated into the build system for your application (we assume CMake, here), there is no striking reason for the first step to be handled by the build system.&lt;br /&gt;
&lt;br /&gt;
In fact, the extraction and merging of messages does not map well onto the CMake concept of out-of-source builds, and CMake can't provide too much help for this step, either.&lt;br /&gt;
&lt;br /&gt;
Hence, in this tutorial, we will handle the first step with a standalone shell script, and only the second step will be handled by CMake.&lt;br /&gt;
&lt;br /&gt;
=== Extracting and merging messages ===&lt;br /&gt;
&lt;br /&gt;
If you have read the section [[#handling i18n in KDE's subversion repository]] you will know that in the KDE repository, message extraction and merging is handled by a simple script called Messages.sh, which is invoked by a script called {{path|extract-messages.sh}}. Outside of KDE's repository, you will need to take care of both parts, but fortunately, this is easy enough. Here's a sample script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BASEDIR=&amp;quot;../rkward/&amp;quot;	# root of translatable sources&lt;br /&gt;
PROJECT=&amp;quot;rkward&amp;quot;	# project name&lt;br /&gt;
BUGADDR=&amp;quot;http://sourceforge.net/tracker/?group_id=50231&amp;amp;atid=459007&amp;quot;	# MSGID-Bugs&lt;br /&gt;
WDIR=`pwd`		# working dir&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Preparing rc files&amp;quot;&lt;br /&gt;
cd ${BASEDIR}&lt;br /&gt;
# we use simple sorting to make sure the lines do not jump around too much from system to system&lt;br /&gt;
find . -name '*.rc' -o -name '*.ui' -o -name '*.kcfg' | sort &amp;gt; ${WDIR}/rcfiles.list&lt;br /&gt;
xargs --arg-file=${WDIR}/rcfiles.list extractrc &amp;gt; ${WDIR}/rc.cpp&lt;br /&gt;
# additional string for KAboutData&lt;br /&gt;
echo 'i18nc(&amp;quot;NAME OF TRANSLATORS&amp;quot;,&amp;quot;Your names&amp;quot;);' &amp;gt;&amp;gt; ${WDIR}/rc.cpp&lt;br /&gt;
echo 'i18nc(&amp;quot;EMAIL OF TRANSLATORS&amp;quot;,&amp;quot;Your emails&amp;quot;);' &amp;gt;&amp;gt; ${WDIR}/rc.cpp&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
echo &amp;quot;Done preparing rc files&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Extracting messages&amp;quot;&lt;br /&gt;
cd ${BASEDIR}&lt;br /&gt;
# see above on sorting&lt;br /&gt;
find . -name '*.cpp' -o -name '*.h' -o -name '*.c' | sort &amp;gt; ${WDIR}/infiles.list&lt;br /&gt;
echo &amp;quot;rc.cpp&amp;quot; &amp;gt;&amp;gt; ${WDIR}/infiles.list&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
xgettext --from-code=UTF-8 -C -kde -ci18n -ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 -ktr2i18n:1 \&lt;br /&gt;
	-kI18N_NOOP:1 -kI18N_NOOP2:1c,2 -kaliasLocale -kki18n:1 -kki18nc:1c,2 -kki18np:1,2 -kki18ncp:1c,2,3 \&lt;br /&gt;
	--msgid-bugs-address=&amp;quot;${BUGADDR}&amp;quot; \&lt;br /&gt;
	--files-from=infiles.list -D ${BASEDIR} -D ${WDIR} -o ${PROJECT}.pot || { echo &amp;quot;error while calling xgettext. aborting.&amp;quot;; exit 1; }&lt;br /&gt;
echo &amp;quot;Done extracting messages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Merging translations&amp;quot;&lt;br /&gt;
catalogs=`find . -name '*.po'`&lt;br /&gt;
for cat in $catalogs; do&lt;br /&gt;
  echo $cat&lt;br /&gt;
  msgmerge -o $cat.new $cat ${PROJECT}.pot&lt;br /&gt;
  mv $cat.new $cat&lt;br /&gt;
done&lt;br /&gt;
echo &amp;quot;Done merging translations&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Cleaning up&amp;quot;&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
rm rcfiles.list&lt;br /&gt;
rm infiles.list&lt;br /&gt;
rm rc.cpp&lt;br /&gt;
echo &amp;quot;Done&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course you will want to adjust the variable definitions at the top, and -- if needed -- add code to extract tips-of-the-day or other additional strings.&lt;br /&gt;
&lt;br /&gt;
The example script assumes that all .po files and the .pot file are kept in a single directory, which is appropriate for most projects.&lt;br /&gt;
&lt;br /&gt;
=== Compiling and installing message catalogs ===&lt;br /&gt;
&lt;br /&gt;
Assuming you use the script from the previous section, you can place the following CMakeLists.txt in the directory containing the .po files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt)&lt;br /&gt;
&lt;br /&gt;
IF(NOT GETTEXT_MSGFMT_EXECUTABLE)&lt;br /&gt;
	MESSAGE(&lt;br /&gt;
&amp;quot;------&lt;br /&gt;
                 NOTE: msgfmt not found. Translations will *not* be installed&lt;br /&gt;
------&amp;quot;)&lt;br /&gt;
ELSE(NOT GETTEXT_MSGFMT_EXECUTABLE)&lt;br /&gt;
&lt;br /&gt;
        SET(catalogname rkward)&lt;br /&gt;
&lt;br /&gt;
        ADD_CUSTOM_TARGET(translations ALL)&lt;br /&gt;
&lt;br /&gt;
        FILE(GLOB PO_FILES *.po)&lt;br /&gt;
&lt;br /&gt;
        FOREACH(_poFile ${PO_FILES})&lt;br /&gt;
                GET_FILENAME_COMPONENT(_poFileName ${_poFile} NAME)&lt;br /&gt;
                STRING(REGEX REPLACE &amp;quot;^${catalogname}_?&amp;quot; &amp;quot;&amp;quot; _langCode ${_poFileName} )&lt;br /&gt;
                STRING(REGEX REPLACE &amp;quot;\\.po$&amp;quot; &amp;quot;&amp;quot; _langCode ${_langCode} )&lt;br /&gt;
&lt;br /&gt;
                IF( _langCode )&lt;br /&gt;
                        GET_FILENAME_COMPONENT(_lang ${_poFile} NAME_WE)&lt;br /&gt;
                        SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo)&lt;br /&gt;
&lt;br /&gt;
                        ADD_CUSTOM_COMMAND(TARGET translations&lt;br /&gt;
                                COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check -o ${_gmoFile} ${_poFile}&lt;br /&gt;
                                DEPENDS ${_poFile})&lt;br /&gt;
                        INSTALL(FILES ${_gmoFile} DESTINATION ${LOCALE_INSTALL_DIR}/${_langCode}/LC_MESSAGES/ RENAME ${catalogname}.mo)&lt;br /&gt;
                ENDIF( _langCode )&lt;br /&gt;
&lt;br /&gt;
        ENDFOREACH(_poFile ${PO_FILES})&lt;br /&gt;
&lt;br /&gt;
ENDIF(NOT GETTEXT_MSGFMT_EXECUTABLE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This iterates over all .po files in the directory, compiles them using msgfmt, and installs them to the standard location. You will want to change &amp;quot;catalogname&amp;quot; to the name of your application.&lt;br /&gt;
&lt;br /&gt;
=== Getting translations ===&lt;br /&gt;
&lt;br /&gt;
Now you just have to find translators to translate the extracted messages into the various languages. As your application gets used by more people, you will find that translators will volunteer to do this. Translated PO files then have to be stored in the po folder with the naming scheme &amp;lt;languagecode&amp;gt;.po.&lt;br /&gt;
&lt;br /&gt;
=== Translating .desktop Files ===&lt;br /&gt;
&lt;br /&gt;
Translating .desktop files is a bit tricky because the translation of .desktop files isn't fetched from .po/.gmo files, but must be part of the .desktop file itself. So we have 2 tasks:&lt;br /&gt;
&lt;br /&gt;
* extract messages from the .desktop file&lt;br /&gt;
* merge the translations in the .desktop file&lt;br /&gt;
&lt;br /&gt;
Our friends from Gnome provide the [http://freedesktop.org/wiki/Software/intltool intltool] package. While this tools is mainly written for the old autotools build system (but KDE uses CMake since KDE 4), we can use this package nevertheless for our purpose. Here is a step-by-step guide:&lt;br /&gt;
&lt;br /&gt;
# Install the [http://freedesktop.org/wiki/Software/intltool intltool] package&lt;br /&gt;
# We assume that your .desktop file is named &amp;quot;MYPROGRAM.desktop&amp;quot;.&lt;br /&gt;
# Make a copy of &amp;quot;MYPROGRAM.desktop&amp;quot; which is named &amp;quot;MYPROGRAM.desktop.template&amp;quot;.&lt;br /&gt;
# In MYPROGRAM.desktop.template substitute the keys &amp;quot;Name&amp;quot; by &amp;quot;_Name&amp;quot;, &amp;quot;GenericName&amp;quot; by &amp;quot;_GenericName&amp;quot; and &amp;quot;Comment&amp;quot; by &amp;quot;_Comment&amp;quot;.&lt;br /&gt;
# Remove all translations from &amp;quot;MYPROGRAM.desktop.template&amp;quot;.&lt;br /&gt;
# Add the following lines to the above described build script, at the end of the section &amp;quot;Preparing rc files&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
intltool-extract --quiet --type=gettext/ini PATH/MYPROGRAM.desktop.template&lt;br /&gt;
cat PATH/MYPROGRAM.desktop.template.h &amp;gt;&amp;gt; ${WDIR}/rc.cpp&lt;br /&gt;
rm PATH/MYPROGRAM.desktop.template.h&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
intltool-extract will create a dummy C++ header (PATH/MYPROGRAM.desktop.template.h) with the strings whose key starts with &amp;quot;_&amp;quot;. We append the content of this header file into our &amp;quot;rc.cpp&amp;quot; and remove remove the file than. (We assume that &amp;quot;PATH&amp;quot; is the path to &amp;quot;MYPROGRAM.desktop.template&amp;quot;, relative to the working directory of the script.)&lt;br /&gt;
# Add &amp;quot;-kN_:1&amp;quot; as additional parameter to the xgettext call in the section &amp;quot;Extracting messages&amp;quot;. This is necessary because dummy code that intltool-extract produces uses &amp;quot;N_()&amp;quot; instead of &amp;quot;i18n()&amp;quot;.&lt;br /&gt;
# Add the following lines to the above described build script, at the end of the section &amp;quot;Merging translations&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
intltool-merge --quiet --desktop-style ${WDIR} PATH/MYPROGRAM.desktop.template PATH2/MYPROGRAM.desktop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will produce MYPROGRAM.desktop from MYPROGRAM.desktop.template, inserting all available translations in the .po files in the directory ${WDIR}. (We assume that &amp;quot;PATH&amp;quot; is the path to &amp;quot;MYPROGRAM.desktop.template&amp;quot;, relative to the working directory of the script. We assume that &amp;quot;PATH2&amp;quot; is the path to the final location of &amp;quot;MYPROGRAM.desktop&amp;quot;, relative to the working directory of the script.)&lt;br /&gt;
&lt;br /&gt;
{{note|Names of .po files):For intltool, it is ''required'' that the .po files have the name &amp;lt;languagecode&amp;gt;.po without other characters (NOT programname_&amp;lt;languagecode&amp;gt;.po). This is important because intltool-merge simply uses the .po file name (without &amp;quot;.po&amp;quot;) as language key in the .desktop file.}}&lt;br /&gt;
&lt;br /&gt;
== Special cases (plugins, multiple catalogs, etc.) ==&lt;br /&gt;
&lt;br /&gt;
=== Runtime Loading Of Catalogs ===&lt;br /&gt;
&lt;br /&gt;
To have translations show up properly in an application, the name of the .pot file must match the name of the message catalog (.mo) file that your application will read at runtime. But what name will be used at runtime?&lt;br /&gt;
&lt;br /&gt;
In general, it will be the value returned by &amp;lt;tt&amp;gt;{{class|KGlobal}}::instance()-&amp;gt;instanceName()&amp;lt;/tt&amp;gt;. But what will that be? The general rules for standalone applications are:&lt;br /&gt;
* the message catalog will default to the name of the application passed as the first argument to {{class|KAboutData}}&lt;br /&gt;
* if your code calls &amp;lt;tt&amp;gt;{{class|KLocale}}::setMainCatalog()&amp;lt;/tt&amp;gt;, that name will be used instead&lt;br /&gt;
* if your code calls &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt;, the specified catalog will also be searched in addition to the main catalog&lt;br /&gt;
&lt;br /&gt;
If your code does not call either of the {{class|KLocale}} methods mentioned above and your application is a plugin, it gets a little more complicated. If your code exports your plugin using the &amp;lt;tt&amp;gt;K_EXPORT_COMPONENT_FACTORY&amp;lt;/tt&amp;gt; macro, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
K_EXPORT_COMPONENT_FACTORY( libkhtmlkttsdplugin, KGenericFactory&amp;lt;KHTMLPluginKTTSD&amp;gt;(&amp;quot;khtmlkttsd&amp;quot;) )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then the catalog name will be the name passed in the {{class|KGenericFactory}} constructor - in the example above that woudl be &amp;lt;tt&amp;gt;khtmlkttsd&amp;lt;/tt&amp;gt;. This is because the macro creates a {{class|Kinstance}} for you with the specified name.&lt;br /&gt;
&lt;br /&gt;
However, some classes, such as &amp;lt;tt&amp;gt;KTextEditor&amp;lt;/tt&amp;gt; create a &amp;lt;tt&amp;gt;KPart&amp;lt;/tt&amp;gt; containing your component and the name passed in the macro is not used. In this case, you should call &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt; in the component's constructor.&lt;br /&gt;
&lt;br /&gt;
If in doubt, the safest thing to do is to call &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{tip|If you are not using the export macro for your plugin, you probably should be. See the API documentation of KGenericFactory for more information.}}&lt;br /&gt;
&lt;br /&gt;
Calling &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt; if the catalog has already been inserted does nothing. However, calling &amp;lt;tt&amp;gt;{{class|KLocale}}::removeCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt; removes the catalog no matter how many times it has been inserted. Therefore, take care that you do not inadvertently remove the catalog when multiple components are sharing a single catalog. For example, the following sequence will break translations: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
// Component A loads and uses catalog xyz by calling&lt;br /&gt;
insertCatalogue(&amp;quot;xyz&amp;quot;);&lt;br /&gt;
// Component B loads and also uses the same catalog.&lt;br /&gt;
insertCatalogue(&amp;quot;xyz&amp;quot;);&lt;br /&gt;
// component B unloads and calls&lt;br /&gt;
removeCatalogue(&amp;quot;xyz&amp;quot;)&lt;br /&gt;
// Component A now doesn't translate properly.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that a sequence such as above will occur automatically if both components A and B are loaded using the &amp;lt;tt&amp;gt;K_EXPORT_COMPONENT_FACTORY&amp;lt;/tt&amp;gt; macro and pass the same name argument to the KGenericFactory constructor.&lt;br /&gt;
&lt;br /&gt;
=== Naming .pot Files ===&lt;br /&gt;
&lt;br /&gt;
The name that you settle on for both the .pot file and catalog should be governed by where your code resides. If it is a component of another application and resides in that application's source tree, you'll want to share the main catalog of the application. &lt;br /&gt;
&lt;br /&gt;
If is a component of another application but resides elsewhere in the code repository, you will probably have to create a separate .pot, but keep in mind that .pot filenames must be unique across all of KDE.&lt;br /&gt;
&lt;br /&gt;
If it is a component of another application, but resides in the source tree of a second application, you should share with the second application. For example, the KDE text-to-speach daemon (KTTSD) includes a plugin for embedded Kate in {{path|kdeaccessibility/kttsd}} source tree. Since the plugin is not installed unless kttsd is installed, it shares its catalog with kttsd and calls &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(&amp;quot;kttsd&amp;quot;)&amp;lt;/tt&amp;gt; to do this.&lt;br /&gt;
&lt;br /&gt;
==== Declarative plasmoids ====&lt;br /&gt;
For plasmoids written in pure qml, the .pot file must be names the same as its plugin name (with '''plasma_applet_''' prefix), specified in its desktop file as '''X-KDE-PluginInfo-Name'''. For instance if we have '''X-KDE-PluginInfo-Name=org.kde.active.activityscreen''' the .pot file will be called '''plasma_applet_org.kde.active.activityscreen.pot'''. The KLocale::insertCatalog() call is performed by the declarative scriptengine itself, so the developer of the qml plasmoid doesn't have to worry about that.&lt;br /&gt;
&lt;br /&gt;
If the qml files are developed in the form of package instead of an autonomous plasmoid (for instance a package loaded by a C++ plasmoid) the .pot file will have the prefix '''plasma_package_''' instead.&lt;br /&gt;
&lt;br /&gt;
== Handbooks ==&lt;br /&gt;
&lt;br /&gt;
Handbooks, which are written in docbook format, are handled different from applications. The translated Handbooks are committed into the l10n module in the docs folder under each language. In addition, the docs folder is broken down by module and application. For example, the German Kate Handbook is committed to the {{path|l10n-kde4/de/docs/kde-baseapps/kate/}} folder. When compiled, the German Kate Handbook is installed to {{path|$KDEDIR/share/doc/HTML/de/kate/index.cache.bz2}}.&lt;br /&gt;
&lt;br /&gt;
Note that it is up to each translation team to generate the translated Handbook when they feel it is complete.&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems</id>
		<title>Development/Tutorials/Localization/i18n Build Systems</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems"/>
				<updated>2012-08-03T15:03:09Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Declarative plasmoids */ typo--&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Localization|&lt;br /&gt;
&lt;br /&gt;
name=Building KDE's l10n Module|&lt;br /&gt;
&lt;br /&gt;
pre=[[../i18n|Writing Applications With Localization in Mind]]|&lt;br /&gt;
next=[[../Language Change|Dealing with language changes]]|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Now that your application is ready to be localized, we next look at how to incorporate the necessary mechanisms into the CMake build system of your application.&lt;br /&gt;
&lt;br /&gt;
First we'll explain the &amp;quot;theory&amp;quot; of the steps that need to happen from extracting message strings to installing the generated .po files. After that we'll look at how to implement those steps ([[#Theory: The xgettext toolchain]]). If your application is developed in KDE's subversion repository, many of those steps will happen automatically (see [[#handling i18n in KDE's subversion repository]]). Else you will want to read on in the [[#handling i18n in third party applications]] section.&lt;br /&gt;
&lt;br /&gt;
== Theory: The xgettext toolchain ==&lt;br /&gt;
&lt;br /&gt;
Making translations work consists of the following steps:&lt;br /&gt;
# Extract the translatable strings&lt;br /&gt;
# Merge the new or changed strings with existing translations&lt;br /&gt;
# Compile the translations into message catalogs&lt;br /&gt;
# Install the message catalogs&lt;br /&gt;
# Use the message catalogs in the application&lt;br /&gt;
&lt;br /&gt;
=== Extracting the strings ===&lt;br /&gt;
&lt;br /&gt;
In this step, all the strings you marked as i18n()/ki18n()/etc. in your sources need to be collected into a translation template (.pot) file. Some translateable strings are also contained in .ui, .rc, or .kcfg files. Also tips-of-the-day need to be collected into the .pot file.&lt;br /&gt;
&lt;br /&gt;
These steps are handled by {{path|xgettext}}, {{path|extractrc}}, and {{path|preparetips}} programs, respectively. In some cases you may also need {{path|extractattr}}.&lt;br /&gt;
&lt;br /&gt;
=== Merging translations ===&lt;br /&gt;
&lt;br /&gt;
Generally, only a few translatable string will change at a time, in an application. Some will be removed, some will be added, some will be changed into different strings, and some will be moved around in the source files. These changes need to be reflected in the translations, but of course it would be a huge effort to redo the entire translation every time a string was changed. Rather the changes should be merged with the existing translations. This is the job of the {{path|msgmerge}} tool.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the translations ===&lt;br /&gt;
&lt;br /&gt;
In order to make message lookup fast, the .po files need to be compiled into so-called &amp;quot;message catalogs&amp;quot; (.mo / .gmo). This is done using the {{path|msgfmt}} tool.&lt;br /&gt;
&lt;br /&gt;
=== Installing the message catalogs ===&lt;br /&gt;
&lt;br /&gt;
The compiled message catalogs need to be installed alongside the application. In KDE, the standard location for message catalogs is {{path|$KDEDIR/share/locale/xx/LC_MESSAGES/}}.&lt;br /&gt;
&lt;br /&gt;
=== Using the message catalogs ===&lt;br /&gt;
&lt;br /&gt;
Finally, when the application is run, it needs to load the appropriate message catalog in order to be able to look up and show translated strings. In KDE applications, this is the job of the {{class|KLocale}} class, and in the great majority of cases happens automatically.&lt;br /&gt;
&lt;br /&gt;
For some special cases, such as plugins, look at [[#Runtime Loading Of Catalogs]].&lt;br /&gt;
&lt;br /&gt;
== handling i18n in KDE's subversion repository ==&lt;br /&gt;
&lt;br /&gt;
If your application is developed inside KDE's subversion repository, most of the steps outlined above are automated. In this case, generally, all you will need to do is provide a simple script called {{path|Messages.sh}}, which we will look at below.&lt;br /&gt;
&lt;br /&gt;
In addition, if your top-level folder and .pot file have the same name, the svn2dist script will automatically include .po files when you use it to make a source tarball for your app. &lt;br /&gt;
&lt;br /&gt;
Of course, for the curious, a more detailed account of what happens behind the scenes is also provided.&lt;br /&gt;
&lt;br /&gt;
=== Writing a Messages.sh script ===&lt;br /&gt;
&lt;br /&gt;
Basically, the only thing that is necessary to prepare and install translations for applications in KDE's subversion repository, is to provide information, which sources, ui-files or tips need to be translated. For this purpose, you write a small script called {{path|Messages.sh}} and place it in your sources. Here is an example with inline comments:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#!bin/sh&lt;br /&gt;
&lt;br /&gt;
# invoke the extractrc script on all .ui, .rc, and .kcfg files in the sources&lt;br /&gt;
# the results are stored in a pseudo .cpp file to be picked up by xgettext.&lt;br /&gt;
$EXTRACTRC `find . -name \*.rc -o -name \*.ui -o -name \*.kcfg` &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
# if your application contains tips-of-the-day, call preparetips as well.&lt;br /&gt;
$PREPARETIPS &amp;gt; tips.cpp&lt;br /&gt;
# call xgettext on all source files. If your sources have other filename&lt;br /&gt;
# extensions besides .cc, .cpp, and .h, just add them in the find call.&lt;br /&gt;
$XGETTEXT `find . -name \*.cc -o -name \*.cpp -o -name \*.h -name \*.qml` -o $podir/APPNAME.pot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, this script contains only three actual lines of code, and not all may even be needed. The $XGETTEXT, $PREPARETIPS, $EXTRACTRC, and $podir environment variables are predefined, you do not need to worry about setting these. The only thing that you will need to do is to replace &amp;quot;APPNAME&amp;quot; with the name of your application (but see [[#Naming .pot Files]] for exceptions).&lt;br /&gt;
&lt;br /&gt;
Translatable strings are automatically extracted from C++ files. For non-C++ files, the following scripts are used&lt;br /&gt;
* $EXTRACTRC - Extract translatable strings from xml configuration and ui files.&lt;br /&gt;
* $EXTRACT_GRANTLEE_TEMPLATE_STRINGS - Extract translatable strings from Grantlee template files.&lt;br /&gt;
&lt;br /&gt;
Try to make sure your Messages.sh script collects only those messages that are really needed. If in doubt, look at other Messages.sh files in the KDE subversion repository for inspiration, or -- of course -- ask.&lt;br /&gt;
&lt;br /&gt;
=== What's happening behind the scenes ===&lt;br /&gt;
&lt;br /&gt;
{{tip|If your application is in the KDE code repository, all this happens automatically. If your code is not in the KDE repository, you must perform these steps yourself. See [[#handling i18n in third party applications]].}}&lt;br /&gt;
&lt;br /&gt;
Periodically, the script {{path|extract-messages.sh}} (a.k.a. scripty) runs on the KDE server. This program basically calls all Messages.sh scripts in the repository with the appropriate parameters. The extracted messages are stored in template (.pot) files in the templates folder of the l10n module. See [[What Is Scripty]] for more information. &lt;br /&gt;
&lt;br /&gt;
The KDE translation teams translate the messages and commit them into a messages folder corresponding to the language, which is further broken down by module. For example, German translated messages for konqueror are committed to {{path|l10n/de/messages/kdebase/konqueror.po}}. &lt;br /&gt;
&lt;br /&gt;
When the l10n module is built, the .po files are compiled into a binary format for fast lookup and installed as .mo files to {{path|$KDEDIR/share/locale/xx/LC_MESSAGES/}}, where xx is the two-letter ISO 639 code for the language. These are called the message catalogs. &lt;br /&gt;
&lt;br /&gt;
At runtime, the &amp;lt;tt&amp;gt;i18n(...)&amp;lt;/tt&amp;gt; function, using the original string you coded, looks up the string in the message catalog of the user's desktop language and returns the translated string. If the message catalog is missing, or the specific string is not found, &amp;lt;tt&amp;gt;i18n(...)&amp;lt;/tt&amp;gt; falls back to the original string in your code. &lt;br /&gt;
&lt;br /&gt;
.desktop files in your project are handled separately. {{path|makemessages}} extracts strings, such as Name and Comment from the .desktop files and places them into a file named {{path|desktop_mmmm.pot}}, where mmmm is the module name, in the templates folder. Once translators have translated this file, makemessages inserts the translated strings back into the .desktop files. The list of strings extracted is in {{path|l10n/scripts/apply.cc}}. Here's the code that checks for them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
if (checkTag(&amp;quot;Name&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Comment&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Language&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Keywords&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;About&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Description&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;GenericName&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Query&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;ExtraNames&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== handling i18n in third party applications ==&lt;br /&gt;
&lt;br /&gt;
If your application is developed outside of KDE's subversion repository, you need to take care of generating and installing message catalogs yourself. This is not too hard to do, but you should make sure you have a basic understanding of all steps involved, so you will probably want to read [[#Theory: The xgettext toolchain]], first.&lt;br /&gt;
&lt;br /&gt;
Also, there is more than one way to deal with i18n in your application. We will outline one approach to do so for simple applications, but you may want to diverge from this, if you like to.&lt;br /&gt;
&lt;br /&gt;
=== General considerations ===&lt;br /&gt;
&lt;br /&gt;
The i18n generation process can roughly be divided into two steps:&lt;br /&gt;
&lt;br /&gt;
# Extracting and merging messages&lt;br /&gt;
# Compiling and installing message catalogs&lt;br /&gt;
&lt;br /&gt;
The first step really concerns the ''sources'', while the second step is a natural part of compiling and installing an application. Hence, while the second step should definitely be incorporated into the build system for your application (we assume CMake, here), there is no striking reason for the first step to be handled by the build system.&lt;br /&gt;
&lt;br /&gt;
In fact, the extraction and merging of messages does not map well onto the CMake concept of out-of-source builds, and CMake can't provide too much help for this step, either.&lt;br /&gt;
&lt;br /&gt;
Hence, in this tutorial, we will handle the first step with a standalone shell script, and only the second step will be handled by CMake.&lt;br /&gt;
&lt;br /&gt;
=== Extracting and merging messages ===&lt;br /&gt;
&lt;br /&gt;
If you have read the section [[#handling i18n in KDE's subversion repository]] you will know that in the KDE repository, message extraction and merging is handled by a simple script called Messages.sh, which is invoked by a script called {{path|extract-messages.sh}}. Outside of KDE's repository, you will need to take care of both parts, but fortunately, this is easy enough. Here's a sample script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BASEDIR=&amp;quot;../rkward/&amp;quot;	# root of translatable sources&lt;br /&gt;
PROJECT=&amp;quot;rkward&amp;quot;	# project name&lt;br /&gt;
BUGADDR=&amp;quot;http://sourceforge.net/tracker/?group_id=50231&amp;amp;atid=459007&amp;quot;	# MSGID-Bugs&lt;br /&gt;
WDIR=`pwd`		# working dir&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Preparing rc files&amp;quot;&lt;br /&gt;
cd ${BASEDIR}&lt;br /&gt;
# we use simple sorting to make sure the lines do not jump around too much from system to system&lt;br /&gt;
find . -name '*.rc' -o -name '*.ui' -o -name '*.kcfg' | sort &amp;gt; ${WDIR}/rcfiles.list&lt;br /&gt;
xargs --arg-file=${WDIR}/rcfiles.list extractrc &amp;gt; ${WDIR}/rc.cpp&lt;br /&gt;
# additional string for KAboutData&lt;br /&gt;
echo 'i18nc(&amp;quot;NAME OF TRANSLATORS&amp;quot;,&amp;quot;Your names&amp;quot;);' &amp;gt;&amp;gt; ${WDIR}/rc.cpp&lt;br /&gt;
echo 'i18nc(&amp;quot;EMAIL OF TRANSLATORS&amp;quot;,&amp;quot;Your emails&amp;quot;);' &amp;gt;&amp;gt; ${WDIR}/rc.cpp&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
echo &amp;quot;Done preparing rc files&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Extracting messages&amp;quot;&lt;br /&gt;
cd ${BASEDIR}&lt;br /&gt;
# see above on sorting&lt;br /&gt;
find . -name '*.cpp' -o -name '*.h' -o -name '*.c' | sort &amp;gt; ${WDIR}/infiles.list&lt;br /&gt;
echo &amp;quot;rc.cpp&amp;quot; &amp;gt;&amp;gt; ${WDIR}/infiles.list&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
xgettext --from-code=UTF-8 -C -kde -ci18n -ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 -ktr2i18n:1 \&lt;br /&gt;
	-kI18N_NOOP:1 -kI18N_NOOP2:1c,2 -kaliasLocale -kki18n:1 -kki18nc:1c,2 -kki18np:1,2 -kki18ncp:1c,2,3 \&lt;br /&gt;
	--msgid-bugs-address=&amp;quot;${BUGADDR}&amp;quot; \&lt;br /&gt;
	--files-from=infiles.list -D ${BASEDIR} -D ${WDIR} -o ${PROJECT}.pot || { echo &amp;quot;error while calling xgettext. aborting.&amp;quot;; exit 1; }&lt;br /&gt;
echo &amp;quot;Done extracting messages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Merging translations&amp;quot;&lt;br /&gt;
catalogs=`find . -name '*.po'`&lt;br /&gt;
for cat in $catalogs; do&lt;br /&gt;
  echo $cat&lt;br /&gt;
  msgmerge -o $cat.new $cat ${PROJECT}.pot&lt;br /&gt;
  mv $cat.new $cat&lt;br /&gt;
done&lt;br /&gt;
echo &amp;quot;Done merging translations&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Cleaning up&amp;quot;&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
rm rcfiles.list&lt;br /&gt;
rm infiles.list&lt;br /&gt;
rm rc.cpp&lt;br /&gt;
echo &amp;quot;Done&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course you will want to adjust the variable definitions at the top, and -- if needed -- add code to extract tips-of-the-day or other additional strings.&lt;br /&gt;
&lt;br /&gt;
The example script assumes that all .po files and the .pot file are kept in a single directory, which is appropriate for most projects.&lt;br /&gt;
&lt;br /&gt;
=== Compiling and installing message catalogs ===&lt;br /&gt;
&lt;br /&gt;
Assuming you use the script from the previous section, you can place the following CMakeLists.txt in the directory containing the .po files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt)&lt;br /&gt;
&lt;br /&gt;
IF(NOT GETTEXT_MSGFMT_EXECUTABLE)&lt;br /&gt;
	MESSAGE(&lt;br /&gt;
&amp;quot;------&lt;br /&gt;
                 NOTE: msgfmt not found. Translations will *not* be installed&lt;br /&gt;
------&amp;quot;)&lt;br /&gt;
ELSE(NOT GETTEXT_MSGFMT_EXECUTABLE)&lt;br /&gt;
&lt;br /&gt;
        SET(catalogname rkward)&lt;br /&gt;
&lt;br /&gt;
        ADD_CUSTOM_TARGET(translations ALL)&lt;br /&gt;
&lt;br /&gt;
        FILE(GLOB PO_FILES *.po)&lt;br /&gt;
&lt;br /&gt;
        FOREACH(_poFile ${PO_FILES})&lt;br /&gt;
                GET_FILENAME_COMPONENT(_poFileName ${_poFile} NAME)&lt;br /&gt;
                STRING(REGEX REPLACE &amp;quot;^${catalogname}_?&amp;quot; &amp;quot;&amp;quot; _langCode ${_poFileName} )&lt;br /&gt;
                STRING(REGEX REPLACE &amp;quot;\\.po$&amp;quot; &amp;quot;&amp;quot; _langCode ${_langCode} )&lt;br /&gt;
&lt;br /&gt;
                IF( _langCode )&lt;br /&gt;
                        GET_FILENAME_COMPONENT(_lang ${_poFile} NAME_WE)&lt;br /&gt;
                        SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo)&lt;br /&gt;
&lt;br /&gt;
                        ADD_CUSTOM_COMMAND(TARGET translations&lt;br /&gt;
                                COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check -o ${_gmoFile} ${_poFile}&lt;br /&gt;
                                DEPENDS ${_poFile})&lt;br /&gt;
                        INSTALL(FILES ${_gmoFile} DESTINATION ${LOCALE_INSTALL_DIR}/${_langCode}/LC_MESSAGES/ RENAME ${catalogname}.mo)&lt;br /&gt;
                ENDIF( _langCode )&lt;br /&gt;
&lt;br /&gt;
        ENDFOREACH(_poFile ${PO_FILES})&lt;br /&gt;
&lt;br /&gt;
ENDIF(NOT GETTEXT_MSGFMT_EXECUTABLE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This iterates over all .po files in the directory, compiles them using msgfmt, and installs them to the standard location. You will want to change &amp;quot;catalogname&amp;quot; to the name of your application.&lt;br /&gt;
&lt;br /&gt;
=== Getting translations ===&lt;br /&gt;
&lt;br /&gt;
Now you just have to find translators to translate the extracted messages into the various languages. As your application gets used by more people, you will find that translators will volunteer to do this. Translated PO files then have to be stored in the po folder with the naming scheme &amp;lt;languagecode&amp;gt;.po.&lt;br /&gt;
&lt;br /&gt;
=== Translating .desktop Files ===&lt;br /&gt;
&lt;br /&gt;
Translating .desktop files is a bit tricky because the translation of .desktop files isn't fetched from .po/.gmo files, but must be part of the .desktop file itself. So we have 2 tasks:&lt;br /&gt;
&lt;br /&gt;
* extract messages from the .desktop file&lt;br /&gt;
* merge the translations in the .desktop file&lt;br /&gt;
&lt;br /&gt;
Our friends from Gnome provide the [http://freedesktop.org/wiki/Software/intltool intltool] package. While this tools is mainly written for the old autotools build system (but KDE uses CMake since KDE 4), we can use this package nevertheless for our purpose. Here is a step-by-step guide:&lt;br /&gt;
&lt;br /&gt;
# Install the [http://freedesktop.org/wiki/Software/intltool intltool] package&lt;br /&gt;
# We assume that your .desktop file is named &amp;quot;MYPROGRAM.desktop&amp;quot;.&lt;br /&gt;
# Make a copy of &amp;quot;MYPROGRAM.desktop&amp;quot; which is named &amp;quot;MYPROGRAM.desktop.template&amp;quot;.&lt;br /&gt;
# In MYPROGRAM.desktop.template substitute the keys &amp;quot;Name&amp;quot; by &amp;quot;_Name&amp;quot;, &amp;quot;GenericName&amp;quot; by &amp;quot;_GenericName&amp;quot; and &amp;quot;Comment&amp;quot; by &amp;quot;_Comment&amp;quot;.&lt;br /&gt;
# Remove all translations from &amp;quot;MYPROGRAM.desktop.template&amp;quot;.&lt;br /&gt;
# Add the following lines to the above described build script, at the end of the section &amp;quot;Preparing rc files&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
intltool-extract --quiet --type=gettext/ini PATH/MYPROGRAM.desktop.template&lt;br /&gt;
cat PATH/MYPROGRAM.desktop.template.h &amp;gt;&amp;gt; ${WDIR}/rc.cpp&lt;br /&gt;
rm PATH/MYPROGRAM.desktop.template.h&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
intltool-extract will create a dummy C++ header (PATH/MYPROGRAM.desktop.template.h) with the strings whose key starts with &amp;quot;_&amp;quot;. We append the content of this header file into our &amp;quot;rc.cpp&amp;quot; and remove remove the file than. (We assume that &amp;quot;PATH&amp;quot; is the path to &amp;quot;MYPROGRAM.desktop.template&amp;quot;, relative to the working directory of the script.)&lt;br /&gt;
# Add &amp;quot;-kN_:1&amp;quot; as additional parameter to the xgettext call in the section &amp;quot;Extracting messages&amp;quot;. This is necessary because dummy code that intltool-extract produces uses &amp;quot;N_()&amp;quot; instead of &amp;quot;i18n()&amp;quot;.&lt;br /&gt;
# Add the following lines to the above described build script, at the end of the section &amp;quot;Merging translations&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
intltool-merge --quiet --desktop-style ${WDIR} PATH/MYPROGRAM.desktop.template PATH2/MYPROGRAM.desktop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will produce MYPROGRAM.desktop from MYPROGRAM.desktop.template, inserting all available translations in the .po files in the directory ${WDIR}. (We assume that &amp;quot;PATH&amp;quot; is the path to &amp;quot;MYPROGRAM.desktop.template&amp;quot;, relative to the working directory of the script. We assume that &amp;quot;PATH2&amp;quot; is the path to the final location of &amp;quot;MYPROGRAM.desktop&amp;quot;, relative to the working directory of the script.)&lt;br /&gt;
&lt;br /&gt;
{{note|Names of .po files):For intltool, it is ''required'' that the .po files have the name &amp;lt;languagecode&amp;gt;.po without other characters (NOT programname_&amp;lt;languagecode&amp;gt;.po). This is important because intltool-merge simply uses the .po file name (without &amp;quot;.po&amp;quot;) as language key in the .desktop file.}}&lt;br /&gt;
&lt;br /&gt;
== Special cases (plugins, multiple catalogs, etc.) ==&lt;br /&gt;
&lt;br /&gt;
=== Runtime Loading Of Catalogs ===&lt;br /&gt;
&lt;br /&gt;
To have translations show up properly in an application, the name of the .pot file must match the name of the message catalog (.mo) file that your application will read at runtime. But what name will be used at runtime?&lt;br /&gt;
&lt;br /&gt;
In general, it will be the value returned by &amp;lt;tt&amp;gt;{{class|KGlobal}}::instance()-&amp;gt;instanceName()&amp;lt;/tt&amp;gt;. But what will that be? The general rules for standalone applications are:&lt;br /&gt;
* the message catalog will default to the name of the application passed as the first argument to {{class|KAboutData}}&lt;br /&gt;
* if your code calls &amp;lt;tt&amp;gt;{{class|KLocale}}::setMainCatalog()&amp;lt;/tt&amp;gt;, that name will be used instead&lt;br /&gt;
* if your code calls &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt;, the specified catalog will also be searched in addition to the main catalog&lt;br /&gt;
&lt;br /&gt;
If your code does not call either of the {{class|KLocale}} methods mentioned above and your application is a plugin, it gets a little more complicated. If your code exports your plugin using the &amp;lt;tt&amp;gt;K_EXPORT_COMPONENT_FACTORY&amp;lt;/tt&amp;gt; macro, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
K_EXPORT_COMPONENT_FACTORY( libkhtmlkttsdplugin, KGenericFactory&amp;lt;KHTMLPluginKTTSD&amp;gt;(&amp;quot;khtmlkttsd&amp;quot;) )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then the catalog name will be the name passed in the {{class|KGenericFactory}} constructor - in the example above that woudl be &amp;lt;tt&amp;gt;khtmlkttsd&amp;lt;/tt&amp;gt;. This is because the macro creates a {{class|Kinstance}} for you with the specified name.&lt;br /&gt;
&lt;br /&gt;
However, some classes, such as &amp;lt;tt&amp;gt;KTextEditor&amp;lt;/tt&amp;gt; create a &amp;lt;tt&amp;gt;KPart&amp;lt;/tt&amp;gt; containing your component and the name passed in the macro is not used. In this case, you should call &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt; in the component's constructor.&lt;br /&gt;
&lt;br /&gt;
If in doubt, the safest thing to do is to call &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{tip|If you are not using the export macro for your plugin, you probably should be. See the API documentation of KGenericFactory for more information.}}&lt;br /&gt;
&lt;br /&gt;
Calling &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt; if the catalog has already been inserted does nothing. However, calling &amp;lt;tt&amp;gt;{{class|KLocale}}::removeCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt; removes the catalog no matter how many times it has been inserted. Therefore, take care that you do not inadvertently remove the catalog when multiple components are sharing a single catalog. For example, the following sequence will break translations: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
// Component A loads and uses catalog xyz by calling&lt;br /&gt;
insertCatalogue(&amp;quot;xyz&amp;quot;);&lt;br /&gt;
// Component B loads and also uses the same catalog.&lt;br /&gt;
insertCatalogue(&amp;quot;xyz&amp;quot;);&lt;br /&gt;
// component B unloads and calls&lt;br /&gt;
removeCatalogue(&amp;quot;xyz&amp;quot;)&lt;br /&gt;
// Component A now doesn't translate properly.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that a sequence such as above will occur automatically if both components A and B are loaded using the &amp;lt;tt&amp;gt;K_EXPORT_COMPONENT_FACTORY&amp;lt;/tt&amp;gt; macro and pass the same name argument to the KGenericFactory constructor.&lt;br /&gt;
&lt;br /&gt;
=== Naming .pot Files ===&lt;br /&gt;
&lt;br /&gt;
The name that you settle on for both the .pot file and catalog should be governed by where your code resides. If it is a component of another application and resides in that application's source tree, you'll want to share the main catalog of the application. &lt;br /&gt;
&lt;br /&gt;
If is a component of another application but resides elsewhere in the code repository, you will probably have to create a separate .pot, but keep in mind that .pot filenames must be unique across all of KDE.&lt;br /&gt;
&lt;br /&gt;
If it is a component of another application, but resides in the source tree of a second application, you should share with the second application. For example, the KDE text-to-speach daemon (KTTSD) includes a plugin for embedded Kate in {{path|kdeaccessibility/kttsd}} source tree. Since the plugin is not installed unless kttsd is installed, it shares its catalog with kttsd and calls &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(&amp;quot;kttsd&amp;quot;)&amp;lt;/tt&amp;gt; to do this.&lt;br /&gt;
&lt;br /&gt;
==== Declarative plasmoids ====&lt;br /&gt;
For plasmoids written in pure qml, the .pot file must be names the same as its plugin name (with '''plasma_applet_''' prefix), specified in its desktop file as '''X-KDE-PluginInfo-Name'''. For instance if we have '''X-KDE-PluginInfo-Name=org.kde.active.activityscreen''' the .pot file will be called '''plasma_applet_org.kde.active.activityscreen.pot'''. The KLocale::insertCatalog() call is performed by the declarative scriptengine itself, so the developer of the qml plasmoid doesn't have to worry about that.&lt;br /&gt;
&lt;br /&gt;
If the qml files are developed in the form of package instead of an autonomous plasmoid (for instance a package loaded by a C++ plasmoid) the .pot file will have the prefix '''plasma_package_''' instead.&lt;br /&gt;
&lt;br /&gt;
== Handbooks ==&lt;br /&gt;
&lt;br /&gt;
Handbooks, which are written in docbook format, are handled different from applications. The translated Handbooks are committed into the l10n module in the docs folder under each language. In addition, the docs folder is broken down by module and application. For example, the German Kate Handbook is committed to the {{path|l10n-kde4/de/docs/kde-baseapps/kate/}} folder. When compiled, the German Kate Handbook is installed to {{path|$KDEDIR/share/doc/HTML/de/kate/index.cache.bz2}}.&lt;br /&gt;
&lt;br /&gt;
Note that it is up to each translation team to generate the translated Handbook when they feel it is complete.&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems</id>
		<title>Development/Tutorials/Localization/i18n Build Systems</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems"/>
				<updated>2012-08-03T14:45:49Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* handling i18n in KDE's subversion repository */ typo--&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Localization|&lt;br /&gt;
&lt;br /&gt;
name=Building KDE's l10n Module|&lt;br /&gt;
&lt;br /&gt;
pre=[[../i18n|Writing Applications With Localization in Mind]]|&lt;br /&gt;
next=[[../Language Change|Dealing with language changes]]|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Now that your application is ready to be localized, we next look at how to incorporate the necessary mechanisms into the CMake build system of your application.&lt;br /&gt;
&lt;br /&gt;
First we'll explain the &amp;quot;theory&amp;quot; of the steps that need to happen from extracting message strings to installing the generated .po files. After that we'll look at how to implement those steps ([[#Theory: The xgettext toolchain]]). If your application is developed in KDE's subversion repository, many of those steps will happen automatically (see [[#handling i18n in KDE's subversion repository]]). Else you will want to read on in the [[#handling i18n in third party applications]] section.&lt;br /&gt;
&lt;br /&gt;
== Theory: The xgettext toolchain ==&lt;br /&gt;
&lt;br /&gt;
Making translations work consists of the following steps:&lt;br /&gt;
# Extract the translatable strings&lt;br /&gt;
# Merge the new or changed strings with existing translations&lt;br /&gt;
# Compile the translations into message catalogs&lt;br /&gt;
# Install the message catalogs&lt;br /&gt;
# Use the message catalogs in the application&lt;br /&gt;
&lt;br /&gt;
=== Extracting the strings ===&lt;br /&gt;
&lt;br /&gt;
In this step, all the strings you marked as i18n()/ki18n()/etc. in your sources need to be collected into a translation template (.pot) file. Some translateable strings are also contained in .ui, .rc, or .kcfg files. Also tips-of-the-day need to be collected into the .pot file.&lt;br /&gt;
&lt;br /&gt;
These steps are handled by {{path|xgettext}}, {{path|extractrc}}, and {{path|preparetips}} programs, respectively. In some cases you may also need {{path|extractattr}}.&lt;br /&gt;
&lt;br /&gt;
=== Merging translations ===&lt;br /&gt;
&lt;br /&gt;
Generally, only a few translatable string will change at a time, in an application. Some will be removed, some will be added, some will be changed into different strings, and some will be moved around in the source files. These changes need to be reflected in the translations, but of course it would be a huge effort to redo the entire translation every time a string was changed. Rather the changes should be merged with the existing translations. This is the job of the {{path|msgmerge}} tool.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the translations ===&lt;br /&gt;
&lt;br /&gt;
In order to make message lookup fast, the .po files need to be compiled into so-called &amp;quot;message catalogs&amp;quot; (.mo / .gmo). This is done using the {{path|msgfmt}} tool.&lt;br /&gt;
&lt;br /&gt;
=== Installing the message catalogs ===&lt;br /&gt;
&lt;br /&gt;
The compiled message catalogs need to be installed alongside the application. In KDE, the standard location for message catalogs is {{path|$KDEDIR/share/locale/xx/LC_MESSAGES/}}.&lt;br /&gt;
&lt;br /&gt;
=== Using the message catalogs ===&lt;br /&gt;
&lt;br /&gt;
Finally, when the application is run, it needs to load the appropriate message catalog in order to be able to look up and show translated strings. In KDE applications, this is the job of the {{class|KLocale}} class, and in the great majority of cases happens automatically.&lt;br /&gt;
&lt;br /&gt;
For some special cases, such as plugins, look at [[#Runtime Loading Of Catalogs]].&lt;br /&gt;
&lt;br /&gt;
== handling i18n in KDE's subversion repository ==&lt;br /&gt;
&lt;br /&gt;
If your application is developed inside KDE's subversion repository, most of the steps outlined above are automated. In this case, generally, all you will need to do is provide a simple script called {{path|Messages.sh}}, which we will look at below.&lt;br /&gt;
&lt;br /&gt;
In addition, if your top-level folder and .pot file have the same name, the svn2dist script will automatically include .po files when you use it to make a source tarball for your app. &lt;br /&gt;
&lt;br /&gt;
Of course, for the curious, a more detailed account of what happens behind the scenes is also provided.&lt;br /&gt;
&lt;br /&gt;
=== Writing a Messages.sh script ===&lt;br /&gt;
&lt;br /&gt;
Basically, the only thing that is necessary to prepare and install translations for applications in KDE's subversion repository, is to provide information, which sources, ui-files or tips need to be translated. For this purpose, you write a small script called {{path|Messages.sh}} and place it in your sources. Here is an example with inline comments:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#!bin/sh&lt;br /&gt;
&lt;br /&gt;
# invoke the extractrc script on all .ui, .rc, and .kcfg files in the sources&lt;br /&gt;
# the results are stored in a pseudo .cpp file to be picked up by xgettext.&lt;br /&gt;
$EXTRACTRC `find . -name \*.rc -o -name \*.ui -o -name \*.kcfg` &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
# if your application contains tips-of-the-day, call preparetips as well.&lt;br /&gt;
$PREPARETIPS &amp;gt; tips.cpp&lt;br /&gt;
# call xgettext on all source files. If your sources have other filename&lt;br /&gt;
# extensions besides .cc, .cpp, and .h, just add them in the find call.&lt;br /&gt;
$XGETTEXT `find . -name \*.cc -o -name \*.cpp -o -name \*.h -name \*.qml` -o $podir/APPNAME.pot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, this script contains only three actual lines of code, and not all may even be needed. The $XGETTEXT, $PREPARETIPS, $EXTRACTRC, and $podir environment variables are predefined, you do not need to worry about setting these. The only thing that you will need to do is to replace &amp;quot;APPNAME&amp;quot; with the name of your application (but see [[#Naming .pot Files]] for exceptions).&lt;br /&gt;
&lt;br /&gt;
Translatable strings are automatically extracted from C++ files. For non-C++ files, the following scripts are used&lt;br /&gt;
* $EXTRACTRC - Extract translatable strings from xml configuration and ui files.&lt;br /&gt;
* $EXTRACT_GRANTLEE_TEMPLATE_STRINGS - Extract translatable strings from Grantlee template files.&lt;br /&gt;
&lt;br /&gt;
Try to make sure your Messages.sh script collects only those messages that are really needed. If in doubt, look at other Messages.sh files in the KDE subversion repository for inspiration, or -- of course -- ask.&lt;br /&gt;
&lt;br /&gt;
=== What's happening behind the scenes ===&lt;br /&gt;
&lt;br /&gt;
{{tip|If your application is in the KDE code repository, all this happens automatically. If your code is not in the KDE repository, you must perform these steps yourself. See [[#handling i18n in third party applications]].}}&lt;br /&gt;
&lt;br /&gt;
Periodically, the script {{path|extract-messages.sh}} (a.k.a. scripty) runs on the KDE server. This program basically calls all Messages.sh scripts in the repository with the appropriate parameters. The extracted messages are stored in template (.pot) files in the templates folder of the l10n module. See [[What Is Scripty]] for more information. &lt;br /&gt;
&lt;br /&gt;
The KDE translation teams translate the messages and commit them into a messages folder corresponding to the language, which is further broken down by module. For example, German translated messages for konqueror are committed to {{path|l10n/de/messages/kdebase/konqueror.po}}. &lt;br /&gt;
&lt;br /&gt;
When the l10n module is built, the .po files are compiled into a binary format for fast lookup and installed as .mo files to {{path|$KDEDIR/share/locale/xx/LC_MESSAGES/}}, where xx is the two-letter ISO 639 code for the language. These are called the message catalogs. &lt;br /&gt;
&lt;br /&gt;
At runtime, the &amp;lt;tt&amp;gt;i18n(...)&amp;lt;/tt&amp;gt; function, using the original string you coded, looks up the string in the message catalog of the user's desktop language and returns the translated string. If the message catalog is missing, or the specific string is not found, &amp;lt;tt&amp;gt;i18n(...)&amp;lt;/tt&amp;gt; falls back to the original string in your code. &lt;br /&gt;
&lt;br /&gt;
.desktop files in your project are handled separately. {{path|makemessages}} extracts strings, such as Name and Comment from the .desktop files and places them into a file named {{path|desktop_mmmm.pot}}, where mmmm is the module name, in the templates folder. Once translators have translated this file, makemessages inserts the translated strings back into the .desktop files. The list of strings extracted is in {{path|l10n/scripts/apply.cc}}. Here's the code that checks for them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
if (checkTag(&amp;quot;Name&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Comment&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Language&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Keywords&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;About&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Description&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;GenericName&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;Query&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
if (checkTag(&amp;quot;ExtraNames&amp;quot;, in, argc, argv, newFile))&lt;br /&gt;
    continue;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== handling i18n in third party applications ==&lt;br /&gt;
&lt;br /&gt;
If your application is developed outside of KDE's subversion repository, you need to take care of generating and installing message catalogs yourself. This is not too hard to do, but you should make sure you have a basic understanding of all steps involved, so you will probably want to read [[#Theory: The xgettext toolchain]], first.&lt;br /&gt;
&lt;br /&gt;
Also, there is more than one way to deal with i18n in your application. We will outline one approach to do so for simple applications, but you may want to diverge from this, if you like to.&lt;br /&gt;
&lt;br /&gt;
=== General considerations ===&lt;br /&gt;
&lt;br /&gt;
The i18n generation process can roughly be divided into two steps:&lt;br /&gt;
&lt;br /&gt;
# Extracting and merging messages&lt;br /&gt;
# Compiling and installing message catalogs&lt;br /&gt;
&lt;br /&gt;
The first step really concerns the ''sources'', while the second step is a natural part of compiling and installing an application. Hence, while the second step should definitely be incorporated into the build system for your application (we assume CMake, here), there is no striking reason for the first step to be handled by the build system.&lt;br /&gt;
&lt;br /&gt;
In fact, the extraction and merging of messages does not map well onto the CMake concept of out-of-source builds, and CMake can't provide too much help for this step, either.&lt;br /&gt;
&lt;br /&gt;
Hence, in this tutorial, we will handle the first step with a standalone shell script, and only the second step will be handled by CMake.&lt;br /&gt;
&lt;br /&gt;
=== Extracting and merging messages ===&lt;br /&gt;
&lt;br /&gt;
If you have read the section [[#handling i18n in KDE's subversion repository]] you will know that in the KDE repository, message extraction and merging is handled by a simple script called Messages.sh, which is invoked by a script called {{path|extract-messages.sh}}. Outside of KDE's repository, you will need to take care of both parts, but fortunately, this is easy enough. Here's a sample script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
BASEDIR=&amp;quot;../rkward/&amp;quot;	# root of translatable sources&lt;br /&gt;
PROJECT=&amp;quot;rkward&amp;quot;	# project name&lt;br /&gt;
BUGADDR=&amp;quot;http://sourceforge.net/tracker/?group_id=50231&amp;amp;atid=459007&amp;quot;	# MSGID-Bugs&lt;br /&gt;
WDIR=`pwd`		# working dir&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Preparing rc files&amp;quot;&lt;br /&gt;
cd ${BASEDIR}&lt;br /&gt;
# we use simple sorting to make sure the lines do not jump around too much from system to system&lt;br /&gt;
find . -name '*.rc' -o -name '*.ui' -o -name '*.kcfg' | sort &amp;gt; ${WDIR}/rcfiles.list&lt;br /&gt;
xargs --arg-file=${WDIR}/rcfiles.list extractrc &amp;gt; ${WDIR}/rc.cpp&lt;br /&gt;
# additional string for KAboutData&lt;br /&gt;
echo 'i18nc(&amp;quot;NAME OF TRANSLATORS&amp;quot;,&amp;quot;Your names&amp;quot;);' &amp;gt;&amp;gt; ${WDIR}/rc.cpp&lt;br /&gt;
echo 'i18nc(&amp;quot;EMAIL OF TRANSLATORS&amp;quot;,&amp;quot;Your emails&amp;quot;);' &amp;gt;&amp;gt; ${WDIR}/rc.cpp&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
echo &amp;quot;Done preparing rc files&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Extracting messages&amp;quot;&lt;br /&gt;
cd ${BASEDIR}&lt;br /&gt;
# see above on sorting&lt;br /&gt;
find . -name '*.cpp' -o -name '*.h' -o -name '*.c' | sort &amp;gt; ${WDIR}/infiles.list&lt;br /&gt;
echo &amp;quot;rc.cpp&amp;quot; &amp;gt;&amp;gt; ${WDIR}/infiles.list&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
xgettext --from-code=UTF-8 -C -kde -ci18n -ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 -ktr2i18n:1 \&lt;br /&gt;
	-kI18N_NOOP:1 -kI18N_NOOP2:1c,2 -kaliasLocale -kki18n:1 -kki18nc:1c,2 -kki18np:1,2 -kki18ncp:1c,2,3 \&lt;br /&gt;
	--msgid-bugs-address=&amp;quot;${BUGADDR}&amp;quot; \&lt;br /&gt;
	--files-from=infiles.list -D ${BASEDIR} -D ${WDIR} -o ${PROJECT}.pot || { echo &amp;quot;error while calling xgettext. aborting.&amp;quot;; exit 1; }&lt;br /&gt;
echo &amp;quot;Done extracting messages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Merging translations&amp;quot;&lt;br /&gt;
catalogs=`find . -name '*.po'`&lt;br /&gt;
for cat in $catalogs; do&lt;br /&gt;
  echo $cat&lt;br /&gt;
  msgmerge -o $cat.new $cat ${PROJECT}.pot&lt;br /&gt;
  mv $cat.new $cat&lt;br /&gt;
done&lt;br /&gt;
echo &amp;quot;Done merging translations&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Cleaning up&amp;quot;&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
rm rcfiles.list&lt;br /&gt;
rm infiles.list&lt;br /&gt;
rm rc.cpp&lt;br /&gt;
echo &amp;quot;Done&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course you will want to adjust the variable definitions at the top, and -- if needed -- add code to extract tips-of-the-day or other additional strings.&lt;br /&gt;
&lt;br /&gt;
The example script assumes that all .po files and the .pot file are kept in a single directory, which is appropriate for most projects.&lt;br /&gt;
&lt;br /&gt;
=== Compiling and installing message catalogs ===&lt;br /&gt;
&lt;br /&gt;
Assuming you use the script from the previous section, you can place the following CMakeLists.txt in the directory containing the .po files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt)&lt;br /&gt;
&lt;br /&gt;
IF(NOT GETTEXT_MSGFMT_EXECUTABLE)&lt;br /&gt;
	MESSAGE(&lt;br /&gt;
&amp;quot;------&lt;br /&gt;
                 NOTE: msgfmt not found. Translations will *not* be installed&lt;br /&gt;
------&amp;quot;)&lt;br /&gt;
ELSE(NOT GETTEXT_MSGFMT_EXECUTABLE)&lt;br /&gt;
&lt;br /&gt;
        SET(catalogname rkward)&lt;br /&gt;
&lt;br /&gt;
        ADD_CUSTOM_TARGET(translations ALL)&lt;br /&gt;
&lt;br /&gt;
        FILE(GLOB PO_FILES *.po)&lt;br /&gt;
&lt;br /&gt;
        FOREACH(_poFile ${PO_FILES})&lt;br /&gt;
                GET_FILENAME_COMPONENT(_poFileName ${_poFile} NAME)&lt;br /&gt;
                STRING(REGEX REPLACE &amp;quot;^${catalogname}_?&amp;quot; &amp;quot;&amp;quot; _langCode ${_poFileName} )&lt;br /&gt;
                STRING(REGEX REPLACE &amp;quot;\\.po$&amp;quot; &amp;quot;&amp;quot; _langCode ${_langCode} )&lt;br /&gt;
&lt;br /&gt;
                IF( _langCode )&lt;br /&gt;
                        GET_FILENAME_COMPONENT(_lang ${_poFile} NAME_WE)&lt;br /&gt;
                        SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo)&lt;br /&gt;
&lt;br /&gt;
                        ADD_CUSTOM_COMMAND(TARGET translations&lt;br /&gt;
                                COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check -o ${_gmoFile} ${_poFile}&lt;br /&gt;
                                DEPENDS ${_poFile})&lt;br /&gt;
                        INSTALL(FILES ${_gmoFile} DESTINATION ${LOCALE_INSTALL_DIR}/${_langCode}/LC_MESSAGES/ RENAME ${catalogname}.mo)&lt;br /&gt;
                ENDIF( _langCode )&lt;br /&gt;
&lt;br /&gt;
        ENDFOREACH(_poFile ${PO_FILES})&lt;br /&gt;
&lt;br /&gt;
ENDIF(NOT GETTEXT_MSGFMT_EXECUTABLE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This iterates over all .po files in the directory, compiles them using msgfmt, and installs them to the standard location. You will want to change &amp;quot;catalogname&amp;quot; to the name of your application.&lt;br /&gt;
&lt;br /&gt;
=== Getting translations ===&lt;br /&gt;
&lt;br /&gt;
Now you just have to find translators to translate the extracted messages into the various languages. As your application gets used by more people, you will find that translators will volunteer to do this. Translated PO files then have to be stored in the po folder with the naming scheme &amp;lt;languagecode&amp;gt;.po.&lt;br /&gt;
&lt;br /&gt;
=== Translating .desktop Files ===&lt;br /&gt;
&lt;br /&gt;
Translating .desktop files is a bit tricky because the translation of .desktop files isn't fetched from .po/.gmo files, but must be part of the .desktop file itself. So we have 2 tasks:&lt;br /&gt;
&lt;br /&gt;
* extract messages from the .desktop file&lt;br /&gt;
* merge the translations in the .desktop file&lt;br /&gt;
&lt;br /&gt;
Our friends from Gnome provide the [http://freedesktop.org/wiki/Software/intltool intltool] package. While this tools is mainly written for the old autotools build system (but KDE uses CMake since KDE 4), we can use this package nevertheless for our purpose. Here is a step-by-step guide:&lt;br /&gt;
&lt;br /&gt;
# Install the [http://freedesktop.org/wiki/Software/intltool intltool] package&lt;br /&gt;
# We assume that your .desktop file is named &amp;quot;MYPROGRAM.desktop&amp;quot;.&lt;br /&gt;
# Make a copy of &amp;quot;MYPROGRAM.desktop&amp;quot; which is named &amp;quot;MYPROGRAM.desktop.template&amp;quot;.&lt;br /&gt;
# In MYPROGRAM.desktop.template substitute the keys &amp;quot;Name&amp;quot; by &amp;quot;_Name&amp;quot;, &amp;quot;GenericName&amp;quot; by &amp;quot;_GenericName&amp;quot; and &amp;quot;Comment&amp;quot; by &amp;quot;_Comment&amp;quot;.&lt;br /&gt;
# Remove all translations from &amp;quot;MYPROGRAM.desktop.template&amp;quot;.&lt;br /&gt;
# Add the following lines to the above described build script, at the end of the section &amp;quot;Preparing rc files&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
intltool-extract --quiet --type=gettext/ini PATH/MYPROGRAM.desktop.template&lt;br /&gt;
cat PATH/MYPROGRAM.desktop.template.h &amp;gt;&amp;gt; ${WDIR}/rc.cpp&lt;br /&gt;
rm PATH/MYPROGRAM.desktop.template.h&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
intltool-extract will create a dummy C++ header (PATH/MYPROGRAM.desktop.template.h) with the strings whose key starts with &amp;quot;_&amp;quot;. We append the content of this header file into our &amp;quot;rc.cpp&amp;quot; and remove remove the file than. (We assume that &amp;quot;PATH&amp;quot; is the path to &amp;quot;MYPROGRAM.desktop.template&amp;quot;, relative to the working directory of the script.)&lt;br /&gt;
# Add &amp;quot;-kN_:1&amp;quot; as additional parameter to the xgettext call in the section &amp;quot;Extracting messages&amp;quot;. This is necessary because dummy code that intltool-extract produces uses &amp;quot;N_()&amp;quot; instead of &amp;quot;i18n()&amp;quot;.&lt;br /&gt;
# Add the following lines to the above described build script, at the end of the section &amp;quot;Merging translations&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ${WDIR}&lt;br /&gt;
intltool-merge --quiet --desktop-style ${WDIR} PATH/MYPROGRAM.desktop.template PATH2/MYPROGRAM.desktop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will produce MYPROGRAM.desktop from MYPROGRAM.desktop.template, inserting all available translations in the .po files in the directory ${WDIR}. (We assume that &amp;quot;PATH&amp;quot; is the path to &amp;quot;MYPROGRAM.desktop.template&amp;quot;, relative to the working directory of the script. We assume that &amp;quot;PATH2&amp;quot; is the path to the final location of &amp;quot;MYPROGRAM.desktop&amp;quot;, relative to the working directory of the script.)&lt;br /&gt;
&lt;br /&gt;
{{note|Names of .po files):For intltool, it is ''required'' that the .po files have the name &amp;lt;languagecode&amp;gt;.po without other characters (NOT programname_&amp;lt;languagecode&amp;gt;.po). This is important because intltool-merge simply uses the .po file name (without &amp;quot;.po&amp;quot;) as language key in the .desktop file.}}&lt;br /&gt;
&lt;br /&gt;
== Special cases (plugins, multiple catalogs, etc.) ==&lt;br /&gt;
&lt;br /&gt;
=== Runtime Loading Of Catalogs ===&lt;br /&gt;
&lt;br /&gt;
To have translations show up properly in an application, the name of the .pot file must match the name of the message catalog (.mo) file that your application will read at runtime. But what name will be used at runtime?&lt;br /&gt;
&lt;br /&gt;
In general, it will be the value returned by &amp;lt;tt&amp;gt;{{class|KGlobal}}::instance()-&amp;gt;instanceName()&amp;lt;/tt&amp;gt;. But what will that be? The general rules for standalone applications are:&lt;br /&gt;
* the message catalog will default to the name of the application passed as the first argument to {{class|KAboutData}}&lt;br /&gt;
* if your code calls &amp;lt;tt&amp;gt;{{class|KLocale}}::setMainCatalog()&amp;lt;/tt&amp;gt;, that name will be used instead&lt;br /&gt;
* if your code calls &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt;, the specified catalog will also be searched in addition to the main catalog&lt;br /&gt;
&lt;br /&gt;
If your code does not call either of the {{class|KLocale}} methods mentioned above and your application is a plugin, it gets a little more complicated. If your code exports your plugin using the &amp;lt;tt&amp;gt;K_EXPORT_COMPONENT_FACTORY&amp;lt;/tt&amp;gt; macro, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
K_EXPORT_COMPONENT_FACTORY( libkhtmlkttsdplugin, KGenericFactory&amp;lt;KHTMLPluginKTTSD&amp;gt;(&amp;quot;khtmlkttsd&amp;quot;) )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then the catalog name will be the name passed in the {{class|KGenericFactory}} constructor - in the example above that woudl be &amp;lt;tt&amp;gt;khtmlkttsd&amp;lt;/tt&amp;gt;. This is because the macro creates a {{class|Kinstance}} for you with the specified name.&lt;br /&gt;
&lt;br /&gt;
However, some classes, such as &amp;lt;tt&amp;gt;KTextEditor&amp;lt;/tt&amp;gt; create a &amp;lt;tt&amp;gt;KPart&amp;lt;/tt&amp;gt; containing your component and the name passed in the macro is not used. In this case, you should call &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt; in the component's constructor.&lt;br /&gt;
&lt;br /&gt;
If in doubt, the safest thing to do is to call &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{tip|If you are not using the export macro for your plugin, you probably should be. See the API documentation of KGenericFactory for more information.}}&lt;br /&gt;
&lt;br /&gt;
Calling &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt; if the catalog has already been inserted does nothing. However, calling &amp;lt;tt&amp;gt;{{class|KLocale}}::removeCatalog(const QString&amp;amp;)&amp;lt;/tt&amp;gt; removes the catalog no matter how many times it has been inserted. Therefore, take care that you do not inadvertently remove the catalog when multiple components are sharing a single catalog. For example, the following sequence will break translations: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
// Component A loads and uses catalog xyz by calling&lt;br /&gt;
insertCatalogue(&amp;quot;xyz&amp;quot;);&lt;br /&gt;
// Component B loads and also uses the same catalog.&lt;br /&gt;
insertCatalogue(&amp;quot;xyz&amp;quot;);&lt;br /&gt;
// component B unloads and calls&lt;br /&gt;
removeCatalogue(&amp;quot;xyz&amp;quot;)&lt;br /&gt;
// Component A now doesn't translate properly.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that a sequence such as above will occur automatically if both components A and B are loaded using the &amp;lt;tt&amp;gt;K_EXPORT_COMPONENT_FACTORY&amp;lt;/tt&amp;gt; macro and pass the same name argument to the KGenericFactory constructor.&lt;br /&gt;
&lt;br /&gt;
=== Naming .pot Files ===&lt;br /&gt;
&lt;br /&gt;
The name that you settle on for both the .pot file and catalog should be governed by where your code resides. If it is a component of another application and resides in that application's source tree, you'll want to share the main catalog of the application. &lt;br /&gt;
&lt;br /&gt;
If is a component of another application but resides elsewhere in the code repository, you will probably have to create a separate .pot, but keep in mind that .pot filenames must be unique across all of KDE.&lt;br /&gt;
&lt;br /&gt;
If it is a component of another application, but resides in the source tree of a second application, you should share with the second application. For example, the KDE text-to-speach daemon (KTTSD) includes a plugin for embedded Kate in {{path|kdeaccessibility/kttsd}} source tree. Since the plugin is not installed unless kttsd is installed, it shares its catalog with kttsd and calls &amp;lt;tt&amp;gt;{{class|KLocale}}::insertCatalog(&amp;quot;kttsd&amp;quot;)&amp;lt;/tt&amp;gt; to do this.&lt;br /&gt;
&lt;br /&gt;
==== Declarative plasmoids ====&lt;br /&gt;
For plasmoids written in pure qml, the .pot file must be names the same as its plugin name (with '''plasma_applet_''' prefix), specified in its desktop file as '''X-KDE-PluginInfo-Name'''. For instance if we have '''X-KDE-PluginInfo-Name=org.kde.active.ativityscreen''' the .pot file will be called '''plasma_applet_org.kde.active.ativityscreen.pot'''. The KLocale::insertCatalog() call is performed by the declarative scriptengine itself, so the developer of the qml plasmoid doesn't have to worry about that.&lt;br /&gt;
&lt;br /&gt;
If the qml files are developed in the form of package instead of an automous plasmoid (for instance a package loaded by a C++ plasmoid) the .pot file will have the prefix '''plasma_package_''' instead.&lt;br /&gt;
&lt;br /&gt;
== Handbooks ==&lt;br /&gt;
&lt;br /&gt;
Handbooks, which are written in docbook format, are handled different from applications. The translated Handbooks are committed into the l10n module in the docs folder under each language. In addition, the docs folder is broken down by module and application. For example, the German Kate Handbook is committed to the {{path|l10n-kde4/de/docs/kde-baseapps/kate/}} folder. When compiled, the German Kate Handbook is installed to {{path|$KDEDIR/share/doc/HTML/de/kate/index.cache.bz2}}.&lt;br /&gt;
&lt;br /&gt;
Note that it is up to each translation team to generate the translated Handbook when they feel it is complete.&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Contribute/Bugsquad</id>
		<title>Contribute/Bugsquad</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Contribute/Bugsquad"/>
				<updated>2012-07-27T13:41:39Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Articles */ typo--&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Bugweeks_ladybug.png]]&lt;br /&gt;
&lt;br /&gt;
==What is BugSquad?==&lt;br /&gt;
&lt;br /&gt;
The '''KDE BugSquad''' keeps track of incoming bugs in KDE software, and goes through old bugs. We verify that a bug exists, and is reproducible, and that the reporter has given enough information. When applicable, we write testcases. ''Our end goal is to help developers notice valid bugs quicker, and to save their time.''&lt;br /&gt;
&lt;br /&gt;
You do not need any programming knowledge to be in the Bugsquad, and it is a great way to give practical support to the KDE community. If you are just starting to learn programming, it is a great way to gain familiarity with the components.&lt;br /&gt;
&lt;br /&gt;
==Bug Days==&lt;br /&gt;
&lt;br /&gt;
We have regular days where we pick a software package and look through all the old Bugzilla bugs to see if they are still valid. Sort of a Bugzilla cleaning day. &lt;br /&gt;
&lt;br /&gt;
{{:Contribute/Bugsquad/NextBugDay}}&lt;br /&gt;
&lt;br /&gt;
[[:Contribute/Bugsquad/OrganizingABugDay|How to organize a BugDay]]&lt;br /&gt;
&lt;br /&gt;
The results of all past bug days can be found [[/BugDays|here]].&lt;br /&gt;
&lt;br /&gt;
===Bug Weeks===&lt;br /&gt;
&lt;br /&gt;
Our team has recently launched a new iniciative named &amp;quot;Bug Weeks&amp;quot;, as an evolution of the traditional BugDays. All the workflow is based on the [http://forum.kde.org/ KDE Community Forums].&lt;br /&gt;
&lt;br /&gt;
You can find more information about it at [http://forum.kde.org/viewtopic.php?f=4&amp;amp;t=84473 its official announcement]&lt;br /&gt;
&lt;br /&gt;
The first bugweek was about triaging Plasma Desktop bug reports. You can find more information in the [http://forum.kde.org/viewtopic.php?f=148&amp;amp;t=84713 BugWeek Session 0 article]. (A summary article is yet to come)&lt;br /&gt;
&lt;br /&gt;
{{note|We don't just do bugs on BugDays! Don't hesitate to join us at '''#kde-bugs''' on irc.freenode.net, we have plenty for you to do. ;) Check the topic to see what we are currently working on. And if you are new, please read the &amp;quot;how to triage bugs&amp;quot; page.}}&lt;br /&gt;
&lt;br /&gt;
==How to help==&lt;br /&gt;
&lt;br /&gt;
Read the [[/Guide_To_BugTriaging|ultimate guide to BugTriaging for KDE Projects]] (Recommended)&lt;br /&gt;
&lt;br /&gt;
or ...&lt;br /&gt;
&lt;br /&gt;
Read this [[/Guide|guide]] and join us for one of our [[#Bug_Days|bug days]] or [[#Bug_Weeks|bug weeks]]. We meet on IRC in the #kde-bugs channel on irc.freenode.org. You can easily get started by having your questions answered there, and having someone guide you as to general bug triaging philosophy. Someone in IRC will usually be able to help you. Although we do sleep sometimes!&lt;br /&gt;
&lt;br /&gt;
A summary of the BugSquad guide is provided below to give you a quick idea of how you can help:&lt;br /&gt;
&lt;br /&gt;
* Confirming bugs. Bugs with the UNCONFIRMED status should get the NEW status once someone else is able to reproduce the bug reliably.&lt;br /&gt;
* Finding bug duplicates. Many bugs entered into Bugzilla are duplicates of other bugs. Sometimes it's hard to recognize these as duplicates but multiple people checking can make the duplicates bubble to the top of the pile. The following remarks may help you identifying them:&lt;br /&gt;
** Using the Similar Bugs link to look if there are duplicates.&lt;br /&gt;
** In the case of crashes, use the link below the comment field to look for crash reports with the same backtrace. The backtrace must be in the body of the report in order to look for similar reports. This tool does not look in attachments with backtraces.&lt;br /&gt;
* Close bugs which have insufficient information and which have been open for  a long time (e.g. reporter does not respond to a need-more-info request). Usually a timeout of one month or more is considered to be an &amp;quot;information timeout&amp;quot;.&lt;br /&gt;
* Categorize bugs into the right components. Many bug reports can be further categorized into components. For example, Konqueror reports can be assigned to KHTML and kfm components.&lt;br /&gt;
* Labeling bugs which contain testcases as such in the title. Ideally, testcases contain the minimal amount of code (HTML, scripts, C++ etc.) necessary to reproduce a bug.&lt;br /&gt;
* Writing testcases. Very useful and saves developers' time.&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
The sheer number of open bugs can be overwhelming at the start. Here are some hints on getting started more smoothly:&lt;br /&gt;
* Look at a single product at a time. For large applications (like Konqueror), you may want to further limit your search to a particular component.&lt;br /&gt;
* Don't try to find duplicates early on. Finding duplicates is hard until you have become familiar with the bugs in a component. Start out with verifying UNCONFIRMED bugs as described above. That's valuable work, and a great way to familiarize yourself with the bug database. &lt;br /&gt;
* Avoid very old bugs with many comments, and also bugs with many votes. This may seem counter-intuitive, but in most cases these bugs are hard, have gotten a lot of attention, and are probably on a developer's TODO list already. If it is from an older version of KDE, and there are no recent comments, verify them, make a notation, and move on.&lt;br /&gt;
* Don't be afraid to ask the reporter for more info. It's something you can even do without Bugzilla permissions. And reporters will generally prefer being asked one question too many, instead of their report never being dealt with. Just remember to be polite. Ask yourself how you would feel if you got the message you are thinking about sending to a user.&lt;br /&gt;
* Look at the incoming Bugzilla bugs. Or find the oldest bugs for your favorite software application.&lt;br /&gt;
* Look through the rest of our documentation for more information!&lt;br /&gt;
&lt;br /&gt;
==Articles==&lt;br /&gt;
&lt;br /&gt;
* [[/Guide_To_BugTriaging|Dario's Guide to Bug Triaging]] - Extensive guide on how to perform bug triagers tasks&lt;br /&gt;
&lt;br /&gt;
* [[/Quick_Introduction_to_Bugzilla|Quick introduction to Bugzilla]] - This article explains the basics about the bugtracking software that KDE uses: &amp;quot;Bugzilla&amp;quot;. It includes the description of a bug reports fields and the workflow of most common tasks like searching into the database.&lt;br /&gt;
&lt;br /&gt;
* [https://bugs.kde.org/page.cgi?id=fields.html A Bug's Life Cycle] - This article describes the possible status of a bug report and when each should be used.&lt;br /&gt;
&lt;br /&gt;
* [[/How to triage bugs|How to triage bugs]] - This article gives step-by-step what you do during a BugDay, or how to start triaging on your own in our &amp;quot;ongoing triage&amp;quot; (usually for old Konqueror bugs; see #kde-bugs for the current link).&lt;br /&gt;
&lt;br /&gt;
* [[Projects/SystemSettings#Bug_Triaging|How to triage System Settings bugs]] - Explains how System Settings works from a bug squasher's perspective.&lt;br /&gt;
&lt;br /&gt;
* [http://forum.kde.org/viewtopic.php?f=9&amp;amp;t=84475 Preparing a testing environment] - This article from the BugWeeks initiative describes how to properly configure and setup a KDE SC environment in order to test the bugs.&lt;br /&gt;
&lt;br /&gt;
* [[/How to create useful crash reports|How to create useful crash reports]] - This article helps users to prepare their KDE packages such they can create detailed backtraces.&lt;br /&gt;
&lt;br /&gt;
* [[User:DarioAndres/Basic_Guide_about_Crash_Reporting|Basic guide about crash reports]] - This article is a basic/simplified version of the previous one.&lt;br /&gt;
&lt;br /&gt;
* [http://community.kde.org/Getinvolved/Extra_Mile Extra Mile] - This article presents the Extra Mile initiative, whose goal is to help KDE applications and workspaces &amp;quot;walk the extra mile&amp;quot;. The Extra Mile initiative uses Bugzilla to track extra mile bugs.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
*[http://bugs.kde.org/ Bug Tracker]&lt;br /&gt;
*[http://bugs.kde.org/buglist.cgi?short_desc_type=allwordssubstr&amp;amp;short_desc=&amp;amp;long_desc_type=allwordssubstr&amp;amp;long_desc=&amp;amp;bug_status=UNCONFIRMED&amp;amp;bug_status=NEW&amp;amp;bug_status=ASSIGNED&amp;amp;bug_status=REOPENED&amp;amp;bug_severity=wishlist&amp;amp;bugidtype=include&amp;amp;bug_id=&amp;amp;votes=100&amp;amp;emailassigned_to1=1&amp;amp;emailtype1=substring&amp;amp;email1=&amp;amp;emailassigned_to2=1&amp;amp;emailreporter2=1&amp;amp;emailcc2=1&amp;amp;emailtype2=substring&amp;amp;email2=&amp;amp;changedin=&amp;amp;chfieldfrom=&amp;amp;chfieldto=Now&amp;amp;chfieldvalue=&amp;amp;newqueryname=&amp;amp;order=bugs.votes,bugs.priority%2C%20bugs.bug_severity%2C%20bugs.bug_status%2C%20bugs.bug_id%20desc Feature Requests, sorted by popularity]&lt;br /&gt;
*[https://mail.kde.org/mailman/listinfo/bugsquad Subscribe to our mailinglist]&lt;br /&gt;
*[http://forum.kde.org/viewforum.php?f=148 BugWeeks subforum]&lt;br /&gt;
*[http://gitweb.kde.org/scratch/darioandres/bugsquad.git DarioAndres BugSquad GIT repo with useful scripts (including the batch generation for events)]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Contribute/Bugsquad</id>
		<title>Contribute/Bugsquad</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Contribute/Bugsquad"/>
				<updated>2012-07-27T13:41:23Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Articles */ Add link to Extra Mile initiative&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Bugweeks_ladybug.png]]&lt;br /&gt;
&lt;br /&gt;
==What is BugSquad?==&lt;br /&gt;
&lt;br /&gt;
The '''KDE BugSquad''' keeps track of incoming bugs in KDE software, and goes through old bugs. We verify that a bug exists, and is reproducible, and that the reporter has given enough information. When applicable, we write testcases. ''Our end goal is to help developers notice valid bugs quicker, and to save their time.''&lt;br /&gt;
&lt;br /&gt;
You do not need any programming knowledge to be in the Bugsquad, and it is a great way to give practical support to the KDE community. If you are just starting to learn programming, it is a great way to gain familiarity with the components.&lt;br /&gt;
&lt;br /&gt;
==Bug Days==&lt;br /&gt;
&lt;br /&gt;
We have regular days where we pick a software package and look through all the old Bugzilla bugs to see if they are still valid. Sort of a Bugzilla cleaning day. &lt;br /&gt;
&lt;br /&gt;
{{:Contribute/Bugsquad/NextBugDay}}&lt;br /&gt;
&lt;br /&gt;
[[:Contribute/Bugsquad/OrganizingABugDay|How to organize a BugDay]]&lt;br /&gt;
&lt;br /&gt;
The results of all past bug days can be found [[/BugDays|here]].&lt;br /&gt;
&lt;br /&gt;
===Bug Weeks===&lt;br /&gt;
&lt;br /&gt;
Our team has recently launched a new iniciative named &amp;quot;Bug Weeks&amp;quot;, as an evolution of the traditional BugDays. All the workflow is based on the [http://forum.kde.org/ KDE Community Forums].&lt;br /&gt;
&lt;br /&gt;
You can find more information about it at [http://forum.kde.org/viewtopic.php?f=4&amp;amp;t=84473 its official announcement]&lt;br /&gt;
&lt;br /&gt;
The first bugweek was about triaging Plasma Desktop bug reports. You can find more information in the [http://forum.kde.org/viewtopic.php?f=148&amp;amp;t=84713 BugWeek Session 0 article]. (A summary article is yet to come)&lt;br /&gt;
&lt;br /&gt;
{{note|We don't just do bugs on BugDays! Don't hesitate to join us at '''#kde-bugs''' on irc.freenode.net, we have plenty for you to do. ;) Check the topic to see what we are currently working on. And if you are new, please read the &amp;quot;how to triage bugs&amp;quot; page.}}&lt;br /&gt;
&lt;br /&gt;
==How to help==&lt;br /&gt;
&lt;br /&gt;
Read the [[/Guide_To_BugTriaging|ultimate guide to BugTriaging for KDE Projects]] (Recommended)&lt;br /&gt;
&lt;br /&gt;
or ...&lt;br /&gt;
&lt;br /&gt;
Read this [[/Guide|guide]] and join us for one of our [[#Bug_Days|bug days]] or [[#Bug_Weeks|bug weeks]]. We meet on IRC in the #kde-bugs channel on irc.freenode.org. You can easily get started by having your questions answered there, and having someone guide you as to general bug triaging philosophy. Someone in IRC will usually be able to help you. Although we do sleep sometimes!&lt;br /&gt;
&lt;br /&gt;
A summary of the BugSquad guide is provided below to give you a quick idea of how you can help:&lt;br /&gt;
&lt;br /&gt;
* Confirming bugs. Bugs with the UNCONFIRMED status should get the NEW status once someone else is able to reproduce the bug reliably.&lt;br /&gt;
* Finding bug duplicates. Many bugs entered into Bugzilla are duplicates of other bugs. Sometimes it's hard to recognize these as duplicates but multiple people checking can make the duplicates bubble to the top of the pile. The following remarks may help you identifying them:&lt;br /&gt;
** Using the Similar Bugs link to look if there are duplicates.&lt;br /&gt;
** In the case of crashes, use the link below the comment field to look for crash reports with the same backtrace. The backtrace must be in the body of the report in order to look for similar reports. This tool does not look in attachments with backtraces.&lt;br /&gt;
* Close bugs which have insufficient information and which have been open for  a long time (e.g. reporter does not respond to a need-more-info request). Usually a timeout of one month or more is considered to be an &amp;quot;information timeout&amp;quot;.&lt;br /&gt;
* Categorize bugs into the right components. Many bug reports can be further categorized into components. For example, Konqueror reports can be assigned to KHTML and kfm components.&lt;br /&gt;
* Labeling bugs which contain testcases as such in the title. Ideally, testcases contain the minimal amount of code (HTML, scripts, C++ etc.) necessary to reproduce a bug.&lt;br /&gt;
* Writing testcases. Very useful and saves developers' time.&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
The sheer number of open bugs can be overwhelming at the start. Here are some hints on getting started more smoothly:&lt;br /&gt;
* Look at a single product at a time. For large applications (like Konqueror), you may want to further limit your search to a particular component.&lt;br /&gt;
* Don't try to find duplicates early on. Finding duplicates is hard until you have become familiar with the bugs in a component. Start out with verifying UNCONFIRMED bugs as described above. That's valuable work, and a great way to familiarize yourself with the bug database. &lt;br /&gt;
* Avoid very old bugs with many comments, and also bugs with many votes. This may seem counter-intuitive, but in most cases these bugs are hard, have gotten a lot of attention, and are probably on a developer's TODO list already. If it is from an older version of KDE, and there are no recent comments, verify them, make a notation, and move on.&lt;br /&gt;
* Don't be afraid to ask the reporter for more info. It's something you can even do without Bugzilla permissions. And reporters will generally prefer being asked one question too many, instead of their report never being dealt with. Just remember to be polite. Ask yourself how you would feel if you got the message you are thinking about sending to a user.&lt;br /&gt;
* Look at the incoming Bugzilla bugs. Or find the oldest bugs for your favorite software application.&lt;br /&gt;
* Look through the rest of our documentation for more information!&lt;br /&gt;
&lt;br /&gt;
==Articles==&lt;br /&gt;
&lt;br /&gt;
* [[/Guide_To_BugTriaging|Dario's Guide to Bug Triaging]] - Extensive guide on how to perform bug triagers tasks&lt;br /&gt;
&lt;br /&gt;
* [[/Quick_Introduction_to_Bugzilla|Quick introduction to Bugzilla]] - This article explains the basics about the bugtracking software that KDE uses: &amp;quot;Bugzilla&amp;quot;. It includes the description of a bug reports fields and the workflow of most common tasks like searching into the databse.&lt;br /&gt;
&lt;br /&gt;
* [https://bugs.kde.org/page.cgi?id=fields.html A Bug's Life Cycle] - This article describes the possible status of a bug report and when each should be used.&lt;br /&gt;
&lt;br /&gt;
* [[/How to triage bugs|How to triage bugs]] - This article gives step-by-step what you do during a BugDay, or how to start triaging on your own in our &amp;quot;ongoing triage&amp;quot; (usually for old Konqueror bugs; see #kde-bugs for the current link).&lt;br /&gt;
&lt;br /&gt;
* [[Projects/SystemSettings#Bug_Triaging|How to triage System Settings bugs]] - Explains how System Settings works from a bug squasher's perspective.&lt;br /&gt;
&lt;br /&gt;
* [http://forum.kde.org/viewtopic.php?f=9&amp;amp;t=84475 Preparing a testing environment] - This article from the BugWeeks initiative describes how to properly configure and setup a KDE SC environment in order to test the bugs.&lt;br /&gt;
&lt;br /&gt;
* [[/How to create useful crash reports|How to create useful crash reports]] - This article helps users to prepare their KDE packages such they can create detailed backtraces.&lt;br /&gt;
&lt;br /&gt;
* [[User:DarioAndres/Basic_Guide_about_Crash_Reporting|Basic guide about crash reports]] - This article is a basic/simplified version of the previous one.&lt;br /&gt;
&lt;br /&gt;
* [http://community.kde.org/Getinvolved/Extra_Mile Extra Mile] - This article presents the Extra Mile initiative, whose goal is to help KDE applications and workspaces &amp;quot;walk the extra mile&amp;quot;. The Extra Mile initiative uses Bugzilla to track extra mile bugs.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
*[http://bugs.kde.org/ Bug Tracker]&lt;br /&gt;
*[http://bugs.kde.org/buglist.cgi?short_desc_type=allwordssubstr&amp;amp;short_desc=&amp;amp;long_desc_type=allwordssubstr&amp;amp;long_desc=&amp;amp;bug_status=UNCONFIRMED&amp;amp;bug_status=NEW&amp;amp;bug_status=ASSIGNED&amp;amp;bug_status=REOPENED&amp;amp;bug_severity=wishlist&amp;amp;bugidtype=include&amp;amp;bug_id=&amp;amp;votes=100&amp;amp;emailassigned_to1=1&amp;amp;emailtype1=substring&amp;amp;email1=&amp;amp;emailassigned_to2=1&amp;amp;emailreporter2=1&amp;amp;emailcc2=1&amp;amp;emailtype2=substring&amp;amp;email2=&amp;amp;changedin=&amp;amp;chfieldfrom=&amp;amp;chfieldto=Now&amp;amp;chfieldvalue=&amp;amp;newqueryname=&amp;amp;order=bugs.votes,bugs.priority%2C%20bugs.bug_severity%2C%20bugs.bug_status%2C%20bugs.bug_id%20desc Feature Requests, sorted by popularity]&lt;br /&gt;
*[https://mail.kde.org/mailman/listinfo/bugsquad Subscribe to our mailinglist]&lt;br /&gt;
*[http://forum.kde.org/viewforum.php?f=148 BugWeeks subforum]&lt;br /&gt;
*[http://gitweb.kde.org/scratch/darioandres/bugsquad.git DarioAndres BugSquad GIT repo with useful scripts (including the batch generation for events)]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2012-07-18T10:41:18Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* QtExtraComponents */  add import line, improve FillMode doc, rm fillMode from QIconItem&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is based upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api page should probably be copied and stripped down the imperative bits not present there, it would make it harder to update tough)&lt;br /&gt;
The most important API for using graphical widgets is the [http://api.kde.org/4.x-api/plasma-qml-apidocs/ Plasma QtComponents API]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
== fetching data from the plasmoid package ==&lt;br /&gt;
&lt;br /&gt;
If you have a file in your plasmoid package under contents, let's say an image, you can access it with the plasmapackage url protocol:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Image {&lt;br /&gt;
    source: &amp;quot;plasmapackage:/images/foo.png&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code will load in the Image component the file foo.png located in contents/images of your plasmoid package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import &amp;quot;plasmapackage:/code/foo.js&amp;quot; as Foo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, the above code will import a javascript file from the folder contents/code of your plasmoid package.&lt;br /&gt;
&lt;br /&gt;
= Properties exported from the main QML item =&lt;br /&gt;
The root qml item can export some properties to influence its behavior:&lt;br /&gt;
* '''property int minimumWidth''': the plasmoid won't ever become narrower then that, size in pixels.&lt;br /&gt;
* '''property int minimumHeight''': minum height of the plasmoid, size in pixels.&lt;br /&gt;
* '''property Component compactRepresentation''': if the plasmoid is a popupapplet, the component in compactRepresentation will be used instead of the icon and will always be collapsed, regardless if it's in a panel or not.&lt;br /&gt;
&lt;br /&gt;
= Main Plasma QML Classes =&lt;br /&gt;
&lt;br /&gt;
== Data Engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value, so no need to specify if you don't need it) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load, e.g. &amp;quot;nowplaying&amp;quot;, etc.&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
* string '''sourceFilter''' it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. If we want to have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData'''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
It is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    var service = messagesDataSource.serviceForSource(src)&lt;br /&gt;
    var operation = &amp;quot;auth&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function result(job) {&lt;br /&gt;
        statusItem.authorizationStatus = job.result;&lt;br /&gt;
        print(&amp;quot;ServiceJob result: &amp;quot; + job.result + &amp;quot; op: &amp;quot; + job.operationName);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var operation = service.operationDescription(operation);&lt;br /&gt;
    operation.user = userName;&lt;br /&gt;
    operation.password = password;&lt;br /&gt;
    var serviceJob = service.startOperationCall(operation);&lt;br /&gt;
    serviceJob.finished.connect(result);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
This is an example from the feed widget:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
model: PlasmaCore.SortFilterModel {&lt;br /&gt;
   id: postTitleFilter&lt;br /&gt;
   filterRole: &amp;quot;title&amp;quot;&lt;br /&gt;
   sortRole: &amp;quot;time&amp;quot;&lt;br /&gt;
   sortOrder: &amp;quot;DescendingOrder&amp;quot;&lt;br /&gt;
   filterRegExp: toolbarFrame.searchQuery&lt;br /&gt;
   sourceModel: PlasmaCore.SortFilterModel {&lt;br /&gt;
      id: feedCategoryFilter&lt;br /&gt;
      filterRole: &amp;quot;feed_url&amp;quot;&lt;br /&gt;
      sourceModel: PlasmaCore.DataModel {&lt;br /&gt;
         dataSource: feedSource&lt;br /&gt;
         keyRoleFilter: &amp;quot;items&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, in your '''metadata.desktop''', simply change this following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon = &amp;quot;konqueror&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to use other elements instead of an icon when collapsed in a panel, use the '''compactRepresentation''' property in the root Item.&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
From KDE 4.8 a Theme instance is always present given the org.kde.plasma.core plugin was imported, is not necessary to create it by hand.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColor''' (read only)&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
* Font '''defaultFont''' (read only)&lt;br /&gt;
* Font '''desktopFont''' (read only)&lt;br /&gt;
* Font '''smallestFont''' (read only)&lt;br /&gt;
&lt;br /&gt;
Each Font element has the following properties:&lt;br /&gt;
* bool bold&lt;br /&gt;
* Capitalization '''capitalization''' (MixedCase, AllUppercase, AllLowercase, SmallCaps, Capitalize) (read only)&lt;br /&gt;
* String '''family''' (read only)&lt;br /&gt;
* bool '''italic''' (read only)&lt;br /&gt;
* real '''letterSpacing''' (read only)&lt;br /&gt;
* int '''pixelSize''' (read only)&lt;br /&gt;
* real '''pointSize''' (read only)&lt;br /&gt;
* bool '''strikeout''' (read only)&lt;br /&gt;
* bool '''underline''' (read only)&lt;br /&gt;
* Weight '''weight''' (Light, Normal, DemiBold, Bold, Black) (read only)&lt;br /&gt;
* real '''wordSpacing''' (read only)&lt;br /&gt;
* size '''mSize''' the size, width and height of an uppercase &amp;quot;M&amp;quot; in this font (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== FrameSvg ===&lt;br /&gt;
Declaring a FrameSvg element instantiates a Plasma FrameSvg instance. This class doesn't draw anything. For drawing, FrameSvgItem is used.&lt;br /&gt;
This is to be used when you need informations about the framesvg, such as hasElementPrefix().&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* All properties from Svg&lt;br /&gt;
* EnabledBorders '''enabledBorders''': flag combination of:&lt;br /&gt;
** NoBorder&lt;br /&gt;
** TopBorder&lt;br /&gt;
** BottomBorder&lt;br /&gt;
** LeftBorder&lt;br /&gt;
** RightBorder&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* All methods from Svg&lt;br /&gt;
* void setImagePath(QString path)&lt;br /&gt;
* void resizeFrame(QSize size)&lt;br /&gt;
* QSize frameSize()&lt;br /&gt;
* qreal marginSize(Plasma::MarginEdge edge)&lt;br /&gt;
* void getMargins(qreal left, qreal top, qreal right, qreal bottom): parameters are output, they get set with the margins from the FrameSvg&lt;br /&gt;
* QRectF contentsRect(): the rectangle of the center element, taking the margins into account.&lt;br /&gt;
* void setElementPrefix(QString prefix)&lt;br /&gt;
* bool hasElementPrefix(const QString prefix)&lt;br /&gt;
* QString prefix()&lt;br /&gt;
* void setCacheAllRenderedFrames(bool cache)&lt;br /&gt;
* bool cacheAllRenderedFrames()&lt;br /&gt;
* void clearCache()&lt;br /&gt;
* QPixmap framePixmap()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.FrameSvg {&lt;br /&gt;
        id: myFrameSvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/button&amp;quot;&lt;br /&gt;
        prefix: &amp;quot;pressed&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.SvgItem {&lt;br /&gt;
        id: mySvgItem&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: parent.top&lt;br /&gt;
            left: parent.left&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        width: 300&lt;br /&gt;
        height: 3&lt;br /&gt;
&lt;br /&gt;
        svg: mySvg&lt;br /&gt;
        elementId: &amp;quot;horizontal-line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
PlasmaCore.FrameSvgItem {&lt;br /&gt;
    id: myFrameSvgItem&lt;br /&gt;
    anchors.fill: parent&lt;br /&gt;
    imagePath: &amp;quot;translucent/dialogs/background&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''mainItem''': the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins.&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
{{Note|The width and height will scale with size of the main item within this Dialog component.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.1&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    PlasmaCore.Dialog {&lt;br /&gt;
        visible: true&lt;br /&gt;
        mainItem: Item {&lt;br /&gt;
            width: 500&lt;br /&gt;
            height: 500&lt;br /&gt;
&lt;br /&gt;
            Text {&lt;br /&gt;
                anchors.centerIn: parent&lt;br /&gt;
                color: &amp;quot;red&amp;quot;&lt;br /&gt;
                text: qsTr(&amp;quot;text&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
Plasma components documentation online at [http://api.kde.org/4.x-api/plasma-qml-apidocs/ api.kde.org]&lt;br /&gt;
&lt;br /&gt;
=QtExtraComponents=&lt;br /&gt;
The QtExtraComponents make some very convenient Qt classes usable from within QML.&lt;br /&gt;
&lt;br /&gt;
They can be imported in your code with:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==QPixmapItem==&lt;br /&gt;
This one wraps around a QPixmap class and allows you to send a QPixmap directly to QPixmapItem.&lt;br /&gt;
 &lt;br /&gt;
Properties:&lt;br /&gt;
* QPixmap '''pixmap''': The QPixmap object.&lt;br /&gt;
* bool '''smooth''': Set to true to render smooth.&lt;br /&gt;
* int '''nativeWidth''': (verification needed) The QPixmap width&lt;br /&gt;
* int '''nativeHeight''': (verification needed) The QPixmap height&lt;br /&gt;
* FillMode '''fillMode''': see below&lt;br /&gt;
&lt;br /&gt;
==QImageItem==&lt;br /&gt;
This one wraps around a QImage class and allows you to send a QImage directly to QImageItem.&lt;br /&gt;
 &lt;br /&gt;
Properties:&lt;br /&gt;
* QImage '''image''': The QImage object.&lt;br /&gt;
* bool '''smooth''': Set to true to render smooth.&lt;br /&gt;
* int '''nativeWidth''': (verification needed) The QImage width&lt;br /&gt;
* int '''nativeHeight''': (verification needed) The QImage height&lt;br /&gt;
* FillMode '''fillMode''': see below&lt;br /&gt;
&lt;br /&gt;
==FillMode==&lt;br /&gt;
Both QPixmapItem and QImageItem expose a FillMode enum. This enum defines how the image is going to be used to fill the item.&lt;br /&gt;
&lt;br /&gt;
For QPixmapItem, possible values are:&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem.Stretch: the image is scaled to fit&lt;br /&gt;
* QPixmapItem.PreserveAspectFit: the image is scaled uniformly to fit without cropping&lt;br /&gt;
* QPixmapItem.PreserveAspectCrop: the image is scaled uniformly to fill, cropping if necessary&lt;br /&gt;
* QPixmapItem.Tile: the image is duplicated horizontally and vertically&lt;br /&gt;
* QPixmapItem.TileVertically: the image is stretched horizontally and tiled vertically&lt;br /&gt;
* QPixmapItem.TileHorizontally :e image is stretched vertically and tiled horizontally&lt;br /&gt;
&lt;br /&gt;
QImageItem defines the same values, you just need to replace QPixmapItem with QImageItem.&lt;br /&gt;
&lt;br /&gt;
==QIconItem==&lt;br /&gt;
This one wraps around a QPixmap class and allows you to send a QIcon directly to QIconItem.&lt;br /&gt;
 &lt;br /&gt;
Properties:&lt;br /&gt;
* QIcon/QString '''icon''': If you provide a QIcon it uses that directly. If you provide a string it uses a KIcon internally!&lt;br /&gt;
* bool '''smooth''': Set to true to render smooth.&lt;br /&gt;
* int '''nativeWidth''': (verification needed) The QPixmap width&lt;br /&gt;
* int '''nativeHeight''': (verification needed) The QPixmap height&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/API</id>
		<title>Development/Tutorials/Plasma/QML/API</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/API"/>
				<updated>2012-07-12T14:38:34Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Dialog */ fix code snippet formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction to the Plasmoid QML Declarative API  =&lt;br /&gt;
&lt;br /&gt;
This document provides an overview/reference of the Declarative QML API for Plasmoids. It isn't a full binding to all of Qt or KDE's libraries, but a focused set of bindings designed to make writing Plasmoids fast and easy, while remaining powerful.&lt;br /&gt;
&lt;br /&gt;
The API in this documentation covers the API of the Plasma specific QML components, so only the Declarative part of the API.&lt;br /&gt;
&lt;br /&gt;
The QML ScriptEngine is based upon the Plasma JavaScript engine, making the API of the JavaScript part identical to the one of the JavaScript plasmoids engine.&lt;br /&gt;
To see the api of the global ''Plasmoid'' object, see the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#The_Global_plasmoid_Object JavaScript API] documentation.&lt;br /&gt;
(TODO: the JavaScript api page should probably be copied and stripped down the imperative bits not present there, it would make it harder to update tough)&lt;br /&gt;
The most important API for using graphical widgets is the [http://api.kde.org/4.x-api/plasma-qml-apidocs/ Plasma QtComponents API]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What Is a Declarative Plasmoid?  ==&lt;br /&gt;
&lt;br /&gt;
To denote that this Plasmoid is a Declarative widget, ensure that in the metadata.desktop file there is this line: &lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
&lt;br /&gt;
What follows is a description of the Plasma declarative classes instantiable from QML.&lt;br /&gt;
&lt;br /&gt;
== fetching data from the plasmoid package ==&lt;br /&gt;
&lt;br /&gt;
If you have a file in your plasmoid package under contents, let's say an image, you can access it with the plasmapackage url protocol:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Image {&lt;br /&gt;
    source: &amp;quot;plasmapackage:/images/foo.png&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code will load in the Image component the file foo.png located in contents/images of your plasmoid package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import &amp;quot;plasmapackage:/code/foo.js&amp;quot; as Foo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Similarly, the above code will import a javascript file from the folder contents/code of your plasmoid package.&lt;br /&gt;
&lt;br /&gt;
= Properties exported from the main QML item =&lt;br /&gt;
The root qml item can export some properties to influence its behavior:&lt;br /&gt;
* '''property int minimumWidth''': the plasmoid won't ever become narrower then that, size in pixels.&lt;br /&gt;
* '''property int minimumHeight''': minum height of the plasmoid, size in pixels.&lt;br /&gt;
* '''property Component compactRepresentation''': if the plasmoid is a popupapplet, the component in compactRepresentation will be used instead of the icon and will always be collapsed, regardless if it's in a panel or not.&lt;br /&gt;
&lt;br /&gt;
= Main Plasma QML Classes =&lt;br /&gt;
&lt;br /&gt;
== Data Engines ==&lt;br /&gt;
While it's possible to fetch data from a Plasma DataEngine in the same way as the [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API#DataEngine JavaScript API], it is preferrable to use the following declarative classes:&lt;br /&gt;
&lt;br /&gt;
=== DataSource ===&lt;br /&gt;
DataSource is a receiver for a dataEngine and can be declared inside QML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
 PlasmaCore.DataSource {&lt;br /&gt;
     id: dataSource&lt;br /&gt;
     engine: &amp;quot;time&amp;quot;&lt;br /&gt;
     connectedSources: [&amp;quot;Local&amp;quot;]&lt;br /&gt;
     interval: 500&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Properties ====&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* bool '''valid''' (read only): true when the DataSource is successfully connected to a data engine&lt;br /&gt;
* int '''interval''': interval of polling of the dataengine, if 0 (default value, so no need to specify if you don't need it) no polling will be executed&lt;br /&gt;
* string '''engine''': the plugin name of the dataengine to load, e.g. &amp;quot;nowplaying&amp;quot;, etc.&lt;br /&gt;
* Array(string) '''connectedSources''': all the sources of the dataengine we are connected to (and whose data will appear in the '''data''' property)&lt;br /&gt;
* Array(string) '''sources''' (read only): all the sources available from the dataengine&lt;br /&gt;
* variant map '''data''' (read only): It's the most important property, it's a map of all the data available from the dataengine: its structure will be as follows:&lt;br /&gt;
** each key of the map will be a source name, in '''connectedSources'''&lt;br /&gt;
** each value will be a variant hash, so an hash with strings as keys and any variant as value&lt;br /&gt;
** example: dataSource.data[&amp;quot;Local&amp;quot;][&amp;quot;Time&amp;quot;] indicates the '''Time''' key of the dataengine source called &amp;quot;Local&amp;quot;&lt;br /&gt;
* string '''sourceFilter''' it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. If we want to have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Signals ====&lt;br /&gt;
It has the following signals:&lt;br /&gt;
&lt;br /&gt;
Note that javascript/qml applies the 'on' prefix to signals. So the actual signal name in C++ which is e.g. '''newData'''(...) becomes '''onNewData'''(...).&lt;br /&gt;
&lt;br /&gt;
* '''onNewData'''(String sourceName, Plasma::DataEngine::Data data)&lt;br /&gt;
* '''onSourceAdded'''(String source)&lt;br /&gt;
* '''onSourceRemoved'''(String source)&lt;br /&gt;
* '''onSourceConnected'''(String source)&lt;br /&gt;
* '''onSourceDisconnected'''(String source)&lt;br /&gt;
* '''onIntervalChanged'''()&lt;br /&gt;
* '''onEngineChanged'''()&lt;br /&gt;
* '''onDataChanged'''()&lt;br /&gt;
* '''onConnectedSourcesChanged'''()&lt;br /&gt;
* '''onSourcesChanged'''()&lt;br /&gt;
&lt;br /&gt;
==== Methods ====&lt;br /&gt;
It has the following methods:&lt;br /&gt;
* StringList keysForSource(String source): lists all the keys corresponding to a certain source: for instance in the &amp;quot;time&amp;quot; dataengine, for the &amp;quot;Local&amp;quot; source, keys will be:&lt;br /&gt;
** &amp;quot;Timezone Continent&amp;quot;&lt;br /&gt;
** &amp;quot;Offset&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone&amp;quot;&lt;br /&gt;
** &amp;quot;Time&amp;quot;&lt;br /&gt;
** &amp;quot;Date&amp;quot;&lt;br /&gt;
** &amp;quot;Timezone City&amp;quot;&lt;br /&gt;
* Service serviceForSource(String source): returns a Plasma service that corresponds a given source: see the section about services for how to use it.&lt;br /&gt;
* void connectSource(String source): adds to '''connectedSources''' the new source&lt;br /&gt;
* void disconnectSource(String source): removes that source from '''connectedSources'''&lt;br /&gt;
&lt;br /&gt;
=== Service ===&lt;br /&gt;
Due to their imperative nature, Plasma Services are not instantiated as QML classes, but rather created out of a '''DataSource''' with the method '''serviceForSource''' and used in the JavaScript portions of the QML files.&lt;br /&gt;
This following example is a simplified version from the Now Playing QML widget in the kdeexamples git repository: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var service = dataSource.serviceForSource(activeSource)&lt;br /&gt;
  var operation = service.operationDescription(&amp;quot;seek&amp;quot;)&lt;br /&gt;
  operation.seconds = 10&lt;br /&gt;
&lt;br /&gt;
  var job = service.startOperationCall(operation)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here dataSource is the id of a DataSource object, and activeSource is a source contained in one of its '''connectedSources'''.&lt;br /&gt;
The service provides an operation called &amp;quot;seek&amp;quot;, with a parameter called &amp;quot;seconds&amp;quot;, that can be written on it as a property of a JavaScript object.&lt;br /&gt;
&lt;br /&gt;
=== ServiceJob ===&lt;br /&gt;
It is necessary to monitor the result of a Service operation, it's possible to connect to the '''finished''' signal provided by the job return paramenter of the '''startOperationCall''' service method.&lt;br /&gt;
The '''finished''' signal has the same job as parameter, from which is possible to check the variant '''result''' property, to check the result.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    var service = messagesDataSource.serviceForSource(src)&lt;br /&gt;
    var operation = &amp;quot;auth&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    function result(job) {&lt;br /&gt;
        statusItem.authorizationStatus = job.result;&lt;br /&gt;
        print(&amp;quot;ServiceJob result: &amp;quot; + job.result + &amp;quot; op: &amp;quot; + job.operationName);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var operation = service.operationDescription(operation);&lt;br /&gt;
    operation.user = userName;&lt;br /&gt;
    operation.password = password;&lt;br /&gt;
    var serviceJob = service.startOperationCall(operation);&lt;br /&gt;
    serviceJob.finished.connect(result);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataModel ===&lt;br /&gt;
Some data engines return as their data something that can be interpreted as a list of items, rather than simple key/value pairs.&lt;br /&gt;
QML provides some item views such as '''ListView''', '''GridView''' and '''Repeater'''.&lt;br /&gt;
The '''DataModel''' QML object can provide, based on a DataSource a model suitable for those QML item views.&lt;br /&gt;
&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* DataSource '''dataSource''': the id of an existing (and connected) DataSource&lt;br /&gt;
* String '''sourceFilter''': it's a regular expression. If the DataSource is connected to more than one source, only inserts data from sources matching this filter expression in the model. To, for example, have a source watch all sources beginning with say &amp;quot;name:&amp;quot;, the required regexp would be sourceFilter: &amp;quot;name:.*&amp;quot;&lt;br /&gt;
* String '''keyRoleFilter''': it's a regular expression. Only data with keys that match this filter expression will be inserted in the model&lt;br /&gt;
* int '''count''' (read only): how many items are in the model&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 ListView {&lt;br /&gt;
   model: PlasmaCore.DataModel {&lt;br /&gt;
        dataSource: microblogSource&lt;br /&gt;
        keyRoleFilter: &amp;quot;[\\d]*&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    delegate: Text {&lt;br /&gt;
        text: title&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example, ''microblogSource'' is the id of a DataSource, and inserts in the model only entries that have a number as the key name (matched with [\\d]*, in this case tweets ids)&lt;br /&gt;
&lt;br /&gt;
Each item in the model will have the form of a variant hash: all the keys of the hash will be registered as model role names, in the example, &amp;quot;title&amp;quot; is a role of the model containing a string (also reachable with model[&amp;quot;title&amp;quot;]).&lt;br /&gt;
&lt;br /&gt;
A special reserved role will always be present: '''&amp;quot;DataEngineSource&amp;quot;''': it will contain the name of the data engine source that gave origin to this item. Therefore, if you want merely the string of the current source that the model is at...do model[&amp;quot;DataEngineSource&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
Note that view.currentItem holds the item currently selected. However, due to (http://bugreports.qt.nokia.com/browse/QTBUG-16347) this does not work in PathView. A workaround is to make your own.&lt;br /&gt;
&lt;br /&gt;
=== SortFilterModel ===&lt;br /&gt;
SortFilterModel is a proxy model for easy sorting and/or filtering of the items in a DataModel (or any other QAbstractItemModel subclass that has been registered in QML with setContextProperty from a C++ application)&lt;br /&gt;
Properties:&lt;br /&gt;
* model '''sourceModel'''&lt;br /&gt;
* String '''filterRegExp'''&lt;br /&gt;
* String '''filterRole'''&lt;br /&gt;
* String '''sortRole'''&lt;br /&gt;
* Qt::SortOrder '''sortOrder'''&lt;br /&gt;
* int '''count''' (read only)&lt;br /&gt;
&lt;br /&gt;
This is an example from the feed widget:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
model: PlasmaCore.SortFilterModel {&lt;br /&gt;
   id: postTitleFilter&lt;br /&gt;
   filterRole: &amp;quot;title&amp;quot;&lt;br /&gt;
   sortRole: &amp;quot;time&amp;quot;&lt;br /&gt;
   sortOrder: &amp;quot;DescendingOrder&amp;quot;&lt;br /&gt;
   filterRegExp: toolbarFrame.searchQuery&lt;br /&gt;
   sourceModel: PlasmaCore.SortFilterModel {&lt;br /&gt;
      id: feedCategoryFilter&lt;br /&gt;
      filterRole: &amp;quot;feed_url&amp;quot;&lt;br /&gt;
      sourceModel: PlasmaCore.DataModel {&lt;br /&gt;
         dataSource: feedSource&lt;br /&gt;
         keyRoleFilter: &amp;quot;items&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Popup Applet ==&lt;br /&gt;
So you want your QML applet to be a popup applet, like the device notifier (an icon in the panel shows and expands the applet)?&lt;br /&gt;
&lt;br /&gt;
Why, that's easy.&lt;br /&gt;
&lt;br /&gt;
To change your plasmoid from being a regular boring one, in your '''metadata.desktop''', simply change this following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
ServiceTypes=Plasma/Applet,Plasma/PopupApplet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the main QML item's Component.onCompleted, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    plasmoid.popupIcon = &amp;quot;konqueror&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to use other elements instead of an icon when collapsed in a panel, use the '''compactRepresentation''' property in the root Item.&lt;br /&gt;
&lt;br /&gt;
== Plasma Themes ==&lt;br /&gt;
&lt;br /&gt;
=== Theme ===&lt;br /&gt;
This class instantiable from QML provides access to the Plasma Theme colors and other facilities such as fonts.&lt;br /&gt;
From KDE 4.8 a Theme instance is always present given the org.kde.plasma.core plugin was imported, is not necessary to create it by hand.&lt;br /&gt;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* bool '''windowTranslucentEnabled''' (read only)&lt;br /&gt;
* Url '''homepage''' (read only)&lt;br /&gt;
* bool '''useGlobalSettings''' (read only)&lt;br /&gt;
* QString '''wallpaperPath''' (read only)&lt;br /&gt;
* color '''textColor''' (read only)&lt;br /&gt;
* color '''highlightColor''' (read only)&lt;br /&gt;
* color '''backgroundColor''' (read only)&lt;br /&gt;
* color '''buttonTextColor''' (read only)&lt;br /&gt;
* color '''buttonBackgroundColor''' (read only)&lt;br /&gt;
* color '''linkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''visitedLinkColor''' (read only)&lt;br /&gt;
* color '''buttonHoverColor''' (read only)&lt;br /&gt;
* color '''buttonFocusColor''' (read only)&lt;br /&gt;
* color '''viewTextColor''' (read only)&lt;br /&gt;
* color '''viewBackgroundColor''' (read only)&lt;br /&gt;
* color '''viewHoverColor''' (read only)&lt;br /&gt;
* color '''viewFocusColor''' (read only)&lt;br /&gt;
* String '''styleSheet''' (read only)&lt;br /&gt;
* Font '''defaultFont''' (read only)&lt;br /&gt;
* Font '''desktopFont''' (read only)&lt;br /&gt;
* Font '''smallestFont''' (read only)&lt;br /&gt;
&lt;br /&gt;
Each Font element has the following properties:&lt;br /&gt;
* bool bold&lt;br /&gt;
* Capitalization '''capitalization''' (MixedCase, AllUppercase, AllLowercase, SmallCaps, Capitalize) (read only)&lt;br /&gt;
* String '''family''' (read only)&lt;br /&gt;
* bool '''italic''' (read only)&lt;br /&gt;
* real '''letterSpacing''' (read only)&lt;br /&gt;
* int '''pixelSize''' (read only)&lt;br /&gt;
* real '''pointSize''' (read only)&lt;br /&gt;
* bool '''strikeout''' (read only)&lt;br /&gt;
* bool '''underline''' (read only)&lt;br /&gt;
* Weight '''weight''' (Light, Normal, DemiBold, Bold, Black) (read only)&lt;br /&gt;
* real '''wordSpacing''' (read only)&lt;br /&gt;
* size '''mSize''' the size, width and height of an uppercase &amp;quot;M&amp;quot; in this font (read only)&lt;br /&gt;
&lt;br /&gt;
=== Svg ===&lt;br /&gt;
Declaring a Svg element instantiates a Plasma Svg instance. This class doesn't draw anything. For drawing, SvgItem is used.&lt;br /&gt;
Properties:&lt;br /&gt;
* QSize '''size'''&lt;br /&gt;
* bool '''multipleImages'''&lt;br /&gt;
* String '''imagePath''' can be anything in the '''desktoptheme/''' folder. For more information on what is available, see [http://techbase.kde.org/Projects/Plasma/Theme#Current_Theme_Elements Plasma Theme Elements]&lt;br /&gt;
* bool '''usingRenderingCache'''&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPixmap pixmap(QString elementID)&lt;br /&gt;
* void resize(qreal width, qreal height)&lt;br /&gt;
* void resize(): resets the image to its default dimension&lt;br /&gt;
* QSize elementSize(QString elementId)&lt;br /&gt;
* QRectF elementRect(QString elementId)&lt;br /&gt;
* bool hasElement(QString elementId)&lt;br /&gt;
* bool isValid(): true if valid svg file&lt;br /&gt;
&lt;br /&gt;
=== FrameSvg ===&lt;br /&gt;
Declaring a FrameSvg element instantiates a Plasma FrameSvg instance. This class doesn't draw anything. For drawing, FrameSvgItem is used.&lt;br /&gt;
This is to be used when you need informations about the framesvg, such as hasElementPrefix().&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* All properties from Svg&lt;br /&gt;
* EnabledBorders '''enabledBorders''': flag combination of:&lt;br /&gt;
** NoBorder&lt;br /&gt;
** TopBorder&lt;br /&gt;
** BottomBorder&lt;br /&gt;
** LeftBorder&lt;br /&gt;
** RightBorder&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* All methods from Svg&lt;br /&gt;
* void setImagePath(QString path)&lt;br /&gt;
* void resizeFrame(QSize size)&lt;br /&gt;
* QSize frameSize()&lt;br /&gt;
* qreal marginSize(Plasma::MarginEdge edge)&lt;br /&gt;
* void getMargins(qreal left, qreal top, qreal right, qreal bottom): parameters are output, they get set with the margins from the FrameSvg&lt;br /&gt;
* QRectF contentsRect(): the rectangle of the center element, taking the margins into account.&lt;br /&gt;
* void setElementPrefix(QString prefix)&lt;br /&gt;
* bool hasElementPrefix(const QString prefix)&lt;br /&gt;
* QString prefix()&lt;br /&gt;
* void setCacheAllRenderedFrames(bool cache)&lt;br /&gt;
* bool cacheAllRenderedFrames()&lt;br /&gt;
* void clearCache()&lt;br /&gt;
* QPixmap framePixmap()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.FrameSvg {&lt;br /&gt;
        id: myFrameSvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/button&amp;quot;&lt;br /&gt;
        prefix: &amp;quot;pressed&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SvgItem ===&lt;br /&gt;
It's a graphical element that will actually paint a Svg instance.&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''elementId''': what element to render. If null, the whole svg will be rendered&lt;br /&gt;
* Svg '''svg''': instance of the Svg class mentioned above&lt;br /&gt;
* QSizeF '''naturalSize''' (read only): default size of the Svg&lt;br /&gt;
* bool '''smooth''': paint with antialias (default false)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.SvgItem {&lt;br /&gt;
        id: mySvgItem&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: parent.top&lt;br /&gt;
            left: parent.left&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        width: 300&lt;br /&gt;
        height: 3&lt;br /&gt;
&lt;br /&gt;
        svg: mySvg&lt;br /&gt;
        elementId: &amp;quot;horizontal-line&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FrameSvgItem ===&lt;br /&gt;
It's a graphical element that paints a Plasma::FrameSvg, so a rectangular image composed by 9 elements contained in a Svg file, useful for things like buttons and frames.&lt;br /&gt;
&lt;br /&gt;
Flags&lt;br /&gt;
* EnabledBorders: combination of TopBorder | BottomBorder | LeftBorder | RightBorder, NoBorder if no border of the frame is enabled&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* String '''imagePath''': path of the file relative to the Plasma Theme, for instance &amp;quot;widgets/background&amp;quot;&lt;br /&gt;
* String '''prefix''': a FrameSvg can contain multiple frames, for instance a button contains &amp;quot;normal&amp;quot;, &amp;quot;raised&amp;quot; and &amp;quot;pressed&amp;quot;&lt;br /&gt;
* Margins '''margins''' (read only): the margins of the frame, see documentation below&lt;br /&gt;
* EnabledBorders '''enabledBorders''': what borders are enabled&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
Sample Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
PlasmaCore.FrameSvgItem {&lt;br /&gt;
    id: myFrameSvgItem&lt;br /&gt;
    anchors.fill: parent&lt;br /&gt;
    imagePath: &amp;quot;translucent/dialogs/background&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Top Level windows ==&lt;br /&gt;
&lt;br /&gt;
=== Dialog ===&lt;br /&gt;
Dialog instantiates a Plasma::Dialog, it will be a Plasma themed top level window that can contain any QML component.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''mainItem''': the Item contained in the Dialog, it can be any QML Item instance&lt;br /&gt;
* bool '''visible''': if the window (not the mainItem) is visible&lt;br /&gt;
* int '''x''': x position of the window in screen coordinates&lt;br /&gt;
* int '''y''': y position of the window in screen coordinates&lt;br /&gt;
* int '''width''' (read only): total width of the dialog, including margins&lt;br /&gt;
* int '''height''' (read only): total height of the dialog, including margins.&lt;br /&gt;
* int '''windowFlags''': Qt window flags of the Dialog&lt;br /&gt;
* Margins '''margins''' (read only): margins of the Dialog&lt;br /&gt;
&lt;br /&gt;
{{Note|The width and height will scale with size of the main item within this Dialog component.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.1&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    PlasmaCore.Dialog {&lt;br /&gt;
        visible: true&lt;br /&gt;
        mainItem: Item {&lt;br /&gt;
            width: 500&lt;br /&gt;
            height: 500&lt;br /&gt;
&lt;br /&gt;
            Text {&lt;br /&gt;
                anchors.centerIn: parent&lt;br /&gt;
                color: &amp;quot;red&amp;quot;&lt;br /&gt;
                text: qsTr(&amp;quot;text&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* QPoint popupPosition(Item item, Qt::Alignment alignment=Qt::AlignLeft): the suggested position for the Dialog if it has to be correctly placed as popup of the QML item passed as parameter.&lt;br /&gt;
* void setAttribute(Qt::WindowAttribute attribute, bool on): set an attribute for the dialog window&lt;br /&gt;
&lt;br /&gt;
==== Margins ====&lt;br /&gt;
Properties:&lt;br /&gt;
* real '''left''' (read only)&lt;br /&gt;
* real '''top''' (read only)&lt;br /&gt;
* real '''right''' (read only)&lt;br /&gt;
* real '''bottom''' (read only)&lt;br /&gt;
&lt;br /&gt;
=== ToolTip ===&lt;br /&gt;
Declaring a ToolTip instance makes it possible to use Plasma tooltips with any QML item.&lt;br /&gt;
&lt;br /&gt;
Properties:&lt;br /&gt;
* Item '''target''': the QML item we want to show a tooltip of&lt;br /&gt;
* String '''mainText'''&lt;br /&gt;
* String '''subText'''&lt;br /&gt;
* String '''image''': freedesktop compliant icon name as image of the tooltip&lt;br /&gt;
&lt;br /&gt;
= Plasma QtComponents (4.8) =&lt;br /&gt;
Plasma components documentation online at [http://api.kde.org/4.x-api/plasma-qml-apidocs/ api.kde.org]&lt;br /&gt;
&lt;br /&gt;
=QtExtraComponents=&lt;br /&gt;
The QtExtraComponents make some very convenient Qt classes usable from within QML.&lt;br /&gt;
&lt;br /&gt;
    enum FillMode {&lt;br /&gt;
        Stretch, // the image is scaled to fit&lt;br /&gt;
        PreserveAspectFit, // the image is scaled uniformly to fit without cropping&lt;br /&gt;
        PreserveAspectCrop, // the image is scaled uniformly to fill, cropping if necessary&lt;br /&gt;
        Tile, // the image is duplicated horizontally and vertically&lt;br /&gt;
        TileVertically, // the image is stretched horizontally and tiled vertically&lt;br /&gt;
        TileHorizontally //the image is stretched vertically and tiled horizontally&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
==QPixmapItem==&lt;br /&gt;
This one wraps around a QPixmap class and allows you to send a QPixmap directly to QPixmapItem.&lt;br /&gt;
 &lt;br /&gt;
Properties:&lt;br /&gt;
* QPixmap '''pixmap''': The QPixmap object.&lt;br /&gt;
* bool '''smooth''': Set to true to render smooth.&lt;br /&gt;
* int '''nativeWidth''': (verification needed) The QPixmap width&lt;br /&gt;
* int '''nativeHeight''': (verification needed) The QPixmap height&lt;br /&gt;
* FillMode '''fillMode'''&lt;br /&gt;
&lt;br /&gt;
==QImageItem==&lt;br /&gt;
This one wraps around a QImage class and allows you to send a QImage directly to QImageItem.&lt;br /&gt;
 &lt;br /&gt;
Properties:&lt;br /&gt;
* QImage '''image''': The QPixmap object.&lt;br /&gt;
* bool '''smooth''': Set to true to render smooth.&lt;br /&gt;
* int '''nativeWidth''': (verification needed) The QPixmap width&lt;br /&gt;
* int '''nativeHeight''': (verification needed) The QPixmap height&lt;br /&gt;
* FillMode '''fillMode'''&lt;br /&gt;
&lt;br /&gt;
==QIconItem==&lt;br /&gt;
This one wraps around a QPixmap class and allows you to send a QIcon directly to QIconItem.&lt;br /&gt;
 &lt;br /&gt;
Properties:&lt;br /&gt;
* QIcon/QString '''icon''': If you provide a QIcon it uses that directly. If you provide a string it uses a KIcon internally!&lt;br /&gt;
* bool '''smooth''': Set to true to render smooth.&lt;br /&gt;
* int '''nativeWidth''': (verification needed) The QPixmap width&lt;br /&gt;
* int '''nativeHeight''': (verification needed) The QPixmap height&lt;br /&gt;
* FillMode '''fillMode'''&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2012-07-12T14:17:15Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: typos--&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== QML ==&lt;br /&gt;
Plasmoids that use the QML (aka QtQuick) declarative language to describe their user interface while having the logic of the applet, in JavaScript (QML is essentially a forge between CSS and JavaScript). &lt;br /&gt;
&lt;br /&gt;
This is now the '''recommended''' method of creating plasmoids, where possible. The plasmoid, or applet serves as the visualization for the data which a Plasma::DataEngine contains.&lt;br /&gt;
&lt;br /&gt;
It allows easily the declaring of an interface and to easily create things like ListViews with native Plasma theming. It is what Plasma is leaning the most towards, especially in the Mobile, MediaCenter shells.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in QML''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/Basic_ListView|Basic List Plasmoid]]&lt;br /&gt;
:''Make a QML ListView which displays basic text objects as items. Utilizes native Plasma theming and animations.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/QML/API|API Reference]]&lt;br /&gt;
:''The QML Plasmoid API. Useful for referencing what is available in the runtime, what are the differences with the pure JavaScript ScriptEngine, the differences between pure Qt QML and Plasma, and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
== C++ ==&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted..Some_More|Getting Started With Plasmoids..Some more]] :''A few more starter's tips.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.linux-magazine.com/w3/issue/114/036-040_plasma.pdf Creating Plasmoids]&lt;br /&gt;
:''May 2010 article from Linux Magazine''&lt;br /&gt;
&lt;br /&gt;
;[http://www.ibm.com/developerworks/linux/library/l-kde-plasmoids/index.html Create Plasmoids using KDevelop]&lt;br /&gt;
:''Article explaining the structure of Plasma and how to create a Plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[http://community.kde.org/User:Mxttie#Adding_configuration Adding configuration to your plasmoid]&lt;br /&gt;
:''Article explaining how to add a configuration dialog to your plasmoid.''&lt;br /&gt;
&lt;br /&gt;
=== DataEngines ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing a DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various (read only) data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Services|Writing a Service]]&lt;br /&gt;
:''Services provide a standardized interface for visualizations to perform &amp;quot;write operations&amp;quot;. This can be for example, uploading pasted test to a pastebin service..''&lt;br /&gt;
&lt;br /&gt;
=== PackageStructures ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
=== Runners ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
=== Wallpapers ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperHelloWorld|Wallpaper Tutorial 1]]&lt;br /&gt;
:''This tutorial shows you how to make a simple Hello World plasma wallpaper plugin.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperConfiguration|Wallpaper Tutorial 2]]&lt;br /&gt;
:''This tutorial covers how to add configuration options to the wallpaper.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/WallpaperDoubleBuffer|Wallpaper Tutorial 3]]&lt;br /&gt;
:''This tutorial improves the wallpaper by using the so-called 'double buffer' technique.''&lt;br /&gt;
&lt;br /&gt;
=== Plasma Shells ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ShellDesign|Creating a Plasma Shell]]&lt;br /&gt;
:''This tutorial covers the essentials of writing a new Plasma shell from scratch. A must-read for anyone creating a new or modifying an existing Plasma Shell. Existing Plasma shells include Plasma Desktop, Plasma Netbook, Plasma Mobile, Plasma Media Center, Plasma Screensaver, Plasma KPart and Plasma KDM, and all follow the patterns documented here.''&lt;br /&gt;
&lt;br /&gt;
==  JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Plasma has built-in JavaScript (also known as ECMAScript, and often referred to as QtScript in the context of Qt) scripting support without requiring any external dependencies.&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in JavaScript''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/DataEngine|Getting Data]]&lt;br /&gt;
:''How to retrieve data from a data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/NowPlaying|Now Playing]]&lt;br /&gt;
:''Slightly more advanced data engine usage: displaying what's currently playing''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/SystemMonitor|System Monitor]]&lt;br /&gt;
:''How to access systemmonitor data engine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/CheatSheet|Cheat Sheet]]&lt;br /&gt;
:''A cheat sheet, rather than a tutorial, of things to remember and watch out for when developing JavaScript plasmoids''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/API|API Reference]]&lt;br /&gt;
:''The Simplified JavaScript Plasmoid API. Useful for referencing what is available in the runtime and as a study aid for the tutorials above.''&lt;br /&gt;
&lt;br /&gt;
=== Other Applications Of Javascript ===&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDestkopScripting|Scripting Plasma Shells]]&lt;br /&gt;
:The KDE Plasma Desktop and Netbook provide means to manage the desktop shell (desktop, panels, widget) via scripts written in JavaScript. This article describes how to take advantage of this feature set as well as documents the full API. This is primarily a system administration tool, but may also be of interest to power users.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/JavaScript/Animations|Javascript Animations]]&lt;br /&gt;
:''How to write Animations using Javascript for use in Plasma applications''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Python ==&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
=== DataEngines ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
=== Runners ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonRunner|Writing a KRunner plugin in Python]]&lt;br /&gt;
:''Writing a simple krunner plugin in python''&lt;br /&gt;
&lt;br /&gt;
== Ruby ==&lt;br /&gt;
&lt;br /&gt;
=== Plasmoids ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to set up a plasmoid, create a simple paste applet using widgets and add Plasma features seen elsewhere. Complete with tips for those who have never programmed before.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Blinker|Use SVG artwork in the simplest way possible]]&lt;br /&gt;
:''Follow a fellow student as he asks around about SVG usage and explains why the code examples work. This is a wiki so feel free to add your own insights until this tutorial can be considered complete.''&lt;br /&gt;
&lt;br /&gt;
=== DataEngines ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine using Ruby''&lt;br /&gt;
&lt;br /&gt;
== Web Technologies (HTML/JS/CSS) ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Web/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in HTML''&lt;br /&gt;
&lt;br /&gt;
== Plasma integration for applications ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Device_Actions|Creating a Device Notifier action]]&lt;br /&gt;
:''When your application is interested in removable hardware''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ApplicationShell|Integrate Plasma in Applications]]&lt;br /&gt;
:''This tutorial shows you how to make an application dashboard based on Plasma technologies.''&lt;br /&gt;
&lt;br /&gt;
== Packages ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageOverview|Plasma Packages]]&lt;br /&gt;
:''An overview of what makes up a Plasma Package and what they are and can be used for.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PackageStructure|Writing a PackageStructure Plugin in C++]]&lt;br /&gt;
:''PackageStructure plugins allow custom Packages to be defined, installed, removed and listed as well as provide access their contents at runtime. Packages may contain any kind of data addons, including scripts.''&lt;br /&gt;
&lt;br /&gt;
== Themes ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ThemeDetails|The Plasma Theme Structure In Detail]]&lt;br /&gt;
:''A comprehensive guide to the contents of a Plasma SVG theme, including configuration options, wallpapers, on-disk layout, names of all standard SVG files and every element in them.''&lt;br /&gt;
&lt;br /&gt;
== Activity Templates ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE_System_Administration/PlasmaDesktopScripting#Activity_templates|Creating a Plasma Activity Template Quickstart]]&lt;br /&gt;
:''A quick guide to creating your first Plasma Activity Template''&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma|Projects: Plasma]]&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* [http://techbase.kde.org/Projects/Plasma/Eclipse_Integration Plasma Eclipse Integration]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.9_Feature_Plan</id>
		<title>Schedules/KDE4/4.9 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.9_Feature_Plan"/>
				<updated>2012-05-14T07:32:12Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* kdegraphics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.9 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.9 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.8 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|KGlobalSettings|Make KGlobalSettings reread locale settings before calling settingsChanged().|lamarque@kde.org|Lamarque V. Souza}}&lt;br /&gt;
{{FeatureDone|Kate Part|Reworked Color Configuration|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|KActivities|Encryption for private activities (not available via UI).|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|KActivities|Linking files to activities in Dolphin, Konqueror, Folder View.|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureTodo|KActivities|Activities KIO.|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-runtime =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Thumbnail|fix for bookmarks|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|ksmserver|Port shutdown dialog to QML|lamarque@kde.org|Lamarque V. Souza}}&lt;br /&gt;
{{FeatureInProgress|ksmserver|Merge the new qml based screen locker|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureDone|plasma|MPRIS2 dataengine|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
&amp;lt;!-- The following section of entries has been auto generated by ChangelogGenerator. Do not edit!&lt;br /&gt;
BEGIN GENERATED SECTION --&amp;gt;&lt;br /&gt;
{{FeatureTodo|kwin|windows that are moved to another desktop should be treated as sticky windows (Bug 213847)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Quick Tile shortcuts should be toggle buttons (Bug 263755)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Fix fullscreen state handling: NETWM says it's bound to focus and not stacking order, also see bug #224600 (Bug 296076)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Display application menu and title bar side by side for maximized windows (Bug 102607)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureInProgress|kwin|No reason given why some desktop effects cannot be activated (Bug 209213, Review 104847)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Add support for appmenu-qt (Bug 266596)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Decoration KCM should show comment for decoration (Bug 296041)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Lanczos Filter broken after screen size changes (Bug 296065)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|DesktopThumbnailItem for QML (Bug 296067)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Packages for Desktop Switching Layouts (Bug 296068)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Walk Through Desktop layout rendering desktop previews (Bug 296069)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Move ThumbnailBar from BoxSwitch to CoverSwitch (Bug 296070)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureInProgress|kwin|Drop BoxSwitch effect (Bug 296071, Review 104454)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Different binary name for KWin Active (Bug 296084)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Import Scripted Effect from All Effets Tab (Bug 296772)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|GHNS support for Scripted Effects (Bug 296773)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureInProgress|kwin|GHNS support for KWin Scripts (Bug 296774, Review 104877)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|KConf Update Script for KWin 4.9 (Bug 296775)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Request category for scripted KWin Effects on kde-(look&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;app).org (Bug 297634)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Request category for KWin Scripts on kde-(look&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;app).org (Bug 297635)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|GHNS support for Window Switching Layouts (Bug 297636)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Request category for Window Switcher Layouts on kde-(look&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;app).org (Bug 297637)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Update Documentation for Window Switcher Layouts (Bug 297638)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureInProgress|kwin|Window Switcher KCM needs to be reworked (Bug 297639, Review 104525)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|ThumbnailItem allows upscaling of Windows (Bug 297864)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureInProgress|kwin|Redesign the kwin's kcm &amp;quot;All effects&amp;quot; (Bug 298991, Review 104849)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Window Tab support for QML based Aurorae (Bug 299138)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Increase ABI version for KDecorations (Bug 299140)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Add ABI check to KDecorations (Bug 299141)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|New Window Decoration for Thin Clients (Bug 299143)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureInProgress|kwin|Remove legacy window decorations (Bug 299144, Review 104281)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Get rid of  &amp;quot;Display borders on maximized windows&amp;quot; setting (Bug 299245)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Break NETWM to allow inner xinerama struts (Bug 299247)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Improve VSync strategy (Bug 299274)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Screen Edge bindings for KWin Scripting (Bug 299275)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Support Plasma API Extensions in KWin Scripting (Bug 299276)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureInProgress|kwin|Move Workspace's compositing functionality to own class Compositor (Bug 299277, Review 102420)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Better QML selection list for Window Switcher layout (Bug 299278)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureInProgress|kwin|Default Bindings for Switching between Windows of current Application (Bug 299308, Review 104730)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Useraction menu closes when focus passes to another window (Bug 81743)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|JJ: change focus only when moving mouse (Bug 92290)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|JJ: kwin fulscreen / un-fullscreen system notifications (Bug 124612, Review 104457)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Insufficient stacking order handling for deleted windows (Bug 158262, Review 104519)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|JJ: Use arrow keys to control cover switch. (Bug 178595, Review 104438)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Dragging a title bar against a bottom panel twice makes it go under the panel on the second time (Bug 210926)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Wobbly windows wobbles strange after quick-maximization (Bug 222102)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|&amp;quot;Move&amp;quot; command should allow off-screen window moving same as Alt + click trick (Bug 229942)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Bug with shading always inactive windows (Bug 242217)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Change title of menu item &amp;quot;Configure window behaviour...&amp;quot; (Bug 249486)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Task switcher message when no windows looks ugly with stars (Bug 260938)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Placement Policy 'under mouse' (Bug 272162)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|JJ: Synchronize Show Desktop wording in all tabbox effects (Bug 273478, Review 104436)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|closing session crash (Bug 282933, Review 104690)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Window Specific Settings dialog has no help function (Bug 286783)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Add &amp;quot;Present Windows - Window Class&amp;quot; to &amp;quot;Screen Edges&amp;quot; functions (Bug 288960)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|[JJ] Select next window with arrow key in Alt+Tab (Bug 291916)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|KWin crashed when I was switching windows (Bug 292614)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Kill helper should be out of process (Bug 295940)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Synchronize user actions menu with libtaskmanager (Bug 296056)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Document global JavaScript methods in KWin Scripting API documentation (Bug 297640)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Elevate windows in addition to highlight (Bug 297809)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|KWin crashes when interacting with Plasma (Bug 298669, Review 104714)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Effects cannot be configured (Bug 299163)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Adding proper window thumbnail clipping to the QML tabbox (Bug 299198)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Add layout specification to D-Bus call for invoking TabBox (Bug 299279, Review 104838)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Make desktop focus chains activities aware (Bug 299309, Review 104649)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Desktop Zoom should be saved between sessions (Bug 189956, Review 104597)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Settings to show windows on specific activities (like we have vor vds)|ivan.cukic@kde.org}}&lt;br /&gt;
&amp;lt;!-- END GENERATED SECTION --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|FolderView|Refactor into PopupApplet and Containment|ignat.semenov@blue-systems.com|Ignat Semenov}}&lt;br /&gt;
{{FeatureDone|Dolphin|Allow to show any kind of metadata like ratings, tags, comments, image-sizes, music-artist, ... beside each item of the view.|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin|Use KMessageWidget for information- and error-messages (see http://agateau.com/2011/04/21/kde-ux-2011/ for details)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin|Optionally remember the column-widths of the details view|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin|Allow to disable the expandable folders of the details view|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin|Implement inline renaming for the new view-engine|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin|Allow to optionally set a maximum number of lines for the icons-view|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureTodo|Dolphin|Implement files quick preview feature (named Klook)  |evgeniy.augin@osinit.ru|Evgeniy Auzhin}}&lt;br /&gt;
{{FeatureDone|Konsole|Add command line options for controlling the visibility of menubar and tabbar|adaptee@gmail.com|Jekyll Wu}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Marble|Satellite Map NG|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Mars &amp;amp; Venus satellite plugin|rahn@kde.org|Torsten Rahn / Gerhard Holtkamp}}&lt;br /&gt;
{{FeatureTodo|Marble|Solar Eclipse Plugin|rahn@kde.org|Torsten Rahn / Gerhard Holtkamp}}&lt;br /&gt;
{{FeatureTodo|Marble|Help Menu polishing / Support page inclusion|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Toolbar polishing/refactoring|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Solar Eclipse Plugin|rahn@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Worldwide hillshading|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Extended library API (no MarbleWidget dependency for tasks like parsing, routing)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Marble Touch on Plasma Active|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Marble Touch on Android|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Support for loading geolocated photos (e.g. in a Gallery activity in Marble Touch)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Layer Management (by the user: Toggle layer visibility; maybe move layers from legend and layers in menus to one central place/tab)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Rocs|Project Files to combine graphs and algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Extend graph data structure to support overlay graphs|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Stepped execution of algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureInProgress|Rocs|General unit test cleanup and overhauling|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|New Project Wizard - guided creation based on loaded plugins|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureInProgress|Rocs|Project journal files|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureInProgress|Rocs|New Add-Node/Add-Link Toolbar for data types and pointer types|rocs-devel@kde.org|Rocs Developers}}&lt;br /&gt;
{{FeatureTodo|Kig|Improve Cancel Construction and Undo actions|david.narvaez@computer.org|David E. Narváez}}&lt;br /&gt;
{{FeatureDone|Pairs|New memory game|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureDone|KAlgebra Mobile|Many improvements, including Android and better Active support|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|libkdegames|[http://community.kde.org/Games/API_cleanup Major cleanup and rewrite] (done, except for the new highscore classes)&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;'''Release team:''' please link to the [[Projects/Games/Porting_to_libkdegames_v5|porting instructions]]  for third-party developers|stefan.majewsky@googlemail.com|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|Granatier|improve config UI for player and arena selection|m-hias@gmx.de|Mathias Kraus}}&lt;br /&gt;
{{FeatureDone|Kajongg|tooltips giving playings hints|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|new config option: propose what to do|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|make it possible to replay a game from a screen shot (for better debugging)|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|improve Robot AI|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Add default voices|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Players can chat with each other from within kajongg|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Define a central game server, making it easier to play over the internet (no more tweaking of firewalls for the server side)|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureInProgress|Kajongg|Add support for other rule variants, starting with Classical Chinese variants|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureTodo|Kajongg|Print rulesets, also more than one in parallel for comparisons|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add the Gold Rush II championship game (20 levels), contributed by Gabriel Miltschitzky|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add solution files to some KGoldrunner games|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Simplify the XML descriptions of puzzle shapes|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Add XML and Desktop files for seven new two-dimensional puzzle shapes|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Add XML and Desktop files for three new three-dimensional puzzle shapes|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Improve the quality and relevance of KSudoku hints|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Make Load and Save work correctly for all puzzle types, including display of small markers/notes and restart of the puzzle clock from a saved value|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Integrate the new generator/solver and the old KSudoku code more closely|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Make puzzle features easier to see and use by improving highlighting, control and settings in both 2-D and 3-D puzzles and adding keyboard input to 3-D puzzles|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Gwenview|Fullscreen browse|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|JuK|last.fm scrobbling|martin.sandsmark@kde.org|Martin Sandsmark}}&lt;br /&gt;
{{FeatureDone|JuK|cover-fetching from last.fm|martin.sandsmark@kde.org|Martin Sandsmark}}&lt;br /&gt;
{{FeatureInProgress|JuK|MPRIS2 support|alex.merry@kmail.net|Alex Merry}}&lt;br /&gt;
{{FeatureDone|Dragon|MPRIS2 support|hein@kde.org|Eike Hein}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Kopete|Add option to group all offline users into a &amp;quot;Offline Users&amp;quot; group|kopete-devel@kde.org|Kopete Developers}}&lt;br /&gt;
{{FeatureDone|Kopete|Show contact's status change in chat window|igor.poboiko@gmail.com|Igor Poboiko}}&lt;br /&gt;
{{FeatureDone|Kopete|Add context option &amp;quot;rename&amp;quot; to contacts and allow changing custom display name inline.|kopete-devel@kde.org|Kopete Developers}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Akonadi Google Resources|Move contacts and calendars resources from Akonadi Google project to kdepim-runtime|dan@progdan.cz|Dan Vratil}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|KTnef|Bring back KTnef from the KDE3 days. KTnef is a standalone TNEF attachment viewer|winter@kde.org|Allen Winter}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Akonadi Kolab Resources|Kolab resource using the Kolab libraries to kdepim-runtime|chrigi_1@fastmail.fm|Christian Mollekopf}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Extend Akonotes Format|Extend the akonotes format to support features required by zanshin and kolab|chrigi_1@fastmail.fm|Christian Mollekopf}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Import pim data|ImportWizard allows to import settings/mails/filters/calendar/addressbook from thunderbird/evolution/etc. when exists.|montel@kde.org|Laurent Montel}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Now Playing|replace with QML version|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureInProgress|Microblog|replace with QML version|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|StackFolder|Add applet for quick browse the stack of folders|ural.mullabaev@rosalab.ru|Ural Mullabaev}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureDone|Lokalize|Optimize TM fuzzy searching||Nick Shaforostoff}}&lt;br /&gt;
{{FeatureDone|Lokalize|File search tab||Nick Shaforostoff}}&lt;br /&gt;
{{FeatureTodo|Lokalize|.ts support||Nick Shaforostoff}}&lt;br /&gt;
{{FeatureInProgress|Umbrello|diagram auto layout support|ralf.habacker@freenet.de|Ralf Habacker}}&lt;br /&gt;
{{FeatureInProgress|Umbrello|diagram graphviz dot export |ralf.habacker@freenet.de|Ralf Habacker}}&lt;br /&gt;
{{FeatureDone|Thumbnail|PO thumbnailer|shuizhuyuanluo@126.com|Ni Hui}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.9_Feature_Plan</id>
		<title>Schedules/KDE4/4.9 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.9_Feature_Plan"/>
				<updated>2012-04-10T15:37:45Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* kdegraphics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.9 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.9 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.8 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|KGlobalSettings|Make KGlobalSettings reread locale settings before calling settingsChanged().|lamarque@kde.org|Lamarque V. Souza}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-runtime =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|ksmserver|Port shutdown dialog to QML|lamarque@kde.org|Lamarque V. Souza}}&lt;br /&gt;
&amp;lt;!-- The following section of entries has been auto generated by ChangelogGenerator. Do not edit!&lt;br /&gt;
BEGIN GENERATED SECTION --&amp;gt;&lt;br /&gt;
{{FeatureTodo|kwin|&amp;quot;Move&amp;quot; command should allow off-screen window moving same as Alt + click trick (Bug 229942)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Quick Tile shortcuts should be toggle buttons (Bug 263755)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Display application menu and title bar side by side for maximized windows (Bug 102607)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Insufficient stacking order handling for deleted windows (Bug 158262)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|No reason given why some desktop effects cannot be activated (Bug 209213)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Add support for appmenu-qt (Bug 266596)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Placement Policy 'under mouse' (Bug 272162)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Kill helper should be out of process (Bug 295940)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Decoration KCM should show comment for decoration (Bug 296041)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Lanczos Filter broken after screen size changes (Bug 296065)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|DesktopThumbnailItem for QML (Bug 296067)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Packages for Desktop Switching Layouts (Bug 296068)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Walk Through Desktop layout rendering desktop previews (Bug 296069)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Move ThumbnailBar from BoxSwitch to CoverSwitch (Bug 296070)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Drop BoxSwitch effect (Bug 296071)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Different binary name for KWin Active (Bug 296084)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Import Scripted Effect from All Effets Tab (Bug 296772)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|GHNS support for Scripted Effects (Bug 296773)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|GHNS support for KWin Scripts (Bug 296774)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|KConf Update Script for KWin 4.9 (Bug 296775)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Long caption in Thumbnail layout overlaps box for only one item (Bug 297028)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Request category for scripted KWin Effects on kde-(look&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;app).org (Bug 297634)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Request category for KWin Scripts on kde-(look&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;app).org (Bug 297635)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|GHNS support for Window Switching Layouts (Bug 297636)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Request category for Window Switcher Layouts on kde-(look&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;app).org (Bug 297637)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Update Documentation for Window Switcher Layouts (Bug 297638)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Window Switcher KCM needs to be reworked (Bug 297639)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureTodo|kwin|Document global JavaScript methods in KWin Scripting API documentation (Bug 297640)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|JJ: kwin fulscreen / un-fullscreen system notifications (Bug 124612)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|JJ: Use arrow keys to control cover switch. (Bug 178595)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Change title of menu item &amp;quot;Configure window behaviour...&amp;quot; (Bug 249486)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Task switcher message when no windows looks ugly with stars (Bug 260938)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|JJ: Synchronize Show Desktop wording in all tabbox effects (Bug 273478)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Window Specific Settings dialog has no help function (Bug 286783)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Add &amp;quot;Present Windows - Window Class&amp;quot; to &amp;quot;Screen Edges&amp;quot; functions (Bug 288960)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|[JJ] Select next window with arrow key in Alt+Tab (Bug 291916)|kwin-bugs-null@kde.org}}&lt;br /&gt;
{{FeatureDone|kwin|Synchronize user actions menu with libtaskmanager (Bug 296056)|kwin-bugs-null@kde.org}}&lt;br /&gt;
&amp;lt;!-- END GENERATED SECTION --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|FolderView|Refactor into PopupApplet and Containment|ignat.semenov@blue-systems.com|Ignat Semenov}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Marble|Worldwide hillshading|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Extended library API (no MarbleWidget dependency for tasks like parsing, routing)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Marble Touch on Plasma Active|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Marble Touch on Android|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Support for loading geolocated photos (e.g. in a Gallery activity in Marble Touch)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Layer Management (by the user: Toggle layer visibility; maybe move layers from legend and layers in menus to one central place/tab)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Rocs|Project Files to combine graphs and algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Extend graph data structure to support overlay graphs|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureDone|Rocs|Stepped execution of algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureInProgress|Rocs|General unit test cleanup and overhauling|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kajongg|tooltips giving playings hints|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|new config option: propose what to do|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|make it possible to replay a game from a screen shot (for better debugging)|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|improve Robot AI|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Add default voices|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Players can chat with each other from within kajongg|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Define a central game server, making it easier to play over the internet (no more tweaking of firewalls for the server side)|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureInProgress|Kajongg|Add support for other rule variants, starting with Classical Chinese variants|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureTodo|Kajongg|Print rulesets, also more than one in parallel for comparisons|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureInProgress|libkdegames|[http://community.kde.org/Games/API_cleanup Major cleanup and rewrite]|stefan.majewsky@googlemail.com|Stefan Majewsky}}&lt;br /&gt;
{{FeatureInProgress|KGoldrunner|Add the Gold Rush II championship game (20 levels), contributed by Gabriel Miltschitzky|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureTodo|KGoldrunner|Add solution files to some KGoldrunner games, possibly using Get Hot New Stuff|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Simplify the XML descriptions of puzzle shapes|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Add XML and Desktop files for seven new two-dimensional puzzle shapes|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Add XML and Desktop files for three new three-dimensional puzzle shapes|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Improve the quality and relevance of KSudoku hints|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Make Load and Save work correctly for all puzzle types, including display of small markers/notes and restart of the puzzle clock from a saved value|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Integrate the new generator/solver and the old KSudoku code more closely|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KSudoku|Make puzzle features easier to see and use by improving highlighting, control and settings in both 2-D and 3-D puzzles and adding keyboard input to 3-D puzzles|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Gwenview|Fullscreen browse|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|JuK|last.fm scrobbling|martin.sandsmark@kde.org|Martin Sandsmark}}&lt;br /&gt;
{{FeatureDone|JuK|cover-fetching from last.fm|martin.sandsmark@kde.org|Martin Sandsmark}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Kopete|Add option to group all offline users into a &amp;quot;Offline Users&amp;quot; group|kopete-devel@kde.org|Kopete Developers}}&lt;br /&gt;
{{FeatureDone|Kopete|Show contact's status change in chat window|igor.poboiko@gmail.com|Igor Poboiko}}&lt;br /&gt;
{{FeatureDone|Kopete|Add context option &amp;quot;rename&amp;quot; to contacts and allow changing custom display name inline.|kopete-devel@kde.org|Kopete Developers}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo|Akonadi Google Resources|Move contacts and calendars resources from Akonadi Google project to kdepim-runtime|dan@progdan.cz|Dan Vratil}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureDone|Lokalize|Optimize TM fuzzy searching||Nick Shaforostoff}}&lt;br /&gt;
{{FeatureDone|Lokalize|File search tab||Nick Shaforostoff}}&lt;br /&gt;
{{FeatureTodo|Lokalize|.ts support||Nick Shaforostoff}}&lt;br /&gt;
{{FeatureInProgress|Umbrello|diagram auto layout support|ralf.habacker@freenet.de|Ralf Habacker}}&lt;br /&gt;
{{FeatureInProgress|Umbrello|diagram graphviz dot export |ralf.habacker@freenet.de|Ralf Habacker}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils=&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KAuth/KCM_HowTo</id>
		<title>Development/Tutorials/KAuth/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KAuth/KCM_HowTo"/>
				<updated>2012-04-10T12:28:54Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: header: Add link to KCM HowTo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/KAuth/KAuth Actions}} &lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=KAuth Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Creating a KCM requiring authorization upon saving|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/KAuth/KAuth_Actions|How to use KAuth Actions]], [[Development/Tutorials/KAuth/Helper_HowTo|Creating a KAuth helper]], [[Development/Tutorials/KCM_HowTo|Basic knowledge in creating a KCModule]]|&lt;br /&gt;
&lt;br /&gt;
next=|&lt;br /&gt;
&lt;br /&gt;
reading=[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKCModule.html KCModule Class Reference]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
A very common use case for KAuth helper are KCModules, which sometimes need to obtain high privileges upon saving. For this reason, KAuth has been integrated into KCModule API and kcmshell's appearance, to grant developers an extremely easy way to deploy privileged KCMs, and at the same time a very consistent and usable interface to your users.&lt;br /&gt;
&lt;br /&gt;
==Creating a KCModule with KAuth==&lt;br /&gt;
The coding part is extremely easy, although this comes at the price of following some strict conventions, which also help KCM permission handling to stay consistent.&lt;br /&gt;
&lt;br /&gt;
===Creating the save action===&lt;br /&gt;
The action name has to follow this format:&lt;br /&gt;
&lt;br /&gt;
 org.kde.kcontrol.&amp;lt;modulename&amp;gt;.save&lt;br /&gt;
&lt;br /&gt;
Where &amp;lt;modulename&amp;gt; is the output of aboutData()-&amp;gt;appName(), also known as the very first parameter you supply to ''KAboutData'' constructor.&lt;br /&gt;
&lt;br /&gt;
Following this format is '''compulsory''' to make the KCM work.&lt;br /&gt;
&lt;br /&gt;
===Adding the needed code in your KCModule's constructor===&lt;br /&gt;
In your KCModule's constructor, supposing you created the action as described above, you have to do the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;setNeedsAuthorization(true);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function automatically does the following:&lt;br /&gt;
&lt;br /&gt;
*Creates the needed action&lt;br /&gt;
*Crafts the ''Apply'' and ''Ok'' buttons (if any) into KPushButtons integrated with the action&lt;br /&gt;
*Adds some visual elements to the KCM to notify the user about the status of the action (for example, if he needs to authenticate or if he's not authorized at all).&lt;br /&gt;
&lt;br /&gt;
So everything is done for you. The only requirement is that ''setNeedsAuthorization'' should be called '''after''' ''setAboutData'' and ''setButtons'', otherwise it will fail.&lt;br /&gt;
&lt;br /&gt;
===Adding the needed code to the save() function===&lt;br /&gt;
To save your module, here's what needs to be done in the ''save()'' function of your KCM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void MyKCM::save()&lt;br /&gt;
{&lt;br /&gt;
  QVariantMap helperargs;&lt;br /&gt;
  // Populate....&lt;br /&gt;
&lt;br /&gt;
  Action *action = authAction();&lt;br /&gt;
  action-&amp;gt;setArguments(helperargs);&lt;br /&gt;
&lt;br /&gt;
  ActionReply reply = action-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
  if (reply.failed())&lt;br /&gt;
  {&lt;br /&gt;
    if (reply.type() == ActionReply::KAuthError) {&lt;br /&gt;
          // There has been an internal KAuth error&lt;br /&gt;
          KMessageBox::error(this, i18n(&amp;quot;Unable to authenticate/execute the action: %1, %2&amp;quot;, reply.errorCode(), reply.errorDescription()));&lt;br /&gt;
    } else {&lt;br /&gt;
           // Our helper triggered a custom error&lt;br /&gt;
           // Act accordingly...&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only difference you'll find with what you [[Development/Tutorials/KAuth/KAuth_Actions|are used to do when executing KAuth Actions]] is the ''authAction()'' method. This method belongs to KCModule's API and returns the action internally created by ''setNeedsAuthorization(true)'', or 0 if no action was created.&lt;br /&gt;
&lt;br /&gt;
This action is already associated to the correct helper (see below) and ready to be executed: you just have to supply any additional arguments to it.&lt;br /&gt;
&lt;br /&gt;
===Creating the helper===&lt;br /&gt;
You should already [[Development/Tutorials/KAuth/Helper_HowTo|know how to create a KAuth helper]], so this part won't be covered here. There are, however, some strict requirements to the helper format, just like for the action name.&lt;br /&gt;
&lt;br /&gt;
*The helper id must be '''org.kde.kcontrol.&amp;lt;modulename&amp;gt;''', just like in the action&lt;br /&gt;
*The helper '''must''' implement the ''save'' action, but can also implement any other actions (for example, some KCMs require privileges when loading as well: you still can do it in the same helper)&lt;br /&gt;
&lt;br /&gt;
===CMake and additional macros===&lt;br /&gt;
No additional macros are needed, except the [[Development/Tutorials/KAuth/Helper_HowTo|ones already shown to build the helper]].&lt;br /&gt;
&lt;br /&gt;
==Conclusion==&lt;br /&gt;
As you have seen, there are almost no differences with a KCM not requiring high privileges, especially when deploying and building the module.&lt;br /&gt;
&lt;br /&gt;
Porting a module requiring high privileges to KAuth is extremely easy and strongly advised, both for security and consistency, since your user will be provided with a better and more integrated overall experience.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials</id>
		<title>Development/Tutorials</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials"/>
				<updated>2012-04-10T12:27:40Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Plugins and KParts */  Add KCM HowTo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
Tutorials are the fastest way of finding out what KDE will do for you, and how to do it. Here is a list of currently available tutorials '''for KDE4'''. Material for KDE3 and KDE2 is available on the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
== Basics of KDE 4 Programming == &amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
Are you interested in writing applications with KDE 4? This tutorial series is aimed at those completely new to KDE programming.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/First program|&amp;lt;translate&amp;gt;&amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
Hello World&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
An introduction to the very basics of KDE4 programming&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Using KXmlGuiWindow|&amp;lt;translate&amp;gt;&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
Creating the Main Window&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
This tutorial shows you the magic of an application's most important thing: The main window.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Using KActions|&amp;lt;translate&amp;gt;&amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
Using KActions&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
How to add actions to the menus and toolbars. Based on the MainWindow tutorial.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Physical_Simulation|&amp;lt;translate&amp;gt;&amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
Physical Simulation&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
How to perform a physical simulation: animation and diagram&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Saving and loading|&amp;lt;translate&amp;gt;&amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
Saving and Loading&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
Introduces the KIO library while adding loading and saving support to our application.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/SqLite|&amp;lt;translate&amp;gt;&amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
Using SqLite databases and QtSq&amp;lt;/translate&amp;gt;l]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
Integrated databases without the need for a database server&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/KCmdLineArgs|&amp;lt;translate&amp;gt;&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
Command line arguments&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
Adds the ability to specify which file to open from the command line to our text editor.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/CMake|&amp;lt;translate&amp;gt;&amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
Introduction to CMake&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
How to use the CMake build system used by KDE4.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Common Programming Mistakes|&amp;lt;translate&amp;gt;&amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
Common Programming Mistakes&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
Various common mistakes made while developing Qt and KDE applications and how to avoid them.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Debugging Linker Errors|&amp;lt;translate&amp;gt;&amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
Debugging Linker Errors&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
How to understand and debug errors from the linker, at compile time.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Using Qt Creator|&amp;lt;translate&amp;gt;&amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
Using Qt Creator to develop your KDE program&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
How to use Qt Creator as an [http://en.wikipedia.org/wiki/Integrated_development_environment IDE] to develop KDE programs&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Creating Libraries|&amp;lt;translate&amp;gt;&amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
Creating Libraries to share code&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:28--&amp;gt;&lt;br /&gt;
How to add the library to the buildsystem and how to prepare the source code.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Session_Management|&amp;lt;translate&amp;gt;&amp;lt;!--T:29--&amp;gt;&lt;br /&gt;
Session Management&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:30--&amp;gt;&lt;br /&gt;
Make your application aware of X sessions&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorial/Icons|&amp;lt;translate&amp;gt;&amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
Icons&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
Deliver your application with icons that are automatically installed to the right places. Based on the [[Development/Tutorials/Using_KActions|Kaction Tutorial]].&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Desktop_File|&amp;lt;translate&amp;gt;&amp;lt;!--T:33--&amp;gt;&lt;br /&gt;
Desktop File&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
Let your application show up in the K menu and in application menus. Based on the Icons Tutorial.&lt;br /&gt;
&lt;br /&gt;
== Testing And Debugging == &amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Debugging|&amp;lt;translate&amp;gt;&amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
Debugging your application&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
Tips, tools and techniques to apply when debugging your KDE application&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Unittests|&amp;lt;translate&amp;gt;&amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
Writing Unittests for Qt4 and KDE4 with QTestLib&amp;lt;/translate&amp;gt;]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html &amp;lt;translate&amp;gt;&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
Original link&amp;lt;/translate&amp;gt;])&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:40--&amp;gt;&lt;br /&gt;
Tutorial by [mailto:bradh@frogmouth.net Brad Hards] that describes how to write unit tests using the QTestLib framework. It is presented as an example based tutorial, and is still under development.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Code_Checking|&amp;lt;translate&amp;gt;&amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
Semi-automatic ways to detect code errors&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:42--&amp;gt;&lt;br /&gt;
:Techniques you can use to detect errors in KDE code&lt;br /&gt;
&lt;br /&gt;
== Managing Configuration Data With KConfig == &amp;lt;!--T:43--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/KConfig|&amp;lt;translate&amp;gt;&amp;lt;!--T:44--&amp;gt;&lt;br /&gt;
Introduction To KConfig&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:45--&amp;gt;&lt;br /&gt;
An overview of the KConfig classes and how to use them in your application code&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Using KConfig XT|&amp;lt;translate&amp;gt;&amp;lt;!--T:46--&amp;gt;&lt;br /&gt;
Using KConfig XT&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:47--&amp;gt;&lt;br /&gt;
Tutorial on how to efficiently use the KConfig XT framework.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Updating KConfig Files|&amp;lt;translate&amp;gt;&amp;lt;!--T:48--&amp;gt;&lt;br /&gt;
Updating KConfig Files&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:49--&amp;gt;&lt;br /&gt;
Tutorial on how to write an update script to keep changes in your application's config file format in sync with the user's already existing config file&lt;br /&gt;
&lt;br /&gt;
== Services: Applications and Plugins == &amp;lt;!--T:50--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Services/Introduction|&amp;lt;translate&amp;gt;&amp;lt;!--T:51--&amp;gt;&lt;br /&gt;
Introduction to the Services Framework]]&lt;br /&gt;
:An overview of the services framework in KDE and what it provides the application developer. Covers the system configuration cache (SyCoCa), the source data files and what the indexed information can be used for.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Services/Traders|&amp;lt;translate&amp;gt;&amp;lt;!--T:52--&amp;gt;&lt;br /&gt;
Finding Services Using Trader Queries&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:53--&amp;gt;&lt;br /&gt;
How to find services, such as plugins or mimetypes, that are indexed in the SyCoCa using Trader Query Syntax&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Services/Plugins|&amp;lt;translate&amp;gt;&amp;lt;!--T:54--&amp;gt;&lt;br /&gt;
Creating and Loading Plugins Using KService]]&lt;br /&gt;
:Learn how to define custom plugin types, find installed plugins (including 3rd party plugins) and load them in an easy and portable fashion using KService.&lt;br /&gt;
&lt;br /&gt;
== Localization == &amp;lt;!--T:55--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:56--&amp;gt;&lt;br /&gt;
See also [[Special:myLanguage/Localization|Localization portal]].&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|&amp;lt;translate&amp;gt;&amp;lt;!--T:57--&amp;gt;&lt;br /&gt;
Introduction To Unicode]]&lt;br /&gt;
:An introduction to what Unicode is as well as how to handle Unicode data in KDE applications.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Localization/i18n|&amp;lt;translate&amp;gt;&amp;lt;!--T:58--&amp;gt;&lt;br /&gt;
Writing Applications With Localization In Mind&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:59--&amp;gt;&lt;br /&gt;
This tutorial covers what localization is, why it's important and how to ensure your application is ready to be localized. A must read for all application developers.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Localization/i18n Mistakes|&amp;lt;translate&amp;gt;&amp;lt;!--T:60--&amp;gt;&lt;br /&gt;
Avoiding Common Localization Pitfalls&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:61--&amp;gt;&lt;br /&gt;
There are several common mistakes that prevent applications from being properly localized. Find out what they are and how to easily avoid them in this tutorial.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Localization/Building KDE's l10n Module|&amp;lt;translate&amp;gt;&amp;lt;!--T:62--&amp;gt;&lt;br /&gt;
Building KDE's Localization Module&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:63--&amp;gt;&lt;br /&gt;
Building and installing language support from KDE's localization (l10n) module is a good idea for those working on applications in the main KDE repository. Doing so will allow you to test your application in another language and spot problem areas. Learn how to do just that in this tutorial.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Localization/i18n Build Systems|&amp;lt;translate&amp;gt;&amp;lt;!--T:64--&amp;gt;&lt;br /&gt;
Incorporating i18n Into the Build System&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:65--&amp;gt;&lt;br /&gt;
Once your application is ready to be localized, the next step is to ensure that translation files are built automatically and kept up to date. This tutorial covers the necessary CMakeFiles.txt additions as well the process of distributing the resulting message catalogs with your application.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Localization/i18n Challenges|&amp;lt;translate&amp;gt;&amp;lt;!--T:66--&amp;gt;&lt;br /&gt;
Common i18n Challenges and Solutions&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:67--&amp;gt;&lt;br /&gt;
This tutorial covers challenges that you may eventually run into such as translating handbooks and other data that exists outside of the source code, merging and handling obsolete .po files, dealing with freezes, coding in languages other than English and creating independent releases of or moving applications between KDE modules.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Localization/i18n_Semantics|&amp;lt;translate&amp;gt;&amp;lt;!--T:68--&amp;gt;&lt;br /&gt;
Semantic Markup of Messages&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:69--&amp;gt;&lt;br /&gt;
To ensure consistent presentation and more meaningful representations of messages in applications, semantic markup can be applied to messages marked for translation using the KUIT system. This tutorial describes how this system works.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Localization/i18n Krazy|&amp;lt;translate&amp;gt;&amp;lt;!--T:70--&amp;gt;&lt;br /&gt;
Automated i18n Code Checking&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:71--&amp;gt;&lt;br /&gt;
The Krazy code checker scans KDE's code and reports common i18n mistakes.&lt;br /&gt;
&lt;br /&gt;
== Documentation == &amp;lt;!--T:72--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/API_Documentation|&amp;lt;translate&amp;gt;&amp;lt;!--T:73--&amp;gt;&lt;br /&gt;
API Documentation&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:74--&amp;gt;&lt;br /&gt;
This tutorial explains how to document your APIs properly.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Man_Pages|&amp;lt;translate&amp;gt;&amp;lt;!--T:75--&amp;gt;&lt;br /&gt;
Man Pages&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:76--&amp;gt;&lt;br /&gt;
Writing and Generating Reference Manual Pages.&lt;br /&gt;
;Source Code&amp;lt;/translate&amp;gt;&lt;br /&gt;
: http://quickgit.kde.org&lt;br /&gt;
: http://websvn.kde.org&lt;br /&gt;
&lt;br /&gt;
== Accessibility ==&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Accessibility|&amp;lt;translate&amp;gt;&amp;lt;!--T:77--&amp;gt;&lt;br /&gt;
Accessibility Overview&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:78--&amp;gt;&lt;br /&gt;
A list of accessibility tutorials and general information.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Accessibility/Checklist|&amp;lt;translate&amp;gt;&amp;lt;!--T:79--&amp;gt;&lt;br /&gt;
Accessibility Checklist&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:80--&amp;gt;&lt;br /&gt;
What to look for in your application to make it accessible for as many people as possible.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Accessibility/Screen_Reader_Setup|&amp;lt;translate&amp;gt;&amp;lt;!--T:81--&amp;gt;&lt;br /&gt;
Screen Reader&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:82--&amp;gt;&lt;br /&gt;
This tutorial will explain some details about using screen readers with KDE applications.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Text-To-Speech|&amp;lt;translate&amp;gt;&amp;lt;!--T:83--&amp;gt;&lt;br /&gt;
Text-To-Speech&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:84--&amp;gt;&lt;br /&gt;
How to utilize Jovie text-to-speech service in your application.&lt;br /&gt;
&lt;br /&gt;
== Application Automation and Scripting == &amp;lt;!--T:85--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== D-Bus === &amp;lt;!--T:86--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/D-Bus/Introduction|&amp;lt;translate&amp;gt;&amp;lt;!--T:87--&amp;gt;&lt;br /&gt;
Introduction to D-Bus&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:88--&amp;gt;&lt;br /&gt;
A straight-forward introduction to the core concepts in D-Bus from an application developer's perspective, this tutorial covers what D-Bus is and how it can be used by applications.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/D-Bus/Accessing Interfaces|&amp;lt;translate&amp;gt;&amp;lt;!--T:89--&amp;gt;&lt;br /&gt;
Accessing D-Bus Interfaces&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:90--&amp;gt;&lt;br /&gt;
A step-by-step guide to calling D-Bus methods and connecting to D-Bus signals using QtDBus.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/D-Bus/Intermediate_D-Bus|&amp;lt;translate&amp;gt;&amp;lt;!--T:91--&amp;gt;&lt;br /&gt;
Intermediate D-Bus&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:92--&amp;gt;&lt;br /&gt;
Tips to make use of QtDBus when faced with problematic real-world interfaces.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/D-Bus/Creating Interfaces|&amp;lt;translate&amp;gt;&amp;lt;!--T:93--&amp;gt;&lt;br /&gt;
Creating D-Bus Interfaces&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:94--&amp;gt;&lt;br /&gt;
Learn how to expose functionality in your application by creating and using custom D-Bus interfaces. Covers generating the XML descriptions, instantiating interfaces at run time and setting up the build system with CMake.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/D-Bus/CustomTypes|&amp;lt;translate&amp;gt;&amp;lt;!--T:95--&amp;gt;&lt;br /&gt;
Using Custom Types with D-Bus&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt; &amp;lt;!--T:96--&amp;gt;&lt;br /&gt;
Learn how to use your own types in classes exported on D-Bus. Covers marhaling and unmarshaling of objects, the integration of custom types into XML descriptions and registering the custom types with the Qt Meta Object system.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/D-Bus/Autostart Services|&amp;lt;translate&amp;gt;&amp;lt;!--T:97--&amp;gt;&lt;br /&gt;
D-Bus Autostart Services&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:98--&amp;gt;&lt;br /&gt;
Turn your application into a D-Bus autostart service with this tutorial. This D-Bus feature, also known as &amp;quot;D-Bus service activation&amp;quot;, will ensure that even when your application isn't running that D-Bus calls made to it will work by relying on the D-Bus daemon itself to start your app if and when needed.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Porting_to_D-Bus|&amp;lt;translate&amp;gt;&amp;lt;!--T:99--&amp;gt;&lt;br /&gt;
Porting from DCOP to D-Bus&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt; &amp;lt;!--T:100--&amp;gt;&lt;br /&gt;
Port your applications from DCOP to D-Bus with this handy guide.&lt;br /&gt;
&lt;br /&gt;
=== Konqueror === &amp;lt;!--T:101--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Creating Konqueror Service Menus|&amp;lt;translate&amp;gt;&amp;lt;!--T:102--&amp;gt;&lt;br /&gt;
Creating Konqueror Service Menus&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:103--&amp;gt;&lt;br /&gt;
This tutorial shows you how to create mimetype-specific actions in Konqueror's context menu (aka &amp;quot;servicemenus&amp;quot;).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kross ===&lt;br /&gt;
&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Kross/Introduction|&amp;lt;translate&amp;gt;&amp;lt;!--T:104--&amp;gt;&lt;br /&gt;
Introduction to Kross&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:105--&amp;gt;&lt;br /&gt;
An introduction to the Kross Scripting Framework.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Kross/Hello_World|&amp;lt;translate&amp;gt;&amp;lt;!--T:106--&amp;gt;&lt;br /&gt;
Hello World&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:107--&amp;gt;&lt;br /&gt;
A first application with working kross code.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Kross/Call_Functions_in_Kross|&amp;lt;translate&amp;gt;&amp;lt;!--T:108--&amp;gt;&lt;br /&gt;
Calling Functions in Kross&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:109--&amp;gt;&lt;br /&gt;
Simple demonstration of calling scripting functions&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Kross/Connecting_Signals_and_slots_in_Kross|&amp;lt;translate&amp;gt;&amp;lt;!--T:110--&amp;gt;&lt;br /&gt;
Connecting Signals and Slots in Kross&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:111--&amp;gt;&lt;br /&gt;
Simple demonstration of connecting object signals with script slots&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Kross/Scripts-as-Plugins|&amp;lt;translate&amp;gt;&amp;lt;!--T:112--&amp;gt;&lt;br /&gt;
Scripts as Plugins with Kross&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:113--&amp;gt;&lt;br /&gt;
This tutorial provides a step-by-step introduction how to integrate scripts as plugins into a KDE application.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Kross/Script-Actions|&amp;lt;translate&amp;gt;&amp;lt;!--T:114--&amp;gt;&lt;br /&gt;
Placing script actions in your application menus &amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:115--&amp;gt;&lt;br /&gt;
Simple demonstration on how to extend you application menus to execute script files.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Kross/ActionCollections|&amp;lt;translate&amp;gt;&amp;lt;!--T:116--&amp;gt;&lt;br /&gt;
How to use an ActionCollection ]&amp;lt;/translate&amp;gt;]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:117--&amp;gt;&lt;br /&gt;
A small Tutorial on How to use Kross::ActionCollections.&lt;br /&gt;
{{:KOffice/Plugin Tutorials}}&lt;br /&gt;
&lt;br /&gt;
=== SuperKaramba === &amp;lt;!--T:118--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/SuperKaramba|&amp;lt;translate&amp;gt;&amp;lt;!--T:119--&amp;gt;&lt;br /&gt;
SuperKaramba Tutorial&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:120--&amp;gt;&lt;br /&gt;
This tutorial provides an overview of SuperKaramba, theme files and scripting with Python, Ruby and JavaScript.&lt;br /&gt;
&lt;br /&gt;
=== System Activity === &amp;lt;!--T:121--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: [[Special:myLanguage/Development/Tutorials/SystemActivity/Scripting|&amp;lt;translate&amp;gt;&amp;lt;!--T:122--&amp;gt;&lt;br /&gt;
Writing script actions for the process's context menu&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:123--&amp;gt;&lt;br /&gt;
This tutorial shows how to add a context menu action to show custom information about a process.&lt;br /&gt;
&lt;br /&gt;
=== KWin === &amp;lt;!--T:124--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: [[Special:myLanguage/Development/Tutorials/KWin/Scripting&amp;lt;translate&amp;gt;&amp;lt;!--T:125--&amp;gt;&lt;br /&gt;
|KWin Scripting Tutorial&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:126--&amp;gt;&lt;br /&gt;
This tutorial shows how to write a useful script for KWin.&lt;br /&gt;
&lt;br /&gt;
== Plugins and KParts == &amp;lt;!--T:127--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Using KParts|&amp;lt;translate&amp;gt;&amp;lt;!--T:128--&amp;gt;&lt;br /&gt;
Using KParts&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:129--&amp;gt;&lt;br /&gt;
A kPart is a plugin that you can just load into your application. For example, it is easy to integrate an editor (the katePart) or a console (the konsolePart) into your application's window.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Writing kontact plugins|&amp;lt;translate&amp;gt;&amp;lt;!--T:130--&amp;gt;&lt;br /&gt;
Writing kontact plugins&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:131--&amp;gt;&lt;br /&gt;
Kontact plugins are KParts. This tutorial describes how you can write one.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Writing Qt Designer Plugins|&amp;lt;translate&amp;gt;&amp;lt;!--T:132--&amp;gt;&lt;br /&gt;
Writing Qt Designer Plugins&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:133--&amp;gt;&lt;br /&gt;
:Add your widgets to Qt Designer and thus make them usable in UI files.&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/KCM_HowTo|KCM HowTo]]&lt;br /&gt;
:KCM are plugins which are loaded by System Settings to display configuration elements. They can also be used within an application.&lt;br /&gt;
&lt;br /&gt;
== Search and Metadata == &amp;lt;!--T:134--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Strigi === &amp;lt;!--T:135--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Writing file analyzers|&amp;lt;translate&amp;gt;&amp;lt;!--T:136--&amp;gt;&lt;br /&gt;
Writing file analyzers&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;File analyzers extract data from files to display in the file dialogs and file managers. The data gathered this way is also used to search for files. KDE4 allows the use of multiple analyzers per file type. This tutorial describes how you can write new analyzers.&lt;br /&gt;
=== [http://nepomuk.kde.org Nepomuk] === &amp;lt;!--T:137--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:138--&amp;gt;&lt;br /&gt;
See [[Special:myLanguage/Development/Tutorials/Metadata/Nepomuk|Nepomuk tutorials]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware Awareness (Solid) == &amp;lt;!--T:139--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Solid/Introduction|&amp;lt;translate&amp;gt;&amp;lt;!--T:140--&amp;gt;&lt;br /&gt;
Introduction to Solid&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:141--&amp;gt;&lt;br /&gt;
An introduction to the Solid effort in general and it library in particular.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Solid/Device_Discovery|&amp;lt;translate&amp;gt;&amp;lt;!--T:142--&amp;gt;&lt;br /&gt;
Listing Devices&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:143--&amp;gt;&lt;br /&gt;
How to use the Solid core library to discover the hardware and interact with the system.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Solid/Network_Management|&amp;lt;translate&amp;gt;&amp;lt;!--T:144--&amp;gt;&lt;br /&gt;
Accessing Network Information&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:145--&amp;gt;&lt;br /&gt;
How to use the Solid system to get information about the network&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Solid/Device_Actions|&amp;lt;translate&amp;gt;&amp;lt;!--T:146--&amp;gt;&lt;br /&gt;
Creating a Device Action&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:147--&amp;gt;&lt;br /&gt;
When your application is interested in registering actions with the system for removable hardware&lt;br /&gt;
&lt;br /&gt;
== Authorization and Privilege escalation (KAuth) == &amp;lt;!--T:148--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/KAuth/KAuth_Basics|&amp;lt;translate&amp;gt;&amp;lt;!--T:149--&amp;gt;&lt;br /&gt;
KAuth Basics&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:150--&amp;gt;&lt;br /&gt;
An overview of concepts and basic knowledge required to understand and use KAuth effectively&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/KAuth/KAuth_Actions|&amp;lt;translate&amp;gt;&amp;lt;!--T:151--&amp;gt;&lt;br /&gt;
Using KAuth actions in your application&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:152--&amp;gt;&lt;br /&gt;
How to execute KAuth actions in your application, and how to integrate them tightly into your UI&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/KAuth/Helper_HowTo|&amp;lt;translate&amp;gt;&amp;lt;!--T:153--&amp;gt;&lt;br /&gt;
Creating a KAuth helper to perform a privileged action&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:154--&amp;gt;&lt;br /&gt;
You will learn how to use KAuth's helpers and escalation facilities, and how to seamlessly make a privileged and non privileged portion of your application interact&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/KAuth/KCM_HowTo|&amp;lt;translate&amp;gt;&amp;lt;!--T:155--&amp;gt;&lt;br /&gt;
Creating a KCM requiring authorization upon saving&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:156--&amp;gt;&lt;br /&gt;
Learn how to use the high level KCModule API to create KCModules handling authorization, and its UI integration, on their own&lt;br /&gt;
&lt;br /&gt;
== Multimedia (Phonon) == &amp;lt;!--T:157--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Phonon/Introduction|&amp;lt;translate&amp;gt;&amp;lt;!--T:158--&amp;gt;&lt;br /&gt;
Phonon&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:159--&amp;gt;&lt;br /&gt;
The ;[[Special:myLanguage/Development/Tutorials/Phonon/Introduction|Introduction to Phonon]] tells how to compile and run the code.  If you like to work in Python, try [[Development/Tutorials/Phonon/Introduction/Python|this version]] of the same tutorial&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Phonon/Backends|&amp;lt;translate&amp;gt;&amp;lt;!--T:160--&amp;gt;&lt;br /&gt;
Writing Backends&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:161--&amp;gt;&lt;br /&gt;
How to start creating a new backend for the multimedia API&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:162--&amp;gt;&lt;br /&gt;
;Resources&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:163--&amp;gt;&lt;br /&gt;
:Please have a look at the [http://api.kde.org/kdesupport-api/kdesupport-apidocs/phonon-git/html/ online documentation] for information on the Phonon API. If you prefer using Qt Assistant or Qt Creator you can also use our [http://mts.ms/phonon-4.4.2.qch offline documentation].&lt;br /&gt;
&lt;br /&gt;
== Plasma == &amp;lt;!--T:164--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Special:myLanguage/Development/Tutorials/Plasma|&amp;lt;translate&amp;gt;&amp;lt;!--T:165--&amp;gt;&lt;br /&gt;
Plasma tutorials&amp;lt;/translate&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Personal Information Management (Akonadi) == &amp;lt;!--T:166--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Akonadi/Application|&amp;lt;translate&amp;gt;&amp;lt;!--T:167--&amp;gt;&lt;br /&gt;
Using Akonadi in Applications&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:168--&amp;gt;&lt;br /&gt;
Displaying and modifying data provided by Akonadi&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Akonadi/Resources|&amp;lt;translate&amp;gt;&amp;lt;!--T:169--&amp;gt;&lt;br /&gt;
Developing Akonadi Resources&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:170--&amp;gt;&lt;br /&gt;
Akonadi Resources are agent programs which transport PIM data between Akonadi and a backend (files, servers, etc)&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Akonadi/SerializerPlugin|&amp;lt;translate&amp;gt;&amp;lt;!--T:171--&amp;gt;&lt;br /&gt;
Using custom data types with Akonadi&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:172--&amp;gt;&lt;br /&gt;
Akonadi can handle arbitrary data as item payloads through the use of a plugin based serialization framework&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/AkonadiPorting|&amp;lt;translate&amp;gt;&amp;lt;!--T:173--&amp;gt;&lt;br /&gt;
Porting Applications which use KResource API&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:174--&amp;gt;&lt;br /&gt;
Applications using KDE's now deprecated KResource APIs, e.g. KABC or KCal, need to be ported to use their Akonadi equivalents&lt;br /&gt;
&lt;br /&gt;
== Kate / Kwrite == &amp;lt;!--T:175--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Kate/KTextEditor Plugins|&amp;lt;translate&amp;gt;&amp;lt;!--T:176--&amp;gt;&lt;br /&gt;
Getting started with KTextEditor plugins&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:177--&amp;gt;&lt;br /&gt;
Creating your first KTextEditor plugin&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Kate/KTextEditor_Plugins_Advanced|&amp;lt;translate&amp;gt;&amp;lt;!--T:178--&amp;gt;&lt;br /&gt;
Developing a plugin with configuration dialog&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:179--&amp;gt;&lt;br /&gt;
Adding a configuration dialog to the Time &amp;amp; Date example&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Kate/KTextEditor_Example|&amp;lt;translate&amp;gt;&amp;lt;!--T:180--&amp;gt;&lt;br /&gt;
A small Editor&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:181--&amp;gt;&lt;br /&gt;
Create a small application using KTextEditor&lt;br /&gt;
&lt;br /&gt;
== KDevelop == &amp;lt;!--T:182--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/KDevelop-PG-Qt_Introduction|&amp;lt;translate&amp;gt;&amp;lt;!--T:183--&amp;gt;&lt;br /&gt;
KDevelop-PG-Qt Introduction&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:184--&amp;gt;&lt;br /&gt;
Information on the KDevelop parser generator, useful for language plugins.&lt;br /&gt;
&lt;br /&gt;
==Printing== &amp;lt;!--T:185--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:186--&amp;gt;&lt;br /&gt;
KDE mostly uses the [http://doc.qt.nokia.com/latest/printing.html Qt Printing infrastructure].&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Printing Hello World|&amp;lt;translate&amp;gt;&amp;lt;!--T:187--&amp;gt;&lt;br /&gt;
Hello World&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:188--&amp;gt;&lt;br /&gt;
Introduction to the KDE printing system&lt;br /&gt;
&lt;br /&gt;
== kioslaves == &amp;lt;!--T:189--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Special:myLanguage/Development/Tutorials/KIO Slaves/Using KIO Slaves in your Program|&amp;lt;translate&amp;gt;&amp;lt;!--T:190--&amp;gt;&lt;br /&gt;
Using kioslaves in your Program&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
* [[Special:myLanguage/Development/Tutorials/KIO Slaves/Hello World|&amp;lt;translate&amp;gt;&amp;lt;!--T:191--&amp;gt;&lt;br /&gt;
Creating a Hello-World kioslave&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Collaboration == &amp;lt;!--T:192--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Open Collaboration Services (libattica) === &amp;lt;!--T:193--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Collaboration/Attica/Introduction|&amp;lt;translate&amp;gt;&amp;lt;!--T:194--&amp;gt;&lt;br /&gt;
Introduction to Attica&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:195--&amp;gt;&lt;br /&gt;
In this tutorial a simple widget showing information about a Person on the server is created.&lt;br /&gt;
&lt;br /&gt;
=== Get Hot New Stuff  === &amp;lt;!--T:196--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Collaboration/HotNewStuff/Introduction|&amp;lt;translate&amp;gt;&amp;lt;!--T:197--&amp;gt;&lt;br /&gt;
Get Hot New Stuff 3 - Download&amp;lt;/translate&amp;gt;]] &lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:198--&amp;gt;&lt;br /&gt;
How to use KHotNewStuff3 in your application.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Collaboration/HotNewStuff/Updates|&amp;lt;translate&amp;gt;&amp;lt;!--T:199--&amp;gt;&lt;br /&gt;
Get Hot New Stuff 3 - Checking for Updates&amp;lt;/translate&amp;gt;]] &lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:200--&amp;gt;&lt;br /&gt;
How to check whether updates for installed stuff are available without showing the dialog/widget.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Collaboration/HotNewStuff/Upload|&amp;lt;translate&amp;gt;&amp;lt;!--T:201--&amp;gt;&lt;br /&gt;
Get Hot New Stuff 3 - Upload&amp;lt;/translate&amp;gt;]] &lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:202--&amp;gt;&lt;br /&gt;
How to add an upload dialog to your application.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:203--&amp;gt;&lt;br /&gt;
Old links for KNS2 and KNS1 content:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/K Hot New Stuff2|&amp;lt;translate&amp;gt;&amp;lt;!--T:204--&amp;gt;&lt;br /&gt;
Introduction to Get Hot New Stuff 2&amp;lt;/translate&amp;gt;]] &lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:205--&amp;gt;&lt;br /&gt;
A short tutorial about how to use KHotNewStuff2 in your application. Deprecated, use version 3 &amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Introduction to Get Hot New Stuff|&amp;lt;translate&amp;gt;&amp;lt;!--T:206--&amp;gt;&lt;br /&gt;
Introduction to Get Hot New Stuff&amp;lt;/translate&amp;gt;]] &lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:207--&amp;gt;&lt;br /&gt;
An introduction to the developer-friendly network update system that allows KDE applications to fetch new application data at runtime in a user friendly manner.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/KNewStuffSecure|&amp;lt;translate&amp;gt;&amp;lt;!--T:208--&amp;gt;&lt;br /&gt;
KNewStuff Secure&amp;lt;/translate&amp;gt;]] ([http://developer.kde.org/documentation/tutorials/knewstuffsecure/index.html &amp;lt;translate&amp;gt;&amp;lt;!--T:209--&amp;gt;&lt;br /&gt;
Original Link&amp;lt;/translate&amp;gt;]) &lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:210--&amp;gt;&lt;br /&gt;
Tutorial showing how to share resources in a secured way (KDE 3.4 and later). By András Mantia &amp;amp;lt;amantia@kde.org&amp;amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Goya == &amp;lt;!--T:211--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Introduction to Goya usage|&amp;lt;translate&amp;gt;&amp;lt;!--T:212--&amp;gt;&lt;br /&gt;
Introduction to Goya usage&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:213--&amp;gt;&lt;br /&gt;
An introduction for the Goya subsystem usage, which allows you to easily add widgets to your itemviews and connect their signals to your code, as they were real widgets.&amp;lt;/translate&amp;gt;&lt;br /&gt;
; [[Special:myLanguage/Development/Tutorials/Introduction to Goya usage 2|&amp;lt;translate&amp;gt;&amp;lt;!--T:214--&amp;gt;&lt;br /&gt;
Introduction to Goya usage (part 2)&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:215--&amp;gt;&lt;br /&gt;
The second part of the tutorial, with a slightly more complex example than the first part.&lt;br /&gt;
&lt;br /&gt;
== Other programming languages == &amp;lt;!--T:216--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python === &amp;lt;!--T:217--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[http://www.learningpython.com/2008/09/20/an-introduction-to-pyqt/ &amp;lt;translate&amp;gt;&amp;lt;!--T:218--&amp;gt;&lt;br /&gt;
An Introduction to PyQt&amp;lt;/translate&amp;gt;]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:219--&amp;gt;&lt;br /&gt;
Starting off&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[http://lateral.netmanagers.com.ar/stories/BBS47.html&amp;lt;translate&amp;gt; &amp;lt;!--T:220--&amp;gt;&lt;br /&gt;
PyQt by Example&amp;lt;/translate&amp;gt;]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:221--&amp;gt;&lt;br /&gt;
Another introduction to PyQt&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Languages/Python/PyKDE_WebKit_Tutorial|&amp;lt;translate&amp;gt;&amp;lt;!--T:222--&amp;gt;&lt;br /&gt;
PyKDE WebKit Tutorial&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:223--&amp;gt;&lt;br /&gt;
A simple web browser application in PyKDE&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Python introduction to signals and slots|&amp;lt;translate&amp;gt;&amp;lt;!--T:224--&amp;gt;&lt;br /&gt;
101 Introduction to signals and slots&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:225--&amp;gt;&lt;br /&gt;
A simple introduction to Qt's signal and slot architecture.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Languages/Python/PyKDE_DBus_Tutorial|&amp;lt;translate&amp;gt;&amp;lt;!--T:226--&amp;gt;&lt;br /&gt;
PyKDE DBus Tutorial&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:227--&amp;gt;&lt;br /&gt;
An introduction to DBus communication using PyKDE&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Languages/Python/PyKDE_Knotify_Tutorial|&amp;lt;translate&amp;gt;&amp;lt;!--T:228--&amp;gt;&lt;br /&gt;
PyKDE KNotify Tutorial]]&lt;br /&gt;
:An introduction to Knotify (Notifications and KJobs) using PyKDE&lt;br /&gt;
&lt;br /&gt;
=== Ruby === &amp;lt;!--T:229--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[http://developer.kde.org/language-bindings/ruby/kde3tutorial/index.html &amp;lt;translate&amp;gt;&amp;lt;!--T:230--&amp;gt;&lt;br /&gt;
KDE Ruby Korundum tutorial&amp;lt;/translate&amp;gt;]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:231--&amp;gt;&lt;br /&gt;
A ruby version of Antonio Larrosa Jim&amp;amp;eacute;nez's KDE tutorial by Richard Dale. See the [[Development/Languages/Ruby|Ruby Developers Corner]] for Qt tutorials and other info.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Qt4_Ruby_Tutorial|&amp;lt;translate&amp;gt;&amp;lt;!--T:232--&amp;gt;&lt;br /&gt;
Qt4 Ruby Tutorial&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:233--&amp;gt;&lt;br /&gt;
Nokia's fabulous introductory tutorial to Qt, translated to Ruby.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Plasma/RubyApplet|&amp;lt;translate&amp;gt;&amp;lt;!--T:234--&amp;gt;&lt;br /&gt;
Creating a Plasma Widget in Ruby&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:235--&amp;gt;&lt;br /&gt;
Tutorial that shows how to create your first Plasma Applet using the Ruby language.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Developing_Qt4_Applications_using_Qt_Designer_and_Ruby_on_Kubuntu|&amp;lt;translate&amp;gt;&amp;lt;!--T:236--&amp;gt;&lt;br /&gt;
Developing Qt4 Applications using Qt Designer and Ruby on Kubuntu&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:237--&amp;gt;&lt;br /&gt;
Tutorial that shows how to design a simple User Interface in Qt Designer and then use the resulting widget in a Qt Ruby application we build from scratch.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Languages/Ruby/Ruby-Qt/KDE_Book|&amp;lt;translate&amp;gt;&amp;lt;!--T:238--&amp;gt;&lt;br /&gt;
Ruby-Qt/KDE Book]]&lt;br /&gt;
:There is also an approach to create an Ruby-Qt/KDE Book under a free license. The content will be created in this wiki.&lt;br /&gt;
&lt;br /&gt;
=== Shell === &amp;lt;!--T:239--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Shell_Scripting_with_KDE_Dialogs|&amp;lt;translate&amp;gt;&amp;lt;!--T:240--&amp;gt;&lt;br /&gt;
Shell Scripting with KDE dialogs&amp;lt;/translate&amp;gt;]] ([http://developer.kde.org/documentation/tutorials/kdialog/t1.html &amp;lt;translate&amp;gt;&amp;lt;!--T:241--&amp;gt;&lt;br /&gt;
Original Link&amp;lt;/translate&amp;gt;]) &lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:242--&amp;gt;&lt;br /&gt;
Tutorial by [mailto:bradh@frogmouth.net Brad Hards] that describes how to use KDE dialogs in shell scripts with kdialog. It is presented as an example based tutorial.&lt;br /&gt;
&lt;br /&gt;
== Graphics Programming == &amp;lt;!--T:243--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Graphics/Performance|&amp;lt;translate&amp;gt;&amp;lt;!--T:244--&amp;gt;&lt;br /&gt;
QPainter Perfomance&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:245--&amp;gt;&lt;br /&gt;
Hints on avoiding common mistakes leading to poor performance when using QPainter&lt;br /&gt;
&lt;br /&gt;
== Using the KDE Games Libraries == &amp;lt;!--T:246--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Games/KStandardGameAction|&amp;lt;translate&amp;gt; &amp;lt;!--T:247--&amp;gt;&lt;br /&gt;
KStandardGameAction&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:248--&amp;gt;&lt;br /&gt;
Using libkdegames to make your game fit the kdegames standard&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Games/Highscores| &amp;lt;translate&amp;gt;&amp;lt;!--T:249--&amp;gt;&lt;br /&gt;
Highscores&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:250--&amp;gt;&lt;br /&gt;
Implementing a simple highscore table into your game&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Games/Theme Selector|&amp;lt;translate&amp;gt; &amp;lt;!--T:251--&amp;gt;&lt;br /&gt;
Theme Selector&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:252--&amp;gt;&lt;br /&gt;
Using the libkdegames theme selection dialog&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Games/Palapeli Patterns|&amp;lt;translate&amp;gt; &amp;lt;!--T:253--&amp;gt;&lt;br /&gt;
Palapeli Slicers&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:254--&amp;gt;&lt;br /&gt;
Creating a slicer plugin for Palapeli&lt;br /&gt;
&lt;br /&gt;
=== KGLEngine === &amp;lt;!--T:255--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Games/kglengine/kglengine-simpleBox|&amp;lt;translate&amp;gt; &amp;lt;!--T:256--&amp;gt;&lt;br /&gt;
Installation and your first KGLItem&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:257--&amp;gt;&lt;br /&gt;
start your first kglengine application&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Games/KGLEngine2d| kglpong]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:258--&amp;gt;&lt;br /&gt;
Now use our knowledge to make a pong&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using the KDE PIM Libraries ==&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/PIM/ical|&amp;lt;translate&amp;gt; &amp;lt;!--T:259--&amp;gt;&lt;br /&gt;
iCalendar functionality&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:260--&amp;gt;&lt;br /&gt;
Using kcal to manage iCalendar files&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;== Other tutorials == &amp;lt;!--T:261--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2D Plotting (KPlotWidget) === &amp;lt;!--T:262--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/KPlotWidget|&amp;lt;translate&amp;gt;&amp;lt;!--T:263--&amp;gt;&lt;br /&gt;
Using the KDE data-plotting widget&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:264--&amp;gt;&lt;br /&gt;
This tutorial introduces KPlotWidget, which is used for 2-D data plotting.  It includes information on simple usage of the widget (including adding and modifying data sets, and customizing the plot axes and labels), and advanced customization (including extending the widget through sub-classing).&lt;br /&gt;
&lt;br /&gt;
=== Spelling and Grammar Checking (Sonnet) === &amp;lt;!--T:265--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Sonnet/SonnetTutorial|&amp;lt;translate&amp;gt;&amp;lt;!--T:266--&amp;gt;&lt;br /&gt;
Adding spell-checking or grammar-checking to KDE applications&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:267--&amp;gt;&lt;br /&gt;
This tutorial introduces Sonnet and how one may use it to add language correction to your KDE application. Sonnet's auxiliary features shall be described in a separate tutorial.&lt;br /&gt;
&lt;br /&gt;
=== Pixmap cache (KPixmapCache) === &amp;lt;!--T:268--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/KPixmapCache|&amp;lt;translate&amp;gt;&amp;lt;!--T:269--&amp;gt;&lt;br /&gt;
Using the KDE pixmap cache&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:270--&amp;gt;&lt;br /&gt;
This tutorial shows how to use KPixmapCache to cache e.g. pixmaps generated from SVGs or some data.&lt;br /&gt;
&lt;br /&gt;
=== Using MarbleWidget (Marble) === &amp;lt;!--T:271--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/MarbleWidget|&amp;lt;translate&amp;gt;&amp;lt;!--T:272--&amp;gt;&lt;br /&gt;
Using MarbleWidget&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:273--&amp;gt;&lt;br /&gt;
This short tutorial describes how to use the MarbleWidget in your project&lt;br /&gt;
&lt;br /&gt;
=== Using local SCM for KDE development === &amp;lt;!--T:274--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Git|&amp;lt;translate&amp;gt;&amp;lt;!--T:275--&amp;gt;&lt;br /&gt;
Using Git to develop for KDE&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:276--&amp;gt;&lt;br /&gt;
Here you find how to use Git to develop for KDE&lt;br /&gt;
&lt;br /&gt;
=== Kwin effect tutorial (blog) === &amp;lt;!--T:277--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:278--&amp;gt;&lt;br /&gt;
;[http://blog.martin-graesslin.com/blog/?p=258 blog by Martin Graesslin]&lt;br /&gt;
:This tutorial guides you through the development of a simple KWin effect&lt;br /&gt;
&lt;br /&gt;
=== Implementing KSysGuard sensors and adding them === &amp;lt;!--T:279--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Sensors|&amp;lt;translate&amp;gt;&amp;lt;!--T:280--&amp;gt;&lt;br /&gt;
Sensors Tutorial&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:281--&amp;gt;&lt;br /&gt;
This tutorial shows how to write and KSysGuard sensor and connect it to the systray. &amp;lt;/translate&amp;gt;&lt;br /&gt;
Runners&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Porting an application from KSystemTrayIcon to KStatusNotifierItem === &amp;lt;!--T:282--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/PortToKStatusNotifierItem|&amp;lt;translate&amp;gt;&amp;lt;!--T:283--&amp;gt;&lt;br /&gt;
Porting from KSystemTrayIcon to KStatusNotifierItem&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:284--&amp;gt;&lt;br /&gt;
This tutorials shows how to port an application using KSystemTrayIcon to KStatusNotifierItem&lt;br /&gt;
&lt;br /&gt;
=== Using the KDE Wallet API for safe storage === &amp;lt;!--T:285--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/KWallet|&amp;lt;translate&amp;gt;&amp;lt;!--T:286--&amp;gt;&lt;br /&gt;
KWallet&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:287--&amp;gt;&lt;br /&gt;
&amp;quot;Brief introduction to the KWallet API which can be used for storing all kinds of sensitive information.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===How to edit a wiki with Libmediawiki === &amp;lt;!--T:288--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/Libmediawiki|&amp;lt;translate&amp;gt;&amp;lt;!--T:289--&amp;gt;&lt;br /&gt;
Libmediawiki&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:290--&amp;gt;&lt;br /&gt;
This tutorial present how to edit a wiki with Libmediawiki.&lt;br /&gt;
&lt;br /&gt;
== KDE2 and KDE3 Materials == &amp;lt;!--T:291--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/KWallet|&amp;lt;translate&amp;gt;&amp;lt;!--T:292--&amp;gt;&lt;br /&gt;
KWallet]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/KDE4 Porting Guide|&amp;lt;translate&amp;gt;&amp;lt;!--T:293--&amp;gt;&lt;br /&gt;
Porting Your Application from KDE 3 to KDE 4&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:294--&amp;gt;&lt;br /&gt;
These tutorials cover topics related to the migration from KDE 3 to KDE 4.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/KDE3|&amp;lt;translate&amp;gt;&amp;lt;!--T:295--&amp;gt;&lt;br /&gt;
KDE3 Tutorials&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:296--&amp;gt;&lt;br /&gt;
These tutorials cover topics related to KDE3.&amp;lt;/translate&amp;gt;&lt;br /&gt;
;[[Special:myLanguage/Development/Tutorials/KDE2|&amp;lt;translate&amp;gt;&amp;lt;!--T:297--&amp;gt;&lt;br /&gt;
KDE2 Tutorials&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:298--&amp;gt;&lt;br /&gt;
These tutorials cover topics related to KDE2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:299--&amp;gt;&lt;br /&gt;
[[Category:KDE4]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-10T12:20:42Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/KCM_HowTo}} &lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Plugins and KParts|&lt;br /&gt;
&lt;br /&gt;
name=KCM HowTo|&lt;br /&gt;
&lt;br /&gt;
pre=|&lt;br /&gt;
&lt;br /&gt;
next=|&lt;br /&gt;
&lt;br /&gt;
reading=[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKCModule.html KCModule Class Reference]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot; /* kcm name */, &amp;quot;kcm_foo&amp;quot; /* catalog name */))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
It is possible to get code from the KCM to be run at startup by kcminit. &lt;br /&gt;
&lt;br /&gt;
To do so you must declare a function named &amp;quot;kcminit_${module}&amp;quot;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KDEEXPORT void kcminit_foo()&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init-Symbol&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
Possible values at the time of this writing are:&lt;br /&gt;
* settings-lost-and-found&lt;br /&gt;
* settings-hardware&lt;br /&gt;
* settings-network-and-connectivity&lt;br /&gt;
* settings-system-administration&lt;br /&gt;
* settings-application-appearance-and-behavior&lt;br /&gt;
* settings-workspace-appearance-and-behavior&lt;br /&gt;
&lt;br /&gt;
You can get a list of possible categories with this command, which lists all toplevel categories:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ktraderclient --servicetype SystemSettingsCategory --constraint &amp;quot;[X-KDE-System-Settings-Parent-Category] == ''&amp;quot; | grep DesktopEntryName&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Just do not use the &amp;quot;settings-lost-and-found&amp;quot; entry.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.  If you only have one KCModule in a library this key is not needed. If you have several KCMs in one library you will need a desktop file for each KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named &amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example, the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
You can also make the value of this key depend on the output of a program, using the &amp;quot;[$e]&amp;quot; key suffix. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hidden[$e]=$(if test -e /dev/js*; then echo &amp;quot;false&amp;quot;; else echo &amp;quot;true&amp;quot;; fi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example executes the given code in a shell and uses the stdout output for the Hidden value (so it's either Hidden=true or Hidden=false).&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-10T12:20:02Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: Add nav bar and tutorial browser&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/KCM_HowTo}} &lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Plugins and KParts|&lt;br /&gt;
&lt;br /&gt;
name=KCM HowTo&lt;br /&gt;
&lt;br /&gt;
pre=|&lt;br /&gt;
&lt;br /&gt;
next=|&lt;br /&gt;
&lt;br /&gt;
reading=[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKCModule.html KCModule Class Reference]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot; /* kcm name */, &amp;quot;kcm_foo&amp;quot; /* catalog name */))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
It is possible to get code from the KCM to be run at startup by kcminit. &lt;br /&gt;
&lt;br /&gt;
To do so you must declare a function named &amp;quot;kcminit_${module}&amp;quot;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KDEEXPORT void kcminit_foo()&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init-Symbol&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
Possible values at the time of this writing are:&lt;br /&gt;
* settings-lost-and-found&lt;br /&gt;
* settings-hardware&lt;br /&gt;
* settings-network-and-connectivity&lt;br /&gt;
* settings-system-administration&lt;br /&gt;
* settings-application-appearance-and-behavior&lt;br /&gt;
* settings-workspace-appearance-and-behavior&lt;br /&gt;
&lt;br /&gt;
You can get a list of possible categories with this command, which lists all toplevel categories:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ktraderclient --servicetype SystemSettingsCategory --constraint &amp;quot;[X-KDE-System-Settings-Parent-Category] == ''&amp;quot; | grep DesktopEntryName&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Just do not use the &amp;quot;settings-lost-and-found&amp;quot; entry.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.  If you only have one KCModule in a library this key is not needed. If you have several KCMs in one library you will need a desktop file for each KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named &amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example, the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
You can also make the value of this key depend on the output of a program, using the &amp;quot;[$e]&amp;quot; key suffix. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hidden[$e]=$(if test -e /dev/js*; then echo &amp;quot;false&amp;quot;; else echo &amp;quot;true&amp;quot;; fi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example executes the given code in a shell and uses the stdout output for the Hidden value (so it's either Hidden=true or Hidden=false).&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-10T12:15:32Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: moved User:Agateau/KCM HowTo to Development/Tutorials/KCM HowTo: Proof-read by Ben Cooksley, can be integrated.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot; /* kcm name */, &amp;quot;kcm_foo&amp;quot; /* catalog name */))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
It is possible to get code from the KCM to be run at startup by kcminit. &lt;br /&gt;
&lt;br /&gt;
To do so you must declare a function named &amp;quot;kcminit_${module}&amp;quot;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KDEEXPORT void kcminit_foo()&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init-Symbol&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
Possible values at the time of this writing are:&lt;br /&gt;
* settings-lost-and-found&lt;br /&gt;
* settings-hardware&lt;br /&gt;
* settings-network-and-connectivity&lt;br /&gt;
* settings-system-administration&lt;br /&gt;
* settings-application-appearance-and-behavior&lt;br /&gt;
* settings-workspace-appearance-and-behavior&lt;br /&gt;
&lt;br /&gt;
You can get a list of possible categories with this command, which lists all toplevel categories:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ktraderclient --servicetype SystemSettingsCategory --constraint &amp;quot;[X-KDE-System-Settings-Parent-Category] == ''&amp;quot; | grep DesktopEntryName&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Just do not use the &amp;quot;settings-lost-and-found&amp;quot; entry.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.  If you only have one KCModule in a library this key is not needed. If you have several KCMs in one library you will need a desktop file for each KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named &amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example, the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
You can also make the value of this key depend on the output of a program, using the &amp;quot;[$e]&amp;quot; key suffix. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hidden[$e]=$(if test -e /dev/js*; then echo &amp;quot;false&amp;quot;; else echo &amp;quot;true&amp;quot;; fi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example executes the given code in a shell and uses the stdout output for the Hidden value (so it's either Hidden=true or Hidden=false).&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Agateau/KCM_HowTo</id>
		<title>User:Agateau/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Agateau/KCM_HowTo"/>
				<updated>2012-04-10T12:15:32Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: moved User:Agateau/KCM HowTo to Development/Tutorials/KCM HowTo: Proof-read by Ben Cooksley, can be integrated.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Development/Tutorials/KCM HowTo]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-10T09:56:34Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: Fill list of possible categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot; /* kcm name */, &amp;quot;kcm_foo&amp;quot; /* catalog name */))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
It is possible to get code from the KCM to be run at startup by kcminit. &lt;br /&gt;
&lt;br /&gt;
To do so you must declare a function named &amp;quot;kcminit_${module}&amp;quot;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KDEEXPORT void kcminit_foo()&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init-Symbol&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
Possible values at the time of this writing are:&lt;br /&gt;
* settings-lost-and-found&lt;br /&gt;
* settings-hardware&lt;br /&gt;
* settings-network-and-connectivity&lt;br /&gt;
* settings-system-administration&lt;br /&gt;
* settings-application-appearance-and-behavior&lt;br /&gt;
* settings-workspace-appearance-and-behavior&lt;br /&gt;
&lt;br /&gt;
You can get a list of possible categories with this command, which lists all toplevel categories:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ktraderclient --servicetype SystemSettingsCategory --constraint &amp;quot;[X-KDE-System-Settings-Parent-Category] == ''&amp;quot; | grep DesktopEntryName&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Just do not use the &amp;quot;settings-lost-and-found&amp;quot; entry.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.  If you only have one KCModule in a library this key is not needed. If you have several KCMs in one library you will need a desktop file for each KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named &amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example, the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
You can also make the value of this key depend on the output of a program, using the &amp;quot;[$e]&amp;quot; key suffix. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hidden[$e]=$(if test -e /dev/js*; then echo &amp;quot;false&amp;quot;; else echo &amp;quot;true&amp;quot;; fi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example executes the given code in a shell and uses the stdout output for the Hidden value (so it's either Hidden=true or Hidden=false).&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T14:07:59Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Optional keys */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot; /* kcm name */, &amp;quot;kcm_foo&amp;quot; /* catalog name */))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
It is possible to get code from the KCM to be run at startup by kcminit. &lt;br /&gt;
&lt;br /&gt;
To do so you must declare a function named &amp;quot;kcminit_${module}&amp;quot;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KDEEXPORT void kcminit_foo()&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init-Symbol&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.  If you only have one KCModule in a library this key is not needed. If you have several KCMs in one library you will need a desktop file for each KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named &amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example, the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
You can also make the value of this key depend on the output of a program, using the &amp;quot;[$e]&amp;quot; key suffix. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hidden[$e]=$(if test -e /dev/js*; then echo &amp;quot;false&amp;quot;; else echo &amp;quot;true&amp;quot;; fi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example executes the given code in a shell and uses the stdout output for the Hidden value (so it's either Hidden=true or Hidden=false).&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T14:07:31Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Optional keys */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot; /* kcm name */, &amp;quot;kcm_foo&amp;quot; /* catalog name */))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
It is possible to get code from the KCM to be run at startup by kcminit. &lt;br /&gt;
&lt;br /&gt;
To do so you must declare a function named &amp;quot;kcminit_${module}&amp;quot;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KDEEXPORT void kcminit_foo()&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init-Symbol&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.  If you only have one KCModule in a library this key is not needed. If you have several KCMs in one library you will need a desktop file for each KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named &amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example, the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
You can also make the value of this key depend on the output of a program, using the &amp;quot;[$e]&amp;quot; key suffix. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hidden[$e]=$(if test -e /dev/js*; then echo &amp;quot;false&amp;quot;; else echo &amp;quot;true&amp;quot;; fi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The example executes the given code in a shell and uses the stdout output for the Hidden value (so it's either Hidden=true or Hidden=false).&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T14:07:14Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Optional keys */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot; /* kcm name */, &amp;quot;kcm_foo&amp;quot; /* catalog name */))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
It is possible to get code from the KCM to be run at startup by kcminit. &lt;br /&gt;
&lt;br /&gt;
To do so you must declare a function named &amp;quot;kcminit_${module}&amp;quot;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KDEEXPORT void kcminit_foo()&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init-Symbol&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.  If you only have one KCModule in a library this key is not needed. If you have several KCMs in one library you will need a desktop file for each KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named &amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example, the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
You can also make the value of this key depend on the output of a program, using the &amp;quot;[$e]&amp;quot; key suffix. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Hidden[$e]=$(if test -e /dev/js*; then echo &amp;quot;false&amp;quot;; else echo &amp;quot;true&amp;quot;; fi)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The example executes the given code in a shell and uses the stdout output for the Hidden value (so it's either Hidden=true or Hidden=false).&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T14:06:53Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Optional keys */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot; /* kcm name */, &amp;quot;kcm_foo&amp;quot; /* catalog name */))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
It is possible to get code from the KCM to be run at startup by kcminit. &lt;br /&gt;
&lt;br /&gt;
To do so you must declare a function named &amp;quot;kcminit_${module}&amp;quot;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KDEEXPORT void kcminit_foo()&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init-Symbol&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.  If you only have one KCModule in a library this key is not needed. If you have several KCMs in one library you will need a desktop file for each KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named &amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example, the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
You can also make the value of this key depend on the output of a program, using the &amp;quot;[$e]&amp;quot; key suffix. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
Hidden[$e]=$(if test -e /dev/js*; then echo &amp;quot;false&amp;quot;; else echo &amp;quot;true&amp;quot;; fi)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The example executes the given code in a shell and uses the stdout output for the Hidden value (so it's either Hidden=true or Hidden=false).&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T14:06:25Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Optional keys */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot; /* kcm name */, &amp;quot;kcm_foo&amp;quot; /* catalog name */))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
It is possible to get code from the KCM to be run at startup by kcminit. &lt;br /&gt;
&lt;br /&gt;
To do so you must declare a function named &amp;quot;kcminit_${module}&amp;quot;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KDEEXPORT void kcminit_foo()&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init-Symbol&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.  If you only have one KCModule in a library this key is not needed. If you have several KCMs in one library you will need a desktop file for each KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named &amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example, the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
You can also make the value of this key depend on the output of a program, using the &amp;quot;[$e]&amp;quot; key suffix. For example:&lt;br /&gt;
&lt;br /&gt;
    Hidden[$e]=$(if test -e /dev/js*; then echo &amp;quot;false&amp;quot;; else echo &amp;quot;true&amp;quot;; fi)&lt;br /&gt;
&lt;br /&gt;
The example executes the given code in a shell and uses the stdout output for the Hidden value (so it's either Hidden=true or Hidden=false).&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:56:14Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* The shared library */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot; /* kcm name */, &amp;quot;kcm_foo&amp;quot; /* catalog name */))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
It is possible to get code from the KCM to be run at startup by kcminit. &lt;br /&gt;
&lt;br /&gt;
To do so you must declare a function named &amp;quot;kcminit_${module}&amp;quot;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KDEEXPORT void kcminit_foo()&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init-Symbol&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:53:07Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* The shared library */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
It is possible to get code from the KCM to be run at startup by kcminit. &lt;br /&gt;
&lt;br /&gt;
To do so you must declare a function named &amp;quot;kcminit_${module}&amp;quot;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KDEEXPORT void kcminit_foo()&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init-Symbol&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:52:54Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Initializing on startup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
It is possible to get code from the KCM to be run at startup by kcminit. &lt;br /&gt;
&lt;br /&gt;
To do so you must declare a function named &amp;quot;kcminit_${module}&amp;quot;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KDEEXPORT void kcminit_foo()&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init-Symbol&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:47:30Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Optional keys */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init-Symbol&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init-Symbol is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;kcminit_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:46:01Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Mandatory keys */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot; for most KCM. If you want to use the kcminit feature it should be &amp;quot;KCModule,KCModuleInit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:40:43Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* About this howto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and refreshed for KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:40:27Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This howto describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and updated to KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:39:44Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* KCMultiDialog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This HOWTO describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control than starting kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and updated to KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:39:11Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* kcmshell4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This HOWTO describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use &amp;quot;kcmshell4 fonts colors&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control to the behavior and results than starting&lt;br /&gt;
kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and updated to KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:38:33Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* kcmshell4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This HOWTO describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 [module_name]&amp;quot;. For example, to get the font and the desktop color settings, use:&lt;br /&gt;
&lt;br /&gt;
    kcmshell4 fonts colors&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control to the behavior and results than starting&lt;br /&gt;
kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and updated to KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:38:07Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* kcmshell4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This HOWTO describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
You can run one or several modules independently with &amp;quot;kcmshell4 ${module_name}&amp;quot;. For example, to get the font and the desktop color settings, use:&lt;br /&gt;
&lt;br /&gt;
    kcmshell4 fonts colors&lt;br /&gt;
&lt;br /&gt;
To get a list of the available modules, use &amp;quot;kcmshell4 --list&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control to the behavior and results than starting&lt;br /&gt;
kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and updated to KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:36:57Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Mandatory keys */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This HOWTO describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
Set this to &amp;quot;kcontrol&amp;quot; if you want your KCM to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
The application you put in this key determines in what situations your KCM will&lt;br /&gt;
show. It is crucial to select a correct ParentApp, otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the &amp;quot;kcm_&amp;quot; prefix. In our example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
Consider you want to run a module standalone. Call &amp;quot;kcmshell4 module&amp;quot;. For&lt;br /&gt;
example, to get the font and the desktop color settings, use:&lt;br /&gt;
&lt;br /&gt;
    kcmshell4 fonts colors&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control to the behavior and results than starting&lt;br /&gt;
kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and updated to KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:34:24Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Initializing on startup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This HOWTO describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must also add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
The application you put in this entry determines in what situations it will&lt;br /&gt;
show. For example, if the line says &amp;quot;X-KDE-ParentApp=kcontrol&amp;quot; the module will&lt;br /&gt;
show up in KControl. It is very crucial the selected ParentApp is correct,&lt;br /&gt;
otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the kcm_ prefix. So in the example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
Consider you want to run a module standalone. Call &amp;quot;kcmshell4 module&amp;quot;. For&lt;br /&gt;
example, to get the font and the desktop color settings, use:&lt;br /&gt;
&lt;br /&gt;
    kcmshell4 fonts colors&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control to the behavior and results than starting&lt;br /&gt;
kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and updated to KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:34:00Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Exporting more than one module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This HOWTO describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to declare them another way: you must create C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don't forget to add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
The application you put in this entry determines in what situations it will&lt;br /&gt;
show. For example, if the line says &amp;quot;X-KDE-ParentApp=kcontrol&amp;quot; the module will&lt;br /&gt;
show up in KControl. It is very crucial the selected ParentApp is correct,&lt;br /&gt;
otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the kcm_ prefix. So in the example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
Consider you want to run a module standalone. Call &amp;quot;kcmshell4 module&amp;quot;. For&lt;br /&gt;
example, to get the font and the desktop color settings, use:&lt;br /&gt;
&lt;br /&gt;
    kcmshell4 fonts colors&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control to the behavior and results than starting&lt;br /&gt;
kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and updated to KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:32:48Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* The shared library */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This HOWTO describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your module is &amp;quot;foo&amp;quot;, the name of the library should be&lt;br /&gt;
&amp;quot;kcm_foo.so&amp;quot;. It should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to use the old&lt;br /&gt;
loader. To do so, you must declare C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two to declare two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don't forget to add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
The application you put in this entry determines in what situations it will&lt;br /&gt;
show. For example, if the line says &amp;quot;X-KDE-ParentApp=kcontrol&amp;quot; the module will&lt;br /&gt;
show up in KControl. It is very crucial the selected ParentApp is correct,&lt;br /&gt;
otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the kcm_ prefix. So in the example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
Consider you want to run a module standalone. Call &amp;quot;kcmshell4 module&amp;quot;. For&lt;br /&gt;
example, to get the font and the desktop color settings, use:&lt;br /&gt;
&lt;br /&gt;
    kcmshell4 fonts colors&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control to the behavior and results than starting&lt;br /&gt;
kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and updated to KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T13:31:58Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This HOWTO describes how to write KConfig Modules (KCMs from now on). These KCM&lt;br /&gt;
can appear in System Settings or in the configuration dialog of individual applications.&lt;br /&gt;
&lt;br /&gt;
A KCM is made of two elements:&lt;br /&gt;
* A shared library&lt;br /&gt;
* A desktop file&lt;br /&gt;
&lt;br /&gt;
==The shared library==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the {{class|KCModule}} class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that System Settings or kcmshell4 can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through {{class|KPluginFactory}}. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure the constructor signature of your derived class matches&lt;br /&gt;
with the signature of {{class|KCModule}} constructor (the QVariantList argument matters).&lt;br /&gt;
&lt;br /&gt;
If the name of your modules is 'foo', the name of the library should be&lt;br /&gt;
kcm_foo.so and should be installed into $KDEDIR/lib/kde4.&lt;br /&gt;
&lt;br /&gt;
===Exporting more than one module===&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to use the old&lt;br /&gt;
loader. To do so, you must declare C functions named &amp;quot;create_${kcm_name}&amp;quot;.  For&lt;br /&gt;
example if your module exposes two to declare two KCMs named Foo1 and Foo2, the&lt;br /&gt;
&amp;quot;create_&amp;quot; functions would look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *create_foo1(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo1Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
        KCModule *create_foo2(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            return new Foo2Kcm(parent, name);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, you will need to add &amp;quot;X-KDE-FactoryName&amp;quot; keys to your&lt;br /&gt;
desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
===Initializing on startup===&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
        {&lt;br /&gt;
            // Do initialization here&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don't forget to add a &amp;quot;X-KDE-Init&amp;quot; key to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place.&lt;br /&gt;
&lt;br /&gt;
Desktop files are defined in the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
===Mandatory keys===&lt;br /&gt;
&lt;br /&gt;
A KCM desktop file ''must'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should be &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ServiceTypes&lt;br /&gt;
Should be &amp;quot;KCModule&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should be &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This will be used by System Settings as your KCM label.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This text shows up in the title area in System Settings. If the module is not&lt;br /&gt;
grouped with other modules it will also be used as a tooltip in the KCM list&lt;br /&gt;
view.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
Should contain at least &amp;quot;Qt;KDE;X-KDE-settings-system;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
The application you put in this entry determines in what situations it will&lt;br /&gt;
show. For example, if the line says &amp;quot;X-KDE-ParentApp=kcontrol&amp;quot; the module will&lt;br /&gt;
show up in KControl. It is very crucial the selected ParentApp is correct,&lt;br /&gt;
otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-System-Settings-Parent-Category&lt;br /&gt;
Defines where the KCM will appear in System Settings.&lt;br /&gt;
(FIXME: Where is the category list?)&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Keywords&lt;br /&gt;
A comma-separated list containing words the search functionality should trigger&lt;br /&gt;
on.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the kcm_ prefix. So in the example,&lt;br /&gt;
it should be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Optional keys===&lt;br /&gt;
Additionally the KCM desktop file ''may'' contains the following keys:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this key is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named&lt;br /&gt;
&amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, kcm_kermit.desktop would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;quot;kcm_quak.desktop&amp;quot; would contain:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in System Settings or when viewed&lt;br /&gt;
with kcmshell4. This is useful when you need to do something at startup using X-KDE-Init&lt;br /&gt;
but don't want the module to show up in System Settings.&lt;br /&gt;
&lt;br /&gt;
==Example CMakeLists.txt==&lt;br /&gt;
&lt;br /&gt;
Here is a minimal CMakeLists.txt which builds and installs the shared library and the&lt;br /&gt;
desktop files at the right places:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_SRCS&lt;br /&gt;
    foo.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
Consider you want to run a module standalone. Call &amp;quot;kcmshell4 module&amp;quot;. For&lt;br /&gt;
example, to get the font and the desktop color settings, use:&lt;br /&gt;
&lt;br /&gt;
    kcmshell4 fonts colors&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
The first option is to simply fork and call &amp;quot;kcmshell4 foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second option is to use {{class|KCMultiDialog}}. This is a simple dialog&lt;br /&gt;
which can show an arbitrary number of modules in a normal {{class|KDialog}}.&lt;br /&gt;
This approach gives you finer control to the behavior and results than starting&lt;br /&gt;
kcmshell4 in a separate process.&lt;br /&gt;
&lt;br /&gt;
Since your module is a simple library, you can just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility to handle modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
==Debugging your module==&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside System Settings, make sure&lt;br /&gt;
you pass --nofork to System Settings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the System Settings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and updated to KDE4 by Aurélien Gâteau &amp;lt;agateau@kde.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCM_HowTo</id>
		<title>Development/Tutorials/KCM HowTo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCM_HowTo"/>
				<updated>2012-04-05T12:35:30Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: Created page with &amp;quot;==Introduction==  A KConfig Module is a small library with a @ref KCModule subclass containing code which builds and support a interface for configuration tasks. The module is th...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
A KConfig Module is a small library with a @ref KCModule subclass containing&lt;br /&gt;
code which builds and support a interface for configuration tasks. The module&lt;br /&gt;
is then encapsulated in a parent application, for example kcmshell, System&lt;br /&gt;
Settings or a KCMultiDialog.&lt;br /&gt;
&lt;br /&gt;
This HOWTO describes how to write KConfig Modules(KCMs from now on). This&lt;br /&gt;
technology was originally designed for KControl. Although KControl is the&lt;br /&gt;
application where the KCM tehnology is the most used, it is used in several&lt;br /&gt;
other places as well, such as Kopete and Kontact. This HOWTO describes how to&lt;br /&gt;
write config modules, regardless of where it will be used. KConfig Modules&lt;br /&gt;
were originally called KControl Modules.&lt;br /&gt;
&lt;br /&gt;
==Implementing==&lt;br /&gt;
&lt;br /&gt;
Implementing a KCM is done by:&lt;br /&gt;
# Subclassing the @ref KCModule class. In this documentation we assume the class inheriting from KCModule is named FooKcm.&lt;br /&gt;
# Exporting the module so that systemsettings or kcmshell can find it.&lt;br /&gt;
&lt;br /&gt;
The prefered way to export the module is through KPluginFactory. Here is how to&lt;br /&gt;
do it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    #include &amp;lt;KPluginFactory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    K_PLUGIN_FACTORY(FooKcmFactory, registerPlugin&amp;lt;FooKcm&amp;gt;();)&lt;br /&gt;
    K_EXPORT_PLUGIN(FooKcmFactory(&amp;quot;kcm_foo&amp;quot;, &amp;quot;kcm_foo&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you get errors, make sure that the constructor of your derived class equals&lt;br /&gt;
the one of the KCModule baseclass (the QStringList argument matters).&lt;br /&gt;
&lt;br /&gt;
If you need to export more than one module per library, you have to use the&lt;br /&gt;
old loader. That is, you need to create a function like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
      KCModule *create_foo(QWidget *parent, const char *name)&lt;br /&gt;
      {&lt;br /&gt;
        return new FooKcm(parent, name);&lt;br /&gt;
      };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function and the implementation of the module is then compiled as a&lt;br /&gt;
shared library. If the name of your modules is 'foo', the name of the library&lt;br /&gt;
should be kcm_foo.so and should be installed into $KDEDIR/lib/kde4 (see @ref kcm_install).&lt;br /&gt;
&lt;br /&gt;
==Initializing on startup==&lt;br /&gt;
&lt;br /&gt;
If your module needs to initialize on KDE session startup, you must have a&lt;br /&gt;
construct like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    extern &amp;quot;C&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
      KCModule *init_foo(QWidget *parent, const char *name)&lt;br /&gt;
      {&lt;br /&gt;
        // Do initialization here&lt;br /&gt;
      };&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don't forget to add X-KDE-Init to your desktop file. (see below)&lt;br /&gt;
&lt;br /&gt;
==The desktop file==&lt;br /&gt;
&lt;br /&gt;
To declare a KCModule's existence a desktop file must be installed in the proper place (see @ref kcm_install).&lt;br /&gt;
&lt;br /&gt;
It could be a good idea to have a look at the [http://www.freedesktop.org/Standards/desktop-entry-spec desktop file specification].&lt;br /&gt;
&lt;br /&gt;
A KCM's .desktop file supports the following .desktop directives:&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Library&lt;br /&gt;
This is the name of the library, without the kcm_ prefix. So in the example,&lt;br /&gt;
the library name would be &amp;quot;foo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-FactoryName&lt;br /&gt;
This entry can be used to set the name of the factory function in the library.&lt;br /&gt;
If you only have one KCModule in a library this directive is not needed. If&lt;br /&gt;
you have several KCMs in one library you will need a .desktop file for each&lt;br /&gt;
KCM.&lt;br /&gt;
&lt;br /&gt;
For example, if you have a library named: kcm_frog.so with two modules, named &amp;quot;kermit&amp;quot; and &amp;quot;quak&amp;quot;, you would have:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=kermit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in one of the .desktop files, and in the other:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-KDE-Library=frog&lt;br /&gt;
X-KDE-FactoryName=quak&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The module loader would then call the &amp;quot;create_kermit&amp;quot; and &amp;quot;create_quak&amp;quot; functions respectively.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-RootOnly&lt;br /&gt;
If this is set to &amp;quot;true&amp;quot;, the module must be executed with root permissions.&lt;br /&gt;
The module loader will then show the module in greyed-out (disabled) state&lt;br /&gt;
with a warning until the &amp;quot;modify&amp;quot; button is pressed which allows running the&lt;br /&gt;
module in an root environment using kdesu and QXEmbed.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-ParentApp&lt;br /&gt;
The application you put in this entry determines in what situations it will&lt;br /&gt;
show. For example, if the line says &amp;quot;X-KDE-ParentApp=kcontrol&amp;quot; the module will&lt;br /&gt;
show up in KControl. It is very crucial the selected ParentApp is correct,&lt;br /&gt;
otherwise the KCM will show up in unnecessary places.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Init&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;X-KDE-Test-Module&lt;br /&gt;
If the module has to perform some action at system startup, use this entry to&lt;br /&gt;
build the name of a function to call. if X-KDE-Init is &amp;quot;bell&amp;quot;, for example,&lt;br /&gt;
the function &amp;quot;init_bell&amp;quot; is called in the library indicated by X-KDE-Library.&lt;br /&gt;
&lt;br /&gt;
;NoDisplay&lt;br /&gt;
If this is set to true the module will not show up in kcontrol or when viewed&lt;br /&gt;
with kcmshell. This is usable when you need to do something at startup(X-KDE-&lt;br /&gt;
Init etc.) but don't want the module to show up in kcontrol, eg. the module&lt;br /&gt;
has no GUI.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
This is 'labels' for the KCMs and fill the nodes in the three view. Please see&lt;br /&gt;
the KCM Guidelines on how to pick a good Name.&lt;br /&gt;
&lt;br /&gt;
;Comment&lt;br /&gt;
This directive shows up in the main area in KControl if you select a top node&lt;br /&gt;
in the three view. See the same section as for Name in the KCM Guidelines for&lt;br /&gt;
how to pick a good phrase.&lt;br /&gt;
&lt;br /&gt;
;Categories&lt;br /&gt;
This describes where the KCM should be put in KControl's navigation. It should&lt;br /&gt;
look like &amp;quot;Categories=QT;KDE;X;&amp;quot; where X is the category. A list of available&lt;br /&gt;
categories, as well as which one to choose is found in the KCM Guidelines.&lt;br /&gt;
&lt;br /&gt;
;Icon&lt;br /&gt;
Specifies the icon for the module.&lt;br /&gt;
&lt;br /&gt;
;Exec&lt;br /&gt;
Should say &amp;quot;Exec=kcmshell4 modulename&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Type&lt;br /&gt;
Should say &amp;quot;Type=Application&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
;Keywords&lt;br /&gt;
A semi colon separated list containing words/phrases search functionality&lt;br /&gt;
should trigger on.&lt;br /&gt;
&lt;br /&gt;
To summarize, a valid KCM .desktop file ''must'' contain these directives:&lt;br /&gt;
&lt;br /&gt;
* Name&lt;br /&gt;
* Icon&lt;br /&gt;
* Type=Application&lt;br /&gt;
* Exec=kcmshell modulename&lt;br /&gt;
* Categories=Qt;KDE;X; (replace X with your category)&lt;br /&gt;
* Keywords&lt;br /&gt;
* X-KDE-Library&lt;br /&gt;
* X-KDE-ParentApp&lt;br /&gt;
* Comment&lt;br /&gt;
&lt;br /&gt;
Additionally, a KCM .desktop file ''may'' contain:&lt;br /&gt;
&lt;br /&gt;
* X-KDE-Init&lt;br /&gt;
* X-KDE-Test-Module&lt;br /&gt;
* NoDisplay&lt;br /&gt;
* X-KDE-Root-Only&lt;br /&gt;
* X-KDE-Factory-Name&lt;br /&gt;
* DocPath&lt;br /&gt;
&lt;br /&gt;
Any other directives (except translations) can safely be removed, since they&lt;br /&gt;
most likely are abundant or are left over's from old KDE versions. For example,&lt;br /&gt;
X-ModuleType was relevant for KDE 2.0 but not in any new versions.&lt;br /&gt;
&lt;br /&gt;
==Defining a CMakeLists.txt for the KCM==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
include(MacroLibrary)&lt;br /&gt;
&lt;br /&gt;
set(FOO_KCM_SRCS&lt;br /&gt;
    foo_kcm.cpp&lt;br /&gt;
    # Other sources go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(kcm_foo ${FOO_KCM_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(kcm_foo&lt;br /&gt;
    ${KDE4_KDEUI_LIBS}&lt;br /&gt;
    # Other necessary libraries go there&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(TARGETS kcm_foo&lt;br /&gt;
    DESTINATION ${PLUGIN_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install(FILES kcm_foo.desktop&lt;br /&gt;
    DESTINATION ${SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==What else do I need?==&lt;br /&gt;
&lt;br /&gt;
There are a number of additional things for convenience.&lt;br /&gt;
&lt;br /&gt;
===kcmshell4===&lt;br /&gt;
&lt;br /&gt;
Consider you want to run a module standalone. Call &amp;quot;kcmshell4 module&amp;quot;. For&lt;br /&gt;
example, to get the font and the desktop color settings, use:&lt;br /&gt;
&lt;br /&gt;
kcmshell4 fonts colors&lt;br /&gt;
&lt;br /&gt;
===KCMultiDialog===&lt;br /&gt;
&lt;br /&gt;
Sometimes, you may want to reuse your KCModule inside an application. There&lt;br /&gt;
are two ways to accomplish this:&lt;br /&gt;
&lt;br /&gt;
First option is to use {{class|KCMultiDialog}}. This is a simple dialog that&lt;br /&gt;
can show an abitrary number of modules in a normal {{class|KDialogBase}}. The&lt;br /&gt;
advantage is that you can control the behaviour and the results much easier&lt;br /&gt;
that with a separate process. And as your module is a simple library, you can&lt;br /&gt;
just link to it anyway.&lt;br /&gt;
&lt;br /&gt;
Second option is to call &amp;quot;kcmshell4 modules&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===KCModuleContainer===&lt;br /&gt;
&lt;br /&gt;
The class {{class|KCModuleContainer}} allows great flexibility with handling modules.&lt;br /&gt;
The API docs explains its usage the best.&lt;br /&gt;
&lt;br /&gt;
===Debugging your module===&lt;br /&gt;
&lt;br /&gt;
You can attach gdb, valgrind or whatever to &amp;quot;kcmshell4 [yourmodule]&amp;quot; to track&lt;br /&gt;
down leaks or crashes. If you need to trace it down inside systemsettings, make sure&lt;br /&gt;
you pass --nofork to systemsettings on startup.&lt;br /&gt;
&lt;br /&gt;
You really want to use kcmshell4 for debugging as long as your debugging does&lt;br /&gt;
not involve debugging bad interaction with the systemsettings framework itself.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== About this howto ==&lt;br /&gt;
&lt;br /&gt;
This howto has been imported from http://websvn.kde.org/trunk/www/sites/developer/documentation/other/kcm_howto.html?view=markup and updated to KDE4 by Aurélien Gâteau.&lt;br /&gt;
&lt;br /&gt;
Original copyright header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Copyright (C) 2003 Daniel Molkentin &amp;lt;molketin@kde.org&amp;gt;&lt;br /&gt;
Copyright (C) 2004 Frans Englich &amp;lt;frans.englich@telia.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permission is granted to copy, distribute and/or modify this document under the&lt;br /&gt;
terms of the GNU Free Documentation License, Version 1.2 or any later version&lt;br /&gt;
published by the Free Software Foundation; with no Invariant Sections, no&lt;br /&gt;
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included&lt;br /&gt;
in the section entitled &amp;quot;GNU Free Documentation License&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan</id>
		<title>Schedules/KDE4/4.8 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.8_Feature_Plan"/>
				<updated>2011-10-20T16:31:49Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.8 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.8 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.7 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KWin|Take over screensaver/locking management from KRunner|alex.merry@kdemail.net|Alex Merry}}&lt;br /&gt;
{{FeatureInProgress|KCM|make mouse cursor size configurable (http://git.reviewboard.kde.org/r/101701/)|SommerLuk@gmail.com|Lukas Sommer}}&lt;br /&gt;
{{FeatureDone|powerdevil|Remove Desktop Effects Management|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureInProgress|powerdevil|Allow static profiles only|drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureInProgress|powerdevil|Allow activity interaction|drf@kde.org|Dario Freddi}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|Kate Part|Line modification system|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Modeline Editor|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|Kate Part|Search &amp;amp; Replace in files plugin|kare.sars@iki.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureDone|Kate Part|Reliable code folding|adrian.lungu89@gmail.com|Adrian Lungu}}&lt;br /&gt;
{{FeatureDone|Kate Part|Improved vi input mode|svatoslav1@gmail.com|Svyatoslav Kuzmich}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|Dolphin|Implement new view-engine for Dolphin 2.0 (see http://ppenz.blogspot.com/2011/08/introducing-dolphin-20.html)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of keyboard and lecture files according to languages|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureInProgress|KTouch|New organisation of menu system: Training, Statistic, Settings|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureTodo|KTouch|End of lecture statistics|peter.ruethemann@gmail.com|Rüthemann Peter}}&lt;br /&gt;
{{FeatureDone|Rocs|Alignment Actions to minimize crossing graph edges|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Project Files to combine graphs and algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureTodo|Rocs|Stepped Execution of Algorithms|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureInProgress|Rocs|Resurrect import-/export-features|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureInProgress|Rocs|User Interface Cleanup|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Add Qalculate backend|matteo@agostinelli.me|Matteo Agostinelli}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Runner plugins for Parsing files|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|(GSoC) OSM file rendering|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Marble Graphics Scene (Performance of Vector Drawing)|oblaukhov.konstantin@gmail.com|Konstantin Oblaukhov}}&lt;br /&gt;
{{FeatureDone|Marble|Gps Info Plugin|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureInProgress|Marble|Routing API|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|attachment:/ kio-slave&lt;br /&gt;
|Implement kio-slave to access (email) attachments in Akonadi&lt;br /&gt;
|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureInProgress|KAlarm|Port to Akonadi|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureTodo&lt;br /&gt;
|sieve: implement wizard&lt;br /&gt;
|Implement wizard to help user to create sieve script&lt;br /&gt;
|montel@kde.org|Montel Laurent}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}}&lt;br /&gt;
{{FeatureInProgress|Okteta|Add Flags Datatype to structures tool|alex.richardson@gmx.de|Alex Richardson}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Libkdegames|Improve graphics performance in all games by standardizing on the use of Qt Raster Graphics.|stefan.majewsky@googlemail.com|Stefan Majewsky}}{{FeatureInProgress|KSudoku|Add a new generator and solver to KSudoku, based on published algorithms. This will provide a full range of puzzle difficulties, rather than mainly easy puzzles, and will address bug 217925 and its duplicates 228614 and 237262 (now nearly two years old).|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureInProgress|KGoldrunner|Add the championship level &amp;quot;Gold Rush&amp;quot; game, contributed by Gabriel Miltschitzky.|iandw.au@gmail.com|Ian Wadham}}|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics=&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Okular|Reset Form Action support|aacid@kde.org|Albert Astals Cid}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Animated image transitions|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.7_Feature_Plan</id>
		<title>Schedules/KDE4/4.7 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.7_Feature_Plan"/>
				<updated>2011-04-27T07:42:21Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* kdegraphics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.7 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.7 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.7 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.6 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress&lt;br /&gt;
|KLocale&lt;br /&gt;
|Number grouping support&lt;br /&gt;
|john@layt.net|John Layt}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress&lt;br /&gt;
|KLocale&lt;br /&gt;
|Narrow date name format support&lt;br /&gt;
|john@layt.net|John Layt}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress&lt;br /&gt;
|KLocale&lt;br /&gt;
|Week Numbers support&lt;br /&gt;
|john@layt.net|John Layt}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress&lt;br /&gt;
|KLocale&lt;br /&gt;
|Windows Backend&lt;br /&gt;
|john@layt.net|John Layt}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress&lt;br /&gt;
|KHelpMenu&lt;br /&gt;
|Fast action searching&lt;br /&gt;
|afiestas@kde.org|Alex Fiestas}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress&lt;br /&gt;
|KFilePlaces&lt;br /&gt;
|Activity-specific Places&lt;br /&gt;
|j.maceachern@gmail.com|Jeffery MacEachern}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-baseapps  =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Dolphin|Support Fwd/Back Mouse Buttons|sebastian@sebastian-doerner.de|Sebastian Dörner}}&lt;br /&gt;
{{FeatureDone|Dolphin|Polish the default user interface to minimize visual clutter (see http://ppenz.blogspot.com/2011/03/menu-bars.html)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin|Improve user interface for searching files and metadata|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureTodo|Settings|Improve proxy configuration dialog|adawit@kde.org|Dawit Alemayehu}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress&lt;br /&gt;
|Locale KCM&lt;br /&gt;
|Support for Number Grouping, Windows Backend, Country Subdivsions&lt;br /&gt;
|john@layt.net|John Layt}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-runtime  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|kio_sftp|async download support|asn@cryptomilk.org|Andreas Schneider}}&lt;br /&gt;
{{FeatureInProgress&lt;br /&gt;
|Locale definition files&lt;br /&gt;
|Migrate Country and Currency Codes to xml/po formats, re-arrange l10n files including settings and flags, add Subdivision code files.&lt;br /&gt;
|john@layt.net|John Layt}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kde-workspace  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureDone|System Settings/keyboard|Allow a shortcut per keyboard layout (bug 224489)|arysin@mail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureDone|System Settings/keyboard|Session management for keyboard layouts (bug 52095, 174948)|arysin@mail.com|Andriy Rysin}}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | Plasma&lt;br /&gt;
{{FeatureInProgress&lt;br /&gt;
|Plasma Clock/Calendar&lt;br /&gt;
|improve usability, settings, akonadi and holiday data.  See Plasma wiki.&lt;br /&gt;
|john@layt.net|John Layt}}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | KWin&lt;br /&gt;
{{FeatureDone|Compositor|OpenGL 2.x/OpenGL ES 2.0 compositing backend (see http://www.kdenews.org/2011/02/18/kwin-embraces-new-platforms-opengl-es-20-support)|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|Compositor|New Shadow System (see http://blog.martin-graesslin.com/blog/2011/03/new-kwin-shadows/)|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|BoxSwitch Effect|Animated Selection (see http://blog.martin-graesslin.com/blog/2011/02/is-kwin-rocket-science/)|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|libkwineffects|API cleanup|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureTodo|libkwineffects|JavaScript bindings for writing Effects|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|Mouse Emulation|Better accessibility support in mouse emulation|mgraesslin@kde.org|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|kwin|Add multi head support|alberto@mattea.info|Alberto Mattea}}&lt;br /&gt;
{{FeatureInProgress|kwin|DBusMenu in Windeco|megabigbug@yahoo.fr|Lionel Chauvin}}&lt;br /&gt;
{{FeatureInProgress|ksplashx|Add multi head support|alberto@mattea.info|Alberto Mattea}}&lt;br /&gt;
{{FeatureTodo|krunner|Add multi head support|alberto@mattea.info|Alberto Mattea}}&lt;br /&gt;
{{FeatureInProgress|kwinrules kcm|UI cleanup (see https://git.reviewboard.kde.org/r/101041/)|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|kwincompositing kcm|Rearm unsafe OpenGL precheck (see https://git.reviewboard.kde.org/r/101061/)|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
{{FeatureInProgress|PresentWindows Effect|Better highlight indication &amp;amp; close button handling)|thomas.luebking@gmail.com|Thomas Lübking}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Marble|Bookmark Manager|earthwings@gentoo.org|Dennis Nienhüser, Thibaut Gridel}}&lt;br /&gt;
{{FeatureInProgress|Marble|Extended QML Bindings|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Routing API|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Offline Address Search|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureTodo|Marble|Separate thread for tile loading and texture blending (not texture mapping at the moment) for more smooth browsing|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureTodo|Marble|Tile loading &amp;quot;read ahead&amp;quot; when idle, prerequisite: threaded tile loading|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureTodo|Marble|Multi threaded texture mapping|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureInProgress|Marble|Manipulate Gps track data|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Integrate the Qalculate backend|agostinelli@gmail.com|Matteo Agostinelli}}&lt;br /&gt;
{{FeatureTodo|Kalzium|Use KUnitConversion for all the Unit handling|etienne.rebetez@oberwallisch|Etienne Rebetez}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add getdirection command&lt;br /&gt;
|nielsslot@gmaildotcom|Niels Slot}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add modulo command&lt;br /&gt;
|nielsslot@gmaildotcom|Niels Slot}}&lt;br /&gt;
{{FeatureInProgress|Step|Copy-and-Paste of items|kde@voecking.net|Sebastian Vöcking}}&lt;br /&gt;
{{FeatureTodo|Step|Zoom on mouse wheel|kde@voecking.net|Sebastian Vöcking}}&lt;br /&gt;
{{FeatureTodo|Step|Automatic expanding canvas|kde@voecking.net|Sebastian Vöcking}}&lt;br /&gt;
{{FeatureInProgress|Rocs|Auto - Handling of the Canvas|tcanabrava@kde.org|Tomaz Canabrava}}&lt;br /&gt;
{{FeatureDone|Rocs|Remove the thread for QtConcurrent on he core|tcanabrava@kde.org|Tomaz Canabrava}}&lt;br /&gt;
{{FeatureInProgress|Rocs|Polish the User Interface|tcanabrava@kde.org|Tomaz Canabrava}}&lt;br /&gt;
{{FeatureDone|Rocs|New Plugin for Automaticaly Graph Generation|tcanabrava@kde.org|Tomaz Canabrava}}&lt;br /&gt;
{{FeatureInProgress|Rocs|Bugfixes in the List Plugin|tcanabrava@kde.org|Tomaz Canabrava}}&lt;br /&gt;
{{FeatureInProgress|Rocs|Speedup in the drawing code|tcanabrava@kde.org|Tomaz Canabrava}}&lt;br /&gt;
{{FeatureInProgress|Rocs|Kalgebra backend|tcanabrava@kde.org|Tomaz Canabrava}}&lt;br /&gt;
{{FeatureDone|Rocs|Transform graph edges plugin|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureInProgress|Rocs|Assign values to edges/nodes plugin|cola@uni-paderborn.de|Andreas Cord-Landwehr}}&lt;br /&gt;
{{FeatureInProgress|Kalzium|Titration calculator|TRINGALINVENT@libero.it|Luca Tringali}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress|KAlarm|Port to Akonadi|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureInProgress|KAlarm|Allow reminders after the main alarm|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureInProgress|KAlarm|Provide wake-from-suspend option for alarms|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
&lt;br /&gt;
{{FeatureInProgress&lt;br /&gt;
|KHolidays&lt;br /&gt;
|Add support for Holiday Types and Observance Types&lt;br /&gt;
|john@layt.net|John Layt}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Adjustable Clock|Plasmoid for displaying date and time in very customizable way|emdeck@gmail.com|Michał Dutkiewicz}}&lt;br /&gt;
{{FeatureInProgress|Comic Plasmoid|Support random comic strips|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureInProgress|Comic Plasmoid|Support creation of comic Comic Book Archive files|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureTodo|Comic Plasmoid|Highlight comics that have a new comic strip|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureTodo|Events Runner|Support parsing weekdays (e.g. &amp;quot;in next monday&amp;quot;|alexey.noskov@gmail.com|Alexey Noskov}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdetoys  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|KTeaTime|Port to KStatusNotifierItem|miha@noughmad.eu|Miha Čančula}}&lt;br /&gt;
{{FeatureInProgress|KTeaTime|New svg based status icons|kde@hilefoks.org|Stefan Böhmann}}&lt;br /&gt;
{{FeatureInProgress|KTeaTime|Support categories|kde@hilefoks.org|Stefan Böhmann}}&lt;br /&gt;
{{FeatureTodo|KTeaTime|Improved command line|kde@hilefoks.org|Stefan Böhmann}}&lt;br /&gt;
{{FeatureTodo|KTeaTime|Tea runner|kde@hilefoks.org|Stefan Böhmann}}&lt;br /&gt;
{{FeatureTodo|KTeaTime|Port to KConfigXT|kde@hilefoks.org|Stefan Böhmann}} &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Lokalize|Remote translation memories|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureInProgress|Lokalize|QA: translation checks against user-specified regex-based rules|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Integrate snowball stemmer for glossary|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Continue implementing XLIFF spec|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Segmentation [editing] functionality|shafff@NOSPAMukr.net |Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Integrate with nepomuk (fast stats retrieval, tag cloud - incl sharing!)|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|loading compressed files and then saving them back in the original compression format (bug 65518)|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureInProgress|Okteta|Properly support strings (various Unicode encodings) in structures tool|alex.richardson@gmx.de|Alex Richardson}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add custom datatypes to structures tool|alex.richardson@gmx.de|Alex Richardson}} &lt;br /&gt;
{{FeatureInProgress|Umbrello|QDockWidget based interface|elv1313@gmail.com|Emmanuel Lepage Vallee}} &lt;br /&gt;
{{FeatureInProgress|Umbrello|KDE4 icon theme and eye candies|elv1313@gmail.com|Emmanuel Lepage Vallee}}&lt;br /&gt;
{{FeatureTodo|Umbrello|Replace the current code viewer with katepart|elv1313@gmail.com|Emmanuel Lepage Vallee}} &lt;br /&gt;
{{FeatureDone|Umbrello|Add a zoom widget in the statusbar|elv1313@gmail.com|Emmanuel Lepage Vallee}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|KBreakout|Level editor|julian.helfferich@gmail.com|Julian Helfferich}}&lt;br /&gt;
{{FeatureInProgress|KBreakout|Load levelset option + 2 new levelsets|julian.helfferich@gmail.com|Julian Helfferich}}&lt;br /&gt;
{{FeatureTodo|KBreakout|Port to QGraphicsView|julian.helfferich@gmail.com|Julian Helfferich}}&lt;br /&gt;
{{FeatureInProgress|libtagaro|Move first version into the kdegames module|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureTodo|libtagaro|Use the new library: at least in Granatier and Kolf (to replace existing static source copies) and KDiamond|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureInProgress|Palapeli|Cleanup interface|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|Palapeli|Reduce memory consumption for big puzzles|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|KGet|Working Mms plugin|eortiz@uci.cu|Ernesto Rodriguez Ortiz}}&lt;br /&gt;
{{FeatureInProgress|KGet|Support for connection limit to servers|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Okular|Directory support in Comic Book Generator|dpalacio@orbitalibre.org|David Palacio}}&lt;br /&gt;
{{FeatureInProgress|Okular|7zip support in Comic Book Generator|dpalacio@orbitalibre.org|David Palacio}}&lt;br /&gt;
{{FeatureTodo|libksane|Enable gui less operation|kare.sars@iki.fi|K&amp;amp;aring;re S&amp;amp;auml;rs}}&lt;br /&gt;
{{FeatureTodo|libksane|Add a way to get scanner device list|kare.sars@iki.fi|K&amp;amp;aring;re S&amp;amp;auml;rs}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Compare mode|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Gwenview|Merge &amp;quot;Semantic Information&amp;quot; and &amp;quot;Meta Information&amp;quot; sidebar groups|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.6_Feature_Plan</id>
		<title>Schedules/KDE4/4.6 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.6_Feature_Plan"/>
				<updated>2010-12-07T14:43:08Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* kdegraphics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.6 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.6 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.6 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.5 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebase-apps  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Konsole|Move to KTabWidget|sasch.pe@gmx.de|Sascha Peilicke}}&lt;br /&gt;
{{FeatureDone|Dolphin|Faceted browsing via Nepomuk|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureDone|Dolphin|Searching support for non-indexed files|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin|Git-plugin (implemented by Sebastian Dörner and Johannes Steffen)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin| Resizeable columns in the column-view|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin| Allow leading zeros when renaming multiple files  (implemented by Matthias Fuchs)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureInProgress|nspluginviewer|Full npruntime support|maksim@kde.org|Maks Orlovich}}&lt;br /&gt;
{{FeatureTodo|Dolphin|Smooth scrolling|fredrik@kde.org|Fredrikh Höglund}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebase-runtime  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Plasma|Plasma KPart|ry@n.rix.si|Ryan Rix}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Declarative AppletScript to write QML plasmoids|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Optimize the Newspaper containment for the use with touchscreens and the Plasma KPart|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureDone|KWin|Focus tracking for the zoom plugin (uses kaccessible)|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KWin|Extend mouse tracking modes for the zoom plugin|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|Nepomuk Backup &amp;amp; Sync| Provide Backup and Sync capabilities to Nepomuk|handa.vish@gmail.com|Vishesh Handa}}&lt;br /&gt;
{{FeatureTodo|Web Metadata extractor| Provide a framework to get additional data about resources|handa.vish@gmail.com|Vishesh Handa}}&lt;br /&gt;
{{FeatureDone|Activities manager service|Merge the kded and nepomuk modules for activities into one service|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|Activities manager service|Register desktop events instead directly linking the activities to resources|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|KNotify|Add support for relative present actions in contexts|wilderkde@gmail.com|Jacopo De Simoi}}&lt;br /&gt;
{{FeatureDone|KNotify|Add Plugin Loading Support (No UI Support For Now)|j.maceachern@gmail.com|Jeffery MacEachern}}&lt;br /&gt;
{{FeatureInProgress|Locale KCM|Complete re-write to improve usability, support for new localization features|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|Phonon KCM|Add video input device configuration support|kiagiadakis.george@gmail.com|George Kiagiadakis}}&lt;br /&gt;
{{FeatureInProgress|ksecretserviced|Make it replace KWallet|lemma@confuego.org|Michael Leupold}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebase-workspace  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | Plasma &lt;br /&gt;
{{FeatureDone|libtaskmanager / tasks-applet| support for Windows 7 like launchers |akreuzkamp@web.de|Anton Kreuzkamp}}&lt;br /&gt;
{{FeatureInProgress|notifications| rework notification applet appearance |mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|notifications| make various dataengines use Plasma::Storage |mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureDone|plasma-desktop| UI for editing activity name and icon|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureTodo|plasma-desktop| add some default activities|fux@kde.org|Mario Fux}}&lt;br /&gt;
{{FeatureDone|plasma| finish support for activity templates |chani@kde.org|Chani}}&lt;br /&gt;
{{FeatureInProgress|plasma-devicenotifier| Improve notification support |wilderkde@gmail.com|Jacopo De Simoi}}&lt;br /&gt;
{{FeatureTodo|plasma-devicenotifier| Signal to the user which apps are blocking  a device|wilderkde@gmail.com |Jacopo De Simoi}}&lt;br /&gt;
{{FeatureDone|quicklaunch| populate new applets with user's default browser, file manager, ... instead of hardcoded ones |ingomar@wesp.name|Ingomar Wesp}}&lt;br /&gt;
{{FeatureDone|quicklaunch| allow editing of existing launchers (including ones that do not point to a .desktop file) |ingomar@wesp.name|Ingomar Wesp}}&lt;br /&gt;
{{FeatureDone|libplasma|Plasma calendar supports multiple Holiday Regions.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureInProgress|libplasma|Make Calendar DataEngine a Service.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureDone|plasma-desktop| integrate activity-sessions|chani@kde.org|Ivan/Chani}}&lt;br /&gt;
{{FeatureInProgress|plasma-desktop|activity dataengine|chani@kde.org|Chani}}&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | KWin&lt;br /&gt;
{{FeatureInProgress|windowgeometry effect| compositor powered move/resize windowgeometry display |thomas.luebking@web.de|Thomas Lübking}} &lt;br /&gt;
{{FeatureDone|dashboard effect| new effect for Plasma dashboard |ademmer@opensuse.org|Andreas Demmer}} &lt;br /&gt;
{{FeatureDone|kwin/ksmserver| activity sessions |chanika@gmail.com|Chani}} &lt;br /&gt;
{{FeatureDone|libtaskmanager/kwin?| some activity integration in taskbar/pager |chani@kde.org|Chani}}  &lt;br /&gt;
{{FeatureTodo|libtaskmanager/kwin] | Expose Window Tabs to taskmanager |kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureTodo|kwin|ARB Shader support|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|Aurorae|Tooltips on window tabs|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Present Windows|Close window GUI control|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Startup Feedback|Effect to replace the Startup Feedback notification|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Screenshot Effect|KSanpshot can use KWin for screenshots|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureTodo|KCM Compositing|Allow compositing even if GL is buggy/X crashes|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureTodo|KWin Killer|Use notification instead of dialog|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|Compositing|Improved platform detection|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | KDE Power Management system &lt;br /&gt;
{{FeatureDone|core| PowerDevil v2 core |drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|actions| Basic actions for feature parity with PowerDevil v1 |drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureInProgress|actions| More actions for advanced users |drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|policy-handler| Create a new policy handler for handling inhibition properly, and have kdelibs' Solid API use it |drf@kde.org|Dario Freddi}}&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | System Settings&lt;br /&gt;
{{FeatureDone|keyboard| Support for &amp;quot;spare layouts&amp;quot;|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureDone|keyboard| Support for &amp;gt; 4 layouts|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureInProgress|driconf|New module for configuring DRI drivers|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | Blue Devil&lt;br /&gt;
{{FeatureInProgress|Review| Get into kdebase|alex@eyeos.org|Alex Fiestas}}&lt;br /&gt;
{{FeatureInProgress|kio_obexftp| Better error handling|alex@eyeos.org|Alex Fiestas}}&lt;br /&gt;
{{FeatureTodo|usability|Review all the components improving hig/elegance|alex@eyeos.org|Alex Fiestas}}&lt;br /&gt;
{{FeatureTodo|share folders|Be able to share folders via obexftp|alex@eyeos.org|Alex Fiestas}}&lt;br /&gt;
{{FeatureTodo|Devices KCM|Add further information about devices, like address...|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
{{FeatureTodo|Devices KCM|Allow to connect to devices services|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
{{FeatureInProgress|libbluedevil|Review DBus handling|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
{{FeatureTodo|libbluedevil|Add support for services|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
{{FeatureInProgress|Monolithic|Fix listing problems under certain conditions|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|libnepomuk|Convenience operator overloads for query construction|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureDone|libnepomuk|New query flags and improved handling of full text matching scores including sorting|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureTodo|kdeui|Generic find bar widget|sasch.pe@gmx.de|Sascha Peilicke}}&lt;br /&gt;
{{FeatureDone|kdeui|Allow getting and setting the size of the pixmap cache in KImageCache|2kmm@gmx.de|Manuel Mommertz}}&lt;br /&gt;
{{FeatureDone|katepart|scripted actions|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|katepart|QAccessibleInterface's for document+cursor|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|libplasma|PluginLoader class|ry@n.rix.si|Ryan Rix}}&lt;br /&gt;
{{FeatureDone|libplasma|Allow SVGs to use systemcolors before rendering|2kmm@gmx.de|Manuel Mommertz}}&lt;br /&gt;
{{FeatureInProgress|libplasma|DeclarativeWidget to load QML scenes in Plasma|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|libplasma|finish up the gsoc project about Plasma::Storage service|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureDone|libplasma|let Plasma::SVG find the best matching size hinted element if there is no exact match|ingomar@wesp.name|Ingomar Wesp (mentored by Manuel Mommertz)}}&lt;br /&gt;
{{FeatureDone|libnepomuk/KIO|Search excerpts|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureInProgress|libnepomuk|Standardqueries for convenience|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureDone|libnepomuk|GUI elements for resource/file searching including faceted browsing|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureInProgress|libnepomuksync|Sync library to be used in BackupSync, Strigi, Akonadi, WebExtractor and Removable Media|handa.vish@gmail.com|Vishesh Handa}}&lt;br /&gt;
{{FeatureInProgress|kdecore|Add more possible synchronization primitives to KSharedDataCache to expand OS support. POSIX Semaphores Contributed by Alberto Villa of the FreeBSD project. Windows support may still occur as well.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|kdecore|Add fallback to QCache&amp;lt;QString,QByteArray&amp;gt; in KSharedDataCache.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureDone|kdecore|Add cache-wide timestamp to KSharedDataCache.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|kdecore|Add ability to make KSharedDataCache strictly read-only for laptop support.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureInProgress|kdeui|Social About Dialog|teo@kde.org|Teo Mrnjavac}}&lt;br /&gt;
{{FeatureDone|kdeui|Allow to hide icons in menus|christoph@maxiom.de|Christoph Feck}}&lt;br /&gt;
{{FeatureDone|KLocale|Auto-detect new users Country from their system country.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureDone|KLocale|New configuration option for AM/PM symbols, .|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureDone|KLocale|Seperate backends available for each supported platform/desktop, use of platform localization in place of KDE locale planned for 4.7.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureDone|KLocalizedDate|New convenience class to make date localization easy.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KCalendarSystem|Add api for first/last day of year/month.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KCalendarSystem|Add configuration option for Short Year Window.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KCalendarSystem|Separated date / time parsing code into new private KDateTimeParser and KDateTimeFormatter classes to share with KLocale and KDateTime.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|KHTML|HTML5 postMessage.|maksim@kde.org|Maksim Orlovich}} &lt;br /&gt;
{{FeatureTodo|kcookiejar|New domain specific cookie policy based on patch provided in bug#54300|adawit@kde.org|Dawit A.}} &lt;br /&gt;
{{FeatureInProgress|kcookiejar|Implement storing cookies in KWallet|fid@gpul.org|José Millán Soto}} &lt;br /&gt;
{{FeatureInProgress|ksecretservice|Make KWallet::Wallet use the secrets-service API|lemma@confuego.org|Michael Leupold}} &lt;br /&gt;
{{FeatureInProgress|anywhere|Allow to build without deprecated symbols|ervin@kde.org|Kevin Ottens (with lots of support from David Faure)}} &lt;br /&gt;
{{FeatureInProgress|KIO|Use `net usershare` in KSambaShare|rclbelem@gmail.com|Rodrigo Belem}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Marble|Loading of routes in .kml format (Maemo)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Route printing (map and directions, configurabe)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Route state saving and restoring|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Convert MarbleRunners to plugins|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|worldwide and offline routing|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Extend MarbleRunner interface to handle reverse geocoding and routing requests; Display of alternative routes|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Routing API|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|&amp;quot;Go To&amp;quot; dialog for Maemo|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Tile download along the route for offline usage|akssps011@gmail.com|Siddharth Srivastava}}&lt;br /&gt;
{{FeatureDone|Marble|Turn-by-turn navigation mode|akssps011@gmail.com|Siddharth Srivastava}}&lt;br /&gt;
{{FeatureDone|Marble|QtDeclarative plugin and QML examples (experimental)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Implement sun locator blendings as derived classes of Marble::Blending|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureTodo|Marble|Separate thread for tile loading and texture blending (not texture mapping at the moment) for more smooth browsing|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureTodo|Marble|Tile loading &amp;quot;read ahead&amp;quot; when idle, prerequisite: threaded tile loading|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureTodo|Marble|Multi threaded texture mapping|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureDone|Marble|Improve GeoData API|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Convert Gps tracking to GeoDataDocument|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Provide a treeModel for GeoDataDocuments|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Draw the geometries of multiple GeoDataDocuments|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureInProgress|Marble|Load Pnt vector data files as GeoData|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureInProgress|Marble|Manipulate Gps track data|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Cantor|Backend for GNU Octave|miha.cancula@gmail.com|Miha Čančula}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Merge R improvement branch|alexanderrieder@gmail.com|Alexander Rieder}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Variable management panel|alexanderrieder@gmail.com|Alexander Rieder}}&lt;br /&gt;
{{FeatureTodo|Cantor|Formulas inside Text Entries|alexanderrieder@gmail.com| Alexander Rieder}}&lt;br /&gt;
{{FeatureDone|Kalzium|Port Kalzium to use QGV based periodic table widget|mhanwell@kde.org|Marcus D. Hanwell}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Implicit functions plot|percy.camilo.ta@gmail.com|Percy Aucahuasi}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Improved execution speed on the calculator|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Better integration between the Console and the Plotting facilities|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Lighter version aimed to mobile users|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureInProgress|KStars|OpenGL rendering support for KStars|akarshsimha@gmail.com|Harry de Valence, Akarsh Simha}}&lt;br /&gt;
{{FeatureInProgress|KStars|Better designed object database|akarshsimha@gmail.com|Victor Carbune, Akarsh Simha}}&lt;br /&gt;
{{FeatureInProgress|KStars|Star Hop Generator|akarshsimha@gmail.com|Akarsh Simha}}&lt;br /&gt;
{{FeatureDone|Kig|LaTeX/TikZ exporter|miha.cancula@gmail.com|Miha Čančula}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|JuK|Remove Qt/KDE3 support lib requirements|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|JuK|Allow setting covers directly from URLs supported by KIO - drag/drop already allows this however|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|JuK|Add MPRIS support to JuK so that the NowPlaying applet doesn't need to special-case JuK.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|JuK|Update JuK's MusicBrainz support to a modern version of MusicBrainz.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureInProgress|kmix|Improved volume OSD|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|libkdegames|Import KGameRenderer framework and [[Projects/Games/Porting|port games]] to this unified rendering infrastructure.|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureInProgress|Kigo|Fix KNewStuff provider issues|sasch.pe@gmx.de|Sascha Peilicke}}&lt;br /&gt;
{{FeatureDone|Palapeli|Import Goldberg slicer as the new default slicer plugin.|loehnert.kde@gmx.de|Johannes Loehnert}}&lt;br /&gt;
{{FeatureDone|Palapeli|Bevel effect creates three-dimensional appearance for puzzle pieces.|loehnert.kde@gmx.de|Johannes Loehnert}}&lt;br /&gt;
{{FeatureDone|Palapeli|Update libpala API. Improve usability of &amp;quot;Create new puzzle&amp;quot; dialog.|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|Kajongg|Docbook: Describe the basic game, until now I supposed the player already knows how to play Mah Jong.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Tiles can be discarded with drag&amp;amp;drop.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Make robot player AI more intelligent.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Make tiles in the hand larger and the wall tiles smaller for better playability on small screens.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Make games suspendable/resumable.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Animate moving tiles.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Demo mode.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Introduce an option to only offer possible actions.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureTodo|Kajongg|Add more rulesets like other Classical Chinese variants and the international tournament rules.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Save and restore the current control-mode, keyboard-control option and game-speed settings.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add a keyboard-mode option to start moving when a direction-key is pressed and stop when it is released. Support multiple keys being pressed.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|Klickety|An adaptation of the &amp;quot;clickomania&amp;quot; game.Rewrite the kde3 version.|shuizhuyuanluo@126.com|Ni Hui}}&lt;br /&gt;
{{FeatureDone|Klickety|Merge KSame into Klickety.|shuizhuyuanluo@126.com|Ni Hui}}&lt;br /&gt;
{{FeatureDone|Kolf|Port to KGameRenderer, cleanup all QGraphicsView- and physics-related code (and physics engine), incorporate ideas from Kolf-NG.|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|Granatier|Port to KGameRenderer.|k.hias@gmx.de|Mathias Kraus}}&lt;br /&gt;
{{FeatureDone|Granatier|Use TagaroAudio for sound.|k.hias@gmx.de|Mathias Kraus}}&lt;br /&gt;
{{FeatureDone|Knights|New game: Chess board for KDE4|miha.cancula@gmail.com|Miha Čančula}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|gwenview|Simplify photo sharing|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureDone|gwenview|Improve resize dialog|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Lokalize|Integrate snowball stemmer for glossary|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Continue implementing XLIFF spec|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Segmentation [editing] functionality|shafff@NOSPAMukr.net |Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Remote translation memories|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Integrate with nepomuk (fast stats retrieval, tag cloud - incl sharing!)|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|loading compressed files and then saving them back in the original compression format (bug 65518)|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Nepomukshell|New Nepomukshell development tool allowing to browse and debug Nepomuk data|trueg@kde.org|Sebastian Trueg}} &lt;br /&gt;
{{FeatureDone|Dolphin|Git plugin|sebastian@sebastian-doerner.de|Sebastian Doerner}} &lt;br /&gt;
{{FeatureDone|Kate|GDB plugin|kare.sars@iki.fi|K&amp;amp;aring;re S&amp;amp;auml;rs}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Ark|Add a &amp;quot;Preview with...&amp;quot; context menu item|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Add an options dialog (maybe)|haraldhv@stud.ntnu.no|Harald Hvaal}}&lt;br /&gt;
{{FeatureTodo|Ark|Add feedback for the latest operation in the status bar|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Get rid of the Observer code in Kerfuffle|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Make error reporting work as expected in Kerfuffle|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Make Kerfuffle really thread-safe (and use threads in less places)|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Make the internal previewer optional|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Simplify Kerfuffle's API (jobs, interfaces etc) and try to make it stable|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Support for custom options from the compression interface (eg. a slider for selecting compression level for rar files)|haraldhv@stud.ntnu.no|Harald Hvaal}}&lt;br /&gt;
{{FeatureTodo|Ark|Try multiple plugins for each archive type before failing|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|printer-applet|Restore feature parity with KDEPrint3 where possible.||Jonathon Riddell, John Layt}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|KGpg|Better workflow to edit encrypted files|kde@opensource.sf-tec.de|Rolf Eike Beer}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Kontact|Plasma-based Summary Page|ry@n.rix.si|Ryan Rix}}&lt;br /&gt;
{{FeatureInProgress|KHolidays|Add support for holiday types and day-off types.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|KHolidays|Holiday Region selection widget.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KHolidays|Holiday duration api.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KHolidays|Default Holiday Region api.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|KAlarm|Port to Akonadi|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Option to not notify execution errors for pre-alarm actions|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureInProgress|KAlarm|Allow reminders after the main alarm|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureInProgress|KAlarm|Provide wake-from-suspend option for alarms|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeaccessibility  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|KAccessible|Added a dbus-service and a QAccessibleBridgePlugin for focus tracking (used in KMagnifier and the KWin zoom plugin).|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KMagnifier|Follow Focus Mode for Focus Tracking (uses kaccessible).|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KAccessible|Added Screenreader (uses speech-dispatcher)|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= kdeartwork  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|KDE Asciiquarium|Added a new ASCII sprite (a submarine). Contributed by Ryan Meldrum.|mpyne@kde.org.|Michael Pyne}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Shelf|Automatic sizing of the popup|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|Shelf|Setting a custom popup icon|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureTodo|Shelf|Cascading popup menus for folders|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|Shelf|Keyboard navigation|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|Shelf|Search completion|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|libLancelot-datamodels|Akonadi integration|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureTodo|libLancelot-datamodels|Folder contents sorting|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|Lancelot|Theme improvements, animations|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|Events Runner|Event search|alexey.noskov@gmail.com|Alexey Noskov}}&lt;br /&gt;
{{FeatureDone|Comic plasmoid|Per comic max cache limit|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureDone|Comic plasmoid|Change behaviour when comic can't be found|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureDone|GroupingDesktop|Added two desktop containments and a panel containment with applet grouping support|giuliocamuffo@gmail.com|Giulio Camuffo}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|krfb|Refactor Core to make it more maintainable/extensible|grundleborg@googlemail.com.|George Goldberg}}&lt;br /&gt;
{{FeatureDone|krfb|Telepathy Tubes support|grundleborg@googlemail.com.|George Goldberg}}&lt;br /&gt;
{{FeatureDone|krfb|UI Improvements to support new features/deal with some existing bug reports|grundleborg@googlemail.com.|George Goldberg}}&lt;br /&gt;
{{FeatureTodo|kget|Log for transfers|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.6_Feature_Plan</id>
		<title>Schedules/KDE4/4.6 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.6_Feature_Plan"/>
				<updated>2010-11-19T20:17:04Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* kdegraphics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.6 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.6 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.6 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.5 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebase-apps  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Konsole|Move to KTabWidget|sasch.pe@gmx.de|Sascha Peilicke}}&lt;br /&gt;
{{FeatureDone|Dolphin|Faceted browsing via Nepomuk|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureDone|Dolphin|Searching support for non-indexed files|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin|Git-plugin (implemented by Sebastian Dörner and Johannes Steffen)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin| Resizeable columns in the column-view|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin| Allow leading zeros when renaming multiple files  (implemented by Matthias Fuchs)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureInProgress|nspluginviewer|Full npruntime support|maksim@kde.org|Maks Orlovich}}&lt;br /&gt;
{{FeatureTodo|Dolphin|Smooth scrolling|fredrik@kde.org|Fredrikh Höglund}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebase-runtime  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Plasma|Plasma KPart|ry@n.rix.si|Ryan Rix}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Declarative AppletScript to write QML plasmoids|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Optimize the Newspaper containment for the use with touchscreens and the Plasma KPart|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureDone|KWin|Focus tracking for the zoom plugin (uses kaccessible)|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KWin|Extend mouse tracking modes for the zoom plugin|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|Nepomuk Backup &amp;amp; Sync| Provide Backup and Sync capabilities to Nepomuk|handa.vish@gmail.com|Vishesh Handa}}&lt;br /&gt;
{{FeatureTodo|Web Metadata extractor| Provide a framework to get additional data about resources|handa.vish@gmail.com|Vishesh Handa}}&lt;br /&gt;
{{FeatureDone|Activities manager service|Merge the kded and nepomuk modules for activities into one service|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|Activities manager service|Register desktop events instead directly linking the activities to resources|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|KNotify|Add support for relative present actions in contexts|wilderkde@gmail.com|Jacopo De Simoi}}&lt;br /&gt;
{{FeatureDone|KNotify|Add Plugin Loading Support (No UI Support For Now)|j.maceachern@gmail.com|Jeffery MacEachern}}&lt;br /&gt;
{{FeatureInProgress|Locale KCM|Complete re-write to improve usability, support for new localization features|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|Phonon KCM|Add video input device configuration support|kiagiadakis.george@gmail.com|George Kiagiadakis}}&lt;br /&gt;
{{FeatureInProgress|ksecretserviced|Make it replace KWallet|lemma@confuego.org|Michael Leupold}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebase-workspace  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | Plasma &lt;br /&gt;
{{FeatureDone|libtaskmanager / tasks-applet| support for Windows 7 like launchers |akreuzkamp@web.de|Anton Kreuzkamp}}&lt;br /&gt;
{{FeatureInProgress|notifications| rework notification applet appearance |mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|notifications| make various dataengines use Plasma::Storage |mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureDone|plasma-desktop| UI for editing activity name and icon|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureTodo|plasma-desktop| add some default activities|fux@kde.org|Mario Fux}}&lt;br /&gt;
{{FeatureDone|plasma| finish support for activity templates |chani@kde.org|Chani}}&lt;br /&gt;
{{FeatureInProgress|plasma-devicenotifier| Improve notification support |wilderkde@gmail.com|Jacopo De Simoi}}&lt;br /&gt;
{{FeatureTodo|plasma-devicenotifier| Signal to the user which apps are blocking  a device|wilderkde@gmail.com |Jacopo De Simoi}}&lt;br /&gt;
{{FeatureDone|quicklaunch| populate new applets with user's default browser, file manager, ... instead of hardcoded ones |ingomar@wesp.name|Ingomar Wesp}}&lt;br /&gt;
{{FeatureDone|quicklaunch| allow editing of existing launchers (including ones that do not point to a .desktop file) |ingomar@wesp.name|Ingomar Wesp}}&lt;br /&gt;
{{FeatureDone|libplasma|Plasma calendar supports multiple Holiday Regions.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureInProgress|libplasma|Make Calendar DataEngine a Service.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureDone|plasma-desktop| integrate activity-sessions|chani@kde.org|Ivan/Chani}}&lt;br /&gt;
{{FeatureInProgress|plasma-desktop|activity dataengine|chani@kde.org|Chani}}&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | KWin&lt;br /&gt;
{{FeatureInProgress|windowgeometry effect| compositor powered move/resize windowgeometry display |thomas.luebking@web.de|Thomas Lübking}} &lt;br /&gt;
{{FeatureDone|dashboard effect| new effect for Plasma dashboard |ademmer@opensuse.org|Andreas Demmer}} &lt;br /&gt;
{{FeatureDone|kwin/ksmserver| activity sessions |chanika@gmail.com|Chani}} &lt;br /&gt;
{{FeatureDone|libtaskmanager/kwin?| some activity integration in taskbar/pager |chani@kde.org|Chani}}  &lt;br /&gt;
{{FeatureTodo|libtaskmanager/kwin] | Expose Window Tabs to taskmanager |kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureTodo|kwin|ARB Shader support|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|Aurorae|Tooltips on window tabs|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Present Windows|Close window GUI control|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Startup Feedback|Effect to replace the Startup Feedback notification|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Screenshot Effect|KSanpshot can use KWin for screenshots|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureTodo|KCM Compositing|Allow compositing even if GL is buggy/X crashes|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureTodo|KWin Killer|Use notification instead of dialog|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|Compositing|Improved platform detection|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | KDE Power Management system &lt;br /&gt;
{{FeatureDone|core| PowerDevil v2 core |drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|actions| Basic actions for feature parity with PowerDevil v1 |drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureInProgress|actions| More actions for advanced users |drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|policy-handler| Create a new policy handler for handling inhibition properly, and have kdelibs' Solid API use it |drf@kde.org|Dario Freddi}}&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | System Settings&lt;br /&gt;
{{FeatureInProgress|keyboard| Support for sticky layout switching |arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureInProgress|keyboard| Support for &amp;gt; 4 layouts|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureInProgress|driconf|New module for configuring DRI drivers|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | Blue Devil&lt;br /&gt;
{{FeatureInProgress|Review| Get into kdebase|alex@eyeos.org|Alex Fiestas}}&lt;br /&gt;
{{FeatureInProgress|kio_obexftp| Better error handling|alex@eyeos.org|Alex Fiestas}}&lt;br /&gt;
{{FeatureTodo|usability|Review all the components improving hig/elegance|alex@eyeos.org|Alex Fiestas}}&lt;br /&gt;
{{FeatureTodo|share folders|Be able to share folders via obexftp|alex@eyeos.org|Alex Fiestas}}&lt;br /&gt;
{{FeatureTodo|Devices KCM|Add further information about devices, like address...|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
{{FeatureTodo|Devices KCM|Allow to connect to devices services|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
{{FeatureTodo|libbluedevil|Review DBus handling|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
{{FeatureTodo|libbluedevil|Add support for services|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
{{FeatureTodo|Monolithic|Fix listing problems under certain conditions|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|libnepomuk|Convenience operator overloads for query construction|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureDone|libnepomuk|New query flags and improved handling of full text matching scores including sorting|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureTodo|kdeui|Generic find bar widget|sasch.pe@gmx.de|Sascha Peilicke}}&lt;br /&gt;
{{FeatureDone|kdeui|Allow getting and setting the size of the pixmap cache in KImageCache|2kmm@gmx.de|Manuel Mommertz}}&lt;br /&gt;
{{FeatureDone|katepart|scripted actions|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|katepart|QAccessibleInterface's for document+cursor|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|libplasma|PluginLoader class|ry@n.rix.si|Ryan Rix}}&lt;br /&gt;
{{FeatureDone|libplasma|Allow SVGs to use systemcolors before rendering|2kmm@gmx.de|Manuel Mommertz}}&lt;br /&gt;
{{FeatureInProgress|libplasma|DeclarativeWidget to load QML scenes in Plasma|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|libplasma|finish up the gsoc project about Plasma::Storage service|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureDone|libplasma|let Plasma::SVG find the best matching size hinted element if there is no exact match|ingomar@wesp.name|Ingomar Wesp (mentored by Manuel Mommertz)}}&lt;br /&gt;
{{FeatureInProgress|libnepomuk/KIO|Search excerpts|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureInProgress|libnepomuk|Standardqueries for convenience|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureInProgress|libnepomuk|GUI elements for resource/file searching including faceted browsing|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureInProgress|libnepomuksync|Sync library to be used in BackupSync, Strigi, Akonadi, WebExtractor and Removable Media|handa.vish@gmail.com|Vishesh Handa}}&lt;br /&gt;
{{FeatureInProgress|kdecore|Add more possible synchronization primitives to KSharedDataCache to expand OS support. POSIX Semaphores Contributed by Alberto Villa of the FreeBSD project. Windows support may still occur as well.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|kdecore|Add fallback to QCache&amp;lt;QString,QByteArray&amp;gt; in KSharedDataCache.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureDone|kdecore|Add cache-wide timestamp to KSharedDataCache.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|kdecore|Add ability to make KSharedDataCache strictly read-only for laptop support.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureInProgress|kdeui|Social About Dialog|teo@kde.org|Teo Mrnjavac}}&lt;br /&gt;
{{FeatureDone|kdeui|Allow to hide icons in menus|christoph@maxiom.de|Christoph Feck}}&lt;br /&gt;
{{FeatureDone|KLocale|Auto-detect new users Country from their system country.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureDone|KLocale|New configuration option for AM/PM symbols, .|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureDone|KLocale|Seperate backends available for each supported platform/desktop, use of platform localization in place of KDE locale planned for 4.7.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureDone|KLocalizedDate|New convenience class to make date localization easy.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KCalendarSystem|Add api for first/last day of year/month.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KCalendarSystem|Add configuration option for Short Year Window.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KCalendarSystem|Separated date / time parsing code into new private KDateTimeParser and KDateTimeFormatter classes to share with KLocale and KDateTime.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|KHTML|HTML5 postMessage.|maksim@kde.org|Maksim Orlovich}} &lt;br /&gt;
{{FeatureTodo|kcookiejar|New domain specific cookie policy based on patch provided in bug#54300|adawit@kde.org|Dawit A.}} &lt;br /&gt;
{{FeatureInProgress|kcookiejar|Implement storing cookies in KWallet|fid@gpul.org|José Millán Soto}} &lt;br /&gt;
{{FeatureInProgress|ksecretservice|Make KWallet::Wallet use the secrets-service API|lemma@confuego.org|Michael Leupold}} &lt;br /&gt;
{{FeatureInProgress|anywhere|Allow to build without deprecated symbols|ervin@kde.org|Kevin Ottens (with lots of support from David Faure)}} &lt;br /&gt;
{{FeatureInProgress|KIO|Use `net usershare` in KSambaShare|rclbelem@gmail.com|Rodrigo Belem}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Marble|Loading of routes in .kml format (Maemo)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Route printing (map and directions, configurabe)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Route state saving and restoring|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Convert MarbleRunners to plugins|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|worldwide and offline routing|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Extend MarbleRunner interface to handle reverse geocoding and routing requests; Display of alternative routes|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Routing API|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|&amp;quot;Go To&amp;quot; dialog for Maemo|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Tile download along the route for offline usage|akssps011@gmail.com|Siddharth Srivastava}}&lt;br /&gt;
{{FeatureDone|Marble|Turn-by-turn navigation mode|akssps011@gmail.com|Siddharth Srivastava}}&lt;br /&gt;
{{FeatureDone|Marble|QtDeclarative plugin and QML examples (experimental)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Implement sun locator blendings as derived classes of Marble::Blending|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureTodo|Marble|Separate thread for tile loading and texture blending (not texture mapping at the moment) for more smooth browsing|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureTodo|Marble|Tile loading &amp;quot;read ahead&amp;quot; when idle, prerequisite: threaded tile loading|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureTodo|Marble|Multi threaded texture mapping|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureDone|Marble|Improve GeoData API|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Convert Gps tracking to GeoDataDocument|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Provide a treeModel for GeoDataDocuments|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Draw the geometries of multiple GeoDataDocuments|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureInProgress|Marble|Load Pnt vector data files as GeoData|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureInProgress|Marble|Manipulate Gps track data|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Cantor|Backend for GNU Octave|miha.cancula@gmail.com|Miha Čančula}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Merge R improvement branch|alexanderrieder@gmail.com|Alexander Rieder}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Variable management panel|alexanderrieder@gmail.com|Alexander Rieder}}&lt;br /&gt;
{{FeatureTodo|Cantor|Formulas inside Text Entries|alexanderrieder@gmail.com| Alexander Rieder}}&lt;br /&gt;
{{FeatureDone|Kalzium|Port Kalzium to use QGV based periodic table widget|mhanwell@kde.org|Marcus D. Hanwell}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Implicit functions plot|percy.camilo.ta@gmail.com|Percy Aucahuasi}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Improved execution speed on the calculator|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Better integration between the Console and the Plotting facilities|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Lighter version aimed to mobile users|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureInProgress|KStars|OpenGL rendering support for KStars|akarshsimha@gmail.com|Harry de Valence, Akarsh Simha}}&lt;br /&gt;
{{FeatureInProgress|KStars|Better designed object database|akarshsimha@gmail.com|Victor Carbune, Akarsh Simha}}&lt;br /&gt;
{{FeatureInProgress|KStars|Star Hop Generator|akarshsimha@gmail.com|Akarsh Simha}}&lt;br /&gt;
{{FeatureDone|Kig|LaTeX/TikZ exporter|miha.cancula@gmail.com|Miha Čančula}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|JuK|Remove Qt/KDE3 support lib requirements|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|JuK|Allow setting covers directly from URLs supported by KIO - drag/drop already allows this however|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|JuK|Add MPRIS support to JuK so that the NowPlaying applet doesn't need to special-case JuK.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|JuK|Update JuK's MusicBrainz support to a modern version of MusicBrainz.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureInProgress|kmix|Improved volume OSD|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|libkdegames|Import KGameRenderer framework and [[Projects/Games/Porting|port games]] to this unified rendering infrastructure.|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureInProgress|Kigo|Fix KNewStuff provider issues|sasch.pe@gmx.de|Sascha Peilicke}}&lt;br /&gt;
{{FeatureDone|Palapeli|Import Goldberg slicer as the new default slicer plugin.|loehnert.kde@gmx.de|Johannes Loehnert}}&lt;br /&gt;
{{FeatureDone|Palapeli|Update libpala API. Improve usability of &amp;quot;Create new puzzle&amp;quot; dialog.|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|Kajongg|Docbook: Describe the basic game, until now I supposed the player already knows how to play Mah Jong.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Tiles can be discarded with drag&amp;amp;drop.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Make robot player AI more intelligent.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Make tiles in the hand larger and the wall tiles smaller for better playability on small screens.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Make games suspendable/resumable.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Animate moving tiles.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Demo mode.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Introduce an option to only offer possible actions.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureTodo|Kajongg|Add more rulesets like other Classical Chinese variants and the international tournament rules.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Save and restore the current control-mode, keyboard-control option and game-speed settings.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add a keyboard-mode option to start moving when a direction-key is pressed and stop when it is released. Support multiple keys being pressed.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|Klickety|An adaptation of the &amp;quot;clickomania&amp;quot; game.Rewrite the kde3 version.|shuizhuyuanluo@126.com|Ni Hui}}&lt;br /&gt;
{{FeatureDone|Klickety|Merge KSame into Klickety.|shuizhuyuanluo@126.com|Ni Hui}}&lt;br /&gt;
{{FeatureInProgress|Kolf|Port to KGameRenderer, cleanup all QGraphicsView- and physics-related code (and physics engine), incorporate ideas from Kolf-NG.|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureInProgress|Granatier|Port to KGameRenderer.|k.hias@gmx.de|Mathias Kraus}}&lt;br /&gt;
{{FeatureInProgress|Granatier|Use TagaroAudio for sound.|k.hias@gmx.de|Mathias Kraus}}&lt;br /&gt;
{{FeatureDone|Knights|New game: Chess board for KDE4|miha.cancula@gmail.com|Miha Čančula}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|gwenview|Simplify photo sharing|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Lokalize|Integrate snowball stemmer for glossary|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Continue implementing XLIFF spec|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Segmentation [editing] functionality|shafff@NOSPAMukr.net |Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Remote translation memories|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Integrate with nepomuk (fast stats retrieval, tag cloud - incl sharing!)|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|loading compressed files and then saving them back in the original compression format (bug 65518)|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Nepomukshell|New Nepomukshell development tool allowing to browse and debug Nepomuk data|trueg@kde.org|Sebastian Trueg}} &lt;br /&gt;
{{FeatureDone|Dolphin|Git plugin|sebastian@sebastian-doerner.de|Sebastian Doerner}} &lt;br /&gt;
{{FeatureDone|Kate|GDB plugin|kare.sars@iki.fi|K&amp;amp;aring;re S&amp;amp;auml;rs}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Ark|Add a &amp;quot;Preview with...&amp;quot; context menu item|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Add an options dialog (maybe)|haraldhv@stud.ntnu.no|Harald Hvaal}}&lt;br /&gt;
{{FeatureTodo|Ark|Add feedback for the latest operation in the status bar|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Get rid of the Observer code in Kerfuffle|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Make error reporting work as expected in Kerfuffle|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Make Kerfuffle really thread-safe (and use threads in less places)|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Make the internal previewer optional|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Simplify Kerfuffle's API (jobs, interfaces etc) and try to make it stable|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Support for custom options from the compression interface (eg. a slider for selecting compression level for rar files)|haraldhv@stud.ntnu.no|Harald Hvaal}}&lt;br /&gt;
{{FeatureTodo|Ark|Try multiple plugins for each archive type before failing|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|printer-applet|Restore feature parity with KDEPrint3 where possible.||Jonathon Riddell, John Layt}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|KGpg|Better workflow to edit encrypted files|kde@opensource.sf-tec.de|Rolf Eike Beer}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Kontact|Plasma-based Summary Page|ry@n.rix.si|Ryan Rix}}&lt;br /&gt;
{{FeatureInProgress|KHolidays|Add support for holiday types and day-off types.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|KHolidays|Holiday Region selection widget.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KHolidays|Holiday duration api.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KHolidays|Default Holiday Region api.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|KAlarm|Port to Akonadi|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Option to not notify execution errors for pre-alarm actions|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureInProgress|KAlarm|Allow reminders after the main alarm|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureInProgress|KAlarm|Provide wake-from-suspend option for alarms|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeaccessibility  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|KAccessible|Added a dbus-service and a QAccessibleBridgePlugin for focus tracking (used in KMagnifier and the KWin zoom plugin).|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KMagnifier|Follow Focus Mode for Focus Tracking (uses kaccessible).|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KAccessible|Added Screenreader (uses speech-dispatcher)|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= kdeartwork  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|KDE Asciiquarium|Added a new ASCII sprite (a submarine). Contributed by Ryan Meldrum.|mpyne@kde.org.|Michael Pyne}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Shelf|Automatic sizing of the popup|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|Shelf|Setting a custom popup icon|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureTodo|Shelf|Cascading popup menus for folders|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|Shelf|Keyboard navigation|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|Shelf|Search completion|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|libLancelot-datamodels|Akonadi integration|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureTodo|libLancelot-datamodels|Folder contents sorting|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|Lancelot|Theme improvements, animations|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureTodo|Events Runner|Event search|alexey.noskov@gmail.com|Alexey Noskov}}&lt;br /&gt;
{{FeatureTodo|Comic plasmoid|Per comic max cache limit|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureTodo|Comic plasmoid|Change behaviour when comic can't be found|mat69@gmx.net|Matthias Fuchs}}&lt;br /&gt;
{{FeatureDone|GroupingDesktop|Added two desktop containments and a panel containment with applet grouping support|giuliocamuffo@gmail.com|Giulio Camuffo}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|krfb|Refactor Core to make it more maintainable/extensible|grundleborg@googlemail.com.|George Goldberg}}&lt;br /&gt;
{{FeatureDone|krfb|Telepathy Tubes support|grundleborg@googlemail.com.|George Goldberg}}&lt;br /&gt;
{{FeatureDone|krfb|UI Improvements to support new features/deal with some existing bug reports|grundleborg@googlemail.com.|George Goldberg}}&lt;br /&gt;
{{FeatureTodo|kget|Log for transfers|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Talk:Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-11-13T18:41:41Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Second option: Describe the current state */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Second option: Describe the current state===&lt;br /&gt;
&lt;br /&gt;
This option presented here i think only confuses people and clashes with the first option (show what the button does). Take the example:&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-unlocked-locked.png]]&lt;br /&gt;
&lt;br /&gt;
The first thing i thought this would do was enable the Unlocked state, until i saw what happened when the button was pressed. A better option in this case would be to just put 'Lock' on the button (as in, the action) and not represent the current state on the button (or at most in the icon only). I can't think of a situation where having the current state is better than putting on the action, but i might be wrong.&lt;br /&gt;
&lt;br /&gt;
--[[User:GeniusDex|GeniusDex]] 08:27, 13 November 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
The fact the button label is using a verb in a passive form should be an indication that it represents the current state rather than the state which will be reached when clicked.&lt;br /&gt;
&lt;br /&gt;
There are valid use cases for toggle buttons, the most common being text formatting, which is cited in this document.&lt;br /&gt;
&lt;br /&gt;
--[[User:Agateau|Agateau]] 17:16, 13 November 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
Thinking a bit more about it, the behavior of this button would probably be more intuitive if it came without label, only the icon. I suppose it is because without label the icon gets a more central place and we associate the button with the physical action of locking the padlock.&lt;br /&gt;
&lt;br /&gt;
--[[User:Agateau|Agateau]] 18:41, 13 November 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Talk:Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-11-13T17:16:46Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Second option: Describe the current state */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Second option: Describe the current state===&lt;br /&gt;
&lt;br /&gt;
This option presented here i think only confuses people and clashes with the first option (show what the button does). Take the example:&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-unlocked-locked.png]]&lt;br /&gt;
&lt;br /&gt;
The first thing i thought this would do was enable the Unlocked state, until i saw what happened when the button was pressed. A better option in this case would be to just put 'Lock' on the button (as in, the action) and not represent the current state on the button (or at most in the icon only). I can't think of a situation where having the current state is better than putting on the action, but i might be wrong.&lt;br /&gt;
&lt;br /&gt;
--[[User:GeniusDex|GeniusDex]] 08:27, 13 November 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
The fact the button label is using a verb in a passive form should be an indication that it represents the current state rather than the state which will be reached when clicked.&lt;br /&gt;
&lt;br /&gt;
There are valid use cases for toggle buttons, the most common being text formatting, which is cited in this document.&lt;br /&gt;
&lt;br /&gt;
--[[User:Agateau|Agateau]] 17:16, 13 November 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.6_Feature_Plan</id>
		<title>Schedules/KDE4/4.6 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.6_Feature_Plan"/>
				<updated>2010-10-26T19:21:33Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: Added kdegraphics section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.6 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.6 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.6 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.5 Feature Plan]] (previous major release)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebase-apps  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Konsole|Move to KTabWidget|sasch.pe@gmx.de|Sascha Peilicke}}&lt;br /&gt;
{{FeatureInProgress|Dolphin|Faceted browsing via Nepomuk|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureInProgress|Dolphin|Searching support for non-indexed files|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureInProgress|Dolphin|Git-plugin (implemented by Sebastian Dörner and Johannes Steffen)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin| Resizeable columns in the column-view|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin| Allow leading zeros when renaming multiple files  (implemented by Matthias Fuchs)|peter.penz19@gmail.com|Peter Penz}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebase-runtime  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Plasma|Plasma KPart|ry@n.rix.si|Ryan Rix}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Declarative AppletScript to write QML plasmoids|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Optimize the Newspaper containment for the use with touchscreens and the Plasma KPart|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureDone|KWin|Focus tracking for the zoom plugin (uses kaccessible)|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KWin|Extend mouse tracking modes for the zoom plugin|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureInProgress|Nepomuk Backup &amp;amp; Sync| Provide Backup and Sync capabilities to Nepomuk|handa.vish@gmail.com|Vishesh Handa}}&lt;br /&gt;
{{FeatureInProgress|Activities manager service|Merge the kded and nepomuk modules for activities into one service|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|Activities manager service|Register desktop events instead directly linking the activities to resources|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|KNotify|Add support for relative present actions in contexts|wilderkde@gmail.com|Jacopo De Simoi}}&lt;br /&gt;
{{FeatureInProgress|Locale KCM|Complete re-write to improve usability, support for new localization features|john@layt.net|John Layt}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebase-workspace  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | Plasma &lt;br /&gt;
{{FeatureInProgress|libtaskmanager / tasks-applet| support for Windows 7 like launchers |akreuzkamp@web.de|Anton Kreuzkamp}}&lt;br /&gt;
{{FeatureInProgress|notifications| rework notification applet appearance |mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|notifications| make various dataengines use Plasma::Storage |mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureDone|plasma-desktop| UI for editing activity name and icon|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureTodo|plasma-desktop| add some default activities|fux@kde.org|Mario Fux}}&lt;br /&gt;
{{FeatureTodo|plasma| finish support for activity templates | |??}}&lt;br /&gt;
{{FeatureInProgress|plasma-devicenotifier| Improve notification support |wilderkde@gmail.com|Jacopo De Simoi}}&lt;br /&gt;
{{FeatureInProgress|quicklaunch| populate new applets with user's default browser, file manager, ... instead of hardcoded ones |ingomar@wesp.name|Ingomar Wesp}}&lt;br /&gt;
{{FeatureInProgress|quicklaunch| allow editing of existing launchers (including ones that do not point to a .desktop file) |ingomar@wesp.name|Ingomar Wesp}}&lt;br /&gt;
{{FeatureInProgress|quicklaunch| better layout for desktop and media center form factors |ingomar@wesp.name|Ingomar Wesp}}&lt;br /&gt;
{{FeatureInProgress|libplasma|Improvements to Calendar/Clock widgets. Improved config ui. Allow multiple holidays on same day. Allow multiple Holiday Regions. Weekends. etc.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureInProgress|libplasma|Make Calendar DataEngine a Service.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureTodo|plasma-desktop| integrate activity-sessions|chani@kde.org|Ivan/Chani}}&lt;br /&gt;
{{FeatureTodo|plasma-desktop|activity dataengine?|chani@kde.org|Chani}}&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | KWin&lt;br /&gt;
{{FeatureInProgress|windowgeometry effect| compositor powered move/resize windowgeometry display |thomas.luebking@web.de|Thomas Lübking}} &lt;br /&gt;
{{FeatureInProgress|dashboard effect| new effect for Plasma dashboard |ademmer@opensuse.org|Andreas Demmer}} &lt;br /&gt;
{{FeatureInProgress|kwin/ksmserver| activity sessions |chanika@gmail.com|Chani}} &lt;br /&gt;
{{FeatureTodo|libtaskmanager/kwin?| combine the three window-contextmenu codebases into one | |??}}  &lt;br /&gt;
{{FeatureTodo|libtaskmanager/kwin] | Expose Window Tabs to taskmanager |kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureTodo|kwin|ARB Shader support|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|Aurorae|Tooltips on window tabs|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Present Windows|Close window GUI control|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Startup Feedback|Effect to replace the Startup Feedback notification|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Screenshot Effect|KSanpshot can use KWin for screenshots|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureTodo|KCM Compositing|Allow compositing even if GL is buggy/X crashes|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | KDE Power Management system &lt;br /&gt;
{{FeatureDone|core| PowerDevil v2 core |drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureDone|actions| Basic actions for feature parity with PowerDevil v1 |drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureInProgress|actions| More actions for advanced users |drf@kde.org|Dario Freddi}}&lt;br /&gt;
{{FeatureInProgress|policy-handler| Create a new policy handler for handling inhibition properly, and have kdelibs' Solid API use it |drf@kde.org|Dario Freddi}}&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | System Settings&lt;br /&gt;
{{FeatureInProgress|keyboard| Support for sticky layout switching |arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureInProgress|keyboard| Support for &amp;gt; 4 layouts|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdelibs  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|libnepomuk|Convenience operator overloads for query construction|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureDone|libnepomuk|New query flags and improved handling of full text matching scores including sorting|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureTodo|kdeui|Generic find bar widget|sasch.pe@gmx.de|Sascha Peilicke}}&lt;br /&gt;
{{FeatureDone|kdeui|Allow getting and setting the size of the pixmap cache in KImageCache|2kmm@gmx.de|Manuel Mommertz}}&lt;br /&gt;
{{FeatureDone|katepart|scripted actions|dhaumann@kde.org|Dominik Haumann}}&lt;br /&gt;
{{FeatureDone|katepart|QAccessibleInterface's for document+cursor|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|libplasma|PluginLoader class|ry@n.rix.si|Ryan Rix}}&lt;br /&gt;
{{FeatureDone|libplasma|Allow SVGs to use systemcolors before rendering|2kmm@gmx.de|Manuel Mommertz}}&lt;br /&gt;
{{FeatureInProgress|libplasma|DeclarativeWidget to load QML scenes in Plasma|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|libplasma|finish up the gsoc project about Plasma::Storage service|mart@kde.org|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|libnepomuk/KIO|Search excerpts|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureInProgress|libnepomuk|Standardqueries for convenience|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureInProgress|libnepomuk|GUI elements for resource/file searching including faceted browsing|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureInProgress|libnepomuksync|Sync library to be used in BackupSync, Strigi, Akonadi, WebExtractor and Removable Media|handa.vish@gmail.com|Vishesh Handa}}&lt;br /&gt;
{{FeatureInProgress|kdecore|Add more possible synchronization primitives to KSharedDataCache to expand OS support. POSIX Semaphores Contributed by Alberto Villa of the FreeBSD project. Windows support may still occur as well.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|kdecore|Add fallback to QCache&amp;lt;QString,QByteArray&amp;gt; in KSharedDataCache.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|kdecore|Add cache-wide timestamp to KSharedDataCache.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|kdecore|Add ability to make KSharedDataCache strictly read-only for laptop support.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureInProgress|kdeui|Social About Dialog|teo@kde.org|Teo Mrnjavac}}&lt;br /&gt;
{{FeatureTodo|KCalendarSystem||john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureTodo|KCalendarSystem|Add astronomical calculation support classes and astronomical based calendars.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KCalendarSystem|Add api for first/last day of year/month.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|KDate|New convenience class to make date localization easy.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KLocale|Add configuration for AM/PM symbols.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureTodo|KLocale|Add default colour to optionally display negative numbers.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureTodo|KLocale|Add more date formats.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureInProgress|KLocale|Full POSIX compliant format support for date, time, numbers and money, including but not limited to: traditional/US week numbers, AM/PM symbols, number grouping|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureInProgress|KLocale|Implement separate backends for each supported platform/desktop to use platform localization in place of KDE locale.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureInProgress|KLocale|Implement support for Country Code sub-regions and other country code standard conversions.|john@layt.net|John Layt}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Marble|GPX import of routes|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Route printing (map and directions, configurabe)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Route state saving and restoring|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Convert MarbleRunners to plugins|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|worldwide and offline routing|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Extend MarbleRunner interface to handle reverse geocoding and routing requests; Display of alternative routes|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Routing API|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Implement sun locator blendings as derived classes of Marble::Blending|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureTodo|Marble|Separate thread for tile loading and texture blending (not texture mapping at the moment) for more smooth browsing|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureTodo|Marble|Tile loading &amp;quot;read ahead&amp;quot; when idle, prerequisite: threaded tile loading|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureDone|Marble|Tile download along the route for offline usage|akssps011@gmail.com|Siddharth Srivastavah}}&lt;br /&gt;
{{FeatureInProgress|Marble|Turn-by-turn navigation mode|akssps011@gmail.com|Siddharth Srivastavah}}&lt;br /&gt;
{{FeatureTodo|Marble|Multi threaded texture mapping|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureDone|Marble|Improve GeoData API|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Convert Gps tracking to GeoDataDocument|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Provide a treeModel for GeoDataDocuments|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Marble|Draw the geometries of multiple GeoDataDocuments|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureInProgress|Marble|Load Pnt vector data files as GeoData|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureInProgress|Marble|Manipulate Gps track data|tgridel@freedotfr|Thibaut Gridel}}&lt;br /&gt;
{{FeatureDone|Cantor|Backend for GNU Octave|miha.cancula@gmail.com|Miha Čančula}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Merge R improvement branch|alexanderrieder@gmail.com|Alexander Rieder}}&lt;br /&gt;
{{FeatureInProgress|Cantor|Variable management panel|alexanderrieder@gmail.com|Alexander Rieder}}&lt;br /&gt;
{{FeatureTodo|Cantor|Formulas inside Text Entries|alexanderrieder@gmail.com| Alexander Rieder}}&lt;br /&gt;
{{FeatureDone|Kalzium|Port Kalzium to use QGV based periodic table widget|mhanwell@kde.org|Marcus D. Hanwell}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Implicit functions plot|percy.camilo.ta@gmail.com|Percy Aucahuasi}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Improved execution speed on the calculator|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Better integration between the Console and the Plotting facilities|aleixpol@kde.org|Aleix Pol Gonzalez}}&lt;br /&gt;
{{FeatureInProgress|KStars|OpenGL rendering support for KStars|akarshsimha@gmail.com|Harry de Valence, Akarsh Simha}}&lt;br /&gt;
{{FeatureInProgress|KStars|Better designed object database|akarshsimha@gmail.com|Victor Carbune, Akarsh Simha}}&lt;br /&gt;
{{FeatureInProgress|KStars|Star Hop Generator|akarshsimha@gmail.com|Akarsh Simha}}&lt;br /&gt;
{{FeatureDone|Kig|LaTeX/TikZ exporter|miha.cancula@gmail.com|Miha Čančula}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|JuK|Remove Qt/KDE3 support lib requirements|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|JuK|Allow setting covers directly from URLs supported by KIO - drag/drop already allows this however|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|JuK|Add MPRIS support to JuK so that the NowPlaying applet doesn't need to special-case JuK.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
{{FeatureTodo|JuK|Update JuK's MusicBrainz support to a modern version of MusicBrainz.|mpyne@kde.org|Michael Pyne}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegames =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|libkdegames|Import KGameRenderer framework and [[Projects/Games/Porting|port games]] to this unified rendering infrastructure.|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureInProgress|Kigo|Fix KNewStuff provider issues|sasch.pe@gmx.de|Sascha Peilicke}}&lt;br /&gt;
{{FeatureDone|Palapeli|Import Goldberg slicer as the new default slicer plugin.|loehnert.kde@gmx.de|Johannes Loehnert}}&lt;br /&gt;
{{FeatureDone|Palapeli|Update libpala API. Improve usability of &amp;quot;Create new puzzle&amp;quot; dialog.|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|Kajongg|Docbook: Describe the basic game, until now I supposed the player already knows how to play Mah Jong.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Tiles can be discarded with drag&amp;amp;drop.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Make robot player AI more intelligent.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Make tiles in the hand larger and the wall tiles smaller for better playability on small screens.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|Kajongg|Make games suspendable/resumable.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureInProgress|Kajongg|Animate moving tiles.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureInProgress|Kajongg|Demo mode.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureTodo|Kajongg|Introduce an option to only offer possible actions.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureTodo|Kajongg|Add more rulesets like other Classical Chinese variants and the international tournament rules.|wolfgang@rohdewald.de|Wolfgang Rohdewald}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Save and restore the current control-mode, keyboard-control option and game-speed settings.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|KGoldrunner|Add a keyboard-mode option to start moving when a direction-key is pressed and stop when it is released. Support multiple keys being pressed.|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
{{FeatureDone|Klickety|An adaptation of the &amp;quot;clickomania&amp;quot; game.Rewrite the kde3 version.|shuizhuyuanluo@126.com|Ni Hui}}&lt;br /&gt;
{{FeatureInProgress|Klickety|IMerge KSame into Klickety.|shuizhuyuanluo@126.com|Ni Hui}}&lt;br /&gt;
{{FeatureInProgress|Kolf|Port to KGameRenderer, cleanup all QGraphicsView- and physics-related code (and physics engine), incorporate ideas from Kolf-NG.|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdegraphics =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|gwenview|Simplify photo sharing|agateau@kde.org|Aurélien Gâteau}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdesdk  =&lt;br /&gt;
&lt;br /&gt;
{| cellspa/cing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Lokalize|Integrate snowball stemmer for glossary|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Continue implementing XLIFF spec|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Segmentation [editing] functionality|shafff@NOSPAMukr.net |Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Remote translation memories|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|Integrate with nepomuk (fast stats retrieval, tag cloud - incl sharing!)|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Lokalize|loading compressed files and then saving them back in the original compression format (bug 65518)|shafff@NOSPAMukr.net|Nick Shaforostoff}} &lt;br /&gt;
{{FeatureTodo|Nepomukshell|New Nepomukshell development tool allowing to browse and debug Nepomuk data|trueg@kde.org|Sebastian Trueg}} &lt;br /&gt;
{{FeatureInProgress|Dolphin|Git plugin|sebastian@sebastian-doerner.de|Sebastian Doerner}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeutils  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Ark|Add a &amp;quot;Preview with...&amp;quot; context menu item|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Add an options dialog (maybe)|haraldhv@stud.ntnu.no|Harald Hvaal}}&lt;br /&gt;
{{FeatureTodo|Ark|Add feedback for the latest operation in the status bar|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Get rid of the Observer code in Kerfuffle|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Make error reporting work as expected in Kerfuffle|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Make Kerfuffle really thread-safe (and use threads in less places)|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Make the internal previewer optional|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Simplify Kerfuffle's API (jobs, interfaces etc) and try to make it stable|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Ark|Support for custom options from the compression interface (eg. a slider for selecting compression level for rar files)|haraldhv@stud.ntnu.no|Harald Hvaal}}&lt;br /&gt;
{{FeatureTodo|Ark|Try multiple plugins for each archive type before failing|kubito@gmail.com|Raphael Kubo da Costa}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add a general KPart adapter to Kasten, than finish port of Okteta KPart to Okteta Kasten|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add global toggle option for the offset display, hex or decimal|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add Kate-like combined dialogs to query for actions on files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add Okular like embedded notifications|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for import by drop, both url and data|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files and 64-bit addressing|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for jobs like io, printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles, incl. editor/manager|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|copy again puts also a value or char variant of the data to clipboard|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Improve the titels of the changes to the bytearray to be more descriptive, best using ids to avoid text string|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Make all user interaction in the KastenCore managers plugin-based|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Merge row and column widgets into one|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|Store bookmarks and other view settings for next load|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|printer-applet|Restore feature parity with KDEPrint3 where possible.||Jonathon Riddell, John Layt}} &lt;br /&gt;
{{FeatureTodo|Okteta|Add view profiles|kossebau@kde.org|Friedrich W. H. Kossebau}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdepim  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|Kontact|Plasma-based Summary Page|ry@n.rix.si|Ryan Rix}}&lt;br /&gt;
{{FeatureInProgress|KHolidays|Add support for holiday types and day-off types.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|KHolidays|Holiday Region selection widget.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KHolidays|Holiday duration api.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|KHolidays|Default Holiday Region api.|john@layt.net|John Layt}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeaccessibility  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|KAccessible|Added a dbus-service and a QAccessibleBridgePlugin for focus tracking (used in KMagnifier and the KWin zoom plugin).|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KMagnifier|Follow Focus Mode for Focus Tracking (uses kaccessible).|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KAccessible|Added Screenreader (uses speech-dispatcher)|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= kdeartwork  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|KDE Asciiquarium|Added a new ASCII sprite (a submarine). Contributed by Ryan Meldrum.|mpyne@kde.org.|Michael Pyne}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= kdeplasma-addons =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|Shelf|Automatic sizing of the popup|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|Shelf|Setting a custom popup icon|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureTodo|Shelf|Cascading popup menus for folders|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|Shelf|Keyboard navigation|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureDone|Shelf|Search completion|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|libLancelot-datamodels|Akonadi integration|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureTodo|libLancelot-datamodels|Folder contents sorting|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureInProgress|Lancelot|Theme improvements, animations|ivan.cukic@kde.org|Ivan Čukić}}&lt;br /&gt;
{{FeatureTodo|Events Runner|Event search|alexey.noskov@gmail.com|Alexey Noskov}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdenetwork  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|krfb|Refactor Core to make it more maintainable/extensible|grundleborg@googlemail.com.|George Goldberg}}&lt;br /&gt;
{{FeatureInProgress|krfb|Telepathy Tubes support|grundleborg@googlemail.com.|George Goldberg}}&lt;br /&gt;
{{FeatureInProgress|krfb|UI Improvements to support new features/deal with some existing bug reports|grundleborg@googlemail.com.|George Goldberg}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG</id>
		<title>Projects/Usability/HIG</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG"/>
				<updated>2010-08-28T15:54:27Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* T */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Please add any guidelines questions or requests to the [[Projects/Usability/HIG_Questions|HIG Questions]] page.&lt;br /&gt;
&lt;br /&gt;
Also see the  [http://developer.kde.org/documentation/standards/kde/style/basics/index.html KDE3 User Interface Guidelines] and the draft notes for the  [http://wiki.openusability.org/guidelines/ KDE4 Human Interface Guidelines].&lt;br /&gt;
&lt;br /&gt;
[[Projects/Usability/HIG/SOU_Workspace|Season of Usability HIG &amp;amp; Design Patterns Workspace]]&lt;br /&gt;
&lt;br /&gt;
==Index==&lt;br /&gt;
===C===&lt;br /&gt;
* [[Projects/Usability/HIG/Capitalization|Capitalization]]&lt;br /&gt;
* [[Projects/Usability/HIG/Contractions|Contractions (don't, there's, etc.)]]&lt;br /&gt;
* [[Projects/Usability/HIG/Check_Box|Check Box]]&lt;br /&gt;
* [[Projects/Usability/HIG/Combo_Box|Combo Box]]&lt;br /&gt;
&lt;br /&gt;
===D===&lt;br /&gt;
* [[Projects/Usability/HIG/Date_Time|Date and Time]]&lt;br /&gt;
* [[Projects/Usability/HIG/Dialogs|Dialogs]]&lt;br /&gt;
&lt;br /&gt;
===E===&lt;br /&gt;
* [[Projects/Usability/HIG/Ellipsis|Ellipsis]]&lt;br /&gt;
* [[Projects/Usability/HIG/Exclamation_points|Exclamation Points]]&lt;br /&gt;
&lt;br /&gt;
===F===&lt;br /&gt;
* [[Projects/Usability/HIG/Form_Label_Alignment|Forms: Label Alignment]]&lt;br /&gt;
&lt;br /&gt;
===K===&lt;br /&gt;
* [[Projects/Usability/HIG/KNS|KNewStuff Button Labels]]&lt;br /&gt;
* [[Projects/Usability/HIG/Keyboard_Accelerators|Keyboard Accelerators]]&lt;br /&gt;
* [[Projects/Usability/HIG/Keyboard_Shortcuts|Keyboard Shortcuts]]&lt;br /&gt;
&lt;br /&gt;
===L===&lt;br /&gt;
* [[Projects/Usability/HIG/Labels|Labels]]&lt;br /&gt;
* [[Projects/Usability/HIG/Lists_Rich_Lists|Lists and Rich Lists]]&lt;br /&gt;
&lt;br /&gt;
===M===&lt;br /&gt;
* [[Projects/Usability/HIG/Menu_Bar|Menu Bar]]&lt;br /&gt;
* [[Projects/Usability/HIG/Messages|Messages]]&lt;br /&gt;
===R===&lt;br /&gt;
* [[Projects/Usability/HIG/Radio Buttons|Radio Buttons]]&lt;br /&gt;
===S===&lt;br /&gt;
* [[Projects/Usability/HIG/Slider|Slider]]&lt;br /&gt;
* [[Projects/Usability/HIG/Spin_Box|Spin Box]]&lt;br /&gt;
&lt;br /&gt;
===T===&lt;br /&gt;
* [[Projects/Usability/HIG/Tabs_Pages|Tabs and Pages in Dialogs]]&lt;br /&gt;
* [[Projects/Usability/HIG/Toggle_Buttons|Toggle Buttons]]&lt;br /&gt;
&lt;br /&gt;
===W===&lt;br /&gt;
* [[Projects/Usability/HIG/Wording|Wording]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Usability]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-28T15:39:20Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: moved User:Agateau/Toggle Button to Projects/Usability/HIG/Toggle Buttons:&amp;amp;#32;Validated by Celeste&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-formatting.png]]&lt;br /&gt;
(Toggle buttons used in a rich text editor)&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a combined Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-media-player.png]]&lt;br /&gt;
&lt;br /&gt;
==Icon and Label==&lt;br /&gt;
&lt;br /&gt;
There are two ways to label a toggle button. You can either describe the state reached when the button is down or describe the current state.&lt;br /&gt;
&lt;br /&gt;
===First option: Describe the state reached when the button is down===&lt;br /&gt;
&lt;br /&gt;
In this case the icon and label should not change when the button is down.&lt;br /&gt;
&lt;br /&gt;
Example: We create a toggle button to toggle the visibility of a sidebar. The label of this button is &amp;quot;Show Sidebar&amp;quot;. When the button is toggled down, it should still say &amp;quot;Show Sidebar&amp;quot;: it should not be changed to &amp;quot;Hide Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Think of the button as a check box: when you click a check box you do not expect its label to change. If it makes more sense to change the button text to &amp;quot;Hide Sidebar&amp;quot; when the sidebar is shown then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that unlike normal buttons, the label of a toggle button does not need to contain a verb, as long as there is no ambiguity. In this example the label can be reduced to &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;br /&gt;
&lt;br /&gt;
===Second option: Describe the current state===&lt;br /&gt;
&lt;br /&gt;
In this case the label will often include a passive verb. For example a button to lock or unlock an element would say &amp;quot;Unlocked&amp;quot; when it is up and &amp;quot;Locked&amp;quot; when it is down. The icon should also change to match the label.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-unlocked-locked.png]]&lt;br /&gt;
&lt;br /&gt;
===Which option to use===&lt;br /&gt;
&lt;br /&gt;
There is no strict rule to decide which option is the best, it depends on the context of your application. Note however that the second option has one drawback: since the label change, the button width will change as well. This can be annoying if the button is in the middle of a toolbar as it will cause all buttons after it to shift horizontally.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Agateau/Toggle_Button</id>
		<title>User:Agateau/Toggle Button</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Agateau/Toggle_Button"/>
				<updated>2010-08-28T15:39:20Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: moved User:Agateau/Toggle Button to Projects/Usability/HIG/Toggle Buttons:&amp;amp;#32;Validated by Celeste&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Projects/Usability/HIG/Toggle Buttons]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Agateau</id>
		<title>User:Agateau</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Agateau"/>
				<updated>2010-08-27T21:44:15Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Drafts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I am Gwenview main developer, and also try to help out polishing overall desktop experience in KDE.&lt;br /&gt;
&lt;br /&gt;
* blog: http://agateau.wordpress.com&lt;br /&gt;
* mail: agateau (a) kde dot org&lt;br /&gt;
&lt;br /&gt;
== Drafts ==&lt;br /&gt;
&lt;br /&gt;
* [[User:Agateau/TooManyToolbars|Too Many Toolbars]]&lt;br /&gt;
* [[User:Agateau/Toggle_Button|Toggle Button]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-27T21:22:09Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-formatting.png]]&lt;br /&gt;
(Toggle buttons used in a rich text editor)&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a combined Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-media-player.png]]&lt;br /&gt;
&lt;br /&gt;
==Icon and Label==&lt;br /&gt;
&lt;br /&gt;
There are two ways to label a toggle button. You can either describe the state reached when the button is down or describe the current state.&lt;br /&gt;
&lt;br /&gt;
===First option: Describe the state reached when the button is down===&lt;br /&gt;
&lt;br /&gt;
In this case the icon and label should not change when the button is down.&lt;br /&gt;
&lt;br /&gt;
Example: We create a toggle button to toggle the visibility of a sidebar. The label of this button is &amp;quot;Show Sidebar&amp;quot;. When the button is toggled down, it should still say &amp;quot;Show Sidebar&amp;quot;: it should not be changed to &amp;quot;Hide Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Think of the button as a check box: when you click a check box you do not expect its label to change. If it makes more sense to change the button text to &amp;quot;Hide Sidebar&amp;quot; when the sidebar is shown then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that unlike normal buttons, the label of a toggle button does not need to contain a verb, as long as there is no ambiguity. In this example the label can be reduced to &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;br /&gt;
&lt;br /&gt;
===Second option: Describe the current state===&lt;br /&gt;
&lt;br /&gt;
In this case the label will often include a passive verb. For example a button to lock or unlock an element would say &amp;quot;Unlocked&amp;quot; when it is up and &amp;quot;Locked&amp;quot; when it is down. The icon should also change to match the label.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-unlocked-locked.png]]&lt;br /&gt;
&lt;br /&gt;
===Which option to use===&lt;br /&gt;
&lt;br /&gt;
There is no strict rule to decide which option is the best, it depends on the context of your application. Note however that the second option has one drawback: since the label change, the button width will change as well. This can be annoying if the button is in the middle of a toolbar as it will cause all buttons after it to shift horizontally.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Toggle-button-media-player.png</id>
		<title>File:Toggle-button-media-player.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Toggle-button-media-player.png"/>
				<updated>2010-08-27T20:37:27Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: uploaded a new version of &amp;quot;File:Toggle-button-media-player.png&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-27T20:34:02Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Icon and Label */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-formatting.png]]&lt;br /&gt;
(Toggle buttons used in a rich text editor)&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a combined Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-media-player.png]]&lt;br /&gt;
&lt;br /&gt;
==Icon and Label==&lt;br /&gt;
&lt;br /&gt;
There are two ways to label a toggle button:&lt;br /&gt;
&lt;br /&gt;
'''First option: Describe the state which is reached when the button is down'''&lt;br /&gt;
&lt;br /&gt;
In this case the icon and label should not change when the button is down.&lt;br /&gt;
&lt;br /&gt;
Example: We create a toggle button to toggle the visibility of a sidebar. The label of this button is &amp;quot;Show Sidebar&amp;quot;. When the button is toggled down, it should still say &amp;quot;Show Sidebar&amp;quot;: it should not be changed to &amp;quot;Hide Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Think of the button as a check box: when you click a check box you do not expect its label to change. If it makes more sense to change the button text to &amp;quot;Hide Sidebar&amp;quot; when the sidebar is shown then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
It is worth noting that unlike normal buttons, the label of a toggle button does not need to contain a verb, as long as there is no ambiguity. In this example the label can be reduced to &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;br /&gt;
&lt;br /&gt;
'''Second option: Describe the current state'''&lt;br /&gt;
&lt;br /&gt;
In this case the label will often include a passive verb. For example a button to lock or unlock an element would say &amp;quot;Unlocked&amp;quot; when it is up and &amp;quot;Locked&amp;quot; when it is down. The icon should also change to match the label.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-unlocked-locked.png]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-27T20:30:09Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Icon and Label */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-formatting.png]]&lt;br /&gt;
(Toggle buttons used in a rich text editor)&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a combined Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-media-player.png]]&lt;br /&gt;
&lt;br /&gt;
==Icon and Label==&lt;br /&gt;
&lt;br /&gt;
There are two ways to label a toggle button:&lt;br /&gt;
&lt;br /&gt;
'''First option: Describe the state which is reached when the button is down'''&lt;br /&gt;
&lt;br /&gt;
In this case the icon and label should not change when the button is down.&lt;br /&gt;
&lt;br /&gt;
For example a button to toggle the visibility of a sidebar could say &amp;quot;Show Sidebar&amp;quot;. It should still say &amp;quot;Show Sidebar&amp;quot; when the button is down: it should not be changed to &amp;quot;Hide Sidebar&amp;quot;. Think of the button as a check box: when you click a check box you do not expect its label to change.&lt;br /&gt;
&lt;br /&gt;
If you want to change the button text to &amp;quot;Hide Sidebar&amp;quot; when the sidebar is shown then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
It is worth noting the label of a toggle button does not need to contain a verb, as long as there is no ambiguity. In this example the label can be reduced to &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;br /&gt;
&lt;br /&gt;
'''Second option: Describe the current state'''&lt;br /&gt;
&lt;br /&gt;
In this case the label will often include a passive verb. For example a button to lock or unlock an element would say &amp;quot;Unlocked&amp;quot; when it is up and &amp;quot;Locked&amp;quot; when it is down. The icon should also change to match the label.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-unlocked-locked.png]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-27T20:29:34Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Icon and Label */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-formatting.png]]&lt;br /&gt;
(Toggle buttons used in a rich text editor)&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a combined Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-media-player.png]]&lt;br /&gt;
&lt;br /&gt;
==Icon and Label==&lt;br /&gt;
&lt;br /&gt;
There are two ways to label a toggle button:&lt;br /&gt;
&lt;br /&gt;
'''First possibility: Describe the state which is reached when the button is down'''&lt;br /&gt;
&lt;br /&gt;
In this case the icon and label should not change when the button is down.&lt;br /&gt;
&lt;br /&gt;
For example a button to toggle the visibility of a sidebar could say &amp;quot;Show Sidebar&amp;quot;. It should still say &amp;quot;Show Sidebar&amp;quot; when the button is down: it should not be changed to &amp;quot;Hide Sidebar&amp;quot;. Think of the button as a check box: when you click a check box you do not expect its label to change.&lt;br /&gt;
&lt;br /&gt;
If you want to change the button text to &amp;quot;Hide Sidebar&amp;quot; when the sidebar is shown then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
It is worth noting the label of a toggle button does not need to contain a verb, as long as there is no ambiguity. In this example the label can be reduced to &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;br /&gt;
&lt;br /&gt;
'''Second possibility: Describe the current state'''&lt;br /&gt;
&lt;br /&gt;
In this case the label will often include a passive verb. For example a button to lock or unlock an element would say &amp;quot;Unlocked&amp;quot; when it is up and &amp;quot;Locked&amp;quot; when it is down. The icon should also change to match the label.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-unlocked-locked.png]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Toggle-button-media-player.png</id>
		<title>File:Toggle-button-media-player.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Toggle-button-media-player.png"/>
				<updated>2010-08-27T20:24:19Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: uploaded a new version of &amp;quot;File:Toggle-button-media-player.png&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-27T20:22:22Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-formatting.png]]&lt;br /&gt;
(Toggle buttons used in a rich text editor)&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a combined Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-media-player.png]]&lt;br /&gt;
&lt;br /&gt;
==Icon and Label==&lt;br /&gt;
&lt;br /&gt;
There are two ways to label a toggle button:&lt;br /&gt;
&lt;br /&gt;
'''1. Describe the state which is reached when the button is down'''&lt;br /&gt;
&lt;br /&gt;
In this case the icon and label should not change when the button is down.&lt;br /&gt;
&lt;br /&gt;
For example a button to toggle the visibility of a sidebar could say &amp;quot;Show Sidebar&amp;quot;. It should still say &amp;quot;Show Sidebar&amp;quot; when the button is down: it should not be changed to &amp;quot;Hide Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to change the button text to &amp;quot;Hide Sidebar&amp;quot; when the sidebar is shown then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
An alternative is to reduce the button to a noun if it is not ambiguous. In this example the button label could be reduced to &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;br /&gt;
&lt;br /&gt;
'''2. Describe the current state'''&lt;br /&gt;
&lt;br /&gt;
In this case the label will often include a passive verb. For example a button to lock or unlock an element would say &amp;quot;Unlocked&amp;quot; when it is up and &amp;quot;Locked&amp;quot; when it is down. The icon should match the label.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-unlocked-locked.png]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Toggle-button-unlocked-locked.png</id>
		<title>File:Toggle-button-unlocked-locked.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Toggle-button-unlocked-locked.png"/>
				<updated>2010-08-27T20:21:48Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-27T20:09:08Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-formatting.png]]&lt;br /&gt;
(Toggle buttons used in a rich text editor)&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a combined Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-media-player.png]]&lt;br /&gt;
&lt;br /&gt;
==Icon and Label==&lt;br /&gt;
&lt;br /&gt;
There are two ways to label a toggle button:&lt;br /&gt;
&lt;br /&gt;
'''1. Describe the state which is reached when the button is down'''&lt;br /&gt;
&lt;br /&gt;
In this case the icon and label should not change when the button is down.&lt;br /&gt;
&lt;br /&gt;
For example a button to toggle the visibility of a sidebar could say &amp;quot;Show Sidebar&amp;quot;. It should still say &amp;quot;Show Sidebar&amp;quot; when the button is down: it should not be changed to &amp;quot;Hide Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to change the button text to &amp;quot;Hide Sidebar&amp;quot; when the sidebar is shown then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
An alternative is to reduce the button to a noun if it is not ambiguous. In this example the button label could be reduced to &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;br /&gt;
&lt;br /&gt;
'''2. Describe the current state'''&lt;br /&gt;
&lt;br /&gt;
In this case the label will often include a passive verb. For example a button to lock or unlock an element would say &amp;quot;Unlocked&amp;quot; when it is up and &amp;quot;Locked&amp;quot; when it is down. The icon should match the label.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Toggle-button-formatting.png</id>
		<title>File:Toggle-button-formatting.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Toggle-button-formatting.png"/>
				<updated>2010-08-27T20:07:16Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: Toggle buttons used in a rich text editor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Toggle buttons used in a rich text editor&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-27T19:55:38Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a combined Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-media-player.png]]&lt;br /&gt;
&lt;br /&gt;
==Icon and Label==&lt;br /&gt;
&lt;br /&gt;
There are two ways to label a toggle button:&lt;br /&gt;
&lt;br /&gt;
'''1. Describe the state which is reached when the button is down'''&lt;br /&gt;
&lt;br /&gt;
In this case the icon and label should not change when the button is down.&lt;br /&gt;
&lt;br /&gt;
For example a button to toggle the visibility of a sidebar could say &amp;quot;Show Sidebar&amp;quot;. It should still say &amp;quot;Show Sidebar&amp;quot; when the button is down: it should not be changed to &amp;quot;Hide Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to change the button text to &amp;quot;Hide Sidebar&amp;quot; when the sidebar is shown then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
An alternative is to reduce the button to a noun if it is not ambiguous. In this example the button label could be reduced to &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;br /&gt;
&lt;br /&gt;
'''2. Describe the current state'''&lt;br /&gt;
&lt;br /&gt;
In this case the label will often include a passive verb. For example a button to lock or unlock an element would say &amp;quot;Unlocked&amp;quot; when it is up and &amp;quot;Locked&amp;quot; when it is down. The icon should match the label.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Toggle-button-media-player.png</id>
		<title>File:Toggle-button-media-player.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Toggle-button-media-player.png"/>
				<updated>2010-08-27T19:54:43Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Toggle-button-summary.png</id>
		<title>File:Toggle-button-summary.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Toggle-button-summary.png"/>
				<updated>2010-08-18T22:17:25Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: uploaded a new version of &amp;quot;File:Toggle-button-summary.png&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-18T22:06:34Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Icon and Label */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a combined Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==Icon and Label==&lt;br /&gt;
&lt;br /&gt;
There are two ways to label a toggle button:&lt;br /&gt;
&lt;br /&gt;
'''1. Describe the state which is reached when the button is down'''&lt;br /&gt;
&lt;br /&gt;
In this case the icon and label should not change when the button is down.&lt;br /&gt;
&lt;br /&gt;
For example a button to toggle the visibility of a sidebar could say &amp;quot;Show Sidebar&amp;quot;. It should still say &amp;quot;Show Sidebar&amp;quot; when the button is down: it should not be changed to &amp;quot;Hide Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to change the button text to &amp;quot;Hide Sidebar&amp;quot; when the sidebar is shown then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
An alternative is to reduce the button to a noun if it is not ambiguous. In this example the button label could be reduced to &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;br /&gt;
&lt;br /&gt;
'''2. Describe the current state'''&lt;br /&gt;
&lt;br /&gt;
In this case the label will often include a passive verb. For example a button to lock or unlock an element would say &amp;quot;Unlocked&amp;quot; when it is up and &amp;quot;Locked&amp;quot; when it is down. The icon should match the label.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-18T22:05:31Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* How to Use */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a combined Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==Icon and Label==&lt;br /&gt;
&lt;br /&gt;
There are two ways to label a toggle button:&lt;br /&gt;
&lt;br /&gt;
1. Describe the state which is reached when the button is down:&lt;br /&gt;
&lt;br /&gt;
In this case the icon and label should not change when the button is down.&lt;br /&gt;
&lt;br /&gt;
For example a button to toggle the visibility of a sidebar could say &amp;quot;Show Sidebar&amp;quot;. It should still say &amp;quot;Show Sidebar&amp;quot; when the button is down: it should not be changed to &amp;quot;Hide Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to change the button text to &amp;quot;Hide Sidebar&amp;quot; when the sidebar is shown then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
An alternative is to reduce the button to a noun if it is not ambiguous. In this example the button label could be reduced to &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;br /&gt;
&lt;br /&gt;
2. Describe the '''current''' state:&lt;br /&gt;
&lt;br /&gt;
In this case the label will often include a passive verb. For example a button to lock or unlock an element would say &amp;quot;Unlocked&amp;quot; when it is up and &amp;quot;Locked&amp;quot; when it is down. The icon should match the label.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-18T22:04:36Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a combined Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==How to Use==&lt;br /&gt;
&lt;br /&gt;
===Icon and Label===&lt;br /&gt;
&lt;br /&gt;
There are two ways to label a toggle button:&lt;br /&gt;
&lt;br /&gt;
1. Describe the state which is reached when the button is down:&lt;br /&gt;
&lt;br /&gt;
In this case the icon and label should not change when the button is down.&lt;br /&gt;
&lt;br /&gt;
For example a button to toggle the visibility of a sidebar could say &amp;quot;Show Sidebar&amp;quot;. It should still say &amp;quot;Show Sidebar&amp;quot; when the button is down: it should not be changed to &amp;quot;Hide Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to change the button text to &amp;quot;Hide Sidebar&amp;quot; when the sidebar is shown then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
An alternative is to reduce the button to a noun if it is not ambiguous. In this example the button label could be reduced to &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;br /&gt;
&lt;br /&gt;
2. Describe the '''current''' state:&lt;br /&gt;
&lt;br /&gt;
In this case the label will often include a passive verb. For example a button to lock or unlock an element would say &amp;quot;Unlocked&amp;quot; when it is up and &amp;quot;Locked&amp;quot; when it is down. The icon should match the label.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-18T21:39:07Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* When not to Use */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a combined Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==How to Use==&lt;br /&gt;
&lt;br /&gt;
===Label Wording===&lt;br /&gt;
&lt;br /&gt;
Label of toggle buttons can often be reduced to a &amp;quot;noun only&amp;quot; form instead of the classic &amp;quot;verb (+ noun)&amp;quot; used with classic buttons. The &amp;quot;noun only&amp;quot; form should be favored over the &amp;quot;verb (+ noun)&amp;quot; form whenever it does not cause any ambiguity as this form reduces clutter.&lt;br /&gt;
&lt;br /&gt;
Example: A toggle button to show/hide a sidebar can be labeled either &amp;quot;Show Sidebar&amp;quot; or simply &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Icon and Label===&lt;br /&gt;
&lt;br /&gt;
In most cases one should never change the icon or label of a toggle button. A toggle button is very similar to a check box and should thus behave in the same way. The fact that it is pressed down is enough to indicate the current state of the element it represents.&lt;br /&gt;
&lt;br /&gt;
It may make sense in some case to change the icon to reflect the '''current''' state. Think of it like an outdoor light switch with an embedded led to indicate whether the outdoor light is on.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;Sidebar&amp;quot; example, &amp;quot;Show Sidebar&amp;quot; should not be turned into &amp;quot;Hide Sidebar&amp;quot; when the sidebar is visible. If you consider it more explicit to change the icon and label of your button then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-18T21:38:31Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==How to Use==&lt;br /&gt;
&lt;br /&gt;
===Label Wording===&lt;br /&gt;
&lt;br /&gt;
Label of toggle buttons can often be reduced to a &amp;quot;noun only&amp;quot; form instead of the classic &amp;quot;verb (+ noun)&amp;quot; used with classic buttons. The &amp;quot;noun only&amp;quot; form should be favored over the &amp;quot;verb (+ noun)&amp;quot; form whenever it does not cause any ambiguity as this form reduces clutter.&lt;br /&gt;
&lt;br /&gt;
Example: A toggle button to show/hide a sidebar can be labeled either &amp;quot;Show Sidebar&amp;quot; or simply &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Icon and Label===&lt;br /&gt;
&lt;br /&gt;
In most cases one should never change the icon or label of a toggle button. A toggle button is very similar to a check box and should thus behave in the same way. The fact that it is pressed down is enough to indicate the current state of the element it represents.&lt;br /&gt;
&lt;br /&gt;
It may make sense in some case to change the icon to reflect the '''current''' state. Think of it like an outdoor light switch with an embedded led to indicate whether the outdoor light is on.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;Sidebar&amp;quot; example, &amp;quot;Show Sidebar&amp;quot; should not be turned into &amp;quot;Hide Sidebar&amp;quot; when the sidebar is visible. If you consider it more explicit to change the icon and label of your button then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-17T23:24:43Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to Use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to Use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==How to Use==&lt;br /&gt;
&lt;br /&gt;
===Label Wording===&lt;br /&gt;
&lt;br /&gt;
Label of toggle buttons can often be reduced to a &amp;quot;noun only&amp;quot; form instead of the classic &amp;quot;verb (+ noun)&amp;quot; used with classic buttons. The &amp;quot;noun only&amp;quot; form should be favored over the &amp;quot;verb (+ noun)&amp;quot; form whenever it does not cause any ambiguity as this form reduces clutter.&lt;br /&gt;
&lt;br /&gt;
Example: A toggle button to show/hide a sidebar can be labeled either &amp;quot;Show Sidebar&amp;quot; or simply &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Changing Icon and/or Label===&lt;br /&gt;
&lt;br /&gt;
Never change the icon or label of a toggle button. A toggle button is very similar to a check box and should thus behave in the same way. The fact that it is pressed down is enough to indicate the current state of the element it represents.&lt;br /&gt;
&lt;br /&gt;
This means that in the previous example, &amp;quot;Show Sidebar&amp;quot; should not be turned into &amp;quot;Hide Sidebar&amp;quot; when the sidebar is visible. If you consider it more explicit to change the icon and label of your button then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-17T23:01:25Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==How to Use==&lt;br /&gt;
&lt;br /&gt;
===Label Wording===&lt;br /&gt;
&lt;br /&gt;
Label of toggle buttons can often be reduced to a &amp;quot;noun only&amp;quot; form instead of the classic &amp;quot;verb (+ noun)&amp;quot; used with classic buttons. The &amp;quot;noun only&amp;quot; form should be favored over the &amp;quot;verb (+ noun)&amp;quot; form whenever it does not cause any ambiguity as this form reduces clutter.&lt;br /&gt;
&lt;br /&gt;
Example: A toggle button to show/hide a sidebar can be labeled either &amp;quot;Show Sidebar&amp;quot; or simply &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Changing Icon and/or Label===&lt;br /&gt;
&lt;br /&gt;
Never change the icon or label of a toggle button. A toggle button is very similar to a check box and should thus behave in the same way. The fact that it is pressed down is enough to indicate the current state of the element it represents.&lt;br /&gt;
&lt;br /&gt;
This means that in the previous example, &amp;quot;Show Sidebar&amp;quot; should not be turned into &amp;quot;Hide Sidebar&amp;quot; when the sidebar is visible. If you consider it more explicit to change the icon and label of your button then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-17T22:59:40Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Definition==&lt;br /&gt;
&lt;br /&gt;
A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==How to Use==&lt;br /&gt;
&lt;br /&gt;
===Label Wording===&lt;br /&gt;
&lt;br /&gt;
Label of toggle buttons can often be reduced to a &amp;quot;noun only&amp;quot; form instead of the classic &amp;quot;verb (+ noun)&amp;quot; used with classic buttons. The &amp;quot;noun only&amp;quot; form should be favored over the &amp;quot;verb (+ noun)&amp;quot; form whenever it does not cause any ambiguity as this form reduces clutter.&lt;br /&gt;
&lt;br /&gt;
Example: A toggle button to show/hide a sidebar can be labeled either &amp;quot;Show Sidebar&amp;quot; or simply &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Changing Icon and/or Label===&lt;br /&gt;
&lt;br /&gt;
Never change the icon or label of a toggle button. A toggle button is very similar to a check box and should thus behave in the same way. The fact that it is pressed down is enough to indicate the current state of the element it represents.&lt;br /&gt;
&lt;br /&gt;
This means that in the previous example, &amp;quot;Show Sidebar&amp;quot; should not be turned into &amp;quot;Hide Sidebar&amp;quot; when the sidebar is visible. If you consider it more explicit to change the icon and label of your button then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
===Summary===&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-17T22:59:04Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Summary */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==How to Use==&lt;br /&gt;
&lt;br /&gt;
===Label Wording===&lt;br /&gt;
&lt;br /&gt;
Label of toggle buttons can often be reduced to a &amp;quot;noun only&amp;quot; form instead of the classic &amp;quot;verb (+ noun)&amp;quot; used with classic buttons. The &amp;quot;noun only&amp;quot; form should be favored over the &amp;quot;verb (+ noun)&amp;quot; form whenever it does not cause any ambiguity as this form reduces clutter.&lt;br /&gt;
&lt;br /&gt;
Example: A toggle button to show/hide a sidebar can be labeled either &amp;quot;Show Sidebar&amp;quot; or simply &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Changing Icon and/or Label===&lt;br /&gt;
&lt;br /&gt;
Never change the icon or label of a toggle button. A toggle button is very similar to a check box and should thus behave in the same way. The fact that it is pressed down is enough to indicate the current state of the element it represents.&lt;br /&gt;
&lt;br /&gt;
This means that in the previous example, &amp;quot;Show Sidebar&amp;quot; should not be turned into &amp;quot;Hide Sidebar&amp;quot; when the sidebar is visible. If you consider it more explicit to change the icon and label of your button then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
===Summary===&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle-button-summary.png]]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Toggle-button-summary.png</id>
		<title>File:Toggle-button-summary.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Toggle-button-summary.png"/>
				<updated>2010-08-17T22:48:13Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-17T22:38:36Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Icon and label */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==How to Use==&lt;br /&gt;
&lt;br /&gt;
===Label Wording===&lt;br /&gt;
&lt;br /&gt;
Label of toggle buttons can often be reduced to a &amp;quot;noun only&amp;quot; form instead of the classic &amp;quot;verb (+ noun)&amp;quot; used with classic buttons. The &amp;quot;noun only&amp;quot; form should be favored over the &amp;quot;verb (+ noun)&amp;quot; form whenever it does not cause any ambiguity as this form reduces clutter.&lt;br /&gt;
&lt;br /&gt;
Example: A toggle button to show/hide a sidebar can be labeled either &amp;quot;Show Sidebar&amp;quot; or simply &amp;quot;Sidebar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Changing Icon and/or Label===&lt;br /&gt;
&lt;br /&gt;
Never change the icon or label of a toggle button. A toggle button is very similar to a check box and should thus behave in the same way. The fact that it is pressed down is enough to indicate the current state of the element it represents.&lt;br /&gt;
&lt;br /&gt;
This means that in the previous example, &amp;quot;Show Sidebar&amp;quot; should not be turned into &amp;quot;Hide Sidebar&amp;quot; when the sidebar is visible. If you consider it more explicit to change the icon and label of your button then you should use a normal button, not a toggle button.&lt;br /&gt;
&lt;br /&gt;
===Summary===&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-17T22:13:05Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Icon and label */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==Icon and label==&lt;br /&gt;
&lt;br /&gt;
Never change the icon or label of a toggle button. A toggle button is very similar to a check box. It should thus be used in the same way.&lt;br /&gt;
&lt;br /&gt;
The fact that it is pressed down is enough to indicate the current state of the element it represents.&lt;br /&gt;
&lt;br /&gt;
Classic buttons represents an action and their label usually starts with a verb. Label of toggle buttons on the other hand can often be reduced to a noun only. The &amp;quot;noun only&amp;quot; form should be favored over the &amp;quot;verb + noun&amp;quot; form whenever it does not cause any ambiguity as this form reduces clutter.&lt;br /&gt;
&lt;br /&gt;
Example: A toggle button to show/hide a sidebar could be labeled either &amp;quot;Show Sidebar&amp;quot; or simply &amp;quot;Sidebar&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-17T22:07:15Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* How to use */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==Icon and label==&lt;br /&gt;
&lt;br /&gt;
Never change the icon or label of a toggle button. A toggle button is very similar to a check box. It should thus be used in the same way.&lt;br /&gt;
&lt;br /&gt;
The fact that it is pressed down is enough to indicate the current state of the element it represents.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-17T21:58:10Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* When not to use */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a Play/Pause button. It should use a normal button and adjust the icon and label to represent the action which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==How to use==&lt;br /&gt;
&lt;br /&gt;
Never change the icon or label of a toggle button. The fact that it is pressed down is enough to indicate the current state of the element it represents.&lt;br /&gt;
&lt;br /&gt;
Since a toggle button represents a state, in most cases the label should be a noun rather than a verb.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-17T21:57:44Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''.&lt;br /&gt;
&lt;br /&gt;
Example: A word processor should use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==When not to use==&lt;br /&gt;
&lt;br /&gt;
Do not use a toggle button to indicate an '''action'''.&lt;br /&gt;
&lt;br /&gt;
Example: A music player should not use a toggle button to implement a Play/Pause button. It should use a normal button and adjust the icon and label to represent the '''action''' which would be performed when clicked.&lt;br /&gt;
&lt;br /&gt;
==How to use==&lt;br /&gt;
&lt;br /&gt;
Never change the icon or label of a toggle button. The fact that it is pressed down is enough to indicate the current state of the element it represents.&lt;br /&gt;
&lt;br /&gt;
Since a toggle button represents a state, in most cases the label should be a noun rather than a verb.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-17T21:50:33Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* When to use */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a '''state'''. For example a word-processor would use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==Do and don't==&lt;br /&gt;
&lt;br /&gt;
Do not change the icon or label of a toggle button. The fact that it is pressed down is enough.&lt;br /&gt;
&lt;br /&gt;
Since a toggle button represents a state, in most cases the label should be a noun rather than a verb.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons</id>
		<title>Projects/Usability/HIG/Toggle Buttons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Toggle_Buttons"/>
				<updated>2010-08-17T21:49:20Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: Created page with 'A toggle button is a button which stays down when clicked once and goes up when clicked a second time.  ==When to use==  Use a toggle button to indicate a ''state'' rather than a...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A toggle button is a button which stays down when clicked once and goes up when clicked a second time.&lt;br /&gt;
&lt;br /&gt;
==When to use==&lt;br /&gt;
&lt;br /&gt;
Use a toggle button to indicate a ''state'' rather than an ''action''. For example a word-processor would use toggle buttons to indicate the state of &amp;quot;Bold&amp;quot;, &amp;quot;Italic&amp;quot; or &amp;quot;Underline&amp;quot; formatting.&lt;br /&gt;
&lt;br /&gt;
==Do and don't==&lt;br /&gt;
&lt;br /&gt;
Do not change the icon or label of a toggle button. The fact that it is pressed down is enough.&lt;br /&gt;
&lt;br /&gt;
Since a toggle button represents a state, in most cases the label should be a noun rather than a verb.&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG/Form_Label_Alignment</id>
		<title>Projects/Usability/HIG/Form Label Alignment</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG/Form_Label_Alignment"/>
				<updated>2010-06-04T21:04:06Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* Problems with Qt 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;One of the new changes in KDE 4.x since KDE 3.x is the alignment of form and widget labels.  In KDE 3.x, labels were aligned to the left and widgets were aligned to the left.  In KDE 4, form labels are now aligned to the right and widgets are aligned to the left, making a group of form widgets appear to be center aligned.  In Qt4, using a [http://doc.trolltech.com/qformlayout.html QFormLayout] handles this correctly for you.&lt;br /&gt;
&lt;br /&gt;
[[Image:Wiki-alignment-1.png|frame|Example of KDE 3 form alignment]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Wiki-alignment-3.png|frame|Example of KDE4 form alignment]]&lt;br /&gt;
&lt;br /&gt;
== Dialog Alignment ==&lt;br /&gt;
&lt;br /&gt;
In OSX, a group of widgets is center aligned.  In KDE4, a group of widgets is left aligned.  This aligns the labels closer to the left edge and makes use of space more efficiently.  &lt;br /&gt;
&lt;br /&gt;
[[Image:Wiki-alignment-2.png|frame|Example of OSX form alignment]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Wiki-alignment-3.png|frame|Example of KDE4 form alignment]]&lt;br /&gt;
&lt;br /&gt;
The alignment of groups of widgets is independent, and so you may have different sized groups with different &amp;quot;centered&amp;quot; lines.  A group of widgets consists of widgets within some type of natural separation such as a group box or separator bar.&lt;br /&gt;
&lt;br /&gt;
[[Image:Wiki-alignment-4.png|frame|Example of multiple group alignment in KDE4]]&lt;br /&gt;
&lt;br /&gt;
== Checkboxes ==&lt;br /&gt;
&lt;br /&gt;
=== Problems with Qt 4 ===&lt;br /&gt;
&lt;br /&gt;
The checkbox widget in Qt 4 is the input click box on the left and the label on the right.  Unfortunately, it is difficult to create a checkbox with a label on the right of the input click box.  This is a problem because there are common cases when the label on the left of the input click box is better usability.  Until there is a resolution that makes configuring the checkbox label to the left of the input click box easier, use the default checkbox alignment (right aligned label), or if possible, put a right-aligned label next to the checkbox, and set the label of the checkbox to &amp;quot;Enabled&amp;quot;, &amp;quot;On&amp;quot;, or similar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Wiki-alignment-5.png|frame|Example of aligning checkboxes until there Qt offers an option to align the checkbox label to the left.]]&lt;br /&gt;
&lt;br /&gt;
== Aligning Sub-Options ==&lt;br /&gt;
&lt;br /&gt;
When options are subordinate to a checkbox or radiobutton (e.g. Audio level can only be set if the Activate Audio option is selected), this relation should be visualized by indenting the sub-options. There are two options to do so:&lt;br /&gt;
&lt;br /&gt;
# When you are using a left-aligned checkbox or radio button, indent the sub-options by using a horizontal spacer of SizeType &amp;quot;Minimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 [[Image:Wiki-alignment-7.png|frame|Example of aligning sub-options with a horizontal spacer of SizeType &amp;quot;Minimum&amp;quot;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# When you are using a checkbox that is placed right to its label, indent the sub-options in the same vertical axis as the checkbox.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Wiki-alignment-5.png|frame|Example of aligning sub-options with the same vertical axis as the checkbox itself.]]&lt;br /&gt;
&lt;br /&gt;
'''The contents of this guideline are under discussion.  Please request guidance in #kde-usability if you have any questions regardling Form Label Alignment'''&lt;br /&gt;
&lt;br /&gt;
== Grouping related options within a GroupBox ==&lt;br /&gt;
&lt;br /&gt;
In some cases it may be useful to visually separate groups of related options within one GroupBox to facilitate scanning of the dialog.&lt;br /&gt;
&lt;br /&gt;
In that case, put a vertical fixed size spacer of 16px height between the options.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Wiki-alignment-6.png|frame|Example of separating groups of related options with a vertical spacer.]]&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
[Screenshots of example dialog layouts simple and complex]&lt;br /&gt;
&lt;br /&gt;
== More Information ==&lt;br /&gt;
&lt;br /&gt;
[http://www.uxmatters.com/MT/archives/000107.php Label Placement in Forms]&lt;/div&gt;</summary>
		<author><name>Agateau</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.5_Feature_Plan</id>
		<title>Schedules/KDE4/4.5 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.5_Feature_Plan"/>
				<updated>2010-05-29T21:49:28Z</updated>
		
		<summary type="html">&lt;p&gt;Agateau: /* kdegraphics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the SC 4.5 release. &lt;br /&gt;
&lt;br /&gt;
See also: &lt;br /&gt;
&lt;br /&gt;
*[[Schedules/KDE4/4.5 Release Schedule]] &lt;br /&gt;
*[[Schedules/KDE4/4.5 Release Goals]] &lt;br /&gt;
*[[Schedules/KDE4/4.4 Feature Plan]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Legend: &lt;br /&gt;
&lt;br /&gt;
*todo =&amp;amp;gt; not started yet &lt;br /&gt;
*in-progress =&amp;amp;gt; started, but not completed yet &lt;br /&gt;
*done =&amp;amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeaccessibility =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureDone|text-to-speech|Merge kttsd and kttsmgr into one application that sits in the system tray|jpwhiting@kde.org|Jeremy Whiting}} &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= kdeadmin  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|system-config-printer-kde|Restore feature parity with KDEPrint3 where possible.||Jonathan Riddell, John Layt}} &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeartwork  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebase-apps  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|Konqueror|Improvements in session-management|edulix@gmail.com|Eduardo Robles Elvira}} &lt;br /&gt;
{{FeatureTodo|Konqueror|Improvements in tab-bar widget|edulix@gmail.com|Eduardo Robles Elvira}} &lt;br /&gt;
{{FeatureInProgress|Konqueror|New Konqueror bookmarks using Akonadi and Nepomuk, awesome bar|edulix@gmail.com|Eduardo Robles Elvira}} &lt;br /&gt;
{{FeatureInProgress|nspluginviewer|npruntime scripting support|maksim@kde.org|Maks Orlovich}}&lt;br /&gt;
{{FeatureTodo|Konqueror|Add speeddial/thumbnails-like start page|germain@ebooksfrance.org|Germain Garand}} &lt;br /&gt;
{{FeatureDone|Konsole|Finish implementing tab context menu|kurt.hindenburg@gmail.com|Kurt Hindenburg}}&lt;br /&gt;
{{FeatureDone|Konsole|Allow setting tab profile from file on command-line|kurt.hindenburg@gmail.com|Kurt Hindenburg}}&lt;br /&gt;
{{FeatureInProgress|Konsole|Adds support for SHELL_SESSION_ID|kurt.hindenburg@gmail.com|Kurt Hindenburg}}&lt;br /&gt;
{{FeatureDone|Konsole|Modernize menu layout|sasch.pe@gmx.de|Sascha Peilicke}}&lt;br /&gt;
{{FeatureInProgress|Konsole|Move to KTabWidget|sasch.pe@gmx.de|Sascha Peilicke}}&lt;br /&gt;
{{FeatureInProgress|print-manager|New Print manager KCM and applet replacement, using C++|dantti85-pk@yahoo.com.br|Daniel Nicoletti}} &lt;br /&gt;
{{FeatureDone|Dolphin|Drag and drop on tabs|toddrme2178@gmail.com|Todd}}&lt;br /&gt;
{{FeatureDone|Dolphin|Make menus like &amp;quot;View Mode&amp;quot;, &amp;quot;Additional Information&amp;quot; and &amp;quot;Sort By&amp;quot; available as toolbar buttons|toddrme2178@gmail.com|Todd}}&lt;br /&gt;
{{FeatureTodo|Dolphin|Smooth scrolling|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureTodo|Dolphin|Faceted browsing|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin|Make use of additional columns (Symbolic Link Destination, Path or URL) in KFileItemDelegate|frank78@googlemail.com|Frank Reininghaus}} &lt;br /&gt;
{{FeatureDone|Dolphin|Show extended meta data also for files that are not indexed or in the case where Nepomuk is turned off.|peter.penz19@gmail.com|Peter Penz}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebase-runtime  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|KWallet|Single Sign On using PAM|lemma@confuego.org|Michael Leupold}}&lt;br /&gt;
{{FeatureTodo|network kioslave|Backend for LISa|kossebau@kde.org|Friedrich Kossebau}}&lt;br /&gt;
{{FeatureTodo|network kioslave|Backend for SMB|kossebau@kde.org|Friedrich Kossebau}}&lt;br /&gt;
{{FeatureTodo|network kioslave|Integrate with remote and zeroconf kioslaves|kossebau@kde.org|Friedrich Kossebau}}&lt;br /&gt;
{{FeatureTodo|Locale KCM|Add support for new KLocale and KCalendarSystem features (see kdelibs section) including AM/PM, etc.  Improvements to usability of existing money display options.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|Locale KCM|Ability to select more Digit Sets (Bengali, Gujarati, Gurmukhi, Kannada, Khmer, Malayalam, Oriya, Tamil, Telugu and Thai).  Ability to set date formats to include Calendar Era.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|network kioslave|Backend for UPnP|kossebau@kde.org|Friedrich Kossebau}}&lt;br /&gt;
{{FeatureTodo|network kioslave| Backend to discover bluetooth devices and they services |edulix@gmail.com|Eduardo Robles Elvira}}&lt;br /&gt;
{{FeatureInProgress|bluetooth kioslave|Backend to browse bluetooth devices|edulix@gmail.com|Eduardo Robles Elvira}}&lt;br /&gt;
{{FeatureDone|Nepomuk|Monitor file system changes via inotify|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureTodo|KNotify|Route solid errors via knotify to the device notifier|wilderkde@gmail.com|Jacopo De Simoi}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebase-workspace  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | Non-Plasma, Non-KWin &lt;br /&gt;
{{FeatureDone|KInfoCenter|Complete rewrite of KInfoCenter|hubnerd@ntlworld.com|David Hubner}} &lt;br /&gt;
{{FeatureDone|KInfoCenter|Add Export functionality into KInfoCenter|hubnerd@ntlworld.com|David Hubner}}&lt;br /&gt;
{{FeatureDone|DeviceInfo KCM|New DeviceInfo KCM for KInfoCenter|hubnerd@ntlworld.com|David Hubner}}&lt;br /&gt;
{{FeatureDone|Summary KCM|New Summary KCM for KInfoCenter|hubnerd@ntlworld.com|David Hubner}}     &lt;br /&gt;
{{FeatureTodo|Icons KCM|More configurable icon sizes|christoph@maxiom.de|Christoph Feck}} &lt;br /&gt;
{{FeatureTodo|Fonts KCM|More configurable fonts|christoph@maxiom.de|Christoph Feck}} &lt;br /&gt;
{{FeatureTodo|BlueDevil Wizard |Write a new Wizard to pair Bluetooth devices |alex@eyeos.org|Alex Fiestas}} &lt;br /&gt;
{{FeatureTodo|Bluetooth KCM|New KCM to manage all bluetooth configurations and devices|ereslibre@kde.org|Rafael Fernandez}}&lt;br /&gt;
{{FeatureTodo|Screenedges|Screenedges handling outside of kwin/plasma|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Oxygen style|Move window using left-mouse button on windows' empty areas|hugo@oxygen-icons.org|Hugo Pereira Da Costa}}&lt;br /&gt;
{{FeatureDone|Oxygen configuration|Oxygen style and decoration standalone expert configuration tool|hugo@oxygen-icons.org|Hugo Pereira Da Costa}}&lt;br /&gt;
{{FeatureDone|Free Space Notifier Daemon|Small daemon that warns you when your home has almost no space left|knuckles@gmail.com|Ivo Anjo}}&lt;br /&gt;
{{FeatureInProgress|Activities Daemons|Daemons to handle info about activities (kded daemon and a nepomuk service)|ivan.cukic@kde.org|Ivan Cukic}}&lt;br /&gt;
{{FeatureInProgress|Systemsettings|driconf KCM|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureDone|PowerDevil|Display brightness OSD|debfx-kde@fobos.de|Felix Geyer}}&lt;br /&gt;
{{FeatureDone|Keyboard|Merge keyboard hardware and layouts configuration UI|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureDone|Keyboard|Allow adding layouts by language|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureDone|Keyboard|Add keyboard layout indicator plasma applet|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureDone|Keyboard|Allow configuring keyboard model without configuring layouts|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureDone|Keyboard|Allow by-window switching and KDE shortcut without configuring layouts|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
{{FeatureDone|Keyboard|Rewrite keyboard layouts app into kded daemon|arysin@gmail.com|Andriy Rysin}}&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | Plasma &lt;br /&gt;
{{FeatureInProgress|systemtray/taskmanager|port the systray and tasks applet to windows|windows@kde.org|kde windows}}&lt;br /&gt;
{{FeatureInProgress|systemtray|monochrome statusnotifier based systray icons support|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureTodo|systemtray|sort icons by category|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|systemtray|put hidden icons in a popup menu|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureDone|tasks dataengine|export all informations needed to build an applet comparable to the current one|matthieu_gallien@yahoo.fr|Matthieu Gallien}}&lt;br /&gt;
{{FeatureDone|notifications|split systemtray and notifications applet|notmart@gmail.com|Marco Martin}}  &lt;br /&gt;
{{FeatureInProgress|notifications|new look and behaviour for notifications|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureDone|notifications|support for remote applets for notifications|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureDone|netbook/SAL|use QStandardModels|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|netbook/SAL|support for drag and drop of items|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureTodo|netbook/SAL|package manager invocation from the toolbox|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureTodo|netbook/Workspace KCM|New default options for KWin: tabbox as present windows, that will be set as regular grid|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureTodo|libplasma/extenders|put extendergroups in scrollwidgets|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureTodo|libplasma/extenders|possibility to detach exteneritems as standalone windows|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|libplasma/theme|more transparent dialogs when the blur effect is enabled|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|libplasma/desktop|Activity Manager UI|chani@kde.org|Chani}}&lt;br /&gt;
{{FeatureTodo|accounts applet|a plasma widget that is a central place to add accounts to social sites like identica and opendesktop, optimized for the netbook shell|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureTodo|libplasma|Improvements to Calendar/Clock widgets. Improved config ui. Allow multiple holidays on same day. Allow multiple Holiday Regions. Weekends. etc.|john@layt.net|John Layt}} &lt;br /&gt;
{{FeatureTodo|folderview|&amp;quot;Open folder&amp;quot; icon to open folder into pop-up at request instead of automatically.|bigras.bruno@gmail.com|Bruno Bigras}}&lt;br /&gt;
{{FeatureTodo|folderview|Extend the configuration UI for nepomuksearch|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|Extend Calendar DataEngine with Akonadi calendar incidents|Allows to query calendar events/todos from Akonadi in Plasma|gladhornKDEorg|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureDone|calculator|Added optional libqalculate support in the calculator runner|agostinelli@gmail.com|Matteo Agostinelli}}&lt;br /&gt;
{{FeatureInProgress|KRunner|Add some advanced sorting to KRunner using Nepomuk|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureTodo|KRunner|Improve keyboard navigation &amp;amp; command history interaction|wilderkde@gmail.com|Jacopo De Simoi}}&lt;br /&gt;
{{FeatureInProgress|device-notifier|Route all solid error notifications via knotify to the device notifier|wilderkde@gmail.com|Jacopo De Simoi}}&lt;br /&gt;
{{FeatureInProgress|device-notifier|Detailed (HAL) error notifications in the device notifier|wilderkde@gmail.com|Jacopo De Simoi}}&lt;br /&gt;
{{FeatureInProgress|Plasma::Theme|Themed CSS support|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureTodo|battery|Weighted charge information for multiple batteries|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureTodo|Plasma|Welcome plasmoid|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureInProgress|crystal|New desktop search widget|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureInProgress|networkmanagement|Network management Plasmoid|sebas@kde.org|Sebastian Kügler}}&lt;br /&gt;
{{FeatureDone|quicklaunch|Improvements from Ingomar Wesp|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align: center;&amp;quot; colspan=&amp;quot;4&amp;quot; | KWin&lt;br /&gt;
{{FeatureDone|Tiling|Merge window tiling branch|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin|New flag to exclude windows from switchers|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|KCM Decoration|New decoration kcm with previews and GHNS|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Aurorae|Port Aurorae to GraphicsView and KDecoration|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Aurorae|Better themeing support|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Aurorae|Window tabbing support|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Aurorae|Decorations on window sides|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureTodo|Aurorae|Autohiding decoration for maximized windows|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|kwin|hide windows from other activities|chani@kde.org|Chani}}&lt;br /&gt;
{{FeatureTodo|Effects|Move features from present windows to libkwineffects to make them available in desktop grid|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureTodo|Effects|Add close window button to each window in present windows/desktop grid|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureTodo|Window Tabbing/libtaskmanager|Announce window groups to be used for grouping in tasks applet|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureInProgress|KWin/plasma|New window type for Plasma dashboard|kde@martin-graesslin.com|Martin Gräßlin}}&lt;br /&gt;
{{FeatureDone|Effects|New blur effect|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|Effects|High quality scaling shader for the taskbar thumbnails|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureTodo|KWin|Hint for defining the window snap rect|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|Effects|Glide effect for opening and closing windows|iori.yagami.26979@gmail.com|Iori Yagami}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdebindings  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureInProgress|C# bindings|Split the bindings into smaller assemblies, like qyoto-qtcore, qyoto-qtgui, etc..|arno@arnorehn.de|Arno Rehn}}&lt;br /&gt;
{{FeatureInProgress|C# bindings|Auto-generate the assemblies from SMOKE libs|arno@arnorehn.de|Arno Rehn}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= kdeedu  =&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid gray; border-collapse: collapse; text-align: left; width: 100%;&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: rgb(236, 236, 236) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; white-space: nowrap;&amp;quot;&lt;br /&gt;
! Status &lt;br /&gt;
! Project &lt;br /&gt;
! Description &lt;br /&gt;
! Contact &lt;br /&gt;
{{FeatureTodo|KStars|Display Comet Magnitudes whenever possible|akarshsimha@gmail.com|Akarsh Simha}} &lt;br /&gt;
{{FeatureTodo|KStars|Information links in-place for each technical term|akarshsimha@gmail.com|Akarsh Simha}} {{FeatureTodo|KStars|Tool to suggest star-hopping techniques???|akarshsimha@gmail.com|Akarsh Simha}} &lt;br /&gt;
{{FeatureTodo|KStars|Extend conjunction tool to have one object unspecified, but have a genre of objects specified instead|akarshsimha@gmail.com|Akarsh Simha}} &lt;br /&gt;
{{FeatureTodo|KStars|Simulate Lunar Eclipses|akarshsimha@gmail.com|Akarsh Simha}} &lt;br /&gt;
{{FeatureTodo|KStars|Simulate Satellites and Iridium Flares|akarshsimha@gmail.com|Akarsh Simha}} &lt;br /&gt;
{{FeatureTodo|KStars|Social and Geographical Integration for KStars|akarshsimha@gmail.com|Akarsh Simha}} &lt;br /&gt;
{{FeatureTodo|KStars|Marble widget for Geolocation tool|mboquien@free.fr|Médéric Boquien}} &lt;br /&gt;
{{FeatureTodo|KStars|Better printed star charts|kstars@30doradus.org|Jason Harris}} &lt;br /&gt;
{{FeatureTodo|KStars|Better rendering of comets/asteroids|kstars@30doradus.org|Jason Harris}} &lt;br /&gt;
{{FeatureTodo|KStars|Texture mapping of the skymap???|kstars@30doradus.org|Jason Harris}} &lt;br /&gt;
{{FeatureTodo|Kalzium|Port Kalzium to use QGV based periodic table widget|mhanwell@kde.org|Marcus D. Hanwell}}&lt;br /&gt;
{{FeatureTodo|Marble|Add proper support for GPX waypoints, tracks and routes display|anders@alweb.dk|Anders Lund}}&lt;br /&gt;
{{FeatureTodo|Marble|Export map to MxN pixel bitmap|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureTodo|Marble|Map Contents translation|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureDone|Marble|Support OpenStreetMap Nominatim as search backend (MarbleRunner)|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Generalized Animations with GeoDataLookAt support|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|Online-Routing|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureDone|Marble|GPS improvements|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|Maemo Support|earthwings@gentoo.org|Bastian Holst, Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Marble|GeoGraphicsScene for Online Service Plugins|bastianholst@gmx.de|Bastian Holst}}&lt;br /&gt;
{{FeatureInProgress|Marble|Follow XDG Base Directory Specification|bastianholst@gmx.de|Bastian Holst}}&lt;br /&gt;
{{FeatureDone|Marble|Download region|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureInProgress|Marble|Implement sun locator blendings as derived classes of Marble::Blending|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureInProgress|Marble|Configurable texture layer blending|jmho@c-xx.com|Jens-Michael Hoffmann}}&lt;br /&gt;
{{FeatureInProgress|Marble|Import geonames city data|sonu.itbhu@gmail.com|Harshit Jain}}&lt;br /&gt;
{{FeatureInProgress|Marble|Bookmark support|anik.varshney@gmail.com|Kumar Anik Varshney}}&lt;br /&gt;
{{FeatureInProgress|Marble|Various Marble speed improvements|rahn@kde.org|Torsten Rahn, Ariya Hidayat}}&lt;br /&gt;
{{FeatureInProgress|Marble|Plugin to display APRS data|hardaker@users.sourceforge.net|Wes Hardaker}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Type checker for expressions to statically detect errors|aleixpol@kde.org|Aleix Pol}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Support for drawing implicit curves|percy.camilo.ta@gmail.com|Percy Camilo Triveño Aucahuasi}}&lt;br /&gt;
{{FeatureInProgress|Parley|Parley practice mode rewritten|gladhornKDEorg|Daniel Laidig, Frederik Gladhorn}}&lt;br /&gt;
{{FeatureTodo|Parley|LaTeX support|laidig_kde.org|Daniel Laidig}}&lt;br /&gt;
{{FeatureTodo|Parley|Better support for entering synonyms|laidig_kde.org|Benjamin Schleinzer, Daniel Laidig}}&lt;br /&gt;
{{FeatureTodo|Cantor|i