ayatana-commits team mailing list archive
-
ayatana-commits team
-
Mailing list archive
-
Message #02932
[Merge] lp:~ted/dbusmenu/no-error-with-no-proxy into lp:dbusmenu
Ted Gould has proposed merging lp:~ted/dbusmenu/no-error-with-no-proxy into lp:dbusmenu.
Requested reviews:
Indicator Applet Developers (indicator-applet-developers)
For more details, see:
https://code.launchpad.net/~ted/dbusmenu/no-error-with-no-proxy/+merge/48106
Don't do a g_error. No really, it makes everyone unhappy as it crashes the panel. Thanks!
--
https://code.launchpad.net/~ted/dbusmenu/no-error-with-no-proxy/+merge/48106
Your team ayatana-commits is subscribed to branch lp:dbusmenu.
=== added file '.bzrignore'
--- .bzrignore 1970-01-01 00:00:00 +0000
+++ .bzrignore 2011-02-01 03:42:59 +0000
@@ -0,0 +1,11 @@
+compile
+m4
+src/libdatetime.la
+src/libdatetime_la-indicator-datetime.lo
+src/indicator-datetime-service
+po/indicator-datetime.pot
+indicator-datetime-[0-9].[0-9].[0-9].tar.gz
+data/indicator-datetime.service
+data/org.ayatana.indicator.datetime.gschema.valid
+src/gen-datetime-service.xml.c
+src/gen-datetime-service.xml.h
=== renamed file '.bzrignore' => '.bzrignore.moved'
=== added file 'AUTHORS'
--- AUTHORS 1970-01-01 00:00:00 +0000
+++ AUTHORS 2011-02-01 03:42:59 +0000
@@ -0,0 +1,2 @@
+# Generated by Makefile
+
=== renamed file 'AUTHORS' => 'AUTHORS.moved'
=== added file 'COPYING'
--- COPYING 1970-01-01 00:00:00 +0000
+++ COPYING 2011-02-01 03:42:59 +0000
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 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 <http://www.gnu.org/licenses/>.
+
+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:
+
+ <program> Copyright (C) <year> <name of author>
+ 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
+<http://www.gnu.org/licenses/>.
+
+ 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
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
=== renamed file 'COPYING' => 'COPYING.moved'
=== added file 'ChangeLog'
--- ChangeLog 1970-01-01 00:00:00 +0000
+++ ChangeLog 2011-02-01 03:42:59 +0000
@@ -0,0 +1,2 @@
+# Generated by Makefile
+
=== renamed file 'ChangeLog' => 'ChangeLog.moved'
=== added file 'Makefile.am'
--- Makefile.am 1970-01-01 00:00:00 +0000
+++ Makefile.am 2011-02-01 03:42:59 +0000
@@ -0,0 +1,36 @@
+
+SUBDIRS = \
+ src \
+ data \
+ tests \
+ po
+
+DISTCHECK_CONFIGURE_FLAGS = --enable-localinstall
+
+EXTRA_DIST = autogen.sh
+
+dist-hook:
+ @if test -d "$(top_srcdir)/.bzr"; \
+ then \
+ echo Creating ChangeLog && \
+ ( cd "$(top_srcdir)" && \
+ echo '# Generated by Makefile. Do not edit.'; echo; \
+ $(top_srcdir)/missing --run bzr log --gnu-changelog ) > ChangeLog.tmp \
+ && mv -f ChangeLog.tmp $(top_distdir)/ChangeLog \
+ || (rm -f ChangeLog.tmp; \
+ echo Failed to generate ChangeLog >&2 ); \
+ else \
+ echo Failed to generate ChangeLog: not a branch >&2; \
+ fi
+ @if test -d "$(top_srcdir)/.bzr"; \
+ then \
+ echo Creating AUTHORS && \
+ ( cd "$(top_srcdir)" && \
+ echo '# Generated by Makefile. Do not edit.'; echo; \
+ $(top_srcdir)/missing --run bzr log --long --levels=0 | grep -e "^\s*author:" -e "^\s*committer:" | cut -d ":" -f 2 | cut -d "<" -f 1 | sort -u) > AUTHORS.tmp \
+ && mv -f AUTHORS.tmp $(top_distdir)/AUTHORS \
+ || (rm -f AUTHORS.tmp; \
+ echo Failed to generate AUTHORS >&2 ); \
+ else \
+ echo Failed to generate AUTHORS: not a branch >&2; \
+ fi
=== renamed file 'Makefile.am' => 'Makefile.am.moved'
=== added file 'NEWS'
=== renamed file 'NEWS' => 'NEWS.moved'
=== added file 'README'
=== renamed file 'README' => 'README.moved'
=== added file 'autogen.sh'
--- autogen.sh 1970-01-01 00:00:00 +0000
+++ autogen.sh 2011-02-01 03:42:59 +0000
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+PKG_NAME="indicator-datetime"
+
+which gnome-autogen.sh || {
+ echo "You need gnome-common from GNOME Git"
+ exit 1
+}
+
+USE_GNOME2_MACROS=1 \
+. gnome-autogen.sh $@
=== renamed file 'autogen.sh' => 'autogen.sh.moved'
=== added file 'configure.ac'
--- configure.ac 1970-01-01 00:00:00 +0000
+++ configure.ac 2011-02-01 03:42:59 +0000
@@ -0,0 +1,186 @@
+
+AC_INIT(indicator-datetime, 0.1.91, ted@xxxxxxxxxxxxx)
+AC_COPYRIGHT([Copyright 2009,2010 Canonical])
+
+AC_PREREQ(2.53)
+
+AM_CONFIG_HEADER(config.h)
+AM_INIT_AUTOMAKE(indicator-datetime, 0.1.91)
+
+AM_MAINTAINER_MODE
+
+IT_PROG_INTLTOOL([0.35.0])
+
+AC_ISC_POSIX
+AC_PROG_CC
+AM_PROG_CC_C_O
+AC_STDC_HEADERS
+AC_DISABLE_STATIC
+AC_PROG_LIBTOOL
+
+AC_SUBST(VERSION)
+AC_CONFIG_MACRO_DIR([m4])
+
+m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
+
+AC_ARG_ENABLE([deprecations],
+ [AS_HELP_STRING([--enable-deprecations],
+ [allow deprecated API usage @<:@default=yes@:>@])],
+ [],
+ [enable_deprecations=yes])
+AS_IF([test "x$enable_deprecations" = xno],
+ [CFLAGS="$CFLAGS -DG_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGSEAL_ENABLE -DGTK_DISABLE_SINGLE_INCLUDES"]
+)
+
+AC_PATH_PROG([GLIB_MKENUMS], [glib-mkenums])
+AC_PATH_PROG([GLIB_GENMARSHAL], [glib-genmarshal])
+
+PKG_PROG_PKG_CONFIG
+
+###########################
+# GTK+ version option
+###########################
+
+AC_ARG_WITH([gtk],
+ [AS_HELP_STRING([--with-gtk],
+ [Which version of gtk to use @<:@default=2@:>@])],
+ [],
+ [with_gtk=2])
+
+###########################
+# Dependencies
+###########################
+
+INDICATOR_REQUIRED_VERSION=0.3.0
+DBUSMENUGLIB_REQUIRED_VERSION=0.1.1
+DBUSMENUGTK_REQUIRED_VERSION=0.3.94
+GIO_REQUIRED_VERSION=2.25.11
+# Note: the GIO check below also ensures the proper glib with gsettings support is present
+INDICATOR_DISPLAY_OBJECTS=0.1.10
+GEOCLUE_REQUIRED_VERSION=0.12.0
+OOBS_REQUIRED_VERSION=2.31.0
+
+AS_IF([test "x$with_gtk" = x3],
+ [PKG_CHECK_MODULES(INDICATOR, indicator3 >= $INDICATOR_REQUIRED_VERSION
+ dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION
+ dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION
+ libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS)
+ ],
+ [test "x$with_gtk" = x2],
+ [PKG_CHECK_MODULES(INDICATOR, indicator >= $INDICATOR_REQUIRED_VERSION
+ dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION
+ dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION
+ libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS)
+ ],
+ [AC_MSG_FAILURE([Value for --with-gtk was neither 2 nor 3])]
+)
+
+PKG_CHECK_MODULES(SERVICE, indicator >= $INDICATOR_REQUIRED_VERSION
+ dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION
+ libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS
+ gio-2.0 >= $GIO_REQUIRED_VERSION
+ geoclue >= $GEOCLUE_REQUIRED_VERSION
+ liboobs-1 >= $OOBS_REQUIRED_VERSION)
+
+AC_SUBST(INDICATOR_CFLAGS)
+AC_SUBST(INDICATOR_LIBS)
+
+AC_SUBST(SERVICE_CFLAGS)
+AC_SUBST(SERVICE_LIBS)
+
+###########################
+# Grab the GSettings Macros
+###########################
+
+GLIB_GSETTINGS
+
+###########################
+# Check to see if we're local
+###########################
+
+with_localinstall="no"
+AC_ARG_ENABLE(localinstall, AS_HELP_STRING([--enable-localinstall], [install all of the files localy instead of system directories (for distcheck)]), with_localinstall=$enableval, with_localinstall=no)
+
+###########################
+# Indicator Info
+###########################
+
+AS_IF([test "x$with_localinstall" = "xyes"],
+ [
+ INDICATORDIR="${libdir}/indicators/2/"
+ INDICATORICONSDIR="${datadir}/libindicate/icons/"
+ ],
+ [AS_IF([test "x$with_gtk" = "x2"],
+ [
+ INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator`
+ INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator`
+ ],
+ [
+ INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator3`
+ INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator3`
+ ])])
+
+AC_SUBST(INDICATORDIR)
+AC_SUBST(INDICATORICONSDIR)
+
+###########################
+# DBus Service Info
+###########################
+
+if test "x$with_localinstall" = "xyes"; then
+ DBUSSERVICEDIR="${datadir}/dbus-1/services/"
+else
+ DBUSSERVICEDIR=`$PKG_CONFIG --variable=session_bus_services_dir dbus-1`
+fi
+AC_SUBST(DBUSSERVICEDIR)
+
+##############################
+# Custom Junk
+##############################
+
+AC_DEFUN([AC_DEFINE_PATH], [
+ test "x$prefix" = xNONE && prefix="$ac_default_prefix"
+ test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+ ac_define_path=`eval echo [$]$2`
+ ac_define_path=`eval echo [$]ac_define_path`
+ $1="$ac_define_path"
+ AC_SUBST($1)
+ ifelse($3, ,
+ AC_DEFINE_UNQUOTED($1, "$ac_define_path"),
+ AC_DEFINE_UNQUOTED($1, "$ac_define_path", $3))
+])
+
+###########################
+# Internationalization
+###########################
+
+GETTEXT_PACKAGE=indicator-datetime
+AC_SUBST(GETTEXT_PACKAGE)
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Name of the default get text domain])
+AC_DEFINE_PATH(GNOMELOCALEDIR, "${datadir}/locale", [locale directory])
+
+AM_GLIB_GNU_GETTEXT
+
+###########################
+# Files
+###########################
+
+AC_OUTPUT([
+Makefile
+src/Makefile
+data/Makefile
+tests/Makefile
+po/Makefile.in
+])
+
+###########################
+# Results
+###########################
+
+AC_MSG_NOTICE([
+
+Date and Time Indicator Configuration:
+
+ Prefix: $prefix
+ Indicator Dir: $INDICATORDIR
+])
=== renamed file 'configure.ac' => 'configure.ac.moved'
=== added directory 'data'
=== added file 'data/Makefile.am'
--- data/Makefile.am 1970-01-01 00:00:00 +0000
+++ data/Makefile.am 2011-02-01 03:42:59 +0000
@@ -0,0 +1,17 @@
+#SUBDIRS = icons
+
+gsettings_SCHEMAS = \
+ com.canonical.indicator.datetime.gschema.xml
+@GSETTINGS_RULES@
+
+dbus_servicesdir = $(DBUSSERVICEDIR)
+dbus_services_DATA = indicator-datetime.service
+
+%.service: %.service.in
+ sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+
+EXTRA_DIST = \
+ $(gsettings_SCHEMAS) \
+ indicator-datetime.service.in
+
+CLEANFILES = indicator-datetime.service
=== added file 'data/com.canonical.indicator.datetime.gschema.xml'
--- data/com.canonical.indicator.datetime.gschema.xml 1970-01-01 00:00:00 +0000
+++ data/com.canonical.indicator.datetime.gschema.xml 2011-02-01 03:42:59 +0000
@@ -0,0 +1,61 @@
+<schemalist>
+ <enum id="time-enum">
+ <value nick="locale-default" value="0" />
+ <value nick="12-hour" value="1" />
+ <value nick="24-hour" value="2" />
+ <value nick="custom" value="3" />
+ </enum>
+ <schema id="com.canonical.indicator.datetime" path="/com/canonical/indicator/datetime/" gettext-domain="indicator-datetime">
+ <key name="time-format" enum="time-enum">
+ <default>'locale-default'</default>
+ <summary>What the time format should be</summary>
+ <description>
+ Controls the time format that is displayed in the indicator. For almost
+ all users this should be the default for their locale. If you think the
+ setting is wrong for your locale please join or talk to the translation
+ team for your language. If you just want something different you can
+ adjust this to be either 12 or 24 time. Or, you can use a custom format
+ string and set the custom-time-format setting.
+ </description>
+ </key>
+ <key name="show-seconds" type="b">
+ <default>false</default>
+ <summary>Show the number of seconds in the indicator</summary>
+ <description>
+ Makes the datetime indicator show the number of seconds in the indicator.
+ It's important to note that this will cause additional battery drain as
+ the time will update 60 times as often, so it is not recommended. Also,
+ this setting will be ignored if the time-format value is set to custom.
+ </description>
+ </key>
+ <key name="show-day" type="b">
+ <default>false</default>
+ <summary>Show the day of the week in the indicator</summary>
+ <description>
+ Puts the day of the week on the panel along with the time and/or date
+ depending on settings. This setting will be ignored if the time-format
+ value is set to custom.
+ </description>
+ </key>
+ <key name="show-date" type="b">
+ <default>false</default>
+ <summary>Show the month and date in the indicator</summary>
+ <description>
+ Puts the month and the date in the panel along with the time and/or day
+ of the week depending on settings. This setting will be ignored if the
+ time-format value is set to custom.
+ </description>
+ </key>
+ <key name="custom-time-format" type="s">
+ <default>"%l:%M %p"</default>
+ <summary>The format string passed to strftime</summary>
+ <description>
+ The format of the time and/or date that is visible on the panel when using
+ the indicator. For most users this will be a set of predefined values as
+ determined by the configuration utility, but advanced users can change it
+ to anything strftime can accept. Look at the man page on strftime for
+ more information.
+ </description>
+ </key>
+ </schema>
+</schemalist>
=== added file 'data/indicator-datetime.service.in'
--- data/indicator-datetime.service.in 1970-01-01 00:00:00 +0000
+++ data/indicator-datetime.service.in 2011-02-01 03:42:59 +0000
@@ -0,0 +1,3 @@
+[D-BUS Service]
+Name=com.canonical.indicator.datetime
+Exec=@libexecdir@/indicator-datetime-service
=== added directory 'po'
=== renamed directory 'po' => 'po.moved'
=== added file 'po/LINGUAS'
--- po/LINGUAS 1970-01-01 00:00:00 +0000
+++ po/LINGUAS 2011-02-01 03:42:59 +0000
@@ -0,0 +1,31 @@
+ar
+bg
+cs
+da
+de
+el
+es
+fi
+fr
+he
+hi
+hr
+hu
+it
+ja
+ko
+nb
+nl
+pl
+pt
+pt_BR
+ro
+ru
+sk
+sl
+sr
+sv
+th
+tr
+zh_CN
+zh_TW
=== added file 'po/Makevars'
--- po/Makevars 1970-01-01 00:00:00 +0000
+++ po/Makevars 2011-02-01 03:42:59 +0000
@@ -0,0 +1,7 @@
+DOMAIN = $(PACKAGE)
+subdir = po
+top_builddir = ..
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ --keyword=C_:1c,2 --keyword=T_ --from-code=UTF-8
+COPYRIGHT_HOLDER = Canonical Ltd.
+MSGID_BUGS_ADDRESS = ted@xxxxxxxxxxxxx
+EXTRA_LOCALE_CATEGORIES =
=== added file 'po/POTFILES.in'
--- po/POTFILES.in 1970-01-01 00:00:00 +0000
+++ po/POTFILES.in 2011-02-01 03:42:59 +0000
@@ -0,0 +1,2 @@
+src/indicator-datetime.c
+src/datetime-service.c
=== added file 'po/ar.po'
--- po/ar.po 1970-01-01 00:00:00 +0000
+++ po/ar.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,44 @@
+# Arabic translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:05-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Arabic\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "خطأ ÙÙ Ø§ÙØØµÙ٠عÙ٠اÙÙÙØª"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d ØµØ¨Ø§ØØ§"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d Ù
ساء"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Ø§ÙØªÙÙÙÙ
اÙÙ
ÙØªÙØ (Open Calendar)"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "ضبط اÙÙÙØª ÙØ§ÙØªØ§Ø±ÙØ®..."
=== added file 'po/bg.po'
--- po/bg.po 1970-01-01 00:00:00 +0000
+++ po/bg.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,44 @@
+# Bulgarian translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:05-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Bulgarian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "ÐÑеÑка пÑи пÑовеÑка на вÑеме"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d пÑеди обÑд"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d Ñледобед"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "ÐÑвоÑи календаÑ"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "СвеÑи ÑÐ°Ñ Ð¸ даÑа..."
=== added file 'po/cs.po'
--- po/cs.po 1970-01-01 00:00:00 +0000
+++ po/cs.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Czech translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Czech\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Chyba zÃskánà Äasu"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d dop."
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d odp."
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "OtevÅÃt kalendáÅ"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Nastavit Äas a datum..."
=== added file 'po/da.po'
--- po/da.po 1970-01-01 00:00:00 +0000
+++ po/da.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Danish translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Danish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Fejl ved hentning af klokkeslæt"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d.%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d.%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Ã
bn Kalender"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Indstil klokkeslæt og dato..."
=== added file 'po/de.po'
--- po/de.po 1970-01-01 00:00:00 +0000
+++ po/de.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# German translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: German\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Fehler beim Abrufen der Zeit"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Kalender öffnen"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Datum und Uhrzeit einstellen."
=== added file 'po/el.po'
--- po/el.po 1970-01-01 00:00:00 +0000
+++ po/el.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Greek translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Greek\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "ΣÏάλμα καÏά Ïη λήÏη ÏοÏ
ÏÏÏνοÏ
"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d Ï.μ."
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d μ.μ."
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Îνοιγμα ημεÏολογίοÏ
"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "ÎÏιÏμÏÏ ÏÏÎ±Ï ÎºÎ±Î¹ ημεÏομηνίαÏ..."
=== added file 'po/es.po'
--- po/es.po 1970-01-01 00:00:00 +0000
+++ po/es.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Spanish translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Spanish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Error al obtener la hora"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Abrir calendario"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Ajustar fecha y hora..."
=== added file 'po/fi.po'
--- po/fi.po 1970-01-01 00:00:00 +0000
+++ po/fi.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Finnish translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Finnish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Virheen noudettaessa aikaa"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AP"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d IP"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Avaa kalenteri"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Aseta kellonaika ja päivämäärä..."
=== added file 'po/fr.po'
--- po/fr.po 1970-01-01 00:00:00 +0000
+++ po/fr.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# French translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: French\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Erreur lors de l'obtention de l'heure"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Ouvrir le calendrier"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Régler la date et l'heure..."
=== added file 'po/he.po'
--- po/he.po 1970-01-01 00:00:00 +0000
+++ po/he.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Hebrew translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Hebrew\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "ש×××× ××§××ת ×שע×"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "×¤×ª× ××× ×©× ×"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "×××רת ×©×¢× ×ת×ר××..."
=== added file 'po/hi.po'
--- po/hi.po 1970-01-01 00:00:00 +0000
+++ po/hi.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,44 @@
+# Hindi translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Hindi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "समय पà¥à¤°à¤¾à¤ªà¥à¤¤ à¤à¤°à¤¨à¥ मà¥à¤ तà¥à¤°à¥à¤à¤¿"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "पà¥à¤°à¤¾à¤¤à¤ %d%d:%d%d बà¤à¥"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "सायठ%d%d:%d%d बà¤à¥"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "à¤à¥à¤²à¥à¤à¤¡à¤° à¤à¥à¤²à¥à¤"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "समय à¤à¤° तिथि सà¥à¤ à¤à¤°à¥à¤..."
=== added file 'po/hr.po'
--- po/hr.po 1970-01-01 00:00:00 +0000
+++ po/hr.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,46 @@
+# Croatian translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Croatian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "GreÅ¡ka pri dohvaÄanju vremena"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Otvori kalendar"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Postavi vrijeme i datum..."
=== added file 'po/hu.po'
--- po/hu.po 1970-01-01 00:00:00 +0000
+++ po/hu.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Hungarian translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Hungarian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Hiba az idŠlekérésekor"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d de."
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d du."
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Naptár megnyitása"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "IdŠés dátum beállÃtása..."
=== added file 'po/it.po'
--- po/it.po 1970-01-01 00:00:00 +0000
+++ po/it.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Italian translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Italian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Errore nell'acquisizione dell'orario"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Apri calendario"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Imposta data e ora..."
=== added file 'po/ja.po'
--- po/ja.po 1970-01-01 00:00:00 +0000
+++ po/ja.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Japanese translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Japanese\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "æå»ãåå¾ã§ãã¾ãã"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "åå %d%d:%d%d"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "åå¾ %d%d:%d%d"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "ã«ã¬ã³ãã¼ãéã"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "æå»ã¨æ¥ä»ã®è¨å®..."
=== added file 'po/ko.po'
--- po/ko.po 1970-01-01 00:00:00 +0000
+++ po/ko.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Korean translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Korean\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "ìê° ê°ì ¸ì¤ê¸° ì¤ë¥"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "ì¤ì %d%d:%d%d"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "ì¤í %d%d:%d%d"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "ì¼ì ì´ê¸°"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "ìê° ë° ë ì§ ì¤ì ..."
=== added file 'po/nb.po'
--- po/nb.po 1970-01-01 00:00:00 +0000
+++ po/nb.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Norwegian Bokmal translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Norwegian Bokmal\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Feil under henting av klokkeslett"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Ã
pne kalender"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Angi dato og klokkeslett..."
=== added file 'po/nl.po'
--- po/nl.po 1970-01-01 00:00:00 +0000
+++ po/nl.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Dutch translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Dutch\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Fout bij lezen van tijd"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d%d%d VM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d%d%d NM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Kalender openen"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Datum en tijd instellen..."
=== added file 'po/pl.po'
--- po/pl.po 1970-01-01 00:00:00 +0000
+++ po/pl.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,46 @@
+# Polish translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Polish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "WystÄ
piÅ bÅÄ
d pobierania godziny"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Otwórz kalendarz"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Ustaw godzinÄ i datÄ..."
=== added file 'po/pt.po'
--- po/pt.po 1970-01-01 00:00:00 +0000
+++ po/pt.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Portuguese translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Portuguese\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Erro na obtenção das horas"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Abrir Calendário"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Acertar Hora e Data..."
=== added file 'po/pt_BR.po'
--- po/pt_BR.po 1970-01-01 00:00:00 +0000
+++ po/pt_BR.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Portuguese translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Brazilian Portuguese\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Erro ao obter hora"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Abrir o calendário"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Ajustar data e hora..."
=== added file 'po/ro.po'
--- po/ro.po 1970-01-01 00:00:00 +0000
+++ po/ro.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,46 @@
+# Romanian translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Romanian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
+"20)) ? 1 : 2;\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Eroare la obÈinerea orei"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Deschide calendarul"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Setare orÄ Èi datÄ..."
=== added file 'po/ru.po'
--- po/ru.po 1970-01-01 00:00:00 +0000
+++ po/ru.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,46 @@
+# Russian translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Russian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "ÐÑибка полÑÑÐµÐ½Ð¸Ñ Ð²Ñемени"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "ÐÑкÑÑÑÑ ÐºÐ°Ð»ÐµÐ½Ð´Ð°ÑÑ"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "УÑÑановиÑÑ Ð²ÑÐµÐ¼Ñ Ð¸ даÑÑ..."
=== added file 'po/sk.po'
--- po/sk.po 1970-01-01 00:00:00 +0000
+++ po/sk.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Slovak translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Slovak\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Äas zistenia chyby"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Otvoriť kalendár"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "NastaviÅ¥ Äas a dátum..."
=== added file 'po/sl.po'
--- po/sl.po 1970-01-01 00:00:00 +0000
+++ po/sl.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,46 @@
+# Slovenian translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Slovenian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
+"%100==4 ? 2 : 3);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Napaka pri pridobivanju podatka o Äasu"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Odpri koledar"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Nastavi Äas in datum ..."
=== added file 'po/sr.po'
--- po/sr.po 1970-01-01 00:00:00 +0000
+++ po/sr.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,46 @@
+# Serbian translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Serbian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Greška u prikazu vremena"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d%d%d pre podne"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d%d%d popodne"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Otvori kalendar"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Podesi vreme i datum"
=== added file 'po/sv.po'
--- po/sv.po 1970-01-01 00:00:00 +0000
+++ po/sv.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Swedish translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Swedish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Ett fel uppstod då tid hämtades"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d FM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d EM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Ãppna kalender"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Ange tid och datum..."
=== added file 'po/th.po'
--- po/th.po 1970-01-01 00:00:00 +0000
+++ po/th.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,44 @@
+# Thai translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Thai\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "à¸à¹à¸à¸à¸´à¸à¸à¸¥à¸²à¸à¸à¸²à¸£à¸à¸à¸à¹à¸à¸¡à¸¹à¸¥à¹à¸§à¸¥à¸²"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d AM"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d PM"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "à¹à¸à¸´à¸à¸à¸à¸´à¸à¸´à¸"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "à¸à¸±à¹à¸à¹à¸§à¸¥à¸²à¹à¸¥à¸°à¸§à¸±à¸à¸à¸µà¹..."
=== added file 'po/tr.po'
--- po/tr.po 1970-01-01 00:00:00 +0000
+++ po/tr.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,45 @@
+# Turkish translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Turkish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "Saati alma hatâsı"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "ÃÄleden Ãnce %d%d:%d%d"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "ÃÄleden Sonra %d%d:%d%d"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "Takvimi Aç"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "Saati ve Târihi Ayarla..."
=== added file 'po/zh_CN.po'
--- po/zh_CN.po 1970-01-01 00:00:00 +0000
+++ po/zh_CN.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,44 @@
+# Chinese translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Chinese (simplified)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "è·åæ¶é´åºé"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d ä¸å"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d ä¸å"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "æå¼æ¥å"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "设置æ¶é´åæ¥æ..."
=== added file 'po/zh_TW.po'
--- po/zh_TW.po 1970-01-01 00:00:00 +0000
+++ po/zh_TW.po 2011-02-01 03:42:59 +0000
@@ -0,0 +1,44 @@
+# Chinese translations for PACKAGE package.
+# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Canonical OEM, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: indicator-datetime\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-10 15:20-0500\n"
+"PO-Revision-Date: 2010-03-03 10:06-0500\n"
+"Last-Translator: Canonical OEM\n"
+"Language-Team: Chinese (traditional)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../src/indicator-datetime.c:177
+msgid "Error getting time"
+msgstr "ç²å¾æéç¼çé¯èª¤"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:259
+#, c-format
+msgid "%d%d:%d%d AM"
+msgstr "%d%d:%d%d ä¸å"
+
+#. TRANSLATORS: This string is used for measuring the size of
+#. the font used for showing the time and is not shown to the
+#. user anywhere.
+#: ../src/indicator-datetime.c:266
+#, c-format
+msgid "%d%d:%d%d PM"
+msgstr "%d%d:%d%d ä¸å"
+
+#: ../src/indicator-datetime.c:351
+msgid "Open Calendar"
+msgstr "éåè¡äºæ"
+
+#: ../src/indicator-datetime.c:361
+msgid "Set Time and Date..."
+msgstr "è¨å®æé忥æ..."
=== added directory 'src'
=== added file 'src/Makefile.am'
--- src/Makefile.am 1970-01-01 00:00:00 +0000
+++ src/Makefile.am 2011-02-01 03:42:59 +0000
@@ -0,0 +1,56 @@
+
+libexec_PROGRAMS = indicator-datetime-service
+
+indicator_datetime_service_SOURCES = \
+ datetime-interface.c \
+ datetime-interface.h \
+ gen-datetime-service.xml.c \
+ calendar-menu-item.c \
+ calendar-menu-item.h \
+ datetime-service.c \
+ dbus-shared.h
+indicator_datetime_service_CFLAGS = \
+ -Wall \
+ -Werror \
+ $(SERVICE_CFLAGS) \
+ -DTIMEZONE_FILE="\"/etc/timezone\"" \
+ -DG_LOG_DOMAIN=\"Indicator-Datetime\"
+indicator_datetime_service_LDADD = \
+ $(SERVICE_LIBS)
+
+datetimelibdir = $(INDICATORDIR)
+datetimelib_LTLIBRARIES = libdatetime.la
+libdatetime_la_SOURCES = \
+ gen-datetime-service.xml.h \
+ dbus-shared.h \
+ indicator-datetime.c
+libdatetime_la_CFLAGS = \
+ $(INDICATOR_CFLAGS) \
+ -Wall -Werror \
+ -DG_LOG_DOMAIN=\"Indicator-Datetime\"
+libdatetime_la_LIBADD = \
+ $(INDICATOR_LIBS)
+libdatetime_la_LDFLAGS = \
+ -module \
+ -avoid-version
+
+gen-%.xml.c: %.xml
+ @echo "Building $@ from $<"
+ @echo "const char * _$(subst -,_,$(subst .,_,$(basename $<))) = " > $@
+ @sed -e "s:\":\\\\\":g" -e s:^:\": -e s:\$$:\\\\n\": $< >> $@
+ @echo ";" >> $@
+
+gen-%.xml.h: %.xml
+ @echo "Building $@ from $<"
+ @echo "extern const char * _$(subst -,_,$(subst .,_,$(basename $<)));" > $@
+
+BUILT_SOURCES = \
+ gen-datetime-service.xml.c \
+ gen-datetime-service.xml.h
+
+
+CLEANFILES = \
+ $(BUILT_SOURCES)
+
+EXTRA_DIST = \
+ datetime-service.xml
=== added file 'src/calendar-menu-item.c'
--- src/calendar-menu-item.c 1970-01-01 00:00:00 +0000
+++ src/calendar-menu-item.c 2011-02-01 03:42:59 +0000
@@ -0,0 +1,100 @@
+/*
+Calendar menu item dbusmenu "transport" for the corresponding IDO widget.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+ David Barth <david.barth@xxxxxxxxxxxxx>
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 3, as published
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranties of
+MERCHANTABILITY, SATISFACTORY QUALITY, 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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gdk/gdk.h>
+#include <glib/gi18n.h>
+#include "calendar-menu-item.h"
+
+#include "dbus-shared.h"
+
+#include <libdbusmenu-glib/client.h>
+#include <libdbusmenu-glib/server.h>
+#include <libdbusmenu-glib/menuitem.h>
+
+enum {
+ LAST_SIGNAL
+};
+
+/* static guint signals[LAST_SIGNAL] = { }; */
+
+typedef struct _CalendarMenuItemPrivate CalendarMenuItemPrivate;
+struct _CalendarMenuItemPrivate
+{
+ void * placeholder;
+};
+
+#define CALENDAR_MENU_ITEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CALENDAR_MENU_ITEM_TYPE, CalendarMenuItemPrivate))
+
+/* Prototypes */
+static void calendar_menu_item_class_init (CalendarMenuItemClass *klass);
+static void calendar_menu_item_init (CalendarMenuItem *self);
+static void calendar_menu_item_dispose (GObject *object);
+static void calendar_menu_item_finalize (GObject *object);
+
+G_DEFINE_TYPE (CalendarMenuItem, calendar_menu_item, DBUSMENU_TYPE_MENUITEM);
+
+static void
+calendar_menu_item_class_init (CalendarMenuItemClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (CalendarMenuItemPrivate));
+
+ object_class->dispose = calendar_menu_item_dispose;
+ object_class->finalize = calendar_menu_item_finalize;
+
+ return;
+}
+
+static void
+calendar_menu_item_init (CalendarMenuItem *self)
+{
+ return;
+}
+
+static void
+calendar_menu_item_dispose (GObject *object)
+{
+ G_OBJECT_CLASS (calendar_menu_item_parent_class)->dispose (object);
+}
+
+static void
+calendar_menu_item_finalize (GObject *object)
+{
+ G_OBJECT_CLASS (calendar_menu_item_parent_class)->finalize (object);
+
+ return;
+}
+
+CalendarMenuItem *
+calendar_menu_item_new ()
+{
+ CalendarMenuItem * self = g_object_new(CALENDAR_MENU_ITEM_TYPE, NULL);
+
+ dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CALENDAR_MENUITEM_TYPE);
+
+ return self;
+}
+
=== added file 'src/calendar-menu-item.h'
--- src/calendar-menu-item.h 1970-01-01 00:00:00 +0000
+++ src/calendar-menu-item.h 2011-02-01 03:42:59 +0000
@@ -0,0 +1,59 @@
+/*
+Calendar menu item dbusmenu "transport" for the corresponding IDO widget.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+ David Barth <david.barth@xxxxxxxxxxxxx>
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 3, as published
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranties of
+MERCHANTABILITY, SATISFACTORY QUALITY, 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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __CALENDAR_MENU_ITEM_H__
+#define __CALENDAR_MENU_ITEM_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <libdbusmenu-glib/menuitem.h>
+
+G_BEGIN_DECLS
+
+#define CALENDAR_MENU_ITEM_TYPE (calendar_menu_item_get_type ())
+#define CALENDAR_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CALENDAR_MENU_ITEM_TYPE, CalendarMenuItem))
+#define CALENDAR_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CALENDAR_MENU_ITEM_TYPE, CalendarMenuItemClass))
+#define IS_CALENDAR_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CALENDAR_MENU_ITEM_TYPE))
+#define IS_CALENDAR_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CALENDAR_MENU_ITEM_TYPE))
+#define CALENDAR_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CALENDAR_MENU_ITEM_TYPE, CalendarMenuItemClass))
+
+#define CALENDAR_MENU_ITEM_SIGNAL_ACTIVATE "activate"
+#define CALENDAR_MENUITEM_PROP_TEXT "text"
+
+typedef struct _CalendarMenuItem CalendarMenuItem;
+typedef struct _CalendarMenuItemClass CalendarMenuItemClass;
+
+struct _CalendarMenuItemClass {
+ DbusmenuMenuitemClass parent_class;
+};
+
+struct _CalendarMenuItem {
+ DbusmenuMenuitem parent;
+};
+
+GType calendar_menu_item_get_type (void);
+CalendarMenuItem * calendar_menu_item_new ();
+
+G_END_DECLS
+
+#endif /* __CALENDAR_MENU_ITEM_H__ */
+
=== added file 'src/datetime-interface.c'
--- src/datetime-interface.c 1970-01-01 00:00:00 +0000
+++ src/datetime-interface.c 2011-02-01 03:42:59 +0000
@@ -0,0 +1,207 @@
+/*
+An indicator to time and date related information in the menubar.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+ Ted Gould <ted@xxxxxxxxxxxxx>
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 3, as published
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranties of
+MERCHANTABILITY, SATISFACTORY QUALITY, 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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gio/gio.h>
+
+#include "datetime-interface.h"
+#include "gen-datetime-service.xml.h"
+#include "dbus-shared.h"
+
+/**
+ DatetimeInterfacePrivate:
+ @dbus_registration: The handle for this object being registered
+ on dbus.
+
+ Structure to define the memory for the private area
+ of the datetime interface instance.
+*/
+struct _DatetimeInterfacePrivate {
+ GDBusConnection * bus;
+ GCancellable * bus_cancel;
+ guint dbus_registration;
+};
+
+#define DATETIME_INTERFACE_GET_PRIVATE(o) (DATETIME_INTERFACE(o)->priv)
+
+/* GDBus Stuff */
+static GDBusNodeInfo * node_info = NULL;
+static GDBusInterfaceInfo * interface_info = NULL;
+
+static void datetime_interface_class_init (DatetimeInterfaceClass *klass);
+static void datetime_interface_init (DatetimeInterface *self);
+static void datetime_interface_dispose (GObject *object);
+static void datetime_interface_finalize (GObject *object);
+static void bus_get_cb (GObject * object, GAsyncResult * res, gpointer user_data);
+
+G_DEFINE_TYPE (DatetimeInterface, datetime_interface, G_TYPE_OBJECT);
+
+static void
+datetime_interface_class_init (DatetimeInterfaceClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (DatetimeInterfacePrivate));
+
+ object_class->dispose = datetime_interface_dispose;
+ object_class->finalize = datetime_interface_finalize;
+
+ /* Setting up the DBus interfaces */
+ if (node_info == NULL) {
+ GError * error = NULL;
+
+ node_info = g_dbus_node_info_new_for_xml(_datetime_service, &error);
+ if (error != NULL) {
+ g_error("Unable to parse Datetime Service Interface description: %s", error->message);
+ g_error_free(error);
+ }
+ }
+
+ if (interface_info == NULL) {
+ interface_info = g_dbus_node_info_lookup_interface(node_info, SERVICE_IFACE);
+
+ if (interface_info == NULL) {
+ g_error("Unable to find interface '" SERVICE_IFACE "'");
+ }
+ }
+
+ return;
+}
+
+static void
+datetime_interface_init (DatetimeInterface *self)
+{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, DATETIME_INTERFACE_TYPE, DatetimeInterfacePrivate);
+
+ self->priv->bus = NULL;
+ self->priv->bus_cancel = NULL;
+ self->priv->dbus_registration = 0;
+
+ self->priv->bus_cancel = g_cancellable_new();
+ g_bus_get(G_BUS_TYPE_SESSION,
+ self->priv->bus_cancel,
+ bus_get_cb,
+ self);
+
+ return;
+}
+
+static void
+bus_get_cb (GObject * object, GAsyncResult * res, gpointer user_data)
+{
+ GError * error = NULL;
+ GDBusConnection * connection = g_bus_get_finish(res, &error);
+
+ if (error != NULL) {
+ g_error("OMG! Unable to get a connection to DBus: %s", error->message);
+ g_error_free(error);
+ return;
+ }
+
+ DatetimeInterfacePrivate * priv = DATETIME_INTERFACE_GET_PRIVATE(user_data);
+
+ g_warn_if_fail(priv->bus == NULL);
+ priv->bus = connection;
+
+ if (priv->bus_cancel != NULL) {
+ g_object_unref(priv->bus_cancel);
+ priv->bus_cancel = NULL;
+ }
+
+ /* Now register our object on our new connection */
+ priv->dbus_registration = g_dbus_connection_register_object(priv->bus,
+ SERVICE_OBJ,
+ interface_info,
+ NULL,
+ user_data,
+ NULL,
+ &error);
+
+ if (error != NULL) {
+ g_error("Unable to register the object to DBus: %s", error->message);
+ g_error_free(error);
+ return;
+ }
+
+ return;
+}
+
+static void
+datetime_interface_dispose (GObject *object)
+{
+ DatetimeInterfacePrivate * priv = DATETIME_INTERFACE_GET_PRIVATE(object);
+
+ if (priv->dbus_registration != 0) {
+ g_dbus_connection_unregister_object(priv->bus, priv->dbus_registration);
+ /* Don't care if it fails, there's nothing we can do */
+ priv->dbus_registration = 0;
+ }
+
+ if (priv->bus != NULL) {
+ g_object_unref(priv->bus);
+ priv->bus = NULL;
+ }
+
+ if (priv->bus_cancel != NULL) {
+ g_cancellable_cancel(priv->bus_cancel);
+ g_object_unref(priv->bus_cancel);
+ priv->bus_cancel = NULL;
+ }
+
+ G_OBJECT_CLASS (datetime_interface_parent_class)->dispose (object);
+ return;
+}
+
+static void
+datetime_interface_finalize (GObject *object)
+{
+
+ G_OBJECT_CLASS (datetime_interface_parent_class)->finalize (object);
+ return;
+}
+
+void
+datetime_interface_update (DatetimeInterface *self)
+{
+ g_return_if_fail(IS_DATETIME_INTERFACE(self));
+
+ DatetimeInterfacePrivate * priv = DATETIME_INTERFACE_GET_PRIVATE(self);
+ GError * error = NULL;
+
+ g_dbus_connection_emit_signal (priv->bus,
+ NULL,
+ SERVICE_OBJ,
+ SERVICE_IFACE,
+ "UpdateTime",
+ NULL,
+ &error);
+
+ if (error != NULL) {
+ g_error("Unable to send UpdateTime signal: %s", error->message);
+ g_error_free(error);
+ return;
+ }
+
+ return;
+}
=== added file 'src/datetime-interface.h'
--- src/datetime-interface.h 1970-01-01 00:00:00 +0000
+++ src/datetime-interface.h 2011-02-01 03:42:59 +0000
@@ -0,0 +1,57 @@
+/*
+An indicator to time and date related information in the menubar.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+ Ted Gould <ted@xxxxxxxxxxxxx>
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 3, as published
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranties of
+MERCHANTABILITY, SATISFACTORY QUALITY, 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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __DATETIME_INTERFACE_H__
+#define __DATETIME_INTERFACE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define DATETIME_INTERFACE_TYPE (datetime_interface_get_type ())
+#define DATETIME_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DATETIME_INTERFACE_TYPE, DatetimeInterface))
+#define DATETIME_INTERFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DATETIME_INTERFACE_TYPE, DatetimeInterfaceClass))
+#define IS_DATETIME_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DATETIME_INTERFACE_TYPE))
+#define IS_DATETIME_INTERFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DATETIME_INTERFACE_TYPE))
+#define DATETIME_INTERFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DATETIME_INTERFACE_TYPE, DatetimeInterfaceClass))
+
+typedef struct _DatetimeInterface DatetimeInterface;
+typedef struct _DatetimeInterfacePrivate DatetimeInterfacePrivate;
+typedef struct _DatetimeInterfaceClass DatetimeInterfaceClass;
+
+struct _DatetimeInterfaceClass {
+ GObjectClass parent_class;
+
+ void (*update_time) (void);
+};
+
+struct _DatetimeInterface {
+ GObject parent;
+ DatetimeInterfacePrivate * priv;
+};
+
+GType datetime_interface_get_type (void);
+void datetime_interface_update (DatetimeInterface *self);
+
+G_END_DECLS
+
+#endif
=== added file 'src/datetime-service.c'
--- src/datetime-service.c 1970-01-01 00:00:00 +0000
+++ src/datetime-service.c 2011-02-01 03:42:59 +0000
@@ -0,0 +1,547 @@
+/*
+An indicator to time and date related information in the menubar.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+ Ted Gould <ted@xxxxxxxxxxxxx>
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 3, as published
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranties of
+MERCHANTABILITY, SATISFACTORY QUALITY, 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 <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+#include <libindicator/indicator-service.h>
+#include <locale.h>
+
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
+#include <libdbusmenu-glib/server.h>
+#include <libdbusmenu-glib/client.h>
+#include <libdbusmenu-glib/menuitem.h>
+
+#include <geoclue/geoclue-master.h>
+#include <geoclue/geoclue-master-client.h>
+
+#include <oobs/oobs-timeconfig.h>
+
+#include "datetime-interface.h"
+#include "dbus-shared.h"
+
+static void geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * path, GError * error, gpointer user_data);
+static void setup_timer (void);
+
+static IndicatorService * service = NULL;
+static GMainLoop * mainloop = NULL;
+static DbusmenuServer * server = NULL;
+static DbusmenuMenuitem * root = NULL;
+static DatetimeInterface * dbus = NULL;
+static gchar * current_timezone = NULL;
+
+/* Global Items */
+static DbusmenuMenuitem * date = NULL;
+static DbusmenuMenuitem * calendar = NULL;
+static DbusmenuMenuitem * settings = NULL;
+static DbusmenuMenuitem * tzchange = NULL;
+
+/* Geoclue trackers */
+static GeoclueMasterClient * geo_master = NULL;
+static GeoclueAddress * geo_address = NULL;
+static gchar * geo_timezone = NULL;
+
+/* Check to see if our timezones are the same */
+static void
+check_timezone_sync (void) {
+ gboolean in_sync = FALSE;
+
+ if (geo_timezone == NULL) {
+ in_sync = TRUE;
+ }
+
+ if (current_timezone == NULL) {
+ in_sync = TRUE;
+ }
+
+ if (!in_sync && g_strcmp0(geo_timezone, current_timezone) == 0) {
+ in_sync = TRUE;
+ }
+
+ if (in_sync) {
+ g_debug("Timezones in sync");
+ } else {
+ g_debug("Timezones are different");
+ }
+
+ if (tzchange != NULL) {
+ if (in_sync) {
+ dbusmenu_menuitem_property_set_bool(tzchange, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
+ } else {
+ gchar * label = g_strdup_printf(_("Change timezone to: %s"), geo_timezone);
+
+ dbusmenu_menuitem_property_set(tzchange, DBUSMENU_MENUITEM_PROP_LABEL, label);
+ dbusmenu_menuitem_property_set_bool(tzchange, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
+
+ g_free(label);
+ }
+ }
+
+ return;
+}
+
+/* Update the current timezone */
+static void
+update_current_timezone (void) {
+ /* Clear old data */
+ if (current_timezone != NULL) {
+ g_free(current_timezone);
+ current_timezone = NULL;
+ }
+
+ GError * error = NULL;
+ gchar * tempzone = NULL;
+ if (!g_file_get_contents(TIMEZONE_FILE, &tempzone, NULL, &error)) {
+ g_warning("Unable to read timezone file '" TIMEZONE_FILE "': %s", error->message);
+ g_error_free(error);
+ return;
+ }
+
+ /* This shouldn't happen, so let's make it a big boom! */
+ g_return_if_fail(tempzone != NULL);
+
+ /* Note: this really makes sense as strstrip works in place
+ so we end up with something a little odd without the dup
+ so we have the dup to make sure everything is as expected
+ for everyone else. */
+ current_timezone = g_strdup(g_strstrip(tempzone));
+ g_free(tempzone);
+
+ g_debug("System timezone is: %s", current_timezone);
+
+ check_timezone_sync();
+
+ return;
+}
+
+/* See how our timezone setting went */
+static void
+quick_set_tz_cb (OobsObject * obj, OobsResult result, gpointer user_data)
+{
+ if (result == OOBS_RESULT_OK) {
+ g_debug("Timezone set");
+ } else {
+ g_warning("Unable to quick set timezone");
+ }
+ return;
+}
+
+/* Set the timezone to the Geoclue discovered one */
+static void
+quick_set_tz (DbusmenuMenuitem * menuitem, guint timestamp, const gchar *command)
+{
+ g_debug("Quick setting timezone to: %s", geo_timezone);
+
+ g_return_if_fail(geo_timezone != NULL);
+
+ OobsObject * obj = oobs_time_config_get();
+ g_return_if_fail(obj != NULL);
+
+ OobsTimeConfig * timeconfig = OOBS_TIME_CONFIG(obj);
+ oobs_time_config_set_timezone(timeconfig, geo_timezone);
+
+ oobs_object_commit_async(obj, quick_set_tz_cb, NULL);
+
+ return;
+}
+
+/* Updates the label in the date menuitem */
+static gboolean
+update_datetime (gpointer user_data)
+{
+ g_debug("Updating Date/Time");
+
+ gchar longstr[128];
+ time_t t;
+ struct tm *ltime;
+
+ t = time(NULL);
+ ltime = localtime(&t);
+ if (ltime == NULL) {
+ g_warning("Error getting local time");
+ dbusmenu_menuitem_property_set(date, DBUSMENU_MENUITEM_PROP_LABEL, _("Error getting time"));
+ return FALSE;
+ }
+
+ /* Note: may require some localization tweaks */
+ strftime(longstr, 128, "%A, %e %B %Y", ltime);
+
+ gchar * utf8 = g_locale_to_utf8(longstr, -1, NULL, NULL, NULL);
+ dbusmenu_menuitem_property_set(date, DBUSMENU_MENUITEM_PROP_LABEL, utf8);
+ g_free(utf8);
+
+ return FALSE;
+}
+
+/* Run a particular program based on an activation */
+static void
+activate_cb (DbusmenuMenuitem * menuitem, guint timestamp, const gchar *command)
+{
+ GError * error = NULL;
+
+ g_debug("Issuing command '%s'", command);
+ if (!g_spawn_command_line_async(command, &error)) {
+ g_warning("Unable to start %s: %s", (char *)command, error->message);
+ g_error_free(error);
+ }
+}
+
+/* Looks for the calendar application and enables the item if
+ we have one */
+static gboolean
+check_for_calendar (gpointer user_data)
+{
+ g_return_val_if_fail (calendar != NULL, FALSE);
+
+ gchar *evo = g_find_program_in_path("evolution");
+ if (evo != NULL) {
+ g_debug("Found the calendar application: %s", evo);
+ dbusmenu_menuitem_property_set_bool(calendar, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
+ dbusmenu_menuitem_property_set_bool(calendar, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
+ g_free(evo);
+ } else {
+ g_debug("Unable to find calendar app.");
+ dbusmenu_menuitem_property_set_bool(calendar, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
+ }
+
+ return FALSE;
+}
+
+/* Looks for the time and date admin application and enables the
+ item we have one */
+static gboolean
+check_for_timeadmin (gpointer user_data)
+{
+ g_return_val_if_fail (settings != NULL, FALSE);
+
+ gchar * timeadmin = g_find_program_in_path("time-admin");
+ if (timeadmin != NULL) {
+ g_debug("Found the time-admin application: %s", timeadmin);
+ dbusmenu_menuitem_property_set_bool(settings, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
+ g_free(timeadmin);
+ } else {
+ g_debug("Unable to find time-admin app.");
+ dbusmenu_menuitem_property_set_bool(settings, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
+ }
+
+ return FALSE;
+}
+
+/* Does the work to build the default menu, really calls out
+ to other functions but this is the core to clean up the
+ main function. */
+static void
+build_menus (DbusmenuMenuitem * root)
+{
+ g_debug("Building Menus.");
+ if (date == NULL) {
+ date = dbusmenu_menuitem_new();
+ dbusmenu_menuitem_property_set (date, DBUSMENU_MENUITEM_PROP_LABEL, _("No date yet..."));
+ dbusmenu_menuitem_property_set_bool(date, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
+ dbusmenu_menuitem_child_append(root, date);
+
+ g_idle_add(update_datetime, NULL);
+ }
+
+ if (calendar == NULL) {
+ calendar = dbusmenu_menuitem_new();
+ dbusmenu_menuitem_property_set (calendar, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CALENDAR_MENUITEM_TYPE);
+ /* insensitive until we check for available apps */
+ dbusmenu_menuitem_property_set_bool(calendar, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
+ g_signal_connect (G_OBJECT(calendar), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
+ G_CALLBACK (activate_cb), "evolution -c calendar");
+ dbusmenu_menuitem_child_append(root, calendar);
+
+ g_idle_add(check_for_calendar, NULL);
+ }
+
+ DbusmenuMenuitem * separator = dbusmenu_menuitem_new();
+ dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR);
+ dbusmenu_menuitem_child_append(root, separator);
+
+ tzchange = dbusmenu_menuitem_new();
+ dbusmenu_menuitem_property_set(tzchange, DBUSMENU_MENUITEM_PROP_LABEL, "Set specific timezone");
+ dbusmenu_menuitem_property_set_bool(tzchange, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
+ g_signal_connect(G_OBJECT(tzchange), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(quick_set_tz), NULL);
+ dbusmenu_menuitem_child_append(root, tzchange);
+ check_timezone_sync();
+
+ settings = dbusmenu_menuitem_new();
+ dbusmenu_menuitem_property_set (settings, DBUSMENU_MENUITEM_PROP_LABEL, _("Time & Date Settings..."));
+ /* insensitive until we check for available apps */
+ dbusmenu_menuitem_property_set_bool(settings, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
+ g_signal_connect(G_OBJECT(settings), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), "time-admin");
+ dbusmenu_menuitem_child_append(root, settings);
+ g_idle_add(check_for_timeadmin, NULL);
+
+ return;
+}
+
+/* Run when the timezone file changes */
+static void
+timezone_changed (GFileMonitor * monitor, GFile * file, GFile * otherfile, GFileMonitorEvent event, gpointer user_data)
+{
+ update_current_timezone();
+ datetime_interface_update(DATETIME_INTERFACE(user_data));
+ update_datetime(NULL);
+ setup_timer();
+ return;
+}
+
+/* Set up monitoring the timezone file */
+static void
+build_timezone (DatetimeInterface * dbus)
+{
+ GFile * timezonefile = g_file_new_for_path(TIMEZONE_FILE);
+ GFileMonitor * monitor = g_file_monitor_file(timezonefile, G_FILE_MONITOR_NONE, NULL, NULL);
+ if (monitor != NULL) {
+ g_signal_connect(G_OBJECT(monitor), "changed", G_CALLBACK(timezone_changed), dbus);
+ g_debug("Monitoring timezone file: '" TIMEZONE_FILE "'");
+ } else {
+ g_warning("Unable to monitor timezone file: '" TIMEZONE_FILE "'");
+ }
+ return;
+}
+
+/* Source ID for the timer */
+static guint timer = 0;
+
+/* Execute at a given time, update and setup a new
+ timer to go again. */
+static gboolean
+timer_func (gpointer user_data)
+{
+ timer = 0;
+ /* Reset up each time to reduce error */
+ setup_timer();
+ update_datetime(NULL);
+ return FALSE;
+}
+
+/* Sets up the time to launch the timer to update the
+ date in the datetime entry */
+static void
+setup_timer (void)
+{
+ if (timer != 0) {
+ g_source_remove(timer);
+ timer = 0;
+ }
+
+ time_t t;
+ t = time(NULL);
+ struct tm * ltime = localtime(&t);
+
+ timer = g_timeout_add_seconds(((23 - ltime->tm_hour) * 60 * 60) +
+ ((59 - ltime->tm_min) * 60) +
+ ((60 - ltime->tm_sec)) + 60 /* one minute past */,
+ timer_func, NULL);
+
+ return;
+}
+
+/* Callback from getting the address */
+static void
+geo_address_cb (GeoclueAddress * address, int timestamp, GHashTable * addy_data, GeoclueAccuracy * accuracy, GError * error, gpointer user_data)
+{
+ if (error != NULL) {
+ g_warning("Unable to get Geoclue address: %s", error->message);
+ return;
+ }
+
+ g_debug("Geoclue timezone is: %s", (gchar *)g_hash_table_lookup(addy_data, "timezone"));
+
+ if (geo_timezone != NULL) {
+ g_free(geo_timezone);
+ geo_timezone = NULL;
+ }
+
+ gpointer tz_hash = g_hash_table_lookup(addy_data, "timezone");
+ if (tz_hash != NULL) {
+ geo_timezone = g_strdup((gchar *)tz_hash);
+ }
+
+ check_timezone_sync();
+
+ return;
+}
+
+/* Callback from creating the address */
+static void
+geo_create_address (GeoclueMasterClient * master, GeoclueAddress * address, GError * error, gpointer user_data)
+{
+ if (error != NULL) {
+ g_warning("Unable to create GeoClue address: %s", error->message);
+ return;
+ }
+
+ g_debug("Created Geoclue Address");
+ geo_address = address;
+ g_object_ref(G_OBJECT(geo_address));
+
+ geoclue_address_get_address_async(geo_address, geo_address_cb, NULL);
+
+ g_signal_connect(G_OBJECT(address), "address-changed", G_CALLBACK(geo_address_cb), NULL);
+
+ return;
+}
+
+/* Callback from setting requirements */
+static void
+geo_req_set (GeoclueMasterClient * master, GError * error, gpointer user_data)
+{
+ if (error != NULL) {
+ g_warning("Unable to set Geoclue requirements: %s", error->message);
+ }
+ return;
+}
+
+/* Client is killing itself rather oddly */
+static void
+geo_client_invalid (GeoclueMasterClient * client, gpointer user_data)
+{
+ g_warning("Master client invalid, rebuilding.");
+
+ if (geo_master != NULL) {
+ g_object_unref(G_OBJECT(geo_master));
+ }
+ geo_master = NULL;
+
+ GeoclueMaster * master = geoclue_master_get_default();
+ geoclue_master_create_client_async(master, geo_create_client, NULL);
+
+ if (geo_timezone != NULL) {
+ g_free(geo_timezone);
+ geo_timezone = NULL;
+ }
+
+ check_timezone_sync();
+
+ return;
+}
+
+/* Address provider changed, we need to get that one */
+static void
+geo_address_change (GeoclueMasterClient * client, gchar * a, gchar * b, gchar * c, gchar * d, gpointer user_data)
+{
+ g_warning("Address provider changed. Let's change");
+
+ if (geo_address != NULL) {
+ g_object_unref(G_OBJECT(geo_address));
+ }
+ geo_address = NULL;
+
+ geoclue_master_client_create_address_async(geo_master, geo_create_address, NULL);
+
+ if (geo_timezone != NULL) {
+ g_free(geo_timezone);
+ geo_timezone = NULL;
+ }
+
+ check_timezone_sync();
+
+ return;
+}
+
+/* Callback from creating the client */
+static void
+geo_create_client (GeoclueMaster * master, GeoclueMasterClient * client, gchar * path, GError * error, gpointer user_data)
+{
+ g_debug("Created Geoclue client at: %s", path);
+
+ geo_master = client;
+ g_object_ref(G_OBJECT(geo_master));
+
+ geoclue_master_client_set_requirements_async(geo_master,
+ GEOCLUE_ACCURACY_LEVEL_REGION,
+ 0,
+ FALSE,
+ GEOCLUE_RESOURCE_ALL,
+ geo_req_set,
+ NULL);
+
+ geoclue_master_client_create_address_async(geo_master, geo_create_address, NULL);
+
+ g_signal_connect(G_OBJECT(client), "invalidated", G_CALLBACK(geo_client_invalid), NULL);
+ g_signal_connect(G_OBJECT(client), "address-provider-changed", G_CALLBACK(geo_address_change), NULL);
+
+ return;
+}
+
+/* Repsonds to the service object saying it's time to shutdown.
+ It stops the mainloop. */
+static void
+service_shutdown (IndicatorService * service, gpointer user_data)
+{
+ g_warning("Shutting down service!");
+ g_main_loop_quit(mainloop);
+ return;
+}
+
+/* Function to build everything up. Entry point from asm. */
+int
+main (int argc, char ** argv)
+{
+ g_type_init();
+
+ /* Acknowledging the service init and setting up the interface */
+ service = indicator_service_new_version(SERVICE_NAME, SERVICE_VERSION);
+ g_signal_connect(service, INDICATOR_SERVICE_SIGNAL_SHUTDOWN, G_CALLBACK(service_shutdown), NULL);
+
+ /* Setting up i18n and gettext. Apparently, we need
+ all of these. */
+ setlocale (LC_ALL, "");
+ bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
+ textdomain (GETTEXT_PACKAGE);
+
+ /* Cache the timezone */
+ update_current_timezone();
+
+ /* Building the base menu */
+ server = dbusmenu_server_new(MENU_OBJ);
+ root = dbusmenu_menuitem_new();
+ dbusmenu_server_set_root(server, root);
+ build_menus(root);
+
+ /* Setup geoclue */
+ GeoclueMaster * master = geoclue_master_get_default();
+ geoclue_master_create_client_async(master, geo_create_client, NULL);
+
+ /* Setup dbus interface */
+ dbus = g_object_new(DATETIME_INTERFACE_TYPE, NULL);
+
+ /* Setup timezone watch */
+ build_timezone(dbus);
+
+ /* Setup the timer */
+ setup_timer();
+
+ mainloop = g_main_loop_new(NULL, FALSE);
+ g_main_loop_run(mainloop);
+
+ g_object_unref(G_OBJECT(master));
+ g_object_unref(G_OBJECT(dbus));
+ g_object_unref(G_OBJECT(service));
+ g_object_unref(G_OBJECT(server));
+ g_object_unref(G_OBJECT(root));
+
+ return 0;
+}
=== added file 'src/datetime-service.xml'
--- src/datetime-service.xml 1970-01-01 00:00:00 +0000
+++ src/datetime-service.xml 2011-02-01 03:42:59 +0000
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<node name="/">
+ <interface name="com.canonical.indicator.datetime.service">
+
+<!-- Methods -->
+
+<!-- Signals -->
+ <signal name="UpdateTime" />
+
+ </interface>
+</node>
=== added file 'src/dbus-shared.h'
--- src/dbus-shared.h 1970-01-01 00:00:00 +0000
+++ src/dbus-shared.h 2011-02-01 03:42:59 +0000
@@ -0,0 +1,31 @@
+/*
+An indicator to show date and time information.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+ Ted Gould <ted@xxxxxxxxxxxxx>
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 3, as published
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranties of
+MERCHANTABILITY, SATISFACTORY QUALITY, 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 <http://www.gnu.org/licenses/>.
+*/
+
+
+#define SERVICE_NAME "com.canonical.indicator.datetime"
+#define SERVICE_IFACE "com.canonical.indicator.datetime.service"
+#define SERVICE_OBJ "/com/canonical/indicator/datetime/service"
+#define SERVICE_VERSION 1
+
+#define MENU_OBJ "/com/canonical/indicator/datetime/menu"
+
+#define DBUSMENU_CALENDAR_MENUITEM_TYPE "x-canonical-calendar-item"
+
=== added file 'src/indicator-datetime.c'
--- src/indicator-datetime.c 1970-01-01 00:00:00 +0000
+++ src/indicator-datetime.c 2011-02-01 03:42:59 +0000
@@ -0,0 +1,1126 @@
+/*
+An indicator to time and date related information in the menubar.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+ Ted Gould <ted@xxxxxxxxxxxxx>
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 3, as published
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranties of
+MERCHANTABILITY, SATISFACTORY QUALITY, 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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <locale.h>
+#include <langinfo.h>
+#include <string.h>
+
+/* GStuff */
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n-lib.h>
+#include <gio/gio.h>
+
+/* Indicator Stuff */
+#include <libindicator/indicator.h>
+#include <libindicator/indicator-object.h>
+#include <libindicator/indicator-service-manager.h>
+
+/* DBusMenu */
+#include <libdbusmenu-gtk/menu.h>
+#include <libido/idocalendarmenuitem.h>
+
+#include "dbus-shared.h"
+
+
+#define INDICATOR_DATETIME_TYPE (indicator_datetime_get_type ())
+#define INDICATOR_DATETIME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INDICATOR_DATETIME_TYPE, IndicatorDatetime))
+#define INDICATOR_DATETIME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), INDICATOR_DATETIME_TYPE, IndicatorDatetimeClass))
+#define IS_INDICATOR_DATETIME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), INDICATOR_DATETIME_TYPE))
+#define IS_INDICATOR_DATETIME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), INDICATOR_DATETIME_TYPE))
+#define INDICATOR_DATETIME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), INDICATOR_DATETIME_TYPE, IndicatorDatetimeClass))
+
+typedef struct _IndicatorDatetime IndicatorDatetime;
+typedef struct _IndicatorDatetimeClass IndicatorDatetimeClass;
+typedef struct _IndicatorDatetimePrivate IndicatorDatetimePrivate;
+
+struct _IndicatorDatetimeClass {
+ IndicatorObjectClass parent_class;
+};
+
+struct _IndicatorDatetime {
+ IndicatorObject parent;
+ IndicatorDatetimePrivate * priv;
+};
+
+struct _IndicatorDatetimePrivate {
+ GtkLabel * label;
+ guint timer;
+
+ gchar * time_string;
+
+ gint time_mode;
+ gboolean show_seconds;
+ gboolean show_date;
+ gboolean show_day;
+ gchar * custom_string;
+ gboolean custom_show_seconds;
+
+ guint idle_measure;
+ gint max_width;
+
+ IndicatorServiceManager * sm;
+ DbusmenuGtkMenu * menu;
+
+ GCancellable * service_proxy_cancel;
+ GDBusProxy * service_proxy;
+ IdoCalendarMenuItem *ido_calendar;
+
+ GSettings * settings;
+};
+
+/* Enum for the properties so that they can be quickly
+ found and looked up. */
+enum {
+ PROP_0,
+ PROP_TIME_FORMAT,
+ PROP_SHOW_SECONDS,
+ PROP_SHOW_DAY,
+ PROP_SHOW_DATE,
+ PROP_CUSTOM_TIME_FORMAT
+};
+
+#define PROP_TIME_FORMAT_S "time-format"
+#define PROP_SHOW_SECONDS_S "show-seconds"
+#define PROP_SHOW_DAY_S "show-day"
+#define PROP_SHOW_DATE_S "show-date"
+#define PROP_CUSTOM_TIME_FORMAT_S "custom-time-format"
+
+#define SETTINGS_INTERFACE "com.canonical.indicator.datetime"
+#define SETTINGS_TIME_FORMAT_S "time-format"
+#define SETTINGS_SHOW_SECONDS_S "show-seconds"
+#define SETTINGS_SHOW_DAY_S "show-day"
+#define SETTINGS_SHOW_DATE_S "show-date"
+#define SETTINGS_CUSTOM_TIME_FORMAT_S "custom-time-format"
+
+enum {
+ SETTINGS_TIME_LOCALE = 0,
+ SETTINGS_TIME_12_HOUR = 1,
+ SETTINGS_TIME_24_HOUR = 2,
+ SETTINGS_TIME_CUSTOM = 3
+};
+
+/* TRANSLATORS: A format string for the strftime function for
+ a clock showing 12-hour time without seconds. */
+#define DEFAULT_TIME_12_FORMAT N_("%l:%M %p")
+
+/* TRANSLATORS: A format string for the strftime function for
+ a clock showing 24-hour time without seconds. */
+#define DEFAULT_TIME_24_FORMAT N_("%H:%M")
+
+#define DEFAULT_TIME_FORMAT DEFAULT_TIME_12_FORMAT
+
+#define INDICATOR_DATETIME_GET_PRIVATE(o) \
+(G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_DATETIME_TYPE, IndicatorDatetimePrivate))
+
+enum {
+ STRFTIME_MASK_NONE = 0, /* Hours or minutes as we always test those */
+ STRFTIME_MASK_SECONDS = 1 << 0, /* Seconds count */
+ STRFTIME_MASK_AMPM = 1 << 1, /* AM/PM counts */
+ STRFTIME_MASK_WEEK = 1 << 2, /* Day of the week maters (Sat, Sun, etc.) */
+ STRFTIME_MASK_DAY = 1 << 3, /* Day of the month counts (Feb 1st) */
+ STRFTIME_MASK_MONTH = 1 << 4, /* Which month matters */
+ STRFTIME_MASK_YEAR = 1 << 5, /* Which year matters */
+ /* Last entry, combines all previous */
+ STRFTIME_MASK_ALL = (STRFTIME_MASK_SECONDS | STRFTIME_MASK_AMPM | STRFTIME_MASK_WEEK | STRFTIME_MASK_DAY | STRFTIME_MASK_MONTH | STRFTIME_MASK_YEAR)
+};
+
+GType indicator_datetime_get_type (void);
+
+static void indicator_datetime_class_init (IndicatorDatetimeClass *klass);
+static void indicator_datetime_init (IndicatorDatetime *self);
+static void set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec);
+static void get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec);
+static void indicator_datetime_dispose (GObject *object);
+static void indicator_datetime_finalize (GObject *object);
+static GtkLabel * get_label (IndicatorObject * io);
+static GtkMenu * get_menu (IndicatorObject * io);
+static GVariant * bind_enum_set (const GValue * value, const GVariantType * type, gpointer user_data);
+static gboolean bind_enum_get (GValue * value, GVariant * variant, gpointer user_data);
+static gchar * generate_format_string (IndicatorDatetime * self);
+static struct tm * update_label (IndicatorDatetime * io);
+static void guess_label_size (IndicatorDatetime * self);
+static void setup_timer (IndicatorDatetime * self, struct tm * ltime);
+static void update_time (IndicatorDatetime * self);
+static void receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, GVariant * parameters, gpointer user_data);
+static void service_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data);
+static gint generate_strftime_bitmask (const char *time_str);
+
+/* Indicator Module Config */
+INDICATOR_SET_VERSION
+INDICATOR_SET_TYPE(INDICATOR_DATETIME_TYPE)
+
+G_DEFINE_TYPE (IndicatorDatetime, indicator_datetime, INDICATOR_OBJECT_TYPE);
+
+static void
+indicator_datetime_class_init (IndicatorDatetimeClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (IndicatorDatetimePrivate));
+
+ object_class->dispose = indicator_datetime_dispose;
+ object_class->finalize = indicator_datetime_finalize;
+
+ object_class->set_property = set_property;
+ object_class->get_property = get_property;
+
+ IndicatorObjectClass * io_class = INDICATOR_OBJECT_CLASS(klass);
+
+ io_class->get_label = get_label;
+ io_class->get_menu = get_menu;
+
+ g_object_class_install_property (object_class,
+ PROP_TIME_FORMAT,
+ g_param_spec_int(PROP_TIME_FORMAT_S,
+ "A choice of which format should be used on the panel",
+ "Chooses between letting the locale choose the time, 12-hour time, 24-time or using the custom string passed to strftime().",
+ SETTINGS_TIME_LOCALE, /* min */
+ SETTINGS_TIME_CUSTOM, /* max */
+ SETTINGS_TIME_LOCALE, /* default */
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_SHOW_SECONDS,
+ g_param_spec_boolean(PROP_SHOW_SECONDS_S,
+ "Whether to show seconds in the indicator.",
+ "Shows seconds along with the time in the indicator. Also effects refresh interval.",
+ FALSE, /* default */
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_SHOW_DAY,
+ g_param_spec_boolean(PROP_SHOW_DAY_S,
+ "Whether to show the day of the week in the indicator.",
+ "Shows the day of the week along with the time in the indicator.",
+ FALSE, /* default */
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_SHOW_DATE,
+ g_param_spec_boolean(PROP_SHOW_DATE_S,
+ "Whether to show the day and month in the indicator.",
+ "Shows the day and month along with the time in the indicator.",
+ FALSE, /* default */
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_CUSTOM_TIME_FORMAT,
+ g_param_spec_string(PROP_CUSTOM_TIME_FORMAT_S,
+ "The format that is used to show the time on the panel.",
+ "A format string in the form used to pass to strftime to make a string for displaying on the panel.",
+ DEFAULT_TIME_FORMAT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ return;
+}
+
+static void
+indicator_datetime_init (IndicatorDatetime *self)
+{
+ self->priv = INDICATOR_DATETIME_GET_PRIVATE(self);
+
+ self->priv->label = NULL;
+ self->priv->timer = 0;
+
+ self->priv->idle_measure = 0;
+ self->priv->max_width = 0;
+
+ self->priv->time_mode = SETTINGS_TIME_LOCALE;
+ self->priv->show_seconds = FALSE;
+ self->priv->show_date = FALSE;
+ self->priv->show_day = FALSE;
+ self->priv->custom_string = g_strdup(DEFAULT_TIME_FORMAT);
+ self->priv->custom_show_seconds = FALSE;
+
+ self->priv->time_string = generate_format_string(self);
+
+ self->priv->service_proxy = NULL;
+
+ self->priv->sm = NULL;
+ self->priv->menu = NULL;
+
+ self->priv->settings = g_settings_new(SETTINGS_INTERFACE);
+ if (self->priv->settings != NULL) {
+ g_settings_bind_with_mapping(self->priv->settings,
+ SETTINGS_TIME_FORMAT_S,
+ self,
+ PROP_TIME_FORMAT_S,
+ G_SETTINGS_BIND_DEFAULT,
+ bind_enum_get,
+ bind_enum_set,
+ NULL, NULL); /* Userdata and destroy func */
+ g_settings_bind(self->priv->settings,
+ SETTINGS_SHOW_SECONDS_S,
+ self,
+ PROP_SHOW_SECONDS_S,
+ G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind(self->priv->settings,
+ SETTINGS_SHOW_DAY_S,
+ self,
+ PROP_SHOW_DAY_S,
+ G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind(self->priv->settings,
+ SETTINGS_SHOW_DATE_S,
+ self,
+ PROP_SHOW_DATE_S,
+ G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind(self->priv->settings,
+ SETTINGS_CUSTOM_TIME_FORMAT_S,
+ self,
+ PROP_CUSTOM_TIME_FORMAT_S,
+ G_SETTINGS_BIND_DEFAULT);
+ } else {
+ g_warning("Unable to get settings for '" SETTINGS_INTERFACE "'");
+ }
+
+ self->priv->sm = indicator_service_manager_new_version(SERVICE_NAME, SERVICE_VERSION);
+
+ self->priv->service_proxy_cancel = g_cancellable_new();
+
+ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ SERVICE_NAME,
+ SERVICE_OBJ,
+ SERVICE_IFACE,
+ self->priv->service_proxy_cancel,
+ service_proxy_cb,
+ self);
+
+ return;
+}
+
+/* Callback from trying to create the proxy for the serivce, this
+ could include starting the service. Sometime it'll fail and
+ we'll try to start that dang service again! */
+static void
+service_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data)
+{
+ GError * error = NULL;
+
+ IndicatorDatetime * self = INDICATOR_DATETIME(user_data);
+ g_return_if_fail(self != NULL);
+
+ GDBusProxy * proxy = g_dbus_proxy_new_for_bus_finish(res, &error);
+
+ IndicatorDatetimePrivate * priv = INDICATOR_DATETIME_GET_PRIVATE(self);
+
+ if (priv->service_proxy_cancel != NULL) {
+ g_object_unref(priv->service_proxy_cancel);
+ priv->service_proxy_cancel = NULL;
+ }
+
+ if (error != NULL) {
+ g_warning("Could not grab DBus proxy for %s: %s", SERVICE_NAME, error->message);
+ g_error_free(error);
+ return;
+ }
+
+ /* Okay, we're good to grab the proxy at this point, we're
+ sure that it's ours. */
+ priv->service_proxy = proxy;
+
+ g_signal_connect(proxy, "g-signal", G_CALLBACK(receive_signal), self);
+
+ return;
+}
+
+static void
+indicator_datetime_dispose (GObject *object)
+{
+ IndicatorDatetime * self = INDICATOR_DATETIME(object);
+
+ if (self->priv->label != NULL) {
+ g_object_unref(self->priv->label);
+ self->priv->label = NULL;
+ }
+
+ if (self->priv->timer != 0) {
+ g_source_remove(self->priv->timer);
+ self->priv->timer = 0;
+ }
+
+ if (self->priv->idle_measure != 0) {
+ g_source_remove(self->priv->idle_measure);
+ self->priv->idle_measure = 0;
+ }
+
+ if (self->priv->menu != NULL) {
+ g_object_unref(G_OBJECT(self->priv->menu));
+ self->priv->menu = NULL;
+ }
+
+ if (self->priv->sm != NULL) {
+ g_object_unref(G_OBJECT(self->priv->sm));
+ self->priv->sm = NULL;
+ }
+
+ if (self->priv->settings != NULL) {
+ g_object_unref(G_OBJECT(self->priv->settings));
+ self->priv->settings = NULL;
+ }
+
+ if (self->priv->service_proxy != NULL) {
+ g_object_unref(self->priv->service_proxy);
+ self->priv->service_proxy = NULL;
+ }
+
+ G_OBJECT_CLASS (indicator_datetime_parent_class)->dispose (object);
+ return;
+}
+
+static void
+indicator_datetime_finalize (GObject *object)
+{
+ IndicatorDatetime * self = INDICATOR_DATETIME(object);
+
+ if (self->priv->time_string != NULL) {
+ g_free(self->priv->time_string);
+ self->priv->time_string = NULL;
+ }
+
+ if (self->priv->custom_string != NULL) {
+ g_free(self->priv->custom_string);
+ self->priv->custom_string = NULL;
+ }
+
+ G_OBJECT_CLASS (indicator_datetime_parent_class)->finalize (object);
+ return;
+}
+
+/* Turns the int value into a string GVariant */
+static GVariant *
+bind_enum_set (const GValue * value, const GVariantType * type, gpointer user_data)
+{
+ switch (g_value_get_int(value)) {
+ case SETTINGS_TIME_LOCALE:
+ return g_variant_new_string("locale-default");
+ case SETTINGS_TIME_12_HOUR:
+ return g_variant_new_string("12-hour");
+ case SETTINGS_TIME_24_HOUR:
+ return g_variant_new_string("24-hour");
+ case SETTINGS_TIME_CUSTOM:
+ return g_variant_new_string("custom");
+ default:
+ return NULL;
+ }
+}
+
+/* Turns a string GVariant into an int value */
+static gboolean
+bind_enum_get (GValue * value, GVariant * variant, gpointer user_data)
+{
+ const gchar * str = g_variant_get_string(variant, NULL);
+ gint output = 0;
+
+ if (g_strcmp0(str, "locale-default") == 0) {
+ output = SETTINGS_TIME_LOCALE;
+ } else if (g_strcmp0(str, "12-hour") == 0) {
+ output = SETTINGS_TIME_12_HOUR;
+ } else if (g_strcmp0(str, "24-hour") == 0) {
+ output = SETTINGS_TIME_24_HOUR;
+ } else if (g_strcmp0(str, "custom") == 0) {
+ output = SETTINGS_TIME_CUSTOM;
+ } else {
+ return FALSE;
+ }
+
+ g_value_set_int(value, output);
+ return TRUE;
+}
+
+/* Sets a property on the object */
+static void
+set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ IndicatorDatetime * self = INDICATOR_DATETIME(object);
+ gboolean update = FALSE;
+
+ switch(prop_id) {
+ case PROP_TIME_FORMAT: {
+ gint newval = g_value_get_int(value);
+ if (newval != self->priv->time_mode) {
+ update = TRUE;
+ self->priv->time_mode = newval;
+ setup_timer(self, NULL);
+ }
+ break;
+ }
+ case PROP_SHOW_SECONDS:
+ if (g_value_get_boolean(value) != self->priv->show_seconds) {
+ self->priv->show_seconds = !self->priv->show_seconds;
+ if (self->priv->time_mode != SETTINGS_TIME_CUSTOM) {
+ update = TRUE;
+ setup_timer(self, NULL);
+ }
+ }
+ break;
+ case PROP_SHOW_DAY:
+ if (g_value_get_boolean(value) != self->priv->show_day) {
+ self->priv->show_day = !self->priv->show_day;
+ if (self->priv->time_mode != SETTINGS_TIME_CUSTOM) {
+ update = TRUE;
+ }
+ }
+ break;
+ case PROP_SHOW_DATE:
+ if (g_value_get_boolean(value) != self->priv->show_date) {
+ self->priv->show_date = !self->priv->show_date;
+ if (self->priv->time_mode != SETTINGS_TIME_CUSTOM) {
+ update = TRUE;
+ }
+ }
+ break;
+ case PROP_CUSTOM_TIME_FORMAT: {
+ const gchar * newstr = g_value_get_string(value);
+ if (g_strcmp0(newstr, self->priv->custom_string) != 0) {
+ if (self->priv->custom_string != NULL) {
+ g_free(self->priv->custom_string);
+ self->priv->custom_string = NULL;
+ }
+ self->priv->custom_string = g_strdup(newstr);
+ gint time_mask = generate_strftime_bitmask(newstr);
+ self->priv->custom_show_seconds = (time_mask & STRFTIME_MASK_SECONDS);
+ if (self->priv->time_mode == SETTINGS_TIME_CUSTOM) {
+ update = TRUE;
+ setup_timer(self, NULL);
+ }
+ }
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ return;
+ }
+
+ if (!update) {
+ return;
+ }
+
+ /* Get the new format string */
+ gchar * newformat = generate_format_string(self);
+
+ /* check to ensure the format really changed */
+ if (g_strcmp0(self->priv->time_string, newformat) == 0) {
+ g_free(newformat);
+ return;
+ }
+
+ /* Okay now process the change */
+ if (self->priv->time_string != NULL) {
+ g_free(self->priv->time_string);
+ self->priv->time_string = NULL;
+ }
+ self->priv->time_string = newformat;
+
+ /* And update everything */
+ update_label(self);
+ guess_label_size(self);
+
+ return;
+}
+
+/* Gets a property from the object */
+static void
+get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ IndicatorDatetime * self = INDICATOR_DATETIME(object);
+
+ switch(prop_id) {
+ case PROP_TIME_FORMAT:
+ g_value_set_int(value, self->priv->time_mode);
+ break;
+ case PROP_SHOW_SECONDS:
+ g_value_set_boolean(value, self->priv->show_seconds);
+ break;
+ case PROP_SHOW_DAY:
+ g_value_set_boolean(value, self->priv->show_day);
+ break;
+ case PROP_SHOW_DATE:
+ g_value_set_boolean(value, self->priv->show_date);
+ break;
+ case PROP_CUSTOM_TIME_FORMAT:
+ g_value_set_string(value, self->priv->custom_string);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ return;
+ }
+
+ return;
+}
+
+/* Looks at the size of the label, if it grew beyond what we
+ thought was the max, make sure it doesn't shrink again. */
+static gboolean
+idle_measure (gpointer data)
+{
+ IndicatorDatetime * self = INDICATOR_DATETIME(data);
+ self->priv->idle_measure = 0;
+
+ GtkAllocation allocation;
+ gtk_widget_get_allocation(GTK_WIDGET(self->priv->label), &allocation);
+
+ if (allocation.width > self->priv->max_width) {
+ if (self->priv->max_width != 0) {
+ g_warning("Guessed wrong. We thought the max would be %d but we're now at %d", self->priv->max_width, allocation.width);
+ }
+ self->priv->max_width = allocation.width;
+ gtk_widget_set_size_request(GTK_WIDGET(self->priv->label), self->priv->max_width, -1);
+ }
+
+ return FALSE;
+}
+
+/* Updates the label to be the current time. */
+static struct tm *
+update_label (IndicatorDatetime * io)
+{
+ IndicatorDatetime * self = INDICATOR_DATETIME(io);
+
+ if (self->priv->label == NULL) return NULL;
+
+ gchar longstr[256];
+ time_t t;
+ struct tm *ltime;
+ gboolean use_markup;
+
+ t = time(NULL);
+ ltime = localtime(&t);
+ if (ltime == NULL) {
+ g_debug("Error getting local time");
+ gtk_label_set_label(self->priv->label, _("Error getting time"));
+ return NULL;
+ }
+
+ strftime(longstr, 256, self->priv->time_string, ltime);
+
+ gchar * utf8 = g_locale_to_utf8(longstr, -1, NULL, NULL, NULL);
+
+ if (pango_parse_markup(utf8, -1, 0, NULL, NULL, NULL, NULL))
+ use_markup = TRUE;
+
+ if (use_markup)
+ gtk_label_set_markup(self->priv->label, utf8);
+ else
+ gtk_label_set_text(self->priv->label, utf8);
+
+ g_free(utf8);
+
+ if (self->priv->idle_measure == 0) {
+ self->priv->idle_measure = g_idle_add(idle_measure, io);
+ }
+
+ return ltime;
+}
+
+/* Update the time right now. Usually the result of a timezone switch. */
+static void
+update_time (IndicatorDatetime * self)
+{
+ struct tm * ltime = update_label(self);
+ setup_timer(self, ltime);
+ return;
+}
+
+/* Receives all signals from the service, routed to the appropriate functions */
+static void
+receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name,
+ GVariant * parameters, gpointer user_data)
+{
+ IndicatorDatetime * self = INDICATOR_DATETIME(user_data);
+
+ if (g_strcmp0(signal_name, "UpdateTime") == 0) {
+ update_time(self);
+ }
+
+ return;
+}
+
+/* Runs every minute and updates the time */
+gboolean
+timer_func (gpointer user_data)
+{
+ IndicatorDatetime * self = INDICATOR_DATETIME(user_data);
+ self->priv->timer = 0;
+ struct tm * ltime = update_label(self);
+ setup_timer(self, ltime);
+ return FALSE;
+}
+
+/* Configure the timer to run the next time through */
+static void
+setup_timer (IndicatorDatetime * self, struct tm * ltime)
+{
+ if (self->priv->timer != 0) {
+ g_source_remove(self->priv->timer);
+ self->priv->timer = 0;
+ }
+
+ if (self->priv->show_seconds ||
+ (self->priv->time_mode == SETTINGS_TIME_CUSTOM && self->priv->custom_show_seconds)) {
+ self->priv->timer = g_timeout_add_seconds(1, timer_func, self);
+ } else {
+ if (ltime == NULL) {
+ time_t t;
+ t = time(NULL);
+ ltime = localtime(&t);
+ }
+
+ /* Plus 2 so we're just after the minute, don't want to be early. */
+ self->priv->timer = g_timeout_add_seconds(60 - ltime->tm_sec + 2, timer_func, self);
+ }
+
+ return;
+}
+
+/* Does a quick meausre of how big the string is in
+ pixels with a Pango layout */
+static gint
+measure_string (GtkStyle * style, PangoContext * context, const gchar * string)
+{
+ PangoLayout * layout = pango_layout_new(context);
+
+ if (pango_parse_markup(string, -1, 0, NULL, NULL, NULL, NULL))
+ pango_layout_set_markup(layout, string, -1);
+ else
+ pango_layout_set_text(layout, string, -1);
+
+ pango_layout_set_font_description(layout, style->font_desc);
+
+ gint width;
+ pango_layout_get_pixel_size(layout, &width, NULL);
+ g_object_unref(layout);
+ return width;
+}
+
+/* Format for the table of strftime() modifiers to what
+ we need to check when determining the length */
+typedef struct _strftime_type_t strftime_type_t;
+struct _strftime_type_t {
+ char character;
+ gint mask;
+};
+
+/* A table taken from the man page of strftime to what the different
+ characters can effect. These are worst case in that we need to
+ test the length based on all these things to ensure that we have
+ a reasonable string lenght measurement. */
+const static strftime_type_t strftime_type[] = {
+ {'a', STRFTIME_MASK_WEEK},
+ {'A', STRFTIME_MASK_WEEK},
+ {'b', STRFTIME_MASK_MONTH},
+ {'B', STRFTIME_MASK_MONTH},
+ {'c', STRFTIME_MASK_ALL}, /* We don't know, so we have to assume all */
+ {'C', STRFTIME_MASK_YEAR},
+ {'d', STRFTIME_MASK_MONTH},
+ {'D', STRFTIME_MASK_MONTH | STRFTIME_MASK_YEAR | STRFTIME_MASK_DAY},
+ {'e', STRFTIME_MASK_DAY},
+ {'F', STRFTIME_MASK_MONTH | STRFTIME_MASK_YEAR | STRFTIME_MASK_DAY},
+ {'G', STRFTIME_MASK_YEAR},
+ {'g', STRFTIME_MASK_YEAR},
+ {'h', STRFTIME_MASK_MONTH},
+ {'j', STRFTIME_MASK_DAY},
+ {'m', STRFTIME_MASK_MONTH},
+ {'p', STRFTIME_MASK_AMPM},
+ {'P', STRFTIME_MASK_AMPM},
+ {'r', STRFTIME_MASK_AMPM},
+ {'s', STRFTIME_MASK_SECONDS},
+ {'S', STRFTIME_MASK_SECONDS},
+ {'T', STRFTIME_MASK_SECONDS},
+ {'u', STRFTIME_MASK_WEEK},
+ {'U', STRFTIME_MASK_DAY | STRFTIME_MASK_MONTH},
+ {'V', STRFTIME_MASK_DAY | STRFTIME_MASK_MONTH},
+ {'w', STRFTIME_MASK_DAY},
+ {'W', STRFTIME_MASK_DAY | STRFTIME_MASK_MONTH},
+ {'x', STRFTIME_MASK_YEAR | STRFTIME_MASK_MONTH | STRFTIME_MASK_DAY | STRFTIME_MASK_WEEK},
+ {'X', STRFTIME_MASK_SECONDS},
+ {'y', STRFTIME_MASK_YEAR},
+ {'Y', STRFTIME_MASK_YEAR},
+ /* Last one */
+ {0, 0}
+};
+
+#define FAT_NUMBER 8
+
+/* Looks through the characters in the format string to
+ ensure that we can figure out which of the things we
+ need to check in determining the length. */
+static gint
+generate_strftime_bitmask (const char *time_str)
+{
+ gint retval = 0;
+ glong strlength = g_utf8_strlen(time_str, -1);
+ gint i;
+ g_debug("Evaluating bitmask for '%s'", time_str);
+
+ for (i = 0; i < strlength; i++) {
+ if (time_str[i] == '%' && i + 1 < strlength) {
+ gchar evalchar = time_str[i + 1];
+
+ /* If we're using alternate formats we need to skip those characters */
+ if (evalchar == 'E' || evalchar == 'O') {
+ if (i + 2 < strlength) {
+ evalchar = time_str[i + 2];
+ } else {
+ continue;
+ }
+ }
+
+ /* Let's look at that character in the table */
+ int j;
+ for (j = 0; strftime_type[j].character != 0; j++) {
+ if (strftime_type[j].character == evalchar) {
+ retval |= strftime_type[j].mask;
+ break;
+ }
+ }
+ }
+ }
+
+ return retval;
+}
+
+/* Build an array up of all the time values that we want to check
+ for length to ensure we're in a good place */
+static void
+build_timeval_array (GArray * timevals, gint mask)
+{
+ struct tm mytm = {0};
+
+ /* Sun 12/28/8888 00:00 */
+ mytm.tm_hour = 0;
+ mytm.tm_mday = 28;
+ mytm.tm_mon = 11;
+ mytm.tm_year = 8888 - 1900;
+ mytm.tm_wday = 0;
+ mytm.tm_yday = 363;
+ g_array_append_val(timevals, mytm);
+
+ if (mask & STRFTIME_MASK_AMPM) {
+ /* Sun 12/28/8888 12:00 */
+ mytm.tm_hour = 12;
+ g_array_append_val(timevals, mytm);
+ }
+
+ /* NOTE: Ignoring year 8888 should handle it */
+
+ if (mask & STRFTIME_MASK_MONTH) {
+ gint oldlen = timevals->len;
+ gint i, j;
+ for (i = 0; i < oldlen; i++) {
+ for (j = 0; j < 11; j++) {
+ struct tm localval = g_array_index(timevals, struct tm, i);
+ localval.tm_mon = j;
+ /* Not sure if I need to adjust yday & wday, hope not */
+ g_array_append_val(timevals, localval);
+ }
+ }
+ }
+
+ /* Doing these together as it seems like just slightly more
+ coverage on the numerical days, but worth it. */
+ if (mask & (STRFTIME_MASK_WEEK | STRFTIME_MASK_DAY)) {
+ gint oldlen = timevals->len;
+ gint i, j;
+ for (i = 0; i < oldlen; i++) {
+ for (j = 22; j < 28; j++) {
+ struct tm localval = g_array_index(timevals, struct tm, i);
+
+ gint diff = 28 - j;
+
+ localval.tm_mday = j;
+ localval.tm_wday = localval.tm_wday - diff;
+ if (localval.tm_wday < 0) {
+ localval.tm_wday += 7;
+ }
+ localval.tm_yday = localval.tm_yday - diff;
+
+ g_array_append_val(timevals, localval);
+ }
+ }
+ }
+
+ return;
+}
+
+/* Try to get a good guess at what a maximum width of the entire
+ string would be. */
+static void
+guess_label_size (IndicatorDatetime * self)
+{
+ /* This is during startup. */
+ if (self->priv->label == NULL) return;
+
+ GtkStyle * style = gtk_widget_get_style(GTK_WIDGET(self->priv->label));
+ PangoContext * context = gtk_widget_get_pango_context(GTK_WIDGET(self->priv->label));
+ gint * max_width = &(self->priv->max_width);
+ gint posibilitymask = generate_strftime_bitmask(self->priv->time_string);
+
+ /* Reset max width */
+ *max_width = 0;
+
+ /* Build the array of possibilities that we want to test */
+ GArray * timevals = g_array_new(FALSE, TRUE, sizeof(struct tm));
+ build_timeval_array(timevals, posibilitymask);
+
+ g_debug("Checking against %d posible times", timevals->len);
+ gint check_time;
+ for (check_time = 0; check_time < timevals->len; check_time++) {
+ gchar longstr[256];
+ strftime(longstr, 256, self->priv->time_string, &(g_array_index(timevals, struct tm, check_time)));
+
+ gchar * utf8 = g_locale_to_utf8(longstr, -1, NULL, NULL, NULL);
+ gint length = measure_string(style, context, utf8);
+ g_free(utf8);
+
+ if (length > *max_width) {
+ *max_width = length;
+ }
+ }
+
+ g_array_free(timevals, TRUE);
+
+ gtk_widget_set_size_request(GTK_WIDGET(self->priv->label), self->priv->max_width, -1);
+ g_debug("Guessing max time width: %d", self->priv->max_width);
+
+ return;
+}
+
+/* React to the style changing, which could mean an font
+ update. */
+static void
+style_changed (GtkWidget * widget, GtkStyle * oldstyle, gpointer data)
+{
+ g_debug("New style for time label");
+ IndicatorDatetime * self = INDICATOR_DATETIME(data);
+ guess_label_size(self);
+ update_label(self);
+ return;
+}
+
+/* Translate msg according to the locale specified by LC_TIME */
+static char *
+T_(const char *msg)
+{
+ /* General strategy here is to make sure LANGUAGE is empty (since that
+ trumps all LC_* vars) and then to temporarily swap LC_TIME and
+ LC_MESSAGES. Then have gettext translate msg.
+
+ We strdup the strings because the setlocale & *env functions do not
+ guarantee anything about the storage used for the string, and thus
+ the string may not be portably safe after multiple calls.
+
+ Note that while you might think g_dcgettext would do the trick here,
+ that actually looks in /usr/share/locale/XX/LC_TIME, not the
+ LC_MESSAGES directory, so we won't find any translation there.
+ */
+ char *message_locale = g_strdup(setlocale(LC_MESSAGES, NULL));
+ char *time_locale = g_strdup(setlocale(LC_TIME, NULL));
+ char *language = g_strdup(g_getenv("LANGUAGE"));
+ char *rv;
+ g_unsetenv("LANGUAGE");
+ setlocale(LC_MESSAGES, time_locale);
+
+ /* Get the LC_TIME version */
+ rv = _(msg);
+
+ /* Put everything back the way it was */
+ setlocale(LC_MESSAGES, message_locale);
+ g_setenv("LANGUAGE", language, TRUE);
+ g_free(message_locale);
+ g_free(time_locale);
+ g_free(language);
+ return rv;
+}
+
+/* Check the system locale setting to see if the format is 24-hour
+ time or 12-hour time */
+static gboolean
+is_locale_12h()
+{
+ static const char *formats_24h[] = {"%H", "%R", "%T", "%OH", "%k", NULL};
+ const char *t_fmt = nl_langinfo(T_FMT);
+ int i;
+
+ for (i = 0; formats_24h[i]; ++i) {
+ if (strstr(t_fmt, formats_24h[i])) {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+/* Respond to changes in the screen to update the text gravity */
+static void
+update_text_gravity (GtkWidget *widget, GdkScreen *previous_screen, gpointer data)
+{
+ IndicatorDatetime * self = INDICATOR_DATETIME(data);
+ if (self->priv->label == NULL) return;
+
+ PangoLayout *layout;
+ PangoContext *context;
+
+ layout = gtk_label_get_layout (GTK_LABEL(self->priv->label));
+ context = pango_layout_get_context(layout);
+ pango_context_set_base_gravity(context, PANGO_GRAVITY_AUTO);
+}
+
+/* Tries to figure out what our format string should be. Lots
+ of translator comments in here. */
+static gchar *
+generate_format_string (IndicatorDatetime * self)
+{
+ if (self->priv->time_mode == SETTINGS_TIME_CUSTOM) {
+ return g_strdup(self->priv->custom_string);
+ }
+
+ gboolean twelvehour = TRUE;
+
+ if (self->priv->time_mode == SETTINGS_TIME_LOCALE) {
+ twelvehour = is_locale_12h();
+ } else if (self->priv->time_mode == SETTINGS_TIME_24_HOUR) {
+ twelvehour = FALSE;
+ }
+
+ const gchar * time_string = NULL;
+ if (twelvehour) {
+ if (self->priv->show_seconds) {
+ /* TRANSLATORS: A format string for the strftime function for
+ a clock showing 12-hour time with seconds. */
+ time_string = T_("%l:%M:%S %p");
+ } else {
+ time_string = T_(DEFAULT_TIME_12_FORMAT);
+ }
+ } else {
+ if (self->priv->show_seconds) {
+ /* TRANSLATORS: A format string for the strftime function for
+ a clock showing 24-hour time with seconds. */
+ time_string = T_("%H:%M:%S");
+ } else {
+ time_string = T_(DEFAULT_TIME_24_FORMAT);
+ }
+ }
+
+ /* Checkpoint, let's not fail */
+ g_return_val_if_fail(time_string != NULL, g_strdup(DEFAULT_TIME_FORMAT));
+
+ /* If there's no date or day let's just leave now and
+ not worry about the rest of this code */
+ if (!self->priv->show_date && !self->priv->show_day) {
+ return g_strdup(time_string);
+ }
+
+ const gchar * date_string = NULL;
+ if (self->priv->show_date && self->priv->show_day) {
+ /* TRANSLATORS: This is a format string passed to strftime to represent
+ the day of the week, the month and the day of the month. */
+ date_string = T_("%a %b %e");
+ } else if (self->priv->show_date) {
+ /* TRANSLATORS: This is a format string passed to strftime to represent
+ the month and the day of the month. */
+ date_string = T_("%b %e");
+ } else if (self->priv->show_day) {
+ /* TRANSLATORS: This is a format string passed to strftime to represent
+ the day of the week. */
+ date_string = T_("%a");
+ }
+
+ /* Check point, we should have a date string */
+ g_return_val_if_fail(date_string != NULL, g_strdup(time_string));
+
+ /* TRANSLATORS: This is a format string passed to strftime to combine the
+ date and the time. The value of "%s, %s" would result in a string like
+ this in US English 12-hour time: 'Fri Jul 16, 11:50 AM' */
+ return g_strdup_printf(T_("%s, %s"), date_string, time_string);
+}
+
+static gboolean
+new_calendar_item (DbusmenuMenuitem * newitem,
+ DbusmenuMenuitem * parent,
+ DbusmenuClient * client,
+ gpointer user_data)
+{
+ g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE);
+ g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE);
+ /* Note: not checking parent, it's reasonable for it to be NULL */
+
+ IndicatorObject *io = g_object_get_data (G_OBJECT (client), "indicator");
+ if (io == NULL) {
+ g_warning ("found no indicator to attach the caledar to");
+ return FALSE;
+ }
+
+ IndicatorDatetime *self = INDICATOR_DATETIME(io);
+ self->priv = INDICATOR_DATETIME_GET_PRIVATE(self);
+
+ IdoCalendarMenuItem *ido = IDO_CALENDAR_MENU_ITEM (ido_calendar_menu_item_new ());
+ self->priv->ido_calendar = ido;
+
+ dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, GTK_MENU_ITEM(ido), parent);
+
+ return TRUE;
+}
+
+/* Grabs the label. Creates it if it doesn't
+ exist already */
+static GtkLabel *
+get_label (IndicatorObject * io)
+{
+ IndicatorDatetime * self = INDICATOR_DATETIME(io);
+
+ /* If there's not a label, we'll build ourselves one */
+ if (self->priv->label == NULL) {
+ self->priv->label = GTK_LABEL(gtk_label_new("Time"));
+ gtk_label_set_justify (GTK_LABEL(self->priv->label), GTK_JUSTIFY_CENTER);
+ g_object_ref(G_OBJECT(self->priv->label));
+ g_signal_connect(G_OBJECT(self->priv->label), "style-set", G_CALLBACK(style_changed), self);
+ g_signal_connect(G_OBJECT(self->priv->label), "screen-changed", G_CALLBACK(update_text_gravity), self);
+ guess_label_size(self);
+ update_label(self);
+ gtk_widget_show(GTK_WIDGET(self->priv->label));
+ }
+
+ if (self->priv->timer == 0) {
+ setup_timer(self, NULL);
+ }
+
+ return self->priv->label;
+}
+
+static GtkMenu *
+get_menu (IndicatorObject * io)
+{
+ IndicatorDatetime * self = INDICATOR_DATETIME(io);
+
+ if (self->priv->menu == NULL) {
+ self->priv->menu = dbusmenu_gtkmenu_new(SERVICE_NAME, MENU_OBJ);
+ }
+
+ DbusmenuGtkClient *client = dbusmenu_gtkmenu_get_client(self->priv->menu);
+ g_object_set_data (G_OBJECT (client), "indicator", io);
+
+ dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_CALENDAR_MENUITEM_TYPE, new_calendar_item);
+
+ return GTK_MENU(self->priv->menu);
+}
=== added directory 'tests'
=== renamed directory 'tests' => 'tests.moved'
=== added file 'tests/Makefile.am'