summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--COPYING481
-rw-r--r--ChangeLog27
-rw-r--r--INSTALL43
-rw-r--r--MANIFEST.in6
-rw-r--r--NEWS0
-rw-r--r--PKG-INFO10
-rw-r--r--README14
-rw-r--r--TODO0
-rw-r--r--app_templates/kcontrol_module/AUTHORS1
-rw-r--r--app_templates/kcontrol_module/COPYING340
-rw-r--r--app_templates/kcontrol_module/ChangeLog0
-rw-r--r--app_templates/kcontrol_module/INSTALL43
-rw-r--r--app_templates/kcontrol_module/MANIFEST.in6
-rw-r--r--app_templates/kcontrol_module/NEWS0
-rw-r--r--app_templates/kcontrol_module/README0
-rw-r--r--app_templates/kcontrol_module/TODO0
-rw-r--r--app_templates/kcontrol_module/doc/en/index.docbook555
-rw-r--r--app_templates/kcontrol_module/po/README1
-rwxr-xr-xapp_templates/kcontrol_module/setup.py32
-rw-r--r--app_templates/kcontrol_module/src/KcontrolModuleWidgetUI.ui33
-rw-r--r--app_templates/kcontrol_module/src/hi16-app-kcontrol_module.png8
-rw-r--r--app_templates/kcontrol_module/src/hi32-app-kcontrol_module.png26
-rw-r--r--app_templates/kcontrol_module/src/kcontrol_module.desktop15
-rw-r--r--app_templates/kcontrol_module/src/kcontrol_module.lsm16
-rwxr-xr-xapp_templates/kcontrol_module/src/kcontrol_module.py166
-rw-r--r--app_templates/kdeapp/AUTHORS1
-rw-r--r--app_templates/kdeapp/COPYING340
-rw-r--r--app_templates/kdeapp/ChangeLog0
-rw-r--r--app_templates/kdeapp/INSTALL43
-rw-r--r--app_templates/kdeapp/MANIFEST.in6
-rw-r--r--app_templates/kdeapp/NEWS0
-rw-r--r--app_templates/kdeapp/README0
-rw-r--r--app_templates/kdeapp/TODO0
-rw-r--r--app_templates/kdeapp/doc/en/index.docbook555
-rw-r--r--app_templates/kdeapp/po/README1
-rwxr-xr-xapp_templates/kdeapp/setup.py30
-rw-r--r--app_templates/kdeapp/src/hi16-app-kdeapp.png8
-rw-r--r--app_templates/kdeapp/src/hi32-app-kdeapp.png26
-rw-r--r--app_templates/kdeapp/src/kdeapp.desktop35
-rw-r--r--app_templates/kdeapp/src/kdeapp.lsm16
-rwxr-xr-xapp_templates/kdeapp/src/kdeapp.py280
-rw-r--r--app_templates/kdeapp/src/kdeappiface.py26
-rw-r--r--app_templates/kdeapp/src/kdeappui.rc8
-rw-r--r--app_templates/kdeapp/src/kdeappview.py91
-rw-r--r--app_templates/kdeapp/src/prefdialog.py53
-rw-r--r--app_templates/kdeutility/AUTHORS1
-rw-r--r--app_templates/kdeutility/COPYING340
-rw-r--r--app_templates/kdeutility/ChangeLog0
-rw-r--r--app_templates/kdeutility/INSTALL43
-rw-r--r--app_templates/kdeutility/MANIFEST.in6
-rw-r--r--app_templates/kdeutility/NEWS0
-rw-r--r--app_templates/kdeutility/README0
-rw-r--r--app_templates/kdeutility/TODO0
-rw-r--r--app_templates/kdeutility/doc/en/index.docbook555
-rw-r--r--app_templates/kdeutility/po/README1
-rwxr-xr-xapp_templates/kdeutility/setup.py31
-rw-r--r--app_templates/kdeutility/src/KDEUtilityDialogUI.ui33
-rw-r--r--app_templates/kdeutility/src/hi16-app-kdeutility.png8
-rw-r--r--app_templates/kdeutility/src/hi32-app-kdeutility.png26
-rw-r--r--app_templates/kdeutility/src/kdeutility.desktop35
-rw-r--r--app_templates/kdeutility/src/kdeutility.lsm16
-rwxr-xr-xapp_templates/kdeutility/src/kdeutility.py51
-rw-r--r--app_templates/kioslave/AUTHORS1
-rw-r--r--app_templates/kioslave/COPYING340
-rw-r--r--app_templates/kioslave/ChangeLog0
-rw-r--r--app_templates/kioslave/INSTALL43
-rw-r--r--app_templates/kioslave/MANIFEST.in6
-rw-r--r--app_templates/kioslave/NEWS0
-rw-r--r--app_templates/kioslave/README0
-rw-r--r--app_templates/kioslave/TODO0
-rw-r--r--app_templates/kioslave/doc/en/index.docbook555
-rwxr-xr-xapp_templates/kioslave/setup.py30
-rw-r--r--app_templates/kioslave/src/kioslave.lsm16
-rw-r--r--app_templates/kioslave/src/kioslave.protocol13
-rwxr-xr-xapp_templates/kioslave/src/kioslave.py618
-rw-r--r--doc/en/index.docbook874
-rwxr-xr-xsetup.py323
-rw-r--r--src/kdedesigner.py25
-rw-r--r--src/kdedistutils.py2209
-rw-r--r--src/pythonize.cpp238
-rw-r--r--src/pythonize.h104
-rw-r--r--src/qtdesigner.py26
-rw-r--r--src/qtuicompiler.py111
84 files changed, 10021 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..acbd66f
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1 @@
+Simon Edwards <[email protected]>
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..789c31e
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,481 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor
+ Boston, MA 02110-1301, USA.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..e54d6eb
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,27 @@
+* Monday September 19th 2005 Simon Edwards <[email protected]>
+- 0.4 release. Development version.
+- KIO-slave support added/integrated from David Boddie's work.
+- fix for libtool (Ismail D�nmez).
+
+* Saturday August 6th 2005 Simon Edwards <[email protected]>
+- 0.3.1 release. Development version.
+- Fixed bug for broken application links in the bin directory.
+- Fixed bug for kcontrol modules not being able to find the application's
+ installation directory.
+- Fixed another bug/incompatibility in the kcontrol module support that
+ broke embedding on SIP 4.2+.
+
+* Wednesday June 21st 2005 Simon Edwards <[email protected]>
+- 0.3 release. Development version.
+- 64bit awareness when building libraries added.
+- Files for installation in the program's KDE application data directory
+ are now specified with the 'application_data' parameter for setup().
+- kde-prefix option added to setup.py scripts.
+
+* Thursday June 9th 2005 Simon Edwards <[email protected]>
+- 0.2 release. Development version.
+- Now includes libpythonize (needed for Kcontrol modules)
+- Support for building and install kcontrol modules.
+
+* Saturday May 14th 2005 Simon Edwards <[email protected]>
+- 0.1 release. Development version
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..b94cd85
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,43 @@
+Basic Installation
+==================
+These are generic installation instructions.
+
+This software uses the Python language's distutils system for installation.
+A detailed guide for users and system administrators to using distutils to
+install software can be found here:
+
+ http://docs.python.org/inst/inst.html
+
+The simplest way to install this software is to run the following command as
+the root user:
+
+ python setup.py install
+
+The setup.py script will automatically detect the directories to use for
+documentation, binaries and other software files.
+
+
+Uninstallation
+==============
+During installation setup.py creates list of files and directories that
+were installed in a file called install_log.txt.
+
+ python setup.py uninstall
+
+
+Installing into an alternate root
+=================================
+For packaging purposes it is often very useful to be able to install all files
+relative not to the usual root directory (/) but into an alternative
+directory.
+
+ python setup.py install --root=/tmp/alternativeroot/
+
+
+Operation Controls
+==================
+--verbose
+ Print more information about what setup.py is doing.
+
+--help
+ Print a summary of the options to setup.py, and exit.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..419cead
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,6 @@
+recursive-include doc *.docbook *.png
+graft app_templates
+prune app_templates/.svn
+include AUTHORS ChangeLog COPYING INSTALL MANIFEST.in NEWS README TODO
+global-include *.desktop *.py *.cpp *.h
+global-exclude *~ .svn *.pyc
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/NEWS
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..52d05d4
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,10 @@
+Metadata-Version: 1.0
+Name: pykdeextensions
+Version: 0.4.0
+Summary: UNKNOWN
+Home-page: http://www.simonzone.com/software/pykdeextensions/
+Author: Simon Edwards
+Author-email: [email protected]
+License: LGPL
+Description: UNKNOWN
+Platform: UNKNOWN
diff --git a/README b/README
new file mode 100644
index 0000000..3e074d2
--- /dev/null
+++ b/README
@@ -0,0 +1,14 @@
+PyKDE Extensions
+================
+PyKDE Extensions is a collection of software and Python packages to support
+the creation and installation of KDE applications.
+
+Read the INSTALL file for more information about how to install this.
+
+This software is on the web at:
+
+http://www.simonzone.com/software/pykdeextensions/
+
+cheers,
+
+Simon Edwards <[email protected]>
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TODO
diff --git a/app_templates/kcontrol_module/AUTHORS b/app_templates/kcontrol_module/AUTHORS
new file mode 100644
index 0000000..0463c0d
--- /dev/null
+++ b/app_templates/kcontrol_module/AUTHORS
@@ -0,0 +1 @@
+$AUTHOR$ <$EMAIL$>
diff --git a/app_templates/kcontrol_module/COPYING b/app_templates/kcontrol_module/COPYING
new file mode 100644
index 0000000..c13faf0
--- /dev/null
+++ b/app_templates/kcontrol_module/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/app_templates/kcontrol_module/ChangeLog b/app_templates/kcontrol_module/ChangeLog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kcontrol_module/ChangeLog
diff --git a/app_templates/kcontrol_module/INSTALL b/app_templates/kcontrol_module/INSTALL
new file mode 100644
index 0000000..b94cd85
--- /dev/null
+++ b/app_templates/kcontrol_module/INSTALL
@@ -0,0 +1,43 @@
+Basic Installation
+==================
+These are generic installation instructions.
+
+This software uses the Python language's distutils system for installation.
+A detailed guide for users and system administrators to using distutils to
+install software can be found here:
+
+ http://docs.python.org/inst/inst.html
+
+The simplest way to install this software is to run the following command as
+the root user:
+
+ python setup.py install
+
+The setup.py script will automatically detect the directories to use for
+documentation, binaries and other software files.
+
+
+Uninstallation
+==============
+During installation setup.py creates list of files and directories that
+were installed in a file called install_log.txt.
+
+ python setup.py uninstall
+
+
+Installing into an alternate root
+=================================
+For packaging purposes it is often very useful to be able to install all files
+relative not to the usual root directory (/) but into an alternative
+directory.
+
+ python setup.py install --root=/tmp/alternativeroot/
+
+
+Operation Controls
+==================
+--verbose
+ Print more information about what setup.py is doing.
+
+--help
+ Print a summary of the options to setup.py, and exit.
diff --git a/app_templates/kcontrol_module/MANIFEST.in b/app_templates/kcontrol_module/MANIFEST.in
new file mode 100644
index 0000000..c2dde3f
--- /dev/null
+++ b/app_templates/kcontrol_module/MANIFEST.in
@@ -0,0 +1,6 @@
+recursive-include doc *.docbook *.png
+recursive-include po *.po *.pot
+include AUTHORS ChangeLog COPYING INSTALL MANIFEST.in NEWS README TODO
+global-include *.desktop *.py *.ui *.png *.lsm
+global-exclude *~ .svn
+global-exclude *~ .cvs
diff --git a/app_templates/kcontrol_module/NEWS b/app_templates/kcontrol_module/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kcontrol_module/NEWS
diff --git a/app_templates/kcontrol_module/README b/app_templates/kcontrol_module/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kcontrol_module/README
diff --git a/app_templates/kcontrol_module/TODO b/app_templates/kcontrol_module/TODO
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kcontrol_module/TODO
diff --git a/app_templates/kcontrol_module/doc/en/index.docbook b/app_templates/kcontrol_module/doc/en/index.docbook
new file mode 100644
index 0000000..325987f
--- /dev/null
+++ b/app_templates/kcontrol_module/doc/en/index.docbook
@@ -0,0 +1,555 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+ <!ENTITY appname "<application>MyApplicaition 0.1</application>">
+ <!ENTITY kappname "&appname;"><!-- Do *not* replace kappname-->
+ <!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc -->
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE"><!-- change language only here -->
+
+
+ <!-- Do not define any other entities; instead, use the entities
+ from kde-genent.entities and $LANG/user.entities. -->
+]>
+<!-- kdoctemplate v0.8 October 1 1999
+ Minor update to "Credits and Licenses" section on August 24, 2000
+ Removed "Revision history" section on 22 January 2001
+ Changed to Installation/Help menu entities 18 October 2001
+ Other minor cleanup and changes 18 October 2001 -->
+
+
+<!--
+This template was designed by: David Rugge [email protected]
+with lots of help from: Eric Bischoff [email protected]
+and Frederik Fouvry [email protected]
+of the KDE DocBook team.
+
+You may freely use this template for writing any sort of KDE documentation.
+If you have any changes or improvements, please let us know.
+
+Remember:
+- in XML, the case of the <tags> and attributes is relevant ;
+- also, quote all attributes.
+
+Please don't forget to remove all these comments in your final documentation,
+thanks ;-).
+-->
+
+<!-- ................................................................ -->
+
+<!-- The language must NOT be changed here. -->
+
+<book lang="&language;">
+
+<!-- This header contains all of the meta-information for the document such
+as Authors, publish date, the abstract, and Keywords -->
+
+<bookinfo>
+<title>The &appname; Handbook</title>
+
+<authorgroup>
+<author>
+<firstname></firstname>
+<othername></othername>
+<surname>%{AUTHOR}</surname>
+<affiliation>
+<address><email>%{EMAIL}</email></address>
+</affiliation>
+</author>
+</authorgroup>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+<copyright>
+<year>1999</year>
+<year>%{YEAR}</year>
+<holder>%{AUTHOR}</holder>
+</copyright>
+<!-- Translators: put here the copyright notice of the translation -->
+<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
+ and in the FDL itself on how to use it. -->
+<legalnotice>&FDLNotice;</legalnotice>
+
+<!-- Date and version information of the documentation
+Don't forget to include this last date and this last revision number, we
+need them for translation coordination !
+Please respect the format of the date (YYYY-MM-DD) and of the version
+(V.MM.LL), it could be used by automation scripts.
+Do NOT change these in the translation. -->
+
+<date>2001-10-18</date>
+<releaseinfo>%{VERSION}</releaseinfo>
+
+<!-- Abstract about this handbook -->
+
+<abstract>
+<para>
+&appname; is an application specially designed to do nothing you would
+ever want.
+</para>
+</abstract>
+
+<!-- This is a set of Keywords for indexing by search engines.
+Please at least include KDE, the KDE package it is in, the name
+ of your application, and a few relevant keywords. -->
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>%{APPNAME}</keyword>
+<keyword>nothing</keyword>
+<keyword>nothing else</keyword>
+</keywordset>
+
+</bookinfo>
+
+<!-- The contents of the documentation begin here. Label
+each chapter so with the id attribute. This is necessary for two reasons: it
+allows you to easily reference the chapter from other chapters of your
+document, and if there is no ID, the name of the generated HTML files will vary
+from time to time making it hard to manage for maintainers and for the CVS
+system. Any chapter labelled (OPTIONAL) may be left out at the author's
+discretion. Other chapters should not be left out in order to maintain a
+consistent documentation style across all KDE apps. -->
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+<!-- The introduction chapter contains a brief introduction for the
+application that explains what it does and where to report
+problems. Basically a long version of the abstract. Don't include a
+revision history. (see installation appendix comment) -->
+
+<para>
+&appname; is a program that lets you do absolutely nothing. Please report
+any problems or feature requests to the &kde; mailing lists.
+</para>
+</chapter>
+
+<chapter id="using-appname">
+<title>Using &appname;</title>
+
+<!-- This chapter should tell the user how to use your app. You should use as
+many sections (Chapter, Sect1, Sect3, etc...) as is necessary to fully document
+your application. -->
+
+<para>
+
+<!-- Note that all graphics should be in .png format. Use no gifs because of
+patent issues. -->
+
+<screenshot>
+<screeninfo>Here's a screenshot of &appname;</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot.png" format="PNG"/>
+ </imageobject>
+ <imageobject>
+ <imagedata fileref="screenshot.eps" format="EPS"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+
+<sect1 id="appname-features">
+<title>More &appname; features</title>
+
+<para>It slices! It dices! and it comes with a free toaster!</para>
+<para>
+The Squiggle Tool <guiicon><inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="squiggle.png" format="PNG"/>
+ </imageobject>
+ <imageobject>
+ <imagedata fileref="squiggle.eps" format="EPS"/>
+ </imageobject>
+ <textobject>
+ <phrase>Squiggle</phrase>
+ </textobject>
+</inlinemediaobject></guiicon> is used to draw squiggly lines all over
+the &appname; main window. It's not a bug, it's a feature!
+</para>
+
+</sect1>
+</chapter>
+
+<chapter id="commands">
+<title>Command Reference</title>
+
+<!-- (OPTIONAL, BUT RECOMMENDED) This chapter should list all of the
+application windows and their menubar and toolbar commands for easy reference.
+Also include any keys that have a special function but have no equivalent in the
+menus or toolbars. This may not be necessary for small apps or apps with no tool
+or menu bars. -->
+
+<sect1 id="appname-mainwindow">
+<title>The main &appname; window</title>
+
+<sect2>
+<title>The File Menu</title>
+<para>
+<variablelist>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>N</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>New</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Creates a new document</action></para></listitem>
+</varlistentry>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>S</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Save</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Saves the document</action></para></listitem>
+</varlistentry>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>Q</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Quit</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Quits</action> &appname;</para></listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+</sect2>
+
+<sect2>
+<title>The <guimenu>Help</guimenu> Menu</title>
+
+<!-- Assuming you have a standard help menu (help, what's this, about -->
+<!-- &appname;, about KDE) then the documentation is already written. -->
+<!-- The following entity is valid anywhere that a variablelist is -->
+<!-- valid. -->
+
+&help.menu.documentation;
+
+</sect2>
+
+</sect1>
+</chapter>
+
+<chapter id="developers">
+<title>Developer's Guide to &appname;</title>
+
+<!-- (OPTIONAL) A Programming/Scripting reference chapter should be
+used for apps that use plugins or that provide their own scripting hooks
+and/or development libraries. -->
+
+<para>
+Programming &appname; plugins is a joy to behold. Just read through the next
+66 pages of API's to learn how!
+</para>
+
+<!-- Use refentries to describe APIs. Refentries are fairly complicated and you
+should consult the docbook reference for further details. The example below was
+taken from that reference and shortened a bit for readability. -->
+
+<refentry id="re-1007-unmanagechildren-1">
+<refmeta>
+<refentrytitle>XtUnmanageChildren</refentrytitle>
+<refmiscinfo>Xt - Geometry Management</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>XtUnmanageChildren
+</refname>
+<refpurpose>remove a list of children from a parent widget's managed
+list.
+<indexterm id="ix-1007-unmanagechildren-1"><primary>widgets</primary><secondary>removing</secondary></indexterm>
+<indexterm id="ix-1007-unmanagechildren-2"><primary>XtUnmanageChildren</primary></indexterm>
+</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv>
+<refsynopsisdivinfo>
+<date>4 March 1996</date>
+</refsynopsisdivinfo>
+<synopsis>
+void XtUnmanageChildren(<replaceable class="parameter">children</replaceable>, <replaceable class="parameter">num_children</replaceable>)
+ WidgetList <replaceable class="parameter">children</replaceable>;
+ Cardinal <replaceable class="parameter">num_children</replaceable>;
+</synopsis>
+
+<refsect2 id="r2-1007-unmanagechildren-1">
+<title>Inputs</title>
+<variablelist>
+<varlistentry>
+<term><replaceable class="parameter">children</replaceable>
+</term>
+<listitem>
+<para>Specifies an array of child widgets. Each child must be of
+class RectObj or any subclass thereof.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><replaceable class="parameter">num_children</replaceable>
+</term>
+<listitem>
+<para>Specifies the number of elements in <replaceable class="parameter">children</replaceable>.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refsect2></refsynopsisdiv>
+
+<refsect1 id="r1-1007-unmanagechildren-1">
+<title>Description
+</title>
+<para><function>XtUnmanageChildren()</function> unmaps the specified widgets
+and removes them from their parent's geometry management.
+The widgets will disappear from the screen, and (depending
+on its parent) may no longer have screen space allocated for
+them.
+</para>
+<para>Each of the widgets in the <replaceable class="parameter">children</replaceable> array must have
+the same parent.
+</para>
+<para>See the &ldquo;Algorithm&rdquo; section below for full details of the
+widget unmanagement procedure.
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-2">
+<title>Usage</title>
+<para>Unmanaging widgets is the usual method for temporarily
+making them invisible. They can be re-managed with
+<function>XtManageChildren()</function>.
+</para>
+<para>You can unmap a widget, but leave it under geometry
+management by calling <function>XtUnmapWidget()</function>. You can
+destroy a widget's window without destroying the widget by
+calling <function>XtUnrealizeWidget()</function>. You can destroy a
+widget completely with <function>XtDestroyWidget()</function>.
+</para>
+<para>If you are only going to unmanage a single widget, it is
+more convenient to call <function>XtUnmanageChild()</function>. It is
+often more convenient to call <function>XtUnmanageChild()</function>
+several times than it is to declare and initialize an array
+of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
+<function>XtUnmanageChildren()</function> is more efficient, however,
+because it only calls the parent's <function>change_managed()</function>
+method once.
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-3">
+<title>Algorithm
+</title>
+<para><function>XtUnmanageChildren()</function> performs the following:
+</para>
+<variablelist>
+<varlistentry>
+<term>-
+</term>
+<listitem>
+<para>Ignores the child if it already is unmanaged or is being
+destroyed.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>-
+</term>
+<listitem>
+<para>Otherwise, if the child is realized, it makes it nonvisible
+by unmapping it.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-4">
+<title>Structures</title>
+<para>The <type>WidgetList</type> type is simply an array of widgets:
+</para>
+<screen id="sc-1007-unmanagechildren-1">typedef Widget *WidgetList;
+</screen>
+</refsect1>
+</refentry>
+
+</chapter>
+
+<chapter id="faq">
+<title>Questions and Answers</title>
+
+<!-- (OPTIONAL but recommended) This chapter should include all of the silly
+(and not-so-silly) newbie questions that fill up your mailbox. This chapter
+should be reserved for BRIEF questions and answers! If one question uses more
+than a page or so then it should probably be part of the
+"Using this Application" chapter instead. You should use links to
+cross-reference questions to the parts of your documentation that answer them.
+This is also a great place to provide pointers to other FAQ's if your users
+must do some complicated configuration on other programs in order for your
+application work. -->
+
+&reporting.bugs;
+&updating.documentation;
+
+<qandaset id="faqlist">
+<qandaentry>
+<question>
+<para>My Mouse doesn't work. How do I quit &appname;?</para>
+</question>
+<answer>
+<para>You silly goose! Check out the <link linkend="commands">Commands
+Section</link> for the answer.</para>
+</answer>
+</qandaentry>
+<qandaentry>
+<question>
+<para>Why can't I twiddle my documents?</para>
+</question>
+<answer>
+<para>You can only twiddle your documents if you have the foobar.lib
+installed.</para>
+</answer>
+</qandaentry>
+</qandaset>
+</chapter>
+
+<chapter id="credits">
+
+<!-- Include credits for the programmers, documentation writers, and
+contributors here. The license for your software should then be included below
+the credits with a reference to the appropriate license file included in the KDE
+distribution. -->
+
+<title>Credits and License</title>
+
+<para>
+&appname;
+</para>
+<para>
+Program copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
+</para>
+<para>
+Contributors:
+<itemizedlist>
+<listitem><para>Konqui the KDE Dragon <email>[email protected]</email></para>
+</listitem>
+<listitem><para>Tux the Linux Penguin <email>[email protected]</email></para>
+</listitem>
+</itemizedlist>
+</para>
+
+<para>
+Documentation copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underFDL; <!-- FDL: do not remove -->
+
+<!-- Determine which license your application is licensed under,
+ and delete all the remaining licenses below:
+
+ (NOTE: All documentation are licensed under the FDL,
+ regardless of what license the application uses) -->
+
+&underGPL; <!-- GPL License -->
+&underBSDLicense; <!-- BSD License -->
+&underArtisticLicense; <!-- BSD Artistic License -->
+&underX11License; <!-- X11 License -->
+
+</chapter>
+
+<appendix id="installation">
+<title>Installation</title>
+
+<sect1 id="getting-appname">
+<title>How to obtain &appname;</title>
+
+<!-- This first entity contains boiler plate for applications that are
+part of KDE CVS. You should remove it if you are releasing your
+application -->
+
+&install.intro.documentation;
+
+</sect1>
+
+<sect1 id="requirements">
+<title>Requirements</title>
+
+<!--
+List any special requirements for your application here. This should include:
+.Libraries or other software that is not included in kdesupport,
+kdelibs, or kdebase.
+.Hardware requirements like amount of RAM, disk space, graphics card
+capabilities, screen resolution, special expansion cards, etc.
+.Operating systems the app will run on. If your app is designed only for a
+specific OS, (you wrote a graphical LILO configurator for example) put this
+information here.
+-->
+
+<para>
+In order to successfully use &appname;, you need &kde; 1.1. Foobar.lib is
+required in order to support the advanced &appname; features. &appname; uses
+about 5 megs of memory to run, but this may vary depending on your
+platform and configuration.
+</para>
+
+<para>
+All required libraries as well as &appname; itself can be found
+on <ulink url="ftp://ftp.appname.org">The &appname; home page</ulink>.
+</para>
+
+<!-- For a list of updates, you may refer to the application web site
+or the ChangeLog file, or ... -->
+<para>
+You can find a list of changes at <ulink
+url="http://apps.kde.org/appname">http://apps.kde.org/appname</ulink>.
+</para>
+</sect1>
+
+<sect1 id="compilation">
+<title>Compilation and Installation</title>
+
+<!-- This entity contains the boilerplate text for standard -->
+<!-- compilation instructions. If your application requires any -->
+<!-- special handling, remove it, and replace with your own text. -->
+
+&install.compile.documentation;
+
+</sect1>
+
+<sect1 id="configuration">
+<title>Configuration</title>
+
+<para>Don't forget to tell your system to start the <filename>dtd</filename>
+dicer-toaster daemon first, or &appname; won't work !</para>
+
+</sect1>
+
+</appendix>
+
+&documentation.index;
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+vim:tabstop=2:shiftwidth=2:expandtab
+-->
+
diff --git a/app_templates/kcontrol_module/po/README b/app_templates/kcontrol_module/po/README
new file mode 100644
index 0000000..0e18f16
--- /dev/null
+++ b/app_templates/kcontrol_module/po/README
@@ -0,0 +1 @@
+.pot and .pot translation files should be placed here.
diff --git a/app_templates/kcontrol_module/setup.py b/app_templates/kcontrol_module/setup.py
new file mode 100755
index 0000000..6741051
--- /dev/null
+++ b/app_templates/kcontrol_module/setup.py
@@ -0,0 +1,32 @@
+#!/usr/bin/python
+###########################################################################
+# setup - description #
+# ------------------------------ #
+# begin : Fri Jun 27 2005 #
+# copyright : (C) 2005 by AUTHOR #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+###########################################################################
+
+import kdedistutils
+
+kdedistutils.setup(name="kcontrol_module",
+ version="0.1.0",
+ author="AUTHOR",
+ author_email="[email protected]",
+ url="http://www.TESTAPP.com/",
+ min_kde_version = "3.0.0",
+ min_qt_version = "3.0.0",
+ license = "GPL",
+ application_data = ['src/kcontrol_module.py','src/KcontrolModuleWidgetUI.ui'],
+ executable_links = [('kcontrol_module','kcontrol_module.py')],
+ docbooks = [ ('doc/en','en') ],
+ i18n = ('po',['src']),
+ kcontrol_modules = [ ('src/kcontrol_module.desktop','kcontrol_module.py')] )
diff --git a/app_templates/kcontrol_module/src/KcontrolModuleWidgetUI.ui b/app_templates/kcontrol_module/src/KcontrolModuleWidgetUI.ui
new file mode 100644
index 0000000..4ff94d7
--- /dev/null
+++ b/app_templates/kcontrol_module/src/KcontrolModuleWidgetUI.ui
@@ -0,0 +1,33 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KcontrolModuleWidgetUI</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KcontrolModuleWidgetUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Form1</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Congratulations, Kcontrol_module template application is working!</string>
+ </property>
+ </widget>
+ </hbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/app_templates/kcontrol_module/src/hi16-app-kcontrol_module.png b/app_templates/kcontrol_module/src/hi16-app-kcontrol_module.png
new file mode 100644
index 0000000..40fe05e
--- /dev/null
+++ b/app_templates/kcontrol_module/src/hi16-app-kcontrol_module.png
@@ -0,0 +1,8 @@
+�PNG
+
+
+IHDR
+���5� M�Z��fθ92@�
+��2w�l�A;�v�c)�\)��/l F�\��ϓ���~��S���X�Ŧ�=t�j�76��{rumu��_��% ��}�f�b{�Z��RdY�7�C2�TWՓ�Ӳ��O>�f�X�G�ȵ��,F�&/#�x<��&P��%]E��ܖC�f U��S����
+"�l+�*���J�ǰ�M��Jde���9Hz�]�qT�P�B�I��
+��}���Q����� �bR��������� �]�nv��bf,�û����:�L�d�4��PuC����7��AK �\��^�ϟ=.~�����|َ2�w��|x��w��N�Vd/RK��6���+����ɤ�����Ħ�7fmc�5� hr�96�M�D#x�=Ia�ނOHxc�7=# �U�D��oV�i
diff --git a/app_templates/kcontrol_module/src/hi32-app-kcontrol_module.png b/app_templates/kcontrol_module/src/hi32-app-kcontrol_module.png
new file mode 100644
index 0000000..8a6093e
--- /dev/null
+++ b/app_templates/kcontrol_module/src/hi32-app-kcontrol_module.png
@@ -0,0 +1,26 @@
+�PNG
+
+
+IHDR
+:IDATx���{�\�}�?w�y�;;���}`�����k̲~&�q�R�- H��Gpk
+PPJ�&(
+�J��EQ���4Iq QDHC~D6��Bص�׮ٵٝ��̝�;�;��?f�1� i{���+]������}��k��_åòB��e,ˢ3��֖6�Tض�3'�``��Ie�m=����������}�j���^�w��O<w�Y��kV_�˺�x�,��M��?�.���x!��c�Č�l�8����v��oZ�������;ퟙ<��r�V���͌O���>���\O����z��U#fh�a7��Y��I5�r엇�������@�[
+>�u;�j����o���Qk╳�?���ڕkq�
+��-��t/�E(�tB ��06 �se_���������?���u����7���сQ3�r)%�H+B
+��֎6���CHW��RШ7ؾk33��M���_<dzGf�X�bq���@�YӷƬ\o֭Z��8�B!</MP X�i-�z�J�����A(AH�HG�D\�fcTJe��kV �a� l��Yk�/�r� �
+�:.��b��X,�[w�s� � �yh�)
+�t�������a#� �H㶸��>g�~�So
+�/�Y58ȗ���$�i������TJjA
+�5���0�>
+n���t�Mt?���gj|�#O=�]���d۶ȕr(���߱��z'N���̐��)�E
+�<A�BP�0��[,��f���T�R �Va#� �����_y����3z�&˛K��gAP�T�Bcp��n�o�&��+���N�If�S9�~*K�˒�ҌM�Q(�MͲ�����S�FHA(d��Dj�m�B`�aﭷ������fh��z���
+c ӳ
+PJ��8^*K.�����
+�OP �>���(�--H��, �$�R�j9 ���'�$�����z��1�C/���;8�� >�|p�-�����Z��f�RY�x?�%7�!���%���c+EĪѡ�m�mb��#I��3x� A�B��3vn�F��4����qv���S�����u�B��BI�T
+G)�^s�~*G&�b~.N46ǩ3�H����H���_lϻ%�:ґ�m-dbi\��
+YT�R~
+�3�`��ʮ
+��x�S�(W˖eY��,8��a{�Qn���f�*�0%�����I��]
+�U�ܲ!�Eg�(6-���:.JJ�T�EZ ��^:E$�r��b�j�q�K*�"��͖L\
+i#�h��h-�ƖM[���rή�Gk� e���TN�r�b�H6�ʼn��/���? h�e3�����Z���B��T�l��*J6�])���X ?��C{G�ZG�Q���L�T!�ʒMd�DS�/Y��C�^�]M[?~�������/�E,��T(�B�\�o���ղ,����g}�<�| �h0��[,_�� H'<�ٸG*��5W�fI������ZX�y������m��/��%�u�MTk5�X�a�Ek��� �d��p���O������e�+(�$gb���\8���/�
+���l!0��Z�W'^]�,���B�wؼz�F��%����9-��+ڮ��h�Χ�,�����b�����l�\l4f7
diff --git a/app_templates/kcontrol_module/src/kcontrol_module.desktop b/app_templates/kcontrol_module/src/kcontrol_module.desktop
new file mode 100644
index 0000000..f0381c5
--- /dev/null
+++ b/app_templates/kcontrol_module/src/kcontrol_module.desktop
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Name=Kcontrol module
+Name[en]=Kcontrol module
+name[en_GB]=Kcontrol module
+Comment=Kcontrol module template
+Comment[en]=Kcontrol module template
+Comment[en_GB]=Kcontrol module template
+Icon=daemons.png
+X-KDE-ModuleType=Library
+X-KDE-Library=kcontrol_module
+X-KDE-FactoryName=kcontrol_module
+X-KDE-RootOnly=false
+Type=Application
+Exec=kcmshell kcontrol_module
+Categories=QT;KDE;X-KDE-settings-system;
diff --git a/app_templates/kcontrol_module/src/kcontrol_module.lsm b/app_templates/kcontrol_module/src/kcontrol_module.lsm
new file mode 100644
index 0000000..43d0d5f
--- /dev/null
+++ b/app_templates/kcontrol_module/src/kcontrol_module.lsm
@@ -0,0 +1,16 @@
+Begin3
+Title: $APPNAME$ -- Some description
+Version: $VERSION$
+Entered-date:
+Description:
+Keywords: KDE Qt
+Author: $AUTHOR$ <$EMAIL$>
+Maintained-by: $AUTHOR$ <$EMAIL$>
+Home-page:
+Alternate-site:
+Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
+ xxxxxx $APPNAMELC$-$VERSION$.tar.gz
+ xxx $APPNAMELC$-$VERSION$.lsm
+Platform: Linux. Needs KDE
+Copying-policy: $LICENSE$
+End
diff --git a/app_templates/kcontrol_module/src/kcontrol_module.py b/app_templates/kcontrol_module/src/kcontrol_module.py
new file mode 100755
index 0000000..b435287
--- /dev/null
+++ b/app_templates/kcontrol_module/src/kcontrol_module.py
@@ -0,0 +1,166 @@
+#!/usr/bin/python
+###########################################################################
+# kcontrol_module - description #
+# ------------------------------ #
+# begin : Mon May 2 2005 #
+# copyright : (C) 2005 by AUTHOR #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+###########################################################################
+
+import sys
+from qt import *
+from kdecore import *
+from kdeui import *
+
+import kdedesigner
+from KcontrolModuleWidgetUI import *
+
+description = "A Kcontrol module"
+version = "0.1"
+
+############################################################################
+def AboutData():
+ global version,description
+
+ about_data = KAboutData("kcontrol_module", "kcontrol_module", version, \
+ description, KAboutData.License_GPL, "(C) 2005 AUTHOR", None, None,\
+ about_data.addAuthor("AUTHOR", None, "[email protected]")
+ return about_data
+
+############################################################################
+class KcontrolModuleWidget(KcontrolModuleWidgetUI):
+ def __init__(self,parent=None):
+ KcontrolModuleWidgetUI.__init__(self,parent,"Kcontrol module")
+ # Add other methods, slots and signals here.
+
+############################################################################
+# The base class that we use depends on whether this is running inside
+# kcontrol or as a standalone application.
+# Are we running as a separate standalone application or in KControl?
+standalone = __name__=='__main__'
+
+if standalone:
+ programbase = KDialogBase
+else:
+ programbase = KCModule
+
+class KcontrolModuleApp(programbase):
+ ########################################################################
+ def __init__(self,parent=None,name=None):
+ global standalone
+ if standalone:
+ KDialogBase.__init__(self,KJanusWidget.Plain,"Kcontrol module",KDialogBase.User1|KDialogBase.Close, KDialogBase.Close)
+ self.setButtonText(KDialogBase.User1,"About")
+ else:
+ KCModule.__init__(self,parent,name)
+ # Create a configuration object.
+ self.config = KConfig("kcontrol_module")
+ self.setButtons(0)
+ self.aboutdata = AboutData()
+
+ # The appdir needs to be explicitly otherwise we won't be able to
+ # load our icons and images.
+ KGlobal.iconLoader().addAppDir("kcontrol_module")
+
+ if standalone:
+ toplayout = QVBoxLayout( self.plainPage(), 0, KDialog.spacingHint() )
+ mainwidget = KcontrolModuleWidget(self.plainPage())
+ else:
+ toplayout = QVBoxLayout( self, 0, KDialog.spacingHint() )
+ mainwidget = KcontrolModuleWidget(self)
+
+ toplayout.addWidget(mainwidget)
+
+ self.aboutus = KAboutApplication(self)
+
+ ########################################################################
+ def __del__(self):
+ pass
+
+ ########################################################################
+ # KDialogBase method
+ def exec_loop(self):
+ global programbase
+
+ # Load configuration here
+ self.__loadOptions()
+
+ programbase.exec_loop(self)
+
+ # Save configuration here
+ self.__saveOptions()
+
+ ########################################################################
+ # KDialogBase method
+ def slotUser1(self):
+ self.aboutus.show()
+
+ ########################################################################
+ def slotCloseButton(self):
+ self.close()
+
+ ########################################################################
+ def __loadOptions(self):
+ global kapp
+ config = kapp.config()
+ config.setGroup("General")
+ size = config.readSizeEntry("Geometry")
+ if size.isEmpty()==False:
+ self.resize(size)
+
+ #######################################################################
+ def __saveOptions(self):
+ global kapp
+ config = kapp.config()
+ config.setGroup("General")
+ config.writeEntry("Geometry", self.size())
+ config.sync()
+
+ #######################################################################
+ # KControl virtual void methods
+ def load(self):
+ pass
+ def save(self):
+ pass
+ def defaults(self):
+ pass
+ def sysdefaults(self):
+ pass
+
+ def aboutData(self):
+ # Return the KAboutData object which we created during initialisation.
+ return self.aboutdata
+
+ def buttons(self):
+ # Only supply a Help button. Other choices are Default and Apply.
+ return KCModule.Help
+
+############################################################################
+# This is the entry point used when running this module outside of kcontrol.
+def main():
+ global kapp
+ about_data = AboutData()
+ KCmdLineArgs.init(sys.argv,about_data)
+ kapp = KApplication()
+ myapp = KcontrolModuleApp()
+ myapp.exec_loop()
+
+############################################################################
+# Factory function for KControl
+def create_kcontrol_module(parent,name):
+ global kapp
+ kapp = KApplication.kApplication()
+ return KcontrolModuleApp(parent, name)
+
+############################################################################
+if standalone:
+ main()
diff --git a/app_templates/kdeapp/AUTHORS b/app_templates/kdeapp/AUTHORS
new file mode 100644
index 0000000..0463c0d
--- /dev/null
+++ b/app_templates/kdeapp/AUTHORS
@@ -0,0 +1 @@
+$AUTHOR$ <$EMAIL$>
diff --git a/app_templates/kdeapp/COPYING b/app_templates/kdeapp/COPYING
new file mode 100644
index 0000000..c13faf0
--- /dev/null
+++ b/app_templates/kdeapp/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/app_templates/kdeapp/ChangeLog b/app_templates/kdeapp/ChangeLog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kdeapp/ChangeLog
diff --git a/app_templates/kdeapp/INSTALL b/app_templates/kdeapp/INSTALL
new file mode 100644
index 0000000..b94cd85
--- /dev/null
+++ b/app_templates/kdeapp/INSTALL
@@ -0,0 +1,43 @@
+Basic Installation
+==================
+These are generic installation instructions.
+
+This software uses the Python language's distutils system for installation.
+A detailed guide for users and system administrators to using distutils to
+install software can be found here:
+
+ http://docs.python.org/inst/inst.html
+
+The simplest way to install this software is to run the following command as
+the root user:
+
+ python setup.py install
+
+The setup.py script will automatically detect the directories to use for
+documentation, binaries and other software files.
+
+
+Uninstallation
+==============
+During installation setup.py creates list of files and directories that
+were installed in a file called install_log.txt.
+
+ python setup.py uninstall
+
+
+Installing into an alternate root
+=================================
+For packaging purposes it is often very useful to be able to install all files
+relative not to the usual root directory (/) but into an alternative
+directory.
+
+ python setup.py install --root=/tmp/alternativeroot/
+
+
+Operation Controls
+==================
+--verbose
+ Print more information about what setup.py is doing.
+
+--help
+ Print a summary of the options to setup.py, and exit.
diff --git a/app_templates/kdeapp/MANIFEST.in b/app_templates/kdeapp/MANIFEST.in
new file mode 100644
index 0000000..c2dde3f
--- /dev/null
+++ b/app_templates/kdeapp/MANIFEST.in
@@ -0,0 +1,6 @@
+recursive-include doc *.docbook *.png
+recursive-include po *.po *.pot
+include AUTHORS ChangeLog COPYING INSTALL MANIFEST.in NEWS README TODO
+global-include *.desktop *.py *.ui *.png *.lsm
+global-exclude *~ .svn
+global-exclude *~ .cvs
diff --git a/app_templates/kdeapp/NEWS b/app_templates/kdeapp/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kdeapp/NEWS
diff --git a/app_templates/kdeapp/README b/app_templates/kdeapp/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kdeapp/README
diff --git a/app_templates/kdeapp/TODO b/app_templates/kdeapp/TODO
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kdeapp/TODO
diff --git a/app_templates/kdeapp/doc/en/index.docbook b/app_templates/kdeapp/doc/en/index.docbook
new file mode 100644
index 0000000..325987f
--- /dev/null
+++ b/app_templates/kdeapp/doc/en/index.docbook
@@ -0,0 +1,555 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+ <!ENTITY appname "<application>MyApplicaition 0.1</application>">
+ <!ENTITY kappname "&appname;"><!-- Do *not* replace kappname-->
+ <!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc -->
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE"><!-- change language only here -->
+
+
+ <!-- Do not define any other entities; instead, use the entities
+ from kde-genent.entities and $LANG/user.entities. -->
+]>
+<!-- kdoctemplate v0.8 October 1 1999
+ Minor update to "Credits and Licenses" section on August 24, 2000
+ Removed "Revision history" section on 22 January 2001
+ Changed to Installation/Help menu entities 18 October 2001
+ Other minor cleanup and changes 18 October 2001 -->
+
+
+<!--
+This template was designed by: David Rugge [email protected]
+with lots of help from: Eric Bischoff [email protected]
+and Frederik Fouvry [email protected]
+of the KDE DocBook team.
+
+You may freely use this template for writing any sort of KDE documentation.
+If you have any changes or improvements, please let us know.
+
+Remember:
+- in XML, the case of the <tags> and attributes is relevant ;
+- also, quote all attributes.
+
+Please don't forget to remove all these comments in your final documentation,
+thanks ;-).
+-->
+
+<!-- ................................................................ -->
+
+<!-- The language must NOT be changed here. -->
+
+<book lang="&language;">
+
+<!-- This header contains all of the meta-information for the document such
+as Authors, publish date, the abstract, and Keywords -->
+
+<bookinfo>
+<title>The &appname; Handbook</title>
+
+<authorgroup>
+<author>
+<firstname></firstname>
+<othername></othername>
+<surname>%{AUTHOR}</surname>
+<affiliation>
+<address><email>%{EMAIL}</email></address>
+</affiliation>
+</author>
+</authorgroup>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+<copyright>
+<year>1999</year>
+<year>%{YEAR}</year>
+<holder>%{AUTHOR}</holder>
+</copyright>
+<!-- Translators: put here the copyright notice of the translation -->
+<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
+ and in the FDL itself on how to use it. -->
+<legalnotice>&FDLNotice;</legalnotice>
+
+<!-- Date and version information of the documentation
+Don't forget to include this last date and this last revision number, we
+need them for translation coordination !
+Please respect the format of the date (YYYY-MM-DD) and of the version
+(V.MM.LL), it could be used by automation scripts.
+Do NOT change these in the translation. -->
+
+<date>2001-10-18</date>
+<releaseinfo>%{VERSION}</releaseinfo>
+
+<!-- Abstract about this handbook -->
+
+<abstract>
+<para>
+&appname; is an application specially designed to do nothing you would
+ever want.
+</para>
+</abstract>
+
+<!-- This is a set of Keywords for indexing by search engines.
+Please at least include KDE, the KDE package it is in, the name
+ of your application, and a few relevant keywords. -->
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>%{APPNAME}</keyword>
+<keyword>nothing</keyword>
+<keyword>nothing else</keyword>
+</keywordset>
+
+</bookinfo>
+
+<!-- The contents of the documentation begin here. Label
+each chapter so with the id attribute. This is necessary for two reasons: it
+allows you to easily reference the chapter from other chapters of your
+document, and if there is no ID, the name of the generated HTML files will vary
+from time to time making it hard to manage for maintainers and for the CVS
+system. Any chapter labelled (OPTIONAL) may be left out at the author's
+discretion. Other chapters should not be left out in order to maintain a
+consistent documentation style across all KDE apps. -->
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+<!-- The introduction chapter contains a brief introduction for the
+application that explains what it does and where to report
+problems. Basically a long version of the abstract. Don't include a
+revision history. (see installation appendix comment) -->
+
+<para>
+&appname; is a program that lets you do absolutely nothing. Please report
+any problems or feature requests to the &kde; mailing lists.
+</para>
+</chapter>
+
+<chapter id="using-appname">
+<title>Using &appname;</title>
+
+<!-- This chapter should tell the user how to use your app. You should use as
+many sections (Chapter, Sect1, Sect3, etc...) as is necessary to fully document
+your application. -->
+
+<para>
+
+<!-- Note that all graphics should be in .png format. Use no gifs because of
+patent issues. -->
+
+<screenshot>
+<screeninfo>Here's a screenshot of &appname;</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot.png" format="PNG"/>
+ </imageobject>
+ <imageobject>
+ <imagedata fileref="screenshot.eps" format="EPS"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+
+<sect1 id="appname-features">
+<title>More &appname; features</title>
+
+<para>It slices! It dices! and it comes with a free toaster!</para>
+<para>
+The Squiggle Tool <guiicon><inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="squiggle.png" format="PNG"/>
+ </imageobject>
+ <imageobject>
+ <imagedata fileref="squiggle.eps" format="EPS"/>
+ </imageobject>
+ <textobject>
+ <phrase>Squiggle</phrase>
+ </textobject>
+</inlinemediaobject></guiicon> is used to draw squiggly lines all over
+the &appname; main window. It's not a bug, it's a feature!
+</para>
+
+</sect1>
+</chapter>
+
+<chapter id="commands">
+<title>Command Reference</title>
+
+<!-- (OPTIONAL, BUT RECOMMENDED) This chapter should list all of the
+application windows and their menubar and toolbar commands for easy reference.
+Also include any keys that have a special function but have no equivalent in the
+menus or toolbars. This may not be necessary for small apps or apps with no tool
+or menu bars. -->
+
+<sect1 id="appname-mainwindow">
+<title>The main &appname; window</title>
+
+<sect2>
+<title>The File Menu</title>
+<para>
+<variablelist>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>N</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>New</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Creates a new document</action></para></listitem>
+</varlistentry>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>S</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Save</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Saves the document</action></para></listitem>
+</varlistentry>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>Q</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Quit</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Quits</action> &appname;</para></listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+</sect2>
+
+<sect2>
+<title>The <guimenu>Help</guimenu> Menu</title>
+
+<!-- Assuming you have a standard help menu (help, what's this, about -->
+<!-- &appname;, about KDE) then the documentation is already written. -->
+<!-- The following entity is valid anywhere that a variablelist is -->
+<!-- valid. -->
+
+&help.menu.documentation;
+
+</sect2>
+
+</sect1>
+</chapter>
+
+<chapter id="developers">
+<title>Developer's Guide to &appname;</title>
+
+<!-- (OPTIONAL) A Programming/Scripting reference chapter should be
+used for apps that use plugins or that provide their own scripting hooks
+and/or development libraries. -->
+
+<para>
+Programming &appname; plugins is a joy to behold. Just read through the next
+66 pages of API's to learn how!
+</para>
+
+<!-- Use refentries to describe APIs. Refentries are fairly complicated and you
+should consult the docbook reference for further details. The example below was
+taken from that reference and shortened a bit for readability. -->
+
+<refentry id="re-1007-unmanagechildren-1">
+<refmeta>
+<refentrytitle>XtUnmanageChildren</refentrytitle>
+<refmiscinfo>Xt - Geometry Management</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>XtUnmanageChildren
+</refname>
+<refpurpose>remove a list of children from a parent widget's managed
+list.
+<indexterm id="ix-1007-unmanagechildren-1"><primary>widgets</primary><secondary>removing</secondary></indexterm>
+<indexterm id="ix-1007-unmanagechildren-2"><primary>XtUnmanageChildren</primary></indexterm>
+</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv>
+<refsynopsisdivinfo>
+<date>4 March 1996</date>
+</refsynopsisdivinfo>
+<synopsis>
+void XtUnmanageChildren(<replaceable class="parameter">children</replaceable>, <replaceable class="parameter">num_children</replaceable>)
+ WidgetList <replaceable class="parameter">children</replaceable>;
+ Cardinal <replaceable class="parameter">num_children</replaceable>;
+</synopsis>
+
+<refsect2 id="r2-1007-unmanagechildren-1">
+<title>Inputs</title>
+<variablelist>
+<varlistentry>
+<term><replaceable class="parameter">children</replaceable>
+</term>
+<listitem>
+<para>Specifies an array of child widgets. Each child must be of
+class RectObj or any subclass thereof.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><replaceable class="parameter">num_children</replaceable>
+</term>
+<listitem>
+<para>Specifies the number of elements in <replaceable class="parameter">children</replaceable>.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refsect2></refsynopsisdiv>
+
+<refsect1 id="r1-1007-unmanagechildren-1">
+<title>Description
+</title>
+<para><function>XtUnmanageChildren()</function> unmaps the specified widgets
+and removes them from their parent's geometry management.
+The widgets will disappear from the screen, and (depending
+on its parent) may no longer have screen space allocated for
+them.
+</para>
+<para>Each of the widgets in the <replaceable class="parameter">children</replaceable> array must have
+the same parent.
+</para>
+<para>See the &ldquo;Algorithm&rdquo; section below for full details of the
+widget unmanagement procedure.
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-2">
+<title>Usage</title>
+<para>Unmanaging widgets is the usual method for temporarily
+making them invisible. They can be re-managed with
+<function>XtManageChildren()</function>.
+</para>
+<para>You can unmap a widget, but leave it under geometry
+management by calling <function>XtUnmapWidget()</function>. You can
+destroy a widget's window without destroying the widget by
+calling <function>XtUnrealizeWidget()</function>. You can destroy a
+widget completely with <function>XtDestroyWidget()</function>.
+</para>
+<para>If you are only going to unmanage a single widget, it is
+more convenient to call <function>XtUnmanageChild()</function>. It is
+often more convenient to call <function>XtUnmanageChild()</function>
+several times than it is to declare and initialize an array
+of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
+<function>XtUnmanageChildren()</function> is more efficient, however,
+because it only calls the parent's <function>change_managed()</function>
+method once.
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-3">
+<title>Algorithm
+</title>
+<para><function>XtUnmanageChildren()</function> performs the following:
+</para>
+<variablelist>
+<varlistentry>
+<term>-
+</term>
+<listitem>
+<para>Ignores the child if it already is unmanaged or is being
+destroyed.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>-
+</term>
+<listitem>
+<para>Otherwise, if the child is realized, it makes it nonvisible
+by unmapping it.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-4">
+<title>Structures</title>
+<para>The <type>WidgetList</type> type is simply an array of widgets:
+</para>
+<screen id="sc-1007-unmanagechildren-1">typedef Widget *WidgetList;
+</screen>
+</refsect1>
+</refentry>
+
+</chapter>
+
+<chapter id="faq">
+<title>Questions and Answers</title>
+
+<!-- (OPTIONAL but recommended) This chapter should include all of the silly
+(and not-so-silly) newbie questions that fill up your mailbox. This chapter
+should be reserved for BRIEF questions and answers! If one question uses more
+than a page or so then it should probably be part of the
+"Using this Application" chapter instead. You should use links to
+cross-reference questions to the parts of your documentation that answer them.
+This is also a great place to provide pointers to other FAQ's if your users
+must do some complicated configuration on other programs in order for your
+application work. -->
+
+&reporting.bugs;
+&updating.documentation;
+
+<qandaset id="faqlist">
+<qandaentry>
+<question>
+<para>My Mouse doesn't work. How do I quit &appname;?</para>
+</question>
+<answer>
+<para>You silly goose! Check out the <link linkend="commands">Commands
+Section</link> for the answer.</para>
+</answer>
+</qandaentry>
+<qandaentry>
+<question>
+<para>Why can't I twiddle my documents?</para>
+</question>
+<answer>
+<para>You can only twiddle your documents if you have the foobar.lib
+installed.</para>
+</answer>
+</qandaentry>
+</qandaset>
+</chapter>
+
+<chapter id="credits">
+
+<!-- Include credits for the programmers, documentation writers, and
+contributors here. The license for your software should then be included below
+the credits with a reference to the appropriate license file included in the KDE
+distribution. -->
+
+<title>Credits and License</title>
+
+<para>
+&appname;
+</para>
+<para>
+Program copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
+</para>
+<para>
+Contributors:
+<itemizedlist>
+<listitem><para>Konqui the KDE Dragon <email>[email protected]</email></para>
+</listitem>
+<listitem><para>Tux the Linux Penguin <email>[email protected]</email></para>
+</listitem>
+</itemizedlist>
+</para>
+
+<para>
+Documentation copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underFDL; <!-- FDL: do not remove -->
+
+<!-- Determine which license your application is licensed under,
+ and delete all the remaining licenses below:
+
+ (NOTE: All documentation are licensed under the FDL,
+ regardless of what license the application uses) -->
+
+&underGPL; <!-- GPL License -->
+&underBSDLicense; <!-- BSD License -->
+&underArtisticLicense; <!-- BSD Artistic License -->
+&underX11License; <!-- X11 License -->
+
+</chapter>
+
+<appendix id="installation">
+<title>Installation</title>
+
+<sect1 id="getting-appname">
+<title>How to obtain &appname;</title>
+
+<!-- This first entity contains boiler plate for applications that are
+part of KDE CVS. You should remove it if you are releasing your
+application -->
+
+&install.intro.documentation;
+
+</sect1>
+
+<sect1 id="requirements">
+<title>Requirements</title>
+
+<!--
+List any special requirements for your application here. This should include:
+.Libraries or other software that is not included in kdesupport,
+kdelibs, or kdebase.
+.Hardware requirements like amount of RAM, disk space, graphics card
+capabilities, screen resolution, special expansion cards, etc.
+.Operating systems the app will run on. If your app is designed only for a
+specific OS, (you wrote a graphical LILO configurator for example) put this
+information here.
+-->
+
+<para>
+In order to successfully use &appname;, you need &kde; 1.1. Foobar.lib is
+required in order to support the advanced &appname; features. &appname; uses
+about 5 megs of memory to run, but this may vary depending on your
+platform and configuration.
+</para>
+
+<para>
+All required libraries as well as &appname; itself can be found
+on <ulink url="ftp://ftp.appname.org">The &appname; home page</ulink>.
+</para>
+
+<!-- For a list of updates, you may refer to the application web site
+or the ChangeLog file, or ... -->
+<para>
+You can find a list of changes at <ulink
+url="http://apps.kde.org/appname">http://apps.kde.org/appname</ulink>.
+</para>
+</sect1>
+
+<sect1 id="compilation">
+<title>Compilation and Installation</title>
+
+<!-- This entity contains the boilerplate text for standard -->
+<!-- compilation instructions. If your application requires any -->
+<!-- special handling, remove it, and replace with your own text. -->
+
+&install.compile.documentation;
+
+</sect1>
+
+<sect1 id="configuration">
+<title>Configuration</title>
+
+<para>Don't forget to tell your system to start the <filename>dtd</filename>
+dicer-toaster daemon first, or &appname; won't work !</para>
+
+</sect1>
+
+</appendix>
+
+&documentation.index;
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+vim:tabstop=2:shiftwidth=2:expandtab
+-->
+
diff --git a/app_templates/kdeapp/po/README b/app_templates/kdeapp/po/README
new file mode 100644
index 0000000..0e18f16
--- /dev/null
+++ b/app_templates/kdeapp/po/README
@@ -0,0 +1 @@
+.pot and .pot translation files should be placed here.
diff --git a/app_templates/kdeapp/setup.py b/app_templates/kdeapp/setup.py
new file mode 100755
index 0000000..8cf6964
--- /dev/null
+++ b/app_templates/kdeapp/setup.py
@@ -0,0 +1,30 @@
+#!/usr/bin/python
+###########################################################################
+# setup - description #
+# ------------------------------ #
+# begin : Fri Jun 27 2003 #
+# copyright : (C) 2003-2004 by AUTHOR #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+###########################################################################
+
+import kdedistutils
+
+kdedistutils.setup(name="kdeapp",
+ version="0.1.0",
+ author="AUTHOR",
+ author_email="[email protected]",
+ url="http://www.KDEAPP.com/",
+ min_kde_version = "3.0.0",
+ min_qt_version = "3.0.0",
+ license = "GPL",
+ application_data = ['src/kdeapp.py','src/prefdialog.py','src/kdeappview.py'],
+ executable_links = [('kdeapp','kdeapp.py')],
+ docbooks = [ ('doc/en','en') ] )
diff --git a/app_templates/kdeapp/src/hi16-app-kdeapp.png b/app_templates/kdeapp/src/hi16-app-kdeapp.png
new file mode 100644
index 0000000..40fe05e
--- /dev/null
+++ b/app_templates/kdeapp/src/hi16-app-kdeapp.png
@@ -0,0 +1,8 @@
+�PNG
+
+
+IHDR
+���5� M�Z��fθ92@�
+��2w�l�A;�v�c)�\)��/l F�\��ϓ���~��S���X�Ŧ�=t�j�76��{rumu��_��% ��}�f�b{�Z��RdY�7�C2�TWՓ�Ӳ��O>�f�X�G�ȵ��,F�&/#�x<��&P��%]E��ܖC�f U��S����
+"�l+�*���J�ǰ�M��Jde���9Hz�]�qT�P�B�I��
+��}���Q����� �bR��������� �]�nv��bf,�û����:�L�d�4��PuC����7��AK �\��^�ϟ=.~�����|َ2�w��|x��w��N�Vd/RK��6���+����ɤ�����Ħ�7fmc�5� hr�96�M�D#x�=Ia�ނOHxc�7=# �U�D��oV�i
diff --git a/app_templates/kdeapp/src/hi32-app-kdeapp.png b/app_templates/kdeapp/src/hi32-app-kdeapp.png
new file mode 100644
index 0000000..8a6093e
--- /dev/null
+++ b/app_templates/kdeapp/src/hi32-app-kdeapp.png
@@ -0,0 +1,26 @@
+�PNG
+
+
+IHDR
+:IDATx���{�\�}�?w�y�;;���}`�����k̲~&�q�R�- H��Gpk
+PPJ�&(
+�J��EQ���4Iq QDHC~D6��Bص�׮ٵٝ��̝�;�;��?f�1� i{���+]������}��k��_åòB��e,ˢ3��֖6�Tض�3'�``��Ie�m=����������}�j���^�w��O<w�Y��kV_�˺�x�,��M��?�.���x!��c�Č�l�8����v��oZ�������;ퟙ<��r�V���͌O���>���\O����z��U#fh�a7��Y��I5�r엇�������@�[
+>�u;�j����o���Qk╳�?���ڕkq�
+��-��t/�E(�tB ��06 �se_���������?���u����7���сQ3�r)%�H+B
+��֎6���CHW��RШ7ؾk33��M���_<dzGf�X�bq���@�YӷƬ\o֭Z��8�B!</MP X�i-�z�J�����A(AH�HG�D\�fcTJe��kV �a� l��Yk�/�r� �
+�:.��b��X,�[w�s� � �yh�)
+�t�������a#� �H㶸��>g�~�So
+�/�Y58ȗ���$�i������TJjA
+�5���0�>
+n���t�Mt?���gj|�#O=�]���d۶ȕr(���߱��z'N���̐��)�E
+�<A�BP�0��[,��f���T�R �Va#� �����_y����3z�&˛K��gAP�T�Bcp��n�o�&��+���N�If�S9�~*K�˒�ҌM�Q(�MͲ�����S�FHA(d��Dj�m�B`�aﭷ������fh��z���
+c ӳ
+PJ��8^*K.�����
+�OP �>���(�--H��, �$�R�j9 ���'�$�����z��1�C/���;8�� >�|p�-�����Z��f�RY�x?�%7�!���%���c+EĪѡ�m�mb��#I��3x� A�B��3vn�F��4����qv���S�����u�B��BI�T
+G)�^s�~*G&�b~.N46ǩ3�H����H���_lϻ%�:ґ�m-dbi\��
+YT�R~
+�3�`��ʮ
+��x�S�(W˖eY��,8��a{�Qn���f�*�0%�����I��]
+�U�ܲ!�Eg�(6-���:.JJ�T�EZ ��^:E$�r��b�j�q�K*�"��͖L\
+i#�h��h-�ƖM[���rή�Gk� e���TN�r�b�H6�ʼn��/���? h�e3�����Z���B��T�l��*J6�])���X ?��C{G�ZG�Q���L�T!�ʒMd�DS�/Y��C�^�]M[?~�������/�E,��T(�B�\�o���ղ,����g}�<�| �h0��[,_�� H'<�ٸG*��5W�fI������ZX�y������m��/��%�u�MTk5�X�a�Ek��� �d��p���O������e�+(�$gb���\8���/�
+���l!0��Z�W'^]�,���B�wؼz�F��%����9-��+ڮ��h�Χ�,�����b�����l�\l4f7
diff --git a/app_templates/kdeapp/src/kdeapp.desktop b/app_templates/kdeapp/src/kdeapp.desktop
new file mode 100644
index 0000000..2787759
--- /dev/null
+++ b/app_templates/kdeapp/src/kdeapp.desktop
@@ -0,0 +1,35 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=$APPNAME$
+Exec=$APPNAMELC$ %i %m -caption "%c"
+Icon=$APPNAMELC$
+Type=Application
+DocPath=$APPNAMELC$/$APPNAMELC$.html
+Comment=A KDE KPart Application
+Comment[ca]=Una aplicació KPart per a KDE
+Comment[cy]=Cymhwysiad KPart KDE
+Comment[da]=Et KDE KPart program
+Comment[de]=Eine KDE-Komponenten-Anwendung
+Comment[el]=Μια εφαρμογή KPart του KDE
+Comment[es]=Una aplicación KPart de KDE
+Comment[et]=KDE KPart rakendus
+Comment[fr]=Une application KPart pour KDE.
+Comment[hi]=एक केडीई के-पार्ट अनुप्रयोग
+Comment[hu]=KPart-alapú KDE-alkalmazás
+Comment[is]=KDE KPart forrit
+Comment[it]=Applicazione KPart di KDE
+Comment[ja]=KDE KPart アプリケーション
+Comment[nb]=Et KDE KPart-program
+Comment[nl]=Een KDE KPart-toepassing
+Comment[pl]=Aplikacja KDE
+Comment[pt]=Uma aplicação KPart do KDE
+Comment[pt_BR]=Um Aplicativo KPart do KDE
+Comment[ru]=Приложение KPart для KDE
+Comment[sl]=Program KPart za KDE
+Comment[sr]=KDE KPart програм
+Comment[sr@Latn]=KDE KPart program
+Comment[sv]=Ett KDE Kpart-program
+Comment[ta]=கெடி கெபார்ட் பயன்பாடு
+Comment[tg]=Ба кор андохтани KPart барои KDE
+Comment[zh_CN]=一个 KDE KPart 应用程序
+Terminal=0
diff --git a/app_templates/kdeapp/src/kdeapp.lsm b/app_templates/kdeapp/src/kdeapp.lsm
new file mode 100644
index 0000000..43d0d5f
--- /dev/null
+++ b/app_templates/kdeapp/src/kdeapp.lsm
@@ -0,0 +1,16 @@
+Begin3
+Title: $APPNAME$ -- Some description
+Version: $VERSION$
+Entered-date:
+Description:
+Keywords: KDE Qt
+Author: $AUTHOR$ <$EMAIL$>
+Maintained-by: $AUTHOR$ <$EMAIL$>
+Home-page:
+Alternate-site:
+Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
+ xxxxxx $APPNAMELC$-$VERSION$.tar.gz
+ xxx $APPNAMELC$-$VERSION$.lsm
+Platform: Linux. Needs KDE
+Copying-policy: $LICENSE$
+End
diff --git a/app_templates/kdeapp/src/kdeapp.py b/app_templates/kdeapp/src/kdeapp.py
new file mode 100755
index 0000000..6c9b921
--- /dev/null
+++ b/app_templates/kdeapp/src/kdeapp.py
@@ -0,0 +1,280 @@
+#!/usr/bin/python
+###########################################################################
+# kdeapp - description #
+# ------------------------------ #
+# begin : Fri Jun 27 2005 #
+# copyright : (C) 2005 by AUTHOR #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+###########################################################################
+
+from qt import *
+from kdecore import *
+from kdeui import *
+import sys
+from prefdialog import *
+from kdeappview import *
+
+description = "A KDE Application"
+version = "0.1";
+
+class KdeApp(KMainWindow):
+ def __init__(self):
+ KMainWindow.__init__(self,None,"KdeApp")
+
+ self._view = KdeAppView(self)
+ self._printer = None
+
+ # accept dnd
+ self.setAcceptDrops(True)
+
+ # tell the KMainWindow that this is indeed the main widget
+ self.setCentralWidget(self._view)
+
+ # then, setup our actions
+ self._setupActions()
+
+ # and a status bar
+ self.statusBar().show()
+
+ # Apply the create the main window and ask the mainwindow to
+ # automatically save settings if changed: window size, toolbar
+ # position, icon size, etc. Also to add actions for the statusbar
+ # toolbar, and keybindings if necessary.
+ self.setAutoSaveSettings()
+
+ # allow the view to change the statusbar and caption
+ self.connect(self._view, PYSIGNAL("signalChangeStatusbar"), self.changeStatusbar)
+ self.connect(self._view, PYSIGNAL("signalChangeCaption"), self.changeCaption)
+
+ def load(self,url):
+ target = QString()
+ # the below code is what you should normally do. in this
+ # example case, we want the url to our own. you probably
+ # want to use this code instead for your app
+
+ if False:
+ # download the contents
+ if KIO.NetAccess.download(url, target):
+ # set our caption
+ self.setCaption(url)
+
+ # load in the file (target is always local)
+ self.loadFile(target)
+
+ # and remove the temp file
+ KIO.NetAccess.removeTempFile(target)
+
+ self.setCaption(url.prettyURL())
+ self._view.openURL(url)
+
+
+ def _setupActions(self):
+ global kapp
+ KStdAction.openNew(self.fileNew, self.actionCollection())
+ KStdAction.open(self.fileOpen, self.actionCollection())
+ KStdAction.save(self.fileSave, self.actionCollection())
+ KStdAction.saveAs(self.fileSaveAs, self.actionCollection())
+ KStdAction.print_(self.filePrint, self.actionCollection())
+ KStdAction.quit(kapp.quit, self.actionCollection())
+
+ self._toolbarAction = KStdAction.showToolbar(self.optionsShowToolbar, self.actionCollection())
+ self._statusbarAction = KStdAction.showStatusbar(self.optionsShowStatusbar, self.actionCollection())
+ KStdAction.keyBindings(self.optionsConfigureKeys, self.actionCollection())
+
+ KStdAction.configureToolbars(self.optionsConfigureToolbars, self.actionCollection())
+ KStdAction.preferences(self.optionsPreferences, self.actionCollection())
+
+ # this doesn't do anything useful. it's just here to illustrate
+ # how to insert a custom menu and menu item
+ custom = KAction(i18n("Cus&tom Menuitem"), KShortcut(),
+ self.optionsPreferences,
+ self.actionCollection(), "custom_action")
+ self.createGUI()
+
+ def _saveProperties(self,config):
+ # the 'config' object points to the session managed
+ # config file. anything you write here will be available
+ # later when this app is restored
+
+ if not self._view.currentURL().isEmpty():
+ config.writeEntry("lastURL", self._view.currentURL())
+
+ def _readProperties(self,config):
+ # the 'config' object points to the session managed
+ # config file. this function is automatically called whenever
+ # the app is being restored. read in here whatever you wrote
+ # in 'saveProperties'
+
+ url = config.readPathEntry("lastURL")
+
+ if not url.isEmpty():
+ self._view.openURL(KURL(url))
+
+ def dragEnterEvent(self,event):
+ # accept uri drops only
+ event.accept(KURLDrag.canDecode(event))
+
+ def dropEvent(self,event):
+ # this is a very simplistic implementation of a drop event. we
+ # will only accept a dropped URL. the Qt dnd code can do *much*
+ # much more, so please read the docs there
+ urls = KURL.List()
+
+ # see if we can decode a URI.. if not, just ignore it
+ if KURLDrag.decode(event, urls) and not urls.isEmpty():
+ # okay, we have a URI.. process it
+ url = urls.first()
+
+ # load in the file
+ self.load(url)
+
+ def fileNew(self):
+ # this slot is called whenever the File->New menu is selected,
+ # the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ # button is clicked
+
+ # create a new window
+ KdeApp().show()
+
+ def fileOpen(self):
+ # this slot is called whenever the File->Open menu is selected,
+ # the Open shortcut is pressed (usually CTRL+O) or the Open toolbar
+ # button is clicked
+
+ ## this brings up the generic open dialog
+ #KURL url = KURLRequesterDlg::getURL(QString::null, this, i18n("Open Location") );
+
+ # standard filedialog
+ url = KFileDialog.getOpenURL(None, One, self, i18n("Open Location"))
+ if not url.isEmpty():
+ self._view.openURL(url)
+
+ def fileSave(self):
+ # this slot is called whenever the File->Save menu is selected,
+ # the Save shortcut is pressed (usually CTRL+S) or the Save toolbar
+ # button is clicked
+
+ # save the current file
+ pass
+
+ def fileSaveAs(self):
+ # this slot is called whenever the File->Save As menu is selected,
+ file_url = KFileDialog.getSaveURL()
+ if not file_url.isEmpty() and file_url.isValid():
+ # save your info, here
+ pass
+
+
+ def filePrint(self):
+ # this slot is called whenever the File->Print menu is selected,
+ # the Print shortcut is pressed (usually CTRL+P) or the Print toolbar
+ # button is clicked
+ if self._printer is None:
+ self._printer = KPrinter()
+
+ if self._printer.setup(self):
+ # setup the printer. with Qt, you always "print" to a
+ # QPainter.. whether the output medium is a pixmap, a screen,
+ # or paper
+ p = QPainter()
+ p.begin(self._printer)
+
+ # we let our view do the actual printing
+ metrics = QPaintDeviceMetrics(m_printer)
+ self._view.print_(p, metrics.height(), metrics.width())
+
+ # and send the result to the printer
+ p.end();
+
+ def optionsPreferences(self):
+ # popup some sort of preference dialog, here
+ dlg = PreferencesDialog()
+ if dlg.exec_loop():
+ # redo your settings
+ pass
+
+ def optionsShowToolbar(self):
+ # this is all very cut and paste code for showing/hiding the
+ # toolbar
+ if self._toolbarAction.isChecked():
+ self.toolBar().show()
+ else:
+ self.toolBar().hide()
+
+ def optionsShowStatusbar(self):
+ # this is all very cut and paste code for showing/hiding the
+ # statusbar
+
+ if self._statusbarAction.isChecked():
+ self.statusBar().show()
+ else:
+ self.statusBar().hide()
+
+ def optionsConfigureKeys(self):
+ KKeyDialog.configure(self.actionCollection())
+
+ def optionsConfigureToolbars(self):
+ # use the standard toolbar editor
+ self.saveMainWindowSettings(KGlobal.config())
+
+ def newToolbarConfig(self):
+ # this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
+ # recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
+ self.createGUI()
+ self.applyMainWindowSettings(KGlobal.config())
+
+ def changeStatusbar(self,text):
+ # display the text on the statusbar
+ self.statusBar().message(text)
+
+ def changeCaption(self,text):
+ # display the text on the caption
+ self.setCaption(text)
+
+
+options = [ ("+[URL]", "Document to open", "") ]
+
+def main():
+ global kapp,version,description,options
+
+ aboutdata = KAboutData("kdeapp", "KdeApp", version, description, \
+ KAboutData.License_GPL, "(C) 2005 AUTHOR", None, None, "[email protected]")
+ aboutdata.addAuthor("AUTHOR", None, "[email protected]")
+ KCmdLineArgs.init(sys.argv,aboutdata)
+ KCmdLineArgs.addCmdLineOptions(options)
+ kapp = KApplication()
+
+ # register ourselves as a dcop client
+ kapp.dcopClient().registerAs(kapp.name(), False)
+
+ # see if we are starting with session management
+ if kapp.isRestored():
+ n = 1
+ while KMainWindow.canBeRestored(n):
+ KdeApp().restore(n)
+ n += 1
+ else:
+ # no session.. just start up normally
+ args = KCmdLineArgs.parsedArgs()
+ if args.count() == 0:
+ widget = KdeApp()
+ widget.show()
+ else:
+ i = 0
+ for i in range(args.count()):
+ widget = KdeApp()
+ widget.show()
+ widget.load(args.url(i))
+
+ args.clear()
+
+ return kapp.exec_loop()
+main()
diff --git a/app_templates/kdeapp/src/kdeappiface.py b/app_templates/kdeapp/src/kdeappiface.py
new file mode 100644
index 0000000..1ff3b0f
--- /dev/null
+++ b/app_templates/kdeapp/src/kdeappiface.py
@@ -0,0 +1,26 @@
+#!/usr/bin/python
+###########################################################################
+# testappiface - description #
+# ------------------------------ #
+# begin : Fri Jun 27 2003 #
+# copyright : (C) 2005 by AUTHOR #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+###########################################################################
+
+from dcopexport import DCOPExObj
+
+class TestAppIface(DCOPExObj):
+ def __init__(self, parent, id="Value"):
+ DCOPExObj.__init__(self, id)
+ self.addMethod("void openURL(QString url)", self.openURL)
+
+ def openURL(self,url):
+ pass
diff --git a/app_templates/kdeapp/src/kdeappui.rc b/app_templates/kdeapp/src/kdeappui.rc
new file mode 100644
index 0000000..6c3f6a9
--- /dev/null
+++ b/app_templates/kdeapp/src/kdeappui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="testapp" version="1">
+<MenuBar>
+ <Menu name="custom"><text>C&amp;ustom</text>
+ <Action name="custom_action" />
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/app_templates/kdeapp/src/kdeappview.py b/app_templates/kdeapp/src/kdeappview.py
new file mode 100644
index 0000000..af28a44
--- /dev/null
+++ b/app_templates/kdeapp/src/kdeappview.py
@@ -0,0 +1,91 @@
+#!/usr/bin/python
+###########################################################################
+# kdeappview - description #
+# ------------------------------ #
+# begin : Fri Jun 27 2005 #
+# copyright : (C) 2005 by AUTHOR #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+###########################################################################
+
+from qt import *
+from kdecore import *
+from kdeui import *
+from kio import *
+from khtml import *
+from kparts import *
+#from kdeappiface import *
+
+class KdeAppView(QWidget):
+ def __init__(self,parent):
+ QWidget.__init__(self,parent)
+ #self._dcopclient= KdeAppIface(self,"KdeAppIface")
+
+ # setup our layout manager to automatically add our widgets
+ top_layout = QHBoxLayout(self)
+ top_layout.setAutoAdd(True)
+
+ if True:
+ self._html = KHTMLPart(self)
+ else:
+
+ # we want to look for all components that satisfy our needs. the
+ # trader will actually search through *all* registered KDE
+ # applications and components -- not just KParts. So we have to
+ # specify two things: a service type and a constraint
+ #
+ # the service type is like a mime type. we say that we want all
+ # applications and components that can handle HTML -- 'text/html'
+ #
+ # however, by itself, this will return such things as Netscape..
+ # not what we wanted. so we constrain it by saying that the
+ # string 'KParts/ReadOnlyPart' must be found in the ServiceTypes
+ # field. with this, only components of the type we want will be
+ # returned.
+ offers = KTrader.self().query("text/html", "'KParts/ReadOnlyPart' in ServiceTypes")
+
+ self._html = None
+ # in theory, we only care about the first one.. but let's try all
+ # offers just in case the first can't be loaded for some reason
+ for ptr in offers:
+ # we now know that our offer can handle HTML and is a part.
+ # since it is a part, it must also have a library... let's try to
+ # load that now
+ self._html = createReadOnlyPart(ptr.library(),self,ptr.name(),"KParts::ReadOnlyPart",QStringList())
+ if self._html is not None:
+ break
+
+ # if our factory is invalid, then we never found our component
+ # and we might as well just exit now
+ if self._html is None:
+ KMessageBox.error(self, i18n("Could not find a suitable HTML component"))
+ return
+
+ QObject.connect(self._html, SIGNAL("setWindowCaption(const QString&)"), self.slotSetTitle)
+ QObject.connect(self._html, SIGNAL("setStatusBarText(const QString&)"), self.slotOnURL)
+
+ def print_(self,p,height,width):
+ pass
+ # do the actual printing, here
+ # p.drawText(etc..)
+
+ def currentURL(self):
+ return self._html.url().url()
+
+ def openURL(self,url):
+ if isinstance(url,QString):
+ url = KURL(url)
+ self._html.openURL(url)
+
+ def slotOnURL(self,url):
+ self.emit(PYSIGNAL("signalChangeStatusbar"),(url,) )
+
+ def slotSetTitle(self,title):
+ self.emit(PYSIGNAL("signalChangeCaption"),(title,) )
diff --git a/app_templates/kdeapp/src/prefdialog.py b/app_templates/kdeapp/src/prefdialog.py
new file mode 100644
index 0000000..7932f84
--- /dev/null
+++ b/app_templates/kdeapp/src/prefdialog.py
@@ -0,0 +1,53 @@
+#!/usr/bin/python
+###########################################################################
+# testapp - description #
+# ------------------------------ #
+# begin : Fri Jun 27 2005 #
+# copyright : (C) 2005 by AUTHOR #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+###########################################################################
+
+from qt import *
+from kdecore import *
+from kdeui import *
+
+class TestAppPrefDialog(KDialogBase):
+ def __init__(self):
+ KDialogBase.__init__(TreeList, i18n("TestApp Preferences"),
+ KDialogBase.Help|KDialogBase.Default|KDialogBase.Ok|KDialogBase.Apply|KDialogBase.Cancel, Ok)
+
+ # this is the base class for your preferences dialog. it is now
+ # a Treelist dialog.. but there are a number of other
+ # possibilities (including Tab, Swallow, and just Plain)
+ frame = self.addPage(i18n("First Page"), i18n("Page One Options"))
+ self._pageOne = TestAppPrefPageOne(frame)
+
+ frame = self.addPage(i18n("Second Page"), i18n("Page Two Options"))
+ self._pageTwo = TestAppPrefPageTwo(frame)
+
+class TestAppPrefPageOne(QFrame):
+ def __init__(self,parent):
+ QFrame.__init__(self,parent)
+
+ layout = QHBoxLayout(self)
+ layout.setAutoAdd(True)
+
+ QLabel(i18n("Add something here"), self)
+
+class TestAppPrefPageTwo(QFrame):
+ def __init__(self,parent):
+ QFrame.__init__(self,parent)
+
+ layout = QHBoxLayout(self)
+ layout.setAutoAdd(True)
+
+ QLabel(i18n("Add something here"), self)
+
diff --git a/app_templates/kdeutility/AUTHORS b/app_templates/kdeutility/AUTHORS
new file mode 100644
index 0000000..0463c0d
--- /dev/null
+++ b/app_templates/kdeutility/AUTHORS
@@ -0,0 +1 @@
+$AUTHOR$ <$EMAIL$>
diff --git a/app_templates/kdeutility/COPYING b/app_templates/kdeutility/COPYING
new file mode 100644
index 0000000..c13faf0
--- /dev/null
+++ b/app_templates/kdeutility/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/app_templates/kdeutility/ChangeLog b/app_templates/kdeutility/ChangeLog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kdeutility/ChangeLog
diff --git a/app_templates/kdeutility/INSTALL b/app_templates/kdeutility/INSTALL
new file mode 100644
index 0000000..b94cd85
--- /dev/null
+++ b/app_templates/kdeutility/INSTALL
@@ -0,0 +1,43 @@
+Basic Installation
+==================
+These are generic installation instructions.
+
+This software uses the Python language's distutils system for installation.
+A detailed guide for users and system administrators to using distutils to
+install software can be found here:
+
+ http://docs.python.org/inst/inst.html
+
+The simplest way to install this software is to run the following command as
+the root user:
+
+ python setup.py install
+
+The setup.py script will automatically detect the directories to use for
+documentation, binaries and other software files.
+
+
+Uninstallation
+==============
+During installation setup.py creates list of files and directories that
+were installed in a file called install_log.txt.
+
+ python setup.py uninstall
+
+
+Installing into an alternate root
+=================================
+For packaging purposes it is often very useful to be able to install all files
+relative not to the usual root directory (/) but into an alternative
+directory.
+
+ python setup.py install --root=/tmp/alternativeroot/
+
+
+Operation Controls
+==================
+--verbose
+ Print more information about what setup.py is doing.
+
+--help
+ Print a summary of the options to setup.py, and exit.
diff --git a/app_templates/kdeutility/MANIFEST.in b/app_templates/kdeutility/MANIFEST.in
new file mode 100644
index 0000000..c2dde3f
--- /dev/null
+++ b/app_templates/kdeutility/MANIFEST.in
@@ -0,0 +1,6 @@
+recursive-include doc *.docbook *.png
+recursive-include po *.po *.pot
+include AUTHORS ChangeLog COPYING INSTALL MANIFEST.in NEWS README TODO
+global-include *.desktop *.py *.ui *.png *.lsm
+global-exclude *~ .svn
+global-exclude *~ .cvs
diff --git a/app_templates/kdeutility/NEWS b/app_templates/kdeutility/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kdeutility/NEWS
diff --git a/app_templates/kdeutility/README b/app_templates/kdeutility/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kdeutility/README
diff --git a/app_templates/kdeutility/TODO b/app_templates/kdeutility/TODO
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kdeutility/TODO
diff --git a/app_templates/kdeutility/doc/en/index.docbook b/app_templates/kdeutility/doc/en/index.docbook
new file mode 100644
index 0000000..325987f
--- /dev/null
+++ b/app_templates/kdeutility/doc/en/index.docbook
@@ -0,0 +1,555 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+ <!ENTITY appname "<application>MyApplicaition 0.1</application>">
+ <!ENTITY kappname "&appname;"><!-- Do *not* replace kappname-->
+ <!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc -->
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE"><!-- change language only here -->
+
+
+ <!-- Do not define any other entities; instead, use the entities
+ from kde-genent.entities and $LANG/user.entities. -->
+]>
+<!-- kdoctemplate v0.8 October 1 1999
+ Minor update to "Credits and Licenses" section on August 24, 2000
+ Removed "Revision history" section on 22 January 2001
+ Changed to Installation/Help menu entities 18 October 2001
+ Other minor cleanup and changes 18 October 2001 -->
+
+
+<!--
+This template was designed by: David Rugge [email protected]
+with lots of help from: Eric Bischoff [email protected]
+and Frederik Fouvry [email protected]
+of the KDE DocBook team.
+
+You may freely use this template for writing any sort of KDE documentation.
+If you have any changes or improvements, please let us know.
+
+Remember:
+- in XML, the case of the <tags> and attributes is relevant ;
+- also, quote all attributes.
+
+Please don't forget to remove all these comments in your final documentation,
+thanks ;-).
+-->
+
+<!-- ................................................................ -->
+
+<!-- The language must NOT be changed here. -->
+
+<book lang="&language;">
+
+<!-- This header contains all of the meta-information for the document such
+as Authors, publish date, the abstract, and Keywords -->
+
+<bookinfo>
+<title>The &appname; Handbook</title>
+
+<authorgroup>
+<author>
+<firstname></firstname>
+<othername></othername>
+<surname>%{AUTHOR}</surname>
+<affiliation>
+<address><email>%{EMAIL}</email></address>
+</affiliation>
+</author>
+</authorgroup>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+<copyright>
+<year>1999</year>
+<year>%{YEAR}</year>
+<holder>%{AUTHOR}</holder>
+</copyright>
+<!-- Translators: put here the copyright notice of the translation -->
+<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
+ and in the FDL itself on how to use it. -->
+<legalnotice>&FDLNotice;</legalnotice>
+
+<!-- Date and version information of the documentation
+Don't forget to include this last date and this last revision number, we
+need them for translation coordination !
+Please respect the format of the date (YYYY-MM-DD) and of the version
+(V.MM.LL), it could be used by automation scripts.
+Do NOT change these in the translation. -->
+
+<date>2001-10-18</date>
+<releaseinfo>%{VERSION}</releaseinfo>
+
+<!-- Abstract about this handbook -->
+
+<abstract>
+<para>
+&appname; is an application specially designed to do nothing you would
+ever want.
+</para>
+</abstract>
+
+<!-- This is a set of Keywords for indexing by search engines.
+Please at least include KDE, the KDE package it is in, the name
+ of your application, and a few relevant keywords. -->
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>%{APPNAME}</keyword>
+<keyword>nothing</keyword>
+<keyword>nothing else</keyword>
+</keywordset>
+
+</bookinfo>
+
+<!-- The contents of the documentation begin here. Label
+each chapter so with the id attribute. This is necessary for two reasons: it
+allows you to easily reference the chapter from other chapters of your
+document, and if there is no ID, the name of the generated HTML files will vary
+from time to time making it hard to manage for maintainers and for the CVS
+system. Any chapter labelled (OPTIONAL) may be left out at the author's
+discretion. Other chapters should not be left out in order to maintain a
+consistent documentation style across all KDE apps. -->
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+<!-- The introduction chapter contains a brief introduction for the
+application that explains what it does and where to report
+problems. Basically a long version of the abstract. Don't include a
+revision history. (see installation appendix comment) -->
+
+<para>
+&appname; is a program that lets you do absolutely nothing. Please report
+any problems or feature requests to the &kde; mailing lists.
+</para>
+</chapter>
+
+<chapter id="using-appname">
+<title>Using &appname;</title>
+
+<!-- This chapter should tell the user how to use your app. You should use as
+many sections (Chapter, Sect1, Sect3, etc...) as is necessary to fully document
+your application. -->
+
+<para>
+
+<!-- Note that all graphics should be in .png format. Use no gifs because of
+patent issues. -->
+
+<screenshot>
+<screeninfo>Here's a screenshot of &appname;</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot.png" format="PNG"/>
+ </imageobject>
+ <imageobject>
+ <imagedata fileref="screenshot.eps" format="EPS"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+
+<sect1 id="appname-features">
+<title>More &appname; features</title>
+
+<para>It slices! It dices! and it comes with a free toaster!</para>
+<para>
+The Squiggle Tool <guiicon><inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="squiggle.png" format="PNG"/>
+ </imageobject>
+ <imageobject>
+ <imagedata fileref="squiggle.eps" format="EPS"/>
+ </imageobject>
+ <textobject>
+ <phrase>Squiggle</phrase>
+ </textobject>
+</inlinemediaobject></guiicon> is used to draw squiggly lines all over
+the &appname; main window. It's not a bug, it's a feature!
+</para>
+
+</sect1>
+</chapter>
+
+<chapter id="commands">
+<title>Command Reference</title>
+
+<!-- (OPTIONAL, BUT RECOMMENDED) This chapter should list all of the
+application windows and their menubar and toolbar commands for easy reference.
+Also include any keys that have a special function but have no equivalent in the
+menus or toolbars. This may not be necessary for small apps or apps with no tool
+or menu bars. -->
+
+<sect1 id="appname-mainwindow">
+<title>The main &appname; window</title>
+
+<sect2>
+<title>The File Menu</title>
+<para>
+<variablelist>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>N</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>New</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Creates a new document</action></para></listitem>
+</varlistentry>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>S</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Save</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Saves the document</action></para></listitem>
+</varlistentry>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>Q</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Quit</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Quits</action> &appname;</para></listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+</sect2>
+
+<sect2>
+<title>The <guimenu>Help</guimenu> Menu</title>
+
+<!-- Assuming you have a standard help menu (help, what's this, about -->
+<!-- &appname;, about KDE) then the documentation is already written. -->
+<!-- The following entity is valid anywhere that a variablelist is -->
+<!-- valid. -->
+
+&help.menu.documentation;
+
+</sect2>
+
+</sect1>
+</chapter>
+
+<chapter id="developers">
+<title>Developer's Guide to &appname;</title>
+
+<!-- (OPTIONAL) A Programming/Scripting reference chapter should be
+used for apps that use plugins or that provide their own scripting hooks
+and/or development libraries. -->
+
+<para>
+Programming &appname; plugins is a joy to behold. Just read through the next
+66 pages of API's to learn how!
+</para>
+
+<!-- Use refentries to describe APIs. Refentries are fairly complicated and you
+should consult the docbook reference for further details. The example below was
+taken from that reference and shortened a bit for readability. -->
+
+<refentry id="re-1007-unmanagechildren-1">
+<refmeta>
+<refentrytitle>XtUnmanageChildren</refentrytitle>
+<refmiscinfo>Xt - Geometry Management</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>XtUnmanageChildren
+</refname>
+<refpurpose>remove a list of children from a parent widget's managed
+list.
+<indexterm id="ix-1007-unmanagechildren-1"><primary>widgets</primary><secondary>removing</secondary></indexterm>
+<indexterm id="ix-1007-unmanagechildren-2"><primary>XtUnmanageChildren</primary></indexterm>
+</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv>
+<refsynopsisdivinfo>
+<date>4 March 1996</date>
+</refsynopsisdivinfo>
+<synopsis>
+void XtUnmanageChildren(<replaceable class="parameter">children</replaceable>, <replaceable class="parameter">num_children</replaceable>)
+ WidgetList <replaceable class="parameter">children</replaceable>;
+ Cardinal <replaceable class="parameter">num_children</replaceable>;
+</synopsis>
+
+<refsect2 id="r2-1007-unmanagechildren-1">
+<title>Inputs</title>
+<variablelist>
+<varlistentry>
+<term><replaceable class="parameter">children</replaceable>
+</term>
+<listitem>
+<para>Specifies an array of child widgets. Each child must be of
+class RectObj or any subclass thereof.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><replaceable class="parameter">num_children</replaceable>
+</term>
+<listitem>
+<para>Specifies the number of elements in <replaceable class="parameter">children</replaceable>.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refsect2></refsynopsisdiv>
+
+<refsect1 id="r1-1007-unmanagechildren-1">
+<title>Description
+</title>
+<para><function>XtUnmanageChildren()</function> unmaps the specified widgets
+and removes them from their parent's geometry management.
+The widgets will disappear from the screen, and (depending
+on its parent) may no longer have screen space allocated for
+them.
+</para>
+<para>Each of the widgets in the <replaceable class="parameter">children</replaceable> array must have
+the same parent.
+</para>
+<para>See the &ldquo;Algorithm&rdquo; section below for full details of the
+widget unmanagement procedure.
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-2">
+<title>Usage</title>
+<para>Unmanaging widgets is the usual method for temporarily
+making them invisible. They can be re-managed with
+<function>XtManageChildren()</function>.
+</para>
+<para>You can unmap a widget, but leave it under geometry
+management by calling <function>XtUnmapWidget()</function>. You can
+destroy a widget's window without destroying the widget by
+calling <function>XtUnrealizeWidget()</function>. You can destroy a
+widget completely with <function>XtDestroyWidget()</function>.
+</para>
+<para>If you are only going to unmanage a single widget, it is
+more convenient to call <function>XtUnmanageChild()</function>. It is
+often more convenient to call <function>XtUnmanageChild()</function>
+several times than it is to declare and initialize an array
+of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
+<function>XtUnmanageChildren()</function> is more efficient, however,
+because it only calls the parent's <function>change_managed()</function>
+method once.
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-3">
+<title>Algorithm
+</title>
+<para><function>XtUnmanageChildren()</function> performs the following:
+</para>
+<variablelist>
+<varlistentry>
+<term>-
+</term>
+<listitem>
+<para>Ignores the child if it already is unmanaged or is being
+destroyed.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>-
+</term>
+<listitem>
+<para>Otherwise, if the child is realized, it makes it nonvisible
+by unmapping it.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-4">
+<title>Structures</title>
+<para>The <type>WidgetList</type> type is simply an array of widgets:
+</para>
+<screen id="sc-1007-unmanagechildren-1">typedef Widget *WidgetList;
+</screen>
+</refsect1>
+</refentry>
+
+</chapter>
+
+<chapter id="faq">
+<title>Questions and Answers</title>
+
+<!-- (OPTIONAL but recommended) This chapter should include all of the silly
+(and not-so-silly) newbie questions that fill up your mailbox. This chapter
+should be reserved for BRIEF questions and answers! If one question uses more
+than a page or so then it should probably be part of the
+"Using this Application" chapter instead. You should use links to
+cross-reference questions to the parts of your documentation that answer them.
+This is also a great place to provide pointers to other FAQ's if your users
+must do some complicated configuration on other programs in order for your
+application work. -->
+
+&reporting.bugs;
+&updating.documentation;
+
+<qandaset id="faqlist">
+<qandaentry>
+<question>
+<para>My Mouse doesn't work. How do I quit &appname;?</para>
+</question>
+<answer>
+<para>You silly goose! Check out the <link linkend="commands">Commands
+Section</link> for the answer.</para>
+</answer>
+</qandaentry>
+<qandaentry>
+<question>
+<para>Why can't I twiddle my documents?</para>
+</question>
+<answer>
+<para>You can only twiddle your documents if you have the foobar.lib
+installed.</para>
+</answer>
+</qandaentry>
+</qandaset>
+</chapter>
+
+<chapter id="credits">
+
+<!-- Include credits for the programmers, documentation writers, and
+contributors here. The license for your software should then be included below
+the credits with a reference to the appropriate license file included in the KDE
+distribution. -->
+
+<title>Credits and License</title>
+
+<para>
+&appname;
+</para>
+<para>
+Program copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
+</para>
+<para>
+Contributors:
+<itemizedlist>
+<listitem><para>Konqui the KDE Dragon <email>[email protected]</email></para>
+</listitem>
+<listitem><para>Tux the Linux Penguin <email>[email protected]</email></para>
+</listitem>
+</itemizedlist>
+</para>
+
+<para>
+Documentation copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underFDL; <!-- FDL: do not remove -->
+
+<!-- Determine which license your application is licensed under,
+ and delete all the remaining licenses below:
+
+ (NOTE: All documentation are licensed under the FDL,
+ regardless of what license the application uses) -->
+
+&underGPL; <!-- GPL License -->
+&underBSDLicense; <!-- BSD License -->
+&underArtisticLicense; <!-- BSD Artistic License -->
+&underX11License; <!-- X11 License -->
+
+</chapter>
+
+<appendix id="installation">
+<title>Installation</title>
+
+<sect1 id="getting-appname">
+<title>How to obtain &appname;</title>
+
+<!-- This first entity contains boiler plate for applications that are
+part of KDE CVS. You should remove it if you are releasing your
+application -->
+
+&install.intro.documentation;
+
+</sect1>
+
+<sect1 id="requirements">
+<title>Requirements</title>
+
+<!--
+List any special requirements for your application here. This should include:
+.Libraries or other software that is not included in kdesupport,
+kdelibs, or kdebase.
+.Hardware requirements like amount of RAM, disk space, graphics card
+capabilities, screen resolution, special expansion cards, etc.
+.Operating systems the app will run on. If your app is designed only for a
+specific OS, (you wrote a graphical LILO configurator for example) put this
+information here.
+-->
+
+<para>
+In order to successfully use &appname;, you need &kde; 1.1. Foobar.lib is
+required in order to support the advanced &appname; features. &appname; uses
+about 5 megs of memory to run, but this may vary depending on your
+platform and configuration.
+</para>
+
+<para>
+All required libraries as well as &appname; itself can be found
+on <ulink url="ftp://ftp.appname.org">The &appname; home page</ulink>.
+</para>
+
+<!-- For a list of updates, you may refer to the application web site
+or the ChangeLog file, or ... -->
+<para>
+You can find a list of changes at <ulink
+url="http://apps.kde.org/appname">http://apps.kde.org/appname</ulink>.
+</para>
+</sect1>
+
+<sect1 id="compilation">
+<title>Compilation and Installation</title>
+
+<!-- This entity contains the boilerplate text for standard -->
+<!-- compilation instructions. If your application requires any -->
+<!-- special handling, remove it, and replace with your own text. -->
+
+&install.compile.documentation;
+
+</sect1>
+
+<sect1 id="configuration">
+<title>Configuration</title>
+
+<para>Don't forget to tell your system to start the <filename>dtd</filename>
+dicer-toaster daemon first, or &appname; won't work !</para>
+
+</sect1>
+
+</appendix>
+
+&documentation.index;
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+vim:tabstop=2:shiftwidth=2:expandtab
+-->
+
diff --git a/app_templates/kdeutility/po/README b/app_templates/kdeutility/po/README
new file mode 100644
index 0000000..0e18f16
--- /dev/null
+++ b/app_templates/kdeutility/po/README
@@ -0,0 +1 @@
+.pot and .pot translation files should be placed here.
diff --git a/app_templates/kdeutility/setup.py b/app_templates/kdeutility/setup.py
new file mode 100755
index 0000000..ff51c10
--- /dev/null
+++ b/app_templates/kdeutility/setup.py
@@ -0,0 +1,31 @@
+#!/usr/bin/python
+###########################################################################
+# setup - description #
+# ------------------------------ #
+# begin : Fri Jun 27 2005 #
+# copyright : (C) 2005 by AUTHOR #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+###########################################################################
+
+import kdedistutils
+
+kdedistutils.setup(name="kdeutility",
+ version="0.1.0",
+ author="AUTHOR",
+ author_email="[email protected]",
+ url="http://www.TESTAPP.com/",
+ min_kde_version = "3.0.0",
+ min_qt_version = "3.0.0",
+ license = "GPL",
+ application_data = ['src/kdeutility.py','src/KDEUtilityDialogUI.ui'],
+ executable_links = [('kdeutility','kdeutility.py')],
+ docbooks = [ ('doc/en','en') ],
+ i18n = ('po',['src']) )
diff --git a/app_templates/kdeutility/src/KDEUtilityDialogUI.ui b/app_templates/kdeutility/src/KDEUtilityDialogUI.ui
new file mode 100644
index 0000000..af12ef1
--- /dev/null
+++ b/app_templates/kdeutility/src/KDEUtilityDialogUI.ui
@@ -0,0 +1,33 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>KDEUtilityDialogUI</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>KDEUtilityDialogUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>KDE Utility</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>hellobutton</cstring>
+ </property>
+ <property name="text">
+ <string>Hello, Good bye</string>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/app_templates/kdeutility/src/hi16-app-kdeutility.png b/app_templates/kdeutility/src/hi16-app-kdeutility.png
new file mode 100644
index 0000000..40fe05e
--- /dev/null
+++ b/app_templates/kdeutility/src/hi16-app-kdeutility.png
@@ -0,0 +1,8 @@
+�PNG
+
+
+IHDR
+���5� M�Z��fθ92@�
+��2w�l�A;�v�c)�\)��/l F�\��ϓ���~��S���X�Ŧ�=t�j�76��{rumu��_��% ��}�f�b{�Z��RdY�7�C2�TWՓ�Ӳ��O>�f�X�G�ȵ��,F�&/#�x<��&P��%]E��ܖC�f U��S����
+"�l+�*���J�ǰ�M��Jde���9Hz�]�qT�P�B�I��
+��}���Q����� �bR��������� �]�nv��bf,�û����:�L�d�4��PuC����7��AK �\��^�ϟ=.~�����|َ2�w��|x��w��N�Vd/RK��6���+����ɤ�����Ħ�7fmc�5� hr�96�M�D#x�=Ia�ނOHxc�7=# �U�D��oV�i
diff --git a/app_templates/kdeutility/src/hi32-app-kdeutility.png b/app_templates/kdeutility/src/hi32-app-kdeutility.png
new file mode 100644
index 0000000..8a6093e
--- /dev/null
+++ b/app_templates/kdeutility/src/hi32-app-kdeutility.png
@@ -0,0 +1,26 @@
+�PNG
+
+
+IHDR
+:IDATx���{�\�}�?w�y�;;���}`�����k̲~&�q�R�- H��Gpk
+PPJ�&(
+�J��EQ���4Iq QDHC~D6��Bص�׮ٵٝ��̝�;�;��?f�1� i{���+]������}��k��_åòB��e,ˢ3��֖6�Tض�3'�``��Ie�m=����������}�j���^�w��O<w�Y��kV_�˺�x�,��M��?�.���x!��c�Č�l�8����v��oZ�������;ퟙ<��r�V���͌O���>���\O����z��U#fh�a7��Y��I5�r엇�������@�[
+>�u;�j����o���Qk╳�?���ڕkq�
+��-��t/�E(�tB ��06 �se_���������?���u����7���сQ3�r)%�H+B
+��֎6���CHW��RШ7ؾk33��M���_<dzGf�X�bq���@�YӷƬ\o֭Z��8�B!</MP X�i-�z�J�����A(AH�HG�D\�fcTJe��kV �a� l��Yk�/�r� �
+�:.��b��X,�[w�s� � �yh�)
+�t�������a#� �H㶸��>g�~�So
+�/�Y58ȗ���$�i������TJjA
+�5���0�>
+n���t�Mt?���gj|�#O=�]���d۶ȕr(���߱��z'N���̐��)�E
+�<A�BP�0��[,��f���T�R �Va#� �����_y����3z�&˛K��gAP�T�Bcp��n�o�&��+���N�If�S9�~*K�˒�ҌM�Q(�MͲ�����S�FHA(d��Dj�m�B`�aﭷ������fh��z���
+c ӳ
+PJ��8^*K.�����
+�OP �>���(�--H��, �$�R�j9 ���'�$�����z��1�C/���;8�� >�|p�-�����Z��f�RY�x?�%7�!���%���c+EĪѡ�m�mb��#I��3x� A�B��3vn�F��4����qv���S�����u�B��BI�T
+G)�^s�~*G&�b~.N46ǩ3�H����H���_lϻ%�:ґ�m-dbi\��
+YT�R~
+�3�`��ʮ
+��x�S�(W˖eY��,8��a{�Qn���f�*�0%�����I��]
+�U�ܲ!�Eg�(6-���:.JJ�T�EZ ��^:E$�r��b�j�q�K*�"��͖L\
+i#�h��h-�ƖM[���rή�Gk� e���TN�r�b�H6�ʼn��/���? h�e3�����Z���B��T�l��*J6�])���X ?��C{G�ZG�Q���L�T!�ʒMd�DS�/Y��C�^�]M[?~�������/�E,��T(�B�\�o���ղ,����g}�<�| �h0��[,_�� H'<�ٸG*��5W�fI������ZX�y������m��/��%�u�MTk5�X�a�Ek��� �d��p���O������e�+(�$gb���\8���/�
+���l!0��Z�W'^]�,���B�wؼz�F��%����9-��+ڮ��h�Χ�,�����b�����l�\l4f7
diff --git a/app_templates/kdeutility/src/kdeutility.desktop b/app_templates/kdeutility/src/kdeutility.desktop
new file mode 100644
index 0000000..2787759
--- /dev/null
+++ b/app_templates/kdeutility/src/kdeutility.desktop
@@ -0,0 +1,35 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=$APPNAME$
+Exec=$APPNAMELC$ %i %m -caption "%c"
+Icon=$APPNAMELC$
+Type=Application
+DocPath=$APPNAMELC$/$APPNAMELC$.html
+Comment=A KDE KPart Application
+Comment[ca]=Una aplicació KPart per a KDE
+Comment[cy]=Cymhwysiad KPart KDE
+Comment[da]=Et KDE KPart program
+Comment[de]=Eine KDE-Komponenten-Anwendung
+Comment[el]=Μια εφαρμογή KPart του KDE
+Comment[es]=Una aplicación KPart de KDE
+Comment[et]=KDE KPart rakendus
+Comment[fr]=Une application KPart pour KDE.
+Comment[hi]=एक केडीई के-पार्ट अनुप्रयोग
+Comment[hu]=KPart-alapú KDE-alkalmazás
+Comment[is]=KDE KPart forrit
+Comment[it]=Applicazione KPart di KDE
+Comment[ja]=KDE KPart アプリケーション
+Comment[nb]=Et KDE KPart-program
+Comment[nl]=Een KDE KPart-toepassing
+Comment[pl]=Aplikacja KDE
+Comment[pt]=Uma aplicação KPart do KDE
+Comment[pt_BR]=Um Aplicativo KPart do KDE
+Comment[ru]=Приложение KPart для KDE
+Comment[sl]=Program KPart za KDE
+Comment[sr]=KDE KPart програм
+Comment[sr@Latn]=KDE KPart program
+Comment[sv]=Ett KDE Kpart-program
+Comment[ta]=கெடி கெபார்ட் பயன்பாடு
+Comment[tg]=Ба кор андохтани KPart барои KDE
+Comment[zh_CN]=一个 KDE KPart 应用程序
+Terminal=0
diff --git a/app_templates/kdeutility/src/kdeutility.lsm b/app_templates/kdeutility/src/kdeutility.lsm
new file mode 100644
index 0000000..43d0d5f
--- /dev/null
+++ b/app_templates/kdeutility/src/kdeutility.lsm
@@ -0,0 +1,16 @@
+Begin3
+Title: $APPNAME$ -- Some description
+Version: $VERSION$
+Entered-date:
+Description:
+Keywords: KDE Qt
+Author: $AUTHOR$ <$EMAIL$>
+Maintained-by: $AUTHOR$ <$EMAIL$>
+Home-page:
+Alternate-site:
+Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
+ xxxxxx $APPNAMELC$-$VERSION$.tar.gz
+ xxx $APPNAMELC$-$VERSION$.lsm
+Platform: Linux. Needs KDE
+Copying-policy: $LICENSE$
+End
diff --git a/app_templates/kdeutility/src/kdeutility.py b/app_templates/kdeutility/src/kdeutility.py
new file mode 100755
index 0000000..e2849fe
--- /dev/null
+++ b/app_templates/kdeutility/src/kdeutility.py
@@ -0,0 +1,51 @@
+#!/usr/bin/python
+###########################################################################
+# kdeutility - description #
+# ------------------------------ #
+# begin : Mon May 2 2005 #
+# copyright : (C) 2005 by AUTHOR #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+###########################################################################
+
+import sys
+from qt import *
+from kdecore import *
+from kdeui import *
+import kdedesigner
+from KDEUtilityDialogUI import *
+
+description = "A KDE Utility"
+version = "0.1";
+
+class KDEUtilityDialog(KDEUtilityDialogUI):
+ def __init__(self):
+ KDEUtilityDialogUI.__init__(self,None,"TestApp")
+ # Add other methods, slots and signals here.
+
+
+options = [] # No command line options.
+
+def main():
+ global kapp,version,description,options
+
+ aboutdata = KAboutData("kdeutility", "KdeUtility", version, description, \
+ KAboutData.License_GPL, "(C) 2005 AUTHOR", None, None, "[email protected]")
+ aboutdata.addAuthor("AUTHOR", None, "[email protected]")
+ KCmdLineArgs.init(sys.argv,aboutdata)
+ #KCmdLineArgs.addCmdLineOptions(options)
+ kapp = KApplication()
+
+ dialog = KDEUtilityDialog()
+ kapp.setMainWidget(dialog)
+ dialog.show()
+
+ return kapp.exec_loop()
+main()
diff --git a/app_templates/kioslave/AUTHORS b/app_templates/kioslave/AUTHORS
new file mode 100644
index 0000000..0463c0d
--- /dev/null
+++ b/app_templates/kioslave/AUTHORS
@@ -0,0 +1 @@
+$AUTHOR$ <$EMAIL$>
diff --git a/app_templates/kioslave/COPYING b/app_templates/kioslave/COPYING
new file mode 100644
index 0000000..c13faf0
--- /dev/null
+++ b/app_templates/kioslave/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/app_templates/kioslave/ChangeLog b/app_templates/kioslave/ChangeLog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kioslave/ChangeLog
diff --git a/app_templates/kioslave/INSTALL b/app_templates/kioslave/INSTALL
new file mode 100644
index 0000000..b94cd85
--- /dev/null
+++ b/app_templates/kioslave/INSTALL
@@ -0,0 +1,43 @@
+Basic Installation
+==================
+These are generic installation instructions.
+
+This software uses the Python language's distutils system for installation.
+A detailed guide for users and system administrators to using distutils to
+install software can be found here:
+
+ http://docs.python.org/inst/inst.html
+
+The simplest way to install this software is to run the following command as
+the root user:
+
+ python setup.py install
+
+The setup.py script will automatically detect the directories to use for
+documentation, binaries and other software files.
+
+
+Uninstallation
+==============
+During installation setup.py creates list of files and directories that
+were installed in a file called install_log.txt.
+
+ python setup.py uninstall
+
+
+Installing into an alternate root
+=================================
+For packaging purposes it is often very useful to be able to install all files
+relative not to the usual root directory (/) but into an alternative
+directory.
+
+ python setup.py install --root=/tmp/alternativeroot/
+
+
+Operation Controls
+==================
+--verbose
+ Print more information about what setup.py is doing.
+
+--help
+ Print a summary of the options to setup.py, and exit.
diff --git a/app_templates/kioslave/MANIFEST.in b/app_templates/kioslave/MANIFEST.in
new file mode 100644
index 0000000..c2dde3f
--- /dev/null
+++ b/app_templates/kioslave/MANIFEST.in
@@ -0,0 +1,6 @@
+recursive-include doc *.docbook *.png
+recursive-include po *.po *.pot
+include AUTHORS ChangeLog COPYING INSTALL MANIFEST.in NEWS README TODO
+global-include *.desktop *.py *.ui *.png *.lsm
+global-exclude *~ .svn
+global-exclude *~ .cvs
diff --git a/app_templates/kioslave/NEWS b/app_templates/kioslave/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kioslave/NEWS
diff --git a/app_templates/kioslave/README b/app_templates/kioslave/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kioslave/README
diff --git a/app_templates/kioslave/TODO b/app_templates/kioslave/TODO
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app_templates/kioslave/TODO
diff --git a/app_templates/kioslave/doc/en/index.docbook b/app_templates/kioslave/doc/en/index.docbook
new file mode 100644
index 0000000..325987f
--- /dev/null
+++ b/app_templates/kioslave/doc/en/index.docbook
@@ -0,0 +1,555 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+ <!ENTITY appname "<application>MyApplicaition 0.1</application>">
+ <!ENTITY kappname "&appname;"><!-- Do *not* replace kappname-->
+ <!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc -->
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE"><!-- change language only here -->
+
+
+ <!-- Do not define any other entities; instead, use the entities
+ from kde-genent.entities and $LANG/user.entities. -->
+]>
+<!-- kdoctemplate v0.8 October 1 1999
+ Minor update to "Credits and Licenses" section on August 24, 2000
+ Removed "Revision history" section on 22 January 2001
+ Changed to Installation/Help menu entities 18 October 2001
+ Other minor cleanup and changes 18 October 2001 -->
+
+
+<!--
+This template was designed by: David Rugge [email protected]
+with lots of help from: Eric Bischoff [email protected]
+and Frederik Fouvry [email protected]
+of the KDE DocBook team.
+
+You may freely use this template for writing any sort of KDE documentation.
+If you have any changes or improvements, please let us know.
+
+Remember:
+- in XML, the case of the <tags> and attributes is relevant ;
+- also, quote all attributes.
+
+Please don't forget to remove all these comments in your final documentation,
+thanks ;-).
+-->
+
+<!-- ................................................................ -->
+
+<!-- The language must NOT be changed here. -->
+
+<book lang="&language;">
+
+<!-- This header contains all of the meta-information for the document such
+as Authors, publish date, the abstract, and Keywords -->
+
+<bookinfo>
+<title>The &appname; Handbook</title>
+
+<authorgroup>
+<author>
+<firstname></firstname>
+<othername></othername>
+<surname>%{AUTHOR}</surname>
+<affiliation>
+<address><email>%{EMAIL}</email></address>
+</affiliation>
+</author>
+</authorgroup>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+<copyright>
+<year>1999</year>
+<year>%{YEAR}</year>
+<holder>%{AUTHOR}</holder>
+</copyright>
+<!-- Translators: put here the copyright notice of the translation -->
+<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
+ and in the FDL itself on how to use it. -->
+<legalnotice>&FDLNotice;</legalnotice>
+
+<!-- Date and version information of the documentation
+Don't forget to include this last date and this last revision number, we
+need them for translation coordination !
+Please respect the format of the date (YYYY-MM-DD) and of the version
+(V.MM.LL), it could be used by automation scripts.
+Do NOT change these in the translation. -->
+
+<date>2001-10-18</date>
+<releaseinfo>%{VERSION}</releaseinfo>
+
+<!-- Abstract about this handbook -->
+
+<abstract>
+<para>
+&appname; is an application specially designed to do nothing you would
+ever want.
+</para>
+</abstract>
+
+<!-- This is a set of Keywords for indexing by search engines.
+Please at least include KDE, the KDE package it is in, the name
+ of your application, and a few relevant keywords. -->
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>%{APPNAME}</keyword>
+<keyword>nothing</keyword>
+<keyword>nothing else</keyword>
+</keywordset>
+
+</bookinfo>
+
+<!-- The contents of the documentation begin here. Label
+each chapter so with the id attribute. This is necessary for two reasons: it
+allows you to easily reference the chapter from other chapters of your
+document, and if there is no ID, the name of the generated HTML files will vary
+from time to time making it hard to manage for maintainers and for the CVS
+system. Any chapter labelled (OPTIONAL) may be left out at the author's
+discretion. Other chapters should not be left out in order to maintain a
+consistent documentation style across all KDE apps. -->
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+<!-- The introduction chapter contains a brief introduction for the
+application that explains what it does and where to report
+problems. Basically a long version of the abstract. Don't include a
+revision history. (see installation appendix comment) -->
+
+<para>
+&appname; is a program that lets you do absolutely nothing. Please report
+any problems or feature requests to the &kde; mailing lists.
+</para>
+</chapter>
+
+<chapter id="using-appname">
+<title>Using &appname;</title>
+
+<!-- This chapter should tell the user how to use your app. You should use as
+many sections (Chapter, Sect1, Sect3, etc...) as is necessary to fully document
+your application. -->
+
+<para>
+
+<!-- Note that all graphics should be in .png format. Use no gifs because of
+patent issues. -->
+
+<screenshot>
+<screeninfo>Here's a screenshot of &appname;</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot.png" format="PNG"/>
+ </imageobject>
+ <imageobject>
+ <imagedata fileref="screenshot.eps" format="EPS"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+
+<sect1 id="appname-features">
+<title>More &appname; features</title>
+
+<para>It slices! It dices! and it comes with a free toaster!</para>
+<para>
+The Squiggle Tool <guiicon><inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="squiggle.png" format="PNG"/>
+ </imageobject>
+ <imageobject>
+ <imagedata fileref="squiggle.eps" format="EPS"/>
+ </imageobject>
+ <textobject>
+ <phrase>Squiggle</phrase>
+ </textobject>
+</inlinemediaobject></guiicon> is used to draw squiggly lines all over
+the &appname; main window. It's not a bug, it's a feature!
+</para>
+
+</sect1>
+</chapter>
+
+<chapter id="commands">
+<title>Command Reference</title>
+
+<!-- (OPTIONAL, BUT RECOMMENDED) This chapter should list all of the
+application windows and their menubar and toolbar commands for easy reference.
+Also include any keys that have a special function but have no equivalent in the
+menus or toolbars. This may not be necessary for small apps or apps with no tool
+or menu bars. -->
+
+<sect1 id="appname-mainwindow">
+<title>The main &appname; window</title>
+
+<sect2>
+<title>The File Menu</title>
+<para>
+<variablelist>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>N</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>New</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Creates a new document</action></para></listitem>
+</varlistentry>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>S</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Save</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Saves the document</action></para></listitem>
+</varlistentry>
+<varlistentry>
+<term><menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>Q</keycap></keycombo>
+</shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Quit</guimenuitem>
+</menuchoice></term>
+<listitem><para><action>Quits</action> &appname;</para></listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+</sect2>
+
+<sect2>
+<title>The <guimenu>Help</guimenu> Menu</title>
+
+<!-- Assuming you have a standard help menu (help, what's this, about -->
+<!-- &appname;, about KDE) then the documentation is already written. -->
+<!-- The following entity is valid anywhere that a variablelist is -->
+<!-- valid. -->
+
+&help.menu.documentation;
+
+</sect2>
+
+</sect1>
+</chapter>
+
+<chapter id="developers">
+<title>Developer's Guide to &appname;</title>
+
+<!-- (OPTIONAL) A Programming/Scripting reference chapter should be
+used for apps that use plugins or that provide their own scripting hooks
+and/or development libraries. -->
+
+<para>
+Programming &appname; plugins is a joy to behold. Just read through the next
+66 pages of API's to learn how!
+</para>
+
+<!-- Use refentries to describe APIs. Refentries are fairly complicated and you
+should consult the docbook reference for further details. The example below was
+taken from that reference and shortened a bit for readability. -->
+
+<refentry id="re-1007-unmanagechildren-1">
+<refmeta>
+<refentrytitle>XtUnmanageChildren</refentrytitle>
+<refmiscinfo>Xt - Geometry Management</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>XtUnmanageChildren
+</refname>
+<refpurpose>remove a list of children from a parent widget's managed
+list.
+<indexterm id="ix-1007-unmanagechildren-1"><primary>widgets</primary><secondary>removing</secondary></indexterm>
+<indexterm id="ix-1007-unmanagechildren-2"><primary>XtUnmanageChildren</primary></indexterm>
+</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv>
+<refsynopsisdivinfo>
+<date>4 March 1996</date>
+</refsynopsisdivinfo>
+<synopsis>
+void XtUnmanageChildren(<replaceable class="parameter">children</replaceable>, <replaceable class="parameter">num_children</replaceable>)
+ WidgetList <replaceable class="parameter">children</replaceable>;
+ Cardinal <replaceable class="parameter">num_children</replaceable>;
+</synopsis>
+
+<refsect2 id="r2-1007-unmanagechildren-1">
+<title>Inputs</title>
+<variablelist>
+<varlistentry>
+<term><replaceable class="parameter">children</replaceable>
+</term>
+<listitem>
+<para>Specifies an array of child widgets. Each child must be of
+class RectObj or any subclass thereof.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><replaceable class="parameter">num_children</replaceable>
+</term>
+<listitem>
+<para>Specifies the number of elements in <replaceable class="parameter">children</replaceable>.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refsect2></refsynopsisdiv>
+
+<refsect1 id="r1-1007-unmanagechildren-1">
+<title>Description
+</title>
+<para><function>XtUnmanageChildren()</function> unmaps the specified widgets
+and removes them from their parent's geometry management.
+The widgets will disappear from the screen, and (depending
+on its parent) may no longer have screen space allocated for
+them.
+</para>
+<para>Each of the widgets in the <replaceable class="parameter">children</replaceable> array must have
+the same parent.
+</para>
+<para>See the &ldquo;Algorithm&rdquo; section below for full details of the
+widget unmanagement procedure.
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-2">
+<title>Usage</title>
+<para>Unmanaging widgets is the usual method for temporarily
+making them invisible. They can be re-managed with
+<function>XtManageChildren()</function>.
+</para>
+<para>You can unmap a widget, but leave it under geometry
+management by calling <function>XtUnmapWidget()</function>. You can
+destroy a widget's window without destroying the widget by
+calling <function>XtUnrealizeWidget()</function>. You can destroy a
+widget completely with <function>XtDestroyWidget()</function>.
+</para>
+<para>If you are only going to unmanage a single widget, it is
+more convenient to call <function>XtUnmanageChild()</function>. It is
+often more convenient to call <function>XtUnmanageChild()</function>
+several times than it is to declare and initialize an array
+of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
+<function>XtUnmanageChildren()</function> is more efficient, however,
+because it only calls the parent's <function>change_managed()</function>
+method once.
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-3">
+<title>Algorithm
+</title>
+<para><function>XtUnmanageChildren()</function> performs the following:
+</para>
+<variablelist>
+<varlistentry>
+<term>-
+</term>
+<listitem>
+<para>Ignores the child if it already is unmanaged or is being
+destroyed.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>-
+</term>
+<listitem>
+<para>Otherwise, if the child is realized, it makes it nonvisible
+by unmapping it.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-4">
+<title>Structures</title>
+<para>The <type>WidgetList</type> type is simply an array of widgets:
+</para>
+<screen id="sc-1007-unmanagechildren-1">typedef Widget *WidgetList;
+</screen>
+</refsect1>
+</refentry>
+
+</chapter>
+
+<chapter id="faq">
+<title>Questions and Answers</title>
+
+<!-- (OPTIONAL but recommended) This chapter should include all of the silly
+(and not-so-silly) newbie questions that fill up your mailbox. This chapter
+should be reserved for BRIEF questions and answers! If one question uses more
+than a page or so then it should probably be part of the
+"Using this Application" chapter instead. You should use links to
+cross-reference questions to the parts of your documentation that answer them.
+This is also a great place to provide pointers to other FAQ's if your users
+must do some complicated configuration on other programs in order for your
+application work. -->
+
+&reporting.bugs;
+&updating.documentation;
+
+<qandaset id="faqlist">
+<qandaentry>
+<question>
+<para>My Mouse doesn't work. How do I quit &appname;?</para>
+</question>
+<answer>
+<para>You silly goose! Check out the <link linkend="commands">Commands
+Section</link> for the answer.</para>
+</answer>
+</qandaentry>
+<qandaentry>
+<question>
+<para>Why can't I twiddle my documents?</para>
+</question>
+<answer>
+<para>You can only twiddle your documents if you have the foobar.lib
+installed.</para>
+</answer>
+</qandaentry>
+</qandaset>
+</chapter>
+
+<chapter id="credits">
+
+<!-- Include credits for the programmers, documentation writers, and
+contributors here. The license for your software should then be included below
+the credits with a reference to the appropriate license file included in the KDE
+distribution. -->
+
+<title>Credits and License</title>
+
+<para>
+&appname;
+</para>
+<para>
+Program copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
+</para>
+<para>
+Contributors:
+<itemizedlist>
+<listitem><para>Konqui the KDE Dragon <email>[email protected]</email></para>
+</listitem>
+<listitem><para>Tux the Linux Penguin <email>[email protected]</email></para>
+</listitem>
+</itemizedlist>
+</para>
+
+<para>
+Documentation copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underFDL; <!-- FDL: do not remove -->
+
+<!-- Determine which license your application is licensed under,
+ and delete all the remaining licenses below:
+
+ (NOTE: All documentation are licensed under the FDL,
+ regardless of what license the application uses) -->
+
+&underGPL; <!-- GPL License -->
+&underBSDLicense; <!-- BSD License -->
+&underArtisticLicense; <!-- BSD Artistic License -->
+&underX11License; <!-- X11 License -->
+
+</chapter>
+
+<appendix id="installation">
+<title>Installation</title>
+
+<sect1 id="getting-appname">
+<title>How to obtain &appname;</title>
+
+<!-- This first entity contains boiler plate for applications that are
+part of KDE CVS. You should remove it if you are releasing your
+application -->
+
+&install.intro.documentation;
+
+</sect1>
+
+<sect1 id="requirements">
+<title>Requirements</title>
+
+<!--
+List any special requirements for your application here. This should include:
+.Libraries or other software that is not included in kdesupport,
+kdelibs, or kdebase.
+.Hardware requirements like amount of RAM, disk space, graphics card
+capabilities, screen resolution, special expansion cards, etc.
+.Operating systems the app will run on. If your app is designed only for a
+specific OS, (you wrote a graphical LILO configurator for example) put this
+information here.
+-->
+
+<para>
+In order to successfully use &appname;, you need &kde; 1.1. Foobar.lib is
+required in order to support the advanced &appname; features. &appname; uses
+about 5 megs of memory to run, but this may vary depending on your
+platform and configuration.
+</para>
+
+<para>
+All required libraries as well as &appname; itself can be found
+on <ulink url="ftp://ftp.appname.org">The &appname; home page</ulink>.
+</para>
+
+<!-- For a list of updates, you may refer to the application web site
+or the ChangeLog file, or ... -->
+<para>
+You can find a list of changes at <ulink
+url="http://apps.kde.org/appname">http://apps.kde.org/appname</ulink>.
+</para>
+</sect1>
+
+<sect1 id="compilation">
+<title>Compilation and Installation</title>
+
+<!-- This entity contains the boilerplate text for standard -->
+<!-- compilation instructions. If your application requires any -->
+<!-- special handling, remove it, and replace with your own text. -->
+
+&install.compile.documentation;
+
+</sect1>
+
+<sect1 id="configuration">
+<title>Configuration</title>
+
+<para>Don't forget to tell your system to start the <filename>dtd</filename>
+dicer-toaster daemon first, or &appname; won't work !</para>
+
+</sect1>
+
+</appendix>
+
+&documentation.index;
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+vim:tabstop=2:shiftwidth=2:expandtab
+-->
+
diff --git a/app_templates/kioslave/setup.py b/app_templates/kioslave/setup.py
new file mode 100755
index 0000000..f9b9e30
--- /dev/null
+++ b/app_templates/kioslave/setup.py
@@ -0,0 +1,30 @@
+#!/usr/bin/python
+###########################################################################
+# setup - description #
+# ------------------------------ #
+# begin : Fri Jun 27 2005 #
+# copyright : (C) 2005 by AUTHOR #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+###########################################################################
+
+import kdedistutils
+
+kdedistutils.setup(name="kioslave",
+ version="0.1.0",
+ author="AUTHOR",
+ author_email="[email protected]",
+ url="http://www.TESTAPP.com/",
+ min_kde_version = "3.0.0",
+ min_qt_version = "3.0.0",
+ license = "GPL",
+ application_data = ['src/kioslave.py'],
+ docbooks = [ ('doc/en','en') ],
+ kioslaves = [ ('src/kioslave.protocol','kioslave.py')] )
diff --git a/app_templates/kioslave/src/kioslave.lsm b/app_templates/kioslave/src/kioslave.lsm
new file mode 100644
index 0000000..43d0d5f
--- /dev/null
+++ b/app_templates/kioslave/src/kioslave.lsm
@@ -0,0 +1,16 @@
+Begin3
+Title: $APPNAME$ -- Some description
+Version: $VERSION$
+Entered-date:
+Description:
+Keywords: KDE Qt
+Author: $AUTHOR$ <$EMAIL$>
+Maintained-by: $AUTHOR$ <$EMAIL$>
+Home-page:
+Alternate-site:
+Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
+ xxxxxx $APPNAMELC$-$VERSION$.tar.gz
+ xxx $APPNAMELC$-$VERSION$.lsm
+Platform: Linux. Needs KDE
+Copying-policy: $LICENSE$
+End
diff --git a/app_templates/kioslave/src/kioslave.protocol b/app_templates/kioslave/src/kioslave.protocol
new file mode 100644
index 0000000..01dc5bb
--- /dev/null
+++ b/app_templates/kioslave/src/kioslave.protocol
@@ -0,0 +1,13 @@
+[Protocol]
+exec=kioslave
+protocol=kioslave
+input=none
+output=filesystem
+listing=Name,Type,Size,Date
+reading=true
+writing=true
+makedir=true
+deleting=true
+linking=false
+moving=true
+maxInstances=1
diff --git a/app_templates/kioslave/src/kioslave.py b/app_templates/kioslave/src/kioslave.py
new file mode 100755
index 0000000..63e34f0
--- /dev/null
+++ b/app_templates/kioslave/src/kioslave.py
@@ -0,0 +1,618 @@
+#!/usr/bin/python
+###########################################################################
+# kioslave - description #
+# ------------------------------ #
+# begin : Mon May 2 2005 #
+# copyright : (C) 2005 by AUTHOR #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+###########################################################################
+
+# Import the required Qt and KDE modules.
+from qt import *
+from kio import *
+from kdecore import *
+import os, time
+
+# For debugging purposes, import the sys and traceback modules.
+import sys, traceback
+
+DEBUG = 1
+
+# Define a class which will be used to create IOSlave instances.
+############################################################################
+class SlaveClass(KIO.SlaveBase):
+ """SlaveClass(KIO.SlaveBase)
+
+ See kdelibs/kio/kio/slavebase.h for virtual functions to override.
+ """
+
+ ########################################################################
+ def __init__(self, pool, app):
+ # We must call the initialisation method of the base class.
+ KIO.SlaveBase.__init__(self, "kioslave", pool, app)
+
+ # Attach the DCOP client object associated with this IOSlave to the
+ # DCOP server.
+ self.dcopClient().attach()
+
+ self.debug("dcopClient: %i" % self.dcopClient().isRegistered())
+
+ self.contents = RAMDir(None,u"/")
+
+ self.host = ""
+ self.document = None
+ self.file = None
+
+ self.debug("Exiting __init__ now");
+
+ ########################################################################
+ def __del__(self):
+ pass
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def setHost(self, host, port, user, passwd):
+ self.debug(
+ "setHost: %s %s %s %s" % (
+ repr(unicode(host)), repr(unicode(port)),
+ repr(unicode(user)), repr(unicode(passwd))
+ )
+ )
+
+ # This IOSlave does not allow a host to be specified as part of
+ # a URL.
+ if unicode(host) != u"":
+ self.closeConnection()
+ self.error(KIO.ERR_MALFORMED_URL, host)
+ return
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def openConnection(self):
+ # Don't call self.finished() in this method.
+ self.debug("openConnection")
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def closeConnection(self):
+ # Don't call self.finished() in this method.
+ self.debug("closeConnection")
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def get(self, url):
+ path = str(url.path())
+ self.debug("get(): %s" % path)
+ self.openConnection()
+
+ item = self.contents.resolve(path)
+ if item is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, path)
+ return
+
+ if item.isDir():
+ self.error(KIO.ERR_IS_DIRECTORY, path)
+
+ self.totalSize(len(item.getData()))
+ self.data(QByteArray(item.getData()))
+
+ # The end of the data string.
+ self.data(QByteArray())
+
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def put(self, url, permissions, overwrite, resume):
+ self.debug("put")
+ self.openConnection()
+
+ path = str(url.path())
+ parts = path.split('/')
+ filename = parts[-1]
+ parent_dir = self.contents.resolveParent(path)
+ if parent_dir is None:
+ parent_path = '/'.join(parts[:-1])
+ self.error(KIO.ERR_DOES_NOT_EXIST, parent_path)
+ return
+
+ if parent_dir.contains(filename):
+ if not overwrite:
+ self.error(KIO.ERR_COULD_NOT_WRITE, parent_path)
+ return
+ else:
+ parent_dir.unlink(filename)
+
+ # Read data from the application.
+ bytearray = QByteArray()
+ bytes = 0
+ data = ""
+
+ while True:
+ self.dataReq()
+ result = self.readData(bytearray)
+
+ if result <= 0:
+ # An error or the end of data was encountered.
+ break
+
+ # The number of bytes read is given in the result.
+ bytes = bytes + result
+ data = data + str(bytearray)
+
+ parent_dir.insert(RAMFile(parent_dir,filename,data))
+
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def stat(self, url):
+ self.debug("stat: %s" % url.url(0,0))
+ self.openConnection()
+
+ self.debug("path:%s"% url.path())
+
+ # Return info the for the root.
+ item = self.contents.resolve(str(url.path()))
+ if item is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, str(url.path()))
+ return
+
+ self.statEntry(item.getStatEntry())
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def mimetype(self, url):
+ self.debug("mimetype: %s" % unicode(url))
+ self.openConnection()
+
+ path = str(url.path())
+ item = self.contents.resolve(path)
+ if item is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, path)
+ return
+
+ self.mimeType(item.getMimetype())
+
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def listDir(self, url):
+ # The "url" argument is a kdecore.KURL object.
+ self.debug("listDir: %s" % str(url.prettyURL(0)))
+ self.openConnection()
+
+ path = str(url.path())
+ dir = self.contents.resolve(path)
+ if dir is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, path)
+ return
+
+ if not dir.isDir():
+ self.error(KIO.ERR_IS_FILE, path)
+ return
+
+ for entry in dir.listDir():
+ self.listEntry(entry, 0)
+
+ self.listEntry([], 1) # Signal that the list is finished.
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def mkdir(self, url, permissions):
+ self.debug("mkdir")
+ self.openConnection()
+
+ parent_path = str(url.path())
+ parent_dir = self.contents.resolveParent(parent_path)
+ if parent_dir is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, parent_path)
+ return
+
+ new_dir_obj = parent_dir.mkdir(parent_path.split('/')[-1])
+ if new_dir_obj is None:
+ self.error(KIO.ERR_COULD_NOT_MKDIR, parent_path)
+ return
+
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def rename(self, src, dest, overwrite):
+ self.debug("rename: %s %s" % (src.path(), dest.path()))
+ self.openConnection()
+
+ src_path = str(src.path())
+ src_obj = self.contents.resolve(src_path)
+ if src_obj is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, src_path)
+ return
+
+ # See if the destination path already exists.
+ dest_path = str(dest.path())
+ dest_obj = self.contents.resolve(dest_path)
+ if dest_obj is not None:
+ if dest_obj is src_obj:
+ self.finished() # Done already.
+ return
+
+ if not overwrite:
+ # Can't overwrite. not bad.
+ self.error(KIO.ERR_CANNOT_RENAME, dest_path)
+ return
+ else:
+ # Over write, just remove the object.
+ dest_obj.getParent().unlink(dest_obj.getName())
+
+ dest_dir = self.contents.resolveParent(dest_path)
+ if dest_dir is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, dest_path)
+ return
+
+ src_obj.getParent().unlink(src_obj)
+ src_obj.setName(dest_path.split('/')[-1])
+ dest_dir.insert(src_obj)
+
+ self.finished()
+
+ # Other possible file operations are represented by the following
+ # methods which are not implemented.
+
+ #def symlink(self, target, dest, overwrite):
+ # debug("symlink")
+ # ...
+ # self.finished()
+
+ #def chmod(self, url, permissions):
+ # debug("chmod")
+ # ...
+ # self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def copy(self, src, dest, permissions, overwrite):
+ self.debug("copy")
+ self.openConnection()
+
+ src_path = str(src.path())
+ src_obj = self.contents.resolve(src_path)
+ if src_obj is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, src_path)
+ return
+
+ # See if the destination path already exists.
+ dest_path = str(dest.path())
+ dest_obj = self.contents.resolve(dest_path)
+ if dest_obj is not None:
+ if dest_obj is src_obj:
+ self.finished() # Done already.
+ return
+
+ if not overwrite:
+ # Can't overwrite. not bad.
+ self.error(KIO.ERR_COULD_NOT_WRITE, dest_path)
+ return
+ else:
+ # Over write, just remove the object.
+ dest_obj.getParent().unlink(dest_obj.getName())
+
+ dest_dir = self.contents.resolveParent(dest_path)
+ if dest_dir is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, dest_path)
+ return
+
+ new_obj = src_obj.copy()
+ new_obj.setName(dest_path.split('/')[-1])
+ dest_dir.insert(new_obj)
+
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def del_(self, url, isfile):
+ self.debug("del_")
+ self.openConnection()
+
+ path = str(url.path())
+ item = self.contents.resolve(path)
+ if item is None:
+ self.error(KIO.ERR_DOES_NOT_EXIST, path)
+ return
+
+ item.getParent().unlink(item.getName())
+
+ self.finished()
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def disconnectSlave(self):
+ self.debug("disconnectSlave")
+ return
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def dispatchLoop(self):
+ self.debug("dispatchLoop")
+ KIO.SlaveBase.dispatchLoop(self)
+
+ ########################################################################
+ # KIO.SlaveBase method
+ def error(self,errid,text):
+ self.debug("error: %i, %s" % (errid,text) )
+ KIO.SlaveBase.error(self,errid,text)
+
+ ############################################################################
+ def debug(self,msg):
+ if DEBUG == 0: return
+ print "kioslave:"+str(msg)+"\n"
+ sys.stdout.flush()
+
+############################################################################
+class RAMDir(object):
+ ############################################################################
+ def __init__(self,parent,name):
+ self.contents = {}
+ self.parent = parent
+ self.name = str(name)
+
+ ############################################################################
+ def getParent(self):
+ return self.parent
+
+ ############################################################################
+ def setParent(self,parent):
+ self.parent = parent
+
+ ############################################################################
+ def getName(self):
+ return self.name
+
+ ############################################################################
+ def setName(self,name):
+ self.name = str(name)
+
+ ############################################################################
+ def resolve(self,path):
+ while path.endswith('/'):
+ path = path[:-1]
+ while path.startswith('/'):
+ path = path[1:]
+
+ if path=='':
+ return self
+
+ parts = path.split('/')
+ self.debug(path)
+ for item in self.contents.keys():
+ self.debug("keys:"+item)
+
+ if parts[0] in self.contents:
+ return self.contents[parts[0]].resolve('/'.join(parts[1:]))
+ self.debug("CHECKPOINT 1")
+ return None
+
+ ############################################################################
+ def resolveParent(self,path):
+ while path.endswith('/'):
+ path = path[:-1]
+ while path.startswith('/'):
+ path = path[1:]
+
+ if path=="":
+ return None
+
+ parts = path.split('/')
+ return self.resolve('/'.join(parts[:-1]))
+
+ ############################################################################
+ def mkdir(self,name):
+ if name in self.contents:
+ return None
+ new_dir = RAMDir(self,name)
+ self.contents[name] = new_dir
+ return new_dir
+
+ ############################################################################
+ def getStatEntry(self):
+ # Return info the for the root.
+ length = 0
+
+ entry = []
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_NAME
+ atom.m_str = self.name
+ #debug("name: %s" % name)
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_SIZE
+ atom.m_long = length
+ #debug("length: %i" % length)
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_MODIFICATION_TIME
+ # Number of seconds since the epoch.
+ atom.m_long = int(time.time())
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_ACCESS
+ # The usual octal permission information (rw-r--r-- in this case).
+ atom.m_long = 0644
+ entry.append(atom)
+
+ # If the stat method is implemented then entries _must_ include
+ # the UDE_FILE_TYPE atom or the whole system may not work at all.
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_FILE_TYPE
+ #atom.m_long = os.path.stat.S_IFREG
+ atom.m_long = os.path.stat.S_IFDIR
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_MIME_TYPE
+ atom.m_str = self.getMimetype()
+ entry.append(atom)
+
+ return entry
+
+ ############################################################################
+ def listDir(self):
+ list = []
+ for item in self.contents.values():
+ list.append(item.getStatEntry())
+ return list
+
+ ############################################################################
+ def isDir(self):
+ return True
+
+ ############################################################################
+ def insert(self,item):
+ self.contents[item.getName()] = item
+
+ ############################################################################
+ def contains(self,name):
+ return name in self.contents
+
+ ############################################################################
+ def unlink(self,name):
+ if str(name) in self.contents:
+ del self.contents[str(name)]
+
+ ############################################################################
+ def debug(self,msg):
+ if DEBUG == 0: return
+
+ print "kioslave:"+str(msg)+"\n"
+ sys.stdout.flush()
+
+ ############################################################################
+ def getMimetype(self):
+ return "inode/directory"
+
+ ############################################################################
+ def copy(self):
+ new_dir = RAMDir(None,self.name)
+
+ for item in self.contents.values():
+ new_item = item.copy()
+ new_item.setParent(new_dir)
+ new_dir.insert(new_item)
+
+ return new_dir
+
+############################################################################
+class RAMFile(object):
+ ############################################################################
+ def __init__(self,parent,name,data=None):
+ self.parent = parent
+ self.name = str(name)
+ self.data = data
+
+ ############################################################################
+ def getParent(self):
+ return self.parent
+
+ ############################################################################
+ def setParent(self,parent):
+ self.parent = parent
+
+ ############################################################################
+ def getName(self):
+ return self.name
+
+ ############################################################################
+ def setName(self,name):
+ self.name = str(name)
+
+ ############################################################################
+ def resolve(self,path):
+ if path!="":
+ return None
+ return self
+
+ ############################################################################
+ def getData(self):
+ return self.data
+
+ ############################################################################
+ def resolveParent(self,path):
+ return None
+
+ ############################################################################
+ def getStatEntry(self):
+ # Return info the for the root.
+ length = 0
+
+ entry = []
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_NAME
+ atom.m_str = self.name
+ #debug("name: %s" % name)
+ entry.append(atom)
+
+ length = 0
+ if self.data is not None:
+ length = len(self.data)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_SIZE
+ atom.m_long = length
+ #debug("length: %i" % length)
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_MODIFICATION_TIME
+ # Number of seconds since the epoch.
+ atom.m_long = int(time.time())
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_ACCESS
+ # The usual octal permission information (rw-r--r-- in this case).
+ atom.m_long = 0644
+ entry.append(atom)
+
+ # If the stat method is implemented then entries _must_ include
+ # the UDE_FILE_TYPE atom or the whole system may not work at all.
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_FILE_TYPE
+ atom.m_long = os.path.stat.S_IFREG
+ entry.append(atom)
+
+ atom = KIO.UDSAtom()
+ atom.m_uds = KIO.UDS_MIME_TYPE
+ atom.m_str = self.getMimetype()
+ entry.append(atom)
+
+ return entry
+
+ ############################################################################
+ def isDir(self):
+ return False
+
+ ############################################################################
+ def getMimetype(self):
+ return "text/html"
+
+ ############################################################################
+ def copy(self):
+ return RAMFile(None,self.name,self.data)
+
+############################################################################
+def SlaveFactory(pool, app):
+ slave = SlaveClass(pool, app)
+ slave.dispatchLoop()
diff --git a/doc/en/index.docbook b/doc/en/index.docbook
new file mode 100644
index 0000000..bd663b8
--- /dev/null
+++ b/doc/en/index.docbook
@@ -0,0 +1,874 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+ <!ENTITY appname "<application>PyKDE Extensions</application>">
+ <!ENTITY kappname "&appname;"><!-- Do *not* replace kappname-->
+ <!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc -->
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE"><!-- change language only here -->
+
+
+ <!-- Do not define any other entities; instead, use the entities
+ from kde-genent.entities and $LANG/user.entities. -->
+]>
+
+<!-- ................................................................ -->
+<!-- The language must NOT be changed here. -->
+
+<book lang="&language;">
+
+<bookinfo>
+<title>The &appname; Handbook</title>
+
+<authorgroup>
+<author>
+<firstname>Simon</firstname>
+<othername></othername>
+<surname>Edwards</surname>
+<affiliation>
+<address><email>[email protected]</email></address>
+</affiliation>
+</author>
+</authorgroup>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+<copyright>
+<year>2005</year>
+<holder>Simon Edwards</holder>
+</copyright>
+<!-- Translators: put here the copyright notice of the translation -->
+<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
+ and in the FDL itself on how to use it. -->
+<legalnotice>&FDLNotice;</legalnotice>
+
+<!-- Date and version information of the documentation
+Don't forget to include this last date and this last revision number, we
+need them for translation coordination !
+Please respect the format of the date (YYYY-MM-DD) and of the version
+(V.MM.LL), it could be used by automation scripts.
+Do NOT change these in the translation. -->
+
+<date>2005-09-19</date>
+<releaseinfo>0.4</releaseinfo>
+
+<!-- Abstract about this handbook -->
+
+<abstract>
+<para>
+&appname; is a collection of software and Python packages to support the
+creation and installation of KDE applications.
+</para>
+</abstract>
+
+<!-- This is a set of Keywords for indexing by search engines.
+Please at least include KDE, the KDE package it is in, the name
+ of your application, and a few relevant keywords. -->
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>PyKDE Extensions</keyword>
+<keyword>python</keyword>
+<keyword>PyKDE</keyword>
+</keywordset>
+
+</bookinfo>
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+<para>
+&appname; is a collection of software and Python packages to support the
+creation and installation of KDE applications.
+</para>
+
+</chapter>
+
+<!-- distutils -->
+<chapter id="distutils">
+<title>Installation &amp; Distutils support</title>
+
+<para>
+C++ projects on KDE traditionally use
+<ulink url="http://www.gnu.org/software/autoconf/">autoconf</ulink>,
+<ulink url="http://www.gnu.org/software/automake/">automake</ulink>
+and <ulink url="http://www.gnu.org/software/libtool/">libtool</ulink>
+to handle the building and installation. These tools
+and difficult to use, even for experianced developers.
+</para>
+
+<para>
+Fortunately Python has a its own system for building and installing
+modules and software. <ulink url="http://docs.python.org/lib/module-distutils.html">Distutils</ulink>
+is a standard Python package and comes with every Python installation.
+&appname; builds on Distutils with extensions tailored for handling KDE
+programs.
+</para>
+
+<para>
+A typical KDE program comes not only with the program itself but also
+extra files such as a manual written in <ulink url="http://i18n.kde.org/doc/markup/">Docbook
+format</ulink>, <ulink url="http://i18n.kde.org/translation-howto/">translation files</ulink>,
+icons, images and other auxiliary data files. &appname; provides support for
+handling all these other files types.
+</para>
+
+<sect1 id="distutils-using">
+<title>Using Distutils with KDE programs</title>
+<para>
+It is advised that you first read the standard
+<ulink url="http://docs.python.org/lib/module-distutils.html">Distutils documentation</ulink>
+to learn about how it works. &appname; adds some KDE specific extensions which are documented
+below.
+</para>
+
+<para>
+Distutils is based around writing a <filename>setup.py</filename> file which
+then uses the distutils package
+To use the KDE extensions, the first thing you need to do in your <filename>setup.py
+</filename> file is include the <symbol>kdedistutils</symbol> package.
+<programlisting>
+#!/usr/bin/env python
+# Setup.py file for MyKDEApplication
+
+import kdedistutils
+</programlisting>
+
+You need to call the <symbol>setup()</symbol> function from <symbol>kdedistutils</symbol>
+with all of the configuration information about your application, much like the standard
+<symbol>setup()</symbol> from <symbol>distutils</symbol>.
+
+<programlisting>
+kdedistutils.setup(name="pykdeextensions",
+ version="0.1.0",
+ author="Simon Edwards",
+ author_email="[email protected]",
+ url="http://www.simonzone.com/software/pykdeextensions/",
+ min_kde_version = "3.0.0",
+ min_qt_version = "3.0.0",
+ license = "LGPL" )
+</programlisting>
+
+<symbol>min_kde_version</symbol> and <symbol>min_qt_version</symbol> specify
+the minimum versions of the Qt library and KDE needed to install and run
+the software. These requirements are checked during install.
+</para>
+
+<para>
+The other arguments shown here are standard <symbol>distutils.setup()</symbol>
+arguments.
+</para>
+
+</sect1>
+
+<sect1 id="distutils-files">
+<title>Application data files</title>
+<para>
+Each KDE application as a data directory of it's own for storing any extra
+data files it may need to run.
+</para>
+
+<para>
+Data files are specified using the the <symbol>application_data</symbol>
+argument for <symbol>setup()</symbol>. <symbol>application_data</symbol>
+is a list of files to install.
+<programlisting>
+ application_data = ['extracode.py', ('pics', ['pics/warning.png'])]
+</programlisting>
+You can simply specify the name of each file as a string and they will be
+installed directly in the application data directory. Or you can use a tuple
+containing the name of the sub-directory under the application data directory
+to install into, and as the second tuple item, the list of files to install
+into the given sub-directory.
+</para>
+
+<para>
+Since most large Python programs are broken up into multiple source files
+it is recommended that all of the Python files that comprise your
+application be installed into the application directory. This helps eliminate
+problems with the Python module path and the interpreter not being able
+find the correct file to <symbol>import</symbol>.
+</para>
+
+<para>
+Even with all of the python files in the Application data directory, it is
+still desirable to have your application's "executables" available in KDE's
+<filename>bin</filename> directory. &appname; provides an easy way for creating
+symbolic links from the "bin" directory to scripts in the application
+directory.
+<programlisting>
+ executable_links = [('myapplication','myapplication.py'), ('myapplicationgui','myapplicationgui.py')]
+</programlisting>
+This example specifies an executable symbolic link <filename>myapplication
+</filename> that points to the <filename>myapplication.py</filename> script
+in the application data directory.
+</para>
+
+</sect1>
+
+<sect1 id="distutils-uninstall">
+<title>Uninstall command</title>
+<para>
+Standard Distutils does not feature an uninstall command. &appname; does
+and it can be easily invoked with:
+<screen>
+python setup.py uninstall
+</screen>
+It is quite basic. The <symbol>install</symbol> writes the list of files
+it installed to the file <filename>install_log.txt</filename>. The
+<symbol>uninstall</symbol> command simply reads this file and removes the
+files and directories that are listed within.
+</para>
+</sect1>
+
+</chapter>
+
+<chapter id="distutils-docbook">
+<title>Manuals &amp; Docbook files</title>
+<para>
+Docbook is an XML based file format for writing manuals and books.
+More information about using Docbook to write manuals and documentation using
+Docbook is <ulink url="http://i18n.kde.org/doc/markup/">here</ulink>.
+Manuals are written in the Docbook format, but need to be converted
+into HTML when installed and made available for the KDE Help Center.
+</para>
+
+<para>
+Docbooks files and images are usually organised under a
+<filename>doc</filename> directory which is then further divided by two
+letter language code. For example <filename>doc/en</filename>,
+<filename>doc/nl</filename>, en <filename>doc/fr</filename>.
+The Docbook files themselves are named <filename>index.docbook</filename>
+</para>
+
+<para>
+By using the <symbol>docbooks</symbol> argument to <symbol>setup()</symbol>
+in your <filename>setup.py</filename>, you can specify the directories
+containing docbook files. You also need to specify the language used in
+that directory.
+<programlisting>
+ docbooks = [ ('doc/en','en'), ('doc/nl','nl'), ('doc/fr','fr') ]
+</programlisting>
+The argument to <symbol>docbooks</symbol> is a list of tuples. The first item
+of a tuple is the relative path to a docbook directory. The second item is
+the two letter language code.
+</para>
+
+<para>
+Docbook files specified this way will automatically be converted to HTML
+during install.
+</para>
+
+</chapter>
+
+<!-- Qt-designer -->
+<chapter id="using-qtdesigner">
+<title>Run-time integration with Qt-Designer</title>
+<para>
+Qt-Designer is a graphical application used for designing user interfaces.
+It creates <literal role="extension">.ui</literal> files. These files need
+to be converted into Python classes before they can be used in a Python
+application. This can be manually done using the <command>pyuic</command>
+command from the shell. But it is a lot more convenient to let &appname;
+to this automatically for you. All you need to do is import the
+<symbol>qtdesigner</symbol> or <symbol>kdedesigner</symbol> module, depending
+on whether your application is pure Qt or uses KDE, and then you can import
+your user interface files as though they were normal Python files.
+
+<programlisting>
+#!/usr/bin/env python
+from kdeui import *
+
+import kdedesigner # This module lets us import .ui file directly.
+from MyWindow import * # Loads MyWindow.ui
+
+# Subclass the Qt-designer form.
+class MyWindowCode(MyWindow):
+ # Implement extra functionality and methods.
+</programlisting>
+The <symbol>kdedesigner</symbol>/<symbol>qtdesigner</symbol> module converts
+<literal role="extension">.ui</literal> on demand to
+<literal role="extension">.py</literal> files.
+</para>
+
+</chapter>
+
+<!-- Internationalization -->
+<chapter id="i18n">
+<title>Internationalization &amp; translation</title>
+<para>
+i18n (an abbreviation of internationalization) is the process of translating
+the user interface and documentation of a piece of software into another
+language. <ulink url="i18n.kde.org">i18n.kde.org</ulink> is the central
+information point for the effort to translate KDE software into other
+languages.
+</para>
+
+<para>
+Translation of the user interface an application is done using
+<literal role="extension">.pot</literal> files and
+<literal role="extension">.po</literal> files.
+A <literal role="extension">.pot</literal> file, is generated from the source
+code of the program itself, and contains all of the strings / fragments of text,
+that are used in the program.
+</para>
+
+<para>
+Before a string in a program is include in the <literal role="extension">.pot
+</literal> file, it needs to be marked with the <function>i18n()</function>.
+
+<programlisting>
+#!/usr/bin/env python
+from kdecode import *
+
+ ...
+ mylabel = QLabel(i18n("Select new directory:"))
+ ...
+</programlisting>
+The <function>i18n()</function> is part of the <symbol>kdecode</symbol> package
+and needs to be imported.
+</para>
+
+<para>
+&appname; provides support for generating <literal role="extension">.pot</literal>
+files and managing and updating <literal role="extension">.po</literal> files.
+</para>
+
+<para>
+By using the <symbol>i18n</symbol> argument to <symbol>setup()</symbol>
+in your <filename>setup.py</filename>, you can specify the directory
+that should contain the <literal role="extension">.pot</literal> and
+<literal role="extension">.po</literal> files. The argument for
+<symbol>i18n</symbol> is a tuple. The first item is the relative path
+to the directory where the translation files should be stored. The
+second item is a list of directories that should be scanned for Python source
+files containing translatable strings.
+<programlisting>
+ i18n = ('po',['.','mymodule'])
+</programlisting>
+
+</para>
+
+<para>
+Once your <filename>setup.py</filename> is configured, use this command in the
+shell to generate the <literal role="extension">.pot</literal> file.
+<screen>
+python setup.py update_messages
+</screen>
+This command also updates any already existing <literal role="extension">.po</literal>
+files with any new messages.
+</para>
+
+<para>
+&appname; also handles installing translation files and converting
+<literal role="extension">.po</literal> files into the special binary format
+needed by the application at runtime.
+</para>
+
+</chapter>
+
+<!-- Kcontrol modules -->
+<chapter id="kcontrol-modules">
+<title>KDE Control Center Modules</title>
+<para>
+&appname; can also help create modules for the KDE Control Center.
+C++ glue code is needed when writing in module in Python. Fortunately
+&appname; can generate this glue for you automatically.
+</para>
+<para>
+The best way to start learning about creating modules is to read the
+<ulink url="http://developer.kde.org/documentation/other/kcm_howto.html">KConfig
+Module HOWTO</ulink>. It is written for C++, but the concepts are the same for
+Python.
+</para>
+<para>
+In your <filename>setup.py</filename> file you can specify the list of kcontrol
+modules that need to be installed.
+<programlisting>
+ kcontrol_modules = [ ('src/kcontrol_module.desktop','kcontrol_module.py')] )
+</programlisting>
+This is just a list of tuples. The first item is name of the
+<literal role="extension">.desktop</literal> file that you've made for your
+module. The second item is the name of the Python program to run when the
+user views the module in kcontrol. This program is expected to be in
+the application's data files directory.
+</para>
+<para>
+The <ulink url="http://developer.kde.org/documentation/standards/kde/kcontrol_style/index.html">
+KControl Module Guidelines</ulink> provides useful information about how to
+design a KControl module that fits into the rest of KDE.
+</para>
+
+<tip>
+<para>
+&appname; typically installs the <literal role="extension">.desktop</literal>
+file into the <filename>/usr/share/applications/kde/</filename> directory.
+This is normally enough to make the module appear in the KDE Control Center.
+But for some distributions, most notably <ulink url="http://www.mandriva.com/">
+Mandriva</ulink> but probably others too, this isn't enough. Mandriva in
+particular uses the <ulink url="http://alioth.debian.org/projects/menu/">
+Debian menu system</ulink> for managing the K menu and also for KControl
+modules. In order to get a module to appear in the kcontrol it is best
+to createa a <literal role="extension">.menu</literal> file and copy
+it into <filename>/usr/lib/menu</filename>, and then use <command>update-menus
+</command> as root to update all of the menus and the list of kcontrol
+modules.
+</para>
+</tip>
+
+<note>
+<para>
+Right now there is no support for "module-testing" or "X-KDE-Test-Module=true"
+features in <literal role="extension">.desktop</literal> files.
+</para>
+</note>
+</chapter>
+
+<!-- KIO-Slaves -->
+<chapter id="kioslaves">
+<title>KIO Slaves</title>
+<para>
+&appname; can be used for the creation of kio-slaves. &appname; handles the C++
+glue code needed for making kioslaves in Python.
+<ulink url="http://developer.kde.org/documentation/library/kdeqt/kde3arch/nettransparency.html">developer.kde.org</ulink>
+has some documentation about KIO-slaves aimed at C++ programmers.
+</para>
+<para>
+In your <filename>setup.py</filename> file you can specify the list of kioslaves
+that need to be installed.
+<programlisting>
+ kioslaves = [ ('src/kioslave.protocol','kioslave.py')] )
+</programlisting>
+This is just a list of tuples. The first item is name of the
+<literal role="extension">.protocol</literal> file that you've made for your
+kio-slave. The second item is the name of the Python program to run when the
+user views the module in kcontrol. This program is expected to be in
+the application's data files directory.
+</para>
+</chapter>
+
+<!-- Application templates -->
+<chapter id="application-templates">
+<title>Application templates</title>
+
+<para>
+The <filename>app_templates</filename> directory contains a number of
+application templates. An <quote>application template</quote> is just a collection of files
+in a directory structure that should be copied and used as starting point
+when developing a new application. An application template typically contains
+default documentation files, icons, source file and <filename>setup.py
+</filename> file which can later be modified.
+</para>
+
+<para>
+Every application template has a number of files in common. They are
+described below.
+
+<variablelist>
+<varlistentry>
+ <term><filename>AUTHORS</filename></term>
+ <listitem><para>Lists the authors of this software.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>ChangeLog</filename></term>
+ <listitem><para>An itemised log or list of changes to the software.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>COPYING</filename></term>
+ <listitem><para>A copy of the GNU GPL, explaining the terms under which this
+ software may be distributed. This file does not need to be changed.
+ </para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>INSTALL</filename></term>
+ <listitem><para>Instructions for installing the software.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>MANIFEST.in</filename></term>
+ <listitem><para></para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>NEWS</filename></term>
+ <listitem><para>News about what is new in the current version of this software.
+ </para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>README</filename></term>
+ <listitem><para>Important instructions and information that the user should
+ read first.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>setup.py</filename></term>
+ <listitem><para>.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>TODO</filename></term>
+ <listitem><para>List of features and work that may be available in a future
+ version of the software.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>po/</filename></term>
+ <listitem><para>This directory is initially empty. It is used for
+ <literal role="extension">.pot</literal> and <literal role="extension">.po
+ </literal> translation files.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>doc/</filename></term>
+ <listitem><para>This directory is initially empty. It is used for holding the
+ directores for the different langauge version of the manual.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>doc/en</filename></term>
+ <listitem><para>This directory for the english version of the manual.
+ </para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>doc/en/index.docbook</filename></term>
+ <listitem><para>The english manual in docbook format. The default is a template
+ which can then be filled in.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+ <term><filename>src</filename></term>
+ <listitem><para>This directory containing the source code for the software.
+ The default contents of this directory depends on the particular
+ application template.</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</para>
+
+<sect1 id="app-template-simple">
+<title>Simple KDE utility template</title>
+<para>
+The <filename>kdeutility</filename> application template is a simple utility
+that uses an interface designed in Qt-Designer. It doesn't have a menubar
+or toolbar.
+</para>
+</sect1>
+
+<sect1 id="app-template-application">
+<title>KDE application template</title>
+<para>
+The <filename>kdeapp</filename> application template is an application with
+menubar, toolbar and separated document and view classes. The menubar and toolbars
+are defined using XML.
+</para>
+</sect1>
+
+<sect1 id="app-template-kcontrol">
+<title>Kcontrol Module Application Template</title>
+<para>
+The <filename>kcontrol_module</filename> application template is a simple
+module for the KDE Control Center. The module can also be run as a separate
+application outside of KControl to ease development and debugging.
+</para>
+</sect1>
+
+<sect1 id="app-template-kioslave">
+<title>KIO-slave Application Template</title>
+<para>
+The <filename>kioslave</filename> application template is a simple
+KIO-slave that implements a simple RAM disk. Once installed it can be
+accessed using kioslave:/ in konqueror. It is initially empty. Files and
+directories can be made and deposited. <filename>kioslave.py</filename>
+contains more information and comments.
+</para>
+<note>
+<para>
+Note that the KIO subsystem usually creates multiple running instances
+of a kio-slave backend. For the application template, files and directories
+are specific to each particular backend instance. When using konqueror the
+same instance will be used, but if you try to access kioslave:/ from a
+different process a new (empty!) instance will be craeted. This can be
+confusing! Be aware.
+</para>
+</note>
+</sect1>
+
+</chapter>
+
+<!--
+<chapter id="commands">
+<title>Command Reference</title>
+<sect1 id="appname-mainwindow">
+<title>The main &appname; window</title>
+</sect1>
+</chapter>
+
+<chapter id="developers">
+<title>Developer's Guide to &appname;</title>
+
+
+<para>
+Programming &appname; plugins is a joy to behold. Just read through the next
+66 pages of API's to learn how!
+</para>
+
+
+<refentry id="re-1007-unmanagechildren-1">
+<refmeta>
+<refentrytitle>XtUnmanageChildren</refentrytitle>
+<refmiscinfo>Xt - Geometry Management</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>XtUnmanageChildren
+</refname>
+<refpurpose>remove a list of children from a parent widget's managed
+list.
+<indexterm id="ix-1007-unmanagechildren-1"><primary>widgets</primary><secondary>removing</secondary></indexterm>
+<indexterm id="ix-1007-unmanagechildren-2"><primary>XtUnmanageChildren</primary></indexterm>
+</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv>
+<refsynopsisdivinfo>
+<date>4 March 1996</date>
+</refsynopsisdivinfo>
+<synopsis>
+void XtUnmanageChildren(<replaceable class="parameter">children</replaceable>, <replaceable class="parameter">num_children</replaceable>)
+ WidgetList <replaceable class="parameter">children</replaceable>;
+ Cardinal <replaceable class="parameter">num_children</replaceable>;
+</synopsis>
+
+<refsect2 id="r2-1007-unmanagechildren-1">
+<title>Inputs</title>
+<variablelist>
+<varlistentry>
+<term><replaceable class="parameter">children</replaceable>
+</term>
+<listitem>
+<para>Specifies an array of child widgets. Each child must be of
+class RectObj or any subclass thereof.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><replaceable class="parameter">num_children</replaceable>
+</term>
+<listitem>
+<para>Specifies the number of elements in <replaceable class="parameter">children</replaceable>.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refsect2></refsynopsisdiv>
+
+<refsect1 id="r1-1007-unmanagechildren-1">
+<title>Description
+</title>
+<para><function>XtUnmanageChildren()</function> unmaps the specified widgets
+and removes them from their parent's geometry management.
+The widgets will disappear from the screen, and (depending
+on its parent) may no longer have screen space allocated for
+them.
+</para>
+<para>Each of the widgets in the <replaceable class="parameter">children</replaceable> array must have
+the same parent.
+</para>
+<para>See the &ldquo;Algorithm&rdquo; section below for full details of the
+widget unmanagement procedure.
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-2">
+<title>Usage</title>
+<para>Unmanaging widgets is the usual method for temporarily
+making them invisible. They can be re-managed with
+<function>XtManageChildren()</function>.
+</para>
+<para>You can unmap a widget, but leave it under geometry
+management by calling <function>XtUnmapWidget()</function>. You can
+destroy a widget's window without destroying the widget by
+calling <function>XtUnrealizeWidget()</function>. You can destroy a
+widget completely with <function>XtDestroyWidget()</function>.
+</para>
+<para>If you are only going to unmanage a single widget, it is
+more convenient to call <function>XtUnmanageChild()</function>. It is
+often more convenient to call <function>XtUnmanageChild()</function>
+several times than it is to declare and initialize an array
+of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
+<function>XtUnmanageChildren()</function> is more efficient, however,
+because it only calls the parent's <function>change_managed()</function>
+method once.
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-3">
+<title>Algorithm
+</title>
+<para><function>XtUnmanageChildren()</function> performs the following:
+</para>
+<variablelist>
+<varlistentry>
+<term>-
+</term>
+<listitem>
+<para>Ignores the child if it already is unmanaged or is being
+destroyed.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>-
+</term>
+<listitem>
+<para>Otherwise, if the child is realized, it makes it nonvisible
+by unmapping it.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>
+</para>
+</refsect1>
+
+<refsect1 id="r1-1007-unmanagechildren-4">
+<title>Structures</title>
+<para>The <type>WidgetList</type> type is simply an array of widgets:
+</para>
+<screen id="sc-1007-unmanagechildren-1">typedef Widget *WidgetList;
+</screen>
+</refsect1>
+</refentry>
+
+</chapter>
+
+<chapter id="faq">
+<title>Questions and Answers</title>
+
+
+&reporting.bugs;
+&updating.documentation;
+
+<qandaset id="faqlist">
+<qandaentry>
+<question>
+<para>My Mouse doesn't work. How do I quit &appname;?</para>
+</question>
+<answer>
+<para>You silly goose! Check out the <link linkend="commands">Commands
+Section</link> for the answer.</para>
+</answer>
+</qandaentry>
+<qandaentry>
+<question>
+<para>Why can't I twiddle my documents?</para>
+</question>
+<answer>
+<para>You can only twiddle your documents if you have the foobar.lib
+installed.</para>
+</answer>
+</qandaentry>
+</qandaset>
+</chapter>
+-->
+<chapter id="credits">
+
+<!-- Include credits for the programmers, documentation writers, and
+contributors here. The license for your software should then be included below
+the credits with a reference to the appropriate license file included in the KDE
+distribution. -->
+
+<title>Credits and License</title>
+
+<para>
+&appname;
+</para>
+<para>
+Program copyright 2005 Simon Edwards <email>[email protected]</email>
+</para>
+<para>
+Contributors:
+<itemizedlist>
+<listitem><para>Konqui the KDE Dragon <email>[email protected]</email></para>
+</listitem>
+<listitem><para>Tux the Linux Penguin <email>[email protected]</email></para>
+</listitem>
+</itemizedlist>
+</para>
+
+<para>
+Documentation copyright 2005 Simon Edwards <email>[email protected]</email>
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underFDL; <!-- FDL: do not remove -->
+</chapter>
+<!--
+<appendix id="installation">
+<title>Installation</title>
+
+<sect1 id="getting-appname">
+<title>How to obtain &appname;</title>
+
+&install.intro.documentation;
+
+</sect1>
+
+<sect1 id="requirements">
+<title>Requirements</title>
+
+<para>
+In order to successfully use &appname;, you need &kde; 1.1. Foobar.lib is
+required in order to support the advanced &appname; features. &appname; uses
+about 5 megs of memory to run, but this may vary depending on your
+platform and configuration.
+</para>
+
+<para>
+All required libraries as well as &appname; itself can be found
+on <ulink url="ftp://ftp.appname.org">The &appname; home page</ulink>.
+</para>
+
+<para>
+You can find a list of changes at <ulink
+url="http://apps.kde.org/appname">http://apps.kde.org/appname</ulink>.
+</para>
+</sect1>
+
+<sect1 id="compilation">
+<title>Compilation and Installation</title>
+
+&install.compile.documentation;
+
+</sect1>
+
+<sect1 id="configuration">
+<title>Configuration</title>
+
+<para>Don't forget to tell your system to start the <filename>dtd</filename>
+dicer-toaster daemon first, or &appname; won't work !</para>
+
+</sect1>
+
+</appendix>
+-->
+&documentation.index;
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+vim:tabstop=2:shiftwidth=2:expandtab
+-->
+
diff --git a/setup.py b/setup.py
new file mode 100755
index 0000000..f7d90f2
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,323 @@
+#!/usr/bin/python
+###########################################################################
+# setup - description #
+# ------------------------------ #
+# begin : Thu Apr 21 2005 #
+# copyright : (C) 2005 by Simon Edwards #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU Library General Public License as #
+# published by the Free Software Foundation; either version 2 of the #
+# License, or (at your option) any later version. #
+# #
+###########################################################################
+from distutils.cmd import Command
+from distutils import sysconfig
+from distutils.spawn import find_executable,spawn
+from distutils import dir_util
+import sys
+import os
+import glob
+sys.path.insert(0,"src") # We need this for the import statement below.
+
+import kdedistutils
+
+def main():
+ kdedistutils.setup(name="pykdeextensions",
+ version="0.4.0",
+ author="Simon Edwards",
+ author_email="[email protected]",
+ url="http://www.simonzone.com/software/pykdeextensions/",
+ min_kde_version = "3.0.0",
+ min_qt_version = "3.0.0",
+ license = "LGPL",
+ package_dir = {'': 'src'},
+ py_modules = ["kdedistutils","qtuicompiler","qtdesigner","kdedesigner"],
+ application_data = ["app_templates","AUTHORS","ChangeLog","COPYING","INSTALL","NEWS"],
+ docbooks = [ ('doc/en','en') ],
+ cmdclass = {
+ 'install' : InstallPyKDEExtensions,
+ 'build_libpythonize' : BuildLibpythonize,
+ 'install_libpythonize' : InstallLibpythonize
+ }
+ )
+
+###########################################################################
+class InstallPyKDEExtensions(kdedistutils.InstallKDE):
+ sub_commands = kdedistutils.InstallKDE.sub_commands[:]
+ sub_commands.append( ('install_libpythonize',None) )
+
+ user_options = kdedistutils.InstallKDE.user_options
+ user_options.append( ('install-clib=', None, "installation directory for shared libraries") )
+ user_options.append( ('install-cheaders=', None, "installation directory for C header files") )
+
+ def initialize_options(self):
+ self.install_clib = None
+ self.install_cheaders = None
+ kdedistutils.InstallKDE.initialize_options(self)
+
+ def finalize_options(self):
+ if self.install_clib is None:
+ if self.prefix is not None:
+ self.install_clib = os.path.join(self.prefix,'lib')
+ else:
+ self.announce("Detecting KDE library directory...")
+ self.install_clib = kdedistutils.ask_kde_config('--install lib --expandvars').strip()
+ self.announce(" ...KDE library directory is %s" % self.install_clib)
+
+ if self.install_cheaders is None:
+ if self.prefix is not None:
+ self.install_cheaders = os.path.join(self.prefix,'include')
+ else:
+ self.announce("Detecting KDE headers directory...")
+ self.install_cheaders = os.path.normpath(os.path.join(kdedistutils.ask_kde_config('--install lib --expandvars').strip(),"../include"))
+ self.announce(" ...KDE library headers is %s" % self.install_cheaders)
+
+ kdedistutils.InstallKDE.finalize_options(self)
+
+ if self.root is not None:
+ self.change_roots('clib','cheaders')
+
+###########################################################################
+class BuildLibpythonize(Command):
+ description = "Build libpythonize"
+
+ user_options = [
+ ('install-dir=', 'd',"Directory for the libpythonize shared library."),
+ ('no-libpythonize',None,"Don't build libpythonize"),
+ ('build-dir=','b', "build directory (where to install from)"),
+ ('python-dir=',None,'Directory containing the Python installation'),
+ ('python-inc-dir=',None,'Directory containing C Header files for Python'),
+ ('clib=',None,'gcc library and path'),
+ ]
+
+ def initialize_options(self):
+ self.build_dir = None
+ self.install_dir = None
+ self.no_libpythonize = 0
+ self.python_inc_dir = None
+ self.python_dir = None
+ self.clib = None
+
+ def finalize_options(self):
+ if self.no_libpythonize==0:
+ own_install_dir = self.install_dir is not None
+
+ self.set_undefined_options('install',\
+ ('build_base', 'build_dir'),
+ ('install_clib', 'install_dir') )
+
+ install = self.get_finalized_command('install')
+ self.install_prefix = install.prefix
+
+ # Python dir
+ if self.python_dir is None:
+ self.python_dir = os.path.split(sysconfig.get_config_var("LIBP"))[0]
+ self.announce("Using %s for the python directory" % self.python_dir)
+
+ # Python include dir.
+ if self.python_inc_dir is None:
+ # Find the Python include directory.
+ self.python_inc_dir = sysconfig.get_config_var("INCLUDEPY")
+ self.announce("Using %s for Python header files" % self.python_inc_dir)
+
+ # Find the C library (libgcc, libgcc_s or some other variation).
+ if self.clib is None:
+ canidatepaths = ["/usr/"+kdedistutils.get_libdir_name(), "/usr/local/"+kdedistutils.get_libdir_name() ]
+ self.clib = kdedistutils.FindFileInPaths("libgcc*.so",canidatepaths)
+ if self.clib!=None:
+ self.clib = glob.glob(os.path.join(self.clib,'libgcc*.so'))[0]
+ else:
+ self.clib = kdedistutils.FindFileInPaths("libgcc*.a",canidatepaths)
+ if self.clib!=None:
+ self.clib = glob.glob(os.path.join(self.clib,'libgcc*.a'))[0]
+ if self.clib is None:
+ raise SystemExit, "Failed to find a suitable libgcc library"
+ self.announce("Using %s for clib" % self.clib)
+
+ # Make a list of places to look for python .so modules
+ self.python_sub_dirs = sysconfig.get_config_var("LIBSUBDIRS").split()
+ base = sysconfig.get_config_var("LIBP")
+ self.python_sub_dirs = [ os.path.join(base,item) for item in self.python_sub_dirs ]
+ self.python_sub_dirs.append(base)
+
+ def get_command_name(self):
+ return 'build_libpythonize'
+
+ def run(self):
+ if self.no_libpythonize:
+ self.announce("Skipping libpythonize")
+ return
+
+ self.announce("Building libpythonize.")
+
+ cppfile = "src/pythonize.cpp"
+ # Compile the library.
+ cmdlist = ['libtool']
+
+ # Couldn't get it to pass without this ...
+ cmdlist.append("--mode=compile")
+ cmdlist.append("--tag=CXX")
+
+ # Find the compiler flags and options
+ # CXX is empty on some Systems, let's do it 'the hard way'.
+ # FIXME :: get CXX from make.conf for Gentoo.
+ if len(sysconfig.get_config_var("CXX").split()) >= 2:
+ cmdlist.extend(sysconfig.get_config_var("CXX").split())
+ else:
+ cmdlist.extend(['g++', '-pthread'])
+
+ # cc_flags
+ cmdlist.append("-c")
+ cmdlist.append("-g")
+
+ # The 4 is randomly chosen!
+ # FIXME :: get CFLAGS from make.conf for Gentoo.
+ if len(sysconfig.get_config_var("CFLAGS").split()) >=4:
+ cmdlist.extend(sysconfig.get_config_var("CFLAGS").split())
+ else:
+ # On Gentoo systems, CFLAGS are not in the environment.
+ raw = os.popen('emerge info 2> /dev/null|grep CFLAGS')
+ lines = raw.readlines()
+ if len(lines):
+ cflags = lines[0].split('"')[1].split()
+ print "Got CFLAGS from emerge info."
+ cmdlist.extend(cflags)
+ else:
+ # Still no CFLAGS found, use these ...
+ cmdlist.extend(['-fno-strict-aliasing', '-DNDEBUG', '-g', '-O3', '-Wall', '-Wstrict-prototypes'])
+
+ # includes
+ cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEDIR"))
+ cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEPY"))
+ cmdlist.append("-I" + self.python_inc_dir)
+ cmdlist.append("-Isrc")
+ # input
+ cmdlist.append(cppfile)
+ # output
+ outputfile = os.path.join(self.build_dir,'libpythonize.lo')
+ cmdlist.append("-o")
+ cmdlist.append(outputfile)
+ spawn(cmdlist) # Execute!!!
+ print
+
+ # Link the resulting object file to create a shared library.
+ cmdlist = ['libtool']
+ cmdlist.append("--mode=link")
+
+ # Grab the linker command name
+ cmdlist.append(sysconfig.get_config_var("LDSHARED").split()[0])
+ # link_flags
+ cmdlist.append("-module")
+ cmdlist.append("-export-dynamic")
+ # object
+ cmdlist.append(outputfile)
+ cmdlist.append("-rpath"); cmdlist.append(self.install_dir)
+ cmdlist.append("-o"); cmdlist.append(os.path.join(self.build_dir,'libpythonize.la'))
+ # Link libs
+ linklist = []
+ linklist.append("-lpython%i.%i" % (sys.version_info[0],sys.version_info[1]) )
+ linklist.extend(sysconfig.get_config_var("LIBS").split())
+
+ linklist.append("-lm")
+ linklist.append("-lstdc++")
+ linklist.append("-lc")
+ linklist.append(self.clib)
+
+ linklist.append("-R"); linklist.append(self.python_dir)
+
+ cmdlist.extend(linklist)
+ spawn(cmdlist) # Execute!!
+ print
+
+###########################################################################
+class InstallLibpythonize(Command):
+ description = "Install libpythonize"
+
+ user_options = [
+ ('install-dir=', 'd',"Directory for the libpythonize shared library."),
+ ('build-dir=','b', "build directory (where to install from)"),
+ ('cheader-dir=', 'h',"Directory for the pythonize.h C header file."),
+ ('install-cmd=', None, "Command to use to install the files"),
+ ('root=', None, "install everything relative to this alternate root directory"),
+ ('force', 'f', "force installation (overwrite existing files)"),
+ ('skip-build', None, "skip the build steps"),
+ ]
+
+ boolean_options = ['force', 'skip-build']
+
+ def initialize_options(self):
+ self.install_dir = None
+ self.build_dir = None
+ self.install_cmd = None
+ self.cheader_dir = None
+ self.outfiles = []
+ self.root = None
+ self.force = 0
+ self.warn_dir = 1
+ self.skip_build = None
+
+ def finalize_options(self):
+ own_install_dir = self.install_dir is not None
+ own_cheader_dir = self.cheader_dir is not None
+
+ self.set_undefined_options('install',
+ ('build_base','build_dir'),
+ ('install_clib', 'install_dir'),
+ ('install_cheaders', 'cheader_dir'),
+ ('install_cmd', 'install_cmd'),
+ ('root', 'root'),
+ ('force', 'force'),
+ ('skip_build', 'skip_build')
+ )
+
+ if own_install_dir and self.root is not None:
+ self.install_dir = change_root(self.root,self.install_dir)
+ if own_cheader_dir and self.root is not None:
+ self.cheader_dir = change_root(self.root,self.cheader_dir)
+
+ def get_command_name(self):
+ return 'install_libpythonize'
+
+ def run(self):
+ if not self.skip_build:
+ self.run_command('build_libpythonize')
+
+ self.announce("Installing libpythonize...")
+
+ self.outfiles.extend(self.mkpath(self.install_dir))
+
+ # Install the library.
+ cmdlist = ['libtool']
+ cmdlist.append("--mode=install")
+ cmdlist.append(self.install_cmd)
+ cmdlist.append("-c")
+ cmdlist.append(os.path.join(self.build_dir,"libpythonize.la"))
+ cmdlist.append(os.path.join(self.install_dir,"libpythonize.la"))
+ spawn(cmdlist) # Execute!!
+ print
+
+ # Work the names of the files that were installed.
+ self.outfiles = []
+ for file in glob.glob(os.path.join(self.build_dir,'.libs/libpythonize*')):
+ self.outfiles.append(os.path.join(self.install_dir,os.path.basename(file)))
+
+ # Create a directory for the C header file.
+ self.outfiles.extend(self.mkpath(self.cheader_dir))
+
+ # Install the header file.
+ (out, _) = self.copy_file("src/pythonize.h", os.path.join(self.cheader_dir,'pythonize.h'))
+ self.outfiles.append(out)
+
+ self.announce("Done installing libpythonize.")
+
+ def get_outputs(self):
+ return self.outfiles
+
+ def mkpath(self, name, mode=0777):
+ return dir_util.mkpath(name, mode, dry_run=self.dry_run)
+
+main()
diff --git a/src/kdedesigner.py b/src/kdedesigner.py
new file mode 100644
index 0000000..7a2b898
--- /dev/null
+++ b/src/kdedesigner.py
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+############################################################################
+# kdedesigner - description #
+# ------------------------------ #
+# begin : Thu Apr 21 2005 #
+# copyright : (C) 2005 by Simon Edwards #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU Library General Public License as #
+# published by the Free Software Foundation; either version 2 of the #
+# License, or (at your option) any later version. #
+# #
+###########################################################################
+
+import __builtin__
+import qtuicompiler
+
+python_import = __builtin__.__import__
+def load(*args):
+ qtuicompiler.DynamicImport(args,True)
+ return apply(python_import,args)
+__builtin__.__import__ = load
diff --git a/src/kdedistutils.py b/src/kdedistutils.py
new file mode 100644
index 0000000..b6e2458
--- /dev/null
+++ b/src/kdedistutils.py
@@ -0,0 +1,2209 @@
+#!/usr/bin/python
+###########################################################################
+# kdedistutils - description #
+# ------------------------------ #
+# begin : Thu Apr 21 2005 #
+# copyright : (C) 2005 by Simon Edwards #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU Library General Public License as #
+# published by the Free Software Foundation; either version 2 of the #
+# License, or (at your option) any later version. #
+# #
+###########################################################################
+
+import distutils.core
+from distutils.core import Extension
+from distutils.cmd import Command
+from distutils.dist import Distribution
+from distutils.command.build import build
+from distutils.command.install import install
+from distutils.command.install_scripts import install_scripts
+from distutils.command.install_data import install_data
+from distutils.command.install_lib import install_lib
+from distutils.util import change_root, convert_path
+from distutils.spawn import find_executable,spawn
+from distutils import sysconfig
+from distutils import log
+from distutils import file_util
+from distutils import dir_util
+from distutils.util import byte_compile
+import qtuicompiler
+import stat
+import os,os.path,imp,glob
+import sys
+from types import StringType
+
+INSTALL_LIST = 'install_log.txt'
+
+###########################################################################
+def setup(**arg_dict):
+
+ if 'cmdclass' not in arg_dict:
+ arg_dict['cmdclass'] = {}
+
+ cmdclass = arg_dict['cmdclass']
+
+ arg_dict.setdefault('data_files',[])
+
+ kdecmdclass = {'install' : InstallKDE,
+ 'install_executable_links' : InstallExecutableLinks,
+ 'install_application_data' : InstallApplicationDataAndLinks,
+ 'build_messages' : BuildI18NMessages,
+ 'install_messages' : InstallI18NMessages,
+ 'update_messages' : UpdateI18NMessages,
+ 'checkpyqt' : CheckPyQt,
+ 'checkpykde' : CheckPyKDE,
+ 'uninstall' : Uninstall,
+ 'build' : BuildKDE,
+ 'build_kcm' : BuildKControlModule,
+ 'install_kcm' : InstallKControlModule,
+ 'build_html' : BuildDocbookHTML,
+ 'install_html' : InstallDocbookHTML,
+ 'install_lib' : InstallLibWithRoot,
+ 'build_kioslave' : BuildKioslave,
+ 'install_kioslave' : InstallKioslave}
+
+ for key in kdecmdclass.iterkeys():
+ cmdclass.setdefault(key,kdecmdclass[key])
+
+ arg_dict.setdefault('distclass',KDEDistribution)
+
+ apply(distutils.core.setup,[],arg_dict)
+
+###########################################################################
+class KDEDistribution(Distribution):
+ def __init__(self,attrs=None):
+ self.min_kde_version = None
+ self.min_qt_version = None
+ self.kcontrol_modules = None
+ self.kioslaves = None
+ self.executable_links = None
+ self.docbooks = None
+ self.application_data = None
+ self.i18n = None
+ Distribution.__init__(self,attrs)
+
+###########################################################################
+def has_kcms(self):
+ if self.distribution.kcontrol_modules is None:
+ return 0
+ return len(self.distribution.kcontrol_modules)!=0
+
+def has_docbook_html(self):
+ if self.distribution.docbooks is None:
+ return 0
+ return len(self.distribution.docbooks)!=0
+
+def has_messages(self):
+ if self.distribution.i18n is None:
+ return 0
+ return len(self.distribution.i18n)!=0
+
+def has_application_data(self):
+ if self.distribution.application_data is None:
+ return 0
+ return len(self.distribution.application_data)!=0
+
+def has_kioslaves(self):
+ if self.distribution.kioslaves is None:
+ return 0
+ return len(self.distribution.kioslaves)!=0
+
+###########################################################################
+# Our slightly extended build command. This also does kcontrol modules.
+class BuildKDE(build):
+
+ user_options = build.user_options[:]
+ user_options.append( ('msgfmt-exe=',None,'Path to the msgfmt executable') )
+ user_options.append( ('meinproc-exe=',None,'Path to the meinproc executable') )
+
+ sub_commands = build.sub_commands[:]
+ sub_commands.append( ('build_kcm',has_kcms) )
+ sub_commands.append( ('build_kioslave',has_kioslaves) )
+ sub_commands.append( ('build_html',has_docbook_html) )
+ sub_commands.append( ('build_messages',has_messages) )
+
+ def __init__(self,dist):
+ build.__init__(self,dist)
+ self.has_kcms = has_kcms
+ self.has_kioslaves = has_kioslaves
+ self.has_docbook_html = has_docbook_html
+ self.has_messages = has_messages
+
+ def initialize_options(self):
+ self.msgfmt_exe = None
+ self.meinproc_exe = None
+ build.initialize_options(self)
+
+ def finalize_options(self):
+ build.finalize_options(self)
+
+ if self.msgfmt_exe is None:
+ # Find msgfmt
+ canidatepaths = []
+ canidatepaths.append( ask_kde_config('--install exe --expandvars').strip() )
+ self.msgfmt_exe = FindExeOnPath('msgfmt',canidatepaths)
+ if self.msgfmt_exe is None:
+ raise SystemExit, "Unable to find 'msgfmt', needed to build i18n messages."
+
+ if self.meinproc_exe is None:
+ # Find meinproc
+ canidatepaths = []
+ canidatepaths.append( ask_kde_config('--install exe --expandvars').strip() )
+ self.meinproc_exe = FindExeOnPath('meinproc',canidatepaths)
+ if self.meinproc_exe is None:
+ raise SystemExit, "Unable to find 'meinproc', needed to generate Docbook HTML documentation."
+
+###########################################################################
+def has_executable_links(self):
+ if self.distribution.executable_links is None:
+ return 0
+ return len(self.distribution.executable_links)!=0
+
+###########################################################################
+class InstallKDE(install):
+ user_options = install.user_options[:]
+ user_options.append( ('kde-prefix=',None,"KDE installation prefix") )
+ user_options.append( ('install-messages=',None,"installation directory for i18n message files") )
+ user_options.append( ('install-html=',None,"installation directory for Docbook HTML files") )
+ user_options.append( ('install-cmd=',None,"Command to use to install the files") )
+ user_options.append( ('install-xdg-apps=',None,"directory for XDG app files") )
+ user_options.append( ('install-kcm=',None,"directory for kcm library files") )
+ user_options.append( ('install-kioslave',None,"directory for kioslave library files") )
+ user_options.append( ('install-protocol',None,"directory for kioslave protocol files") )
+
+ sub_commands = install.sub_commands[:]
+ sub_commands.insert(0, ('checkpykde',None) )
+ sub_commands.insert(0, ('checkpyqt',None) )
+ sub_commands.append( ('install_executable_links',has_executable_links) )
+ sub_commands.append( ('install_messages',has_messages) )
+ sub_commands.append( ('install_html',has_docbook_html) )
+ sub_commands.append( ('install_kcm',has_kcms) )
+ sub_commands.append( ('install_kioslave',has_kioslaves) )
+ sub_commands.append( ('install_application_data',has_application_data) )
+
+ def initialize_options(self):
+ self.kde_prefix = None
+ self.install_messages = None
+ self.install_html = None
+ self.install_cmd = None
+ self.install_xdg_apps = None
+ self.install_kcm = None
+ self.install_kioslave = None
+ self.install_protocol = None
+ self.install_application_data = None
+ install.initialize_options(self)
+
+ def finalize_options(self):
+ # If no install prefix was provided, then we try to detect the KDE install prefix.
+ self.user_supplied_kde_prefix = True
+
+ if self.install_scripts is None:
+ if self.kde_prefix is not None:
+ self.install_scripts = os.path.join(self.kde_prefix,'bin')
+ else:
+ self.announce("Detecting KDE 'bin' directory...")
+ self.install_scripts = ask_kde_config('--install exe --expandvars').strip()
+ self.announce(" ...KDE 'bin' directory is %s" % self.install_scripts)
+
+ if self.install_application_data is None:
+ if self.kde_prefix is not None:
+ self.install_application_data = os.path.join(self.kde_prefix,'share/apps',self.distribution.metadata.name)
+ else:
+ self.announce("Detecting KDE application directory...")
+ kdeappdir = ask_kde_config('--install data --expandvars').strip()
+ self.announce(" ...KDE application directory is %s" % self.install_application_data)
+ self.install_application_data = os.path.join(kdeappdir,self.distribution.metadata.name)
+
+ if self.install_messages is None:
+ if self.kde_prefix is not None:
+ self.install_messages = os.path.join(self.kde_prefix,'share/locale')
+ else:
+ self.announce("Detecting KDE messages directory...")
+ self.install_messages = ask_kde_config('--install locale --expandvars').strip()
+ self.announce(" ...KDE messages directory is %s" % self.install_messages)
+
+ if self.install_html is None:
+ if self.kde_prefix is not None:
+ self.install_html = os.path.join(self.kde_prefix,'share/doc/HTML')
+ else:
+ self.announce("Detecting KDE HTML directory...")
+ self.install_html = ask_kde_config('--install html --expandvars').strip()
+ self.announce(" ...KDE HTML directory is %s" % self.install_html)
+
+ if self.kde_prefix is None:
+ self.announce("Detecting KDE install prefix...")
+ self.kde_prefix = ask_kde_config('--prefix').strip()
+ self.announce(" ...KDE install prefix is %s" % self.kde_prefix)
+ self.user_supplied_kde_prefix = False
+
+ if self.install_cmd is None:
+ self.announce("Detecting 'install' command...")
+ # Ok, time to find the install command.
+ self.install_cmd = find_executable('install')
+ if self.install_cmd is None:
+ raise SystemExit, "Unable to find the 'install' command, needed to install libraries."
+ self.announce(" ...'install' command is %s" % self.install_cmd)
+
+ if self.install_xdg_apps is None:
+ self.announce("Detecting XDG apps directory...")
+ self.install_xdg_apps = ask_kde_config('--install xdgdata-apps --expandvars').strip()
+ self.announce(" ...XDG apps directory is %s" % self.install_xdg_apps)
+
+ if self.install_kcm is None:
+ self.announce("Detecting kcm library directory...")
+ self.install_kcm = os.path.join(ask_kde_config('--install lib --expandvars').strip(),'kde3')
+ self.announce(" ...kcm library directory is %s" % self.install_kcm)
+
+ if self.install_kioslave is None:
+ self.announce("Detecting kioslave library directory...")
+ self.install_kioslave = os.path.join(ask_kde_config('--install lib --expandvars').strip(),'kde3')
+ self.announce(" ...kioslave library directory is %s" % self.install_kioslave)
+
+ if self.install_protocol is None:
+ self.announce("Detecting kioslave protocol directory...")
+ self.install_protocol = ask_kde_config('--install services --expandvars').strip()
+ self.announce(" ...kioslave protocol directory is %s" % self.install_protocol)
+
+ install.finalize_options(self)
+
+ if self.root is not None:
+ self.change_roots('application_data','html','messages','xdg_apps','kcm')
+
+ def get_command_name(self):
+ return 'install'
+
+ def run(self):
+ global INSTALL_LIST
+ install.run(self)
+
+ # Write out the uninstall list.
+ fhandle = open(INSTALL_LIST,'w')
+ for item in self.get_outputs():
+ fhandle.write(item)
+ fhandle.write('\n')
+ fhandle.close()
+
+###########################################################################
+class InstallApplicationDataAndLinks(install_data):
+ def get_command_name(self):
+ return 'install_application_data'
+
+ def initialize_options(self):
+ install_data.initialize_options(self)
+
+ self.data_files = self.distribution.application_data
+
+ def finalize_options(self):
+ self.set_undefined_options('install',
+ ('install_application_data', 'install_dir'),
+ ('root', 'root'),
+ ('force', 'force'),
+ )
+
+ def run(self):
+ self.outfiles.extend(self.mkpath(self.install_dir))
+ for f in self.data_files:
+ if type(f) is StringType:
+ # it's a simple file, so copy it
+ f = convert_path(f)
+ if self.warn_dir:
+ self.warn("setup script did not provide a directory for "
+ "'%s' -- installing right in '%s'" %
+ (f, self.install_dir))
+ if os.path.isfile(f):
+ (out, _) = self.copy_file(f, self.install_dir)
+ self.outfiles.append(out)
+ elif os.path.isdir(f):
+ out = self.copy_tree(f,os.path.join(self.install_dir,f))
+ self.outfiles.extend(out)
+ else:
+ self.warn("Setup script can't find file or directory %s needed for installation." % f)
+ else:
+ # it's a tuple with path to install to and a list of files
+ dir = convert_path(f[0])
+ if not os.path.isabs(dir):
+ dir = change_root(self.install_dir, dir)
+ elif self.root:
+ dir = change_root(self.root, dir)
+ self.outfiles.extend(self.mkpath(dir))
+
+ if f[1] == []:
+ # If there are no files listed, the user must be
+ # trying to create an empty directory, so add the
+ # directory to the list of output files.
+ self.outfiles.append(dir)
+ else:
+ # Copy files, adding them to the list of output files.
+ for data in f[1]:
+ data = convert_path(data)
+ if os.path.islink(data):
+ # Transplant the link to the new location without changing
+ # where it points to. (ie it is _not_ relocated).
+ dest = os.path.join(dir, os.path.basename(data))
+ if os.path.exists(dest):
+ os.remove(dest)
+ os.symlink(os.readlink(data),dest)
+ log.info("moving link %s -> %s" % (data,dest) )
+ #os.chmod(dest, os.stat(data)[stat.ST_MODE])
+ elif os.path.isdir(data):
+ out = self.copy_tree(data,dir)
+ self.outfiles.extend(out)
+ else:
+ (out, _) = self.copy_file(data, dir)
+ self.outfiles.append(out)
+
+ # Compile the .ui files
+ install_cmd = self.get_finalized_command('install')
+ prefix = self.install_dir
+ if prefix[-1] != os.sep:
+ prefix = prefix + os.sep
+ self.outfiles.extend(compile_qtdesigner(self.outfiles, force=1, prefix=prefix, base_dir=install_cmd.prefix, dry_run=self.dry_run))
+
+ # Byte compile the .py files
+ from distutils.util import byte_compile
+ byte_compile(self.outfiles, optimize=0, force=1, prefix=prefix, base_dir=install_cmd.prefix, dry_run=self.dry_run)
+
+ # Add the .pyc files to the list of outfiles.
+ self.outfiles.extend( [item+'c' for item in self.outfiles if item.endswith('.py')] )
+
+ def mkpath(self, name, mode=0777):
+ return dir_util.mkpath(name, mode, dry_run=self.dry_run)
+
+###########################################################################
+class InstallExecutableLinks(Command):
+ description = "Install symlinks"
+
+ user_options = []
+
+ def initialize_options(self):
+ self.outfiles = []
+
+ def finalize_options(self):
+ pass
+
+ def get_command_name(self):
+ return 'install_executable_links'
+
+ def run(self):
+ # FIXME add cmd options?
+ install_script_cmd = self.get_finalized_command('install_scripts')
+ install_data_cmd = self.get_finalized_command('install_application_data')
+
+ destination_dir = install_data_cmd.install_dir
+
+ if not os.path.exists(install_script_cmd.install_dir):
+ self.outfiles.extend(self.mkpath(install_script_cmd.install_dir))
+
+ if self.distribution.executable_links is not None:
+ for link in self.distribution.executable_links:
+ symname = os.path.join(install_script_cmd.install_dir,link[0])
+ target = os.path.join(destination_dir,link[1])
+ log.info("symlinking %s -> %s", symname, target)
+ if not self.dry_run:
+ if os.path.islink(symname):
+ os.remove(symname)
+ os.symlink(target,symname)
+ self.outfiles.append(symname)
+
+ def get_outputs(self):
+ return self.outfiles or []
+
+ def mkpath(self, name, mode=0777):
+ return dir_util.mkpath(name, mode, dry_run=self.dry_run)
+
+###########################################################################
+# Fix the --root option for the install_lib command.
+class InstallLibWithRoot(install_lib):
+ user_options = install_lib.user_options[:]
+ user_options.append( ('root=',None,"install everything relative to this alternate root directory") )
+
+ def initialize_options(self):
+ install_lib.initialize_options(self)
+ self.root = None
+
+ def finalize_options(self):
+ own_install_dir = self.install_dir is not None
+
+ install_lib.finalize_options(self)
+ self.set_undefined_options('install', ('root', 'root'))
+
+ if self.root is not None and own_install_dir:
+ self.install_dir = change_root(self.root, self.install_dir)
+
+###########################################################################
+class Uninstall(Command):
+ description = "Remove all installed files"
+
+ user_options = []
+
+ def initialize_options(self):
+ pass
+
+ def finalize_options(self):
+ pass
+
+ def get_command_name(self):
+ return 'uninstall'
+
+ def run(self):
+ global INSTALL_LIST
+
+ if not os.path.isfile(INSTALL_LIST):
+ self.announce("Unable to uninstall, can't find the file list %s." % INSTALL_LIST)
+ return
+
+ # Suck in the file list.
+ fhandle = open(INSTALL_LIST,'r')
+ file_list = fhandle.readlines()
+ fhandle.close()
+
+ # Remove the files first.
+ for item in file_list:
+ item = item.strip()
+ if os.path.isfile(item) or os.path.islink(item):
+ self.announce("removing '%s'" % item)
+ if not self.dry_run:
+ try:
+ os.remove(item)
+ except OSError, details:
+ self.warn("Could not remove file: %s" % details)
+ elif not os.path.isdir(item):
+ self.announce("skipping removal of '%s' (does not exist)" % item)
+
+ # Remove the directories.
+ file_list.sort()
+ file_list.reverse()
+ # Starting with the longest paths first.
+ for item in file_list:
+ item = item.strip()
+ if os.path.isdir(item):
+ self.announce("removing '%s'" % item)
+ if not self.dry_run:
+ try:
+ os.rmdir(item)
+ except OSError, details:
+ self.warn("Could not remove directory: %s" % details)
+
+###########################################################################
+class BuildKControlModule(Command):
+ description = "Build KControl extensions"
+
+ user_options = [('no-kcontrol',None,"Don't build kcontrol extensions"),
+ ('build-dir=','b', "build directory (where to install from)"),
+ ('python-dir=',None,'Directory containing the Python installation'),
+ ('python-inc-dir=',None,'Directory containing C Header files for Python'),
+ ('kde-inc-dir=',None,'Directory containing C++ header files for KDE'),
+ ('kde-lib-dir=',None,'Directory containing library files for KDE'),
+ ('kde-kcm-lib-dir=',None,'Directory for KDE kcm library files'),
+ ('qt-inc-dir=',None,'Directory containing C++ header files for Qt'),
+ ('qt-lib-dir=',None,'Directory containing library files for Qt'),
+ ('sip-dir=','/usr/lib/pyshared/python2.6','Directory containing the sip library files'),
+ ('clib=',None,'gcc library and path'),
+ ('pyqt-dir=','/usr/lib/pyshared/python2.6','PyQt module directory'),
+ ('pykde-dir=',None,'PyKDE module directory'),
+ ('data-dir=',None,'installation directory for data (script) files')]
+
+ def initialize_options(self):
+ self.no_kcontrol = 0
+ self.build_dir = None
+ self.python_inc_dir = None
+ self.python_dir = None
+ self.kde_inc_dir = None
+ self.kde_lib_dir = None
+ self.kde_kcm_lib_dir = None
+ self.qt_inc_dir = None
+ self.qt_lib_dir = None
+ self.sip_dir = "/usr/lib/pyshared/python2.6"
+ self.clib = None
+ self.pyqt_dir = "/usr/lib/pyshared/python2.6"
+ self.pykde_dir = None
+ self.data_dir = None
+
+ def finalize_options(self):
+ if self.no_kcontrol==0:
+ self.set_undefined_options('install', ('build_base', 'build_dir'),('install_application_data','data_dir'))
+
+ install = self.get_finalized_command('install')
+ self.install_prefix = "/opt/kde3/"
+
+ # KDE inc dir: find it!
+ if self.kde_inc_dir is None:
+ canidatepaths = []
+ kdedir = os.getenv("KDEDIR")
+ if kdedir!=None:
+ canidatepaths.append(os.path.join(kdedir,"include"))
+ canidatepaths.append(os.path.join(install.prefix,"include"))
+ canidatepaths.append('/opt/kde3/include')
+ canidatepaths.append('/opt/kde/include')
+ self.kde_inc_dir = FindFileInPaths('kapplication.h',canidatepaths)
+ if self.kde_inc_dir is None:
+ raise SystemExit, "Failed to find the KDE header file directory."
+ if FindFileInPaths('kapplication.h',[self.kde_inc_dir]) is None:
+ raise SystemExit, "Failed to find KDE header files in: %s" % self.kde_inc_dir
+ self.announce("Using %s for KDE header files" % self.kde_inc_dir)
+
+ # KDE lib dir
+ #if self.kde_lib_dir is None:
+ # self.kde_lib_dir = os.path.join(install.prefix,"lib")
+ self.kde_lib_dir = "/opt/kde3/lib/"
+ self.announce("Using %s for KDE library files" % self.kde_lib_dir)
+
+ # KDE KCM lib dir
+ #if self.kde_kcm_lib_dir is None:
+ # self.kde_kcm_lib_dir = os.path.join(self.kde_lib_dir,"kde3")
+ self.kde_kcm_lib_dir = "/opt/kde3/lib/kde3/"
+ if FindFileInPaths('*kcm*.so',[self.kde_kcm_lib_dir]) is None:
+ raise SystemExit, "Failed to find KDE KCM files in: %s" % self.kde_kcm_lib_dir
+ self.announce("Using %s for KDE KCM library files" % self.kde_kcm_lib_dir)
+
+ # Qt inc dir
+ if self.qt_inc_dir is None:
+ canidatepaths = []
+ qtdir = os.getenv("QTDIR")
+ if qtdir != None:
+ canidatepaths.append(os.path.join(qtdir,"include"))
+ canidatepaths.append(os.path.join(install.prefix,"lib/qt3/include"))
+ canidatepaths.append(os.path.join(install.prefix,"lib/qt3/include"))
+ canidatepaths.append(os.path.join(install.prefix,"include"))
+ canidatepaths.append("/opt/qt3/include")
+ canidatepaths.append("/opt/qt/include")
+ canidatepaths.append("/opt/qt/lib/include")
+ canidatepaths.append("/opt/qt3/lib/include")
+ canidatepaths.append("/usr/include/qt3")
+ self.qt_inc_dir = FindFileInPaths('qstring.h',canidatepaths)
+ if self.qt_inc_dir is None:
+ raise SystemExit,"Failed to find the Qt header file directory"
+ if FindFileInPaths('qstring.h',[self.qt_inc_dir]) is None:
+ raise SystemExit, "Failed to find Qt header files in: %s" % self.qt_inc_dir
+ self.announce("Using %s for Qt header files" % self.qt_inc_dir)
+
+ # Qt lib dir
+ if self.qt_lib_dir is None:
+ canidatepaths = []
+ qtdir = os.getenv("QTDIR")
+ if qtdir != None:
+ canidatepaths.append(os.path.join(qtdir,get_libdir_name()))
+ canidatepaths.append(os.path.join(install.prefix,"lib/qt3/"+get_libdir_name()))
+ canidatepaths.append(os.path.join(install.prefix,"lib/qt3/"+get_libdir_name()))
+ canidatepaths.append(os.path.join(install.prefix,get_libdir_name()))
+ canidatepaths.append("/opt/qt3/"+get_libdir_name())
+ canidatepaths.append("/opt/qt/"+get_libdir_name())
+ canidatepaths.append("/opt/qt/lib/"+get_libdir_name())
+ canidatepaths.append("/opt/qt3/lib/"+get_libdir_name())
+ self.qt_lib_dir = FindFileInPaths('libqt*',canidatepaths)
+ if self.qt_lib_dir is None:
+ raise SystemExit, "Failed to find Qt library files"
+ self.announce("Using %s for Qt library files" % self.qt_lib_dir)
+
+ # Python dir
+ if self.python_dir is None:
+ self.python_dir = os.path.split(sysconfig.get_config_var("LIBP"))[0]
+ self.announce("Using %s for the python directory" % self.python_dir)
+
+ # Python include dir.
+ if self.python_inc_dir is None:
+ # Find the Python include directory.
+ self.python_inc_dir = sysconfig.get_config_var("INCLUDEPY")
+ self.announce("Using %s for Python header files" % self.python_inc_dir)
+
+ # PyQt dir
+ if self.pyqt_dir is None:
+ self.pyqt_dir = sysconfig.get_python_lib()
+ if (FindFileInPaths("libqtcmodule*",[self.pyqt_dir]) is None) and (FindFileInPaths("qt*",[self.pyqt_dir]) is None):
+ raise SystemExit, "Failed to find the PyQt directory: %s" % self.pyqt_dir
+ self.announce("Using %s for PyQt modules" % self.pyqt_dir)
+
+ # PyKDE dir
+ if self.pykde_dir is None:
+ self.pykde_dir = sysconfig.get_python_lib()
+ if (FindFileInPaths("libkdecorecmodule*",[self.pykde_dir]) is None) and (FindFileInPaths("kdecore*",[self.pykde_dir]) is None):
+ raise SystemExit, "Failed to find the PyKDE directory: %s" % self.pykde_dir
+ self.announce("Using %s for PyKDE modules" % self.pykde_dir)
+
+ # Sip dir
+ if self.sip_dir is None:
+ self.sip_dir = sysconfig.get_python_lib()
+ if (FindFileInPaths("libsip*", [self.sip_dir]) is None) and (FindFileInPaths("sip*", [self.sip_dir]) is None):
+ raise SystemExit, "Failed to find libsip files in directory: %s" % self.sip_dir
+ self.announce("Using %s for libsip files" % self.sip_dir)
+
+ # Find the C library (libgcc, libgcc_s or some other variation).
+ if self.clib is None:
+ canidatepaths = ["/usr/"+get_libdir_name(), "/usr/local/"+get_libdir_name() ]
+ self.clib = FindFileInPaths("libgcc*.so",canidatepaths)
+ if self.clib!=None:
+ self.clib = glob.glob(os.path.join(self.clib,'libgcc*.so'))[0]
+ else:
+ self.clib = FindFileInPaths("libgcc*.a",canidatepaths)
+ if self.clib!=None:
+ self.clib = glob.glob(os.path.join(self.clib,'libgcc*.a'))[0]
+ if self.clib is None:
+ raise SystemExit, "Failed to find a suitable libgcc library"
+ self.announce("Using %s for clib" % self.clib)
+
+ # Make a list of places to look for python .so modules
+ self.python_sub_dirs = sysconfig.get_config_var("LIBSUBDIRS").split()
+ base = sysconfig.get_config_var("LIBP")
+ self.python_sub_dirs = [ os.path.join(base,item) for item in self.python_sub_dirs ]
+ self.python_sub_dirs.append(base)
+
+ def get_command_name(self):
+ return 'build_kcm'
+
+ def run(self):
+ if self.no_kcontrol:
+ self.announce("Skipping KControl modules")
+ return
+
+ if not os.path.isdir(self.build_dir):
+ os.mkdir(self.build_dir)
+
+ for moduletuple in self.distribution.kcontrol_modules:
+ self.announce("Building KControl module from desktop file %s." % moduletuple[0])
+
+ # Read the desktop file
+ factoryfunction = None
+ libraryname = None
+ cmodulecategory = None
+ try:
+ fhandle = open(moduletuple[0],'r')
+ for line in fhandle.readlines():
+ parts = line.strip().split('=')
+ try:
+ if parts[0]=="X-KDE-Library":
+ libraryname = parts[1]
+ elif parts[0]=="Exec":
+ shellcmd = parts[1].split()
+ modulepath = shellcmd[-1]
+ if '/' in modulepath:
+ cmodulecategory = os.path.dirname(modulepath)
+ else:
+ cmodulecategory = ""
+ elif parts[0]=="X-KDE-FactoryName":
+ factoryfunction = 'create_'+parts[1]
+ except IndexError:
+ pass
+ fhandle.close()
+ except IOError:
+ raise SystemExit, "Failed to find kcontrol desktop file: %s" % moduletuple[0]
+
+ # Sanity check.
+ if factoryfunction is None:
+ raise SystemExit, "Failed to find factory name (Was there a X-KDE-FactoryName entry in the desktop file?)"
+ if libraryname is None:
+ raise SystemExit, "Failed to find library name (Was there a X-KDE-Library entry in the desktop file?)"
+ if cmodulecategory is None:
+ raise SystemExit, "Failed to find the kcontrol category name (Was there a Exec entry in the desktop file?)"
+
+ modulename = os.path.basename(moduletuple[1])
+ if modulename.endswith('.py'):
+ modulename = modulename[:-3]
+ desktopfilename = moduletuple[0]
+
+ stub_cpp_name = 'kcm_'+libraryname+'.cpp'
+ stub_so_name = 'kcm_'+libraryname+'.so'
+ stub_la_name = 'kcm_'+libraryname+'.la'
+ python_version = '%i.%i' % (sys.version_info[0],sys.version_info[1])
+
+ # Build the 'stub' code.
+ cppcode = self.cpptemplate % {"moduledir": self.data_dir,
+ "modulename": modulename,
+ "factoryfunction": factoryfunction,
+ "python_version": python_version}
+
+ # Put it on disk.
+ cppfile = os.path.join(os.path.dirname(moduletuple[0]),stub_cpp_name)
+ try:
+ fhandle = open(cppfile,'w')
+ fhandle.write(cppcode)
+ fhandle.close()
+ except IOError:
+ raise SystemExit, "Could not write the C++ stub: %s" % cppfile
+
+ # Compile the stub library.
+ cmdlist = ['libtool']
+
+ # Couldn't get it to pass without this ...
+ cmdlist.append("--mode=compile")
+ cmdlist.append("--tag=CXX")
+
+ # Find the compiler flags and options
+ # CXX is empty on some Systems, let's do it 'the hard way'.
+ # FIXME :: get CXX from make.conf for Gentoo.
+ if len(sysconfig.get_config_var("CXX").split()) >= 2:
+ cmdlist.extend(sysconfig.get_config_var("CXX").split())
+ else:
+ cmdlist.extend(['g++', '-pthread'])
+
+ #cmdlist.extend(sysconfig.get_config_var("CXX").split())
+
+ # cc_flags
+ cmdlist.append("-c")
+ cmdlist.append("-g")
+
+ # The 4 is randomly chosen!
+ # FIXME :: get CFLAGS from make.conf for Gentoo.
+ if len(sysconfig.get_config_var("CFLAGS").split()) >=4:
+ cmdlist.extend(sysconfig.get_config_var("CFLAGS").split())
+ else:
+ # On Gentoo systems, CFLAGS are not in the environment.
+ raw = os.popen('emerge info 2> /dev/null|grep CFLAGS')
+ lines = raw.readlines()
+ if len(lines):
+ cflags = lines[0].split('"')[1].split()
+ print "Got CFLAGS from emerge info."
+ cmdlist.extend(cflags)
+ else:
+ # Still no CFLAGS found, use these ...
+ cmdlist.extend(['-fno-strict-aliasing', '-DNDEBUG', '-g', '-O3', '-Wall', '-Wstrict-prototypes'])
+
+ #sysconfig.get_config_var("CFLAGS").split()
+ # includes
+ cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEDIR"))
+ cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEDIR"))
+ cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEPY"))
+ cmdlist.append("-I" + self.python_inc_dir)
+ cmdlist.append("-I" + self.kde_inc_dir)
+ cmdlist.append("-I" + self.qt_inc_dir)
+ cmdlist.append("-I.")
+ # input
+ cmdlist.append(cppfile)
+ # output
+ outputfile = os.path.join(self.build_dir,libraryname+'.lo')
+ cmdlist.append("-o")
+ cmdlist.append(outputfile)
+ spawn(cmdlist) # Execute!!!
+ print
+
+ # Link the resulting object file to create a shared library.
+ cmdlist = ['libtool']
+ cmdlist.append("--mode=link")
+
+ # Grab the linker command name
+ cmdlist.append(sysconfig.get_config_var("LDSHARED").split()[0])
+ # link_flags
+ cmdlist.append("-module")
+ cmdlist.append("-export-dynamic")
+ # object
+ cmdlist.append(outputfile)
+ cmdlist.append("-rpath"); cmdlist.append(self.kde_kcm_lib_dir)
+ cmdlist.append("-o"); cmdlist.append(os.path.join(self.build_dir,stub_la_name))
+ # Link libs
+ linklist = []
+ linklist.append("-lpython%s" % python_version)
+ linklist.extend(sysconfig.get_config_var("LIBS").split())
+
+ # FIXME I doubt half of these libraries need to be here.
+ linklist.append(self.sip_dir+"/sip.so")
+ # PyQt libs
+ linklist.append(self.pyqt_dir+"/qt.so")
+ # PyKDE libs
+ linklist.append(self.pykde_dir+"/kdecore.so")
+ linklist.append(self.pykde_dir+"/kdeui.so")
+
+# linklist.append("-L"+self.sip_dir); linklist.append("-lsip")
+# # PyQt libs
+# linklist.append("-L"+self.pyqt_dir); linklist.append("-lqtcmodule")
+# # PyKDE libs
+# linklist.append("-L"+self.pykde_dir); linklist.append("-lkdecorecmodule"); linklist.append("-lkdeuicmodule")
+
+ linklist.append("-L"+self.kde_lib_dir); linklist.append("-L/opt/kde3/lib"); linklist.append("-lkdecore"); linklist.append("-lpythonize")
+ linklist.append("-L"+self.qt_lib_dir); linklist.append("-lqt-mt")
+ linklist.append("-lm")
+ linklist.append("-lstdc++")
+ linklist.append("-lc")
+ linklist.append(self.clib)
+
+ linklist.append("-R"); linklist.append(self.python_dir)
+ linklist.append("-R"); linklist.append(self.qt_lib_dir)
+ linklist.append("-R"); linklist.append(self.sip_dir)
+ linklist.append("-R"); linklist.append(self.pyqt_dir)
+ linklist.append("-R"); linklist.append(self.pykde_dir)
+ linklist.append("-R"); linklist.append(self.kde_lib_dir)
+
+ cmdlist.extend(linklist)
+ spawn(cmdlist) # Execute!!
+ print
+
+ cpptemplate = r"""
+/*
+ * pykcm_launcher.cpp
+ *
+ * Launch Control Centre modules written in Python using an embedded Python
+ * interpreter.
+ * Based on David Boddie's PyKDE-components.
+ */
+
+// pythonize.h must be included first.
+#include <pythonize.h>
+#include <kcmodule.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <klibloader.h>
+#include <kstandarddirs.h>
+#include <ksimpleconfig.h>
+#include <qstring.h>
+#include <sip.h>
+
+#define MODULE_DIR "%(moduledir)s"
+#define EXTRA_MODULE_DIR "/opt/kde3/share/python-support/kde-guidance-kde3"
+#define EXTRA_MODULE_DIR_TWO "/opt/kde3/share/python-support/guidance-backends-kde3"
+#define EXTRA_MODULE_DIR_THREE "/opt/kde3/share/python-support/kde-guidance-powermanager-kde3"
+#define MODULE_NAME "%(modulename)s"
+#define FACTORY "%(factoryfunction)s"
+#define CPP_FACTORY %(factoryfunction)s
+#define LIB_PYTHON "libpython%(python_version)s.so"
+#define debug 1
+
+static KCModule *report_error(char *msg) {
+ if (debug) printf ("error: %%s\n", msg);
+ return NULL;
+}
+
+static KCModule* return_instance( QWidget *parent, const char *name ) {
+ KCModule* kcmodule;
+ PyObject *pyKCModuleTuple;
+ PyObject *pyKCModule;
+ Pythonize *pyize; // Pythonize object to manage the Python interpreter.
+ int isErr;
+
+ // Try to determine what py script we're loading. Note that "name"
+ // typically appears to be NULL.
+ QString script(MODULE_NAME);
+
+ // Reload libpython, but this time tell the runtime linker to make the
+ // symbols global and available for later loaded libraries/module.
+ KLibLoader::self()->globalLibrary(LIB_PYTHON);
+
+ // Start the interpreter.
+ pyize = initialize();
+ if (!pyize) {
+ return report_error ("***Failed to start interpreter\n");
+ }
+
+ // Add the path to the python script to the interpreter search path.
+ QString path = QString(MODULE_DIR);
+ if(path == QString::null) {
+ return report_error ("***Failed to locate script path");
+ }
+ if(!pyize->appendToSysPath (path.latin1 ())) {
+ return report_error ("***Failed to set sys.path\n");
+ }
+ QString extrapath = QString(EXTRA_MODULE_DIR);
+ if(!pyize->appendToSysPath (extrapath.latin1 ())) {
+ return report_error ("***Failed to set extra sys.path\n");
+ }
+ QString extrapath_two = QString(EXTRA_MODULE_DIR_TWO);
+ if(!pyize->appendToSysPath (extrapath_two.latin1 ())) {
+ return report_error ("***Failed to set extra 2 sys.path\n");
+ }
+ QString extrapath_three = QString(EXTRA_MODULE_DIR_THREE);
+ if(!pyize->appendToSysPath (extrapath_three.latin1 ())) {
+ return report_error ("***Failed to set extra 3 sys.path\n");
+ }
+
+ // Load the Python script.
+ PyObject *pyModule = pyize->importModule ((char *)script.latin1 ());
+ if(!pyModule) {
+ PyErr_Print();
+ return report_error ("***failed to import module\n");
+ }
+
+ // Inject a helper function
+ QString bridge = QString("import sip\n"
+ "import qt\n"
+ "def kcontrol_bridge_" FACTORY "(parent,name):\n"
+ " if parent!=0:\n"
+#if SIP_VERSION >= 0x040200
+ " wparent = sip.wrapinstance(parent,qt.QWidget)\n"
+#else
+ " wparent = sip.wrapinstance(parent,'QWidget')\n"
+#endif
+ " else:\n"
+ " wparent = None\n"
+ " inst = " FACTORY "(wparent, name)\n"
+ " return (inst,sip.unwrapinstance(inst))\n");
+ PyRun_String(bridge.latin1(),Py_file_input,PyModule_GetDict(pyModule),PyModule_GetDict(pyModule));
+
+ // Get the Python module's factory function.
+ PyObject *kcmFactory = pyize->getNewObjectRef(pyModule, "kcontrol_bridge_" FACTORY);
+ if(!kcmFactory) {
+ return report_error ("***failed to find module factory\n");
+ }
+
+ // Call the factory function. Set up the args.
+ PyObject *pyParent = PyLong_FromVoidPtr(parent);
+ PyObject *pyName = PyString_FromString(MODULE_NAME);
+ // Using NN here is effect gives our references to the arguement away.
+ PyObject *args = Py_BuildValue ("NN", pyParent, pyName);
+ if(pyName && pyParent && args) {
+ // run the factory function
+ pyKCModuleTuple = pyize->runFunction(kcmFactory, args);
+ if(!pyKCModuleTuple) {
+ PyErr_Print();
+ return report_error ("*** runFunction failure\n;");
+ }
+ } else {
+ return report_error ("***failed to create args\n");
+ }
+ // cleanup a bit
+ pyize->decref(args);
+ pyize->decref(kcmFactory);
+
+ // Stop this from getting garbage collected.
+ Py_INCREF(PyTuple_GET_ITEM(pyKCModuleTuple,0));
+
+ // convert the KCModule PyObject to a real C++ KCModule *.
+ isErr = 0;
+ pyKCModule = PyTuple_GET_ITEM(pyKCModuleTuple,1);
+ kcmodule = (KCModule *)PyLong_AsVoidPtr(pyKCModule);
+ if(!kcmodule) {
+ return report_error ("***failed sip conversion to C++ pointer\n");
+ }
+ pyize->decref(pyKCModuleTuple);
+
+ // PyKDE can't run the module without this - Pythonize
+ // grabs the lock at initialization and we have to give
+ // it back before exiting. At this point, we no longer need
+ // it.
+ //pyize->releaseLock ();
+
+ // take care of any translation info
+ KGlobal::locale()->insertCatalogue(script);
+
+ // Return the pointer to our new KCModule
+ return kcmodule;
+}
+
+extern "C" {
+ // Factory function that kcontrol will call.
+ KCModule* CPP_FACTORY(QWidget *parent, const char *name) {
+ return return_instance(parent, name);
+ }
+}
+"""
+
+###########################################################################
+class InstallKControlModule(Command):
+ description = "Install Kcontrol module files"
+
+ user_options = [
+ ('install-dir=', 'd', "base directory for installing kcontrol module files"),
+ ('install-cmd=', None, "Command to use to install the files"),
+ ('xdg-apps-dir=',None,"directory for XDG app files"),
+ ('build-dir=','b', "build directory (where to install from)"),
+ ('root=', None, "install everything relative to this alternate root directory"),
+ ('force', 'f', "force installation (overwrite existing files)"),
+ ('skip-build', None, "skip the build steps"),
+ ]
+ boolean_options = ['force', 'skip-build']
+
+ def initialize_options(self):
+ self.build_dir = None
+ self.install_dir = None
+ self.install_cmd = None
+ self.xdg_apps_dir = None
+ self.outfiles = []
+ self.root = None
+ self.force = 0
+ self.warn_dir = 1
+ self.skip_build = None
+
+ def finalize_options(self):
+ own_install_dir = self.install_dir is not None
+ own_xdg_apps_dir = self.xdg_apps_dir is not None
+
+ self.set_undefined_options('install',
+ ('build_base', 'build_dir'),
+ ('install_kcm', 'install_dir'),
+ ('install_xdg_apps','xdg_apps_dir'),
+ ('root', 'root'),
+ ('force', 'force'),
+ ('skip_build', 'skip_build'),
+ ('install_cmd', 'install_cmd')
+ )
+
+ if own_install_dir and self.root is not None:
+ self.install_dir = change_root(self.root,self.installdir)
+ if own_xdg_apps_dir and self.root is not None:
+ self.xdg_apps_dir = change_root(self.root,self.xdg_apps_dir)
+
+ def get_command_name(self):
+ return 'install_kcm'
+
+ def run(self):
+ if not self.skip_build:
+ self.run_command('build_kcm')
+
+ self.announce("Installing Kcontrol module files...")
+
+ for moduletuple in self.distribution.kcontrol_modules:
+ self.announce("Building KControl module from desktop file %s." % moduletuple[0])
+
+ # Read the desktop file
+ libraryname = None
+ cmodulecategory = None
+ try:
+ fhandle = open(moduletuple[0],'r')
+ for line in fhandle.readlines():
+ parts = line.strip().split('=')
+ try:
+ if parts[0]=="X-KDE-Library":
+ libraryname = parts[1]
+ elif parts[0]=="Exec":
+ shellcmd = parts[1].split()
+ modulepath = shellcmd[-1]
+ if '/' in modulepath:
+ cmodulecategory = os.path.dirname(modulepath)
+ else:
+ cmodulecategory = ""
+ except IndexError:
+ pass
+ fhandle.close()
+ except IOError:
+ raise SystemExit, "Failed to find kcontrol desktop file: %s" % moduletuple[0]
+
+ if libraryname is None:
+ raise SystemExit, "Failed to find library name (Was there a X-KDE-Library entry in the desktop file?)"
+ if cmodulecategory is None:
+ raise SystemExit, "Failed to find the kcontrol category name (Was there a Exec entry in the desktop file?)"
+
+ desktopfilename = moduletuple[0]
+ self.outfiles.extend(self.mkpath(self.xdg_apps_dir))
+ desktopfile_dest = os.path.join(self.xdg_apps_dir,os.path.basename(desktopfilename))
+ self.copy_file(desktopfilename, desktopfile_dest)
+
+ stub_la_name = 'kcm_'+libraryname+'.la'
+
+ self.outfiles.extend(self.mkpath(self.install_dir))
+
+ # Install the library.
+ cmdlist = ['libtool']
+ cmdlist.append("--mode=install")
+ cmdlist.append(self.install_cmd)
+ cmdlist.append("-c")
+ cmdlist.append(os.path.join(self.build_dir,stub_la_name))
+ cmdlist.append(os.path.join(self.install_dir,stub_la_name))
+ spawn(cmdlist) # Execute!!
+ print
+
+ self.outfiles = [os.path.join(self.install_dir,os.path.basename(file)) for file in glob.glob(os.path.join(self.build_dir,'.libs','kcm_'+libraryname+'*'))]
+ self.outfiles.append(desktopfile_dest)
+
+ self.announce("Done installing Kcontrol module files.")
+
+ def get_outputs(self):
+ return self.outfiles or []
+
+ def mkpath(self, name, mode=0777):
+ return dir_util.mkpath(name, mode, dry_run=self.dry_run)
+
+###########################################################################
+class BuildDocbookHTML(Command):
+ description = "Build Docbook HTML documentation"
+
+ user_options = [('meinproc-exe=',None,"Path to the meinproc executable")]
+
+ def initialize_options(self):
+ self.html_prefix = None
+ self.meinproc_exe = None
+
+ def finalize_options(self):
+ self.set_undefined_options('build', ('meinproc_exe', 'meinproc_exe') )
+
+ def get_command_name(self):
+ return 'build_docbook'
+
+ def run(self):
+ for docbook_tuple in self.distribution.docbooks:
+ input_dir = docbook_tuple[0]
+ language_code = docbook_tuple[1]
+
+ self.announce("Building Docbook documentation from directory %s." % input_dir)
+
+ indexdoc_file_name = os.path.join(input_dir,'index.docbook')
+ if not os.path.exists(indexdoc_file_name):
+ raise SystemExit, "File %s is missing." % indexdoc_file_name
+
+ cwd = os.getcwd()
+ os.chdir(input_dir)
+ try:
+ spawn([self.meinproc_exe,"--check","--cache",'index.cache.bz2', 'index.docbook'])
+ spawn([self.meinproc_exe, 'index.docbook'])
+ finally:
+ os.chdir(cwd)
+
+###########################################################################
+class InstallDocbookHTML(Command):
+ description = "Install Docbook HTML files"
+
+ user_options = [
+ ('install-dir=', 'd',"base directory for installing docbook HTML files"),
+ ('root=', None, "install everything relative to this alternate root directory"),
+ ('force', 'f', "force installation (overwrite existing files)"),
+ ('skip-build', None, "skip the build steps"),
+ ]
+ boolean_options = ['force', 'skip-build']
+
+ def initialize_options(self):
+ self.install_dir = None
+ self.outfiles = []
+ self.root = None
+ self.force = 0
+ self.warn_dir = 1
+ self.skip_build = None
+
+ def finalize_options(self):
+ own_install_dir = self.install_dir is not None
+
+ self.set_undefined_options('install',
+ ('install_html', 'install_dir'),
+ ('root', 'root'),
+ ('force', 'force'),
+ ('skip_build', 'skip_build'),
+ )
+
+ if own_install_dir and self.root is not None:
+ self.install_dir = change_root(self.root,self.installdir)
+
+ def get_command_name(self):
+ return 'install_html'
+
+ def run(self):
+ if not self.skip_build:
+ self.run_command('build_html')
+
+ self.announce("Installing HTML files...")
+ counter = 0
+ for docbook_tuple in self.distribution.docbooks:
+ input_dir = docbook_tuple[0]
+ language_code = docbook_tuple[1]
+
+ self.announce("Install Docbook documentation from directory %s." % input_dir)
+ source_file = os.path.join(input_dir,'index.cache.bz2')
+ if not os.path.exists(source_file):
+ raise SystemExit, "File %s is missing." % source_file
+
+ dest_path = os.path.join(self.install_dir, language_code, self.distribution.metadata.name)
+ self.outfiles.extend(self.mkpath(dest_path))
+ dest_file = os.path.join(dest_path,'index.cache.bz2')
+
+ self.copy_file(source_file, dest_file)
+ self.outfiles.append(dest_file)
+ counter += 1
+
+ # Also install any lose HTML files.
+ for source_file in glob.glob(os.path.join(input_dir,'*.html')):
+ htmlfile = os.path.basename(source_file)
+ dest_file = os.path.join(dest_path,htmlfile)
+ self.copy_file(source_file, dest_file)
+ self.outfiles.append(dest_file)
+ counter += 1
+
+ if len(docbook_tuple)==3:
+ extra_files = docbook_tuple[2]
+ for file in extra_files:
+ source_file = os.path.join(input_dir,file)
+ dest_file = os.path.join(self.install_dir, language_code, self.distribution.metadata.name,file)
+ self.copy_file(source_file, dest_file)
+ self.outfiles.append(dest_file)
+ counter += 1
+
+ self.announce("Done installing %i HTML files." % counter)
+
+ def get_outputs(self):
+ return self.outfiles or []
+
+ def mkpath(self, name, mode=0777):
+ return dir_util.mkpath(name, mode, dry_run=self.dry_run)
+
+###########################################################################
+class UpdateI18NMessages(Command):
+ description = "Extract and update messages for translation"
+
+ user_options = [('xgettext-exe=',None,'Full path to the xgetext executable'),\
+ ('kde-pot=',None,'Location of the the KDE pot file'),\
+ ('msgmerge-exe=',None,'Full path to the msgmerge executable')]
+
+ def initialize_options(self):
+ self.xgettext_exe = None
+ self.msgmerge_exe = None
+ self.kde_pot = None
+
+ def finalize_options(self):
+ if self.xgettext_exe is None:
+ install = self.get_finalized_command('install')
+
+ canidate_paths = []
+ if install.user_supplied_kde_prefix:
+ canidate_paths.append(os.path.join(install.kde_prefix,'bin'))
+
+ self.announce("Detecting xgettext...")
+ canidate_paths.append(ask_kde_config('--install exe --expandvars').strip())
+ self.xgettext_exe = FindExeOnPath('xgettext',canidate_paths)
+ if self.xgettext_exe is None:
+ raise SystemExit, "Unable to find 'xgettext'."
+ self.announce(" ...xgettext found at %s" % self.xgettext_exe)
+
+ if self.msgmerge_exe is None:
+ install = self.get_finalized_command('install')
+
+ canidate_paths = []
+ if install.user_supplied_kde_prefix:
+ canidate_paths.append(os.path.join(install.kde_prefix,'bin'))
+
+ self.announce("Detecting msgmerge...")
+ canidate_paths.append(ask_kde_config('--install exe --expandvars').strip())
+ self.msgmerge_exe = FindExeOnPath('msgmerge',canidate_paths)
+ if self.msgmerge_exe is None:
+ raise SystemExit, "Unable to find 'xgettext'."
+ self.announce(" ...msgmerge found at %s" % self.msgmerge_exe)
+
+ if self.kde_pot is None:
+ self.announce("Detecting kde.pot...")
+ canidatepaths = []
+ kdedir = os.getenv("KDEDIR")
+ if kdedir!=None:
+ canidatepaths.append(os.path.join(kdedir,"include"))
+ install = self.get_finalized_command('install')
+ canidatepaths.append(os.path.join(install.kde_prefix,"include"))
+ canidatepaths.append('/opt/kde3/include')
+ canidatepaths.append('/opt/kde/include')
+ kde_pot_dir = FindFileInPaths('kde.pot',canidatepaths)
+
+ if kde_pot_dir is None:
+ raise SystemExit, "Failed to find the kde.pot file."
+
+ self.kde_pot = os.path.join(kde_pot_dir,'kde.pot')
+ self.announce(" ...kde.pot found at %s" % self.kde_pot)
+
+ def get_command_name(self):
+ return 'update_messages'
+
+ def run(self):
+ if self.distribution.i18n is None: return
+
+ self.announce("Extracting and merging i18n messages...")
+ po_dir = self.distribution.i18n[0]
+
+ # FIXME : .rc and .ui files
+ input_files = []
+
+ # Compile any UI files
+ for dir in self.distribution.i18n[1]:
+ for file in glob.glob(os.path.join(dir,'*.ui')):
+ qtuicompiler.UpdateUI(file,kde=True)
+
+ # Fetch all of the python files.
+ for dir in self.distribution.i18n[1]:
+ input_files.extend(glob.glob(os.path.join(dir,'*.py')))
+
+ target_pot = os.path.join(po_dir,self.distribution.metadata.name+".pot")
+
+ cmd = [self.xgettext_exe, '-o', target_pot, '-ki18n', '-ktr2i18n', \
+ '-kI18N_NOOP', '-ktranslate', '-kaliasLocale','-x',self.kde_pot]
+ cmd.extend(input_files)
+ spawn(cmd)
+
+ for po_file in glob.glob(os.path.join(po_dir,'*.po')):
+ temp_po = po_file + '.temp'
+ cmd = [self.msgmerge_exe,'-q','-o',temp_po,po_file,target_pot]
+ spawn(cmd)
+ os.rename(temp_po,po_file)
+
+ self.announce("Finished with i18n messages.")
+
+###########################################################################
+class BuildI18NMessages(Command):
+ description = "Build i18n messages"
+
+ user_options = [('msgfmt-exe=',None,'Path to the msgfmt executable')]
+
+ def initialize_options(self):
+ self.msgfmt_exe = None
+
+ def finalize_options(self):
+ self.set_undefined_options('build', ('msgfmt_exe', 'msgfmt_exe'))
+
+ def get_command_name(self):
+ return 'build_messages'
+
+ def run(self):
+ if self.distribution.i18n is None: return
+
+ self.announce("Building i18n messages...")
+ po_dir = self.distribution.i18n[0]
+
+ i = 0
+ for po_file in [file for file in os.listdir(po_dir) if file.endswith('.po')]:
+ source = os.path.join(po_dir,po_file)
+ target = source[:-3]+'.gmo'
+ cmd = [self.msgfmt_exe,'-o',target, source]
+ spawn(cmd)
+ i += 1
+ self.announce("Done building %i i18n messages." % i)
+
+###########################################################################
+class InstallI18NMessages(Command):
+ description = "Install messages"
+
+ user_options = [
+ ('install-dir=', 'd',"base directory for installing message files (default: installation base dir)"),
+ ('root=', None, "install everything relative to this alternate root directory"),
+ ('force', 'f', "force installation (overwrite existing files)"),
+ ('skip-build', None, "skip the build steps"),
+ ]
+
+ boolean_options = ['force', 'skip-build']
+
+ def initialize_options(self):
+ self.install_dir = None
+ self.outfiles = []
+ self.root = None
+ self.force = 0
+ self.warn_dir = 1
+ self.skip_build = None
+
+ def finalize_options(self):
+ own_install_dir = self.install_dir is not None
+
+ self.set_undefined_options('install',
+ ('install_messages', 'install_dir'),
+ ('root', 'root'),
+ ('force', 'force'),
+ ('skip_build', 'skip_build'),
+ )
+
+ if own_install_dir and self.root is not None:
+ self.install_dir = change_root(self.root,self.installdir)
+
+ def get_command_name(self):
+ return 'install_messages'
+
+ def run(self):
+ if not self.skip_build:
+ self.run_command('build_messages')
+
+ self.announce("Installing i18n messages...")
+ po_dir = self.distribution.i18n[0]
+
+ counter = 0
+ for po_file in os.listdir(po_dir):
+ if po_file.endswith('.po'):
+ source_file = os.path.join(po_dir,po_file[:-3]) + '.gmo'
+
+ # Setup installation of the translation file.
+ dest_path = os.path.join(self.install_dir, po_file[:-3],'LC_MESSAGES')
+ self.outfiles.extend(self.mkpath(dest_path))
+ dest_file = os.path.join(dest_path, self.distribution.metadata.name+'.mo')
+
+ self.copy_file(source_file, dest_file)
+ self.outfiles.append(dest_file)
+ counter += 1
+ self.announce("Done installing %i i18n messages." % counter)
+
+ def get_outputs(self):
+ return self.outfiles
+
+ def mkpath(self, name, mode=0777):
+ return dir_util.mkpath(name, mode, dry_run=self.dry_run)
+
+
+###########################################################################
+class BuildKioslave(Command):
+ description = "Build Kioslaves"
+
+ user_options = [('no-kioslave',None,"Don't build kioslaves"),
+ ('build-dir=','b', "build directory (where to install from)"),
+ ('python-dir=',None,'Directory containing the Python installation'),
+ ('python-inc-dir=',None,'Directory containing C Header files for Python'),
+ ('kde-inc-dir=',None,'Directory containing C++ header files for KDE'),
+ ('kde-lib-dir=',None,'Directory containing library files for KDE'),
+ ('kde-kioslave-lib-dir=',None,'Directory for KDE kioslave library files'),
+ ('kde-protocol-dir=',None,'Directory for KDE kioslave protocol files'),
+ ('qt-inc-dir=',None,'Directory containing C++ header files for Qt'),
+ ('qt-lib-dir=',None,'Directory containing library files for Qt'),
+ ('sip-dir=','/usr/lib/pyshared/python2.6','Directory containing the sip library files'),
+ ('clib=',None,'gcc library and path'),
+ ('pyqt-dir=','/usr/lib/pyshared/python2.6','PyQt module directory'),
+ ('pykde-dir=',None,'PyKDE module directory'),
+ ('data-dir=',None,'installation directory for data (script) files')]
+
+ def initialize_options(self):
+ self.no_kioslave = 0
+ self.build_dir = None
+ self.python_inc_dir = None
+ self.python_dir = None
+ self.kde_inc_dir = None
+ self.kde_lib_dir = None
+ self.kde_kioslave_lib_dir = None
+ self.kde_protocol_dir = None
+ self.qt_inc_dir = None
+ self.qt_lib_dir = None
+ self.sip_dir = "/usr/lib/pyshared/python2.6"
+ self.clib = None
+ self.pyqt_dir = "/usr/lib/pyshared/python2.6"
+ self.pykde_dir = None
+ self.data_dir = None
+
+ def finalize_options(self):
+ if self.no_kioslave==0:
+ self.set_undefined_options('install', ('build_base', 'build_dir'),('install_application_data','data_dir'))
+
+ install = self.get_finalized_command('install')
+ self.install_prefix = "/opt/kde3/"
+
+ # KDE inc dir: find it!
+ if self.kde_inc_dir is None:
+ canidatepaths = []
+ kdedir = os.getenv("KDEDIR")
+ if kdedir!=None:
+ canidatepaths.append(os.path.join(kdedir,"include"))
+ canidatepaths.append(os.path.join(install.prefix,"include"))
+ canidatepaths.append('/opt/kde3/include')
+ canidatepaths.append('/opt/kde/include')
+ self.kde_inc_dir = FindFileInPaths('kapplication.h',canidatepaths)
+ if self.kde_inc_dir is None:
+ raise SystemExit, "Failed to find the KDE header file directory."
+ if FindFileInPaths('kapplication.h',[self.kde_inc_dir]) is None:
+ raise SystemExit, "Failed to find KDE header files in: %s" % self.kde_inc_dir
+ self.announce("Using %s for KDE header files" % self.kde_inc_dir)
+
+ # KDE lib dir
+ #if self.kde_lib_dir is None:
+ # self.kde_lib_dir = os.path.join(install.prefix,"lib")
+ self.kde_lib_dir = "/opt/kde3/lib/"
+ self.announce("Using %s for KDE library files" % self.kde_lib_dir)
+
+ # KDE kioslave lib dir
+ #if self.kde_kioslave_lib_dir is None:
+ # self.kde_kioslave_lib_dir = os.path.join(self.kde_lib_dir,"kde3")
+ self.kde_kioslave_lib_dir = "/opt/kde3/lib/kde3/"
+ if FindFileInPaths('kio_*.so',[self.kde_kioslave_lib_dir]) is None:
+ raise SystemExit, "Failed to find KDE Kioslave library files in: %s" % self.kde_kioslave_lib_dir
+ self.announce("Using %s for KDE Kioslave library files" % self.kde_kioslave_lib_dir)
+
+ # Qt inc dir
+ if self.qt_inc_dir is None:
+ canidatepaths = []
+ qtdir = os.getenv("QTDIR")
+ if qtdir != None:
+ canidatepaths.append(os.path.join(qtdir,"include"))
+ canidatepaths.append(os.path.join(install.prefix,"lib/qt3/include"))
+ canidatepaths.append(os.path.join(install.prefix,"lib/qt3/include"))
+ canidatepaths.append(os.path.join(install.prefix,"include"))
+ canidatepaths.append("/opt/qt3/include")
+ canidatepaths.append("/opt/qt/include")
+ canidatepaths.append("/opt/qt/lib/include")
+ canidatepaths.append("/opt/qt3/lib/include")
+ self.qt_inc_dir = FindFileInPaths('qstring.h',canidatepaths)
+ if self.qt_inc_dir is None:
+ raise SystemExit,"Failed to find the Qt header file directory"
+ if FindFileInPaths('qstring.h',[self.qt_inc_dir]) is None:
+ raise SystemExit, "Failed to find Qt header files in: %s" % self.qt_inc_dir
+ self.announce("Using %s for Qt header files" % self.qt_inc_dir)
+
+ # Qt lib dir
+ if self.qt_lib_dir is None:
+ canidatepaths = []
+ qtdir = os.getenv("QTDIR")
+ if qtdir != None:
+ canidatepaths.append(os.path.join(qtdir,get_libdir_name()))
+ canidatepaths.append(os.path.join(install.prefix,"lib/qt3/"+get_libdir_name()))
+ canidatepaths.append(os.path.join(install.prefix,"lib/qt3/"+get_libdir_name()))
+ canidatepaths.append(os.path.join(install.prefix,get_libdir_name()))
+ canidatepaths.append("/opt/qt3/"+get_libdir_name())
+ canidatepaths.append("/opt/qt/"+get_libdir_name())
+ canidatepaths.append("/opt/qt/lib/"+get_libdir_name())
+ canidatepaths.append("/opt/qt3/lib/"+get_libdir_name())
+ self.qt_lib_dir = FindFileInPaths('libqt*',canidatepaths)
+ if self.qt_lib_dir is None:
+ raise SystemExit, "Failed to find Qt library files"
+ self.announce("Using %s for Qt library files" % self.qt_lib_dir)
+
+ # Python dir
+ if self.python_dir is None:
+ self.python_dir = os.path.split(sysconfig.get_config_var("LIBP"))[0]
+ self.announce("Using %s for the python directory" % self.python_dir)
+
+ # Python include dir.
+ if self.python_inc_dir is None:
+ # Find the Python include directory.
+ self.python_inc_dir = sysconfig.get_config_var("INCLUDEPY")
+ self.announce("Using %s for Python header files" % self.python_inc_dir)
+
+ # PyQt dir
+ if self.pyqt_dir is None:
+ self.pyqt_dir = sysconfig.get_python_lib()
+ if (FindFileInPaths("libqtcmodule*",[self.pyqt_dir]) is None) and (FindFileInPaths("qt*",[self.pyqt_dir]) is None):
+ raise SystemExit, "Failed to find the PyQt directory: %s" % self.pyqt_dir
+ self.announce("Using %s for PyQt modules" % self.pyqt_dir)
+
+ # PyKDE dir
+ if self.pykde_dir is None:
+ self.pykde_dir = sysconfig.get_python_lib()
+ if (FindFileInPaths("libkdecorecmodule*",[self.pykde_dir]) is None) and (FindFileInPaths("kdecore*",[self.pykde_dir]) is None):
+ raise SystemExit, "Failed to find the PyKDE directory: %s" % self.pykde_dir
+ self.announce("Using %s for PyKDE modules" % self.pykde_dir)
+
+ # Sip dir
+ if self.sip_dir is None:
+ self.sip_dir = sysconfig.get_python_lib()
+ if (FindFileInPaths("libsip*", [self.sip_dir]) is None) and (FindFileInPaths("sip*", [self.sip_dir]) is None):
+ raise SystemExit, "Failed to find libsip files in directory: %s" % self.sip_dir
+ self.announce("Using %s for libsip files" % self.sip_dir)
+
+ # Find the C library (libgcc, libgcc_s or some other variation).
+ if self.clib is None:
+ canidatepaths = ["/usr/"+get_libdir_name(), "/usr/local/"+get_libdir_name() ]
+ self.clib = FindFileInPaths("libgcc*.so",canidatepaths)
+ if self.clib!=None:
+ self.clib = glob.glob(os.path.join(self.clib,'libgcc*.so'))[0]
+ else:
+ self.clib = FindFileInPaths("libgcc*.a",canidatepaths)
+ if self.clib!=None:
+ self.clib = glob.glob(os.path.join(self.clib,'libgcc*.a'))[0]
+ if self.clib is None:
+ raise SystemExit, "Failed to find a suitable libgcc library"
+ self.announce("Using %s for clib" % self.clib)
+
+ # Make a list of places to look for python .so modules
+ self.python_sub_dirs = sysconfig.get_config_var("LIBSUBDIRS").split()
+ base = sysconfig.get_config_var("LIBP")
+ self.python_sub_dirs = [ os.path.join(base,item) for item in self.python_sub_dirs ]
+ self.python_sub_dirs.append(base)
+
+ def get_command_name(self):
+ return 'build_kioslave'
+
+ def run(self):
+ if self.no_kioslave:
+ self.announce("Skipping KIO Slaves")
+ return
+
+ if not os.path.isdir(self.build_dir):
+ os.mkdir(self.build_dir)
+
+ for moduletuple in self.distribution.kioslaves:
+ self.announce("Building KIO Slave from protocol file %s." % moduletuple[0])
+
+ protocolfilename = moduletuple[0]
+
+ # Read the protocol file
+ libraryname = None
+ try:
+ fhandle = open(protocolfilename,'r')
+ for line in fhandle.readlines():
+ parts = line.strip().split('=')
+ try:
+ if parts[0]=="exec":
+ libraryname = parts[1]
+ except IndexError:
+ pass
+ fhandle.close()
+ except IOError:
+ raise SystemExit, "Failed to find kioslave protocol file: %s" % moduletuple[0]
+
+ # Sanity check.
+ if libraryname is None:
+ raise SystemExit, "Failed to find library name (Was there a exec entry in the protocol file?)"
+
+ modulename = os.path.basename(moduletuple[1])
+ if modulename.endswith('.py'):
+ modulename = modulename[:-3]
+
+ stub_cpp_name = libraryname+'.cpp'
+ stub_so_name = libraryname+'.so'
+ stub_la_name = libraryname+'.la'
+ python_version = '%i.%i' % (sys.version_info[0],sys.version_info[1])
+
+ # Build the 'stub' code.
+ cppcode = self.cpptemplate % {"moduledir": self.data_dir,
+ "modulename": modulename,
+ "python_version": python_version}
+
+ # Put it on disk.
+ cppfile = os.path.join(os.path.dirname(moduletuple[0]),stub_cpp_name)
+ try:
+ fhandle = open(cppfile,'w')
+ fhandle.write(cppcode)
+ fhandle.close()
+ except IOError:
+ raise SystemExit, "Could not write the C++ stub: %s" % cppfile
+
+ # Compile the stub library.
+ cmdlist = ['libtool']
+
+ # Couldn't get it to pass without this ...
+ cmdlist.append("--mode=compile")
+ cmdlist.append("--tag=CXX")
+
+ # Find the compiler flags and options
+ # CXX is empty on some Systems, let's do it 'the hard way'.
+ # FIXME :: get CXX from make.conf for Gentoo.
+ if len(sysconfig.get_config_var("CXX").split()) >= 2:
+ cmdlist.extend(sysconfig.get_config_var("CXX").split())
+ else:
+ cmdlist.extend(['g++', '-pthread'])
+
+ #cmdlist.extend(sysconfig.get_config_var("CXX").split())
+
+ # cc_flags
+ cmdlist.append("-c")
+ cmdlist.append("-g")
+
+ # The 4 is randomly chosen!
+ # FIXME :: get CFLAGS from make.conf for Gentoo.
+ if len(sysconfig.get_config_var("CFLAGS").split()) >=4:
+ cmdlist.extend(sysconfig.get_config_var("CFLAGS").split())
+ else:
+ # On Gentoo systems, CFLAGS are not in the environment.
+ raw = os.popen('emerge info 2> /dev/null|grep CFLAGS')
+ lines = raw.readlines()
+ if len(lines):
+ cflags = lines[0].split('"')[1].split()
+ print "Got CFLAGS from emerge info."
+ cmdlist.extend(cflags)
+ else:
+ # Still no CFLAGS found, use these ...
+ cmdlist.extend(['-fno-strict-aliasing', '-DNDEBUG', '-g', '-O3', '-Wall', '-Wstrict-prototypes'])
+
+ #sysconfig.get_config_var("CFLAGS").split()
+ # includes
+ cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEDIR"))
+ cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEDIR"))
+ cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEPY"))
+ cmdlist.append("-I" + self.python_inc_dir)
+ cmdlist.append("-I" + self.kde_inc_dir)
+ cmdlist.append("-I" + self.qt_inc_dir)
+ cmdlist.append("-I.")
+ # input
+ cmdlist.append(cppfile)
+ # output
+ outputfile = os.path.join(self.build_dir,libraryname+'.lo')
+ cmdlist.append("-o")
+ cmdlist.append(outputfile)
+ spawn(cmdlist) # Execute!!!
+ print
+
+ # Link the resulting object file to create a shared library.
+ cmdlist = ['libtool']
+ cmdlist.append("--mode=link")
+
+ # Grab the linker command name
+ cmdlist.append(sysconfig.get_config_var("LDSHARED").split()[0])
+ # link_flags
+ cmdlist.append("-module")
+ cmdlist.append("-export-dynamic")
+ # object
+ cmdlist.append(outputfile)
+ cmdlist.append("-rpath"); cmdlist.append(self.kde_kioslave_lib_dir)
+ cmdlist.append("-o"); cmdlist.append(os.path.join(self.build_dir,stub_la_name))
+ # Link libs
+ linklist = []
+ linklist.append("-lpython%s" % python_version)
+ linklist.extend(sysconfig.get_config_var("LIBS").split())
+
+ # FIXME I doubt half of these libraries need to be here.
+ linklist.append(self.sip_dir+"/sip.so")
+ # PyQt libs
+ linklist.append(self.pyqt_dir+"/qt.so")
+ # PyKDE libs
+ linklist.append(self.pykde_dir+"/kdecore.so")
+
+# linklist.append("-L"+self.sip_dir); linklist.append("-lsip")
+# # PyQt libs
+# linklist.append("-L"+self.pyqt_dir); linklist.append("-lqtcmodule")
+# # PyKDE libs
+# linklist.append("-L"+self.pykde_dir); linklist.append("-lkdecorecmodule"); linklist.append("-lkdeuicmodule")
+
+ linklist.append("-L"+self.kde_lib_dir); linklist.append("-L/opt/kde3/lib"); linklist.append("-lkdecore"); linklist.append("-lpythonize")
+ linklist.append("-L"+self.qt_lib_dir); linklist.append("-lqt-mt")
+ linklist.append("-lm")
+ linklist.append("-lstdc++")
+ linklist.append("-lc")
+ linklist.append(self.clib)
+
+ linklist.append("-R"); linklist.append(self.python_dir)
+ linklist.append("-R"); linklist.append(self.qt_lib_dir)
+ linklist.append("-R"); linklist.append(self.sip_dir)
+ linklist.append("-R"); linklist.append(self.pyqt_dir)
+ linklist.append("-R"); linklist.append(self.pykde_dir)
+ linklist.append("-R"); linklist.append(self.kde_lib_dir)
+
+ cmdlist.extend(linklist)
+ spawn(cmdlist) # Execute!!
+ print
+
+ cpptemplate = r"""
+/*
+ * Launch Control Centre modules written in Python using an embedded Python
+ * interpreter.
+ * Based on David Boddie's PyKDE-components.
+ */
+
+#include <stdio.h>
+#include <Python.h>
+#include <kinstance.h>
+#define MODULE_DIR "%(moduledir)s"
+#define MODULE_NAME "%(modulename)s"
+#define FACTORY "SlaveFactory"
+
+const char modname[] = MODULE_NAME;
+#define MAIN_METHOD "dispatchLoop"
+
+FILE *d = NULL;
+
+PyObject* call_function(PyObject *callable, PyObject *args) {
+ PyObject *result, *pArgs;
+
+ if (callable == NULL) {
+ printf(MODULE_NAME " kioslave error: callable == NULL in call_function\n");
+ return NULL;
+ }
+
+ if (PyCallable_Check(callable)) {
+ if(args == NULL) {
+ pArgs = PyTuple_New(0);
+ } else {
+ pArgs = args;
+ }
+ result = PyObject_CallObject(callable, pArgs);
+
+ /* If the arguments were created is this function then decrease
+ their reference count. */
+ if(args == NULL) {
+ Py_XDECREF(pArgs);
+ /* pDict and pFunc are borrowed and must not be Py_DECREF-ed */
+ }
+
+ if(result == NULL) {
+ PyErr_Print();
+ PyErr_Clear();
+ }
+ }
+
+ return result;
+}
+
+extern "C" {
+ int kdemain( int argc, char **argv) {
+ PyObject *pModule, *pName, *pDict;
+ KInstance slave(MODULE_NAME);
+
+ Py_SetProgramName(argv[0]);
+ Py_Initialize();
+ //PyEval_InitThreads();
+ PySys_SetArgv(1, argv);
+
+ PyRun_SimpleString("import sys\n");
+ PyRun_SimpleString("sys.path.append('"MODULE_DIR"')\n");
+
+ pName = PyString_FromString(modname);
+ pModule = PyImport_Import(pName);
+
+ Py_XDECREF(pName);
+
+ if(pModule == NULL) {
+ printf(MODULE_NAME " kioslave error: pModule == NULL\n");
+ return 1;
+ } else {
+ PyObject *pClass, *pMethod, *pArgs, *pArg1, *pArg2, *pInstance;
+ int i;
+
+ pDict = PyModule_GetDict(pModule);
+ /* pDict is a borrowed reference */
+
+ pClass = PyDict_GetItemString(pDict, FACTORY);
+
+ if(pClass == NULL) {
+ printf(MODULE_NAME " kioslave error: pClass == NULL\n");
+ return 1;
+ } else {
+ pArgs = PyTuple_New(2);
+
+ pArg1 = PyString_FromString(argv[2]);
+ pArg2 = PyString_FromString(argv[3]);
+
+ PyTuple_SetItem(pArgs, 0, pArg1);
+ PyTuple_SetItem(pArgs, 1, pArg2);
+
+ call_function(pClass, pArgs);
+
+ /* Some time later... */
+ Py_XDECREF(pClass);
+ Py_XDECREF(pArgs);
+ }
+
+ Py_XDECREF(pModule);
+ }
+
+ Py_Finalize();
+ return 0;
+ }
+}
+"""
+###########################################################################
+class InstallKioslave(Command):
+ description = "Install Kioslave files"
+
+ user_options = [
+ ('install-dir=', 'd', "base directory for installing kioslave module files"),
+ ('install-cmd=', None, "Command to use to install the files"),
+ ('install-protocol-dir=',None,"directory for kioslave protocol files"),
+ ('build-dir=','b', "build directory (where to install from)"),
+ ('root=', None, "install everything relative to this alternate root directory"),
+ ('force', 'f', "force installation (overwrite existing files)"),
+ ('skip-build', None, "skip the build steps"),
+ ]
+ boolean_options = ['force', 'skip-build']
+
+ def initialize_options(self):
+ self.build_dir = None
+ self.install_dir = None
+ self.install_cmd = None
+ self.install_protocol_dir = None
+ self.outfiles = []
+ self.root = None
+ self.force = 0
+ self.warn_dir = 1
+ self.skip_build = None
+
+ def finalize_options(self):
+ own_install_dir = self.install_dir is not None
+ own_install_protocol_dir = self.install_protocol_dir is not None
+
+ self.set_undefined_options('install',
+ ('build_base', 'build_dir'),
+ ('install_kioslave', 'install_dir'),
+ ('root', 'root'),
+ ('force', 'force'),
+ ('skip_build', 'skip_build'),
+ ('install_cmd', 'install_cmd'),
+ ('install_protocol','install_protocol_dir')
+ )
+
+ if own_install_dir and self.root is not None:
+ self.install_dir = change_root(self.root,self.installdir)
+
+ if own_install_protocol_dir and self.root is not None:
+ self.install_protocol_dir = change_root(self.root,self.install_protocol_dir)
+
+ def get_command_name(self):
+ return 'install_kioslave'
+
+ def run(self):
+ if not self.skip_build:
+ self.run_command('build_kioslave')
+
+ self.announce("Installing Kioslave files...")
+
+ for moduletuple in self.distribution.kioslaves:
+ self.announce("Building Kioslave module from protocol file %s." % moduletuple[0])
+
+ protocolfilename = moduletuple[0]
+
+ # Read the protocol file
+ libraryname = None
+ try:
+ fhandle = open(protocolfilename,'r')
+ for line in fhandle.readlines():
+ parts = line.strip().split('=')
+ try:
+ if parts[0]=="exec":
+ libraryname = parts[1]
+ except IndexError:
+ pass
+ fhandle.close()
+ except IOError:
+ raise SystemExit, "Failed to find kioslave protocol file: %s" % moduletuple[0]
+
+ if libraryname is None:
+ raise SystemExit, "Failed to find library name (Was there a exec entry in the protocol file?)"
+
+ self.outfiles.extend(self.mkpath(self.install_protocol_dir))
+ protocolfile_dest = os.path.join(self.install_protocol_dir,os.path.basename(protocolfilename))
+ self.copy_file(protocolfilename, protocolfile_dest)
+
+ stub_la_name = libraryname+'.la'
+
+ self.outfiles.extend(self.mkpath(self.install_dir))
+
+ # Install the library.
+ cmdlist = ['libtool']
+ cmdlist.append("--mode=install")
+ cmdlist.append(self.install_cmd)
+ cmdlist.append("-c")
+ cmdlist.append(os.path.join(self.build_dir,stub_la_name))
+ cmdlist.append(os.path.join(self.install_dir,stub_la_name))
+ spawn(cmdlist) # Execute!!
+ print
+
+ self.outfiles = [os.path.join(self.install_dir,os.path.basename(file)) for file in glob.glob(os.path.join(self.build_dir,'.libs',libraryname+'*'))]
+ self.outfiles.append(protocolfile_dest)
+
+ self.announce("Done installing Kioslave files.")
+
+ def get_outputs(self):
+ return self.outfiles or []
+
+ def mkpath(self, name, mode=0777):
+ return dir_util.mkpath(name, mode, dry_run=self.dry_run)
+
+###########################################################################
+class CheckPyQt(Command):
+ description = "Checks for the presence of a working PyQt installation"
+
+ user_options = []
+
+ def initialize_options(self):
+ pass
+
+ def finalize_options(self):
+ self.min_qt_version = self.distribution.min_qt_version
+
+ def run(self):
+ if self.min_qt_version!=None:
+ qtver,kdever = get_qt_kde_versions()
+ if compare_versions(self.min_qt_version,qtver)==1:
+ raise SystemExit, "Your Qt version is too old. Version %s or higher is required, found %s." % (self.min_qt_version,qtver)
+ self.announce("Found Qt version %s." % qtver)
+ try:
+ self.announce("Checking for a working PyQt...")
+ import qt
+ self.announce(" ...PyQt is working")
+ except:
+ raise SystemExit, "Couldn't import Qt! Please make sure that PyQt is installed and working."
+
+ def get_outputs(self): return []
+
+###########################################################################
+class CheckPyKDE(Command):
+ description = "Checks for the presence of a working PyKDE installation"
+
+ user_options = []
+
+ def initialize_options(self):
+ pass
+
+ def finalize_options(self):
+ self.min_kde_version = self.distribution.min_kde_version
+
+ def run(self):
+ if self.min_kde_version!=None:
+ qtver,kdever = get_qt_kde_versions()
+ if compare_versions(self.min_kde_version,kdever)==1:
+ raise SystemExit, "Your KDE version is too old. Version %s or higher is required, found %s." % (self.min_kde_version,kdever)
+ self.announce("Found KDE version %s." % kdever)
+ self.announce("Checking for a working PyKDE...")
+
+ # Try to import modules one by one.
+ for k_module in ('dcop', 'kdecore', 'kdeui', 'kio', 'kfile', 'kparts', 'khtml', 'kspell'):
+ self.announce(k_module)
+ try:
+ exec('import ' + k_module)
+ except:
+ raise SystemExit, "Error: Couldn't find module '" + k_module + "'. \n" + \
+ "Couldn't import KDE! Please make sure that PyKDE is installed and working.\n" + \
+ "PyKDE is available here: http://www.riverbankcomputing.co.uk/pykde/index.php"
+ self.announce(" ...PyKDE is working")
+
+ def get_outputs(self): return []
+
+###########################################################################
+def FindFileInPaths2(globpattern,canidatepaths):
+ if canidatepaths is None or len(canidatepaths)==0:
+ return (None,None)
+
+ # Look for the globpattern on the path.
+ for path in canidatepaths:
+ if path!=None:
+ files = glob.glob(os.path.join(path, globpattern))
+ if len(files)!=0:
+ return (path,os.path.basename(files[0]))
+
+ # Continue searching with a breadth first search.
+ dirs = []
+ for path in canidatepaths:
+ # Examine any directories on this path.
+ dirlist = glob.glob(os.path.join(path, "*"))
+ for item in dirlist:
+ if os.path.isdir(item):
+ # Examine each subdirectory.
+ dirs.append(item)
+ # Examine all subdirectories.
+ return FindFileInPaths2(globpattern, dirs)
+
+###########################################################################
+def FindFileInPaths(globpattern,canidatepaths):
+ x,y = FindFileInPaths2(globpattern,canidatepaths)
+ return x
+
+###########################################################################
+# FIXME replace this with spawn.find_executable().
+def FindExeOnPath(exe_name,high_prio_dirs=None,low_prio_dirs=None):
+ candiate_paths = []
+
+ if high_prio_dirs is not None:
+ candiate_paths.extend(high_prio_dirs)
+
+ path_var = os.getenv("PATH")
+ candiate_paths.extend(path_var.split(':'))
+
+ if low_prio_dirs is not None:
+ candiate_paths.extend(low_prio_dirs)
+
+ for dir in candiate_paths:
+ if dir is not None:
+ candiate = os.path.join(dir,exe_name)
+ if os.path.isfile(candiate):
+ if os.access(candiate,os.X_OK):
+ return candiate
+ return None
+
+###########################################################################
+
+def ask_kde_config(question):
+ # Look for the kde-config program
+ kdeconfig = find_executable("kde-config", os.environ['PATH'] + os.pathsep + \
+ os.pathsep.join(['/bin','/usr/bin','/opt/kde3/bin','/opt/kde/bin','/usr/local/bin']))
+ if kdeconfig!=None:
+ # Ask the kde-config program for the
+ fhandle = os.popen(kdeconfig+' ' + question,'r')
+ result = fhandle.read()
+ fhandle.close()
+ return result
+ else:
+ return None
+
+###########################################################################
+# Convert for example, "3.1.1a" => [3,1,1,'a']
+#
+def split_version_name(name):
+ result = []
+ accu = ''
+ type = 0
+ for c in name:
+ if type==0:
+ if c.isdigit():
+ type = 1
+ else:
+ type = 2
+ accu += c
+ elif c=='.':
+ if type==1:
+ result.append(int(accu))
+ else:
+ result.append(accu)
+ accu = ''
+ type = 0
+ elif type==1:
+ # Digits
+ if c.isdigit():
+ accu += c
+ else:
+ result.append(int(accu))
+ type = 2
+ accu = c
+ else:
+ if c.isdigit():
+ result.append(accu)
+ type = 1
+ accu = c
+ else:
+ accu += c
+ if accu!='':
+ result.append(accu)
+ return result
+
+###########################################################################
+#
+# Returns:
+# -1 if a < b
+# 0 if a and b are equal
+# 1 if a > b
+def compare_versions(a,b):
+ aparts = split_version_name(a)
+ bparts = split_version_name(b)
+ if len(aparts)>len(bparts):
+ compmax = len(aparts)
+ else:
+ compmax = len(bparts)
+ i = 0
+ for i in range(compmax):
+ abit = 0
+ if i<len(aparts):
+ abit = aparts[i]
+ bit = 0
+ if i<len(bparts):
+ bbit = bparts[i]
+ if isinstance(abit,str) and not isinstance(bbit,str):
+ return 1
+ elif not isinstance(abit,str) and isinstance(bbit,str):
+ return -1
+ else:
+ if abit>bbit:
+ return 1
+ elif abit<bbit:
+ return -1
+ return 0
+
+###########################################################################
+def get_qt_kde_versions():
+ versioninfo = ask_kde_config('--version')
+ qtver = None
+ kdever = None
+ if versioninfo!=None:
+ for line in versioninfo.splitlines():
+ if line.startswith("Qt: "):
+ qtver = line[4:]
+ elif line.startswith("KDE: "):
+ kdever = line[5:]
+ return qtver,kdever
+
+###########################################################################
+def compile_qtdesigner(ui_files,
+ force=0,
+ prefix=None, base_dir=None,
+ verbose=1, dry_run=0):
+ """Compile a collection of QT Designer UI files to .py
+
+ If 'dry_run' is true, doesn't actually do anything that would
+ affect the filesystem.
+ """
+ generated_files = []
+ for file in ui_files:
+ if not file.endswith(".ui"):
+ continue
+
+ # Terminology from the py_compile module:
+ # cfile - byte-compiled file
+ # dfile - purported source filename (same as 'file' by default)
+ if base_dir:
+ file = os.path.join(base_dir ,file)
+
+ pyfile = file[:-3] + '.py'
+ uifile = file
+
+ pyfile_base = os.path.basename(pyfile)
+ if force or newer(uifile, pyfile):
+ log.info("compiling Qt-Designer UI %s to %s", file, pyfile_base)
+ if not dry_run:
+ qtuicompiler.CompileUI(uifile, pyfile)
+ generated_files.append(pyfile)
+ else:
+ log.debug("skipping Qt-Designer compilation of %s to %s",
+ file, pyfile_base)
+ return generated_files
+
+###########################################################################
+def get_libdir_name():
+ #if os.uname()[4] in ['x86_64','mips64','ppc64','sparc64','s390x']:
+ # return 'lib64'
+ #else:
+ return 'lib'
diff --git a/src/pythonize.cpp b/src/pythonize.cpp
new file mode 100644
index 0000000..e83f965
--- /dev/null
+++ b/src/pythonize.cpp
@@ -0,0 +1,238 @@
+/* copyright 2003 Jim Bublitz <[email protected]>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <stdarg.h>
+#include <string.h>
+
+// this just gets rid of a warning when Python.h redefines it
+#undef _POSIX_C_SOURCE
+
+#include <pythonize.h>
+
+#define debug 1
+
+ObjectRef::ObjectRef (ObjectRef *oi, PyObject *o)
+{
+ prevObject = oi;
+ object = o;
+}
+
+
+Pythonize::Pythonize ()
+{
+ pythonInit = 1;
+ objects = NULL;
+
+ if (debug) printf ("\n\nPythonize constructor -- pid = %i\n", getpid ());
+
+ if (!Py_IsInitialized ())
+ {
+ PyEval_InitThreads ();
+ Py_Initialize ();
+ if (!Py_IsInitialized ())
+ {
+ pythonInit = 0;
+ return;
+ }
+
+ if (debug) printf ("Python interpreter initialized!\n\n");
+
+ // free the lock
+ PyEval_ReleaseLock();
+ }
+}
+
+bool Pythonize::runScript (char *scriptPath)
+{
+ FILE *f;
+ int res;
+
+ if (debug) printf ("Running script: %s\n", scriptPath);
+
+ if (scriptPath == NULL || strlen (scriptPath) == 0) return false;
+
+ f = fopen (scriptPath, "r");
+ if (f == NULL) return false;
+
+ res = PyRun_SimpleFile (f, scriptPath);
+
+ fclose (f);
+ return res == 0;
+}
+
+
+PyObject * Pythonize::runFunction (PyObject *object, PyObject *args)
+{
+
+ if (!PyCallable_Check (object))
+ return NULL;
+
+ PyObject *res = PyObject_CallObject (object, args ? args : PyTuple_New (0));
+ Py_XINCREF (res);
+
+ return res;
+}
+
+void * Pythonize::runFunctionVoid (PyObject *object, PyObject *args)
+{
+
+ if (!PyCallable_Check (object))
+ return NULL;
+
+ PyObject *pyRes = PyObject_CallObject (object, args ? args : PyTuple_New (0));
+ void *res = PyLong_AsVoidPtr (pyRes);
+
+ return res;
+}
+
+bool Pythonize::runString (char *str)
+{
+
+ if (str == NULL || strlen (str) == 0) return false;
+
+ int res = PyRun_SimpleString (str);
+
+ return res == 0;
+}
+
+bool Pythonize::appendToSysPath (const char* newPath)
+{
+ if (newPath == NULL || strlen (newPath) == 0) return false;
+
+ char *fmtString = "import sys\nif not '%s' in sys.path:\n\tsys.path.append ('%s')\n"; //print sys.path\n";
+ int length = strlen (fmtString) + 2*strlen (newPath) + 1;
+ char *line = new char [length];
+ if (!line) return false;
+ snprintf (line, length, fmtString, newPath, newPath);
+
+ int res = PyRun_SimpleString (line);
+
+ delete line;
+ return res == 0;
+}
+
+PyObject *Pythonize::importModule (char *moduleName)
+{
+ if (moduleName == NULL || strlen (moduleName) == 0) return NULL;
+
+ PyObject *module = PyImport_ImportModule (moduleName);
+
+ objects = new ObjectRef (objects, module);
+ if (!objects) return NULL;
+
+ return module;
+}
+
+
+Pythonize::~Pythonize ()
+{
+
+ if (debug) printf ("Pythonize destructor\n");
+ ObjectRef *top;
+
+ while (objects)
+ {
+ top = objects;
+ objects = objects->prevObject;
+ delete top;
+ }
+ if (debug) printf (" --- Objects destroyed\n");
+
+ Py_Finalize();
+
+ if (debug) printf (" --- Py_Finalized\n");
+}
+
+// The global Pythonize instance
+Pythonize *pyize = new Pythonize ();
+
+extern "C"
+{
+Pythonize *_pythonize;
+
+Pythonize *initialize ()
+{
+ if (_pythonize) return _pythonize;
+
+ _pythonize = new Pythonize ();
+ if (!_pythonize || !_pythonize->getPythonInit ())
+ {
+ if (_pythonize) delete _pythonize;
+ return NULL;
+ }
+
+ return _pythonize;
+}
+
+void finalize ()
+{
+ if (_pythonize) {
+ if (debug) printf(" --- Pythonize finalize()\n");
+ delete _pythonize;
+ }
+}
+
+ // adds a path to sys.path
+bool appendToSysPath (const char* newPath)
+{
+ return _pythonize ? _pythonize->appendToSysPath (newPath) : false;
+}
+
+ // imports a module into the interpreter
+ // or gets a PyObject for an already loaded module
+PyObject *importModule (char *moduleName)
+{
+ return _pythonize ? _pythonize->importModule (moduleName) : NULL;
+}
+
+ // returns an object from a loaded module
+ // you must decref the object returned when done with it (new reference returned)
+PyObject *getNewObjectRef (PyObject *module, char *object)
+{
+ return _pythonize ? _pythonize->getNewObjectRef (module, object) : NULL;
+}
+
+bool getPythonInit ()
+{
+ return _pythonize ? _pythonize->getPythonInit () : false;
+}
+
+ // decrements the ref count of an object
+void decref (PyObject *object)
+{
+ Py_XDECREF (object);
+}
+
+ // runs a script on the current sys.path
+bool runScript (char *scriptPath)
+{
+ return _pythonize ? _pythonize->runScript (scriptPath) : false;
+}
+
+ // executes a string of Python in the interpreter
+bool runString (char *str)
+{
+ return _pythonize ? _pythonize->runString (str) : false;
+}
+
+ // runs a callable Python object
+PyObject *runFunction (PyObject *object, PyObject *args)
+{
+ return _pythonize ? _pythonize->runFunction (object, args) : NULL;
+}
+}
diff --git a/src/pythonize.h b/src/pythonize.h
new file mode 100644
index 0000000..6db64d2
--- /dev/null
+++ b/src/pythonize.h
@@ -0,0 +1,104 @@
+/* copyright 2003 Jim Bublitz <[email protected]>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of
+ the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __pythonize_h__
+#define __pythonize_h__
+
+// Pythonize is a general purpose library that wraps the Python
+// interpreter with an interface to a set of common operations
+// used when embedding the interpreter.
+
+#include <Python.h>
+
+struct ObjectRef
+{
+ ObjectRef (ObjectRef *oi, PyObject *o);
+ ~ObjectRef () { Py_XDECREF (object); }
+
+ PyObject *object; // pointer to an object we created
+ ObjectRef *prevObject; // pointer to next object on the stack
+};
+
+class Pythonize
+{
+public:
+ Pythonize ();
+ ~Pythonize ();
+
+ // adds a path to sys.path
+ bool appendToSysPath (const char* newPath);
+
+ // imports a module into the interpreter
+ // or gets a PyObject for an already loaded module
+ PyObject *importModule (char *moduleName);
+
+ // returns an object from a loaded module
+ // you must decref the object returned when done with it (new reference returned)
+ PyObject *getNewObjectRef (PyObject *module, char *object) { return PyObject_GetAttrString (module, object); }
+
+ int getPythonInit () { return pythonInit; }
+
+ // decrements the ref count of an object
+ void decref (PyObject *object) { Py_XDECREF (object); }
+
+ // runs a script on the current sys.path
+ bool runScript (char *scriptPath);
+
+ // executes a string of Python in the interpreter
+ bool runString (char *str);
+
+ // runs a callable Python object
+ PyObject *runFunction(PyObject *object, PyObject *args);
+ void *runFunctionVoid(PyObject *object, PyObject *args);
+
+private:
+ int pythonInit; // status of Py_Initialize
+ ObjectRef *objects; // a stack of PyObjects (used in destructor)
+};
+
+extern "C" {
+ Pythonize *initialize();
+ void finalize();
+
+ // adds a path to sys.path
+ bool appendToSysPath (const char* newPath);
+
+ // imports a module into the interpreter
+ // or gets a PyObject for an already loaded module
+ PyObject *importModule (char *moduleName);
+
+ // returns an object from a loaded module
+ // you must decref the object returned when done with it (new reference returned)
+ PyObject *getNewObjectRef (PyObject *module, char *object);
+
+ bool getPythonInit();
+
+ // decrements the ref count of an object
+ void decref (PyObject *object);
+
+ // runs a script on the current sys.path
+ bool runScript (char *scriptPath);
+
+ // executes a string of Python in the interpreter
+ bool runString (char *str);
+
+ // runs a callable Python object
+ PyObject *runFunction (PyObject *object, PyObject *args);
+}
+
+#endif
diff --git a/src/qtdesigner.py b/src/qtdesigner.py
new file mode 100644
index 0000000..3a7b55a
--- /dev/null
+++ b/src/qtdesigner.py
@@ -0,0 +1,26 @@
+#!/usr/bin/python
+###########################################################################
+# qtdesigner - description #
+# ------------------------------ #
+# begin : Thu Apr 21 2005 #
+# copyright : (C) 2005 by Simon Edwards #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU Library General Public License as #
+# published by the Free Software Foundation; either version 2 of the #
+# License, or (at your option) any later version. #
+# #
+###########################################################################
+
+import __builtin__
+import qtuicompiler
+
+python_import = __builtin__.__import__
+def load(*args):
+ qtuicompiler.DynamicImport(args,False)
+ return apply(python_import,args)
+
+__builtin__.__import__ = load
diff --git a/src/qtuicompiler.py b/src/qtuicompiler.py
new file mode 100644
index 0000000..4d590aa
--- /dev/null
+++ b/src/qtuicompiler.py
@@ -0,0 +1,111 @@
+#!/usr/bin/python
+###########################################################################
+# qtuicompiler - description #
+# ------------------------------ #
+# begin : Thu Apr 21 2005 #
+# copyright : (C) 2005 by Simon Edwards #
+# email : [email protected] #
+# #
+###########################################################################
+# #
+# This program is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU Library General Public License as #
+# published by the Free Software Foundation; either version 2 of the #
+# License, or (at your option) any later version. #
+# #
+###########################################################################
+
+import os
+import sys
+import pyqtconfig
+from distutils.spawn import *
+import traceback
+
+pyqt_configuration = pyqtconfig.Configuration()
+pyuic_exe = None
+
+############################################################################
+def FindPyuic():
+ global pyuic_exe
+ if pyuic_exe is not None: return pyuic_exe
+
+ pyuic_exe = find_executable('pyuic',pyqt_configuration.pyqt_bin_dir)
+ if pyuic_exe is None:
+ # Search on the $Path.
+ pyuic_exe = find_executable('pyuic')
+
+############################################################################
+def CompileUI(ui_file_name, py_file_name=None, kde=False):
+ pyuic_exe = find_executable('pyuic',pyqt_configuration.default_bin_dir)
+ if pyuic_exe is None:
+ # Search on the $Path.
+ pyuic_exe = find_executable('pyuic')
+ if pyuic_exe is None:
+ pass # FIXME raise something!
+
+ if py_file_name is None:
+ py_file_name = os.path.splitext(os.path.basename(ui_file_name))[0] + '.py'
+
+ tmp_file_name = py_file_name + '.bak'
+ cmd = [pyuic_exe]
+ if kde:
+ cmd.append('-tr')
+ cmd.append('i18n')
+ cmd.append('-o')
+ cmd.append(tmp_file_name)
+ cmd.append(ui_file_name)
+ spawn(cmd)
+
+ input = open(tmp_file_name, 'r')
+ output = open(py_file_name, 'w')
+ for line in input.readlines():
+ if kde and string.strip(line) == 'from qt import *':
+ output.write(line)
+ output.write('from kdecore import *\nfrom kdeui import *\n\n')
+ elif kde and string.find(line, " = KDatePicker(") != -1:
+ o = string.find(line, ",")
+ output.write(line[:o] + ",QDate.currentDate()" + line[o:])
+ else:
+ output.write (line)
+
+ input.close()
+ output.close()
+
+ os.remove(tmp_file_name)
+
+############################################################################
+def DynamicImport(importargs,kde=False):
+ file_name = importargs[0].replace('.',os.sep)
+ file_name_ui = file_name + '.ui'
+ if os.path.exists(file_name_ui):
+ try:
+ UpdateUI(file_name_ui,kde)
+ except:
+ traceback.print_exc()
+ raise ImportError, "Unable to compile Qt designer file %s." % args[0]
+
+############################################################################
+def UpdateUI(ui_file,kde=False):
+ py_file = ui_file[:-3] + '.py'
+ remake = False
+ if os.path.exists(py_file):
+ remake = os.stat(py_file).st_mtime <= os.stat(ui_file).st_mtime
+ else:
+ remake = True
+
+ if remake:
+ CompileUI(ui_file, py_file, kde)
+
+############################################################################
+def main():
+ # FIXME parse args and add --kde parameter.
+ if len(sys.argv)!=3:
+ print """\nUsage:
+qtuicompiler filename.ui filename.py\n\n
+"""
+ return
+
+ CompileUI(sys.argv[1],sys.argv[2])
+
+if __name__=='__main__':
+ main()