<?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=Icwiener&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=Icwiener&amp;feedformat=atom"/>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Special:Contributions/Icwiener"/>
		<updated>2013-05-24T22:29:48Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.20.2</generator>

	<entry>
		<id>http://techbase.kde.org/Thread:User_talk:Icwiener/thanks/reply</id>
		<title>Thread:User talk:Icwiener/thanks/reply</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Thread:User_talk:Icwiener/thanks/reply"/>
				<updated>2012-06-10T15:55:45Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Reply to thanks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;No problem. :)&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-05-01T16:03:53Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Add porting page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
&lt;br /&gt;
=== Development ===&lt;br /&gt;
[[/Porting_to_libkdegames_v5|Porting to libkdegames v5]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects"/>
				<updated>2012-05-01T16:01:20Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Reverted edits by Icwiener (talk) to last revision by Santa&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects}}&lt;br /&gt;
{{note|KDE TechBase Translators: The Projects part is rather a scratchpad for arbitrary projects. It contains texts like IRC logs and rough ideas. ''It probably does not make sense to translate this''.  If, however, you wish some part to be translated please either email kde-www@kde.org or comment on #kde-www.}}&lt;br /&gt;
&lt;br /&gt;
{{note|These pages are intended for providing technical documentation for external users of various KDE Projects.  For internal project documentation, such as feature plans and meeting minutes please use http://community.kde.org/.}}&lt;br /&gt;
&lt;br /&gt;
= Infrastructure =&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/MovetoGit|KDE migration to git]]&lt;br /&gt;
:KDE is moving from svn to git, find progress, todo list, etc. here.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Organisational =&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[http://www.kde.org/community/getinvolved Get Involved with KDE]&lt;br /&gt;
:General information for getting involved with KDE projects. Includes a mentor directory for many projects.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Release_Team|KDE Release Team]]&lt;br /&gt;
:The KDE Release Team.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Documentation|KDE Documentation Project]]&lt;br /&gt;
:Creating and maintaining KDE documentation.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/kde.org|kde.org]] &lt;br /&gt;
:Information around the *.kde.org websites.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Promo|KDE Promotion]]&lt;br /&gt;
:Promoting KDE and conference organization.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Action_world.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Partners|Partner Program]]&lt;br /&gt;
:KDE partner program targetting ISVs.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Usability | KDE Usability project]]&lt;br /&gt;
: The KDE Usability Project is an initiative to apply usability principles and practices to the K Desktop Environment.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Bugweeks ladybug.png|noframe|left|40px]]||&lt;br /&gt;
;[[Contribute/Bugsquad|KDE BugSquad]]&lt;br /&gt;
:The KDE BugSquad keeps track of incoming bugs in KDE software, and goes through old bugs.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Summer_of_Code|Summer of Code Projects]]&lt;br /&gt;
:Information on Summer of Code projects and prospects related to KDE&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/English Breakfast Network|KDE Code Quality (EBN)]]&lt;br /&gt;
: The English Breakfast Network and associated tools dedicated to KDE Quality, including: KDE API Documentation Validation, User Documentation Validation, Source Code Checking, ...&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KDE Research|KDE Research]]&lt;br /&gt;
: Project and community for everyone who is interested in contributing to (funded) research projects with(in) the KDE community.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Frameworks =&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:logo_oxygen.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Oxygen|The Oxygen Project]] &lt;br /&gt;
:Artwork for KDE4.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/kdelibs|KDE Core Libraries]]&lt;br /&gt;
:For the core developers working on the kdelibs module.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Decibel.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Decibel|Decibel]]&lt;br /&gt;
:Decibel - Realtime communications framework&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KGLEngine2D | KGLEngine2D]]&lt;br /&gt;
: KGLEngine2D is a framework designed to greatly simplify the development of reach multimedia applications on KDE enabled platforms.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KioFuse|KioFuse]]&lt;br /&gt;
: Insert KIO resources (remote, archived or compressed files) into the root filesystem hierarchy.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Nepomuk_logo.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Nepomuk|Nepomuk]]&lt;br /&gt;
:Nepomuk Semantic Desktop project - Annotation/Indexing/Search/Linking&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Action_filequickprint.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/KDEPrint|KDEPrint]]&lt;br /&gt;
:Printing related information for KDE.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:knetworkmanager.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Network_Management|Network Management]]&lt;br /&gt;
: Development on Solid Networking, KNetworkManager applet and configuration tool.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/D-Bus-WS|D-Bus Web Service Proxy]]&lt;br /&gt;
: Fusion of D-Bus services and web services.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Silk | Silk]]&lt;br /&gt;
: Project Silk - Deep integration of the web&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Solid | Solid]]&lt;br /&gt;
: Solid - The KDE Hardware Library&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Kbluetooth | Kbluetooth]]&lt;br /&gt;
: Kbluetooth - The KDE Bluetooth Library (deprecated)&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/kdesu|kdesu]]&lt;br /&gt;
: Considerations and coordination to make kdesu work well with several backends.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Telepathy|Telepathy]]&lt;br /&gt;
:Telepathy Realtime Communication Framework - Instant Messaging, VoIP and Collaboration.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/WebKit|WebKit (webkitkde)]]&lt;br /&gt;
: Project which aims to integrate WebKit (QtWebKit) into KDE.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Widgets and Classes|Widgets &amp;amp; Classes]]&lt;br /&gt;
:Widgets and classes that are not in kdelibs but which you may find useful.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KSecretsService|KSecretsService - managing KDE application's secrets]]&lt;br /&gt;
:Secrets management infrastructure for KDE applications and a collection of related tools, superseding KWallet.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Related|Related Projects]]&lt;br /&gt;
: Projects which are related to KDE in any way, as dependencies or build tools.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Programs =&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Aki128.png|noframe|left|40px]]||&lt;br /&gt;
;[[/Aki | Aki]]&lt;br /&gt;
: Aki - Extensive IRC Client&lt;br /&gt;
|-&lt;br /&gt;
|||&lt;br /&gt;
;[[/Digikam|Digikam]]&lt;br /&gt;
:Digikam - Photo Management Software.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Hisc-apps-kget.svg|noframe|left|40px]]||&lt;br /&gt;
;[[/KGet|KGet]]&lt;br /&gt;
: KGet, a KDE Downloader&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Gwenview|Gwenview]]&lt;br /&gt;
:Gwenview, the image viewer.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:K3b.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/K3b|K3b]]&lt;br /&gt;
:K3B, optical disc writer&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KDevelop4|KDevelop4]]&lt;br /&gt;
:KDevelop4, the KDE IDE.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Knights.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Knights|Knights]]&lt;br /&gt;
:A chess program for the KDE Platform.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Kopete.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Kopete|Kopete]]&lt;br /&gt;
:Kopete, the KDE Instant Messaging program.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Marble.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Marble|Marble]]&lt;br /&gt;
:Marble Desktop Globe - Can You Feel The Earth Spinning?&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Okular|Okular]]&lt;br /&gt;
:Okular, the unified document viewer.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/rekonq | rekonq]]&lt;br /&gt;
: rekonq - A lightweight Web Browser for KDE based on WebKit&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Ktimetracker.png|noframe|left|40px]] ||&lt;br /&gt;
;[[KTimeTracker]]&lt;br /&gt;
:Time management within the KDE PIM.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/SystemSettings|System Settings]]&lt;br /&gt;
: Development on the System Settings configuration tool.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:superkaramba.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/SuperKaramba|SuperKaramba]]&lt;br /&gt;
:SuperKaramba is a tool that allows you to easily create interactive eye-candy on your KDE desktop.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KWin|KWin]]&lt;br /&gt;
: The KDE Window Manager.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Suites =&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Action_book2.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Edu|KDE Education Project]] &lt;br /&gt;
:Developing educational software for KDE.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/extragearReleases|Extragear Releases]]&lt;br /&gt;
: A current list of what extragear apps are to be released in sync with the core KDE release schedule.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KdeFinance | KDE Finance]]&lt;br /&gt;
: KDE Finance is a group of KDE-related financial applications&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Kdegameslogo_40.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Games|KDE Games Project]] &lt;br /&gt;
:Developing desktop's games for KDE.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Action_pencil.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/KOffice|KOffice]] and [http://wiki.koffice.org KOffice.org]&lt;br /&gt;
:Developing an Office suite based on KDE.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Action_pencil.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Calligra/]] and [http://calligra.org Calligra.org]&lt;br /&gt;
:Developing an Office suite for KDE.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Action_mail_generic.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/PIM|KDE PIM Project]]&lt;br /&gt;
:KDE Personal Information Management.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Plasma_logo.jpg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Plasma|Plasma]]&lt;br /&gt;
:Quick and easy creation of widgets. Interactive application launchers, window and task managers, weather checkers; they are all made with plasma.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Kdetoys | Kdetoys]]&lt;br /&gt;
: The Kdetoys project&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:kdeutils-logo.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Utils|KDE Utilities Team]]&lt;br /&gt;
:For the developers working on the kdeutils module.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Necessitas | Necessitas]]&lt;br /&gt;
: Necessitas project&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Platforms =&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:KDE-Mac.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/KDE on Mac OS X|KDE on Mac OS X]]&lt;br /&gt;
: KDE libraries and applications on Mac OS X.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Konqi-win.png|38px]] ||&lt;br /&gt;
;[[/KDE on Windows|KDE on Windows]]&lt;br /&gt;
: KDE libraries and applications on MS Windows.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KDE on Solaris|KDE on Solaris]]&lt;br /&gt;
: KDE libraries and applications on Sun Microsystems Solaris and OpenSolaris.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KDE on FreeBSD|KDE on FreeBSD]]&lt;br /&gt;
: KDE libraries and applications on FreeBSD and other BSDs.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[Projects/Mobile|Mobile]]&lt;br /&gt;
: Project for porting KDE to the Mobile.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects"/>
				<updated>2012-04-27T18:14:00Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Suites */ The KDEGames project page has been moved to http://community.kde.org/KDE_Games&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects}}&lt;br /&gt;
{{note|KDE TechBase Translators: The Projects part is rather a scratchpad for arbitrary projects. It contains texts like IRC logs and rough ideas. ''It probably does not make sense to translate this''.  If, however, you wish some part to be translated please either email kde-www@kde.org or comment on #kde-www.}}&lt;br /&gt;
&lt;br /&gt;
{{note|These pages are intended for providing technical documentation for external users of various KDE Projects.  For internal project documentation, such as feature plans and meeting minutes please use http://community.kde.org/.}}&lt;br /&gt;
&lt;br /&gt;
= Infrastructure =&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/MovetoGit|KDE migration to git]]&lt;br /&gt;
:KDE is moving from svn to git, find progress, todo list, etc. here.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Organisational =&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[http://www.kde.org/community/getinvolved Get Involved with KDE]&lt;br /&gt;
:General information for getting involved with KDE projects. Includes a mentor directory for many projects.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Release_Team|KDE Release Team]]&lt;br /&gt;
:The KDE Release Team.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Documentation|KDE Documentation Project]]&lt;br /&gt;
:Creating and maintaining KDE documentation.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/kde.org|kde.org]] &lt;br /&gt;
:Information around the *.kde.org websites.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Promo|KDE Promotion]]&lt;br /&gt;
:Promoting KDE and conference organization.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Action_world.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Partners|Partner Program]]&lt;br /&gt;
:KDE partner program targetting ISVs.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Usability | KDE Usability project]]&lt;br /&gt;
: The KDE Usability Project is an initiative to apply usability principles and practices to the K Desktop Environment.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Bugweeks ladybug.png|noframe|left|40px]]||&lt;br /&gt;
;[[Contribute/Bugsquad|KDE BugSquad]]&lt;br /&gt;
:The KDE BugSquad keeps track of incoming bugs in KDE software, and goes through old bugs.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Summer_of_Code|Summer of Code Projects]]&lt;br /&gt;
:Information on Summer of Code projects and prospects related to KDE&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/English Breakfast Network|KDE Code Quality (EBN)]]&lt;br /&gt;
: The English Breakfast Network and associated tools dedicated to KDE Quality, including: KDE API Documentation Validation, User Documentation Validation, Source Code Checking, ...&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KDE Research|KDE Research]]&lt;br /&gt;
: Project and community for everyone who is interested in contributing to (funded) research projects with(in) the KDE community.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Frameworks =&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:logo_oxygen.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Oxygen|The Oxygen Project]] &lt;br /&gt;
:Artwork for KDE4.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Klogo-official-crystal.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/kdelibs|KDE Core Libraries]]&lt;br /&gt;
:For the core developers working on the kdelibs module.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Decibel.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Decibel|Decibel]]&lt;br /&gt;
:Decibel - Realtime communications framework&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KGLEngine2D | KGLEngine2D]]&lt;br /&gt;
: KGLEngine2D is a framework designed to greatly simplify the development of reach multimedia applications on KDE enabled platforms.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KioFuse|KioFuse]]&lt;br /&gt;
: Insert KIO resources (remote, archived or compressed files) into the root filesystem hierarchy.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Nepomuk_logo.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Nepomuk|Nepomuk]]&lt;br /&gt;
:Nepomuk Semantic Desktop project - Annotation/Indexing/Search/Linking&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Action_filequickprint.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/KDEPrint|KDEPrint]]&lt;br /&gt;
:Printing related information for KDE.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:knetworkmanager.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Network_Management|Network Management]]&lt;br /&gt;
: Development on Solid Networking, KNetworkManager applet and configuration tool.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/D-Bus-WS|D-Bus Web Service Proxy]]&lt;br /&gt;
: Fusion of D-Bus services and web services.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Silk | Silk]]&lt;br /&gt;
: Project Silk - Deep integration of the web&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Solid | Solid]]&lt;br /&gt;
: Solid - The KDE Hardware Library&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Kbluetooth | Kbluetooth]]&lt;br /&gt;
: Kbluetooth - The KDE Bluetooth Library (deprecated)&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/kdesu|kdesu]]&lt;br /&gt;
: Considerations and coordination to make kdesu work well with several backends.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Telepathy|Telepathy]]&lt;br /&gt;
:Telepathy Realtime Communication Framework - Instant Messaging, VoIP and Collaboration.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/WebKit|WebKit (webkitkde)]]&lt;br /&gt;
: Project which aims to integrate WebKit (QtWebKit) into KDE.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Widgets and Classes|Widgets &amp;amp; Classes]]&lt;br /&gt;
:Widgets and classes that are not in kdelibs but which you may find useful.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KSecretsService|KSecretsService - managing KDE application's secrets]]&lt;br /&gt;
:Secrets management infrastructure for KDE applications and a collection of related tools, superseding KWallet.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Related|Related Projects]]&lt;br /&gt;
: Projects which are related to KDE in any way, as dependencies or build tools.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Programs =&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Aki128.png|noframe|left|40px]]||&lt;br /&gt;
;[[/Aki | Aki]]&lt;br /&gt;
: Aki - Extensive IRC Client&lt;br /&gt;
|-&lt;br /&gt;
|||&lt;br /&gt;
;[[/Digikam|Digikam]]&lt;br /&gt;
:Digikam - Photo Management Software.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Hisc-apps-kget.svg|noframe|left|40px]]||&lt;br /&gt;
;[[/KGet|KGet]]&lt;br /&gt;
: KGet, a KDE Downloader&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Gwenview|Gwenview]]&lt;br /&gt;
:Gwenview, the image viewer.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:K3b.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/K3b|K3b]]&lt;br /&gt;
:K3B, optical disc writer&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KDevelop4|KDevelop4]]&lt;br /&gt;
:KDevelop4, the KDE IDE.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Knights.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Knights|Knights]]&lt;br /&gt;
:A chess program for the KDE Platform.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Kopete.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Kopete|Kopete]]&lt;br /&gt;
:Kopete, the KDE Instant Messaging program.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Marble.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/Marble|Marble]]&lt;br /&gt;
:Marble Desktop Globe - Can You Feel The Earth Spinning?&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Okular|Okular]]&lt;br /&gt;
:Okular, the unified document viewer.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/rekonq | rekonq]]&lt;br /&gt;
: rekonq - A lightweight Web Browser for KDE based on WebKit&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Ktimetracker.png|noframe|left|40px]] ||&lt;br /&gt;
;[[KTimeTracker]]&lt;br /&gt;
:Time management within the KDE PIM.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/SystemSettings|System Settings]]&lt;br /&gt;
: Development on the System Settings configuration tool.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:superkaramba.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/SuperKaramba|SuperKaramba]]&lt;br /&gt;
:SuperKaramba is a tool that allows you to easily create interactive eye-candy on your KDE desktop.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KWin|KWin]]&lt;br /&gt;
: The KDE Window Manager.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Suites =&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Action_book2.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Edu|KDE Education Project]] &lt;br /&gt;
:Developing educational software for KDE.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/extragearReleases|Extragear Releases]]&lt;br /&gt;
: A current list of what extragear apps are to be released in sync with the core KDE release schedule.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KdeFinance | KDE Finance]]&lt;br /&gt;
: KDE Finance is a group of KDE-related financial applications&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Action_pencil.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/KOffice|KOffice]] and [http://wiki.koffice.org KOffice.org]&lt;br /&gt;
:Developing an Office suite based on KDE.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Action_pencil.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Calligra/]] and [http://calligra.org Calligra.org]&lt;br /&gt;
:Developing an Office suite for KDE.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Action_mail_generic.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/PIM|KDE PIM Project]]&lt;br /&gt;
:KDE Personal Information Management.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Plasma_logo.jpg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Plasma|Plasma]]&lt;br /&gt;
:Quick and easy creation of widgets. Interactive application launchers, window and task managers, weather checkers; they are all made with plasma.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Kdetoys | Kdetoys]]&lt;br /&gt;
: The Kdetoys project&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:kdeutils-logo.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[/Utils|KDE Utilities Team]]&lt;br /&gt;
:For the developers working on the kdeutils module.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/Necessitas | Necessitas]]&lt;br /&gt;
: Necessitas project&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Platforms =&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:KDE-Mac.png|noframe|left|40px]] ||&lt;br /&gt;
;[[/KDE on Mac OS X|KDE on Mac OS X]]&lt;br /&gt;
: KDE libraries and applications on Mac OS X.&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Konqi-win.png|38px]] ||&lt;br /&gt;
;[[/KDE on Windows|KDE on Windows]]&lt;br /&gt;
: KDE libraries and applications on MS Windows.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KDE on Solaris|KDE on Solaris]]&lt;br /&gt;
: KDE libraries and applications on Sun Microsystems Solaris and OpenSolaris.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[/KDE on FreeBSD|KDE on FreeBSD]]&lt;br /&gt;
: KDE libraries and applications on FreeBSD and other BSDs.&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
;[[Projects/Mobile|Mobile]]&lt;br /&gt;
: Project for porting KDE to the Mobile.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-04-27T18:07:57Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Remove empty section.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/Pre DevDays 2009 Sprint|Sprint prior to Qt Developer Days 2009 in Munich]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-04-27T17:43:53Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Remove empty section.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
&lt;br /&gt;
* [[/Akademy 2008 Notes|Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/Pre DevDays 2009 Sprint|Sprint prior to Qt Developer Days 2009 in Munich]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-04-27T17:38:58Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Development */ Delete linkt to empty page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
* [[/Proposed_Games|Proposed new games]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
&lt;br /&gt;
* [[/Akademy 2008 Notes|Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/Pre DevDays 2009 Sprint|Sprint prior to Qt Developer Days 2009 in Munich]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-04-27T17:35:02Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Remove obsolete links.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
* [[/Proposed_Games|Proposed new games]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
&lt;br /&gt;
* [[/Akademy 2008 Notes|Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/Pre DevDays 2009 Sprint|Sprint prior to Qt Developer Days 2009 in Munich]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-04-27T17:26:16Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* The Game Categories */ Remove empty page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
* [[/Proposed_Games|Proposed new games]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
&lt;br /&gt;
* [[/Akademy 2008 Notes|Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/Pre DevDays 2009 Sprint|Sprint prior to Qt Developer Days 2009 in Munich]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-04-27T17:21:04Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Development */ Page moved to community.kde.org&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
* [[/Proposed_Games|Proposed new games]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
&lt;br /&gt;
* [[/Akademy 2008 Notes|Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/Pre DevDays 2009 Sprint|Sprint prior to Qt Developer Days 2009 in Munich]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Getting_Started/Build/Distributions/Linux_From_Scratch</id>
		<title>Getting Started/Build/Distributions/Linux From Scratch</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Getting_Started/Build/Distributions/Linux_From_Scratch"/>
				<updated>2012-04-19T02:48:59Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: code -&amp;gt; syntaxhighlight&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Getting_Started/Build/Distributions/LFS}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Getting Started|&lt;br /&gt;
&lt;br /&gt;
name=Building KDE4 From Source (Linux From Scratch requirements)&lt;br /&gt;
&lt;br /&gt;
NOTE: This page is a little out of date.  I will be working on it.  You might also want to consult the current SVN of Beyond Linux from Scratch for current package versions and build information.|&lt;br /&gt;
&lt;br /&gt;
pre=[[Getting_Started/Build|Build KDE]], [[Getting_Started/Tutorials/D-Bus/Configuration|D-Bus Configuration]]|&lt;br /&gt;
next=[[Getting_Started/Build|Build KDE]]|&lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake |Introduction to CMake]]|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== CMake ==&lt;br /&gt;
&lt;br /&gt;
KDE-4 and some supporting libraries use CMake.&lt;br /&gt;
&lt;br /&gt;
Install the latest version from cmake.org&lt;br /&gt;
&lt;br /&gt;
== Library Requirements ==&lt;br /&gt;
&lt;br /&gt;
===General dependencies===&lt;br /&gt;
&lt;br /&gt;
KDE-4 requires a lot of the same general purpose libraries as KDE-3.&lt;br /&gt;
&lt;br /&gt;
The output from running CMake should list what you are missing -- which generally applicable libraries that you need which I will not discuss further.&lt;br /&gt;
&lt;br /&gt;
===DBus and HAL===&lt;br /&gt;
&lt;br /&gt;
A system should have these installed:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;DBus&lt;br /&gt;
::DBus-Glib&lt;br /&gt;
::HAL&lt;br /&gt;
::HAL-Info&lt;br /&gt;
::PolicyKit-0.9&lt;br /&gt;
::EggDBus&lt;br /&gt;
::polkit&lt;br /&gt;
::ConsoleKit&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(and properly configured) although, strictly speaking, they are not all dependencies for KDE-4.x.&lt;br /&gt;
&lt;br /&gt;
See: [http://www.linuxfromscratch.org/blfs/view/svn BLFS] for build and configure instructions.&lt;br /&gt;
&lt;br /&gt;
HAL, PolicyKit &amp;amp; EggDBus  are being phased out and may not be needed. &lt;br /&gt;
&lt;br /&gt;
Newer versions of KDE-4.x should install:&lt;br /&gt;
&lt;br /&gt;
::udev&lt;br /&gt;
::upower&lt;br /&gt;
::udisks&lt;br /&gt;
&lt;br /&gt;
HOWEVER, KDE-4 and KDESupport libraries may need newer versions of the libraries than those in BLFS.  So, it is probably best to install the versions stated above or the latest releases of these dependencies rather than the versions in BLFS.&lt;br /&gt;
&lt;br /&gt;
Some of these libraries are dependent on:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;Linux-PAM&lt;br /&gt;
::Shadow&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which should be installed and configured according to the BLFS instructions.&lt;br /&gt;
&lt;br /&gt;
===DocBook DTD===&lt;br /&gt;
&lt;br /&gt;
KDE-4 still requires version 4.2 of:&lt;br /&gt;
&lt;br /&gt;
::DocBook SGML DTD&lt;br /&gt;
::DocBook XML DTD.&lt;br /&gt;
&lt;br /&gt;
See the instructions in this old version of BLFS:&lt;br /&gt;
&lt;br /&gt;
::http://archive.linuxfromscratch.org/blfs-museum/5.0/BLFS-5.0/&lt;br /&gt;
&lt;br /&gt;
===Boost C++ Libraries===&lt;br /&gt;
&lt;br /&gt;
Get the current release (e.g. boost_1_42_0.tar.gz) here:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/boost/files/boost/&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
The current release eliminates the arcane naming issues.  Although not the same as using autotools, it is now simple to build and install.&lt;br /&gt;
&lt;br /&gt;
Remove the includes from previous versions:&lt;br /&gt;
&lt;br /&gt;
::/usr/include/boost_&amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and if you have a link:&lt;br /&gt;
&lt;br /&gt;
::/usr/include/boost&lt;br /&gt;
&lt;br /&gt;
remove that also.&lt;br /&gt;
&lt;br /&gt;
Then:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./bootstrap.sh --prefix=/usr&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./b2 install link=shared&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLucene===&lt;br /&gt;
Current KDE-4 works with the current release available here:&lt;br /&gt;
&lt;br /&gt;
::http://downloads.sourceforge.net/project/clucene/&lt;br /&gt;
&lt;br /&gt;
Use CMake to build it.&lt;br /&gt;
&lt;br /&gt;
===Qt===&lt;br /&gt;
&lt;br /&gt;
=====TRUNK=====&lt;br /&gt;
&lt;br /&gt;
Use kde-qt from:&lt;br /&gt;
&lt;br /&gt;
::git clone git://gitorious.org/+kde-developers/qt/kde-qt.git&lt;br /&gt;
&lt;br /&gt;
This installs as Qt-&amp;lt;version&amp;gt;, so when it updates to the next version, it won't install in the same place.  This means that you will need to change the &amp;lt;version&amp;gt; any place where it is specified.  You will also have to install QCA (and its plugins) again when the version changes.&lt;br /&gt;
&lt;br /&gt;
=====KDE &amp;gt;= 4.4=====&lt;br /&gt;
&lt;br /&gt;
You can use the GIT clone [see TRUNK above], or your can use the latest release of QT-4.x.y from Nokia:&lt;br /&gt;
&lt;br /&gt;
::http://qt.nokia.com/downloads/linux-x11-cpp&lt;br /&gt;
&lt;br /&gt;
=====BRANCH up to 4.3 or a release up to 4.3.x=====&lt;br /&gt;
&lt;br /&gt;
Use 4.5.3:&lt;br /&gt;
&lt;br /&gt;
::http://qt.nokia.com/downloads/downloads#lgpl&lt;br /&gt;
&lt;br /&gt;
Or a newer release (see above).  A newer release may have issues.&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
You will probably need to use some options for configuring Qt.  Various options may be appropriate and/or needed depending on your system, what you have installed, and where it is installed.  Run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./configure --help&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see the options.  There are a lot of them, but the defaults work for most of them.&lt;br /&gt;
&lt;br /&gt;
Suggested configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./configure -no-separate-debug-info -plugin-sql-mysql -I/usr/include/mysql -plugin-sql-sqlite -optimized-qmake -nomake demos -nomake examples -fast -dbus&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{change the include directory for mysql as needed}&lt;br /&gt;
&lt;br /&gt;
If installing Phonon from KDESupport (recommended), or other separate Phonon, add the configure option:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;-no-phonon&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to avoid having two versions of libraries with the same SO number.&lt;br /&gt;
&lt;br /&gt;
===QCA-2.0.2 (crypto add on for Qt)===&lt;br /&gt;
&lt;br /&gt;
Do not use the one in KDESupport or KDE's SVN.&lt;br /&gt;
&lt;br /&gt;
Download the current release of qca from:&lt;br /&gt;
&lt;br /&gt;
::http://delta.affinix.com/download/qca/2.0/&lt;br /&gt;
&lt;br /&gt;
and the plugins:&lt;br /&gt;
&lt;br /&gt;
::qca-cyrus-sasl&lt;br /&gt;
::qca-gnupg&lt;br /&gt;
::qca-ossl&lt;br /&gt;
&lt;br /&gt;
from:&lt;br /&gt;
&lt;br /&gt;
::http://delta.affinix.com/download/qca/2.0/plugins/&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
NOTE: qca-ossl-2.0.0-beta3 may not build against older releases of OpenSSL without being patched:&lt;br /&gt;
&lt;br /&gt;
::http://home.earthlink.net/~tyrerj/kde/KDE-4/qca-ossl.patch&lt;br /&gt;
&lt;br /&gt;
For current releases, be sure to enable MD2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;enable-md2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
when building OpenSSL.&lt;br /&gt;
&lt;br /&gt;
Check the BLFS SVN for a possible corrections to the build scripts.&lt;br /&gt;
&lt;br /&gt;
Set the: &amp;quot;QTDIR&amp;quot; environment variable correctly and then build QCA with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./configure --prefix=$QTDIR&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;make install&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then build the plugins with&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./configure&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;make&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;make install&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LibDBusMenu-Qt===&lt;br /&gt;
&lt;br /&gt;
Required for KDE &amp;gt;= 4.5.0.  Appears to be optional for KDE-4.4.&lt;br /&gt;
&lt;br /&gt;
Get current release here:&lt;br /&gt;
&lt;br /&gt;
::https://launchpad.net/libdbusmenu-qt/+download&lt;br /&gt;
&lt;br /&gt;
and the current release of the dependency QJson here:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/qjson/files/&lt;br /&gt;
&lt;br /&gt;
===GMM===&lt;br /&gt;
&lt;br /&gt;
If you don't have Getfem++ installed, get the current release of GMM from:&lt;br /&gt;
&lt;br /&gt;
::http://home.gna.org/getfem/download.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Eigen2===&lt;br /&gt;
&lt;br /&gt;
Get the current 2.0.x release from:&lt;br /&gt;
&lt;br /&gt;
::http://eigen.tuxfamily.org&lt;br /&gt;
&lt;br /&gt;
===Java Development Kit===&lt;br /&gt;
&lt;br /&gt;
You need a Java compiler with JNI to build the Sesame2 storage backend for Soprano and a Java RunTime (JVM) to run it.&lt;br /&gt;
&lt;br /&gt;
::http://java.sun.com/javase/downloads/widget/jdk6.jsp&lt;br /&gt;
&lt;br /&gt;
Remember to add the &amp;quot;bin&amp;quot; directory to your path and the &amp;quot;lib&amp;quot; directory to your &amp;quot;/etc/ld.so.conf&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
===Raptor, Rasqal, and Redland===&lt;br /&gt;
&lt;br /&gt;
Get the current releases of:&lt;br /&gt;
&lt;br /&gt;
::redland&lt;br /&gt;
::rasqal&lt;br /&gt;
::raptor2&lt;br /&gt;
&lt;br /&gt;
From:&lt;br /&gt;
&lt;br /&gt;
::http://download.librdf.org/source/&lt;br /&gt;
&lt;br /&gt;
and the current release of the (optional) Redland dependency 3Store here:&lt;br /&gt;
&lt;br /&gt;
::http://downloads.sourceforge.net/project/threestore/files/&lt;br /&gt;
&lt;br /&gt;
Note: If 3store3-3.0.17 will not build against Rasqal, then skip it for now -- it is optional.&lt;br /&gt;
&lt;br /&gt;
When building Redland, you might need to use:&lt;br /&gt;
&lt;br /&gt;
::--with-bdb=&lt;br /&gt;
&lt;br /&gt;
to point to your Berkeley DB directory.&lt;br /&gt;
&lt;br /&gt;
If Redland won't build against SQLite, be sure you have the current &amp;gt;= 3.7.3 installed:&lt;br /&gt;
&lt;br /&gt;
Install in this order:&lt;br /&gt;
&lt;br /&gt;
::Raptor&lt;br /&gt;
::Rasqal&lt;br /&gt;
::Redland&lt;br /&gt;
&lt;br /&gt;
===Virtuoso Open-Source===&lt;br /&gt;
&lt;br /&gt;
Only needed for KDE &amp;gt;= 4.4 and TRUNK&lt;br /&gt;
&lt;br /&gt;
Get virtuoso-opensource &amp;gt;= 6.1.1 here:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/virtuoso/&lt;br /&gt;
&lt;br /&gt;
If you have problems, use the direct link:&lt;br /&gt;
&lt;br /&gt;
::http://downloads.sourceforge.net/project/virtuoso/virtuoso/6.1.1/virtuoso-opensource-6.1.1.tar.gz&lt;br /&gt;
&lt;br /&gt;
and the current release of the dependency iODBC here:&lt;br /&gt;
&lt;br /&gt;
::http://www.iodbc.org/dataspace/iodbc/wiki/iODBC/Downloads&lt;br /&gt;
&lt;br /&gt;
If building iODBC only for KDE, use configure parameter:&lt;br /&gt;
&lt;br /&gt;
::--disable-gui&lt;br /&gt;
&lt;br /&gt;
For building Virtuoso, these configure parameters are useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;--with-jdk4=&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;--without-internal-zlib&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;--with-pthreads&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;--with-readline&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;--with-iodbc=&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check the BLFS SVN for other parameters.&lt;br /&gt;
&lt;br /&gt;
If building Virtuoso only for KDE, (to save disk space) use configure parameters:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;--disable-all-vads&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;--disable-static&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===KDE Supporting dependencies===&lt;br /&gt;
&lt;br /&gt;
=====TRUNK=====&lt;br /&gt;
&lt;br /&gt;
use KDESupport:&lt;br /&gt;
&lt;br /&gt;
::svn co svn://anonsvn.kde.org/home/kde/trunk/kdesupport&lt;br /&gt;
&lt;br /&gt;
If you don't want to install all the small SVN icons:&lt;br /&gt;
&lt;br /&gt;
::cd kdesupport/oxygen-icons&lt;br /&gt;
::svn rm `find -name &amp;quot;small&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
=====KDE 4.6=====&lt;br /&gt;
&lt;br /&gt;
There is no KDESupport-4.6 so, you need to install these packages with:&lt;br /&gt;
&lt;br /&gt;
::CMAKE_INSTALL_PREFIX:PATH=/opt/KDE-4.6 for the BRANCH.&lt;br /&gt;
&lt;br /&gt;
Or:&lt;br /&gt;
&lt;br /&gt;
::CMAKE_INSTALL_PREFIX:PATH=/opt/KDE-4.6.x for a release.&lt;br /&gt;
&lt;br /&gt;
======Automoc4======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/automoc4/&amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Attica======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/attica&lt;br /&gt;
&lt;br /&gt;
======Polkit-Qt======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/apps/KDE4.x/admin&lt;br /&gt;
&lt;br /&gt;
======Polkit-Qt-1======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/apps/KDE4.x/admin&lt;br /&gt;
&lt;br /&gt;
======Soprano======&lt;br /&gt;
&lt;br /&gt;
Available from Source Forge:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/soprano/&lt;br /&gt;
&lt;br /&gt;
======Akonadi======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::http://download.akonadi-project.org&lt;br /&gt;
&lt;br /&gt;
======Cagibi======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/cagibi&lt;br /&gt;
&lt;br /&gt;
======Strigi======&lt;br /&gt;
&lt;br /&gt;
Available from SourceForge:&lt;br /&gt;
&lt;br /&gt;
::http://downloads.sourceforge.net/strigi&lt;br /&gt;
&lt;br /&gt;
======QImageBlitz======&lt;br /&gt;
&lt;br /&gt;
Available from Source Forge:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/qimageblitz/files/qimageblitz&lt;br /&gt;
&lt;br /&gt;
=====KDE 4.4 &amp;amp; 4.5=====&lt;br /&gt;
&lt;br /&gt;
Use KDESupport:&lt;br /&gt;
&lt;br /&gt;
::svn co svn://anonsvn.kde.org/home/kde/tags/kdesupport-for-&amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This does not include: Ontologies.  See below.&lt;br /&gt;
&lt;br /&gt;
=====BRANCH up to 4.3 or a release up to 4.3.x=====&lt;br /&gt;
&lt;br /&gt;
Use the KDESupport SVN tag that matches your KDE version.  E.G. for 4.3:&lt;br /&gt;
&lt;br /&gt;
::svn&amp;amp;nbsp;co&amp;amp;nbsp;svn://anonsvn.kde.org/home/kde/tags/kdesupport-for-4.3/kdesupport&lt;br /&gt;
&lt;br /&gt;
=====TagLib=====&lt;br /&gt;
&lt;br /&gt;
Since TagLib is also a dependency for GStreamer (gst-plugins-good), you probably don't want to have a redundant installation for the KDE-4 version that will be your 'production' version.  Remove it from KDESupport SVN:&lt;br /&gt;
&lt;br /&gt;
::svn rm taglib&lt;br /&gt;
&lt;br /&gt;
And install the current release from:&lt;br /&gt;
&lt;br /&gt;
::http://developer.kde.org/~wheeler/taglib.html&lt;br /&gt;
&lt;br /&gt;
NOTE: To get GST Plugins Good to build the plugin for TagLib you need to set the environment variable:&lt;br /&gt;
&lt;br /&gt;
::HAVE_CXX=&amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
before you run: &amp;quot;configure&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=====QCA=====&lt;br /&gt;
&lt;br /&gt;
The QCA in KDESupport is not currently used (see QCA-2.0.2 above) so:&lt;br /&gt;
&lt;br /&gt;
::svn rm qca&lt;br /&gt;
&lt;br /&gt;
=====Phonon=====&lt;br /&gt;
&lt;br /&gt;
For KDE Support 4.5 and TRUNK:&lt;br /&gt;
&lt;br /&gt;
Do not use the version in KDE Support.  Remove if from KDE Support:&lt;br /&gt;
&lt;br /&gt;
::svn rm phonon&lt;br /&gt;
&lt;br /&gt;
See below&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
The current KDESupport may not be compatible with LFS installed FFmpeg.  Use this patch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;diff&amp;quot;&amp;gt;&lt;br /&gt;
Index: strigi/src/streamanalyzer/endplugins/CMakeLists.txt&lt;br /&gt;
--- strigi/src/streamanalyzer/endplugins/CMakeLists.txt (revision 1096146)&lt;br /&gt;
+++ strigi/src/streamanalyzer/endplugins/CMakeLists.txt (working copy)&lt;br /&gt;
@@ -34,9 +34,3 @@&lt;br /&gt;
   target_link_libraries(xine ${XINE_LIBRARY})&lt;br /&gt;
 endif(XINE_FOUND)&lt;br /&gt;
 &lt;br /&gt;
-if(FFMPEG_FOUND)&lt;br /&gt;
-  include_directories(${FFMPEG_INCLUDE_DIRS})&lt;br /&gt;
-  ADD_STRIGIEA(ffmpeg ffmpegendanalyzer.cpp)&lt;br /&gt;
-  #set_target_properties( ffmpeg PROPERTIES COMPILE_FLAGS &amp;quot;${FFMPEG_DEFINITIONS}&amp;quot; )&lt;br /&gt;
-  target_link_libraries(ffmpeg ${FFMPEG_LIBRARIES})&lt;br /&gt;
-endif(FFMPEG_FOUND)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, use the FFmpeg snapshot on the CBLFS page:&lt;br /&gt;
&lt;br /&gt;
::http://cblfs.cross-lfs.org/index.php/FFmpeg&lt;br /&gt;
&lt;br /&gt;
This more recent snapshot requires: &amp;quot;libx264.so.83&amp;quot;.  The x264 snapshot on CBFLS is too old. This Source RPM worked:&lt;br /&gt;
&lt;br /&gt;
::x264-0.83.2245-1plf2010.1.src.rpm&lt;br /&gt;
&lt;br /&gt;
Google is your friend.&lt;br /&gt;
&lt;br /&gt;
NOTE: You may need to add these parameters to the CMake command line:&lt;br /&gt;
&lt;br /&gt;
::-DENABLE_FAM:BOOL=ON&lt;br /&gt;
::-DENABLE_EXPAT:BOOL=ON&lt;br /&gt;
::-DENABLE_INOTIFY:BOOL=ON&lt;br /&gt;
::-DGAIM_LIBS:STRING=&amp;lt;path&amp;gt;/lib&lt;br /&gt;
::-DGAMIN_LIBRARIES:STRING=&amp;lt;path&amp;gt;/lib&lt;br /&gt;
&lt;br /&gt;
You must build with the same CMake parameters as the KDE-4 modules; specifically:&lt;br /&gt;
 &lt;br /&gt;
::-DCMAKE_INSTALL_PREFIX:PATH=/opt/KDE-&amp;lt;version&amp;gt;&lt;br /&gt;
::-DSYSCONF_INSTALL_DIR=/etc/kde-&amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ontologies===&lt;br /&gt;
&lt;br /&gt;
Required for KDE &amp;gt;= 4.4 and TRUNK.&lt;br /&gt;
&lt;br /&gt;
If you checked out KDESupport from TRUNK, you have the package.  Otherwise, get TRUNK here:&lt;br /&gt;
&lt;br /&gt;
::git clone git://oscaf.git.sourceforge.net/gitroot/oscaf/oscaf&lt;br /&gt;
 &lt;br /&gt;
Or the release from Source Forge:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/oscaf/files/shared-desktop-ontologies/&lt;br /&gt;
&lt;br /&gt;
and install with CMake with:&lt;br /&gt;
&lt;br /&gt;
:CMAKE_INSTALL_PREFIX:PATH=/usr&lt;br /&gt;
&lt;br /&gt;
===Phonon===&lt;br /&gt;
&lt;br /&gt;
=====TRUNK=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Phonon&amp;lt;/b&amp;gt; has been moved to &lt;br /&gt;
&lt;br /&gt;
::http://gitorious.org/phonon&lt;br /&gt;
&lt;br /&gt;
Get it with the command:&lt;br /&gt;
&lt;br /&gt;
::git clone git://gitorious.org/phonon/phonon.git&lt;br /&gt;
&lt;br /&gt;
=====KDE &amp;gt;= 4.5=====&lt;br /&gt;
&lt;br /&gt;
The current release of Phonon is available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/phonon/&amp;lt;version&amp;gt;/src&lt;br /&gt;
&lt;br /&gt;
Also install back ends as needed.  You must install a back end -- either GStreamer or Xine for Linux.  They are available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/phonon/phonon-backend-&amp;lt;name&amp;gt;/4.4.4/&amp;lt;version&amp;gt;/src&lt;br /&gt;
&lt;br /&gt;
Where &amp;lt;name&amp;gt; is one of:&lt;br /&gt;
&lt;br /&gt;
:directshow&lt;br /&gt;
:gstreamer&lt;br /&gt;
:vlc&lt;br /&gt;
:xine&lt;br /&gt;
&lt;br /&gt;
=====KDE-4.4=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;big&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;KDEBindings-4.4.x will not build against Phonon from the GIT repository.&amp;lt;/font&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use the version in KDESupport-4.4.&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
Install with:&lt;br /&gt;
&lt;br /&gt;
::CMAKE_INSTALL_PREFIX=$QTDIR &lt;br /&gt;
&lt;br /&gt;
and the rest of the CMake parameters the same as KDESupport or Supporting dependencies.&lt;br /&gt;
&lt;br /&gt;
===PolKit-KDE-1===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====KDE &amp;gt;= 4.4 and TRUNK=====&lt;br /&gt;
&lt;br /&gt;
Use:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/apps/KDE4.x/admin/polkit-kde-1-0.95.1.tar.bz2&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
The 0.95.1 tarball from the KDE FTP site will not install correctly.  You need to apply this patch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;diff&amp;quot;&amp;gt;&lt;br /&gt;
diff -Naur polkit-kde-1-0.95.1.old/agent/CMakeLists.txt polkit-kde-1-0.95.1/agent/CMakeLists.txt&lt;br /&gt;
--- polkit-kde-1-0.95.1.old/agent/CMakeLists.txt	2009-12-23 04:31:29.000000000 -0700&lt;br /&gt;
+++ polkit-kde-1-0.95.1/agent/CMakeLists.txt	2010-03-25 15:54:12.000000000 -0700&lt;br /&gt;
@@ -11,7 +11,7 @@&lt;br /&gt;
 &lt;br /&gt;
 target_link_libraries(polkit-kde-authentication-agent-1&lt;br /&gt;
                                          ${KDE4_KDEUI_LIBS}&lt;br /&gt;
-                                         ${POLKITQT-1_AGENT_LIBRARY}&lt;br /&gt;
+                                         ${POLKITQT-1_LIBRARIES} &lt;br /&gt;
 )&lt;br /&gt;
 &lt;br /&gt;
 configure_file(polkit-kde-authentication-agent-1.desktop.in ${CMAKE_BINARY_DIR}/polkit-kde-authentication-agent-1.desktop)&lt;br /&gt;
@@ -25,4 +25,4 @@&lt;br /&gt;
   set (DESKTOP_INSTALL_DIR /etc/xdg/autostart)&lt;br /&gt;
 endif (DESKTOP_INSTALL_DIR)&lt;br /&gt;
 &lt;br /&gt;
-install(FILES ${CMAKE_BINARY_DIR}/polkit-kde-authentication-agent-1.desktop DESTINATION ${DESKTOP_INSTALL_DIR})&lt;br /&gt;
+install(FILES ${CMAKE_BINARY_DIR}/polkit-kde-authentication-agent-1.desktop DESTINATION ${KDE4_AUTOSTART_INSTALL_DIR})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must build with the same CMake parameters as the KDE-4 modules; specifically:&lt;br /&gt;
&lt;br /&gt;
::-DCMAKE_INSTALL_PREFIX:PATH=/opt/KDE-&amp;lt;version&amp;gt;&lt;br /&gt;
::-DSYSCONF_INSTALL_DIR=/etc/kde-&amp;lt;version&amp;gt;&lt;br /&gt;
::-DKDE4_AUTH_POLICY_FILES_INSTALL_DIR:STRING=/usr/share/PolicyKit/policy&lt;br /&gt;
&lt;br /&gt;
===shared-mime-info===&lt;br /&gt;
&lt;br /&gt;
You should have this installed with a prefix: &amp;quot;/usr&amp;quot;.  All you need to do is build KDE-4 with:&lt;br /&gt;
&lt;br /&gt;
::-DUPDATE_MIME_DATABASE_EXECUTABLE:FILEPATH=/usr/bin/update-mime-database&lt;br /&gt;
&lt;br /&gt;
However there appears to be a problem for KDE &amp;lt; 4.5&lt;br /&gt;
&lt;br /&gt;
Get the current release from:&lt;br /&gt;
&lt;br /&gt;
::http://www.freedesktop.org/wiki/Software/shared-mime-info&lt;br /&gt;
&lt;br /&gt;
You need to install this with the same prefix as KDE4 (even if you already have it installed in &amp;quot;/usr&amp;quot;) to eliminate missing MIME type errors.  Currently, KDELibs won't build unless you do this.  And, even if it does, you will get run time errors -- popup windows saying that certain MIME types can not be found.&lt;br /&gt;
&lt;br /&gt;
This appears to be a bug that was fixed with KDE-4.5; for ealier versions this workaround does seem to work.&lt;br /&gt;
&lt;br /&gt;
===KIPI Plugins===&lt;br /&gt;
&lt;br /&gt;
Get the current release from:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/kipi/&lt;br /&gt;
&lt;br /&gt;
This package is dependent on KDEGraphics.  The package has a lot of optional dependencies which you need to satisfy only if you want the corresponding plugins built.  You should install it in the same directory where you installed KDE-4.x.y.&lt;br /&gt;
&lt;br /&gt;
Be sure that you updated your: &amp;quot;PKG_CONFIG_PATH&amp;quot; to include $CMAKE_INSTALL_PREFIX/lib/pkgconfig (for example):&lt;br /&gt;
&lt;br /&gt;
::/opt/KDE-4/lib/pkgconfig&lt;br /&gt;
&lt;br /&gt;
===Oxygen Icons===&lt;br /&gt;
&lt;br /&gt;
If you checked out KDESupport from TRUNK or the TAG: &amp;quot;kdesupport-for-&amp;lt;version&amp;gt;&amp;quot;, you have them.&lt;br /&gt;
&lt;br /&gt;
If you checked out KDESupport from a tag &amp;quot;kdesupport-&amp;lt;version&amp;gt;&amp;quot; up to 4.3 or didn't use KDESupport, you need to get them.  If you are using SVN, that would be:&lt;br /&gt;
&lt;br /&gt;
::svn co svn://anonsvn.kde.org/home/kde/tags/KDE/&amp;lt;version&amp;gt;/oxygen-icons&lt;br /&gt;
&lt;br /&gt;
{where &amp;lt;version&amp;gt; is the latest release for the branch you are using (e.g. 4.3.4 for the 4.3 branch)}  &lt;br /&gt;
&lt;br /&gt;
Or, you can simply use TRUNK:&lt;br /&gt;
&lt;br /&gt;
::svn co svn://anonsvn.kde.org/home/kde/trunk/kdesupportsvn/oxygen-icons&lt;br /&gt;
&lt;br /&gt;
===LibSSH===&lt;br /&gt;
&lt;br /&gt;
TRUNK and KDE-4.4 require libssh.  Get the current release &amp;gt;= 0.4.0 from:&lt;br /&gt;
&lt;br /&gt;
::http://www.libssh.org/&lt;br /&gt;
&lt;br /&gt;
===Dependencies for specific KDE modules===&lt;br /&gt;
&lt;br /&gt;
====KDEBindings====&lt;br /&gt;
&lt;br /&gt;
=====SIP and PyQt=====&lt;br /&gt;
&lt;br /&gt;
To build the Python bindings for KDE, you need the current releases of SIP and PyQt from here:&lt;br /&gt;
&lt;br /&gt;
::http://www.riverbankcomputing.com/software/sip/download&lt;br /&gt;
::http://www.riverbankcomputing.com/software/pyqt/download&lt;br /&gt;
&lt;br /&gt;
Install: &amp;quot;SIP&amp;quot; first and then: &amp;quot;PyQt&amp;quot;.  These are both Python add-ons so they install with:&lt;br /&gt;
&lt;br /&gt;
::python configure.py&lt;br /&gt;
::make&lt;br /&gt;
::make install&lt;br /&gt;
&lt;br /&gt;
=====Build Notes for PyQt=====&lt;br /&gt;
&lt;br /&gt;
Unless you want to get into serious complications, you should only build PyQt against one version of Qt and you should only install one version of KDEBindings.  If you try to build against multiple versions of Qt or install multiple versions of KDEBindings, with a single instance of Python (or other languages), you will install two versions of the same file in the same place.&lt;br /&gt;
&lt;br /&gt;
PyQt will find Qt based on your environment variables.  So, if you want to install for a version of KDE other than the one that you are currently using, be sure that these are set correctly:&lt;br /&gt;
&lt;br /&gt;
::QTDIR&lt;br /&gt;
::QT_PLUGIN_PATH&lt;br /&gt;
&lt;br /&gt;
KDEBindings is dependent on KDEGraphics (specifically Okular).&lt;br /&gt;
&lt;br /&gt;
Other language dependencies are optional.  If you have other supported languages installed on your system, installing KDEBindings will build bindings for them.&lt;br /&gt;
&lt;br /&gt;
=====QScintilla2=====&lt;br /&gt;
&lt;br /&gt;
QScintilla2 is optional.  If you are installing it, get it here:&lt;br /&gt;
&lt;br /&gt;
::http://www.riverbankcomputing.com/software/qscintilla/download&lt;br /&gt;
&lt;br /&gt;
Install it after SIP &amp;amp; PyQt.  It has a Qt build system, so install for Qt4 it with:&lt;br /&gt;
&lt;br /&gt;
::cd Qt4&lt;br /&gt;
::qmake qscintilla.pro&lt;br /&gt;
::make&lt;br /&gt;
::make install&lt;br /&gt;
&lt;br /&gt;
====KDEEdu====&lt;br /&gt;
&lt;br /&gt;
KDEEdu might be dependent on KDEBindings.&lt;br /&gt;
&lt;br /&gt;
====KDENetwork====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;v4l-utils and Libv4l&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only required for KDE &amp;gt;= 4.4 and TRUNK&lt;br /&gt;
&lt;br /&gt;
Get the current release here:&lt;br /&gt;
&lt;br /&gt;
::http://freecode.com/projects/libv4l&lt;br /&gt;
&lt;br /&gt;
and follow the build instructions in the INSTALL file.&lt;br /&gt;
&lt;br /&gt;
=====Optional Dependencies=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Telepathy-Qt4&amp;lt;/b&amp;gt; is the Qt bindings for Telepathy.  Since this has general usage, you should probably install it along with its semi-optional dependency &amp;lt;b&amp;gt;telepathy-glib&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Get the current releases here:&lt;br /&gt;
&lt;br /&gt;
::http://telepathy.freedesktop.org/releases/telepathy-glib/&lt;br /&gt;
::http://telepathy.freedesktop.org/releases/telepathy-qt4/&lt;br /&gt;
&lt;br /&gt;
Install: &amp;quot;telepathy-glib&amp;quot; first and then: 'telepathy-qt4&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The output from CMake lists several other optional dependencies.  It appears that these are needed to support specific functions in KDENetwork.  So, if you need those functions, you need to install them.  You will probably also need to install the corresponding Telepathy addons from here:&lt;br /&gt;
&lt;br /&gt;
::http://telepathy.freedesktop.org/releases/&lt;br /&gt;
&lt;br /&gt;
TO DO: more information needed.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Thread:User_talk:StijnRuts/Plasma_Tutorial/reply_(2)</id>
		<title>Thread:User talk:StijnRuts/Plasma Tutorial/reply (2)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Thread:User_talk:StijnRuts/Plasma_Tutorial/reply_(2)"/>
				<updated>2012-04-06T18:50:10Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Reply to Plasma Tutorial&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ok, I moved it there and added a link to the page. Sorry for the hickups of moving it incorrectly at first. And thanks for the contribution. :)&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer</id>
		<title>Development/Tutorials/Plasma/WallpaperDoubleBuffer</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer"/>
				<updated>2012-04-06T18:48:31Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: moved Http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer to Development/Tutorials/Plasma/WallpaperDoubleBuffer: Next try to move this page to its correct location.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Plasma Wallpaper Tutorial 3 - Double Buffer =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
So far we have ignored the exposedRect argument of our paint function. Whenever the paint function was called we redrew the entire wallpaper even when only a small region needed repainting. As you can imagine this is not very efficient so let's improve our wallpaper by using a so-called 'double buffer' technique.&lt;br /&gt;
&lt;br /&gt;
==Adding the Buffer== &lt;br /&gt;
&lt;br /&gt;
The way this double buffer technique works is by rendering our wallpaper to a pixmap in memory, the buffer, instead of rendering it directly to the screen. Whenever a region on the screen needs repainting we can just copy the corresponding region from the buffer to the screen.&lt;br /&gt;
&lt;br /&gt;
First we'll need to add the buffer to our private variables and write a new function for rendering the buffer. Add the following lines to our tutorial.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef PLASMA_WALLPAPER_TUTORIAL&lt;br /&gt;
#define PLASMA_WALLPAPER_TUTORIAL&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Plasma/Wallpaper&amp;gt;&lt;br /&gt;
#include &amp;quot;ui_config.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class Tutorial : public Plasma::Wallpaper&lt;br /&gt;
{&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
    public:&lt;br /&gt;
        Tutorial(QObject* parent, const QVariantList&amp;amp; args);&lt;br /&gt;
&lt;br /&gt;
        virtual void save(KConfigGroup &amp;amp;config);&lt;br /&gt;
        void paint(QPainter* painter, const QRectF&amp;amp; exposedRect);&lt;br /&gt;
        virtual QWidget* createConfigurationInterface(QWidget* parent);&lt;br /&gt;
&lt;br /&gt;
    Q_SIGNALS:&lt;br /&gt;
        void settingsChanged(bool modified);&lt;br /&gt;
&lt;br /&gt;
    protected:&lt;br /&gt;
        virtual void init(const KConfigGroup &amp;amp;config);&lt;br /&gt;
&lt;br /&gt;
    protected slots:&lt;br /&gt;
        void settingsModified();&lt;br /&gt;
&lt;br /&gt;
    private:&lt;br /&gt;
        Ui::Config configWidget;&lt;br /&gt;
        QColor backgroundColor;&lt;br /&gt;
        QColor textColor;&lt;br /&gt;
        QFont textFont;&lt;br /&gt;
        QString textString;&lt;br /&gt;
        QPixmap buffer;                         // New&lt;br /&gt;
        void render();                          // New&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
K_EXPORT_PLASMA_WALLPAPER(tutorial, Tutorial)&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we will implement render() in our tutorial.cpp. This function is largely identical to the old paint function, except it will draw to our newly created buffer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::render()&lt;br /&gt;
{&lt;br /&gt;
    if(buffer.size() != boundingRect().size())&lt;br /&gt;
    {&lt;br /&gt;
        buffer = QPixmap(boundingRect().size().toSize());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    QPainter painter;&lt;br /&gt;
    painter.begin(&amp;amp;buffer);&lt;br /&gt;
	&lt;br /&gt;
    painter.setPen(backgroundColor);&lt;br /&gt;
    painter.setBrush(backgroundColor);&lt;br /&gt;
    painter.drawRect(boundingRect());&lt;br /&gt;
 &lt;br /&gt;
    painter.setPen(textColor);&lt;br /&gt;
    painter.setFont(textFont);&lt;br /&gt;
    painter.drawText(boundingRect(), Qt::AlignCenter, textString);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the buffer has the wrong size or if the buffer doesn't exist yet (size = 0px*0px) we create a new QPixmap with the same size as our wallpaper. We then associate a QPainter object with this buffer and draw with the QPainter as before.&lt;br /&gt;
&lt;br /&gt;
==Using the Buffer== &lt;br /&gt;
&lt;br /&gt;
We will now need to change the paint function to make use of our buffer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::paint(QPainter *painter, const QRectF&amp;amp; exposedRect)&lt;br /&gt;
{&lt;br /&gt;
    if(buffer.size() != boundingRect().size())&lt;br /&gt;
    {&lt;br /&gt;
        render();&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    painter-&amp;gt;drawPixmap(exposedRect, buffer, exposedRect);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the buffer has the wrong size or if the buffer doesn't exist yet (size = 0px*0px) we call our render function to fill the buffer with the correct content. When our buffer is up-to-date we copy the exposedRect region from the buffer to the painter.&lt;br /&gt;
&lt;br /&gt;
We'll also need to update the buffer, by calling our render function, whenever the content of the wallpaper changes. Add the following lines to the init and settingsModified functions in our tutorial.cpp:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::init(const KConfigGroup &amp;amp;config)&lt;br /&gt;
{&lt;br /&gt;
    backgroundColor = config.readEntry(&amp;quot;backgroundColor&amp;quot;, QColor(Qt::white));&lt;br /&gt;
    textColor = config.readEntry(&amp;quot;textColor&amp;quot;, QColor(Qt::black));&lt;br /&gt;
    textFont = config.readEntry(&amp;quot;textFont&amp;quot;, QFont(&amp;quot;Arial&amp;quot;, 50));&lt;br /&gt;
    textString = config.readEntry(&amp;quot;textString&amp;quot;, QString(&amp;quot;Hello World!&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
    render();                                             // New&lt;br /&gt;
    emit update(boundingRect());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Tutorial::settingsModified()&lt;br /&gt;
{&lt;br /&gt;
    textString = configWidget.textString-&amp;gt;text();&lt;br /&gt;
    textFont = configWidget.textFont-&amp;gt;font();&lt;br /&gt;
    textColor = configWidget.textColor-&amp;gt;color();&lt;br /&gt;
    backgroundColor = configWidget.backgroundColor-&amp;gt;color();&lt;br /&gt;
 &lt;br /&gt;
    render();                                             // New&lt;br /&gt;
    emit settingsChanged(true);&lt;br /&gt;
    emit update(boundingRect());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling ==&lt;br /&gt;
&lt;br /&gt;
To compile we follow the same steps as before:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p build&lt;br /&gt;
cd build&lt;br /&gt;
cmake .. -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix`&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
Again we can test using the Plasma wallpaper viewer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmawallpaperviewer -p tutorial&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or we can test it directly on our desktop. Restart plasma using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kquitapp plasma-desktop; sleep 1; plasma-desktop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then right click on your desktop, go to Desktop Settings&amp;gt;Wallpaper&amp;gt;Type and select 'Tutorial'.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
By adding a buffer to our wallpaper plugin we can make it redraw only the parts that need to be redrawn.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer</id>
		<title>Development/Tutorials/Plasma/WallpaperDoubleBuffer</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer"/>
				<updated>2012-04-06T18:47:51Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: moved /Development/Tutorials/Plasma/WallpaperDoubleBuffer to Http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer: revert
Man, it's easy to blow things up. :/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Plasma Wallpaper Tutorial 3 - Double Buffer =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
So far we have ignored the exposedRect argument of our paint function. Whenever the paint function was called we redrew the entire wallpaper even when only a small region needed repainting. As you can imagine this is not very efficient so let's improve our wallpaper by using a so-called 'double buffer' technique.&lt;br /&gt;
&lt;br /&gt;
==Adding the Buffer== &lt;br /&gt;
&lt;br /&gt;
The way this double buffer technique works is by rendering our wallpaper to a pixmap in memory, the buffer, instead of rendering it directly to the screen. Whenever a region on the screen needs repainting we can just copy the corresponding region from the buffer to the screen.&lt;br /&gt;
&lt;br /&gt;
First we'll need to add the buffer to our private variables and write a new function for rendering the buffer. Add the following lines to our tutorial.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef PLASMA_WALLPAPER_TUTORIAL&lt;br /&gt;
#define PLASMA_WALLPAPER_TUTORIAL&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Plasma/Wallpaper&amp;gt;&lt;br /&gt;
#include &amp;quot;ui_config.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class Tutorial : public Plasma::Wallpaper&lt;br /&gt;
{&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
    public:&lt;br /&gt;
        Tutorial(QObject* parent, const QVariantList&amp;amp; args);&lt;br /&gt;
&lt;br /&gt;
        virtual void save(KConfigGroup &amp;amp;config);&lt;br /&gt;
        void paint(QPainter* painter, const QRectF&amp;amp; exposedRect);&lt;br /&gt;
        virtual QWidget* createConfigurationInterface(QWidget* parent);&lt;br /&gt;
&lt;br /&gt;
    Q_SIGNALS:&lt;br /&gt;
        void settingsChanged(bool modified);&lt;br /&gt;
&lt;br /&gt;
    protected:&lt;br /&gt;
        virtual void init(const KConfigGroup &amp;amp;config);&lt;br /&gt;
&lt;br /&gt;
    protected slots:&lt;br /&gt;
        void settingsModified();&lt;br /&gt;
&lt;br /&gt;
    private:&lt;br /&gt;
        Ui::Config configWidget;&lt;br /&gt;
        QColor backgroundColor;&lt;br /&gt;
        QColor textColor;&lt;br /&gt;
        QFont textFont;&lt;br /&gt;
        QString textString;&lt;br /&gt;
        QPixmap buffer;                         // New&lt;br /&gt;
        void render();                          // New&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
K_EXPORT_PLASMA_WALLPAPER(tutorial, Tutorial)&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we will implement render() in our tutorial.cpp. This function is largely identical to the old paint function, except it will draw to our newly created buffer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::render()&lt;br /&gt;
{&lt;br /&gt;
    if(buffer.size() != boundingRect().size())&lt;br /&gt;
    {&lt;br /&gt;
        buffer = QPixmap(boundingRect().size().toSize());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    QPainter painter;&lt;br /&gt;
    painter.begin(&amp;amp;buffer);&lt;br /&gt;
	&lt;br /&gt;
    painter.setPen(backgroundColor);&lt;br /&gt;
    painter.setBrush(backgroundColor);&lt;br /&gt;
    painter.drawRect(boundingRect());&lt;br /&gt;
 &lt;br /&gt;
    painter.setPen(textColor);&lt;br /&gt;
    painter.setFont(textFont);&lt;br /&gt;
    painter.drawText(boundingRect(), Qt::AlignCenter, textString);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the buffer has the wrong size or if the buffer doesn't exist yet (size = 0px*0px) we create a new QPixmap with the same size as our wallpaper. We then associate a QPainter object with this buffer and draw with the QPainter as before.&lt;br /&gt;
&lt;br /&gt;
==Using the Buffer== &lt;br /&gt;
&lt;br /&gt;
We will now need to change the paint function to make use of our buffer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::paint(QPainter *painter, const QRectF&amp;amp; exposedRect)&lt;br /&gt;
{&lt;br /&gt;
    if(buffer.size() != boundingRect().size())&lt;br /&gt;
    {&lt;br /&gt;
        render();&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    painter-&amp;gt;drawPixmap(exposedRect, buffer, exposedRect);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the buffer has the wrong size or if the buffer doesn't exist yet (size = 0px*0px) we call our render function to fill the buffer with the correct content. When our buffer is up-to-date we copy the exposedRect region from the buffer to the painter.&lt;br /&gt;
&lt;br /&gt;
We'll also need to update the buffer, by calling our render function, whenever the content of the wallpaper changes. Add the following lines to the init and settingsModified functions in our tutorial.cpp:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::init(const KConfigGroup &amp;amp;config)&lt;br /&gt;
{&lt;br /&gt;
    backgroundColor = config.readEntry(&amp;quot;backgroundColor&amp;quot;, QColor(Qt::white));&lt;br /&gt;
    textColor = config.readEntry(&amp;quot;textColor&amp;quot;, QColor(Qt::black));&lt;br /&gt;
    textFont = config.readEntry(&amp;quot;textFont&amp;quot;, QFont(&amp;quot;Arial&amp;quot;, 50));&lt;br /&gt;
    textString = config.readEntry(&amp;quot;textString&amp;quot;, QString(&amp;quot;Hello World!&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
    render();                                             // New&lt;br /&gt;
    emit update(boundingRect());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Tutorial::settingsModified()&lt;br /&gt;
{&lt;br /&gt;
    textString = configWidget.textString-&amp;gt;text();&lt;br /&gt;
    textFont = configWidget.textFont-&amp;gt;font();&lt;br /&gt;
    textColor = configWidget.textColor-&amp;gt;color();&lt;br /&gt;
    backgroundColor = configWidget.backgroundColor-&amp;gt;color();&lt;br /&gt;
 &lt;br /&gt;
    render();                                             // New&lt;br /&gt;
    emit settingsChanged(true);&lt;br /&gt;
    emit update(boundingRect());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling ==&lt;br /&gt;
&lt;br /&gt;
To compile we follow the same steps as before:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p build&lt;br /&gt;
cd build&lt;br /&gt;
cmake .. -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix`&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
Again we can test using the Plasma wallpaper viewer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmawallpaperviewer -p tutorial&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or we can test it directly on our desktop. Restart plasma using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kquitapp plasma-desktop; sleep 1; plasma-desktop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then right click on your desktop, go to Desktop Settings&amp;gt;Wallpaper&amp;gt;Type and select 'Tutorial'.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
By adding a buffer to our wallpaper plugin we can make it redraw only the parts that need to be redrawn.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer</id>
		<title>Development/Tutorials/Plasma/WallpaperDoubleBuffer</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer"/>
				<updated>2012-04-06T18:46:26Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: moved Http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer to /Development/Tutorials/Plasma/WallpaperDoubleBuffer: Oops?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Plasma Wallpaper Tutorial 3 - Double Buffer =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
So far we have ignored the exposedRect argument of our paint function. Whenever the paint function was called we redrew the entire wallpaper even when only a small region needed repainting. As you can imagine this is not very efficient so let's improve our wallpaper by using a so-called 'double buffer' technique.&lt;br /&gt;
&lt;br /&gt;
==Adding the Buffer== &lt;br /&gt;
&lt;br /&gt;
The way this double buffer technique works is by rendering our wallpaper to a pixmap in memory, the buffer, instead of rendering it directly to the screen. Whenever a region on the screen needs repainting we can just copy the corresponding region from the buffer to the screen.&lt;br /&gt;
&lt;br /&gt;
First we'll need to add the buffer to our private variables and write a new function for rendering the buffer. Add the following lines to our tutorial.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef PLASMA_WALLPAPER_TUTORIAL&lt;br /&gt;
#define PLASMA_WALLPAPER_TUTORIAL&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Plasma/Wallpaper&amp;gt;&lt;br /&gt;
#include &amp;quot;ui_config.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class Tutorial : public Plasma::Wallpaper&lt;br /&gt;
{&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
    public:&lt;br /&gt;
        Tutorial(QObject* parent, const QVariantList&amp;amp; args);&lt;br /&gt;
&lt;br /&gt;
        virtual void save(KConfigGroup &amp;amp;config);&lt;br /&gt;
        void paint(QPainter* painter, const QRectF&amp;amp; exposedRect);&lt;br /&gt;
        virtual QWidget* createConfigurationInterface(QWidget* parent);&lt;br /&gt;
&lt;br /&gt;
    Q_SIGNALS:&lt;br /&gt;
        void settingsChanged(bool modified);&lt;br /&gt;
&lt;br /&gt;
    protected:&lt;br /&gt;
        virtual void init(const KConfigGroup &amp;amp;config);&lt;br /&gt;
&lt;br /&gt;
    protected slots:&lt;br /&gt;
        void settingsModified();&lt;br /&gt;
&lt;br /&gt;
    private:&lt;br /&gt;
        Ui::Config configWidget;&lt;br /&gt;
        QColor backgroundColor;&lt;br /&gt;
        QColor textColor;&lt;br /&gt;
        QFont textFont;&lt;br /&gt;
        QString textString;&lt;br /&gt;
        QPixmap buffer;                         // New&lt;br /&gt;
        void render();                          // New&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
K_EXPORT_PLASMA_WALLPAPER(tutorial, Tutorial)&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we will implement render() in our tutorial.cpp. This function is largely identical to the old paint function, except it will draw to our newly created buffer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::render()&lt;br /&gt;
{&lt;br /&gt;
    if(buffer.size() != boundingRect().size())&lt;br /&gt;
    {&lt;br /&gt;
        buffer = QPixmap(boundingRect().size().toSize());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    QPainter painter;&lt;br /&gt;
    painter.begin(&amp;amp;buffer);&lt;br /&gt;
	&lt;br /&gt;
    painter.setPen(backgroundColor);&lt;br /&gt;
    painter.setBrush(backgroundColor);&lt;br /&gt;
    painter.drawRect(boundingRect());&lt;br /&gt;
 &lt;br /&gt;
    painter.setPen(textColor);&lt;br /&gt;
    painter.setFont(textFont);&lt;br /&gt;
    painter.drawText(boundingRect(), Qt::AlignCenter, textString);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the buffer has the wrong size or if the buffer doesn't exist yet (size = 0px*0px) we create a new QPixmap with the same size as our wallpaper. We then associate a QPainter object with this buffer and draw with the QPainter as before.&lt;br /&gt;
&lt;br /&gt;
==Using the Buffer== &lt;br /&gt;
&lt;br /&gt;
We will now need to change the paint function to make use of our buffer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::paint(QPainter *painter, const QRectF&amp;amp; exposedRect)&lt;br /&gt;
{&lt;br /&gt;
    if(buffer.size() != boundingRect().size())&lt;br /&gt;
    {&lt;br /&gt;
        render();&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    painter-&amp;gt;drawPixmap(exposedRect, buffer, exposedRect);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the buffer has the wrong size or if the buffer doesn't exist yet (size = 0px*0px) we call our render function to fill the buffer with the correct content. When our buffer is up-to-date we copy the exposedRect region from the buffer to the painter.&lt;br /&gt;
&lt;br /&gt;
We'll also need to update the buffer, by calling our render function, whenever the content of the wallpaper changes. Add the following lines to the init and settingsModified functions in our tutorial.cpp:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::init(const KConfigGroup &amp;amp;config)&lt;br /&gt;
{&lt;br /&gt;
    backgroundColor = config.readEntry(&amp;quot;backgroundColor&amp;quot;, QColor(Qt::white));&lt;br /&gt;
    textColor = config.readEntry(&amp;quot;textColor&amp;quot;, QColor(Qt::black));&lt;br /&gt;
    textFont = config.readEntry(&amp;quot;textFont&amp;quot;, QFont(&amp;quot;Arial&amp;quot;, 50));&lt;br /&gt;
    textString = config.readEntry(&amp;quot;textString&amp;quot;, QString(&amp;quot;Hello World!&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
    render();                                             // New&lt;br /&gt;
    emit update(boundingRect());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Tutorial::settingsModified()&lt;br /&gt;
{&lt;br /&gt;
    textString = configWidget.textString-&amp;gt;text();&lt;br /&gt;
    textFont = configWidget.textFont-&amp;gt;font();&lt;br /&gt;
    textColor = configWidget.textColor-&amp;gt;color();&lt;br /&gt;
    backgroundColor = configWidget.backgroundColor-&amp;gt;color();&lt;br /&gt;
 &lt;br /&gt;
    render();                                             // New&lt;br /&gt;
    emit settingsChanged(true);&lt;br /&gt;
    emit update(boundingRect());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling ==&lt;br /&gt;
&lt;br /&gt;
To compile we follow the same steps as before:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p build&lt;br /&gt;
cd build&lt;br /&gt;
cmake .. -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix`&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
Again we can test using the Plasma wallpaper viewer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmawallpaperviewer -p tutorial&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or we can test it directly on our desktop. Restart plasma using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kquitapp plasma-desktop; sleep 1; plasma-desktop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then right click on your desktop, go to Desktop Settings&amp;gt;Wallpaper&amp;gt;Type and select 'Tutorial'.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
By adding a buffer to our wallpaper plugin we can make it redraw only the parts that need to be redrawn.&lt;/div&gt;</summary>
		<author><name>Icwiener</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-04-06T18:45:37Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Wallpapers */ Add new tutorial.&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 and KDM 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 retreive 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 Pluginin 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>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer</id>
		<title>Development/Tutorials/Plasma/WallpaperDoubleBuffer</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer"/>
				<updated>2012-04-06T18:43:49Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: moved User:StijnRuts to Http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer: User request.
Part of a series.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Plasma Wallpaper Tutorial 3 - Double Buffer =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
So far we have ignored the exposedRect argument of our paint function. Whenever the paint function was called we redrew the entire wallpaper even when only a small region needed repainting. As you can imagine this is not very efficient so let's improve our wallpaper by using a so-called 'double buffer' technique.&lt;br /&gt;
&lt;br /&gt;
==Adding the Buffer== &lt;br /&gt;
&lt;br /&gt;
The way this double buffer technique works is by rendering our wallpaper to a pixmap in memory, the buffer, instead of rendering it directly to the screen. Whenever a region on the screen needs repainting we can just copy the corresponding region from the buffer to the screen.&lt;br /&gt;
&lt;br /&gt;
First we'll need to add the buffer to our private variables and write a new function for rendering the buffer. Add the following lines to our tutorial.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef PLASMA_WALLPAPER_TUTORIAL&lt;br /&gt;
#define PLASMA_WALLPAPER_TUTORIAL&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Plasma/Wallpaper&amp;gt;&lt;br /&gt;
#include &amp;quot;ui_config.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class Tutorial : public Plasma::Wallpaper&lt;br /&gt;
{&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
    public:&lt;br /&gt;
        Tutorial(QObject* parent, const QVariantList&amp;amp; args);&lt;br /&gt;
&lt;br /&gt;
        virtual void save(KConfigGroup &amp;amp;config);&lt;br /&gt;
        void paint(QPainter* painter, const QRectF&amp;amp; exposedRect);&lt;br /&gt;
        virtual QWidget* createConfigurationInterface(QWidget* parent);&lt;br /&gt;
&lt;br /&gt;
    Q_SIGNALS:&lt;br /&gt;
        void settingsChanged(bool modified);&lt;br /&gt;
&lt;br /&gt;
    protected:&lt;br /&gt;
        virtual void init(const KConfigGroup &amp;amp;config);&lt;br /&gt;
&lt;br /&gt;
    protected slots:&lt;br /&gt;
        void settingsModified();&lt;br /&gt;
&lt;br /&gt;
    private:&lt;br /&gt;
        Ui::Config configWidget;&lt;br /&gt;
        QColor backgroundColor;&lt;br /&gt;
        QColor textColor;&lt;br /&gt;
        QFont textFont;&lt;br /&gt;
        QString textString;&lt;br /&gt;
        QPixmap buffer;                         // New&lt;br /&gt;
        void render();                          // New&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
K_EXPORT_PLASMA_WALLPAPER(tutorial, Tutorial)&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we will implement render() in our tutorial.cpp. This function is largely identical to the old paint function, except it will draw to our newly created buffer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::render()&lt;br /&gt;
{&lt;br /&gt;
    if(buffer.size() != boundingRect().size())&lt;br /&gt;
    {&lt;br /&gt;
        buffer = QPixmap(boundingRect().size().toSize());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    QPainter painter;&lt;br /&gt;
    painter.begin(&amp;amp;buffer);&lt;br /&gt;
	&lt;br /&gt;
    painter.setPen(backgroundColor);&lt;br /&gt;
    painter.setBrush(backgroundColor);&lt;br /&gt;
    painter.drawRect(boundingRect());&lt;br /&gt;
 &lt;br /&gt;
    painter.setPen(textColor);&lt;br /&gt;
    painter.setFont(textFont);&lt;br /&gt;
    painter.drawText(boundingRect(), Qt::AlignCenter, textString);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the buffer has the wrong size or if the buffer doesn't exist yet (size = 0px*0px) we create a new QPixmap with the same size as our wallpaper. We then associate a QPainter object with this buffer and draw with the QPainter as before.&lt;br /&gt;
&lt;br /&gt;
==Using the Buffer== &lt;br /&gt;
&lt;br /&gt;
We will now need to change the paint function to make use of our buffer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::paint(QPainter *painter, const QRectF&amp;amp; exposedRect)&lt;br /&gt;
{&lt;br /&gt;
    if(buffer.size() != boundingRect().size())&lt;br /&gt;
    {&lt;br /&gt;
        render();&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    painter-&amp;gt;drawPixmap(exposedRect, buffer, exposedRect);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the buffer has the wrong size or if the buffer doesn't exist yet (size = 0px*0px) we call our render function to fill the buffer with the correct content. When our buffer is up-to-date we copy the exposedRect region from the buffer to the painter.&lt;br /&gt;
&lt;br /&gt;
We'll also need to update the buffer, by calling our render function, whenever the content of the wallpaper changes. Add the following lines to the init and settingsModified functions in our tutorial.cpp:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::init(const KConfigGroup &amp;amp;config)&lt;br /&gt;
{&lt;br /&gt;
    backgroundColor = config.readEntry(&amp;quot;backgroundColor&amp;quot;, QColor(Qt::white));&lt;br /&gt;
    textColor = config.readEntry(&amp;quot;textColor&amp;quot;, QColor(Qt::black));&lt;br /&gt;
    textFont = config.readEntry(&amp;quot;textFont&amp;quot;, QFont(&amp;quot;Arial&amp;quot;, 50));&lt;br /&gt;
    textString = config.readEntry(&amp;quot;textString&amp;quot;, QString(&amp;quot;Hello World!&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
    render();                                             // New&lt;br /&gt;
    emit update(boundingRect());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Tutorial::settingsModified()&lt;br /&gt;
{&lt;br /&gt;
    textString = configWidget.textString-&amp;gt;text();&lt;br /&gt;
    textFont = configWidget.textFont-&amp;gt;font();&lt;br /&gt;
    textColor = configWidget.textColor-&amp;gt;color();&lt;br /&gt;
    backgroundColor = configWidget.backgroundColor-&amp;gt;color();&lt;br /&gt;
 &lt;br /&gt;
    render();                                             // New&lt;br /&gt;
    emit settingsChanged(true);&lt;br /&gt;
    emit update(boundingRect());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling ==&lt;br /&gt;
&lt;br /&gt;
To compile we follow the same steps as before:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p build&lt;br /&gt;
cd build&lt;br /&gt;
cmake .. -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix`&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
Again we can test using the Plasma wallpaper viewer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmawallpaperviewer -p tutorial&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or we can test it directly on our desktop. Restart plasma using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kquitapp plasma-desktop; sleep 1; plasma-desktop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then right click on your desktop, go to Desktop Settings&amp;gt;Wallpaper&amp;gt;Type and select 'Tutorial'.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
By adding a buffer to our wallpaper plugin we can make it redraw only the parts that need to be redrawn.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Thread:User_talk:StijnRuts/Plasma_Tutorial</id>
		<title>Thread:User talk:StijnRuts/Plasma Tutorial</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Thread:User_talk:StijnRuts/Plasma_Tutorial"/>
				<updated>2012-04-05T22:43:59Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: New thread: Plasma Tutorial&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi,&lt;br /&gt;
&lt;br /&gt;
where would you want this to go?&lt;br /&gt;
&lt;br /&gt;
Regards&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User_talk:StijnRuts</id>
		<title>User talk:StijnRuts</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User_talk:StijnRuts"/>
				<updated>2012-04-05T22:43:59Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Talk page autocreated when first thread was posted&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer</id>
		<title>Development/Tutorials/Plasma/WallpaperDoubleBuffer</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/WallpaperDoubleBuffer"/>
				<updated>2012-04-05T22:42:37Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Plasma Wallpaper Tutorial 3 - Double Buffer =&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
So far we have ignored the exposedRect argument of our paint function. Whenever the paint function was called we redrew the entire wallpaper even when only a small region needed repainting. As you can imagine this is not very efficient so let's improve our wallpaper by using a so-called 'double buffer' technique.&lt;br /&gt;
&lt;br /&gt;
==Adding the Buffer== &lt;br /&gt;
&lt;br /&gt;
The way this double buffer technique works is by rendering our wallpaper to a pixmap in memory, the buffer, instead of rendering it directly to the screen. Whenever a region on the screen needs repainting we can just copy the corresponding region from the buffer to the screen.&lt;br /&gt;
&lt;br /&gt;
First we'll need to add the buffer to our private variables and write a new function for rendering the buffer. Add the following lines to our tutorial.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef PLASMA_WALLPAPER_TUTORIAL&lt;br /&gt;
#define PLASMA_WALLPAPER_TUTORIAL&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Plasma/Wallpaper&amp;gt;&lt;br /&gt;
#include &amp;quot;ui_config.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class Tutorial : public Plasma::Wallpaper&lt;br /&gt;
{&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
    public:&lt;br /&gt;
        Tutorial(QObject* parent, const QVariantList&amp;amp; args);&lt;br /&gt;
&lt;br /&gt;
        virtual void save(KConfigGroup &amp;amp;config);&lt;br /&gt;
        void paint(QPainter* painter, const QRectF&amp;amp; exposedRect);&lt;br /&gt;
        virtual QWidget* createConfigurationInterface(QWidget* parent);&lt;br /&gt;
&lt;br /&gt;
    Q_SIGNALS:&lt;br /&gt;
        void settingsChanged(bool modified);&lt;br /&gt;
&lt;br /&gt;
    protected:&lt;br /&gt;
        virtual void init(const KConfigGroup &amp;amp;config);&lt;br /&gt;
&lt;br /&gt;
    protected slots:&lt;br /&gt;
        void settingsModified();&lt;br /&gt;
&lt;br /&gt;
    private:&lt;br /&gt;
        Ui::Config configWidget;&lt;br /&gt;
        QColor backgroundColor;&lt;br /&gt;
        QColor textColor;&lt;br /&gt;
        QFont textFont;&lt;br /&gt;
        QString textString;&lt;br /&gt;
        QPixmap buffer;                         // New&lt;br /&gt;
        void render();                          // New&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
K_EXPORT_PLASMA_WALLPAPER(tutorial, Tutorial)&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we will implement render() in our tutorial.cpp. This function is largely identical to the old paint function, except it will draw to our newly created buffer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::render()&lt;br /&gt;
{&lt;br /&gt;
    if(buffer.size() != boundingRect().size())&lt;br /&gt;
    {&lt;br /&gt;
        buffer = QPixmap(boundingRect().size().toSize());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    QPainter painter;&lt;br /&gt;
    painter.begin(&amp;amp;buffer);&lt;br /&gt;
	&lt;br /&gt;
    painter.setPen(backgroundColor);&lt;br /&gt;
    painter.setBrush(backgroundColor);&lt;br /&gt;
    painter.drawRect(boundingRect());&lt;br /&gt;
 &lt;br /&gt;
    painter.setPen(textColor);&lt;br /&gt;
    painter.setFont(textFont);&lt;br /&gt;
    painter.drawText(boundingRect(), Qt::AlignCenter, textString);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the buffer has the wrong size or if the buffer doesn't exist yet (size = 0px*0px) we create a new QPixmap with the same size as our wallpaper. We then associate a QPainter object with this buffer and draw with the QPainter as before.&lt;br /&gt;
&lt;br /&gt;
==Using the Buffer== &lt;br /&gt;
&lt;br /&gt;
We will now need to change the paint function to make use of our buffer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::paint(QPainter *painter, const QRectF&amp;amp; exposedRect)&lt;br /&gt;
{&lt;br /&gt;
    if(buffer.size() != boundingRect().size())&lt;br /&gt;
    {&lt;br /&gt;
        render();&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    painter-&amp;gt;drawPixmap(exposedRect, buffer, exposedRect);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the buffer has the wrong size or if the buffer doesn't exist yet (size = 0px*0px) we call our render function to fill the buffer with the correct content. When our buffer is up-to-date we copy the exposedRect region from the buffer to the painter.&lt;br /&gt;
&lt;br /&gt;
We'll also need to update the buffer, by calling our render function, whenever the content of the wallpaper changes. Add the following lines to the init and settingsModified functions in our tutorial.cpp:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void Tutorial::init(const KConfigGroup &amp;amp;config)&lt;br /&gt;
{&lt;br /&gt;
    backgroundColor = config.readEntry(&amp;quot;backgroundColor&amp;quot;, QColor(Qt::white));&lt;br /&gt;
    textColor = config.readEntry(&amp;quot;textColor&amp;quot;, QColor(Qt::black));&lt;br /&gt;
    textFont = config.readEntry(&amp;quot;textFont&amp;quot;, QFont(&amp;quot;Arial&amp;quot;, 50));&lt;br /&gt;
    textString = config.readEntry(&amp;quot;textString&amp;quot;, QString(&amp;quot;Hello World!&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
    render();                                             // New&lt;br /&gt;
    emit update(boundingRect());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Tutorial::settingsModified()&lt;br /&gt;
{&lt;br /&gt;
    textString = configWidget.textString-&amp;gt;text();&lt;br /&gt;
    textFont = configWidget.textFont-&amp;gt;font();&lt;br /&gt;
    textColor = configWidget.textColor-&amp;gt;color();&lt;br /&gt;
    backgroundColor = configWidget.backgroundColor-&amp;gt;color();&lt;br /&gt;
 &lt;br /&gt;
    render();                                             // New&lt;br /&gt;
    emit settingsChanged(true);&lt;br /&gt;
    emit update(boundingRect());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling ==&lt;br /&gt;
&lt;br /&gt;
To compile we follow the same steps as before:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p build&lt;br /&gt;
cd build&lt;br /&gt;
cmake .. -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix`&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
Again we can test using the Plasma wallpaper viewer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmawallpaperviewer -p tutorial&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or we can test it directly on our desktop. Restart plasma using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kquitapp plasma-desktop; sleep 1; plasma-desktop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then right click on your desktop, go to Desktop Settings&amp;gt;Wallpaper&amp;gt;Type and select 'Tutorial'.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
By adding a buffer to our wallpaper plugin we can make it redraw only the parts that need to be redrawn.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-04-01T14:10:15Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Status */ Remove unused links.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
* [[/Proposed_Games|Proposed new games]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
&lt;br /&gt;
* [[/Akademy 2008 Notes|Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/Pre DevDays 2009 Sprint|Sprint prior to Qt Developer Days 2009 in Munich]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-04-01T14:05:43Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Development */ Remove unused link.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
* [[/Proposed_Games|Proposed new games]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
* older pages:&lt;br /&gt;
** [[/Status_Should_be_Ready|Should be ready]]&lt;br /&gt;
** [[/Status_Playground|kdegames playground (kdegame's candidate or unready) ]]&lt;br /&gt;
** [[/Status|old status page]]&lt;br /&gt;
&lt;br /&gt;
* [[/Akademy 2008 Notes|Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/Pre DevDays 2009 Sprint|Sprint prior to Qt Developer Days 2009 in Munich]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-03-27T13:27:50Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* IRC */ Remove dead link.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
* [[/Proposed_Games|Proposed new games]]&lt;br /&gt;
* [[/Porting|Porting to new libkdegames components]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
* older pages:&lt;br /&gt;
** [[/Status_Should_be_Ready|Should be ready]]&lt;br /&gt;
** [[/Status_Playground|kdegames playground (kdegame's candidate or unready) ]]&lt;br /&gt;
** [[/Status|old status page]]&lt;br /&gt;
&lt;br /&gt;
* [[/Akademy 2008 Notes|Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/Pre DevDays 2009 Sprint|Sprint prior to Qt Developer Days 2009 in Munich]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-03-27T12:08:58Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Development */ Remove dead link.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
* [[/Proposed_Games|Proposed new games]]&lt;br /&gt;
* [[/Porting|Porting to new libkdegames components]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
* older pages:&lt;br /&gt;
** [[/Status_Should_be_Ready|Should be ready]]&lt;br /&gt;
** [[/Status_Playground|kdegames playground (kdegame's candidate or unready) ]]&lt;br /&gt;
** [[/Status|old status page]]&lt;br /&gt;
&lt;br /&gt;
* [[/Akademy 2008 Notes|Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/IRC Meeting|Next Meeting : April 2th/2009 20:00 UTC]]&lt;br /&gt;
&lt;br /&gt;
[[/Pre DevDays 2009 Sprint|Sprint prior to Qt Developer Days 2009 in Munich]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-03-27T11:55:04Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Status */ Remove dead links.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/Maintainers| Game's maintainers]]&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
* [[/Proposed_Games|Proposed new games]]&lt;br /&gt;
* [[/Porting|Porting to new libkdegames components]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
* older pages:&lt;br /&gt;
** [[/Status_Should_be_Ready|Should be ready]]&lt;br /&gt;
** [[/Status_Playground|kdegames playground (kdegame's candidate or unready) ]]&lt;br /&gt;
** [[/Status|old status page]]&lt;br /&gt;
&lt;br /&gt;
* [[/Akademy 2008 Notes|Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/IRC Meeting|Next Meeting : April 2th/2009 20:00 UTC]]&lt;br /&gt;
&lt;br /&gt;
[[/Pre DevDays 2009 Sprint|Sprint prior to Qt Developer Days 2009 in Munich]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2012-03-27T11:49:16Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* The Game Categories */ Remove dead links.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/Maintainers| Game's maintainers]]&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
* [[/Proposed_Games|Proposed new games]]&lt;br /&gt;
* [[/Porting|Porting to new libkdegames components]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
* [[/Status KDE 4.2|Status KDE 4.2]]&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
* older pages:&lt;br /&gt;
** [[/Status_Ready|Ready]]&lt;br /&gt;
** [[/Status_Should_be_Ready|Should be ready]]&lt;br /&gt;
** [[/Status_Playground|kdegames playground (kdegame's candidate or unready) ]]&lt;br /&gt;
** [[/Status|old status page]]&lt;br /&gt;
&lt;br /&gt;
* [[/Akademy 2008 Notes|Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/IRC Meeting|Next Meeting : April 2th/2009 20:00 UTC]]&lt;br /&gt;
&lt;br /&gt;
[[/Pre DevDays 2009 Sprint|Sprint prior to Qt Developer Days 2009 in Munich]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Contribute/Bugsquad/BugDays</id>
		<title>Contribute/Bugsquad/BugDays</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Contribute/Bugsquad/BugDays"/>
				<updated>2012-03-10T02:05:04Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Reverted edits by Stolsoenx3 (talk) to last revision by Anselmolsm&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains links to the pages for all past bug triage events.&lt;br /&gt;
&lt;br /&gt;
==Next Bug Day==&lt;br /&gt;
{{:Contribute/Bugsquad/NextBugDay}}&lt;br /&gt;
&lt;br /&gt;
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;
==Previous Bug Days==&lt;br /&gt;
A Bug Day is where the Bugsquad goes back through bugs in bugzilla for a particular application and closes all reports that are no longer valid.&lt;br /&gt;
&lt;br /&gt;
* [[/DolphinDay1|Dolphin Bug Day 1: Sunday, August 1st 2010]] (All of Dolphin)&lt;br /&gt;
&lt;br /&gt;
* [[/PhononDay|Phonon Bug Day 1: Sunday, November 8th 2009]] (KDE Multimedia subsystem triage)&lt;br /&gt;
&lt;br /&gt;
* [[/PlasmaDay1|Plasma Bug Day 1: Sunday, April 26th 2009]] (All of Plasma Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/KMailDay3|KMail Bug Day 3: Sunday, March 15th 2009]] (All of KMail)&lt;br /&gt;
&lt;br /&gt;
* [[/KDEPimWeek1|KDE Pim Bug Week 1: Sunday, November 23rd - Saturday, December 6th 2008]] (KMail and KOrganizer)&lt;br /&gt;
&lt;br /&gt;
* [[/KDEPimDay2|KDE Pim Bug Day 2: Sunday, November 9th 2008]] (All of KDE Pim)&lt;br /&gt;
&lt;br /&gt;
* [[/KOfficeDay1/Triage|KOffice Bug Day 1, triage: Sunday, October 26th 2008]] (All of KOffice Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/KonquerorDay6|Konqueror Bug Day 6: Sunday, October 12th 2008]] (Konqueror-General Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/KDEPimDay1|KDE Pim Bug Day 1: Sunday, September 28th 2008]] (KDE Pim and Groupware Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/KMailDay2|KMail Bug Day 2: Sunday, September 14th 2008]] (All of KMail Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/KMailDay1|KMail Bug Day 1: Sunday, August 31st 2008]] (All of KMail Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/KopeteDay2|Kopete Bug Day 2: Sunday, July 20th 2008]] (All of Kopete Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/KopeteDay1|Kopete Bug Day 1: Sunday, July 6th 2008]] (All of Kopete Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/AmarokDay1|Amarok Bug Day 1: Sunday, June 15th 2008]] (All of Amarok Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/KonquerorDay5|Konqueror Bug Day 5: Sunday, June 1st 2008]] (Konqueror-General Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/KonquerorDay4|Konqueror Bug Day 4: Sunday, May 18th 2008]] (Konqueror-General Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/KonquerorDay3|Konqueror Bug Day 3: Sunday, May 4th 2008]] (Konqueror-General Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/KonquerorDay2|Konqueror Bug Day 2: Sunday, April 20th 2008]] (KHTML Triage)&lt;br /&gt;
&lt;br /&gt;
* [[/06APR08|Konqueror Bug Day 1: Sunday, April 6th 2008]] (KHTML Triage)&lt;br /&gt;
&lt;br /&gt;
==Previous Krush Days==&lt;br /&gt;
A Krush day is where the Bugsquad tests the target application and reports all the bugs they can find in it.&lt;br /&gt;
&lt;br /&gt;
* [[/KOfficeDay2|KOffice Bug Day 2: Sunday, Januar 25th 2009]] KOffice Krush (IN preparation for 2.0 release)&lt;br /&gt;
* [[/KOfficeDay1/Krush|KOffice Bug Day 1, krush: Sunday, October 26th 2008]] KOffice Krush (In preparation for 2.0 release)&lt;br /&gt;
* [[/KDEPIMKrush1|KDE PIM Krush Day 2: Sunday, June 8th 2008]] KDE PIM Krush (In preparation for 4.1 release) (Continuation from previous KDE PIM Krush Day 1 on the same page).&lt;br /&gt;
* [[/KDEPIMKrush1|KDE PIM Krush Day 1: Sunday, May 25th 2008]] KDE PIM Krush (In preparation for 4.1 release).&lt;br /&gt;
&lt;br /&gt;
==Previous bug triage events==&lt;br /&gt;
Prior to the convening of the Bugsquad in its current form, there were a number of Bug Triage and Krush events. Tehcbase pages used for these events can be found below.&lt;br /&gt;
&lt;br /&gt;
* [[Contribute/Bugsquad/KrushDays|KDE4 Krush Days]]&lt;br /&gt;
&lt;br /&gt;
* [[Contribute/Bugsquad/Bug_weekends|Konqueror Bug Weekends]]&lt;br /&gt;
&lt;br /&gt;
==Special triage pages==&lt;br /&gt;
&lt;br /&gt;
* [[/KMailWrapup|KMail Triage Wrapup]] (Bugs that still need to be touched to be done)&lt;br /&gt;
&lt;br /&gt;
* [[/KdelibsOngoing1|kdelibs]] (If you're bored, you can pick some of those :)&lt;br /&gt;
&lt;br /&gt;
* [[/KonquerorOngoing1|Konqueror]] (... or of those)&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Contribute/Bugsquad/BugDays/06APR08</id>
		<title>Contribute/Bugsquad/BugDays/06APR08</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Contribute/Bugsquad/BugDays/06APR08"/>
				<updated>2012-03-10T02:04:15Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Reverted edits by Stolsoenx3 (talk) to last revision by Grundleborg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|&lt;br /&gt;
This page is now archived for reference by the developers. Please do not add information on newly triaged bugs to it.}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
This triage day will run from 0:00 UTC - 23:59 UTC on April 6th 2008. Our target for triage is bugs listed in [http://bugs.kde.org bugs.kde.org] under the product Konqueror.&lt;br /&gt;
&lt;br /&gt;
'''The goal of this bug-day is to check for: simple step-by-step instructions, reproducibility, and most of all, come up with test-cases for reproducing the bugs. This will enable the Konqueror developers to deal with bugs more easily, and so have more time left to actually fix them.''' When you have added either a test-case or step-by-step instructions for the reproduction of a bug, please list it in the appropriate section below, so that a second triager can see if they can get your instructions/test-case to work correctly. [http://konqueror.kde.org/investigatebug/ This page] provides an excellent explanation of how to create a test-case. [http://techbase.kde.org/index.php?title=Contribute/Bugsquad This page] also has useful information on how to not mis-mark bugs. In particular, &amp;quot;duplicates are hard&amp;quot;. Konqueror doesn't have as many duplicates as some applications, and we don't want to claim things are duplicates when they aren't. So do not look too hard for them, and '''make sure''' to double check them with someone else, preferably one of the developers before marking/closing.'''We especially don't want to create more work for developers!'''&lt;br /&gt;
&lt;br /&gt;
Be sure to join #kde-bugs on irc.freenode.net, as this is where the bug-day will be coordinated. (You can even join now!)&lt;br /&gt;
&lt;br /&gt;
You should either be working with Konqueror from KDE 4 (either 4.0.2 or newer is best or SVN trunk) for testing these bugs. In this case, it probably won't matter which one, because KHTML/KJS are aggressively forward-ported and back-ported, and you might find 4.0.x easier to compile. &lt;br /&gt;
&lt;br /&gt;
You may need another browser to test things in.&lt;br /&gt;
&lt;br /&gt;
===Testcases===&lt;br /&gt;
If you come across a bug with a testcase in the text, put it under the testcase section. If it isn't marked &amp;quot;testcase&amp;quot; in the title, make a note of that. Check that the testcase works! (And doesn't work!)&lt;br /&gt;
&lt;br /&gt;
Most importantly, we need to [http://konqueror.kde.org/investigatebug/ create testcases]. These are time-consuming, but extremely useful and really help out developers. These are especially important if it is a site that is either a non-Western language or a site you need some sort of account for. &lt;br /&gt;
&lt;br /&gt;
===Unclear===&lt;br /&gt;
If something has no clear instructions on how to reproduce it, or has little useful information, add a comment asking the reporter for more detail. Then list it in the [[#Bugs_awaiting_feedback|bugs awaiting feedback]] section. Be polite, we want to be nice to our bug reporters!&lt;br /&gt;
&lt;br /&gt;
===Is it a big bug?===&lt;br /&gt;
Prioritizing is good. If a major website doesn't work, that is important.&lt;br /&gt;
Let's keep track of them. &lt;br /&gt;
&lt;br /&gt;
===Version field===&lt;br /&gt;
Keep an eye on what the &amp;quot;Version:&amp;quot; fields say in Bugzilla. If it says &amp;quot;unspecified&amp;quot;, it won't show up in developer's searches for 4.0 bugs! Change the version field to match what the other one says, i.e. to match version the bug was first reported in, or mark it below if you don't have bugzilla permissions. Do not update or change the version number (ex. from 3.5.2 to 4.0.2) if it is currently set as a number! Just make a note on the bug of what the status is in the version you are testing with (be explicit as to what version of 4 you are using, mentioning whether it is a source build or which distro the packages come from).&lt;br /&gt;
&lt;br /&gt;
===Double Check!===&lt;br /&gt;
'''Please list bugs here to get a second opinion before making the change in bugzilla. This also gives a record of what we've done for the developers to check.'''&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
&lt;br /&gt;
Please select a period of bugs from the [[#Division_of_Labour|Division of Labour]] section below and mark your name next to it and mark it with your irc nickname to show that you are working on it. When you have completed all the bugs in that section, please mark it as complete.&lt;br /&gt;
&lt;br /&gt;
For each bug, try and reproduce it as described in the report. Then list it in the appropriate section below. '''If you wish to close or mark as duplicate a bug, please list it here even if you have the bugzilla permissions to do so, in order to get a second opinion from another triager. This will help to reduce the number of incorrect actions taken on bugs.'''&lt;br /&gt;
&lt;br /&gt;
==Sign-in==&lt;br /&gt;
Tell developers what you are testing with. (If you expect to upgrade between now and BugDay, put what version you are using now next to the bugs/comments that you put on this page.) &lt;br /&gt;
&lt;br /&gt;
Please give distro/version or SVN branch/trunk with revision below:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!IRC Nickname !! KDE version used for testing&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Grundleborg|Grundleborg]]||svn trunk r793457||&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Blauzahl|Blauzahl]]|| svn branches/KDE/4.0  r793901 ||&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Finex|FiNeX]]|| svn trunk r793368||&lt;br /&gt;
|-&lt;br /&gt;
|[[User:lemma|lemma]]|| svn trunk r793971||&lt;br /&gt;
|-&lt;br /&gt;
|krop|| svn trunk r793966||&lt;br /&gt;
|-&lt;br /&gt;
|annma|| svn trunk r793777||&lt;br /&gt;
|-&lt;br /&gt;
|kirun|| 4.0.3 kubuntu||&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Njg234908|Njg234908]]|| 4.0.3 opensuse||&lt;br /&gt;
|-&lt;br /&gt;
|matt__|| svn trunk r793709||&lt;br /&gt;
|-&lt;br /&gt;
|[[User:JLP|JLP]]|| svn trunk r794088||&lt;br /&gt;
|-&lt;br /&gt;
|[[User:Gtoth|sim0nx]]|| svn trunk r793287||&lt;br /&gt;
|}&lt;br /&gt;
 &lt;br /&gt;
{{Tip|Please be sure to sign every bug or comment you add to this page with your irc nickname. You can use the wiki markup &amp;lt;nowiki&amp;gt;~~~&amp;lt;/nowiki&amp;gt; to insert your wiki username automatically (but only do this if it is the same as your IRC nickname, otherwise write your IRC nickname in by hand).}}&lt;br /&gt;
&lt;br /&gt;
==Division of Labour==&lt;br /&gt;
Please choose a month that is not already taken and then query bugs.kde.org for all bugs in that month. Please mark you irc nickname in the table below to show which month's bugs you are working on to avoid duplication of effort.&lt;br /&gt;
&lt;br /&gt;
The bugzilla query to use for this triage day can be [http://bugs.kde.org/query.cgi?short_desc_type=allwordssubstr&amp;amp;short_desc=&amp;amp;long_desc_type=allwordssubstr&amp;amp;long_desc=&amp;amp;product=konqueror&amp;amp;component=khtml&amp;amp;component=khtml+adblock&amp;amp;component=khtml+ecma&amp;amp;component=khtml+event&amp;amp;component=khtml+forms&amp;amp;component=khtml+image+part&amp;amp;component=khtml+parsing&amp;amp;component=khtml+part&amp;amp;component=khtml+printing&amp;amp;component=khtml+renderer&amp;amp;component=khtml+xml&amp;amp;bug_status=UNCONFIRMED&amp;amp;bug_status=NEW&amp;amp;bug_status=ASSIGNED&amp;amp;bug_status=REOPENED&amp;amp;bug_severity=critical&amp;amp;bug_severity=grave&amp;amp;bug_severity=major&amp;amp;bug_severity=crash&amp;amp;bug_severity=normal&amp;amp;bug_severity=minor&amp;amp;bugidtype=include&amp;amp;bug_id=&amp;amp;votes=&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;chfield=%5BBug+creation%5D&amp;amp;chfieldfrom=2003-01-01&amp;amp;chfieldto=2003-01-31&amp;amp;chfieldvalue=&amp;amp;order=Reuse+same+sort+as+last+time&amp;amp;newqueryname=konq-triage-2003-01&amp;amp;namedcmd=2003-onwards found here]. Be sure to correct the dates to the month which you will triage before running the query.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!Month !! No of bugs !! IRC Nickname !! Status&lt;br /&gt;
|-&lt;br /&gt;
|pre 2003|| 20 ||[[User:Grundleborg|Grundleborg]]||done||&lt;br /&gt;
|-&lt;br /&gt;
|2003-01 || 4 ||[[User:Finex|FiNeX]]|| done||&lt;br /&gt;
|-&lt;br /&gt;
|2003-02 || 6 ||[[User:lemma|lemma]]|| done||&lt;br /&gt;
|-&lt;br /&gt;
|2003-03 || 6 ||[[User:lemma|lemma]]|| done||&lt;br /&gt;
|-&lt;br /&gt;
|2003-04 || 3 ||[[User:lemma|lemma]]|| done||&lt;br /&gt;
|-&lt;br /&gt;
|2003-05 || 3 ||[[User:lemma|lemma]]|| done||&lt;br /&gt;
|-&lt;br /&gt;
|2003-06 || 5 ||[[User:blauzahl|blauzahl]]|| done ||&lt;br /&gt;
|-&lt;br /&gt;
|2003-07 || 6 || [[User:Grundleborg|Grundleborg]] || done ||&lt;br /&gt;
|-&lt;br /&gt;
|2003-08 || 5 ||[[User:lemma|lemma]]|| done ||&lt;br /&gt;
|-&lt;br /&gt;
|2003-09 || 3 || [[User:Grundleborg|Grundleborg]] || done ||&lt;br /&gt;
|-&lt;br /&gt;
|2003-10 || 8 || [[User:Grundleborg|Grundleborg]] || done ||&lt;br /&gt;
|-&lt;br /&gt;
|2003-11 || 12 || annma || done ||&lt;br /&gt;
|-&lt;br /&gt;
|2003-12 || 13 || [[User:Blauzahl|Blauzahl]] || done ||&lt;br /&gt;
|-&lt;br /&gt;
|2004-01 || 13 ||[[User:Finex|FiNeX]]|| done ||&lt;br /&gt;
|-&lt;br /&gt;
|2004-02 || 10 || [[User:Njg234908|Njg234908]] || done||&lt;br /&gt;
|-&lt;br /&gt;
|2004-03 || 14 || matt__ || done||&lt;br /&gt;
|-&lt;br /&gt;
|2004-04 || 11 ||[[User:Finex|FiNeX]]|| done||&lt;br /&gt;
|-&lt;br /&gt;
|2004-05 || 14 || [[User:Grundleborg|Grundleborg]] || done ||&lt;br /&gt;
|-&lt;br /&gt;
|2004-06 || 8 ||[[User:lemma|lemma]]|| done||&lt;br /&gt;
|-&lt;br /&gt;
|2004-07 || 8 ||[[User:lemma|lemma]]|| done||&lt;br /&gt;
|-&lt;br /&gt;
|2004-08 || 11 ||[[User:lemma|lemma]]|| done||&lt;br /&gt;
|-&lt;br /&gt;
|2004-09 || 16 ||[[User:Finex|FiNeX]]|| done ||&lt;br /&gt;
|-&lt;br /&gt;
|2004-10 || 8  ||[[User:Finex|FiNeX]]|| done ||&lt;br /&gt;
|-&lt;br /&gt;
|2004-11 || 12 || kirun || done ||&lt;br /&gt;
|-&lt;br /&gt;
|2004-12 || 13 || [[User:JLP|JLP]] || done ||&lt;br /&gt;
|-&lt;br /&gt;
|2005-01 || 11 || [[User:Gtoth|sim0nx]] || done ||&lt;br /&gt;
|-&lt;br /&gt;
|2005-05 || 23 ||[[User:Finex|FiNeX]]|| done ||&lt;br /&gt;
|-&lt;br /&gt;
|2005-06 || 22 ||[[User:Finex|FiNeX]]|| done ||&lt;br /&gt;
|-&lt;br /&gt;
|2005-10 || 20 ||[[User:Finex|FiNeX]]|| done ||&lt;br /&gt;
|-&lt;br /&gt;
|2005-12 || 21 ||[[User:Finex|FiNeX]]|| done ||&lt;br /&gt;
|-&lt;br /&gt;
|2006-01 || 13 ||[[User:krop|krop]]|| done ||&lt;br /&gt;
|-&lt;br /&gt;
|2006-02 || 13 ||[[User:krop|krop]]|| done ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(Total bugs 355)&lt;br /&gt;
&lt;br /&gt;
==Bugs needing version field changed==&lt;br /&gt;
Bugs should be listed here if their version field is invalid and they are still present in KDE 4, so that the version field can be corrected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Bugs with test-cases Added==&lt;br /&gt;
Bugs that have had a test case (an example of how to reproduce the bug) added should be entered below.&lt;br /&gt;
*{{Bug|19921}} - test case was already there but wasn't marked. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
**[testcase] tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|32563}} - testcase added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|79492}} - testcase already present. Bug still reproducible [[User:Finex|Finex]]&lt;br /&gt;
**seconded [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|79813}} - testcase already present. Added on the subject. Bug still reproducible: Saving the file of the testcase will start Kget which save an empty file [[User:Finex|Finex]]&lt;br /&gt;
*{{Bug|79813}} - testcase already present. Added on the subject. Bug (?) still reproducible. Is it really a bug? It should be checked if a valid email address could contain a &amp;quot;#&amp;quot; char [[User:Finex|Finex]]&lt;br /&gt;
*{{Bug|80432}} - testcase already present (even on subject). Bug still reproducible. [[User:Finex|Finex]]&lt;br /&gt;
*{{Bug|54844}} - simple (!) testcase added. Bug still reproducible but minor. Needs version change. [[User:lemma|lemma]]&lt;br /&gt;
**[testcase] tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|54696}} - testcase already present (even on subject). Bug still reproducible. Needs version change. [[User:lemma|lemma]]&lt;br /&gt;
** version changed [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|56118}} - testcase already present (even on subject). Was actually two different bugs (partly fixed), maybe rename to make the issue clearer. Needs version change. [[User:lemma|lemma]]&lt;br /&gt;
**version and title changed [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|55946}} - testcase already present (even on subject). Still present in trunk. Needs version change. [[User:lemma|lemma]]&lt;br /&gt;
** confirmed and version changed [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|37007}} - added a testcase and [testcase] tag [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|53885}} - Added an admittedly simple testcase. It might be disputable if this is actually a bug, a wish or deemed as correct behaviour. Needs version change. [[User:lemma|lemma]]&lt;br /&gt;
** see also {{Bug|47320}} - similar [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
** testcase tag added and version changed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|57819}} - Old testcases no longer valid. Added a new testcase. Bug still present in trunk. [[User:lemma|lemma]]&lt;br /&gt;
**testcase tag added and version changed [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|57360}} - Some testcases seem to work on trunk, others not. name-anchors seem more likely to work than id-anchors. Needs version change [[User:lemma|lemma]]&lt;br /&gt;
**testcase tag added and version changed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|49441}} - test case uploaded [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|50688}} - testcase copy uploaded. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|57485}} - added a simpler testcase (already labeled). still present in trunk. Needs version change. [[User:lemma|lemma]]&lt;br /&gt;
**version changed [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|57995}} - readded testcase (already labeled). still present in trunk. Needs version change. [[User:lemma|lemma]]&lt;br /&gt;
**version changed [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|51202}} - test case still fails. added testcase tag [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|59492}} - css test suite case; last test fails [[User:Blauzahl|Blauzahl]]&lt;br /&gt;
*{{Bug|58111}} - testcase already there (needs label), still reproducible in trunk. Needs version change. [[User:lemma|lemma]]&lt;br /&gt;
**testcase tag added, version changed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|58432}} - added new testcase, still reproducible in trunk. [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|60867}} - uploaded testcase as attachment. Still present in trunk. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|62072}} - testcase was already there (needs label), still present in trunk. [[User:lemma|lemma]]&lt;br /&gt;
**testcase tag added [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|63048}} - testcase was already there (needs label), still present in trunk. Needs version change. [[User:lemma|lemma]]&lt;br /&gt;
**testcase tag added [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|61176}} - testcase tag added. still in trunk. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|61417}} - testcase tag added. still present in trunk [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|64705}} - testcase tag added, still present in trunk. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|65722}} - testcase tag added, still present in trunk. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|66781}} - new testcase added by lemma.&lt;br /&gt;
**testcase tag added, version changed [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|67353}} - new testcase added by annma.&lt;br /&gt;
**testcase tag added, version changed [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|83916}} - testcase already there (needs label), could probably be made a wish. [[User:lemma|lemma]]&lt;br /&gt;
**testcase tag added [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|84217}} - testcase (needs label), confirmed, could probably be made a wish. [[User:lemma|lemma]]&lt;br /&gt;
**testcase tag added, version updated. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|83755}} - testcase (already has label), confirmed. Needs version. [[User:lemma|lemma]]&lt;br /&gt;
**version changed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|82930}} - testcase (needs label), confirmed. [[User:lemma|lemma]]&lt;br /&gt;
** marked as site issue, as there is no actual testcase here. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|83326}} - testcase (needs label), confirmed, needs recheck if I actually understood the problem. Needs version. [[User:lemma|lemma]]&lt;br /&gt;
**looks OK to me. testcase tag added, version changed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|83880}} - testcase (already has label), still minor issues. [[User:lemma|lemma]]&lt;br /&gt;
**testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|92885}} - testcase already present (needs label), confirmed.&lt;br /&gt;
**testcase tag added. confirmed on trunk. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|92699}} - testcase added, needs label, confirmed [[User:kirun|kirun]]&lt;br /&gt;
**version changed and testcase tag added [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|93747}} - existing testcase (attached), needs label, confirmed [[User:kirun|kirun]]&lt;br /&gt;
**testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|84498}} - testcase already present, confirmed. [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|85774}} - testcase already present (needs label), confirmed. [[User:lemma|lemma]]&lt;br /&gt;
** needs a minimal testcase not tied to a separate site. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|68391}} - testcase already present, confirmed. annma&lt;br /&gt;
**added testcase tag, version changed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|76489}} - testcase already present, confirmed, suggested patch already attached, matt__&lt;br /&gt;
**version set. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|76676}} - testcase already present, confirmed. matt__&lt;br /&gt;
**added confirmed comment, and version set. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|77833}} - testcase already present. animated gif no longer animates at all, if you save the file and then open it in iceweasel it works fine. matt__&lt;br /&gt;
**added comment and testcase tag. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|74569}} - 2 testcases already present and marked as [testcase]. 1st worked ok for me but 2nd partially reproduced problem. [[User:Njg234908|Njg234908]]&lt;br /&gt;
**updated version. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|68429}} - added testcase, confirmed but low priority. annma&lt;br /&gt;
**added testcase tag. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|87094}} - Bug (with testcase) reproduced on trunk. [[User:Finex|FiNeX]]&lt;br /&gt;
**version set. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|78331}} - test case already given. matt__&lt;br /&gt;
**confirmed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|78725}} - test case already given. matt__&lt;br /&gt;
**needs more investigation. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|68876}} - test case already given, not fixed in Konqueror 4.0.68. annma&lt;br /&gt;
**version set. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|69091}} - test case already given, not fixed in Konqueror 4.0.68. annma&lt;br /&gt;
**version set. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|120458}} - Testcase already present, confirmed in trunk. [[User:krop|krop]]&lt;br /&gt;
**confirmed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
** No testcase present, however... [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|89251}} - Bug confirmed on trunk (with testcase). [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|89607}} - Bug confirmed (with testcase). [[User:Finex|FiNeX]]&lt;br /&gt;
** testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|74607}} - testcase added. needs to be marked [testcase] [[User:Njg234908|Njg234908]]&lt;br /&gt;
**testcase tag added [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|75422}} - already has testcase. confirmed. Possible patch also contained in bug report. needs to be marked [testcase] [[User:Njg234908|Njg234908]]&lt;br /&gt;
**testcase tag added, version set. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|87094}} - already has testcase. confirmed. needs version attached. [[User:lemma|lemma]]&lt;br /&gt;
**confirmed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
* {{Bug|120644}} Testcase already present, the bug still exists in trunk. [[User:krop|krop]]&lt;br /&gt;
**testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|76122}} - already has testcase, confirmed in 4.0.3. needs marking [testcase] [[User:Njg234908|Njg234908]]&lt;br /&gt;
**testcase tag added, version set. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|104977}} - Found different JS problems on the webpage, them are different from the problems reported. Confirmed the problem on the testcase. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|105505}} - Bug confirmed on the testcase. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|94867}} - Testcases are there on the linked page - [[User:JLP|JLP]]&lt;br /&gt;
*{{Bug|105776}} - Bug partially confirmed. Added the testcase. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|93013}} - testcase is any frames site, added new suggestion, confirmed [[User:kirun|kirun]]&lt;br /&gt;
** needs a proper testcase. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|90602}} - Testcase valid on trunk. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|92142}} - Testcase confirmed. [[User:Finex|FiNeX]]&lt;br /&gt;
** testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|92228}} - Testcase confirmed. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|113776}} - Testcase confirmed. [[User:Finex|FiNeX]]&lt;br /&gt;
** testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|114615}} - Testcase added. [[User:Finex|FiNeX]]&lt;br /&gt;
** testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|114941}} - Testcase confirmed. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|96935}} - Testcase confirmed. [[User:Gtoth|sim0nx]]&lt;br /&gt;
** no actual testcase here. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|115325}} - Testcase confirmed. [[User:Finex|FiNeX]]#&lt;br /&gt;
** testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
* {{Bug|120644}} Testcase already present, the bug still exists in trunk. [[User:krop|krop]]&lt;br /&gt;
*{{Bug|106663}} - Testcase confirmed. Moreover a new problem is introduced on trunk. [[User:Finex|FiNeX]]&lt;br /&gt;
** bug confirmed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|106674}} - SVG rendering problem. Testcase confirmed. [[User:Finex|FiNeX]]&lt;br /&gt;
** testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|106749}} - Problem while rendering a textarea on a form. Testcase added. [[User:Finex|FiNeX]]&lt;br /&gt;
** testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|106785}} - Problem iterating CSS rules from JS. Two testcase added. [[User:Finex|FiNeX]]&lt;br /&gt;
** testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|106806}} - Set/get CSS attribute from Javascript. With testcase. [[User:Finex|FiNeX]]&lt;br /&gt;
** testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|96312}} - The bug is about websites being marked as secured (lock icon closed) but the site not or only partially being secure. The bug is still present in 3.5.9, but secured websites aren't displayed at all as being secure or not in konqi, at least not for me. [[User:Gtoth|sim0nx]]&lt;br /&gt;
** no testcase here. bug should be moved to appropriate section. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|107275}} - Javascript issue with testcase. What is the correct behavior? [[User:Finex|FiNeX]]&lt;br /&gt;
** testcase tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|107336}} - Table rendering problem. Testcase confirmed. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|107463}} - Table rendering problem with Javascript. Testcase added. [[User:Finex|FiNeX]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|107705}} - Iframe rendering problem. Testcase added. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** bug has been closed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|107862}} - GET/POST header refresh problem. Testcase added [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|117626}} - CSS rendering problem. Testcase confirmed. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|93235}} - On trunk scaling down the font size reduce the line-height. [[User:Finex|FiNeX]]&lt;br /&gt;
** needs looking at with trunk as zooming has changed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|95307}} - Testcase is there, added to summary. Bug still valid in Konqueror 4. - [[User:JLP|JLP]]&lt;br /&gt;
*{{Bug|115293}} - Added testcase. Bug reproducible. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|113907}} - Added testcase. Bug reproducible: selecting text on a fixed textarea don't make the textarea scroll. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|70350}} - existing testcase. CSS stylesheets. still bug [[User:Blauzahl|Blauzahl]]&lt;br /&gt;
*{{Bug|85609}} - testcase existing and labeled. Still reproducible. [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|118933}} - JS problem with proxyRender. Testcase reproduced on trunk. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|81739}} - test case already present [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
** test case tag already present [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|81875}} - test case added. broken in trunk and 3.5.9. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|82014}} - test case and tag added. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
**still broken in 3.5.9 and trunk. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|92183}} - Created a testcase and attached the label. The misbehaviour is not related to JavaScript but to incorrectly nested form/table tags. Might qualify as invalid, however other browsers render this correctly. [[User:lemma|lemma]]&lt;br /&gt;
** &amp;lt;s&amp;gt;The webpage is not accessible anymore. What should we do with this bug? [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;not sure I understand coolo's comment. Is it enough to explain the bug, or not? can someone else take a look please. [[User:Grundleborg|Grundleborg]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*{{Bug|118886}} - Sometimes set focus on frames doesn't work. Testcase confirmed (but I cannot reproduce anymore). [[User:Finex|FiNeX]]&lt;br /&gt;
** confirmed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|89373}} - testcase tag added. still buggy in trunk and 3.5.9. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|106386}} - still present in 3.5.9 and partially fixed in trunk. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|89999}} - Need some more infos. [[User:Finex|FiNeX]]&lt;br /&gt;
** According to the reporter the testcase needs to be modified a little [[User:lemma|lemma]]&lt;br /&gt;
** have requested the test-case maker to update it if possible. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
** oh, nice, they did. this is verified and should get moved to the testcase secion now&lt;br /&gt;
&lt;br /&gt;
==Bugs with step-by-step instructions==&lt;br /&gt;
If you have provided step by step instructions on how to reproduce a bug, please list the bug here.&lt;br /&gt;
&lt;br /&gt;
*{{Bug|80067}} - For reproduce the bug go to google.com, type some text on the search field, press &amp;quot;TAB&amp;quot; and &amp;quot;SPACE&amp;quot; quickly. The search will not be started. [[User:Finex|Finex]]&lt;br /&gt;
*{{Bug|51649}} - reproduced using instructions. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|61710}} - instructions to reproduce. Would be good if someone could figure out how to make a testcase out of it. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|65528}} - instructions tag added, since easy steps to reproduce. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|105846}} - Bug confirmed on trunk. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|106407}} - Bug confirmed on trunk. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|106469}} - The flash applet is loaded right (using a valid user-agent), but the image above is not refreshed clicking on the &amp;quot;NEXT&amp;quot; button. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|115182}} - The preload seems ok. But the page on the right is not rendered correctly when you click directly on pages. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|97167}} - Added new url to test the bug on...still present in trunk [[User:Gtoth|sim0nx]]&lt;br /&gt;
*{{Bug|107209}} - Bug reproduced in trunk. Tabs opened with JS doesn't activate konqueror tab actions. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|108077}} - Bottom frame is not rendered when the website is loaded. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|117569}} - Google analytics is still not well rendered. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|118104}} - konqueror trunk doesn't crash on a alert message in a specific webpage. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|118406}} - Still rendering problems on the webpage (differents from the initial report). Added a screenshot. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|107321}} - Bug reproduced on trunk. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|106748}} - The page now is rendered better. I wasn't able to reproduce the rendering problems reported initially. Anyway the page is not perfect, there are still some rendering problem, probably related to the JS. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|118459}} - Printing problem confirmed on specific page. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|118471}} - The page on the example is completely broken. Anyway the website has been (fortunatly) updated. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|118842}} - Bug confirmed even on trunk (search on lufthansa website doesn't work) [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|118890}} - Ford website car builder doesn't work. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|119824}} - Resolved in trunk [[User:krop|krop]]&lt;br /&gt;
** Actually I can still reproduce this bug. Just be sure not to move the mouse while entering the page (eg. use caret mode). IMO minor bug [[User:lemma|lemma]]&lt;br /&gt;
* {{Bug|122696}} - Resolved in konq4 [[User:krop|krop]]&lt;br /&gt;
** Not solved [[User:finex|FiNeX]]&lt;br /&gt;
*{{Bug|105723}} - Reproduced on 3.5.9 and trunk. [[User:Finex|FiNeX]]&lt;br /&gt;
&lt;br /&gt;
*{{Bug|77924}} - after discussion on irc we decided this was the right place for this bug. matt__&lt;br /&gt;
** reporter says it is not actually fixed yet. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
&lt;br /&gt;
==Bugs no longer present in 4.x==&lt;br /&gt;
If a bug is reported against a version of KDE before 4.0, but the bug can no longer be reproduced in KDE 4.x, then it should be listed here. Please '''do not''' close the bug. The Konqueror developers would like to check each one before they are closed.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|160082}} - works in 4.0.2, reported in 3.5.9 with '''backtrace''' [[User:Blauzahl|Blauzahl]] 03:31, 4 April 2008 (CEST)&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|52801}} - Performance improved. Not valid on 4.0.3 [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|120315}} - Can't reproduce in trunk. [[User:krop|krop]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;XHR/Qt crap, duping it with #124910, looks like this one stays, sorry[[User:Blauzahl|Blauzahl]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** has been closed as a dupe. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|87178}} - The website now is rendered quite well because there are no layers  (the bug was about &amp;quot;layers&amp;quot; on webpages). [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt; thanks carewolf!&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|78046}} - test case appears to be working in trunk. matt__&lt;br /&gt;
** requires java to check. [[User:Grundleborg|Grundleborg]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|94755}} - messages do show in Konqueror 4 (svn r794088) and probably also in 3.5.9 - [[User:JLP|JLP]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** closed WORKSFORME. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|106330}} - Fixed on trunk. Tried the testcase. The event is called on the onload() of animated gif. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|106367}} - The website seems to be ok. The navigation is not slow. [[User:Finex|FiNeX]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|92186}} - The first website is no more valid. The second one is correct. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt; closed by [[User:finex|FiNeX]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|114212}} - Cannot reproduce on KDE4. It has been fixed. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt; closed by [[User:finex|FiNeX]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|114636}} - Cannot reproduce on KDE4. It has been fixed. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt; closed by [[User:finex|FiNeX]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|115101}} - Cannot reproduce on KDE4. It has been fixed. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt; closed by [[User:finex|FiNeX]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|115102}} - Cannot reproduce on KDE4. It has been fixed. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt; closed by [[User:finex|FiNeX]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|115323}} - Fixed on both 3.5.8 and trunk. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt; closed by [[User:finex|FiNeX]]&lt;br /&gt;
* &amp;lt;s&amp;gt;{{Bug|121224}} Testcase already present, bug resolved in trunk. [[User:krop|krop]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** appears fixed. Closed: WORKSFORME. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
* &amp;lt;s&amp;gt;{{Bug|121266}} Testcase already present, wish granted in trunk. [[User:krop|krop]]&amp;lt;/s&amp;gt; closed by [[User:finex|FiNeX]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|97355}} - Fixed on both 3.5.9 and trunk. [[User:Gtoth|sim0nx]]&amp;lt;/s&amp;gt; closed by [[User:finex|FiNeX]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|97621}} - Fixed on both 3.5.9 and trunk. [[User:Gtoth|sim0nx]]&amp;lt;/s&amp;gt; closed by [[User:finex|FiNeX]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|107061}} - The webpage is rendered correctly. It was reported a CSS rendering problem. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** can't reproduce in trunk, so closed. Have a feeling it is still in 3.5.9, but not sure. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|122052}} - Testcase already present - The bug is resolved in konq4 [[User:krop|krop]]&amp;lt;/s&amp;gt; closed by [[User:finex|FiNeX]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|107904}} - Cannot reproduce on trunk. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Closed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|108116}} - Konqueror load the website without using a lot of CPU. Maybe the website now is better, or maybe even konqueror is better. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Closed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|108156}} - The website is correctly rendered on trunk. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|117776}} - Konqueror in trunk is rendering the table on the webpage correctly. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|118190}} - The webpage pointed seems to be correctly rendered. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*{{Bug|118471}} - Cannot reproduce the rendering problem. The first example is correct, the second test address is unreachable. [[User:Finex|FiNeX]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|118646}} - Cannot reproduce the rendering problem on trunk. It has been reproduced on 4.0.3 instead. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Closed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
** can't reproduce with trunk or 3.5.9. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|118671}} - Bug fixed in KDE 3.5.8 and KDE 4. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*{{Bug|118860}} - Sites displayed correctly in UTF8 (with jap). [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|92274}} - &amp;lt;s&amp;gt;Website changed. Cannot reproduce the bug anymore. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;requested a current example or testcase. [[User:Grundleborg|Grundleborg]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**gathered an old version using archive.org which seems to render correctly. [[User:lemma|lemma]]&lt;br /&gt;
** CLOSED. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
&lt;br /&gt;
==Bugs no longer present in 4.x, but still present in 3.5.9==&lt;br /&gt;
If a bug is reported against a version of KDE before 4.0, the bug is no longer present in 4.x but is still reproducible in 3.5.9 then it goes here. &amp;lt;b&amp;gt;Bugs in this list have already been closed with their version set to 3.5 and the resolution set to LATER.&amp;lt;/b&amp;gt; Like that the developers should have no trouble finding bugs that qualify for backporting.&lt;br /&gt;
*{{Bug|79207}} - &amp;lt;s&amp;gt;cannot reproduce in svn trunk, the select box is working as expected [[User:Finex|FiNeX]] [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Still present in 3.5.9 (minor) [[User:lemma|lemma]]&lt;br /&gt;
** backport, form, minor [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|54985}} - &amp;lt;s&amp;gt;works in trunk, both testcases mentioned work fine here [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Still present in 3.5.9 (major) [[User:lemma|lemma]]&lt;br /&gt;
** backport, printing [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|55260}} - &amp;lt;s&amp;gt;works in trunk, simple testcase added to confirm. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Still present in 3.5.9 [[User:lemma|lemma]]&lt;br /&gt;
** backport, table border [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|56354}} - &amp;lt;s&amp;gt;testcase works in trunk. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Still present in 3.5.9 (minor) [[User:lemma|lemma]]&lt;br /&gt;
** backport, jpeg exif [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|48341}} - &amp;lt;s&amp;gt;seems to be fixed from the test-case included [[User:Grundleborg|Grundleborg]] [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Still present in 3.5.9 [[User:lemma|lemma]]&lt;br /&gt;
** backport, tab-index [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|49523}} - &amp;lt;s&amp;gt;included test case works fine [[User:Grundleborg|Grundleborg]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**Still an issue in 3.5.9 [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
**backport, encoding russian [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|63112}} - &amp;lt;s&amp;gt;seemed to be more of a wishlist item, however fixed in trunk. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** still in 3.5.9 [[User:lemma|lemma]]&lt;br /&gt;
** backport, png minor [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|64635}} - &amp;lt;s&amp;gt;testcase tag added, can't reproduce in trunk. [[User:Grundleborg|Grundleborg]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** still in 3.5.9 [[User:lemma|lemma]]&lt;br /&gt;
** backport, javascript [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|56188}} - &amp;lt;s&amp;gt;testcase works in trunk. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** still in 3.5.9 [[User:lemma|lemma]]&lt;br /&gt;
** backport, form corruption major [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|66583}} - &amp;lt;s&amp;gt;can't reproduce in trunk. [[User:Grundleborg|Grundleborg]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**Bug still present in 3.5.9 [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
**backport, text selection [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|82737}} - &amp;lt;s&amp;gt;testcase works in trunk. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Still present in 3.5.9. [[User:lemma|lemma]]&lt;br /&gt;
** backport, iframe background [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|84512}} - &amp;lt;s&amp;gt;testcase works in trunk, probably due to Qt4. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** still in 3.5.9 [[User:lemma|lemma]]&lt;br /&gt;
** backport, image rendering [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|87562}} - &amp;lt;s&amp;gt;Cannot reproduce on Konqueror 4 because the &amp;quot;enlarge&amp;quot; and &amp;quot;shrink&amp;quot; actions haven't a button. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** still reproductible in 3.5.9 [[User:lemma|lemma]]&lt;br /&gt;
** actually they do have buttons for me but the behaviour has changed (see the HTML toolbar). However it's fixed for trunk as the maximize-button no longer gets disabled. [[User:lemma|lemma]]&lt;br /&gt;
** backport, zooming user-interface [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|93078}} - &amp;lt;s&amp;gt;Can't reproduce, new tests added [[User:kirun|kirun]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** I can still reproduce this partly in 3.5.9.&lt;br /&gt;
** backport tooltips [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|119326}} - &amp;lt;s&amp;gt;Resolved in trunk [[User:krop|krop]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** This bug is still present in 3.5.9. [[User:lemma|lemma]]&lt;br /&gt;
** backport, embedded text-editor [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|74709}} - &amp;lt;s&amp;gt;can't reproduce in 4.0.3 [[User:Njg234908|Njg234908]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** still present in 3.5.9. [[User:lemma|lemma]]&lt;br /&gt;
** backport, css menu [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|105327}} - &amp;lt;s&amp;gt;The bug seems solved on 4.0.3. It needs to be verified. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Still present in 3.5.9. [[User:lemma|lemma]]&lt;br /&gt;
** backport, embedded midi looping [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|77966}} - &amp;lt;s&amp;gt;testcase works in trunk. matt__&amp;lt;/s&amp;gt;&lt;br /&gt;
** still reproducible in 3.5.9 [[User:lemma|lemma]]&lt;br /&gt;
** backport, tesco.com, javascript shopping-cart [[User:lemma|lemma]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|120124}} - Resolved in trunk [[User:krop|krop]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**still in 3.5.9 but fixed in trunk. Closed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
** backport, gis javascript [[User:lemma|lemma]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|117949}} - fixed in trunk but still in 3.5.9. [[User:Edulix|Edulix]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** backport, tabbing user-interface [[User:lemma|lemma]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|82420}} - fixed in trunk but still in 3.5.9. [[User:Grundleborg|Grundleborg]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** closed as later, as could be backported. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|81187}} - fixed in trunk. [[User:Grundleborg|Grundleborg]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**Still present in 3.5.9 [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
**closed as LATER, as could be backported. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|114386}} - Cannot reproduce on KDE4. It has been fixed. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** fixed in trunk, still present in 3.5.9. Closed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
&lt;br /&gt;
==Bugs no longer present in 3.5.9 and 4.x==&lt;br /&gt;
If a bug is reported against a version of KDE before 4.0, but the bug is no longer present in 3.5.9 and 4.x, then it should be listed here. Please '''do not''' close the bug. The Konqueror developers would like to check each one before they are closed.&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|31575}} - seems to be fixed in svn trunk [[User:Grundleborg|Grundleborg]] [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|55912}} - testcase works in 3.5.9 and trunk. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|39703}} - can't reproduce in trunk [[User:Grundleborg|Grundleborg]] works in 3.5.9 as well [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|63139}} - testcase works in trunk but exposes another possible bug which I'm going to file separately. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Set to remind in case problems occur with a smaller CPU than mine [[User:lemma|lemma]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|62481}} - seems to work fine in trunk. new testcase to confirm added (needs label?). [[User:lemma|lemma]] works in 3.5.9 as well [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|64382}} - test case tag added, can't reproduce in trunk. [[User:Grundleborg|Grundleborg]] can't reproduce in 3.5.9 [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|92685}} - bug asks for wrapping, testcase now makes scrollbar which seems OK [[User:kirun|kirun]] wrapping in 3.5.9, so I consider this fixed [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|77454}} - seems to be fixed (e.g. 'annoying' behaviour gone!). matt__&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;works in 3.5.9 as well [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|74352}} - unable to reproduce in 4.0.3 [[User:Njg234908|Njg234908]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|74471}} - unable to reproduce in 4.0.3 [[User:Njg234908|Njg234908]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;works in 3.5.9 as well [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|86794}} - Bug fixed (on both KDE3.5.8 and trunk) but the report was left open. It should be closed.  [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|86727}} - Not reproducible on trunk (testcase included). [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;works in 3.5.9 as well [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|68574}} - testcase appears to be working in trunk: no difference with Firefox for ex. annma.&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;Working on 3.5.9 as well. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|80754}} - added a testcase. seems to be fixed in trunk though. [[User:Grundleborg|Grundleborg]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;also working in 3.5.9. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|119721}} - Resolved in trunk [[User:krop|krop]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;also working in 3.5.9. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|88801}} - Cannot reproduce on trunk. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;also working in 3.5.9. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|88851}} - Cannot reproduce. Bug fixed on both KDE 3.5 and trunk. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|89231}} - Bug not reproducible on trunk. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;also working in 3.5.9. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|74877}} - can't reproduce in 4.0.3 [[User:Njg234908|Njg234908]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;also working in 3.5.9. [[User:lemma|lemma]]&amp;lt;/s&amp;gt; REMIND&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|87150}} - Website address changed. Tested the new  (?) address (http://europa.eu/index_fr.htm) which is working. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;Recovered the old page from archive.org and attached that address. Works in 3.5.9 as well as trunk. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt; {{Bug|69646}} - popup menu disabled after http request dispatch closed with worksforme  (it worked for last commenter, and if I understand them correctly, works fine now) confirmed by fredrikh&amp;lt;/s&amp;gt; [[User:Blauzahl|Blauzahl]]&lt;br /&gt;
* &amp;lt;s&amp;gt; {{Bug|160268}} - nspluginviewer crash under 3.5.8 not specific report anyway&amp;lt;/s&amp;gt; fredrikh agrees. Great pathological website though: www.canal13.cl [[User:Blauzahl|Blauzahl]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|160385}} - Fixed in 4.02&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;this fix has already been backported. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|105358}} - The page is correctly rendered. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;Fixed for 3.5.9 as well [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|95274}} - either this is fixed in 3.5.9 and trunk, or my test-case is invalid. Please can someone check the testcase is valid before closing this one. [[User:Grundleborg|Grundleborg]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Closed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
* &amp;lt;s&amp;gt;{{Bug|121665}} - Testcase added - The bug is resolved in konq4 [[User:krop|krop]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;also fixed in 3.5.9 [[User:Grundleborg|Grundleborg]] &amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|86938}} - added new testcase (needs label). Seems to be fixed in trunk. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** fixed in trunk and 3.5.9. Closed. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|95028}} - No crash here. - [[User:JLP|JLP]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** can't reproduce in trunk or 3.5.9. Closing. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|118761}} - The bug seems fixed. But I'm waiting for an answer for confirmation. [[User:Finex|FiNeX]]&lt;br /&gt;
** The bug is about login problems on plesk7. Logging in works in the oldest version of plesk around which is 7.5 reloaded. Maybe we should consider closing this bug. [[User:lemma|lemma]]&lt;br /&gt;
** You're right. I close it now. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|114828}} - Konqueror now doesn't use lot of CPU. The bug is probably fixed. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** WORKSFORME in trunk and 3.5.9 [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
&lt;br /&gt;
==Bugs to be marked as RESOLVED==&lt;br /&gt;
Bugs filed against KDE 4 (ie, only very recent ones) that can no longer be reproduced should be listed here. Bugs filed against earlier versions of KDE that can no longer be reproduced should be listed in the section above.&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|159325}} - Seems to be OK with kdelibs: r793701, kdebase: r793720 - [[User:JLP|JLP]]&amp;lt;/s&amp;gt; REPORT CLOSED [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
&lt;br /&gt;
==Bugs to be marked as INVALID==&lt;br /&gt;
Bugs which are no longer valid go here. A link to the bug and why it qualifies as invalid should be provided.&lt;br /&gt;
&lt;br /&gt;
Some examples of when a bug should be closed as INVALID:&lt;br /&gt;
*The reported behavior is not a bug&lt;br /&gt;
*The bug is completely unrelated to KDE&lt;br /&gt;
&lt;br /&gt;
This list is not exhaustive. If you feel a bug is invalid for any other reason, be sure to list it here, mentioning why you think it is invalid.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|59815}} - Closed with REMIND per SadEagle's instructions [[User:Blauzahl|Blauzahl]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|85783}} - testcase renders the same in 3.5.9, trunk, FF2, IE6/7, probably an error in the page. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**I agree with lemma. This bug is clealy an issue with the web site, not with konqueror. (just look at the source of the test-case to see why!) [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
**Closed INVALID as confirmed by several people. [[User:lemma|lemma]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|87357}} - Bug not reproducible: website changed and no informations about the problem. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**closed as &amp;quot;remind&amp;quot; [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|94675}} - Can't reproduce, it looks like site changed. New one appears to work fine. - [[User:JLP|JLP]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**closed as &amp;quot;remind&amp;quot;. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|106281}} - Cannot reproduce the problem because the example testsite has been updated. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**closed as &amp;quot;remind&amp;quot; since the example site no longer works. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|114415}} - This is a WISH. Severity changed. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**I agree with Finex, and he's already changed it :). [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
* &amp;lt;s&amp;gt;{{Bug|119944}} The bug cannot be reproduced (website was updated) [[User:krop|krop]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**reporter says site no longer triggers bug, so can not test it. closed as remind. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
* &amp;lt;s&amp;gt;{{Bug|81185}} The bug cannot be reproduced (website was updated). Closed as REMIND.&amp;lt;/s&amp;gt; [[User:lemma|lemma]]&lt;br /&gt;
* &amp;lt;s&amp;gt;{{Bug|70365}} I really want to close this with REMIND. game controls under flash? flash stuff has changed so much.... [[User:Blauzahl|Blauzahl]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Its closed now. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
* {{Bug|70855}} - &amp;lt;s&amp;gt;I should just close this as INVALID, as the site is long gone, but I like Brazilians, so maybe when I'm awake, I'll go back and use REMIND. I'm not doing this right now, because the 404 has an interesting rendering error which I should probably file a bug on if I knew what to call it. (blue line thick in konq, thin in ice weasel) http://www.in.gov.br/imprensa/index.html [[User:Blauzahl|Blauzahl]] &amp;lt;/s&amp;gt;&lt;br /&gt;
** FIXED by Maksim. [[User:lemma|lemma]]&lt;br /&gt;
Opps! That's the wrong number, but I'll find it. :)&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|70447}} - This bug is related to mouse-hiding. As the actual bug-report is about the reporter not wanting his mouse pointer hidden this should be closed WONTFIX. The discussion about mouse hiding behaviour carries on after though. There's two follow-ups to mouse behaviour in 3.5.9 and current trunk which could be used instead:&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;{{Bug|100274}} - behaviour on 3.5.9&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;{{Bug|161532}} - behaviour on trunk&amp;lt;/s&amp;gt;&lt;br /&gt;
*** These three have all been closed now. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
&lt;br /&gt;
==Bugs to be marked as DUPLICATE==&lt;br /&gt;
Duplicates found should be placed here with a link to the bug which you think it is a duplicate of.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;s&amp;gt; {{Bug|160268}} - Flash crash in 3.5.8 that was fixed in 3.5.9&amp;lt;/s&amp;gt;[[User:Blauzahl|Blauzahl]]&lt;br /&gt;
*&amp;lt;s&amp;gt; {{Bug|74286}} - font face issue - needs a setup with no MS Fonts installed and fontconfig set to replace missing fonts... [[User:Njg234908|Njg234908]]&lt;br /&gt;
** Duplicate of {{Bug|57485}}, asked frederikh&amp;lt;/s&amp;gt; [[User:lemma|lemma]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;{{Bug|122123}} - Duplicate of {{Bug|36912}} [[User:krop|krop]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;{{Bug|117934}} - Maybe this is a dup of {{Bug|48302}}. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** agreed. done. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
&lt;br /&gt;
==Bugs needing users with particular setups==&lt;br /&gt;
Bugs that require particular software or hardware that you don't have available should be listed here with a description of the non-standard requirement.&lt;br /&gt;
*{{Bug|55087}} - the reporter was using a PIII 500MHz, I'm on a Q6600. Moving the mouse as reported uses quite some CPU (&amp;gt;32% on 3.5.9, &amp;lt;27% on trunk) but someone with an older CPU should see if this is still an issue. [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|60652}} - needs someone with an ebay account to create a simple test-case so non-ebay account holders can reproduce the bug. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
**have tested on current ebay site using 4.0.3 and added instructions to reproduce. couldn't see an easy way of creating a standalone testcase. [[User:Njg234908|Njg234908]]&lt;br /&gt;
*{{Bug|77030}} - needs someone who can read hindi (Devanagari script) to check this one - possibly fixed in trunk. matt__&lt;br /&gt;
*{{Bug|77246}} - needs someone with a Yahoo! ID. matt__&lt;br /&gt;
** Testcase added, no Yahoo account needed now, needs marking as [testcase] [[User:Njg234908|Njg234908]]&lt;br /&gt;
*{{Bug|78210}} - needs someone with a gay.com account. matt__&lt;br /&gt;
*{{Bug|105538}} - Bug on BIDI rendering text. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|106244}} - Need to be tested by someone which has an account to the website. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|113811}} - Need testing by someone with an account on dresdner-privat.de. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|114849}} - Need to be tested on particular hours/days. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|106742}} - The problem seems being reproducible even on KDE4. Need to be tested by someone with a blogger.com account. [[User:Finex|FiNeX]]&lt;br /&gt;
**Tested and unable to reproduce in 4.0.3 here.  [[User:Njg234908|Njg234908]]&lt;br /&gt;
*{{Bug|90035}} - Performance problem not present in trunk. [[User:Finex|FiNeX]]&lt;br /&gt;
** I guess someone with a slow CPU (orig. reporter had around 1GHz) should recheck this on 3.5.9. [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|96296}} - Website which make konqueror crash is no more reachable. There are no infos and testcases. [[User:Gtoth|sim0nx]]&lt;br /&gt;
** This one also needs someone with FreeBSD to test. [[User:lemma|lemma]]&lt;br /&gt;
*{{Bug|105959}} - Needs realplayer plugin. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
&lt;br /&gt;
==Non english locales==&lt;br /&gt;
Bugs requiring non-English locales should be listed here, along with the locale they require.&lt;br /&gt;
*{{Bug|79356}} - need testing with JP locale. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|52685}} - need testing with JP locale. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|86938}} - Need testing with charset different from ISO-8859-1. [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|89484}} - Problem confirmed on Thai charset (testcase included). [[User:Finex|FiNeX]]&lt;br /&gt;
*{{Bug|81628}} - needs someone who understands about arabic/RTL text etc... [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
&lt;br /&gt;
{{:Contribute/Bugsquad/BugDays/06APR08/Bugs_needing_attention_from_Konqueror_developers}}&lt;br /&gt;
&lt;br /&gt;
==High Profile==&lt;br /&gt;
*{{Bug|93648}} - Affects Hotmail. Related to javascript. Probably WISH as it relates to the implementation of the non-standard window.showModalDialog(). testcase added to the bug. [http://developer.mozilla.org/en/docs/DOM:window.showModalDialog  Testcase] [[User:kirun|kirun]]&lt;br /&gt;
&lt;br /&gt;
==Needs more information==&lt;br /&gt;
&lt;br /&gt;
!! DONE !!&lt;br /&gt;
&lt;br /&gt;
*{{Bug|55870}} - &amp;lt;s&amp;gt;The URL (k-state) given by the original reporter is offline. According to archive.org the menu consisted of an image map which works flawless in 3.5.9 and trunk. The second URL (mplayer) looks the same in Firefox. It seems this problem is not reproducible. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** The pages mentioned have been confirmed to work, so I closed this one. [[User:lemma|lemma]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|86747}} - Website which make konqueror crash is no more reachable. There are no infos and testcases. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** teve once had a testcase for this. I asked him if it was still available. [[User:lemma|lemma]]&lt;br /&gt;
** closed as REMIND. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|106391}} - Example webpage not reachable. Asked a testcase. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** closed REMIND. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|97765}} - Website which make konqueror crash is no more reachable. There are no infos and testcases. [[User:Gtoth|sim0nx]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** closed REMIND [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|97077}} - Testcase described but test website no longer reachable. I've asked the reporter to verify the bug and if possible upload the files which baused the problem. [[User:Gtoth|sim0nx]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** closed REMIND. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
&lt;br /&gt;
==Bugs awaiting feedback==&lt;br /&gt;
&lt;br /&gt;
!! DONE !!&lt;br /&gt;
&lt;br /&gt;
'''NB. Feedback should only be requested for bugs if you have tried and failed to reproduce them or if the report contains insufficient information to try and reproduce the bug. Requesting feedback for a bug should be seen as a ''last resort'' only.'''&lt;br /&gt;
&lt;br /&gt;
Bugs for which feedback has been requested, which should be revisited in 30 days to see if there's any response. Please list all bugs here for which feedback has been requested.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|59698}} - I can't reproduce this from the old links given. teve could at one point. (nyt js popup bug) [[User:Blauzahl|Blauzahl]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;No feedback: REMIND [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|90308}} - Need feedback. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;No feedback: REMIND [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|105123}} - It seems that the bug is no more applicable because the website has changed. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**asked if this can still be reproduced. Will give 30 days, then close. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
** has reportedly been fixed on trunk. depending on if it also works in 3.5.9 we have to change the resolution (already closed). [[User:lemma|lemma]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|121668}} - Need to be marked as invalid [[User:krop|krop]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;can't get that site to load either. requested feedback. [[User:Grundleborg|Grundleborg]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;No feedback: REMIND [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|122671}} - No answer from the reporter / Testcase cannot be verified (site is down). [[User:krop|krop]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;No feedback: REMIND [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|77592}} - needs someone with Java. matt__&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;Original site no longer available. The original reporter is trying to get it back. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** Update: The administrators of the site in question are not going to put it online again. The bug was marked RESOLVED.&lt;br /&gt;
* &amp;lt;s&amp;gt; {{Bug|92937}} - neither of the sites listed give me high CPU [[User:kirun|kirun]]&lt;br /&gt;
** The sites have changed. As the the reporter mentioned several sites I posted a comment to ask for other sites he's observing high CPU. Probably could be set to REMIND soon. [[User:lemma|lemma]] &amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|86671}} - seems fixed in trunk but only part is checkable to no-longer existant external testcase. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;Posted a comment asking if this is still reproducible. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;Someone already closed as WORKSFORME [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|161056}} There's really not much information and I can't reproduce it. [[User:Edulix|Edulix]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** reporter WORKSFORME'd it. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|160945}} There's really not much information and I can't reproduce it. [[User:Edulix|Edulix]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;Someone already closed this as WORKSFORME [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|105250}} - This bug needs more info. I've asked on the report a testcase because the old one is not available. [[User:Finex|FiNeX]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;I added what was reported to a minimal testcase and asked if it was correct. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;Already closed as WORKSFORME [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;{{Bug|85788}} - testcase (needs to be labeled), one part of the bug has been fixed, the other is not checkable due to the external testcase being unavailable. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;Asked the reporter if that problem was fixed for him somewhen. We won't be able to recover that page I fear. [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
**&amp;lt;s&amp;gt;Already closed as WORKSFORME [[User:lemma|lemma]]&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bugs not related to today==&lt;br /&gt;
*{{Bug|160394}} - KSSL related&lt;br /&gt;
**now listed as konqueror-general so shouldn't be included in todays triage anyway. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
* {{Bug|70079}} - khtml image part behavior, minor, is this part dolphin by now? [[User:Blauzahl|Blauzahl]]&lt;br /&gt;
** I don't think so, since it affects view-&amp;gt;image in a web page. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
*{{Bug|120476}} (still problematic in KDE4 [[User:Grundleborg|Grundleborg]]), {{Bug|121401}} (not sure [[User:Grundleborg|Grundleborg]]) - not sure what to do since there are no &amp;quot;access keys&amp;quot; in Konqueror 4. [[User:Grundleborg|Grundleborg]]&lt;br /&gt;
**These were just reimplemented, and I suspect it is different code. (blauzahl)&lt;br /&gt;
**will test next time I svn up. [[User:Grundleborg|Grundleborg]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/MovetoGit/Progress</id>
		<title>Projects/MovetoGit/Progress</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/MovetoGit/Progress"/>
				<updated>2012-02-23T08:16:04Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* What to take from where for release? */ Remove out-dated comment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== What to take from where for release? ===&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; width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#afafaf;&amp;quot;&lt;br /&gt;
! Module/Application&lt;br /&gt;
! branch name scheme / comment&lt;br /&gt;
! 4.7&lt;br /&gt;
! 4.8&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeaccessibility'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | jovie&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kaccessible&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kmag&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kmousetool&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kmouth&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeadmin'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeartwork'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdebase'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kde-runtime&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kde-workspace&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kde-baseapps&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kate&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | konsole&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdebindings'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kimono&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | qyoto&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kross-interpreters&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | perlkde&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | perlqt&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | pykde4&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | korundum&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | qtruby&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | smokegen&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | smokekde&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | smokeqt&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeedu'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | blinken&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | cantor&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kalgebra&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kalzium&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kanagram&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kbruch&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kgeography&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | khangman&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kig&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kiten&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | klettres&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kmplot&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kstars&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | ktouch&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kturtle&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kwordquiz&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libkdeedu&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | marble&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | parley&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | rocs&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | step&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdegames'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdegraphics'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libksane&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libkexiv2&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libkdcraw&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libkipi&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | ksaneplugin&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kolourpaint&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | ksnapshot&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | gwenview&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kruler&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | mobipocket&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | svgpart&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kcolorchooser&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kgamma&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdegraphics-strigi-analyzer&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdegraphics-thumbnailers&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kamera&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | okular&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdelibs'''&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdemultimedia'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdenetwork'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdepim'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdepim&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdepim-runtime&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdepimlibs&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeplasma-addons'''&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdesdk'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdetoys'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeutils'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | ark&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | filelight&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kcalc&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kcharselect&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdiskfree&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kfloppy&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kgpg&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | printer applet&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kremotecontrol&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | ktimer&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kwallet&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | superkaramba&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | sweeper&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdewebdev'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdesupport (somewhat)'''&lt;br /&gt;
|&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kde-wallpapers&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color: white;&amp;quot; | ?&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | oxygen-icons&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/MoveToGit/StepsToMove</id>
		<title>Projects/MoveToGit/StepsToMove</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/MoveToGit/StepsToMove"/>
				<updated>2012-02-23T08:12:36Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix link.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page documents the steps to follow for moving a module from KDE's subversion repository to gitorious.org.&lt;br /&gt;
&lt;br /&gt;
* Write a ruleset for the module and make sure the git repository has all necessary history in it. See the [[Projects/MoveToGit/UsingSvn2Git|Using Svn2Git]] page for more information about this step.&lt;br /&gt;
* Find a sysadmin who can shut down write access to all places in svn that belong to the module. This is needed so that a final rsync will contain all current history for the module and you don't miss any commit.&lt;br /&gt;
* Execute the conversion to create a local git repository&lt;br /&gt;
* Create a project (if there's no existing one that fits yet) and a git repository on gitorious.org via its webinterface.&lt;br /&gt;
* Create a &amp;lt;module&amp;gt;-reviewers group with the review permission set for the git repository&lt;br /&gt;
* Create a &amp;lt;module&amp;gt;-maintainers group (or invite admin users individually)&lt;br /&gt;
* Give the kde-developers group commit permissions so that any KDE developer can easily collaborate on the module&lt;br /&gt;
* The kde-sysadmins needs to be added too with admin rights, so they can help with tagging and general administration (setting up hooks etc.)&lt;br /&gt;
* Add the new remote repository to your local one as new remote, then push all local branches and tags to the remote repository.&lt;br /&gt;
* Scripty needs to be pointed to the new place of the module, you can send the kde-i18n-doc mailinglist a note and it should be taken care of.&lt;br /&gt;
* Clean up subversion, this means either leaving a single README file instead of the original content of the module, or removing the path completely&lt;br /&gt;
* Point EBN to the new place of the module: Contact Allen Winter.&lt;br /&gt;
* Point LXR to the new place of the module: Contact [https://bugs.kde.org/enter_sysadmin_request.cgi KDE's sysadmins].&lt;br /&gt;
* Adjust the developer information on www.kde.org&lt;br /&gt;
&lt;br /&gt;
Thats it. More information on the permissions and post-hook scripts (for BUG:, CCMAIL: etc) can be found on the [[Development/Git|KDE on Git]] page.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/MediaWiki:Filedelete-reason-dropdown</id>
		<title>MediaWiki:Filedelete-reason-dropdown</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/MediaWiki:Filedelete-reason-dropdown"/>
				<updated>2012-01-30T11:50:55Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Add Spam as deletion reason&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*Common delete reasons&lt;br /&gt;
** Copyright violation&lt;br /&gt;
** Spam&lt;br /&gt;
** Duplicated file&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Thread:User_talk:Droetker/Sehr_sch%C3%B6n</id>
		<title>Thread:User talk:Droetker/Sehr schön</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Thread:User_talk:Droetker/Sehr_sch%C3%B6n"/>
				<updated>2012-01-14T23:41:01Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: New thread: Sehr schön&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sehr schön, dass sich jemand die Übersetzungen ansieht und da einmal aufräumt. :)&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User_talk:Droetker</id>
		<title>User talk:Droetker</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User_talk:Droetker"/>
				<updated>2012-01-14T23:41:01Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Talk page autocreated when first thread was posted&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Policies/Kdelibs_Coding_Style</id>
		<title>Policies/Kdelibs Coding Style</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Policies/Kdelibs_Coding_Style"/>
				<updated>2012-01-05T12:59:21Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Artistic Style (astyle) automatic code formatting */ Fix my former change.&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;
This document describes the recommended coding style for kdelibs. Nobody is forced to use this style, but to have consistent formatting of the source code files it is recommended to make use of it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
'''In short: Kdelibs coding style follows the [http://wiki.qt-project.org/Coding_Style Qt 4 coding style].'''&lt;br /&gt;
&lt;br /&gt;
== Indentation == &amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
* No tabs&lt;br /&gt;
* 4 Spaces instead of one tab&lt;br /&gt;
&lt;br /&gt;
== Variable declaration == &amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
* Each variable declaration on a new line&lt;br /&gt;
* Each new word in a variable name starts with a capital letter (so-called camelCase)&lt;br /&gt;
* Avoid abbreviations&lt;br /&gt;
* Take useful names. No short names, except:&lt;br /&gt;
** Single character variable names can denote counters and temporary variables whose purpose is obvious&lt;br /&gt;
** Variables and functions start with a lowercase letter&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
// wrong&amp;lt;/translate&amp;gt;&lt;br /&gt;
KProgressBar *prbar;&lt;br /&gt;
QString prtxt, errstr;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
// correct&amp;lt;/translate&amp;gt;&lt;br /&gt;
KProgressBar *downloadProgressBar;&lt;br /&gt;
QString progressText;&lt;br /&gt;
QString errorString;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Whitespace == &amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
* Use blank lines to group statements&lt;br /&gt;
* Use only one empty line&lt;br /&gt;
* Use one space after each keyword&lt;br /&gt;
* For pointers or references, use a single space before '*' or '&amp;amp;', but not after&lt;br /&gt;
* No space after a cast&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
// wrong&amp;lt;/translate&amp;gt;&lt;br /&gt;
QString* myString;&lt;br /&gt;
if(true){&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
// correct&amp;lt;/translate&amp;gt;&lt;br /&gt;
QString *myString;&lt;br /&gt;
if (true) {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Braces == &amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
As a base rule, the left curly brace goes on the same line as the start of the statement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
// wrong&amp;lt;/translate&amp;gt;&lt;br /&gt;
if (true)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
// correct&amp;lt;/translate&amp;gt;&lt;br /&gt;
if (true) {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
Exception: Function implementations, class, struct and namespace declarations always have the opening brace on the start of a line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void debug(int i)&lt;br /&gt;
{&lt;br /&gt;
    qDebug(&amp;quot;foo: %i&amp;quot;, i);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Debug&lt;br /&gt;
{&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
Use curly braces even when the body of a conditional statement contains only one line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
// wrong&amp;lt;/translate&amp;gt;&lt;br /&gt;
if (true)&lt;br /&gt;
    return true;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; 10; ++i)&lt;br /&gt;
    qDebug(&amp;quot;%i&amp;quot;, i);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
// correct&amp;lt;/translate&amp;gt;&lt;br /&gt;
if (true) {&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; 10; ++i) {&lt;br /&gt;
    qDebug(&amp;quot;%i&amp;quot;, i);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Switch statements == &amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
Case labels are on the same column as the switch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
switch (myEnum) {&lt;br /&gt;
case Value1:&lt;br /&gt;
    doSomething();&lt;br /&gt;
    break;&lt;br /&gt;
case Value2:&lt;br /&gt;
    doSomethingElse();&lt;br /&gt;
    // fall through&lt;br /&gt;
default:&lt;br /&gt;
    defaultHandling();&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Line breaks == &amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
Try to keep lines shorter than 100 characters, inserting line breaks as necessary.&lt;br /&gt;
&lt;br /&gt;
== Qt Includes == &amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
* If you add #includes for Qt classes, use both the module and class name.  This allows library code to be used by applications without excessive compiler include paths.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
// wrong&amp;lt;/translate&amp;gt;&lt;br /&gt;
#include &amp;lt;QString&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:28--&amp;gt;&lt;br /&gt;
// correct&amp;lt;/translate&amp;gt;&lt;br /&gt;
#include &amp;lt;QtCore/QString&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Artistic Style (astyle) automatic code formatting == &amp;lt;!--T:29--&amp;gt;&lt;br /&gt;
You can use [http://astyle.sourceforge.net/ astyle] (&amp;gt;=1.23) to format code or to test if you have followed this document. Run the following command:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
astyle --indent=spaces=4 --brackets=linux \&lt;br /&gt;
       --indent-labels --pad=oper --unpad=paren \&lt;br /&gt;
       --one-line=keep-statements --convert-tabs \&lt;br /&gt;
       --indent-preprocessor \&lt;br /&gt;
       `find -type f -name '*.cpp'-or -name '*.cc' -or -name '*.h'`&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:30--&amp;gt;&lt;br /&gt;
With astyle (&amp;gt;=2.01) you need to run the following command:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
astyle --indent=spaces=4 --brackets=linux \&lt;br /&gt;
       --indent-labels --pad-oper --unpad-paren --pad-header \&lt;br /&gt;
       --keep-one-line-statements --convert-tabs \&lt;br /&gt;
       --indent-preprocessor \&lt;br /&gt;
       `find -type f -name '*.cpp' -or -name '*.cc' -or -name '*.h'`&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
A related shell script could be found for unix in [http://websvn.kde.org/*checkout*/trunk/KDE/kdesdk/scripts/astyle-kdelibs kdesdk/scripts/astyle-kdelibs] and for windows in [http://websvn.kde.org/*checkout*/trunk/KDE/kdesdk/scripts/astyle-kdelibs.bat kdesdk/scripts/astyle-kdelibs.bat].&lt;br /&gt;
&lt;br /&gt;
== Emacs and Vim scripts == &amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
The &amp;quot;scripts&amp;quot; directory in the kdesdk module contains, among other useful things, some useful additions to the Emacs and Vim text editors that make it easier to edit KDE code with them.&lt;br /&gt;
 &lt;br /&gt;
=== Emacs ===&lt;br /&gt;
The [http://websvn.kde.org/trunk/KDE/kdesdk/scripts/kde-emacs kde-emacs] directory contains a set of key bindings, macros and general useful code. It is compatible with both GNU Emacs and XEmacs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:33--&amp;gt;&lt;br /&gt;
To start using kde-emacs, add the following to your .emacs:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(add-to-list 'load-path &amp;quot;/path/to/kde-emacs&amp;quot;)&lt;br /&gt;
(require 'kde-emacs)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
Many settings can be changed by editing the &amp;quot;kde-emacs&amp;quot; group via &amp;lt;tt&amp;gt;M-x customize-group&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
For more information, including what the key bindings are and what additional settings you could add to your .emacs, please check &amp;lt;tt&amp;gt;kde-emacs.el&amp;lt;/tt&amp;gt; itself.&lt;br /&gt;
&lt;br /&gt;
=== Vim === &amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
You can find a vim script in [http://websvn.kde.org/*checkout*/trunk/KDE/kdesdk/scripts/kde-devel-vim.vim kdesdk/scripts/kde-devel-vim.vim] that helps you to keep the coding style correct. In addition to defaulting to the kdelibs coding style it will automatically use the correct style for Solid and kdepim code. If you want to add rules for other projects feel free to add them in the SetCodingStyle function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
To use the script, include it in your {{path|~/.vimrc}} like this:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
source /path/to/kde/sources/kdesdk/scripts/kde-devel-vim.vim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
Document started by Urs Wolfer. Some parts of this document have been adopted from the Qt Coding Style document posted by Zack Rusin on kde-core-devel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
[[Category:Policies]] [[Category:C++]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Policies/Kdelibs_Coding_Style</id>
		<title>Policies/Kdelibs Coding Style</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Policies/Kdelibs_Coding_Style"/>
				<updated>2012-01-05T12:39:25Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Artistic Style (astyle) automatic code formatting */ Use more compact find syntax.&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;
This document describes the recommended coding style for kdelibs. Nobody is forced to use this style, but to have consistent formatting of the source code files it is recommended to make use of it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
'''In short: Kdelibs coding style follows the [http://wiki.qt-project.org/Coding_Style Qt 4 coding style].'''&lt;br /&gt;
&lt;br /&gt;
== Indentation == &amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
* No tabs&lt;br /&gt;
* 4 Spaces instead of one tab&lt;br /&gt;
&lt;br /&gt;
== Variable declaration == &amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
* Each variable declaration on a new line&lt;br /&gt;
* Each new word in a variable name starts with a capital letter (so-called camelCase)&lt;br /&gt;
* Avoid abbreviations&lt;br /&gt;
* Take useful names. No short names, except:&lt;br /&gt;
** Single character variable names can denote counters and temporary variables whose purpose is obvious&lt;br /&gt;
** Variables and functions start with a lowercase letter&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
// wrong&amp;lt;/translate&amp;gt;&lt;br /&gt;
KProgressBar *prbar;&lt;br /&gt;
QString prtxt, errstr;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
// correct&amp;lt;/translate&amp;gt;&lt;br /&gt;
KProgressBar *downloadProgressBar;&lt;br /&gt;
QString progressText;&lt;br /&gt;
QString errorString;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Whitespace == &amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
* Use blank lines to group statements&lt;br /&gt;
* Use only one empty line&lt;br /&gt;
* Use one space after each keyword&lt;br /&gt;
* For pointers or references, use a single space before '*' or '&amp;amp;', but not after&lt;br /&gt;
* No space after a cast&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
// wrong&amp;lt;/translate&amp;gt;&lt;br /&gt;
QString* myString;&lt;br /&gt;
if(true){&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
// correct&amp;lt;/translate&amp;gt;&lt;br /&gt;
QString *myString;&lt;br /&gt;
if (true) {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Braces == &amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
As a base rule, the left curly brace goes on the same line as the start of the statement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
// wrong&amp;lt;/translate&amp;gt;&lt;br /&gt;
if (true)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
// correct&amp;lt;/translate&amp;gt;&lt;br /&gt;
if (true) {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
Exception: Function implementations, class, struct and namespace declarations always have the opening brace on the start of a line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void debug(int i)&lt;br /&gt;
{&lt;br /&gt;
    qDebug(&amp;quot;foo: %i&amp;quot;, i);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Debug&lt;br /&gt;
{&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
Use curly braces even when the body of a conditional statement contains only one line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
// wrong&amp;lt;/translate&amp;gt;&lt;br /&gt;
if (true)&lt;br /&gt;
    return true;&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; 10; ++i)&lt;br /&gt;
    qDebug(&amp;quot;%i&amp;quot;, i);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
// correct&amp;lt;/translate&amp;gt;&lt;br /&gt;
if (true) {&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for (int i = 0; i &amp;lt; 10; ++i) {&lt;br /&gt;
    qDebug(&amp;quot;%i&amp;quot;, i);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Switch statements == &amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
Case labels are on the same column as the switch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
switch (myEnum) {&lt;br /&gt;
case Value1:&lt;br /&gt;
    doSomething();&lt;br /&gt;
    break;&lt;br /&gt;
case Value2:&lt;br /&gt;
    doSomethingElse();&lt;br /&gt;
    // fall through&lt;br /&gt;
default:&lt;br /&gt;
    defaultHandling();&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Line breaks == &amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
Try to keep lines shorter than 100 characters, inserting line breaks as necessary.&lt;br /&gt;
&lt;br /&gt;
== Qt Includes == &amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
* If you add #includes for Qt classes, use both the module and class name.  This allows library code to be used by applications without excessive compiler include paths.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
// wrong&amp;lt;/translate&amp;gt;&lt;br /&gt;
#include &amp;lt;QString&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:28--&amp;gt;&lt;br /&gt;
// correct&amp;lt;/translate&amp;gt;&lt;br /&gt;
#include &amp;lt;QtCore/QString&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Artistic Style (astyle) automatic code formatting == &amp;lt;!--T:29--&amp;gt;&lt;br /&gt;
You can use [http://astyle.sourceforge.net/ astyle] (&amp;gt;=1.23) to format code or to test if you have followed this document. Run the following command:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
astyle --indent=spaces=4 --brackets=linux \&lt;br /&gt;
       --indent-labels --pad=oper --unpad=paren \&lt;br /&gt;
       --one-line=keep-statements --convert-tabs \&lt;br /&gt;
       --indent-preprocessor \&lt;br /&gt;
       `find -type f -name '*.cpp'-or '*.cc' -or '*.h'`&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:30--&amp;gt;&lt;br /&gt;
With astyle (&amp;gt;=2.01) you need to run the following command:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
astyle --indent=spaces=4 --brackets=linux \&lt;br /&gt;
       --indent-labels --pad-oper --unpad-paren --pad-header \&lt;br /&gt;
       --keep-one-line-statements --convert-tabs \&lt;br /&gt;
       --indent-preprocessor \&lt;br /&gt;
       `find -type f -name '*.cpp' -or '*.cc' -or '*.h'`&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
A related shell script could be found for unix in [http://websvn.kde.org/*checkout*/trunk/KDE/kdesdk/scripts/astyle-kdelibs kdesdk/scripts/astyle-kdelibs] and for windows in [http://websvn.kde.org/*checkout*/trunk/KDE/kdesdk/scripts/astyle-kdelibs.bat kdesdk/scripts/astyle-kdelibs.bat].&lt;br /&gt;
&lt;br /&gt;
== Emacs and Vim scripts == &amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
The &amp;quot;scripts&amp;quot; directory in the kdesdk module contains, among other useful things, some useful additions to the Emacs and Vim text editors that make it easier to edit KDE code with them.&lt;br /&gt;
 &lt;br /&gt;
=== Emacs ===&lt;br /&gt;
The [http://websvn.kde.org/trunk/KDE/kdesdk/scripts/kde-emacs kde-emacs] directory contains a set of key bindings, macros and general useful code. It is compatible with both GNU Emacs and XEmacs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:33--&amp;gt;&lt;br /&gt;
To start using kde-emacs, add the following to your .emacs:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(add-to-list 'load-path &amp;quot;/path/to/kde-emacs&amp;quot;)&lt;br /&gt;
(require 'kde-emacs)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
Many settings can be changed by editing the &amp;quot;kde-emacs&amp;quot; group via &amp;lt;tt&amp;gt;M-x customize-group&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
For more information, including what the key bindings are and what additional settings you could add to your .emacs, please check &amp;lt;tt&amp;gt;kde-emacs.el&amp;lt;/tt&amp;gt; itself.&lt;br /&gt;
&lt;br /&gt;
=== Vim === &amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
You can find a vim script in [http://websvn.kde.org/*checkout*/trunk/KDE/kdesdk/scripts/kde-devel-vim.vim kdesdk/scripts/kde-devel-vim.vim] that helps you to keep the coding style correct. In addition to defaulting to the kdelibs coding style it will automatically use the correct style for Solid and kdepim code. If you want to add rules for other projects feel free to add them in the SetCodingStyle function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
To use the script, include it in your {{path|~/.vimrc}} like this:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
source /path/to/kde/sources/kdesdk/scripts/kde-devel-vim.vim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
Document started by Urs Wolfer. Some parts of this document have been adopted from the Qt Coding Style document posted by Zack Rusin on kde-core-devel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
[[Category:Policies]] [[Category:C++]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Thread:Talk:Development/Tutorials/KWin/Scripting/Copyright/reply_(2)</id>
		<title>Thread:Talk:Development/Tutorials/KWin/Scripting/Copyright/reply (2)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Thread:Talk:Development/Tutorials/KWin/Scripting/Copyright/reply_(2)"/>
				<updated>2011-12-15T12:10:53Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Reply to Copyright&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Even if it was a Code-In task, it's still his blog. I do not know about the specifics of the contracts the applicants have to sign, but I think it's better to have the author's permission.&lt;br /&gt;
Thanks.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Thread:Talk:Development/Tutorials/KWin/Scripting/Copyright</id>
		<title>Thread:Talk:Development/Tutorials/KWin/Scripting/Copyright</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Thread:Talk:Development/Tutorials/KWin/Scripting/Copyright"/>
				<updated>2011-12-14T23:21:34Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Do we have the permission to have this here?&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Thread:Talk:Development/Tutorials/KWin/Scripting/Copyright</id>
		<title>Thread:Talk:Development/Tutorials/KWin/Scripting/Copyright</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Thread:Talk:Development/Tutorials/KWin/Scripting/Copyright"/>
				<updated>2011-12-14T23:20:42Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: New thread: Copyright&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Do we have the permission to have his here?&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Development/Tutorials/KWin/Scripting</id>
		<title>Talk:Development/Tutorials/KWin/Scripting</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Development/Tutorials/KWin/Scripting"/>
				<updated>2011-12-14T23:20:42Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Talk page autocreated when first thread was posted&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Thread:Talk:Getting_Started/Using_an_IDE_with_KDE4/Update_svn_links_to_git%3F/reply</id>
		<title>Thread:Talk:Getting Started/Using an IDE with KDE4/Update svn links to git?/reply</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Thread:Talk:Getting_Started/Using_an_IDE_with_KDE4/Update_svn_links_to_git%3F/reply"/>
				<updated>2011-11-08T23:34:26Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Reply to Update svn links to git?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please make the change, if you know it works. In this case KDEPIM indeed moved to Git, so it is save to change it.&lt;br /&gt;
&lt;br /&gt;
In general if the page is about development, I think linking to URL renaming and using kde:foo URL is alright. If it is about building an application by hand, just stating anongit should be enough.&lt;br /&gt;
&lt;br /&gt;
Thanks for your contribution.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Getting_Started/Build/KDE_Applications</id>
		<title>Getting Started/Build/KDE Applications</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Getting_Started/Build/KDE_Applications"/>
				<updated>2011-11-08T23:25:45Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Use syntaxhighlight.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
The process to build applications is easy. It can get tedious in the beginning but with time it's easy to understand.&lt;br /&gt;
&lt;br /&gt;
In this page I'll discuss the compilation and installation of a simple KDE application or project on a regular GNU/Linux system. It can get more complicated but I'd prefer to keep this document simple.&lt;br /&gt;
&lt;br /&gt;
= Preparing your system a little =&lt;br /&gt;
First of all you probably will need to know the dependencies to compile the program you want to compile. In my experience, a great portion of the problems that people have forgot to install the development packages for the system libraries. Keep that in mind.&lt;br /&gt;
&lt;br /&gt;
In general, the needed packages will be: cmake, git-core, libqt4(-dev), kdelibs(-dev). Depends on the distribution but the naming should be something like this.&lt;br /&gt;
&lt;br /&gt;
= Steps =&lt;br /&gt;
&lt;br /&gt;
Here we will try to compile an application, let's say blinken. You can find a full compendium of the KDE projects in http://projects.kde.org&lt;br /&gt;
&lt;br /&gt;
First we will download the code&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://anongit.kde.org/blinken&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a directory with blinken's source code inside. We get in and we create a directory where it's going to be built&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd blinken; mkdir build; cd build&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we'll set up the development system by calling cmake. We're passing two parameters here CMAKE_INSTALL_PREFIX that will tell where the application will be installed and CMAKE_BUILD_TYPE that will tell the optimization of the produced binaries. (not entirely accurate, but there's heaps of documentation about that).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cmake .. -DCMAKE_INSTALL_PREFIX=&amp;lt;install_path&amp;gt; -DCMAKE_BUILD_TYPE=debugfull&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The moment we were all expecting has arrived, now you can start compiling.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some applications can work without installing but that's usually not the case so just do it if you know what you're doing, otherwise you will want to install probably.&lt;br /&gt;
&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're installing it to a directory where the owner is root, then you'll probably need some extended privileges to install. That's not the only option, though. You can create a specific install directory by pointing the PATH and KDEDIRS variables to it, more information here: [[Getting_Started/Build/Environment]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/Extragear</id>
		<title>Schedules/Extragear</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/Extragear"/>
				<updated>2011-10-30T21:39:19Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: KMymoney 4.6.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is intended to be a central location for Extragear projects to keep users and contributors (translators, packagers, etc.) informed about upcoming releases in a very accessible way. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project &lt;br /&gt;
! Next release (roughly) &lt;br /&gt;
! Next Release Code branch &lt;br /&gt;
! Next Release Translation branch &lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| K3b &lt;br /&gt;
| 1 March 2010&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/multimedia/k3b/ trunk]&lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-multimedia/ trunk kde4]&lt;br /&gt;
| String freeze starting from January 31 2010 (in effect)&lt;br /&gt;
|-&lt;br /&gt;
| KAudiocreator &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Kaffeine &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://extragear.kde.org/apps/kcoloredit/ KColorEdit] &lt;br /&gt;
| KDE release &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/graphics/kcoloredit/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-graphics/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.kde-apps.org/content/show.php/KDE+Partition+Manager?content=89595 KDE Partition Manager] &lt;br /&gt;
| Q2/2010&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/sysadmin/partitionmanager/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-sysadmin/ trunk kde4] &lt;br /&gt;
| &amp;lt;!-- String freeze in effect --&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://ww.kdevelop.org KDevelop] &lt;br /&gt;
| 1 May 2010 &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/sdk/kdevelop/ trunk]&lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-sdk/ trunk kde4] &lt;br /&gt;
| string freeze starting 31 March 2010&lt;br /&gt;
|-&lt;br /&gt;
| KDiff3 &lt;br /&gt;
| January 31, 2009 &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/utils/kdiff3/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-utils/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KFax &lt;br /&gt;
| KDE release &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KFTPGrabber &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KGrab &lt;br /&gt;
| KDE release &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://extragear.kde.org/apps/kgraphviewer/ KGraphViewer] &lt;br /&gt;
| KDE release &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/graphics/kgraphviewer/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-graphics/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KIconedit &lt;br /&gt;
| KDE release &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.kmldonkey.org KMLDonkey] &lt;br /&gt;
| KDE release &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/network/kmldonkey/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-network/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KNemo &lt;br /&gt;
| January 17, 2010 &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/network/knemo/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-network/ trunk kde4] &lt;br /&gt;
| String freeze in effect &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://konversation.kde.org Konversation] &lt;br /&gt;
| In the week beginning June 7th 2010&lt;br /&gt;
| [http://gitorious.org/konversation/konversation/trees/master git master] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-network/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KPager &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KPhotoalbum &lt;br /&gt;
| May 9 2009 &lt;br /&gt;
| trunk &lt;br /&gt;
| trunk &lt;br /&gt;
| Message freeze, April 3 2009&lt;br /&gt;
|-&lt;br /&gt;
| KPlayer &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KPovmodeler &lt;br /&gt;
| KDE release &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KRecipes &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KSig &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://ktorrent.org/ KTorrent] &lt;br /&gt;
| 8 november 2009 &lt;br /&gt;
| [http://websvn.kde.org/branches/stable/extragear-kde4/network/ktorrent stable kde4] &lt;br /&gt;
| [http://websvn.kde.org/branches/stable/l10n-kde4/templates/messages/extragear-network/ stable kde4] &lt;br /&gt;
| String freeze in effect&lt;br /&gt;
|-&lt;br /&gt;
| Kuickshow &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KWlan &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| RSIBreak &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Skanlite &lt;br /&gt;
| KDE release &lt;br /&gt;
| trunk &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://skrooge.org Skrooge] &lt;br /&gt;
| 2010-02-06 (version 0.6.0) &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/office/skrooge trunk]&lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-office/ trunk kde4]&lt;br /&gt;
| String freeze in effect&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.kde-apps.org/content/show.php?content=29153 Yakuake] &lt;br /&gt;
| July 8th, 2010&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/utils/yakuake/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-utils/ trunk kde4] &lt;br /&gt;
| String freeze started June 24th, 2010&lt;br /&gt;
|-&lt;br /&gt;
| Kile&lt;br /&gt;
| June 8th, 2011 (Version 2.1)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| String freeze started 23 May 2011&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.krusader.org/ Krusader] &lt;br /&gt;
| 2.4.0-beta1 released on June 26, 2011.&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/utils/krusader/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-utils/ trunk kde4] &lt;br /&gt;
| String freeze since June 26, 2011 until 2.4.0 release.&lt;br /&gt;
|-&lt;br /&gt;
| BlueDevil&lt;br /&gt;
| 1.0.5 (stable) and 1.1.1 (trunk) released planned on July 15, 2011.&lt;br /&gt;
| &lt;br /&gt;
| stable, trunk&lt;br /&gt;
| String freeze since June 29, 2011 until 1.0.5 and 1.1.1 releases.&lt;br /&gt;
|-&lt;br /&gt;
| [http://amarok.kde.org Amarok] &lt;br /&gt;
| July 22, 2011 (Amarok 2.4.2)&lt;br /&gt;
| git master &lt;br /&gt;
| git master &lt;br /&gt;
| string freeze: July 4, 2011 — July 22, 2011&lt;br /&gt;
|-&lt;br /&gt;
| [http://digikam.org digiKam] &lt;br /&gt;
| July 27th 2011 [http://www.digikam.org/drupal/about/releaseplan] &lt;br /&gt;
| [https://projects.kde.org/projects/extragear/graphics git master] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-graphics/ trunk kde4] &lt;br /&gt;
| String freeze starting June 30th 2011.&lt;br /&gt;
|-&lt;br /&gt;
| [http://techbase.kde.org/Projects/KMyMoney KMyMoney] &lt;br /&gt;
| 4.6.1 from Stable around November 5th, 2011 &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/office/kmymoney/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-office/ trunk kde4] &lt;br /&gt;
| String freeze started October 22nd, 2011&lt;br /&gt;
|-&lt;br /&gt;
| massif-visualizer&lt;br /&gt;
| 0.3 is planned to be released on September 4, 2011&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| String freeze started on August 8, 2011&lt;br /&gt;
|-&lt;br /&gt;
| [http://tellico-project.org Tellico] &lt;br /&gt;
| 2.3.4&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/office/tellico/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-office/ trunk kde4] &lt;br /&gt;
| String freeze: September 5th, 2011 -- September 18th, 2011.&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.rekonq.sourceforge.net rekonq] &lt;br /&gt;
| ~ October 11, 2011 (Version 0.8)&lt;br /&gt;
| [http://gitorious.org/rekonq/mainline/trees/master git master]&lt;br /&gt;
| [http://gitorious.org/rekonq/mainline/trees/master git master]&lt;br /&gt;
| String freeze for 3 weeks starting September 21, 2011 (0.8 release)&lt;br /&gt;
|-&lt;br /&gt;
| KDE Telepathy&lt;br /&gt;
| November 18th, 2011 (version 0.2)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| String freeze starting October 26th, 2011.&lt;br /&gt;
|-&lt;br /&gt;
| Calligra&lt;br /&gt;
| After November 23th, 2011 [http://mail.kde.org/pipermail/calligra-devel/2011-July/001957.html schedule]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| String freeze starting October 12th, 2011.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Welcome_to_KDE_TechBase/de</id>
		<title>Welcome to KDE TechBase/de</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Welcome_to_KDE_TechBase/de"/>
				<updated>2011-10-30T19:13:35Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: foo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Welcome to KDE TechBase}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;languages /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=2|[[Image:Discover.png|noframe]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot; |[[Image:Action_launch.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Special: MyLanguage/Getting Started | Einrichten einer KDE-Entwicklungsumgebung]]: Erfahren Sie, wie Sie KDE bekommen, erstellen und ausführen.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot;|[[Image:Action_configure.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Special: MyLanguage/Development | Entwickeln mit KDE]]&lt;br /&gt;
:[[Special: MyLanguage/Development/Tutorials | Tutorien]] | [http://api.kde.org API-Dokumentation] | [[Special: MyLanguage/Development/FAQs | Fragen&amp;amp;Antworten]] und vieles mehr.&lt;br /&gt;
:''Mehr'': [[Special:myLanguage/Schedules|Release Schedules und Feature Pläne]] | [[Special:myLanguage/Policies|Code-Beisteuerung und Entwicklungsrichtlinien]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot;|[[Image:Devices_system.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Special:myLanguage/KDE System Administration|KDE-Systemadministration]]:Informationen für Systemadministratoren, die KDE-Installationen verwalten. &lt;br /&gt;
|-&lt;br /&gt;
|colspan=2|[[Image:Interact.png|noframe]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot;|[[Image:Action_favorites.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Special:myLanguage/Contribute|&lt;br /&gt;
Join the KDE Team and Contribute]]&lt;br /&gt;
:Contribute patches, keep in touch with and join our community.&lt;br /&gt;
:''Related:''[[Special:myLanguage/Policies|&lt;br /&gt;
KDE Project Policies]] | [http://www.kde.org/support/support.php Donate Money]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot;|[[Image:Action_contents.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Special:myLanguage/ISV|ISV Information]]:Developer information for Independent Software Vendors.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=2|[[Image:Develop.png|noframe]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot; |[[Image:Action_wizard.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Special:myLanguage/Projects|&lt;br /&gt;
KDE projects]]&lt;br /&gt;
:Links to development wikis, task lists, etc. for various KDE Projects.&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Translations:Welcome_to_KDE_TechBase/3/de</id>
		<title>Translations:Welcome to KDE TechBase/3/de</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Translations:Welcome_to_KDE_TechBase/3/de"/>
				<updated>2011-10-30T19:13:35Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: foo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Special: MyLanguage/Development/Tutorials | Tutorien]] | [http://api.kde.org API-Dokumentation] | [[Special: MyLanguage/Development/FAQs | Fragen&amp;amp;Antworten]] und vieles mehr.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-10-15T22:38:36Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Minimum size */ Fix typo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { &lt;br /&gt;
            top: parent.top;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: first.bottom;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
            bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure:&lt;br /&gt;
&lt;br /&gt;
* plasmoid-qml/metadata.desktop&lt;br /&gt;
* plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The line below indicates the default size of the plasmoid. The applet's starting size will be this, when added to a scene:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop&lt;br /&gt;
        DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(if you have a configuration file (.ui file) to load the right-click 'plasmoid settings' menu, then your structure will also have myproject/package/contents/config/config.ui, or so)&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because '''some features won't be available there, like the following''':&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is bound to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It is possible to localize strings with the usual i18n(), i18nc(), i18np() global functions.&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc. (note that the Plasma QtComponents have nothing to do with the QtExtraComponents module described above)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</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-15T03:41:59Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Added kdegames table&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|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;
|}&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;
|}&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;
{{FeatureTodo|KSudoku|Description|iandw.au@gmail.com|Ian Wadham}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</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>2011-10-11T01:25:26Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* ServiceJob */ Fix typo.&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;
&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;
= 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;
&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;
=== 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;
== 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;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed? It has no affect presently).&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;
== 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;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (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;
&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;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&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;
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;
TODO&lt;/div&gt;</summary>
		<author><name>Icwiener</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>2011-10-11T01:21:43Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Signals */ Fix markup.&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;
&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;
= 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;
&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;
If 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;
=== 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;
== 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;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed? It has no affect presently).&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;
== 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;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (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;
&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;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&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;
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;
TODO&lt;/div&gt;</summary>
		<author><name>Icwiener</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>2011-10-11T01:19:49Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Introduction to the Plasmoid QML Declarative API */ Fix typos.&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;
&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;
= 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;
&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;
If 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;
=== 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;
== 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;
NOTE: the below code presently has no affect, yet the icons seems to get retrieved from the desktop file (FIXME - is this needed? It has no affect presently).&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;
== 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;
It has the following properties:&lt;br /&gt;
* String '''themeName''' (read only)&lt;br /&gt;
* QFont '''font''' (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;
&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;
Sample Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    PlasmaCore.Svg {&lt;br /&gt;
        id: mySvg&lt;br /&gt;
        imagePath: &amp;quot;widgets/line&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;
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;
TODO&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-10-11T00:21:58Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Package Structure */ Fix bullet points.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { &lt;br /&gt;
            top: parent.top;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: first.bottom;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
            bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure:&lt;br /&gt;
&lt;br /&gt;
* plasmoid-qml/metadata.desktop&lt;br /&gt;
* plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The line below indicates the default size of the plasmoid. The applet's starting size will be this, when added to a scene:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop&lt;br /&gt;
        DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(if you have a configuration file (.ui file) to load the right-click 'plasmoid settings' menu, then your structure will also have myproject/package/contents/config/config.ui, or so)&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because '''some features won't be available there, like the following''':&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It is possible to localize strings with the usual i18n(), i18nc(), i18np() global functions.&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc. (note that the Plasma QtComponents have nothing to do with the QtExtraComponents module described above)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-10-11T00:20:39Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Localization */ Fix typo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { &lt;br /&gt;
            top: parent.top;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: first.bottom;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
            bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure:&lt;br /&gt;
&lt;br /&gt;
- plasmoid-qml/metadata.desktop&lt;br /&gt;
&lt;br /&gt;
- plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The line below indicates the default size of the plasmoid. The applet's starting size will be this, when added to a scene:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop&lt;br /&gt;
        DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(if you have a configuration file (.ui file) to load the right-click 'plasmoid settings' menu, then your structure will also have myproject/package/contents/config/config.ui, or so)&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because '''some features won't be available there, like the following''':&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It is possible to localize strings with the usual i18n(), i18nc(), i18np() global functions.&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc. (note that the Plasma QtComponents have nothing to do with the QtExtraComponents module described above)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-10-11T00:19:26Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Installation through CMake */ Fix display.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { &lt;br /&gt;
            top: parent.top;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: first.bottom;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
            bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure:&lt;br /&gt;
&lt;br /&gt;
- plasmoid-qml/metadata.desktop&lt;br /&gt;
&lt;br /&gt;
- plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The line below indicates the default size of the plasmoid. The applet's starting size will be this, when added to a scene:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop&lt;br /&gt;
        DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(if you have a configuration file (.ui file) to load the right-click 'plasmoid settings' menu, then your structure will also have myproject/package/contents/config/config.ui, or so)&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because '''some features won't be available there, like the following''':&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc. (note that the Plasma QtComponents have nothing to do with the QtExtraComponents module described above)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-10-11T00:18:36Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Installing */ Fix highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { &lt;br /&gt;
            top: parent.top;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: first.bottom;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
            bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure:&lt;br /&gt;
&lt;br /&gt;
- plasmoid-qml/metadata.desktop&lt;br /&gt;
&lt;br /&gt;
- plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The line below indicates the default size of the plasmoid. The applet's starting size will be this, when added to a scene:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(if you have a configuration file (.ui file) to load the right-click 'plasmoid settings' menu, then your structure will also have myproject/package/contents/config/config.ui, or so)&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because '''some features won't be available there, like the following''':&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc. (note that the Plasma QtComponents have nothing to do with the QtExtraComponents module described above)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted</id>
		<title>Development/Tutorials/Plasma/QML/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/QML/GettingStarted"/>
				<updated>2011-10-11T00:16:47Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Package Structure */ Fix layout&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Writing a plasma applet in QML is very easy, in fact, with KDE 4.6 and Qt 4.7 it just works.&lt;br /&gt;
&lt;br /&gt;
== QML Basics ==&lt;br /&gt;
&lt;br /&gt;
It is recommended that you have read through the [http://doc.qt.nokia.com/4.7/qtquick.html Qt QML Tutorials], as there are quite a few and they are explained thoroughly. There is also a list of all [http://doc.qt.nokia.com/4.7/qdeclarativeelements.html standard QML elements].&lt;br /&gt;
&lt;br /&gt;
Essentially, most of the content is the same. The exceptions to be noted are how data is gathered...since we use Data Engines, it is a bit different. Text color and font should be made to use PlasmaCore.Theme.&lt;br /&gt;
&lt;br /&gt;
See the [https://projects.kde.org/projects/kde/kdeexamples/repository KDE Examples] repository for more KDE-related helpful resources. Also of use (which use QML and Plasma) are: [https://projects.kde.org/projects/playground/base/plasma-mobile/repository Plasma Mobile], [https://projects.kde.org/projects/playground/base/declarative-plasmoids/repository Declarative Plasmoids (playground)], for WIP ports of C++ originals&lt;br /&gt;
&lt;br /&gt;
=== Root Item ===&lt;br /&gt;
&lt;br /&gt;
The root item can be anything that inherits QGraphicsItem. For example, in this case it is QGraphicsWidget which is a plasmoid. It can also simply be an Item. I also noticed that PathView does not respond to mouse inputs automatically (so flicking doesn't work). Probably because events are being intercepted. So take note, it'll have to be e.g. an Item, for that case.&lt;br /&gt;
&lt;br /&gt;
=== Layouts ===&lt;br /&gt;
&lt;br /&gt;
==== Row and Column ====&lt;br /&gt;
&lt;br /&gt;
==== Anchors ====&lt;br /&gt;
Anchor layouts offer a nice way of grouping UI elements nicely together. The idea is that you connect edges or corners of one element to the edge or corner of another widget.&lt;br /&gt;
Some examples:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.core 0.1 as PlasmaCore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 200&lt;br /&gt;
    height: 300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Text {&lt;br /&gt;
        id: first&lt;br /&gt;
        text: i18n(&amp;quot;1st line&amp;quot;)&lt;br /&gt;
        anchors { &lt;br /&gt;
            top: parent.top;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Text {&lt;br /&gt;
        id: second&lt;br /&gt;
        text: i18n(&amp;quot;2nd line&amp;quot;)&lt;br /&gt;
        anchors {&lt;br /&gt;
            top: first.bottom;&lt;br /&gt;
            left: parent.left;&lt;br /&gt;
            right: parent.right;&lt;br /&gt;
            bottom: parent.bottom;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
&lt;br /&gt;
== Package Structure ==&lt;br /&gt;
&lt;br /&gt;
You create a .desktop file and the .qml file. They have to be in the usual plasma package structure:&lt;br /&gt;
&lt;br /&gt;
- plasmoid-qml/metadata.desktop&lt;br /&gt;
&lt;br /&gt;
- plasmoid-qml/contents/ui/main.qml&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello QML&lt;br /&gt;
Comment=A hello world widget in QML&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=declarativeappletscript&lt;br /&gt;
X-Plasma-MainScript=ui/main.qml&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=Frederik Gladhorn&lt;br /&gt;
X-KDE-PluginInfo-Email=gladhorn@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.hello-qml&lt;br /&gt;
X-KDE-PluginInfo-Version=0.0&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
Type=Service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The line below indicates the default size of the plasmoid. The applet's starting size will be this, when added to a scene:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  &amp;lt;tt&amp;gt;main.qml&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
You can install your plasmoid, though obviously this is just temporary. CMake, below, is recommended:&lt;br /&gt;
plasmapkg --install plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
=== Installation through CMake ===&lt;br /&gt;
In your CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
project(helloqml)&lt;br /&gt;
&lt;br /&gt;
install(DIRECTORY package/&lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.plasma.applet.myapplet)&lt;br /&gt;
&lt;br /&gt;
install(FILES package/metadata.desktop DESTINATION ${SERVICES_INSTALL_DIR} RENAME plasma-applet-myapplet.desktop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your directory structure should now be as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
myproject/CMakeLists.txt&lt;br /&gt;
myproject/package/&lt;br /&gt;
myproject/package/metadata.desktop&lt;br /&gt;
myproject/package/contents/&lt;br /&gt;
myproject/package/contents/ui/&lt;br /&gt;
myproject/package/contents/ui/helloworld.qml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(if you have a configuration file (.ui file) to load the right-click 'plasmoid settings' menu, then your structure will also have myproject/package/contents/config/config.ui, or so)&lt;br /&gt;
&lt;br /&gt;
== plasmoidviewer ==&lt;br /&gt;
You can run it in plasmoidviewer as usual:&lt;br /&gt;
plasmoidviewer plasmoid-qml&lt;br /&gt;
&lt;br /&gt;
== qmlviewer ==&lt;br /&gt;
It's possible to use Plasma specific imports in qml files loaded by qmlviewer:&lt;br /&gt;
&lt;br /&gt;
qmlviewer -I /usr/lib/kde4/imports/ plasmoid-qml/contents/qml/main.qml &lt;br /&gt;
&lt;br /&gt;
Where the -I is the path to the plasma plugin for qml. Try to look for the path of &lt;br /&gt;
/usr/lib/kde4/imports/org/kde/plasma/graphicswidgets/libgraphicswidgetsbindingsplugin.so&lt;br /&gt;
and use everything up to org of that path.&lt;br /&gt;
&lt;br /&gt;
Hovewer it's '''strongly discouraged''' to use qmlviewer to develop plasmoids, because '''some features won't be available there, like the following''':&lt;br /&gt;
* localization with i18n()&lt;br /&gt;
* access to the global ''plasmoid'' object&lt;br /&gt;
* device specific qml files imported with plasmapackage:// urls&lt;br /&gt;
* bindings for qicons, KJobs, services and KConfig&lt;br /&gt;
* retrieving data from a DataEngine&lt;br /&gt;
&lt;br /&gt;
Therefore, it is recommended to simply use '''plasmoidviewer'''&lt;br /&gt;
&lt;br /&gt;
= Features only available in Plasma widgets =&lt;br /&gt;
In order to have a better integration with the KDE platform and to reach an higher degree of expressivity, the stock features of QML have been expanded with the following features, that strictly follow the Plasmoid JavaScript API:&lt;br /&gt;
&lt;br /&gt;
== Minimum size ==&lt;br /&gt;
if the root object of the plasmoid has the properties minimumWidth and minimumHeight, they will be used as the minimum size for the plasmoid. If they will change during the plasmoid execution, the plasmoid minimum size will be updated accordingly.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
&lt;br /&gt;
Text {&lt;br /&gt;
    property int minimumWidth: paintedWidth&lt;br /&gt;
    property int minimumHeight: paintedHeight&lt;br /&gt;
    text: &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the minimum size is binded to the paintedWidth/paintedHeight properties of the Text element, ensuring there will always be enough room for the whole text to be displayed.&lt;br /&gt;
&lt;br /&gt;
== Plasmoid object ==&lt;br /&gt;
Every QML plasmoid will have an object called ''plasmoid'', that will give access to the configuration, the formfactor, immutability and so on. It offers the same api as the object with the same name in the Javascript API.&lt;br /&gt;
&lt;br /&gt;
For specific info on this, see [http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/API-PlasmoidObject Javascript API-Plasmoid Object]&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
It's possible to localize strings with the usual i18n(), i18nc(), i18np() global functions&lt;br /&gt;
&lt;br /&gt;
== Extra types ==&lt;br /&gt;
Some extra types are available from withing JavaScript, namely&lt;br /&gt;
&lt;br /&gt;
* KConfigGroup: it's an object with its config keys readable and writable as properties&lt;br /&gt;
* QIcon: can be constructed with QIcon(&amp;quot;fdo name&amp;quot;) such as QIcon(&amp;quot;konqueror&amp;quot;)&lt;br /&gt;
* KJob&lt;br /&gt;
* Plasma Service api&lt;br /&gt;
&lt;br /&gt;
= Plasma specific imports =&lt;br /&gt;
To use some Plasma specific features and to take advantage of them in order for your applet to become a true Plasma applet, it is necessary to use some particular QML imports. See [http://techbase.kde.org/Development/Tutorials/Plasma/QML/API Plasma QML API].&lt;br /&gt;
&lt;br /&gt;
== Extra Qt features ==&lt;br /&gt;
org.kde.qtextraimports&lt;br /&gt;
To use, do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import org.kde.qtextracomponents 0.1 as QtExtraComponents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* QPixmapItem&lt;br /&gt;
* QImageItem&lt;br /&gt;
* QIconItem&lt;br /&gt;
&lt;br /&gt;
== Plasma Widgets in QML ==&lt;br /&gt;
To use standard plasma widgets (e.g. Plasma::LineEdit, etc.), you simply add an import line for them.&lt;br /&gt;
All properties, signals and slots from ordinary Plasma widgets are available there.&lt;br /&gt;
'''These widgets are provided as a transition tool, intended to be replaced by the Plasma version of QtComponents''', which is currently in development by a gsoc. (note that the Plasma QtComponents have nothing to do with the QtExtraComponents module described above)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
import QtQuick 1.0&lt;br /&gt;
import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets&lt;br /&gt;
&lt;br /&gt;
Item {&lt;br /&gt;
    width: 64&lt;br /&gt;
    height: 64&lt;br /&gt;
    PlasmaWidgets.IconWidget {&lt;br /&gt;
        id: icon&lt;br /&gt;
        Component.onCompleted: setIcon(&amp;quot;flag-red&amp;quot;)&lt;br /&gt;
        anchors.centerIn: parent&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Icons</id>
		<title>Development/Tutorials/Icons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Icons"/>
				<updated>2011-09-28T20:23:03Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: improve markup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
When you create your own KDE application you will probably want icons in it like this:&lt;br /&gt;
&lt;br /&gt;
[[File:Snapshot-krep-arrow.png]]&lt;br /&gt;
&lt;br /&gt;
These icons are called [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKIcon.html KIcon]s. This article shows you how to do this using the software [http://www.staerk.de/thorsten/krep krep] as an example. In case of a [[Development/Tutorials/CMake|&lt;br /&gt;
CMake]]-based project you will need to  &lt;br /&gt;
* [http://websvn.kde.org/trunk/playground/utils/krep/main.cpp?r1=1154359&amp;amp;r2=1249871 modify main.cpp (as it is typically called)]&lt;br /&gt;
* [http://websvn.kde.org/trunk/playground/utils/krep/CMakeLists.txt?r1=813330&amp;amp;r2=1249871&amp;amp;sortby=date modify CMakeLists.txt]&lt;br /&gt;
&lt;br /&gt;
How to use icons in QMake-based projects is discussed [http://appdeveloper.intel.com/en-us/Qt%20C%20Plus%20Plus%20app%20MeeGo%20SDK elsewhere].&lt;br /&gt;
&lt;br /&gt;
= Your KDE project =&lt;br /&gt;
If you have a KDE project and want to use icons within it, and want these icons installed seamlessly, you will have to name the icons after the project. In the following we look at a project named ''krep''. The important lines in CMakeLists.txt are the ones printed bold below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
PROJECT( krep )&lt;br /&gt;
FIND_PACKAGE( KDE4 REQUIRED )&lt;br /&gt;
INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} . )&lt;br /&gt;
 &lt;br /&gt;
SET( krepSources main.cpp krep.cpp krep.h )&lt;br /&gt;
 &lt;br /&gt;
qt4_add_dbus_adaptor( krepSources &lt;br /&gt;
                      org.kde.krep.xml&lt;br /&gt;
                      krep.h&lt;br /&gt;
                      krep&lt;br /&gt;
                      mainadaptor&lt;br /&gt;
                      MainAdaptor )&lt;br /&gt;
 &lt;br /&gt;
kde4_add_ui_files( krepSources krepui.ui )&lt;br /&gt;
 &lt;br /&gt;
kde4_add_app_icon]]( krepSources &amp;quot;hi*-app-krep.png&amp;quot; )&lt;br /&gt;
 &lt;br /&gt;
KDE4_ADD_EXECUTABLE( krep ${krepSources} )&lt;br /&gt;
 &lt;br /&gt;
TARGET_LINK_LIBRARIES( krep ${KDE4_KPARTS_LIBS} )&lt;br /&gt;
 &lt;br /&gt;
install( TARGETS krep ${INSTALL_TARGETS_DEFAULT_ARGS} )&lt;br /&gt;
 &lt;br /&gt;
'''kde4_install_icons( ${ICON_INSTALL_DIR]]} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Weitere Informationen:&lt;br /&gt;
* [[Development/CMake/Addons_for_KDE#Macros|kde4_add_app_icon]]&lt;br /&gt;
* [[Development/CMake/Addons_for_KDE#The_locations_of_install_directories|ICON_INSTALL_DIR]]&lt;br /&gt;
&lt;br /&gt;
= How to test it =&lt;br /&gt;
* delete a file&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 rm /usr/local/share/icons/hicolor/22x22/apps/krep.png&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Note| We are assuming your icon path is /usr/local/share/icons.&lt;br /&gt;
Find it out with the command&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kde4-config --path icon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
* delete your cache&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rm -rf /var/tmp/kdecache-''user''/icon-cache.kcache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
According to [[Development/CMake/Addons_for_KDE#Macros]] you need to provide a 128x128 pixels icon.&lt;br /&gt;
&lt;br /&gt;
= The icon naming scheme =&lt;br /&gt;
Example for icon names:&lt;br /&gt;
* hisc-apps-bla.svgz will be installed e.g. to /usr/local/share/icons/hicolor/scalable/apps/bla.svgz. &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt; stands for &amp;quot;hicolor&amp;quot;, &amp;lt;tt&amp;gt;sc&amp;lt;/tt&amp;gt; for &amp;quot;scalable&amp;quot;, &amp;lt;tt&amp;gt;apps&amp;lt;/tt&amp;gt; for &amp;quot;applications&amp;quot;, &amp;lt;tt&amp;gt;bla&amp;lt;/tt&amp;gt; for the application's name and &amp;lt;tt&amp;gt;.svgz&amp;lt;/tt&amp;gt; is the suffix for gzipped scalable vector graphic files.&lt;br /&gt;
* hi128-app-ktimetracker.png will be installed e.g. to /usr/share/icons/hicolor/128x128/apps/ktimetracker.png. &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt; stands for &amp;quot;hicolor&amp;quot;, &amp;lt;tt&amp;gt;128&amp;lt;/tt&amp;gt; for a resolution of 128x128 pixels, &amp;lt;tt&amp;gt;app&amp;lt;/tt&amp;gt; for &amp;quot;applications&amp;quot;, &amp;lt;tt&amp;gt;ktimetracker&amp;lt;/tt&amp;gt; for the application's name and &amp;lt;tt&amp;gt;.png&amp;lt;/tt&amp;gt; is the suffix for portable network graphic files.&lt;br /&gt;
&lt;br /&gt;
= example application =&lt;br /&gt;
In this chapter we will build - on top of the [[Development/Tutorials/Using_KActions|KAction example]] - an example application ''kicons'' that looks like this:&lt;br /&gt;
&lt;br /&gt;
[[File:Snapshot-tutorial-kicon.png]]&lt;br /&gt;
&lt;br /&gt;
You can obtain its source code as part of kdeexamples by calling&lt;br /&gt;
 git clone git://anongit.kde.org/kdeexamples&lt;br /&gt;
&lt;br /&gt;
== files ==&lt;br /&gt;
The example application consists of &lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/main.cpp main.cpp]&lt;br /&gt;
: just taken from the [[Development/Tutorials/Using_KActions|KAction example]]&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/mainwindow.cpp mainwindow.cpp]&lt;br /&gt;
: Note the command &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;clearAction-&amp;gt;setIcon(KIcon(&amp;quot;tutorial-kicon&amp;quot;));&amp;lt;/syntaxhighlight&amp;gt; that sets the icon&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/mainwindow.h mainwindow.h]&lt;br /&gt;
: just taken from the [[Development/Tutorials/Using_KActions|KAction example]]&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/world.svg world.svg]&lt;br /&gt;
: This is a file that defines our icon in (almost natural) english language. It is a scalable vector graphic file. Before being used, it must be converted into a zipped scalable vector graphic named ''hisc-apps-tutorial-kicon.svgz'', see below.&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/tutorial-kiconui.rc tutorial-kiconui.rc]&lt;br /&gt;
: just taken from the [[Development/Tutorials/Using_KActions|KAction example]]&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/hisc-apps-tutorial-kicon.svgz hisc-apps-tutorial-kicon.svgz]&lt;br /&gt;
: sorry for the name, but there are [[#The_icon_naming_scheme|naming conventions]]. Create this file with the ''convert'' command from the ''ImageMagick'' package &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;convert world.svg hisc-apps-tutorial-kicon.svgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/CMakeLists.txt CMakeLists.txt]&lt;br /&gt;
: Note the commands &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kde4_install_icons(${ICON_INSTALL_DIR})&amp;lt;/syntaxhighlight&amp;gt; and &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kde4_update_iconcache()&amp;lt;/syntaxhighlight&amp;gt; which integrate the icons.&lt;br /&gt;
&lt;br /&gt;
== build it ==&lt;br /&gt;
To compile, link and install the example application, do a&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cmake . &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To run it, call&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tutorial-kicon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Analyzing the KApplications =&lt;br /&gt;
Maybe you have already searched for yourself how a KDE application finds its icons. You will not be successful like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 # [http://www.linuxintro.org/wiki/Strace#Search_for_a_syscall strace -e open] ktimetracker 2&amp;gt;&amp;amp;1 | grep icon&lt;br /&gt;
 open(&amp;quot;/usr/lib64/libkemoticons.so.4&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
 #&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You see, a KDE application (in this case ktimetracker) does not open icon files or even look for them. However, it spawns a process to look for these icons:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 linux-qgla:~/repos/kdepim/ktimetracker # strace -ffe open ktimetracker 2&amp;gt;&amp;amp;1 | grep icon&lt;br /&gt;
 open(&amp;quot;/usr/lib64/libkemoticons.so.4&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
 [pid  3457] open(&amp;quot;/root/.icons/DMZ/cursors/left_ptr&amp;quot;, O_RDONLY) = -1 ENOENT (No such file or directory)&lt;br /&gt;
 [pid  3457] open(&amp;quot;/root/.icons/DMZ/index.theme&amp;quot;, O_RDONLY) = -1 ENOENT (No such file or directory)&lt;br /&gt;
 [pid  3457] open(&amp;quot;/usr/share/icons/DMZ/cursors/left_ptr&amp;quot;, O_RDONLY) = 10&lt;br /&gt;
 [pid  3457] open(&amp;quot;/var/tmp/kdecache-root/icon-cache.kcache&amp;quot;, O_RDWR|O_CREAT|O_CLOEXEC, 0666) = 10&lt;br /&gt;
 [pid  3457] open(&amp;quot;/var/tmp/kdecache-root/kpc/kde-icon-cache.data&amp;quot;, O_RDONLY|O_CLOEXEC) = 10&lt;br /&gt;
 [pid  3457] open(&amp;quot;/var/tmp/kdecache-root/kpc/kde-icon-cache.index&amp;quot;, O_RDONLY|O_CLOEXEC) = 10&lt;br /&gt;
 [...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Moving On =&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Desktop_File|how to place your application in the K-Menu using .desktop files]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_Qt_Creator</id>
		<title>Development/Tutorials/Using Qt Creator</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_Qt_Creator"/>
				<updated>2011-09-28T20:21:24Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Proofreading.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using Qt Creator}}&lt;br /&gt;
&lt;br /&gt;
QtCreator is an IDE from Nokia for Qt. It contains QtDesigner for UI design. This article describes:&lt;br /&gt;
* why to use Qt Creator&lt;br /&gt;
* how to create a new application&lt;br /&gt;
* how to load an existing application&lt;br /&gt;
&lt;br /&gt;
= Why use Qt Creator =&lt;br /&gt;
{|align=&amp;quot;right&amp;quot; &lt;br /&gt;
|[[image:Snapshot-qtcreator.png|right|thumb|200px|KDE4's ktimetracker loaded as QtCreator project]]&lt;br /&gt;
|}&lt;br /&gt;
To create your C++ applications you can use any text editor. But life will be much easier if you gain QtCreator's features. That means&lt;br /&gt;
* you can get your source code saved, built and run with one click&lt;br /&gt;
* you get code-completion&lt;br /&gt;
* you can find all places in your source code where you call a function (e.g. &amp;quot;where do I call refresh()&amp;quot;)&lt;br /&gt;
* you can go back to a more recent cursor position with your editor, even if this is in another file&lt;br /&gt;
* you can checkout and commit to Subversion or Git repositories without leaving your workflow&lt;br /&gt;
&lt;br /&gt;
= Creating a new program =&lt;br /&gt;
Here is a short example of how you can create a &amp;quot;hello world&amp;quot; application. For more information read the [http://qt.nokia.com/doc/designer-manual.html user documentation].&lt;br /&gt;
&lt;br /&gt;
;Step 0:&lt;br /&gt;
Call QtCreator&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qtcreator&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Then select New File or Project -&amp;gt; Qt C++ Project -&amp;gt; Qt Gui Application -&amp;gt; name = helloworld -&amp;gt; Next -&amp;gt; Next -&amp;gt; Finish&lt;br /&gt;
&lt;br /&gt;
;Step 1:&lt;br /&gt;
Select Edit -&amp;gt; Forms -&amp;gt; mainwindow.ui. Add the widgets you want by drag-and-drop:&lt;br /&gt;
&lt;br /&gt;
[[File:Designer-step1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
;Step 2: &lt;br /&gt;
Select the mainwindow. This is the one un-intuitive step. To lay out the objects in the mainwindow, you do not select the objects in the mainwindow, but the mainwindow itself.&lt;br /&gt;
&lt;br /&gt;
[[File:Designer-step2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
;Step 3:&lt;br /&gt;
Select Form -&amp;gt; Lay Out in a &amp;lt;u&amp;gt;G&amp;lt;/u&amp;gt;rid&lt;br /&gt;
&lt;br /&gt;
[[File:Designer-step3.png|200px]]&lt;br /&gt;
&lt;br /&gt;
;Result:&lt;br /&gt;
You get a decent look, and if you resize the window, the widgets resize as well.&lt;br /&gt;
&lt;br /&gt;
[[File:Designer-result.png|200px]]&lt;br /&gt;
&lt;br /&gt;
== Using KDE libraries == &lt;br /&gt;
To use KDE classes like KMessageBox, you need to tell QtCreator to use the KDE libraries when building. Go to your home directory, change into ''yourproject'' and modify ''yourproject.pro''. Add the line&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
LIBS += -lkdeui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Then you can start using KDE classes in your code.&lt;br /&gt;
&lt;br /&gt;
== Adding a toolbar ==&lt;br /&gt;
To add a toolbar, right-click on the UI and choose &amp;quot;Add Toolbar&amp;quot;. Then you can set icons and text in your mainwindow's constructor with code like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
ui-&amp;gt;toolBar-&amp;gt;addAction(QIcon(&amp;quot;/usr/share/icons/oxygen/22x22/apps/ktip.png&amp;quot;),&amp;quot;hello world&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Development/Tutorials/Using_Qt_Designer|More Info...]]&lt;br /&gt;
&lt;br /&gt;
= Load an existing project =&lt;br /&gt;
This describes how to use QtCreator to integrate existing KDE 4 applications. It has been tested with QtCreator 1.2.80 and SUSE Linux 11.1 but should work same or similar with every combination. As an example KDE application we use [http://userbase.kde.org/ktimetracker ktimetracker] from the kdepim module, other applications should work likewise.&lt;br /&gt;
&lt;br /&gt;
You can either work with code on your disk or have QtCreator do the Subversion checkout.&lt;br /&gt;
&lt;br /&gt;
== use code from your disk ==&lt;br /&gt;
* import the CMakeLists.txt file (File -&amp;gt; Open -&amp;gt; kdepim/CMakeLists.txt)&lt;br /&gt;
* as build directory choose kdepim&lt;br /&gt;
* you will automatically come to a screen where you can run CMake&lt;br /&gt;
* continue with the step &amp;quot;Run cmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== have QtCreator do the subversion checkout ==&lt;br /&gt;
* choose File -&amp;gt; New File or Project -&amp;gt; Version Control -&amp;gt; Subversion Checkout.&lt;br /&gt;
* enter a Subversion URL like svn://anonsvn.kde.org/home/kde/trunk/KDE/kdepim&lt;br /&gt;
* enter a checkout directory, i.e. the local directory where the code will be checked-out to&lt;br /&gt;
* type finish, see how the checkout starts&lt;br /&gt;
* you will automatically come to a screen where you can run CMake&lt;br /&gt;
* continue with the step &amp;quot;Run cmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== have QtCreator do the git checkout ==&lt;br /&gt;
* choose File -&amp;gt; New File or Project -&amp;gt; Version Control -&amp;gt; Git Checkout.&lt;br /&gt;
* enter a Git URL like git@git.kde.org:/kdepim&lt;br /&gt;
* accept kdepim as checkout directory&lt;br /&gt;
* type finish, see how the checkout starts&lt;br /&gt;
* you will automatically come to a screen where you can run CMake&lt;br /&gt;
* continue with the step &amp;quot;Run cmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Run cmake ==&lt;br /&gt;
* enter arguments for CMake like &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/root/kdepim -DCMAKE_INSTALL_PREFIX=/usr/local -DLIB_SUFFIX=64 -DCMAKE_BUILD_TYPE=debugfull&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;DLIB_SUFFIX=64&amp;lt;/tt&amp;gt; means that you want to install your libraries into directories named &amp;lt;tt&amp;gt;lib64&amp;lt;/tt&amp;gt;, not &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt;. ''/root/kdepim'' is where your source code is.&lt;br /&gt;
* click &amp;quot;Run cmake&amp;quot;&lt;br /&gt;
* note: a .cbp file is created containing many information about the build&lt;br /&gt;
* click &amp;quot;Finish&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Build it ==&lt;br /&gt;
* configure QtCreator to build only ktimetracker:&lt;br /&gt;
Projects -&amp;gt; Active run configuration=ktimetracker -&amp;gt; build settings -&amp;gt; build steps -&amp;gt; make -&amp;gt; show details -&amp;gt; activate ktimetracker.&lt;br /&gt;
* configure QtCreator to use 8 logical processors:&lt;br /&gt;
Projects -&amp;gt; Active run configuration=ktimetracker -&amp;gt; build settings -&amp;gt; build steps -&amp;gt; make -&amp;gt; show details -&amp;gt; addtional Arguments = -j8&lt;br /&gt;
* choose Build -&amp;gt; Build All&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
* [[Development/Tutorials/Using Qt Designer]]&lt;br /&gt;
* [[Getting_Started/Using_an_IDE_with_KDE4#QtCreator]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDE4]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Icons</id>
		<title>Development/Tutorials/Icons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Icons"/>
				<updated>2011-09-28T20:09:28Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* files */ Fix code tags.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
When you create your own KDE application you will probably want icons in it like this:&lt;br /&gt;
&lt;br /&gt;
[[File:Snapshot-krep-arrow.png]]&lt;br /&gt;
&lt;br /&gt;
These icons are called [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKIcon.html KIcon]s. This article shows you how to do this using the software [http://www.staerk.de/thorsten/krep krep] as an example. In case of a [[Development/Tutorials/CMake|&lt;br /&gt;
CMake]]-based project you will need to  &lt;br /&gt;
* [http://websvn.kde.org/trunk/playground/utils/krep/main.cpp?r1=1154359&amp;amp;r2=1249871 modify main.cpp (as it is typically called)]&lt;br /&gt;
* [http://websvn.kde.org/trunk/playground/utils/krep/CMakeLists.txt?r1=813330&amp;amp;r2=1249871&amp;amp;sortby=date modify CMakeLists.txt]&lt;br /&gt;
&lt;br /&gt;
How to use icons in QMake-based projects is discussed [http://appdeveloper.intel.com/en-us/Qt%20C%20Plus%20Plus%20app%20MeeGo%20SDK elsewhere].&lt;br /&gt;
&lt;br /&gt;
= Your KDE project =&lt;br /&gt;
If you have a KDE project and want to use icons within it, and want these icons installed seamlessly, you will have to name the icons after the project. In the following we look at a project named ''krep''. The important lines in CMakeLists.txt are the ones printed bold below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
PROJECT( krep )&lt;br /&gt;
FIND_PACKAGE( KDE4 REQUIRED )&lt;br /&gt;
INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} . )&lt;br /&gt;
 &lt;br /&gt;
SET( krepSources main.cpp krep.cpp krep.h )&lt;br /&gt;
 &lt;br /&gt;
qt4_add_dbus_adaptor( krepSources &lt;br /&gt;
                      org.kde.krep.xml&lt;br /&gt;
                      krep.h&lt;br /&gt;
                      krep&lt;br /&gt;
                      mainadaptor&lt;br /&gt;
                      MainAdaptor )&lt;br /&gt;
 &lt;br /&gt;
kde4_add_ui_files( krepSources krepui.ui )&lt;br /&gt;
 &lt;br /&gt;
kde4_add_app_icon]]( krepSources &amp;quot;hi*-app-krep.png&amp;quot; )&lt;br /&gt;
 &lt;br /&gt;
KDE4_ADD_EXECUTABLE( krep ${krepSources} )&lt;br /&gt;
 &lt;br /&gt;
TARGET_LINK_LIBRARIES( krep ${KDE4_KPARTS_LIBS} )&lt;br /&gt;
 &lt;br /&gt;
install( TARGETS krep ${INSTALL_TARGETS_DEFAULT_ARGS} )&lt;br /&gt;
 &lt;br /&gt;
'''kde4_install_icons( ${ICON_INSTALL_DIR]]} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Weitere Informationen:&lt;br /&gt;
* [[Development/CMake/Addons_for_KDE#Macros|kde4_add_app_icon]]&lt;br /&gt;
* [[Development/CMake/Addons_for_KDE#The_locations_of_install_directories|ICON_INSTALL_DIR]]&lt;br /&gt;
&lt;br /&gt;
= How to test it =&lt;br /&gt;
* delete a file&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 rm /usr/local/share/icons/hicolor/22x22/apps/krep.png&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Note| We are assuming your icon path is /usr/local/share/icons.&lt;br /&gt;
Find it out with the command&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kde4-config --path icon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
* delete your cache&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rm -rf /var/tmp/kdecache-''user''/icon-cache.kcache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
According to [[Development/CMake/Addons_for_KDE#Macros]] you need to provide a 128x128 pixels icon.&lt;br /&gt;
&lt;br /&gt;
= The icon naming scheme =&lt;br /&gt;
Example for icon names:&lt;br /&gt;
* hisc-apps-bla.svgz will be installed e.g. to /usr/local/share/icons/hicolor/scalable/apps/bla.svgz. ''hi'' stands for &amp;quot;hicolor&amp;quot;, ''sc'' for &amp;quot;scalable&amp;quot;, ''apps'' for &amp;quot;applications&amp;quot;, ''bla'' for the application's name and ''.svgz'' is the suffix for gzipped scalable vector graphic files.&lt;br /&gt;
* hi128-app-ktimetracker.png will be installed e.g. to /usr/share/icons/hicolor/128x128/apps/ktimetracker.png. ''hi'' stands for &amp;quot;hicolor&amp;quot;, ''128'' for a resolution of 128x128 pixels, ''app'' for &amp;quot;applications&amp;quot;, ''ktimetracker'' for the application's name and ''.png'' is the suffix for portable network graphic files.&lt;br /&gt;
&lt;br /&gt;
= example application =&lt;br /&gt;
In this chapter we will build - on top of the [[Development/Tutorials/Using_KActions|KAction example]] - an example application ''kicons'' that looks like this:&lt;br /&gt;
&lt;br /&gt;
[[File:Snapshot-tutorial-kicon.png]]&lt;br /&gt;
&lt;br /&gt;
You can obtain its source code as part of kdeexamples by calling&lt;br /&gt;
 git clone git://anongit.kde.org/kdeexamples&lt;br /&gt;
&lt;br /&gt;
== files ==&lt;br /&gt;
The example application consists of &lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/main.cpp main.cpp]&lt;br /&gt;
: just taken from the [[Development/Tutorials/Using_KActions|KAction example]]&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/mainwindow.cpp mainwindow.cpp]&lt;br /&gt;
: Note the command &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;clearAction-&amp;gt;setIcon(KIcon(&amp;quot;tutorial-kicon&amp;quot;));&amp;lt;/syntaxhighlight&amp;gt; that sets the icon&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/mainwindow.h mainwindow.h]&lt;br /&gt;
: just taken from the [[Development/Tutorials/Using_KActions|KAction example]]&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/world.svg world.svg]&lt;br /&gt;
: This is a file that defines our icon in (almost natural) english language. It is a scalable vector graphic file. Before being used, it must be converted into a zipped scalable vector graphic named ''hisc-apps-tutorial-kicon.svgz'', see below.&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/tutorial-kiconui.rc tutorial-kiconui.rc]&lt;br /&gt;
: just taken from the [[Development/Tutorials/Using_KActions|KAction example]]&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/hisc-apps-tutorial-kicon.svgz hisc-apps-tutorial-kicon.svgz]&lt;br /&gt;
: sorry for the name, but there are [[#The_icon_naming_scheme|naming conventions]]. Create this file with the ''convert'' command from the ''ImageMagick'' package &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;convert world.svg hisc-apps-tutorial-kicon.svgz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/CMakeLists.txt CMakeLists.txt]&lt;br /&gt;
: Note the commands &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kde4_install_icons(${ICON_INSTALL_DIR})&amp;lt;/syntaxhighlight&amp;gt; and &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;kde4_update_iconcache()&amp;lt;/syntaxhighlight&amp;gt; which integrate the icons.&lt;br /&gt;
&lt;br /&gt;
== build it ==&lt;br /&gt;
To compile, link and install the example application, do a&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cmake . &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To run it, call&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tutorial-kicon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Analyzing the KApplications =&lt;br /&gt;
Maybe you have already searched for yourself how a KDE application finds its icons. You will not be successful like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 # [http://www.linuxintro.org/wiki/Strace#Search_for_a_syscall strace -e open] ktimetracker 2&amp;gt;&amp;amp;1 | grep icon&lt;br /&gt;
 open(&amp;quot;/usr/lib64/libkemoticons.so.4&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
 #&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You see, a KDE application (in this case ktimetracker) does not open icon files or even look for them. However, it spawns a process to look for these icons:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 linux-qgla:~/repos/kdepim/ktimetracker # strace -ffe open ktimetracker 2&amp;gt;&amp;amp;1 | grep icon&lt;br /&gt;
 open(&amp;quot;/usr/lib64/libkemoticons.so.4&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
 [pid  3457] open(&amp;quot;/root/.icons/DMZ/cursors/left_ptr&amp;quot;, O_RDONLY) = -1 ENOENT (No such file or directory)&lt;br /&gt;
 [pid  3457] open(&amp;quot;/root/.icons/DMZ/index.theme&amp;quot;, O_RDONLY) = -1 ENOENT (No such file or directory)&lt;br /&gt;
 [pid  3457] open(&amp;quot;/usr/share/icons/DMZ/cursors/left_ptr&amp;quot;, O_RDONLY) = 10&lt;br /&gt;
 [pid  3457] open(&amp;quot;/var/tmp/kdecache-root/icon-cache.kcache&amp;quot;, O_RDWR|O_CREAT|O_CLOEXEC, 0666) = 10&lt;br /&gt;
 [pid  3457] open(&amp;quot;/var/tmp/kdecache-root/kpc/kde-icon-cache.data&amp;quot;, O_RDONLY|O_CLOEXEC) = 10&lt;br /&gt;
 [pid  3457] open(&amp;quot;/var/tmp/kdecache-root/kpc/kde-icon-cache.index&amp;quot;, O_RDONLY|O_CLOEXEC) = 10&lt;br /&gt;
 [...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Moving On =&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Desktop_File|how to place your application in the K-Menu using .desktop files]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Icons</id>
		<title>Development/Tutorials/Icons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Icons"/>
				<updated>2011-09-28T20:06:18Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Proofreading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
When you create your own KDE application you will probably want icons in it like this:&lt;br /&gt;
&lt;br /&gt;
[[File:Snapshot-krep-arrow.png]]&lt;br /&gt;
&lt;br /&gt;
These icons are called [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKIcon.html KIcon]s. This article shows you how to do this using the software [http://www.staerk.de/thorsten/krep krep] as an example. In case of a [[Development/Tutorials/CMake|&lt;br /&gt;
CMake]]-based project you will need to  &lt;br /&gt;
* [http://websvn.kde.org/trunk/playground/utils/krep/main.cpp?r1=1154359&amp;amp;r2=1249871 modify main.cpp (as it is typically called)]&lt;br /&gt;
* [http://websvn.kde.org/trunk/playground/utils/krep/CMakeLists.txt?r1=813330&amp;amp;r2=1249871&amp;amp;sortby=date modify CMakeLists.txt]&lt;br /&gt;
&lt;br /&gt;
How to use icons in QMake-based projects is discussed [http://appdeveloper.intel.com/en-us/Qt%20C%20Plus%20Plus%20app%20MeeGo%20SDK elsewhere].&lt;br /&gt;
&lt;br /&gt;
= Your KDE project =&lt;br /&gt;
If you have a KDE project and want to use icons within it, and want these icons installed seamlessly, you will have to name the icons after the project. In the following we look at a project named ''krep''. The important lines in CMakeLists.txt are the ones printed bold below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
PROJECT( krep )&lt;br /&gt;
FIND_PACKAGE( KDE4 REQUIRED )&lt;br /&gt;
INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} . )&lt;br /&gt;
 &lt;br /&gt;
SET( krepSources main.cpp krep.cpp krep.h )&lt;br /&gt;
 &lt;br /&gt;
qt4_add_dbus_adaptor( krepSources &lt;br /&gt;
                      org.kde.krep.xml&lt;br /&gt;
                      krep.h&lt;br /&gt;
                      krep&lt;br /&gt;
                      mainadaptor&lt;br /&gt;
                      MainAdaptor )&lt;br /&gt;
 &lt;br /&gt;
kde4_add_ui_files( krepSources krepui.ui )&lt;br /&gt;
 &lt;br /&gt;
kde4_add_app_icon]]( krepSources &amp;quot;hi*-app-krep.png&amp;quot; )&lt;br /&gt;
 &lt;br /&gt;
KDE4_ADD_EXECUTABLE( krep ${krepSources} )&lt;br /&gt;
 &lt;br /&gt;
TARGET_LINK_LIBRARIES( krep ${KDE4_KPARTS_LIBS} )&lt;br /&gt;
 &lt;br /&gt;
install( TARGETS krep ${INSTALL_TARGETS_DEFAULT_ARGS} )&lt;br /&gt;
 &lt;br /&gt;
'''kde4_install_icons( ${ICON_INSTALL_DIR]]} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Weitere Informationen:&lt;br /&gt;
* [[Development/CMake/Addons_for_KDE#Macros|kde4_add_app_icon]]&lt;br /&gt;
* [[Development/CMake/Addons_for_KDE#The_locations_of_install_directories|ICON_INSTALL_DIR]]&lt;br /&gt;
&lt;br /&gt;
= How to test it =&lt;br /&gt;
* delete a file&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 rm /usr/local/share/icons/hicolor/22x22/apps/krep.png&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Note| We are assuming your icon path is /usr/local/share/icons.&lt;br /&gt;
Find it out with the command&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kde4-config --path icon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
* delete your cache&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rm -rf /var/tmp/kdecache-''user''/icon-cache.kcache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
According to [[Development/CMake/Addons_for_KDE#Macros]] you need to provide a 128x128 pixels icon.&lt;br /&gt;
&lt;br /&gt;
= The icon naming scheme =&lt;br /&gt;
Example for icon names:&lt;br /&gt;
* hisc-apps-bla.svgz will be installed e.g. to /usr/local/share/icons/hicolor/scalable/apps/bla.svgz. ''hi'' stands for &amp;quot;hicolor&amp;quot;, ''sc'' for &amp;quot;scalable&amp;quot;, ''apps'' for &amp;quot;applications&amp;quot;, ''bla'' for the application's name and ''.svgz'' is the suffix for gzipped scalable vector graphic files.&lt;br /&gt;
* hi128-app-ktimetracker.png will be installed e.g. to /usr/share/icons/hicolor/128x128/apps/ktimetracker.png. ''hi'' stands for &amp;quot;hicolor&amp;quot;, ''128'' for a resolution of 128x128 pixels, ''app'' for &amp;quot;applications&amp;quot;, ''ktimetracker'' for the application's name and ''.png'' is the suffix for portable network graphic files.&lt;br /&gt;
&lt;br /&gt;
= example application =&lt;br /&gt;
In this chapter we will build - on top of the [[Development/Tutorials/Using_KActions|KAction example]] - an example application ''kicons'' that looks like this:&lt;br /&gt;
&lt;br /&gt;
[[File:Snapshot-tutorial-kicon.png]]&lt;br /&gt;
&lt;br /&gt;
You can obtain its source code as part of kdeexamples by calling&lt;br /&gt;
 git clone git://anongit.kde.org/kdeexamples&lt;br /&gt;
&lt;br /&gt;
== files ==&lt;br /&gt;
The example application consists of &lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/main.cpp main.cpp]&lt;br /&gt;
: just taken from the [[Development/Tutorials/Using_KActions|KAction example]]&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/mainwindow.cpp mainwindow.cpp]&lt;br /&gt;
: Note the command &amp;lt;code&amp;gt; clearAction-&amp;gt;setIcon(KIcon(&amp;quot;tutorial-kicon&amp;quot;));&amp;lt;/code&amp;gt; that sets the icon&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/mainwindow.h mainwindow.h]&lt;br /&gt;
: just taken from the [[Development/Tutorials/Using_KActions|KAction example]]&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/world.svg world.svg]&lt;br /&gt;
: This is a file that defines our icon in (almost natural) english language. It is a scalable vector graphic file. Before being used, it must be converted into a zipped scalable vector graphic named ''hisc-apps-tutorial-kicon.svgz'', see below.&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/tutorial-kiconui.rc tutorial-kiconui.rc]&lt;br /&gt;
: just taken from the [[Development/Tutorials/Using_KActions|KAction example]]&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/hisc-apps-tutorial-kicon.svgz hisc-apps-tutorial-kicon.svgz]&lt;br /&gt;
: sorry for the name, but there are [[#The_icon_naming_scheme|naming conventions]]. Create this file with the ''convert'' command from the ''ImageMagick'' package&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
convert world.svg hisc-apps-tutorial-kicon.svgz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* [http://quickgit.kde.org/?p=kdeexamples.git&amp;amp;a=blob&amp;amp;f=kicons/CMakeLists.txt CMakeLists.txt]&lt;br /&gt;
: Note the commands&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kde4_install_icons(${ICON_INSTALL_DIR})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kde4_update_iconcache()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
which integrate the icons.&lt;br /&gt;
&lt;br /&gt;
== build it ==&lt;br /&gt;
To compile, link and install the example application, do a&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cmake . &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To run it, call&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tutorial-kicon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Analyzing the KApplications =&lt;br /&gt;
Maybe you have already searched for yourself how a KDE application finds its icons. You will not be successful like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 # [http://www.linuxintro.org/wiki/Strace#Search_for_a_syscall strace -e open] ktimetracker 2&amp;gt;&amp;amp;1 | grep icon&lt;br /&gt;
 open(&amp;quot;/usr/lib64/libkemoticons.so.4&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
 #&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You see, a KDE application (in this case ktimetracker) does not open icon files or even look for them. However, it spawns a process to look for these icons:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 linux-qgla:~/repos/kdepim/ktimetracker # strace -ffe open ktimetracker 2&amp;gt;&amp;amp;1 | grep icon&lt;br /&gt;
 open(&amp;quot;/usr/lib64/libkemoticons.so.4&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
 [pid  3457] open(&amp;quot;/root/.icons/DMZ/cursors/left_ptr&amp;quot;, O_RDONLY) = -1 ENOENT (No such file or directory)&lt;br /&gt;
 [pid  3457] open(&amp;quot;/root/.icons/DMZ/index.theme&amp;quot;, O_RDONLY) = -1 ENOENT (No such file or directory)&lt;br /&gt;
 [pid  3457] open(&amp;quot;/usr/share/icons/DMZ/cursors/left_ptr&amp;quot;, O_RDONLY) = 10&lt;br /&gt;
 [pid  3457] open(&amp;quot;/var/tmp/kdecache-root/icon-cache.kcache&amp;quot;, O_RDWR|O_CREAT|O_CLOEXEC, 0666) = 10&lt;br /&gt;
 [pid  3457] open(&amp;quot;/var/tmp/kdecache-root/kpc/kde-icon-cache.data&amp;quot;, O_RDONLY|O_CLOEXEC) = 10&lt;br /&gt;
 [pid  3457] open(&amp;quot;/var/tmp/kdecache-root/kpc/kde-icon-cache.index&amp;quot;, O_RDONLY|O_CLOEXEC) = 10&lt;br /&gt;
 [...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Moving On =&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Desktop_File|how to place your application in the K-Menu using .desktop files]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Getting_Started/Using_an_IDE_with_KDE4</id>
		<title>Getting Started/Using an IDE with KDE4</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Getting_Started/Using_an_IDE_with_KDE4"/>
				<updated>2011-09-28T19:43:07Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Proofreading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Eclipse ==&lt;br /&gt;
&lt;br /&gt;
    {|align=&amp;quot;right&amp;quot; &lt;br /&gt;
    |[[image:Snapshot-eclipse.png|right|thumb|200px|KDE4's ktimetracker loaded as eclipse project]]&lt;br /&gt;
    |}&lt;br /&gt;
This describes how to use Eclipse to develop KDE 4 applications. It has been tested with Eclipse Ganymede and SUSE Linux 11.1 but should work same or similar with every combination. As an example KDE application we use [http://userbase.kde.org/ktimetracker ktimetracker] from the kdepim module, other applications should work likewise.&lt;br /&gt;
&lt;br /&gt;
Using this description you will be able to&lt;br /&gt;
* update your working copy of KDE source code using the ''svn'' command&lt;br /&gt;
* build your KDE module using CMake&lt;br /&gt;
* build your KDE application from within Eclipse using Make&lt;br /&gt;
* compile and run your application with one click from Eclipse&lt;br /&gt;
* get auto-completion when editing KDE source code&lt;br /&gt;
* have an overview and navigation about your classes within Eclipse&lt;br /&gt;
* have call trees for your functions&lt;br /&gt;
&lt;br /&gt;
=== Set up Eclipse with KDE  ===&lt;br /&gt;
&lt;br /&gt;
* Check your requirements&lt;br /&gt;
: Trying with a virtual machine [[User:Tstaerk|I]] had problems starting Eclipse with less than 1 GB RAM. After assigning 3 GB RAM to the virtual machine, Eclipse finally started. &lt;br /&gt;
&lt;br /&gt;
* Install Eclipse&lt;br /&gt;
&lt;br /&gt;
: Download Eclipse IDE for C/C++ developers from http://www.eclipse.org. Unpack it to /home/user/eclipse. &lt;br /&gt;
&lt;br /&gt;
* Install the CDT&lt;br /&gt;
&lt;br /&gt;
: Download the Eclipse IDE for C/C++ Developers (68 MB) from http://www.eclipse.org/cdt/ and unpack it into your Eclipse folder, in our case /home/user/eclipse. &lt;br /&gt;
&lt;br /&gt;
* Download kdepim&lt;br /&gt;
&lt;br /&gt;
: As said, we use kdepim as example here. So, download (&amp;quot;checkout&amp;quot;) kdepim using Subversion, e.g. as anonymous:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdepim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: We assume you checked out into /home/user/kdepim. &lt;br /&gt;
&lt;br /&gt;
* Compile kdepim&lt;br /&gt;
&lt;br /&gt;
: Compile kdepim so the usual makefiles are present for all kdepim applications. If you have problems doing this, follow our [[Getting Started/Build|build instructions]].&lt;br /&gt;
&lt;br /&gt;
* Import your project into Eclipse&lt;br /&gt;
&lt;br /&gt;
: Surprise: To import your project, you cannot use &amp;quot;File -&amp;gt; Import&amp;quot;. Rather do: File -&amp;gt; New -&amp;gt; C++ Project -&amp;gt; Makefile project -&amp;gt; Empty Project -&amp;gt; un-tag &amp;quot;use default location&amp;quot; -&amp;gt; choose /home/user/kdepim/ktimetracker. Call it &amp;quot;ktimetracker&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Build your project&lt;br /&gt;
: Make sure Project -&amp;gt; Properties -&amp;gt; C/C++ Build -&amp;gt; Builder Settings -&amp;gt; Build location -&amp;gt; Build directory is set correctly.&lt;br /&gt;
: Choose Project -&amp;gt; Build Project&lt;br /&gt;
&lt;br /&gt;
* Run the project&lt;br /&gt;
: Choose Project -&amp;gt; Properties -&amp;gt; Run/Debug Settings -&amp;gt; New. As project, enter ''ktimetracker'', as C/C++ Application, enter /home/user/kdepim/ktimetracker/ktimetracker. Choose Apply -&amp;gt; Ok -&amp;gt; Ok. Now you can click on the &amp;quot;Run&amp;quot; button and start it.&lt;br /&gt;
&lt;br /&gt;
=== Know-How ===&lt;br /&gt;
&lt;br /&gt;
==== Custom builders ====&lt;br /&gt;
&lt;br /&gt;
If you want to integrate the CMake build step into your build toolchain, you will need to &lt;br /&gt;
* create a custom ''builder'' like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;cmake . &amp;amp;&amp;amp; make -j4 &amp;amp;&amp;amp; make install&amp;quot; &amp;gt;/bin/eclipsebuild&lt;br /&gt;
chmod 777 /bin/eclipsebuild&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Add your builder&lt;br /&gt;
: Choose Project -&amp;gt; Properties -&amp;gt; Builders. Un-tag all existing builders. Click &amp;quot;new&amp;quot; -&amp;gt; Program -&amp;gt; (name it &amp;quot;Builder for KDE&amp;quot;). -&amp;gt; Location: /bin/eclipsebuild -&amp;gt; Working directory /home/user/workspace/myproject1/kdepim.&lt;br /&gt;
&lt;br /&gt;
* Build&lt;br /&gt;
: Now you can build your project. Every time you restart eclipse, choose myproject1 -&amp;gt; Project -&amp;gt; Properties -&amp;gt; C/C++ Build -&amp;gt; Ok -&amp;gt; Project -&amp;gt; Build.&lt;br /&gt;
&lt;br /&gt;
==== Revert what eclipse did ====&lt;br /&gt;
&lt;br /&gt;
To revert what eclipse did to your project simply run&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rm -rf .externalToolBuilders/ .project .cproject&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Why Subversion does not work ====&lt;br /&gt;
&lt;br /&gt;
When using Eclipse's svn plugin and building a KDE program, you will get error messages complaining that your svn binary is too old. If you want to try and change this, here is how you get to that error:&lt;br /&gt;
&lt;br /&gt;
* Install the Subversion plug-ins&lt;br /&gt;
: Help -&amp;gt; Software Updates -&amp;gt; Available Software -&amp;gt; Add Site -&amp;gt; http://download.eclipse.org/technology/subversive/0.7/update-site/ -&amp;gt; Add Site -&amp;gt; http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/&lt;br /&gt;
&lt;br /&gt;
: Now add it: Subversive Site -&amp;gt; Subversive SVN Team Provider Plugin &lt;br /&gt;
&lt;br /&gt;
: Subversive SVN Connectors Site -&amp;gt; Subversive SVN Connectors -&amp;gt; SVNKit 1.3.0 Implementation (Optional) &lt;br /&gt;
&lt;br /&gt;
* Click on Install&lt;br /&gt;
&lt;br /&gt;
* Restart Eclipse&lt;br /&gt;
&lt;br /&gt;
* Import your KDE module&lt;br /&gt;
: Choose File -&amp;gt; New -&amp;gt; Other -&amp;gt; SVN -&amp;gt; Project from SVN -&amp;gt; https://svn.kde.org/home/kde/trunk/KDE/kdepim -&amp;gt; Check out as project configured using the New Project Wizard -&amp;gt; C++ Project -&amp;gt; Makefile Project -&amp;gt; Empty Project. As name, we choose kdepim5 -&amp;gt; Finish&lt;br /&gt;
&lt;br /&gt;
* Set cmake as build environment&lt;br /&gt;
: Choose Project -&amp;gt; Properties -&amp;gt; C/C++ Build -&amp;gt; Builder Settings. Un-tag &amp;quot;use default build command&amp;quot;, set &amp;quot;cmake&amp;quot; instead. Choose Project -&amp;gt; Properties -&amp;gt; C/C++ Build -&amp;gt; Behavior. Replace &amp;quot;all&amp;quot; by &amp;quot;.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== See also ===&lt;br /&gt;
&lt;br /&gt;
* http://javathreads.de/2008/07/subversion-unter-eclipse-ganymede-konfigurieren/&lt;br /&gt;
* http://nienhueser.de/blog/?p=19 &lt;br /&gt;
&lt;br /&gt;
== QtCreator ==&lt;br /&gt;
{|align=&amp;quot;right&amp;quot; &lt;br /&gt;
|[[image:Snapshot-qtcreator.png|right|thumb|200px|KDE4's ktimetracker loaded as QtCreator project]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Main article: [[Development/Tutorials/Using_Qt_Creator]]&lt;br /&gt;
&lt;br /&gt;
This describes how to use QtCreator to develop KDE 4 applications. It has been tested with QtCreator 1.2.80 and SUSE Linux 11.1 but should work same or similar with every combination. As an example KDE application we use [http://userbase.kde.org/ktimetracker ktimetracker] from the kdepim module, other applications should work likewise.&lt;br /&gt;
&lt;br /&gt;
=== Load an existing project ===&lt;br /&gt;
As discussed here we use ktimetracker as example project.&lt;br /&gt;
* Import the CMakeLists.txt file&lt;br /&gt;
File -&amp;gt; Open -&amp;gt; kdepim/CMakeLists.txt.&lt;br /&gt;
* Configure QtCreator to build only ktimetracker&lt;br /&gt;
Projects -&amp;gt; ktimetracker -&amp;gt; build settings -&amp;gt; Add a configuration ktimetracker.&lt;br /&gt;
&lt;br /&gt;
As build directory choose kdepim. As arguments for CMake use e.g.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
. -DCMAKE_INSTALL_PREFIX=/usr/local -DLIB_SUFFIX=64 -DCMAKE_BUILD_TYPE=debugfull&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Start a KDE project === &lt;br /&gt;
To start a new project you need to tell QtCreator to use the KDE libraries when building. So, choose File -&amp;gt; New... and create your project. We will call it ''yourproject'' here. To be able to use KDE's libraries, go to your home directory, change into ''yourproject'' and modify the file ''yourproject.pro''. Add the line&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
LIBS += -lkdeui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KDevelop 3 (outdated by KDevelop 4) ==&lt;br /&gt;
&lt;br /&gt;
This section will explain how to use KDevelop 3.4 to develop KDE 4 applications. If you have any questions, corrections or rants about this section, please post them on the discussion page.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
You need at least KDevelop 3.4 for this, which is still a KDE 3 application. Versions lower than 3.4 do not have Qt 4 support among other things. You can get KDevelop at the [http://www.kdevelop.org/index.html?filename=3.4/download.html KDevelop homepage]. Make sure you install KDevelop like all other KDE 3 applications, '''not''' with your ''kde-devel'' user. &lt;br /&gt;
&lt;br /&gt;
You also need the lastest ''GDB'' version, which is currently 6.6.0.&lt;br /&gt;
Note that the GDB version which is shipped with '''openSuse 10.3 is broken''', it constantly crashes when examining variables (which KDevelop does automatically). Use the GDB version from [http://download.opensuse.org/repositories/home:/amilcarlucas/openSUSE_10.3/ this repository] instead.&lt;br /&gt;
&lt;br /&gt;
You need to have the kdelibs API documentation locally, which is described in the [[Development/Tools/apidox|build instructions]].&lt;br /&gt;
&lt;br /&gt;
You also need ''ctags'', ''htdig'', ''htmerge'' and ''htsearch''. ''valgrind'' and ''callgrind'' can also be useful.&lt;br /&gt;
&lt;br /&gt;
Be sure you followed the steps in the KDE 4 [[Getting_Started/Build|build instructions]] and have a working KDE 4 environment.  Make sure simple KDE 4 applications like ''Konsole'' or ''KWrite'' can be started from the command line of the ''kde-devel'' user without problems. &lt;br /&gt;
&lt;br /&gt;
The following steps are all done with the ''kde-devel'' user. You need to login as that user by typing &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
su - kde-devel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
KDevelop has no native support for CMake projects. Fortunately, CMake has the ability to generate KDevelop project files itself. In order to do this, you need to pass the ''-GKDevelop3'' flag to the ''cmake'' command. This tells CMake to generate project files for KDevelop alongside the normal makefiles. The best way to do this is to modify your ''cmakekde'' function in your [[Getting_Started/Increased_Productivity_in_KDE4_with_Scripts/.bashrc|{{path|.bashrc}}]]. Just change&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cmake $srcFolder -DCMAKE_INSTALL_PREFIX=$KDEDIR \&lt;br /&gt;
-DCMAKE_BUILD_TYPE=debugfull&amp;amp;&amp;amp; \&lt;br /&gt;
make &amp;amp;&amp;amp; \&lt;br /&gt;
make install;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
to&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cmake $srcFolder -GKDevelop3 -DCMAKE_INSTALL_PREFIX=$KDEDIR \&lt;br /&gt;
-DCMAKE_BUILD_TYPE=debugfull&amp;amp;&amp;amp; \&lt;br /&gt;
make &amp;amp;&amp;amp; \&lt;br /&gt;
make install;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After you have done that, re-login so that the changes to the {{path|.bashrc}} file take effect. Then you need to rerun ''cmakekde'' in the (root) build directory of the project you want to work on with KDevelop (if you didn't use ''-GKDevelop3'' on the [[Getting_Started/Build/Environment|building step]]). For example, if you want to work on Konsole, which lives in ''kdebase'', you need to run cmakekde in the {{path|$KDE_BUILD/KDE/kdebase}} directory. This unfortunately completely rebuilds everything, but only once when you change the generator.&lt;br /&gt;
&lt;br /&gt;
Since all environment variables of the kde-devel user are KDE 4 specific, these need to be set back to match your KDE 3 environment before starting KDevelop.&lt;br /&gt;
A simple way to do this is to add the following function to your {{path|.bashrc}}:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
function start3app {&lt;br /&gt;
  mkdir -p /tmp/$USER-kde&lt;br /&gt;
  export PATH=/opt/kde3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games &lt;br /&gt;
  export LD_LIBRARY_PATH= &lt;br /&gt;
  export KDETMP=/tmp/$USER-kde &lt;br /&gt;
  export KDEVARTMP=/var/tmp/$USER-kde &lt;br /&gt;
  export KDEHOME=$HOME/.kde &lt;br /&gt;
  export KDEDIR=/usr &lt;br /&gt;
  export KDEDIRS=$KDEDIR &lt;br /&gt;
  export DISPLAY=:0 &lt;br /&gt;
  eval &amp;quot;$@&amp;quot;&lt;br /&gt;
  source $HOME/.bashrc   #Reset environment variables again&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ''PATH'' and ''LD_LIBRARY_PATH'' variables are taken from the KDE 3 user, and they may be different on your system. Type &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;echo $PATH&amp;lt;/syntaxhighlight&amp;gt; and &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;echo $LD_LIBRARY_PATH&amp;lt;/syntaxhighlight&amp;gt; as normal KDE 3 user to get these values. The above function assumes that KDE 3 is installed in the {{path|/usr}} prefix, as it is the case on Debian-based systems. If your KDE 3 is installed to a different prefix, you need to change the line setting ''KDEDIR'' accordingly. Here's an example how you find out your KDE installation prefix; in this example it is /opt/kde3:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kde-config --prefix&lt;br /&gt;
/opt/kde3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you should be able to start KDevelop by typing &amp;lt;tt&amp;gt;start3app kdevelop&amp;lt;/tt&amp;gt;. Do that now.&lt;br /&gt;
&lt;br /&gt;
{{tip|&lt;br /&gt;
You can start any KDE 3 application with the &amp;lt;tt&amp;gt;start3app&amp;lt;/tt&amp;gt; function. Useful candidates include ''Kompare'' and ''kdesvn''.&lt;br /&gt;
&lt;br /&gt;
However, you can not start ''KDbg'' this way to debug KDE 4 applications, since then the environment variables for the debugged application are wrong.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{tip|&lt;br /&gt;
Instead of starting KDevelop by using the ''start3app'' script as ''kde-devel'' user, you can also use the KDE run dialog ''(Alt+F2)'' to start KDevelop:&lt;br /&gt;
&lt;br /&gt;
[[Image:Minicli.png]]&lt;br /&gt;
&lt;br /&gt;
This starts KDevelop as ''kde-devel'' user but uses the environment variables of the normal user, just like the ''start3app'' script does.&lt;br /&gt;
}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== TroubleShooting ====&lt;br /&gt;
&lt;br /&gt;
'''Symptome:''' kdevelop says &amp;quot;cannot talk to klauncher&amp;quot;. You cannot open a file.&lt;br /&gt;
&lt;br /&gt;
'''Solution:''' add your KDE library path to LD_LIBRARY_PATH, e.g.:&lt;br /&gt;
 export LD_LIBRARY_PATH=/opt/kde3/lib&lt;br /&gt;
&lt;br /&gt;
=== Setting up KDevelop ===&lt;br /&gt;
&lt;br /&gt;
Now that KDevelop has started, you need to adjust a few settings. Go to ''Settings-&amp;gt;Configure KDevelop...-&amp;gt;Documentation'' for this. Remove all entries that are not relevant to KDE 4 coding.&lt;br /&gt;
&lt;br /&gt;
{{note|Although environment variables like $HOME are used in this section, you should replace them with real paths because KDevelop does not resolve environment variables.}}&lt;br /&gt;
&lt;br /&gt;
Optionally, you can add the kdelibs API documentation. You must [[Development/Tools/apidox|create it beforehand]]. Then add the documentation by clicking ''Add...''. In this dialog, use the following settings:&lt;br /&gt;
* ''Type'': Doxygen Documentation Collection (needs to be set first)&lt;br /&gt;
* ''Location'': {{path|$KDE_SRC/KDE/kdelibs/kdelibs-apidocs/index.html}}&lt;br /&gt;
&lt;br /&gt;
Now add the Qt API documentation, which also must be [[Development/Tools/apidox|created beforehand]], using the following settings:&lt;br /&gt;
* ''Type'': Qt Documentation Collection (needs to be set first)&lt;br /&gt;
* ''Location'': {{path|$HOME/qt-copy/doc/html/qt.dcf}}&lt;br /&gt;
&lt;br /&gt;
After you have added kdelibs and Qt API documentation, make sure all checkboxes (''TOC'',''Index'' and ''Search'') are enabled. Then, go to the ''Full Text Search'' tab and make sure the paths to the ''htdig'', ''htmerge'' and ''htsearch'' executables are correct. You can then close the settings dialog.&lt;br /&gt;
&lt;br /&gt;
Now it is time to open the project you want to work on by clicking ''Project-&amp;gt;Open Project...''. The project files are located in the build directory. For example, if you want to work on Konsole, you need to open {{path|$KDE_BUILD/KDE/kdebase/apps/konsole/konsole.kdevelop}}. You now need to adjust a few project-specific settings in ''Project-&amp;gt;Project Options''. You need to do this every time you start to work on a different project.&lt;br /&gt;
&lt;br /&gt;
{{note|&lt;br /&gt;
Sometimes, a KDevelop project file is not present for the folder you want to work on.&lt;br /&gt;
&lt;br /&gt;
This can have several reasons, it depends on how the CMake files are written. Usually, CMake files which have a &amp;lt;tt&amp;gt;project(projectname)&amp;lt;/tt&amp;gt; statement in them should work fine. Once you are familiar enough with CMake, you can try adding the statement.&lt;br /&gt;
&lt;br /&gt;
A workaround for this is to simply use the KDevelop project file of the parent folder, or even higher. In this case, you need to use the &amp;lt;tt&amp;gt;Make Active Directory&amp;lt;/tt&amp;gt; entry in the context menu of the &amp;lt;tt&amp;gt;File Selector&amp;lt;/tt&amp;gt; sidetab. With this, you can ignore the other unwanted folders when building and installing.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* ''C++ Support-&amp;gt;Code Completion''&lt;br /&gt;
:Here you need to add code completion databases for Qt and kdelibs, and more if you like, for example you might need a database for ''kdepimlibs'' when working on ''kdepim''.&lt;br /&gt;
&lt;br /&gt;
:For kdelibs, click the ''Add...'' button and choose ''KDevelop Custom Directory PCS Importer'', then add your KDE include directory ({{path|$HOME/kde/include}}) to the list and proceed. You can use the file selection dialog and the ''Add'' button to add it. &lt;br /&gt;
&lt;br /&gt;
:Now, add the database for Qt 4 by selecting ''KDevelop Qt4 PCS Importer'' this time. You need to select the Qt 4 include directory, which is {{path|$HOME/qt-copy/include}}.&lt;br /&gt;
&lt;br /&gt;
{{note|The Qt4 PCS Importer is only needed if you didn't install Qt4, i.e. you use it directly from the build directory. The drawback of using the Qt4 importer is that it doesn't show progress and the application seems to hang while it imports. The alternative is to use the Custom Directory PCS Importer for this too}}&lt;br /&gt;
&lt;br /&gt;
* ''C++ Support-&amp;gt;Qt Options''&lt;br /&gt;
:Check ''Enable Qt options'' and choose Qt4 as your version. Set the ''QMake Binary'' path to {{path|$HOME/qt-copy/bin/qmake}}. Then choose ''Qt 4 style'' as ''Qt include syntax''. Use {{path|$HOME/qt-copy/bin/designer}} as ''Designer Binary''. Make sure to use the ''Change Plugin Paths'' dialog to add the plugin directory from KDE so you see the KDE widgets when designer is started. To do this add {{path|$HOME/kde/lib/kde4/plugins}} to the lineedit and then click the ''Add'' button.&lt;br /&gt;
&lt;br /&gt;
* ''Run Options''&lt;br /&gt;
:Make sure you use the correct binary as ''Executable''. For example, if you want to run Konsole, this is {{path|$KDE_BUILD/KDE/kdebase/apps/konsole/src/konsole}}. You should add ''--nofork'' to the ''Debug Arguments'' or debugging some applications like ''KMail'' will not work at all.&lt;br /&gt;
&lt;br /&gt;
:Because the ''start3app'' functions changes some environment variables, you need to change them back here so the KDE 4 applications can be run without problems from within KDevelop.&lt;br /&gt;
:For some applications, like Konsole, this is not strictly necessary, but others like KMail will crash if you do not change this.&lt;br /&gt;
:Simply click the ''Add / Copy'' button to add new environment variables. You will need the following, which are the same as in your [[Getting_Started/Increased_Productivity_in_KDE4_with_Scripts/.bashrc|{{path|.bashrc}}]]:&lt;br /&gt;
&lt;br /&gt;
:{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| KDEHOME&lt;br /&gt;
| $HOME/.kde4&lt;br /&gt;
|-&lt;br /&gt;
| PATH&lt;br /&gt;
| $KDEDIR/bin:$QTDIR/bin:/usr/local/bin:$PATH&lt;br /&gt;
|-&lt;br /&gt;
| LD_LIBRARY_PATH&lt;br /&gt;
| $KDEDIR/lib:$QTDIR/lib:$LD_LIBRARY_PATH&lt;br /&gt;
|-&lt;br /&gt;
| KDETMP&lt;br /&gt;
| /tmp/$USER-kde4&lt;br /&gt;
|-&lt;br /&gt;
| KDEVARTMP&lt;br /&gt;
| /var/tmp/$USER-kde4&lt;br /&gt;
|-&lt;br /&gt;
| KDEDIR&lt;br /&gt;
| $HOME/kde&lt;br /&gt;
|-&lt;br /&gt;
| KDEDIRS&lt;br /&gt;
| $KDEDIR&lt;br /&gt;
|-&lt;br /&gt;
| LD_BIND_NOW&lt;br /&gt;
| 42&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''Build Options-&amp;gt;Build''&lt;br /&gt;
:Make sure the correct build directory is selected. Again, for Konsole, this would be {{path|$KDE_BUILD/KDE/kdebase/apps/konsole}}.&lt;br /&gt;
&lt;br /&gt;
* ''Build Options-&amp;gt;Make''&lt;br /&gt;
:You might want to check ''Abort on first error''. You also might want to add ''VERBOSE='' or ''VERBOSE=1'' to ''Additional make options'' to control the level of verbosity for the build process.&lt;br /&gt;
&lt;br /&gt;
:If you have more than one processor or if you have access to an icecream cluster, you might want to check the ''Run multiple jobs'' option and set the ''Number of simultaneous jobs'' to the number of available processors. This increases the compile speed. It is the same as the &amp;lt;tt&amp;gt;-j&amp;lt;/tt&amp;gt; option for ''make''.&lt;br /&gt;
&lt;br /&gt;
* ''Formatting''&lt;br /&gt;
:You should set all options here to match the coding style of the project you are working on.&lt;br /&gt;
&lt;br /&gt;
* ''CTags-&amp;gt;General''&lt;br /&gt;
:You need to correctly set the ''Path to ctags binary'', which is {{path|/usr/bin/ctags}} on Debian-based systems. &lt;br /&gt;
&lt;br /&gt;
:You probably want to enable the &amp;lt;tt&amp;gt;When more than one hit, go directly to the first&amp;lt;/tt&amp;gt; option.&lt;br /&gt;
&lt;br /&gt;
Now you have finished adjusting your project-specific settings. Now you should remove some plugins you do not need, in ''Settings-&amp;gt;Configure Plugins...''. I for example disable the following plugins: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Abbreviation Expansion, Code Snippets, Doxygen Support, Embedded Konsole, File Tree, '''Final Packaging Support''', &amp;quot;Open with&amp;quot; Menu Addon, QuickOpen, Regular Expression Tester, Scripting, '''Security Checker''', Shell Filtering and Insertion, Text Structure and Tools Menu Addition.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should at least disable the bold ones.&lt;br /&gt;
&lt;br /&gt;
Now, open any source file if none is open already. This will enable the ''Settings-&amp;gt;Configure Editor...'' entry, where you need to set the tab options to match the tab style used by the project you are working on. The important settings are:&lt;br /&gt;
* ''Appearance-&amp;gt;Borders-&amp;gt;Show line numbers'': Should be checked.&lt;br /&gt;
* ''Appearance-&amp;gt;Borders-&amp;gt;Show icon border'': Should be checked.&lt;br /&gt;
* ''Editing-&amp;gt;Tabulators'' &lt;br /&gt;
* ''Editing-&amp;gt;Static Word Wrap-&amp;gt;Show marker'': Should be checked&lt;br /&gt;
* ''Indentation-&amp;gt;Automatic Indentation-&amp;gt;Indentation mode'': Should be ''C Style''&lt;br /&gt;
* ''Indentation'' in general&lt;br /&gt;
&lt;br /&gt;
In the mainwindow, click the ''CTags'' tab on the bottom tabbar, then click the ''Regenerate'' button to create a CTags database for easier source code navigation.&lt;br /&gt;
&lt;br /&gt;
Now you have completed all essential configuration, congratulations!&lt;br /&gt;
&lt;br /&gt;
=== Using KDevelop ===&lt;br /&gt;
&lt;br /&gt;
Refer to the [http://docs.kde.org/development/en/kdevelop/kdevelop/ KDevelop manual] for general help using KDevelop. The following section will only deal with special cases for KDE 4.&lt;br /&gt;
&lt;br /&gt;
==== Debugging ====&lt;br /&gt;
&lt;br /&gt;
KDE apps have many symbols, which means that you need a lot of memory to get a decent loading times for debugging. To quote a GDB developer: &amp;quot;I would be reluctant to debug KDE on something with &amp;lt;1GB RAM.&amp;quot;&lt;br /&gt;
If the stepping function of the debugger is slow for you, try the following tips:&lt;br /&gt;
* Hide local variables. The &amp;lt;tt&amp;gt;Locals&amp;lt;/tt&amp;gt; part of the variable tab on the left causes a big slowdown when stepping if you have many local variables. Simple collapse the &amp;lt;tt&amp;gt;Locals&amp;lt;/tt&amp;gt; part of the tree, the local variables are then not updated every step. You can still examine variables by using the &amp;lt;tt&amp;gt;Evaluate expression&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
* Use the patch at http://bugs.kde.org/show_bug.cgi?id=143977. It prevents the update of the framestack widget at each step, speeding up stepping considerably. The patch introduces some minor glitches, which is why it is not yet commited.&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
KDevelop does not yet support modifing the CMake build system. This means you can not use KDevelop to add or remove files from the project or to change any other aspect of your project's build process.&lt;br /&gt;
&lt;br /&gt;
You need to modify the CMake files by hand and then rerun &amp;lt;tt&amp;gt;cmakekde&amp;lt;/tt&amp;gt; instead. Read the [[Development/Tutorials/CMake|CMake tutorial]] to learn how to do this.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tip|When you work on libraries, you first need to install them before you can test or debug your changes. &lt;br /&gt;
Since this is cumbersome and time consuming, you should create symlinks ''(ln -s)'' pointing from the build directory to the installation directory for all affected libraries. &lt;br /&gt;
&lt;br /&gt;
Often, even simple programs use libraries internally, for example the settings dialog of Konsole is really a library.}}&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/MovetoGit/Progress</id>
		<title>Projects/MovetoGit/Progress</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/MovetoGit/Progress"/>
				<updated>2011-08-20T19:55:38Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix colours.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== What to take from where for release? ===&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; width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#afafaf;&amp;quot;&lt;br /&gt;
! Module/Application&lt;br /&gt;
! branch name scheme / comment&lt;br /&gt;
! 4.7&lt;br /&gt;
! 4.8&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeaccessibility'''&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | rules done, migration pending&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeadmin'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeartwork'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdebase'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kde-runtime&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kde-workspace&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kde-baseapps&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kate&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | in 4.6 released from kdelibs/kdesdk&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | konsole&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdebindings'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kimono&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | qyoto&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kross-interpreters&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | perlkde&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | perlqt&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | pykde4&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | korundum&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | qtruby&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | smokegen&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | smokekde&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | smokeqt&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeedu'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | blinken&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | cantor&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kalgebra&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kalzium&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kanagram&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kbruch&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kgeography&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | khangman&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kig&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kiten&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | klettres&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kmplot&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kstars&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | ktouch&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kturtle&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kwordquiz&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libkdeedu&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | marble&lt;br /&gt;
| kde-1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | parley&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | rocs&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | step&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdegames'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdegraphics'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libksane&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libkexiv2&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libkdcraw&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libkipi&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | ksaneplugin&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kolourpaint&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | ksnapshot&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | gwenview&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kruler&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | mobipocket&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | svgpart&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kcolorchooser&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kgamma&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdegraphics-strigi-analyzer&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdegraphics-thumbnailers&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kamera&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | okular&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdelibs'''&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdemultimedia'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdenetwork'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdepim'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdepim&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdepim-runtime&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdepimlibs&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeplasma-addons'''&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdesdk'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdetoys'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeutils''' (TODO: split this section into its apps)&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdewebdev'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdesupport (somewhat)'''&lt;br /&gt;
|&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kde-wallpapers&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color: white;&amp;quot; | ?&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | oxygen-icons&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/MovetoGit/Progress</id>
		<title>Projects/MovetoGit/Progress</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/MovetoGit/Progress"/>
				<updated>2011-08-20T19:53:22Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== What to take from where for release? ===&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; width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#afafaf;&amp;quot;&lt;br /&gt;
! Module/Application&lt;br /&gt;
! branch name scheme / comment&lt;br /&gt;
! 4.7&lt;br /&gt;
! 4.8&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeaccessibility'''&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | rules done, migration pending&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeadmin'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeartwork'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdebase'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kde-runtime&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kde-workspace&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kde-baseapps&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kate&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | in 4.6 released from kdelibs/kdesdk&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | konsole&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdebindings'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kimono&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | qyoto&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kross-interpreters&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | perlkde&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | perlqt&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | pykde4&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | korundum&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | qtruby&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | smokegen&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | smokekde&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | smokeqt&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeedu'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | blinken&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | cantor&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kalgebra&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kalzium&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kanagram&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kbruch&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kgeography&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | khangman&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kig&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kiten&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | klettres&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kmplot&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kstars&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | ktouch&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kturtle&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kwordquiz&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libkdeedu&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | marble&lt;br /&gt;
| kde-1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | parley&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | rocs&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | step&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdegames'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdegraphics'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libksane&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libkexiv2&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libkdcraw&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | libkipi&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | ksaneplugin&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kolourpaint&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | ksnapshot&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | gwenview&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kruler&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | mobipocket&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | svgpart&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kcolorchooser&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kgamma&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdegraphics-strigi-analyzer&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdegraphics-thumbnailers&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kamera&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | okular&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdelibs'''&lt;br /&gt;
| KDE/1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdemultimedia'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdenetwork'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdepim'''&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdepim&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdepim-runtime&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kdepimlibs&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeplasma-addons'''&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdesdk'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdetoys'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdeutils'''&lt;br /&gt;
| 1.2&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | Git&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdewebdev'''&lt;br /&gt;
| not yet&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|- style=&amp;quot;background:#dfdfdf;&amp;quot;&lt;br /&gt;
| '''kdesupport (somewhat)'''&lt;br /&gt;
|&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | kde-wallpapers&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color: white;&amp;quot; | ?&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left:50px;&amp;quot; | oxygen-icons&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
| style=&amp;quot;background-color: lightpink;&amp;quot; | SVN&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Creating_Libraries</id>
		<title>Development/Tutorials/Creating Libraries</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Creating_Libraries"/>
				<updated>2011-06-30T11:57:01Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Creating Libraries}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
If a part of your code could be used by more than one software module, like other programs or plugins, you should put that part in a shared library. This tutorial tells how to add the library to the buildsystem and how to prepare the source code.&lt;br /&gt;
&lt;br /&gt;
==Separating the code==&lt;br /&gt;
&lt;br /&gt;
It is good practise to put all source files for a library in a separate directory.&lt;br /&gt;
&lt;br /&gt;
This tutorial assumes you want to create a shared library named '''myshare''', which contains the classes '''MyAClass''' and '''MyBClass'''. Both classes use internally the classes '''MyInternalCClass''' and '''MyInternalDClass''', but these are not found in their public interfaces.&lt;br /&gt;
&lt;br /&gt;
The classes are declared and defined in the files ''myaclass.h'', ''myaclass.cpp'', ''mybclass.h'', ''mybclass.cpp'', ''myinternalcclass.h'', ''myinternalcclass.cpp'', ''myinternaldclass.h'', and ''myinternaldclass.cpp''.&lt;br /&gt;
&lt;br /&gt;
==Adding the library to the buildsystem==&lt;br /&gt;
&lt;br /&gt;
You also need a file CMakeLists.txt in the same directory as the source files: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
include_directories(&lt;br /&gt;
# any directories needed by the sources of the library&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
set( myshared_LIB_SRCS&lt;br /&gt;
  myaclass.cpp&lt;br /&gt;
  mybclass.cpp&lt;br /&gt;
  myinternalcclass.cpp&lt;br /&gt;
  myinternaldclass.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_library( myshared  SHARED ${myshared_LIB_SRCS} )&lt;br /&gt;
&lt;br /&gt;
target_link_libraries( myshared&lt;br /&gt;
  ${KDE4_KDECORE_LIBS}&lt;br /&gt;
)&lt;br /&gt;
set_target_properties( myshared&lt;br /&gt;
  PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION ${GENERIC_LIB_SOVERSION}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
install( TARGETS myshared  ${INSTALL_TARGETS_DEFAULT_ARGS} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The instructions are similar to the ones for a program. But instead of calling &amp;lt;tt&amp;gt;kde4_add_executable()&amp;lt;/tt&amp;gt; you use &amp;lt;tt&amp;gt;kde4_add_library()&amp;lt;/tt&amp;gt; to register  the library &amp;lt;tt&amp;gt;myshared&amp;lt;/tt&amp;gt;. The parameter &amp;lt;tt&amp;gt;SHARED&amp;lt;/tt&amp;gt; is needed as this declares the library is a shared one, not a static.&lt;br /&gt;
&lt;br /&gt;
Like with a program, other libraries that are used have to be defined with &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The version number of the library is set by &amp;lt;tt&amp;gt;set_target_properties()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And &amp;lt;tt&amp;gt;install()&amp;lt;/tt&amp;gt; moves the library to a place where it can be loaded.&lt;br /&gt;
&lt;br /&gt;
==Declaring exported classes and methods==&lt;br /&gt;
&lt;br /&gt;
If a library gets compiled, all functions or class methods it offers get listed as so called symbols in a table. Each symbol points to the offset in the library where the corresponding code can be found.&lt;br /&gt;
&lt;br /&gt;
Adding also functions or class methods to the table which are not intended to be called from the outside is of no use. It just bloats the table and asks others to make calls to them against your will. For the library myshared you do not want to add the methods of the classes MyInternalCClass and MyInternalDClass.&lt;br /&gt;
&lt;br /&gt;
In the KDE buildsystem you need to put explicitly a tag to all the classes and functions which the library should provide externally. This tag has to have a different name for each library.&lt;br /&gt;
&lt;br /&gt;
For this add a file myshared_export.h to the directory of the library, containing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef MYSHARED_EXPORT_H&lt;br /&gt;
#define MYSHARED_EXPORT_H&lt;br /&gt;
&lt;br /&gt;
// needed for KDE_EXPORT and KDE_IMPORT macros&lt;br /&gt;
#include &amp;lt;kdemacros.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifndef MYSHARED_EXPORT&lt;br /&gt;
# if defined(MAKE_MYSHARED_LIB)&lt;br /&gt;
   // We are building this library&lt;br /&gt;
#  define MYSHARED_EXPORT KDE_EXPORT&lt;br /&gt;
# else&lt;br /&gt;
   // We are using this library&lt;br /&gt;
#  define MYSHARED_EXPORT KDE_IMPORT&lt;br /&gt;
# endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
# ifndef MYSHARED_EXPORT_DEPRECATED&lt;br /&gt;
#  define MYSHARED_EXPORT_DEPRECATED KDE_DEPRECATED MYSHARED_EXPORT&lt;br /&gt;
# endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This macro code defines the tag &amp;lt;tt&amp;gt;MYSHARED_EXPORT&amp;lt;/tt&amp;gt; for the library.&lt;br /&gt;
&lt;br /&gt;
Now you prepare all classes by adding a include for the header with the library's export tag and putting the export tag defined above in front of the class name, like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;myshared_export.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class MYSHARED_EXPORT MyAClass {&lt;br /&gt;
// class declaration as usual&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the same with the other class:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;myshared_export.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class MYSHARED_EXPORT MyBClass {&lt;br /&gt;
// class declaration as usual&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{warning|&lt;br /&gt;
Beware that header-only classes, even additionally based on templates, must not have an export tag. Their methods do not end as any symbol in the library. Instead all machine code is created on demand in the external calling software, if compiled.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enabling others to compile using your library==&lt;br /&gt;
&lt;br /&gt;
You need also tell the buildsystem to install the header files. Without this external code can not build, as it can not include the files and thus the class and methods declarations of your library. You do this by adding to the library's CMakeLists.txt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set( myshared_LIB_HDRS&lt;br /&gt;
  myshared_export.h&lt;br /&gt;
  myaclass.h&lt;br /&gt;
  mybclass.h&lt;br /&gt;
)&lt;br /&gt;
install( FILES ${myshared_LIB_HDRS}&lt;br /&gt;
  DESTINATION ${INCLUDE_INSTALL_DIR}/myshared&lt;br /&gt;
  COMPONENT Devel&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course also myshared_export.h is installed, as it gets included by the headers of both classes.&lt;br /&gt;
&lt;br /&gt;
External KDE code which should use the library's classes and functions now can include the headers by the lines:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;myshared/myaclass.h&amp;gt;&lt;br /&gt;
#include &amp;lt;myshared/mybclass.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting the version numbers right==&lt;br /&gt;
&lt;br /&gt;
By installing the header files you are releasing your library officially. External code will rely on the interfaces declared by the headers. So you need to care for binary and behaviour compatibility if developing your library further. Any changes in the next release should be reflected in the version number, so external code gets compiled, linked and run with the matching version of your library.&lt;br /&gt;
&lt;br /&gt;
As you already saw above the version of your library is defined by &amp;lt;tt&amp;gt;set_target_properties()&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set_target_properties( myshared&lt;br /&gt;
  PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION ${GENERIC_LIB_SOVERSION}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So there are two different kind of versions, the development version &amp;lt;tt&amp;gt;VERSION&amp;lt;/tt&amp;gt; and the ABI version &amp;lt;tt&amp;gt;SOVERSION&amp;lt;/tt&amp;gt;. Both will be explained now.&lt;br /&gt;
&lt;br /&gt;
=== Defining the development version ===&lt;br /&gt;
The value of &amp;lt;tt&amp;gt;VERSION&amp;lt;/tt&amp;gt; defines the development state of your library. It is good practice to use a pattern &amp;quot;major.minor.patch-level&amp;quot;.&lt;br /&gt;
For each release you need to update or reset the different parts:&lt;br /&gt;
* Only bug fixes added: increase the patch-level, e.g. 2.3.10 -&amp;gt; 2.3.11&lt;br /&gt;
* New functionality added, while keeping the old functionality: increase the minor number, reset the patch-level, e.g. 2.3.10 -&amp;gt; 2.4.0&lt;br /&gt;
* Binary or behaviour changes of old functionality, regardless of any new functionality: increase the major number, reset the minor number and the patch-level, e.g. 2.3.10 -&amp;gt; 3.0.0&lt;br /&gt;
This version ends in the name of the resulting library file, e.g. on Linux &amp;quot;libmyshared.so.2.3.10&amp;quot; or &amp;quot;libmyshared.2.3.10.so&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Defining the ABI version ===&lt;br /&gt;
The value of &amp;lt;tt&amp;gt;SOVERSION&amp;lt;/tt&amp;gt; defines the ABI variant of your library. It is a single always increasing integer, numbering the versions with non-backward-compatibel changes. So if you release a new version with some binary or behaviour changes you need to increase this version number by one, e.g. 2-&amp;gt;3, otherwise you keep it.&lt;br /&gt;
&lt;br /&gt;
{{tip|&lt;br /&gt;
If you follow the rules given above for the &amp;lt;tt&amp;gt;VERSION&amp;lt;/tt&amp;gt; version, the value of &amp;lt;tt&amp;gt;SOVERSION&amp;lt;/tt&amp;gt; will of course match the major number of it. So with a &amp;lt;tt&amp;gt;VERSION&amp;lt;/tt&amp;gt; of 2.3.10 the &amp;lt;tt&amp;gt;SOVERSION&amp;lt;/tt&amp;gt; value would be 2. But this is no necessity.}}&lt;br /&gt;
&lt;br /&gt;
This version ends in a reference with ABI versioning to the resulting library file, e.g. on Linux in the symbolic link &amp;quot;libmyshared.so.2&amp;quot;, which points to the real library file. These versioned references are used by the dynamic linker to load the version of the library with the matching ABI variant to a running executable. Executables which are linked to a shared library have a note which ABI variant of these libray is needed.&lt;br /&gt;
&lt;br /&gt;
{{warning|&lt;br /&gt;
This concept of ABI versioning breaks if the executable got linked to a newer version of the library (e.g. 2.4.0) which is backward-compatible to older versions (all 2.0-3.*) but additionally offers new functionality that also gets used by the executable.&lt;br /&gt;
&lt;br /&gt;
Because conforming to the concept the older versions have the same ABI version like the newer one (e.g. 2). So if only an older version of the library is installed (e.g. 2.1.8) the executable is still started as the tested prerequisites (ABI version) are matched, but it will crash due to the missing functionality if the library gets finally loaded.&lt;br /&gt;
&lt;br /&gt;
In a compilation-from-sourcecode-based system this just should not happen, unless you downgrade a library again. And in a package-based system dependency checks on de-/installations of packages which also care for the &amp;lt;tt&amp;gt;VERSION&amp;lt;/tt&amp;gt; version should prevent this. So you might also forget about this problem.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Using the generic versions===&lt;br /&gt;
If you are developing your library inside a normal KDE module, e.g. kdeutils, and all new versions of your library are only released together with the usual KDE releases, of course following the policies regarding ABI as demanded, you do not need to take care of the versioning yourself. Just use the generic variables &amp;lt;tt&amp;gt;${GENERIC_LIB_VERSION}&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;${GENERIC_LIB_SOVERSION}&amp;lt;/tt&amp;gt; as shown above. Using the generic version numbers also helps to identify a version of your library by the general KDE version.&lt;br /&gt;
&lt;br /&gt;
E.g. for KDE 4.1.0 these variables are defined in kdelibs/cmake/modules/KDE4Defaults.cmake with&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set(GENERIC_LIB_VERSION &amp;quot;4.1.0&amp;quot;)&lt;br /&gt;
set(GENERIC_LIB_SOVERSION &amp;quot;4&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Making localization work==&lt;br /&gt;
&lt;br /&gt;
If your shared library contains translations you have to help a little so a program which uses your library can make use of them.&lt;br /&gt;
&lt;br /&gt;
You mark the strings to be translated [[Development/Tutorials/Localization/i18n|as usual]]. And &lt;br /&gt;
[[Development/Tutorials/Localization/i18n Build Systems|like you do with programs]] you have to add a shell script named &amp;lt;tt&amp;gt;Messages.sh&amp;lt;/tt&amp;gt; in the toplevel directory of your shared library to collect all the strings, e.g.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!bin/sh&lt;br /&gt;
# fetch all strings in files that are not source code&lt;br /&gt;
$EXTRACTRC `find . -name \*.rc -o -name \*.ui -o -name \*.kcfg` &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
# fetch all strings in source code files&lt;br /&gt;
$XGETTEXT `find . -name \*.cc -o -name \*.cpp -o -name \*.h` -o $podir/libmyshare.pot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So all strings will end in a catalog named &amp;lt;tt&amp;gt;libmyshare&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
While for programs and most plugins the translations are loaded automatically, for shared libraries you have to do it manually. You do so by adding in the program after the creation of the &amp;lt;tt&amp;gt;KApplication&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;KCoreApplication&amp;lt;/tt&amp;gt; instance the line:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
KGlobal::locale()-&amp;gt;insertCatalog( &amp;quot;libmyshare&amp;quot; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The method &amp;lt;tt&amp;gt;insertCatalog()&amp;lt;/tt&amp;gt; will load the translated strings in the current language from the catalog named &amp;lt;tt&amp;gt;libmyshare&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Organizing your program code with static libraries==&lt;br /&gt;
Sharing code with others is one reason to separate code into libraries.&lt;br /&gt;
Another reason is the need to organize a large code base.&lt;br /&gt;
&lt;br /&gt;
A useful approach to give a structure to code is to separate the source files in different subdirectories, each subdirectory containing only code for a certain domain, e.g. a subdirectory &amp;quot;utils&amp;quot; for all utility classes or &amp;quot;gui&amp;quot; for all gui related code.&lt;br /&gt;
&lt;br /&gt;
Instead of one big central CMakeLists.txt file you also use an own CMakeLists.txt file per subdirectory, which is also placed in that subdirectory. In each of these CMakeLists.txt files you advise the build system to construct a separate package of the compiled sources in the given directory, a so called convenience library or, in technical terms, static library.&lt;br /&gt;
&lt;br /&gt;
E.g. for the subdirectory &amp;quot;myutils&amp;quot; &amp;quot;myutils/CMakeLists.txt&amp;quot; looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
include_directories(&lt;br /&gt;
# only as needed for the sources of this directory/library&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
set( myutils_LIB_SRCS&lt;br /&gt;
  myutilaclass.cpp&lt;br /&gt;
  myutilbclass.cpp&lt;br /&gt;
  myinternalutilcclass.cpp&lt;br /&gt;
  myinternalutildclass.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_library( myutils  STATIC ${myutils_LIB_SRCS} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The instructions are similar to the ones for a shared library. In the call &amp;lt;tt&amp;gt;kde4_add_library()&amp;lt;/tt&amp;gt; you just use the parameter &amp;lt;tt&amp;gt;STATIC&amp;lt;/tt&amp;gt; instead to declare the library is a static one.&lt;br /&gt;
&lt;br /&gt;
This library is only used as an intermediate product in the total build process. So you neither need to set a version number with &amp;lt;tt&amp;gt;set_target_properties()&amp;lt;/tt&amp;gt; or declare at this point other libraries to link against with &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt;, like you do with a shared library. And you do not install anything, neither the lib or any header files. You also do not mark exported classes or functions, all will be available to external code. You declare any dynamic libraries used by the library at another place, see below.&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;tt&amp;gt;include_directories()&amp;lt;/tt&amp;gt; you also have to list the include directories needed for the source files in the directory, and only these. So you get more control with regard to dependencies than with one big central CMakeLists.txt file. &lt;br /&gt;
&lt;br /&gt;
To have all the local CMakeLists.txt files get used by the build system you need to add each subdirectory to the CMakeLists.txt file in the upper directory, with the call &amp;lt;tt&amp;gt;add_subdirectory()&amp;lt;/tt&amp;gt;, e.g.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
add_subdirectory( myutils )&lt;br /&gt;
add_subdirectory( mygui )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This inclusion can be done recursively, so in a subdirectory you can add again the subsubdirectory.&lt;br /&gt;
&lt;br /&gt;
Finally you need to tell the buildsystem to also use the static libraries to construct the complete program. You do so by including their names in the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; call for the program. There you also add any not already listed shared library which is used by code in your static libraries, as told above. So to construct the program myprogram using the static libraries mygui and myutils you write the CMakeLists.txt like e.g.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
target_link_libraries( myprogram&lt;br /&gt;
  mygui&lt;br /&gt;
  myutils&lt;br /&gt;
# and all needed dynamic libraries, like the KDE ones and else,&lt;br /&gt;
# also the ones needed by your static libraries mygui and myutils&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure that you list those libraries, static or shared, which are also used by other libraries in the list below these, e.g. if mygui uses myutils, first list mygui, then myutils, as in the example above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{warning|&lt;br /&gt;
The buildsystem up to KDE 4.1 supports the use of static libraries only for programs, not for shared libraries. So use this structuring method only for programs.&lt;br /&gt;
&lt;br /&gt;
This restriction is due to the fact that the linker utilities on most platforms supported only import those parts of static libraries into the end product which are referenced by the other code in the product, not simply everything. Which is useful, if the product is a program. But it isn't useful for the product dynamic library. If a function &amp;quot;foo()&amp;quot; from the static library is not used by the other code in the shared library this function will not be found in resulting shared library product. Yet third party code linking to this shared library might expect the function if it is defined as exported. Which creates a problem.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
It is not uncommon for a static library to become a shared dynamic library later in development, if the code in the library proves to be complete and useful for others.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_Qt_Creator</id>
		<title>Development/Tutorials/Using Qt Creator</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_Qt_Creator"/>
				<updated>2011-06-30T11:53:56Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Run cmake */ Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using Qt Creator}}&lt;br /&gt;
&lt;br /&gt;
QtCreator is an IDE from Nokia for Qt. It contains QtDesigner for UI design. This article describes:&lt;br /&gt;
* how to create a new program&lt;br /&gt;
* how to load an existing program&lt;br /&gt;
&lt;br /&gt;
= Creating a new program =&lt;br /&gt;
&lt;br /&gt;
Qt Designer is a graphical program which allows you to easily build user interfaces, using a ''drag n drop'' interface. Here is a short example how it can go, for more information read the [http://qt.nokia.com/doc/designer-manual.html user documentation].&lt;br /&gt;
&lt;br /&gt;
;Step 0:&lt;br /&gt;
Call Qt Designer from within the [http://labs.trolltech.com/page/Projects/Tools/QtCreator QtCreator] [http://en.wikipedia.org/wiki/Integrated_development_environment IDE]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qtcreator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Step 1:&lt;br /&gt;
Add the widgets you want by drag-and-drop&lt;br /&gt;
&lt;br /&gt;
[[File:Designer-step1.png|200px]]&lt;br /&gt;
&lt;br /&gt;
;Step 2: &lt;br /&gt;
Select the mainwindow. This is the one un-intuitive step. To lay out the objects in the mainwindow, you do not select the objects in the mainwindow, but the mainwindow itself.&lt;br /&gt;
&lt;br /&gt;
[[File:Designer-step2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
;Step 3:&lt;br /&gt;
Select Form -&amp;gt; Lay Out in a &amp;lt;u&amp;gt;G&amp;lt;/u&amp;gt;rid&lt;br /&gt;
&lt;br /&gt;
[[File:Designer-step3.png|200px]]&lt;br /&gt;
&lt;br /&gt;
;Result:&lt;br /&gt;
You get a decent look, and if you resize the window, the widgets resize as well.&lt;br /&gt;
&lt;br /&gt;
[[File:Designer-result.png|200px]]&lt;br /&gt;
&lt;br /&gt;
== Using KDE libraries == &lt;br /&gt;
To use KDE classes like KMessageBox, you need to tell qtcreator to use the KDE libraries when building. Go to your home directory, cd into ''yourproject'' and modify ''yourproject.pro''. Add a line&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LIBS += -lkdeui&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then you can start using KDE classes in your code.&lt;br /&gt;
&lt;br /&gt;
== Adding a toolbar ==&lt;br /&gt;
To add a toolbar, right-click on the UI and choose &amp;quot;Add Toolbar&amp;quot;. Then you can set icons and text in your mainwindow's constructor with code like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
ui-&amp;gt;toolBar-&amp;gt;addAction(QIcon(&amp;quot;/usr/share/icons/oxygen/22x22/apps/ktip.png&amp;quot;),&amp;quot;hello world&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Development/Tutorials/Using_Qt_Designer|More Info...]]&lt;br /&gt;
&lt;br /&gt;
= Load an existing project =&lt;br /&gt;
This describes how to use QtCreator to integrate existing KDE 4 applications. It has been tested with QtCreator 1.2.80 and SUSE Linux 11.1 but should work same or similar with every combination. As an example KDE application we use [http://userbase.kde.org/ktimetracker ktimetracker] from the kdepim module, other applications should work analog.&lt;br /&gt;
&lt;br /&gt;
You can either work with code on your disk or have QtCreator do the subversion checkout.&lt;br /&gt;
&lt;br /&gt;
== use code from your disk ==&lt;br /&gt;
* Import the CMakeLists.txt file (File -&amp;gt; Open -&amp;gt; kdepim/CMakeLists.txt)&lt;br /&gt;
* As build directory choose kdepim.&lt;br /&gt;
* You will automatically come to a screen where you can run cmake&lt;br /&gt;
* Continue with the step &amp;quot;Run cmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== have QtCreator do the subversion checkout ==&lt;br /&gt;
* Choose File -&amp;gt; New File or Project -&amp;gt; Version Control -&amp;gt; Subversion Checkout.&lt;br /&gt;
* Enter a subversion URL like svn://anonsvn.kde.org/home/kde/trunk/KDE/kdepim&lt;br /&gt;
* Enter a checkout directory, so the local directory where the checkout will be loaded in&lt;br /&gt;
* Type finish, see how the checkout starts&lt;br /&gt;
* You will automatically come to a screen where you can run cmake&lt;br /&gt;
* Continue with the step &amp;quot;Run cmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== have QtCreator do the git checkout ==&lt;br /&gt;
* Choose File -&amp;gt; New File or Project -&amp;gt; Version Control -&amp;gt; Git Checkout.&lt;br /&gt;
* Enter a git URL like git@git.kde.org:/kdepim&lt;br /&gt;
* accept kdepim as checkout directory&lt;br /&gt;
* Type finish, see how the checkout starts&lt;br /&gt;
* You will automatically come to a screen where you can run cmake&lt;br /&gt;
* Continue with the step &amp;quot;Run cmake&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Run cmake ==&lt;br /&gt;
* Enter arguments for cmake like &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/root/kdepim -DCMAKE_INSTALL_PREFIX=/usr/local -DLIB_SUFFIX=64 -DCMAKE_BUILD_TYPE=debugfull&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;DLIB_SUFFIX=64&amp;lt;/tt&amp;gt; means that you want to install your libraries into directories named &amp;lt;tt&amp;gt;lib64&amp;lt;/tt&amp;gt;, not &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt;. ''/root/kdepim'' is where your source code is.&lt;br /&gt;
* click &amp;quot;Run cmake&amp;quot;&lt;br /&gt;
* Note a .cbp file gets created containing many information about the build.&lt;br /&gt;
* click &amp;quot;Finish&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Build it ==&lt;br /&gt;
* Configure qtcreator to build only ktimetracker:&lt;br /&gt;
Projects -&amp;gt; Active run configuration=ktimetracker -&amp;gt; build settings -&amp;gt; build steps -&amp;gt; make -&amp;gt; show details -&amp;gt; activate ktimetracker.&lt;br /&gt;
* Configure qtcreator to use 8 logical processors:&lt;br /&gt;
Projects -&amp;gt; Active run configuration=ktimetracker -&amp;gt; build settings -&amp;gt; build steps -&amp;gt; make -&amp;gt; show details -&amp;gt; addtional Arguments = -j8&lt;br /&gt;
* Choose Build -&amp;gt; Build All&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
* [[Development/Tutorials/Using Qt Designer]]&lt;br /&gt;
* [[Getting_Started/Set_up_KDE_4_for_development#QtCreator]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDE4]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_Qt_Designer</id>
		<title>Development/Tutorials/Using Qt Designer</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_Qt_Designer"/>
				<updated>2011-06-30T11:53:11Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using Qt Designer}}&lt;br /&gt;
&lt;br /&gt;
== Qt Designer User Interfaces in KDE ==&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we will explore how to programatically insert user interfaces &lt;br /&gt;
(UIs) created with Qt Designer, into your KDE project.  &lt;br /&gt;
&lt;br /&gt;
== Designing the UI ==&lt;br /&gt;
&lt;br /&gt;
Qt Designer is a graphical program which allows you to easily build user interfaces, using a ''drag n drop'' interface. Here is a short example how it can go, for more information read the [http://qt.nokia.com/doc/designer-manual.html user documentation].&lt;br /&gt;
&lt;br /&gt;
;Step 0:&lt;br /&gt;
Call Qt Designer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
designer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
;Note:&lt;br /&gt;
You can also use Qt Designer from within the [http://labs.trolltech.com/page/Projects/Tools/QtCreator QtCreator] [http://en.wikipedia.org/wiki/Integrated_development_environment IDE] [[Getting_Started/Set_up_KDE_4_for_development#QtCreator|(here is how)]].&lt;br /&gt;
;Step 1:&lt;br /&gt;
Add the widgets you want by drag-and-drop&lt;br /&gt;
&lt;br /&gt;
[[File:Designer-step1.png|200px]]&lt;br /&gt;
;Step 2: &lt;br /&gt;
Select the mainwindow. This is the one un-intuitive step. To lay out the objects in the mainwindow, you do not select the objects in the mainwindow, but the mainwindow itself.&lt;br /&gt;
&lt;br /&gt;
[[File:Designer-step2.png|200px]]&lt;br /&gt;
;Step 3:&lt;br /&gt;
Select Form -&amp;gt; Lay Out in a &amp;lt;u&amp;gt;G&amp;lt;/u&amp;gt;rid&lt;br /&gt;
&lt;br /&gt;
[[File:Designer-step3.png|200px]]&lt;br /&gt;
;Result:&lt;br /&gt;
You get a decent look, and if you resize the window, the widgets resize as well.&lt;br /&gt;
&lt;br /&gt;
[[File:Designer-result.png|200px]]&lt;br /&gt;
&lt;br /&gt;
=== Adding a toolbar ===&lt;br /&gt;
To add a toolbar, right-click on the UI and choose &amp;quot;Add Toolbar&amp;quot;. Then you can set icons and text in your mainwindow's constructor with code like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
ui-&amp;gt;toolBar-&amp;gt;addAction(QIcon(&amp;quot;/usr/share/icons/oxygen/22x22/apps/ktip.png&amp;quot;),&amp;quot;hello world&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Adding the UI File to Your KDE Project ==&lt;br /&gt;
&lt;br /&gt;
For our purposes, the most important part of using Designer is the &lt;br /&gt;
&amp;lt;tt&amp;gt;*.ui&amp;lt;/tt&amp;gt; file that it creates.  This is simply an XML file that &lt;br /&gt;
encodes the user interface in a machine-readable (and human-readable!) way.&lt;br /&gt;
&lt;br /&gt;
Let's imagine that you've created a UI named &amp;quot;MyDialog&amp;quot; with Designer, and &lt;br /&gt;
saved it as the file &amp;lt;tt&amp;gt;mydialog.ui&amp;lt;/tt&amp;gt;.  To add this UI to your KDE &lt;br /&gt;
project, simply add a command like the following to your CMakeLists.txt file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
kde4_add_ui_files(myapp_SRCS mydialog.ui)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;quot;&amp;lt;tt&amp;gt;myapp_SRCS&amp;lt;/tt&amp;gt;&amp;quot; with the name of the main block in &lt;br /&gt;
your CMakeLists.txt file, defining all of the source code files.  It is usually the &lt;br /&gt;
name of your application, with &amp;quot;&amp;lt;tt&amp;gt;_SRCS&amp;lt;/tt&amp;gt;&amp;quot; appended.&lt;br /&gt;
&lt;br /&gt;
When you do this, the build system will run the Qt program &amp;lt;tt&amp;gt;uic&amp;lt;/tt&amp;gt; &lt;br /&gt;
on &amp;lt;tt&amp;gt;mydialog.ui&amp;lt;/tt&amp;gt;, to auto-generate a C++ header file that &lt;br /&gt;
defines the UI.  The generated file will be named &amp;lt;tt&amp;gt;ui_mydialog.h&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Using the UI in Your Code ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;ui_mydialog.h&amp;lt;/tt&amp;gt; file defines a class named &lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;Ui_MyDialog&amp;lt;/tt&amp;gt;&amp;quot;, that contains all of the widgets you created in &lt;br /&gt;
Designer as public members of the class.  It also contains the public function&lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;setupUi(QWidget *parent)&amp;lt;/tt&amp;gt;&amp;quot;, which instantiates all of the widgets, &lt;br /&gt;
sets up their properties, and inserts them into layout managers, all according &lt;br /&gt;
to what you specified in Designer.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;setupUi()&amp;lt;/tt&amp;gt; takes a &amp;lt;tt&amp;gt;QWidget*&amp;lt;/tt&amp;gt; &lt;br /&gt;
argument.  This argument represents the parent container widget, into which &lt;br /&gt;
all of the widgets in your UI will be inserted.  In other words, &lt;br /&gt;
'''&amp;lt;tt&amp;gt;Ui_MyDialog&amp;lt;/tt&amp;gt; is not itself derived from QWidget''', and &lt;br /&gt;
'''it does not contain a toplevel widget itself'''.  You have to supply the toplevel widget &lt;br /&gt;
when you call &amp;lt;tt&amp;gt;setupUi()&amp;lt;/tt&amp;gt;.  This is an important point.&lt;br /&gt;
&lt;br /&gt;
One more important semantic detail:  the &amp;lt;tt&amp;gt;Ui_MyDialog&amp;lt;/tt&amp;gt; class &lt;br /&gt;
also creates a &amp;lt;tt&amp;gt;Ui&amp;lt;/tt&amp;gt; namespace, which simply creates an alias &lt;br /&gt;
for the class.  So you can use &amp;lt;tt&amp;gt;Ui::MyDialog&amp;lt;/tt&amp;gt; to refer to the &lt;br /&gt;
same class.&lt;br /&gt;
&lt;br /&gt;
Now, on to actually using the generated UI in your code. The Qt documentation&lt;br /&gt;
shows three ways of [http://qt.nokia.com/doc/latest/designer-using-a-ui-file.html how to use ui-files];&lt;br /&gt;
here only the ''direct approach'' is discussed. The goal is to create a KDialog&lt;br /&gt;
which embeds the UI from the ui-file. First, we have to subclass MyDialog from&lt;br /&gt;
KDialog and add a member variable of type Ui::MyDialog. The header file of&lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;mydialog.h&amp;lt;/tt&amp;gt;&amp;quot; looks like the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef MYDIALOG_H&lt;br /&gt;
#define MYDIALOG_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// include the automatically generated header file for the ui-file&lt;br /&gt;
#include &amp;quot;ui_mydialog.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class MyDialog : public KDialog&lt;br /&gt;
{&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
    public:&lt;br /&gt;
        MyDialog( QWidget *parent=0 );&lt;br /&gt;
        ~MyDialog();&lt;br /&gt;
&lt;br /&gt;
    private slots:&lt;br /&gt;
        void slotButtonClicked();&lt;br /&gt;
&lt;br /&gt;
    private:&lt;br /&gt;
        // accessor to the ui. we can access all gui elements&lt;br /&gt;
        // specified in Designer. If mydialog.ui contains a&lt;br /&gt;
        // button &amp;quot;myButton&amp;quot;, we will be able to access it&lt;br /&gt;
        // with ui.myButton in the cpp file.&lt;br /&gt;
        Ui::MyDialog ui;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we are going to look at the implementation of MyDialog, which is in the file&lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;mydialog.cpp&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// include the header file of the dialog&lt;br /&gt;
#include &amp;quot;mydialog.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MyDialog::MyDialog( QWidget *parent )&lt;br /&gt;
: KDialog( parent )&lt;br /&gt;
{&lt;br /&gt;
    QWidget *widget = new QWidget( this );&lt;br /&gt;
&lt;br /&gt;
    // create the user interface, the parent widget is &amp;quot;widget&amp;quot;&lt;br /&gt;
    ui.setupUi(widget); // this is the important part&lt;br /&gt;
&lt;br /&gt;
    // set the widget with all its gui elements as the dialog's&lt;br /&gt;
    // main widget&lt;br /&gt;
    setMainWidget( widget );&lt;br /&gt;
&lt;br /&gt;
    // other KDialog options&lt;br /&gt;
    setCaption( i18n(&amp;quot;This is my Dialog window!&amp;quot;) );&lt;br /&gt;
    setButtons( KDialog::Close );&lt;br /&gt;
&lt;br /&gt;
    // Example Signal/Slot connection using widgets in your UI.&lt;br /&gt;
    // Note that you have to prepend &amp;quot;ui.&amp;quot; when referring&lt;br /&gt;
    // to your UI elements.&lt;br /&gt;
    connect( ui.myButton, SIGNAL( clicked() ),&lt;br /&gt;
             this, SLOT( slotButtonClicked() ) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
MyDialog::~MyDialog()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MyDialog::slotButtonClicked() &lt;br /&gt;
{&lt;br /&gt;
    KMessageBox::information( this, &lt;br /&gt;
                              i18n(&amp;quot;You pressed the button!&amp;quot; ),&lt;br /&gt;
                              i18n( &amp;quot;Hooray!&amp;quot; ) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mydialog.moc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, basically, we create a new Ui::MyDialog and then call&lt;br /&gt;
&amp;lt;tt&amp;gt;ui.setupUi(widget)&amp;lt;/tt&amp;gt; in the constructor of &amp;lt;tt&amp;gt;MyDialog&amp;lt;/tt&amp;gt;. This&lt;br /&gt;
places the UI elements into the given widget. Then we set the parent-widget&lt;br /&gt;
as the KDialog's main widget. We can then interact with all of the UI elements&lt;br /&gt;
by prepending &amp;quot;&amp;lt;tt&amp;gt;ui.&amp;lt;/tt&amp;gt;&amp;quot; to their names, just like it is often done&lt;br /&gt;
with the prefix &amp;quot;&amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Final Thoughts ==&lt;br /&gt;
&lt;br /&gt;
The cascade of files and classes in this tutorial may seem daunting at &lt;br /&gt;
first, but the naming scheme layed out here has one nice intuitive &lt;br /&gt;
feature: the source code files that you will be editing directly (either as&lt;br /&gt;
text or with Designer) are all named with the same scheme:&lt;br /&gt;
* '''mydialog.ui''': the user interface, created with Designer&lt;br /&gt;
* '''ui_mydialog.h''': auto-generated by uic, Qt's user interface compiler&lt;br /&gt;
* '''mydialog.h/cpp''': the dialog implementation&lt;br /&gt;
The steps in short are&lt;br /&gt;
# create &amp;lt;tt&amp;gt;mydialog.ui&amp;lt;/tt&amp;gt;&lt;br /&gt;
# create &amp;lt;tt&amp;gt;mydialog.h/cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
# add variable Ui::MyDialog ui; in &amp;lt;tt&amp;gt;mydialog.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
# call &amp;lt;tt&amp;gt;ui.setupUi(widget);&amp;lt;/tt&amp;gt;&lt;br /&gt;
# access the ui elements with &amp;lt;tt&amp;gt;ui.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Qt Documentation ==&lt;br /&gt;
&lt;br /&gt;
The Qt documentation contains a good article about&lt;br /&gt;
[http://qt.nokia.com/doc/latest/designer-using-a-ui-file.html Using a Designer .ui File in Your Application].&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:KDE4]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/CMake</id>
		<title>Development/Tutorials/CMake</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/CMake"/>
				<updated>2011-06-30T11:49:42Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Using CMake for a KDE Project */ Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/CMake}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[http://www.cmake.org CMake] reads script files and produces input files for the native buildsystem of the platform where it runs on. It can create GNU Makefiles, KDevelop project files, XCode project files, and Visual Studio project files.&lt;br /&gt;
&lt;br /&gt;
[http://www.cmake.org CMake] is free software and released under a BSD license.  It is developed by [http://www.kitware.com Kitware Inc.]&lt;br /&gt;
&lt;br /&gt;
You can find more CMake related information on the [[Development/CMake | main CMake page]] here on TechBase.&lt;br /&gt;
&lt;br /&gt;
== Why use CMake ? ==&lt;br /&gt;
CMake is the official tool of KDE 4 release, decided in March 2006, primarily due to technical merits as compared to the older KDE tools automake and unsermake:&lt;br /&gt;
* CMake is developed independently of KDE, it can be used by other projects as well &lt;br /&gt;
* Compilation time is much faster, mainly due to not using libtool anymore&lt;br /&gt;
* The build files are easier to write&lt;br /&gt;
&lt;br /&gt;
== How to compile KDE using CMake==&lt;br /&gt;
&lt;br /&gt;
=== Get and install CMake ===&lt;br /&gt;
==== Linux, BSD, and other Unix Systems ====&lt;br /&gt;
Retrieve the latest stable version of CMake from [http://www.cmake.org/HTML/Download.html here].&lt;br /&gt;
&lt;br /&gt;
Once downloaded, unpack and compile it:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir cmake-build&lt;br /&gt;
$ cd cmake-build&lt;br /&gt;
$ ../bootstrap&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, this will install CMake in /usr/local, so make sure to have /usr/local/bin in your execute path.   To change the installation prefix (e.g. to /usr in debian), add the '--prefix=PATH' option to the bootstrap command.&lt;br /&gt;
&lt;br /&gt;
Please follow the instructions located [http://cmake.org/HTML/Download.html#cvs here] if you would like to use the current development version.&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
Retrieve the latest stable version of CMake from [http://www.cmake.org/HTML/Download.html here].&lt;br /&gt;
&lt;br /&gt;
Once downloaded, run the cmake installer. &lt;br /&gt;
&lt;br /&gt;
By default, this will install CMake in C:\Program Files\CMake 2.8, so make sure to have &amp;lt;installpath&amp;gt;\bin in your execute path.   &lt;br /&gt;
&lt;br /&gt;
Please follow the instructions at [http://cmake.org/HTML/Download.html#cvs here] if you would like to use the current development version.&lt;br /&gt;
&lt;br /&gt;
=== Run CMake ===&lt;br /&gt;
&lt;br /&gt;
==== Linux, BSD, and other Unix Systems ====&lt;br /&gt;
You have to run CMake so that it generates the build files for your system.  Both in-source and out-of-source builds are supported by CMake, but currently in-source builds are prevented by the KDE implementation.&lt;br /&gt;
&lt;br /&gt;
So, let's say you have kdelibs/ in ~/src/kdelibs/, then do the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls&lt;br /&gt;
kdelibs/&lt;br /&gt;
$ mkdir kdelibs-build&lt;br /&gt;
$ cd kdelibs-build&lt;br /&gt;
$ cmake ../kdelibs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will generate the Makefiles for building kdelibs/ in kdelibs-build/.&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
You have to run CMake so that it generates the build files for your system.  Both in-source and out-of-source builds are supported by CMake, but currently in-source builds are prevented by the KDE implementation.&lt;br /&gt;
&lt;br /&gt;
So, let's say you have kdelibs\ in c:\daten\kde4, then do the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;dos&amp;quot;&amp;gt;&lt;br /&gt;
c:\daten\kde4&amp;gt; cd kdelibs\win&lt;br /&gt;
c:\daten\kde4&amp;gt; cmake&lt;br /&gt;
c:\daten\kde4&amp;gt; make &lt;br /&gt;
c:\daten\kde4&amp;gt; make install&lt;br /&gt;
c:\daten\kde4&amp;gt; cd ..&lt;br /&gt;
c:\daten\kde4&amp;gt; mkdir kdelibs-build&lt;br /&gt;
c:\daten\kde4&amp;gt; cd kdelibs-build&lt;br /&gt;
c:\daten\kde4\kdelibs-build&amp;gt; cmake ..\kdelibs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will generate the Makefiles for building kdelibs\ in kdelibs-build\. See [[Projects/KDE_on_Windows|KDE on Windows]] for more informations about compiling KDE on Windows.&lt;br /&gt;
&lt;br /&gt;
==== KDevelop 3 Project Files ====&lt;br /&gt;
If you prefer project files for KDevelop 3 (which will basically be Makefiles accompanied by some extra files for KDevelop), run it like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cmake ../kdelibs -GKDevelop3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use 'cmake -h' to find out which generators CMake supports and the other options.&lt;br /&gt;
&lt;br /&gt;
==== CMake and Qt4 ====&lt;br /&gt;
To locate Qt 4, CMake searches for qmake in your execute path. CMake does ''not'' use the QTDIR environment variable.  So make sure that the first qmake found in the execution path is the one you like to use.&lt;br /&gt;
&lt;br /&gt;
==== More Details ====&lt;br /&gt;
When CMake has finished, it will have created a file called &amp;quot;CMakeCache.txt&amp;quot;.  This file contains all the settings CMake has detected on your system.  If you want to run CMake with another generator or you want CMake to detect everything again, delete this file.&lt;br /&gt;
&lt;br /&gt;
If CMake didn't find something, but you know it is somewere on your box, you can tell CMake manually where to find it.  CMake uses variables to store this information.  These variables are cached in the already mentioned file CMakeCache.txt.  You have three options to adjust these variables manually:&lt;br /&gt;
* tell CMake the correct value via the command line: cmake ../kdelibs -DNAME_OF_THE_VARIABLE=value&lt;br /&gt;
* use ccmake, which provides a curses based GUI to adjust the CMake variables (run: ccmake ../kdelibs)&lt;br /&gt;
* edit the file CMakeCache.txt directly (not recommended)&lt;br /&gt;
&lt;br /&gt;
You should run &amp;quot;ccmake ../kdelibs&amp;quot; at least once so that you get an impression which variables CMake uses.  Press &amp;quot;T&amp;quot; to see also the &amp;quot;advanced&amp;quot; variables.  So, if CMake didn't find something, start ccmake and adjust it manually.&lt;br /&gt;
&lt;br /&gt;
==== Command Line Variables ====&lt;br /&gt;
&lt;br /&gt;
Some cmake command line variables you may want to set:&lt;br /&gt;
* '''CMAKE_INSTALL_PREFIX''': cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4 is the equivalent to ./configure --prefix=/opt/kde4&lt;br /&gt;
* '''[[Development/CMake/Addons_for_KDE#Buildtypes|CMAKE_BUILD_TYPE]]''': decide which type of build you want. You can choose between &amp;quot;DebugFull&amp;quot;, &amp;quot;Debug&amp;quot;, &amp;quot;Profile&amp;quot;, &amp;quot;RelWithDebInfo&amp;quot; and &amp;quot;Release&amp;quot;. The default is &amp;quot;RelWithDebInfo&amp;quot;. Please refer to page [[Development/CMake/Addons_for_KDE#Buildtypes|CMake Build Types]] for a more detailed explanation.&lt;br /&gt;
* '''KDE4_BUILD_TESTS=ON''': creates Makefiles with build test programs and also provides 'test' targets&lt;br /&gt;
* '''KDE4_TEST_OUTPUT=xml''': Unit tests using the QTestLib framework will create xml formatted logfiles.&lt;br /&gt;
* '''KDE4_DISABLE_MULTIMEDIA=ON''': Build KDE without any multimedia (audio and video) support.&lt;br /&gt;
* '''BUILD_foo=OFF''': disables the build for the project in subdirectory 'foo'.&lt;br /&gt;
* '''WITH_foo''': there are several options, e.g. WITH_CUPS or WITH_Jasper. If you disable them, cmake will not even try to find this package. If it is enabled, cmake will try to find it. If it fails with this, you can still adjust it manually as described above.&lt;br /&gt;
&lt;br /&gt;
=== Environment Variables ===&lt;br /&gt;
If you have headers and libraries installed in non-standard locations that cmake cannot find (e.g., fink on Mac OSX installs to /sw), then populate the environment variable CMAKE_PREFIX_PATH with a list of paths to these locations.  When searching for headers, libraries and binaries, CMake will search all the paths in CMAKE_PREFIX_PATH as well as their standard subdirectories (&amp;quot;lib&amp;quot; for libraries, &amp;quot;include&amp;quot; for headers and &amp;quot;bin&amp;quot; for binaries). This can be also very useful e.g. if you install kdesupport to ~/install/kdesupport.&lt;br /&gt;
* '''CMAKE_PREFIX_PATH''', eg. export CMAKE_PREFIX_PATH=/sw&lt;br /&gt;
&lt;br /&gt;
If you need to further tweak the search behavior, you can additionally set the&lt;br /&gt;
following environment variables in order to add library, include or binary&lt;br /&gt;
directories to your search path:&lt;br /&gt;
* '''CMAKE_INCLUDE_PATH''', eg. export CMAKE_PREFIX_PATH=/sw/include&lt;br /&gt;
* '''CMAKE_LIBRARY_PATH''', eg. export CMAKE_LIBRARY_PATH=/sw/lib&lt;br /&gt;
* '''CMAKE_PROGRAM_PATH''', eg. export CMAKE_PROGRAM_PATH=/sw/bin&lt;br /&gt;
&lt;br /&gt;
For more information on variables, see [http://www.cmake.org/Wiki/CMake_Useful_Variables this cmake.org wiki page]&lt;br /&gt;
&lt;br /&gt;
=== Going Further ===&lt;br /&gt;
If cmake finishes with &amp;quot;Generating done&amp;quot; then there was no errors, but if it finishes with &amp;quot;Configuring done&amp;quot; then there was errors that you have to fix.  Once cmake finishes successfully, run your buildtool (i.e. make, KDevelop, XCode or MSVC) and build and wait until it has finished.  Then &amp;quot;make install&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
If you got a failure that says something like&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CMake Error: This project requires some variables to be set,&lt;br /&gt;
and cmake can not find them.&lt;br /&gt;
Please set the following variables:&lt;br /&gt;
X11_XTest_LIB (ADVANCED)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
then you may have a missing library (or other dependency). To find&lt;br /&gt;
out which library, search in the cmake/modules directory for&lt;br /&gt;
the variable that cmake can't find. In the example above, it is&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_library(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So the missing library is Xtst. You then need to find it (perhaps installing a libXtst-devel library) and re-run cmake.&lt;br /&gt;
&lt;br /&gt;
== Using CMake for a Simple Application ==&lt;br /&gt;
&lt;br /&gt;
Here's the most simple CMakeLists.txt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
add_executable(hello main.cpp)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will create an executable named &amp;quot;hello&amp;quot; (or &amp;quot;hello.exe&amp;quot; under Windows) from the source file main.cpp. You can mix C and C++ files as you want.  You can have multiple executables and libraries in one CMakeLists.txt.  The same source file can be used in multiple targets, it will be compiled for each target independently from the other targets.  Probably the most important part of the cmake language are the variables:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set( MY_SOURCES main.cpp widget.cpp)&lt;br /&gt;
message(STATUS &amp;quot;my sources: ${MY_SOURCES}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So, use the SET() command to set the value of a variable. If you list more than one string, the variable will be a list.   A list is a list of strings separated by semicolons. If you set it to only one item, it will have just that value. To get the value of a variable, use ${VAR}.&lt;br /&gt;
You can iterate over a list using FOREACH():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
foreach(next_ITEM ${MY_SOURCES})&lt;br /&gt;
   message(STATUS &amp;quot;next item: ${next_ITEM}&amp;quot;)&lt;br /&gt;
endforeach(next_ITEM ${MY_SOURCES})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The commands in CMake are case-insensitive.  Names of variables and names of parameter are case-sensitive.&lt;br /&gt;
&lt;br /&gt;
You can also test for various things:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
if (UNIX)&lt;br /&gt;
   message(STATUS &amp;quot;This is UNIX (including OS X and CygWin)&amp;quot;)&lt;br /&gt;
endif (UNIX)&lt;br /&gt;
&lt;br /&gt;
if (MSVC)&lt;br /&gt;
   set(MY_SRCS ${MY_SRCS} winextra.cpp)&lt;br /&gt;
endif (MSVC)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this second example  you can see also how to append items to a list.&lt;br /&gt;
&lt;br /&gt;
In the cmake Wiki there is also a [http://www.cmake.org/Wiki/HowToBuildKDE4Software  tutorial] on using cmake to build KDE 4 software. It is recommended reading.&lt;br /&gt;
&lt;br /&gt;
== Using CMake for a KDE Project ==&lt;br /&gt;
&lt;br /&gt;
Here's a basic CMakeList file that builds a small KDE 4 project:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
project( kde4project )&lt;br /&gt;
find_package( KDE4 REQUIRED )&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
&lt;br /&gt;
set( KDE4ProjectSources kde4mainapp.cpp someclass.cpp someotherclass.cpp )&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable( kde4project ${KDE4ProjectSources} )&lt;br /&gt;
&lt;br /&gt;
target_link_libraries( kde4project ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )&lt;br /&gt;
&lt;br /&gt;
install( TARGETS kde4project  ${INSTALL_TARGETS_DEFAULT_ARGS} )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''target_link_libraries'' contains the development libraries that are linked to your program. E.g. if you want to link to libtidy-devel, your library file name may be called /usr/local/lib/libtidy.a. You would then add -ltidy to a gcc call. Here, you add ''tidy'' to your target_link_libraries. If possible, use pre-defined variables or macros like ${KDE4_KDEUI_LIBS}.&lt;br /&gt;
&lt;br /&gt;
''install (TARGETS'' is where the target will finally be installed. If you do not have this line, make install will not be available.&lt;br /&gt;
&lt;br /&gt;
Variables, macros and other useful information specific to KDE can be found at the [[Development/CMake/Addons for KDE|CMake addons for KDE]] page.&lt;br /&gt;
&lt;br /&gt;
== Extending CMake ==&lt;br /&gt;
CMake can be extended using cmake scripts. CMake comes with a number of scripts; under UNIX they are by default installed to /usr/local/share/CMake/Modules/. The KDE libraries install also a set of cmake modules into share/apps/cmake/modules/. The files located there will be preferred over the ones in the system global cmake module path. &lt;br /&gt;
For detecting software packages there are FindFOO.cmake files, see [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware here] for more information.&lt;br /&gt;
You can also write macros in CMake. They are powerful enough to do most things you will need to build software, but they are not intended to be used as a general purpose programming language.&lt;br /&gt;
&lt;br /&gt;
== Converting autotools-based KDE software to CMake ==&lt;br /&gt;
In kdesdk/cmake/ you can find a script am2cmake . This is a ruby script, so you need to have ruby installed. Run am2cmake in the toplevel directory of your sources:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cd src/mykooltool/&lt;br /&gt;
$ am2cmake --kde4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Don't forget the switch &amp;lt;tt&amp;gt;--kde4&amp;lt;/tt&amp;gt;, otherwise it won't generate files suitable for KDE 4 software. The converted files 'may' work as they are, but complicated projects will require some additional editing.&lt;br /&gt;
&lt;br /&gt;
You may have to:&lt;br /&gt;
* add more include direcories, using INCLUDE_DIRECTORIES()&lt;br /&gt;
* add more link libraries, using TARGET_LINK_LIBRARIES()&lt;br /&gt;
* add some compile switches, using ADD_DEFINITIONS()&lt;br /&gt;
* add some &amp;quot;configure&amp;quot; checks, see [http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks How To Do Platform Checks] and [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware How To Find Installed Software]&lt;br /&gt;
* take special care of former libtool convenience libraries. They are not supported by cmake, instead there will be a file ConvenienceLibs.cmake created.  In this file you will find for every convenience lib a variable, which contains all source files of this convenience lib.  For the targets which linked to this convenience lib, just add the variable to the sources.&lt;br /&gt;
* a file AdditionalInfo.txt will be created.  There you will see all *.in and *.in.in files of your project. The stuff done in these files will have to be converted manually to cmake.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;br /&gt;
[[Category:Tutorial]]&lt;br /&gt;
[[Category:FAQs]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/CMake</id>
		<title>Development/Tutorials/CMake</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/CMake"/>
				<updated>2011-06-30T11:49:12Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Using CMake for a Simple Application */ Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/CMake}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[http://www.cmake.org CMake] reads script files and produces input files for the native buildsystem of the platform where it runs on. It can create GNU Makefiles, KDevelop project files, XCode project files, and Visual Studio project files.&lt;br /&gt;
&lt;br /&gt;
[http://www.cmake.org CMake] is free software and released under a BSD license.  It is developed by [http://www.kitware.com Kitware Inc.]&lt;br /&gt;
&lt;br /&gt;
You can find more CMake related information on the [[Development/CMake | main CMake page]] here on TechBase.&lt;br /&gt;
&lt;br /&gt;
== Why use CMake ? ==&lt;br /&gt;
CMake is the official tool of KDE 4 release, decided in March 2006, primarily due to technical merits as compared to the older KDE tools automake and unsermake:&lt;br /&gt;
* CMake is developed independently of KDE, it can be used by other projects as well &lt;br /&gt;
* Compilation time is much faster, mainly due to not using libtool anymore&lt;br /&gt;
* The build files are easier to write&lt;br /&gt;
&lt;br /&gt;
== How to compile KDE using CMake==&lt;br /&gt;
&lt;br /&gt;
=== Get and install CMake ===&lt;br /&gt;
==== Linux, BSD, and other Unix Systems ====&lt;br /&gt;
Retrieve the latest stable version of CMake from [http://www.cmake.org/HTML/Download.html here].&lt;br /&gt;
&lt;br /&gt;
Once downloaded, unpack and compile it:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir cmake-build&lt;br /&gt;
$ cd cmake-build&lt;br /&gt;
$ ../bootstrap&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, this will install CMake in /usr/local, so make sure to have /usr/local/bin in your execute path.   To change the installation prefix (e.g. to /usr in debian), add the '--prefix=PATH' option to the bootstrap command.&lt;br /&gt;
&lt;br /&gt;
Please follow the instructions located [http://cmake.org/HTML/Download.html#cvs here] if you would like to use the current development version.&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
Retrieve the latest stable version of CMake from [http://www.cmake.org/HTML/Download.html here].&lt;br /&gt;
&lt;br /&gt;
Once downloaded, run the cmake installer. &lt;br /&gt;
&lt;br /&gt;
By default, this will install CMake in C:\Program Files\CMake 2.8, so make sure to have &amp;lt;installpath&amp;gt;\bin in your execute path.   &lt;br /&gt;
&lt;br /&gt;
Please follow the instructions at [http://cmake.org/HTML/Download.html#cvs here] if you would like to use the current development version.&lt;br /&gt;
&lt;br /&gt;
=== Run CMake ===&lt;br /&gt;
&lt;br /&gt;
==== Linux, BSD, and other Unix Systems ====&lt;br /&gt;
You have to run CMake so that it generates the build files for your system.  Both in-source and out-of-source builds are supported by CMake, but currently in-source builds are prevented by the KDE implementation.&lt;br /&gt;
&lt;br /&gt;
So, let's say you have kdelibs/ in ~/src/kdelibs/, then do the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls&lt;br /&gt;
kdelibs/&lt;br /&gt;
$ mkdir kdelibs-build&lt;br /&gt;
$ cd kdelibs-build&lt;br /&gt;
$ cmake ../kdelibs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will generate the Makefiles for building kdelibs/ in kdelibs-build/.&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
You have to run CMake so that it generates the build files for your system.  Both in-source and out-of-source builds are supported by CMake, but currently in-source builds are prevented by the KDE implementation.&lt;br /&gt;
&lt;br /&gt;
So, let's say you have kdelibs\ in c:\daten\kde4, then do the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;dos&amp;quot;&amp;gt;&lt;br /&gt;
c:\daten\kde4&amp;gt; cd kdelibs\win&lt;br /&gt;
c:\daten\kde4&amp;gt; cmake&lt;br /&gt;
c:\daten\kde4&amp;gt; make &lt;br /&gt;
c:\daten\kde4&amp;gt; make install&lt;br /&gt;
c:\daten\kde4&amp;gt; cd ..&lt;br /&gt;
c:\daten\kde4&amp;gt; mkdir kdelibs-build&lt;br /&gt;
c:\daten\kde4&amp;gt; cd kdelibs-build&lt;br /&gt;
c:\daten\kde4\kdelibs-build&amp;gt; cmake ..\kdelibs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will generate the Makefiles for building kdelibs\ in kdelibs-build\. See [[Projects/KDE_on_Windows|KDE on Windows]] for more informations about compiling KDE on Windows.&lt;br /&gt;
&lt;br /&gt;
==== KDevelop 3 Project Files ====&lt;br /&gt;
If you prefer project files for KDevelop 3 (which will basically be Makefiles accompanied by some extra files for KDevelop), run it like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cmake ../kdelibs -GKDevelop3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use 'cmake -h' to find out which generators CMake supports and the other options.&lt;br /&gt;
&lt;br /&gt;
==== CMake and Qt4 ====&lt;br /&gt;
To locate Qt 4, CMake searches for qmake in your execute path. CMake does ''not'' use the QTDIR environment variable.  So make sure that the first qmake found in the execution path is the one you like to use.&lt;br /&gt;
&lt;br /&gt;
==== More Details ====&lt;br /&gt;
When CMake has finished, it will have created a file called &amp;quot;CMakeCache.txt&amp;quot;.  This file contains all the settings CMake has detected on your system.  If you want to run CMake with another generator or you want CMake to detect everything again, delete this file.&lt;br /&gt;
&lt;br /&gt;
If CMake didn't find something, but you know it is somewere on your box, you can tell CMake manually where to find it.  CMake uses variables to store this information.  These variables are cached in the already mentioned file CMakeCache.txt.  You have three options to adjust these variables manually:&lt;br /&gt;
* tell CMake the correct value via the command line: cmake ../kdelibs -DNAME_OF_THE_VARIABLE=value&lt;br /&gt;
* use ccmake, which provides a curses based GUI to adjust the CMake variables (run: ccmake ../kdelibs)&lt;br /&gt;
* edit the file CMakeCache.txt directly (not recommended)&lt;br /&gt;
&lt;br /&gt;
You should run &amp;quot;ccmake ../kdelibs&amp;quot; at least once so that you get an impression which variables CMake uses.  Press &amp;quot;T&amp;quot; to see also the &amp;quot;advanced&amp;quot; variables.  So, if CMake didn't find something, start ccmake and adjust it manually.&lt;br /&gt;
&lt;br /&gt;
==== Command Line Variables ====&lt;br /&gt;
&lt;br /&gt;
Some cmake command line variables you may want to set:&lt;br /&gt;
* '''CMAKE_INSTALL_PREFIX''': cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4 is the equivalent to ./configure --prefix=/opt/kde4&lt;br /&gt;
* '''[[Development/CMake/Addons_for_KDE#Buildtypes|CMAKE_BUILD_TYPE]]''': decide which type of build you want. You can choose between &amp;quot;DebugFull&amp;quot;, &amp;quot;Debug&amp;quot;, &amp;quot;Profile&amp;quot;, &amp;quot;RelWithDebInfo&amp;quot; and &amp;quot;Release&amp;quot;. The default is &amp;quot;RelWithDebInfo&amp;quot;. Please refer to page [[Development/CMake/Addons_for_KDE#Buildtypes|CMake Build Types]] for a more detailed explanation.&lt;br /&gt;
* '''KDE4_BUILD_TESTS=ON''': creates Makefiles with build test programs and also provides 'test' targets&lt;br /&gt;
* '''KDE4_TEST_OUTPUT=xml''': Unit tests using the QTestLib framework will create xml formatted logfiles.&lt;br /&gt;
* '''KDE4_DISABLE_MULTIMEDIA=ON''': Build KDE without any multimedia (audio and video) support.&lt;br /&gt;
* '''BUILD_foo=OFF''': disables the build for the project in subdirectory 'foo'.&lt;br /&gt;
* '''WITH_foo''': there are several options, e.g. WITH_CUPS or WITH_Jasper. If you disable them, cmake will not even try to find this package. If it is enabled, cmake will try to find it. If it fails with this, you can still adjust it manually as described above.&lt;br /&gt;
&lt;br /&gt;
=== Environment Variables ===&lt;br /&gt;
If you have headers and libraries installed in non-standard locations that cmake cannot find (e.g., fink on Mac OSX installs to /sw), then populate the environment variable CMAKE_PREFIX_PATH with a list of paths to these locations.  When searching for headers, libraries and binaries, CMake will search all the paths in CMAKE_PREFIX_PATH as well as their standard subdirectories (&amp;quot;lib&amp;quot; for libraries, &amp;quot;include&amp;quot; for headers and &amp;quot;bin&amp;quot; for binaries). This can be also very useful e.g. if you install kdesupport to ~/install/kdesupport.&lt;br /&gt;
* '''CMAKE_PREFIX_PATH''', eg. export CMAKE_PREFIX_PATH=/sw&lt;br /&gt;
&lt;br /&gt;
If you need to further tweak the search behavior, you can additionally set the&lt;br /&gt;
following environment variables in order to add library, include or binary&lt;br /&gt;
directories to your search path:&lt;br /&gt;
* '''CMAKE_INCLUDE_PATH''', eg. export CMAKE_PREFIX_PATH=/sw/include&lt;br /&gt;
* '''CMAKE_LIBRARY_PATH''', eg. export CMAKE_LIBRARY_PATH=/sw/lib&lt;br /&gt;
* '''CMAKE_PROGRAM_PATH''', eg. export CMAKE_PROGRAM_PATH=/sw/bin&lt;br /&gt;
&lt;br /&gt;
For more information on variables, see [http://www.cmake.org/Wiki/CMake_Useful_Variables this cmake.org wiki page]&lt;br /&gt;
&lt;br /&gt;
=== Going Further ===&lt;br /&gt;
If cmake finishes with &amp;quot;Generating done&amp;quot; then there was no errors, but if it finishes with &amp;quot;Configuring done&amp;quot; then there was errors that you have to fix.  Once cmake finishes successfully, run your buildtool (i.e. make, KDevelop, XCode or MSVC) and build and wait until it has finished.  Then &amp;quot;make install&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
If you got a failure that says something like&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CMake Error: This project requires some variables to be set,&lt;br /&gt;
and cmake can not find them.&lt;br /&gt;
Please set the following variables:&lt;br /&gt;
X11_XTest_LIB (ADVANCED)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
then you may have a missing library (or other dependency). To find&lt;br /&gt;
out which library, search in the cmake/modules directory for&lt;br /&gt;
the variable that cmake can't find. In the example above, it is&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_library(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So the missing library is Xtst. You then need to find it (perhaps installing a libXtst-devel library) and re-run cmake.&lt;br /&gt;
&lt;br /&gt;
== Using CMake for a Simple Application ==&lt;br /&gt;
&lt;br /&gt;
Here's the most simple CMakeLists.txt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
add_executable(hello main.cpp)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will create an executable named &amp;quot;hello&amp;quot; (or &amp;quot;hello.exe&amp;quot; under Windows) from the source file main.cpp. You can mix C and C++ files as you want.  You can have multiple executables and libraries in one CMakeLists.txt.  The same source file can be used in multiple targets, it will be compiled for each target independently from the other targets.  Probably the most important part of the cmake language are the variables:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
set( MY_SOURCES main.cpp widget.cpp)&lt;br /&gt;
message(STATUS &amp;quot;my sources: ${MY_SOURCES}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So, use the SET() command to set the value of a variable. If you list more than one string, the variable will be a list.   A list is a list of strings separated by semicolons. If you set it to only one item, it will have just that value. To get the value of a variable, use ${VAR}.&lt;br /&gt;
You can iterate over a list using FOREACH():&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
foreach(next_ITEM ${MY_SOURCES})&lt;br /&gt;
   message(STATUS &amp;quot;next item: ${next_ITEM}&amp;quot;)&lt;br /&gt;
endforeach(next_ITEM ${MY_SOURCES})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The commands in CMake are case-insensitive.  Names of variables and names of parameter are case-sensitive.&lt;br /&gt;
&lt;br /&gt;
You can also test for various things:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
if (UNIX)&lt;br /&gt;
   message(STATUS &amp;quot;This is UNIX (including OS X and CygWin)&amp;quot;)&lt;br /&gt;
endif (UNIX)&lt;br /&gt;
&lt;br /&gt;
if (MSVC)&lt;br /&gt;
   set(MY_SRCS ${MY_SRCS} winextra.cpp)&lt;br /&gt;
endif (MSVC)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this second example  you can see also how to append items to a list.&lt;br /&gt;
&lt;br /&gt;
In the cmake Wiki there is also a [http://www.cmake.org/Wiki/HowToBuildKDE4Software  tutorial] on using cmake to build KDE 4 software. It is recommended reading.&lt;br /&gt;
&lt;br /&gt;
== Using CMake for a KDE Project ==&lt;br /&gt;
&lt;br /&gt;
Here's a basic CMakeList file that builds a small KDE 4 project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
project( kde4project )&lt;br /&gt;
find_package( KDE4 REQUIRED )&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
&lt;br /&gt;
set( KDE4ProjectSources kde4mainapp.cpp someclass.cpp someotherclass.cpp )&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable( kde4project ${KDE4ProjectSources} )&lt;br /&gt;
&lt;br /&gt;
target_link_libraries( kde4project ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )&lt;br /&gt;
&lt;br /&gt;
install( TARGETS kde4project  ${INSTALL_TARGETS_DEFAULT_ARGS} )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''target_link_libraries'' contains the development libraries that are linked to your program. E.g. if you want to link to libtidy-devel, your library file name may be called /usr/local/lib/libtidy.a. You would then add -ltidy to a gcc call. Here, you add ''tidy'' to your target_link_libraries. If possible, use pre-defined variables or macros like ${KDE4_KDEUI_LIBS}.&lt;br /&gt;
&lt;br /&gt;
''install (TARGETS'' is where the target will finally be installed. If you do not have this line, make install will not be available.&lt;br /&gt;
&lt;br /&gt;
Variables, macros and other useful information specific to KDE can be found at the [[Development/CMake/Addons for KDE|CMake addons for KDE]] page.&lt;br /&gt;
&lt;br /&gt;
== Extending CMake ==&lt;br /&gt;
CMake can be extended using cmake scripts. CMake comes with a number of scripts; under UNIX they are by default installed to /usr/local/share/CMake/Modules/. The KDE libraries install also a set of cmake modules into share/apps/cmake/modules/. The files located there will be preferred over the ones in the system global cmake module path. &lt;br /&gt;
For detecting software packages there are FindFOO.cmake files, see [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware here] for more information.&lt;br /&gt;
You can also write macros in CMake. They are powerful enough to do most things you will need to build software, but they are not intended to be used as a general purpose programming language.&lt;br /&gt;
&lt;br /&gt;
== Converting autotools-based KDE software to CMake ==&lt;br /&gt;
In kdesdk/cmake/ you can find a script am2cmake . This is a ruby script, so you need to have ruby installed. Run am2cmake in the toplevel directory of your sources:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cd src/mykooltool/&lt;br /&gt;
$ am2cmake --kde4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Don't forget the switch &amp;lt;tt&amp;gt;--kde4&amp;lt;/tt&amp;gt;, otherwise it won't generate files suitable for KDE 4 software. The converted files 'may' work as they are, but complicated projects will require some additional editing.&lt;br /&gt;
&lt;br /&gt;
You may have to:&lt;br /&gt;
* add more include direcories, using INCLUDE_DIRECTORIES()&lt;br /&gt;
* add more link libraries, using TARGET_LINK_LIBRARIES()&lt;br /&gt;
* add some compile switches, using ADD_DEFINITIONS()&lt;br /&gt;
* add some &amp;quot;configure&amp;quot; checks, see [http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks How To Do Platform Checks] and [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware How To Find Installed Software]&lt;br /&gt;
* take special care of former libtool convenience libraries. They are not supported by cmake, instead there will be a file ConvenienceLibs.cmake created.  In this file you will find for every convenience lib a variable, which contains all source files of this convenience lib.  For the targets which linked to this convenience lib, just add the variable to the sources.&lt;br /&gt;
* a file AdditionalInfo.txt will be created.  There you will see all *.in and *.in.in files of your project. The stuff done in these files will have to be converted manually to cmake.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;br /&gt;
[[Category:Tutorial]]&lt;br /&gt;
[[Category:FAQs]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/CMake</id>
		<title>Development/Tutorials/CMake</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/CMake"/>
				<updated>2011-06-30T11:48:19Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Going Further */ Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/CMake}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[http://www.cmake.org CMake] reads script files and produces input files for the native buildsystem of the platform where it runs on. It can create GNU Makefiles, KDevelop project files, XCode project files, and Visual Studio project files.&lt;br /&gt;
&lt;br /&gt;
[http://www.cmake.org CMake] is free software and released under a BSD license.  It is developed by [http://www.kitware.com Kitware Inc.]&lt;br /&gt;
&lt;br /&gt;
You can find more CMake related information on the [[Development/CMake | main CMake page]] here on TechBase.&lt;br /&gt;
&lt;br /&gt;
== Why use CMake ? ==&lt;br /&gt;
CMake is the official tool of KDE 4 release, decided in March 2006, primarily due to technical merits as compared to the older KDE tools automake and unsermake:&lt;br /&gt;
* CMake is developed independently of KDE, it can be used by other projects as well &lt;br /&gt;
* Compilation time is much faster, mainly due to not using libtool anymore&lt;br /&gt;
* The build files are easier to write&lt;br /&gt;
&lt;br /&gt;
== How to compile KDE using CMake==&lt;br /&gt;
&lt;br /&gt;
=== Get and install CMake ===&lt;br /&gt;
==== Linux, BSD, and other Unix Systems ====&lt;br /&gt;
Retrieve the latest stable version of CMake from [http://www.cmake.org/HTML/Download.html here].&lt;br /&gt;
&lt;br /&gt;
Once downloaded, unpack and compile it:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir cmake-build&lt;br /&gt;
$ cd cmake-build&lt;br /&gt;
$ ../bootstrap&lt;br /&gt;
$ make&lt;br /&gt;
$ make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, this will install CMake in /usr/local, so make sure to have /usr/local/bin in your execute path.   To change the installation prefix (e.g. to /usr in debian), add the '--prefix=PATH' option to the bootstrap command.&lt;br /&gt;
&lt;br /&gt;
Please follow the instructions located [http://cmake.org/HTML/Download.html#cvs here] if you would like to use the current development version.&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
Retrieve the latest stable version of CMake from [http://www.cmake.org/HTML/Download.html here].&lt;br /&gt;
&lt;br /&gt;
Once downloaded, run the cmake installer. &lt;br /&gt;
&lt;br /&gt;
By default, this will install CMake in C:\Program Files\CMake 2.8, so make sure to have &amp;lt;installpath&amp;gt;\bin in your execute path.   &lt;br /&gt;
&lt;br /&gt;
Please follow the instructions at [http://cmake.org/HTML/Download.html#cvs here] if you would like to use the current development version.&lt;br /&gt;
&lt;br /&gt;
=== Run CMake ===&lt;br /&gt;
&lt;br /&gt;
==== Linux, BSD, and other Unix Systems ====&lt;br /&gt;
You have to run CMake so that it generates the build files for your system.  Both in-source and out-of-source builds are supported by CMake, but currently in-source builds are prevented by the KDE implementation.&lt;br /&gt;
&lt;br /&gt;
So, let's say you have kdelibs/ in ~/src/kdelibs/, then do the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls&lt;br /&gt;
kdelibs/&lt;br /&gt;
$ mkdir kdelibs-build&lt;br /&gt;
$ cd kdelibs-build&lt;br /&gt;
$ cmake ../kdelibs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This will generate the Makefiles for building kdelibs/ in kdelibs-build/.&lt;br /&gt;
&lt;br /&gt;
==== Windows ====&lt;br /&gt;
You have to run CMake so that it generates the build files for your system.  Both in-source and out-of-source builds are supported by CMake, but currently in-source builds are prevented by the KDE implementation.&lt;br /&gt;
&lt;br /&gt;
So, let's say you have kdelibs\ in c:\daten\kde4, then do the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;dos&amp;quot;&amp;gt;&lt;br /&gt;
c:\daten\kde4&amp;gt; cd kdelibs\win&lt;br /&gt;
c:\daten\kde4&amp;gt; cmake&lt;br /&gt;
c:\daten\kde4&amp;gt; make &lt;br /&gt;
c:\daten\kde4&amp;gt; make install&lt;br /&gt;
c:\daten\kde4&amp;gt; cd ..&lt;br /&gt;
c:\daten\kde4&amp;gt; mkdir kdelibs-build&lt;br /&gt;
c:\daten\kde4&amp;gt; cd kdelibs-build&lt;br /&gt;
c:\daten\kde4\kdelibs-build&amp;gt; cmake ..\kdelibs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will generate the Makefiles for building kdelibs\ in kdelibs-build\. See [[Projects/KDE_on_Windows|KDE on Windows]] for more informations about compiling KDE on Windows.&lt;br /&gt;
&lt;br /&gt;
==== KDevelop 3 Project Files ====&lt;br /&gt;
If you prefer project files for KDevelop 3 (which will basically be Makefiles accompanied by some extra files for KDevelop), run it like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cmake ../kdelibs -GKDevelop3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use 'cmake -h' to find out which generators CMake supports and the other options.&lt;br /&gt;
&lt;br /&gt;
==== CMake and Qt4 ====&lt;br /&gt;
To locate Qt 4, CMake searches for qmake in your execute path. CMake does ''not'' use the QTDIR environment variable.  So make sure that the first qmake found in the execution path is the one you like to use.&lt;br /&gt;
&lt;br /&gt;
==== More Details ====&lt;br /&gt;
When CMake has finished, it will have created a file called &amp;quot;CMakeCache.txt&amp;quot;.  This file contains all the settings CMake has detected on your system.  If you want to run CMake with another generator or you want CMake to detect everything again, delete this file.&lt;br /&gt;
&lt;br /&gt;
If CMake didn't find something, but you know it is somewere on your box, you can tell CMake manually where to find it.  CMake uses variables to store this information.  These variables are cached in the already mentioned file CMakeCache.txt.  You have three options to adjust these variables manually:&lt;br /&gt;
* tell CMake the correct value via the command line: cmake ../kdelibs -DNAME_OF_THE_VARIABLE=value&lt;br /&gt;
* use ccmake, which provides a curses based GUI to adjust the CMake variables (run: ccmake ../kdelibs)&lt;br /&gt;
* edit the file CMakeCache.txt directly (not recommended)&lt;br /&gt;
&lt;br /&gt;
You should run &amp;quot;ccmake ../kdelibs&amp;quot; at least once so that you get an impression which variables CMake uses.  Press &amp;quot;T&amp;quot; to see also the &amp;quot;advanced&amp;quot; variables.  So, if CMake didn't find something, start ccmake and adjust it manually.&lt;br /&gt;
&lt;br /&gt;
==== Command Line Variables ====&lt;br /&gt;
&lt;br /&gt;
Some cmake command line variables you may want to set:&lt;br /&gt;
* '''CMAKE_INSTALL_PREFIX''': cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4 is the equivalent to ./configure --prefix=/opt/kde4&lt;br /&gt;
* '''[[Development/CMake/Addons_for_KDE#Buildtypes|CMAKE_BUILD_TYPE]]''': decide which type of build you want. You can choose between &amp;quot;DebugFull&amp;quot;, &amp;quot;Debug&amp;quot;, &amp;quot;Profile&amp;quot;, &amp;quot;RelWithDebInfo&amp;quot; and &amp;quot;Release&amp;quot;. The default is &amp;quot;RelWithDebInfo&amp;quot;. Please refer to page [[Development/CMake/Addons_for_KDE#Buildtypes|CMake Build Types]] for a more detailed explanation.&lt;br /&gt;
* '''KDE4_BUILD_TESTS=ON''': creates Makefiles with build test programs and also provides 'test' targets&lt;br /&gt;
* '''KDE4_TEST_OUTPUT=xml''': Unit tests using the QTestLib framework will create xml formatted logfiles.&lt;br /&gt;
* '''KDE4_DISABLE_MULTIMEDIA=ON''': Build KDE without any multimedia (audio and video) support.&lt;br /&gt;
* '''BUILD_foo=OFF''': disables the build for the project in subdirectory 'foo'.&lt;br /&gt;
* '''WITH_foo''': there are several options, e.g. WITH_CUPS or WITH_Jasper. If you disable them, cmake will not even try to find this package. If it is enabled, cmake will try to find it. If it fails with this, you can still adjust it manually as described above.&lt;br /&gt;
&lt;br /&gt;
=== Environment Variables ===&lt;br /&gt;
If you have headers and libraries installed in non-standard locations that cmake cannot find (e.g., fink on Mac OSX installs to /sw), then populate the environment variable CMAKE_PREFIX_PATH with a list of paths to these locations.  When searching for headers, libraries and binaries, CMake will search all the paths in CMAKE_PREFIX_PATH as well as their standard subdirectories (&amp;quot;lib&amp;quot; for libraries, &amp;quot;include&amp;quot; for headers and &amp;quot;bin&amp;quot; for binaries). This can be also very useful e.g. if you install kdesupport to ~/install/kdesupport.&lt;br /&gt;
* '''CMAKE_PREFIX_PATH''', eg. export CMAKE_PREFIX_PATH=/sw&lt;br /&gt;
&lt;br /&gt;
If you need to further tweak the search behavior, you can additionally set the&lt;br /&gt;
following environment variables in order to add library, include or binary&lt;br /&gt;
directories to your search path:&lt;br /&gt;
* '''CMAKE_INCLUDE_PATH''', eg. export CMAKE_PREFIX_PATH=/sw/include&lt;br /&gt;
* '''CMAKE_LIBRARY_PATH''', eg. export CMAKE_LIBRARY_PATH=/sw/lib&lt;br /&gt;
* '''CMAKE_PROGRAM_PATH''', eg. export CMAKE_PROGRAM_PATH=/sw/bin&lt;br /&gt;
&lt;br /&gt;
For more information on variables, see [http://www.cmake.org/Wiki/CMake_Useful_Variables this cmake.org wiki page]&lt;br /&gt;
&lt;br /&gt;
=== Going Further ===&lt;br /&gt;
If cmake finishes with &amp;quot;Generating done&amp;quot; then there was no errors, but if it finishes with &amp;quot;Configuring done&amp;quot; then there was errors that you have to fix.  Once cmake finishes successfully, run your buildtool (i.e. make, KDevelop, XCode or MSVC) and build and wait until it has finished.  Then &amp;quot;make install&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
If you got a failure that says something like&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CMake Error: This project requires some variables to be set,&lt;br /&gt;
and cmake can not find them.&lt;br /&gt;
Please set the following variables:&lt;br /&gt;
X11_XTest_LIB (ADVANCED)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
then you may have a missing library (or other dependency). To find&lt;br /&gt;
out which library, search in the cmake/modules directory for&lt;br /&gt;
the variable that cmake can't find. In the example above, it is&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
find_library(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So the missing library is Xtst. You then need to find it (perhaps installing a libXtst-devel library) and re-run cmake.&lt;br /&gt;
&lt;br /&gt;
== Using CMake for a Simple Application ==&lt;br /&gt;
&lt;br /&gt;
Here's the most simple CMakeLists.txt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add_executable(hello main.cpp)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will create an executable named &amp;quot;hello&amp;quot; (or &amp;quot;hello.exe&amp;quot; under Windows) from the source file main.cpp. You can mix C and C++ files as you want.  You can have multiple executables and libraries in one CMakeLists.txt.  The same source file can be used in multiple targets, it will be compiled for each target independently from the other targets.  Probably the most important part of the cmake language are the variables:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set( MY_SOURCES main.cpp widget.cpp)&lt;br /&gt;
message(STATUS &amp;quot;my sources: ${MY_SOURCES}&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
So, use the SET() command to set the value of a variable. If you list more than one string, the variable will be a list.   A list is a list of strings separated by semicolons. If you set it to only one item, it will have just that value. To get the value of a variable, use ${VAR}.&lt;br /&gt;
You can iterate over a list using FOREACH():&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
foreach(next_ITEM ${MY_SOURCES})&lt;br /&gt;
   message(STATUS &amp;quot;next item: ${next_ITEM}&amp;quot;)&lt;br /&gt;
endforeach(next_ITEM ${MY_SOURCES})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The commands in CMake are case-insensitive.  Names of variables and names of parameter are case-sensitive.&lt;br /&gt;
&lt;br /&gt;
You can also test for various things:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (UNIX)&lt;br /&gt;
   message(STATUS &amp;quot;This is UNIX (including OS X and CygWin)&amp;quot;)&lt;br /&gt;
endif (UNIX)&lt;br /&gt;
&lt;br /&gt;
if (MSVC)&lt;br /&gt;
   set(MY_SRCS ${MY_SRCS} winextra.cpp)&lt;br /&gt;
endif (MSVC)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In this second example  you can see also how to append items to a list.&lt;br /&gt;
&lt;br /&gt;
In the cmake Wiki there is also a [http://www.cmake.org/Wiki/HowToBuildKDE4Software  tutorial] on using cmake to build KDE 4 software. It is recommended reading.&lt;br /&gt;
&lt;br /&gt;
== Using CMake for a KDE Project ==&lt;br /&gt;
&lt;br /&gt;
Here's a basic CMakeList file that builds a small KDE 4 project:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
project( kde4project )&lt;br /&gt;
find_package( KDE4 REQUIRED )&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
&lt;br /&gt;
set( KDE4ProjectSources kde4mainapp.cpp someclass.cpp someotherclass.cpp )&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable( kde4project ${KDE4ProjectSources} )&lt;br /&gt;
&lt;br /&gt;
target_link_libraries( kde4project ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )&lt;br /&gt;
&lt;br /&gt;
install( TARGETS kde4project  ${INSTALL_TARGETS_DEFAULT_ARGS} )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''target_link_libraries'' contains the development libraries that are linked to your program. E.g. if you want to link to libtidy-devel, your library file name may be called /usr/local/lib/libtidy.a. You would then add -ltidy to a gcc call. Here, you add ''tidy'' to your target_link_libraries. If possible, use pre-defined variables or macros like ${KDE4_KDEUI_LIBS}.&lt;br /&gt;
&lt;br /&gt;
''install (TARGETS'' is where the target will finally be installed. If you do not have this line, make install will not be available.&lt;br /&gt;
&lt;br /&gt;
Variables, macros and other useful information specific to KDE can be found at the [[Development/CMake/Addons for KDE|CMake addons for KDE]] page.&lt;br /&gt;
&lt;br /&gt;
== Extending CMake ==&lt;br /&gt;
CMake can be extended using cmake scripts. CMake comes with a number of scripts; under UNIX they are by default installed to /usr/local/share/CMake/Modules/. The KDE libraries install also a set of cmake modules into share/apps/cmake/modules/. The files located there will be preferred over the ones in the system global cmake module path. &lt;br /&gt;
For detecting software packages there are FindFOO.cmake files, see [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware here] for more information.&lt;br /&gt;
You can also write macros in CMake. They are powerful enough to do most things you will need to build software, but they are not intended to be used as a general purpose programming language.&lt;br /&gt;
&lt;br /&gt;
== Converting autotools-based KDE software to CMake ==&lt;br /&gt;
In kdesdk/cmake/ you can find a script am2cmake . This is a ruby script, so you need to have ruby installed. Run am2cmake in the toplevel directory of your sources:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cd src/mykooltool/&lt;br /&gt;
$ am2cmake --kde4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Don't forget the switch &amp;lt;tt&amp;gt;--kde4&amp;lt;/tt&amp;gt;, otherwise it won't generate files suitable for KDE 4 software. The converted files 'may' work as they are, but complicated projects will require some additional editing.&lt;br /&gt;
&lt;br /&gt;
You may have to:&lt;br /&gt;
* add more include direcories, using INCLUDE_DIRECTORIES()&lt;br /&gt;
* add more link libraries, using TARGET_LINK_LIBRARIES()&lt;br /&gt;
* add some compile switches, using ADD_DEFINITIONS()&lt;br /&gt;
* add some &amp;quot;configure&amp;quot; checks, see [http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks How To Do Platform Checks] and [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware How To Find Installed Software]&lt;br /&gt;
* take special care of former libtool convenience libraries. They are not supported by cmake, instead there will be a file ConvenienceLibs.cmake created.  In this file you will find for every convenience lib a variable, which contains all source files of this convenience lib.  For the targets which linked to this convenience lib, just add the variable to the sources.&lt;br /&gt;
* a file AdditionalInfo.txt will be created.  There you will see all *.in and *.in.in files of your project. The stuff done in these files will have to be converted manually to cmake.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;br /&gt;
[[Category:Tutorial]]&lt;br /&gt;
[[Category:FAQs]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCmdLineArgs</id>
		<title>Development/Tutorials/KCmdLineArgs</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCmdLineArgs"/>
				<updated>2011-06-30T11:47:05Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Make, Install And Run */ Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/KCmdLineArgs}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Command line arguments (Under construction [[User:milliams]])|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Saving and loading|Tutorial 4 - Loading and saving]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/###|Tutorial 6 - ###]] (TODO [[User:milliams]])| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KCmdLineArgs}} {{class|KCmdLineOptions}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a text editor which can open and save files. We will now make the editor act more like a desktop application by enabling it to open files from command line arguments or even using ''Open with'' from within Dolphin.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial5.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
#include &amp;lt;KUrl&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial5&amp;quot;, &amp;quot;tutorial5&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 5&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
&lt;br /&gt;
  KCmdLineOptions options; //new&lt;br /&gt;
  options.add(&amp;quot;+[file]&amp;quot;, ki18n(&amp;quot;Document to open&amp;quot;)); //new&lt;br /&gt;
  KCmdLineArgs::addCmdLineOptions(options); //new&lt;br /&gt;
&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
&lt;br /&gt;
  KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); //new&lt;br /&gt;
  if(args-&amp;gt;count()) //new&lt;br /&gt;
  {&lt;br /&gt;
    window-&amp;gt;openFile(args-&amp;gt;url(0).url()); //new&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
    void openFile(const QString &amp;amp;inputFileName); //new&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName;&lt;br /&gt;
 &lt;br /&gt;
  private slots:&lt;br /&gt;
    void newFile();&lt;br /&gt;
    void openFile();&lt;br /&gt;
    void saveFile();&lt;br /&gt;
    void saveFileAs();&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt;&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt;&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt;&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt;&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString())&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::openFile() //changed&lt;br /&gt;
{&lt;br /&gt;
  openFile(KFileDialog::getOpenFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile(const QString &amp;amp;inputFileName) //new&lt;br /&gt;
{&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(inputFileName, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = inputFileName;&lt;br /&gt;
 &lt;br /&gt;
    KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial5ui.rc===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial5&amp;quot;&lt;br /&gt;
     version=&amp;quot;1&amp;quot;&lt;br /&gt;
     xmlns=&amp;quot;http://www.kde.org/standards/kxmlgui/1.0&amp;quot;&lt;br /&gt;
     xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
     xsi:schemaLocation=&amp;quot;http://www.kde.org/standards/kxmlgui/1.0&lt;br /&gt;
                         http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This is identical to the &amp;lt;tt&amp;gt;tutorial''x''ui.rc&amp;lt;/tt&amp;gt; from the last two tutorials except &amp;lt;tt&amp;gt;tutorial''x''&amp;lt;/tt&amp;gt; is now &amp;lt;tt&amp;gt;tutorial5&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&lt;br /&gt;
Here we have done nothing but add a new &amp;lt;tt&amp;gt;openFile&amp;lt;/tt&amp;gt; function which takes a &amp;lt;tt&amp;gt;QString&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void openFile(const QString &amp;amp;inputFileName);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&lt;br /&gt;
There's no new code here, only rearranging. Everything from &amp;lt;tt&amp;gt;void openFile()&amp;lt;/tt&amp;gt; has been moved into &amp;lt;tt&amp;gt;void openFile(const QString &amp;amp;inputFileName)&amp;lt;/tt&amp;gt; except the call to &amp;lt;tt&amp;gt;KFileDialog::getOpenFileName()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This way, we can call &amp;lt;tt&amp;gt;openFile()&amp;lt;/tt&amp;gt; if we want to display a dialog, or we can call &amp;lt;tt&amp;gt;openFile(QString)&amp;lt;/tt&amp;gt; if we know the name of the file already.&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&lt;br /&gt;
This is where all the {{class|KCmdLineArgs}} magic happens.&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&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(tutorial5)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
 &lt;br /&gt;
set(tutorial5_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial5 ${tutorial5_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial5 ${KDE4_KDEUI_LIBS}&lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial5 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install( FILES tutorial5ui.rc &lt;br /&gt;
         DESTINATION  ${DATA_INSTALL_DIR}/tutorial5 )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3 and 4. For more information, see tutorial 3.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
make install&lt;br /&gt;
$HOME/bin/tutorial5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to the ### (TODO [[User:milliams]]) tutorial.&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2011-06-30T11:46:19Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Make, Install And Run */ Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/KCmdLineArgs|Tutorial 5 - Using KCmdLineArgs]]| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/KIO Slaves/Using KIO Slaves in your Program|Tutorial: Using KIO Slaves in your Program]] KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a basic text editor interface, it's time to make it do something useful. At the most basic, a text editor needs to be able to load files from disc, save files that you've created/edited and create new files.&lt;br /&gt;
&lt;br /&gt;
KDE provides a number of classes for working with files which make life a lot easier for developers. The KIO library allows you to easily access files through network-transparent protocols as well as providing standard file dialogs.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutorial 3 except to change any reference from tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new from tutorial3&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Since we want to add the ability to load and save files, we must add the functions which will do the work. Since the functions will be called through Qt's [http://doc.trolltech.com/latest/signalsandslots.html signal/slot] mechanism we must specify that these functions are slots as we do on line 19. Since we are using slots in this header file, we must also add the [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;] macro.&lt;br /&gt;
&lt;br /&gt;
We also want to keep track of the filename of the currently opened file so we declare a &amp;lt;tt&amp;gt;{{qt|QString}} fileName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//New from here on&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText().toUtf8());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile()&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot;&lt;br /&gt;
     version=&amp;quot;1&amp;quot;&lt;br /&gt;
     xmlns=&amp;quot;http://www.kde.org/standards/kxmlgui/1.0&amp;quot;&lt;br /&gt;
     xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
     xsi:schemaLocation=&amp;quot;http://www.kde.org/standards/kxmlgui/1.0&lt;br /&gt;
                         http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Okay, now to implement the code that will do the loading and saving. This will all be happening in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first thing we do is add &amp;lt;tt&amp;gt;fileName(QString())&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; constructor list on line 16. This makes sure that &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is empty right from the beginning.&lt;br /&gt;
&lt;br /&gt;
===Adding the actions===&lt;br /&gt;
&lt;br /&gt;
The first thing we are going to do is provide the outward interface for the user so they can tell the application to load and save. Like with the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action in tutorial 3, we will use &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. On lines 37 to 47 we add the actions in the same way as for the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action. For each one, we connect it to the appropriate slot that we declared in the header file.&lt;br /&gt;
&lt;br /&gt;
===Creating a new document===&lt;br /&gt;
&lt;br /&gt;
The first function we create is the &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; sets the &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; QString to be empty to reflect the fact that this document does not yet have a presence on disc. &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; then clears the central text area using the same function that we connected the &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; to in tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Saving a file===&lt;br /&gt;
&lt;br /&gt;
====saveFileAs(QString)====&lt;br /&gt;
&lt;br /&gt;
Now we get onto our first file handling code. We're going to implement a function which will save the contents of the text area to the file name given as a parameter. KDE provides a class for safely saving a file called {{class|KSaveFile}} which is derived from Qt's {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
The function's prototype is&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then create our &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; object and open it with&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
KSaveFile file(outputFileName);&lt;br /&gt;
file.open();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have our file to write to, we need to format the text in the text area to a format which can be written to file. For this, we create a {{qt|QByteArray}} and fill it with the plain text version of whatever is in the text area:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText().toUtf8());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Now that we have our &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, we use it to write to the file with &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. If we were using a normal &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, this would make the changes immediately. However, if a problem occurred partway through writing, the file would become corrupted. For this reason, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; works by first writing to a temporary file and then, when you call &amp;lt;tt&amp;gt;KSaveFile::finalize()&amp;lt;/tt&amp;gt; the changes are made to the actual file.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
file.write(outputByteArray);&lt;br /&gt;
file.finalize();&lt;br /&gt;
file.close();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Finally, we set &amp;lt;tt&amp;gt;MainWindows&amp;lt;/tt&amp;gt;'s &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; member to point to the file name we just saved to.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
fileName = outputFileName;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====saveFileAs()====&lt;br /&gt;
&lt;br /&gt;
This is the function that the &amp;lt;tt&amp;gt;saveAs&amp;lt;/tt&amp;gt; slot is connected to. It simply calls the generic &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt; function and passes the file name returned by &amp;lt;tt&amp;gt;{{class|KFileDialog}}::[http://api.kde.org/4.0-api/kdelibs-apidocs/kio/html/classKFileDialog.html#8891356c249c5911e1ab15cc2739a89b getSaveFileName()]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is our first actual use of the KIO library. {{class|KFileDialog}} provides a number of static functions for displaying the common file dialog that is used by all KDE applications. Calling &amp;lt;tt&amp;gt;KFileDialog::getSaveFileName()&amp;lt;/tt&amp;gt; will display a dialog where the user can select the name of the file to save to or choose a new name. The function returns the full file name, which we then pass to &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====saveFile()====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There's nothing exciting or new in this function, just the logic to decide whether or not to show the save dialog. If &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is not empty, then the file is saved to &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt;. But if it is, then the dialog is shown to allow the user to select a file name.&lt;br /&gt;
&lt;br /&gt;
===Loading a file===&lt;br /&gt;
&lt;br /&gt;
Finally, we get round to being able to load a file from disc. The code for this is all contained in &amp;lt;tt&amp;gt;MainWindow::openFile()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
First we must ask the user for the name of the file they wish to open. We do this using another one of the &amp;lt;tt&amp;gt;KFileDialog&amp;lt;/tt&amp;gt; functions, this time &amp;lt;tt&amp;gt;getOpenFileName()&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then we use the KIO library to retrieve our file. This allows us to open the file with QFile even if it's stored in a remote location like an FTP site. We make the following call to {{class|NetAccess}}'s &amp;lt;tt&amp;gt;download()&amp;lt;/tt&amp;gt; function&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
KIO::NetAccess::download(fileNameFromDialog, tmpFile, this)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The first argument is the name of the file you wish to download. The second is a QString which, after the download is complete, will contain the location of the temporary copy of the file. It is this &amp;lt;tt&amp;gt;tmpFile&amp;lt;/tt&amp;gt; we will work with from now on.&lt;br /&gt;
&lt;br /&gt;
The function returns &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; depending on whether the transfer was successful. If it failed, we display a message box giving the error:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
KMessageBox::error(this, KIO::NetAccess::lastErrorString());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otherwise, we continue with opening the file.&lt;br /&gt;
&lt;br /&gt;
We create a QFile by passing the temporary file created by &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt; to its constructor and then open it in read-only mode&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
QFile file(tmpFile);&lt;br /&gt;
file.open(QIODevice::ReadOnly);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to display the contents of the file, we must use a {{qt|QTextStream}}. We create one by passing the contents of our file to its constructor and then call QFile's &amp;lt;tt&amp;gt;readAll()&amp;lt;/tt&amp;gt; function to get the text from the file. This is then passed to the &amp;lt;tt&amp;gt;setPlainText()&amp;lt;/tt&amp;gt; function of our text area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then store the path of the file we just opened:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
fileName = fileNameFromDialog;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
and finally, we remove the temporary file that was created by &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&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(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} &lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can be built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
make install&lt;br /&gt;
$HOME/bin/tutorial4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|Changed settings are saved in your KDE directory, in this case into $HOME/.kde/share/apps/tutorial4.}}&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to the [[Development/Tutorials/KCmdLineArgs|KCmdLineArgs]] tutorial.&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions</id>
		<title>Development/Tutorials/Using KActions</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions"/>
				<updated>2011-06-30T11:45:25Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* CMake */ Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KActions}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KActions and XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]], Basic XML knowledge|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Saving_and_loading|Tutorial 4 - Saving and loading]]| &lt;br /&gt;
&lt;br /&gt;
reading=None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial introduces the concept of actions. Actions are a unified way of supplying the user with ways to interact with your program.&lt;br /&gt;
&lt;br /&gt;
For example, if we wanted to let the user of [[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 ]] clear the text box by clicking a button in the toolbar, from an option in the File menu or through a keyboard shortcut, it could all be done with one {{class|KAction}}.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial3.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KAction==&lt;br /&gt;
A {{class|KAction}} is an object which contains all the information about the icon and shortcuts that is associated with a certain action. The action is then connected to a [http://doc.trolltech.com/latest/signalsandslots.html slot] which carries out the work of your action.&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial3&amp;quot;, &amp;quot;tutorial3&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 3&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area using KAction etc.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This time, very little has changed in &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;, only the KAboutData constructor has been updated to show that we are now on tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
	&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Only a function &amp;lt;tt&amp;gt;void setupActions()&amp;lt;/tt&amp;gt; has been added which will do all the work setting up the KActions.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
&lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;&amp;amp;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
&lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
&lt;br /&gt;
  setupGUI(Default, &amp;quot;tutorial3ui.rc&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
This builds upon the KXmlGuiWindow code from [[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2]]. Most of the changes are to &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;, an important structural change being that the constructor for MainWindow now calls &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; is where the new KAction code goes before finally calling &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; itself.&lt;br /&gt;
&lt;br /&gt;
===Creating the KAction object===&lt;br /&gt;
The KAction is built up in a number of steps. The first is including the &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; library and then creating the KAction:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
KAction* clearAction = new KAction(this);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This creates a new KAction called &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Setting KAction Properties===&lt;br /&gt;
====Text====&lt;br /&gt;
Now that we have our KAction object, we can start setting its properties. The following code sets the text that will be displayed in the menu and under the &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt;'s icon in the toolbar.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
clearAction-&amp;gt;setText(i18n(&amp;quot;&amp;amp;Clear&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Note that the text is passed through the &amp;lt;tt&amp;gt;i18n()&amp;lt;/tt&amp;gt; function; this is necessary for the UI to be translatable (more information on this can be found in the [[Development/Tutorials/Localization/i18n|i18n tutorial]]).&lt;br /&gt;
&lt;br /&gt;
The text of the action should contain a &amp;lt;tt&amp;gt;&amp;amp;&amp;lt;/tt&amp;gt; because that makes it easier to translate in non-latin1 languages. In Japanese, the translation might be &amp;lt;tt&amp;gt;ソース(&amp;amp;S)&amp;lt;/tt&amp;gt; and without the &amp;lt;tt&amp;gt;&amp;amp;&amp;lt;/tt&amp;gt; in the english text the translators cannot know if they have to add a &amp;lt;tt&amp;gt;&amp;amp;&amp;lt;/tt&amp;gt; or not.&lt;br /&gt;
&lt;br /&gt;
====Icon====&lt;br /&gt;
If the action is going to be displayed in a toolbar, it is nice to have an icon depicting the action. The following code sets the icon to the standard KDE &amp;lt;tt&amp;gt;document-new&amp;lt;/tt&amp;gt; icon through the use of the &amp;lt;tt&amp;gt;setIcon()&amp;lt;/tt&amp;gt; function:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Keyboard Shortcut====&lt;br /&gt;
Setting a keyboard shortcut to perform our action is equally simple:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This associates Ctrl+W with the KAction.&lt;br /&gt;
&lt;br /&gt;
===Adding to the Collection===&lt;br /&gt;
In order for the action to be accessed by the XMLGUI framework (explained in depth later) it must be added to the application's ''action collection''. The action collection is accessed via the &amp;lt;tt&amp;gt;actionCollection()&amp;lt;/tt&amp;gt; function like this: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Here, the &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt; KAction is added to the collection and given a name of ''clear''. This name (''clear'') is used by the XMLGUI framework to refer to the action, ergo, it should not be localized, since it is used internally only.&lt;br /&gt;
&lt;br /&gt;
====Connecting the action====&lt;br /&gt;
Now that the action is fully set up, it needs to be connected to something useful. In this case (because we want to clear the text area), we connect our action to the &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; action belonging to a KTextEdit (which, unsurprisingly, clears the KTextEdit)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
connect( clearAction, SIGNAL( triggered(bool) ), &lt;br /&gt;
         textArea, SLOT( clear() ) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This is the same as it would be done in Qt with a {{qt|QAction}}.&lt;br /&gt;
&lt;br /&gt;
===KStandardAction===&lt;br /&gt;
&lt;br /&gt;
For actions which would likely appear in almost every KDE application such as 'quit', 'save', and 'load' there are pre-created convenience KActions, accessed through [http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/namespaceKStandardAction.html KStandardAction].&lt;br /&gt;
&lt;br /&gt;
They are very simple to use. Once the library has been included (&amp;lt;tt&amp;gt;#include &amp;lt;KStandardAction&amp;gt;&amp;lt;/tt&amp;gt;), simply supply it with what you want the function to do and which KActionCollection to add it to. For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
KStandardAction::quit(kapp, SLOT(quit()), actionCollection());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This creates a KAction with the correct icon, text and shortcut and even adds it to the File menu.&lt;br /&gt;
&lt;br /&gt;
==Adding the action to menus and toolbars==&lt;br /&gt;
At the moment, the new &amp;quot;Clear&amp;quot; action has been created but it hasn't been associated with any menus or toolbars. This is done with a KDE technology called XMLGUI, which does nice things like movable toolbars for you.&lt;br /&gt;
&lt;br /&gt;
{{note|In a later version of KDE4, XMLGUI, may be replaced with a new framework called liveui. For now, XMLGUI, is the only and correct way to set up the UI.}}&lt;br /&gt;
&lt;br /&gt;
==Defining your own help menu==&lt;br /&gt;
The help menu is god-given, that is why all KDE help menus look the same. If you want to create your own help menu, go [http://websvn.kde.org/trunk/KDE/kdelibs/kdeui/widgets/khelpmenu.h?revision=1002779&amp;amp;view=markup here] and search for the explanation around showAboutApplication().&lt;br /&gt;
&lt;br /&gt;
==XMLGUI==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; function in {{class|KXmlGuiWindow}} depends on the XMLGUI system to construct the GUI, which XMLGUI does by parsing an XML file description of the interface.&lt;br /&gt;
&lt;br /&gt;
The rule for naming this XML file is &amp;lt;tt&amp;gt;appnameui.rc&amp;lt;/tt&amp;gt;, where &amp;lt;tt&amp;gt;appname&amp;lt;/tt&amp;gt; is the name you set in {{class|KAboutData}} (in this case, ''tutorial3''). So in our example, the file is called &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt;, and is located in the build directory. Where the file will ultimately be placed is handled by CMake.&lt;br /&gt;
&lt;br /&gt;
''See also'' [http://developer.kde.org/documentation/library/kdeqt/kde3arch/xmlgui.html developer.kde.org] which still provides valid information for KDE4.&lt;br /&gt;
&lt;br /&gt;
==''appname''ui.rc File==&lt;br /&gt;
&lt;br /&gt;
Since the description of the UI is defined with XML, the layout must follow strict rules. This tutorial will not go into great depth on this topic, but for more information, see the [[Development/Architecture/KDE4/XMLGUI_Technology|detailed XMLGUI page]] (here is an older tutorial: [http://developer.kde.org/documentation/tutorials/xmlui/preface.html]).&lt;br /&gt;
&lt;br /&gt;
===tutorial3ui.rc===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial3&amp;quot;&lt;br /&gt;
     version=&amp;quot;1&amp;quot;&lt;br /&gt;
     xmlns=&amp;quot;http://www.kde.org/standards/kxmlgui/1.0&amp;quot;&lt;br /&gt;
     xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
     xsi:schemaLocation=&amp;quot;http://www.kde.org/standards/kxmlgui/1.0&lt;br /&gt;
                         http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;lt;Toolbar&amp;gt;&amp;lt;/tt&amp;gt; tag allows you to describe the toolbar, which is the bar across the top of the window normally with icons. Here it is given the unique name ''mainToolBar'' and its user visible name set to ''Main Toolbar'' using the &amp;lt;tt&amp;gt;&amp;lt;text&amp;gt;&amp;lt;/tt&amp;gt; tag. The clear action is added to the toolbar using the &amp;lt;tt&amp;gt;&amp;lt;Action&amp;gt;&amp;lt;/tt&amp;gt; tag, the name parameter in this tag being the string that was passed to the KActionCollection with &amp;lt;tt&amp;gt;addAction()&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Besides having the action in the toolbar, it can also be added to the menubar. Here the action is being added to the ''File'' menu of the &amp;lt;tt&amp;gt;MenuBar&amp;lt;/tt&amp;gt; the same way it was added to the toolbar.&lt;br /&gt;
&lt;br /&gt;
Change the 'version' attribute of the &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;gui&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; tag if you changed .rc file since the last install to force a system cache update. Be sure it is an integer, if you use a decimal value, it will not work, but will not notify that it didn't. '&lt;br /&gt;
&lt;br /&gt;
{{Warning|The version attribute must be an integer number, if you type in version&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;&amp;quot;1.2&amp;quot; it will dispose of your kittens  (but not eat them).}}&lt;br /&gt;
&lt;br /&gt;
Some notes on the interaction between code and the .rc file: Menus appear automatically and should have a &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;text/&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; child tag unless they refer to standard menus. Actions need to be created manually and inserted into the actionCollection() using the name in the .rc file. Actions can be hidden or disabled, whereas menus can't.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
Finally, the &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; needs to go somewhere where KDE can find it (can't just leave it in the source directory!). '''This means the project needs to be installed somewhere.'''&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
project(tutorial3)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
&lt;br /&gt;
set(tutorial3_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial3 ${tutorial3_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(tutorial3 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&lt;br /&gt;
install(TARGETS tutorial3 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial3ui.rc &lt;br /&gt;
        DESTINATION  ${DATA_INSTALL_DIR}/tutorial3)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file is almost identical to the one for tutorial2, but with two extra lines at the end that describe where the files are to be installed. Firstly, the &amp;lt;tt&amp;gt;tutorial3&amp;lt;/tt&amp;gt; target is installed to the &amp;lt;tt&amp;gt;BIN_INSTALL_DIR&amp;lt;/tt&amp;gt; then the &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; file that describes the layout of the user interface is installed to the application's data directory.&lt;br /&gt;
&lt;br /&gt;
===Make, Install And Run===&lt;br /&gt;
If you don't have write access to where your KDE4 installation directory, you can install it to a folder in your home directory.&lt;br /&gt;
&lt;br /&gt;
To tell CMake where to install the program, set the &amp;lt;tt&amp;gt;DCMAKE_INSTALL_PREFIX&amp;lt;/tt&amp;gt; switch. You probably just want to install it somewhere local for testing (it's probably a bit silly to go to the effort of installing these tutorials to your KDE directory), so the following might be appropriate:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
make install&lt;br /&gt;
$HOME/bin/tutorial3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
which will create a KDE-like directory structure in your user's home directory and will install the executable to {{path|$HOME/bin/tutorial3}}.&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Saving_and_loading|saving and loading]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow</id>
		<title>Development/Tutorials/Using KXmlGuiWindow</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow"/>
				<updated>2011-06-30T11:43:53Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* CMake */ Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KXmlGuiWindow}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KXmlGuiWindow|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/First_program|Tutorial 1 - Hello World]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions and XMLGUI]]| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KXmlGuiWindow}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial carries on from [[Development/Tutorials/First_program|First Program Tutorial]] and will introduce the {{class|KXmlGuiWindow}} class.&lt;br /&gt;
&lt;br /&gt;
In the previous tutorial, the program caused a dialog box to pop up but we're going to take steps towards a functioning application.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial2.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KXmlGuiWindow==&lt;br /&gt;
&lt;br /&gt;
{{class|KXmlGuiWindow}} provides a full main window view with menubars, toolbars, a statusbar and a main area in the centre for a large widget. Most KDE applications will derive from this class as it provides an easy way to define menu and toolbar layouts through XML files (this technology is called XMLGUI). While we will not be using XMLGUI in ''this'' tutorial, we will use it in the next.&lt;br /&gt;
&lt;br /&gt;
In order to have a useful KXmlGuiWindow, we must subclass it. So we create two files, a &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; and a &amp;lt;tt&amp;gt;mainwindow.h&amp;lt;/tt&amp;gt; which will contain our code.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
		&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
First we Subclass KXmlGuiWindow on line 7 with &amp;lt;tt&amp;gt;class MainWindow : public KXmlGuiWindow&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Then we declare the constructor with &amp;lt;tt&amp;gt;MainWindow(QWidget *parent=0);&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And finally we declare a pointer to the object that will make up the bulk of our program. {{class|KTextEdit}} is a generic richtext editor with some KDE niceties like cursor auto-hiding.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit();&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
First, of course, on line 1 we have to include the header file containing the class declaration.&lt;br /&gt;
&lt;br /&gt;
On line 5, we initialise our text editor with an object. Then on line 6 we use KXmlGuiWindow's built-in setCentralWidget() function which tells the KXmlGuiWindow what should appear in the central section of the window.&lt;br /&gt;
&lt;br /&gt;
Finally, KXmlGuiWindow::setupGUI() is called which does a lot of behind-the-scenes stuff and creates the default menu bars (Settings, Help).&lt;br /&gt;
&lt;br /&gt;
==Back to main.cpp==&lt;br /&gt;
In order to actually run this window, we need to add a few lines in main.cpp:&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial2&amp;quot;, 0,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 2&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  &lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The only new lines here (compared to Tutorial 1) are 6, 19 and 20. On line 19, we create our MainWindow object and then on line 20, we display it.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
The best way to build the program is to use CMake. All that's changed since tutorial 1 is that &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; has been added to the sources list and any &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; has become &amp;lt;tt&amp;gt;tutorial2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
project (tutorial2)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
&lt;br /&gt;
set(tutorial2_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial2 ${tutorial2_SRCS})&lt;br /&gt;
target_link_libraries(tutorial2 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile it===&lt;br /&gt;
To compile, link and run it, use:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake ..&lt;br /&gt;
make&lt;br /&gt;
./tutorial2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KActions|using KActions]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/First_program</id>
		<title>Development/Tutorials/First program</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/First_program"/>
				<updated>2011-06-30T11:42:50Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Make And Run */ Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/First_program}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Hello World|&lt;br /&gt;
&lt;br /&gt;
pre=[http://mindview.net/Books/TICPP/ThinkingInCPP2e.html C++], [http://qt.nokia.com Qt], [[Getting_Started/Build|Building KDE]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]]| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
Your first program shall greet the world with a friendly &amp;quot;Hello World&amp;quot;, what else? For that, we will use a {{class|KMessageBox}} and customise one of the buttons.&lt;br /&gt;
[[image:introtokdetutorial1.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
{{tip|To get more information about any class you come across, Konqueror offers a quick shortcut. So to look for information about KMessageBox, just type &amp;quot;kde:kmessagebox&amp;quot; into Konqueror and you'll be taken to the documentation.}}&lt;br /&gt;
&lt;br /&gt;
{{tip|&lt;br /&gt;
You might want to use KDevelop for your projects, which does many nice things like code completion, easy access to API documentation or debugging support.&lt;br /&gt;
&lt;br /&gt;
Read [[Getting_Started/Set_up_KDE_4_for_development#KDevelop|this tutorial]] to set up KDevelop correctly for this task. You probably want to check if the setup is working by testing opening an existing KDE 4 application with KDevelop first.&lt;br /&gt;
&lt;br /&gt;
You still need to edit the CMake files by hand though.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==The Code==&lt;br /&gt;
All the code we need will be in one file, &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;. Create that file with the code below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    KAboutData aboutData(&lt;br /&gt;
                         // The program name used internally.&lt;br /&gt;
                         &amp;quot;tutorial1&amp;quot;,&lt;br /&gt;
                         // The message catalog name&lt;br /&gt;
                         // If null, program name is used instead.&lt;br /&gt;
                         0,&lt;br /&gt;
                         // A displayable program name string.&lt;br /&gt;
                         ki18n(&amp;quot;Tutorial 1&amp;quot;),&lt;br /&gt;
                         // The program version string.&lt;br /&gt;
                         &amp;quot;1.0&amp;quot;,&lt;br /&gt;
                         // Short description of what the app does.&lt;br /&gt;
                         ki18n(&amp;quot;Displays a KMessageBox popup&amp;quot;),&lt;br /&gt;
                         // The license this code is released under&lt;br /&gt;
                         KAboutData::License_GPL,&lt;br /&gt;
                         // Copyright Statement&lt;br /&gt;
                         ki18n(&amp;quot;(c) 2007&amp;quot;),&lt;br /&gt;
                         // Optional text shown in the About box.&lt;br /&gt;
                         // Can contain any information desired.&lt;br /&gt;
                         ki18n(&amp;quot;Some text...&amp;quot;),&lt;br /&gt;
                         // The program homepage string.&lt;br /&gt;
                         &amp;quot;http://example.com/&amp;quot;,&lt;br /&gt;
                         // The bug report email address&lt;br /&gt;
                         &amp;quot;submit@bugs.kde.org&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
    KApplication app;&lt;br /&gt;
    KGuiItem yesButton( i18n( &amp;quot;Hello&amp;quot; ), QString(),&lt;br /&gt;
                        i18n( &amp;quot;This is a tooltip&amp;quot; ),&lt;br /&gt;
                        i18n( &amp;quot;This is a WhatsThis help text.&amp;quot; ) );&lt;br /&gt;
    KMessageBox::questionYesNo( 0, i18n( &amp;quot;Hello World&amp;quot; ),&lt;br /&gt;
                                i18n( &amp;quot;Hello&amp;quot; ), yesButton );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The first KDE specific code we come across in this program is {{class|KAboutData}}. This is the class used to store information about the program such as a short description, authors or license information. Pretty much every KDE application should use this class.&lt;br /&gt;
&lt;br /&gt;
Then we come to {{class|KCmdLineArgs}}. This is the class one would use to specify command line switches to, for example, open the program with a specific file. However, in this tutorial, we simply initialise it with the {{class|KAboutData}} object we created so we can use the &amp;lt;tt&amp;gt;--version&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--author&amp;lt;/tt&amp;gt; switches.&lt;br /&gt;
&lt;br /&gt;
Then we create a {{class|KApplication}} object. This needs to be done exactly once in each program since it is needed for things such as [[Development/Tutorials/Localization/i18n|i18n]].&lt;br /&gt;
&lt;br /&gt;
Now we've done all the necessary KDE setup, we can move on to doing interesting things with our application. We're going to create a popup box but we're going to customise one of the buttons. To do this customisation, we need to use a {{class|KGuiItem}} object. The first argument in the {{class|KGuiItem}} constructor is the text that will appear on the item (in our case, a button). Then we have an option of setting an icon for the button but we don't want one so we just give it &amp;lt;tt&amp;gt;QString()&amp;lt;/tt&amp;gt;. We then set the tooltip (what appears when you hover over an item) and finally the &amp;quot;What's This?&amp;quot; (accessed through right-clicking or Shift-F1) text.&lt;br /&gt;
&lt;br /&gt;
Now we have our item, we can create our popup. We call the &amp;lt;tt&amp;gt;{{class|KMessageBox}}::questionYesNo()&amp;lt;/tt&amp;gt; function which, by default, creates a message box with a &amp;quot;Yes&amp;quot; and a &amp;quot;No&amp;quot; button. The second argument is the text that will appear in the message box above the buttons. The third is the caption the window will have and finally we set the KGuiItem for (what would normally be) the &amp;quot;Yes&amp;quot; button to the &amp;lt;tt&amp;gt;KGuiItem yesButton&amp;lt;/tt&amp;gt; we created.&lt;br /&gt;
&lt;br /&gt;
Note that all user-visible text is passed through the i18n() function; this is necessary for the UI to be translatable. More information on localization can be found in the [[Development/Tutorials/Localization/i18n|localization tutorial]].&lt;br /&gt;
&lt;br /&gt;
We're all done as far as the code is concerned. Now to build it and try it out.&lt;br /&gt;
&lt;br /&gt;
== Build ==&lt;br /&gt;
You want to [[Development/Tutorials/CMake|use CMake]] for your build environment. You provide a file CMakeLists.txt, cmake uses this file to generate all Makefiles out of it.&lt;br /&gt;
&lt;br /&gt;
=== CMakeLists.txt ===&lt;br /&gt;
Create a file named CMakeLists.txt in the same directory as main.cpp with this content:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
project (tutorial1)&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include (KDE4Defaults)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
set(tutorial1_SRCS main.cpp)&lt;br /&gt;
kde4_add_executable(tutorial1 ${tutorial1_SRCS})&lt;br /&gt;
target_link_libraries(tutorial1 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
install(TARGETS tutorial1  ${INSTALL_TARGETS_DEFAULT_ARGS})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function locates the package that you ask it for (in this case KDE4) and sets some variables describing the location of the package's headers and libraries. In this case we will use the &amp;lt;tt&amp;gt;KDE4_INCLUDES&amp;lt;/tt&amp;gt; variable which contains the path to the KDE4 header files.&lt;br /&gt;
&lt;br /&gt;
In order to allow the compiler to find these files, we pass that variable to the &amp;lt;tt&amp;gt;include_directories()&amp;lt;/tt&amp;gt; function which adds the KDE4 headers to the header search path.&lt;br /&gt;
&lt;br /&gt;
Next we create a variable called &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; using the &amp;lt;tt&amp;gt;set()&amp;lt;/tt&amp;gt; function. In this case we simply set it to the name of our only source file.&lt;br /&gt;
&lt;br /&gt;
Then we use &amp;lt;tt&amp;gt;kde4_add_executable()&amp;lt;/tt&amp;gt; to create an executable called &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; from the source files listed in our &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; variable. Afterwards, we link our executable to the KDE4 kdeui library using &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; and the &amp;lt;tt&amp;gt;KDE4_KDEUI_LIBS&amp;lt;/tt&amp;gt; variable which was set by the &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function. The line starting with &amp;lt;tt&amp;gt;install&amp;lt;/tt&amp;gt; writes a default &amp;quot;install&amp;quot; target into the Makefile.&lt;br /&gt;
&lt;br /&gt;
=== Make And Run ===&lt;br /&gt;
You can invoke CMake and make manually:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake .. # Note the two dots - this is no ellipsis, but &amp;quot;parent directory&amp;quot;.&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Or, if you set up your environment as described in [[Getting_Started/Build/Environment|Getting Started/Build/Environemnt]], you can compile this code with:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cmakekde&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And launch it with:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./tutorial1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KXmlGuiWindow|using KXmlGuiWindow]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/First_program</id>
		<title>Development/Tutorials/First program</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/First_program"/>
				<updated>2011-06-30T11:41:42Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* CMakeLists.txt */ fix syntax highlight&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/First_program}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Hello World|&lt;br /&gt;
&lt;br /&gt;
pre=[http://mindview.net/Books/TICPP/ThinkingInCPP2e.html C++], [http://qt.nokia.com Qt], [[Getting_Started/Build|Building KDE]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]]| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
Your first program shall greet the world with a friendly &amp;quot;Hello World&amp;quot;, what else? For that, we will use a {{class|KMessageBox}} and customise one of the buttons.&lt;br /&gt;
[[image:introtokdetutorial1.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
{{tip|To get more information about any class you come across, Konqueror offers a quick shortcut. So to look for information about KMessageBox, just type &amp;quot;kde:kmessagebox&amp;quot; into Konqueror and you'll be taken to the documentation.}}&lt;br /&gt;
&lt;br /&gt;
{{tip|&lt;br /&gt;
You might want to use KDevelop for your projects, which does many nice things like code completion, easy access to API documentation or debugging support.&lt;br /&gt;
&lt;br /&gt;
Read [[Getting_Started/Set_up_KDE_4_for_development#KDevelop|this tutorial]] to set up KDevelop correctly for this task. You probably want to check if the setup is working by testing opening an existing KDE 4 application with KDevelop first.&lt;br /&gt;
&lt;br /&gt;
You still need to edit the CMake files by hand though.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==The Code==&lt;br /&gt;
All the code we need will be in one file, &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;. Create that file with the code below:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    KAboutData aboutData(&lt;br /&gt;
                         // The program name used internally.&lt;br /&gt;
                         &amp;quot;tutorial1&amp;quot;,&lt;br /&gt;
                         // The message catalog name&lt;br /&gt;
                         // If null, program name is used instead.&lt;br /&gt;
                         0,&lt;br /&gt;
                         // A displayable program name string.&lt;br /&gt;
                         ki18n(&amp;quot;Tutorial 1&amp;quot;),&lt;br /&gt;
                         // The program version string.&lt;br /&gt;
                         &amp;quot;1.0&amp;quot;,&lt;br /&gt;
                         // Short description of what the app does.&lt;br /&gt;
                         ki18n(&amp;quot;Displays a KMessageBox popup&amp;quot;),&lt;br /&gt;
                         // The license this code is released under&lt;br /&gt;
                         KAboutData::License_GPL,&lt;br /&gt;
                         // Copyright Statement&lt;br /&gt;
                         ki18n(&amp;quot;(c) 2007&amp;quot;),&lt;br /&gt;
                         // Optional text shown in the About box.&lt;br /&gt;
                         // Can contain any information desired.&lt;br /&gt;
                         ki18n(&amp;quot;Some text...&amp;quot;),&lt;br /&gt;
                         // The program homepage string.&lt;br /&gt;
                         &amp;quot;http://example.com/&amp;quot;,&lt;br /&gt;
                         // The bug report email address&lt;br /&gt;
                         &amp;quot;submit@bugs.kde.org&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
    KApplication app;&lt;br /&gt;
    KGuiItem yesButton( i18n( &amp;quot;Hello&amp;quot; ), QString(),&lt;br /&gt;
                        i18n( &amp;quot;This is a tooltip&amp;quot; ),&lt;br /&gt;
                        i18n( &amp;quot;This is a WhatsThis help text.&amp;quot; ) );&lt;br /&gt;
    KMessageBox::questionYesNo( 0, i18n( &amp;quot;Hello World&amp;quot; ),&lt;br /&gt;
                                i18n( &amp;quot;Hello&amp;quot; ), yesButton );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The first KDE specific code we come across in this program is {{class|KAboutData}}. This is the class used to store information about the program such as a short description, authors or license information. Pretty much every KDE application should use this class.&lt;br /&gt;
&lt;br /&gt;
Then we come to {{class|KCmdLineArgs}}. This is the class one would use to specify command line switches to, for example, open the program with a specific file. However, in this tutorial, we simply initialise it with the {{class|KAboutData}} object we created so we can use the &amp;lt;tt&amp;gt;--version&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--author&amp;lt;/tt&amp;gt; switches.&lt;br /&gt;
&lt;br /&gt;
Then we create a {{class|KApplication}} object. This needs to be done exactly once in each program since it is needed for things such as [[Development/Tutorials/Localization/i18n|i18n]].&lt;br /&gt;
&lt;br /&gt;
Now we've done all the necessary KDE setup, we can move on to doing interesting things with our application. We're going to create a popup box but we're going to customise one of the buttons. To do this customisation, we need to use a {{class|KGuiItem}} object. The first argument in the {{class|KGuiItem}} constructor is the text that will appear on the item (in our case, a button). Then we have an option of setting an icon for the button but we don't want one so we just give it &amp;lt;tt&amp;gt;QString()&amp;lt;/tt&amp;gt;. We then set the tooltip (what appears when you hover over an item) and finally the &amp;quot;What's This?&amp;quot; (accessed through right-clicking or Shift-F1) text.&lt;br /&gt;
&lt;br /&gt;
Now we have our item, we can create our popup. We call the &amp;lt;tt&amp;gt;{{class|KMessageBox}}::questionYesNo()&amp;lt;/tt&amp;gt; function which, by default, creates a message box with a &amp;quot;Yes&amp;quot; and a &amp;quot;No&amp;quot; button. The second argument is the text that will appear in the message box above the buttons. The third is the caption the window will have and finally we set the KGuiItem for (what would normally be) the &amp;quot;Yes&amp;quot; button to the &amp;lt;tt&amp;gt;KGuiItem yesButton&amp;lt;/tt&amp;gt; we created.&lt;br /&gt;
&lt;br /&gt;
Note that all user-visible text is passed through the i18n() function; this is necessary for the UI to be translatable. More information on localization can be found in the [[Development/Tutorials/Localization/i18n|localization tutorial]].&lt;br /&gt;
&lt;br /&gt;
We're all done as far as the code is concerned. Now to build it and try it out.&lt;br /&gt;
&lt;br /&gt;
== Build ==&lt;br /&gt;
You want to [[Development/Tutorials/CMake|use CMake]] for your build environment. You provide a file CMakeLists.txt, cmake uses this file to generate all Makefiles out of it.&lt;br /&gt;
&lt;br /&gt;
=== CMakeLists.txt ===&lt;br /&gt;
Create a file named CMakeLists.txt in the same directory as main.cpp with this content:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
project (tutorial1)&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include (KDE4Defaults)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
set(tutorial1_SRCS main.cpp)&lt;br /&gt;
kde4_add_executable(tutorial1 ${tutorial1_SRCS})&lt;br /&gt;
target_link_libraries(tutorial1 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
install(TARGETS tutorial1  ${INSTALL_TARGETS_DEFAULT_ARGS})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function locates the package that you ask it for (in this case KDE4) and sets some variables describing the location of the package's headers and libraries. In this case we will use the &amp;lt;tt&amp;gt;KDE4_INCLUDES&amp;lt;/tt&amp;gt; variable which contains the path to the KDE4 header files.&lt;br /&gt;
&lt;br /&gt;
In order to allow the compiler to find these files, we pass that variable to the &amp;lt;tt&amp;gt;include_directories()&amp;lt;/tt&amp;gt; function which adds the KDE4 headers to the header search path.&lt;br /&gt;
&lt;br /&gt;
Next we create a variable called &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; using the &amp;lt;tt&amp;gt;set()&amp;lt;/tt&amp;gt; function. In this case we simply set it to the name of our only source file.&lt;br /&gt;
&lt;br /&gt;
Then we use &amp;lt;tt&amp;gt;kde4_add_executable()&amp;lt;/tt&amp;gt; to create an executable called &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; from the source files listed in our &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; variable. Afterwards, we link our executable to the KDE4 kdeui library using &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; and the &amp;lt;tt&amp;gt;KDE4_KDEUI_LIBS&amp;lt;/tt&amp;gt; variable which was set by the &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function. The line starting with &amp;lt;tt&amp;gt;install&amp;lt;/tt&amp;gt; writes a default &amp;quot;install&amp;quot; target into the Makefile.&lt;br /&gt;
&lt;br /&gt;
=== Make And Run ===&lt;br /&gt;
You can invoke CMake and make manually:&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. # Note the two dots - this is no ellipsis, but &amp;quot;parent directory&amp;quot;.&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
Or, if you set up your environment as described in [[Getting_Started/Build/Environment|Getting Started/Build/Environemnt]], you can compile this code with:&lt;br /&gt;
 cmakekde&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And launch it with:&lt;br /&gt;
 ./tutorial1&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KXmlGuiWindow|using KXmlGuiWindow]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/Extragear</id>
		<title>Schedules/Extragear</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/Extragear"/>
				<updated>2011-06-30T11:39:22Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix repo link.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is intended to be a central location for Extragear projects to keep users and contributors (translators, packagers, etc.) informed about upcoming releases in a very accessible way. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project &lt;br /&gt;
! Next release (roughly) &lt;br /&gt;
! Next Release Code branch &lt;br /&gt;
! Next Release Translation branch &lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [http://amarok.kde.org Amarok] &lt;br /&gt;
| 1 March 2010 &lt;br /&gt;
| git master &lt;br /&gt;
| git master &lt;br /&gt;
| string freeze starting 9 February 2010&lt;br /&gt;
|-&lt;br /&gt;
| [http://digikam.org digiKam] &lt;br /&gt;
| July 24th 2011 [http://www.digikam.org/drupal/about/releaseplan] &lt;br /&gt;
| [https://projects.kde.org/projects/extragear/graphics git master] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-graphics/ trunk kde4] &lt;br /&gt;
| String freeze starting June 30th.&lt;br /&gt;
|-&lt;br /&gt;
| K3b &lt;br /&gt;
| 1 March 2010&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/multimedia/k3b/ trunk]&lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-multimedia/ trunk kde4]&lt;br /&gt;
| String freeze starting from January 31 2010 (in effect)&lt;br /&gt;
|-&lt;br /&gt;
| KAudiocreator &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Kaffeine &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://extragear.kde.org/apps/kcoloredit/ KColorEdit] &lt;br /&gt;
| KDE release &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/graphics/kcoloredit/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-graphics/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.kde-apps.org/content/show.php/KDE+Partition+Manager?content=89595 KDE Partition Manager] &lt;br /&gt;
| Q2/2010&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/sysadmin/partitionmanager/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-sysadmin/ trunk kde4] &lt;br /&gt;
| &amp;lt;!-- String freeze in effect --&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://ww.kdevelop.org KDevelop] &lt;br /&gt;
| 1 May 2010 &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/sdk/kdevelop/ trunk]&lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-sdk/ trunk kde4] &lt;br /&gt;
| string freeze starting 31 March 2010&lt;br /&gt;
|-&lt;br /&gt;
| KDiff3 &lt;br /&gt;
| January 31, 2009 &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/utils/kdiff3/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-utils/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KFax &lt;br /&gt;
| KDE release &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KFTPGrabber &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KGrab &lt;br /&gt;
| KDE release &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://extragear.kde.org/apps/kgraphviewer/ KGraphViewer] &lt;br /&gt;
| KDE release &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/graphics/kgraphviewer/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-graphics/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KIconedit &lt;br /&gt;
| KDE release &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.kmldonkey.org KMLDonkey] &lt;br /&gt;
| KDE release &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/network/kmldonkey/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-network/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KNemo &lt;br /&gt;
| January 17, 2010 &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/network/knemo/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-network/ trunk kde4] &lt;br /&gt;
| String freeze in effect &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://konversation.kde.org Konversation] &lt;br /&gt;
| In the week beginning June 7th 2010&lt;br /&gt;
| [http://gitorious.org/konversation/konversation/trees/master git master] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-network/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KPager &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KPhotoalbum &lt;br /&gt;
| May 9 2009 &lt;br /&gt;
| trunk &lt;br /&gt;
| trunk &lt;br /&gt;
| Message freeze, April 3 2009&lt;br /&gt;
|-&lt;br /&gt;
| KPlayer &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KPovmodeler &lt;br /&gt;
| KDE release &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KRecipes &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KSig &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://ktorrent.org/ KTorrent] &lt;br /&gt;
| 8 november 2009 &lt;br /&gt;
| [http://websvn.kde.org/branches/stable/extragear-kde4/network/ktorrent stable kde4] &lt;br /&gt;
| [http://websvn.kde.org/branches/stable/l10n-kde4/templates/messages/extragear-network/ stable kde4] &lt;br /&gt;
| String freeze in effect&lt;br /&gt;
|-&lt;br /&gt;
| Kuickshow &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KWlan &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| RSIBreak &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Skanlite &lt;br /&gt;
| KDE release &lt;br /&gt;
| trunk &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://skrooge.org Skrooge] &lt;br /&gt;
| 2010-02-06 (version 0.6.0) &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/office/skrooge trunk]&lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-office/ trunk kde4]&lt;br /&gt;
| String freeze in effect&lt;br /&gt;
|-&lt;br /&gt;
| [http://tellico-project.org Tellico] &lt;br /&gt;
| &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/office/tellico/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-office/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.kde-apps.org/content/show.php?content=29153 Yakuake] &lt;br /&gt;
| July 8th, 2010&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/utils/yakuake/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-utils/ trunk kde4] &lt;br /&gt;
| String freeze started June 24th, 2010&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.rekonq.sourceforge.net rekonq] &lt;br /&gt;
| 30 June, 2010 (Version 0.5)&lt;br /&gt;
| [http://gitorious.org/rekonq/mainline/trees/master git master]&lt;br /&gt;
| [http://gitorious.org/rekonq/mainline/trees/master git master]&lt;br /&gt;
| String freeze starting 8 June 2010 (0.5 beta2 release) &lt;br /&gt;
|-&lt;br /&gt;
| Kile&lt;br /&gt;
| June 8th, 2011 (Version 2.1)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| String freeze started 23 May 2011&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.krusader.org/ Krusader] &lt;br /&gt;
| 2.4.0-beta1 released on June 26, 2011.&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/utils/krusader/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-utils/ trunk kde4] &lt;br /&gt;
| String freeze since June 26, 2011 until 2.4.0 release.&lt;br /&gt;
|-&lt;br /&gt;
| BlueDevil&lt;br /&gt;
| 1.0.5 (stable) and 1.1.1 (trunk) released planned on July 15, 2011.&lt;br /&gt;
| &lt;br /&gt;
| stable, trunk&lt;br /&gt;
| String freeze since June 29, 2011 until 1.0.5 and 1.1.1 releases.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/Extragear</id>
		<title>Schedules/Extragear</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/Extragear"/>
				<updated>2011-06-30T11:36:51Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Add Digicam plan for 2.0.0.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is intended to be a central location for Extragear projects to keep users and contributors (translators, packagers, etc.) informed about upcoming releases in a very accessible way. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project &lt;br /&gt;
! Next release (roughly) &lt;br /&gt;
! Next Release Code branch &lt;br /&gt;
! Next Release Translation branch &lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [http://amarok.kde.org Amarok] &lt;br /&gt;
| 1 March 2010 &lt;br /&gt;
| git master &lt;br /&gt;
| git master &lt;br /&gt;
| string freeze starting 9 February 2010&lt;br /&gt;
|-&lt;br /&gt;
| [http://digikam.org digiKam] &lt;br /&gt;
| July 24th 2011 [http://www.digikam.org/drupal/about/releaseplan] &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/graphics trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-graphics/ trunk kde4] &lt;br /&gt;
| String freeze starting June 30th.&lt;br /&gt;
|-&lt;br /&gt;
| K3b &lt;br /&gt;
| 1 March 2010&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/multimedia/k3b/ trunk]&lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-multimedia/ trunk kde4]&lt;br /&gt;
| String freeze starting from January 31 2010 (in effect)&lt;br /&gt;
|-&lt;br /&gt;
| KAudiocreator &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Kaffeine &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://extragear.kde.org/apps/kcoloredit/ KColorEdit] &lt;br /&gt;
| KDE release &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/graphics/kcoloredit/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-graphics/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.kde-apps.org/content/show.php/KDE+Partition+Manager?content=89595 KDE Partition Manager] &lt;br /&gt;
| Q2/2010&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/sysadmin/partitionmanager/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-sysadmin/ trunk kde4] &lt;br /&gt;
| &amp;lt;!-- String freeze in effect --&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://ww.kdevelop.org KDevelop] &lt;br /&gt;
| 1 May 2010 &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/sdk/kdevelop/ trunk]&lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-sdk/ trunk kde4] &lt;br /&gt;
| string freeze starting 31 March 2010&lt;br /&gt;
|-&lt;br /&gt;
| KDiff3 &lt;br /&gt;
| January 31, 2009 &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/utils/kdiff3/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-utils/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KFax &lt;br /&gt;
| KDE release &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KFTPGrabber &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KGrab &lt;br /&gt;
| KDE release &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://extragear.kde.org/apps/kgraphviewer/ KGraphViewer] &lt;br /&gt;
| KDE release &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/graphics/kgraphviewer/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-graphics/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KIconedit &lt;br /&gt;
| KDE release &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.kmldonkey.org KMLDonkey] &lt;br /&gt;
| KDE release &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/network/kmldonkey/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-network/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KNemo &lt;br /&gt;
| January 17, 2010 &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/network/knemo/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-network/ trunk kde4] &lt;br /&gt;
| String freeze in effect &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://konversation.kde.org Konversation] &lt;br /&gt;
| In the week beginning June 7th 2010&lt;br /&gt;
| [http://gitorious.org/konversation/konversation/trees/master git master] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-network/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KPager &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KPhotoalbum &lt;br /&gt;
| May 9 2009 &lt;br /&gt;
| trunk &lt;br /&gt;
| trunk &lt;br /&gt;
| Message freeze, April 3 2009&lt;br /&gt;
|-&lt;br /&gt;
| KPlayer &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KPovmodeler &lt;br /&gt;
| KDE release &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KRecipes &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KSig &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://ktorrent.org/ KTorrent] &lt;br /&gt;
| 8 november 2009 &lt;br /&gt;
| [http://websvn.kde.org/branches/stable/extragear-kde4/network/ktorrent stable kde4] &lt;br /&gt;
| [http://websvn.kde.org/branches/stable/l10n-kde4/templates/messages/extragear-network/ stable kde4] &lt;br /&gt;
| String freeze in effect&lt;br /&gt;
|-&lt;br /&gt;
| Kuickshow &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| KWlan &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| RSIBreak &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Skanlite &lt;br /&gt;
| KDE release &lt;br /&gt;
| trunk &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://skrooge.org Skrooge] &lt;br /&gt;
| 2010-02-06 (version 0.6.0) &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/office/skrooge trunk]&lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-office/ trunk kde4]&lt;br /&gt;
| String freeze in effect&lt;br /&gt;
|-&lt;br /&gt;
| [http://tellico-project.org Tellico] &lt;br /&gt;
| &lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/office/tellico/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-office/ trunk kde4] &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [http://www.kde-apps.org/content/show.php?content=29153 Yakuake] &lt;br /&gt;
| July 8th, 2010&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/utils/yakuake/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-utils/ trunk kde4] &lt;br /&gt;
| String freeze started June 24th, 2010&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.rekonq.sourceforge.net rekonq] &lt;br /&gt;
| 30 June, 2010 (Version 0.5)&lt;br /&gt;
| [http://gitorious.org/rekonq/mainline/trees/master git master]&lt;br /&gt;
| [http://gitorious.org/rekonq/mainline/trees/master git master]&lt;br /&gt;
| String freeze starting 8 June 2010 (0.5 beta2 release) &lt;br /&gt;
|-&lt;br /&gt;
| Kile&lt;br /&gt;
| June 8th, 2011 (Version 2.1)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| String freeze started 23 May 2011&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.krusader.org/ Krusader] &lt;br /&gt;
| 2.4.0-beta1 released on June 26, 2011.&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear/utils/krusader/ trunk] &lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4/templates/messages/extragear-utils/ trunk kde4] &lt;br /&gt;
| String freeze since June 26, 2011 until 2.4.0 release.&lt;br /&gt;
|-&lt;br /&gt;
| BlueDevil&lt;br /&gt;
| 1.0.5 (stable) and 1.1.1 (trunk) released planned on July 15, 2011.&lt;br /&gt;
| &lt;br /&gt;
| stable, trunk&lt;br /&gt;
| String freeze since June 29, 2011 until 1.0.5 and 1.1.1 releases.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Decibel/Handling_TextChannels</id>
		<title>Development/Tutorials/Decibel/Handling TextChannels</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Decibel/Handling_TextChannels"/>
				<updated>2011-06-30T11:33:46Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Text replace - &amp;quot;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;quot; to &amp;quot;&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Decibel Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Handling TextChannels|&lt;br /&gt;
&lt;br /&gt;
pre=[http://mindview.net/Books/TICPP/ThinkingInCPP2e.html C++], [http://www.trolltech.com/products/qt/ Qt], [[Development/Tutorials/Decibel/GettingStarted|Getting Started with Decibel]]| &lt;br /&gt;
next=| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial will walk you through the process of creating a simple application that uses Decibel's TextChannels to communicate via arbitrary instant messaging networks using telepathy. From the result of this tutorial, only a few more lines of code are needed to produce a functioning text based instant messaging client.&lt;br /&gt;
&lt;br /&gt;
This tutorial is based on the simpleclient demo included with Decibel. An explanation of using the simpleclient demo can be [[Development/Tutorials/Decibel/GettingStarted#simpleclient|found here]].&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we only pick out the important parts of the source code to discuss. The complete working source code for this example can be found [http://websvn.kde.org/trunk/kdesupport/decibel/demos/simpleclient here in KDE's SVN Repository].&lt;br /&gt;
&lt;br /&gt;
==ChannelHandler class==&lt;br /&gt;
The first class we will need to create is an implementation of the &amp;lt;tt&amp;gt;Decibel::ChannelHandler&amp;lt;/tt&amp;gt; interface.&lt;br /&gt;
&lt;br /&gt;
===The Class Definition===&lt;br /&gt;
Here is the class definition for our implementation of the &amp;lt;tt&amp;gt;Decibel::ChannelHandler&amp;lt;/tt&amp;gt; interface. It is explained below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
class MyTextChannelHandler : public Decibel::ChannelHandler&lt;br /&gt;
{&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
    explicit MyTextChannelHandler(QObject * parent = 0);&lt;br /&gt;
    ~MyTextChannelHandler();&lt;br /&gt;
&lt;br /&gt;
    bool handleChannel(QtTapioca::Connection *, QtTapioca::Channel *, const bool);&lt;br /&gt;
&lt;br /&gt;
public slots:&lt;br /&gt;
    void onMessageReceived();&lt;br /&gt;
    void onCloseChannel();&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
    QtTapioca::Connection *  m_connection;&lt;br /&gt;
    QtTapioca::TextChannel * m_channel;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We must inherit from &amp;lt;tt&amp;gt;Decibel::ChannelHandler&amp;lt;/tt&amp;gt; which is the interface definition for handling incoming Channels. We reimplement the constructor, Destructor and the &amp;lt;tt&amp;gt;handleChannel()&amp;lt;/tt&amp;gt; method as well as adding two slots of our own. We also create the member variables &amp;lt;tt&amp;gt;m_connecion&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;m_channel&amp;lt;/tt&amp;gt; which will hold the &amp;lt;tt&amp;gt;QtTapioca::Connection&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;QtTapioca::Channel&amp;lt;/tt&amp;gt; objects that are received by the &amp;lt;tt&amp;gt;handleChannel&amp;lt;/tt&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
===The Class Implementation===&lt;br /&gt;
&lt;br /&gt;
Now that we have defined our &amp;lt;tt&amp;gt;Decibel::ChannelHandler&amp;lt;/tt&amp;gt; subclass, we need to implement its methods.&lt;br /&gt;
&lt;br /&gt;
====Constructor====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
MyTextChannelHandler::MyTextChannelHandler(QObject * parent) :&lt;br /&gt;
    ChannelHandler(parent),&lt;br /&gt;
    m_connection(0),&lt;br /&gt;
    m_channel(0)&lt;br /&gt;
{ }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The constructor is very simple. We just pass the &amp;lt;tt&amp;gt;parent&amp;lt;/tt&amp;gt; object on to the parent class and initialise our member variables to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Destructor====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
MyTextChannelHandler::~MyTextChannelHandler()&lt;br /&gt;
{ }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The destructor is even simpler. We don't need to do anything in it because Qt will handle the deletion of child objects automatically.&lt;br /&gt;
&lt;br /&gt;
====handleChannel()====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
bool MyTextChannelHandler::handleChannel(QtTapioca::Connection * connection,&lt;br /&gt;
                                         QtTapioca::Channel * channel,&lt;br /&gt;
                                         const bool)&lt;br /&gt;
{&lt;br /&gt;
    Q_ASSERT(connection != 0);&lt;br /&gt;
    Q_ASSERT(channel != 0);&lt;br /&gt;
&lt;br /&gt;
    if (m_connection != 0) { return false; }&lt;br /&gt;
&lt;br /&gt;
    m_channel = dynamic_cast&amp;lt;QtTapioca::TextChannel*&amp;gt;(channel);&lt;br /&gt;
    if (m_channel == 0)&lt;br /&gt;
    {&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
    m_connection = connection;&lt;br /&gt;
&lt;br /&gt;
    connect(m_channel, SIGNAL(messageReceived(const QtTapioca::TextChannel *, const QtTapioca::TextChannel::Message &amp;amp;)),&lt;br /&gt;
            this, SLOT(onMessageReceived()));&lt;br /&gt;
    connect(m_channel, SIGNAL(closed()), this, SLOT(onCloseChannel()));&lt;br /&gt;
&lt;br /&gt;
    onMessageReceived();&lt;br /&gt;
&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This method is reimplemented from the &amp;lt;tt&amp;gt;Decibel::ChannelHandler&amp;lt;/tt&amp;gt; interface. It is called when ever a new incoming communication channel (&amp;lt;tt&amp;gt;QtTapioca::Channel&amp;lt;/tt&amp;gt;) comes into existence. In this method, we must decide whether to accept the incoming channel, and if so, to deal with it appropriately.&lt;br /&gt;
&lt;br /&gt;
First we check the incoming channel and connection objects are not invalid (=0) and we fail if this is the case. In a proper application, these error cases should be handled more gracefully, but for the purpose of this demo, we will just use &amp;lt;tt&amp;gt;Q_ASSERT()&amp;lt;/tt&amp;gt; to handle them.&lt;br /&gt;
&lt;br /&gt;
Next we check if the &amp;lt;tt&amp;gt;m_connection&amp;lt;/tt&amp;gt; member variable is set to 0. If it is not, then we are already handling a channel. This demo can only handle one channel at a time, so we return &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; to reject the new incoming channel.&lt;br /&gt;
&lt;br /&gt;
There are multiple types of channel we could possible receive. In this demo we are only interested in the &amp;lt;tt&amp;gt;TextChannel&amp;lt;/tt&amp;gt; type. So the next step is to try and cast it to a &amp;lt;tt&amp;gt;QtTapioca::TextChannel&amp;lt;/tt&amp;gt; object. We then evaluate if this cast was successful (not = 0) and if it was not, we again return &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; to reject the channel. If the cast is successful, we assign the &amp;lt;tt&amp;gt;QtTapioca::TextChannel&amp;lt;/tt&amp;gt; object to the member variable &amp;lt;tt&amp;gt;m_channel&amp;lt;/tt&amp;gt; to store it.&lt;br /&gt;
&lt;br /&gt;
Now that we are sure the incoming channel is one we want to handle, we assign the incoming connection object to a member variable &amp;lt;tt&amp;gt;m_connection&amp;lt;/tt&amp;gt; as well.&lt;br /&gt;
&lt;br /&gt;
We are also ready to connect the channel's signals to the slots in our class. We connect the channel's &amp;lt;tt&amp;gt;messageReceived()&amp;lt;/tt&amp;gt; signal to our &amp;lt;tt&amp;gt;onMessageReceived()&amp;lt;/tt&amp;gt; slot, and the channel's &amp;lt;tt&amp;gt;closed()&amp;lt;/tt&amp;gt; signal to our &amp;lt;tt&amp;gt;onCloseChannel()&amp;lt;/tt&amp;gt; slot.&lt;br /&gt;
&lt;br /&gt;
Finally, we call the &amp;lt;tt&amp;gt;onMessageReceived()&amp;lt;/tt&amp;gt; slot to process any messages that have already arrived on the channel, before returning &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; to tell Decibel that we have accepted the channel and are handling it.&lt;br /&gt;
&lt;br /&gt;
====onCloseChannel()====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void MyTextChannelHandler::onCloseChannel()&lt;br /&gt;
{&lt;br /&gt;
    m_connection = 0;&lt;br /&gt;
    m_channel = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This slot is called when the current TextChannel is closed. It resets the &amp;lt;tt&amp;gt;m_connection&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;m_channel&amp;lt;/tt&amp;gt; member variables to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; so that the &amp;lt;tt&amp;gt;handleChannel()&amp;lt;/tt&amp;gt; method will accept the next incoming channel.&lt;br /&gt;
&lt;br /&gt;
====onMessageReceived()====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void MyTextChannelHandler::onMessageReceived()&lt;br /&gt;
{&lt;br /&gt;
    QList&amp;lt;QtTapioca::TextChannel::Message&amp;gt; message_list = m_channel-&amp;gt;pendingMessages();&lt;br /&gt;
&lt;br /&gt;
    for (QList&amp;lt;QtTapioca::TextChannel::Message&amp;gt;::const_iterator&lt;br /&gt;
             message = message_list.constBegin();&lt;br /&gt;
         message != message_list.constEnd(); ++message)&lt;br /&gt;
    {&lt;br /&gt;
        if (message-&amp;gt;type() == QtTapioca::TextChannel::Message::Normal &amp;amp;&amp;amp;&lt;br /&gt;
            message-&amp;gt;contents() == QString(&amp;quot;ping?&amp;quot;))&lt;br /&gt;
        { m_channel-&amp;gt;sendMessage(QString(&amp;quot;pong!&amp;quot;)); }&lt;br /&gt;
&lt;br /&gt;
        m_channel-&amp;gt;acknowledge(*message);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This slot is called when a new message is received on the channel we are currently handling. It is where the processing of the message takes place.&lt;br /&gt;
&lt;br /&gt;
The first thing we do is to call the &amp;lt;tt&amp;gt;pendingMessages()&amp;lt;/tt&amp;gt; method of the channel to receive *all* the unprocessed received messages on that channel.&lt;br /&gt;
&lt;br /&gt;
Next we iterate over the list of these messages. For each message in the list, we check that it is a message of type &amp;lt;tt&amp;gt;Normal&amp;lt;/tt&amp;gt;, as oposed to another type like &amp;lt;tt&amp;gt;Avatar&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;Emoticon&amp;lt;/tt&amp;gt; which we are not interested in for this tutorial.&lt;br /&gt;
&lt;br /&gt;
If it is a normal type of message, we check its contents, and if they are the string &amp;lt;tt&amp;gt;ping?&amp;lt;/tt&amp;gt;, we reply with the string &amp;lt;tt&amp;gt;pong!&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We then call the &amp;lt;tt&amp;gt;acknowledge()&amp;lt;/tt&amp;gt; method on the channel to confirm to the sender that we received the message.&lt;br /&gt;
&lt;br /&gt;
==The main() function==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
int main(int argc, char ** argv)&lt;br /&gt;
{&lt;br /&gt;
    QCoreApplication app(argc, argv);&lt;br /&gt;
    app.setOrganizationName(Decibel::organisation_name);&lt;br /&gt;
    app.setApplicationName(&amp;quot;SimpleClient&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    MyTextChannelHandler thandler(&amp;amp;app);&lt;br /&gt;
&lt;br /&gt;
    Decibel::registerTypes();&lt;br /&gt;
&lt;br /&gt;
    QDBusConnection::sessionBus().registerService(Decibel::organisation_name + '.' + &amp;quot;SimpleClient&amp;quot;);&lt;br /&gt;
    QDBusConnection::sessionBus().registerObject(&amp;quot;/TextChannelHandler&amp;quot;, thandler);&lt;br /&gt;
&lt;br /&gt;
    return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Since this is a console application, we set up a &amp;lt;tt&amp;gt;QCoreApplication&amp;lt;/tt&amp;gt; first.&lt;br /&gt;
&lt;br /&gt;
Then we create an instance of the &amp;lt;tt&amp;gt;MyTextChannelHandler&amp;lt;/tt&amp;gt; (which is our implementation of the &amp;lt;tt&amp;gt;Decibel::ChannelHandler&amp;lt;/tt&amp;gt; interface).&lt;br /&gt;
&lt;br /&gt;
Before registering any of the DBus interfaces for our app, it is necessary to call &amp;lt;tt&amp;gt;Decibe::registerTypes()&amp;lt;/tt&amp;gt; to set up the types used by Decibel.&lt;br /&gt;
&lt;br /&gt;
Next we register our application as a DBus service, and a &amp;lt;tt&amp;gt;TextChannelHandler&amp;lt;/tt&amp;gt; so that decibel can communicate with it and can pass incoming TextChannels to it.&lt;br /&gt;
&lt;br /&gt;
Finally, we start the application event-loop.&lt;br /&gt;
&lt;br /&gt;
==The .component File==&lt;br /&gt;
Since we want Decibel to pass incoming channels to our application, we need to tell it that our program exists. We do this by creating a &amp;lt;tt&amp;gt;.component&amp;lt;/tt&amp;gt; file. A component file is a simple &amp;lt;tt&amp;gt;.ini&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;.desktop&amp;lt;/tt&amp;gt; style file.&lt;br /&gt;
&lt;br /&gt;
The contents of our demo application's &amp;lt;tt&amp;gt;.component&amp;lt;/tt&amp;gt; file are as follows.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Component]&lt;br /&gt;
Name=Simpleclient&lt;br /&gt;
Protocols=&lt;br /&gt;
Types=0&lt;br /&gt;
Targets=&lt;br /&gt;
Service%20Name=org.kde.SimpleClient&lt;br /&gt;
Object%20Path=/TextChannelHandler&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only group in this file is the &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[Component]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; group. It contains a series of keys identifying our application to Decibel and detailing the funcionality it supports.&lt;br /&gt;
&lt;br /&gt;
In this example, the important keys are the &amp;lt;tt&amp;gt;Service%20Name&amp;lt;/tt&amp;gt; which tells Decibel the dbus name of our application, and the &amp;lt;tt&amp;gt;Object%20Path&amp;lt;/tt&amp;gt; which tells Decibel the dbus object path that should be called on our application.&lt;br /&gt;
&lt;br /&gt;
==The .service File==&lt;br /&gt;
In order to have dbus automatically start our application when Decibel tries to communicate with it, we must create a &amp;lt;tt&amp;gt;.service&amp;lt;/tt&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[D-BUS Service]&lt;br /&gt;
Name=org.kde.SimpleClient&lt;br /&gt;
Exec=@INSTALL_DIR@/decibel_simpleclient_demo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
This is a standard dbus autostart file. It contains the dbus name of our application and the absolute path to it. &amp;lt;tt&amp;gt;@INSTALL_DIR&amp;lt;/tt&amp;gt; will be replaced automatically by the installation directory using cmake in the next step.&lt;br /&gt;
&lt;br /&gt;
==CMakeLists.txt==&lt;br /&gt;
Since this example program is built as part of the main Decibel sources, I will not explain here how to create a standalone &amp;lt;tt&amp;gt;CMakeLists.txt&amp;lt;/tt&amp;gt; file to build it, but will instead explain the important parts of the &amp;lt;tt&amp;gt;CMakeLists.txt&amp;lt;/tt&amp;gt; file as found in the Decibel sources for this subdirectory. For more information on how &amp;lt;tt&amp;gt;CMakeLists.txt&amp;lt;/tt&amp;gt; files work, please see the [[Development/Tutorials/CMake|Introduction to cmake]] tutorial.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
SET(QT_DONT_USE_QTGUI &amp;quot;YES&amp;quot;)&lt;br /&gt;
INCLUDE(${QT_USE_FILE})&lt;br /&gt;
&lt;br /&gt;
SET(SERVICE_FILE &amp;quot;org.kde.SimpleClient.service&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include&lt;br /&gt;
                    ${CMAKE_BINARY_DIR}/src/client&lt;br /&gt;
                    ${CMAKE_SOURCE_DIR}/src/client&lt;br /&gt;
                    ${QT_QTCORE_INCLUDE_DIR}&lt;br /&gt;
                    ${TELEPATHY_QT_INCLUDE_DIR}&lt;br /&gt;
                    ${TAPIOCA_QT_INCLUDE_DIR}&lt;br /&gt;
                    ${CMAKE_CURRENT_BINARY_DIR}&lt;br /&gt;
                    ${CMAKE_CURRENT_SOURCE_DIR}&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
CONFIGURE_FILE(&amp;quot;${CMAKE_CURRENT_SOURCE_DIR}/${SERVICE_FILE}.cmake&amp;quot;&lt;br /&gt;
               &amp;quot;${CMAKE_CURRENT_BINARY_DIR}/${SERVICE_FILE}&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;CONFIGURE_FILE&amp;lt;/tt&amp;gt; line above tells cmake tp fill in the variable to the &amp;lt;tt&amp;gt;.service.cmake&amp;lt;/tt&amp;gt; file we previously created.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
# ######### simpleclient demo #########&lt;br /&gt;
&lt;br /&gt;
SET(simpleclient_SRCS&lt;br /&gt;
    simpleclient.cpp&lt;br /&gt;
    mytextchannelhandler.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
SET(simpleclient_MOC_HDRS&lt;br /&gt;
    mytextchannelhandler.h&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
QT4_WRAP_CPP(simpleclient_MOC_SRCS ${simpleclient_MOC_HDRS})&lt;br /&gt;
&lt;br /&gt;
ADD_EXECUTABLE(decibel_simpleclient_demo ${simpleclient_SRCS}&lt;br /&gt;
               ${simpleclient_MOC_SRCS}&lt;br /&gt;
)&lt;br /&gt;
TARGET_LINK_LIBRARIES(decibel_simpleclient_demo&lt;br /&gt;
                      ${QT_LIBRARIES}&lt;br /&gt;
                      ${TAPIOCA_QT_LIBRARIES}&lt;br /&gt;
                      decibel&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
INSTALL(TARGETS decibel_simpleclient_demo DESTINATION ${DEMO_INSTALL_DIR})&lt;br /&gt;
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SERVICE_FILE}&lt;br /&gt;
        DESTINATION ${DBUS_SERVICES_INSTALL_DIR}&lt;br /&gt;
)&lt;br /&gt;
INSTALL(FILES org.kde.SimpleClient.TextChannel.component&lt;br /&gt;
        DESTINATION ${COMPONENT_SEARCH_DIR}&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Running our Application==&lt;br /&gt;
In this tutorial, we have only looked at the important parts of the code of this application. The easiest way to build a working example from this tutorial is to check out the Decibel source code from the KDE SVN repository. The &amp;lt;tt&amp;gt;simpleclient&amp;lt;/tt&amp;gt; demo which this tutorial explains will be built and installed automatically along with the rest of Decibel.&lt;br /&gt;
&lt;br /&gt;
To see it working, you need to register an account with Decibel and bring it online. For information on how to do this, please see [[Development/Tutorials/Decibel/GettingStarted|Getting Started with Decibel]]. Then you should use another instant messaging program to send the message &amp;lt;tt&amp;gt;ping?&amp;lt;/tt&amp;gt; to that account. The &amp;lt;tt&amp;gt;simpleclient&amp;lt;/tt&amp;gt; demo will reply with the message &amp;lt;tt&amp;gt;pong!&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/KDE_System_Administration/PlasmaDesktopScripting</id>
		<title>KDE System Administration/PlasmaDesktopScripting</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/KDE_System_Administration/PlasmaDesktopScripting"/>
				<updated>2011-06-30T11:32:52Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ECMA Script Interaction With Plasma Shells ==&lt;br /&gt;
&lt;br /&gt;
It is possible to control and interact with a Plasma user interface shell such as a plasma-desktop or (starting in KDE SC 4.5) plasma-netbook session using ECMA Script (aka JavaScript). This scripting mechanism exposes containments (Desktop Activities and Panels), widgets and various other aspects of plasma-desktop configuration using the widely known and used ECMA Script language. The QtScript engine is used for the runtime environment.&lt;br /&gt;
&lt;br /&gt;
This document describes the API that is provided along with how to&lt;br /&gt;
run such scripts in plasma-desktop.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
A set of examples can be found [https://projects.kde.org/projects/kde/kdeexamples/repository/revisions/master/show/plasma/javascript/plasma-shell-scripting here] that demonstrate the use of various aspects of Plasma shell scripting.&lt;br /&gt;
&lt;br /&gt;
Contributions of additional examples are welcome and an be sent to the Plasma development mailing list (plasma-devel at kde.org) for inclusion if you do not have commit rights to the kdeexamples module.&lt;br /&gt;
&lt;br /&gt;
== Running Scripts ==&lt;br /&gt;
There are three ways that scripts can be executed in plasma-desktop:&lt;br /&gt;
&lt;br /&gt;
* '''on first run''': when plasma-desktop is started without any pre-existing configuration, any scripts in $APPDATA/plasma-desktop/init/ with a &amp;quot;.js&amp;quot; suffix are run. If there is more than one script, they are run sequentially in the alphabetical order of the file names.&lt;br /&gt;
&lt;br /&gt;
{{note|For security reasons, scripts located in the user's home directory will '''not''' be run during this phase.}}&lt;br /&gt;
&lt;br /&gt;
* '''on update''': when plasma-desktop is started, it will check in&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
`kde4-config --path data`/plasma-desktop/updates/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
with a &amp;quot;.js&amp;quot; suffix for scripts that have not yet been run. If there is more than one script which has not been run yet they will be executed serially in the alphabetical order of the file names.&lt;br /&gt;
&lt;br /&gt;
A record of which update scripts have been run is kept in the application's config file in the [Updates] group. This means that if the plasma-desktop configuraiton file is removed, all the update scripts will be run again.&lt;br /&gt;
&lt;br /&gt;
{{note|For security reasons, scripts located in the user's home directory will '''not''' be run during this phase.}}&lt;br /&gt;
&lt;br /&gt;
* '''interactively''': an interactive scripting dialog can be requested either via the KRunner window (Alt+F2, by default, or via the &amp;quot;Run Command&amp;quot; entry in various desktop menus) by entering &amp;quot;desktop console&amp;quot; as the search term. It can also be triggered directly via dbus with &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;qdbus org.kde.plasma-desktop /MainApplication showInteractiveConsole&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|This method is not available for plasma-netbook.}}&lt;br /&gt;
&lt;br /&gt;
:ECMA Script may be entered directly into this window for execution and output appears in the lower half of the window. Ctrl+E is a shortcut to run scripts, and scripts can be saved to and loaded from disk.&lt;br /&gt;
&lt;br /&gt;
:Scripts from files can also be loaded using KRunner with &amp;quot;desktop console /path/to/file&amp;quot; or via dbus with&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;qdbus org.kde.plasma-desktop /MainApplication loadScriptInInteractiveConsole /path/to/file&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Templates ==&lt;br /&gt;
&lt;br /&gt;
Templates are named packages that contain scripts. This provides a way for common functionality to be easily reused, helping to increase consistency and lower maintenance costs. Templates can be loaded from other scripts by name and they are also used to populate some parts of the user interface, such as the entries in the Add Panels menu.&lt;br /&gt;
&lt;br /&gt;
A template is a small set of files in a specified file hierarchy (or, in Plasma terms, a &amp;quot;Package&amp;quot;). In particular, a Template package contains the following files:&lt;br /&gt;
&lt;br /&gt;
* metadata.desktop: a .desktop file describing the template&lt;br /&gt;
* contents/layout.js: a Javascript file containing the actual script&lt;br /&gt;
&lt;br /&gt;
Templates are stored under share/apps/plasma/layout-templates and may be installed using `plasmapkg -t layout-template -i /path/to/package`. Template packages may also be provided as a .zip file with a .plasmalayout suffix.&lt;br /&gt;
&lt;br /&gt;
The metadata.desktop file contains the usual .desktop entries such as Name and Icon but must also contain Type=Service and ServiceTypes=Plasma/LayoutTemplate entries. If the layout is specific to a given Plasma application, such as plasma-desktop, this can be specific using X-Plasma-Shell. X-Plasma-ContainmentCategories defines what kind of layout it is with possible values being panel and desktop. Finally a X-KDE-PluginInfo-Name entry is required to provide a globally unique internal name for the Template. Here is an example of a Template that provides a Panel layout for Plasma Netbook:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Encoding=UTF-8&lt;br /&gt;
Name=Cool Panel&lt;br /&gt;
Type=Service&lt;br /&gt;
ServiceTypes=Plasma/LayoutTemplate&lt;br /&gt;
X-Plasma-Shell=plasma-netbook&lt;br /&gt;
X-Plasma-ContainmentCategories=panel&lt;br /&gt;
X-KDE-PluginInfo-Author=Aaron Seigo&lt;br /&gt;
X-KDE-PluginInfo-Email=aseigo@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.CoolNetbookPanel&lt;br /&gt;
X-KDE-PluginInfo-Version=1.0&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When running a template, two global variables will be accessible in read-only mode: templateName and templateComment. They will contain the Name and Comment fields of the above desktop file, and are translated if a localization is available.&lt;br /&gt;
&lt;br /&gt;
=== Examples of Usage ===&lt;br /&gt;
&lt;br /&gt;
==== Creating panels ====&lt;br /&gt;
A good example of the use of templates is the use case that triggered the creation of this feature: the desire to make it easy for users to re-create the default panel that is created on first start. There is a Template called org.kde.plasma-desktop.defaultPanel that ships with the KDE Plasma Workspace which contains the layout for the initial default panel. This is referenced by the default Plasma Desktop init script and, because it is marked as a Panel Template in the metadata.desktop file it also shows up to the user in the Add Panels menu. When selected by the user from the menu, the exact same panel that is created on desktop start up is created for them, complete with Plasma Widgets and configuration.&lt;br /&gt;
&lt;br /&gt;
==== Automating tasks ====&lt;br /&gt;
Another example of the usefulness of templates is the &amp;quot;Find Widgets&amp;quot; template. This template, which first shipped with Plasma Desktop v4.5, provides a function for finding widgets by name. It appears in the toolbar &amp;quot;Load&amp;quot; and &amp;quot;Use&amp;quot; menus in the Desktop Console in plasma-desktop, and makes finding widgets as simple as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var template = loadTemplate('org.kde.plasma-desktop.findWidgets')&lt;br /&gt;
template.findWidgets('systemtray')&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Activity templates ====&lt;br /&gt;
Probably the most user visible use of templates are &amp;quot;Activity templates&amp;quot;. The structure of Activity templates is similar to the other use of templates, but a few extra features are provided in the metadata.desktop file. Here is an example of such an activity template:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Encoding=UTF-8&lt;br /&gt;
Name=Cool Activity Template&lt;br /&gt;
Icon=user-desktop&lt;br /&gt;
Type=Service&lt;br /&gt;
ServiceTypes=Plasma/LayoutTemplate&lt;br /&gt;
X-Plasma-Shell=plasma-desktop&lt;br /&gt;
X-Plasma-ContainmentCategories=desktop&lt;br /&gt;
X-Plasma-ContainmentLayout-ExecuteOnCreation=dolphin $desktop, gwenview $pictures&lt;br /&gt;
X-Plasma-ContainmentLayout-ShowAsExisting=true&lt;br /&gt;
X-KDE-PluginInfo-Author=John Doe&lt;br /&gt;
X-KDE-PluginInfo-Email=john@doe.org&lt;br /&gt;
X-KDE-PluginInfo-Name=org.kde.plasma-desktop.CoolTemplate&lt;br /&gt;
X-KDE-PluginInfo-Version=1.0&lt;br /&gt;
X-KDE-PluginInfo-Website=http://john.doe.org&lt;br /&gt;
X-KDE-PluginInfo-Category=&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The layout itself is still created from the layout.js file as usual, but this template also shows as a precreated activity to the user thanks to the &amp;lt;tt&amp;gt;X-Plasma-ContainmentLayout-ShowAsExisting&amp;lt;/tt&amp;gt; key. Additionally, it starts applications in the newly created activity using the &amp;lt;tt&amp;gt;X-Plasma-ContainmentLayout-ExecuteOnCreation&amp;lt;/tt&amp;gt; key.&lt;br /&gt;
&lt;br /&gt;
That key is a list of commands to execute, and it supports the following variables:&lt;br /&gt;
* $desktop&lt;br /&gt;
* $autostart&lt;br /&gt;
* $documents&lt;br /&gt;
* $music&lt;br /&gt;
* $video&lt;br /&gt;
* $downloads&lt;br /&gt;
* $pictures&lt;br /&gt;
&lt;br /&gt;
They all expand into the path toward the user corresponding default folder.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
In addition to the normal ECMA Script API and the Qt-specific extensions (such as signal/slot support) provided by QtScript, the following API is provided for use by scripts.&lt;br /&gt;
&lt;br /&gt;
All of the API below, unless otherwise noted with a version noticed, appear as below in the KDE Software Compilation v4.4.0 and later. API that is not noted as being part of a given class or object is part of the global namespace.&lt;br /&gt;
&lt;br /&gt;
{{note|API compatibility is guaranteed from version to version starting with KDE Software Compilation v4.4.0.}}&lt;br /&gt;
&lt;br /&gt;
=== Version Numbers ===&lt;br /&gt;
&lt;br /&gt;
Starting with KDE SC 4.5, the version number of both the scripting API and the application is available to the script via the following read-only properties:&lt;br /&gt;
&lt;br /&gt;
* ''String'' '''applicationVersion''': the version of the application, e.g. 0.3&lt;br /&gt;
* ''String'' '''platformVersion''': the version of the KDE Platform, e.g. 0.3&lt;br /&gt;
* ''number'' '''scriptingVersion''': the version of the scripting API; e.g. in KDE SC 4.5 this is 2&lt;br /&gt;
&lt;br /&gt;
=== Activities ===&lt;br /&gt;
Activities are the desktop layer in a plasma-desktop session and may contain widgts. In sightly more technical terms, they are desktop containments. Activities can be created, enumerated, modified and destroyed.&lt;br /&gt;
&lt;br /&gt;
New Activities can be created using the Activity constructor, like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var activity = new Activity(&amp;quot;folderview&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The string passed into the constructor maps to the X-KDE-PluginInfo-Name= entry&lt;br /&gt;
in the plugin's .desktop file). See the documentation on the Containment object class below.&lt;br /&gt;
&lt;br /&gt;
Read-only properties:&lt;br /&gt;
* ''Array[number]'' '''activityIds''': returns a list of integer ids of all existing Plasma activities&lt;br /&gt;
* ''Array[String]'' '''knownActivityTypes''':  (scripting version &amp;gt;= 2) a list of types of activities that can be created. This is useful to check if an Activity type is available on the system before trying to construct one.&lt;br /&gt;
&lt;br /&gt;
Functions:&lt;br /&gt;
* ''Activity'' '''activityById(number id)''': return an object representing the activity with the given id&lt;br /&gt;
* ''Activity'' '''activityForScreen(number screen[, number dekstop])''': returns an object representing the activity  currently associated with the given screen and, optionally, the given desktop.&lt;br /&gt;
* ''Array[Activity]'' '''activities()''': returns an array of all activities that currently exist&lt;br /&gt;
&lt;br /&gt;
=== Panels ===&lt;br /&gt;
Panels can be created, enumerated, modified and destroyed. A panel object combines both a containment as well as the container itself, allowing for full control of things such as where it appears on screen and the hiding features associated with them.&lt;br /&gt;
&lt;br /&gt;
New Panels can be created using the Panel constructor, like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var panel = new Panel(&amp;quot;dock&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The string passed into the constructor maps to the X-KDE-PluginInfo-Name= entry&lt;br /&gt;
in the plugin's .desktop file).&lt;br /&gt;
&lt;br /&gt;
Read-only properties:&lt;br /&gt;
* ''Array[number]'' '''panelIds''': returns a list of integer ids of all existing Plasma panels&lt;br /&gt;
* ''Array[String]'' '''knownPanelTypes''':  (scripting version &amp;gt;= 2) a list of types of panels that can be created. This is useful to check if a Panel type is available on the system before trying to construct one.&lt;br /&gt;
&lt;br /&gt;
Functions:&lt;br /&gt;
* ''Panel'' '''panelById(int id)''': returns an object representing the Panel that matches the given id&lt;br /&gt;
* ''Array[Panels]'' '''panels()''': returns an array of all panels that currently exist&lt;br /&gt;
&lt;br /&gt;
=== Activities and Panels ===&lt;br /&gt;
Activity and Panel objects, once created by the script, or as returned by activityById, activityForScreen,&lt;br /&gt;
or panelById) provide the following read-only properties:&lt;br /&gt;
&lt;br /&gt;
* ''number'' '''id: the integer id of this activity&lt;br /&gt;
* ''String'' '''formFactor''': returns the form factor of the activity, e.g. &amp;quot;planar&amp;quot; for most desktop activities,&amp;quot;mediacenter&amp;quot; for media centers and either &amp;quot;horizontal&amp;quot; or &amp;quot;vertical&amp;quot; for panels.&lt;br /&gt;
* ''Array[number]'' '''widgetIds''': a list of integer ids of all the widgets in this Activity&lt;br /&gt;
* ''Array[String]'' '''configKeys''':  (scriptingVersion &amp;gt;= 2) a list of all keys that are set in the current configuration group&lt;br /&gt;
* ''Array[String]'' '''configGroups''': (scriptingVersion &amp;gt;= 2)  a list of all the groups in the current configuration group&lt;br /&gt;
* ''Array[String]'' '''globalConfigKeys''':  (scriptingVersion &amp;gt;= 2) a list of all keys that are set in the current global configuration group&lt;br /&gt;
* ''Array[String]'' '''globalConfigGroups''': (scriptingVersion &amp;gt;= 2)  a list of all the groups in the current global configuration group&lt;br /&gt;
&lt;br /&gt;
as well as the following read/write properties:&lt;br /&gt;
&lt;br /&gt;
* ''number'' '''desktop''': the virtual desktop this activity is associated with, or -1 for none&lt;br /&gt;
* ''number'' '''screen''': the screen this activity is associated with, or -1 for none&lt;br /&gt;
* ''String'' '''name''': the name of this activity&lt;br /&gt;
* ''String'' '''wallpaperPlugin''': (scriptingVersion &amp;gt;= 2) the wallpaper plugin to use with the Activity&lt;br /&gt;
* ''String'' '''wallpaperMode''': (scriptingVersion &amp;gt;= 2) the wallpaper plugin mode to use with the Activity&lt;br /&gt;
* ''Array[String]'' '''currentConfigGroup''': (scriptingVersion &amp;gt;= 2) the current configuration group path, with each entry in the array representing a sub-group. This allows one to access trees of groups with code such as: widget.currentConfigGroup = new Array('topGroup', 'subGroupOfTopGroup'). An empty Array means the default (top-level) configuration group for the widget&lt;br /&gt;
* ''String'' '''version''': (scriptingVersion &amp;gt;= 2) the version of the Activity or Panel&lt;br /&gt;
&lt;br /&gt;
and the following methods:&lt;br /&gt;
&lt;br /&gt;
* '''remove()''': deletes this activity and all widgets inside of it&lt;br /&gt;
* ''Widget'' '''widgetById(number id)''': returns an object representing the widget with the given id&lt;br /&gt;
* ''Widget'' '''addWidget(String name)''': adds a new widget to the activity; the name maps to the &amp;lt;tt&amp;gt;X-KDE-PluginInfo-Name=&amp;lt;/tt&amp;gt; entry in the widget's .desktop file&lt;br /&gt;
* ''Widget'' '''addWidget(Widget widget)''': adds an existing widget to this activity; useful for moving widgets between Activities and Panels&lt;br /&gt;
* '''showConfigurationInteface()''': shows the configuration user interface for this Activity or Panel on the screen&lt;br /&gt;
* '''readConfig(String key, any default)''': (scriptingVersion &amp;gt;= 2) reads the value of key in the config with default for the default value&lt;br /&gt;
* '''writeConfig(String key, any value)''': (scriptingVersion &amp;gt;= 2) sets key to value in the config&lt;br /&gt;
* '''readGlobalConfig(String key, any default)''': (scriptingVersion &amp;gt;= 2) reads the value of key in the global config with default for the default value&lt;br /&gt;
* '''writeGlobalConfig(String key, any value)''': (scriptingVersion &amp;gt;= 2) sets key to value in the global config&lt;br /&gt;
* '''reloadConfig()''': (scriptingVersion &amp;gt;= 2) causes the Activity or Panel to reload its configuration; reaction to configuration changes made using readConfig are usually activated on script exit, but this can be triggered earlier on a per-widget basis using this method&lt;br /&gt;
* ''Array[String]'' '''currentGlobalConfigGroup''': (scriptingVersion &amp;gt;= 2)  the current global configuration group path, with each entry in the array representing a sub-group, similar to currentConfigGroup. However, global configuration is shared by all instances of panels and activities of the same type.&lt;br /&gt;
* ''Array[Widget]'' '''widgets([String type])''': (scriptingVersion &amp;gt;= 2) returns all the widgets in the Panel or Activity. If the optional type is specified, only widgets matching that type will be returned.&lt;br /&gt;
&lt;br /&gt;
In addition to all of the above properties and functions, Panel objects also provide the folowing read/write properties:&lt;br /&gt;
* ''number'' '''length''': the number of pixels along the screen edge used&lt;br /&gt;
* ''number'' '''height''': the height (or for vertical panels, the width) of the panel&lt;br /&gt;
* ''String'' '''hiding''': the hiding mode of the panel, one of &amp;quot;none&amp;quot; (for no hiding), &amp;quot;autohide&amp;quot;, &amp;quot;windowscover&amp;quot; or &amp;quot;windowsbelow&amp;quot;&lt;br /&gt;
* ''String'' '''alignment''': right, left or center alignment of the panel (for vertical panels, right corrsponds to top and left to bottom)&lt;br /&gt;
* ''String'' '''location''': returns the location of the activity (only relevant for Panels); valid values include &amp;quot;top&amp;quot;, &amp;quot;bottom&amp;quot;, &amp;quot;left&amp;quot;, &amp;quot;right&amp;quot; and &amp;quot;floating&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Widgets ===&lt;br /&gt;
Widgets may be enumerated by calling the widgetIds property on a Activity or Panel object. With a widget id in hand, a Widget object can be retrieved by calling widgetById(id) on an Activity or Panel object. New Widgets can be created with add addWidget(String) function provided by Activity and Panel objects.&lt;br /&gt;
&lt;br /&gt;
A list of all installed widget types can be retrieved the following read-only property:&lt;br /&gt;
&lt;br /&gt;
* ''Array[String]'' '''knownWidgetTypes''' (scripting version &amp;gt;= 2)&lt;br /&gt;
&lt;br /&gt;
A Widget object provides the following read-only properties:&lt;br /&gt;
&lt;br /&gt;
* ''number'' '''id''': the id of the widget&lt;br /&gt;
* ''String'' '''type''': the plugin type of this widget&lt;br /&gt;
* ''Array[String]'' '''configKeys''': a list of all keys that are set in the current configuration&lt;br /&gt;
* ''Array[String]'' '''configGroups''': a list of all the groups in the current configuration&lt;br /&gt;
* ''Array[String]'' '''globalConfigKeys''':  (scriptingVersion &amp;gt;= 2) a list of all keys that are set in the current global configuration group&lt;br /&gt;
* ''Array[String]'' '''globalConfigGroups''': (scriptingVersion &amp;gt;= 2)  a list of all the groups in the current global configuration group&lt;br /&gt;
* ''String'' '''version''': (scriptingVersion &amp;gt;= 2) the version of the Activity or Panel&lt;br /&gt;
&lt;br /&gt;
as well as the following read-write properties:&lt;br /&gt;
&lt;br /&gt;
* ''Array[String]'' '''currentConfigGroup''': the current configuration group path, with each entry in the array representing a sub-group. This allows one to access trees of groups with code such as: widget.currentConfigGroup = new Array('topGroup', 'subGroupOfTopGroup'). An empty Array means the default (top-level) configuration group for the widget&lt;br /&gt;
* ''Array[String]'' '''currentGlobalConfigGroup''': (scriptingVersion &amp;gt;= 2)  the current global configuration group path, with each entry in the array representing a sub-group, similar to currentConfigGroup. However, global configuration is shared by all instances of widgets of the same type.&lt;br /&gt;
* ''QRectF'' '''geometry''': the geometry of the widget (settable)&lt;br /&gt;
* ''String'' '''globalShortcut''': the shortcut sequence (in the format used by QKeySequence, e.g. &amp;quot;Alt+F1&amp;quot;) associated with this widget&lt;br /&gt;
* ''number'' '''index''': the layout index of the widget; in a Panel this corresponds to the order the widget appears in. Changing the value of the index will change the position of the widget in Panels and may do so in some Activities as well.&lt;br /&gt;
&lt;br /&gt;
and the following methods:&lt;br /&gt;
&lt;br /&gt;
* '''remove()''': deletes this widget&lt;br /&gt;
* '''readConfig(String key, any default)''': reads the value of key in the config with default for the default value&lt;br /&gt;
* '''writeConfig(String key, any value)''': sets key to value in the config&lt;br /&gt;
* '''readGlobalConfig(String key, any default)''': (scriptingVersion &amp;gt;= 2) reads the value of key in the global config with default for the default value&lt;br /&gt;
* '''writeGlobalConfig(String key, any value)''': (scriptingVersion &amp;gt;= 2) sets key to value in the global config&lt;br /&gt;
* '''reloadConfig()''': causes the widget to reload its configuration; reaction to configuration changes made using readConfig are usually activated on script exit, but this can be triggered earlier on a per-widget basis using this method&lt;br /&gt;
* '''showConfigurationInteface()''': shows the configuration user interface for this widget on the screen&lt;br /&gt;
&lt;br /&gt;
=== Screen Geometry ===&lt;br /&gt;
Read-only properties:&lt;br /&gt;
* ''number'' '''screenCount''': returns the number of screens connected to the computer&lt;br /&gt;
&lt;br /&gt;
Functions:&lt;br /&gt;
* ''QRectF'' '''screenGeometry(number screen)''': returns a rect object representing the geometry of a screen&lt;br /&gt;
&lt;br /&gt;
=== Wallpaper Plugins ===&lt;br /&gt;
&lt;br /&gt;
* ''Array[String =&amp;gt; Array[String]]'' '''knownWallpaperPlugins()''': (scripting version &amp;gt;= 4) returns a list of all installed wallpaper plugins. They keys of the array are the wallpaper plugin names. The values are arrays containing the modes available for that wallpaper plugin. The mode array may be empty, as most wallpaper plugins only offer one mode.&lt;br /&gt;
&lt;br /&gt;
=== Locating Applications and Paths ===&lt;br /&gt;
* ''boolean'' '''applicationExists(String name)''': (scripting version &amp;gt;= 4) searches $PATH first, then tries in the application menu system by application storage name (aka the .desktop file name), then Name= entries for apps with installed .desktop files, then GenericName= entries for same&lt;br /&gt;
* ''mixed'' '''defaultApplication(String kind [, boolean storageId = false])''': (scripting version &amp;gt;= 4) returns the executable (or if storageId is true, then the app menu system id, e.g. its .desktop file name) of the default app. The &amp;quot;kind&amp;quot; parameter may be a well-known application type including &amp;quot;browser&amp;quot;, &amp;quot;mailer&amp;quot;, &amp;quot;filemanager&amp;quot;, &amp;quot;terminal&amp;quot;, &amp;quot;imClient&amp;quot; and &amp;quot;windowmanager&amp;quot; (or any other entry in share/apps/kcm_componentchooser/kcm_*.desktop); it may also be a mimetype (e.g. &amp;quot;application/pdf&amp;quot;). On failure, it returns false.&lt;br /&gt;
* ''String'' '''applicationPath(String name)''':  (scripting version &amp;gt;= 4) returns the full local path to a given application or .desktop file if it exists.&lt;br /&gt;
* ''String'' '''userDataPath([String type, String path])''':  (scripting version &amp;gt;= 4) returns the default path for user data. Called with no parameters, it returns the user's home directory. If only one string is passed in, the standard directory for that type of data in the user's home directory will be located; the following values are recognized:&lt;br /&gt;
** documents&lt;br /&gt;
** music&lt;br /&gt;
** video&lt;br /&gt;
** downloads&lt;br /&gt;
** pictures&lt;br /&gt;
** autostart&lt;br /&gt;
** desktop (should be considered deprecated for Plasma workspaces)&lt;br /&gt;
&lt;br /&gt;
If a second string is passed in, it is considered a request for a specific path and the following types are recognized:&lt;br /&gt;
** apps - Applications menu (.desktop files).&lt;br /&gt;
** autostart - Autostart directories (both XDG and kde-specific)&lt;br /&gt;
** cache - Cached information (e.g. favicons, web-pages)&lt;br /&gt;
** cgi - CGIs to run from kdehelp.&lt;br /&gt;
** config - Configuration files.&lt;br /&gt;
** data - Where applications store data.&lt;br /&gt;
** emoticons - Emoticons themes&lt;br /&gt;
** exe - Executables in $prefix/bin. findExe() for a function that takes $PATH into account.&lt;br /&gt;
** html - HTML documentation.&lt;br /&gt;
** icon - Icons, see KIconLoader.&lt;br /&gt;
** kcfg - KConfigXT config files.&lt;br /&gt;
** lib - Libraries.&lt;br /&gt;
** locale - Translation files for KLocale.&lt;br /&gt;
** mime - Mime types defined by KDE-specific .desktop files.&lt;br /&gt;
** module - Module (dynamically loaded library).&lt;br /&gt;
** qtplugins - Qt plugins (dynamically loaded objects for Qt)&lt;br /&gt;
** services - Services.&lt;br /&gt;
** servicetypes - Service types.&lt;br /&gt;
** sound - Application sounds.&lt;br /&gt;
** templates - Templates for the &amp;quot;Create new file&amp;quot; functionality.&lt;br /&gt;
** wallpaper - Wallpapers.&lt;br /&gt;
** tmp - Temporary files (specific for both current host and current user)&lt;br /&gt;
** socket - UNIX Sockets (specific for both current host and current user)&lt;br /&gt;
** xdgconf-menu - Freedesktop.org standard location for menu layout (.menu) files.&lt;br /&gt;
** xdgdata-apps - Freedesktop.org standard location for application desktop files.&lt;br /&gt;
** xdgdata-dirs - Freedesktop.org standard location for menu descriptions (.directory files).&lt;br /&gt;
** xdgdata-mime - Freedesktop.org standard location for MIME type definitions.&lt;br /&gt;
** xdgdata-icon - Freedesktop.org standard location for icons.&lt;br /&gt;
** xdgdata-pixmap - Gnome-compatibility location for pixmaps.&lt;br /&gt;
&lt;br /&gt;
The second parameter should be a specific resource to find the path to. An example might be userDataPath(&amp;quot;data&amp;quot;, &amp;quot;plasma-desktop&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Misc. Global Properties and Functions ===&lt;br /&gt;
Read-write properties:&lt;br /&gt;
* ''boolean'' '''locked''': whether the desktop shell and widgets are locked or not (settable)&lt;br /&gt;
* ''string'' '''theme''': (scripting version &amp;gt;= 3) the name of the desktop theme to use for the interface, e.g. default, Air, Oxygen, etc.&lt;br /&gt;
&lt;br /&gt;
Read-only properties:&lt;br /&gt;
* ''boolean'' '''hasBattery''': whether or not the system has the ability to run on battery power, e.g. a laptop or mobile device&lt;br /&gt;
* ''boolean'' '''multihead''': (scripting version &amp;gt;= 3) true if the system is running with multiple screens in a &amp;quot;Xaphod&amp;quot; multiple display server configuration&lt;br /&gt;
* ''int'' '''multiheadScreen''': (scripting version &amp;gt;= 3) if multihead is true, contains the (real) screen id of the current screen&lt;br /&gt;
&lt;br /&gt;
Functions:&lt;br /&gt;
* '''sleep(number ms)''': sleeps the script for the specified number of millseconds&lt;br /&gt;
&lt;br /&gt;
=== QRectF ===&lt;br /&gt;
A rectangle class is also provided for use with Widget, Panel and screen geometry properties and functions.&lt;br /&gt;
&lt;br /&gt;
Read-only properites:&lt;br /&gt;
* ''boolean'' '''empty''': true if the rectangle's width or height is less than, or equal to, 0; an empty rectangle is also invalid&lt;br /&gt;
* ''boolean'' '''null''': true if the rectangle has both the width and the height set to 0; a null rectangle is also empty and not valid&lt;br /&gt;
* ''boolean'' '''valid''':  true if the rectangle has a width &amp;gt; 0 and height 0.&lt;br /&gt;
&lt;br /&gt;
Read-write properties:&lt;br /&gt;
* ''number'' '''left'''&lt;br /&gt;
* ''number'' '''top'''&lt;br /&gt;
* ''number'' '''bottom'''&lt;br /&gt;
* ''number'' '''right'''&lt;br /&gt;
* ''number'' '''height'''&lt;br /&gt;
* ''number'' '''width'''&lt;br /&gt;
* ''number'' '''x'''&lt;br /&gt;
* ''number'' '''y'''&lt;br /&gt;
&lt;br /&gt;
Constructors:&lt;br /&gt;
* '''QRectF'''&lt;br /&gt;
* '''QRectF(number x, number y, number width, number height)''': Sets the coordinates of the rectangle's top-left corner to (x, y), and its size to the given width and height.&lt;br /&gt;
&lt;br /&gt;
Functions:&lt;br /&gt;
* '''adjust(number dx1, number dy1, number dx2, number dy2)''': adds dx1, dy1, dx2 and dy2 respectively to the existing coordinates of the rectangle&lt;br /&gt;
* ''QRectF'' '''adjusted(number dx1, number dy1, number dx2, number dy2)''': returns a new QRectF with dx1, dy1, dx2 and dy2 added respectively to the existing coordinates of the rectangle&lt;br /&gt;
* '''translate(number dx, number dy)''': translates the rect by dx, dy&lt;br /&gt;
* '''setCoords(number x1, number y1, number x2, number y2)''': sets the coordinates of the rectangle's top-left corner to (x1, y1), and the coordinates of its bottom-right corner to (x2, y2).&lt;br /&gt;
* '''setRect(number x, number y, number width, number height)''': sets the coordinates of the rectangle's top-left corner to (x, y), and its size to the given width and height.&lt;br /&gt;
* ''boolean'' '''contains(number x, number y)''': returns true if the rect contains the point (x, y)&lt;br /&gt;
* '''moveBottom(number delta)'': moves the bottom by delta pixels&lt;br /&gt;
* '''moveLeft(number delta)''': moves the left by delta pixels&lt;br /&gt;
* '''moveRight(number delta)''': moves the right by delta pixels&lt;br /&gt;
* '''moveTo(number x, number y)''': moves the top left of the rect to point (x, y)&lt;br /&gt;
* '''moveTop(number delta)''': moves the top by delta pixels&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration Keys ==&lt;br /&gt;
Here you find a list of commonly used configuration keys to use with the '''writeConfig''' command. Where the documentation notes that a key is in a subgroup, remember to first use '''currentConfigGroup'''.&lt;br /&gt;
&lt;br /&gt;
=== Common configuration keys ===&lt;br /&gt;
Here are some keys that can be used with all widgets:&lt;br /&gt;
&lt;br /&gt;
* '''Share''' (true/false): Whether or not the widget is to be announces throughout the network (Share tab)&lt;br /&gt;
&lt;br /&gt;
=== Common time and date keys ===&lt;br /&gt;
Most of the settings listed below apply to all widgets dealing with date and time (clock, digital-clock, binary-clock, …)&lt;br /&gt;
Settings for individual plasmoids can be found in their respective category and usually only affect the plasmoid’s appearance.&lt;br /&gt;
* '''announceInterval''' (number ≥ 0): Interval in minutes that the time is read out loud&lt;br /&gt;
* '''calendarType''' (local/coptic/ethopian/gregorian/gregorian-proleptic/hebrew/hijri/indian-national/jalali/japanese/julian/minguo/thai): Calendar system to be used, defaults to local&lt;br /&gt;
* '''defaultTimezone''' (Local/…): Time zone to be used&lt;br /&gt;
* '''displayHolidays''' (true/false): Whether holidays are to be displayed&lt;br /&gt;
* '''holidayRegions''' (tbd): tbd&lt;br /&gt;
* '''holidayRegionaDaysOff''' (tbd): tbd&lt;br /&gt;
* '''timeZones''' (Europe/Andorra,…): Comma-separated list of timezones to be used (e. g. Europe/Andorra,Indian/Antananarivo,Asia/Aqtau)&lt;br /&gt;
&lt;br /&gt;
=== Analog clock (clock) ===&lt;br /&gt;
* '''showSecondHand''' (true/false): self-explanatory&lt;br /&gt;
* '''showTimezoneString''' (true/false): self-explanatory&lt;br /&gt;
&lt;br /&gt;
=== Battery status (battery) ===&lt;br /&gt;
* '''showBatteryString''' (true/false): Whether or not battery status is shown as overlay for the battery icon (if in systemtray or panel)&lt;br /&gt;
* '''showMultipleBatteries''' (true/false): Whether or not battery status is shown for each battery separately&lt;br /&gt;
&lt;br /&gt;
=== Digital clock (digital-clock) ===&lt;br /&gt;
* '''plainClockColor''' (rrr,ggg,bbb): Color set for clock font (e. g. 192,0,0 - to be used with useCustomColor=true!)&lt;br /&gt;
* '''plainClockDrawShadow''' (true/false): Whether a shadow is to bed drawn (defaults to true)&lt;br /&gt;
* '''plainClockShadowColor''' (rrr,ggg,bbb): Color set for clock shadow (e. g. 64,97,128 - to be used with useCustomShadowColor=true!)&lt;br /&gt;
* '''plainClockFont''' (tbd): Font to be used for clock (e. g. Serif,12,-1,5,75,0,0,0,0,0)&lt;br /&gt;
* '''showDate''' (true/false): self-explanatory&lt;br /&gt;
* '''showDay''' (true/false): self-explanatory&lt;br /&gt;
* '''showSeconds''' (true/false): self-explanatory&lt;br /&gt;
* '''showTimezone''' (true/false): self-explanatory&lt;br /&gt;
* '''showYear''' (true/false): self-explanatory&lt;br /&gt;
* '''useCustomColor''' (true/false): Whether or not a custom color is to be used (use with plainClockColor=rrr,ggg,bbb!)&lt;br /&gt;
* '''useCustomShadowColor''' (true/false): Whether or not a custom shadow color is to be used (use with plainClockShadowColor=rrr,ggg,bbb!)&lt;br /&gt;
&lt;br /&gt;
=== Folderview (folderview) ===&lt;br /&gt;
* '''alignToGrid''' (true/false): self-explanatory&lt;br /&gt;
* '''customIconSize''' (16/22/24/32/48/…): Use custom icon size for files/folders (use only default/common icon sizes, powers of 2)&lt;br /&gt;
* '''customLabel''': Use custom title rather than default path or place name&lt;br /&gt;
* '''drawShadows''' (true/false): Whether or not file labels are to draw shadows&lt;br /&gt;
* '''filter''' (0/1/2): Defines whether a filter is to be used or not (0 = No filter, 1 = Show only matching files, 2 = Hide matching files)&lt;br /&gt;
* '''filterFiles''': Wildcard filter to filter file names&lt;br /&gt;
* '''mimeFilter''': Comma-separated list of mimetypes to be filtered (shown/hidden depends on filter-setting)&lt;br /&gt;
* '''iconsLocked''' (true/false): Whether or not icons can be moved&lt;br /&gt;
* '''numTextLines''' (number &amp;gt; 0): Amount of lines a file name can have before it is truncated&lt;br /&gt;
* '''url''': Folder URL to be displayed (e. g. desktop:/// or file:///home/yourusername)&lt;br /&gt;
* '''sortColumn''' (-1/0/1/2/3/4/5): The way files and folders are sorted (-1 = No sorting, 0 = By name, 1 = By size, 2 = By type, 3 = By date)&lt;br /&gt;
* '''sortDirsFirst''' (true/false): Whether or not folders are displayed before files (defaults to true)&lt;br /&gt;
* '''textColor''' (rrr,ggg,bbb): Color the icon labels will have&lt;br /&gt;
&lt;br /&gt;
=== Kickoff menu (launcher) ===&lt;br /&gt;
* '''SwitchTabsOnHover''' (true/false): self-explanatory&lt;br /&gt;
* '''ShowAppsByName''' (true/false): Apps are sorted by name rather than by description&lt;br /&gt;
&lt;br /&gt;
=== Pager (pager) ===&lt;br /&gt;
* '''displayedText''' (0/1/2): Text to be shown on individual virtual desktops (0 = Workspace number, 1 = Workspace title, 2 = None)&lt;br /&gt;
* '''ShowWindowIcons''' (true/false): Whether or not the application icon is to be shown on each individual window&lt;br /&gt;
* '''currentDesktopSelected''' (0/1/2): Defines what should happen if the user clicks on the virtual desktop that is currently active (0 = Nothing, 1 = Show Workspace, i. e. minimize windows, 2 = Show Dashboard)&lt;br /&gt;
* '''rows''' (number &amp;gt; 0): Amount of rows the pager should have. (Note: ''This is a global option, so you need to use '''writeGlobalConfig''' instead'')&lt;br /&gt;
&lt;br /&gt;
=== Notifications (notifications) ===&lt;br /&gt;
{{note|This applet is likely to be embedded to system tray. For Systrem Tray specific tasks, i. e. how to add, manage and remove plasmoids inside it, see sections below}}&lt;br /&gt;
* '''AutoHidePopup''' (true/false): Whether or not popups are to be hidden automatiaclly&lt;br /&gt;
* '''ShowJobs''' (true/false): Whether or not jobs are to be shown (e. g. file transfer progress)&lt;br /&gt;
* '''ShowNotifications''' (true/false): Whether or not notifications are to be shown&lt;br /&gt;
&lt;br /&gt;
=== Removable media notifier (notifier) ===&lt;br /&gt;
* '''ShowDevices''' (0/1/2): Defines what kind of devices are to be shown (0 = Removable media only, 1 = Non-removable media only, 2 = All)&lt;br /&gt;
{{note|Auto-mount settings and device actions are not stored in this Plasmoid’s settings.}}&lt;br /&gt;
&lt;br /&gt;
=== Taskbar (tasks) ===&lt;br /&gt;
* '''groupingStrategy''' (0/1/2): Defines how taskbar entries are to be grouped (0 = Never, 1 = Manually, 2 = By Program Name)&lt;br /&gt;
* '''groupWhenFull''' (true/false): Only group when taskbar is full (to be used with groupingStrategy=2 only!)&lt;br /&gt;
* '''highlightWindows''' (true/false): Highlight a window if your mouse cursor is hovering its taskbar entry (requires Desktop Compositing and “Highlight windows” effect enabled to work)&lt;br /&gt;
* '''maxRows''' (number &amp;gt; 0): Amount of rows taskbar entries can take&lt;br /&gt;
* '''forceRows''' (true/false): Force row setting for taskbar entries&lt;br /&gt;
* '''showOnlyCurrentActivity''' (true/false): Show only windows from current activity&lt;br /&gt;
* '''showOnlyCurrentDesktop''' (true/false): Show only windows from current virtual desktop&lt;br /&gt;
* '''showOnlyCurrentScreen''' (true/false): Show only windows from current screen (multi monitor setup)&lt;br /&gt;
* '''showTooltip''' (true/false): Whether or not tooltips are to be shown&lt;br /&gt;
* '''sortingStrategy''' (0/1/2/3): How taskbar entries are to be sorted (0 = Never, 1 = Manually, 2 = Alphabetically, 3 = By Desktop)&lt;br /&gt;
&lt;br /&gt;
=== System Tray ===&lt;br /&gt;
The System Tray has some unique behaviors since it can host widgets and configuring it is not as easy as most other widgets, particularly when adding and removing widgets. This section will help you deal with its specific behavior.&lt;br /&gt;
&lt;br /&gt;
==== Generic System Tray configuration keys ====&lt;br /&gt;
* '''DefaultAppletAdded''' (true/false): Remembers whether the default plasmoids (networkmanagement, device manager, notifications) have already been added(??)&lt;br /&gt;
* '''ShowApplicationStatus''' (true/false): Show system tray icons of applications that belong to the group “Applications”&lt;br /&gt;
* '''ShowCommunications''' (true/false): Show system tray icons of applications that belong to the group “Applications” (i. e. Messenger, IRC chat)&lt;br /&gt;
* '''ShowHardware''' (true/false): Show system tray icons of applications that belong to the group “Hardware” (i. e. volume control, printer applet)&lt;br /&gt;
* '''ShowSystemServices''' (true/false): Show system tray icons of applications that belong to the group “System Services” (i. e. Nepomuk Indexing Agent)&lt;br /&gt;
* '''ShowUnknown''' (true/false): Show system tray icons that do not belong into one of the categories mentioned above (or that do not use KDE’s system tray protocol and thus do not provide such information)&lt;br /&gt;
* '''alwaysShown''': Comma-separated list of widgets and entries that are to be shown all the time (e. g. KMix,notifier)&lt;br /&gt;
* '''hidden''': Comma-separated list of widgets and entries that are to be hidden all the time (e. g. Nepomuk Indexing Agent,Klipper,kmail)&lt;br /&gt;
{{note|Although notifications appear to be part of the System Tray, they are handled by a separate plasmoid which is embedded to the system tray. For its configuration keys, see section above}}&lt;br /&gt;
&lt;br /&gt;
==== Add a widget to systemtray ====&lt;br /&gt;
You can not add widgets to the systemtray in a similar way like you would add them to a panel or containment using addWidget. Instead, to add, manage and remove them, you need to utilize writeConfig changing the currentConfigGroup.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
systray = panel.addWidget(&amp;quot;systemtray&amp;quot;)	// First add a systemtray to your panel&lt;br /&gt;
systray.currentConfigGroup = Array(&amp;quot;Applets&amp;quot;,&amp;quot;0&amp;quot;) // then change the currentConfig Group&lt;br /&gt;
&lt;br /&gt;
// to the subnode [Applets][0]. Use any number you like(?)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can “create” the plasmoid by adding a “plugin” configuration entry&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
systray.writeConfig(&amp;quot;plugin&amp;quot;,&amp;quot;notifier&amp;quot;) // This will add a Device Notifier Plasmoid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can modify the plasmoid’s configuration by using writeConfig.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
systray.writeConfig(&amp;quot;property&amp;quot;,&amp;quot;value&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To change back to the top configuration level and thus edit the systemtray plasmoid itself pass an empty array to currentConfigGroup.&lt;br /&gt;
&lt;br /&gt;
==== Edit existing widgets in systemtray ====&lt;br /&gt;
&lt;br /&gt;
==== Remove a widget from systemtray ====&lt;br /&gt;
&lt;br /&gt;
To remove a widget, simply delete the corresponding configuration group.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/CheatSheet</id>
		<title>Development/Tutorials/Plasma/JavaScript/CheatSheet</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/CheatSheet"/>
				<updated>2011-06-30T11:18:54Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=JavaScript Plasmoids|&lt;br /&gt;
&lt;br /&gt;
name=Getting Data|&lt;br /&gt;
&lt;br /&gt;
name=JavaScript Plasmoid Cheat Sheet|&lt;br /&gt;
&lt;br /&gt;
pre=[[../DataEngine|Now Playing: Advanced DataEngine Usage Example]]|&lt;br /&gt;
&lt;br /&gt;
reading=[[../API|JavaScript Plasmoid API reference]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
&lt;br /&gt;
* Everything but the metadata.desktop file goes in a directory named &amp;lt;tt&amp;gt;contents&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;X-Plasma-MainScript&amp;lt;/tt&amp;gt; in the metadata.desktop file should point to the main script, relative to the contents directory&lt;br /&gt;
* &amp;lt;tt&amp;gt;X-Plasma-DefaultSize&amp;lt;/tt&amp;gt; in the metadata.desktop file specifies the default widget size in width,height format (eg: 200,100)&lt;br /&gt;
* &amp;lt;tt&amp;gt;plasmoidviewer&amp;lt;/tt&amp;gt; is an immensely useful tool&lt;br /&gt;
* To connect to a signal use &amp;lt;tt&amp;gt;object.signalName.connect(function() {});&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Enumeration values can be used like&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (plasmoid.formFactor() == Vertical) {&lt;br /&gt;
    layout.setOrientation(QtVertical);&lt;br /&gt;
} else {&lt;br /&gt;
    layout.setOrientation(QtHorizontal);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Global variables and functions ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;tt&amp;gt;plasmoid&amp;lt;/tt&amp;gt; variable contains all the main plasmoid functionality  and represents the main plasmoid widget, and corresponds to the &amp;lt;tt&amp;gt;Applet&amp;lt;/tt&amp;gt; class in C++&lt;br /&gt;
* The &amp;lt;tt&amp;gt;startupArguments&amp;lt;/tt&amp;gt; variable contains any arguments that were passed to the plasmoid when it was started (such as when the plasmoid is registered as a handler for a mimetype)&lt;br /&gt;
* The &amp;lt;tt&amp;gt;loadui&amp;lt;/tt&amp;gt; function can be used to load a Qt UI file.  Beware that a relative path is relative to plasma's working directory (in 4.2 at least), and so may not do what you want.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;print&amp;lt;/tt&amp;gt; function prints debug output&lt;br /&gt;
* There are several constructor methods:&lt;br /&gt;
** &amp;lt;tt&amp;gt;PlasmaSvg(file, parent)&amp;lt;/tt&amp;gt; constructs a &amp;lt;tt&amp;gt;Plasma::Svg&amp;lt;/tt&amp;gt;.  The second argument is optional.&lt;br /&gt;
** &amp;lt;tt&amp;gt;PlasmaFrameSvg(file, parent)&amp;lt;/tt&amp;gt; constructs a &amp;lt;tt&amp;gt;Plasma:FrameSvg&amp;lt;/tt&amp;gt;.  The second argument is optional.&lt;br /&gt;
** &amp;lt;tt&amp;gt;QPainter()&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;QGraphicsItem()&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;QTimer()&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;QFont()&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;QRectF()&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;QSizeF()&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;QPoint()&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;LinearLayout()&amp;lt;/tt&amp;gt; constructs a &amp;lt;tt&amp;gt;QGraphicsLinearLayout&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;Url()&amp;lt;/tt&amp;gt; constructs a &amp;lt;tt&amp;gt;KUrl&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Plus constructors for all the Plasma widgets (eg: &amp;lt;tt&amp;gt;IconWidget()&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Languages ==&lt;br /&gt;
&lt;br /&gt;
* The Name and Comment fields in the &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; file can be translated like &amp;lt;tt&amp;gt;Name[nl]=Hallo JavaScript&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;i18n()&amp;lt;/tt&amp;gt; takes a string (in English) as the first argument, and substitutes in the following arguments to replace %1, %2, %3 etc.  Eg: &amp;lt;tt&amp;gt;i18n(&amp;quot;The file is called %1&amp;quot;, fileName);&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;i18nc()&amp;lt;/tt&amp;gt; works just the same, but has an extra argument at the start that provides some context for translators.  Eg: &amp;lt;tt&amp;gt;i18nc(&amp;quot;Player name - score&amp;quot;, &amp;quot;%1 - %2&amp;quot;, playerName, score);&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;i18np()&amp;lt;/tt&amp;gt; is for cases where plural forms might be important.  Eg: &amp;lt;tt&amp;gt;i18np(&amp;quot;One image in album %2&amp;quot;, &amp;quot;%1 images in album %2&amp;quot;, imageCount, albumName);&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;i18ncp()&amp;lt;/tt&amp;gt; is a combination of the previous two.  Eg: &amp;lt;tt&amp;gt;i18ncp(&amp;quot;Personal file&amp;quot;, &amp;quot;One file&amp;quot;, &amp;quot;%1 files&amp;quot;, numFiles);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DataEngines ==&lt;br /&gt;
&lt;br /&gt;
* Add a &amp;lt;tt&amp;gt;dataUpdate&amp;lt;/tt&amp;gt; method to &amp;lt;tt&amp;gt;plasmoid&amp;lt;/tt&amp;gt; to receive updates: &amp;lt;tt&amp;gt;plasmoid.dataUpdate = function(name, data) { /* ... */ }&amp;lt;/tt&amp;gt; - &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; contains an object mapping keys to values&lt;br /&gt;
* &amp;lt;tt&amp;gt;plasmoid.dataEngine(&amp;quot;engine name&amp;quot;).connectSource(&amp;quot;source name&amp;quot;, plasmoid, 500);&amp;lt;/tt&amp;gt; updates every half second&lt;br /&gt;
* &amp;lt;tt&amp;gt;plasmoid.dataEngine(&amp;quot;engine name&amp;quot;).connectSource(&amp;quot;source name&amp;quot;, plasmoid);&amp;lt;/tt&amp;gt; updates when new data is available&lt;br /&gt;
* &amp;lt;tt&amp;gt;plasmaengineexplorer&amp;lt;/tt&amp;gt; is your friend&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
* Prior to KDE 4.4, DO NOT use &amp;lt;tt&amp;gt;plasmoid.dataEngine(&amp;quot;engine name&amp;quot;).serviceForSource(&amp;quot;source name&amp;quot;)&amp;lt;/tt&amp;gt; - you will get a dummy service back. Instead, use &amp;lt;tt&amp;gt;plasmoid.service(&amp;quot;engine name&amp;quot;, &amp;quot;source name&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notifications ===&lt;br /&gt;
&lt;br /&gt;
If you want to use the standard notifications in KDE, you can using Services, with the following code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
engine = dataEngine(&amp;quot;notifications&amp;quot;);&lt;br /&gt;
service = engine.serviceForSource(&amp;quot;notification&amp;quot;);&lt;br /&gt;
op = service.operationDescription(&amp;quot;createNotification&amp;quot;);&lt;br /&gt;
op[&amp;quot;appName&amp;quot;] = &amp;quot;foo&amp;quot;;&lt;br /&gt;
op[&amp;quot;appIcon&amp;quot;] = &amp;quot;konqueror&amp;quot;;&lt;br /&gt;
op[&amp;quot;summary&amp;quot;] = &amp;quot;this is a summary&amp;quot;;&lt;br /&gt;
op[&amp;quot;body&amp;quot;] = &amp;quot;body of notification&amp;quot;;&lt;br /&gt;
op[&amp;quot;timeout&amp;quot;] = 2000;&lt;br /&gt;
&lt;br /&gt;
service.startOperationCall(op);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/SystemMonitor</id>
		<title>Development/Tutorials/Plasma/JavaScript/SystemMonitor</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/SystemMonitor"/>
				<updated>2011-06-30T11:17:47Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This example assumes that you are familiar with previous examples such as [[Development/Tutorials/Plasma/JavaScript/NowPlaying|NowPlaying]] (from which this example was adapted).&lt;br /&gt;
&lt;br /&gt;
Following code illustrates how to connect to systemmonitor and how to receive updates from various data sources.&lt;br /&gt;
&lt;br /&gt;
You should have a working plasmoid application from previous examples. Take a copy of the plasmoid and rename it. After this you can replace contents of the &amp;lt;tt&amp;gt;contents/code/main.js&amp;lt;/tt&amp;gt; with following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
layout = new LinearLayout(plasmoid);&lt;br /&gt;
&lt;br /&gt;
label = new Label();&lt;br /&gt;
layout.addItem(label);&lt;br /&gt;
label.text = &amp;quot;No connection&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// current values&lt;br /&gt;
var systemData = new Array();&lt;br /&gt;
&lt;br /&gt;
function printData() {&lt;br /&gt;
    label.text = &amp;quot;&amp;quot;;&lt;br /&gt;
    for (var name in systemData) {&lt;br /&gt;
	var data = systemData[name];&lt;br /&gt;
	label.text = label.text + name + &amp;quot;: &amp;quot;;&lt;br /&gt;
	for (var elt in data) {&lt;br /&gt;
	    label.text = label.text + &amp;quot; &amp;quot; + data[elt];&lt;br /&gt;
	}&lt;br /&gt;
	label.text = label.text + &amp;quot;\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plasmoid.dataUpdated = function(name, data) {&lt;br /&gt;
    systemData[name] = data;&lt;br /&gt;
    printData();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
smDataEngine = dataEngine(&amp;quot;systemmonitor&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
smDataEngine.sourceRemoved.connect(function(name) {&lt;br /&gt;
	// unsubscribe&lt;br /&gt;
	smDataEngine.disconnectSource(name, plasmoid);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
smDataEngine.sourceAdded.connect(function(name) {&lt;br /&gt;
	if (name.toString().match(&amp;quot;^mem/physical&amp;quot;)) {&lt;br /&gt;
	    // subscribe&lt;br /&gt;
	    smDataEngine.connectSource(name, plasmoid, 500);&lt;br /&gt;
	}&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;tt&amp;gt;smDataEngine.sourceAdded.connect()&amp;lt;/tt&amp;gt; we give a function to connect to signal. The signal connection function is called by the systemmonitor for each data source. In this example we only connect to physical memory data sources.&lt;br /&gt;
&lt;br /&gt;
After this the &amp;lt;tt&amp;gt;plasmoid.dataUpdate()&amp;lt;/tt&amp;gt; receives updates. Update values are stored into an array. The array is printed on every update.&lt;br /&gt;
&lt;br /&gt;
Note that this example is bit inefficient since we call &amp;lt;tt&amp;gt;printData()&amp;lt;/tt&amp;gt; on every update. One way to optimize is to update label text only when &amp;quot;mem/physical/free&amp;quot; data source is updated.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/NowPlaying</id>
		<title>Development/Tutorials/Plasma/JavaScript/NowPlaying</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/NowPlaying"/>
				<updated>2011-06-30T11:16:38Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=JavaScript Plasmoids|&lt;br /&gt;
&lt;br /&gt;
name=Now Playing: Advanced DataEngine Usage&lt;br /&gt;
&lt;br /&gt;
pre=[[../NowPlaying|Getting Data: How to retreive data from a data engine]]|&lt;br /&gt;
&lt;br /&gt;
next=[[../CheatSheet|Cheat Sheet: Common gotchas and useful tips]]|&lt;br /&gt;
&lt;br /&gt;
reading=[[../API|JavaScript Plasmoid API reference]], [[../SystemMonitor|How to access systemmonitor data engine]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
This will show you some slightly more advanced techniques for dealing with data engines, and give you a useful plasmoid at the end that you can easily edit to display custom information about what your favourite media player is playing (providing, of course, that your favourite media player is supported by the &amp;lt;tt&amp;gt;nowplaying&amp;lt;/tt&amp;gt; data engine).&lt;br /&gt;
&lt;br /&gt;
We assume you've read the [[Development/Tutorials/Plasma/JavaScript/DataEngine|JavaScript data engine tutorial]].&lt;br /&gt;
&lt;br /&gt;
== Main script ==&lt;br /&gt;
&lt;br /&gt;
Create a &amp;lt;tt&amp;gt;contents/code/main.js&amp;lt;/tt&amp;gt; file with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
layout = new LinearLayout(plasmoid);&lt;br /&gt;
layout.orientation = QtVertical;&lt;br /&gt;
&lt;br /&gt;
label = new Label();&lt;br /&gt;
layout.addItem(label);&lt;br /&gt;
label.text = &amp;quot;No player found&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function firstSource() {&lt;br /&gt;
	var sources = dataEngine(&amp;quot;nowplaying&amp;quot;).sources;&lt;br /&gt;
	if (sources.length) {&lt;br /&gt;
		return sources[0];&lt;br /&gt;
	} else {&lt;br /&gt;
		label.text = &amp;quot;No player found&amp;quot;;&lt;br /&gt;
		return '';&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
plasmoid.dataUpdated = function(name, data) {&lt;br /&gt;
	if (source == name) {&lt;br /&gt;
		label.text = 'Info:\n';&lt;br /&gt;
		for (var key in data) {&lt;br /&gt;
			label.text += key + ': ' + data[key] + '\n';	&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
source = firstSource();&lt;br /&gt;
&lt;br /&gt;
npDataEngine = dataEngine(&amp;quot;nowplaying&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
npDataEngine.sourceRemoved.connect(function(name) {&lt;br /&gt;
	if (name == source) {&lt;br /&gt;
		source = firstSource();&lt;br /&gt;
		if (source) {&lt;br /&gt;
			npDataEngine.connect(source, plasmoid, 500);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
npDataEngine.sourceAdded.connect(function(name) {&lt;br /&gt;
	if (!source) {&lt;br /&gt;
		source = name;&lt;br /&gt;
		npDataEngine.connect(source, plasmoid, 500);&lt;br /&gt;
	}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (source) {&lt;br /&gt;
	npDataEngine.connectSource(source, plasmoid, 500);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It looks complicated, compared to the two previous tutorials, but there is really only one new thing, and that is that we're watching for sources appearing and disappearing.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;nowplaying&amp;lt;/tt&amp;gt; data engine makes sources appear and disappear as media players come and go.  This plasmoid is a little stupid and only ever watches the first source in the list, but that will be enough for us.&lt;br /&gt;
&lt;br /&gt;
The magic is in listening to the &amp;lt;tt&amp;gt;sourceAdded&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sourceRemoved&amp;lt;/tt&amp;gt; signals of the data engine.  These, unsuprisingly, are emitted when the &amp;lt;tt&amp;gt;sources&amp;lt;/tt&amp;gt; property of the data engine, which lists all known sources, changes.  Note that it may be possible to sensibly request sources that are not in the &amp;lt;tt&amp;gt;sources&amp;lt;/tt&amp;gt; property of a data engine - for example, the &amp;lt;tt&amp;gt;twitter&amp;lt;/tt&amp;gt; data engine has a theoretically infinite number of sources available, one for each possible twitter account, and these cannot possibly be listed in the &amp;lt;tt&amp;gt;sources&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
You can learn more about using signals and slots in JavaScript in the [http://doc.trolltech.com/latest/qtscript.html QtScript documentation].  Remember that any property, signal or slot and any method tagged with &amp;lt;tt&amp;gt;Q_INVOKABLE&amp;lt;/tt&amp;gt; (see the [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma API documentation] for which methods this applies to) can be called from JavaScript.&lt;br /&gt;
&lt;br /&gt;
== Challenge ==&lt;br /&gt;
&lt;br /&gt;
Modify &amp;lt;tt&amp;gt;plasmoid.dataUpdate&amp;lt;/tt&amp;gt; to display the information you care about, rather than all the information provided by the &amp;lt;tt&amp;gt;nowplaying&amp;lt;/tt&amp;gt; data engine.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/GettingStarted</id>
		<title>Development/Tutorials/Plasma/JavaScript/GettingStarted</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/JavaScript/GettingStarted"/>
				<updated>2011-06-30T11:14:47Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma/JavaScript/GettingStarted}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=JavaScript Plasmoids|&lt;br /&gt;
&lt;br /&gt;
name=Introduction To Writing Plasmoids with JavaScript|&lt;br /&gt;
&lt;br /&gt;
next=[[../DataEngine|Getting Data: How to retrieve data from a DataEngine]]|&lt;br /&gt;
&lt;br /&gt;
reading=[[../API|JavaScript Plasmoid API reference]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
In this tutorial we'll cover creating a very simple Plasmoid in JavaScript, otherwise known as [http://doc.trolltech.com/latest/qtscript.html QtScript] or [http://www.ecmascript.org/ ECMAScript], to provide a Plasma widget.&lt;br /&gt;
&lt;br /&gt;
Using JavaScript doesn't require any external dependencies, since it is part of the Qt libraries.  As of KDE 4.3, the Plasma JavaScript engine is part of kdebase/runtime, and so can be used in any Plasma-based application, not just the Plasma Desktop.&lt;br /&gt;
&lt;br /&gt;
== QtScript ==&lt;br /&gt;
The Simplified JavaScript API is powered by Qt's QtScript system which provides access to a full featured ECMA Script interpreter. If it works in ECMA Script, it will work in a Simplified JavaScript Plasmoid.&lt;br /&gt;
&lt;br /&gt;
{{note|QtScript uses the high performance ECMA Script interpreter from WebKit and shares this code with QtWebKit.&lt;br /&gt;
&lt;br /&gt;
However, QtScript does not include things such as a DOM API those familiar with JavaScript from a web browser context may expect. It is ''just'' ECMA Script with Qt integration.}}&lt;br /&gt;
&lt;br /&gt;
On top of the ECMA Script language, QtScript provides Qt integration features. Probably the most useful one in the context of writing Plasmoids is the use of signals and slots which is Qt's callback mechanism. Signals may be emitted in QtScript by calling the signal method in question, a signal can be connected to a slot by using the connect() method (and disconnected with disconnect()) and any function defined in the Plasmoid may be used as a slot. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function onClick()&lt;br /&gt;
{&lt;br /&gt;
    print(&amp;quot;We got clicked!&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function onFirstClick()&lt;br /&gt;
{&lt;br /&gt;
    print(&amp;quot;First click!&amp;quot;)&lt;br /&gt;
    button.clicked.disconnect(onFirstClick)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
button = new PushButton&lt;br /&gt;
button.clicked.connect(onClick)&lt;br /&gt;
button.clicked.connect(onFirstClick)&lt;br /&gt;
button.clicked()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will print out:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
We got clicked!&lt;br /&gt;
First click!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the console when the Plasmoid starts, and the &amp;quot;We got clicked!&amp;quot; again whenever the button is clicked by the user.&lt;br /&gt;
&lt;br /&gt;
== What is a widget? ==&lt;br /&gt;
In the context of Plasma, a &amp;quot;widget&amp;quot; is a single, self-contained graphical object on the canvas. They can be added and removed individually, configured separately from other widgets, etc. These &amp;quot;mini applications&amp;quot; are sometimes referred to in other widget platforms as &amp;quot;applets&amp;quot;, &amp;quot;apps&amp;quot;, &amp;quot;gadgets&amp;quot;, &amp;quot;karambas&amp;quot;, &amp;quot;desklets&amp;quot;. We chose the word &amp;quot;widget&amp;quot; for Plasma as it is used by other some other existing systems.&lt;br /&gt;
&lt;br /&gt;
The API of a widget is defined by the host &amp;quot;ScriptEngine&amp;quot;, with the exception of native Plasma widgets written in C++ which allows plugins in loadable libraries which use the API of the Plasma library directly. Currently Plasma supports both such &amp;quot;native&amp;quot; widgets written in C++, ones written in various dynamic languages (Plasmoids) as well as:&lt;br /&gt;
&lt;br /&gt;
* SuperKaramba's karambas&lt;br /&gt;
* Enlightenment 17 edje content&lt;br /&gt;
* Google Gadgets&lt;br /&gt;
* MacOS dashboard widgets (though not all)&lt;br /&gt;
&lt;br /&gt;
These are loaded via host AppletScriptEngine plugins that bridge between the widget itself and Plasma's canvas.&lt;br /&gt;
&lt;br /&gt;
== What is a Plasmoid? ==&lt;br /&gt;
&lt;br /&gt;
A Plasmoid is a widget that can be loaded into Plasma that uses the native Plasma API and comes packaged in a single archive file which includes the code, metadata, images, configuration definitions, etc. Plasmoids may be currently written using various scripting languages and APIs. This tutorial covers the Simplified JavaScript API for Plasmoids&lt;br /&gt;
&lt;br /&gt;
== Project Structure ==&lt;br /&gt;
&lt;br /&gt;
The first step for any software project is to set up your project's directory on disk. For this tutorial we are going to create a very simple &amp;quot;hello-javascript&amp;quot; plasmoid. Create a directory on somewhere called &amp;lt;tt&amp;gt;hello-javascript&amp;lt;/tt&amp;gt; which in turn contains a &amp;lt;tt&amp;gt;contents&amp;lt;/tt&amp;gt; directory which then contains a &amp;lt;tt&amp;gt;code&amp;lt;/tt&amp;gt; directory. This command below will do all this.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p hello-javascript/contents/code&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The only required part of the structure, in fact, is the &amp;lt;tt&amp;gt;contents&amp;lt;/tt&amp;gt; directory - almost everything will go in this directory.  But separating your code into a different directory from application data is a good habit to have.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metadata.desktop ==&lt;br /&gt;
&lt;br /&gt;
In the &amp;lt;tt&amp;gt;hello-javascript&amp;lt;/tt&amp;gt; directory create a file called &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; and open it in your text editor. Copy the following code into &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Hello JavaScript&lt;br /&gt;
Comment=An example JavaScript widget&lt;br /&gt;
Icon=chronometer&lt;br /&gt;
&lt;br /&gt;
Type=Service&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
&lt;br /&gt;
X-Plasma-API=javascript&lt;br /&gt;
X-Plasma-MainScript=code/main.js&lt;br /&gt;
X-Plasma-DefaultSize=200,100&lt;br /&gt;
&lt;br /&gt;
X-KDE-PluginInfo-Author=&amp;lt;Your name here&amp;gt;&lt;br /&gt;
X-KDE-PluginInfo-Email=&amp;lt;Your email here&amp;gt;&lt;br /&gt;
X-KDE-PluginInfo-Name=hello-javascript&lt;br /&gt;
X-KDE-PluginInfo-Version=1.0&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; file list important information needed by Plasma to load the widget, and also information about what the widget is and who created it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; gives the name of widget as seen by the user when they go to the Add Widget dialog on the desktop.  There can be additional name entries for different languages.  For example, you could add a Dutch translation by inserting the line &amp;lt;tt&amp;gt;Name[nl]=Hallo JavaScript&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Comment&amp;lt;/tt&amp;gt; gives a more detailed description of the widget.  This is also displayed in the Add Widget dialog, and can be translated in the same way as &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Icon&amp;lt;/tt&amp;gt; gives the name of the icon to associate with this plasmoid. The icon is shown in the Add Widget dialog.  It must be the name of an icon that is either distributed with KDE (such as &amp;lt;tt&amp;gt;chronometer&amp;lt;/tt&amp;gt;) or provided by your plasmoid. If you want to provide the icon, you can use &amp;lt;tt&amp;gt;Icon=icon.png&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;Type&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;X-KDE-ServiceTypes&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;X-Plasma-API&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;X-Plasma-MainScript&amp;lt;/tt&amp;gt; fields are required for Plasma to find your plasmoid and know what to do with it.  Note that &amp;lt;tt&amp;gt;X-Plasma-MainScript&amp;lt;/tt&amp;gt; is a path relative the &amp;lt;tt&amp;gt;contents&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;X-Plasma-DefaultSize&amp;lt;/tt&amp;gt; specifies the default size for widget, as &amp;lt;tt&amp;gt;width,height&amp;lt;/tt&amp;gt;.  While the units aren't technically pixels, they have the same value as pixels providing you don't do anything like zoom in or out on your desktop.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;X-KDE-PluginInfo-Category&amp;lt;/tt&amp;gt; gives a category for the widget. This is used in the Add Widgets dialog to group and filter widgets. The value must be one of the category names listed at [[Projects/Plasma/PIG]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;X-KDE-PluginInfo-Name&amp;lt;/tt&amp;gt; is the internal name of the plasmoid (you can think of this as the name of the plasmoid, as opposed to the name of the widget which is given by &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt;).  This is the name you will use as an argument to &amp;lt;tt&amp;gt;plasmoidviewer&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;plasmapkg&amp;lt;/tt&amp;gt; when you need to provide a plasmoid name rather than a path.  It doesn't have to be the same name as the directory containing &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;X-KDE-PluginInfo-Author&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;X-KDE-PluginInfo-Email&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;X-KDE-PluginInfo-Version&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;X-KDE-PluginInfo-Website&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;X-KDE-PluginInfo-License&amp;lt;/tt&amp;gt; are informational, and are displayed in the About dialog for the plasmoid (which can be viewed by clicking the information icon next to the corresponding widget in the Add Widgets dialog of plasma).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;X-KDE-PluginInfo-EnabledByDefault&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;X-KDE-PluginInfo-Depends&amp;lt;/tt&amp;gt; rarely need to be changed from the values given here.&lt;br /&gt;
&lt;br /&gt;
== Main script ==&lt;br /&gt;
&lt;br /&gt;
The name of the main script file is given by &amp;lt;tt&amp;gt;X-Plasma-MainScript&amp;lt;/tt&amp;gt; in metadata.desktop, and is relative to the &amp;lt;tt&amp;gt;contents&amp;lt;/tt&amp;gt; directory.  In our case, we will need to create the file &amp;lt;tt&amp;gt;hello-javascript/contents/code/main.js&amp;lt;/tt&amp;gt;.  Put the following code in it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
layout = new LinearLayout(plasmoid);&lt;br /&gt;
&lt;br /&gt;
label = new Label();&lt;br /&gt;
layout.addItem(label);&lt;br /&gt;
&lt;br /&gt;
label.text = 'Hello JavaScript!';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;plasmoid&amp;lt;/strong&amp;gt; is a global variable that represents your widget.  It has some useful methods that we'll come to in later tutorials.&lt;br /&gt;
&lt;br /&gt;
First, we create a layout, because plasmoids don't have a layout by default.  This just makes sure that the label is the correct size and in the correct place.  Passing &amp;lt;tt&amp;gt;plasmoid&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;LinearLayout&amp;lt;/tt&amp;gt; attaches the layout to the widget.&lt;br /&gt;
&lt;br /&gt;
Next we add a label to the layout, and finally we set the label text.&lt;br /&gt;
&lt;br /&gt;
== Testing (KDE 4.3+) ==&lt;br /&gt;
&lt;br /&gt;
If you have KDE 4.3 or later, you can test your plasmoid without installing it by entering the &amp;lt;tt&amp;gt;hello-javascript&amp;lt;/tt&amp;gt; directory and running &amp;lt;tt&amp;gt;plasmoidviewer&amp;lt;/tt&amp;gt;.  Alternatively, call &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmoidviewer /path/to/hello-javascript&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is very convenient for development as you can edit the Plasmoid and test the changes immediately without re-installing the plasmoid over and over again.&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
&lt;br /&gt;
You can install the plasmoid by running the following command from within the &amp;lt;tt&amp;gt;hello-javascript&amp;lt;/tt&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmapkg -i .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The final argument to &amp;lt;tt&amp;gt;plasmapkg&amp;lt;/tt&amp;gt; is the path to the directory containing &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt; and the &amp;lt;tt&amp;gt;contents&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
You can now add your widget to the desktop using the Add Widgets dialog, or view it by running&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmoidviewer hello-javascript&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Packaging ==&lt;br /&gt;
&lt;br /&gt;
If you want to share your plasmoid, you'll have to package it.  Run the following from within the &amp;lt;tt&amp;gt;hello-javascript&amp;lt;/tt&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
zip -r ../hello-javascript.zip . &amp;amp;&amp;amp;&lt;br /&gt;
mv ../hello-javascript.zip ../hello-javascript.plasmoid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You now have a plasmoid package you can share with the world.  To install it, either use the &amp;quot;Install new widgets&amp;quot; functionality in the Add Widgets dialog, or go to the directory containing &amp;lt;tt&amp;gt;hello-javascript.plasmoid&amp;lt;/tt&amp;gt; and run&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmapkg -i hello-javascript.plasmoid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To uninstall the plasmoid, use &amp;lt;tt&amp;gt;plasmapkg&amp;lt;/tt&amp;gt; again with its -r option:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
plasmapkg -r hello-javascript&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that while the argument to &amp;lt;tt&amp;gt;plasmapkg -i&amp;lt;/tt&amp;gt; is a file or directory, you need to pass the plasmoid name (given by &amp;lt;tt&amp;gt;X-KDE-PluginInfo-Name&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;metadata.desktop&amp;lt;/tt&amp;gt;) to &amp;lt;tt&amp;gt;plasmapkg -r&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KDE3</id>
		<title>Development/Tutorials/KDE3</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KDE3"/>
				<updated>2011-06-30T11:07:59Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Add deletion proposal.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|KDE 3 content: should be looked through for useful stuff before deleting.}}&lt;br /&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 KDE3 development. &lt;br /&gt;
&lt;br /&gt;
{{tip|If you are working with a newer version of KDE, such as KDE4, these tutorials are probably of limited use to you. For tutorials covering current KDE development topics, visit the [[Development/Tutorials|main tutorials page]]}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
;[[/Qt Designer and KDevelop 3.0 for Beginners|Qt Designer and KDevelop 3.0 for Beginners]] ([http://women.kde.org/articles/tutorials/kdevelop3/index.html Original Link])&lt;br /&gt;
:''Qt is the toolkit used by the KDE project for developing graphical applications.   Currently, translations are available through the original link. This paper, written by Anne-Marie Mahfouf, shows a beginner how to create a simple application using Qt Designer 3 and KDevelop 3. This tutorial is based on an application written by Jono Bacon and has been reviewed by Daniel Molkentin (for the KDevelop 2 version) and Thomas Nagy. Translations to German, Russian, French, Italian, and Romanian available at the [http://women.kde.org/articles/tutorials/kdevelop3/index.html original site].  Brought to you by [http://women.kde.org KDE-Women].''&lt;br /&gt;
&lt;br /&gt;
;[http://devel-home.kde.org/~larrosa/tutorial/index.html KDE 3.0 Tutorial]&lt;br /&gt;
:''An excellent tutorial by KDE developer Antonio Larrosa Jiménez leading you from nothing to a fairly full featured web browser. Highly recommended for KDE 3.0 developers.''&lt;br /&gt;
&lt;br /&gt;
;[[../Programming Tutorial KDE 3|Programming Tutorial for KDE 3]]&lt;br /&gt;
&lt;br /&gt;
;[[/Makefile.am|Makefile.am HOWTO]]&lt;br /&gt;
:''Make the KDE 3 build system work for you.  This HOWTO shows you how to do most anything you would need to do to get your application to compile and install''&lt;br /&gt;
&lt;br /&gt;
== Components and Plugins ==&lt;br /&gt;
&lt;br /&gt;
;[http://developer.kde.org/documentation/tutorials/xmlui/preface.html KDE User Interface Tutorial (XML GUI)]&lt;br /&gt;
:''Tutorial by KDE developer [mailto:granroth@kde.org Kurt Granroth] showing how to convert an existing KDE application to use the new XML based user interface builder.''&lt;br /&gt;
&lt;br /&gt;
;[http://www-106.ibm.com/developerworks/linux/edu/l-dw-linuxkp1-i.html Creating KParts Component]&lt;br /&gt;
:''Tutorial on IBM DeveloperWorks, by [mailto:faure@kde.org David Faure] shows developers how to create KParts components, under KDE 2 and KDE 3.''&lt;br /&gt;
&lt;br /&gt;
;[http://developer.kde.org/documentation/tutorials/developing-a-plugin-structure/index.html Developing a Plugin Structure for a KDE Application]&lt;br /&gt;
:''This tutorial will take you through all the steps needed to write a plugin structure, plus plugins for your KDE application.''&lt;br /&gt;
&lt;br /&gt;
;[http://developer.kde.org/documentation/tutorials/kfile-plugin/t1.html Providing file meta-data support with KFile plugins]&lt;br /&gt;
:''Tutorial by [mailto:bradh@frogmouth.net Brad Hards] that describes how to write a meta-data plugin for your favourite file format. It is presented as an example based tutorial.''&lt;br /&gt;
&lt;br /&gt;
;[http://developer.kde.org/documentation/tutorials/components/index.html Embedded Components Tutorial]&lt;br /&gt;
:''Tutorial by KDE developer [mailto:granroth@kde.org Kurt Granroth] showing how to convert an existing KDE application into a component suitable for embedding in [http://www.konqueror.org Konqueror].''&lt;br /&gt;
&lt;br /&gt;
; [[/How_to_write_Kontact_plugins|How to write Kontact plugins]]&lt;br /&gt;
:''Kontact plugins''&lt;br /&gt;
&lt;br /&gt;
; [http://developer.kde.org/documentation/other/kcm_howto.html KConfig Module HOWTO]&lt;br /&gt;
:''A small tutorial about writing a module for the KDE Control Center.''&lt;br /&gt;
&lt;br /&gt;
; [[/KDockWidget|Using the KDE dock widget]]&lt;br /&gt;
:''Tutorial for creating widgets that dock to other widgets. ''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Introduction to Get Hot New Stuff|Introduction to Get Hot New Stuff]]&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.''&lt;br /&gt;
&lt;br /&gt;
== File Access with KIO ==&lt;br /&gt;
&lt;br /&gt;
;[http://www.heise.de/ct/english/01/05/242/ KIO Tutorial] ([http://www.heise.de/ct/01/05/242/default.shtml German version])&lt;br /&gt;
:''Tutorial by KDE developers [mailto:pfeiffer@kde.org Carsten Pfeiffer] and [mailto:coolo@kde.org Stephan Kulow] for the [http://www.heise.de/ct/ c't Magazine], giving an introduction into the KDE IO Architecture and an example KIO Slave.''&lt;br /&gt;
&lt;br /&gt;
;[http://developer.kde.org/documentation/design/kde/ioslaves/index.html Using IOSlaves]&lt;br /&gt;
:''IOSlaves are the subprocesses KDE uses to fetch remote files without blocking the user interface. This document discusses how they work and how to use them.''&lt;br /&gt;
:(Somewhat dated, but might still be useful).&lt;br /&gt;
&lt;br /&gt;
== Components and Plugins ==&lt;br /&gt;
&lt;br /&gt;
=== KWin ===&lt;br /&gt;
&lt;br /&gt;
;[http://www.usermode.org/docs/kwintheme.html KWin decoration styles]&lt;br /&gt;
:''Tutorial on creating decoration plugins for the KWin window manager (KDE 3.2 and later).''&lt;br /&gt;
&lt;br /&gt;
== Scripting and Application Automation ==&lt;br /&gt;
&lt;br /&gt;
;[http://developer.kde.org/documentation/tutorials/dot/dcopiface/dcop-interface.html Creating a DCOP Interface]&lt;br /&gt;
:''This tutorial shows you how to create a DCOP interface to a KDE application.''&lt;br /&gt;
&lt;br /&gt;
;[http://www-106.ibm.com/developerworks/linux/library/l-dcop/index.html?ca=dgr-kdeml01KDEDCOP Connect KDE applications using DCOP]&lt;br /&gt;
:''IBM DeveloperWorks tutorial, shows how to use kdcop and dcop with several examples such as instantly messaging a contact in kopete when he comes online, and also how to create a simple DCOP-aware application.''&lt;br /&gt;
&lt;br /&gt;
=== Konqueror ===&lt;br /&gt;
; [[Development/Tutorials/KDE3/Creating Konqueror Service Menus|Creating Konqueror Service Menus]]&lt;br /&gt;
:''This tutorial shows you how to create mimetype-specific actions in Konqueror's context menu (aka &amp;quot;servicemenus&amp;quot;).''&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KDE3/How_to_write_Kontact_plugins</id>
		<title>Development/Tutorials/KDE3/How to write Kontact plugins</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KDE3/How_to_write_Kontact_plugins"/>
				<updated>2011-06-30T10:57:57Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Add deletion proposal.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Delete|KDE 3 content.}}&lt;br /&gt;
''by Thorsten St&amp;amp;auml;rk''&lt;br /&gt;
&lt;br /&gt;
This documentation is intended for developers programming on - or&lt;br /&gt;
writing plugins for - Kontact. Kontact is a KDE program uniting several&lt;br /&gt;
KDE components for personal information management under one roof.&lt;br /&gt;
Personal information management is e.g. writing mails, planning your&lt;br /&gt;
calendar dates or tracking your time. If you want to learn how to use&lt;br /&gt;
Kontact, visit [http://www.kontact.org The Kontact homepage].&lt;br /&gt;
&lt;br /&gt;
== Tutorial FactBox ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; style=&amp;quot;text-align: left; width: 247px; height: 58px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;vertical-align: top;&amp;quot;|lasts || style=&amp;quot;vertical-align: top;&amp;quot;|3 hours&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;vertical-align: top;&amp;quot;|without this tutorial || style=&amp;quot;vertical-align: top;&amp;quot;|3 weekends&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How to write a plugin for Kontact ==&lt;br /&gt;
&lt;br /&gt;
This chapter demonstrates how to turn an existing KDE program into a&lt;br /&gt;
Kontact plugin. This is done on the example of the program KArm from&lt;br /&gt;
KDE 3.4.1. First, we will create a [[Development/Architecture/KDE4/KParts|KPart]] out of the program, then, we&lt;br /&gt;
will use this for a Kontact plugin. Then, we will look at some errors&lt;br /&gt;
that may occur with that work. A KPart is a KDE component that can be&lt;br /&gt;
used as a program, with the difference that it cannot run alone,&lt;br /&gt;
because it needs a program building a &amp;quot;mainwindow&amp;quot; for it.&lt;br /&gt;
&lt;br /&gt;
== How to create the KPart ==&lt;br /&gt;
To turn our KDE Program into a [[Development/Architecture/KDE4/KParts|KPart]], we create a verbatim KPart with&lt;br /&gt;
KDevelop and copy it over to our program's source directory. For this,&lt;br /&gt;
I assume, you want to modify the program karm from KDE 3.4.1 and it can&lt;br /&gt;
be found in {{path|/home/user/svn/3.4.1/kdepim/karm}}. I assume your home&lt;br /&gt;
directory is {{path|/home/user}} and you are on KDevelop 3.2.0.&lt;br /&gt;
&lt;br /&gt;
Start KDevelop, close all open projects (Project -&amp;gt; close), then chose&lt;br /&gt;
&amp;lt;tt&amp;gt;Project | New Project -&amp;amp;gt; C++ -&amp;amp;gt; KDE -&amp;amp;gt; Application Framework &lt;br /&gt;
(KParts)&amp;lt;/tt&amp;gt;. Set &amp;quot;Application Name&amp;quot; to &amp;quot;karm&amp;quot;, continue as instructed.&lt;br /&gt;
Now test your verbatim KPart by executing it in KDevelop. Expected result&lt;br /&gt;
is a &amp;quot;Could not find our part&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This is because you do not yet have the KPart installed. KDevelop will&lt;br /&gt;
store your work in {{path|/home/user/karm/}}, so test your verbatim KPart &lt;br /&gt;
by doing a make install in {{path|/home/user/karm/}} and executing the &lt;br /&gt;
KDevelop project. Expected result is a text-editing window, the verbatim KPart.&lt;br /&gt;
&lt;br /&gt;
KDevelop has created {{path|karm.h}}, {{path|karm.cpp}}, {{path|karm_part.h}},&lt;br /&gt;
{{path|karm_part.cpp}}, {{path|karm_part.desktop}} and {{path|Makefile.am}}&lt;br /&gt;
in {{path|home/user/karm/src/}}. {{path|karm.h}} and {{path|karm.cpp}}&lt;br /&gt;
just open a mainwindow and display the karm_part in it. We do not need&lt;br /&gt;
them, as we already have a mainwindow for our program. So&lt;br /&gt;
copy the files {{path|karm_part.*}} to {{path|/home/user/svn/3.4.1/kdepim/karm}}&lt;br /&gt;
and adapt the files to display your main widget instead of a text&lt;br /&gt;
editor. You may want to replace {{qt3|QMultiLineEdit}} by your main widget.&lt;br /&gt;
Finally adapt the {{path|Makefile}} {{path|/home/user/svn/3.4.1/kdepim/karm/Makefile.am}}&lt;br /&gt;
to include the added files. This is hard to generalize, I show it here&lt;br /&gt;
for the KArm program.&lt;br /&gt;
&lt;br /&gt;
You may want to have a look at [http://websvn.kde.org/trunk/KDE/kdepim/karm/Makefile.am?rev=412382&amp;amp;amp;r1=409203&amp;amp;amp;r2=412382 the diff]&lt;br /&gt;
between the old and the new {{path|Makefile.am}}. Now replace &amp;lt;tt&amp;gt;karm_SOURCES&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;libkarm_shared_la_SOURCES&amp;lt;/tt&amp;gt; and remove main.cpp from the list. Add a &amp;lt;tt&amp;gt;noinst_LTLIBRARIES = libkarm_shared.la&amp;lt;/tt&amp;gt;&lt;br /&gt;
before that line. That causes that all the karm files will not be bound to a binary karm,&lt;br /&gt;
but to a library &amp;lt;tt&amp;gt;libkarm_shared.la&amp;lt;/tt&amp;gt;. This binary can then be used to&lt;br /&gt;
link as well karm as our KPart. Add &amp;lt;tt&amp;gt;libkarm_shared.la&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;karm_LDADD&amp;lt;/tt&amp;gt; &lt;br /&gt;
before that line, place a &amp;lt;tt&amp;gt;karm_SOURCES=main.cpp&amp;lt;/tt&amp;gt;. These lines now draw the library&lt;br /&gt;
&amp;lt;tt&amp;gt;libkarm_shared.la&amp;lt;/tt&amp;gt;. Finally, add a kpart section as from {{path|/home/user/karm/src/Makefile.am}} to karm's {{path|Makefile.am}}. This should look like this:&lt;br /&gt;
&lt;br /&gt;
 ##################&lt;br /&gt;
 # KPART SECTION&lt;br /&gt;
 ##################&lt;br /&gt;
       kde_module_LTLIBRARIES = libkarmpart.la&lt;br /&gt;
       # the Part's source, library search path, and link libraries&lt;br /&gt;
       libkarmpart_la_SOURCES = karm_part.cpp&lt;br /&gt;
       libkarmpart_la_LDFLAGS = -module -avoid-version -no-undefined $(KDE_PLUGIN) $(all_libraries)&lt;br /&gt;
       libkarmpart_la_LIBADD  = libkarm_shared.la $(LIB_KPARTS) $(LIB_KFILE) \&lt;br /&gt;
                   -lkdeprint $(top_builddir)/libkcal/libkcal.la \&lt;br /&gt;
                   $(top_builddir)/kresources/remote/libkcal_resourceremote.la \ &lt;br /&gt;
                   $(top_builddir)/libkdepim/libkdepim.la $(LIBXSS)&lt;br /&gt;
      &lt;br /&gt;
       # this is where the desktop file will go&lt;br /&gt;
       partdesktopdir   = $(kde_servicesdir)&lt;br /&gt;
       partdesktop_DATA = karm_part.desktop&lt;br /&gt;
       &lt;br /&gt;
       # this is where the part's XML-GUI resource file goes&lt;br /&gt;
       partrcdir   = $(kde_datadir)/karmpart&lt;br /&gt;
       partrc_DATA = karmui.rc&lt;br /&gt;
&lt;br /&gt;
After that, test your changes of {{path|Makefile.am}}. You have to do &amp;lt;tt&amp;gt;make -f&lt;br /&gt;
Makefile.cvs &amp;amp;amp;&amp;amp;amp; ./configure &amp;amp;amp;&amp;amp;amp; make&amp;lt;/tt&amp;gt; in&lt;br /&gt;
{{path|/home/user/svn/3.4.1/kdepim/}}.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color: #ff0000;&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; running &amp;lt;tt&amp;gt;./configure &amp;amp;amp;&amp;amp;amp; make&amp;lt;/tt&amp;gt; &amp;lt;b&amp;gt;is not enough&amp;lt;/b&amp;gt;. {{path|Makefile.am}}'s are processed by &amp;lt;tt&amp;gt;make -f Makefile.cvs.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install your KPart, e.g. with make install. Then test your KPart:&lt;br /&gt;
&lt;br /&gt;
* Start Konqueror, chose &amp;lt;i&amp;gt;Settings | Configure Konqueror -&amp;amp;gt;&lt;br /&gt;
File Associations | text -&amp;amp;gt; calendar&amp;lt;/i&amp;gt;. File name patterns are&lt;br /&gt;
&amp;quot;*.ics&amp;quot;. Chose &amp;lt;i&amp;gt;Embedding -&amp;amp;gt; Show files in embedded viewer -&amp;amp;gt; Add&lt;br /&gt;
-&amp;amp;gt; karmPart -&amp;amp;gt; Apply&amp;lt;/i&amp;gt;.&lt;br /&gt;
* right-click onto a .ics-file and chose &amp;quot;preview in embedded&lt;br /&gt;
viewer -&amp;amp;gt; karmPart&amp;quot;&lt;br /&gt;
* verify that Konqueror now is the &amp;quot;mainwindow&amp;quot; for your KPart.&lt;br /&gt;
Konqueror will show what was shown by your application before.&lt;br /&gt;
&lt;br /&gt;
== How to get the Kontact plugin ==&lt;br /&gt;
&lt;br /&gt;
You best clone a little Kontact plugin and then adapt it to your&lt;br /&gt;
program.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: rgb(255, 0, 0);&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; Do &amp;lt;b&amp;gt;not&amp;lt;/b&amp;gt; copy&lt;br /&gt;
any directory within your svn working copy, change it and re-commit.&lt;br /&gt;
Every folder in the working copy contains a subfolder &amp;lt;tt&amp;gt;.svn/&amp;lt;/tt&amp;gt; which&lt;br /&gt;
will direct your commits to the original folder. Better do it that way:&lt;br /&gt;
&lt;br /&gt;
* create a folder {{path|/home/user/svn/3.4.1/kdepim/kontact/plugins/karm}}&lt;br /&gt;
* copy ''only'' {{path|Makefile.am}}, {{path|multisynk_plugin.cpp}}, {{path|multisynk_plugin.h}}, {{path|multisynkplugin.desktop}} from {{path|/home/user/svn/3.4.1/kdepim/kontact/plugins/multisynk/}} to {{path|../karm/}}&lt;br /&gt;
* rename the four files and adapt them to their new names&lt;br /&gt;
* adapt the {{path|karmplugin.desktop}} file to point to your KPart's library, in this case &amp;lt;tt&amp;gt;X-KDE-KontactPartLibraryName=libkarmpart&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You see, the deciding step is to tell a {{path|.desktop}} file to use the libs of a KPart. The only modification on the plugin's code is related to&lt;br /&gt;
renaming the files. That is elegant.&lt;br /&gt;
* give your plugin a distinct name&lt;br /&gt;
* add your plugin folder (karm) to the makefile for kontact plugins (in your kdepim folder under {{path|kontact/plugins/Makefile.am}}):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  SUBDIRS = $(KPILOT_KONTACTPLUGIN) kaddressbook kmail knotes korganizer \&lt;br /&gt;
          summary weather knode newsticker multisynk specialdates akregator karm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;make -f Makefile.cvs &amp;amp;amp;&amp;amp;amp; ./configure &amp;amp;amp;&amp;amp;amp; make &amp;amp;amp;&amp;amp;amp; make install&amp;lt;/tt&amp;gt; your kdepim&lt;br /&gt;
* test your plugin&lt;br /&gt;
** start Kontact, chose &amp;lt;i&amp;gt;Settings|Configure Kontact -&amp;amp;gt; Configure&amp;lt;/i&amp;gt;&lt;br /&gt;
** verify that you find your program's plugin to be chosen there.&lt;br /&gt;
&lt;br /&gt;
== Pitfalls ==&lt;br /&gt;
* the program no longer sets it icons correctly&lt;br /&gt;
** this pitfall occurred as well in the plugin as in the KPart due to the fact that my program was using UserIcon to load the Icons instead of the {{class|KIconLoader}}. UserIcon looks for the application name to find out the icons' path. As there was no application (only a KPart), it gave up on searching the icons.&lt;br /&gt;
&lt;br /&gt;
== Suggested readings ==&lt;br /&gt;
* http://www-106.ibm.com/developerworks/linux/edu/l-dw-linuxkp1-i.html : DeveloperWorks article from David Faure on the KPart technology&lt;br /&gt;
*  http://websvn.kde.org/trunk/KDE/kdepim/karm/Makefile.am?rev=412382&amp;amp;amp;r1=409203&amp;amp;amp;r2=412382 : Code example showing the integration of the karm part, file Makefile.am&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorial]]&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:PIM]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Template:Delete</id>
		<title>Template:Delete</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Template:Delete"/>
				<updated>2011-06-30T10:56:17Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Add parameter for deletion reason.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''This page has been nominated for deletion'''.&lt;br /&gt;
&lt;br /&gt;
Reason: {{{1}}}&lt;br /&gt;
&lt;br /&gt;
If you disagree with its deletion, remove the template and discuss it on [[{{TALKPAGENAME}}|its talk page]].&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;[[Category:Marked for Deletion]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Maintenance Templates]].&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Template:Delete</id>
		<title>Template:Delete</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Template:Delete"/>
				<updated>2011-06-30T10:52:02Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Rephrase and shorten it a bit.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Warning|'''This page has been nominated for deletion'''.&lt;br /&gt;
&lt;br /&gt;
If you disagree with its deletion, remove the template and discuss it on [[{{TALKPAGENAME}}|its talk page]].&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;[[Category:Marked for Deletion]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Maintenance Templates]].&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Introduction_to_Get_Hot_New_Stuff</id>
		<title>Development/Tutorials/Introduction to Get Hot New Stuff</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Introduction_to_Get_Hot_New_Stuff"/>
				<updated>2011-06-30T10:29:52Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Preparations */ bash -&amp;gt; make&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{improve}}&lt;br /&gt;
{{KDE3}} &lt;br /&gt;
&lt;br /&gt;
== KDE 4 ==&lt;br /&gt;
Please read the [[Development/Tutorials#Get_Hot_New_Stuff|KDE 4 tutorials]] about get hot new stuff, unless you really work on KDE 3 apps.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Similar to how programming languages shifted focus from algorithms to data structures in the 70s, desktop application development emphasizes more and more on user data, i.e. data intentionally produced or consumed by the user. Both on the internet and in corporate intranets, sharing this data is considered an easy way to customize desktops and to advertise one's creativity. The 'Get Hot New Stuff' (GHNS) framework in KDE exists to support this approach, and the KNewStuff library is the key for application authors to enable GHNS.&lt;br /&gt;
&lt;br /&gt;
== Preparations ==&lt;br /&gt;
The first steps are usually made in preparing the usage of KNewStuff. For this matter, the library must be available (a task which could be done using autoconf, but since it's part of kdelibs, we simply assume it's available with any recent KDE installation.) Authors of 3rd pary applications can ensure the availability as part of kdepim-libs in KDE 3.2 using the AC_KNEWSTUFF macro. It must also be included in the set of libraries against which the application is linked, so modifying the {{path|Makefile.am}} and reconfiguring the application are to be done.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
bin_PROGRAMS = myapp&lt;br /&gt;
myapp_LDADD = $(LIB_KDECORE) ... -lknewstuff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
The header files are installed under {{path|$KDEDIR/include/knewstuff/}}, so in the relevant files, they're included with statements such as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;knewstuff/downloaddialog.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
The following header files are provided by KNewStuff:&lt;br /&gt;
* {{path|downloaddialog.h}}: Easy to use download dialog&lt;br /&gt;
* {{path|engine.h}}: Access to the complex, but customizable background operations&lt;br /&gt;
* {{path|entry.h}}: (internal) Data fields of entries, such as Author or Title&lt;br /&gt;
* {{path|ghns.h}}: [not installed]&lt;br /&gt;
* {{path|knewstuffgeneric.h}}: Easy to use installation handler for the downloaded files&lt;br /&gt;
* {{path|knewstuff.h}}: Main knewstuff functionality&lt;br /&gt;
* {{path|providerdialog.h}}: Preconfigured dialog for provider selection&lt;br /&gt;
* {{path|provider.h}}: Provider entries, and ProviderLoader&lt;br /&gt;
* {{path|testnewstuff.h}}: [not installed]&lt;br /&gt;
* {{path|uploaddialog.h}}: Easy to use upload dialog&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more information on the background processes, please have a look at the information provided by [http://www.kstuff.org/docs/ kstuff.org]. However application authors should only need a basic understanding of those.&lt;br /&gt;
&lt;br /&gt;
== Downloading Data ==&lt;br /&gt;
&lt;br /&gt;
Depending on the application, providing additional data can be accomplished using the 'File Import' dialog, 'Internet Level' menu item, or just an 'Update now' {{class|KAction}}. All of those have in common that they invoke a slot which will contain the actual {{class|KNewStuff}} calls. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void MyApp::slotDownload()&lt;br /&gt;
{&lt;br /&gt;
  KNewStuff::DownloadDialog::open(&amp;quot;myapp/templates&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is all. If desired, more control can be exercised on the whole download process, as outlined below. For the beginning, the above is already fully functional, and should be used at first.&lt;br /&gt;
&lt;br /&gt;
== Downloading in Detail ==&lt;br /&gt;
The example above implicitely constructs an internal Engine object, retrieves the directory list, fetches the provider lists specified in the directory, and the entries in each of the provider lists, compares them to the data files previously installed, and displays them in the download dialog. This dialog in turn handles all the installation issues. Of course there is no magic involved, and for more control about the subtasks, the following is recommended: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
(to be precised)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Similar to the provider list, the installation procedures are described in the application's configuration file. The default (if these entries are missing) is to just download the file to a temporary location, which is not useful in most of the cases. There are two entries: target location, and post-installation command. The target location can either be StandardResource, matching the KDE resource types, or TargetDir, matching an application directory under {{path|$KDEHOME/share/apps/appname}}. The post installation command can be a binary with '%f' as parameter (note the single quotes to prevent string format attacks), but it can as well be a DCOP call, so the application can directly work with the data. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[KNewStuff]&lt;br /&gt;
StandardResource=wallpaper&lt;br /&gt;
InstallationCommand=dcop kdesktop KBackgroundIface setWallpaper '%f' 2&lt;br /&gt;
&lt;br /&gt;
TargetDir=kamikaze&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uploads ==&lt;br /&gt;
&lt;br /&gt;
The beginning of the upload process works similar to downloads. A MasterServer or ProvidersUrl is used to retrieve the provider list, and one of the providers is selected by the user. Only providers which allow uploads are taken into account. After this selection however, the differences begin. The user has to fill in the necessary information such as title, author name or version number into the upload dialog. Also, the payload and preview files have to be selected, this however will in most cases be the application's task.  In Kamikaze, the level file is pre-rendered to an invisible {{qt3|QCanvas}}, and the resulting graphics is minimized and automatically specified for the upload.  The upload will then happen using the protocol accepted by the provider, which in most cases will be anonymous FTP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;knewstuff/knewstuffgeneric.h&amp;gt;&lt;br /&gt;
#include &amp;lt;knewstuff/engine.h&amp;gt;&lt;br /&gt;
#include &amp;lt;knewstuff/uploaddialog.h&amp;gt;&lt;br /&gt;
// ...&lt;br /&gt;
QString file, previewfile;&lt;br /&gt;
KNewStuffGeneric *ns = new KNewStuffGeneric(&amp;quot;myapp/templates&amp;quot;, this);&lt;br /&gt;
ns-&amp;gt;upload(file.name(), previewfile.name());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Finding the provider ==&lt;br /&gt;
&lt;br /&gt;
In order to connect to the provider, you have to add the KNewStuff configuration to the config file of the application.&lt;br /&gt;
&lt;br /&gt;
This can be done by adding the following lines to the ''myapprc'' file (create the file if there was none):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[KNewStuff]&lt;br /&gt;
ProvidersUrl=http://where_my_xml_file_is/providers.xml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To install it in the proper location, just add the following line to the {{path|Makefile.am}}:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
kde_conf_DATA = ''myapprc''&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting up a provider.xml file ==&lt;br /&gt;
&lt;br /&gt;
The {{path|provider.xml}} file holds the general information about the new stuff source (for example the name or the icon), and - most important thing - the location to the XML file containing the stuff for the application.&lt;br /&gt;
&lt;br /&gt;
Here it is a simple {{path|provider.xml}} file, with no upload URL specified:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;provider downloadurl=&amp;quot;http://where_my_newstuff_are/knewstuff.xml&amp;quot;&lt;br /&gt;
          nouploadurl=&amp;quot;&amp;quot;&lt;br /&gt;
          icon=&amp;quot;http://where_my_newstuff_are/myapp_newstuff.png&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;New stuff for MyApp!&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/provider&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Sharing creativity should become a default property of modern desktops, and KDE once again leads the pack by providing both upload and download facilities. If enough applications of different areas make use of them, it helps users to be more productive and have more fun with their computer.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Help:Contents</id>
		<title>Help:Contents</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Help:Contents"/>
				<updated>2011-06-28T12:06:17Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* Tips */ Fix syntaxhighlight keyword.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Help:Contents}}&lt;br /&gt;
&lt;br /&gt;
Before you start to add or change content, please read:&lt;br /&gt;
* [[Help:Contribute|Contributing to TechBase]]&lt;br /&gt;
* [[Help:Wiki Structure|Wiki Structure]]&lt;br /&gt;
* [[Help:Wiki Translation|Translation into other Languages]]&lt;br /&gt;
* [[KDE_TechBase:Migrate_content|Migrating Content]]&lt;br /&gt;
* [[KDE_TechBase:Contributors|List of active contributors]], also contact points&lt;br /&gt;
&lt;br /&gt;
== Wiki Syntax ==&lt;br /&gt;
To get started with the MediaWiki syntax, read:&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Editing Help on Editing]&lt;br /&gt;
* [http://meta.wikimedia.org/wiki/Help:Table Wikitables]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Wikipedia:Extended_image_syntax Syntax for displaying images]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Magic_words Magic words]&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Wikipedia:Cheatsheet The most important commands]&lt;br /&gt;
* How to [[KDE TechBase:Migrate content|Migrate content]]&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
; Syntax highlighting&lt;br /&gt;
: Wrap your C++ Qt/KDE code snippets in &amp;lt;tt&amp;gt;&amp;amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; line=&amp;quot;&amp;quot;&amp;amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;amp;gt;&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;&amp;amp;lt;/syntaxhighlight&amp;amp;gt;&amp;lt;/tt&amp;gt; to get syntax highlighting (&amp;lt;tt&amp;gt;cpp&amp;lt;/tt&amp;gt; for C++, &amp;lt;tt&amp;gt;cpp-qt&amp;lt;/tt&amp;gt; for Qt) and numbered lines (&amp;lt;tt&amp;gt;line=&amp;quot;&amp;quot;&amp;lt;/tt&amp;gt;). Replace &amp;lt;tt&amp;gt;cpp&amp;lt;/tt&amp;gt; with [http://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi#Supported_languages the language used], e.g. &amp;lt;tt&amp;gt;ruby&amp;lt;/tt&amp;gt; for Ruby and &amp;lt;tt&amp;gt;python&amp;lt;/tt&amp;gt; for Python (soon). Use &amp;lt;tt&amp;gt;ini&amp;lt;/tt&amp;gt; for {{path|.desktop}} files, &amp;lt;tt&amp;gt;xml&amp;lt;/tt&amp;gt; for XML files.&lt;br /&gt;
&lt;br /&gt;
== New Templates ==&lt;br /&gt;
To get a list of pages using a template, go to corresponding template page (e.g. [[Template:movepage]]) and click &amp;quot;''What links here''&amp;quot; in the toolbox.&lt;br /&gt;
&lt;br /&gt;
; [[Template:movepage|&amp;lt;nowiki&amp;gt;{{movepage|url}}&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
: Use this template to mark a page as not finished.&lt;br /&gt;
&lt;br /&gt;
; [[Template:Improve|&amp;lt;nowiki&amp;gt;{{improve|explanation}}&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
: Pages which need cleanups or contain empty sections and/or todos are marked with this template. Add an explanation if you want (optional)&lt;br /&gt;
&lt;br /&gt;
; [[Template:tip|&amp;lt;nowiki&amp;gt;{{tip|text}}&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
: Use this template to add a tip for the reader.&lt;br /&gt;
&lt;br /&gt;
; [[Template:note|&amp;lt;nowiki&amp;gt;{{note|text}}&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
: Use this template to add an explanatory note.&lt;br /&gt;
&lt;br /&gt;
; [[Template:warning|&amp;lt;nowiki&amp;gt;{{warning|text}}&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
: Use this template to add a warning.&lt;br /&gt;
&lt;br /&gt;
; [[Template:qt|&amp;lt;nowiki&amp;gt;{{qt|class-name}}&amp;lt;/nowiki&amp;gt;]] and [[Template:qt3|&amp;lt;nowiki&amp;gt;{{qt3|class-name}}&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
: Use this template to generate a link to a Qt class, e.g. QWidget. For Qt3 classes use &amp;lt;nowiki&amp;gt;{{qt3|class-name}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; [[Template:class|&amp;lt;nowiki&amp;gt;{{class|class-name}}&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
: Use this template to generate a link to a KDE class, e.g. KDialog.&lt;br /&gt;
&lt;br /&gt;
; [[Template:path|&amp;lt;nowiki&amp;gt;{{path|path-or-filename}}&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
: Use this template for paths and filenames, this way all of them have a consistent style.&lt;br /&gt;
&lt;br /&gt;
; [[Template:bug|&amp;lt;nowiki&amp;gt;{{bug|123456}}&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
: Use this template to automatically create a link to KDE's bugzilla.&lt;br /&gt;
&lt;br /&gt;
; [[Template:KDE3|&amp;lt;nowiki&amp;gt;{{KDE3}}&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
: Use this template to mark the content of a page as applicable for either KDE 3. Don't tag technology agnostic pages. For KDE4 content, use &amp;lt;nowiki&amp;gt;[[Category:KDE4]]&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; [[Template:TutorialBrowser|&amp;lt;nowiki&amp;gt;{{TutorialBrowser|series|name|pre|next|reading}}&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
: A template for tutorial navigation&lt;br /&gt;
&lt;br /&gt;
; [[Template:Box|&amp;lt;nowiki&amp;gt;{{Box|caption|text|width|float}}&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
: Use this template to create a box with a caption and a text. The width parameter is optional and can be specified absolute (400px) or relative (50%). The last parameter is the float value, which is also optional and defaults to center.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User_talk:JRT</id>
		<title>User talk:JRT</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User_talk:JRT"/>
				<updated>2011-06-28T11:41:55Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /* code tag obsolete */ fix another tag ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== KDE4-both ==&lt;br /&gt;
&lt;br /&gt;
Hey, I removed your link to &amp;quot;KDE4-both&amp;quot;, because no one has written that page yet ;) also I find it of questionable usefulness. --[[User:Logixoul|Logixoul]] 20:18, 5 April 2008 (CEST)&lt;br /&gt;
&lt;br /&gt;
Sorry about the link.  I couldn't figure out how to change it.&lt;br /&gt;
&lt;br /&gt;
Please also note that your changes screwed up various things to the point the references were contradictory and, in some cases, simply WRONG.&lt;br /&gt;
&lt;br /&gt;
== code tag obsolete ==&lt;br /&gt;
&lt;br /&gt;
Hi,&lt;br /&gt;
&lt;br /&gt;
the code tag is obsolete. But please do not delete contents because of that.&lt;br /&gt;
The code tag can be replaced (and we are doing it currently, but it will take another week or so to get them all) by &amp;amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;amp;gt;, with the supported languages being http://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi#Supported_languages and probably more. I think we have &amp;quot;cmake&amp;quot; as well. :)&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User_talk:JRT</id>
		<title>User talk:JRT</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User_talk:JRT"/>
				<updated>2011-06-28T11:41:01Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /*  tag obsolete */ fix tag ;)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== KDE4-both ==&lt;br /&gt;
&lt;br /&gt;
Hey, I removed your link to &amp;quot;KDE4-both&amp;quot;, because no one has written that page yet ;) also I find it of questionable usefulness. --[[User:Logixoul|Logixoul]] 20:18, 5 April 2008 (CEST)&lt;br /&gt;
&lt;br /&gt;
Sorry about the link.  I couldn't figure out how to change it.&lt;br /&gt;
&lt;br /&gt;
Please also note that your changes screwed up various things to the point the references were contradictory and, in some cases, simply WRONG.&lt;br /&gt;
&lt;br /&gt;
== code tag obsolete ==&lt;br /&gt;
&lt;br /&gt;
Hi,&lt;br /&gt;
&lt;br /&gt;
the code tag is obsolete. But please do not delete contents because of that.&lt;br /&gt;
The code tag can be replaced (and we are doing it currently, but it will take another week or so to get them all) by &amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;, with the supported languages being http://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi#Supported_languages and probably more. I think we have &amp;quot;cmake&amp;quot; as well. :)&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User_talk:JRT</id>
		<title>User talk:JRT</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User_talk:JRT"/>
				<updated>2011-06-28T11:40:35Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: /*  tag obsolete */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== KDE4-both ==&lt;br /&gt;
&lt;br /&gt;
Hey, I removed your link to &amp;quot;KDE4-both&amp;quot;, because no one has written that page yet ;) also I find it of questionable usefulness. --[[User:Logixoul|Logixoul]] 20:18, 5 April 2008 (CEST)&lt;br /&gt;
&lt;br /&gt;
Sorry about the link.  I couldn't figure out how to change it.&lt;br /&gt;
&lt;br /&gt;
Please also note that your changes screwed up various things to the point the references were contradictory and, in some cases, simply WRONG.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt; tag obsolete ==&lt;br /&gt;
&lt;br /&gt;
Hi,&lt;br /&gt;
&lt;br /&gt;
the code tag is obsolete. But please do not delete contents because of that.&lt;br /&gt;
The code tag can be replaced (and we are doing it currently, but it will take another week or so to get them all) by &amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;, with the supported languages being http://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi#Supported_languages and probably more. I think we have &amp;quot;cmake&amp;quot; as well. :)&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Getting_Started/Build/Distributions/Linux_From_Scratch</id>
		<title>Getting Started/Build/Distributions/Linux From Scratch</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Getting_Started/Build/Distributions/Linux_From_Scratch"/>
				<updated>2011-06-28T11:35:12Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Getting_Started/Build/Distributions/LFS}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Getting Started|&lt;br /&gt;
&lt;br /&gt;
name=Building KDE4 From Source (Linux From Scratch requirements)|&lt;br /&gt;
&lt;br /&gt;
pre=[[Getting_Started/Build|Build KDE]], [[Getting_Started/Tutorials/D-Bus/Configuration|D-Bus Configuration]]|&lt;br /&gt;
next=[[Getting_Started/Build|Build KDE]]|&lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake |Introduction to CMake]]|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== CMake ==&lt;br /&gt;
&lt;br /&gt;
KDE-4 and some supporting libraries use CMake.&lt;br /&gt;
&lt;br /&gt;
Install the latest version from cmake.org&lt;br /&gt;
&lt;br /&gt;
== Library Requirements ==&lt;br /&gt;
&lt;br /&gt;
===General dependencies===&lt;br /&gt;
&lt;br /&gt;
KDE-4 requires a lot of the same general purpose libraries as KDE-3.&lt;br /&gt;
&lt;br /&gt;
The output from running CMake should list what you are missing -- which generally applicable libraries that you need which I will not discuss further.&lt;br /&gt;
&lt;br /&gt;
===DBus and HAL===&lt;br /&gt;
&lt;br /&gt;
A system should have these installed:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;DBus&lt;br /&gt;
::DBus-Glib&lt;br /&gt;
::HAL&lt;br /&gt;
::HAL-Info&lt;br /&gt;
::PolicyKit-0.9&lt;br /&gt;
::EggDBus&lt;br /&gt;
::polkit-0.97&lt;br /&gt;
::ConsoleKit&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(and properly configured) although, strictly speaking, they are not all dependencies for KDE-4.x.&lt;br /&gt;
&lt;br /&gt;
See: [http://www.linuxfromscratch.org/blfs/view/svn BLFS] for build and configure instructions.&lt;br /&gt;
&lt;br /&gt;
HOWEVER, KDE-4 and KDESupport libraries may need newer versions of the libraries than those in BLFS.  So, it is probably best to install the versions stated above or the latest releases of these dependencies rather than the versions in BLFS.&lt;br /&gt;
&lt;br /&gt;
Some of these libraries are dependent on:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;Linux-PAM-1.1.1&lt;br /&gt;
::Shadow-4.1.4.2&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which should be installed and configured according to the BLFS instructions.&lt;br /&gt;
&lt;br /&gt;
===DocBook DTD===&lt;br /&gt;
&lt;br /&gt;
KDE-4 still requires version 4.2 of:&lt;br /&gt;
&lt;br /&gt;
::DocBook SGML DTD&lt;br /&gt;
::DocBook XML DTD.&lt;br /&gt;
&lt;br /&gt;
See the instructions in this old version of BLFS:&lt;br /&gt;
&lt;br /&gt;
::http://archive.linuxfromscratch.org/blfs-museum/5.0/BLFS-5.0/&lt;br /&gt;
&lt;br /&gt;
===Boost C++ Libraries===&lt;br /&gt;
&lt;br /&gt;
Get the current release (e.g. boost_1_42_0.tar.gz) here:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/boost/files/boost/&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
The current release eliminates the arcane naming issues.  Although not the same as using autotools, it is now simple to build and install.&lt;br /&gt;
&lt;br /&gt;
Remove the includes from previous versions:&lt;br /&gt;
&lt;br /&gt;
::/usr/include/boost_&amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and if you have a link:&lt;br /&gt;
&lt;br /&gt;
::/usr/include/boost&lt;br /&gt;
&lt;br /&gt;
remove that also.&lt;br /&gt;
&lt;br /&gt;
Then:&lt;br /&gt;
&lt;br /&gt;
::./bootstrap.sh --prefix=/usr&lt;br /&gt;
::./bjam install&lt;br /&gt;
&lt;br /&gt;
===CLucene===&lt;br /&gt;
The CLucene developers suggest using the GIT repository since there are no recent releases.  However, KDE-4 currently depends on the last (old) release:&lt;br /&gt;
&lt;br /&gt;
::http://downloads.sourceforge.net/project/clucene/clucene-core-stable/0.9.21b/clucene-core-0.9.21b.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Do NOT use CMake to build it.&lt;br /&gt;
&lt;br /&gt;
===Qt===&lt;br /&gt;
&lt;br /&gt;
=====TRUNK=====&lt;br /&gt;
&lt;br /&gt;
Use kde-qt from:&lt;br /&gt;
&lt;br /&gt;
::git clone git://gitorious.org/+kde-developers/qt/kde-qt.git&lt;br /&gt;
&lt;br /&gt;
This installs as Qt-&amp;lt;version&amp;gt;, so when it updates to the next version, it won't install in the same place.  This means that you will need to change the &amp;lt;version&amp;gt; any place where it is specified.  You will also have to install QCA (and its plugins) again when the version changes.&lt;br /&gt;
&lt;br /&gt;
=====KDE &amp;gt;= 4.4=====&lt;br /&gt;
&lt;br /&gt;
You can use the GIT clone [see TRUNK above], or your can use the latest release of QT-4.6.x from Nokia:&lt;br /&gt;
&lt;br /&gt;
::http://qt.nokia.com/downloads/linux-x11-cpp&lt;br /&gt;
&lt;br /&gt;
=====BRANCH up to 4.3 or a release up to 4.3.x=====&lt;br /&gt;
&lt;br /&gt;
Use 4.5.3:&lt;br /&gt;
&lt;br /&gt;
::http://qt.nokia.com/downloads/downloads#lgpl&lt;br /&gt;
&lt;br /&gt;
Or a newer release (see above).  A newer release may have issues.&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
You will probably need to use some options for configuring Qt.  Various options may be appropriate and/or needed depending on your system, what you have installed, and where it is installed.  Run:&lt;br /&gt;
&lt;br /&gt;
  ./configure --help&lt;br /&gt;
&lt;br /&gt;
to see the options.  There are a lot of them, but the defaults work for most of them.&lt;br /&gt;
&lt;br /&gt;
Suggested configuration:&lt;br /&gt;
&lt;br /&gt;
::./configure -no-separate-debug-info -plugin-sql-mysql -I/usr/include/mysql -plugin-sql-sqlite -optimized-qmake -nomake demos -nomake examples -fast -dbus&lt;br /&gt;
&lt;br /&gt;
{change the include directory for mysql as needed}&lt;br /&gt;
&lt;br /&gt;
If installing Phonon from KDESupport (recommended), or other separate Phonon, add the configure option:&lt;br /&gt;
&lt;br /&gt;
::-no-phonon&lt;br /&gt;
&lt;br /&gt;
to avoid having two versions of libraries with the same SO number.&lt;br /&gt;
&lt;br /&gt;
===QCA-2.0.2 (crypto add on for Qt)===&lt;br /&gt;
&lt;br /&gt;
Do not use the one in KDESupport or KDE's SVN.&lt;br /&gt;
&lt;br /&gt;
Download the current release of qca from:&lt;br /&gt;
&lt;br /&gt;
::http://delta.affinix.com/download/qca/2.0/&lt;br /&gt;
&lt;br /&gt;
and the plugins:&lt;br /&gt;
&lt;br /&gt;
::qca-cyrus-sasl&lt;br /&gt;
::qca-gnupg&lt;br /&gt;
::qca-ossl&lt;br /&gt;
&lt;br /&gt;
from:&lt;br /&gt;
&lt;br /&gt;
::http://delta.affinix.com/download/qca/2.0/plugins/&lt;br /&gt;
&lt;br /&gt;
NOTE: qca-ossl-2.0.0-beta3 will not build against the current release of OpenSSL without being patched:&lt;br /&gt;
&lt;br /&gt;
::http://home.earthlink.net/~tyrerj/kde/KDE-4/qca-ossl.patch&lt;br /&gt;
&lt;br /&gt;
===LibDBusMenu-Qt===&lt;br /&gt;
&lt;br /&gt;
Required for KDE &amp;gt;= 4.5.0.  Appears to be optional for KDE-4.4.&lt;br /&gt;
&lt;br /&gt;
Get release &amp;gt;= 0.3.5 here:&lt;br /&gt;
&lt;br /&gt;
::https://launchpad.net/libdbusmenu-qt/+download&lt;br /&gt;
&lt;br /&gt;
and the current release of the dependency QJson here:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/qjson/files/&lt;br /&gt;
&lt;br /&gt;
===GMM===&lt;br /&gt;
&lt;br /&gt;
If you don't have Getfem++ installed, get the current release of GMM from:&lt;br /&gt;
&lt;br /&gt;
::http://home.gna.org/getfem/download.html&lt;br /&gt;
&lt;br /&gt;
===Qzion and Qedjie===&lt;br /&gt;
&lt;br /&gt;
Get them:&lt;br /&gt;
&lt;br /&gt;
::http://code.openbossa.org/projects/qedje/pages/Home&lt;br /&gt;
&lt;br /&gt;
You also need the dependency EET.  Get either the snapshot there o the current release here:&lt;br /&gt;
&lt;br /&gt;
::http://download.enlightenment.org/releases/&lt;br /&gt;
&lt;br /&gt;
PROBLEM: KDE requires QEdje &amp;gt;= 0.4.0 which depends on QZion &amp;gt;= 0.4.0 and the 0.4.0 release of QZion will not build.&lt;br /&gt;
&lt;br /&gt;
If it won't build, check line 13 of the file:&lt;br /&gt;
&lt;br /&gt;
:: ... /qzion-mainline/python/qzion/qzionobject.sip&lt;br /&gt;
&lt;br /&gt;
It should be:&lt;br /&gt;
&lt;br /&gt;
::        const char *name;&lt;br /&gt;
&lt;br /&gt;
===Eigen2===&lt;br /&gt;
&lt;br /&gt;
Get the current 2.0.x release from:&lt;br /&gt;
&lt;br /&gt;
::http://eigen.tuxfamily.org&lt;br /&gt;
&lt;br /&gt;
===Java Development Kit===&lt;br /&gt;
&lt;br /&gt;
You need a Java compiler with JNI to build the Sesame2 storage backend for Soprano and a Java RunTime (JVM) to run it.&lt;br /&gt;
&lt;br /&gt;
::http://java.sun.com/javase/downloads/widget/jdk6.jsp&lt;br /&gt;
&lt;br /&gt;
Remember to add the &amp;quot;bin&amp;quot; directory to your path and the &amp;quot;lib&amp;quot; directory to your &amp;quot;/etc/ld.so.conf&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
===Raptor, Rasqal, and Redland===&lt;br /&gt;
&lt;br /&gt;
Get:&lt;br /&gt;
&lt;br /&gt;
::redland-1.0.8&lt;br /&gt;
::rasqal-0.9.19&lt;br /&gt;
::raptor-1.4.21&lt;br /&gt;
&lt;br /&gt;
From:&lt;br /&gt;
&lt;br /&gt;
::http://download.librdf.org/source/&lt;br /&gt;
&lt;br /&gt;
Note: newer versions of Redland don't work.&lt;br /&gt;
&lt;br /&gt;
and the current release of the (optional) Redland dependency 3Store here:&lt;br /&gt;
&lt;br /&gt;
::http://downloads.sourceforge.net/project/threestore/files/&lt;br /&gt;
&lt;br /&gt;
Note: If 3store3-3.0.17 will not build against Rasqal, then skip it for now -- it is optional.&lt;br /&gt;
&lt;br /&gt;
When building Redland, you will probably need to use:&lt;br /&gt;
&lt;br /&gt;
::--with-bdb=&lt;br /&gt;
&lt;br /&gt;
to point to your Berkeley DB directory.&lt;br /&gt;
&lt;br /&gt;
If your installed SQLite is &amp;gt; 3.6.16, you will probably have to configure Redland with:&lt;br /&gt;
&lt;br /&gt;
::--with-sqlite=no&lt;br /&gt;
&lt;br /&gt;
Install in this order:&lt;br /&gt;
&lt;br /&gt;
::Raptor&lt;br /&gt;
::Rasqal&lt;br /&gt;
::Redland&lt;br /&gt;
&lt;br /&gt;
===Virtuoso Open-Source===&lt;br /&gt;
&lt;br /&gt;
Only needed for KDE &amp;gt;= 4.4 and TRUNK&lt;br /&gt;
&lt;br /&gt;
Get virtuoso-opensource &amp;gt;= 6.1.1 here:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/virtuoso/&lt;br /&gt;
&lt;br /&gt;
If you have problems, use the direct link:&lt;br /&gt;
&lt;br /&gt;
::http://downloads.sourceforge.net/project/virtuoso/virtuoso/6.1.1/virtuoso-opensource-6.1.1.tar.gz&lt;br /&gt;
&lt;br /&gt;
and the current release of the dependency iODBC here:&lt;br /&gt;
&lt;br /&gt;
::http://www.iodbc.org/dataspace/iodbc/wiki/iODBC/Downloads&lt;br /&gt;
&lt;br /&gt;
If building iODBC only for KDE, use configure parameter:&lt;br /&gt;
&lt;br /&gt;
::--disable-gui&lt;br /&gt;
&lt;br /&gt;
For building Virtuoso, these configure parameters are useful:&lt;br /&gt;
&lt;br /&gt;
::--with-jdk4=&lt;br /&gt;
::--without-internal-zlib &lt;br /&gt;
::--with-pthreads &lt;br /&gt;
::--with-readline &lt;br /&gt;
::--with-iodbc=&lt;br /&gt;
&lt;br /&gt;
If building Virtuoso only for KDE, (to save disk space) use configure parameter:&lt;br /&gt;
&lt;br /&gt;
::--disable-all-vads&lt;br /&gt;
&lt;br /&gt;
===KDE Supporting dependencies===&lt;br /&gt;
&lt;br /&gt;
=====TRUNK=====&lt;br /&gt;
&lt;br /&gt;
use KDESupport:&lt;br /&gt;
&lt;br /&gt;
::svn co svn://anonsvn.kde.org/home/kde/trunk/kdesupport&lt;br /&gt;
&lt;br /&gt;
If you don't want to install all the small SVN icons:&lt;br /&gt;
&lt;br /&gt;
::cd kdesupport/oxygen-icons&lt;br /&gt;
::svn rm `find -name &amp;quot;small&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
=====KDE 4.6=====&lt;br /&gt;
&lt;br /&gt;
There is no KDESupport-4.6 so, you need to install these packages with:&lt;br /&gt;
&lt;br /&gt;
::CMAKE_INSTALL_PREFIX:PATH=/opt/KDE-4.6 for the BRANCH.&lt;br /&gt;
&lt;br /&gt;
Or:&lt;br /&gt;
&lt;br /&gt;
::CMAKE_INSTALL_PREFIX:PATH=/opt/KDE-4.6.x for a release.&lt;br /&gt;
&lt;br /&gt;
======Automoc4======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/automoc4/&amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Attica======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/attica&lt;br /&gt;
&lt;br /&gt;
======Polkit-Qt======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/apps/KDE4.x/admin&lt;br /&gt;
&lt;br /&gt;
======Polkit-Qt-1======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/apps/KDE4.x/admin&lt;br /&gt;
&lt;br /&gt;
======Soprano======&lt;br /&gt;
&lt;br /&gt;
Available from Source Forge:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/soprano/&lt;br /&gt;
&lt;br /&gt;
======Akonadi======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::http://download.akonadi-project.org&lt;br /&gt;
&lt;br /&gt;
======Cagibi======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/cagibi&lt;br /&gt;
&lt;br /&gt;
======Strigi======&lt;br /&gt;
&lt;br /&gt;
version 0.7.2 is available here:&lt;br /&gt;
&lt;br /&gt;
::http://www.vandenoever.info/software/strigi/strigi-0.7.2.tar.bz2&lt;br /&gt;
&lt;br /&gt;
======QImageBlitz======&lt;br /&gt;
&lt;br /&gt;
Available from Source Forge:&lt;br /&gt;
&lt;br /&gt;
http://sourceforge.net/projects/qimageblitz/files/qimageblitz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====KDE 4.4 &amp;amp; 4.5=====&lt;br /&gt;
&lt;br /&gt;
Use KDESupport:&lt;br /&gt;
&lt;br /&gt;
::svn co svn://anonsvn.kde.org/home/kde/tags/kdesupport-for-&amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This does not include: Ontologies.  See below.&lt;br /&gt;
&lt;br /&gt;
=====BRANCH up to 4.3 or a release up to 4.3.x=====&lt;br /&gt;
&lt;br /&gt;
Use the KDESupport SVN tag that matches your KDE version.  E.G. for 4.3:&lt;br /&gt;
&lt;br /&gt;
::svn&amp;amp;nbsp;co&amp;amp;nbsp;svn://anonsvn.kde.org/home/kde/tags/kdesupport-for-4.3/kdesupport&lt;br /&gt;
&lt;br /&gt;
=====TagLib=====&lt;br /&gt;
&lt;br /&gt;
Since TagLib is also a dependency for GStreamer (gst-plugins-good), you probably don't want to have a redundant installation for the KDE-4 version that will be your 'production' version.  Remove it from KDESupport SVN:&lt;br /&gt;
&lt;br /&gt;
::svn rm taglib&lt;br /&gt;
&lt;br /&gt;
And install the current release from:&lt;br /&gt;
&lt;br /&gt;
::http://developer.kde.org/~wheeler/taglib.html&lt;br /&gt;
&lt;br /&gt;
NOTE: To get GST Plugins Good to build the plugin for TagLib you need to set the environment variable:&lt;br /&gt;
&lt;br /&gt;
::HAVE_CXX=&amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
before you run: &amp;quot;configure&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=====QCA=====&lt;br /&gt;
&lt;br /&gt;
The QCA in KDESupport is not currently used (see QCA-2.0.2 above) so:&lt;br /&gt;
&lt;br /&gt;
::svn rm qca&lt;br /&gt;
&lt;br /&gt;
=====Phonon=====&lt;br /&gt;
&lt;br /&gt;
For KDE Support 4.5 and TRUNK:&lt;br /&gt;
&lt;br /&gt;
Do not use the version in KDE Support.  Remove if from KDE Support:&lt;br /&gt;
&lt;br /&gt;
::svn rm phonon&lt;br /&gt;
&lt;br /&gt;
See below&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
The current KDESupport may not be compatible with LFS installed FFmpeg.  Use this patch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;diff&amp;quot;&amp;gt;&lt;br /&gt;
Index: strigi/src/streamanalyzer/endplugins/CMakeLists.txt&lt;br /&gt;
--- strigi/src/streamanalyzer/endplugins/CMakeLists.txt (revision 1096146)&lt;br /&gt;
+++ strigi/src/streamanalyzer/endplugins/CMakeLists.txt (working copy)&lt;br /&gt;
@@ -34,9 +34,3 @@&lt;br /&gt;
   target_link_libraries(xine ${XINE_LIBRARY})&lt;br /&gt;
 endif(XINE_FOUND)&lt;br /&gt;
 &lt;br /&gt;
-if(FFMPEG_FOUND)&lt;br /&gt;
-  include_directories(${FFMPEG_INCLUDE_DIRS})&lt;br /&gt;
-  ADD_STRIGIEA(ffmpeg ffmpegendanalyzer.cpp)&lt;br /&gt;
-  #set_target_properties( ffmpeg PROPERTIES COMPILE_FLAGS &amp;quot;${FFMPEG_DEFINITIONS}&amp;quot; )&lt;br /&gt;
-  target_link_libraries(ffmpeg ${FFMPEG_LIBRARIES})&lt;br /&gt;
-endif(FFMPEG_FOUND)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, use the FFmpeg snapshot on the CBLFS page:&lt;br /&gt;
&lt;br /&gt;
::http://cblfs.cross-lfs.org/index.php/FFmpeg&lt;br /&gt;
&lt;br /&gt;
This more recent snapshot requires: &amp;quot;libx264.so.83&amp;quot;.  The x264 snapshot on CBFLS is too old. This Source RPM worked:&lt;br /&gt;
&lt;br /&gt;
::x264-0.83.2245-1plf2010.1.src.rpm&lt;br /&gt;
&lt;br /&gt;
Google is your friend.&lt;br /&gt;
&lt;br /&gt;
NOTE: You may need to add these parameters to the CMake command line:&lt;br /&gt;
&lt;br /&gt;
::-DENABLE_FAM:BOOL=ON&lt;br /&gt;
::-DENABLE_EXPAT:BOOL=ON&lt;br /&gt;
::-DENABLE_INOTIFY:BOOL=ON&lt;br /&gt;
::-DGAIM_LIBS:STRING=&amp;lt;path&amp;gt;/lib&lt;br /&gt;
::-DGAMIN_LIBRARIES:STRING=&amp;lt;path&amp;gt;/lib&lt;br /&gt;
&lt;br /&gt;
You must build with the same CMake parameters as the KDE-4 modules; specifically:&lt;br /&gt;
 &lt;br /&gt;
::-DCMAKE_INSTALL_PREFIX:PATH=/opt/KDE-&amp;lt;version&amp;gt;&lt;br /&gt;
::-DSYSCONF_INSTALL_DIR=/etc/kde-&amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ontologies===&lt;br /&gt;
&lt;br /&gt;
Required for KDE &amp;gt;= 4.4 and TRUNK.&lt;br /&gt;
&lt;br /&gt;
If you checked out KDESupport from TRUNK, you have the package.  Otherwise, get TRUNK here:&lt;br /&gt;
&lt;br /&gt;
::git clone git://oscaf.git.sourceforge.net/gitroot/oscaf/oscaf&lt;br /&gt;
 &lt;br /&gt;
Or the release from Source Forge:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/oscaf/files/shared-desktop-ontologies/&lt;br /&gt;
&lt;br /&gt;
and install with CMake with:&lt;br /&gt;
&lt;br /&gt;
:CMAKE_INSTALL_PREFIX:PATH=/usr&lt;br /&gt;
&lt;br /&gt;
===Phonon===&lt;br /&gt;
&lt;br /&gt;
=====TRUNK=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Phonon&amp;lt;/b&amp;gt; has been moved to &lt;br /&gt;
&lt;br /&gt;
::http://gitorious.org/phonon&lt;br /&gt;
&lt;br /&gt;
Get it with the command:&lt;br /&gt;
&lt;br /&gt;
::git clone git://gitorious.org/phonon/phonon.git&lt;br /&gt;
&lt;br /&gt;
=====KDE &amp;gt;= 4.5=====&lt;br /&gt;
&lt;br /&gt;
The current release of Phonon is available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/phonon/&amp;lt;version&amp;gt;/src&lt;br /&gt;
&lt;br /&gt;
Also install back ends as needed.  You must install a back end -- either GStreamer or Xine for Linux.  They are available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/phonon/phonon-backend-&amp;lt;name&amp;gt;/4.4.4/&amp;lt;version&amp;gt;/src&lt;br /&gt;
&lt;br /&gt;
Where &amp;lt;name&amp;gt; is one of:&lt;br /&gt;
&lt;br /&gt;
:directshow&lt;br /&gt;
:gstreamer&lt;br /&gt;
:vlc&lt;br /&gt;
:xine&lt;br /&gt;
&lt;br /&gt;
=====KDE-4.4=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;big&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;KDEBindings-4.4.x will not build against Phonon from the GIT repository.&amp;lt;/font&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use the version in KDESupport-4.4.&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
Install with:&lt;br /&gt;
&lt;br /&gt;
::CMAKE_INSTALL_PREFIX=$QTDIR &lt;br /&gt;
&lt;br /&gt;
and the rest of the CMake parameters the same as KDESupport or Supporting dependencies.&lt;br /&gt;
&lt;br /&gt;
===PolKit-KDE-1===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====KDE &amp;gt;= 4.4 and TRUNK=====&lt;br /&gt;
&lt;br /&gt;
Use:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/apps/KDE4.x/admin/polkit-kde-1-0.95.1.tar.bz2&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
The 0.95.1 tarball from the KDE FTP site will not install correctly.  You need to apply this patch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;diff&amp;quot;&amp;gt;&lt;br /&gt;
diff -Naur polkit-kde-1-0.95.1.old/agent/CMakeLists.txt polkit-kde-1-0.95.1/agent/CMakeLists.txt&lt;br /&gt;
--- polkit-kde-1-0.95.1.old/agent/CMakeLists.txt	2009-12-23 04:31:29.000000000 -0700&lt;br /&gt;
+++ polkit-kde-1-0.95.1/agent/CMakeLists.txt	2010-03-25 15:54:12.000000000 -0700&lt;br /&gt;
@@ -11,7 +11,7 @@&lt;br /&gt;
 &lt;br /&gt;
 target_link_libraries(polkit-kde-authentication-agent-1&lt;br /&gt;
                                          ${KDE4_KDEUI_LIBS}&lt;br /&gt;
-                                         ${POLKITQT-1_AGENT_LIBRARY}&lt;br /&gt;
+                                         ${POLKITQT-1_LIBRARIES} &lt;br /&gt;
 )&lt;br /&gt;
 &lt;br /&gt;
 configure_file(polkit-kde-authentication-agent-1.desktop.in ${CMAKE_BINARY_DIR}/polkit-kde-authentication-agent-1.desktop)&lt;br /&gt;
@@ -25,4 +25,4 @@&lt;br /&gt;
   set (DESKTOP_INSTALL_DIR /etc/xdg/autostart)&lt;br /&gt;
 endif (DESKTOP_INSTALL_DIR)&lt;br /&gt;
 &lt;br /&gt;
-install(FILES ${CMAKE_BINARY_DIR}/polkit-kde-authentication-agent-1.desktop DESTINATION ${DESKTOP_INSTALL_DIR})&lt;br /&gt;
+install(FILES ${CMAKE_BINARY_DIR}/polkit-kde-authentication-agent-1.desktop DESTINATION ${KDE4_AUTOSTART_INSTALL_DIR})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must build with the same CMake parameters as the KDE-4 modules; specifically:&lt;br /&gt;
&lt;br /&gt;
::-DCMAKE_INSTALL_PREFIX:PATH=/opt/KDE-&amp;lt;version&amp;gt;&lt;br /&gt;
::-DSYSCONF_INSTALL_DIR=/etc/kde-&amp;lt;version&amp;gt;&lt;br /&gt;
::-DKDE4_AUTH_POLICY_FILES_INSTALL_DIR:STRING=/usr/share/PolicyKit/policy&lt;br /&gt;
&lt;br /&gt;
===shared-mime-info===&lt;br /&gt;
&lt;br /&gt;
You should have this installed with a prefix: &amp;quot;/usr&amp;quot;.  All you need to do is build KDE-4 with:&lt;br /&gt;
&lt;br /&gt;
::-DUPDATE_MIME_DATABASE_EXECUTABLE:FILEPATH=/usr/bin/update-mime-database&lt;br /&gt;
&lt;br /&gt;
However there appears to be a problem for KDE &amp;lt; 4.5&lt;br /&gt;
&lt;br /&gt;
Get the current release from:&lt;br /&gt;
&lt;br /&gt;
::http://www.freedesktop.org/wiki/Software/shared-mime-info&lt;br /&gt;
&lt;br /&gt;
You need to install this with the same prefix as KDE4 (even if you already have it installed in &amp;quot;/usr&amp;quot;) to eliminate missing MIME type errors.  Currently, KDELibs won't build unless you do this.  And, even if it does, you will get run time errors -- popup windows saying that certain MIME types can not be found.&lt;br /&gt;
&lt;br /&gt;
This appears to be a bug that was fixed with KDE-4.5; for ealier versions this workaround does seem to work.&lt;br /&gt;
&lt;br /&gt;
===KIPI Plugins===&lt;br /&gt;
&lt;br /&gt;
Get the current release from:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/kipi/&lt;br /&gt;
&lt;br /&gt;
This package is dependent on KDEGraphics.  The package has a lot of optional dependencies which you need to satisfy only if you want the corresponding plugins built.  You should install it in the same directory where you installed KDE-4.x.y.&lt;br /&gt;
&lt;br /&gt;
Be sure that you updated your: &amp;quot;PKG_CONFIG_PATH&amp;quot; to include $CMAKE_INSTALL_PREFIX/lib/pkgconfig (for example):&lt;br /&gt;
&lt;br /&gt;
::/opt/KDE-4/lib/pkgconfig&lt;br /&gt;
&lt;br /&gt;
===Oxygen Icons===&lt;br /&gt;
&lt;br /&gt;
If you checked out KDESupport from TRUNK or the TAG: &amp;quot;kdesupport-for-&amp;lt;version&amp;gt;&amp;quot;, you have them.&lt;br /&gt;
&lt;br /&gt;
If you checked out KDESupport from a tag &amp;quot;kdesupport-&amp;lt;version&amp;gt;&amp;quot; up to 4.3 or didn't use KDESupport, you need to get them.  If you are using SVN, that would be:&lt;br /&gt;
&lt;br /&gt;
::svn co svn://anonsvn.kde.org/home/kde/tags/KDE/&amp;lt;version&amp;gt;/oxygen-icons&lt;br /&gt;
&lt;br /&gt;
{where &amp;lt;version&amp;gt; is the latest release for the branch you are using (e.g. 4.3.4 for the 4.3 branch)}  &lt;br /&gt;
&lt;br /&gt;
Or, you can simply use TRUNK:&lt;br /&gt;
&lt;br /&gt;
::svn co svn://anonsvn.kde.org/home/kde/trunk/kdesupportsvn/oxygen-icons&lt;br /&gt;
&lt;br /&gt;
===LibSSH===&lt;br /&gt;
&lt;br /&gt;
TRUNK and KDE-4.4 require libssh.  Get the current release &amp;gt;= 0.4.0 from:&lt;br /&gt;
&lt;br /&gt;
::http://www.libssh.org/&lt;br /&gt;
&lt;br /&gt;
===Dependencies for specific KDE modules===&lt;br /&gt;
&lt;br /&gt;
====KDEBindings====&lt;br /&gt;
&lt;br /&gt;
=====SIP and PyQt=====&lt;br /&gt;
&lt;br /&gt;
To build the Python bindings for KDE, you need the current releases of SIP and PyQt from here:&lt;br /&gt;
&lt;br /&gt;
::http://www.riverbankcomputing.com/software/sip/download&lt;br /&gt;
::http://www.riverbankcomputing.com/software/pyqt/download&lt;br /&gt;
&lt;br /&gt;
Install: &amp;quot;SIP&amp;quot; first and then: &amp;quot;PyQt&amp;quot;.  These are both Python add-ons so they install with:&lt;br /&gt;
&lt;br /&gt;
::python configure.py&lt;br /&gt;
::make&lt;br /&gt;
::make install&lt;br /&gt;
&lt;br /&gt;
=====Build Notes for PyQt=====&lt;br /&gt;
&lt;br /&gt;
Unless you want to get into serious complications, you should only build PyQt against one version of Qt and you should only install one version of KDEBindings.  If you try to build against multiple versions of Qt or install multiple versions of KDEBindings, with a single instance of Python (or other languages), you will install two versions of the same file in the same place.&lt;br /&gt;
&lt;br /&gt;
PyQt will find Qt based on your environment variables.  So, if you want to install for a version of KDE other than the one that you are currently using, be sure that these are set correctly:&lt;br /&gt;
&lt;br /&gt;
::QTDIR&lt;br /&gt;
::QT_PLUGIN_PATH&lt;br /&gt;
&lt;br /&gt;
KDEBindings is dependent on KDEGraphics (specifically Okular).&lt;br /&gt;
&lt;br /&gt;
Other language dependencies are optional.  If you have other supported languages installed on your system, installing KDEBindings will build bindings for them.&lt;br /&gt;
&lt;br /&gt;
=====QScintilla2=====&lt;br /&gt;
&lt;br /&gt;
QScintilla2 is optional.  If you are installing it, get it here:&lt;br /&gt;
&lt;br /&gt;
::http://www.riverbankcomputing.com/software/qscintilla/download&lt;br /&gt;
&lt;br /&gt;
Install it after SIP &amp;amp; PyQt.  It has a Qt build system, so install for Qt4 it with:&lt;br /&gt;
&lt;br /&gt;
::cd Qt4&lt;br /&gt;
::qmake qscintilla.pro&lt;br /&gt;
::make&lt;br /&gt;
::make install&lt;br /&gt;
&lt;br /&gt;
====KDEEdu====&lt;br /&gt;
&lt;br /&gt;
KDEEdu might be dependent on KDEBindings.&lt;br /&gt;
&lt;br /&gt;
====KDENetwork====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;LibV4l&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only required for KDE &amp;gt;= 4.4 and TRUNK&lt;br /&gt;
&lt;br /&gt;
Get the current release here:&lt;br /&gt;
&lt;br /&gt;
::http://people.fedoraproject.org/~jwrdegoede/&lt;br /&gt;
&lt;br /&gt;
and follow the build instructions in the README file.&lt;br /&gt;
&lt;br /&gt;
=====Optional Dependencies=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Telepathy-Qt4&amp;lt;/b&amp;gt; is the Qt bindings for Telepathy.  Since this has general usage, you should probably install it along with its semi-optional dependency &amp;lt;b&amp;gt;telepathy-glib&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Get the current releases here:&lt;br /&gt;
&lt;br /&gt;
::http://telepathy.freedesktop.org/releases/telepathy-glib/&lt;br /&gt;
::http://telepathy.freedesktop.org/releases/telepathy-qt4/&lt;br /&gt;
&lt;br /&gt;
Install: &amp;quot;telepathy-glib&amp;quot; first and then: 'telepathy-qt4&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The output from CMake lists several other optional dependencies.  It appears that these are needed to support specific functions in KDENetwork.  So, if you need those functions, you need to install them.  You will probably also need to install the corresponding Telepathy addons from here:&lt;br /&gt;
&lt;br /&gt;
::http://telepathy.freedesktop.org/releases/&lt;br /&gt;
&lt;br /&gt;
TO DO: more information needed.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Getting_Started/Build/Distributions/Linux_From_Scratch</id>
		<title>Getting Started/Build/Distributions/Linux From Scratch</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Getting_Started/Build/Distributions/Linux_From_Scratch"/>
				<updated>2011-06-28T11:31:11Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Undo revision 59360 by JRT (talk) Please do not remove content just because it is shown in a broken matter.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Getting_Started/Build/Distributions/LFS}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Getting Started|&lt;br /&gt;
&lt;br /&gt;
name=Building KDE4 From Source (Linux From Scratch requirements)|&lt;br /&gt;
&lt;br /&gt;
pre=[[Getting_Started/Build|Build KDE]], [[Getting_Started/Tutorials/D-Bus/Configuration|D-Bus Configuration]]|&lt;br /&gt;
next=[[Getting_Started/Build|Build KDE]]|&lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake |Introduction to CMake]]|&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== CMake ==&lt;br /&gt;
&lt;br /&gt;
KDE-4 and some supporting libraries use CMake.&lt;br /&gt;
&lt;br /&gt;
Install the latest version from cmake.org&lt;br /&gt;
&lt;br /&gt;
== Library Requirements ==&lt;br /&gt;
&lt;br /&gt;
===General dependencies===&lt;br /&gt;
&lt;br /&gt;
KDE-4 requires a lot of the same general purpose libraries as KDE-3.&lt;br /&gt;
&lt;br /&gt;
The output from running CMake should list what you are missing -- which generally applicable libraries that you need which I will not discuss further.&lt;br /&gt;
&lt;br /&gt;
===DBus and HAL===&lt;br /&gt;
&lt;br /&gt;
A system should have these installed:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;DBus&lt;br /&gt;
::DBus-Glib&lt;br /&gt;
::HAL&lt;br /&gt;
::HAL-Info&lt;br /&gt;
::PolicyKit-0.9&lt;br /&gt;
::EggDBus&lt;br /&gt;
::polkit-0.97&lt;br /&gt;
::ConsoleKit&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(and properly configured) although, strictly speaking, they are not all dependencies for KDE-4.x.&lt;br /&gt;
&lt;br /&gt;
See: [http://www.linuxfromscratch.org/blfs/view/svn BLFS] for build and configure instructions.&lt;br /&gt;
&lt;br /&gt;
HOWEVER, KDE-4 and KDESupport libraries may need newer versions of the libraries than those in BLFS.  So, it is probably best to install the versions stated above or the latest releases of these dependencies rather than the versions in BLFS.&lt;br /&gt;
&lt;br /&gt;
Some of these libraries are dependent on:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;b&amp;gt;Linux-PAM-1.1.1&lt;br /&gt;
::Shadow-4.1.4.2&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which should be installed and configured according to the BLFS instructions.&lt;br /&gt;
&lt;br /&gt;
===DocBook DTD===&lt;br /&gt;
&lt;br /&gt;
KDE-4 still requires version 4.2 of:&lt;br /&gt;
&lt;br /&gt;
::DocBook SGML DTD&lt;br /&gt;
::DocBook XML DTD.&lt;br /&gt;
&lt;br /&gt;
See the instructions in this old version of BLFS:&lt;br /&gt;
&lt;br /&gt;
::http://archive.linuxfromscratch.org/blfs-museum/5.0/BLFS-5.0/&lt;br /&gt;
&lt;br /&gt;
===Boost C++ Libraries===&lt;br /&gt;
&lt;br /&gt;
Get the current release (e.g. boost_1_42_0.tar.gz) here:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/boost/files/boost/&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
The current release eliminates the arcane naming issues.  Although not the same as using autotools, it is now simple to build and install.&lt;br /&gt;
&lt;br /&gt;
Remove the includes from previous versions:&lt;br /&gt;
&lt;br /&gt;
::/usr/include/boost_&amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and if you have a link:&lt;br /&gt;
&lt;br /&gt;
::/usr/include/boost&lt;br /&gt;
&lt;br /&gt;
remove that also.&lt;br /&gt;
&lt;br /&gt;
Then:&lt;br /&gt;
&lt;br /&gt;
::./bootstrap.sh --prefix=/usr&lt;br /&gt;
::./bjam install&lt;br /&gt;
&lt;br /&gt;
===CLucene===&lt;br /&gt;
The CLucene developers suggest using the GIT repository since there are no recent releases.  However, KDE-4 currently depends on the last (old) release:&lt;br /&gt;
&lt;br /&gt;
::http://downloads.sourceforge.net/project/clucene/clucene-core-stable/0.9.21b/clucene-core-0.9.21b.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Do NOT use CMake to build it.&lt;br /&gt;
&lt;br /&gt;
===Qt===&lt;br /&gt;
&lt;br /&gt;
=====TRUNK=====&lt;br /&gt;
&lt;br /&gt;
Use kde-qt from:&lt;br /&gt;
&lt;br /&gt;
::git clone git://gitorious.org/+kde-developers/qt/kde-qt.git&lt;br /&gt;
&lt;br /&gt;
This installs as Qt-&amp;lt;version&amp;gt;, so when it updates to the next version, it won't install in the same place.  This means that you will need to change the &amp;lt;version&amp;gt; any place where it is specified.  You will also have to install QCA (and its plugins) again when the version changes.&lt;br /&gt;
&lt;br /&gt;
=====KDE &amp;gt;= 4.4=====&lt;br /&gt;
&lt;br /&gt;
You can use the GIT clone [see TRUNK above], or your can use the latest release of QT-4.6.x from Nokia:&lt;br /&gt;
&lt;br /&gt;
::http://qt.nokia.com/downloads/linux-x11-cpp&lt;br /&gt;
&lt;br /&gt;
=====BRANCH up to 4.3 or a release up to 4.3.x=====&lt;br /&gt;
&lt;br /&gt;
Use 4.5.3:&lt;br /&gt;
&lt;br /&gt;
::http://qt.nokia.com/downloads/downloads#lgpl&lt;br /&gt;
&lt;br /&gt;
Or a newer release (see above).  A newer release may have issues.&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
You will probably need to use some options for configuring Qt.  Various options may be appropriate and/or needed depending on your system, what you have installed, and where it is installed.  Run:&lt;br /&gt;
&lt;br /&gt;
  ./configure --help&lt;br /&gt;
&lt;br /&gt;
to see the options.  There are a lot of them, but the defaults work for most of them.&lt;br /&gt;
&lt;br /&gt;
Suggested configuration:&lt;br /&gt;
&lt;br /&gt;
::./configure -no-separate-debug-info -plugin-sql-mysql -I/usr/include/mysql -plugin-sql-sqlite -optimized-qmake -nomake demos -nomake examples -fast -dbus&lt;br /&gt;
&lt;br /&gt;
{change the include directory for mysql as needed}&lt;br /&gt;
&lt;br /&gt;
If installing Phonon from KDESupport (recommended), or other separate Phonon, add the configure option:&lt;br /&gt;
&lt;br /&gt;
::-no-phonon&lt;br /&gt;
&lt;br /&gt;
to avoid having two versions of libraries with the same SO number.&lt;br /&gt;
&lt;br /&gt;
===QCA-2.0.2 (crypto add on for Qt)===&lt;br /&gt;
&lt;br /&gt;
Do not use the one in KDESupport or KDE's SVN.&lt;br /&gt;
&lt;br /&gt;
Download the current release of qca from:&lt;br /&gt;
&lt;br /&gt;
::http://delta.affinix.com/download/qca/2.0/&lt;br /&gt;
&lt;br /&gt;
and the plugins:&lt;br /&gt;
&lt;br /&gt;
::qca-cyrus-sasl&lt;br /&gt;
::qca-gnupg&lt;br /&gt;
::qca-ossl&lt;br /&gt;
&lt;br /&gt;
from:&lt;br /&gt;
&lt;br /&gt;
::http://delta.affinix.com/download/qca/2.0/plugins/&lt;br /&gt;
&lt;br /&gt;
NOTE: qca-ossl-2.0.0-beta3 will not build against the current release of OpenSSL without being patched:&lt;br /&gt;
&lt;br /&gt;
::http://home.earthlink.net/~tyrerj/kde/KDE-4/qca-ossl.patch&lt;br /&gt;
&lt;br /&gt;
===LibDBusMenu-Qt===&lt;br /&gt;
&lt;br /&gt;
Required for KDE &amp;gt;= 4.5.0.  Appears to be optional for KDE-4.4.&lt;br /&gt;
&lt;br /&gt;
Get release &amp;gt;= 0.3.5 here:&lt;br /&gt;
&lt;br /&gt;
::https://launchpad.net/libdbusmenu-qt/+download&lt;br /&gt;
&lt;br /&gt;
and the current release of the dependency QJson here:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/qjson/files/&lt;br /&gt;
&lt;br /&gt;
===GMM===&lt;br /&gt;
&lt;br /&gt;
If you don't have Getfem++ installed, get the current release of GMM from:&lt;br /&gt;
&lt;br /&gt;
::http://home.gna.org/getfem/download.html&lt;br /&gt;
&lt;br /&gt;
===Qzion and Qedjie===&lt;br /&gt;
&lt;br /&gt;
Get them:&lt;br /&gt;
&lt;br /&gt;
::http://code.openbossa.org/projects/qedje/pages/Home&lt;br /&gt;
&lt;br /&gt;
You also need the dependency EET.  Get either the snapshot there o the current release here:&lt;br /&gt;
&lt;br /&gt;
::http://download.enlightenment.org/releases/&lt;br /&gt;
&lt;br /&gt;
PROBLEM: KDE requires QEdje &amp;gt;= 0.4.0 which depends on QZion &amp;gt;= 0.4.0 and the 0.4.0 release of QZion will not build.&lt;br /&gt;
&lt;br /&gt;
If it won't build, check line 13 of the file:&lt;br /&gt;
&lt;br /&gt;
:: ... /qzion-mainline/python/qzion/qzionobject.sip&lt;br /&gt;
&lt;br /&gt;
It should be:&lt;br /&gt;
&lt;br /&gt;
::        const char *name;&lt;br /&gt;
&lt;br /&gt;
===Eigen2===&lt;br /&gt;
&lt;br /&gt;
Get the current 2.0.x release from:&lt;br /&gt;
&lt;br /&gt;
::http://eigen.tuxfamily.org&lt;br /&gt;
&lt;br /&gt;
===Java Development Kit===&lt;br /&gt;
&lt;br /&gt;
You need a Java compiler with JNI to build the Sesame2 storage backend for Soprano and a Java RunTime (JVM) to run it.&lt;br /&gt;
&lt;br /&gt;
::http://java.sun.com/javase/downloads/widget/jdk6.jsp&lt;br /&gt;
&lt;br /&gt;
Remember to add the &amp;quot;bin&amp;quot; directory to your path and the &amp;quot;lib&amp;quot; directory to your &amp;quot;/etc/ld.so.conf&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
===Raptor, Rasqal, and Redland===&lt;br /&gt;
&lt;br /&gt;
Get:&lt;br /&gt;
&lt;br /&gt;
::redland-1.0.8&lt;br /&gt;
::rasqal-0.9.19&lt;br /&gt;
::raptor-1.4.21&lt;br /&gt;
&lt;br /&gt;
From:&lt;br /&gt;
&lt;br /&gt;
::http://download.librdf.org/source/&lt;br /&gt;
&lt;br /&gt;
Note: newer versions of Redland don't work.&lt;br /&gt;
&lt;br /&gt;
and the current release of the (optional) Redland dependency 3Store here:&lt;br /&gt;
&lt;br /&gt;
::http://downloads.sourceforge.net/project/threestore/files/&lt;br /&gt;
&lt;br /&gt;
Note: If 3store3-3.0.17 will not build against Rasqal, then skip it for now -- it is optional.&lt;br /&gt;
&lt;br /&gt;
When building Redland, you will probably need to use:&lt;br /&gt;
&lt;br /&gt;
::--with-bdb=&lt;br /&gt;
&lt;br /&gt;
to point to your Berkeley DB directory.&lt;br /&gt;
&lt;br /&gt;
If your installed SQLite is &amp;gt; 3.6.16, you will probably have to configure Redland with:&lt;br /&gt;
&lt;br /&gt;
::--with-sqlite=no&lt;br /&gt;
&lt;br /&gt;
Install in this order:&lt;br /&gt;
&lt;br /&gt;
::Raptor&lt;br /&gt;
::Rasqal&lt;br /&gt;
::Redland&lt;br /&gt;
&lt;br /&gt;
===Virtuoso Open-Source===&lt;br /&gt;
&lt;br /&gt;
Only needed for KDE &amp;gt;= 4.4 and TRUNK&lt;br /&gt;
&lt;br /&gt;
Get virtuoso-opensource &amp;gt;= 6.1.1 here:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/virtuoso/&lt;br /&gt;
&lt;br /&gt;
If you have problems, use the direct link:&lt;br /&gt;
&lt;br /&gt;
::http://downloads.sourceforge.net/project/virtuoso/virtuoso/6.1.1/virtuoso-opensource-6.1.1.tar.gz&lt;br /&gt;
&lt;br /&gt;
and the current release of the dependency iODBC here:&lt;br /&gt;
&lt;br /&gt;
::http://www.iodbc.org/dataspace/iodbc/wiki/iODBC/Downloads&lt;br /&gt;
&lt;br /&gt;
If building iODBC only for KDE, use configure parameter:&lt;br /&gt;
&lt;br /&gt;
::--disable-gui&lt;br /&gt;
&lt;br /&gt;
For building Virtuoso, these configure parameters are useful:&lt;br /&gt;
&lt;br /&gt;
::--with-jdk4=&lt;br /&gt;
::--without-internal-zlib &lt;br /&gt;
::--with-pthreads &lt;br /&gt;
::--with-readline &lt;br /&gt;
::--with-iodbc=&lt;br /&gt;
&lt;br /&gt;
If building Virtuoso only for KDE, (to save disk space) use configure parameter:&lt;br /&gt;
&lt;br /&gt;
::--disable-all-vads&lt;br /&gt;
&lt;br /&gt;
===KDE Supporting dependencies===&lt;br /&gt;
&lt;br /&gt;
=====TRUNK=====&lt;br /&gt;
&lt;br /&gt;
use KDESupport:&lt;br /&gt;
&lt;br /&gt;
::svn co svn://anonsvn.kde.org/home/kde/trunk/kdesupport&lt;br /&gt;
&lt;br /&gt;
If you don't want to install all the small SVN icons:&lt;br /&gt;
&lt;br /&gt;
::cd kdesupport/oxygen-icons&lt;br /&gt;
::svn rm `find -name &amp;quot;small&amp;quot;`&lt;br /&gt;
&lt;br /&gt;
=====KDE 4.6=====&lt;br /&gt;
&lt;br /&gt;
There is no KDESupport-4.6 so, you need to install these packages with:&lt;br /&gt;
&lt;br /&gt;
::CMAKE_INSTALL_PREFIX:PATH=/opt/KDE-4.6 for the BRANCH.&lt;br /&gt;
&lt;br /&gt;
Or:&lt;br /&gt;
&lt;br /&gt;
::CMAKE_INSTALL_PREFIX:PATH=/opt/KDE-4.6.x for a release.&lt;br /&gt;
&lt;br /&gt;
======Automoc4======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/automoc4/&amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Attica======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/attica&lt;br /&gt;
&lt;br /&gt;
======Polkit-Qt======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/apps/KDE4.x/admin&lt;br /&gt;
&lt;br /&gt;
======Polkit-Qt-1======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/apps/KDE4.x/admin&lt;br /&gt;
&lt;br /&gt;
======Soprano======&lt;br /&gt;
&lt;br /&gt;
Available from Source Forge:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/soprano/&lt;br /&gt;
&lt;br /&gt;
======Akonadi======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::http://download.akonadi-project.org&lt;br /&gt;
&lt;br /&gt;
======Cagibi======&lt;br /&gt;
&lt;br /&gt;
Available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/cagibi&lt;br /&gt;
&lt;br /&gt;
======Strigi======&lt;br /&gt;
&lt;br /&gt;
version 0.7.2 is available here:&lt;br /&gt;
&lt;br /&gt;
::http://www.vandenoever.info/software/strigi/strigi-0.7.2.tar.bz2&lt;br /&gt;
&lt;br /&gt;
======QImageBlitz======&lt;br /&gt;
&lt;br /&gt;
Available from Source Forge:&lt;br /&gt;
&lt;br /&gt;
http://sourceforge.net/projects/qimageblitz/files/qimageblitz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====KDE 4.4 &amp;amp; 4.5=====&lt;br /&gt;
&lt;br /&gt;
Use KDESupport:&lt;br /&gt;
&lt;br /&gt;
::svn co svn://anonsvn.kde.org/home/kde/tags/kdesupport-for-&amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This does not include: Ontologies.  See below.&lt;br /&gt;
&lt;br /&gt;
=====BRANCH up to 4.3 or a release up to 4.3.x=====&lt;br /&gt;
&lt;br /&gt;
Use the KDESupport SVN tag that matches your KDE version.  E.G. for 4.3:&lt;br /&gt;
&lt;br /&gt;
::svn&amp;amp;nbsp;co&amp;amp;nbsp;svn://anonsvn.kde.org/home/kde/tags/kdesupport-for-4.3/kdesupport&lt;br /&gt;
&lt;br /&gt;
=====TagLib=====&lt;br /&gt;
&lt;br /&gt;
Since TagLib is also a dependency for GStreamer (gst-plugins-good), you probably don't want to have a redundant installation for the KDE-4 version that will be your 'production' version.  Remove it from KDESupport SVN:&lt;br /&gt;
&lt;br /&gt;
::svn rm taglib&lt;br /&gt;
&lt;br /&gt;
And install the current release from:&lt;br /&gt;
&lt;br /&gt;
::http://developer.kde.org/~wheeler/taglib.html&lt;br /&gt;
&lt;br /&gt;
NOTE: To get GST Plugins Good to build the plugin for TagLib you need to set the environment variable:&lt;br /&gt;
&lt;br /&gt;
::HAVE_CXX=&amp;quot;yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
before you run: &amp;quot;configure&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=====QCA=====&lt;br /&gt;
&lt;br /&gt;
The QCA in KDESupport is not currently used (see QCA-2.0.2 above) so:&lt;br /&gt;
&lt;br /&gt;
::svn rm qca&lt;br /&gt;
&lt;br /&gt;
=====Phonon=====&lt;br /&gt;
&lt;br /&gt;
For KDE Support 4.5 and TRUNK:&lt;br /&gt;
&lt;br /&gt;
Do not use the version in KDE Support.  Remove if from KDE Support:&lt;br /&gt;
&lt;br /&gt;
::svn rm phonon&lt;br /&gt;
&lt;br /&gt;
See below&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
The current KDESupport may not be compatible with LFS installed FFmpeg.  Use this patch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Index: strigi/src/streamanalyzer/endplugins/CMakeLists.txt&lt;br /&gt;
--- strigi/src/streamanalyzer/endplugins/CMakeLists.txt (revision 1096146)&lt;br /&gt;
+++ strigi/src/streamanalyzer/endplugins/CMakeLists.txt (working copy)&lt;br /&gt;
@@ -34,9 +34,3 @@&lt;br /&gt;
   target_link_libraries(xine ${XINE_LIBRARY})&lt;br /&gt;
 endif(XINE_FOUND)&lt;br /&gt;
 &lt;br /&gt;
-if(FFMPEG_FOUND)&lt;br /&gt;
-  include_directories(${FFMPEG_INCLUDE_DIRS})&lt;br /&gt;
-  ADD_STRIGIEA(ffmpeg ffmpegendanalyzer.cpp)&lt;br /&gt;
-  #set_target_properties( ffmpeg PROPERTIES COMPILE_FLAGS &amp;quot;${FFMPEG_DEFINITIONS}&amp;quot; )&lt;br /&gt;
-  target_link_libraries(ffmpeg ${FFMPEG_LIBRARIES})&lt;br /&gt;
-endif(FFMPEG_FOUND)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, use the FFmpeg snapshot on the CBLFS page:&lt;br /&gt;
&lt;br /&gt;
::http://cblfs.cross-lfs.org/index.php/FFmpeg&lt;br /&gt;
&lt;br /&gt;
This more recent snapshot requires: &amp;quot;libx264.so.83&amp;quot;.  The x264 snapshot on CBFLS is too old. This Source RPM worked:&lt;br /&gt;
&lt;br /&gt;
::x264-0.83.2245-1plf2010.1.src.rpm&lt;br /&gt;
&lt;br /&gt;
Google is your friend.&lt;br /&gt;
&lt;br /&gt;
NOTE: You may need to add these parameters to the CMake command line:&lt;br /&gt;
&lt;br /&gt;
::-DENABLE_FAM:BOOL=ON&lt;br /&gt;
::-DENABLE_EXPAT:BOOL=ON&lt;br /&gt;
::-DENABLE_INOTIFY:BOOL=ON&lt;br /&gt;
::-DGAIM_LIBS:STRING=&amp;lt;path&amp;gt;/lib&lt;br /&gt;
::-DGAMIN_LIBRARIES:STRING=&amp;lt;path&amp;gt;/lib&lt;br /&gt;
&lt;br /&gt;
You must build with the same CMake parameters as the KDE-4 modules; specifically:&lt;br /&gt;
 &lt;br /&gt;
::-DCMAKE_INSTALL_PREFIX:PATH=/opt/KDE-&amp;lt;version&amp;gt;&lt;br /&gt;
::-DSYSCONF_INSTALL_DIR=/etc/kde-&amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ontologies===&lt;br /&gt;
&lt;br /&gt;
Required for KDE &amp;gt;= 4.4 and TRUNK.&lt;br /&gt;
&lt;br /&gt;
If you checked out KDESupport from TRUNK, you have the package.  Otherwise, get TRUNK here:&lt;br /&gt;
&lt;br /&gt;
::git clone git://oscaf.git.sourceforge.net/gitroot/oscaf/oscaf&lt;br /&gt;
 &lt;br /&gt;
Or the release from Source Forge:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/oscaf/files/shared-desktop-ontologies/&lt;br /&gt;
&lt;br /&gt;
and install with CMake with:&lt;br /&gt;
&lt;br /&gt;
:CMAKE_INSTALL_PREFIX:PATH=/usr&lt;br /&gt;
&lt;br /&gt;
===Phonon===&lt;br /&gt;
&lt;br /&gt;
=====TRUNK=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Phonon&amp;lt;/b&amp;gt; has been moved to &lt;br /&gt;
&lt;br /&gt;
::http://gitorious.org/phonon&lt;br /&gt;
&lt;br /&gt;
Get it with the command:&lt;br /&gt;
&lt;br /&gt;
::git clone git://gitorious.org/phonon/phonon.git&lt;br /&gt;
&lt;br /&gt;
=====KDE &amp;gt;= 4.5=====&lt;br /&gt;
&lt;br /&gt;
The current release of Phonon is available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/phonon/&amp;lt;version&amp;gt;/src&lt;br /&gt;
&lt;br /&gt;
Also install back ends as needed.  You must install a back end -- either GStreamer or Xine for Linux.  They are available here:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/phonon/phonon-backend-&amp;lt;name&amp;gt;/4.4.4/&amp;lt;version&amp;gt;/src&lt;br /&gt;
&lt;br /&gt;
Where &amp;lt;name&amp;gt; is one of:&lt;br /&gt;
&lt;br /&gt;
:directshow&lt;br /&gt;
:gstreamer&lt;br /&gt;
:vlc&lt;br /&gt;
:xine&lt;br /&gt;
&lt;br /&gt;
=====KDE-4.4=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;big&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;KDEBindings-4.4.x will not build against Phonon from the GIT repository.&amp;lt;/font&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use the version in KDESupport-4.4.&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
Install with:&lt;br /&gt;
&lt;br /&gt;
::CMAKE_INSTALL_PREFIX=$QTDIR &lt;br /&gt;
&lt;br /&gt;
and the rest of the CMake parameters the same as KDESupport or Supporting dependencies.&lt;br /&gt;
&lt;br /&gt;
===PolKit-KDE-1===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====KDE &amp;gt;= 4.4 and TRUNK=====&lt;br /&gt;
&lt;br /&gt;
Use:&lt;br /&gt;
&lt;br /&gt;
::ftp://ftp.kde.org/pub/kde/stable/apps/KDE4.x/admin/polkit-kde-1-0.95.1.tar.bz2&lt;br /&gt;
&lt;br /&gt;
=====Build=====&lt;br /&gt;
&lt;br /&gt;
The 0.95.1 tarball from the KDE FTP site will not install correctly.  You need to apply this patch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
diff -Naur polkit-kde-1-0.95.1.old/agent/CMakeLists.txt polkit-kde-1-0.95.1/agent/CMakeLists.txt&lt;br /&gt;
--- polkit-kde-1-0.95.1.old/agent/CMakeLists.txt	2009-12-23 04:31:29.000000000 -0700&lt;br /&gt;
+++ polkit-kde-1-0.95.1/agent/CMakeLists.txt	2010-03-25 15:54:12.000000000 -0700&lt;br /&gt;
@@ -11,7 +11,7 @@&lt;br /&gt;
 &lt;br /&gt;
 target_link_libraries(polkit-kde-authentication-agent-1&lt;br /&gt;
                                          ${KDE4_KDEUI_LIBS}&lt;br /&gt;
-                                         ${POLKITQT-1_AGENT_LIBRARY}&lt;br /&gt;
+                                         ${POLKITQT-1_LIBRARIES} &lt;br /&gt;
 )&lt;br /&gt;
 &lt;br /&gt;
 configure_file(polkit-kde-authentication-agent-1.desktop.in ${CMAKE_BINARY_DIR}/polkit-kde-authentication-agent-1.desktop)&lt;br /&gt;
@@ -25,4 +25,4 @@&lt;br /&gt;
   set (DESKTOP_INSTALL_DIR /etc/xdg/autostart)&lt;br /&gt;
 endif (DESKTOP_INSTALL_DIR)&lt;br /&gt;
 &lt;br /&gt;
-install(FILES ${CMAKE_BINARY_DIR}/polkit-kde-authentication-agent-1.desktop DESTINATION ${DESKTOP_INSTALL_DIR})&lt;br /&gt;
+install(FILES ${CMAKE_BINARY_DIR}/polkit-kde-authentication-agent-1.desktop DESTINATION ${KDE4_AUTOSTART_INSTALL_DIR})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------8&amp;lt;------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must build with the same CMake parameters as the KDE-4 modules; specifically:&lt;br /&gt;
&lt;br /&gt;
::-DCMAKE_INSTALL_PREFIX:PATH=/opt/KDE-&amp;lt;version&amp;gt;&lt;br /&gt;
::-DSYSCONF_INSTALL_DIR=/etc/kde-&amp;lt;version&amp;gt;&lt;br /&gt;
::-DKDE4_AUTH_POLICY_FILES_INSTALL_DIR:STRING=/usr/share/PolicyKit/policy&lt;br /&gt;
&lt;br /&gt;
===shared-mime-info===&lt;br /&gt;
&lt;br /&gt;
You should have this installed with a prefix: &amp;quot;/usr&amp;quot;.  All you need to do is build KDE-4 with:&lt;br /&gt;
&lt;br /&gt;
::-DUPDATE_MIME_DATABASE_EXECUTABLE:FILEPATH=/usr/bin/update-mime-database&lt;br /&gt;
&lt;br /&gt;
However there appears to be a problem for KDE &amp;lt; 4.5&lt;br /&gt;
&lt;br /&gt;
Get the current release from:&lt;br /&gt;
&lt;br /&gt;
::http://www.freedesktop.org/wiki/Software/shared-mime-info&lt;br /&gt;
&lt;br /&gt;
You need to install this with the same prefix as KDE4 (even if you already have it installed in &amp;quot;/usr&amp;quot;) to eliminate missing MIME type errors.  Currently, KDELibs won't build unless you do this.  And, even if it does, you will get run time errors -- popup windows saying that certain MIME types can not be found.&lt;br /&gt;
&lt;br /&gt;
This appears to be a bug that was fixed with KDE-4.5; for ealier versions this workaround does seem to work.&lt;br /&gt;
&lt;br /&gt;
===KIPI Plugins===&lt;br /&gt;
&lt;br /&gt;
Get the current release from:&lt;br /&gt;
&lt;br /&gt;
::http://sourceforge.net/projects/kipi/&lt;br /&gt;
&lt;br /&gt;
This package is dependent on KDEGraphics.  The package has a lot of optional dependencies which you need to satisfy only if you want the corresponding plugins built.  You should install it in the same directory where you installed KDE-4.x.y.&lt;br /&gt;
&lt;br /&gt;
Be sure that you updated your: &amp;quot;PKG_CONFIG_PATH&amp;quot; to include $CMAKE_INSTALL_PREFIX/lib/pkgconfig (for example):&lt;br /&gt;
&lt;br /&gt;
::/opt/KDE-4/lib/pkgconfig&lt;br /&gt;
&lt;br /&gt;
===Oxygen Icons===&lt;br /&gt;
&lt;br /&gt;
If you checked out KDESupport from TRUNK or the TAG: &amp;quot;kdesupport-for-&amp;lt;version&amp;gt;&amp;quot;, you have them.&lt;br /&gt;
&lt;br /&gt;
If you checked out KDESupport from a tag &amp;quot;kdesupport-&amp;lt;version&amp;gt;&amp;quot; up to 4.3 or didn't use KDESupport, you need to get them.  If you are using SVN, that would be:&lt;br /&gt;
&lt;br /&gt;
::svn co svn://anonsvn.kde.org/home/kde/tags/KDE/&amp;lt;version&amp;gt;/oxygen-icons&lt;br /&gt;
&lt;br /&gt;
{where &amp;lt;version&amp;gt; is the latest release for the branch you are using (e.g. 4.3.4 for the 4.3 branch)}  &lt;br /&gt;
&lt;br /&gt;
Or, you can simply use TRUNK:&lt;br /&gt;
&lt;br /&gt;
::svn co svn://anonsvn.kde.org/home/kde/trunk/kdesupportsvn/oxygen-icons&lt;br /&gt;
&lt;br /&gt;
===LibSSH===&lt;br /&gt;
&lt;br /&gt;
TRUNK and KDE-4.4 require libssh.  Get the current release &amp;gt;= 0.4.0 from:&lt;br /&gt;
&lt;br /&gt;
::http://www.libssh.org/&lt;br /&gt;
&lt;br /&gt;
===Dependencies for specific KDE modules===&lt;br /&gt;
&lt;br /&gt;
====KDEBindings====&lt;br /&gt;
&lt;br /&gt;
=====SIP and PyQt=====&lt;br /&gt;
&lt;br /&gt;
To build the Python bindings for KDE, you need the current releases of SIP and PyQt from here:&lt;br /&gt;
&lt;br /&gt;
::http://www.riverbankcomputing.com/software/sip/download&lt;br /&gt;
::http://www.riverbankcomputing.com/software/pyqt/download&lt;br /&gt;
&lt;br /&gt;
Install: &amp;quot;SIP&amp;quot; first and then: &amp;quot;PyQt&amp;quot;.  These are both Python add-ons so they install with:&lt;br /&gt;
&lt;br /&gt;
::python configure.py&lt;br /&gt;
::make&lt;br /&gt;
::make install&lt;br /&gt;
&lt;br /&gt;
=====Build Notes for PyQt=====&lt;br /&gt;
&lt;br /&gt;
Unless you want to get into serious complications, you should only build PyQt against one version of Qt and you should only install one version of KDEBindings.  If you try to build against multiple versions of Qt or install multiple versions of KDEBindings, with a single instance of Python (or other languages), you will install two versions of the same file in the same place.&lt;br /&gt;
&lt;br /&gt;
PyQt will find Qt based on your environment variables.  So, if you want to install for a version of KDE other than the one that you are currently using, be sure that these are set correctly:&lt;br /&gt;
&lt;br /&gt;
::QTDIR&lt;br /&gt;
::QT_PLUGIN_PATH&lt;br /&gt;
&lt;br /&gt;
KDEBindings is dependent on KDEGraphics (specifically Okular).&lt;br /&gt;
&lt;br /&gt;
Other language dependencies are optional.  If you have other supported languages installed on your system, installing KDEBindings will build bindings for them.&lt;br /&gt;
&lt;br /&gt;
=====QScintilla2=====&lt;br /&gt;
&lt;br /&gt;
QScintilla2 is optional.  If you are installing it, get it here:&lt;br /&gt;
&lt;br /&gt;
::http://www.riverbankcomputing.com/software/qscintilla/download&lt;br /&gt;
&lt;br /&gt;
Install it after SIP &amp;amp; PyQt.  It has a Qt build system, so install for Qt4 it with:&lt;br /&gt;
&lt;br /&gt;
::cd Qt4&lt;br /&gt;
::qmake qscintilla.pro&lt;br /&gt;
::make&lt;br /&gt;
::make install&lt;br /&gt;
&lt;br /&gt;
====KDEEdu====&lt;br /&gt;
&lt;br /&gt;
KDEEdu might be dependent on KDEBindings.&lt;br /&gt;
&lt;br /&gt;
====KDENetwork====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;LibV4l&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only required for KDE &amp;gt;= 4.4 and TRUNK&lt;br /&gt;
&lt;br /&gt;
Get the current release here:&lt;br /&gt;
&lt;br /&gt;
::http://people.fedoraproject.org/~jwrdegoede/&lt;br /&gt;
&lt;br /&gt;
and follow the build instructions in the README file.&lt;br /&gt;
&lt;br /&gt;
=====Optional Dependencies=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Telepathy-Qt4&amp;lt;/b&amp;gt; is the Qt bindings for Telepathy.  Since this has general usage, you should probably install it along with its semi-optional dependency &amp;lt;b&amp;gt;telepathy-glib&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Get the current releases here:&lt;br /&gt;
&lt;br /&gt;
::http://telepathy.freedesktop.org/releases/telepathy-glib/&lt;br /&gt;
::http://telepathy.freedesktop.org/releases/telepathy-qt4/&lt;br /&gt;
&lt;br /&gt;
Install: &amp;quot;telepathy-glib&amp;quot; first and then: 'telepathy-qt4&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The output from CMake lists several other optional dependencies.  It appears that these are needed to support specific functions in KDENetwork.  So, if you need those functions, you need to install them.  You will probably also need to install the corresponding Telepathy addons from here:&lt;br /&gt;
&lt;br /&gt;
::http://telepathy.freedesktop.org/releases/&lt;br /&gt;
&lt;br /&gt;
TO DO: more information needed.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Localization/i18n_Krazy</id>
		<title>Development/Tutorials/Localization/i18n Krazy</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Localization/i18n_Krazy"/>
				<updated>2011-06-27T17:25:49Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
There are small technical details of i18n which are not that easy to keep in mind at all times, as well as number of i18n recommendations to uphold during the development. To help you with this, the [[Development/Tutorials/Code_Checking|Krazy code checker]] also looks for some frequently encountered i18n issues. This article documents these issues as reported by Krazy, for cases when you are not sure what the remedy should be.&lt;br /&gt;
&lt;br /&gt;
== Placeholders and Arguments ==&lt;br /&gt;
&lt;br /&gt;
The i18n API is very strict about congruence between the &amp;lt;tt&amp;gt;%''number''&amp;lt;/tt&amp;gt; placeholders in the message, and the arguments actually supplied to substitute them. Effectively, the placeholders directly index arguments, albeit one- rather than zero-based.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;wrong argument count, have ''num1'' need ''num2''&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: Either some of the arguments have not been provided, or there is a stray placeholder inside the message string. A likely cause is forgetting that in KDE4, arguments are added as parameters to the i18n call itself, rather than appended via &amp;lt;tt&amp;gt;arg()&amp;lt;/tt&amp;gt; methods as in KDE3:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18n(&amp;quot;Found key: %1&amp;quot;, key);      // correct&lt;br /&gt;
i18n(&amp;quot;Found key: %1&amp;quot;).arg(key);  // ***wrong&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;too many arguments, have ''num'' max 9&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: i18n calls can take at most 9 arguments as parameters to the call. If more than that is needed, the &amp;lt;tt&amp;gt;ki18n*()&amp;lt;/tt&amp;gt; series of calls must be used, see the documentation to {{class|KLocalizedString}} class. The calls with more than 9 parameters are extremely rare, though.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;gaps in placeholder numbering, ...&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: Except in case of plural i18n calls, there must be no gaps in placeholder sequence, starting from &amp;lt;tt&amp;gt;%1&amp;lt;/tt&amp;gt;. In plural calls, the placeholder of the first number (which determines plural) form, may be omitted, both in singular and plural:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18n(&amp;quot;Line: %1 Column: %2&amp;quot;, lineNo, colNo);  // correct&lt;br /&gt;
i18n(&amp;quot;Line: %1 Column: %3&amp;quot;, lineNo, colNo);  // ***wrong&lt;br /&gt;
&lt;br /&gt;
i18np(&amp;quot;Found a file in folder %2&amp;quot;,&lt;br /&gt;
      &amp;quot;Found %1 files in folder %2&amp;quot;, nfiles, folder);    // correct&lt;br /&gt;
i18np(&amp;quot;Found a file in folder %2&amp;quot;,&lt;br /&gt;
      &amp;quot;Found some files in folder %2&amp;quot;, nfiles, folder);  // also correct&lt;br /&gt;
i18np(&amp;quot;Found a file in folder %1&amp;quot;,&lt;br /&gt;
      &amp;quot;Found some files in folder %1&amp;quot;, folder, nfiles);  // ***wrong&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;legacy %n placeholder in plural call&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: This is a remnant from KDE3, where in plural i18n calls, the argument determining the plural form had special &amp;lt;tt&amp;gt;%n&amp;lt;/tt&amp;gt; placeholder. In KDE4, all arguments have ordinary &amp;lt;tt&amp;gt;%''number''&amp;lt;/tt&amp;gt; placeholders, as in the examples above (the plural form is decided upon the lowest-numbered argument that is an integer).&lt;br /&gt;
&lt;br /&gt;
== Ambiguous Short Messages ==&lt;br /&gt;
&lt;br /&gt;
English is a rather noninflected language compared to many others; single English word can frequently be noun, verb, or adjective, while retaining its original form. This presents frequent problems for the translator while translating into inflected languages when the original message is short, especially single-worded. The solution is to [[Development/Tutorials/Localization/i18n#Adding_Context|add context]] to the message via &amp;lt;tt&amp;gt;i18nc()&amp;lt;/tt&amp;gt; call.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;single adjective as message, probably ambiguous; ...&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: Words that can be treated as adjectives are especially prone to ambiguities. Therefore Krazy checks single-worded messages against a list of adjectives collected from the KDE codebase, and issues this warning if the matching message does not have a context. For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
titleFinal = title.isEmpty() ?&lt;br /&gt;
             i18n(&amp;quot;Unknown&amp;quot;) : title; // ambiguous&lt;br /&gt;
titleFinal = title.isEmpty() ?&lt;br /&gt;
             i18nc(&amp;quot;An unknown title&amp;quot;, &amp;quot;Unknown&amp;quot;) : title; // clarified&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;reported ambiguous message by translators; ...&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: There are other troublesome words, or even phrases, which were explicitly reported by translators as ambiguous. This warning means that such a message without context has been detected.&lt;br /&gt;
&lt;br /&gt;
While you are at adding contexts, consider providing the appropriate [[Development/Tutorials/Localization/i18n_Semantics#Context_Markers|KUIT context marker]] as well, which will further zero-in translators' job:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
titleFinal = title.isEmpty() ?&lt;br /&gt;
             i18nc(&amp;quot;@item:intable An unknown title&amp;quot;, &amp;quot;Unknown&amp;quot;) : title;&lt;br /&gt;
// way to go!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ambiguity warning can also be issued for &amp;lt;tt&amp;gt;.ui&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.rc&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;.kcfg&amp;lt;/tt&amp;gt; files. In &amp;lt;tt&amp;gt;.ui&amp;lt;/tt&amp;gt; files, text labels can have the &amp;lt;tt&amp;gt;comment&amp;lt;/tt&amp;gt; attribute (accessible in Qt Designer as a &amp;quot;disambiguation&amp;quot; property to the label, or &amp;quot;comment&amp;quot; prior to Qt 4.5), which can be used for adding contexts same as the first argument of the &amp;lt;tt&amp;gt;i18nc()&amp;lt;/tt&amp;gt; call. In &amp;lt;tt&amp;gt;.rc&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;.kcfg&amp;lt;/tt&amp;gt; files, contexts are added via the &amp;lt;tt&amp;gt;context&amp;lt;/tt&amp;gt; attribute.&lt;br /&gt;
&lt;br /&gt;
== Number Formatting ==&lt;br /&gt;
&lt;br /&gt;
The number-valued (either integer or real) arguments to i18n messages are formatted automatically into given language, without programmer's intervention. Using other methods to format numbers into strings may circumvent proper formatting for the language.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;use of QString::number() on an argument&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: &amp;lt;tt&amp;gt;QString::number()&amp;lt;/tt&amp;gt; should never be used to format &amp;quot;amount&amp;quot; numbers, because within KDE code it will do so using English conventions. However, sometimes the number is not an amount, e.g. port number 15000 should not be formatted as &amp;quot;15,000&amp;quot; in English; use &amp;lt;tt&amp;gt;&amp;amp;lt;numid&amp;amp;gt;&amp;lt;/tt&amp;gt; KUIT tag in this situation:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18n(&amp;quot;Number of pages: %1&amp;quot;, numPages); // good, localized amount format&lt;br /&gt;
i18n(&amp;quot;Connected to port %1.&amp;quot;, port);   // bad, amount format not desired&lt;br /&gt;
i18n(&amp;quot;Connected to port %1.&amp;quot;, QString::number(port)); // bad, not localized&lt;br /&gt;
i18n(&amp;quot;Connected to port &amp;lt;numid&amp;gt;%1&amp;lt;/numid&amp;gt;.&amp;quot;, port);   // good&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;; &amp;lt;tt&amp;gt;&amp;quot;use of KLocale::formatNumber() on an argument (...)&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: A smarter way to format numbers is using &amp;lt;tt&amp;gt;KLocale::formatNumber()&amp;lt;/tt&amp;gt;, which will honor user's settings. However, then the format cannot be decided upon the language of the particular message in question (some applications may not have translations), so it's best avoided in i18n arguments. Use it for &amp;quot;live numbers&amp;quot;, e.g. in spreadsheet tables and calculator displays, where the format should match user's number-typing habit.&lt;br /&gt;
&lt;br /&gt;
Even when the complete message is a single number, it should be i18n'd, with a proper context:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
result = QString::number(z);              // bad&lt;br /&gt;
result = i18nc(&amp;quot;Atomic number&amp;quot;, &amp;quot;%1&amp;quot;, z); // good&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the number is to be formatted in a special way (field width, number of decimals, etc.) into the message, still neither &amp;lt;tt&amp;gt;QString::number()&amp;lt;/tt&amp;gt; nor &amp;lt;tt&amp;gt;KLocale::formatNumber()&amp;lt;/tt&amp;gt; should be used, but &amp;lt;tt&amp;gt;ki18n*()&amp;lt;/tt&amp;gt; series of calls with &amp;lt;tt&amp;gt;subs()&amp;lt;/tt&amp;gt; methods (see {{class|KLocalizedString}} documentation):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18n(&amp;quot;Percent complete: %1&amp;quot;, QString::number(percent, 'f', 1));    // bad&lt;br /&gt;
ki18n(&amp;quot;Percent complete: %1&amp;quot;).subs(percent, 0, 'f', 1).toString(); // good&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HTML and KUIT Markup ==&lt;br /&gt;
&lt;br /&gt;
Every i18n message in KDE4 is effectively XML markup. HTML tags come from Qt's rich text, and can be used only in rich-text capable widgets; KUIT tags are new KDE4 [[Development/Tutorials/Localization/i18n_Semantics|semantic markup]], which should be preferred to HTML, and can be used in ''any'' i18n message (plain or rich-text output is decided on the basis of [[Development/Tutorials/Localization/i18n_Semantics#Context_Markers|context marker]]).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;malformed markup (unmatched tags, etc.)&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: Since every message is XML, all tags must be properly closed. Opening &amp;lt;tt&amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;lt;/tt&amp;gt; must not miss closing &amp;lt;tt&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&amp;lt;/tt&amp;gt;, etc. This also holds for breaking HTML tags like &amp;lt;tt&amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;&amp;amp;lt;hr&amp;amp;gt;&amp;lt;/tt&amp;gt;, which must be closed in place: &amp;lt;tt&amp;gt;&amp;amp;lt;br/&amp;amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;amp;lt;hr/&amp;amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Verbatim greater-than sign means opening of a tag, which is not always meant. This can be avoided by use of predefined XML &amp;lt;tt&amp;gt;&amp;amp;amp;lt;&amp;lt;/tt&amp;gt; entity (other predefined entities are &amp;lt;tt&amp;gt;&amp;amp;amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;amp;amp;amp;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;amp;amp;apos;&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;&amp;amp;amp;quot;&amp;lt;/tt&amp;gt;), but for a frequent case of marking generic or user-replaceable text, it is better to use &amp;lt;tt&amp;gt;&amp;amp;lt;placeholder&amp;amp;gt;&amp;lt;/tt&amp;gt; KUIT tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot; line=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
i18n(&amp;quot;headers go into &amp;lt;includes&amp;gt;&amp;quot;);       // ***error in XML markup&lt;br /&gt;
i18n(&amp;quot;headers go into &amp;amp;lt;includes&amp;amp;gt;&amp;quot;); // no markup problem, but...&lt;br /&gt;
i18n(&amp;quot;headers go into &amp;lt;placeholder&amp;gt;includes&amp;lt;/placeholder&amp;gt;&amp;quot;); // better&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Given it's frequency, it is not needed to use &amp;lt;tt&amp;gt;&amp;amp;amp;amp;&amp;lt;/tt&amp;gt; for shortcut markers; there is some heuristics around XML parsing to allow presence of naked &amp;amp;amp;. Basically, &amp;lt;tt&amp;gt;&amp;amp;amp;amp;&amp;lt;/tt&amp;gt; is needed only in the rare case of &amp;lt;tt&amp;gt;&amp;amp;amp;''no_whitespace_sequence'';&amp;lt;/tt&amp;gt; pattern which is ''not'' meant as an XML entity.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;unclosed &amp;amp;lt;br&amp;amp;gt; ... use proper paragraphs &amp;amp;lt;p&amp;amp;gt;...&amp;amp;lt;/p&amp;amp;gt; instead&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: This just signals a particularly frequent markup problem, that of &amp;lt;tt&amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;lt;/tt&amp;gt; not closed in place, like &amp;lt;tt&amp;gt;&amp;amp;lt;br/&amp;amp;gt;&amp;lt;/tt&amp;gt;. Also, sometimes &amp;lt;tt&amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;lt;/tt&amp;gt; is used to split logical paragraphs (especially when doubled, &amp;lt;tt&amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;lt;/tt&amp;gt;), where proper paragraph tags should be used instead.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;''tag'' is neither KUIT nor HTML tag&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: Some of the tags in the message is simply unknown, and will not be understood at runtime. If it is not a typo, but the message is really speaking about tags to the user (e.g. in a HTML editing application), use &amp;lt;tt&amp;gt;&amp;amp;amp;lt;foo&amp;amp;amp;gt;&amp;lt;/tt&amp;gt; pattern.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;HTML tag ''tag'' is not advised with KUIT markup&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: When Krazy encounters the KUIT context marker in a message, it assumes that message is semantically tagged, and disapproves of some HTML tags which are best replaced with semantic equivalents. For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18n(&amp;quot;@info:whatsthis&amp;quot;,&lt;br /&gt;
     &amp;quot;...this &amp;lt;i&amp;gt;cannot&amp;lt;/i&amp;gt; be undone.&amp;quot;);               // Krazy complains&lt;br /&gt;
i18n(&amp;quot;@info:whatsthis&amp;quot;,&lt;br /&gt;
     &amp;quot;...this &amp;lt;emphasis&amp;gt;cannot&amp;lt;/emphasis&amp;gt; be undone.&amp;quot;); // fine&lt;br /&gt;
&lt;br /&gt;
i18n(&amp;quot;@info&amp;quot;,&lt;br /&gt;
     &amp;quot;Really delete &amp;lt;b&amp;gt;%1&amp;lt;/b&amp;gt;?&amp;quot;, filename);               // complains&lt;br /&gt;
i18n(&amp;quot;@info&amp;quot;,&lt;br /&gt;
     &amp;quot;Really delete &amp;lt;filename&amp;gt;%1&amp;lt;/filename&amp;gt;?&amp;quot;, filename); // fine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;tag ''tag1'' cannot be subtag of ''tag2''&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;tag ''tag'' has no ''att'' attribute&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;tag ''tag'' cannot have text content&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: These are validity checks for KUIT markup, a bit relaxed form of formal XML validation. The rules of which KUIT tag can contain which, and so on, are given with [[Development/Tutorials/Localization/i18n_Semantics#Semantic_Tags|tag descriptions]].&lt;br /&gt;
&lt;br /&gt;
== KUIT Context Markers ==&lt;br /&gt;
&lt;br /&gt;
Semantic [[Development/Tutorials/Localization/i18n_Semantics#Context_Markers|context markers]] give great deal of information to translators of where and how the message is used at runtime. Providing them for ''any'' future messages is strongly encouraged, and even equipping existing messages when not in message freeze is welcomed. Krazy helps with the following checks.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;missing KUIT context marker&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: If Krazy detects that the source file has a number of messages equipped with KUIT context markers, above some threshold, it assumes that developer's intention was to have all messages marked (as is recommended), and issues this warning for any non-marked message.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;invalid semantic role ''role''&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;invalid interface subcue ''cue'' to role ''role''&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;invalid visual format ''fmt''&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: Krazy checks that all ingredients of the context marker are defined, and that a particular combination of them is valid.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;quot;expected context marker ''ctxmark1'', got ''ctxmark2''&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:: For messages used in some boiler-plate situations, canonical context markers have been established. Krazy warns if the context marker to such a message, although valid by itself, was not the expected one. For example, such messages are encountered in setting up the {{class|KAboutData}} information.&lt;br /&gt;
&lt;br /&gt;
== UI files ==&lt;br /&gt;
When Krazy complains about ambiguity in i18n translation in an UI file. You can either add a comment=&amp;quot;&amp;quot; attribute using QtDesigner or using a text editor.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
For any questions or suggestions, Krazy i18n checks are presently maintained by Chusslove Illich &amp;amp;lt;caslav.ilic@gmx.net&amp;amp;gt;.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Localization/i18n_Semantics</id>
		<title>Development/Tutorials/Localization/i18n Semantics</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Localization/i18n_Semantics"/>
				<updated>2011-06-27T17:20:13Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Typical way of formatting user visible strings in application interfaces, for a long time has been that of plain text or at most visual markup like HTML tags. In most textual content environments, shift to ''semantic'' markup has been recognized as superior to visual (for example, the Docbook XML for documentation). Why not go down the same road for UI strings?&lt;br /&gt;
&lt;br /&gt;
{{Note|A [http://people.ubuntu.com/~apachelogger/misc/i18nccheatsheet.png handy cheat sheet] for the KUIT semantic markup language has been prepared by apachelogger.}}&lt;br /&gt;
&lt;br /&gt;
== Semantic Markup by Examples ==&lt;br /&gt;
&lt;br /&gt;
In the semantic model, user interface strings are marked for their ''context'', and text elements within for their ''meaning'' rather than visual appearance. Consider few i18n examples of usual, non-semantic format:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18n(&amp;quot;Move&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
i18n(&amp;quot;Descending&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
i18n(&amp;quot;&amp;lt;qt&amp;gt;&amp;lt;b&amp;gt;%1&amp;lt;/b&amp;gt; does not exist&amp;lt;/qt&amp;gt;&amp;quot;, fname);&lt;br /&gt;
&lt;br /&gt;
i18n(&amp;quot;&amp;lt;h1&amp;gt;History Sidebar&amp;lt;/h1&amp;gt; You can configure the history sidebar here.&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using KDE UI Text (KUIT for short) semantic markup, these strings would be formated like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@action:button&amp;quot;, &amp;quot;Move&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
i18nc(&amp;quot;@item:inmenu&amp;quot;, &amp;quot;Descending&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;, &amp;quot;&amp;lt;filename&amp;gt;%1&amp;lt;/filename&amp;gt; does not exist&amp;quot;, fname);&lt;br /&gt;
&lt;br /&gt;
i18nc(&amp;quot;@info:whatsthis&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;title&amp;gt;History Sidebar&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
      &amp;quot;&amp;lt;para&amp;gt;You can configure the history sidebar here.&amp;lt;/para&amp;gt;&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two distinct differences between ordinary and KUIT markup can be observed.&lt;br /&gt;
&lt;br /&gt;
The first is the use of context i18n calls, the &amp;lt;tt&amp;gt;i18nc()&amp;lt;/tt&amp;gt;, to convey the usage context of the string by means of the ''context marker''. The first message above, &amp;quot;Move&amp;quot;, has been assigned the &amp;lt;tt&amp;gt;@action:button&amp;lt;/tt&amp;gt; marker, where &amp;lt;tt&amp;gt;@action&amp;lt;/tt&amp;gt; is the ''semantic role'' which describes the text as an action to be taken (e.g. operation on data or opening of a new dialog), and &amp;lt;tt&amp;gt;:button&amp;lt;/tt&amp;gt; is the ''interface subcue'' saying that this text is displayed on a pushbutton widget. The second message, &amp;quot;Descending&amp;quot;, has been marked as semantically a list item (&amp;lt;tt&amp;gt;@item&amp;lt;/tt&amp;gt;), displayed in a menu (&amp;lt;tt&amp;gt;:inmenu&amp;lt;/tt&amp;gt;). The interface subcue can be left out if none is appropriate, as has been done in the third message.&lt;br /&gt;
&lt;br /&gt;
The other difference is the use of the semantic tags, which convey the meaning of a word or phrase within the text. The &amp;lt;tt&amp;gt;&amp;lt;filename&amp;gt;%1&amp;lt;/filename&amp;gt;&amp;lt;/tt&amp;gt; part of the third message tells that the substituted text is the name of a file. The &amp;lt;tt&amp;gt;&amp;lt;title&amp;gt;&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;&amp;lt;para&amp;gt;&amp;lt;/tt&amp;gt; tags in the last message clearly lay out structure of a longer informational text.&lt;br /&gt;
&lt;br /&gt;
{{note|The context marker can be added when within some of the standard XML sources too. In Qt Designer forms (&amp;lt;tt&amp;gt;.ui&amp;lt;/tt&amp;gt; files), each text label to a widget has &amp;lt;tt&amp;gt;comment&amp;lt;/tt&amp;gt; attribute (presented as &amp;quot;disambiguation&amp;quot; property within Designer, or &amp;quot;comment&amp;quot; prior to Qt 4.5), which can be used in the same manner as context argument of &amp;lt;tt&amp;gt;i18nc()&amp;lt;/tt&amp;gt; call. Similarly, in the KXmlGui (&amp;lt;tt&amp;gt;.rc&amp;lt;/tt&amp;gt;) and KConfigXT (&amp;lt;tt&amp;gt;.kcfg&amp;lt;/tt&amp;gt;) files, tags &amp;lt;tt&amp;gt;&amp;lt;text&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;label&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;whatsthis&amp;lt;/tt&amp;gt; can have a &amp;lt;tt&amp;gt;context&amp;lt;/tt&amp;gt; attribute. For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;label context=&amp;quot;@label&amp;quot;&amp;gt;Hide trivial details&amp;lt;/label&amp;gt;&lt;br /&gt;
&amp;lt;whatsthis context=&amp;quot;@info:whatsthis&amp;quot;&amp;gt;Option to hide drivel&amp;lt;/whatsthis&amp;gt;&lt;br /&gt;
&amp;lt;text context=&amp;quot;@item:inmenu&amp;quot;&amp;gt;&amp;amp;amp;New...&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Even when context marker is present, sometimes the programmer may want to provide an additional &amp;quot;free-form&amp;quot; description to translators, in order shed more light on particularly ambiguous strings. The free-form description is just separated by a whitespace from the context marker proper, like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@item:inmenu Sorting order&amp;quot;, &amp;quot;Descending&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One particularly useful and yet general piece of free-form description, is the title under which the message is grouped -- the menu title for actions in menu, the group title of set of radio-buttons, the listbox label for items in list, etc. For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
iconSizeBox = new QGroupBox(i18nc(&amp;quot;@title:group&amp;quot;, &amp;quot;Icon Size&amp;quot;), this);&lt;br /&gt;
//...&lt;br /&gt;
iconSize1 = new QRadioButton(i18nc(&amp;quot;@option:radio Icon Size&amp;quot;, &amp;quot;Small&amp;quot;), this);&lt;br /&gt;
iconSize2 = new QRadioButton(i18nc(&amp;quot;@option:radio Icon Size&amp;quot;, &amp;quot;Medium&amp;quot;), this);&lt;br /&gt;
iconSize3 = new QRadioButton(i18nc(&amp;quot;@option:radio Icon Size&amp;quot;, &amp;quot;Large&amp;quot;), this);&lt;br /&gt;
//...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Advantages of Semantic Markup ==&lt;br /&gt;
&lt;br /&gt;
KUIT markup has advantages both to users and to translators of applications that make use of it.&lt;br /&gt;
&lt;br /&gt;
For the users, the use of semantic tags means consistent formatting of same kinds of text. A notorious example of inconsistent visual formatting are filenames and paths, which are sometimes put in as is, sometimes in quotes (and ordinary quotes at that, rather than proper English fancy quotes), and sometimes in bold tags. Furthermore, the text withing the tag may be modified when semantically marked; for example, the standard &amp;quot;/&amp;quot; path delimiters in a &amp;lt;tt&amp;gt;&amp;lt;filename&amp;gt;&amp;lt;/tt&amp;gt; text will be substituted for platform specific ones.&lt;br /&gt;
&lt;br /&gt;
Translators will benefit from both context markers and tags. For the &amp;lt;tt&amp;gt;@action&amp;lt;/tt&amp;gt; role of the &amp;quot;Move&amp;quot; string in the example above, the translator may use command form of the verb, while gerund form (like &amp;quot;Moving&amp;quot;) may be more appropriate for the &amp;lt;tt&amp;gt;@title&amp;lt;/tt&amp;gt; role, which would be used if the string was title of the menu, window, etc. The interface subcue, like &amp;lt;tt&amp;gt;:button&amp;lt;/tt&amp;gt; above, if present, additionally enables the translator to mentally picture the actual runtime GUI. Tags within the text will also benefit translators, as they may clarify the structure of the sentence, especially in presence of placeholder substitutions.&lt;br /&gt;
&lt;br /&gt;
Context markers also serve a technical purpose: they decide whether what form of visual formatting is used. For example, any &amp;lt;tt&amp;gt;@title&amp;lt;/tt&amp;gt; role will use plain text, whereas &amp;lt;tt&amp;gt;@info&amp;lt;/tt&amp;gt; will frequently produce rich text, depending on the subcue.&lt;br /&gt;
&lt;br /&gt;
None the least, semantic markup removes the burden from programmers of thinking about the visual formatting to apply, like &amp;quot;''Should I put the path in quotes or &amp;amp;lt;b&amp;gt;?''&amp;quot;, or &amp;quot;''Should the title be &amp;amp;lt;h2&amp;gt; or &amp;amp;lt;h3&amp;gt;?''&amp;quot;, and so on.&lt;br /&gt;
&lt;br /&gt;
== Context Markers ==&lt;br /&gt;
&lt;br /&gt;
Context marker consist of the semantic role and the interface subcue, in the form of &amp;lt;tt&amp;gt;@role:subcue&amp;lt;/tt&amp;gt;. Each message should be given a role, but the subcue may be left out. The subcue should be given only when the string clearly maps to the user interface element that it describes.&lt;br /&gt;
&lt;br /&gt;
Every role/subcue combination determines the default visual formatting of resulting string, whether it comes out as plain or rich text. See the section on [[#Limitations to Semantic Markup|limitations]] for a way to override the default formatting when necessary.&lt;br /&gt;
&lt;br /&gt;
{{warning|Roles and subcues in the context marker cannot be specified at will, but must be drawn from the sets defined below. This is important for several reasons, one being that translators have deliberated about and agreed upon the meanings of presented sets, rather than having to second-guess arbitrary combinations.}}&lt;br /&gt;
&lt;br /&gt;
KUIT defines the following roles and subcues (with notes on default visual formatting):&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;@action&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Text to all clickable widgets that cause some action to be performed, like an operation on the data, view restructuring, or opening a dialog. The button texts and menu entries (except submenu titles) all fall into this category.&lt;br /&gt;
:&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:button&amp;lt;/tt&amp;gt; - pushbuttons in windows and dialogs&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:inmenu&amp;lt;/tt&amp;gt; - menu entries that perform an action&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:intoolbar&amp;lt;/tt&amp;gt; - toolbar buttons&lt;br /&gt;
:&lt;br /&gt;
: All &amp;lt;tt&amp;gt;@action&amp;lt;/tt&amp;gt; markers are formatted as '''plain text''' by default.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;@title&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Text that is semantically a title in the interface. These would include window titles, menu titles, tab names, option group names in configuration dialogs, and column and row names in list views.&lt;br /&gt;
:&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:window&amp;lt;/tt&amp;gt; - window title (also dock name)&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:menu&amp;lt;/tt&amp;gt; - menu name&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:tab&amp;lt;/tt&amp;gt; - tab name&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:group&amp;lt;/tt&amp;gt; - option group&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:column&amp;lt;/tt&amp;gt; - column name&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:row&amp;lt;/tt&amp;gt; - row name&lt;br /&gt;
:&lt;br /&gt;
: All &amp;lt;tt&amp;gt;@title&amp;lt;/tt&amp;gt; markers are formatted as '''plain text''' by default.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;@option&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Text to options which user can turn on and off, or choose between. These are the labels to checkboxes (either in dialogs or in menus) and radio buttons.&lt;br /&gt;
:&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:check&amp;lt;/tt&amp;gt; - checkbox label&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:radio&amp;lt;/tt&amp;gt; - radio-button label&lt;br /&gt;
:&lt;br /&gt;
: All &amp;lt;tt&amp;gt;@option&amp;lt;/tt&amp;gt; markers are formatted as '''plain text''' by default.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;@label&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Text labels to various widgets in the interface, which are none of &amp;lt;tt&amp;gt;@action&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;@title&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;@option&amp;lt;/tt&amp;gt;. These include labels to sliders, spinboxes, combo, list and text boxes, font and color choosers.&lt;br /&gt;
:&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:slider&amp;lt;/tt&amp;gt; - slider labels (but end-ranges are @item:inrange!)&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:spinbox&amp;lt;/tt&amp;gt; - spinbox labels&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:listbox&amp;lt;/tt&amp;gt; - list and combo boxes&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:textbox&amp;lt;/tt&amp;gt; - text and edit boxes&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:chooser&amp;lt;/tt&amp;gt; - chooser widgets (fonts, colors, etc.)&lt;br /&gt;
:&lt;br /&gt;
: All &amp;lt;tt&amp;gt;@label&amp;lt;/tt&amp;gt; markers are formatted as '''plain text''' by default.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;@item&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Strings that can be considered one from a range of possibilities or properties. Entries in listings, dropdown and combo boxes are obvious, but also some menu items (e.g. encoding selection, sort orderings), end-labels to ranges (e.g. high/low, more/less), inserts into longer texts, and properites (e.g. file types, permissions) frequently displayed in tabular form (e.g. column views, property dialogs).&lt;br /&gt;
:&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:inmenu&amp;lt;/tt&amp;gt; - items presented as menu entries&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:inlistbox&amp;lt;/tt&amp;gt; - items in list and combo boxes&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:intable&amp;lt;/tt&amp;gt; - items presented in table-like forms&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:inrange&amp;lt;/tt&amp;gt; - range labels to sliders, etc.&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:intext&amp;lt;/tt&amp;gt; - words and phrases inserted into other messages&lt;br /&gt;
:&lt;br /&gt;
: All &amp;lt;tt&amp;gt;@item&amp;lt;/tt&amp;gt; markers are formatted as '''plain text''' by default.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;@info&amp;lt;/tt&amp;gt;&lt;br /&gt;
: General texts for user's information, that do not fall under any of the previous roles. These are for example tooltip and &amp;quot;What's This?&amp;quot; texts, text in message boxes, fields in status bar, and strings in progress dialogs.&lt;br /&gt;
:&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:tooltip&amp;lt;/tt&amp;gt; - hovering tooltips&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:whatsthis&amp;lt;/tt&amp;gt; - &amp;quot;What's This?&amp;quot; explanations of widgets&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:status&amp;lt;/tt&amp;gt; - texts in status displays (e.g. in status bar)&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:progress&amp;lt;/tt&amp;gt; - the current state of ongoing process&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:tipoftheday&amp;lt;/tt&amp;gt; - introductory tips on application startup&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:credit&amp;lt;/tt&amp;gt; - contributor names and their contributions&lt;br /&gt;
:: &amp;lt;tt&amp;gt;:shell&amp;lt;/tt&amp;gt; - info output to the terminal, rather than to GUI&lt;br /&gt;
:&lt;br /&gt;
: Standalone &amp;lt;tt&amp;gt;@info&amp;lt;/tt&amp;gt;, without a subcue, is formatted as '''rich text''' by default; the same holds for &amp;lt;tt&amp;gt;:tooltip&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;:whatsthis&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;:tipoftheday&amp;lt;/tt&amp;gt; subcues. With &amp;lt;tt&amp;gt;:status&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;:progress&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;:credit&amp;lt;/tt&amp;gt;, '''plain text''' is produced. &amp;lt;tt&amp;gt;:shell&amp;lt;/tt&amp;gt; produces '''terminal text''' (like plain, but with possible shell escape sequences).&lt;br /&gt;
&lt;br /&gt;
== Semantic Tags ==&lt;br /&gt;
&lt;br /&gt;
KUIT semantic tags come in several logical groups:&lt;br /&gt;
* ''phrase tags'' - those that ascribe meaning to certain phrases and inserts&lt;br /&gt;
* ''sentence tags'' - which describe the purpose of a complete sentence in text&lt;br /&gt;
* ''structure tags'' - used to order longer text into paragraphs, titles, etc.&lt;br /&gt;
&lt;br /&gt;
=== Phrase tags ===&lt;br /&gt;
&lt;br /&gt;
Phrase tags will by default not admit any subtags; where some subtags can be used, it is so indicated. KUIT defines the folowing phrase tags:&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;application&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Name of an application.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@action:inmenu&amp;quot;,&lt;br /&gt;
      &amp;quot;Open with &amp;lt;application&amp;gt;%1&amp;lt;/application&amp;gt;&amp;quot;, appName);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;bcode&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Line-breaking body of code, for short listings.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info:whatsthis&amp;quot;,&lt;br /&gt;
      &amp;quot;You can try the following snippet:&amp;lt;bcode&amp;gt;&amp;quot;&lt;br /&gt;
      &amp;quot;\\begin{equation}&amp;quot;&lt;br /&gt;
      &amp;quot;  C_{x_i} = \\frac{C_z^2}{e \\pi \\lambda}&amp;quot;&lt;br /&gt;
      &amp;quot;\\end{equation}&amp;quot;&lt;br /&gt;
      &amp;quot;&amp;lt;/bcode&amp;gt;&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;command&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Name of shell command or system call. Its man section can be provided via &amp;lt;tt&amp;gt;section&amp;lt;/tt&amp;gt; attribute.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;,&lt;br /&gt;
      &amp;quot;This will call &amp;lt;command&amp;gt;%1&amp;lt;/command&amp;gt; internally.&amp;quot;, cmdName);&lt;br /&gt;
&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;,&lt;br /&gt;
      &amp;quot;Consult man entry for &amp;lt;command section='1'&amp;gt;%1&amp;lt;/command&amp;gt;&amp;quot;, cmdName);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;email&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Email address. Without attributes, the tag text is the address. Address can also be given with &amp;lt;tt&amp;gt;address&amp;lt;/tt&amp;gt; attribute, in which case the tag text is the name or description attached to the address.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;,&lt;br /&gt;
      &amp;quot;Send bug reports to &amp;lt;email&amp;gt;%1&amp;lt;/email&amp;gt;.&amp;quot;, emailNull);&lt;br /&gt;
&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;,&lt;br /&gt;
      &amp;quot;Send praises to &amp;lt;email address='%1'&amp;gt;the author&amp;lt;/email&amp;gt;.&amp;quot;, emailMy);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: The construct will be hyperlinked in rich text format.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;emphasis&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Emphasize a word or phrase in the text.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info:progress&amp;quot;,&lt;br /&gt;
      &amp;quot;Checking &amp;lt;emphasis&amp;gt;feedback&amp;lt;/emphasis&amp;gt; circuits...&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
:  For strong emphasis, attribute &amp;lt;tt&amp;gt;strong&amp;lt;/tt&amp;gt; (since KDE 4.3) may be used, with value &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;yes&amp;lt;/tt&amp;gt;, or &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;envar&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Environment variable. The $ sign will be prepended automatically in formatted text.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;,&lt;br /&gt;
      &amp;quot;Assure that your &amp;lt;envar&amp;gt;PATH&amp;lt;/envar&amp;gt; is properly set.&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;filename&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: File or folder name or path. The path separators will be transformed into what is native to the platform.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;, &amp;quot;Cannot read &amp;lt;filename&amp;gt;%1&amp;lt;/filename&amp;gt;.&amp;quot;, filename);&lt;br /&gt;
&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;filename&amp;gt;&amp;lt;envar&amp;gt;HOME&amp;lt;/envar&amp;gt;/.foorc&amp;lt;/filename&amp;gt; does not exist.&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: The &amp;lt;tt&amp;gt;&amp;lt;envar&amp;gt;&amp;lt;/tt&amp;gt; can be used as subtag.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;icode&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Inline code, like shell command lines.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info:tooltip&amp;quot;,&lt;br /&gt;
      &amp;quot;Execute &amp;lt;icode&amp;gt;svn merge&amp;lt;/icode&amp;gt; on selected revisions.&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: The &amp;lt;tt&amp;gt;&amp;lt;placeholder&amp;gt;&amp;lt;/tt&amp;gt; can be used as subtag.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;interface&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Path to GUI interface element. If there is more than one element in the path, use &amp;quot;|&amp;quot; or &amp;quot;-&amp;gt;&amp;quot; to delimit elements, which will be converted into canonical delimiter.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info:whatsthis&amp;quot;,&lt;br /&gt;
      &amp;quot;If you make a mistake, click &amp;quot;&lt;br /&gt;
      &amp;quot;&amp;lt;interface&amp;gt;Reset&amp;lt;/interface&amp;gt; to start again.&amp;quot;);&lt;br /&gt;
i18nc(&amp;quot;@info:whatsthis&amp;quot;,&lt;br /&gt;
      &amp;quot;The line colors can be changed under &amp;quot;&lt;br /&gt;
      &amp;quot;&amp;lt;interface&amp;gt;Settings-&amp;gt;Visuals&amp;lt;/interface&amp;gt;.&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;link&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Link to a URL-addressable resource. Without attributes, the tag text is the URL; alternatively, the URL can be given by &amp;lt;tt&amp;gt;url&amp;lt;/tt&amp;gt; attribute, and then the tag text serves as description.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info:tooltip&amp;quot;,&lt;br /&gt;
      &amp;quot;Go to &amp;lt;link&amp;gt;%1&amp;lt;/link&amp;gt; website.&amp;quot;, urlKDE);&lt;br /&gt;
&lt;br /&gt;
i18nc(&amp;quot;@info:tooltip&amp;quot;,&lt;br /&gt;
      &amp;quot;Go to &amp;lt;link url='%1'&amp;gt;the KDE website&amp;lt;/link&amp;gt;.&amp;quot;, urlKDE);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: The variant with URL/description separation is preferred when applicable. The construct will be hyperlinked in rich text format.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;message&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: An external message to be reported to the user.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;,&lt;br /&gt;
      &amp;quot;The fortune cookie says: &amp;lt;message&amp;gt;%1&amp;lt;/message&amp;gt;&amp;quot;, trouble);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;nl&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Line break, counterpart to HTML's &amp;lt;tt&amp;gt;&amp;amp;lt;br/&amp;amp;gt;&amp;lt;/tt&amp;gt;. In plain text it will format as a newline character, and in rich text as &amp;lt;tt&amp;gt;&amp;amp;lt;br/&amp;amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;,&lt;br /&gt;
      &amp;quot;Do you really want to delete:&amp;lt;nl/&amp;gt;&amp;quot;&lt;br /&gt;
      &amp;quot;&amp;lt;filename&amp;gt;%1&amp;lt;/filename&amp;gt;&amp;quot;, fileName);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;numid&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: By default, numbers supplied as arguments to i18n calls are formatted into localized form. If the number is supposed to be a numeric identifier instead, like a port number, use this tag to signal numeric-id environment.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info:progress&amp;quot;,&lt;br /&gt;
      &amp;quot;Connecting to &amp;lt;numid&amp;gt;%1&amp;lt;/numid&amp;gt;...&amp;quot;, portNo);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;placeholder&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: A placeholder text, either something to be replaced by the user, or a generic item in a list.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;,&lt;br /&gt;
      &amp;quot;Replace &amp;lt;placeholder&amp;gt;name&amp;lt;/placeholder&amp;gt; with your name.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
i18nc(&amp;quot;@item:inlistbox&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;placeholder&amp;gt;All images&amp;lt;/placeholder&amp;gt;&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;resource&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: General named resource. Names of documents, sessions, projects, toolbars, plugins, schemes and themes, accounts, etc.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;, &amp;quot;Apply color scheme &amp;lt;resource&amp;gt;%1&amp;lt;/resource&amp;gt;?&amp;quot;, colScheme);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;shortcut&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Combination of keys to press. Separate the keys by &amp;quot;+&amp;quot; or &amp;quot;-&amp;quot;, and the shortcut will be converted into canonical form.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info:whatsthis&amp;quot;,&lt;br /&gt;
      &amp;quot;Cycle through layouts using &amp;lt;shortcut&amp;gt;Alt+Space&amp;lt;/shortcut&amp;gt;.&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sentence tags ===&lt;br /&gt;
&lt;br /&gt;
Sentence tags mark complete sentences in text, and will admit any phrase tags as subtags. The following are defined:&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;note&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: The sentence is a side note of significance to the topic.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;,&lt;br /&gt;
      &amp;quot;Probably the best known of all duck species is the Mallard. &amp;quot;&lt;br /&gt;
      &amp;quot;It breeds throughout the temperate areas around the world. &amp;quot;&lt;br /&gt;
      &amp;quot;&amp;lt;note&amp;gt;Most domestic ducks are derived from Mallard.&amp;lt;/note&amp;gt;&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: Do not explicitly add &amp;quot;Note:&amp;quot;, it will be added automatically. If you really need other label than &amp;quot;Note&amp;quot;, use attribute &amp;lt;tt&amp;gt;label&amp;lt;/tt&amp;gt;, e.g. &amp;lt;tt&amp;gt;&amp;quot;&amp;lt;note label='Trivia'&amp;gt;...&amp;lt;/note&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;warning&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: The sentence is a warning.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;,&lt;br /&gt;
      &amp;quot;Really delete this key?&amp;quot;&lt;br /&gt;
      &amp;quot;&amp;lt;warning&amp;gt;This cannot be undone.&amp;lt;/warning&amp;gt;&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: Do not explicitly add &amp;quot;Warning:&amp;quot;, it will be added automatically. If you really need other label than &amp;quot;Warning&amp;quot;, use attribute &amp;lt;tt&amp;gt;label&amp;lt;/tt&amp;gt;, e.g. &amp;lt;tt&amp;gt;&amp;quot;&amp;lt;warning label='Danger'&amp;gt;...&amp;lt;/warning&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Structure tags ===&lt;br /&gt;
&lt;br /&gt;
Structure tags are used to split longer texts into titles, paragraphs, and lists. By default they can contain any phrase or sentence tags, unless indicated otherwise.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;para&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Text paragraph.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;title&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: The title of the text. Must be the first tag if present, but can be omitted.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;subtitle&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: Subtitle in the text. Must be followed by at least one &amp;lt;tt&amp;gt;&amp;amp;lt;para&amp;amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;list&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: List of items. Can contain only &amp;lt;tt&amp;gt;&amp;amp;lt;item&amp;amp;gt;&amp;lt;/tt&amp;gt; as subtags. List is considered an element of the paragraph, so the &amp;lt;tt&amp;gt;&amp;amp;lt;list&amp;amp;gt;&amp;lt;/tt&amp;gt; must be found inside &amp;lt;tt&amp;gt;&amp;amp;lt;para&amp;amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;tt&amp;gt;&amp;amp;lt;item&amp;amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
: List item.&lt;br /&gt;
&lt;br /&gt;
If any of the structure tags is present, then there must be no text outside of structure tags. The following is not valid KUIT markup:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
// invalid markup&lt;br /&gt;
i18nc(&amp;quot;@info&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;title&amp;gt;History Sidebar&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
      &amp;quot;You can configure the history sidebar here.&amp;quot;); // &amp;lt;para&amp;gt; missing&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitations to Semantic Markup ==&lt;br /&gt;
&lt;br /&gt;
Semantic markup cannot be used in &amp;quot;dumb&amp;quot; strings, which do not pass through KDE's i18n subsystem. These would be, for example, strings in &amp;lt;tt&amp;gt;.desktop&amp;lt;/tt&amp;gt; format files. But ''not'' the strings in UI files, as in Qt Designer they can be equipped with both context markers (via comment field to text properties) and semantic tags.&lt;br /&gt;
&lt;br /&gt;
Qt's rich text HTML tags can be used concurrently with KUIT tags, but this is not advised unless necessary. They may be needed, for example, to create tables or insert images, as KUIT does not implement this functionality at the moment.&lt;br /&gt;
&lt;br /&gt;
Sometimes, the visual formatting may not be quite appropriate for the output device; every role/subcue combination has a preset default formatting. For example, if the &amp;lt;tt&amp;gt;@info&amp;lt;/tt&amp;gt; role is applied to a string which is used in a widget that does not handle rich text, it will come out with HTML tags displayed verbatim. To handle this, visual formatting can be explicitly signaled by &amp;lt;tt&amp;gt;/''format''&amp;lt;/tt&amp;gt; modifier appended to context marker:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
i18nc(&amp;quot;@info/plain&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;filename&amp;gt;%1&amp;lt;/filename&amp;gt; does not exist&amp;quot;, fname);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Presently, the possible format modifiers are &amp;lt;tt&amp;gt;/plain&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;/rich&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/term&amp;lt;/tt&amp;gt; (for terminal format, possible use of escape sequences).&lt;br /&gt;
&lt;br /&gt;
To specify context in kpartgui rc file use context attribute (&amp;lt;text context=&amp;quot;@title:menu&amp;quot;&amp;gt;File&amp;lt;/text&amp;gt;). A context-aware version of I18N_NOOP is I18N_NOOP2.&lt;br /&gt;
&lt;br /&gt;
== Should I Go For Semantic Markup? ==&lt;br /&gt;
&lt;br /&gt;
Admittedly, KUIT markup is an additional thing to be learned and applied throughout the course of development. By now you may be wondering if it is worthwile to invest time into that, particularly in view of two cases:&lt;br /&gt;
* starting work on a new application, and&lt;br /&gt;
* porting messages in existing applications.&lt;br /&gt;
&lt;br /&gt;
You are strongly advised to use KUIT for new code. Compared to the total time spent on code, writing UI messages is only a small fraction. Context markers will help translators a lot, and message tags will provide consistent visual text formatting to your application.&lt;br /&gt;
&lt;br /&gt;
When modifying existing code, there are two issues. First, obviously it is a daunting task to go through hundreds (or worse) of messages and equip them with semantic markup. Second, by changing the messages, the translators too will have to review their existing translations; however, it is not expected that the porting will take so &amp;quot;epic&amp;quot; proportions that the translators cannot keep up. Sumarily, feel free to do as you see fit.&lt;br /&gt;
&lt;br /&gt;
Additionally, for porting, keep in mind that it is not all-or-nothing proposal. Any amount of semantic messages are useful to translators, and users can only see the difference for the better. Thus, for example, deciding to make all ''new'' messages semantic and slowly over time fix old messages, is a perfectly fine strategy.&lt;br /&gt;
&lt;br /&gt;
To make your job easier, there is an i18n-checker script that will report the problems in KUIT markup, as well as check some other i18n nuances. It is run daily on KDE code repository-wide as part Krazy-framework, but you can also run it locally on your code. It can be found in {{path|trunk/quality/krazy2/plugins/general/i18ncheckarg}}. Furthermore, as of this moment Krazy checks only C++ sources, while when you run the script locally, some of the XML sources containing translatable strings will be checked as well. &amp;lt;tt&amp;gt;i18ncheckarg&amp;lt;/tt&amp;gt; requires Perl libxml bindings, which are probably already packaged for your distribution (Debian package is libxml-libxml-perl).&lt;br /&gt;
&lt;br /&gt;
{{note|By default &amp;lt;tt&amp;gt;i18ncheckarg&amp;lt;/tt&amp;gt; takes a single filename to check, but using &amp;lt;tt&amp;gt;--allsources&amp;lt;/tt&amp;gt; option you can provide as many file or directory paths as you wish; typically you would give top directory path to your sources. Also, to report all missing context markers use &amp;lt;tt&amp;gt;--ctxmark&amp;lt;/tt&amp;gt; option, or otherwise missing markers will be reported only if some threshold of marked-to-total number of messages in a file is reached.}}&lt;br /&gt;
&lt;br /&gt;
Last but not the least, there is also a chic-effect to the KUIT. Its wide use, together with some under-the-hood elements on translators' disposal, will make KDE4's i18n layer without peer in free or proprietary software world. Insofar as you consider localization excellence an important part of the overall KDE excellence, this is something that may also tip your decision :) -- Your Friendly Translator.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Localization/i18n_Challenges</id>
		<title>Development/Tutorials/Localization/i18n Challenges</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Localization/i18n_Challenges"/>
				<updated>2011-06-27T17:09:28Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Localization/i18n Challenges}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Localization|&lt;br /&gt;
&lt;br /&gt;
pre=[[../i18n| Writing Applications With Localization in Mind]]&amp;lt;br&amp;gt;[[../i18n Build Systems|Incorporating i18n Into the Build System]]|&lt;br /&gt;
&lt;br /&gt;
name=Common i18n Challenges and Solutions|&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
The localization process can, at times, be tricky. 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, or moving applications between KDE modules.&lt;br /&gt;
&lt;br /&gt;
{{note|The references to Makefile.am's needs to be ported to CMake.}}&lt;br /&gt;
&lt;br /&gt;
== Message Freezes ==&lt;br /&gt;
&lt;br /&gt;
As a release date starts getting close, most software projects (including the KDE project) will freeze all changes to user visible strings. This allows translators a chance to do their work without it being constantly disrupted by changes to strings thereby wasting their efforts.  If you change i18n strings in your application during such freezes it creates more work (and confusion) for the teams and could prevent your application from being released with translations.&lt;br /&gt;
&lt;br /&gt;
{{note|If your application is part of KDE that is periodically announced and released, you must pay attention to announcements on the mailing lists for message freezes. When a message freeze is in place, you must not change any of the translatable strings in your application or its Handbook.}}&lt;br /&gt;
&lt;br /&gt;
If you find a GUI string that you feel must be fixed or added during a message freeze, ask your translation teams first. In the KDE project, that would be done by emailing the kde-i18n-doc list. Changing a string or adding a new one will not invalidate the entire translation, but annoys the translation teams who are trying to provide a complete and proper translation for your application.&lt;br /&gt;
&lt;br /&gt;
=== Fixing Messages During A Freeze ===&lt;br /&gt;
&lt;br /&gt;
It's message freeze time and you forgot to code with the &amp;lt;tt&amp;gt;i18n()&amp;lt;/tt&amp;gt; function or forgot to include a file in the Makefile.am messages target, or you need to make some changes to existing strings. What should you do?&lt;br /&gt;
&lt;br /&gt;
If you need to change an existing string, ask the translators first for permission first before you make the fixes. In KDE, that would be the kde-i18n-doc mailing list. &lt;br /&gt;
&lt;br /&gt;
If you need to add untranslated strings due to forgotten &amp;lt;tt&amp;gt;i18n()&amp;lt;/tt&amp;gt; or mistakes in the build system, go ahead and make the fixes. When you commit the fixes, write &amp;quot;untranslated strings&amp;quot; in the commit message so that translators will know why you are committing string changes during a message freeze. It is a good idea to email the translation teams to let the translators know that you've added additional strings. &lt;br /&gt;
&lt;br /&gt;
{{note|If the translator's don't have time to translate the additional strings, they will display in English at runtime.}}&lt;br /&gt;
&lt;br /&gt;
It is considered a violation of the message freeze to add a brand new translated string to your code where the string did not exist untranslated before. So changing this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
QMessageBox::warning(0, &amp;quot;Starting KTTSD Failed&amp;quot;, error );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
QMessageBox::warning(0, i18n( &amp;quot;Starting KTTSD Failed&amp;quot;), error );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
is OK, but adding the call to QMessageBox where it didn't exist before will raise objections from the translators. &lt;br /&gt;
&lt;br /&gt;
In the latter case, ask on the kde-i18n-doc mailing list first. In general, the criteria for modifying or adding strings is a potentially severe misunderstanding of a message, especially if it means a risk of losing data. &lt;br /&gt;
&lt;br /&gt;
{{tip|You may see translators refer to &amp;quot;fuzzy&amp;quot; strings. Fuzzy strings come about when a string has already been translated and then is changed a little bit later. xgettext leaves the original translation in the .po file, but marks the string as fuzzy. The translator must look at the translation to determine if a change is needed and remove the fuzzy flag, otherwise the translation will not be used at runtime. In short, if you change strings in your app, they will generate fuzzies for the translators.}}&lt;br /&gt;
&lt;br /&gt;
=== Handbooks ===&lt;br /&gt;
&lt;br /&gt;
Handbooks especially should not be touched during a message freeze. This is because changing a Handbook (even a small change) can prevent the entire translated Handbook from being released. For this reason, you should watch the release cycle plans carefully and try to complete your Handbook at least 3 to 4 weeks before the message freeze.&lt;br /&gt;
&lt;br /&gt;
If you do make a late change to a Handbook, it will be up to the translation team whether to apply the fix to their translation or not. If the team has already generated the translated Handbook, the uncorrected version may end up being released.&lt;br /&gt;
&lt;br /&gt;
Freezes are often announced in two phases. A feature freeze means GUI string changes should not be made without first asking permission on the kde-i18n-doc mailing list. Handbook changes are OK at this time. A hard freeze means you must not make any more changes to code or to the Handbook.&lt;br /&gt;
&lt;br /&gt;
If you find a Handbook string that you feel must be fixed or added during a freeze, ask first on the kde-doc-english mailing list. Changing the Handbook, even a tiny change, can invalidate the entire Handbook. Once a hard freeze is in place, fixes should be sent to kde-doc-english as patch files (svn diff). The fixes will not be translated, but they will be incorporated into the English-only version of the Handbook. &lt;br /&gt;
&lt;br /&gt;
Questions about Handbook translation should be sent to the kde-doc-english mailing list.&lt;br /&gt;
&lt;br /&gt;
== Independent Releases ==&lt;br /&gt;
&lt;br /&gt;
If your application is not part of an official KDE release cycle (e.g. it is in KDE Extra Gear or in an outside repository altogether), it will be up to you to plan releases and coordinate with the translation teams. When you want to do a release, send an email to the kde-i18n-doc mailing list with the following information:&lt;br /&gt;
&lt;br /&gt;
* The name of your application and its repository location. &lt;br /&gt;
* Your planned message freeze date, the date after which you will not make any more changes that affect i18n strings. &lt;br /&gt;
* Your planned code freeze date, the date after which no more changes except for severe bug fixes will be made. &lt;br /&gt;
* Your planned release date. &lt;br /&gt;
&lt;br /&gt;
You should provide at least 3 weeks between the message freeze date and release date - more if your application is large and complex. If your application has a Handbook, you should provide even more time.&lt;br /&gt;
&lt;br /&gt;
It is a good idea to avoid time periods when KDE or KOffice are in message freeze, since the translators will be very busy at these times. &lt;br /&gt;
&lt;br /&gt;
If you are distributing your code to translators via a source tarball, you should first ask for volunteers. Of course, the message freeze occurs when you send them the tarball. Your tarball must have all the .pot files and prepared po folders.&lt;br /&gt;
&lt;br /&gt;
== KDE Extra Gear Releases ==&lt;br /&gt;
&lt;br /&gt;
Applications in the extragear module have a special procedure for handling translations. When an extragear application becomes stable (mostly at message freeze), the maintainer should copy the application to the appropriate extragear directory in branches/stable/extragear. In addition the whole set of translation template files (.pot) and translation files (.po), including eventual documentation, of the application must be copied to the appropriate places in branches/stable/l10n. This serves as a signal to translators that the application is ready for final translation work in preparation for release.&lt;br /&gt;
&lt;br /&gt;
== Translating UI, RC, and KCFG files ==&lt;br /&gt;
&lt;br /&gt;
User visible strings usually origin not only from code files, but also from three other file types, ui, rc and kcfg files. UI files are the user interface descriptions, which are edited using QtDesigner. Here the text of labels and other ui elements are in need of localized versions. Likewise for the RC files, which are KXmlGui interface descriptions for embedded components. The KCFG files are the configuration data descriptions, which are used to automatically create configuration control code. While that is not related to the user interface, the same KCFG files are also used as the base for the generic runtime editing with [http://extragear.kde.org/apps/kconfigeditor/ KConfigEditor], so the parameter descriptions also need localized versions.&lt;br /&gt;
&lt;br /&gt;
The strings are handled by the translation system by having them extracted by a program called extractrc, which creates a temporary code file that is than simply included by gettext. So extend the messages target in Makefile.am this way:&lt;br /&gt;
&lt;br /&gt;
 messages: rc.cpp&lt;br /&gt;
     $(EXTRACTRC) */*.kcfg &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
     $(EXTRACTRC) */*.ui &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
     $(EXTRACTRC) */*.rc &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
     $(XGETTEXT) rc.cpp */*.cpp */*.h -o $(podir)/my_program.pot&lt;br /&gt;
&lt;br /&gt;
If there are strings translators need context information for, they can be supplied via &amp;lt;tt&amp;gt;context&amp;lt;/tt&amp;gt; attribute in RC and KCFG files:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;text context=&amp;quot;Create new cup of tea&amp;quot;&amp;gt;&amp;amp;amp;New...&amp;lt;/text&amp;gt;&lt;br /&gt;
 &amp;lt;label context=&amp;quot;Fancy for mixture&amp;quot;&amp;gt;Concoction&amp;lt;/label&amp;gt;&lt;br /&gt;
 &amp;lt;whatsthis context=&amp;quot;A concoction&amp;quot;&amp;gt;Not entirely unlike tea&amp;lt;/whatsthis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and in QtDesigner as the &amp;quot;disambiguation&amp;quot; property to text labels (or &amp;quot;comment&amp;quot; prior to Qt 4.5), which become &amp;lt;tt&amp;gt;comment&amp;lt;/tt&amp;gt; attributes in the UI file itself.&lt;br /&gt;
&lt;br /&gt;
Also, if that is more suitable, a parameter can be added to the call to extractrc by which the same context is provided to all strings extracted from the file. Example:&lt;br /&gt;
&lt;br /&gt;
 messages: rc.cpp&lt;br /&gt;
     $(EXTRACTRC) --context=my_context my_config.kcfg &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
     $(EXTRACTRC) --context=other_context */*.ui &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
     $(EXTRACTRC) --context=and_some_more */*.rc &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
     $(XGETTEXT) rc.cpp */*.cpp */*.h -o $(podir)/my_program.pot&lt;br /&gt;
&lt;br /&gt;
== Translating Data ==&lt;br /&gt;
&lt;br /&gt;
If your application uses data that you want the translators to translate for you, there are a couple of solutions. If the data is a single string, and you want to use a translation of the string that is different from the user's desktop language setting, you can create a .desktop file and extract the translated string from it. For example, the KDE text-to-speech daemon (KTTSD) has the following {{path|kcmkttsd_testmessage.desktop}} file: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Encoding=UTF-8&lt;br /&gt;
NoDisplay=true&lt;br /&gt;
Name=The text-to-speech system seems to be functioning properly.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Notice the &amp;lt;tt&amp;gt;NoDisplay=true&amp;lt;/tt&amp;gt; line. The translators will translate the Name line and scripty will insert the translations back into the .desktop file. At runtime, KTTSD uses the following code to get a test message to speak in the language of the synthesizer's voice, not the user's desktop language: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
QString key = &amp;quot;Name[&amp;quot; + languageCode + &amp;quot;]&amp;quot;;&lt;br /&gt;
QString result;&lt;br /&gt;
QString def;&lt;br /&gt;
QFile file(locate(&amp;quot;data&amp;quot;, &amp;quot;kttsd/kcmkttsd_testmessage.desktop&amp;quot;));&lt;br /&gt;
if (file.open(IO_ReadOnly))&lt;br /&gt;
{&lt;br /&gt;
  QTextStream stream(&amp;amp;file);&lt;br /&gt;
  stream.setEncoding(QTextStream::UnicodeUTF8);&lt;br /&gt;
  while ( !stream.atEnd() ) {&lt;br /&gt;
    QString line = stream.readLine(); // line of text excluding '\n'&lt;br /&gt;
    QStringList keyAndValue = QStringList::split(&amp;quot;=&amp;quot;, line);&lt;br /&gt;
    if (keyAndValue.count() == 2)&lt;br /&gt;
    {&lt;br /&gt;
      if (keyAndValue[0] == key)&lt;br /&gt;
      {&lt;br /&gt;
        result = keyAndValue[1];&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
      // Use English default if not found.&lt;br /&gt;
      if (keyAndValue[0] == &amp;quot;Name&amp;quot;) def = keyAndValue[1];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  file.close();&lt;br /&gt;
}&lt;br /&gt;
if (result.isEmpty()) {&lt;br /&gt;
  result = def;&lt;br /&gt;
}&lt;br /&gt;
return result;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your program has larger amounts of data, an XML file is a good way to go. For example, KTTSD maintains a list of Festival synthesizer voices in an XML file called voices. Here's a sample portion from that file: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;voices&amp;gt;&lt;br /&gt;
&amp;lt;voice&amp;gt;&lt;br /&gt;
  &amp;lt;code&amp;gt;kal_diphone&amp;lt;/ code&amp;gt;&lt;br /&gt;
  &amp;lt;language&amp;gt;en_US&amp;lt;/language&amp;gt;&lt;br /&gt;
  &amp;lt;codec&amp;gt;ISO 8859-1&amp;lt;/codec&amp;gt;&lt;br /&gt;
  &amp;lt;gender&amp;gt;male&amp;lt;/gender&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;American Male&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;/voice&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{improve}}&lt;br /&gt;
&lt;br /&gt;
The Makefile.am extracts the name strings from this file like this: &lt;br /&gt;
&lt;br /&gt;
 messages: rc.cpp&lt;br /&gt;
     $(EXTRACTRC) */*.rc */*/*.rc &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
     $(EXTRACTRC) */*.ui */*/*.ui &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
     $(EXTRACTRC) --tag=name --context=FestivalVoiceName plugins/festivalint/voices &amp;gt;&amp;gt; rc.cpp&lt;br /&gt;
     $(XGETTEXT) rc.cpp */*.cpp */*.h */*/*.cpp */*/*.h -o $(podir)/kttsd.pot&lt;br /&gt;
&lt;br /&gt;
Notice that the translators are given a context to help them to translate the voice names. At runtime, KTTSD parses the voices file and displays the translated name of each voice (in the user's desktop language) using code like this: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
QDomNode childNode = node.namedItem(&amp;quot;name&amp;quot;);&lt;br /&gt;
if (!childNode.isNull())&lt;br /&gt;
  QString name = i18n(&amp;quot;FestivalVoiceName&amp;quot;, childNode.toElement().text().utf8());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examining .po Files ==&lt;br /&gt;
&lt;br /&gt;
You can look at the translated .po files to see if a string is present and has been translated. For example, here's a portion of {{path|l10n/de/messages/kdebase/konqueror.po}}: &lt;br /&gt;
&lt;br /&gt;
 #: konq_mainwindow.cc:3707 konq_tabs.cc:84&lt;br /&gt;
 msgid &amp;quot;&amp;amp;New Tab&amp;quot;&lt;br /&gt;
 msgstr &amp;quot;Neues &amp;amp;Unterfenster&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The string to be translated is given on the &amp;lt;tt&amp;gt;msgid&amp;lt;/tt&amp;gt; line. The translated string is on the &amp;lt;tt&amp;gt;msgstr&amp;lt;/tt&amp;gt; line. Notice that the exact same string to translate came from {{path|konq_mainwindow.cc}} and also from {{path|konq_tabs.cc}}. This saves the translators from having to translate the same identical string twice. &lt;br /&gt;
&lt;br /&gt;
You can also use KBabel to examine .po files. KBabel is part of the {{path|kdesdk}} module.&lt;br /&gt;
&lt;br /&gt;
== Coding in a Foreign Language  ==&lt;br /&gt;
&lt;br /&gt;
If you are not comfortable with the English language, you may have coded your application using strings in your native language. You must convert all your code to English before it can be translated by the translation teams.&lt;br /&gt;
&lt;br /&gt;
One solution is to get someone who understands both English and your language to help you with this. You can also ask for a volunteer on the kde-i18n-doc mailing list. You will create your .pot file (see Distributing message catalogs [*]) and send it to them. They will translate it to English and send you back a .po file. Using cut and paste, put the English strings into your code.&lt;br /&gt;
&lt;br /&gt;
If you do this, it is still a good idea to have an English speaker review your code for any mistakes. You can use [http://cli-apps.org/content/show.php/poreviewtool?content=132789 poreviewtool], a tool which makes the review of the English strings easier (relays also on .po files, but makes the handling much easier if you want to review continuously.)&lt;br /&gt;
&lt;br /&gt;
== Merging .po Files ==&lt;br /&gt;
&lt;br /&gt;
If you made the mistake of creating a single .pot file for all the components in my application and the translators have already created the .po files what should you do so that no work (and translations) are lost ? &lt;br /&gt;
&lt;br /&gt;
Correct your code and the build system. Commit the changes to the repository. Ask one of the KDE admins to merge the existing .po files. She will need to know the exact names of all the .po files, which module they are in, and the name of the desired merged .po file. The admin will have to wait for scripty to generate your new .pot file before doing the merge.&lt;br /&gt;
&lt;br /&gt;
== Deleting obsolete .pot files ==&lt;br /&gt;
&lt;br /&gt;
If you change the build for you application so that it no longer generates a .pot file, or generates a .pot file with a different name, the old .pot file will not automatically disappear from the code repository. &lt;br /&gt;
&lt;br /&gt;
You must delete it yourself from the templates folder in the l10n module. You should also send an email to the kde-i18n-doc mailing list advising translators that they may delete the .po file. If you do not do this, the translators will waste their time working on an obsolete file.&lt;br /&gt;
&lt;br /&gt;
== Handbook entity errors ==&lt;br /&gt;
&lt;br /&gt;
Sometimes, when building Handbooks in the {{path|l10n/xx/docs}} folders, you may get entity errors. First of all, make sure your kdelibs/kdoctools folder is up-to-date and installed. If that doesn't fix the problem, it may be that the translator made an error, leaving an entity in the .docbook file that is defined in English but not in the translated language. In many cases, the translators haven't finished the translation. Contact the translation team. &lt;br /&gt;
&lt;br /&gt;
For example, the English entity eg is defined in the {{path|kdelibs/kdoctools/customizations/en/user.entities}} file but is not defined in the German kdelibs/kdoctools/customizations/de/user.entities. It must be replaced by the translator with the entity zb (Zum Beispiel).&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Icwiener</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>2011-06-27T17:04:11Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Localization/i18n Build Systems}}&lt;br /&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 scences 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` -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;
* $EXTRACTQML - Extract translatable strings from QML 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;
== 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/de/docs/kdebase/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>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Localization/Building_KDE%27s_l10n_Module</id>
		<title>Development/Tutorials/Localization/Building KDE's l10n Module</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Localization/Building_KDE%27s_l10n_Module"/>
				<updated>2011-06-27T16:50:50Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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=[[Getting_Started/Sources/Using_Subversion_with_KDE|Using Subversion with KDE]]&amp;lt;br&amp;gt;[[Getting_Started/Build|Building KDE From Subversion]]&amp;lt;br&amp;gt;[[../i18n|Writing Applications With Localization in Mind]]|&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
For those working on applications in KDE's main repository, building and installing language support from KDE's localization (l10n) module is a good idea. Doing so will allow you to test applications in other languages so as to spot problems related to localization that may exist in KDE. Learn how to do just that in this tutorial.&lt;br /&gt;
&lt;br /&gt;
== Step 1: l10n ==&lt;br /&gt;
&lt;br /&gt;
You must download, build and install each language in the l10n module separately. You can check out and build just the German, and XX languages using the following procedure:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
svn co -N svn://anonsvn.kde.org/home/kde/trunk/l10n-kde4 l10n&lt;br /&gt;
cd l10n&lt;br /&gt;
svn up scripts&lt;br /&gt;
svn up templates&lt;br /&gt;
svn up x-test&lt;br /&gt;
svn up de&lt;br /&gt;
./scripts/autogen.sh de&lt;br /&gt;
./scripts/autogen.sh x-test&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once this is done, switch to your build directory, start cmake in the &amp;lt;tt&amp;gt;l10n/x-test&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;l10n/de&amp;lt;/tt&amp;gt;, etc directories that you wish to build the language support for one at a time. You may then make and install from the build directory.&lt;br /&gt;
&lt;br /&gt;
{{note|You need revpath (may be found in package {{program|imake}} or {{program|xutils-dev}}) to run &amp;lt;tt&amp;gt;autogen.sh&amp;lt;/tt&amp;gt;}}&lt;br /&gt;
{{tip|Do not combine make and make install in a single step. It will not install anything.}}&lt;br /&gt;
&lt;br /&gt;
== Step 2: Test An Application ==&lt;br /&gt;
&lt;br /&gt;
To run your application using, for instance, the German catalogs open a terminal (e.g. {{program|konsole}}) and type:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
KDE_LANG=de myapp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
where &amp;lt;tt&amp;gt;myapp&amp;lt;/tt&amp;gt; is the name of the application you wish to test. Replace the &amp;lt;tt&amp;gt;de&amp;lt;/tt&amp;gt; with the language code you wish to test, e.g. &amp;lt;tt&amp;gt;x-test&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The German language is a good choice for testing the layout of your application, as German translated strings tend to be quite long. French is also a good choice. The x-test language is useful for identifying strings in your application that are not translated.&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Localization/i18n_Mistakes</id>
		<title>Development/Tutorials/Localization/i18n Mistakes</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Localization/i18n_Mistakes"/>
				<updated>2011-06-27T16:47:20Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax hightlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Localization/i18n Mistakes}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Localization|&lt;br /&gt;
&lt;br /&gt;
name=Avoiding Common Localization Pitfalls|&lt;br /&gt;
&lt;br /&gt;
pre=[[../i18n|Writing Applications With Localization in Mind]]|&lt;br /&gt;
&lt;br /&gt;
next=[[../i18n_Build_Systems|Incorporating i18n Into the Build System]]|&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
There are a few common pitfalls that prevent applications from being properly translated or otherwise localized. These include using pixel based layouts, &amp;quot;word puzzles&amp;quot; and writing code that does not deal with Unicode characters properly. This tutorial covers each of these issues, explaining what to avoid and how to do it properly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pitfall #1: Pixel Based Layouts ==&lt;br /&gt;
&lt;br /&gt;
English text is often very compact compared to other languages where the translated text is often substantially longer. Therefore the interface must be able to adjust size to accommodate the length of translations provided at runtime. If it can't do this, then messages will end up misaligned and truncated.&lt;br /&gt;
&lt;br /&gt;
The answer is to use layout managers. Qt provides a number of such layout managers pre-made for you. They include &amp;lt;tt&amp;gt;QHBoxLayout&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;QVBoxLayout&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;QGridLayout&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;QStackedLayout&amp;lt;/tt&amp;gt;, all of which are subclasses of &amp;lt;tt&amp;gt;QLayout&amp;lt;/tt&amp;gt;. You may also create your own &amp;lt;tt&amp;gt;QLayout&amp;lt;/tt&amp;gt; based classes, but this is generally not needed. &lt;br /&gt;
&lt;br /&gt;
These layout classes manage the pixel positioning of widgets for you at runtime, so no matter what the size of the translated strings your interface will adjust properly. For more information look at the documentation for {{qt|QLayout}}.&lt;br /&gt;
&lt;br /&gt;
== Pitfall #2: Word Puzzles ==&lt;br /&gt;
&lt;br /&gt;
Another thing to be aware of is to not concatenate pieces of sentences together like this: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
QString msg=i18n(&amp;quot;Do you want to replace &amp;quot;) + &lt;br /&gt;
                 oldFile+i18n(&amp;quot; with &amp;quot;) + &lt;br /&gt;
                 newFile + &amp;quot;?&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Such &amp;quot;word puzzles&amp;quot; are very hard or even impossible to translate. This is because the structure of the sentence will often be completely different in another language and thus must be controlled by the translator. When the order of words and phrases is hard-coded as in the above example, the translator can not create a proper translation.&lt;br /&gt;
&lt;br /&gt;
Adding to this problem, a translator will only see parts of the sentence while translating and will have to guess at what belongs together. &lt;br /&gt;
&lt;br /&gt;
The solution thankfully is quite simple: use &amp;lt;tt&amp;gt;%&amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt;&amp;lt;/tt&amp;gt; placeholder substitution, which lets the translators not only make good translations because they can see the entirety of the sentence during translation, but which also lets them change the order of the arguments freely. The arguments themselves are passed as extra parameters to &amp;lt;tt&amp;gt;i18n()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The above example written properly would then look like this: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
QString msg = i18n(&amp;quot;Do you want to replace %1 with %2?&amp;quot;,&lt;br /&gt;
                   oldFile, newFile)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It would be even better, if you wrote it more explictly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
QString msg = i18n(&amp;quot;Do you want to replace file %1 with file %2?&amp;quot;,&lt;br /&gt;
                   oldFile, newFile)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or another way is to write a comment prior to sentence like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
/* TRANSLATORS: Replacing an old file (%1) with a new one (%2). */&lt;br /&gt;
QString msg = i18n(&amp;quot;Do you want to replace %1 with %2?&amp;quot;,&lt;br /&gt;
                   oldFile, newFile)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|Avoid inserting anything other than numbers or nouns with this method, since in some languages the translation depends on the inserted words. It is therefore best to create strings that are as complete sentences as possible.}}&lt;br /&gt;
&lt;br /&gt;
A related mistake is not including markup tags in rich text, such as &amp;amp;lt;b&amp;amp;gt;&amp;amp;lt;/b&amp;amp;gt; or &amp;amp;lt;i&amp;amp;gt;&amp;amp;lt;/i&amp;amp;gt;, in the translatable string. Not all languages use such markup in an identical fashion to English and so it is necessary for the translator to be able to &amp;quot;translate&amp;quot; the markup accordingly as well.&lt;br /&gt;
&lt;br /&gt;
Similarly, messages that contain a version string or other often changing parts should be inserted by placeholders into the message. This prevents unnecessary changes that cause the translators to have to change the translated messages as well. &lt;br /&gt;
&lt;br /&gt;
Since KDE is translated into more than 65 languages a single string change causes at least 65 people to open the file, find the changed message, look carefully if this is the only thing that has changed, change the translation, save the file again and commit the changed file into the code repository. All in all such a small change might create hours of work which could be easily avoided.&lt;br /&gt;
&lt;br /&gt;
== Pitfall #3: Lack of Unicode Support ==&lt;br /&gt;
&lt;br /&gt;
Whenever there is source code that handles strings using a datatype (such as &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;) or class (such as &amp;lt;tt&amp;gt;std::string&amp;lt;/tt&amp;gt;) that can not handle Unicode, translations will break.&lt;br /&gt;
&lt;br /&gt;
To avoid this, never call &amp;lt;tt&amp;gt;QString::latin1()&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;QString::ascii()&amp;lt;/tt&amp;gt; on translated strings. This also applies to information resulting from user input such as passwords, URLs and filenames. If you really need a plain &amp;lt;tt&amp;gt;char*&amp;lt;/tt&amp;gt; representation of a string, it is better to use &amp;lt;tt&amp;gt;QString::utf8()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{note|For more information on character sets and Unicode, see the [[Development/Tutorials/Localization/Unicode|Unicode tutorial]].}}&lt;br /&gt;
&lt;br /&gt;
KIO slaves may also provide paths and file names encoded using UTF-8. It is up to the programmer, however, to take care of passing properly encoded filenames to any KIO method in question. The correct way to do this is not to guess at user's filesystem encoding but to use &amp;lt;tt&amp;gt;QFile::encodeName()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;QFile::decodeName()&amp;lt;/tt&amp;gt; instead.&lt;br /&gt;
&lt;br /&gt;
{{tip|You can turn KIO's UTF-8 file name support on for testing by exporting the KDE_UTF8_FILENAMES environment variable in your shell's startup file (e.g. &amp;lt;tt&amp;gt;~/.bashrc&amp;lt;/tt&amp;gt;).}}&lt;br /&gt;
&lt;br /&gt;
== Pitfall #4: Complex Text Flow ==&lt;br /&gt;
&lt;br /&gt;
When designing an application that needs non-standard text flow, don't assume that the same rules apply for all languages. Given vertical writing as an example East-Asian languages using Chinese characters have a long history of vertical writing, even longer then horizontal. Strings are not rotated by 90 degrees but instead single characters are placed under one another. There might be just a different behaviour with different scripts. Expect the need to implement specialised versions.&lt;br /&gt;
&lt;br /&gt;
== Success! ==&lt;br /&gt;
&lt;br /&gt;
If you avoid the four common categories of pitfalls detailed in this tutorial, your application should be fully localizable by the various KDE translation teams around the world and open up your application to the majority of people on the planet.&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Icwiener</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Localization/i18n</id>
		<title>Development/Tutorials/Localization/i18n</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Localization/i18n"/>
				<updated>2011-06-27T16:42:18Z</updated>
		
		<summary type="html">&lt;p&gt;Icwiener: Fix syntax highlighting.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Localization/i18n}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Localization|&lt;br /&gt;
&lt;br /&gt;
pre=[[../Unicode|Introduction to Unicode]] is recommended, though not required|&lt;br /&gt;
&lt;br /&gt;
name=Writing Applications With Localization In Mind|&lt;br /&gt;
&lt;br /&gt;
next=[[../i18n_Mistakes|Avoiding Common Localization Pitfalls]]|&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Reaching a broad audience of users and developers requires that your software can be translated and otherwise shaped at runtime to be linguistically and culturally relevant to whomever is sitting in front of the computer. This is the realm of localization and this tutorial steps you through what is needed to make your application localizable.&lt;br /&gt;
&lt;br /&gt;
== What is Internationalization and Localization? ==&lt;br /&gt;
&lt;br /&gt;
Internationalization, or i18n ('i', followed by 18 letters, then an 'n'), is the process of writing your application so that it can be run in any locale. This means taking into account such things as:&lt;br /&gt;
* textual messages that are displayed to the user&lt;br /&gt;
* data input from the user, files and other sources&lt;br /&gt;
* format of dates, numbers, currency, dates, etc.&lt;br /&gt;
&lt;br /&gt;
Localization, or l10n ('l', followed by 10 characters, then an 'n'), is the process of taking an internationalized application and adapting it for a specific locale.&lt;br /&gt;
&lt;br /&gt;
Generaly speaking, programmers internationalize their applications and translation teams localize them.&lt;br /&gt;
&lt;br /&gt;
== Why is This Important? ==&lt;br /&gt;
&lt;br /&gt;
KDE development happens primarily in English as this allows the broadest reach into the development and translation communities. However, English is not the primary language of most people on the planet. In fact, fewer than 8% of humanity speaks English and less than 5% speak it as their mother tongue. Even on the Internet, only 35% people who are online use English as their primary language and as more and more of the world gets wired this number is only decreasing. Additionally most languages, including 9 out of the 10 most common languages, use non-ASCII characters in their written form. It is easy to see, then, why it has become a necessity to provide localized software. &lt;br /&gt;
&lt;br /&gt;
As an international project that spans the globe, such localization is a core value within the KDE culture. In fact, while many KDE developers write their software in English they use the desktop in their native locale.&lt;br /&gt;
&lt;br /&gt;
== Translatable Code Using i18n() ==&lt;br /&gt;
&lt;br /&gt;
To ensure your application is ready to be localized you have to follow a few simple rules. All user-visible strings in your application should be translated before they are displayed on the user's screen, exceptions to this being debugging messages, configuration keys and similar types of text data.&lt;br /&gt;
&lt;br /&gt;
KDE provides the &amp;lt;tt&amp;gt;KLocale&amp;lt;/tt&amp;gt; class as part of &amp;lt;tt&amp;gt;libkdecore&amp;lt;/tt&amp;gt; to facilitate the technical details of localization. KLocale makes it as easy as possible for developers to make their code i18n aware, but there are some things you need to be aware of so that applications are usable in other languages and countries.&lt;br /&gt;
&lt;br /&gt;
Access to a global &amp;lt;tt&amp;gt;KLocale&amp;lt;/tt&amp;gt; object is provided via &amp;lt;tt&amp;gt;KGlobal::locale()&amp;lt;/tt&amp;gt;. This &amp;lt;tt&amp;gt;KLocale&amp;lt;/tt&amp;gt; object is created automatically by &amp;lt;tt&amp;gt;KInstance&amp;lt;/tt&amp;gt; and takes care of all user i18n related settings. It is deleted automatically on application exit.&lt;br /&gt;
&lt;br /&gt;
Translations are made possible by the &amp;lt;tt&amp;gt;QString i18n(const char*)&amp;lt;/tt&amp;gt; method, defined in &amp;lt;tt&amp;gt;klocalizedstring.h&amp;lt;/tt&amp;gt;, which you must wrap all strings that should be displayed in. The QString returned by &amp;lt;tt&amp;gt;i18n()&amp;lt;/tt&amp;gt; is the translated (if necessary) string. This makes creating translatable widgets as simple as in this example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;klocalizedstring.h&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
QPushButton* myButton = new QPushButton(i18n(&amp;quot;Translate this!&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
QString's native Unicode support ensures that all translations are represented correctly. All string handling done by your application should therefore use QString.&lt;br /&gt;
&lt;br /&gt;
{{tip|If the string to be translated contains any non-UTF8 characters, use the &amp;lt;tt&amp;gt;utf8()&amp;lt;/tt&amp;gt; method to get a &amp;lt;tt&amp;gt;char*&amp;lt;/tt&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== ki18n ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;i18n()&amp;lt;/tt&amp;gt; method requires that a &amp;lt;tt&amp;gt;KInstance&amp;lt;/tt&amp;gt; (e.g. &amp;lt;tt&amp;gt;KApplication&amp;lt;/tt&amp;gt;) has been created. For any strings that are created prior  to this there is another method provided: &amp;lt;tt&amp;gt;ki18n()&amp;lt;/tt&amp;gt;. This allows one to mark strings that should be translated later as such. The ki18n() will return a &amp;lt;tt&amp;gt;KLocalizedString&amp;lt;/tt&amp;gt;, which can be finalized into a QString (i.e. translated for real) after the KInstance has been created, using its toString() method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;ki18n()&amp;lt;/tt&amp;gt; is typically used for strings given to KAboutData, because it is constructed before the KApplication and you can use i18n() only after the construction of the KApplication. Other than these special cases, it is always safe to use i18n() if you are sure that the code will be executed after construction of KApplication or some other KInstance.&lt;br /&gt;
&lt;br /&gt;
=== Adding Context with i18nc() ===&lt;br /&gt;
&lt;br /&gt;
There is an extended method, &amp;lt;tt&amp;gt;i18nc()&amp;lt;/tt&amp;gt; which takes two &amp;lt;tt&amp;gt;const char*&amp;lt;/tt&amp;gt; arguments. The first argument is an additional contextual description of the second string which will be translated. The first  string is used to find the proper corresponding translation at run-time and is shown to translators to help them understand the meaning of the string. &lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;tt&amp;gt;i18nc()&amp;lt;/tt&amp;gt; whenever the purpose of the text might be ambiguous without further context. For example, consider a context menu in a file manager with an entry called &amp;quot;View&amp;quot; which opens a viewer for the currently selected file. In this context &amp;quot;View&amp;quot; is a verb. However, the same application also may have a menu called &amp;quot;View&amp;quot; in the menubar. In that context &amp;quot;View&amp;quot; is a noun. In the English version of the application everything looks fine, but in most other languages one of the two &amp;quot;View&amp;quot; strings will be incorrect.&lt;br /&gt;
&lt;br /&gt;
Additionally, translators sometimes need extra help in understanding what the text is actually referring to during the translation process.&lt;br /&gt;
&lt;br /&gt;
In the file manager example above, one might therefore write:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
contextMenu-&amp;gt;addAction(i18nc(&amp;quot;verb, to view something&amp;quot;, &amp;quot;View&amp;quot;));&lt;br /&gt;
viewMenu-&amp;gt;addAction(i18nc(&amp;quot;noun, the view&amp;quot;, &amp;quot;View&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the two strings will be properly translatable, both by the human translators and at runtime by KLocale.&lt;br /&gt;
&lt;br /&gt;
Use this form of i18n whenever the string to translate is short or the meaning is hard to discern when the context is not exactly known. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
QString up = i18nc(&amp;quot;Go one directory up in the hierarchy&amp;quot;, &amp;quot;Up&amp;quot;);&lt;br /&gt;
QString relation = i18nc(&amp;quot;A person's name and their familial relationship to you.&amp;quot;, &amp;quot;%1 is your %2&amp;quot;, name, relationship);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|There is also a &amp;lt;tt&amp;gt;ki18nc(&amp;quot;context&amp;quot;,&amp;quot;text&amp;quot;)&amp;lt;/tt&amp;gt; method for providing context to strings which are constructed before the KInstance. It returns a KLocalizedString, so use the &amp;lt;tt&amp;gt;toString()&amp;lt;/tt&amp;gt; method afterwards to convert it into a &amp;lt;tt&amp;gt;QString&amp;lt;/tt&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
Contexts can also be added when building forms in Qt Designer. Each widget label, including tooltips and whatsthis texts, has a &amp;quot;disambiguation&amp;quot; attribute (named &amp;quot;comment&amp;quot; prior to Qt 4.5), which will serve the same purpose as first argument to &amp;lt;tt&amp;gt;i18nc()&amp;lt;/tt&amp;gt; call.&lt;br /&gt;
&lt;br /&gt;
KDE provides a standard set of strings to identify the semantic context of translatable strings. These are defined in the [[Development/Tutorials/Localization/i18n_Semantics|KUIT Semantic Markup scheme]].&lt;br /&gt;
&lt;br /&gt;
=== Standard Context For Common Phrases ===&lt;br /&gt;
&lt;br /&gt;
Below is a chart showing some common words and phrases in English and the context that must be used with them to ensure proper translation of them in other languages.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ Standard Contexts&lt;br /&gt;
|-&lt;br /&gt;
! Phrase !! Context !! i18nc Call !! Example&lt;br /&gt;
|-&lt;br /&gt;
| Busy || Referring to a person || &amp;lt;tt&amp;gt;i18nc(&amp;quot;A person is busy&amp;quot;, &amp;quot;Busy&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Busy || Referring to a thing || &amp;lt;tt&amp;gt;i18nc(&amp;quot;A thing is busy&amp;quot;, &amp;quot;Busy&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Color || Color mode, as opposed to Grayscale || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Not Grayscale&amp;quot;, &amp;quot;Color&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Creator || Referring to a person || &amp;lt;tt&amp;gt;i18nc(&amp;quot;A person who creates&amp;quot;, &amp;quot;Creator&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Creator || Referring to software || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Software&amp;quot;, &amp;quot;Creator&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Display || Referring to hardware || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Hardware display&amp;quot;, &amp;quot;Display&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Editor || Referring to a person || &amp;lt;tt&amp;gt;i18nc(&amp;quot;A person who edits&amp;quot;, &amp;quot;Editor&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Editor || Referring to software || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Software&amp;quot;, &amp;quot;Editor&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Line || Referring to drawing || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Draw a line&amp;quot;, &amp;quot;Line&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Line || Referring to text || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Line of text&amp;quot;, &amp;quot;Line&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Name || Referring to a name of thing || &amp;lt;tt&amp;gt;i18nc(&amp;quot;A thing's name&amp;quot;, &amp;quot;Name&amp;quot;)&amp;lt;/tt&amp;gt; || In theme change dialog: &amp;lt;tt&amp;gt;i18nc(&amp;quot;Theme name&amp;quot;, &amp;quot;Name&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Name || Referring to first name and last name of person || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Person's first and last name&amp;quot;, &amp;quot;Name&amp;quot;)&amp;lt;/tt&amp;gt; || In KAddessbook contact edit dialog: &amp;lt;tt&amp;gt;i18nc(&amp;quot;Person's first and last name&amp;quot;, &amp;quot;Name&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| New || Create something || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Action&amp;quot;, &amp;quot;New&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| New || Status || &amp;lt;tt&amp;gt;i18nc(&amp;quot;New mail message&amp;quot;, &amp;quot;New&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| No || Answer to a question || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Answer to a question&amp;quot;, &amp;quot;No&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| No || Availability of a thing || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Availability&amp;quot;, &amp;quot;No&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| (Re)load || (Re)load a document, medium etc. || &amp;lt;tt&amp;gt;i18nc(&amp;quot;(Re)load a document&amp;quot;, &amp;quot;(Re)load&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| (Re)load || (Re)start a program, daemon etc. || &amp;lt;tt&amp;gt;i18nc(&amp;quot;(Re)start a program&amp;quot;, &amp;quot;(Re)load&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Title || Referring to a person || &amp;lt;tt&amp;gt;i18nc(&amp;quot;A person's title&amp;quot;, &amp;quot;Title&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Title || Referring to a thing || &amp;lt;tt&amp;gt;i18nc(&amp;quot;A thing's title&amp;quot;, &amp;quot;Title&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Trash || Referring to the action of emptying || &amp;lt;tt&amp;gt;i18nc(&amp;quot;The trash is not empty. Empty it&amp;quot;, &amp;quot;Empty&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Trash || Referring to the state of being empty || &amp;lt;tt&amp;gt;i18nc(&amp;quot;The trash is empty. This is not an action, but a state&amp;quot;, &amp;quot;Empty&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Volume || Referring to sound || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Sound volume&amp;quot;, &amp;quot;Volume&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Volume || Referring to a filesystem || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Filesystem volume&amp;quot;, &amp;quot;Volume&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Volume || Referring to books || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Book volume&amp;quot;, &amp;quot;Volume&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Yes || Answer to a question || &amp;lt;tt&amp;gt;i18nc(&amp;quot;Answer to a question&amp;quot;, &amp;quot;Yes&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Yes || Availability of a thing|| &amp;lt;tt&amp;gt;i18nc(&amp;quot;Availability&amp;quot;, &amp;quot;Yes&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Standard Context for Special Format Strings ===&lt;br /&gt;
&lt;br /&gt;
* The context '''(qtdt-format)''' should be used for strings that are used as '''displayFormat''' in '''QDateTimeEdit''' or '''QTimeEdit'''.&lt;br /&gt;
* The context '''(qtundo-format)''' should be used for strings that are used as 