commit a7af74e75730559f7f9661e449eb269e356d9907 Author: tpearson Date: Mon Mar 1 18:16:46 2010 +0000 Added KDE3 version of pykdeextensions git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/libraries/pykdeextensions@1097589 283d02a7-25f6-0310-bc7c-ecb5cbfe19da diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..acbd66f --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Simon Edwards diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..789c31e --- /dev/null +++ b/COPYING @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor + Boston, MA 02110-1301, USA. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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. + + , 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 +- 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 +- 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 +- 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 +- 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 +- 0.1 release. Development version diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..b94cd85 --- /dev/null +++ b/INSTALL @@ -0,0 +1,43 @@ +Basic Installation +================== +These are generic installation instructions. + +This software uses the Python language's distutils system for installation. +A detailed guide for users and system administrators to using distutils to +install software can be found here: + + http://docs.python.org/inst/inst.html + +The simplest way to install this software is to run the following command as +the root user: + + python setup.py install + +The setup.py script will automatically detect the directories to use for +documentation, binaries and other software files. + + +Uninstallation +============== +During installation setup.py creates list of files and directories that +were installed in a file called install_log.txt. + + python setup.py uninstall + + +Installing into an alternate root +================================= +For packaging purposes it is often very useful to be able to install all files +relative not to the usual root directory (/) but into an alternative +directory. + + python setup.py install --root=/tmp/alternativeroot/ + + +Operation Controls +================== +--verbose + Print more information about what setup.py is doing. + +--help + Print a summary of the options to setup.py, and exit. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..419cead --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,6 @@ +recursive-include doc *.docbook *.png +graft app_templates +prune app_templates/.svn +include AUTHORS ChangeLog COPYING INSTALL MANIFEST.in NEWS README TODO +global-include *.desktop *.py *.cpp *.h +global-exclude *~ .svn *.pyc diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 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: simon@simonzone.com +License: LGPL +Description: UNKNOWN +Platform: UNKNOWN diff --git a/README b/README new file mode 100644 index 0000000..3e074d2 --- /dev/null +++ b/README @@ -0,0 +1,14 @@ +PyKDE Extensions +================ +PyKDE Extensions is a collection of software and Python packages to support +the creation and installation of KDE applications. + +Read the INSTALL file for more information about how to install this. + +This software is on the web at: + +http://www.simonzone.com/software/pykdeextensions/ + +cheers, + +Simon Edwards diff --git a/TODO b/TODO new file mode 100644 index 0000000..e69de29 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. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more 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. + + , 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 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 diff --git a/app_templates/kcontrol_module/README b/app_templates/kcontrol_module/README new file mode 100644 index 0000000..e69de29 diff --git a/app_templates/kcontrol_module/TODO b/app_templates/kcontrol_module/TODO new file mode 100644 index 0000000..e69de29 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 @@ + +MyApplicaition 0.1"> + + + + + + + +]> + + + + + + + + + + + + + + +The &appname; Handbook + + + + + +%{AUTHOR} + +
%{EMAIL}
+
+
+
+ + + + +1999 +%{YEAR} +%{AUTHOR} + + + +&FDLNotice; + + + +2001-10-18 +%{VERSION} + + + + + +&appname; is an application specially designed to do nothing you would +ever want. + + + + + + +KDE +%{APPNAME} +nothing +nothing else + + +
+ + + + +Introduction + + + + +&appname; is a program that lets you do absolutely nothing. Please report +any problems or feature requests to the &kde; mailing lists. + + + + +Using &appname; + + + + + + + + +Here's a screenshot of &appname; + + + + + + + + + Screenshot + + + + + + + +More &appname; features + +It slices! It dices! and it comes with a free toaster! + +The Squiggle Tool + + + + + + + + Squiggle + + is used to draw squiggly lines all over +the &appname; main window. It's not a bug, it's a feature! + + + + + + +Command Reference + + + + +The main &appname; window + + +The File Menu + + + + + +&Ctrl;N + +File +New + +Creates a new document + + + + +&Ctrl;S + +File +Save + +Saves the document + + + + +&Ctrl;Q + +File +Quit + +Quits &appname; + + + + + + + +The <guimenu>Help</guimenu> Menu + + + + + + +&help.menu.documentation; + + + + + + + +Developer's Guide to &appname; + + + + +Programming &appname; plugins is a joy to behold. Just read through the next +66 pages of API's to learn how! + + + + + + +XtUnmanageChildren +Xt - Geometry Management + + +XtUnmanageChildren + +remove a list of children from a parent widget's managed +list. +widgetsremoving +XtUnmanageChildren + + + + + +4 March 1996 + + +void XtUnmanageChildren(children, num_children) + WidgetList children; + Cardinal num_children; + + + +Inputs + + +children + + +Specifies an array of child widgets. Each child must be of +class RectObj or any subclass thereof. + + + + +num_children + + +Specifies the number of elements in children. + + + + + + + +Description + +XtUnmanageChildren() 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. + +Each of the widgets in the children array must have +the same parent. + +See the “Algorithm” section below for full details of the +widget unmanagement procedure. + + + + +Usage +Unmanaging widgets is the usual method for temporarily +making them invisible. They can be re-managed with +XtManageChildren(). + +You can unmap a widget, but leave it under geometry +management by calling XtUnmapWidget(). You can +destroy a widget's window without destroying the widget by +calling XtUnrealizeWidget(). You can destroy a +widget completely with XtDestroyWidget(). + +If you are only going to unmanage a single widget, it is +more convenient to call XtUnmanageChild(). It is +often more convenient to call XtUnmanageChild() +several times than it is to declare and initialize an array +of widgets to pass to XtUnmanageChildren(). Calling +XtUnmanageChildren() is more efficient, however, +because it only calls the parent's change_managed() +method once. + + + + +Algorithm + +XtUnmanageChildren() performs the following: + + + +- + + +Ignores the child if it already is unmanaged or is being +destroyed. + + + + +- + + +Otherwise, if the child is realized, it makes it nonvisible +by unmapping it. + + + + + + + + + +Structures +The WidgetList type is simply an array of widgets: + +typedef Widget *WidgetList; + + + + + + + +Questions and Answers + + + +&reporting.bugs; +&updating.documentation; + + + + +My Mouse doesn't work. How do I quit &appname;? + + +You silly goose! Check out the Commands +Section for the answer. + + + + +Why can't I twiddle my documents? + + +You can only twiddle your documents if you have the foobar.lib +installed. + + + + + + + + + +Credits and License + + +&appname; + + +Program copyright %{YEAR} %{AUTHOR} %{EMAIL} + + +Contributors: + +Konqui the KDE Dragon konqui@kde.org + +Tux the Linux Penguin tux@linux.org + + + + + +Documentation copyright %{YEAR} %{AUTHOR} %{EMAIL} + + + + +&underFDL; + + + +&underGPL; +&underBSDLicense; +&underArtisticLicense; +&underX11License; + + + + +Installation + + +How to obtain &appname; + + + +&install.intro.documentation; + + + + +Requirements + + + + +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. + + + +All required libraries as well as &appname; itself can be found +on The &appname; home page. + + + + +You can find a list of changes at http://apps.kde.org/appname. + + + + +Compilation and Installation + + + + + +&install.compile.documentation; + + + + +Configuration + +Don't forget to tell your system to start the dtd +dicer-toaster daemon first, or &appname; won't work ! + + + + + +&documentation.index; +
+ + + 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 : YOUR@EMAIL.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### + +import kdedistutils + +kdedistutils.setup(name="kcontrol_module", + version="0.1.0", + author="AUTHOR", + author_email="YOUR@EMAIL.com", + 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 @@ + +KcontrolModuleWidgetUI + + + KcontrolModuleWidgetUI + + + + 0 + 0 + 600 + 480 + + + + Form1 + + + + unnamed + + + + textLabel1 + + + Congratulations, Kcontrol_module template application is working! + + + + + + 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ĞÉܖCf UĠSżğïä +"Öl+²*ħ²²JğÇ°˜M¨ŞJde…­Ù9Hz]—qTÖPòBÉIÀ× +ÙŬ}ħĤÂQħ˜•—‰ ¤bRˆ˘³ŞÒÛ÷€ ï]ánv–ïbf,Àğƒĝçü:ÀLÑdÖ4€íPuCÀ ÊÔ7ÔòAK ÷\ŭô^żÏŸ=.~öĦċ|َ2³wÄË|xw’Î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̲~&ŽqR- H£„Gpk +PPJ£&( +´J¨EQŝİÚ4Iq QDHC~D6ĜÂBĜµ—×ٵٝÇÎ̝™;Ï;Ó?f½1µ i{¤£Ğ+]ï÷œóŭ}żżkö_²B”Ğe,ˢ3²„Ö–6”TĜĥÍ3'Ÿ``ÙÀIeĞm=½½ı§ü´ŭ‰Ż}›j ´˘^Ğw™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!gĈ~So +“/äY58ȗżġç$ÓiĈĈßÄÏĝTJjA +€5›†ı0ù> +nĵċ“ÜtçMt?ħ€çgj|’#O=‹]ğžùdÛĥȕr(ÁŻßħżz'N½Œ—̐Ïä)ûE +™²ìċ(Â--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ĦqK*—"ĴÂ͖L\ +i#¤h†‡h-ÂĈ–M[½èérá½µGkċ eóĜíTNršbH6•Ċ‰¸ô/렏? 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 : your@email.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### + +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,\ + "your@email.com") + about_data.addAuthor("AUTHOR", None, "your@email.com") + 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. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more 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. + + , 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 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 diff --git a/app_templates/kdeapp/README b/app_templates/kdeapp/README new file mode 100644 index 0000000..e69de29 diff --git a/app_templates/kdeapp/TODO b/app_templates/kdeapp/TODO new file mode 100644 index 0000000..e69de29 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 @@ + +MyApplicaition 0.1"> + + + + + + + +]> + + + + + + + + + + + + + + +The &appname; Handbook + + + + + +%{AUTHOR} + +
%{EMAIL}
+
+
+
+ + + + +1999 +%{YEAR} +%{AUTHOR} + + + +&FDLNotice; + + + +2001-10-18 +%{VERSION} + + + + + +&appname; is an application specially designed to do nothing you would +ever want. + + + + + + +KDE +%{APPNAME} +nothing +nothing else + + +
+ + + + +Introduction + + + + +&appname; is a program that lets you do absolutely nothing. Please report +any problems or feature requests to the &kde; mailing lists. + + + + +Using &appname; + + + + + + + + +Here's a screenshot of &appname; + + + + + + + + + Screenshot + + + + + + + +More &appname; features + +It slices! It dices! and it comes with a free toaster! + +The Squiggle Tool + + + + + + + + Squiggle + + is used to draw squiggly lines all over +the &appname; main window. It's not a bug, it's a feature! + + + + + + +Command Reference + + + + +The main &appname; window + + +The File Menu + + + + + +&Ctrl;N + +File +New + +Creates a new document + + + + +&Ctrl;S + +File +Save + +Saves the document + + + + +&Ctrl;Q + +File +Quit + +Quits &appname; + + + + + + + +The <guimenu>Help</guimenu> Menu + + + + + + +&help.menu.documentation; + + + + + + + +Developer's Guide to &appname; + + + + +Programming &appname; plugins is a joy to behold. Just read through the next +66 pages of API's to learn how! + + + + + + +XtUnmanageChildren +Xt - Geometry Management + + +XtUnmanageChildren + +remove a list of children from a parent widget's managed +list. +widgetsremoving +XtUnmanageChildren + + + + + +4 March 1996 + + +void XtUnmanageChildren(children, num_children) + WidgetList children; + Cardinal num_children; + + + +Inputs + + +children + + +Specifies an array of child widgets. Each child must be of +class RectObj or any subclass thereof. + + + + +num_children + + +Specifies the number of elements in children. + + + + + + + +Description + +XtUnmanageChildren() 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. + +Each of the widgets in the children array must have +the same parent. + +See the “Algorithm” section below for full details of the +widget unmanagement procedure. + + + + +Usage +Unmanaging widgets is the usual method for temporarily +making them invisible. They can be re-managed with +XtManageChildren(). + +You can unmap a widget, but leave it under geometry +management by calling XtUnmapWidget(). You can +destroy a widget's window without destroying the widget by +calling XtUnrealizeWidget(). You can destroy a +widget completely with XtDestroyWidget(). + +If you are only going to unmanage a single widget, it is +more convenient to call XtUnmanageChild(). It is +often more convenient to call XtUnmanageChild() +several times than it is to declare and initialize an array +of widgets to pass to XtUnmanageChildren(). Calling +XtUnmanageChildren() is more efficient, however, +because it only calls the parent's change_managed() +method once. + + + + +Algorithm + +XtUnmanageChildren() performs the following: + + + +- + + +Ignores the child if it already is unmanaged or is being +destroyed. + + + + +- + + +Otherwise, if the child is realized, it makes it nonvisible +by unmapping it. + + + + + + + + + +Structures +The WidgetList type is simply an array of widgets: + +typedef Widget *WidgetList; + + + + + + + +Questions and Answers + + + +&reporting.bugs; +&updating.documentation; + + + + +My Mouse doesn't work. How do I quit &appname;? + + +You silly goose! Check out the Commands +Section for the answer. + + + + +Why can't I twiddle my documents? + + +You can only twiddle your documents if you have the foobar.lib +installed. + + + + + + + + + +Credits and License + + +&appname; + + +Program copyright %{YEAR} %{AUTHOR} %{EMAIL} + + +Contributors: + +Konqui the KDE Dragon konqui@kde.org + +Tux the Linux Penguin tux@linux.org + + + + + +Documentation copyright %{YEAR} %{AUTHOR} %{EMAIL} + + + + +&underFDL; + + + +&underGPL; +&underBSDLicense; +&underArtisticLicense; +&underX11License; + + + + +Installation + + +How to obtain &appname; + + + +&install.intro.documentation; + + + + +Requirements + + + + +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. + + + +All required libraries as well as &appname; itself can be found +on The &appname; home page. + + + + +You can find a list of changes at http://apps.kde.org/appname. + + + + +Compilation and Installation + + + + + +&install.compile.documentation; + + + + +Configuration + +Don't forget to tell your system to start the dtd +dicer-toaster daemon first, or &appname; won't work ! + + + + + +&documentation.index; +
+ + + 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 : YOUR@EMAIL.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### + +import kdedistutils + +kdedistutils.setup(name="kdeapp", + version="0.1.0", + author="AUTHOR", + author_email="YOUR@EMAIL.com", + 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ĞÉܖCf UĠSżğïä +"Öl+²*ħ²²JğÇ°˜M¨ŞJde…­Ù9Hz]—qTÖPòBÉIÀ× +ÙŬ}ħĤÂQħ˜•—‰ ¤bRˆ˘³ŞÒÛ÷€ ï]ánv–ïbf,Àğƒĝçü:ÀLÑdÖ4€íPuCÀ ÊÔ7ÔòAK ÷\ŭô^żÏŸ=.~öĦċ|َ2³wÄË|xw’Î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̲~&ŽqR- H£„Gpk +PPJ£&( +´J¨EQŝİÚ4Iq QDHC~D6ĜÂBĜµ—×ٵٝÇÎ̝™;Ï;Ó?f½1µ i{¤£Ğ+]ï÷œóŭ}żżkö_²B”Ğe,ˢ3²„Ö–6”TĜĥÍ3'Ÿ``ÙÀIeĞm=½½ı§ü´ŭ‰Ż}›j ´˘^Ğw™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!gĈ~So +“/äY58ȗżġç$ÓiĈĈßÄÏĝTJjA +€5›†ı0ù> +nĵċ“ÜtçMt?ħ€çgj|’#O=‹]ğžùdÛĥȕr(ÁŻßħżz'N½Œ—̐Ïä)ûE +™²ìċ(Â--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ĦqK*—"ĴÂ͖L\ +i#¤h†‡h-ÂĈ–M[½èérá½µGkċ eóĜíTNršbH6•Ċ‰¸ô/렏? 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 : your@email.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### + +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, "your@email.com") + aboutdata.addAuthor("AUTHOR", None, "your@email.com") + 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 : your@email.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### + +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 @@ + + + + C&ustom + + + + 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 : your@email.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### + +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 : your@email.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### + +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. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more 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. + + , 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 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 diff --git a/app_templates/kdeutility/README b/app_templates/kdeutility/README new file mode 100644 index 0000000..e69de29 diff --git a/app_templates/kdeutility/TODO b/app_templates/kdeutility/TODO new file mode 100644 index 0000000..e69de29 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 @@ + +MyApplicaition 0.1"> + + + + + + + +]> + + + + + + + + + + + + + + +The &appname; Handbook + + + + + +%{AUTHOR} + +
%{EMAIL}
+
+
+
+ + + + +1999 +%{YEAR} +%{AUTHOR} + + + +&FDLNotice; + + + +2001-10-18 +%{VERSION} + + + + + +&appname; is an application specially designed to do nothing you would +ever want. + + + + + + +KDE +%{APPNAME} +nothing +nothing else + + +
+ + + + +Introduction + + + + +&appname; is a program that lets you do absolutely nothing. Please report +any problems or feature requests to the &kde; mailing lists. + + + + +Using &appname; + + + + + + + + +Here's a screenshot of &appname; + + + + + + + + + Screenshot + + + + + + + +More &appname; features + +It slices! It dices! and it comes with a free toaster! + +The Squiggle Tool + + + + + + + + Squiggle + + is used to draw squiggly lines all over +the &appname; main window. It's not a bug, it's a feature! + + + + + + +Command Reference + + + + +The main &appname; window + + +The File Menu + + + + + +&Ctrl;N + +File +New + +Creates a new document + + + + +&Ctrl;S + +File +Save + +Saves the document + + + + +&Ctrl;Q + +File +Quit + +Quits &appname; + + + + + + + +The <guimenu>Help</guimenu> Menu + + + + + + +&help.menu.documentation; + + + + + + + +Developer's Guide to &appname; + + + + +Programming &appname; plugins is a joy to behold. Just read through the next +66 pages of API's to learn how! + + + + + + +XtUnmanageChildren +Xt - Geometry Management + + +XtUnmanageChildren + +remove a list of children from a parent widget's managed +list. +widgetsremoving +XtUnmanageChildren + + + + + +4 March 1996 + + +void XtUnmanageChildren(children, num_children) + WidgetList children; + Cardinal num_children; + + + +Inputs + + +children + + +Specifies an array of child widgets. Each child must be of +class RectObj or any subclass thereof. + + + + +num_children + + +Specifies the number of elements in children. + + + + + + + +Description + +XtUnmanageChildren() 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. + +Each of the widgets in the children array must have +the same parent. + +See the “Algorithm” section below for full details of the +widget unmanagement procedure. + + + + +Usage +Unmanaging widgets is the usual method for temporarily +making them invisible. They can be re-managed with +XtManageChildren(). + +You can unmap a widget, but leave it under geometry +management by calling XtUnmapWidget(). You can +destroy a widget's window without destroying the widget by +calling XtUnrealizeWidget(). You can destroy a +widget completely with XtDestroyWidget(). + +If you are only going to unmanage a single widget, it is +more convenient to call XtUnmanageChild(). It is +often more convenient to call XtUnmanageChild() +several times than it is to declare and initialize an array +of widgets to pass to XtUnmanageChildren(). Calling +XtUnmanageChildren() is more efficient, however, +because it only calls the parent's change_managed() +method once. + + + + +Algorithm + +XtUnmanageChildren() performs the following: + + + +- + + +Ignores the child if it already is unmanaged or is being +destroyed. + + + + +- + + +Otherwise, if the child is realized, it makes it nonvisible +by unmapping it. + + + + + + + + + +Structures +The WidgetList type is simply an array of widgets: + +typedef Widget *WidgetList; + + + + + + + +Questions and Answers + + + +&reporting.bugs; +&updating.documentation; + + + + +My Mouse doesn't work. How do I quit &appname;? + + +You silly goose! Check out the Commands +Section for the answer. + + + + +Why can't I twiddle my documents? + + +You can only twiddle your documents if you have the foobar.lib +installed. + + + + + + + + + +Credits and License + + +&appname; + + +Program copyright %{YEAR} %{AUTHOR} %{EMAIL} + + +Contributors: + +Konqui the KDE Dragon konqui@kde.org + +Tux the Linux Penguin tux@linux.org + + + + + +Documentation copyright %{YEAR} %{AUTHOR} %{EMAIL} + + + + +&underFDL; + + + +&underGPL; +&underBSDLicense; +&underArtisticLicense; +&underX11License; + + + + +Installation + + +How to obtain &appname; + + + +&install.intro.documentation; + + + + +Requirements + + + + +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. + + + +All required libraries as well as &appname; itself can be found +on The &appname; home page. + + + + +You can find a list of changes at http://apps.kde.org/appname. + + + + +Compilation and Installation + + + + + +&install.compile.documentation; + + + + +Configuration + +Don't forget to tell your system to start the dtd +dicer-toaster daemon first, or &appname; won't work ! + + + + + +&documentation.index; +
+ + + 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 : YOUR@EMAIL.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### + +import kdedistutils + +kdedistutils.setup(name="kdeutility", + version="0.1.0", + author="AUTHOR", + author_email="YOUR@EMAIL.com", + 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 @@ + +KDEUtilityDialogUI + + + KDEUtilityDialogUI + + + + 0 + 0 + 600 + 480 + + + + KDE Utility + + + + unnamed + + + + hellobutton + + + Hello, Good bye + + + + + + 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ĞÉܖCf UĠSżğïä +"Öl+²*ħ²²JğÇ°˜M¨ŞJde…­Ù9Hz]—qTÖPòBÉIÀ× +ÙŬ}ħĤÂQħ˜•—‰ ¤bRˆ˘³ŞÒÛ÷€ ï]ánv–ïbf,Àğƒĝçü:ÀLÑdÖ4€íPuCÀ ÊÔ7ÔòAK ÷\ŭô^żÏŸ=.~öĦċ|َ2³wÄË|xw’Î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̲~&ŽqR- H£„Gpk +PPJ£&( +´J¨EQŝİÚ4Iq QDHC~D6ĜÂBĜµ—×ٵٝÇÎ̝™;Ï;Ó?f½1µ i{¤£Ğ+]ï÷œóŭ}żżkö_²B”Ğe,ˢ3²„Ö–6”TĜĥÍ3'Ÿ``ÙÀIeĞm=½½ı§ü´ŭ‰Ż}›j ´˘^Ğw™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!gĈ~So +“/äY58ȗżġç$ÓiĈĈßÄÏĝTJjA +€5›†ı0ù> +nĵċ“ÜtçMt?ħ€çgj|’#O=‹]ğžùdÛĥȕr(ÁŻßħżz'N½Œ—̐Ïä)ûE +™²ìċ(Â--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ĦqK*—"ĴÂ͖L\ +i#¤h†‡h-ÂĈ–M[½èérá½µGkċ eóĜíTNršbH6•Ċ‰¸ô/렏? 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 : your@email.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### + +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, "your@email.com") + aboutdata.addAuthor("AUTHOR", None, "your@email.com") + 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. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more 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. + + , 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 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 diff --git a/app_templates/kioslave/README b/app_templates/kioslave/README new file mode 100644 index 0000000..e69de29 diff --git a/app_templates/kioslave/TODO b/app_templates/kioslave/TODO new file mode 100644 index 0000000..e69de29 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 @@ + +MyApplicaition 0.1"> + + + + + + + +]> + + + + + + + + + + + + + + +The &appname; Handbook + + + + + +%{AUTHOR} + +
%{EMAIL}
+
+
+
+ + + + +1999 +%{YEAR} +%{AUTHOR} + + + +&FDLNotice; + + + +2001-10-18 +%{VERSION} + + + + + +&appname; is an application specially designed to do nothing you would +ever want. + + + + + + +KDE +%{APPNAME} +nothing +nothing else + + +
+ + + + +Introduction + + + + +&appname; is a program that lets you do absolutely nothing. Please report +any problems or feature requests to the &kde; mailing lists. + + + + +Using &appname; + + + + + + + + +Here's a screenshot of &appname; + + + + + + + + + Screenshot + + + + + + + +More &appname; features + +It slices! It dices! and it comes with a free toaster! + +The Squiggle Tool + + + + + + + + Squiggle + + is used to draw squiggly lines all over +the &appname; main window. It's not a bug, it's a feature! + + + + + + +Command Reference + + + + +The main &appname; window + + +The File Menu + + + + + +&Ctrl;N + +File +New + +Creates a new document + + + + +&Ctrl;S + +File +Save + +Saves the document + + + + +&Ctrl;Q + +File +Quit + +Quits &appname; + + + + + + + +The <guimenu>Help</guimenu> Menu + + + + + + +&help.menu.documentation; + + + + + + + +Developer's Guide to &appname; + + + + +Programming &appname; plugins is a joy to behold. Just read through the next +66 pages of API's to learn how! + + + + + + +XtUnmanageChildren +Xt - Geometry Management + + +XtUnmanageChildren + +remove a list of children from a parent widget's managed +list. +widgetsremoving +XtUnmanageChildren + + + + + +4 March 1996 + + +void XtUnmanageChildren(children, num_children) + WidgetList children; + Cardinal num_children; + + + +Inputs + + +children + + +Specifies an array of child widgets. Each child must be of +class RectObj or any subclass thereof. + + + + +num_children + + +Specifies the number of elements in children. + + + + + + + +Description + +XtUnmanageChildren() 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. + +Each of the widgets in the children array must have +the same parent. + +See the “Algorithm” section below for full details of the +widget unmanagement procedure. + + + + +Usage +Unmanaging widgets is the usual method for temporarily +making them invisible. They can be re-managed with +XtManageChildren(). + +You can unmap a widget, but leave it under geometry +management by calling XtUnmapWidget(). You can +destroy a widget's window without destroying the widget by +calling XtUnrealizeWidget(). You can destroy a +widget completely with XtDestroyWidget(). + +If you are only going to unmanage a single widget, it is +more convenient to call XtUnmanageChild(). It is +often more convenient to call XtUnmanageChild() +several times than it is to declare and initialize an array +of widgets to pass to XtUnmanageChildren(). Calling +XtUnmanageChildren() is more efficient, however, +because it only calls the parent's change_managed() +method once. + + + + +Algorithm + +XtUnmanageChildren() performs the following: + + + +- + + +Ignores the child if it already is unmanaged or is being +destroyed. + + + + +- + + +Otherwise, if the child is realized, it makes it nonvisible +by unmapping it. + + + + + + + + + +Structures +The WidgetList type is simply an array of widgets: + +typedef Widget *WidgetList; + + + + + + + +Questions and Answers + + + +&reporting.bugs; +&updating.documentation; + + + + +My Mouse doesn't work. How do I quit &appname;? + + +You silly goose! Check out the Commands +Section for the answer. + + + + +Why can't I twiddle my documents? + + +You can only twiddle your documents if you have the foobar.lib +installed. + + + + + + + + + +Credits and License + + +&appname; + + +Program copyright %{YEAR} %{AUTHOR} %{EMAIL} + + +Contributors: + +Konqui the KDE Dragon konqui@kde.org + +Tux the Linux Penguin tux@linux.org + + + + + +Documentation copyright %{YEAR} %{AUTHOR} %{EMAIL} + + + + +&underFDL; + + + +&underGPL; +&underBSDLicense; +&underArtisticLicense; +&underX11License; + + + + +Installation + + +How to obtain &appname; + + + +&install.intro.documentation; + + + + +Requirements + + + + +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. + + + +All required libraries as well as &appname; itself can be found +on The &appname; home page. + + + + +You can find a list of changes at http://apps.kde.org/appname. + + + + +Compilation and Installation + + + + + +&install.compile.documentation; + + + + +Configuration + +Don't forget to tell your system to start the dtd +dicer-toaster daemon first, or &appname; won't work ! + + + + + +&documentation.index; +
+ + + 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 : YOUR@EMAIL.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### + +import kdedistutils + +kdedistutils.setup(name="kioslave", + version="0.1.0", + author="AUTHOR", + author_email="YOUR@EMAIL.com", + 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 : your@email.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### + +# 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 @@ + +PyKDE Extensions"> + + + + + + + +]> + + + + + + + +The &appname; Handbook + + + +Simon + +Edwards + +
simon@simonzone.com
+
+
+
+ + + + +2005 +Simon Edwards + + + +&FDLNotice; + + + +2005-09-19 +0.4 + + + + + +&appname; is a collection of software and Python packages to support the +creation and installation of KDE applications. + + + + + + +KDE +PyKDE Extensions +python +PyKDE + + +
+ + +Introduction + + +&appname; is a collection of software and Python packages to support the +creation and installation of KDE applications. + + + + + + +Installation & Distutils support + + +C++ projects on KDE traditionally use +autoconf, +automake +and libtool +to handle the building and installation. These tools +and difficult to use, even for experianced developers. + + + +Fortunately Python has a its own system for building and installing +modules and software. Distutils +is a standard Python package and comes with every Python installation. +&appname; builds on Distutils with extensions tailored for handling KDE +programs. + + + +A typical KDE program comes not only with the program itself but also +extra files such as a manual written in Docbook +format, translation files, +icons, images and other auxiliary data files. &appname; provides support for +handling all these other files types. + + + +Using Distutils with KDE programs + +It is advised that you first read the standard +Distutils documentation +to learn about how it works. &appname; adds some KDE specific extensions which are documented +below. + + + +Distutils is based around writing a setup.py file which +then uses the distutils package +To use the KDE extensions, the first thing you need to do in your setup.py + file is include the kdedistutils package. + +#!/usr/bin/env python +# Setup.py file for MyKDEApplication + +import kdedistutils + + +You need to call the setup() function from kdedistutils +with all of the configuration information about your application, much like the standard +setup() from distutils. + + +kdedistutils.setup(name="pykdeextensions", + version="0.1.0", + author="Simon Edwards", + author_email="simon@simonzone.com", + url="http://www.simonzone.com/software/pykdeextensions/", + min_kde_version = "3.0.0", + min_qt_version = "3.0.0", + license = "LGPL" ) + + +min_kde_version and min_qt_version specify +the minimum versions of the Qt library and KDE needed to install and run +the software. These requirements are checked during install. + + + +The other arguments shown here are standard distutils.setup() +arguments. + + + + + +Application data files + +Each KDE application as a data directory of it's own for storing any extra +data files it may need to run. + + + +Data files are specified using the the application_data +argument for setup(). application_data +is a list of files to install. + + application_data = ['extracode.py', ('pics', ['pics/warning.png'])] + +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. + + + +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 import. + + + +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 +bin directory. &appname; provides an easy way for creating +symbolic links from the "bin" directory to scripts in the application +directory. + + executable_links = [('myapplication','myapplication.py'), ('myapplicationgui','myapplicationgui.py')] + +This example specifies an executable symbolic link myapplication + that points to the myapplication.py script +in the application data directory. + + + + + +Uninstall command + +Standard Distutils does not feature an uninstall command. &appname; does +and it can be easily invoked with: + +python setup.py uninstall + +It is quite basic. The install writes the list of files +it installed to the file install_log.txt. The +uninstall command simply reads this file and removes the +files and directories that are listed within. + + + + + + +Manuals & Docbook files + +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 here. +Manuals are written in the Docbook format, but need to be converted +into HTML when installed and made available for the KDE Help Center. + + + +Docbooks files and images are usually organised under a +doc directory which is then further divided by two +letter language code. For example doc/en, +doc/nl, en doc/fr. +The Docbook files themselves are named index.docbook + + + +By using the docbooks argument to setup() +in your setup.py, you can specify the directories +containing docbook files. You also need to specify the language used in +that directory. + + docbooks = [ ('doc/en','en'), ('doc/nl','nl'), ('doc/fr','fr') ] + +The argument to docbooks 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. + + + +Docbook files specified this way will automatically be converted to HTML +during install. + + + + + + +Run-time integration with Qt-Designer + +Qt-Designer is a graphical application used for designing user interfaces. +It creates .ui 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 pyuic +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 +qtdesigner or kdedesigner 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. + + +#!/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. + +The kdedesigner/qtdesigner module converts +.ui on demand to +.py files. + + + + + + +Internationalization & translation + +i18n (an abbreviation of internationalization) is the process of translating +the user interface and documentation of a piece of software into another +language. i18n.kde.org is the central +information point for the effort to translate KDE software into other +languages. + + + +Translation of the user interface an application is done using +.pot files and +.po files. +A .pot 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. + + + +Before a string in a program is include in the .pot + file, it needs to be marked with the i18n(). + + +#!/usr/bin/env python +from kdecode import * + + ... + mylabel = QLabel(i18n("Select new directory:")) + ... + +The i18n() is part of the kdecode package +and needs to be imported. + + + +&appname; provides support for generating .pot +files and managing and updating .po files. + + + +By using the i18n argument to setup() +in your setup.py, you can specify the directory +that should contain the .pot and +.po files. The argument for +i18n 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. + + i18n = ('po',['.','mymodule']) + + + + + +Once your setup.py is configured, use this command in the +shell to generate the .pot file. + +python setup.py update_messages + +This command also updates any already existing .po +files with any new messages. + + + +&appname; also handles installing translation files and converting +.po files into the special binary format +needed by the application at runtime. + + + + + + +KDE Control Center Modules + +&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. + + +The best way to start learning about creating modules is to read the +KConfig +Module HOWTO. It is written for C++, but the concepts are the same for +Python. + + +In your setup.py file you can specify the list of kcontrol +modules that need to be installed. + + kcontrol_modules = [ ('src/kcontrol_module.desktop','kcontrol_module.py')] ) + +This is just a list of tuples. The first item is name of the +.desktop 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. + + +The +KControl Module Guidelines provides useful information about how to +design a KControl module that fits into the rest of KDE. + + + + +&appname; typically installs the .desktop +file into the /usr/share/applications/kde/ directory. +This is normally enough to make the module appear in the KDE Control Center. +But for some distributions, most notably +Mandriva but probably others too, this isn't enough. Mandriva in +particular uses the +Debian menu system 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 .menu file and copy +it into /usr/lib/menu, and then use update-menus + as root to update all of the menus and the list of kcontrol +modules. + + + + + +Right now there is no support for "module-testing" or "X-KDE-Test-Module=true" +features in .desktop files. + + + + + + +KIO Slaves + +&appname; can be used for the creation of kio-slaves. &appname; handles the C++ +glue code needed for making kioslaves in Python. +developer.kde.org +has some documentation about KIO-slaves aimed at C++ programmers. + + +In your setup.py file you can specify the list of kioslaves +that need to be installed. + + kioslaves = [ ('src/kioslave.protocol','kioslave.py')] ) + +This is just a list of tuples. The first item is name of the +.protocol 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. + + + + + +Application templates + + +The app_templates directory contains a number of +application templates. An application template 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 setup.py + file which can later be modified. + + + +Every application template has a number of files in common. They are +described below. + + + + AUTHORS + Lists the authors of this software. + + + + ChangeLog + An itemised log or list of changes to the software. + + + + COPYING + A copy of the GNU GPL, explaining the terms under which this + software may be distributed. This file does not need to be changed. + + + + + INSTALL + Instructions for installing the software. + + + + MANIFEST.in + + + + + NEWS + News about what is new in the current version of this software. + + + + + README + Important instructions and information that the user should + read first. + + + + setup.py + . + + + + TODO + List of features and work that may be available in a future + version of the software. + + + + po/ + This directory is initially empty. It is used for + .pot and .po + translation files. + + + + doc/ + This directory is initially empty. It is used for holding the + directores for the different langauge version of the manual. + + + + doc/en + This directory for the english version of the manual. + + + + + doc/en/index.docbook + The english manual in docbook format. The default is a template + which can then be filled in. + + + + src + This directory containing the source code for the software. + The default contents of this directory depends on the particular + application template. + + + + + + + +Simple KDE utility template + +The kdeutility application template is a simple utility +that uses an interface designed in Qt-Designer. It doesn't have a menubar +or toolbar. + + + + +KDE application template + +The kdeapp application template is an application with +menubar, toolbar and separated document and view classes. The menubar and toolbars +are defined using XML. + + + + +Kcontrol Module Application Template + +The kcontrol_module 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. + + + + +KIO-slave Application Template + +The kioslave 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. kioslave.py +contains more information and comments. + + + +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. + + + + + + + + + + + +Credits and License + + +&appname; + + +Program copyright 2005 Simon Edwards simon@simonzone.com + + +Contributors: + +Konqui the KDE Dragon konqui@kde.org + +Tux the Linux Penguin tux@linux.org + + + + + +Documentation copyright 2005 Simon Edwards simon@simonzone.com + + + + +&underFDL; + + +&documentation.index; +
+ + + 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 : simon@simonzone.com # +# # +########################################################################### +# # +# 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="simon@simonzone.com", + 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 : simon@simonzone.com # +# # +########################################################################### +# # +# 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 : simon@simonzone.com # +# # +########################################################################### +# # +# 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#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 +#include +#include +#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 ibbit: + return 1 + elif abit + + 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 +#include + +// this just gets rid of a warning when Python.h redefines it +#undef _POSIX_C_SOURCE + +#include + +#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 + + 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 + +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 : simon@simonzone.com # +# # +########################################################################### +# # +# 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 : simon@simonzone.com # +# # +########################################################################### +# # +# 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()