commit d55448b2d3114e0fc4775f437a3f1a8cf86c488b Author: Davide Andreoli Date: Sat Dec 6 18:51:04 2008 +0000 Places module in SVN SVN revision: 37964 diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..d29f669 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Dave Andreoli diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + 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 +state 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 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU 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 Lesser General +Public License instead of this License. But first, please read +. diff --git a/COPYING.LESSER b/COPYING.LESSER new file mode 100644 index 0000000..1604322 --- /dev/null +++ b/COPYING.LESSER @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + 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 that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser 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 as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..d3c5b40 --- /dev/null +++ b/INSTALL @@ -0,0 +1,237 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007 Free Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 6. Often, you can also type `make uninstall' to remove the installed + files again. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..f4cb0b6 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,38 @@ +MAINTAINERCLEANFILES = Makefile.in aclocal.m4 ABOUT-NLS config.h.in \ + config.guess config.rpath config.sub configure depcomp install-sh \ + ltmain.sh missing module.desktop mkinstalldirs config.h.in + +SUBDIRS = src po + +EDJE_FLAGS = -v \ + -id $(top_srcdir)/images \ + -fd $(top_srcdir)/fonts + +# data files for the module +filesdir = $(datadir) + +files_DATA = module.desktop \ + e-module-places.edj + +EXTRA_DIST = $(files_DATA) \ + images/eject.png \ + images/eject_bg.png \ + images/icon_cdrom.png \ + images/icon_dvd.png \ + images/icon_ext3.png \ + images/icon_hdd.png \ + images/icon_hfs.png \ + images/icon_ipod.png \ + images/icon_ms.png \ + images/icon_sdmmc.png \ + images/icon_vfat.png \ + fonts/VeraBd.ttf \ + fonts/Vera.ttf + +%.edj: %.edc + $(EDJE_CC) $(EDJE_FLAGS) $< $@ + +clean-local: + rm -rf e-module-places.edj module.desktop *~ +uninstall: + rm -rf $(DESTDIR)$(datadir) diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..50e269f --- /dev/null +++ b/README @@ -0,0 +1,2 @@ +Places module +This module manage the volumes device attached to the system. diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..ae01364 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +rm -rf autom4te.cache +rm -f aclocal.m4 ltmain.sh + +touch README + +echo "Running autopoint..." ; autopoint -f || : +echo "Running aclocal..." ; aclocal -I m4 $ACLOCAL_FLAGS || exit 1 +echo "Running autoheader..." ; autoheader || exit 1 +echo "Running autoconf..." ; autoconf || exit 1 +echo "Running libtoolize..." ; (libtoolize --copy --automake || glibtoolize --automake) || exit 1 +echo "Running automake..." ; automake --add-missing --copy --gnu || exit 1 + +if [ -z "$NOCONFIGURE" ]; then + ./configure "$@" +fi diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..9758f94 --- /dev/null +++ b/configure.ac @@ -0,0 +1,65 @@ +dnl Process this file with autoconf to produce a configure script. + +# get rid of that stupid cache mechanism +rm -f config.cache + +AC_INIT(places, 0.1.0, dave@gurumeditation.it) +AC_PREREQ(2.52) +AC_CONFIG_SRCDIR(configure.ac) +AC_CANONICAL_BUILD +AC_CANONICAL_HOST +AC_ISC_POSIX + +AM_INIT_AUTOMAKE(1.8) +AM_CONFIG_HEADER(config.h) + +AC_PROG_CC +AM_PROG_CC_STDC +AC_HEADER_STDC +AC_C_CONST +AC_C___ATTRIBUTE__ + +define([AC_LIBTOOL_LANG_CXX_CONFIG], [:])dnl +define([AC_LIBTOOL_LANG_F77_CONFIG], [:])dnl +AC_PROG_LIBTOOL + +AM_GNU_GETTEXT([external]) +AM_GNU_GETTEXT_VERSION(0.14) + +MODULE_ARCH="$host_os-$host_cpu" +AC_SUBST(MODULE_ARCH) +AC_DEFINE_UNQUOTED(MODULE_ARCH, "$MODULE_ARCH", "Module architecture") + +# Find edje_cc +PKG_CHECK_MODULES(EDJE, [edje >= 0.5.0]) +AC_ARG_WITH(edje-cc, + AC_HELP_STRING([--with-edje-cc=PATH], [specify a specific path to edje_cc]), + [ + v=$withval; + EDJE_CC=$v + ],[ + EDJE_CC=$(pkg-config --variable=prefix edje)/bin/edje_cc + ] +) +AC_SUBST(EDJE_CC) +AC_MSG_CHECKING([Which edje_cc to use]) +AC_MSG_RESULT(${EDJE_CC}) + +PKG_CHECK_MODULES(E, [enlightenment]) +PKG_CHECK_MODULES(E_DBUS, edbus) +PKG_CHECK_MODULES(E_HAL, ehal) + +datadir=$(pkg-config --variable=modules enlightenment)/${PACKAGE} + +AC_ARG_ENABLE(homedir-install, + AS_HELP_STRING([--enable-homedir-install], [Install module in homedir]), + [ datadir="${HOME}/.e/e/modules/${PACKAGE}" ] +) + +AC_OUTPUT([ +Makefile +src/Makefile +po/Makefile.in +module.desktop +], [ +]) diff --git a/e-module-places.edc b/e-module-places.edc new file mode 100644 index 0000000..c089450 --- /dev/null +++ b/e-module-places.edc @@ -0,0 +1,458 @@ +fonts +{ + font: "VeraBd.ttf" "VeraBd"; + font: "Vera.ttf" "Vera"; +} + +images +{ + image: "eject.png" COMP; + image: "eject_bg.png" COMP; + image: "icon_hdd.png" COMP; + image: "icon_cdrom.png" COMP; + image: "icon_dvd.png" COMP; + image: "icon_ipod.png" COMP; + image: "icon_sdmmc.png" COMP; + image: "icon_ms.png" COMP; + image: "icon_ext3.png" COMP; + image: "icon_vfat.png" COMP; + image: "icon_hfs.png" COMP; +} + +#define ICONS(_name) \ + group { \ + name: "modules/places/icon/"_name; \ + parts { \ + part { \ + name: "image"; \ + mouse_events: 0; \ + type: IMAGE; \ + description { \ + state: "default" 0.0; \ + image.normal: "icon_"_name".png"; \ + } \ + } \ + } \ + } + +collections +{ +/****************************************************/ +/** MODULE ICON ***********************************/ +/****************************************************/ + group { name: "icon"; + max: 24 24; + parts { + part { name: "image"; + mouse_events: 0; + type: IMAGE; + description { state: "default" 0.0; + image.normal: "icon_hdd.png"; + } + } + } + } +/****************************************************/ +/** VOLUMES ICON **********************************/ +/****************************************************/ + group { name: "modules/places/icon/generic"; + parts { + part { name: "image"; + mouse_events: 0; + type: IMAGE; + description { state: "default" 0.0; + image.normal: "icon_hdd.png"; + } + } + } + } + ICONS("cdrom"); + ICONS("dvd"); + ICONS("ipod"); + ICONS("sdmmc"); + ICONS("ext3"); + ICONS("hfs"); + ICONS("vfat"); + ICONS("ms"); +/****************************************************/ +/** GADGET HEADER *********************************/ +/****************************************************/ + group { name: "modules/places/header"; + min: 90 30; + max: 384 30; + parts { + part { name: "bg"; + type: RECT; + description { state: "default" 0.0; + color: 100 100 100 150; + } + } + part { name: "title"; + type: TEXT; + effect: GLOW; + description { state: "default" 0.0; + color: 0 0 0 255; + color2: 255 255 255 255; + color3: 255 255 255 255; + text { + font: "VeraBd"; + size: 14; + text: "P l a c e s"; + } + } + } + } + } +/****************************************************/ +/** GADGET VOLUME *********************************/ +/****************************************************/ + group { name: "modules/places/main"; + min: 90 50; + max: 384 60; + script { /* this set the gauge value */ + public message(Msg_Type:type, id, ...) { + if ((type == MSG_FLOAT) && (id == 1)) { + new Float:val; + val = getfarg(2); + set_state(PART:"gauge", "default", val); + } + } + } + parts { + part { name: "bg"; + mouse_events: 0; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "separator"; + mouse_events: 0; + type: RECT; + description { state: "default" 0.0; + rel1.relative: 0.0 1.0; + rel2.relative: 1.0 1.0; + rel1.offset: 0 -1; + color: 0 0 0 255; + } + } + part { name: "event"; + mouse_events: 1; + type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + } + } + part { name: "icon_events"; + mouse_events: 1; + type: RECT; + description { state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 0.0; + rel1.offset: 0 0; + rel2.offset: 45 45; + color: 255 0 0 0; + } + } + part { name: "icon"; + mouse_events: 0; + type: SWALLOW; + description { state: "default" 0.0; + rel1.relative: 0 0; + rel2.relative: 0 0; + rel1.offset: 5 5; + rel2.offset: 45 45; + } + } + part { name: "icon_ghost_clip"; + mouse_events: 0; + type: RECT; + description { state: "default" 0.0; + rel1.relative: 0 0; + rel2.relative: 0 0; + rel1.offset: -10 -10; + rel2.offset: 60 60; + color: 255 255 255 200; + } + description { state: "big" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + } + } + part { name: "icon_ghost"; + mouse_events: 0; + type: SWALLOW; + clip_to: "icon_ghost_clip"; + description { state: "default" 0.0; + rel1.relative: 0 0; + rel2.relative: 0 0; + rel1.offset: 5 5; + rel2.offset: 45 45; + } + description { state: "big" 0.0; + rel1.relative: 0 0; + rel2.relative: 0 0; + rel1.offset: -10 -10; + rel2.offset: 60 60; + } + } + part { name: "gauge_bg"; + mouse_events: 0; + type: RECT; + description { state: "default" 0.0; + rel1.to: "volume_label"; + rel1.relative: 0.0 1.0; + rel2.to_x: "eject_bg"; + rel2.relative: -0.1 0.65; + color: 0 0 0 150; + } + description { state: "hidden" 0.0; + inherit: "default" 0.0; + rel2.relative: -0.1 0.40; + visible: 1; + } + } + part { name: "gauge"; + mouse_events: 0; + type: RECT; + description { state: "default" 0.0; + rel1.to: "gauge_bg"; + rel1.offset: 1 1; + rel2.to: "gauge_bg"; + rel2.offset: -2 -2; + rel2.relative: 0.0 1.0; + color: 0 200 0 200; + } + description { state: "default" 0.1; + inherit: "default" 0.0; + rel2.relative: 0.1 1.0; + } + description { state: "default" 0.2; + inherit: "default" 0.0; + rel2.relative: 0.2 1.0; + } + description { state: "default" 0.3; + inherit: "default" 0.0; + rel2.relative: 0.3 1.0; + } + description { state: "default" 0.4; + inherit: "default" 0.0; + rel2.relative: 0.4 1.0; + } + description { state: "default" 0.5; + inherit: "default" 0.0; + rel2.relative: 0.5 1.0; + } + description { state: "default" 0.6; + inherit: "default" 0.0; + rel2.relative: 0.6 1.0; + } + description { state: "default" 0.7; + inherit: "default" 0.0; + rel2.relative: 0.7 1.0; + } + description { state: "default" 0.8; + inherit: "default" 0.0; + rel2.relative: 0.8 1.0; + color: 200 0 0 200; + } + description { state: "default" 0.9; + inherit: "default" 0.0; + rel2.relative: 0.9 1.0; + color: 200 0 0 200; + } + description { state: "default" 1.0; + inherit: "default" 0.0; + rel2.relative: 1.0 1.0; + color: 200 0 0 200; + } + } + part { name: "volume_label"; + mouse_events: 0; + type: TEXT; + effect: SOFT_SHADOW; + description { state: "default" 0.0; + rel1.relative: 0.25 0.1; + rel2.relative: 0.98 0.40; + rel2.to: "bg"; + color: 255 255 255 255; + color3: 0 0 0 60; + text { + font: "VeraBd"; + size: 10; + text: ""; + align: 0.0 0.5; + + } + } + } + part { name: "size_label"; + mouse_events: 0; + type: TEXT; + effect: SOFT_SHADOW; + description { state: "default" 0.0; + rel1.relative: 0.0 1.0; + rel1.to: "gauge_bg"; + rel2.relative: 0.98 1.0; + rel2.to: "bg"; + color: 255 255 255 255; + color3: 0 0 0 60; + text { + font: "Vera"; + size: 10; + text: ""; + align: 0.0 0.5; + } + } + } + part { name: "percent_label"; + mouse_events: 0; + type: TEXT; + effect: SOFT_SHADOW; + description { state: "default" 0.0; + rel1.to: "gauge_bg"; + rel2.to: "gauge_bg"; + color: 255 255 255 255; + color3: 0 0 0 60; + text { + font: "Vera"; + text: "10%"; + fit: 0 1; + align: 0.5 0.5; + } + } + } + part { name: "eject_bg"; + mouse_events: 0; + type: IMAGE; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "eject_icon"; + rel2.to: "eject_icon"; + image { + normal: "eject_bg.png"; + border: 5 5 5 5; + } + } + description { state: "moved" 0.0; + inherit: "default" 0.0; + rel1.offset: -70 0; + color: 255 255 255 180; + } + } + part { name: "eject_label"; + mouse_events: 0; + type: TEXT; + effect: NONE; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "eject_bg"; + rel2.to: "eject_bg"; + text { + font: "VeraBD"; + text: "unmount"; + size: 12; + align: 0.2 0.5; + } + } + description { state: "moved" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { name: "eject_icon"; + mouse_events: 1; + type: IMAGE; + description { state: "default" 0.0; + rel1.relative: 1.0 0.0; + rel1.offset: -30 10; + rel2.offset: 0 -10; + image {normal: "eject.png";} + visible: 0; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { +/****************************************************/ +/** INTERNAL PROGRAMS *****************************/ +/****************************************************/ + program { name: "pulse"; + signal: "mouse,in"; + source: "icon_events"; + action: STATE_SET "big" 0.0; + transition: DECELERATE 0.5; + target: "icon_ghost_clip"; + target: "icon_ghost"; + after: "reset_pulse"; + after: "pulse"; + } + program { name: "icon_mouse_out"; + signal: "mouse,out"; + source: "icon_events"; + action: ACTION_STOP; + target: "pulse"; + after: "reset_pulse"; + } + program { name: "reset_pulse"; + action: STATE_SET "default" 0.0; + transition: LINEAR 0.0; + target: "icon_ghost_clip"; + target: "icon_ghost"; + } + program { name: "eject_mouse_in"; + signal: "mouse,in"; + source: "eject_icon"; + action: STATE_SET "moved" 0.0; + transition: SINUSOIDAL 0.4; + target: "eject_bg"; + target: "eject_label"; + } + program { name: "eject_mouse_out"; + signal: "mouse,out"; + source: "eject_icon"; + action: STATE_SET "default" 0.0; + transition: SINUSOIDAL 0.4; + target: "eject_bg"; + target: "eject_label"; + } +/****************************************************/ +/** SIGNALS EMITTED TO THE MODULE *****************/ +/****************************************************/ + program { name: "icon_activated"; + signal: "mouse,down,1"; + source: "icon_events"; + action: SIGNAL_EMIT "icon,activated" "places"; + } + program { name: "eject_activated"; + signal: "mouse,down,1"; + source: "eject_icon"; + action: SIGNAL_EMIT "eject,activated" "places"; + } +/****************************************************/ +/** SIGNALS RECEIVED FROM THE MODULE **************/ +/****************************************************/ + program { name: "hide_gauge"; + signal: "gauge,hide"; + source: "places"; + action: STATE_SET "hidden" 0.0; + target: "gauge_bg"; + } + program { name: "set_eject_hidden"; + signal: "icon,eject,hide"; + source: "places"; + action: STATE_SET "default" 0.0; + target: "eject_icon"; + } + program { name: "set_eject_visible"; + signal: "icon,eject,show"; + source: "places"; + action: STATE_SET "visible" 0.0; + target: "eject_icon"; + } + } + } +} diff --git a/fonts/Vera.ttf b/fonts/Vera.ttf new file mode 100644 index 0000000..58cd6b5 Binary files /dev/null and b/fonts/Vera.ttf differ diff --git a/fonts/VeraBd.ttf b/fonts/VeraBd.ttf new file mode 100644 index 0000000..51d6111 Binary files /dev/null and b/fonts/VeraBd.ttf differ diff --git a/images/eject.png b/images/eject.png new file mode 100644 index 0000000..c30a5a5 Binary files /dev/null and b/images/eject.png differ diff --git a/images/eject_bg.png b/images/eject_bg.png new file mode 100644 index 0000000..483986f Binary files /dev/null and b/images/eject_bg.png differ diff --git a/images/gnome-dev-cdrom-audio.png b/images/gnome-dev-cdrom-audio.png new file mode 100644 index 0000000..7a9c3df Binary files /dev/null and b/images/gnome-dev-cdrom-audio.png differ diff --git a/images/gnome-dev-media-cf.png b/images/gnome-dev-media-cf.png new file mode 100644 index 0000000..af0b67f Binary files /dev/null and b/images/gnome-dev-media-cf.png differ diff --git a/images/gnome-dev-media-sm.png b/images/gnome-dev-media-sm.png new file mode 100644 index 0000000..9c180fe Binary files /dev/null and b/images/gnome-dev-media-sm.png differ diff --git a/images/icon_cdrom.png b/images/icon_cdrom.png new file mode 100644 index 0000000..fdbd046 Binary files /dev/null and b/images/icon_cdrom.png differ diff --git a/images/icon_dvd.png b/images/icon_dvd.png new file mode 100644 index 0000000..1d4ceeb Binary files /dev/null and b/images/icon_dvd.png differ diff --git a/images/icon_ext3.png b/images/icon_ext3.png new file mode 100644 index 0000000..b0b0847 Binary files /dev/null and b/images/icon_ext3.png differ diff --git a/images/icon_hdd.png b/images/icon_hdd.png new file mode 100644 index 0000000..772ca2e Binary files /dev/null and b/images/icon_hdd.png differ diff --git a/images/icon_hfs.png b/images/icon_hfs.png new file mode 100644 index 0000000..a4f5faf Binary files /dev/null and b/images/icon_hfs.png differ diff --git a/images/icon_ipod.png b/images/icon_ipod.png new file mode 100644 index 0000000..46087c7 Binary files /dev/null and b/images/icon_ipod.png differ diff --git a/images/icon_ms.png b/images/icon_ms.png new file mode 100644 index 0000000..27288ed Binary files /dev/null and b/images/icon_ms.png differ diff --git a/images/icon_sdmmc.png b/images/icon_sdmmc.png new file mode 100644 index 0000000..7828a38 Binary files /dev/null and b/images/icon_sdmmc.png differ diff --git a/images/icon_vfat.png b/images/icon_vfat.png new file mode 100644 index 0000000..7963c12 Binary files /dev/null and b/images/icon_vfat.png differ diff --git a/m4/.cvsignore b/m4/.cvsignore new file mode 100644 index 0000000..8a7e479 --- /dev/null +++ b/m4/.cvsignore @@ -0,0 +1,28 @@ +.deps +.libs +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.guess +config.h +config.h.in +config.log +config.rpath +config.status +config.sub +configure +depcomp +install-sh +libtool +m4 +missing +mkinstalldirs +ltmain.sh +stamp-h1 +*.lo +*.la +*.edj +*.spec +*.tar.gz +module.desktop diff --git a/m4/ac_attribute.m4 b/m4/ac_attribute.m4 new file mode 100644 index 0000000..46c1a42 --- /dev/null +++ b/m4/ac_attribute.m4 @@ -0,0 +1,14 @@ + +AC_DEFUN([AC_C___ATTRIBUTE__], +[ + AC_MSG_CHECKING(for __attribute__) + AC_CACHE_VAL(ac_cv___attribute__, [ + AC_TRY_COMPILE([#include ], + [int func(int x); int foo(int x __attribute__ ((unused))) { exit(1); }], + ac_cv___attribute__=yes, ac_cv___attribute__=no)]) + if test "$ac_cv___attribute__" = "yes"; then + AC_DEFINE(HAVE___ATTRIBUTE__, 1, [Define to 1 if your compiler has __attribute__]) + fi + AC_MSG_RESULT($ac_cv___attribute__) +]) + diff --git a/module.desktop.in b/module.desktop.in new file mode 100644 index 0000000..bb13550 --- /dev/null +++ b/module.desktop.in @@ -0,0 +1,9 @@ + +[Desktop Entry] +Type=Link +Name=Places +Icon=e-module-places +Comment=Places module:
This module manage the volumes device attached to the system. +Comment[it]=Places module:
Questo module gestisce i dischi connessi al sistema + +X-Enlightenment-ModuleType=system diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..7d5856f --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1 @@ +it diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 0000000..53efc5e --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,366 @@ +# Makefile for PO directory in any package using GNU gettext. +# Copyright (C) 1995-1997, 2000-2004 by Ulrich Drepper +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License but which still want to provide support for the GNU gettext +# functionality. +# Please note that the actual code of GNU gettext is covered by the GNU +# General Public License and is *not* in the public domain. +# +# Origin: gettext-0.14 + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = @datadir@ +localedir = $(datadir)/locale +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +mkinstalldirs = $(SHELL) $(MKINSTALLDIRS) + +GMSGFMT = @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = @XGETTEXT@ +MSGMERGE = msgmerge +MSGMERGE_UPDATE = @MSGMERGE@ --update +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +UPDATEPOFILES = @UPDATEPOFILES@ +DUMMYPOFILES = @DUMMYPOFILES@ +DISTFILES.common = Makefile.in.in remove-potcdate.sin \ +$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) +DISTFILES = $(DISTFILES.common) Makevars POTFILES.in $(DOMAIN).pot stamp-po \ +$(POFILES) $(GMOFILES) \ +$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) + +POTFILES = \ + +CATALOGS = @CATALOGS@ + +# Makevars gets inserted here. (Don't remove this line!) + +.SUFFIXES: +.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update + +.po.mo: + @echo "$(MSGFMT) -c -o $@ $<"; \ + $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ + cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + +.sin.sed: + sed -e '/^#/d' $< > t-$@ + mv t-$@ $@ + + +all: all-@USE_NLS@ + +all-yes: stamp-po +all-no: + +# stamp-po is a timestamp denoting the last time at which the CATALOGS have +# been loosely updated. Its purpose is that when a developer or translator +# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, +# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent +# invocations of "make" will do nothing. This timestamp would not be necessary +# if updating the $(CATALOGS) would always touch them; however, the rule for +# $(POFILES) has been designed to not touch files that don't need to be +# changed. +stamp-po: $(srcdir)/$(DOMAIN).pot + test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) + @echo "touch stamp-po" + @echo timestamp > stamp-poT + @mv stamp-poT stamp-po + +# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', +# otherwise packages like GCC can not be built if only parts of the source +# have been downloaded. + +# This target rebuilds $(DOMAIN).pot; it is an expensive operation. +# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --msgid-bugs-address='$(MSGID_BUGS_ADDRESS)' + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +# This rule has no dependencies: we don't need to update $(DOMAIN).pot at +# every "make" invocation, only create it when it is missing. +# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +# This target rebuilds a PO file if $(DOMAIN).pot has changed. +# Note that a PO file is not touched if it doesn't need to be changed. +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + if test -f "$(srcdir)/$${lang}.po"; then \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ + else \ + $(MAKE) $${lang}.po-create; \ + fi + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + for file in $(DISTFILES.common) Makevars.template; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + for file in Makevars; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +install-strip: install + +installdirs: installdirs-exec installdirs-data +installdirs-exec: +installdirs-data: installdirs-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi +installdirs-data-no: +installdirs-data-yes: + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: uninstall-exec uninstall-data +uninstall-exec: +uninstall-data: uninstall-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + for file in $(DISTFILES.common) Makevars.template; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +uninstall-data-no: +uninstall-data-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +check: all + +info dvi ps pdf html tags TAGS ctags CTAGS ID: + +mostlyclean: + rm -f remove-potcdate.sed + rm -f stamp-poT + rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f stamp-po $(GMOFILES) + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: + $(MAKE) update-po + @$(MAKE) dist2 +# This is a separate target because 'update-po' must be executed before. +dist2: $(DISTFILES) + dists="$(DISTFILES)"; \ + if test "$(PACKAGE)" = "gettext-tools"; then \ + dists="$$dists Makevars.template"; \ + fi; \ + if test -f $(srcdir)/ChangeLog; then \ + dists="$$dists ChangeLog"; \ + fi; \ + for i in 0 1 2 3 4 5 6 7 8 9; do \ + if test -f $(srcdir)/ChangeLog.$$i; then \ + dists="$$dists ChangeLog.$$i"; \ + fi; \ + done; \ + if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ + for file in $$dists; do \ + if test -f $$file; then \ + cp -p $$file $(distdir); \ + else \ + cp -p $(srcdir)/$$file $(distdir); \ + fi; \ + done + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for creating PO files. + +.nop.po-create: + @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ + echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ + exit 1 + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: + +Makefile: Makefile.in.in $(top_builddir)/config.status @POMAKEFILEDEPS@ + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ + $(SHELL) ./config.status + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/po/Makevars b/po/Makevars new file mode 100644 index 0000000..9275c25 --- /dev/null +++ b/po/Makevars @@ -0,0 +1,41 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --keyword=N_ --keyword=D_ --from-code=UTF-8 --foreign-user + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Enlightenment development team + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +MSGID_BUGS_ADDRESS = enlightenment-devel@lists.sourceforge.net + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = diff --git a/po/Makevars.template b/po/Makevars.template new file mode 100644 index 0000000..32692ab --- /dev/null +++ b/po/Makevars.template @@ -0,0 +1,41 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Free Software Foundation, Inc. + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +MSGID_BUGS_ADDRESS = + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..905efda --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,4 @@ +src/e_mod_config.c +src/e_mod_main.c +src/e_mod_main.h +src/e_mod_places.c diff --git a/po/Rules-quot b/po/Rules-quot new file mode 100644 index 0000000..9c2a995 --- /dev/null +++ b/po/Rules-quot @@ -0,0 +1,47 @@ +# Special Makefile rules for English message catalogs with quotation marks. + +DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot + +.SUFFIXES: .insert-header .po-update-en + +en@quot.po-create: + $(MAKE) en@quot.po-update +en@boldquot.po-create: + $(MAKE) en@boldquot.po-update + +en@quot.po-update: en@quot.po-update-en +en@boldquot.po-update: en@boldquot.po-update-en + +.insert-header.po-update-en: + @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ + if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + ll=`echo $$lang | sed -e 's/@.*//'`; \ + LC_ALL=C; export LC_ALL; \ + cd $(srcdir); \ + if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "creation of $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +en@quot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header + +en@boldquot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header + +mostlyclean: mostlyclean-quot +mostlyclean-quot: + rm -f *.insert-header diff --git a/po/boldquot.sed b/po/boldquot.sed new file mode 100644 index 0000000..4b937aa --- /dev/null +++ b/po/boldquot.sed @@ -0,0 +1,10 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g +s/“/“/g +s/”/”/g +s/‘/‘/g +s/’/’/g diff --git a/po/en@boldquot.header b/po/en@boldquot.header new file mode 100644 index 0000000..fedb6a0 --- /dev/null +++ b/po/en@boldquot.header @@ -0,0 +1,25 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# +# This catalog furthermore displays the text between the quotation marks in +# bold face, assuming the VT100/XTerm escape sequences. +# diff --git a/po/en@quot.header b/po/en@quot.header new file mode 100644 index 0000000..a9647fc --- /dev/null +++ b/po/en@quot.header @@ -0,0 +1,22 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# diff --git a/po/insert-header.sin b/po/insert-header.sin new file mode 100644 index 0000000..b26de01 --- /dev/null +++ b/po/insert-header.sin @@ -0,0 +1,23 @@ +# Sed script that inserts the file called HEADER before the header entry. +# +# At each occurrence of a line starting with "msgid ", we execute the following +# commands. At the first occurrence, insert the file. At the following +# occurrences, do nothing. The distinction between the first and the following +# occurrences is achieved by looking at the hold space. +/^msgid /{ +x +# Test if the hold space is empty. +s/m/m/ +ta +# Yes it was empty. First occurrence. Read the file. +r HEADER +# Output the file's contents by reading the next line. But don't lose the +# current line while doing this. +g +N +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..8bcb500 --- /dev/null +++ b/po/it.po @@ -0,0 +1,88 @@ +# Italian translation for the places module. +# This file is distributed under the same license as the places package. +# DaveMDS , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Places\n" +"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n" +"POT-Creation-Date: 2008-12-06 19:06+0100\n" +"PO-Revision-Date: 2008-10-24 15:22+200\n" +"Last-Translator: DaveMDS \n" +"Language-Team: none\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/e_mod_config.c:43 +msgid "Places Configuration" +msgstr "Configurazione Places" + +#: src/e_mod_config.c:90 +msgid "General" +msgstr "Impostazioni generali" + +#: src/e_mod_config.c:92 +msgid "Show header" +msgstr "Mostra intestazione" + +#: src/e_mod_config.c:96 +msgid "Mount volumes on insert" +msgstr "Monta i dispositivi collegati" + +#: src/e_mod_config.c:100 +msgid "Open filemanager on insert" +msgstr "Sfoglia i dispositivi collegati" + +#: src/e_mod_config.c:105 +msgid "File manager (if blank uses Enlightenment)" +msgstr "" + +#: src/e_mod_main.c:488 +msgid "Configuration" +msgstr "Configurazione" + +#: src/e_mod_places.c:164 src/e_mod_places.c:317 +msgid "Filesystem" +msgstr "Filesystem" + +#: src/e_mod_places.c:169 +msgid "No Name" +msgstr "" + +#: src/e_mod_places.c:241 +msgid "p l a c e s" +msgstr "r i s o r s e" + +#: src/e_mod_places.c:298 +msgid "Home" +msgstr "Home" + +#: src/e_mod_places.c:304 +msgid "Desktop" +msgstr "Scrivania" + +#: src/e_mod_places.c:311 +msgid "Trash" +msgstr "Cestino" + +#: src/e_mod_places.c:380 +msgid "Places" +msgstr "Risorse" + +#: src/e_mod_places.c:587 +msgid "free of" +msgstr "liberi di" + +#: src/e_mod_places.c:593 +#, c-format +msgid "%s Not Mounted" +msgstr "" + +#: src/e_mod_places.c:610 +msgid "unmount" +msgstr "smonta" + +#: src/e_mod_places.c:616 +msgid "eject" +msgstr "espelli" diff --git a/po/places.pot b/po/places.pot new file mode 100644 index 0000000..440f95b --- /dev/null +++ b/po/places.pot @@ -0,0 +1,90 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Enlightenment development team +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: enlightenment-devel@lists.sourceforge.net\n" +"POT-Creation-Date: 2008-12-06 19:06+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/e_mod_config.c:43 +msgid "Places Configuration" +msgstr "" + +#: src/e_mod_config.c:90 +msgid "General" +msgstr "" + +#: src/e_mod_config.c:92 +msgid "Show header" +msgstr "" + +#: src/e_mod_config.c:96 +msgid "Mount volumes on insert" +msgstr "" + +#: src/e_mod_config.c:100 +msgid "Open filemanager on insert" +msgstr "" + +#: src/e_mod_config.c:105 +msgid "File manager (if blank uses Enlightenment)" +msgstr "" + +#: src/e_mod_main.c:488 +msgid "Configuration" +msgstr "" + +#: src/e_mod_places.c:164 src/e_mod_places.c:317 +msgid "Filesystem" +msgstr "" + +#: src/e_mod_places.c:169 +msgid "No Name" +msgstr "" + +#: src/e_mod_places.c:241 +msgid "p l a c e s" +msgstr "" + +#: src/e_mod_places.c:298 +msgid "Home" +msgstr "" + +#: src/e_mod_places.c:304 +msgid "Desktop" +msgstr "" + +#: src/e_mod_places.c:311 +msgid "Trash" +msgstr "" + +#: src/e_mod_places.c:380 +msgid "Places" +msgstr "" + +#: src/e_mod_places.c:587 +msgid "free of" +msgstr "" + +#: src/e_mod_places.c:593 +#, c-format +msgid "%s Not Mounted" +msgstr "" + +#: src/e_mod_places.c:610 +msgid "unmount" +msgstr "" + +#: src/e_mod_places.c:616 +msgid "eject" +msgstr "" diff --git a/po/quot.sed b/po/quot.sed new file mode 100644 index 0000000..0122c46 --- /dev/null +++ b/po/quot.sed @@ -0,0 +1,6 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin new file mode 100644 index 0000000..2436c49 --- /dev/null +++ b/po/remove-potcdate.sin @@ -0,0 +1,19 @@ +# Sed script that remove the POT-Creation-Date line in the header entry +# from a POT file. +# +# The distinction between the first and the following occurrences of the +# pattern is achieved by looking at the hold space. +/^"POT-Creation-Date: .*"$/{ +x +# Test if the hold space is empty. +s/P/P/ +ta +# Yes it was empty. First occurrence. Remove the line. +g +d +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..f53e886 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,21 @@ +MAINTAINERCLEANFILES = Makefile.in + +INCLUDES = -I. \ + -I$(top_srcdir) \ + -I$(includedir) \ + @E_CFLAGS@ @E_DBUS_CFLAGS@ @E_HAL_CFLAGS@ + +pkgdir = $(datadir)/$(MODULE_ARCH) +pkg_LTLIBRARIES = module.la +module_la_SOURCES = e_mod_main.h \ + e_mod_main.c \ + e_mod_config.c \ + e_mod_places.h \ + e_mod_places.c + +module_la_LIBADD = @E_LIBS@ @E_DBUS_LIBS@ @E_HAL_LIBS@ +module_la_LDFLAGS = -module -avoid-version -Wall +module_la_DEPENDENCIES = $(top_builddir)/config.h + +clean-local: + rm -rf *~ diff --git a/src/e_mod_config.c b/src/e_mod_config.c new file mode 100644 index 0000000..d8e3c7f --- /dev/null +++ b/src/e_mod_config.c @@ -0,0 +1,130 @@ +#include +#include "config.h" +#include "e_mod_main.h" + +struct _E_Config_Dialog_Data +{ + int show_header; + int auto_mount; + int auto_open; + char *fm; +}; + +/* Local Function Prototypes */ +static void *_create_data(E_Config_Dialog *cfd); +static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static void _fill_data(E_Config_Dialog_Data *cfdata); +static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); +static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); + +/* External Functions */ +EAPI E_Config_Dialog * +e_int_config_places_module(E_Container *con, const char *params __UNUSED__) +{ + E_Config_Dialog *cfd = NULL; + E_Config_Dialog_View *v = NULL; + char buf[4096]; + + /* is this config dialog already visible ? */ + if (e_config_dialog_find("Places", "_e_module_places_cfg_dlg")) return NULL; + + v = E_NEW(E_Config_Dialog_View, 1); + if (!v) return NULL; + + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.create_widgets = _basic_create; + v->basic.apply_cfdata = _basic_apply; + + /* Icon in the theme */ + snprintf(buf, sizeof(buf), "%s/e-module-places.edj", places_conf->module->dir); + + /* create new config dialog */ + cfd = e_config_dialog_new(con, D_("Places Configuration"), "Places", + "_e_module_places_cfg_dlg", buf, 0, v, NULL); + + e_dialog_resizable_set(cfd->dia, 1); + places_conf->cfd = cfd; + return cfd; +} + +/* Local Functions */ +static void * +_create_data(E_Config_Dialog *cfd) +{ + E_Config_Dialog_Data *cfdata = NULL; + + cfdata = E_NEW(E_Config_Dialog_Data, 1); + _fill_data(cfdata); + return cfdata; +} + +static void +_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + free(cfdata->fm); + places_conf->cfd = NULL; + E_FREE(cfdata); +} + +static void +_fill_data(E_Config_Dialog_Data *cfdata) +{ + /* load a temp copy of the config variables */ + cfdata->show_header = places_conf->show_header; + cfdata->auto_mount = places_conf->auto_mount; + cfdata->auto_open = places_conf->auto_open; + if (places_conf->fm) + cfdata->fm = strdup(places_conf->fm); + else + cfdata->fm = strdup(""); +} + +static Evas_Object * +_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + Evas_Object *o = NULL, *of = NULL, *ow = NULL; + + o = e_widget_list_add(evas, 0, 0); + + of = e_widget_framelist_add(evas, D_("General"), 0); + e_widget_framelist_content_align_set(of, 0.0, 0.0); + ow = e_widget_check_add(evas, D_("Show header"), + &(cfdata->show_header)); + e_widget_framelist_object_append(of, ow); + + ow = e_widget_check_add(evas, D_("Mount volumes on insert"), + &(cfdata->auto_mount)); + e_widget_framelist_object_append(of, ow); + + ow = e_widget_check_add(evas, D_("Open filemanager on insert"), + &(cfdata->auto_open)); + e_widget_framelist_object_append(of, ow); + + ow = e_widget_label_add + (evas, D_("File manager (if blank uses Enlightenment)")); + e_widget_framelist_object_append(of, ow); + + ow = e_widget_entry_add(evas, &(cfdata->fm), NULL, NULL, NULL); + e_widget_framelist_object_append(of, ow); + + e_widget_list_object_append(o, of, 1, 1, 0.5); + + return o; +} + +static int +_basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + places_conf->show_header = cfdata->show_header; + places_conf->auto_mount = cfdata->auto_mount; + places_conf->auto_open = cfdata->auto_open; + + const char *fm = eina_stringshare_add(cfdata->fm); + eina_stringshare_del(places_conf->fm); + places_conf->fm = fm; + + e_config_save_queue(); + places_update_all_gadgets(); + return 1; +} diff --git a/src/e_mod_main.c b/src/e_mod_main.c new file mode 100644 index 0000000..74519db --- /dev/null +++ b/src/e_mod_main.c @@ -0,0 +1,525 @@ +/* Copyright (C) 2008 Davide Andreoli (see AUTHORS) + * + * This file is part of places. + * places 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 3 of the License, or + * (at your option) any later version. + * + * places 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 places. If not, see . + */ + +#include +#include +#include +#include "config.h" +#include "e_mod_main.h" +#include "e_mod_places.h" + +/* Local Function Prototypes */ +static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style); +static void _gc_shutdown(E_Gadcon_Client *gcc); +static void _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient); +static char *_gc_label(E_Gadcon_Client_Class *client_class); +static const char *_gc_id_new(E_Gadcon_Client_Class *client_class); +static void _gc_id_del(E_Gadcon_Client_Class *client_class, const char *id); +static Evas_Object *_gc_icon(E_Gadcon_Client_Class *client_class, Evas *evas); + +static void _places_conf_new(void); +static void _places_conf_free(void); +static int _places_conf_timer(void *data); +static Config_Item *_places_conf_item_get(const char *id); +static void _places_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event); +static void _places_cb_menu_post(void *data, E_Menu *menu); +static void _places_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi); + +/* Local Structures */ +E_DBus_Connection *conn; + +/* Local Variables */ +static int uuid = 0; +static E_Config_DD *conf_edd = NULL; +static E_Config_DD *conf_item_edd = NULL; +Eina_List *instances = NULL; +Config *places_conf = NULL; +extern Eina_List *volumes; + +static const E_Gadcon_Client_Class _gc_class = +{ + GADCON_CLIENT_CLASS_VERSION, "Places", + {_gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, + _gc_id_new, _gc_id_del}, + E_GADCON_CLIENT_STYLE_PLAIN +}; + +EAPI E_Module_Api e_modapi = {E_MODULE_API_VERSION, "Places"}; + +/* + * Module Functions +*/ +EAPI void * +e_modapi_init(E_Module *m) +{ + char buf[4096]; + + /* Set up module's message catalogue */ + snprintf(buf, sizeof(buf), "%s/locale", e_module_dir_get(m)); + bindtextdomain(PACKAGE, buf); + bind_textdomain_codeset(PACKAGE, "UTF-8"); + + /* Location of theme to load for this module */ + snprintf(buf, sizeof(buf), "%s/e-module-places.edj", m->dir); + + /* Display this Modules config info in the main Config Panel */ + + /* starts with a category */ + e_configure_registry_category_add("extensions", 80, "extensions", + NULL, "enlightenment/extensions"); + /* add right-side item */ + e_configure_registry_item_add("extensions/places", 110, "Places", + NULL, buf, e_int_config_places_module); + + /* Define EET Data Storage */ + + conf_item_edd = E_CONFIG_DD_NEW("Config_Item", Config_Item); + #undef T + #undef D + #define T Config_Item + #define D conf_item_edd + E_CONFIG_VAL(D, T, id, STR); + E_CONFIG_VAL(D, T, switch2, INT); + + conf_edd = E_CONFIG_DD_NEW("Config", Config); + #undef T + #undef D + #define T Config + #define D conf_edd + E_CONFIG_VAL(D, T, version, INT); + E_CONFIG_VAL(D, T, fm, STR); + E_CONFIG_VAL(D, T, show_header, UCHAR); + E_CONFIG_VAL(D, T, auto_mount, UCHAR); + E_CONFIG_VAL(D, T, auto_open, UCHAR); + E_CONFIG_LIST(D, T, conf_items, conf_item_edd); /* the list */ + + /* Tell E to find any existing module data. First run ? */ + places_conf = e_config_domain_load("module.places", conf_edd); + if (places_conf) + { + /* Check config version */ + if ((places_conf->version >> 16) < MOD_CONFIG_FILE_EPOCH) + { + /* config too old */ + _places_conf_free(); + ecore_timer_add(1.0, _places_conf_timer, + "Places Module Configuration data needed " + "upgrading. Your old configuration
has been" + " wiped and a new set of defaults initialized. " + "This
will happen regularly during " + "development, so don't report a
bug. " + "This simply means the module needs " + "new configuration
data by default for " + "usable functionality that your old
" + "configuration simply lacks. This new set of " + "defaults will fix
that by adding it in. " + "You can re-configure things now to your
" + "liking. Sorry for the inconvenience.
"); + } + + /* Ardvarks */ + else if (places_conf->version > MOD_CONFIG_FILE_VERSION) + { + /* config too new...wtf ? */ + _places_conf_free(); + ecore_timer_add(1.0, _places_conf_timer, + "Your Places Module configuration is NEWER " + "than the module version. This is " + "very
strange. This should not happen unless" + " you downgraded
the module or " + "copied the configuration from a place where" + "
a newer version of the module " + "was running. This is bad and
as a " + "precaution your configuration has been now " + "restored to
defaults. Sorry for the " + "inconvenience.
"); + } + } + + /* if we don't have a config yet, or it got erased above, + * then create a default one */ + if (!places_conf) _places_conf_new(); + + /* create a link from the modules config to the module + * this is not written */ + places_conf->module = m; + + /* Tell any gadget containers (shelves, etc) that we provide a module + * for the user to enjoy */ + e_gadcon_provider_register(&_gc_class); + + places_init(); + + E_Int_Menu_Augmentation *maug; + maug = e_int_menus_menu_augmentation_add("main/1", + places_augmentation, + NULL, NULL, NULL); + + + /* Give E the module */ + return m; +} + +/* + * Function to unload the module + */ +EAPI int +e_modapi_shutdown(E_Module *m) +{ + places_shutdown(); + + /* Unregister the config dialog from the main panel */ + e_configure_registry_item_del("extensions/places"); + + /* Remove the config panel category if we can. E will tell us. + category stays if other items using it */ + e_configure_registry_category_del("extensions"); + + /* Kill the config dialog */ + if (places_conf->cfd) e_object_del(E_OBJECT(places_conf->cfd)); + places_conf->cfd = NULL; + + /* Tell E the module is now unloaded. Gets removed from shelves, etc. */ + places_conf->module = NULL; + e_gadcon_provider_unregister(&_gc_class); + + _places_conf_free(); + + /* Clean EET */ + E_CONFIG_DD_FREE(conf_item_edd); + E_CONFIG_DD_FREE(conf_edd); + return 1; +} + +/* + * Function to Save the modules config + */ +EAPI int +e_modapi_save(E_Module *m) +{ + e_config_domain_save("module.places", conf_edd, places_conf); + return 1; +} + +/* Local Functions */ + +/* Called when Gadget_Container says go */ +static E_Gadcon_Client * +_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) +{ + Instance *inst = NULL; + + /* New visual instance, any config ? */ + inst = E_NEW(Instance, 1); + inst->conf_item = _places_conf_item_get(id); + + /* create on-screen object */ + inst->o_box = e_box_add(gc->evas); + e_box_homogenous_set(inst->o_box, 0); + e_box_orientation_set(inst->o_box, 0); + e_box_align_set(inst->o_box, 0.5, 0.0); + + /* Start loading our module on screen via container */ + inst->gcc = e_gadcon_client_new(gc, name, id, style, inst->o_box); + inst->gcc->data = inst; + + /* hook a mouse down. we want/have a popup menu, right ? */ + evas_object_event_callback_add(inst->o_box, EVAS_CALLBACK_MOUSE_DOWN, + _places_cb_mouse_down, inst); + + /* add to list of running instances so we can cleanup later */ + instances = eina_list_append(instances, inst); + + places_fill_box(inst->o_box); + + /* return the Gadget_Container Client */ + return inst->gcc; +} + +/* Called when Gadget_Container says stop */ +static void +_gc_shutdown(E_Gadcon_Client *gcc) +{ + Instance *inst = NULL; + + if (!(inst = gcc->data)) return; + instances = eina_list_remove(instances, inst); + + /* kill popup menu */ + if (inst->menu) + { + e_menu_post_deactivate_callback_set(inst->menu, NULL, NULL); + e_object_del(E_OBJECT(inst->menu)); + inst->menu = NULL; + } + + /* delete the visual */ + if (inst->o_box) + { + /* remove mouse down callback hook */ + evas_object_event_callback_del(inst->o_box, EVAS_CALLBACK_MOUSE_DOWN, + _places_cb_mouse_down); + places_empty_box(inst->o_box); + evas_object_del(inst->o_box); + } + + E_FREE(inst); +} + +/* For for when container says we are changing position */ +static void +_gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient) +{ + //~ Instance *inst; + + //~ inst = gcc->data; + //~ switch (orient) + //~ { + //~ case E_GADCON_ORIENT_FLOAT: + //~ case E_GADCON_ORIENT_HORIZ: + //~ case E_GADCON_ORIENT_TOP: + //~ case E_GADCON_ORIENT_BOTTOM: + //~ case E_GADCON_ORIENT_CORNER_TL: + //~ case E_GADCON_ORIENT_CORNER_TR: + //~ case E_GADCON_ORIENT_CORNER_BL: + //~ case E_GADCON_ORIENT_CORNER_BR: + //~ _ibar_orient_set(inst->ibar, 1); + //~ e_gadcon_client_aspect_set(gcc, evas_list_count(inst->ibar->icons) * 16, 16); + //~ break; + //~ case E_GADCON_ORIENT_VERT: + //~ case E_GADCON_ORIENT_LEFT: + //~ case E_GADCON_ORIENT_RIGHT: + //~ case E_GADCON_ORIENT_CORNER_LT: + //~ case E_GADCON_ORIENT_CORNER_RT: + //~ case E_GADCON_ORIENT_CORNER_LB: + //~ case E_GADCON_ORIENT_CORNER_RB: + //~ _ibar_orient_set(inst->ibar, 0); + //~ e_gadcon_client_aspect_set(gcc, 16, evas_list_count(inst->ibar->icons) * 16); + //~ break; + //~ default: + //~ break; + //~ } + //~ e_gadcon_client_min_size_set(gcc, 16, 16); + + e_gadcon_client_aspect_set(gcc, 200, 30 * eina_list_count(volumes) + 30); + e_gadcon_client_min_size_set(gcc, 200, 30 * eina_list_count(volumes) + 30); +} + +/* Gadget/Module label */ +static char * +_gc_label(E_Gadcon_Client_Class *client_class) +{ + return "Places"; +} + +/* so E can keep a unique instance per-container */ +static const char * +_gc_id_new(E_Gadcon_Client_Class *client_class) +{ + Config_Item *ci = NULL; + + ci = _places_conf_item_get(NULL); + return ci->id; +} + +/* gets called when container says remove this item */ +static void +_gc_id_del(E_Gadcon_Client_Class *client_class, const char *id) +{ + Config_Item *ci = NULL; + + if (!(ci = _places_conf_item_get(id))) return; + + /* cleanup !! */ + if (ci->id) eina_stringshare_del(ci->id); + + places_conf->conf_items = eina_list_remove(places_conf->conf_items, ci); + E_FREE(ci); +} + +static Evas_Object * +_gc_icon(E_Gadcon_Client_Class *client_class, Evas *evas) +{ + Evas_Object *o = NULL; + char buf[4096]; + + /* theme */ + snprintf(buf, sizeof(buf), "%s/e-module-places.edj", places_conf->module->dir); + + /* create icon object */ + o = edje_object_add(evas); + + /* load icon from theme */ + edje_object_file_set(o, buf, "icon"); + + return o; +} + +/* new module needs a new config :), or config too old and we need one anyway */ +static void +_places_conf_new(void) +{ + Config_Item *ci = NULL; + char buf[128]; + + places_conf = E_NEW(Config, 1); + places_conf->version = (MOD_CONFIG_FILE_EPOCH << 16); + +#define IFMODCFG(v) if ((places_conf->version & 0xffff) < v) { +#define IFMODCFGEND } + + /* setup defaults */ + IFMODCFG(0x008d); + places_conf->show_header = 1; + places_conf->auto_mount = 0; + places_conf->auto_open = 0; + _places_conf_item_get(NULL); + IFMODCFGEND; + + IFMODCFG(0x008e); + places_conf->fm = NULL; + IFMODCFGEND; + + /* update the version */ + places_conf->version = MOD_CONFIG_FILE_VERSION; + + /* setup limits on the config properties here (if needed) */ + + /* save the config to disk */ + e_config_save_queue(); +} + +static void +_places_conf_free(void) +{ + /* cleanup any stringshares here */ + while (places_conf->conf_items) + { + Config_Item *ci = NULL; + + ci = places_conf->conf_items->data; + places_conf->conf_items = + eina_list_remove_list(places_conf->conf_items, + places_conf->conf_items); + /* EPA */ + if (ci->id) eina_stringshare_del(ci->id); + E_FREE(ci); + } + + if (places_conf->fm) eina_stringshare_del(places_conf->fm); + E_FREE(places_conf); +} + +/* timer for the config oops dialog */ +static int +_places_conf_timer(void *data) +{ + e_util_dialog_show("Places Configuration Updated", data); + return 0; +} + +/* function to search for any Config_Item struct for this Item + * create if needed */ +static Config_Item * +_places_conf_item_get(const char *id) +{ + Eina_List *l = NULL; + Config_Item *ci = NULL; + char buf[128]; + + if (!id) + { + /* nothing passed, return a new id */ + snprintf(buf, sizeof(buf), "%s.%d", _gc_class.name, ++uuid); + id = buf; + } + else + { + for (l = places_conf->conf_items; l; l = l->next) + { + if (!(ci = l->data)) continue; + if ((ci->id) && (!strcmp(ci->id, id))) return ci; + } + } + ci = E_NEW(Config_Item, 1); + ci->id = eina_stringshare_add(id); + ci->switch2 = 0; + places_conf->conf_items = eina_list_append(places_conf->conf_items, ci); + return ci; +} + +/* Pants On */ +static void +_places_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event) +{ + Instance *inst = NULL; + Evas_Event_Mouse_Down *ev; + E_Zone *zone = NULL; + E_Menu_Item *mi = NULL; + int x, y; + + if (!(inst = data)) return; + ev = event; + if ((ev->button == 3) && (!inst->menu)) + { + /* grab current zone */ + zone = e_util_zone_current_get(e_manager_current_get()); + + /* create popup menu */ + inst->menu = e_menu_new(); + e_menu_post_deactivate_callback_set(inst->menu, _places_cb_menu_post, + inst); + + mi = e_menu_item_new(inst->menu); + e_menu_item_label_set(mi, D_("Configuration")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/configuration"); + e_menu_item_callback_set(mi, _places_cb_menu_configure, NULL); + + /* Each Gadget Client has a utility menu from the Container */ + e_gadcon_client_util_menu_items_append(inst->gcc, inst->menu, 0); + e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, + NULL, NULL); + + /* show the menu relative to gadgets position */ + e_menu_activate_mouse(inst->menu, zone, (x + ev->output.x), + (y + ev->output.y), 1, 1, + E_MENU_POP_DIRECTION_AUTO, ev->timestamp); + evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, + EVAS_BUTTON_NONE, ev->timestamp, NULL); + } +} + +/* popup menu closing, cleanup */ +static void +_places_cb_menu_post(void *data, E_Menu *menu) +{ + Instance *inst = NULL; + + if (!(inst = data)) return; + if (!inst->menu) return; + e_object_del(E_OBJECT(inst->menu)); + inst->menu = NULL; +} + +/* call configure from popup */ +static void +_places_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi) +{ + if (!places_conf) return; + if (places_conf->cfd) return; + e_int_config_places_module(mn->zone->container, NULL); +} diff --git a/src/e_mod_main.h b/src/e_mod_main.h new file mode 100644 index 0000000..f8d544f --- /dev/null +++ b/src/e_mod_main.h @@ -0,0 +1,91 @@ +/* Copyright (C) 2008 Davide Andreoli (see AUTHORS) + * + * This file is part of places. + * places 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 3 of the License, or + * (at your option) any later version. + * + * places 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 places. If not, see . + */ + +#ifndef E_MOD_MAIN_H +#define E_MOD_MAIN_H + +/* Macros used for config file versioning */ +#define MOD_CONFIG_FILE_EPOCH 0x0001 +#define MOD_CONFIG_FILE_GENERATION 0x008e +#define MOD_CONFIG_FILE_VERSION \ + ((MOD_CONFIG_FILE_EPOCH << 16) | MOD_CONFIG_FILE_GENERATION) + +#define D_(str) dgettext(PACKAGE, str) + +typedef struct _Config Config; +struct _Config +{ + E_Module *module; + E_Config_Dialog *cfd; + + /* The list; their location on screen ? */ + Eina_List *conf_items; + + /* config file version */ + int version; + + /* actual config properties; Define your own. (per-module) */ + const char *fm; + unsigned char show_header; + unsigned char auto_mount; + unsigned char auto_open; +}; + +/* This struct used to hold config for individual items from above list */ +typedef struct _Config_Item Config_Item; +struct _Config_Item +{ + /* unique id */ + const char *id; + + /* actual config properties; Define your own per-item (pos, clr) */ + int switch2; +}; + +typedef struct _Instance Instance; +struct _Instance +{ + /* pointer to this gadget's container */ + E_Gadcon_Client *gcc; + + /* evas_object used to display */ + Evas_Object *o_box; + + /* popup anyone ? */ + E_Menu *menu; + + /* Config_Item structure. Every gadget should have one :) */ + Config_Item *conf_item; +}; + +/* Setup the E Module Version, Needed to check if module can run. */ +EAPI extern E_Module_Api e_modapi; + +/* E API Module Interface Declarations + * + * Need to initialize, shutdown, save the module */ +EAPI void *e_modapi_init(E_Module *m); +EAPI int e_modapi_shutdown(E_Module *m); +EAPI int e_modapi_save(E_Module *m); + +/* Function for calling the modules config dialog */ +EAPI E_Config_Dialog *e_int_config_places_module(E_Container *con, const char *params __UNUSED__); + +extern Config *places_conf; +extern Eina_List *instances; + +#endif diff --git a/src/e_mod_places.c b/src/e_mod_places.c new file mode 100644 index 0000000..9a525eb --- /dev/null +++ b/src/e_mod_places.c @@ -0,0 +1,942 @@ +/* Copyright (C) 2008 Davide Andreoli (see AUTHORS) + * + * This file is part of places. + * places 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 3 of the License, or + * (at your option) any later version. + * + * places 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 places. If not, see . + */ + +#include +#include +#include +#include +#include +#include "config.h" +#include "e_mod_main.h" +#include "e_mod_places.h" + +#define FREE_STR(str) \ + if (str) free(str); \ + str = NULL; + +/* Local Function Prototypes */ +static int _places_poller(void *data); +static void _places_print_volume(Volume *v); +static void _places_error_show(const char *title, const char *text1, const char *text2, const char *text3); +static void _places_run_fm(void *data, E_Menu *m, E_Menu_Item *mi); +static void _places_volume_add(const char *udi); +static void _places_volume_del(Volume *v); +static void _places_mount_volume(Volume *vol); +static const char *_places_human_size_get(unsigned long long size); +static unsigned long long _places_free_space_get(const char *mount); +static void _places_update_size(Evas_Object *obj, Volume *vol); +// Edje callbacks +void _places_icon_activated_cb(void *data, Evas_Object *o, const char *emission, const char *source); +void _places_eject_activated_cb(void *data, Evas_Object *o, const char *emission, const char *source); +//Hal callbacks +void _places_mount_cb(void *user_data, void *method_return, DBusError *error); +void _places_unmount_cb(void *user_data, void *method_return, DBusError *error); +void _places_eject_cb(void *user_data, void *method_return, DBusError *error); +void _places_device_add_cb(void *data, DBusMessage *msg); +void _places_device_rem_cb(void *data, DBusMessage *msg); +void _places_volume_prop_modified_cb(void *data, DBusMessage *msg); +void _places_volume_all_cb(void *user_data, void *reply_data, DBusError *error); +void _places_volume_cb(void *user_data, void *reply_data, DBusError *error); +void _places_volume_properties_cb(void *data, void *reply_data, DBusError *error); +void _places_storage_properties_cb(void *data, void *reply_data, DBusError *error); + +/* Local Variables */ +static E_DBus_Connection *conn; +static E_DBus_Signal_Handler *sh_added, *sh_removed; +static Ecore_Timer *poller; +static char theme_file[PATH_MAX]; +Eina_List *volumes; + +/* Implementation */ +void +places_init(void) +{ + volumes = NULL; + + /* theme file (maybe check if found in the current theme) */ + snprintf(theme_file, PATH_MAX, "%s/e-module-places.edj", places_conf->module->dir); + + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!conn) + { + printf("Error connecting to system bus. Is it running?\n"); + return; + } + + sh_added = e_dbus_signal_handler_add(conn, "org.freedesktop.Hal", + "/org/freedesktop/Hal/Manager", + "org.freedesktop.Hal.Manager", + "DeviceAdded", + _places_device_add_cb, NULL); + sh_removed = e_dbus_signal_handler_add(conn, "org.freedesktop.Hal", + "/org/freedesktop/Hal/Manager", + "org.freedesktop.Hal.Manager", + "DeviceRemoved", + _places_device_rem_cb, NULL); + + + e_hal_manager_find_device_by_capability(conn, "volume", + _places_volume_all_cb, NULL); + + poller = ecore_timer_add(3, _places_poller, NULL); +} + +void +places_shutdown(void) +{ + ecore_timer_del(poller); + + e_dbus_signal_handler_del(conn, sh_added); + e_dbus_signal_handler_del(conn, sh_removed); + + while (volumes) + _places_volume_del((Volume*)volumes->data); + + e_dbus_connection_close(conn); +} + +void +places_update_all_gadgets(void) +{ + Eina_List *l; + + for (l = instances; l; l = l->next) + { + Instance *inst; + + inst = l->data; + places_fill_box(inst->o_box); + } +} + +int +_places_volume_sort_cb(const void *d1, const void *d2) +{ + const Volume *v1 = d1; + const Volume *v2 = d2; + + if(!v1 || !v1->label) return(1); + if(!v2 || !v2->label) return(-1); + + return strcmp(v1->label, v2->label); +} + +void +places_fill_box(Evas_Object *box) +{ + Eina_List *l; + int min_w, min_h, max_w, max_h; + Evas_Object *o, *sep, *icon; + + places_empty_box(box); + + volumes = eina_list_sort(volumes, 0, _places_volume_sort_cb); + + for (l = volumes; l; l = l->next) + { + Volume *vol = l->data; + + if (!vol->valid) continue; + + /* volume object */ + o = edje_object_add(evas_object_evas_get(box)); + edje_object_file_set(o, theme_file, "modules/places/main"); + vol->obj = o; + + //set volume label + if (vol->label && strlen(vol->label) > 0) + edje_object_part_text_set(o, "volume_label", vol->label); + else if (vol->mount_point && !strcmp(vol->mount_point, "/")) + edje_object_part_text_set(o, "volume_label", D_("Filesystem")); + else if (vol->mount_point) + edje_object_part_text_set(o, "volume_label", + ecore_file_file_get(vol->mount_point)); + else + edje_object_part_text_set(o, "volume_label", D_("No Name")); + + //set free label e gauge + _places_update_size(o, vol); + + //choose icon + vol->icon = "modules/places/icon/generic"; + if (!strcmp(vol->drive_type, "cdrom")) + { + if (!strcmp(vol->fstype, "udf")) + vol->icon = "modules/places/icon/dvd"; + else + vol->icon = "modules/places/icon/cdrom"; + } + else if (!strcmp(vol->drive_type, "sd_mmc")) + vol->icon = "modules/places/icon/sdmmc"; + else if (!strcmp(vol->drive_type, "memory_stick")) + vol->icon = "modules/places/icon/ms"; + else if (!strcmp(vol->model, "iPod")) + vol->icon = "modules/places/icon/ipod"; + else if (!strcmp(vol->fstype, "ext3")) + vol->icon = "modules/places/icon/ext3"; + else if (!strcmp(vol->fstype, "vfat") || !strcmp(vol->fstype, "ntfs")) + vol->icon = "modules/places/icon/vfat"; + else if (!strcmp(vol->fstype, "hfs") || !strcmp(vol->fstype, "hfsplus")) + vol->icon = "modules/places/icon/hfs"; + + //set icon + icon = edje_object_add(evas_object_evas_get(box)); + edje_object_file_set(icon, theme_file, vol->icon); + edje_object_part_swallow(o, "icon", icon); + + //set ghost icon + icon = edje_object_add(evas_object_evas_get(box)); + edje_object_file_set(icon, theme_file, vol->icon); + edje_object_part_swallow(o, "icon_ghost", icon); + + //set mount/eject icon + if (vol->requires_eject || (vol->mounted && strcmp(vol->mount_point, "/")) || + !strcmp(vol->bus, "usb")) //Some usb key don't have requires_eject set (probably an hal error) + edje_object_signal_emit(o, "icon,eject,show", "places"); + else + edje_object_signal_emit(o, "icon,eject,hide", "places"); + + /* connect signals from edje */ + edje_object_signal_callback_add(o, "icon,activated", "places", + _places_icon_activated_cb, vol); + edje_object_signal_callback_add(o, "eject,activated", "places", + _places_eject_activated_cb, vol); + + /* pack the volume in the box */ + evas_object_show(o); + edje_object_size_min_get(o, &min_w, &min_h); + edje_object_size_max_get(o, &max_w, &max_h); + if (!strcmp(vol->mount_point, "/")) + e_box_pack_start(box, o); + else + e_box_pack_end(box, o); + e_box_pack_options_set(o, + 1, 0, /* fill */ + 1, 0, /* expand */ + 0.5, 0.0, /* align */ + min_w, min_h, /* min */ + max_w, max_h /* max */ + ); + } + + /* header */ + if (places_conf->show_header) + { + o = edje_object_add(evas_object_evas_get(box)); + edje_object_file_set(o, theme_file, "modules/places/header"); + edje_object_part_text_set(o, "title", D_("p l a c e s")); + edje_object_size_min_get(o, &min_w, &min_h); + edje_object_size_max_get(o, &max_w, &max_h); + evas_object_show(o); + e_box_pack_start(box, o); + e_box_pack_options_set(o, + 1, 0, /* fill */ + 1, 0, /* expand */ + 0.5, 0.0, /* align */ + min_w, min_h, /* min */ + max_w, max_h /* max */ + ); + } +} + +void +places_empty_box(Evas_Object *box) +{ + int count; + + e_box_freeze(box); + count = e_box_pack_count_get(box); + while (count >= 0) + { + Evas_Object *o; + Evas_Object *swal; + + o = e_box_pack_object_nth(box, count); + swal = edje_object_part_swallow_get(o, "icon_ghost"); + if (swal) + { + edje_object_part_unswallow(o, swal); + evas_object_del(swal); + } + swal = edje_object_part_swallow_get(o, "icon"); + if (swal) + { + edje_object_part_unswallow(o, swal); + evas_object_del(swal); + } + + e_box_unpack(o); + evas_object_del(o); + + count--; + } + e_box_thaw(box); +} + +void +places_generate_menu(void *data, E_Menu *em) +{ + E_Menu_Item *mi; + char buf[PATH_MAX]; + + /* Home */ + mi = e_menu_item_new(em); + e_menu_item_label_set(mi, D_("Home")); + e_util_menu_item_edje_icon_set(mi, "fileman/home"); + e_menu_item_callback_set(mi, _places_run_fm, (char*)e_user_homedir_get()); + + /* Desktop */ + mi = e_menu_item_new(em); + e_menu_item_label_set(mi, D_("Desktop")); + e_util_menu_item_edje_icon_set(mi, "fileman/desktop"); + snprintf(buf, sizeof(buf), "%s/Desktop", (char*)e_user_homedir_get()); + e_menu_item_callback_set(mi, _places_run_fm, strdup(buf)); //TODO free somewhere + + /* Trash */ + mi = e_menu_item_new(em); + e_menu_item_label_set(mi, D_("Trash")); + e_util_menu_item_edje_icon_set(mi, "fileman/folder"); + e_menu_item_callback_set(mi, _places_run_fm, "trash:///"); + + /* File System */ + mi = e_menu_item_new(em); + e_menu_item_label_set(mi, D_("Filesystem")); + e_util_menu_item_edje_icon_set(mi, "fileman/hdd"); + e_menu_item_callback_set(mi, _places_run_fm, "/"); + + //separator + mi = e_menu_item_new(em); + e_menu_item_separator_set(mi, 1); + + /* Volumes */ + Eina_List *l; + for (l = volumes; l; l = l->next) + { + Volume *vol = l->data; + if (!vol->valid) continue; + if (!vol->mounted) continue; + if (vol->mount_point && !strcmp(vol->mount_point, "/")) continue; + + mi = e_menu_item_new(em); + if ((vol->label) && (vol->label[0] != '\0')) + e_menu_item_label_set(mi, vol->label); + else + e_menu_item_label_set(mi, ecore_file_file_get(vol->mount_point)); + + e_menu_item_icon_edje_set(mi, theme_file, vol->icon); + e_menu_item_callback_set(mi, _places_run_fm, (void*)vol->mount_point); + } + + //separator + mi = e_menu_item_new(em); + e_menu_item_separator_set(mi, 1); + + /* Favorites */ + char line[PATH_MAX]; + FILE* fp; + + snprintf(buf, sizeof(buf), "%s/.gtk-bookmarks", e_user_homedir_get()); + fp = fopen(buf, "r"); + if (fp) + { + while(fgets(line, sizeof(line), fp)) + { + line[strlen(line) - 1] = '\0'; + if (ecore_file_exists(line + 7)) + { + mi = e_menu_item_new(em); + e_menu_item_label_set(mi, ecore_file_file_get(line)); + e_util_menu_item_edje_icon_set(mi, "fileman/folder"); + e_menu_item_callback_set(mi, _places_run_fm, strdup(line + 7)); //TODO free somewhere + } + } + fclose(fp); + } + + e_menu_pre_activate_callback_set(em, NULL, NULL); +} + +void +places_augmentation(void *data, E_Menu *em) +{ + E_Menu_Item *mi; + E_Menu *m; + + mi = e_menu_item_new(em); + e_menu_item_label_set(mi, D_("Places")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/fileman"); + + m = e_menu_new(); + e_menu_item_submenu_set(mi, m); + + e_menu_pre_activate_callback_set(m, places_generate_menu, NULL); +} + +/* Internals */ +static int +_places_poller(void *data) +{ + Eina_List *l; + + for (l = volumes; l; l = l->next) + { + Volume *vol = l->data; + + if (!vol->valid || !vol->mounted) continue; + _places_update_size(vol->obj, vol); + } + + return 1; +} + +static void +_places_print_volume(Volume *v) +{ + printf("Got volume %s\n", v->udi); + printf(" label: %s\n",v->label); + printf(" mounted: %d\n", v->mounted); + printf(" m_point: %s\n", v->mount_point); + printf(" fstype: %s\n", v->fstype); + printf(" bus: %s\n", v->bus); + printf(" drive_type: %s\n", v->drive_type); + printf(" model: %s\n", v->model); + printf(" vendor: %s\n", v->vendor); + printf(" serial: %s\n", v->serial); + printf(" removable: %d\n", v->removable); + printf(" requires eject: %d\n", v->requires_eject); +} + +static void +_places_volume_add(const char *udi) +{ + Volume *v; + if (!udi) return; + + v = E_NEW(Volume, 1); + if (!v) return; + + v->udi = eina_stringshare_add(udi); + v->valid = 0; + v->obj = NULL; + v->icon = NULL; + v->to_mount = 0; + v->force_open = 0; + + if (places_conf->auto_mount) + v->to_mount = 1; + + if (places_conf->auto_open) + v->force_open = 1; + + volumes = eina_list_append(volumes, v); + e_hal_device_get_all_properties(conn, v->udi, _places_volume_properties_cb, v); + + v->sh_prop = e_dbus_signal_handler_add(conn, "org.freedesktop.Hal", v->udi, + "org.freedesktop.Hal.Device", + "PropertyModified", + _places_volume_prop_modified_cb, v); +} + +static void +_places_volume_del(Volume *v) +{ + e_dbus_signal_handler_del(conn, v->sh_prop); + volumes = eina_list_remove(volumes, v); + eina_stringshare_del(v->udi); + eina_stringshare_del(v->label); + eina_stringshare_del(v->mount_point); + eina_stringshare_del(v->fstype); + eina_stringshare_del(v->bus); + eina_stringshare_del(v->drive_type); + eina_stringshare_del(v->model); + eina_stringshare_del(v->vendor); + eina_stringshare_del(v->serial); + free(v); +} + +static const char * +_places_human_size_get(unsigned long long size) +{ + double dsize; + char hum[32], *suffix; + + dsize = (double)size; + if (dsize < 1024) + snprintf(hum, sizeof(hum), "%.0fb", dsize); + else + { + dsize /= 1024.0; + if (dsize < 1024) + suffix = "KB"; + else + { + dsize /= 1024.0; + if (dsize < 1024) + suffix = "MB"; + else + { + dsize /= 1024.0; + suffix = "GB"; + } + } + snprintf(hum, sizeof(hum), "%.1f%s", dsize, suffix); + } + + return eina_stringshare_add(hum); +} + +static unsigned long long +_places_free_space_get(const char *mount) +{ + struct statfs s; +//printf("GET SPACE of %s\n", mount); + if (!mount) return 0; + if (statfs(mount, &s) != 0) + return 0; +//printf(" SPACE %d\n", (s.f_bfree * s.f_bsize)); + return (unsigned long long)(s.f_bfree * s.f_bsize); +} + +static void +_places_error_show(const char *title, const char *text1, const char *text2, const char *text3) +{ + char str[4096]; + E_Dialog *dia; + + snprintf(str, sizeof(str),"%s

%s
%s", text1, text2, text3); + + dia = e_dialog_new(NULL, "E", "_places_error"); + e_dialog_title_set(dia, title); + e_dialog_icon_set(dia, "fileman/hdd", 64); + e_dialog_button_add(dia, "OK", NULL, NULL, NULL); + e_dialog_text_set(dia, str); + e_dialog_show(dia); + +} + +static void +_places_run_fm_external(const char *fm, const char *directory) +{ + pid_t pid; + + pid = fork(); + if (pid < 0) + { + perror("cannot fork to launch external file manager."); + return; + } + else if (pid == 0) + { + const char * const cmd[3] = {fm, directory, NULL}; + execv(fm, (char * const *)cmd); + fprintf(stderr, + "ERROR: could not exec external file manager \"%s\": %s.\n", + fm, strerror(errno)); + exit(-1); + } +} + +static void +_places_run_fm(void *data, E_Menu *m, E_Menu_Item *mi) +{ + const char *directory = data; + + if (places_conf->fm && (places_conf->fm[0] != '\0')) + { + _places_run_fm_external(places_conf->fm, directory); + return; + } + + E_Action *act = e_action_find("fileman"); + Eina_List *managers = e_manager_list(); + + if (act && act->func.go && managers && managers->data) + act->func.go(E_OBJECT(managers->data), directory); + else + _places_run_fm_external("thunar", directory); +} + +static void +_places_update_size(Evas_Object *obj, Volume *vol) +{ + char buf[256]; + char buf2[16]; + const char *tot_h, *free_h; + unsigned long long free; + + //Free label + tot_h = _places_human_size_get(vol->size); + if (vol->mounted) + { + free = _places_free_space_get(vol->mount_point); + free_h = _places_human_size_get(free); + snprintf(buf, sizeof(buf), "%s %s %s",free_h, D_("free of"),tot_h); + edje_object_part_text_set(obj, "size_label", buf); + eina_stringshare_del(free_h); + } + else + { + snprintf(buf, sizeof(buf), D_("%s Not Mounted"), tot_h); + edje_object_part_text_set(obj, "size_label", buf); + } + eina_stringshare_del(tot_h); + + //Gauge + int percent; + Edje_Message_Float msg_float; + + if (vol->mounted) + { + percent = 100 - (((long double)free / (long double)vol->size) * 100); + snprintf(buf2, sizeof(buf2), "%d%%", percent); + edje_object_part_text_set(obj, "percent_label", buf2); + + msg_float.val = (float)percent / 100; + edje_object_message_send(obj, EDJE_MESSAGE_FLOAT, 1, &msg_float); + edje_object_part_text_set(obj, "eject_label", D_("unmount")); + } + else + { + edje_object_signal_emit(obj, "gauge,hide", "places"); + edje_object_part_text_set(obj, "percent_label", ""); + edje_object_part_text_set(obj, "eject_label", D_("eject")); + } +} + +static void +_places_mount_volume(Volume *vol) +{ + Ecore_List *opt = NULL; + char buf[256]; + + if ((!strcmp(vol->fstype, "vfat")) || (!strcmp(vol->fstype, "ntfs"))) + { + opt = ecore_list_new(); + snprintf(buf, sizeof(buf), "uid=%i", (int)getuid()); + ecore_list_append(opt, buf); + } + e_hal_device_volume_mount(conn, vol->udi, vol->mount_point, vol->fstype, opt, _places_mount_cb, vol); + vol->to_mount = 0; + if (opt) ecore_list_destroy(opt); +} + +/**********************/ +/* EDJE Callbacks */ +/**********************/ +void +_places_icon_activated_cb(void *data, Evas_Object *o, const char *emission, const char *source) +{ + Volume *vol; + E_Fm2_Mount *emount; + + vol = data; + + if (vol->mounted) + _places_run_fm((void*)vol->mount_point, NULL, NULL); + else + { + vol->force_open = 1; + _places_mount_volume(vol); + } +} + +void +_places_eject_activated_cb(void *data, Evas_Object *o, const char *emission, const char *source) +{ + Volume *vol = data; + + if (vol->mounted) + e_hal_device_volume_unmount(conn, vol->udi, NULL, _places_unmount_cb, vol); + else + e_hal_device_volume_eject(conn, vol->udi, NULL, _places_eject_cb, vol); + +} + +/***********************/ +/* HAL /DBUS Callbacks */ +/***********************/ +static int +_places_open_when_mounted(void *data) +{ + Volume *vol = data; + + if (vol->mount_point) + { + _places_run_fm((void*)vol->mount_point, NULL, NULL); + return 0; + } + + return 1; +} + +void +_places_mount_cb(void *user_data, void *method_return, DBusError *error) +{ + Volume *vol = user_data; + + if (dbus_error_is_set(error)) + { + _places_error_show("Mount Error", "Can't mount device.",error->name, error->message); + dbus_error_free(error); + return; + } + + if (vol->force_open) + { + ecore_timer_add(0.1, _places_open_when_mounted, vol); + vol->force_open = 0; + } +} + +void +_places_unmount_cb(void *user_data, void *method_return, DBusError *error) +{ + Volume *vol = user_data; + + if (dbus_error_is_set(error)) + { + _places_error_show("Unmount Error", "Can't unmount device.",error->name, error->message); + dbus_error_free(error); + } +} + +void +_places_eject_cb(void *user_data, void *method_return, DBusError *error) +{ + Volume *vol = user_data; + + if (dbus_error_is_set(error)) + { + _places_error_show("Eject Error", "Can't eject device.",error->name, error->message); + dbus_error_free(error); + } +} + +/* Dbus CB - Generic device added */ +void +_places_device_add_cb(void *data, DBusMessage *msg) +{ + DBusError err; + char *udi; + + dbus_error_init(&err); + dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID); + + //printf("PLACES DBUS CB UDI:%s\n", udi); + e_hal_device_query_capability(conn, udi, "volume", + _places_volume_cb, + (void*)eina_stringshare_add(udi)); +} + +/* Dbus CB - Generic device removed */ +void +_places_device_rem_cb(void *data, DBusMessage *msg) +{ + DBusError err; + char *udi; + Eina_List *l; + + dbus_error_init(&err); + dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID); + + for (l = volumes; l; l = l->next) + { + Volume *v; + + v = l->data; + if (!strcmp(v->udi, udi)) + { + printf("PLACES Removed %s\n", v->udi); + _places_volume_del(v); + places_update_all_gadgets(); + return; + } + } +} + +/* Dbus CB - Called when a device change some properties */ +void +_places_volume_prop_modified_cb(void *data, DBusMessage *msg) +{ + Volume *v = data; + printf("properties\n"); + e_hal_device_get_all_properties(conn, v->udi, _places_volume_properties_cb, v); +} + +/* Dbus CB - Reply of all device of type "volume" */ +void +_places_volume_all_cb(void *user_data, void *reply_data, DBusError *error) +{ + E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply_data; + char *udi; + + if (!ret || !ret->strings) return; + + if (dbus_error_is_set(error)) + { + // XXX handle... + dbus_error_free(error); + return; + } + + ecore_list_first_goto(ret->strings); + while ((udi = ecore_list_next(ret->strings))) + _places_volume_add(udi); + + //TODO free ret?? +} + +/* Dbus CB - Reply of capability of type "volume" */ +void +_places_volume_cb(void *user_data, void *reply_data, DBusError *error) +{ + Volume *v; + char *udi = user_data; + E_Hal_Device_Query_Capability_Return *ret = reply_data; + + if (ret && ret->boolean) + { + //~ printf("PLACES DBUS CB UDI:%s\n", udi); + _places_volume_add(udi); + } + + eina_stringshare_del(udi); +} + +/* Dbus CB - Volume get properties */ +void +_places_volume_properties_cb(void *data, void *reply_data, DBusError *error) +{ + Volume *v = data; + E_Hal_Device_Get_All_Properties_Return *reply = reply_data; + int err = 0; + char *str = NULL; + + /* skip volumes with volume.ignore set */ + if (e_hal_property_bool_get(reply, "volume.ignore", &err) || err) + return; + + /* skip volumes that aren't filesystems */ + str = e_hal_property_string_get(reply, "volume.fsusage", &err); + if (err || !str || strcmp(str, "filesystem")) + { + FREE_STR(str); + return; + } + //~ v->uuid = e_hal_property_string_get(ret, "volume.uuid", &err); + //~ if (err) goto error; + + str = e_hal_property_string_get(reply, "volume.label", &err); + if (!err) v->label = eina_stringshare_add(str); + FREE_STR(str); + + v->mounted = e_hal_property_bool_get(reply, "volume.is_mounted", &err); + + str = e_hal_property_string_get(reply, "volume.mount_point", &err); + if (!err) v->mount_point = eina_stringshare_add(str); + FREE_STR(str); + + str = e_hal_property_string_get(reply, "volume.fstype", &err); + if (!err) v->fstype = eina_stringshare_add(str); + FREE_STR(str); + + v->size = e_hal_property_uint64_get(reply, "volume.size", &err); + + //~ v->partition = e_hal_property_bool_get(ret, "volume.is_partition", &err); + //~ if (err) goto error; + + //~ if (v->partition) + //~ { + //~ v->partition_label = e_hal_property_string_get(ret, "volume.partition.label", &err); + //~ if (err) goto error; + //~ } + + str = e_hal_property_string_get(reply, "info.parent", &err); + if (!err && str) + { + e_hal_device_get_all_properties(conn, str, _places_storage_properties_cb, v); + FREE_STR(str); + } + + return; +} + +/* Dbus CB - Storage get properties */ +void +_places_storage_properties_cb(void *data, void *reply_data, DBusError *error) +{ + Volume *v = data; + E_Hal_Properties *ret = reply_data; + int err = 0; + char *str; + + if (!v) return; + if (dbus_error_is_set(error)) + { + dbus_error_free(error); + return; + } + + str = e_hal_property_string_get(ret, "storage.bus", &err); + if (!err) v->bus = eina_stringshare_add(str); + FREE_STR(str); + + + str = e_hal_property_string_get(ret, "storage.drive_type", &err); + if (!err) v->drive_type = eina_stringshare_add(str); + FREE_STR(str); + + str = e_hal_property_string_get(ret, "storage.model", &err); + if (!err) v->model = eina_stringshare_add(str); + FREE_STR(str); + + str = e_hal_property_string_get(ret, "storage.vendor", &err); + if (!err) v->vendor = eina_stringshare_add(str); + FREE_STR(str); + + str = e_hal_property_string_get(ret, "storage.serial", &err); + if (!err) v->serial = eina_stringshare_add(str); + FREE_STR(str); + + v->removable = e_hal_property_bool_get(ret, "storage.removable", &err); + v->requires_eject = e_hal_property_bool_get(ret, "storage.requires_eject", &err); + + //~ // if (s->removable) + //~ { + //~ s->media_available = e_hal_property_bool_get(ret, "storage.removable.media_available", &err); + //~ s->media_size = e_hal_property_uint64_get(ret, "storage.removable.media_size", &err); + //~ } + + + //~ s->hotpluggable = e_hal_property_bool_get(ret, "storage.hotpluggable", &err); + //~ s->media_check_enabled = e_hal_property_bool_get(ret, "storage.media_check_enabled", &err); + + //~ s->icon.drive = e_hal_property_string_get(ret, "storage.icon.drive", &err); + //~ s->icon.volume = e_hal_property_string_get(ret, "storage.icon.volume", &err); + + _places_print_volume(v); //TODO Remove this + v->valid = 1; + + if (v->to_mount && !v->mounted) + _places_mount_volume(v); + v->to_mount = 0; + + places_update_all_gadgets(); //TODO Update only this volume, not all + return; +} + + diff --git a/src/e_mod_places.h b/src/e_mod_places.h new file mode 100644 index 0000000..376b1f7 --- /dev/null +++ b/src/e_mod_places.h @@ -0,0 +1,58 @@ +/* Copyright (C) 2008 Davide Andreoli (see AUTHORS) + * + * This file is part of places. + * places 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 3 of the License, or + * (at your option) any later version. + * + * places 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 places. If not, see . + */ + +#ifndef E_MOD_PLACES_H +#define E_MOD_PLACES_H + + +typedef struct _Volume +{ + const char *udi; + const char *label; + unsigned char mounted; + const char *mount_point; + const char *fstype; + long long size; + + const char *bus; + const char *drive_type; + const char *model; + const char *vendor; + const char *serial; + unsigned char removable; + unsigned char requires_eject; + + E_DBus_Signal_Handler *sh_prop; + unsigned char valid; + unsigned char to_mount; + unsigned char force_open; + Evas_Object *obj; + const char *icon; + +}Volume; + +void places_init(void); +void places_shutdown(void); +void places_update_all_gadgets(void); +void places_fill_box(Evas_Object *box); +void places_empty_box(Evas_Object *box); + +void places_generate_menu(void *data, E_Menu *em); +void places_augmentation(void *data, E_Menu *em); + + +#endif