diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-03-01 18:16:46 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-03-01 18:16:46 +0000 |
commit | a7af74e75730559f7f9661e449eb269e356d9907 (patch) | |
tree | 72026b40b3a513aa21d630fb09ae10edab7f9e18 | |
download | pytdeextensions-a7af74e75730559f7f9661e449eb269e356d9907.tar.gz pytdeextensions-a7af74e75730559f7f9661e449eb269e356d9907.zip |
Added KDE3 version of pykdeextensions
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/libraries/pykdeextensions@1097589 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
84 files changed, 10021 insertions, 0 deletions
@@ -0,0 +1 @@ +Simon Edwards <[email protected]> @@ -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 @@ -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/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 @@ -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/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 “Algorithm” 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�fU��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,\ + "[email protected]") + 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 “Algorithm” 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�fU��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&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 “Algorithm” 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�fU��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 “Algorithm” 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 & 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 & 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 & 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 “Algorithm” 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() |