tickr_0.7.1.orig/0000744000175000017500000000000014107736721013246 5ustar manutmmanutmtickr_0.7.1.orig/src/0000744000175000017500000000000014107736721014035 5ustar manutmmanutmtickr_0.7.1.orig/src/libetm-0.5.0/0000744000175000017500000000000014107736721015747 5ustar manutmmanutmtickr_0.7.1.orig/src/libetm-0.5.0/libetm.h0000644000175000017500000000574514107736721017411 0ustar manutmmanutm/* * libetm / libetm.h - Copyright (C) Emmanuel Thomas-Maurin 2008-2020 * * * 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 . */ #ifndef INC_LIBETM_H #define INC_LIBETM_H #define LIBETM_NAME "Libetm" #define LIBETM_VERSION_NUM "0.5.0" #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #ifndef _ISOC99_SOURCE #define _ISOC99_SOURCE #endif #define VERBOSE_OUTPUT /*#define LIBETM_EXPERIMENTAL_STUFF*/ /* stdout and stderr on Linux / text files on win32 (see win32_specific.c) */ #ifndef WIN32_V # define STD_OUT stdout # define STD_ERR stderr #else # define STD_OUT std_out # define STD_ERR std_err #endif #define INFO_OUT(...) \ {\ fprintf(STD_OUT, __VA_ARGS__);\ fflush(STD_OUT);\ } #define INFO_ERR(...) \ {\ fprintf(STD_ERR, __VA_ARGS__);\ fflush(STD_ERR);\ } /* * Following macros depends on definition of VERBOSE_OUTPUT and DEBUG_OUTPUT * * === NOTE: As VERBOSE_OUTPUT is actually defined here, to skip, well, verbose * output in application compiled against libetm, you must always *undefine* * VERBOSE_OUTPUT in code of application === */ #ifdef VERBOSE_OUTPUT # define VERBOSE_INFO_OUT(...) INFO_OUT(__VA_ARGS__) # define VERBOSE_INFO_ERR(...) INFO_ERR(__VA_ARGS__) #else # define VERBOSE_INFO_OUT(...) {} # define VERBOSE_INFO_ERR(...) {} #endif #ifdef DEBUG_OUTPUT # define DEBUG_INFO(...) \ {\ fprintf(STD_OUT, "[%s: %d] %s(): ", __FILE__, __LINE__, __func__);\ INFO_OUT(__VA_ARGS__)\ } #else # define DEBUG_INFO(...) {} #endif /* === TODO: Should we use mutex locks instead ? ===*/ #define N_SIMULTANEOUS_CALLS 64 #define N_SIMULTANEOUS_CALLS_MASK 63 /* Should zboolean type be sig_atomic_t ???? */ #undef TRUE #undef FALSE typedef enum { FALSE = (0), TRUE = (!FALSE) } zboolean; /* Couldn't find anything better at the moment */ #define YES (1) #define NO (0) #include "str_mem.h" #include "tcp_socket.h" #include "error.h" #include "misc.h" /*#include "dllist.h"*/ #ifdef WIN32_V #include "win32_specific.h" #endif #ifndef MAX # define MAX(x,y) ((x) > (y) ? (x) : (y)) #endif #ifndef MIN # define MIN(x,y) ((x) < (y) ? (x) : (y)) #endif #ifndef ABS # define ABS(x) ((x) > 0 ? (x) : -(x)) #endif /* Do more testing for the 2 following ones */ #ifndef SIGN # define SIGN(x) ((x) != 0 ? ((x) > 0 ? 1 : -1) : 0) #endif /* Only if f > 0 */ #ifndef APPROX # define APPROX(f) (ABS(((f) - (int)(f)) > 0.5) ? (int)(f) + SIGN((f)) : (int)(f)) #endif #endif /* INC_LIBETM_H */ tickr_0.7.1.orig/src/libetm-0.5.0/str_mem.h0000644000175000017500000000760114107736721017574 0ustar manutmmanutm/* * libetm / str_mem.h - Copyright (C) Emmanuel Thomas-Maurin 2008-2020 * * * - A few strings and memory management functions - * * 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 . */ #ifndef INC_LIBETM_STR_MEM_H #define INC_LIBETM_STR_MEM_H /* * Copy n bytes max from src to dest then add '\0' at end of dest. */ char *str_n_cpy(char *, const char *, size_t); /* * Concanate n bytes max of src to dest then add '\0' at end of dest. * Strings may not be identical and should not overlap. */ char *str_n_cat(char *, const char *, size_t); /* * Create new_str (allocate memory) and copy str (can be NULL) to new_str. */ char *l_str_new(const char *str); /* * Append src (can be NULL) to dest (re-allocate memory as necessary). * dest must have been created by l_str_new()/malloc() - strings may overlap. * Note: faster than l_str_insert_at_b(). */ char *l_str_cat(char *, const char *); /* * Insert src (can be NULL) at the beginning of dest (re-allocate memory as necessary). * dest must have been created by l_str_new()/malloc() - strings may overlap. * Note: slower than l_str_cat(). */ char *l_str_insert_at_b(char *, const char *); /* * Free string created by l_str_new(), l_str_cat() or l_str_insert_at_b(). * Also set ptr to NULL. */ void l_str_free(char *); /* * Wrappers for malloc(), realloc(), calloc() and free() which check returned value. */ void *malloc2(size_t); void *realloc2(void *, size_t); void *calloc2(size_t, size_t); /* Also set ptr to NULL. */ void free2(void *); /* * Return size in readable format (KiB, MiB, GiB, TiB, ...) * *** Allow up to 16 simultaneous calls *** * Convention: we assume 2.5 MiB = 2 MiB + [0.5 x 1024 = 512] KiB, not 500 KiB. * Otherwise, there is no way to express a value in the range 1000 - 1023, * so x.y MiB = x MiB + 0.y MiB, that is: not y x 100 KiB but y x 102.4 KiB. */ const char *readable_size(double); /* * itoa() is not ANSI C so this one could be useful. * *** Allow up to 16 simultaneous calls *** */ const char *itoa2(long int); /* * Modify string in place. */ char *remove_char_from_str(char *, char); /* * Modify string in place. */ char *remove_leading_whitespaces_from_str(char *); /* * Modify string in place. */ char *remove_trailing_whitespaces_from_str(char *); /* * Modify string in place. */ char *remove_surrounding_whitespaces_from_str(char *); /* * Check that str contains only digits (at least one) and whitespaces * (may start and/or end with whitespaces), meaning numerical value is * integer >= 0. */ zboolean str_is_num(const char *); /* * Check that str contains only whitespaces or is empty. */ zboolean str_is_blank(const char *); /* * Generate a random string up to 1023 chars long. * mode = a -> alpha / d -> digits / b -> both */ const char *rnd_str(char, int); #ifdef LIBETM_EXPERIMENTAL_STUFF /* * Very basic xor sym encryption for small strings (up to 511 chars). * *** Key must be ascii / if 2 chars match (in str and key) the string is cut off *** * *** Allow up to 16 simultaneous calls *** * Works with ascii strings, probably not otherwise so don't try with * exotic things... */ const char *str_crypt(const char *, const char *); /* * Very basic crypto hash. */ unsigned long str_crypto_hash(const char *, const char*); #endif #endif /* INC_LIBETM_STR_MEM_H */ tickr_0.7.1.orig/src/libetm-0.5.0/COPYING0000644000175000017500000010451314107736721017010 0ustar manutmmanutm GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . tickr_0.7.1.orig/src/libetm-0.5.0/misc.c0000644000175000017500000000470314107736721017054 0ustar manutmmanutm/* * libetm / misc.c - Copyright (C) Emmanuel Thomas-Maurin 2008-2020 * * * - Misc functions - * * 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 . */ #include #include #include "libetm.h" /* * get_libetm_info( O ) = version num * 1 = copyright * 2 = license 1/3 * 3 = license 2/3 * 4 = license 3/3 * 5 = compiled date * > 5 = NULL */ const char *get_libetm_info(unsigned int i) { static const char *libv[] = { LIBETM_NAME " version " LIBETM_VERSION_NUM, "Copyright (C) Emmanuel Thomas-Maurin 2008-2020 ", LIBETM_NAME " is free software: you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation, either version 3 of the License, or\n" "(at your option) any later version.", LIBETM_NAME " is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.", "You should have received a copy of the GNU General Public License\n" /* Fix non-reproducible builds */ "along with this program. If not, see "/*, "Compiled on " __DATE__ " - " __TIME__*/ }; if (i < sizeof(libv) / sizeof(libv[0])) return (const char *)libv[i]; else return NULL; } /* * Dump libetm info. */ void dump_libetm_info() { int i = 0; while (get_libetm_info(i) != NULL) fprintf(STD_OUT, "%s\n\n", get_libetm_info(i++)); } /* In CLI mode */ zboolean question(const char *str) { int i, c; while (1) { fprintf(STD_OUT, "%s [Y/N] ? ", str); i = fgetc(stdin); c = tolower(i); while (i != '\n' && i != EOF) (i = fgetc(stdin)); if (c == 'y') return TRUE; else if (c == 'n') return FALSE; } } tickr_0.7.1.orig/src/libetm-0.5.0/str_mem.c0000644000175000017500000003011514107736721017563 0ustar manutmmanutm/* * libetm / str_mem.c - Copyright (C) Emmanuel Thomas-Maurin 2008-2020 * * * - A few strings and memory management functions - * * 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 . */ #include #include #include #include #include #include #include "libetm.h" /* * Copy n bytes max from src to dest then add '\0' at end of dest. */ char *str_n_cpy(char *dest, const char *src, size_t length) { char *dest_bak = dest; if (dest == NULL) big_error_in_lib(NULL_DEST, __func__); while (length-- > 0 && *src != '\0') *dest++ = *src++; *dest = '\0'; return dest_bak; } /* * Concanate n bytes max of src to dest then add '\0' at end of dest. * Strings may not be identical and should not overlap. */ char *str_n_cat(char *dest, const char *src, size_t length) { char *dest_bak = dest; if (dest == NULL) big_error_in_lib(NULL_DEST, __func__); else if (src == dest) big_error_in_lib(SRC_EQ_DEST, __func__); while (*dest++ != '\0'); dest--; while (length-- > 0 && *src != '\0') *dest++ = *src++; *dest = '\0'; return dest_bak; } /* * Create new_str (allocate memory) and copy str (can be NULL) to new_str. */ char *l_str_new(const char *str) { char *new_str; size_t str_len; if (str == NULL) str_len = 0; else str_len = strlen(str); new_str = malloc2(sizeof(char) * (str_len + 1)); if (new_str == NULL) big_error_in_lib(OUT_OF_MEMORY, __func__); return str_n_cpy(new_str, str, str_len); } /* * Append src (can be NULL) to dest (re-allocate memory as necessary). * dest must have been created by l_str_new()/malloc() - strings may overlap. * Note: faster than l_str_insert_at_b(). */ char *l_str_cat(char *dest, const char *src) { char *new_str, *src2; size_t src_len, dest_len; if (dest == NULL) big_error_in_lib(NULL_DEST, __func__); else if (src == NULL) return dest; src_len = strlen(src); if (src_len == 0) return dest; dest_len = strlen(dest); src2 = l_str_new(src); new_str = realloc(dest, sizeof(char) * (dest_len + src_len + 1)); if (new_str == NULL) big_error_in_lib(OUT_OF_MEMORY, __func__); str_n_cpy(new_str + dest_len, src2, src_len); l_str_free(src2); return new_str; } /* * Insert src (can be NULL) at the beginning of dest (re-allocate memory as necessary). * dest must have been created by l_str_new()/malloc() - strings may overlap. * Note: slower than l_str_cat(). */ char *l_str_insert_at_b(char *dest, const char *src) { char *new_str; size_t src_len, dest_len; if (dest == NULL) big_error_in_lib(NULL_DEST, __func__); else if (src == NULL) return dest; src_len = strlen(src); if (src_len == 0) return dest; dest_len = strlen(dest); new_str = malloc(sizeof(char) * (src_len + dest_len + 1)); if (new_str == NULL) big_error_in_lib(OUT_OF_MEMORY, __func__); str_n_cpy(new_str, src, src_len); str_n_cpy(new_str + src_len, dest, dest_len); l_str_free(dest); return new_str; } /* * Free string created by l_str_new(), l_str_cat() or l_str_insert_at_b(). * Also set ptr to NULL. */ void l_str_free(char *str) { if (str == NULL) big_error_in_lib(NULL_POINTER_FREE, __func__); free(str); str = NULL; } /* * Wrappers for malloc(), realloc(), calloc() and free() which check returned value. */ void *malloc2(size_t size) { void *mem_block = NULL; if (size == 0) big_error_in_lib(ZERO_RQ_SIZE, __func__); else if ((mem_block = malloc(size)) == NULL) big_error_in_lib(OUT_OF_MEMORY, __func__); return mem_block; } void *realloc2(void *mem_block, size_t size) { void *mem_block2 = mem_block; if (size == 0) big_error_in_lib(ZERO_RQ_SIZE, __func__); else if ((mem_block2 = realloc(mem_block, size)) == NULL) big_error_in_lib(OUT_OF_MEMORY, __func__); return mem_block2; } void *calloc2(size_t n_elements, size_t element_size) { void *mem_block = NULL; size_t size = n_elements * element_size; if (size == 0) big_error_in_lib(ZERO_RQ_SIZE, __func__); else if ((mem_block = malloc(size)) == NULL) big_error_in_lib(OUT_OF_MEMORY, __func__); else memset(mem_block, 0, size); return mem_block; } /* Also set ptr to NULL. */ void free2(void *mem_block) { if (mem_block == NULL) big_error_in_lib(NULL_POINTER_FREE, __func__); free(mem_block); mem_block = NULL; } /* * Return size in readable format (KiB, MiB, GiB, TiB, ...) * *** Allow up to N_SIMULTANEOUS_CALLS simultaneous calls *** * Convention: we assume 2.5 MiB = 2 MiB + [0.5 x 1024 = 512] KiB, not 500 KiB. * Otherwise, there is no way to express a value in the range 1000 - 1023, * so x.y MiB = x MiB + 0.y MiB, that is: not y x 100 KiB but y x 102.4 KiB. */ const char *readable_size(double size_bytes) { /* * We use an array of N_SIMULTANEOUS_CALLS strings to store the returned string * in order to allow N_SIMULTANEOUS_CALLS simultaneous calls. * === TODO: Should we use mutex locks instead ? === * Otherwise, sth like: * printf("size1 = %s / size2 = %s\n", readable_size(size1), readable_size(size2)) * would produce unpredictable / false results (like readable sizes are * equal whereas sizes are different). */ static char lib_static_str[N_SIMULTANEOUS_CALLS][128]; double size_KiB, size_MiB, size_GiB, size_TiB, size_PiB, size_EiB, size_ZiB, size_YiB; double remainder_bytes, remainder_KiB, remainder_MiB, remainder_GiB, remainder_TiB, remainder_PiB, remainder_EiB, remainder_ZiB; static int count = -1; count++; count &= N_SIMULTANEOUS_CALLS_MASK; if (size_bytes < 0.0f) return "[Negative size error] bytes"; size_bytes = floor(size_bytes); /* OK ? */ size_KiB = floor(size_bytes / 1024); remainder_bytes = size_bytes - size_KiB * 1024; size_MiB = floor(size_KiB / 1024); remainder_KiB = size_KiB - size_MiB * 1024; size_GiB = floor(size_MiB / 1024); remainder_MiB = size_MiB - size_GiB * 1024; size_TiB = floor(size_GiB / 1024); remainder_GiB = size_GiB - size_TiB * 1024; size_PiB = floor(size_TiB / 1024); remainder_TiB = size_TiB - size_PiB * 1024; size_EiB = floor(size_PiB / 1024); remainder_PiB = size_PiB - size_EiB * 1024; size_ZiB = floor(size_EiB / 1024); remainder_EiB = size_EiB - size_ZiB * 1024; size_YiB = floor(size_ZiB / 1024); remainder_ZiB = size_ZiB - size_YiB * 1024; if (size_YiB >= 1) snprintf(lib_static_str[count], 128, "%.0f.%.0f YiB", size_YiB, floor(remainder_ZiB / 102.4)); else if (size_ZiB >= 1) snprintf(lib_static_str[count], 128, "%.0f.%.0f ZiB", size_ZiB, floor(remainder_EiB / 102.4)); else if (size_EiB >= 1) snprintf(lib_static_str[count], 128, "%.0f.%.0f EiB", size_EiB, floor(remainder_PiB / 102.4)); else if (size_PiB >= 1) snprintf(lib_static_str[count], 128, "%.0f.%.0f PiB", size_PiB, floor(remainder_TiB / 102.4)); else if (size_TiB >= 1) snprintf(lib_static_str[count], 128, "%.0f.%.0f TiB", size_TiB, floor(remainder_GiB / 102.4)); else if (size_GiB >= 1) snprintf(lib_static_str[count], 128, "%.0f.%.0f GiB", size_GiB, floor(remainder_MiB / 102.4)); else if (size_MiB >= 1) snprintf(lib_static_str[count], 128, "%.0f.%.0f MiB", size_MiB, floor(remainder_KiB / 102.4)); else if (size_KiB >= 1) snprintf(lib_static_str[count], 128, "%.0f.%.0f KiB", size_KiB, floor(remainder_bytes / 102.4)); else snprintf(lib_static_str[count], 128, "%.0f bytes", size_bytes); return (const char *)lib_static_str[count]; } /* * itoa() is not ANSI C so this one could be useful. * *** Allow up to N_SIMULTANEOUS_CALLS simultaneous calls *** */ const char *itoa2(long int n) { /* Array of N_SIMULTANEOUS_CALLS strings (like for readable_size() - see above) */ static char lib_static_str[N_SIMULTANEOUS_CALLS][128]; static int count = -1; count++; count &= N_SIMULTANEOUS_CALLS_MASK; snprintf(lib_static_str[count], 128, "%ld", n); return (const char *)lib_static_str[count]; } /* * Modify string in place. */ char *remove_char_from_str(char *str, char c) { int i, len = strlen(str); for (i = 0; i < len && str[i] != '\0';) { if (str[i] == c) str_n_cpy(str + i, (const char *)(str + i + 1), len - i); else i++; } return str; } /* * Modify string in place. */ char *remove_leading_whitespaces_from_str(char *str) { int i, len = strlen(str); for (i = 0; i < len;) if (isspace((int)str[i])) i++; else break; if (i > 0 && i <= len) str_n_cpy(str, (const char *)(str + i), len - i); return str; } /* * Modify string in place. */ char *remove_trailing_whitespaces_from_str(char *str) { int i = strlen(str) - 1; while (isspace((int)str[i]) && i >= 0) i--; str[i + 1] = '\0'; return str; } /* * Modify string in place. */ char *remove_surrounding_whitespaces_from_str(char *str) { return remove_trailing_whitespaces_from_str(remove_leading_whitespaces_from_str(str)); } /* * Check that str contains only digits (at least one) and whitespaces * (may start and/or end with whitespaces), meaning numerical value is * integer >= 0. */ zboolean str_is_num(const char *str2) { char *str, *s; int i, len; if (*str2 == '\0') return FALSE; s = str = l_str_new(str2); len = strlen(str); i = 0; while (i < len) if (isspace((int)*s)) { i++; s++; } else break; if (i == len) { l_str_free(str); return FALSE; } while (i < len) if (isdigit((int)*s)) { i++; s++; } else break; if (i == len) { l_str_free(str); return TRUE; } while (i < len) if (isspace((int)*s)) { i++; s++; } else break; l_str_free(str); if (i == len) return TRUE; else return FALSE; } /* * Check that str contains only whitespaces or is empty. */ zboolean str_is_blank(const char *str) { int i = 0, len = strlen(str); if (*str == '\0') return TRUE; while (i < len) if (isspace((int)*str)) { i++; str++; } else break; if (i == len) return TRUE; else return FALSE; } /* * Generate a random string up to 1023 chars long. * mode = a -> alpha / d -> digits / b -> both */ const char *rnd_str(char mode, int length) { static char str[1024]; char str_a[65] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkl"; char str_d[17] = "1234567890123456"; char str_b[65] = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ00"; int i = 0; if (length > 1023) length = 1023; srand(time(0)); if (mode == 'a') { while (i < length) str[i++] = str_a[rand() & 63]; } else if (mode == 'd') { while (i < length) str[i++] = str_d[rand() & 15]; } else if (mode == 'b') { while (i < length) str[i++] = str_b[rand() & 63]; } else big_error_in_lib(RNDSTR_UNKNOWN_MODE, __func__); str[i] = '\0'; return str; } #ifdef LIBETM_EXPERIMENTAL_STUFF /* * Very basic xor sym encryption for small strings (up to 511 chars). * *** Key must be ascii / if 2 chars match (in str and key) the string is cut off *** * *** Allow up to N_SIMULTANEOUS_CALLS simultaneous calls *** * Works with ascii strings, probably not otherwise so don't try with * exotic things... */ const char *str_crypt(const char *str, const char *key) { /* Array of N_SIMULTANEOUS_CALLS strings (like for readable_size() - see above) */ static char str2[N_SIMULTANEOUS_CALLS][512]; static int count = -1; int i, j; count++; count &= N_SIMULTANEOUS_CALLS_MASK; for (i = 0, j = 0; i < 511 && str[i] != '\0'; i++) { if (key[j] == '\0') j = 0; str2[count][i] = str[i] ^ key[j++]; } str2[count][i] = '\0'; return (const char *)str2[count]; } /* * Very basic crypto hash. */ unsigned long str_crypto_hash(const char *str, const char* salt) { char *str2; unsigned long hash = 0; int i = 0; str2 = (char *)str_crypt(str, salt); while (str2[i] != '\0') { hash += str2[i] * 1024 + (str2[i] + 128) * (32 + i) + str2[i] - 1; i ++; } return hash; } #endif tickr_0.7.1.orig/src/libetm-0.5.0/error_handler_example.c0000644000175000017500000000371014107736721022457 0ustar manutmmanutm/* * This func's prototype is in libetm/error.h. * This func is not defined in libetm but in application and it handles * CRITICAL ERRORS from both libetm and application. */ #define ERROR_WARNING_STR_MAXLEN (8 * 1024 - 1) #define OUCH_STR "\nOuch !! Something went wrong ...\n\n" int big_error(int big_error_code, const char *format, ...) { char error_str[ERROR_WARNING_STR_MAXLEN + 1] = ""; va_list a_list; str_n_cpy(error_str, OUCH_STR, 100); str_n_cat(error_str, "CRITICAL ERROR in ", 100); if (big_error_code > LIBETM_LASTERRORCODE) str_n_cat(error_str, APP_NAME ": ", 100); va_start(a_list, format); vsnprintf(error_str + strlen(error_str), ERROR_WARNING_STR_MAXLEN + 1 - strlen(error_str), format, a_list); va_end(a_list); snprintf(error_str + strlen(error_str), ERROR_WARNING_STR_MAXLEN + 1 - strlen(error_str), " - Will quit now"); fprintf(STD_ERR, "%s\n", (char *)error_str + strlen(OUCH_STR)); fflush(NULL); info_win(APP_NAME " - Critical error", error_str, INFO_ERROR, FALSE); free_all(); exit(big_error_code); } /* * This func's prototype is in libetm/error.h. * This func is not defined in libetm but in application and it handles * WARNINGS from both libetm and application. * * Will popup and wait for INFO_WIN_WAIT_TIMEOUT ms if no_block == TRUE, then close * otherwise, will block until an appropriate keyboard/mouse action happens. * * You can use BLOCK/NO_BLOCK helpers. */ /* Helpers for warning() */ #define NO_BLOCK TRUE #define BLOCK !NO_BLOCK void warning(int no_block, const char *format, ...) { char warning_str[ERROR_WARNING_STR_MAXLEN + 1] = ""; va_list a_list; va_start(a_list, format); vsnprintf(warning_str + strlen(warning_str), ERROR_WARNING_STR_MAXLEN + 1 - strlen(warning_str), format, a_list); va_end(a_list); fprintf(STD_ERR, "%s\n", warning_str); fflush(STD_ERR); if (no_block) info_win_no_block(warning_str, INFO_WIN_WAIT_TIMEOUT); else info_win("", warning_str, INFO_WARNING, FALSE); } tickr_0.7.1.orig/src/libetm-0.5.0/Makefile-libetm-win320000644000175000017500000000122614107736721021624 0ustar manutmmanutm# Makefile for libetm - win32 version src = str_mem.c tcp_socket.c error.c misc.c win32_specific.c #dllist.c obj = $(src:.c=.o) headers = libetm.h $(src:.c=.h) CC = gcc CFLAGS = -O2 -Wall -Wextra -Wunused-parameter -Wshadow -Wpointer-arith\ -ffast-math -pedantic -Wno-variadic-macros -DWIN32_V all: libetm.a $(obj): $(src) $(headers) Makefile $(CC) $(CFLAGS) -c $(src) libetm.a: $(obj) ar -rs libetm.a $(obj) .PHONY: install install: mkdir -p /usr/include/libetm cp $(headers) /usr/include/libetm/ cp libetm.a /usr/lib/ .PHONY: uninstall uninstall: rm /usr/include/libetm/$(headers) rm /usr/lib/libetm.a .PHONY: clean clean: rm $(obj) libetm.a tickr_0.7.1.orig/src/libetm-0.5.0/Makefile.am0000644000175000017500000000036614107736721020012 0ustar manutmmanutmlibs_LIBRARIES = libetm.a libetm_a_SOURCES = str_mem.c tcp_socket.c error.c misc.c #dllist.c libetm_a_CFLAGS = -O2 -Wall -Wextra -Wunused-parameter -Wshadow -Wpointer-arith\ -ffast-math -pedantic -Wno-variadic-macros -fmax-errors=5 libsdir = .. tickr_0.7.1.orig/src/libetm-0.5.0/Makefile.in0000664000175000017500000006445414107736721020035 0ustar manutmmanutm# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = src/libetm-0.5.0 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libsdir)" LIBRARIES = $(libs_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libetm_a_AR = $(AR) $(ARFLAGS) libetm_a_LIBADD = am_libetm_a_OBJECTS = libetm_a-str_mem.$(OBJEXT) \ libetm_a-tcp_socket.$(OBJEXT) libetm_a-error.$(OBJEXT) \ libetm_a-misc.$(OBJEXT) libetm_a_OBJECTS = $(am_libetm_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/libetm_a-error.Po \ ./$(DEPDIR)/libetm_a-misc.Po ./$(DEPDIR)/libetm_a-str_mem.Po \ ./$(DEPDIR)/libetm_a-tcp_socket.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libetm_a_SOURCES) DIST_SOURCES = $(libetm_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp COPYING \ ChangeLog README TODO DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ XML2_CFLAGS = @XML2_CFLAGS@ XML2_LIBS = @XML2_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ libs_LIBRARIES = libetm.a libetm_a_SOURCES = str_mem.c tcp_socket.c error.c misc.c #dllist.c libetm_a_CFLAGS = -O2 -Wall -Wextra -Wunused-parameter -Wshadow -Wpointer-arith\ -ffast-math -pedantic -Wno-variadic-macros -fmax-errors=5 libsdir = .. all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libetm-0.5.0/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libetm-0.5.0/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libsLIBRARIES: $(libs_LIBRARIES) @$(NORMAL_INSTALL) @list='$(libs_LIBRARIES)'; test -n "$(libsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libsdir)" || exit 1; \ echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libsdir)'"; \ $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libsdir)" || exit $$?; } @$(POST_INSTALL) @list='$(libs_LIBRARIES)'; test -n "$(libsdir)" || list=; \ for p in $$list; do \ if test -f $$p; then \ $(am__strip_dir) \ echo " ( cd '$(DESTDIR)$(libsdir)' && $(RANLIB) $$f )"; \ ( cd "$(DESTDIR)$(libsdir)" && $(RANLIB) $$f ) || exit $$?; \ else :; fi; \ done uninstall-libsLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(libs_LIBRARIES)'; test -n "$(libsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libsdir)'; $(am__uninstall_files_from_dir) clean-libsLIBRARIES: -test -z "$(libs_LIBRARIES)" || rm -f $(libs_LIBRARIES) libetm.a: $(libetm_a_OBJECTS) $(libetm_a_DEPENDENCIES) $(EXTRA_libetm_a_DEPENDENCIES) $(AM_V_at)-rm -f libetm.a $(AM_V_AR)$(libetm_a_AR) libetm.a $(libetm_a_OBJECTS) $(libetm_a_LIBADD) $(AM_V_at)$(RANLIB) libetm.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libetm_a-error.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libetm_a-misc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libetm_a-str_mem.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libetm_a-tcp_socket.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` libetm_a-str_mem.o: str_mem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -MT libetm_a-str_mem.o -MD -MP -MF $(DEPDIR)/libetm_a-str_mem.Tpo -c -o libetm_a-str_mem.o `test -f 'str_mem.c' || echo '$(srcdir)/'`str_mem.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libetm_a-str_mem.Tpo $(DEPDIR)/libetm_a-str_mem.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='str_mem.c' object='libetm_a-str_mem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -c -o libetm_a-str_mem.o `test -f 'str_mem.c' || echo '$(srcdir)/'`str_mem.c libetm_a-str_mem.obj: str_mem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -MT libetm_a-str_mem.obj -MD -MP -MF $(DEPDIR)/libetm_a-str_mem.Tpo -c -o libetm_a-str_mem.obj `if test -f 'str_mem.c'; then $(CYGPATH_W) 'str_mem.c'; else $(CYGPATH_W) '$(srcdir)/str_mem.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libetm_a-str_mem.Tpo $(DEPDIR)/libetm_a-str_mem.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='str_mem.c' object='libetm_a-str_mem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -c -o libetm_a-str_mem.obj `if test -f 'str_mem.c'; then $(CYGPATH_W) 'str_mem.c'; else $(CYGPATH_W) '$(srcdir)/str_mem.c'; fi` libetm_a-tcp_socket.o: tcp_socket.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -MT libetm_a-tcp_socket.o -MD -MP -MF $(DEPDIR)/libetm_a-tcp_socket.Tpo -c -o libetm_a-tcp_socket.o `test -f 'tcp_socket.c' || echo '$(srcdir)/'`tcp_socket.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libetm_a-tcp_socket.Tpo $(DEPDIR)/libetm_a-tcp_socket.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tcp_socket.c' object='libetm_a-tcp_socket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -c -o libetm_a-tcp_socket.o `test -f 'tcp_socket.c' || echo '$(srcdir)/'`tcp_socket.c libetm_a-tcp_socket.obj: tcp_socket.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -MT libetm_a-tcp_socket.obj -MD -MP -MF $(DEPDIR)/libetm_a-tcp_socket.Tpo -c -o libetm_a-tcp_socket.obj `if test -f 'tcp_socket.c'; then $(CYGPATH_W) 'tcp_socket.c'; else $(CYGPATH_W) '$(srcdir)/tcp_socket.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libetm_a-tcp_socket.Tpo $(DEPDIR)/libetm_a-tcp_socket.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tcp_socket.c' object='libetm_a-tcp_socket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -c -o libetm_a-tcp_socket.obj `if test -f 'tcp_socket.c'; then $(CYGPATH_W) 'tcp_socket.c'; else $(CYGPATH_W) '$(srcdir)/tcp_socket.c'; fi` libetm_a-error.o: error.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -MT libetm_a-error.o -MD -MP -MF $(DEPDIR)/libetm_a-error.Tpo -c -o libetm_a-error.o `test -f 'error.c' || echo '$(srcdir)/'`error.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libetm_a-error.Tpo $(DEPDIR)/libetm_a-error.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error.c' object='libetm_a-error.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -c -o libetm_a-error.o `test -f 'error.c' || echo '$(srcdir)/'`error.c libetm_a-error.obj: error.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -MT libetm_a-error.obj -MD -MP -MF $(DEPDIR)/libetm_a-error.Tpo -c -o libetm_a-error.obj `if test -f 'error.c'; then $(CYGPATH_W) 'error.c'; else $(CYGPATH_W) '$(srcdir)/error.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libetm_a-error.Tpo $(DEPDIR)/libetm_a-error.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error.c' object='libetm_a-error.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -c -o libetm_a-error.obj `if test -f 'error.c'; then $(CYGPATH_W) 'error.c'; else $(CYGPATH_W) '$(srcdir)/error.c'; fi` libetm_a-misc.o: misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -MT libetm_a-misc.o -MD -MP -MF $(DEPDIR)/libetm_a-misc.Tpo -c -o libetm_a-misc.o `test -f 'misc.c' || echo '$(srcdir)/'`misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libetm_a-misc.Tpo $(DEPDIR)/libetm_a-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='misc.c' object='libetm_a-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -c -o libetm_a-misc.o `test -f 'misc.c' || echo '$(srcdir)/'`misc.c libetm_a-misc.obj: misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -MT libetm_a-misc.obj -MD -MP -MF $(DEPDIR)/libetm_a-misc.Tpo -c -o libetm_a-misc.obj `if test -f 'misc.c'; then $(CYGPATH_W) 'misc.c'; else $(CYGPATH_W) '$(srcdir)/misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libetm_a-misc.Tpo $(DEPDIR)/libetm_a-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='misc.c' object='libetm_a-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libetm_a_CFLAGS) $(CFLAGS) -c -o libetm_a-misc.obj `if test -f 'misc.c'; then $(CYGPATH_W) 'misc.c'; else $(CYGPATH_W) '$(srcdir)/misc.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: for dir in "$(DESTDIR)$(libsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libsLIBRARIES mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/libetm_a-error.Po -rm -f ./$(DEPDIR)/libetm_a-misc.Po -rm -f ./$(DEPDIR)/libetm_a-str_mem.Po -rm -f ./$(DEPDIR)/libetm_a-tcp_socket.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-libsLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libetm_a-error.Po -rm -f ./$(DEPDIR)/libetm_a-misc.Po -rm -f ./$(DEPDIR)/libetm_a-str_mem.Po -rm -f ./$(DEPDIR)/libetm_a-tcp_socket.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libsLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libsLIBRARIES cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libsLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-libsLIBRARIES .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tickr_0.7.1.orig/src/libetm-0.5.0/tcp_socket.h0000644000175000017500000000550514107736721020265 0ustar manutmmanutm/* * libetm / tcp_socket.h - Copyright (C) Emmanuel Thomas-Maurin 2008-2020 * * * - A few TCP (stream) sockets functions - * * 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 . */ #ifndef INC_LIBETM_TCP_SOCKET_H #define INC_LIBETM_TCP_SOCKET_H #define TCP_SOCK_OK LIBETM_OK /* Timeout default values */ #define CONNECT_TIMEOUT_SEC 5 #define CONNECT_TIMEOUT_USEC 0 #define SEND_RECV_TIMEOUT_SEC 1 #define SEND_RECV_TIMEOUT_USEC 0 #define RECV_CHUNK_LEN (16 * 1024 - 1) #ifndef WIN32_V typedef int sockt; # define TCP_SOCK_CREATE_ERROR -1 /* socket() */ # define TCP_SOCK_FUNC_ERROR -1 /* setsockopt(), bind(), listen(), select(), connect(), * send(), recv(), fnctl(), ioctlsocket() */ # define CLOSE_SOCK(s) close(s) #else # include /* Dirty fix. */ typedef SOCKET sockt; # define TCP_SOCK_CREATE_ERROR INVALID_SOCKET # define TCP_SOCK_FUNC_ERROR SOCKET_ERROR # define CLOSE_SOCK(s) closesocket(s) #endif void set_send_recv_timeout_sec(int); int get_send_recv_timeout_sec(); void set_send_recv_timeout_usec(int); int get_send_recv_timeout_usec(); void set_connect_timeout_sec(int); int get_connect_timeout_sec(); void set_connect_timeout_usec(int); int get_connect_timeout_usec(); /* Default is not using proxy, otherwise must be set. */ void libetm_socket_set_use_proxy(zboolean); zboolean libetm_socket_get_use_proxy(); /* * Open stream socket in non-blocking mode and connect to host. * Return socket fd (> 0) / TCP_SOCK_CREATE_ERROR (-1 on Linux) if error. */ sockt tcp_connect_to_host(const char *, const char *); int writable_data_is_available_on_tcp_socket(sockt); int readable_data_is_available_on_tcp_socket(sockt); /* * Return n bytes sent or TCP_SOCK_FUNC_ERROR (-1 on Linux) if error (connection * closed by server or ?) */ int tcp_send_full(sockt, const char *); /* * Return response = tcp_recv_full(socket, &bytes_received, &status) or NULL if error. * -> status = TCP_SOCK_OK, CONNECTION_CLOSED_BY_SERVER, TCP_SOCK_FUNC_ERROR or TCP_SOCK_SHOULD_BE_CLOSED. * -> allocate memory for response (must be freed afterwards with free2() if != NULL). */ char *tcp_recv_full(sockt, int *, int *); const char *sock_error_message(); #endif /* INC_LIBETM_TCP_SOCKET_H */ tickr_0.7.1.orig/src/libetm-0.5.0/misc.h0000644000175000017500000000224314107736721017056 0ustar manutmmanutm/* * libetm / misc.h - Copyright (C) Emmanuel Thomas-Maurin 2008-2020 * * * - Misc functions - * * 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 . */ #ifndef INC_LIBETM_MISC_H #define INC_LIBETM_MISC_H /* * get_libetm_info( O ) = version num * 1 = copyright * 2 = license 1/3 * 3 = license 2/3 * 4 = license 3/3 * 5 = compiled date * > 5 = NULL */ const char *get_libetm_info(unsigned int); /* * Dump libetm info. */ void dump_libetm_info(); /* In CLI mode */ zboolean question(const char *); #endif /* INC_LIBETM_MISC_H */ tickr_0.7.1.orig/src/libetm-0.5.0/.deps/0000744000175000017500000000000014107736721016760 5ustar manutmmanutmtickr_0.7.1.orig/src/libetm-0.5.0/TODO0000644000175000017500000000031414107736721016437 0ustar manutmmanutmTODO: - More testing. (Not sure yet about that:) - Add HTTP API (-> html_entities.h, http.h, http.c). - Add doubly-linked list API (-> dl_list.h, dl_list.c / FList -> DLList ?) - Change func names ? tickr_0.7.1.orig/src/libetm-0.5.0/win32_specific.c0000644000175000017500000001552114107736721020730 0ustar manutmmanutm/* * libetm / win32_specific.c - Copyright (C) Emmanuel Thomas-Maurin 2008-2020 * * * - Win32 specific functions - * * 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 . */ #ifdef WIN32_V #include #include #include #include #include #include #include #include "libetm.h" #define APP_WIN32REG_KEYPATH "app_win32_registry_keypath" /* Or whatever */ FILE *std_out, *std_err; /* * On Linux, STD_OUT = stdout and STD_ERR = stderr / on win32, we must * first create specific text files then pass them to this function. */ void libetm_init_win32_stdout_stderr(FILE *std_out2, FILE *std_err2) { std_out = std_out2; std_err = std_err2; } void libetm_init_win32_sockets() { WSADATA wsadata; int i; if ((i = WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0) big_error/*_in_lib*/(WIN32_ERROR, "WSAStartup() error ", itoa2(i)); else if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2) { WSACleanup(); big_error/*_in_lib*/(WIN32_ERROR, "Couldn't find a usable version of Winsock.dll"); } } void libetm_cleanup_win32_sockets() { WSACleanup(); } /* Return NULL if error */ const char *get_appdata_dir() { static TCHAR appdata_dir[MAX_PATH + 1]; static int i = 0; if (i == 0) { i++; if (SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, appdata_dir) != S_OK) i++; } if (i == 1) return (const char *)appdata_dir; else return NULL; } /* Return NULL if error */ const char *get_appdata_dir_w() { static WCHAR appdata_dir[MAX_PATH + 1]; static int i = 0; if (i == 0) { i++; if (SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, 0, appdata_dir) != S_OK) i++; } if (i == 1) return (const char *)appdata_dir; else return NULL; } /* Return NULL if error */ const char *get_progfiles_dir() { static TCHAR progfiles_dir[MAX_PATH + 1]; static int i = 0; if (i == 0) { i++; if (SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, 0, progfiles_dir) != S_OK) i++; } if (i == 1) return (const char *)progfiles_dir; else return NULL; } /* key_value must be able to store 255 chars */ int get_key_value_from_win32registry(const char *key_name, char *key_value) { char app_win32regkey_full[128]; HKEY hkey; DWORD type = REG_SZ, buf_size = 256; LONG result; str_n_cpy(app_win32regkey_full, APP_WIN32REG_KEYPATH, 64); str_n_cat(app_win32regkey_full, key_name, 63); if ((result = RegOpenKeyEx(HKEY_CURRENT_USER, app_win32regkey_full, 0L, KEY_QUERY_VALUE, &hkey)) == ERROR_SUCCESS) { if (RegQueryValueEx(hkey, NULL, NULL, &type, (unsigned char*)key_value, &buf_size) == ERROR_SUCCESS) { RegCloseKey(hkey); return LIBETM_OK; } else { RegCloseKey(hkey); return WIN32REGKEY_NOT_FOUND; } } else { if (result == ERROR_FILE_NOT_FOUND) return WIN32REGKEY_NOT_FOUND; else return WIN32REGKEY_OTHER_ERROR; } } int save_key_value_into_win32registry(const char *key_name, const char *key_value) { char app_win32regkey_full[128]; HKEY hkey; DWORD disp = 0; str_n_cpy(app_win32regkey_full, APP_WIN32REG_KEYPATH, 64); str_n_cat(app_win32regkey_full, key_name, 63); if (RegCreateKeyEx(HKEY_CURRENT_USER, app_win32regkey_full, 0L, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hkey, &disp) == ERROR_SUCCESS) { if (RegSetValueEx(hkey, NULL, 0L, REG_SZ, (unsigned char *)TEXT(key_value), 256) == ERROR_SUCCESS) { RegCloseKey(hkey); return LIBETM_OK; } else { RegCloseKey(hkey); return WIN32REGKEY_SAVE_ERROR; } } else return WIN32REGKEY_CREATE_ERROR; } /* Return NULL if error */ const char *get_default_browser_from_win32registry() { static char browser_cmd[512]; HKEY hkey; DWORD type = REG_SZ, buf_size = 512; LONG result; if ((result = RegOpenKeyEx(HKEY_CLASSES_ROOT, "http\\shell\\open\\command", 0L, KEY_QUERY_VALUE, &hkey)) == ERROR_SUCCESS) { if (RegQueryValueEx(hkey, NULL, NULL, &type, (unsigned char*)browser_cmd, &buf_size) == ERROR_SUCCESS) { RegCloseKey(hkey); return (const char *)browser_cmd; } else { RegCloseKey(hkey); return NULL; } } else return NULL; } /* Return -1 if error */ int get_win32_taskbar_height() { HWND hwnd; RECT r; LPRECT lpRect = &r; if ((hwnd = FindWindow("Shell_traywnd", "")) != NULL) { if (GetWindowRect(hwnd, lpRect)) return (int) (lpRect->bottom - lpRect->top); } return -1; } /* Unused so commented out */ /*zboolean is_vista_or_higher() { OSVERSIONINFO os_v_info; memset(&os_v_info, 0, sizeof(OSVERSIONINFO)); os_v_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&os_v_info); return (os_v_info.dwMajorVersion >= 6 ? TRUE : FALSE); // Vista = 6.0 }*/ /* Unused so commented out */ /* * Find up to 15 mac addresses for this computer * Return NULL if error */ /*const char **find_mac_addresses() { IP_ADAPTER_INFO *adapter_info; ULONG buf_len = sizeof(adapter_info); PIP_ADAPTER_INFO p_adapter_info; static char macaddr[16][256], tmp[3]; static char *p_macaddr[16]; unsigned int i, j = 0; adapter_info = (IP_ADAPTER_INFO *)malloc2(sizeof(IP_ADAPTER_INFO)); buf_len = sizeof(IP_ADAPTER_INFO); // initial call is supposed to fail if (GetAdaptersInfo(adapter_info, &buf_len) != ERROR_SUCCESS) { free2(adapter_info); adapter_info = (IP_ADAPTER_INFO *)malloc2(buf_len); } // 2nd call if (GetAdaptersInfo(adapter_info, &buf_len) != ERROR_SUCCESS) { free2(adapter_info); return NULL; } else { p_adapter_info = (PIP_ADAPTER_INFO)adapter_info; while (p_adapter_info && j < 15) { macaddr[j][0] = '\0'; for (i = 0; i < 127 && i < p_adapter_info->AddressLength; i++) { snprintf(tmp, 3, "%02X", p_adapter_info->Address[i]); str_n_cat(macaddr[j], tmp, 2); } p_macaddr[j] = macaddr[j]; j++; p_adapter_info = p_adapter_info->Next; } free2(adapter_info); p_macaddr[j] = NULL; } return (const char **)p_macaddr; }*/ const char *win32_error_msg(int i) { static char str[N_SIMULTANEOUS_CALLS][1024]; LPVOID msg_buf; static int count = -1; count++; count &= N_SIMULTANEOUS_CALLS_MASK; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, (DWORD)i, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&msg_buf, 0, NULL); str_n_cpy(str[count], (const char *)msg_buf, 1023); LocalFree(msg_buf); return (const char *)str[count]; } #endif tickr_0.7.1.orig/src/libetm-0.5.0/tcp_socket.c0000644000175000017500000002444214107736721020261 0ustar manutmmanutm/* * libetm / tcp_socket.c - Copyright (C) Emmanuel Thomas-Maurin 2008-2020 * * * - A few TCP (stream) sockets functions - * * 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 . */ #include #include #include #include #include #include #ifndef WIN32_V # include # include # include #else # define _WIN32_WINNT 0x0501 /* Win version = XP (5.1) or higher */ # include #endif #include "libetm.h" #define FPRINTF2(stream, ...) \ {\ fprintf(stream, ## __VA_ARGS__);\ fflush(stream);\ } static int send_recv_timeout_sec = SEND_RECV_TIMEOUT_SEC; static int send_recv_timeout_usec = SEND_RECV_TIMEOUT_USEC; static int connect_timeout_sec = CONNECT_TIMEOUT_SEC; static int connect_timeout_usec = CONNECT_TIMEOUT_USEC; static zboolean use_proxy = FALSE; void set_send_recv_timeout_sec(int timeout) { send_recv_timeout_sec = timeout; } int get_send_recv_timeout_sec() { return send_recv_timeout_sec; } void set_send_recv_timeout_usec(int timeout) { send_recv_timeout_usec = timeout; } int get_send_recv_timeout_usec() { return send_recv_timeout_usec; } void set_connect_timeout_sec(int timeout) { connect_timeout_sec = timeout; } int get_connect_timeout_sec() { return connect_timeout_sec; } void set_connect_timeout_usec(int timeout) { connect_timeout_usec = timeout; } int get_connect_timeout_usec() { return connect_timeout_usec; } void libetm_socket_set_use_proxy(zboolean use_proxy2) { use_proxy = use_proxy2; } zboolean libetm_socket_get_use_proxy() { return use_proxy; } /* * Can use IPv4 or IPv6 */ #ifndef WIN32_V static void *get_in_addr(struct sockaddr *s_a) { if (s_a->sa_family == AF_INET) return &(((struct sockaddr_in *)s_a)->sin_addr); else return &(((struct sockaddr_in6 *)s_a)->sin6_addr); } #endif /* * Open stream socket in non-blocking mode and connect to host. * Return socket fd (> 0) / TCP_SOCK_CREATE_ERROR (-1 on Linux) if error. */ sockt tcp_connect_to_host(const char *host, const char *portnum_str) { sockt sock; #ifndef WIN32_V char ipa_str[INET6_ADDRSTRLEN + 1]; #else /*#define WIN32_INET6_ADDRSTRLEN 46 char ipa_str[WIN32_INET6_ADDRSTRLEN + 1];*/ u_long i_mode = 1; /* != 0 to enable non-blocking mode */ #endif struct addrinfo hints, *server_info, *ptr; fd_set read_set, write_set; struct timeval timeout; int s_opt_value; socklen_t s_opt_len = sizeof(sockt); int i; /* addrinfo stuff */ memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; /*VERBOSE_INFO_OUT("Resolving host: %s ... ", host)*/ if ((i = getaddrinfo(host, portnum_str, &hints, &server_info)) != 0) { if (libetm_socket_get_use_proxy()) { #ifndef WIN32_V warning(FALSE, "getaddrinfo() error: %s: %s", host, gai_strerror(i)); #else warning(FALSE, "getaddrinfo() error: %s: %s", host, sock_error_message()); #endif } else { #ifndef WIN32_V INFO_ERR("getaddrinfo() error: %s: %s\n", host, gai_strerror(i)) #else INFO_ERR("getaddrinfo() error: %s: %s\n", host, sock_error_message()) #endif } return -1; } /*VERBOSE_INFO_OUT("Done\n")*/ /* We get a list */ for (ptr = server_info; ptr != NULL; ptr = ptr->ai_next) { /* Create socket */ if ((sock = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol)) == TCP_SOCK_CREATE_ERROR) { INFO_ERR("Error: %s\n", sock_error_message()) continue; } /* Set socket in non-blocking mode */ #ifndef WIN32_V if ((i = fcntl(sock, F_GETFL, 0)) == TCP_SOCK_FUNC_ERROR) { INFO_ERR("fcntl() error: %s\n", sock_error_message()) CLOSE_SOCK(sock); break; } else if (fcntl(sock, F_SETFL, i | O_NONBLOCK) == TCP_SOCK_FUNC_ERROR) { INFO_ERR("fcntl() error: %s\n", sock_error_message()) CLOSE_SOCK(sock); break; } #else if (ioctlsocket(sock, FIONBIO, &i_mode) == TCP_SOCK_FUNC_ERROR) { INFO_ERR("ioctlsocket() error %s\n", sock_error_message()) CLOSE_SOCK(sock); break; } #endif /* Get IP addr from server_info */ #ifndef WIN32_V inet_ntop(ptr->ai_family, get_in_addr((struct sockaddr *)ptr->ai_addr), ipa_str, INET6_ADDRSTRLEN); VERBOSE_INFO_OUT("Connecting to %s (%s) on port %s ... ", ipa_str, host, portnum_str); #else /*if (is_vista_or_higher()) { // Available only on Vista and above InetNtop(ptr->ai_family, get_in_addr((struct sockaddr *)ptr->ai_addr), ipa_str, WIN32_INET6_ADDRSTRLEN); VERBOSE_INFO_OUT"Connecting to %s (%s) on port %s ... ", ipa_str, host, portnum_str) } else*/ VERBOSE_INFO_OUT("Connecting to %s on port %s ... ", host, portnum_str); #endif /* Connect */ if ((i = connect(sock, ptr->ai_addr, ptr->ai_addrlen)) == TCP_SOCK_FUNC_ERROR && #ifndef WIN32_V errno == EINPROGRESS) { #else WSAGetLastError() == WSAEWOULDBLOCK) { #endif /* As socket is in non-blocking mode, we must use select() */ FD_ZERO(&read_set); FD_ZERO(&write_set); FD_SET(sock, &read_set); FD_SET(sock, &write_set); timeout.tv_sec = get_connect_timeout_sec(); timeout.tv_usec = get_connect_timeout_usec(); if ((i = select(sock + 1, &read_set, &write_set, NULL, &timeout)) == TCP_SOCK_FUNC_ERROR) { INFO_ERR("select() error: %s\n", sock_error_message()) } else if (i == 0){ INFO_ERR("Timed out\n") } else if (FD_ISSET(sock, &read_set) || FD_ISSET(sock, &write_set)) { if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void *)(&s_opt_value), &s_opt_len) == TCP_SOCK_FUNC_ERROR) { INFO_ERR("getsockopt() error: %s\n", sock_error_message()) } else if (s_opt_value == 0) { VERBOSE_INFO_OUT("OK\n") freeaddrinfo(server_info); return sock; } #ifndef WIN32_V INFO_ERR("getsockopt(): %s\n", strerror(s_opt_value)) #else INFO_ERR("getsockopt(): %s\n", win32_error_msg(s_opt_value)) #endif CLOSE_SOCK(sock); break; } CLOSE_SOCK(sock); break; } else if (i == 0) { VERBOSE_INFO_OUT("OK\n") freeaddrinfo(server_info); return sock; } else { INFO_ERR("connect() error: %s\n", sock_error_message()) CLOSE_SOCK(sock); } } freeaddrinfo(server_info); return -1; } int writable_data_is_available_on_tcp_socket(sockt sock) { fd_set write_set; struct timeval timeout; int i; FD_ZERO(&write_set); FD_SET(sock, &write_set); timeout.tv_sec = get_send_recv_timeout_sec(); timeout.tv_usec = get_send_recv_timeout_usec(); if ((i = select(sock + 1, NULL, &write_set, NULL, &timeout)) == TCP_SOCK_FUNC_ERROR) { INFO_ERR("select() error: %s\n", sock_error_message()) return SELECT_ERROR; } else if (i == 0) { return SELECT_TIMED_OUT; } else { if (FD_ISSET(sock, &write_set)) return SELECT_TRUE; else return SELECT_FALSE; } } int readable_data_is_available_on_tcp_socket(sockt sock) { fd_set read_set; struct timeval timeout; int i; FD_ZERO(&read_set); FD_SET(sock, &read_set); timeout.tv_sec = get_send_recv_timeout_sec(); timeout.tv_usec = get_send_recv_timeout_usec(); if ((i = select(sock + 1, &read_set, NULL, NULL, &timeout)) == TCP_SOCK_FUNC_ERROR) { INFO_ERR("select() error: %s\n", sock_error_message()) return SELECT_ERROR; } else if (i == 0) { return SELECT_TIMED_OUT; } else { if (FD_ISSET(sock, &read_set)) return SELECT_TRUE; else return SELECT_FALSE; } } /* * Return n bytes sent or TCP_SOCK_FUNC_ERROR (-1 on Linux) if error (connection * closed by server or ?) */ int tcp_send_full(sockt sock, const char *str) { int len = strlen(str), i, j = 0; while (writable_data_is_available_on_tcp_socket(sock) == SELECT_TRUE) { if ((i = send(sock, str + j, len, 0)) != TCP_SOCK_FUNC_ERROR) { if (i > 0) { j += i; len -= i; if (len == 0) break; } else { /* Something to do ? */ } } else { j = i; /* TCP_SOCK_FUNC_ERROR */ #ifndef WIN32_V if (errno == EPIPE) { #else if ((i = WSAGetLastError()) == WSAECONNRESET || i == WSAECONNABORTED ||\ i == WSAESHUTDOWN) { #endif VERBOSE_INFO_ERR("Connection closed by server\n") } else { INFO_ERR("send() error: %s\n", sock_error_message()) } break; } } return j; } /* * Return response = tcp_recv_full(socket, &bytes_received, &status) or NULL if error. * -> status = TCP_SOCK_OK, CONNECTION_CLOSED_BY_SERVER, TCP_SOCK_FUNC_ERROR or TCP_SOCK_SHOULD_BE_CLOSED. * -> allocate memory for response (must be freed afterwards with free2() if != NULL). */ char *tcp_recv_full(sockt sock, int *bytes_received, int *status) { char *response, *full_response; int i; *bytes_received = 0; response = malloc2(RECV_CHUNK_LEN + 1); response[0] = '\0'; full_response = l_str_new(response); while (readable_data_is_available_on_tcp_socket(sock) == SELECT_TRUE) { if ((i = recv(sock, response, RECV_CHUNK_LEN, 0)) != TCP_SOCK_FUNC_ERROR) { if (i > 0) { response[MIN(i, RECV_CHUNK_LEN)] = '\0'; full_response = l_str_cat(full_response, response); *bytes_received += i; *status = TCP_SOCK_OK; } else if (i == 0) { VERBOSE_INFO_ERR("Connection closed by server\n") *status = CONNECTION_CLOSED_BY_SERVER; break; } } else { l_str_free(full_response); full_response = NULL; *status = TCP_SOCK_FUNC_ERROR; #ifndef WIN32_V INFO_ERR("recv() error: %s\n", sock_error_message()) #else if ((i = WSAGetLastError()) == WSAECONNRESET || i == WSAECONNABORTED ||\ i == WSAESHUTDOWN) { VERBOSE_INFO_ERR("Connection closed by server\n") *status = TCP_SOCK_SHOULD_BE_CLOSED; } else { INFO_ERR("recv() error: %s\n", win32_error_msg(i)) } #endif break; } } free2(response); return full_response; } const char *sock_error_message() { static char str[N_SIMULTANEOUS_CALLS][1024]; static int count = -1; count++; count &= N_SIMULTANEOUS_CALLS_MASK; #ifndef WIN32_V str_n_cpy(str[count], strerror(errno), 1023); #else str_n_cpy(str[count], win32_error_msg(WSAGetLastError()), 1023); #endif return (const char *)str[count]; } tickr_0.7.1.orig/src/libetm-0.5.0/Makefile-libetm-linux0000644000175000017500000000132614107736721022022 0ustar manutmmanutm# Makefile for libetm - Linux version src = str_mem.c tcp_socket.c error.c misc.c #dllist.c obj = $(src:.c=.o) headers = libetm.h $(src:.c=.h) INC_DIR = /usr/include/libetm LIB_DIR = /usr/lib/libetm CC = gcc CFLAGS = -O2 -Wall -Wextra -Wunused-parameter -Wshadow -Wpointer-arith\ -ffast-math -pedantic -Wno-variadic-macros all: libetm.a $(obj): $(src) $(headers) Makefile $(CC) $(CFLAGS) -c $(src) libetm.a: $(obj) ar -rs libetm.a $(obj) .PHONY: install install: mkdir -p $(INC_DIR) cp $(headers) $(INC_DIR)/ chmod -R a+r $(INC_DIR) mkdir -p $(LIB_DIR) cp libetm.a $(LIB_DIR)/ chmod -R a+r $(LIB_DIR) .PHONY: uninstall uninstall: rm -r $(INC_DIR) rm -r $(LIB_DIR) .PHONY: clean clean: rm $(obj) libetm.a tickr_0.7.1.orig/src/libetm-0.5.0/win32_specific.h0000644000175000017500000000362414107736721020736 0ustar manutmmanutm/* * libetm / win32_specific.h - Copyright (C) Emmanuel Thomas-Maurin 2008-2020 * * * - Win32 specific functions - * * 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 . */ #ifndef INC_LIBETM_WIN32_SPECIFIC_H #define INC_LIBETM_WIN32_SPECIFIC_H #ifdef WIN32_V extern FILE *std_out, *std_err; /* * On Linux, STD_OUT = stdout and STD_ERR = stderr / on win32, we must * first create specific text files then pass them to this function. */ void libetm_init_win32_stdout_stderr(FILE *, FILE *); void libetm_init_win32_sockets(); void libetm_cleanup_win32_sockets(); /* Return NULL if error */ const char *get_appdata_dir(); const char *get_appdata_dir_w(); const char *get_progfiles_dir(); /* key_value must be able to store 255 chars */ int get_key_value_from_win32registry(const char *, char *); int save_key_value_into_win32registry(const char *, const char *); /* Return NULL if error */ const char *get_default_browser_from_win32registry(); /* Return -1 if error */ int get_win32_taskbar_height(); /* Unused so commented out */ /*zboolean is_vista_or_higher();*/ /* Unused so commented out */ /* * Find up to 15 mac addresses for this computer * Return NULL if error */ /*const char **find_mac_addresses();*/ const char *win32_error_msg(int); #endif #endif /* INC_LIBETM_WIN32_SPECIFIC_H */ tickr_0.7.1.orig/src/libetm-0.5.0/error.c0000644000175000017500000000503014107736721017244 0ustar manutmmanutm/* * libetm / error.c - Copyright (C) Emmanuel Thomas-Maurin 2008-2020 * * * - Error handling - * * 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 . */ #include #include #include "libetm.h" /* * Generic find error string from error code in an ErrSt array function. * Need to pass array's number of elements, as arrays are always passed * as pointer: ErrSt array, n_el, error_code. */ const char *error_str_from_error_code(const ErrSt e_a[], int n_el, int e_c) { static const char *unknown = "(Unregistered error code)"; int i; for (i = 0; i < n_el; i++) if (e_a[i].code == e_c) return e_a[i].str; return unknown; } /* * Return error string from error code which apply to libetm only. */ const char *libetm_error_str(libetm_error_code e_c) { if (e_c >= LIBETM_OK && e_c <= LIBETM_LASTERRORCODE) return error_str_from_error_code(lib_error, sizeof(lib_error) / sizeof(lib_error[0]), e_c); else return ""; } /* * Critical error handler for libetm that will call big_error() function * defined in app, so that appropiate behaviour can be choosen. */ int big_error_in_lib(libetm_error_code e_c, const char *str) { /* Only call big_error() in app */ big_error(e_c, "%s-%s: %s(): %s", LIBETM_NAME, LIBETM_VERSION_NUM, str, libetm_error_str(e_c)); return e_c; } /* * Warning handler for libetm that will call warning() function * defined in app, so that appropiate behaviour can be choosen. */ void warning_in_lib(int wait, libetm_error_code e_c, const char *str) { /* Only call warning() in app */ warning(wait, "%s-%s: %s(): %s", LIBETM_NAME, LIBETM_VERSION_NUM, str, libetm_error_str(e_c)); } /* * Dump libetm error codes and strings. */ void dump_libetm_error_codes() { int i; fprintf(STD_OUT, "%s-%s error codes and strings:\n", LIBETM_NAME, LIBETM_VERSION_NUM); for (i = 0; i < (int)(sizeof(lib_error) / sizeof(lib_error[0])); i++) fprintf(STD_OUT, "%d %s\n", i, libetm_error_str(i)); } tickr_0.7.1.orig/src/libetm-0.5.0/README0000644000175000017500000000016214107736721016630 0ustar manutmmanutmThis is only a tiny lib with a few functions I use a lot. To compile for win32, you must use the -DWIN32_V flag. tickr_0.7.1.orig/src/libetm-0.5.0/ChangeLog0000644000175000017500000000165714107736721017534 0ustar manutmmanutmlibetm version 0.5.0 -------------------- - Fix compile issues to produce WIN64 binaries with MinGW-w64-x86_64. (Jun 13 2020) -> === NOT FIXED YET === - readable_size() can handle huge sizes now. (Dec 2 2016) - New INFO_OUT(...), INFO_ERR(...), VERBOSE_INFO_OUT(...), VERBOSE_INFO_ERR(...), DEBUG_INFO(...) variadic macros, some of which depends on definition of VERBOSE_OUTPUT and DEBUG_OUTPUT. (Nov 17 2016) - New remove_surrounding_whitespaces_from_str() function. (Oct 24 2016) - New big_error() and warning() prototypes: (int, const char *format, ...) (Mar 19 2016) - New socket connect/send-recv timeout values setter/getter functions. (Jul 20 2015) - New l_str_insert_at_b() function. (Nov 12 2014) - Improved error hanling. (Nov 6 2014) - Add remove_leading/trailing_whitespaces_from_str(). (May 31 2014) - Stream sockets API moved from tickr -> tcp_socket.c/h. (Nov 12 2013) - New 'zboolean' type. (Nov 8 2013) tickr_0.7.1.orig/src/libetm-0.5.0/error.h0000644000175000017500000001043414107736721017255 0ustar manutmmanutm/* * libetm / error.h - Copyright (C) Emmanuel Thomas-Maurin 2008-2020 * . */ #ifndef INC_LIBETM_ERROR_H #define INC_LIBETM_ERROR_H typedef struct { const int code; const char *str; } ErrSt; /* All libetm error values */ /* Exactly matching this enum and ErrSt array below doesn't matter anymore. */ typedef enum { LIBETM_OK, /* str_mem.c */ OUT_OF_MEMORY, ZERO_RQ_SIZE, NEG_RQ_SIZE, NULL_DEST, SRC_EQ_DEST, STR_OVERLAP, NULL_POINTER_FREE, RNDSTR_UNKNOWN_MODE, /* tcp_socket.c */ TCP_SOCK_ERROR, TCP_SOCK_CANT_CONNECT, TCP_SOCK_SHOULD_BE_CLOSED, SELECT_ERROR, SELECT_TIMED_OUT, SELECT_TRUE, SELECT_FALSE, TCP_SEND_ERROR, TCP_RECV_ERROR, CONNECTION_CLOSED_BY_SERVER, /* win32_specific.c */ #ifdef WIN32_V WIN32_ERROR, WIN32REGKEY_NOT_FOUND, WIN32REGKEY_CREATE_ERROR, WIN32REGKEY_SAVE_ERROR, WIN32REGKEY_OTHER_ERROR, #endif /* Used by applications to enum error codes above this one. */ LIBETM_LASTERRORCODE } libetm_error_code; /* Exactly matching this ErrSt array and enum above doesn't matter anymore. */ static const ErrSt lib_error[] = { {LIBETM_OK, "OK"}, /* str_mem.c */ {OUT_OF_MEMORY, "Out of memory"}, {ZERO_RQ_SIZE, "Zero requested size"}, {NEG_RQ_SIZE, "Negative requested size"}, {NULL_DEST, "Null destination string"}, {SRC_EQ_DEST, "Source string = destination string"}, {STR_OVERLAP, "Strings overlap"}, {NULL_POINTER_FREE, "Attempting to free a null pointer"}, {RNDSTR_UNKNOWN_MODE, "Generate random string: Unknown mode"}, /* tcp_socket.c */ {TCP_SOCK_ERROR, "TCP socket error"}, {TCP_SOCK_CANT_CONNECT, "TCP socket error: Can't connect"}, {TCP_SOCK_SHOULD_BE_CLOSED, "TCP socket error: Should be closed"}, {SELECT_ERROR, "Select error"}, {SELECT_TIMED_OUT, "Select error: Timed out"}, {SELECT_TRUE, "(Not an error) select TRUE"}, {SELECT_FALSE, "(Not an error) select FALSE"}, {TCP_SEND_ERROR, "TCP send error"}, {TCP_RECV_ERROR, "TCP recv error"}, {CONNECTION_CLOSED_BY_SERVER, "Connection closed by server"}, /* win32_specific.c */ #ifdef WIN32_V {WIN32_ERROR, "Win32 error"}, {WIN32REGKEY_NOT_FOUND, "Can't find win32 registry key"}, {WIN32REGKEY_CREATE_ERROR, "Can't create win32 registry key"}, {WIN32REGKEY_SAVE_ERROR, "Can't save win32 registry key"}, {WIN32REGKEY_OTHER_ERROR, "Win32 registry key error (undetermined)"}, #endif /* Used by applications to enum error codes above this one. */ {LIBETM_LASTERRORCODE, "Libetm last enumerated error code"} }; /* * Generic find error string from error code in an ErrSt array function. * Need to pass array's number of elements, as arrays are always passed * as pointer: ErrSt array, n_el, error_code. */ const char *error_str_from_error_code(const ErrSt [], int, int); /* * Return error string from error code which apply to libetm only. */ const char *libetm_error_str(libetm_error_code); /* * In-application-defined CRITICAL ERROR handler prototype. * Error code from application should enum above LIB_LASTERRORCODE. * (See error_handler_example.c.) */ int big_error(int, const char *, ...); /* * In-application-defined WARNING handler prototype. * Error code from application should enum above LIB_LASTERRORCODE. * (See error_handler_example.c.) */ void warning(int, const char *, ...); /* * This will call big_error() function defined in application. */ int big_error_in_lib(libetm_error_code, const char *); /* * This will call warning() function defined in application. */ /* Unused/useless so far... */ void warning_in_lib(int, libetm_error_code, const char *); /* * Dump libetm error codes and strings. */ void dump_libetm_error_codes(); #endif /* INC_LIBETM_ERROR_H */ tickr_0.7.1.orig/src/Makefile.am0000644000175000017500000000003514107736721016071 0ustar manutmmanutmSUBDIRS = libetm-0.5.0 tickr tickr_0.7.1.orig/src/Makefile.in0000664000175000017500000004265714107736721016124 0ustar manutmmanutm# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ XML2_CFLAGS = @XML2_CFLAGS@ XML2_LIBS = @XML2_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = libetm-0.5.0 tickr all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tickr_0.7.1.orig/src/tickr/0000744000175000017500000000000014107736721015151 5ustar manutmmanutmtickr_0.7.1.orig/src/tickr/tickr_prefwin.c0000644000175000017500000021405514107736721020174 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" #define BLANK_STR_2_SP " " #define BLANK_STR_8_SP " " /* These variables and widgets are all set as static global for convenience */ static TickerEnv *env; static char current_url[FILE_NAME_MAXLEN + 1]; static GtkWidget *dialog, *sc_win, *entry_homefeed, *table; static GtkWidget *cancel_but, *reset_but, *apply_but, *ok_but; static GtkWidget *fullsettings_but, *connsettings_but; static GtkWidget *top_but, *bottom_but, *fullwidth_but, *curfeed_but; static GtkWidget *spinbut_delay, *spinbut_shiftsize; static GtkWidget *spinbut_winx, *spinbut_winy, *spinbut_winw, *spinbut_winh; static GtkWidget *checkbut_disablescreenlimits; static GtkWidget *checkbut_setgradientbg, *checkbut_setclockgradientbg; static GtkWidget *checkbut_windec, *checkbut_iconintaskbar, *checkbut_winsticky; static GtkWidget *spinbut_shadowoffsetx, *spinbut_shadowoffsety; static GtkWidget *spinbut_shadowfx, *spinbut_rssrefresh; static GtkWidget *spinbut_wintransparency, *spinbut_nitemsperfeed; static GtkWidget *checkbut_shadow, *checkbut_alwaysontop, *checkbut_overrideredirect; static GtkWidget *checkbut_windec, *checkbut_spchars, *checkbut_revsc; static GtkWidget *checkbut_feedtitle, *checkbut_itemtitle, *checkbut_itemdes; static GtkWidget *checkbut_striptags, *checkbut_uppercase; static GtkWidget *checkbut_clocksec, *checkbut_clock12h, *checkbut_clockdate; static GtkWidget *checkbut_clockaltdateform; static GtkWidget *checkbut_nopopups, *checkbut_mouseover, *checkbut_noleftclick; static GtkWidget *checkbut_sfpickercloseswhenpointerleaves, *checkbut_feedordering; static GtkWidget *font_but, *clock_font_but; static GtkWidget *fg_color_but, /* *highlight_fg_color_but,*/ *bg_color_but, *bg_color2_but; static GtkWidget *clock_fg_color_but, *clock_bg_color_but, *clock_bg_color2_but; /*static GtkWidget *rbut_box_mi, *radio_but_mi_1, *radio_but_mi_2, *radio_but_mi_3;*/ static GtkWidget *rbut_box_clock, *radio_but_clock_1, *radio_but_clock_2, *radio_but_clock_3; static GtkWidget *rbut_box_mw, *radio_but_mw_1, *radio_but_mw_2, *radio_but_mw_3; static GtkWidget *entry_linedel, *entry_newpagech, *entry_tabch; static GtkWidget *entry_feedtitledel, *entry_itemtitledel, *entry_itemdesdel; static GtkWidget *entry_openlinkcmd, *entry_openlinkargs; static GtkObject *adj_delay, *adj_shiftsize, *adj_winx, *adj_winy; static GtkObject *adj_winw, *adj_winh, *adj_shadowoffsetx, *adj_shadowfx; static GtkObject *adj_shadowoffsety, *adj_rssrefresh; static GtkObject *adj_wintransparency, *adj_nitemsperfeed; /* Need this prototype */ static void set_ui_changes_to_params(Params *, zboolean); static int update_win_x_y_w_adj(GtkWidget *widget) { zboolean disable_screen_limits; widget = widget; if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_disablescreenlimits))) disable_screen_limits = TRUE; else disable_screen_limits = FALSE; gtk_adjustment_set_upper(GTK_ADJUSTMENT(adj_winx), disable_screen_limits ? WIN_MAX_X : env->screen_w); gtk_adjustment_set_upper(GTK_ADJUSTMENT(adj_winy), disable_screen_limits ? WIN_MAX_Y : env->screen_h); gtk_adjustment_set_upper(GTK_ADJUSTMENT(adj_winw), disable_screen_limits ? WIN_MAX_W : env->screen_w); gtk_adjustment_changed(GTK_ADJUSTMENT(adj_winx)); gtk_adjustment_changed(GTK_ADJUSTMENT(adj_winy)); gtk_adjustment_changed(GTK_ADJUSTMENT(adj_winw)); gtk_spin_button_update(GTK_SPIN_BUTTON(spinbut_winx)); gtk_spin_button_update(GTK_SPIN_BUTTON(spinbut_winy)); gtk_spin_button_update(GTK_SPIN_BUTTON(spinbut_winw)); return TRUE; } static int move_to_top(GtkWidget *widget) { widget = widget; gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbut_winy), 0); return TRUE; } static int move_to_bottom(GtkWidget *widget) { char font_name_size[FONT_MAXLEN + 1]; char font_name[FONT_NAME_MAXLEN + 1], font_size[FONT_SIZE_MAXLEN + 1]; int requested_font_size, requested_h, y_bottom; /* We backup this param first because... */ char disable_popups_bak = get_params()->disable_popups; /* ...we want this window to always popup */ get_params()->disable_popups = 'n'; widget = widget; /* We need to know requested ticker height */ requested_h = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_winh)); if (requested_h > 0 && requested_h < DRWA_HEIGHT_MIN) requested_h = DRWA_HEIGHT_MIN; else if (requested_h == 0) { /* Compute ticker height from requested font size */ str_n_cpy(font_name_size, (char *)gtk_font_button_get_font_name(GTK_FONT_BUTTON(font_but)), FONT_MAXLEN); split_font(font_name_size, font_name, font_size); /* In all cases, font size can't be > FONT_MAXSIZE */ requested_font_size = MIN(atoi(font_size), FONT_MAXSIZE); snprintf(font_size, FONT_SIZE_MAXLEN + 1, "%3d", requested_font_size); compact_font(font_name_size, font_name, font_size); requested_h = get_layout_height_from_font_name_size(font_name_size); } y_bottom = env->screen_h - requested_h; #ifndef G_OS_WIN32 /* How to get taskbar height on Linux ? */ warning(BLOCK, "Taskbar height: Will use %d pixels arbitrary value - " "Please adjust as necessary afterwards", ARBITRARY_TASKBAR_HEIGHT); y_bottom -= ARBITRARY_TASKBAR_HEIGHT; #else if (get_win32_taskbar_height() != -1) y_bottom -= get_win32_taskbar_height(); else { warning(BLOCK, "Couldn't compute Taskbar height: Will use %d pixels arbitrary value - " "Please adjust as necessary afterwards", ARBITRARY_TASKBAR_HEIGHT); y_bottom -= ARBITRARY_TASKBAR_HEIGHT; } #endif gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbut_winy), y_bottom); get_params()->disable_popups = disable_popups_bak; return TRUE; } static int set_full_width(GtkWidget *widget) { widget = widget; gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbut_winw), env->screen_w); /* Will also push ticker in left corner */ gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbut_winx), 0); return TRUE; } static int get_current_url(GtkWidget *widget) { widget = widget; gtk_entry_set_text(GTK_ENTRY(entry_homefeed), current_url); return TRUE; } GtkLabel *bg_color2_label; static int check_set_gradient_widgets(GtkWidget *widget) { widget = widget; if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_setgradientbg))) { gtk_widget_set_sensitive(GTK_WIDGET(bg_color2_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(bg_color2_but), TRUE); } else { gtk_widget_set_sensitive(GTK_WIDGET(bg_color2_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(bg_color2_but), FALSE); } return TRUE; } GtkLabel *newpagech_label, *tabch_label; static int check_set_sp_chars_widgets(GtkWidget *widget) { widget = widget; if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_spchars))) { gtk_widget_set_sensitive(GTK_WIDGET(newpagech_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(entry_newpagech), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(tabch_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(entry_tabch), TRUE); } else { gtk_widget_set_sensitive(GTK_WIDGET(newpagech_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(entry_newpagech), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(tabch_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(entry_tabch), FALSE); } return TRUE; } GtkLabel *clock_sec_label, *clock_12h_label, *clock_date_label, *clock_altdateform_label, *clock_font_label, *clock_fg_color_label, *clock_bg_color_label, *setclockgradientbg_label, *clock_bg_color2_label; static int check_set_clock_widgets(GtkWidget *widget) { widget = widget; if (!(zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_but_clock_3))) { /* ! (clock = none) */ gtk_widget_set_sensitive(GTK_WIDGET(clock_sec_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(checkbut_clocksec), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(clock_12h_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(checkbut_clock12h), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(clock_date_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(checkbut_clockdate), TRUE); if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_clockdate))) { gtk_widget_set_sensitive(GTK_WIDGET(clock_altdateform_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(checkbut_clockaltdateform), TRUE); } else { gtk_widget_set_sensitive(GTK_WIDGET(clock_altdateform_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(checkbut_clockaltdateform), FALSE); } gtk_widget_set_sensitive(GTK_WIDGET(clock_font_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(clock_font_but), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(clock_fg_color_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(clock_fg_color_but), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(clock_bg_color_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(clock_bg_color_but), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(setclockgradientbg_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(checkbut_setclockgradientbg), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(clock_bg_color2_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(clock_bg_color2_but), TRUE); } else { gtk_widget_set_sensitive(GTK_WIDGET(clock_sec_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(checkbut_clocksec), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(clock_12h_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(checkbut_clock12h), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(clock_date_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(checkbut_clockdate), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(clock_altdateform_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(checkbut_clockaltdateform), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(clock_font_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(clock_font_but), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(clock_fg_color_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(clock_fg_color_but), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(clock_bg_color_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(clock_bg_color_but), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(setclockgradientbg_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(checkbut_setclockgradientbg), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(clock_bg_color2_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(clock_bg_color2_but), FALSE); } return TRUE; } /* For alignment of GTK widgets */ #define LEFT 0 #define RIGHT 1 #define EXPAND 2 static GtkLabel *table_attach_styled_double_cell(GtkWidget *table2, char *text1, char *text2, char *tooltip, GtkWidget *w1, GtkWidget *w2, GtkWidget *w3, int column1, int column2, int row, int alignment1, int alignment2) { GtkWidget *hbox, *label; char *label_text, *tooltip_text; /* Label in column 1 */ label_text = l_str_new(text1); if (text2 != NULL) { label_text = l_str_cat(label_text, " ("); label_text = l_str_cat(label_text, text2); label_text = l_str_cat(label_text, "):" BLANK_STR_2_SP); } else label_text = l_str_cat(label_text, ":" BLANK_STR_2_SP); label = gtk_label_new(label_text); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), alignment1, 0.5); gtk_table_attach_defaults(GTK_TABLE(table2), label, column1, column1 + 1, row, row + 1); l_str_free(label_text); /* Widgets in column 2 */ hbox = gtk_hbox_new(FALSE, 0); if (alignment2 == RIGHT) gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(NULL), TRUE, TRUE, 0); if (w1 != NULL) gtk_box_pack_start(GTK_BOX(hbox), w1, alignment2 == EXPAND ? TRUE : FALSE, alignment2 == EXPAND ? TRUE : FALSE, 0); if (w2 != NULL) gtk_box_pack_start(GTK_BOX(hbox), w2, alignment2 == EXPAND ? TRUE : FALSE, alignment2 == EXPAND ? TRUE : FALSE, 0); if (w3 != NULL) gtk_box_pack_start(GTK_BOX(hbox), w3, alignment2 == EXPAND ? TRUE : FALSE, alignment2 == EXPAND ? TRUE : FALSE, 0); if (alignment2 == LEFT) gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(NULL), TRUE, TRUE, 0); gtk_table_attach_defaults(GTK_TABLE(table2), hbox, column2, column2 + 1, row, row + 1); /* Tooltip */ tooltip_text = l_str_new(tooltip); gtk_widget_set_tooltip_text(label, tooltip_text); gtk_widget_set_tooltip_text(hbox, tooltip_text); l_str_free(tooltip_text); return GTK_LABEL(label); } /* * CHECK THIS: * - If font size is changed, tickr height is set to 0 * - If tickr height is changed, font size is adjusted * -> ???? * if (gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_winh)) > 0) */ /* Window layout (kind of) */ #ifdef COLUMN_1_ALIGN # undef COLUMN_1_ALIGN #endif #ifdef COLUMN_2_ALIGN # undef COLUMN_2_ALIGN #endif #ifdef ROW_SPACING # undef ROW_SPACING #endif #define COLUMN_1_ALIGN RIGHT #define COLUMN_2_ALIGN LEFT #define ROW_SPACING 5 /* * Open a dialog to edit a few useful params. (This is actually a stripped * down, slightly modified version of modify_params()). * Return next action requested (if any). */ next_action easily_modify_params(Params *prm) { int response; zboolean changes_have_been_made; int do_next = DO_NEXT_NOTHING; Params *prm_bak; int i; env = get_ticker_env(); str_n_cpy(current_url, get_resource()->id, FILE_NAME_MAXLEN); gtk_window_set_keep_above(GTK_WINDOW(env->win), FALSE); dialog = gtk_dialog_new_with_buttons( "Preferences", GTK_WINDOW(env->win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); fullsettings_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "Full\nSettings", GTK_RESPONSE_FULL_SETTINGS); connsettings_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "Connection\nSettings", GTK_RESPONSE_CONN_SETTINGS); cancel_but = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL_CLOSE); reset_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "Reset", GTK_RESPONSE_RESET); /* We only have 'OK', which apply ***and*** save settings. */ ok_but = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_OK); apply_but = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_APPLY, GTK_RESPONSE_APPLY); gtk_widget_set_tooltip_text(fullsettings_but, "Full settings minus connection settings"); gtk_widget_set_tooltip_text(ok_but, "Apply, save and quit"); gtk_widget_set_tooltip_text(apply_but, "Don't save and don't quit"); table = gtk_table_new(12, 3, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), ROW_SPACING); gtk_table_set_col_spacings(GTK_TABLE(table), 0); gtk_container_set_border_width(GTK_CONTAINER(table), 15); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table); gtk_table_attach_defaults(GTK_TABLE(table), gtk_label_new(BLANK_STR_8_SP), 1, 2, 0, 1); i = 0; #ifdef COLUMN_1 # undef COLUMN_1 #endif #ifdef COLUMN_2 # undef COLUMN_2 #endif #define COLUMN_1 0 #define COLUMN_2 2 /* * Delay */ adj_delay = gtk_adjustment_new(prm->delay, 1, 50, 1, 5, 0); spinbut_delay = gtk_spin_button_new(GTK_ADJUSTMENT(adj_delay), 0.0, 0); table_attach_styled_double_cell(table, "Delay", "Milliseconds", APP_NAME " speed = K1 / scrolling delay\n- Decrease delay to speed up scrolling\n" "- Increase delay to slow down scrolling", spinbut_delay, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Font */ font_but = gtk_font_button_new_with_font(prm->font_name_size); table_attach_styled_double_cell(table, "Font", NULL, "WARNING: Font size will be overridden by " APP_NAME " height, if height > 0", font_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * fg color */ fg_color_but = gtk_color_button_new_with_color(&prm->fg_color); gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(fg_color_but), TRUE); gtk_color_button_set_alpha(GTK_COLOR_BUTTON(fg_color_but), prm->fg_color_alpha); table_attach_styled_double_cell(table, "Foreground Color", NULL, NULL, fg_color_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * bg color */ bg_color_but = gtk_color_button_new_with_color(&prm->bg_color); gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(bg_color_but), TRUE); gtk_color_button_set_alpha(GTK_COLOR_BUTTON(bg_color_but), prm->bg_color_alpha); table_attach_styled_double_cell(table, "Background Color", NULL, NULL, bg_color_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Set gradient bg */ checkbut_setgradientbg = gtk_check_button_new(); if (prm->set_gradient_bg == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_setgradientbg), TRUE); else if (prm->set_gradient_bg == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_setgradientbg), FALSE); table_attach_styled_double_cell(table, "Use a gradient background", NULL, NULL, checkbut_setgradientbg, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * bg color2 */ bg_color2_but = gtk_color_button_new_with_color(&prm->bg_color2); gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(bg_color2_but), TRUE); gtk_color_button_set_alpha(GTK_COLOR_BUTTON(bg_color2_but), prm->bg_color2_alpha); bg_color2_label = table_attach_styled_double_cell(table, "Background Color2", NULL, NULL, bg_color2_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * win_y */ adj_winy = gtk_adjustment_new(prm->win_y, 0, (prm->disable_screen_limits == 'y' ? WIN_MAX_Y : env->screen_h), 1, 5, 0); spinbut_winy = gtk_spin_button_new(GTK_ADJUSTMENT(adj_winy), 0.0, 0); top_but = gtk_button_new_with_label("Top"); bottom_but = gtk_button_new_with_label("Bottom"); table_attach_styled_double_cell(table, "Vertical Location", "Pixels", NULL, top_but, bottom_but, spinbut_winy, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * win_h */ adj_winh = gtk_adjustment_new(prm->win_h, 0, env->screen_h, 1, 5, 0); spinbut_winh = gtk_spin_button_new(GTK_ADJUSTMENT(adj_winh), 0.0, 0); table_attach_styled_double_cell(table, APP_NAME " Height", "Pixels", "WARNING: If > 0, will override font size", spinbut_winh, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Window always-on-top */ checkbut_alwaysontop = gtk_check_button_new(); if (prm->always_on_top == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_alwaysontop), TRUE); else if (prm->always_on_top == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_alwaysontop), FALSE); table_attach_styled_double_cell(table, APP_NAME " always above other windows", NULL, NULL, checkbut_alwaysontop, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Reverse scrolling */ checkbut_revsc = gtk_check_button_new(); if (prm->reverse_sc == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_revsc), TRUE); else if (prm->reverse_sc == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_revsc), FALSE); table_attach_styled_double_cell(table, "Reverse scrolling", NULL, "For languages written/read from R to L", checkbut_revsc, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Read n items max per feed */ adj_nitemsperfeed = gtk_adjustment_new(prm->n_items_per_feed, 0, 500, 1, 5, 0); spinbut_nitemsperfeed = gtk_spin_button_new(GTK_ADJUSTMENT(adj_nitemsperfeed), 0.0, 0); table_attach_styled_double_cell(table, "Read N items max per feed", NULL, "0 = no limit", spinbut_nitemsperfeed, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Mouse wheel scrolling behaviour */ radio_but_mw_1 = gtk_radio_button_new_with_label(NULL, "Speed"); radio_but_mw_2 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_but_mw_1), "Feed"); radio_but_mw_3 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_but_mw_1), "None"); rbut_box_mw = gtk_hbox_new(TRUE, 2); gtk_box_pack_start(GTK_BOX(rbut_box_mw), radio_but_mw_1, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(rbut_box_mw), radio_but_mw_2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(rbut_box_mw), radio_but_mw_3, TRUE, TRUE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_mw_1), TRUE); if (prm->mouse_wheel_action == 's') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_mw_1), TRUE); else if (prm->mouse_wheel_action == 'f') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_mw_2), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_mw_3), TRUE); table_attach_styled_double_cell(table, "Mouse Wheel acts on", NULL, "Use Mouse Wheel for alternative action", rbut_box_mw, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); /* Connect buttons / widgets to callbacks */ g_signal_connect(G_OBJECT(checkbut_setgradientbg), "clicked", G_CALLBACK(check_set_gradient_widgets), NULL); g_signal_connect(G_OBJECT(top_but), "clicked", G_CALLBACK(move_to_top), NULL); g_signal_connect(G_OBJECT(bottom_but), "clicked", G_CALLBACK(move_to_bottom), NULL); /* This must be run once at least. */ check_set_gradient_widgets(NULL); /* This will let us know if changes have been made. */ prm_bak = malloc2(sizeof(Params)); memcpy((void *)prm_bak, (const void *)prm, sizeof(Params)); changes_have_been_made = FALSE; gtk_widget_grab_focus(cancel_but); gtk_widget_show_all(dialog); gtk_window_set_focus(GTK_WINDOW(dialog), NULL); while (1) { response = gtk_dialog_run(GTK_DIALOG(dialog)); env->suspend_rq = TRUE; if (response == GTK_RESPONSE_RESET) { if (question_win("Reset *all* settings to default values ?\n" "(Your current settings will be lost)", NO) == YES) { set_default_options(prm); save_to_config_file(prm); current_feed(); env->compute_rq = TRUE; /*do_next = DO_NEXT_REOPEN; // Not used anymore */ break; } else continue; } else if (response == GTK_RESPONSE_FULL_SETTINGS || response == GTK_RESPONSE_APPLY || response == GTK_RESPONSE_OK) { set_ui_changes_to_params(prm, FALSE); } if (response == GTK_RESPONSE_FULL_SETTINGS) { do_next = DO_NEXT_OPEN_FULL_SETTINGS; break; } else if (response == GTK_RESPONSE_CONN_SETTINGS) { if (question_win("Save changes you (eventually) made before leaving ?", -1) == YES) set_ui_changes_to_params(prm, FALSE); do_next = DO_NEXT_OPEN_CONN_SETTINGS; break; } else if (response == GTK_RESPONSE_APPLY) { /* Force apply */ /* * We want a new pixmap so that changes will be effective... now! * * Some setting changes (like 'read n items per feed') need the stream * to be reloaded */ current_feed(); changes_have_been_made = TRUE; env->suspend_rq = FALSE; } else if (response == GTK_RESPONSE_OK) { if (prm->item_title == 'n' && prm->item_description == 'n') { warning(BLOCK, "%s\n%s", "You can't uncheck both 'Item title' and 'Item description'", "(because no much useful information would be displayed)"); continue; } /* Apply and save when necessary */ if (memcmp((const void *)prm, (const void *)prm_bak, sizeof(Params)) != 0 || \ changes_have_been_made) { /* * Some setting changes (like 'read n items per feed') need the stream * to be reloaded */ current_feed(); save_to_config_file(prm); } break; } else { /* Restore and apply when necessary */ if (memcmp((const void *)prm, (const void *)prm_bak, sizeof(Params)) != 0 || \ changes_have_been_made) { memcpy((void *)prm, (const void *)prm_bak, sizeof(Params)); /* * Some setting changes (like 'read n items per feed') need the stream * to be reloaded */ current_feed(); } break; } } free2(prm_bak); gtk_widget_destroy(dialog); check_main_win_always_on_top(); env->suspend_rq = FALSE; return do_next; } /* Window layout (kind of) */ #ifdef COLUMN_1_ALIGN # undef COLUMN_1_ALIGN #endif #ifdef COLUMN_2_ALIGN # undef COLUMN_2_ALIGN #endif #ifdef ROW_SPACING # undef ROW_SPACING #endif #define COLUMN_1_ALIGN LEFT #define COLUMN_2_ALIGN EXPAND/*RIGHT*/ #define ROW_SPACING 5 /* * Open a dialog to edit all params. * Return next action requested (if any). */ next_action modify_params(Params *prm) { char c[2]= "c"; int response; zboolean changes_have_been_made; int do_next = DO_NEXT_NOTHING; Params *prm_bak; int i; env = get_ticker_env(); str_n_cpy(current_url, get_resource()->id, FILE_NAME_MAXLEN); gtk_window_set_keep_above(GTK_WINDOW(env->win), FALSE); dialog = gtk_dialog_new_with_buttons( "Full Settings", GTK_WINDOW(env->win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); sc_win = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), sc_win); connsettings_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "Connection Settings", GTK_RESPONSE_CONN_SETTINGS); cancel_but = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL_CLOSE); reset_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "Reset", GTK_RESPONSE_RESET); /* We only have 'OK', which apply ***and*** save settings. */ ok_but = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_OK); apply_but = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_APPLY, GTK_RESPONSE_APPLY); gtk_widget_set_tooltip_text(ok_but, "Apply, save and quit"); gtk_widget_set_tooltip_text(apply_but, "Don't save and don't quit"); table = gtk_table_new(17, 5, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), ROW_SPACING); gtk_table_set_col_spacings(GTK_TABLE(table), 0); gtk_container_set_border_width(GTK_CONTAINER(table), 15); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sc_win), table); /* Whole window must be visible on netbooks as well */ gtk_widget_set_size_request(sc_win, 1000, 450); i = 0; #ifdef COLUMN_1 # undef COLUMN_1 #endif #ifdef COLUMN_2 # undef COLUMN_2 #endif #define COLUMN_1 0 #define COLUMN_2 1 /* * Delay */ adj_delay = gtk_adjustment_new(prm->delay, 1, 50, 1, 5, 0); spinbut_delay = gtk_spin_button_new(GTK_ADJUSTMENT(adj_delay), 0.0, 0); table_attach_styled_double_cell(table, "Delay", "Milliseconds", APP_NAME " speed = K1 / scrolling delay\n- Decrease delay to speed up scrolling\n" "- Increase delay to slow down scrolling", spinbut_delay, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Shift size */ adj_shiftsize = gtk_adjustment_new(prm->shift_size, 1, 200, 1, 5, 0); spinbut_shiftsize = gtk_spin_button_new(GTK_ADJUSTMENT(adj_shiftsize), 0.0, 0); table_attach_styled_double_cell(table, "Shift size", "Pixels", APP_NAME " speed = K2 x shift size\nYou can increase shift size and delay simultaneously " "to reduce CPU load although scrolling will get less smooth", spinbut_shiftsize, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Font */ font_but = gtk_font_button_new_with_font(prm->font_name_size); table_attach_styled_double_cell(table, "Font", "Size can't be > 200", /* Check this is up to date */ "WARNING: Font size will be overridden by " APP_NAME " height, if height > 0", font_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * fg color */ fg_color_but = gtk_color_button_new_with_color(&prm->fg_color); gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(fg_color_but), TRUE); gtk_color_button_set_alpha(GTK_COLOR_BUTTON(fg_color_but), prm->fg_color_alpha); table_attach_styled_double_cell(table, "Foreground Color", NULL, NULL, fg_color_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Marked items fg color */ /*highlight_fg_color_but = gtk_color_button_new_with_color(&prm->highlight_fg_color); gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(highlight_fg_color_but), TRUE); gtk_color_button_set_alpha(GTK_COLOR_BUTTON(highlight_fg_color_but), prm->highlight_fg_color_alpha); table_attach_styled_double_cell(table, "Marked items foreground color", NULL, NULL, highlight_fg_color_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++;*/ /* * bg color */ bg_color_but = gtk_color_button_new_with_color(&prm->bg_color); gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(bg_color_but), TRUE); gtk_color_button_set_alpha(GTK_COLOR_BUTTON(bg_color_but), prm->bg_color_alpha); table_attach_styled_double_cell(table, "Background Color", NULL, NULL, bg_color_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Set gradient bg */ checkbut_setgradientbg = gtk_check_button_new(); if (prm->set_gradient_bg == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_setgradientbg), TRUE); else if (prm->set_gradient_bg == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_setgradientbg), FALSE); table_attach_styled_double_cell(table, "Use a gradient background", NULL, NULL, checkbut_setgradientbg, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * bg color2 */ bg_color2_but = gtk_color_button_new_with_color(&prm->bg_color2); gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(bg_color2_but), TRUE); gtk_color_button_set_alpha(GTK_COLOR_BUTTON(bg_color2_but), prm->bg_color2_alpha); bg_color2_label = table_attach_styled_double_cell(table, "Background Color2", NULL, NULL, bg_color2_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Disable screen limits */ checkbut_disablescreenlimits = gtk_check_button_new(); if (prm->disable_screen_limits == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_disablescreenlimits), TRUE); else if (prm->disable_screen_limits == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_disablescreenlimits), FALSE); table_attach_styled_double_cell(table, "Disable screen limits", NULL, "Apply to " APP_NAME " X, Y positions and width", checkbut_disablescreenlimits, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * win_x */ adj_winx = gtk_adjustment_new(prm->win_x, 0, (prm->disable_screen_limits == 'y' ? WIN_MAX_X : env->screen_w - 20), 1, 5, 0); /* Magic value '20' found here */ spinbut_winx = gtk_spin_button_new(GTK_ADJUSTMENT(adj_winx), 0.0, 0); table_attach_styled_double_cell(table, "X position", "Pixels", NULL, spinbut_winx, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * win_y */ adj_winy = gtk_adjustment_new(prm->win_y, 0, (prm->disable_screen_limits == 'y' ? WIN_MAX_Y : env->screen_h), 1, 5, 0); spinbut_winy = gtk_spin_button_new(GTK_ADJUSTMENT(adj_winy), 0.0, 0); top_but = gtk_button_new_with_label("Top"); bottom_but = gtk_button_new_with_label("Bottom"); table_attach_styled_double_cell(table, "Y position", "Pixels", NULL, top_but, bottom_but, spinbut_winy, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * win_w */ adj_winw = gtk_adjustment_new(prm->win_w, DRWA_WIDTH_MIN, (prm->disable_screen_limits == 'y' ? WIN_MAX_W : env->screen_w), 1, 5, 0); spinbut_winw = gtk_spin_button_new(GTK_ADJUSTMENT(adj_winw), 0.0, 0); fullwidth_but = gtk_button_new_with_label("Full width"); table_attach_styled_double_cell(table, "Width", "Pixels", NULL, fullwidth_but, spinbut_winw, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * win_h */ adj_winh = gtk_adjustment_new(prm->win_h, 0, env->screen_h, 1, 5, 0); spinbut_winh = gtk_spin_button_new(GTK_ADJUSTMENT(adj_winh), 0.0, 0); table_attach_styled_double_cell(table, APP_NAME " Height", "Pixels", "WARNING: If > 0, will override font size", spinbut_winh, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * windec */ checkbut_windec = gtk_check_button_new(); if (prm->windec == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_windec), TRUE); else if (prm->windec == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_windec), FALSE); table_attach_styled_double_cell(table, "Window decoration", NULL, NULL, checkbut_windec, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Window always-on-top */ checkbut_alwaysontop = gtk_check_button_new(); if (prm->always_on_top == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_alwaysontop), TRUE); else if (prm->always_on_top == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_alwaysontop), FALSE); table_attach_styled_double_cell(table, "Window Always-On-Top", NULL, NULL, checkbut_alwaysontop, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Window transparency */ /* transparency set from gui ranges from 1 (0.1) to 10 (1.0) / 0.0 (invisible!) is kind of "useless" */ adj_wintransparency = gtk_adjustment_new(prm->win_transparency * 10, 1, 10, 1, 2, 0); spinbut_wintransparency = gtk_spin_button_new(GTK_ADJUSTMENT(adj_wintransparency), 0.0, 0); table_attach_styled_double_cell(table, "Window opacity", "x 10", NULL, spinbut_wintransparency, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Icon in taskbar */ checkbut_iconintaskbar = gtk_check_button_new(); if (prm->icon_in_taskbar == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_iconintaskbar), TRUE); else if (prm->icon_in_taskbar == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_iconintaskbar), FALSE); table_attach_styled_double_cell(table, "Icon in Taskbar", NULL, NULL, checkbut_iconintaskbar, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Window sticky */ checkbut_winsticky = gtk_check_button_new(); if (prm->win_sticky == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_winsticky), TRUE); else if (prm->win_sticky == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_winsticky), FALSE); table_attach_styled_double_cell(table, "Visible on all User Desktops", NULL, NULL, checkbut_winsticky, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Set window override_redirect flag */ checkbut_overrideredirect = gtk_check_button_new(); if (prm->override_redirect == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_overrideredirect), TRUE); else if (prm->override_redirect == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_overrideredirect), FALSE); table_attach_styled_double_cell(table, "Set override_redirect flag", "Warning:\n***EXPERIMENTAL***", APP_NAME " will bypass window manager, which may lead to unexpected behaviour - " "You've been warned ;)", checkbut_overrideredirect, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Shadow */ checkbut_shadow = gtk_check_button_new(); if (prm->shadow == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_shadow), TRUE); else if (prm->shadow == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_shadow), FALSE); table_attach_styled_double_cell(table, "Shadow", NULL, NULL, checkbut_shadow, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * shadow_offset_x */ adj_shadowoffsetx = gtk_adjustment_new(prm->shadow_offset_x, -20, 20, 1, 5, 0); spinbut_shadowoffsetx = gtk_spin_button_new(GTK_ADJUSTMENT(adj_shadowoffsetx), 0.0, 0); table_attach_styled_double_cell(table, "Shadow x offset", "Pixels", NULL, spinbut_shadowoffsetx, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * shadow_offset_y */ adj_shadowoffsety = gtk_adjustment_new(prm->shadow_offset_y, -20, 20, 1, 5, 0); spinbut_shadowoffsety = gtk_spin_button_new(GTK_ADJUSTMENT(adj_shadowoffsety), 0.0, 0); table_attach_styled_double_cell(table, "Shadow y offset", "Pixels", NULL, spinbut_shadowoffsety, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * shadow_fx */ adj_shadowfx = gtk_adjustment_new(prm->shadow_fx, 0, 10, 1, 5, 0); spinbut_shadowfx = gtk_spin_button_new(GTK_ADJUSTMENT(adj_shadowfx), 0.0, 0); table_attach_styled_double_cell(table, "Shadow fx", "0 = none -> 10 = full", NULL, spinbut_shadowfx, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Line delimiter */ entry_linedel = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_linedel), DELIMITER_MAXLEN); gtk_entry_set_text(GTK_ENTRY(entry_linedel), prm->line_delimiter); table_attach_styled_double_cell(table, "Line delimiter", NULL, "String that will replace every newline occurrence", entry_linedel, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Enable special chars */ checkbut_spchars = gtk_check_button_new(); if (prm->special_chars == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_spchars), TRUE); else if (prm->special_chars == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_spchars), FALSE); table_attach_styled_double_cell(table, "Special characters enabled", NULL, "Apply only to text files", checkbut_spchars, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * 'new page' special char */ entry_newpagech = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_newpagech), 1); /* This does nothing - gtk_entry_set_width_chars(GTK_ENTRY(entry_newpagech), 1);*/ c[0] = prm->new_page_char; gtk_entry_set_text(GTK_ENTRY(entry_newpagech), c); newpagech_label = table_attach_styled_double_cell(table, "'New page' special character", NULL, NULL, entry_newpagech, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * 'tab' special char */ entry_tabch = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_tabch), 1); /* This does nothing - gtk_entry_set_width_chars(GTK_ENTRY(entry_tabch), 1);*/ c[0] = prm->tab_char; gtk_entry_set_text(GTK_ENTRY(entry_tabch), c); tabch_label = table_attach_styled_double_cell(table, "'Tab' (8 spaces) special character", NULL, NULL, entry_tabch, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Reload delay (rss refresh) - Now up to 1440 mn = 24 h */ adj_rssrefresh = gtk_adjustment_new(prm->rss_refresh, 0, 1440, 1, 5, 0); spinbut_rssrefresh = gtk_spin_button_new(GTK_ADJUSTMENT(adj_rssrefresh), 0.0, 0); table_attach_styled_double_cell(table, "Reload delay", "Minutes", "Delay before reloading resource (URL or text file.)\n" "0 = never force reload - Otherwise, apply only if no TTL inside " "feed or if resource is text file.\n" "(Actually, in multiple selections mode, all feeds are always reloaded " "sequentially, because there is no caching involved)", spinbut_rssrefresh, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Reverse scrolling */ checkbut_revsc = gtk_check_button_new(); if (prm->reverse_sc == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_revsc), TRUE); else if (prm->reverse_sc == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_revsc), FALSE); table_attach_styled_double_cell(table, "Reverse scrolling", NULL, "For languages written/read from R to L", checkbut_revsc, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* Commenting out this block would change from 2 columns to 1 single column window */ gtk_table_attach_defaults(GTK_TABLE(table), gtk_label_new(BLANK_STR_8_SP BLANK_STR_8_SP BLANK_STR_8_SP), 2, 3, 0, 1); i = 0; #ifdef COLUMN_1 # undef COLUMN_1 #endif #ifdef COLUMN_2 # undef COLUMN_2 #endif #define COLUMN_1 3 #define COLUMN_2 4 /* (commenting out until here) */ /* * Feed title */ checkbut_feedtitle = gtk_check_button_new(); if (prm->feed_title == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_feedtitle), TRUE); else if (prm->feed_title == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_feedtitle), FALSE); table_attach_styled_double_cell(table, "Show feed title", NULL, NULL, checkbut_feedtitle, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Feed title delimiter */ entry_feedtitledel = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_feedtitledel), DELIMITER_MAXLEN); gtk_entry_set_text(GTK_ENTRY(entry_feedtitledel), prm->feed_title_delimiter); table_attach_styled_double_cell(table, "Feed title delimiter", NULL, NULL, entry_feedtitledel, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Item title */ checkbut_itemtitle = gtk_check_button_new(); if (prm->item_title == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_itemtitle), TRUE); else if (prm->item_title == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_itemtitle), FALSE); table_attach_styled_double_cell(table, "Show item title", NULL, NULL, checkbut_itemtitle, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Item title delimiter */ entry_itemtitledel = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_itemtitledel), DELIMITER_MAXLEN); gtk_entry_set_text(GTK_ENTRY(entry_itemtitledel), prm->item_title_delimiter); table_attach_styled_double_cell(table, "Item title delimiter", NULL, NULL, entry_itemtitledel, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Item description */ checkbut_itemdes = gtk_check_button_new(); if (prm->item_description == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_itemdes), TRUE); else if (prm->item_description == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_itemdes), FALSE); table_attach_styled_double_cell(table, "Show item description", NULL, NULL, checkbut_itemdes, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Item description delimiter */ entry_itemdesdel = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_itemdesdel), DELIMITER_MAXLEN); gtk_entry_set_text(GTK_ENTRY(entry_itemdesdel), prm->item_description_delimiter); table_attach_styled_double_cell(table, "Item description delimiter", NULL, NULL, entry_itemdesdel, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Read n items max per feed */ adj_nitemsperfeed = gtk_adjustment_new(prm->n_items_per_feed, 0, 500, 1, 5, 0); spinbut_nitemsperfeed = gtk_spin_button_new(GTK_ADJUSTMENT(adj_nitemsperfeed), 0.0, 0); table_attach_styled_double_cell(table, "Read N items max per feed", NULL, "0 = no limit", spinbut_nitemsperfeed, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Mark item action */ /*radio_but_mi_1 = gtk_radio_button_new_with_label(NULL, "Hide"); radio_but_mi_2 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_but_mi_1), "Color"); radio_but_mi_3 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_but_mi_1), "None"); rbut_box_mi = gtk_hbox_new(TRUE, 2); gtk_box_pack_start(GTK_BOX(rbut_box_mi), radio_but_mi_1, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(rbut_box_mi), radio_but_mi_2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(rbut_box_mi), radio_but_mi_3, TRUE, TRUE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_mi_1), TRUE); if (prm->mark_item_action == 'h') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_mi_1), TRUE); else if (prm->mark_item_action == 'c') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_mi_2), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_mi_3), TRUE); table_attach_styled_double_cell(table, "Mark item action", NULL, NULL, rbut_box_mi, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++;*/ /* * Remove html tags */ checkbut_striptags = gtk_check_button_new(); if (prm->strip_html_tags == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_striptags), TRUE); else if (prm->strip_html_tags == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_striptags), FALSE); table_attach_styled_double_cell(table, "Strip HTML tags", NULL, NULL, checkbut_striptags, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Upper case text */ checkbut_uppercase = gtk_check_button_new(); if (prm->upper_case_text == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_uppercase), TRUE); else if (prm->upper_case_text == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_uppercase), FALSE); table_attach_styled_double_cell(table, "Set all text to upper case", NULL, NULL, checkbut_uppercase, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Homefeed / set current feed as homefeed */ curfeed_but = gtk_button_new_with_label("Current"); entry_homefeed = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_homefeed), FILE_NAME_MAXLEN); gtk_entry_set_text(GTK_ENTRY(entry_homefeed), prm->homefeed); table_attach_styled_double_cell(table, "Default feed", "'Homefeed'", NULL, curfeed_but, entry_homefeed, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * "Open in Browser" Shell command */ entry_openlinkcmd = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_openlinkcmd), FILE_NAME_MAXLEN); gtk_entry_set_text(GTK_ENTRY(entry_openlinkcmd), prm->open_link_cmd); table_attach_styled_double_cell(table, "'Open in Browser' Shell command", NULL, "Browser to open links with", entry_openlinkcmd, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * "Open in Browser" args */ entry_openlinkargs = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_openlinkargs), FILE_NAME_MAXLEN); gtk_entry_set_text(GTK_ENTRY(entry_openlinkargs), prm->open_link_args); table_attach_styled_double_cell(table, "Optional arguments", NULL, "'Open in Browser' optional arguments", entry_openlinkargs, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Clock */ radio_but_clock_1 = gtk_radio_button_new_with_label(NULL, "Left"); radio_but_clock_2 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_but_clock_1), "Right"); radio_but_clock_3 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_but_clock_1), "None"); rbut_box_clock = gtk_hbox_new(TRUE, 2); gtk_box_pack_start(GTK_BOX(rbut_box_clock), radio_but_clock_1, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(rbut_box_clock), radio_but_clock_2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(rbut_box_clock), radio_but_clock_3, TRUE, TRUE, 0); if (prm->clock == 'l') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_clock_1), TRUE); else if (prm->clock == 'r') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_clock_2), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_clock_3), TRUE); table_attach_styled_double_cell(table, "Clock", NULL, NULL, rbut_box_clock, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Clock - show seconds */ checkbut_clocksec = gtk_check_button_new(); if (prm->clock_sec == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_clocksec), TRUE); else if (prm->clock_sec == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_clocksec), FALSE); clock_sec_label = table_attach_styled_double_cell(table, "Show seconds", NULL, NULL, checkbut_clocksec, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Clock - 12h time format */ checkbut_clock12h = gtk_check_button_new(); if (prm->clock_12h == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_clock12h), TRUE); else if (prm->clock_12h == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_clock12h), FALSE); clock_12h_label = table_attach_styled_double_cell(table, "12h time format", NULL, NULL, checkbut_clock12h, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Clock - show date */ checkbut_clockdate = gtk_check_button_new(); if (prm->clock_date == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_clockdate), TRUE); else if (prm->clock_date == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_clockdate), FALSE); clock_date_label = table_attach_styled_double_cell(table, "Show date", NULL, NULL, checkbut_clockdate, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Clock - use alt date format */ checkbut_clockaltdateform = gtk_check_button_new(); if (prm->clock_alt_date_form == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_clockaltdateform), TRUE); else if (prm->clock_alt_date_form == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_clockaltdateform), FALSE); clock_altdateform_label = table_attach_styled_double_cell(table, "Alt format (Mon Jan 01 -> Mon 01 Jan)", NULL, NULL, checkbut_clockaltdateform, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Clock font */ clock_font_but = gtk_font_button_new_with_font(prm->clock_font_name_size); clock_font_label = table_attach_styled_double_cell(table, "Clock font", NULL, "Clock font size can't be > " APP_NAME " height", clock_font_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Clock fg color */ clock_fg_color_but = gtk_color_button_new_with_color(&prm->clock_fg_color); gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(clock_fg_color_but), TRUE); gtk_color_button_set_alpha(GTK_COLOR_BUTTON(clock_fg_color_but), prm->clock_fg_color_alpha); clock_fg_color_label = table_attach_styled_double_cell(table, "Clock foreground color", NULL, NULL, clock_fg_color_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Clock bg color */ clock_bg_color_but = gtk_color_button_new_with_color(&prm->clock_bg_color); gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(clock_bg_color_but), TRUE); gtk_color_button_set_alpha(GTK_COLOR_BUTTON(clock_bg_color_but), prm->clock_bg_color_alpha); clock_bg_color_label = table_attach_styled_double_cell(table, "Clock background color", NULL, NULL, clock_bg_color_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Set clock gradient bg */ checkbut_setclockgradientbg = gtk_check_button_new(); if (prm->set_clock_gradient_bg == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_setclockgradientbg), TRUE); else if (prm->set_clock_gradient_bg == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_setclockgradientbg), FALSE); setclockgradientbg_label = table_attach_styled_double_cell(table, "Set clock gradient background", NULL, NULL, checkbut_setclockgradientbg, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Clock bg color2 */ clock_bg_color2_but = gtk_color_button_new_with_color(&prm->clock_bg_color2); gtk_color_button_set_use_alpha(GTK_COLOR_BUTTON(clock_bg_color2_but), TRUE); gtk_color_button_set_alpha(GTK_COLOR_BUTTON(clock_bg_color2_but), prm->clock_bg_color2_alpha); clock_bg_color2_label = table_attach_styled_double_cell(table, "Clock background color2", NULL, NULL, clock_bg_color2_but, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Disable popups */ checkbut_nopopups = gtk_check_button_new(); if (prm->disable_popups == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_nopopups), TRUE); else if (prm->disable_popups == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_nopopups), FALSE); table_attach_styled_double_cell(table, "Disable error/warning popups", NULL, "Prevent error/warning windows to popup", checkbut_nopopups, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Pause on mouse-over */ checkbut_mouseover = gtk_check_button_new(); if (prm->pause_on_mouseover == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_mouseover), TRUE); else if (prm->pause_on_mouseover == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_mouseover), FALSE); table_attach_styled_double_cell(table, "Pause ticker on mouse-over", NULL, NULL, checkbut_mouseover, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Disable left-ckick */ checkbut_noleftclick = gtk_check_button_new(); if (prm->disable_leftclick == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_noleftclick), TRUE); else if (prm->disable_leftclick == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_noleftclick), FALSE); table_attach_styled_double_cell(table, "Disable left-click", NULL, NULL, checkbut_noleftclick, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Mouse wheel scrolling behaviour */ radio_but_mw_1 = gtk_radio_button_new_with_label(NULL, "Speed"); radio_but_mw_2 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_but_mw_1), "Feed"); radio_but_mw_3 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_but_mw_1), "None"); rbut_box_mw = gtk_hbox_new(TRUE, 2); gtk_box_pack_start(GTK_BOX(rbut_box_mw), radio_but_mw_1, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(rbut_box_mw), radio_but_mw_2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(rbut_box_mw), radio_but_mw_3, TRUE, TRUE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_mw_1), TRUE); if (prm->mouse_wheel_action == 's') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_mw_1), TRUE); else if (prm->mouse_wheel_action == 'f') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_mw_2), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_but_mw_3), TRUE); table_attach_styled_double_cell(table, "Mouse Wheel acts on", NULL, "Use Mouse Wheel for alternative action", rbut_box_mw, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Selected feed picker window closes when pointer leaves area */ checkbut_sfpickercloseswhenpointerleaves = gtk_check_button_new(); if (prm->sfeedpicker_autoclose == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_sfpickercloseswhenpointerleaves), TRUE); else if (prm->sfeedpicker_autoclose == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_sfpickercloseswhenpointerleaves), FALSE); table_attach_styled_double_cell(table, "Selected Feed Picker auto-close", NULL, "Selected Feed Picker window closes when pointer leaves area", checkbut_sfpickercloseswhenpointerleaves, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); i++; /* * Enable feed re-ordering (by user) */ checkbut_feedordering = gtk_check_button_new(); if (prm->enable_feed_ordering == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_feedordering), TRUE); else if (prm->enable_feed_ordering == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_feedordering), FALSE); table_attach_styled_double_cell(table, "Enable feed re-ordering", NULL, "Allow user to re-order feeds by assigning ranks to them", checkbut_feedordering, NULL, NULL, COLUMN_1, COLUMN_2, i, COLUMN_1_ALIGN, COLUMN_2_ALIGN); /* Connect buttons / widgets to callbacks */ g_signal_connect(G_OBJECT(checkbut_setgradientbg), "clicked", G_CALLBACK(check_set_gradient_widgets), NULL); g_signal_connect(G_OBJECT(checkbut_disablescreenlimits), "clicked", G_CALLBACK(update_win_x_y_w_adj), NULL); g_signal_connect(G_OBJECT(checkbut_spchars), "clicked", G_CALLBACK(check_set_sp_chars_widgets), NULL); g_signal_connect(G_OBJECT(radio_but_clock_1), "clicked", G_CALLBACK(check_set_clock_widgets), NULL); g_signal_connect(G_OBJECT(radio_but_clock_2), "clicked", G_CALLBACK(check_set_clock_widgets), NULL); g_signal_connect(G_OBJECT(radio_but_clock_3), "clicked", G_CALLBACK(check_set_clock_widgets), NULL); g_signal_connect(G_OBJECT(checkbut_clockdate), "clicked", G_CALLBACK(check_set_clock_widgets), NULL); g_signal_connect(G_OBJECT(top_but), "clicked", G_CALLBACK(move_to_top), NULL); g_signal_connect(G_OBJECT(bottom_but), "clicked", G_CALLBACK(move_to_bottom), NULL); g_signal_connect(G_OBJECT(fullwidth_but), "clicked", G_CALLBACK(set_full_width), NULL); g_signal_connect(G_OBJECT(curfeed_but), "clicked", G_CALLBACK(get_current_url), NULL); /* This must be run once at least */ check_set_gradient_widgets(NULL); update_win_x_y_w_adj(NULL); check_set_sp_chars_widgets(NULL); check_set_clock_widgets(NULL); /* This will let us know if changes have been made */ prm_bak = malloc2(sizeof(Params)); memcpy((void *)prm_bak, (const void *)prm, sizeof(Params)); changes_have_been_made = FALSE; gtk_widget_grab_focus(cancel_but); gtk_widget_show_all(dialog); gtk_window_set_focus(GTK_WINDOW(dialog), NULL); while (1) { response = gtk_dialog_run(GTK_DIALOG(dialog)); env->suspend_rq = TRUE; if (response == GTK_RESPONSE_RESET) { if (question_win("Reset *all* settings to default values ?\n" "(Your current settings will be lost)", NO) == YES) { set_default_options(prm); save_to_config_file(prm); current_feed(); env->compute_rq = TRUE; /*do_next = DO_NEXT_REOPEN; // Not used anymore */ break; } else continue; } else if (response == GTK_RESPONSE_APPLY || response == GTK_RESPONSE_OK) { set_ui_changes_to_params(prm, TRUE); } if (response == GTK_RESPONSE_CONN_SETTINGS) { if (question_win("Save changes you (eventually) made before leaving ?", -1) == YES) set_ui_changes_to_params(prm, TRUE); do_next = DO_NEXT_OPEN_CONN_SETTINGS; break; } else if (response == GTK_RESPONSE_APPLY) { /* Force apply */ /* * We want a new pixmap so that changes will be effective... now! * * Some setting changes (like 'read n items per feed') need the stream * to be reloaded */ current_feed(); changes_have_been_made = TRUE; env->suspend_rq = FALSE; } else if (response == GTK_RESPONSE_OK) { if (prm->item_title == 'n' && prm->item_description == 'n') { warning(BLOCK, "%s\n%s", "You can't uncheck both 'Item title' and 'Item description'", "(because no much useful information would be displayed)"); continue; } /* Apply and save when necessary */ if (memcmp((const void *)prm, (const void *)prm_bak, sizeof(Params)) != 0 || \ changes_have_been_made) { /* * Some setting changes (like 'read n items per feed') need the stream * to be reloaded */ current_feed(); save_to_config_file(prm); } break; } else { /* Restore and apply when necessary */ if (memcmp((const void *)prm, (const void *)prm_bak, sizeof(Params)) != 0 || \ changes_have_been_made) { memcpy((void *)prm, (const void *)prm_bak, sizeof(Params)); /* * Some setting changes (like 'read n items per feed') need the stream * to be reloaded */ current_feed(); } break; } } free2(prm_bak); gtk_widget_destroy(dialog); check_main_win_always_on_top(); env->suspend_rq = FALSE; return do_next; } static void set_ui_changes_to_params(Params *prm, zboolean full) { /* Delay */ prm->delay = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_delay)); if (full) { /* Shift size */ prm->shift_size = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_shiftsize)); } /* Font */ str_n_cpy(prm->font_name_size, (char *)gtk_font_button_get_font_name( GTK_FONT_BUTTON(font_but)), FONT_MAXLEN); /* Colors - fg and bg */ gtk_color_button_get_color(GTK_COLOR_BUTTON(fg_color_but), &prm->fg_color); prm->fg_color_alpha = gtk_color_button_get_alpha(GTK_COLOR_BUTTON(fg_color_but)); /*gtk_color_button_get_color(GTK_COLOR_BUTTON(highlight_fg_color_but), &prm->highlight_fg_color); prm->highlight_fg_color_alpha = gtk_color_button_get_alpha(GTK_COLOR_BUTTON(highlight_fg_color_but));*/ gtk_color_button_get_color(GTK_COLOR_BUTTON(bg_color_but), &prm->bg_color); prm->bg_color_alpha = gtk_color_button_get_alpha(GTK_COLOR_BUTTON(bg_color_but)); if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_setgradientbg))) prm->set_gradient_bg = 'y'; else prm->set_gradient_bg = 'n'; gtk_color_button_get_color(GTK_COLOR_BUTTON(bg_color2_but), &prm->bg_color2); prm->bg_color2_alpha = gtk_color_button_get_alpha(GTK_COLOR_BUTTON(bg_color2_but)); if (full) { /* Disable screen limits */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_disablescreenlimits))) prm->disable_screen_limits = 'y'; else prm->disable_screen_limits = 'n'; /* Window x, w */ prm->win_x = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_winx)); prm->win_w = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_winw)); } /* Window y */ prm->win_y = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_winy)); /* If win_h is > 0, it will override requested font size with computed one. */ prm->win_h = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_winh)); if (prm->win_h > 0 && prm->win_h < DRWA_HEIGHT_MIN) prm->win_h = DRWA_HEIGHT_MIN; if (full) { /* Window decoration */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_windec))) prm->windec = 'y'; else prm->windec = 'n'; } /* Window always-on-top */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_alwaysontop))) prm->always_on_top = 'y'; else prm->always_on_top = 'n'; if (full) { /* Window transparency */ prm->win_transparency = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_wintransparency)) / 10; /* Icon in taskbar */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_iconintaskbar))) prm->icon_in_taskbar = 'y'; else prm->icon_in_taskbar = 'n'; /* Window sticky */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_winsticky))) prm->win_sticky = 'y'; else prm->win_sticky = 'n'; /* Set window override_redirect flag */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_overrideredirect))) prm->override_redirect = 'y'; else prm->override_redirect = 'n'; /* Shadow */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_shadow))) prm->shadow = 'y'; else prm->shadow = 'n'; prm->shadow_offset_x = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_shadowoffsetx)); prm->shadow_offset_y = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_shadowoffsety)); prm->shadow_fx = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_shadowfx)); /* Line delimiter */ str_n_cpy(prm->line_delimiter, (char *)gtk_entry_get_text(GTK_ENTRY(entry_linedel)), DELIMITER_MAXLEN); /* Enable special chars */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_spchars))) prm->special_chars = 'y'; else prm->special_chars = 'n'; prm->new_page_char = gtk_entry_get_text(GTK_ENTRY(entry_newpagech))[0]; prm->tab_char = gtk_entry_get_text(GTK_ENTRY(entry_tabch))[0]; /* Reload delay (rss refresh) */ prm->rss_refresh = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_rssrefresh)); } /* Reverse scrolling */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_revsc))) prm->reverse_sc = 'y'; else prm->reverse_sc = 'n'; if (full) { /* Feed title */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_feedtitle))) prm->feed_title = 'y'; else prm->feed_title = 'n'; str_n_cpy(prm->feed_title_delimiter, (char *)gtk_entry_get_text(GTK_ENTRY(entry_feedtitledel)), DELIMITER_MAXLEN); /* Item title */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_itemtitle))) prm->item_title = 'y'; else prm->item_title = 'n'; str_n_cpy(prm->item_title_delimiter, (char *)gtk_entry_get_text(GTK_ENTRY(entry_itemtitledel)), DELIMITER_MAXLEN); /* Item decription */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_itemdes))) prm->item_description = 'y'; else prm->item_description = 'n'; str_n_cpy(prm->item_description_delimiter, (char *)gtk_entry_get_text(GTK_ENTRY(entry_itemdesdel)), DELIMITER_MAXLEN); } /* Read n items max per feed */ prm->n_items_per_feed = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_nitemsperfeed)); if (full) { /* Mark item action */ /*if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_but_mi_1))) prm->mark_item_action = 'h'; else if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_but_mi_2))) prm->mark_item_action = 'c'; else prm->mark_item_action = 'n';*/ /* Strip html tags */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_striptags))) prm->strip_html_tags = 'y'; else prm->strip_html_tags = 'n'; /* Upper case text */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_uppercase))) prm->upper_case_text = 'y'; else prm->upper_case_text = 'n'; /* Homefeed */ str_n_cpy(prm->homefeed, (char *)gtk_entry_get_text(GTK_ENTRY(entry_homefeed)), FILE_NAME_MAXLEN); /* Open link cmd */ str_n_cpy(prm->open_link_cmd, (char *)gtk_entry_get_text(GTK_ENTRY(entry_openlinkcmd)), FILE_NAME_MAXLEN); /* Open link args */ str_n_cpy(prm->open_link_args, (char *)gtk_entry_get_text(GTK_ENTRY(entry_openlinkargs)), FILE_NAME_MAXLEN); /* Clock */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_but_clock_1))) prm->clock = 'l'; else if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_but_clock_2))) prm->clock = 'r'; else prm->clock = 'n'; /* Clock - show seconds */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_clocksec))) prm->clock_sec = 'y'; else prm->clock_sec = 'n'; /* Clock - 12h time format */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_clock12h))) prm->clock_12h = 'y'; else prm->clock_12h = 'n'; /* Clock - show date */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_clockdate))) prm->clock_date = 'y'; else prm->clock_date = 'n'; /* Clock - use alt date format */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_clockaltdateform))) prm->clock_alt_date_form = 'y'; else prm->clock_alt_date_form = 'n'; str_n_cpy(prm->clock_font_name_size, (char *)gtk_font_button_get_font_name(GTK_FONT_BUTTON(clock_font_but)), FONT_MAXLEN); gtk_color_button_get_color(GTK_COLOR_BUTTON(clock_fg_color_but), &prm->clock_fg_color); prm->clock_fg_color_alpha = gtk_color_button_get_alpha( GTK_COLOR_BUTTON(clock_fg_color_but)); gtk_color_button_get_color(GTK_COLOR_BUTTON(clock_bg_color_but), &prm->clock_bg_color); prm->clock_bg_color_alpha = gtk_color_button_get_alpha(GTK_COLOR_BUTTON(clock_bg_color_but)); if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_setclockgradientbg))) prm->set_clock_gradient_bg = 'y'; else prm->set_clock_gradient_bg = 'n'; gtk_color_button_get_color(GTK_COLOR_BUTTON(clock_bg_color2_but), &prm->clock_bg_color2); prm->clock_bg_color2_alpha = gtk_color_button_get_alpha(GTK_COLOR_BUTTON(clock_bg_color2_but)); /* Disable popups */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_nopopups))) prm->disable_popups = 'y'; else prm->disable_popups = 'n'; /* Pause on mouse-over */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_mouseover))) prm->pause_on_mouseover = 'y'; else prm->pause_on_mouseover = 'n'; /* Disable left-click */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_noleftclick))) prm->disable_leftclick = 'y'; else prm->disable_leftclick = 'n'; } /* Mouse wheel scrolling behaviour */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_but_mw_1))) prm->mouse_wheel_action = 's'; else if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_but_mw_2))) prm->mouse_wheel_action = 'f'; else prm->mouse_wheel_action = 'n'; if (full) { /* Selected feed picker window closes when pointer leaves area */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( checkbut_sfpickercloseswhenpointerleaves))) prm->sfeedpicker_autoclose = 'y'; else prm->sfeedpicker_autoclose = 'n'; /* Enable feed re-ordering (by user) */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_feedordering))) prm->enable_feed_ordering = 'y'; else prm->enable_feed_ordering = 'n'; } } tickr_0.7.1.orig/src/tickr/tickr_list.c0000644000175000017500000003624514107736721017500 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" #include "tickr_list.h" /* (In tickr_list.h) typedef struct FeedListNode { char *url; char *title; zboolean selected; char rank[FLIST_RANK_STR_LEN + 1]; struct FeedListNode *prev; struct FeedListNode *next; char sig[FLIST_SIG_LEN + 1]; } FList; */ FList *f_list_new(const char *url, const char *title, zboolean selected, const char *rank) { FList *node = malloc2(sizeof(FList)); /*int url_len, title_len;*/ node->url = malloc2(FLIST_URL_MAXLEN + 1); str_n_cpy(node->url, url, FLIST_URL_MAXLEN); node->title = malloc2(FLIST_TITLE_MAXLEN + 1); str_n_cpy(node->title, title, FLIST_TITLE_MAXLEN); /* * If we want to use the following code (which saves memory use), * we must implement funcs that reallocate memory when modifying * data and we must never modify it directly. */ /*url_len = MIN(strlen(url), FLIST_URL_MAXLEN); node->url = malloc2(url_len + 1); str_n_cpy(node->url, url, url_len); title_len = MIN(strlen(title), FLIST_TITLE_MAXLEN); node->title = malloc2(title_len + 1); str_n_cpy(node->title, title, title_len);*/ node->selected = selected; /* FLIST_RANK_STR_LEN chars long string with only digits/spaces, * right justified. Value = atoi(rank), start at 1, 0 is interpreted as unset (blank) * which is interpreted as last value (follows "999" for 3 chars). */ if (atoi(rank) > 0) snprintf(node->rank, FLIST_RANK_STR_LEN + 1, FLIST_RANK_FORMAT, atoi(rank)); else str_n_cpy(node->rank, BLANK_STR_16, FLIST_RANK_STR_LEN); node->prev = NULL; node->next = NULL; str_n_cpy(node->sig, FLIST_SIG, FLIST_SIG_LEN); return node; } /* * Free allocated memory. */ void f_list_free(FList *node) { CHECK_IS_FLIST(node, __func__) memset(node->sig, 0, FLIST_SIG_LEN); free2(node->url); free2(node->title); free2(node); } /* * Free allocated memory. */ void f_list_free_all(FList *some_node) { FList *node; CHECK_IS_FLIST(some_node, __func__) for (node = f_list_first(some_node); IS_FLIST(node); node = node->next) f_list_free(node); } FList *f_list_first(FList *node) { CHECK_IS_FLIST(node, __func__) while (IS_FLIST(node->prev)) node = node->prev; return node; } FList *f_list_last(FList *node) { CHECK_IS_FLIST(node, __func__) while (IS_FLIST(node->next)) node = node->next; return node; } /* * Return NULL if no previous node. */ FList *f_list_prev(FList *node) { CHECK_IS_FLIST(node, __func__) if (IS_FLIST(node->prev)) return node->prev; else return NULL; } /* * Return NULL if no next node. */ FList *f_list_next(FList *node) { CHECK_IS_FLIST(node, __func__) if (IS_FLIST(node->next)) return node->next; else return NULL; } /* * Return NULL if out of range. */ FList *f_list_nth(FList *some_node, int n) { FList *node; int count, i = 1; CHECK_IS_FLIST(some_node, __func__) node = f_list_first(some_node); count = f_list_count(node); if (n > count) { INFO_ERR("%s(): %d is out of range\n", __func__, n) return NULL; } else { while (IS_FLIST(node->next) && i++ < n) node = node->next; if (IS_FLIST(node)) return node; else return NULL; } } /* * Return index if found (starting at 0) / -1 otherwise. */ int f_list_index(FList *some_node) { FList *node; int count, node_index = 0; if (IS_FLIST(some_node)) { node = f_list_first(some_node); count = f_list_count(node); for (; IS_FLIST(node) && node_index < count + 1; node = node->next) { if (node == some_node) return node_index; node_index++; } } return -1; } int f_list_count(FList *some_node) { FList *node; int counter = 0; if (IS_FLIST(some_node)) for (node = f_list_first(some_node); IS_FLIST(node); node = node->next) counter++; /*else INFO_ERR("%s(): List is empty\n", __func__)*/ return counter; } /* * Create and add node at start of list. * 'some_node' may be any node in the list or NULL -> when creating list. */ FList *f_list_add_at_start(FList *some_node, const char *url, const char *title, zboolean selected, const char *rank) { FList *instance; instance = f_list_new(url, title, selected, rank); /* ->prev = ->next = NULL */ if (IS_FLIST(some_node)) { some_node = f_list_first(some_node); instance->next = some_node; some_node->prev = instance; } return instance; } /* * Create and add node at end of list. * 'some_node' may be any node in the list or NULL -> when creating list. */ FList *f_list_add_at_end(FList *some_node, const char *url, const char *title, zboolean selected, const char *rank) { FList *instance; instance = f_list_new(url, title, selected, rank); /* ->prev = ->next = NULL */ if (IS_FLIST(some_node)) { some_node = f_list_last(some_node); instance->prev = some_node; some_node->next = instance; } return instance; } /* * Create and insert node before 'some_node'. */ FList *f_list_insert_before(FList *some_node, const char *url, const char *title, zboolean selected, const char *rank) { FList *instance; CHECK_IS_FLIST(some_node, __func__) instance = f_list_new(url, title, selected, rank); /* ->prev = ->next = NULL */ if (IS_FLIST(some_node->prev)) { instance->prev = some_node->prev; some_node->prev->next = instance; } instance->next = some_node; some_node->prev = instance; return instance; } /* * Create and insert node after 'some_node'. */ FList *f_list_insert_after(FList *some_node, const char *url, const char *title, zboolean selected, const char *rank) { FList *instance; CHECK_IS_FLIST(some_node, __func__) instance = f_list_new(url, title, selected, rank); /* ->prev = ->next = NULL */ instance->prev = some_node; if (IS_FLIST(some_node->next)) { instance->next = some_node->next; some_node->next->prev = instance; } instance->prev = some_node; some_node->next = instance; return instance; } /* * Remove then return first node or NULL if empty. */ FList *f_list_remove(FList *node) { FList *prev = NULL, *next = NULL, *node2 = NULL; CHECK_IS_FLIST(node, __func__) if (IS_FLIST(node->prev)) { prev = node->prev; prev->next = node->next; node2 = prev; } if (IS_FLIST(node->next)) { next = node->next; next->prev = node->prev; node2 = next; } f_list_free(node); if (IS_FLIST(node2)) return f_list_first(node2); else return NULL; } void f_list_swap(FList *node1, FList *node2) { FList tmp; CHECK_IS_FLIST(node1, __func__); CHECK_IS_FLIST(node2, __func__); (&tmp)->prev = node1->prev; (&tmp)->next = node1->next; node1->prev = node2->prev; node1->next = node2->next; node2->prev = (&tmp)->prev; node2->next = (&tmp)->next; } /* * Return url from ":" + 1, or url if not found * * url string may start with a sequence of other chars before the scheme * -> "blabla1http://blablablabla2" */ static char *get_url_beyond_scheme(const char *url) { unsigned int i; for (i = 0; i < strlen(url); i++) { if (url[i] == ':') return (char *)url + i + 1; } return (char *)url; } /* * Sort by node->url (ignoring scheme), then remove duplicated and empty * entries, then return first node. * * If SORT_FLIST_BY_RANK is TRUE, sort 2 times, 2nd time by node->rank. */ FList *f_list_sort(FList *some_node) { FList *node1, *node2, *node_i[N_FLIST_MAX], *tmp; int list_len, min, i, j; CHECK_IS_FLIST(some_node, __func__) node1 = f_list_first(some_node); for (i = 0; i < N_FLIST_MAX; i++) { if (IS_FLIST(node1)) { node_i[i] = node1; node1 = node1->next; } else break; } list_len = i; /* Selection sort */ for (i = 0; i < list_len; i++) { min = i; for (j = i + 1; j < list_len; j++) { if (strcmp(get_url_beyond_scheme(node_i[min]->url), get_url_beyond_scheme(node_i[j]->url)) > 0) min = j; } tmp = node_i[i]; node_i[i] = node_i[min]; node_i[min] = tmp; } /* Remove duplicated entries */ for (i = 0; i < list_len; i++) { for (j = i + 1; j < list_len; j++) { if (strcmp(node_i[i]->url, node_i[j]->url) == 0) { if (node_i[i]->selected || node_i[j]->selected) { node_i[i]->selected = TRUE; node_i[j]->selected = TRUE; } /* We want to use rank in the second entry (ie the last added one). */ str_n_cpy(node_i[i]->rank, node_i[j]->rank, FLIST_RANK_STR_LEN); if (node_i[j]->title[0] == '\0') /* If no title in the second entry, */ node_i[j]->url[0] = '\0'; /* we keep the first one. */ else node_i[i]->url[0] = '\0'; } } } /* Remove empty entries */ node2 = NULL; for (i = 0; i < list_len; i++) if (node_i[i]->url[0] != '\0') node2 = f_list_add_at_end(node2, node_i[i]->url, node_i[i]->title, node_i[i]->selected, node_i[i]->rank); node2 = f_list_first(node2); f_list_free_all(some_node); if (!SORT_FLIST_BY_RANK) return node2; else { /* If SORT_FLIST_BY_RANK is true, sort again, now by node->rank */ for (i = 0; i < N_FLIST_MAX; i++) { if (IS_FLIST(node2)) { node_i[i] = node2; node2 = node2->next; } else break; } list_len = i; /* Selection sort */ /* === rank starts at 1 / 0 = last rank === */ for (i = 0; i < list_len; i++) { min = i; for (j = i + 1; j < list_len; j++) if (atoi((const char *)(node_i[min]->rank)) > atoi((const char *)(node_i[j]->rank))) min = j; tmp = node_i[i]; node_i[i] = node_i[min]; node_i[min] = tmp; } node1 = NULL; for (i = 0; i < list_len; i++) /* We want feeds sorted by rank > 0 first */ if (atoi(node_i[i]->rank) > 0) node1 = f_list_add_at_end(node1, node_i[i]->url, node_i[i]->title, node_i[i]->selected, node_i[i]->rank); for (i = 0; i < list_len; i++) if (atoi(node_i[i]->rank) == 0) node1 = f_list_add_at_end(node1, node_i[i]->url, node_i[i]->title, node_i[i]->selected, node_i[i]->rank); node1 = f_list_first(node1); return node1; } } /* * Search by node->url and return index if found (starting at 0) / -1 otherwise. */ int f_list_search(FList *some_node, const char *str) { FList *node; int i = 0; CHECK_IS_FLIST(some_node, __func__) for (node = f_list_first(some_node); IS_FLIST(node); node = node->next) { if (strcmp(str, node->url) == 0) return i; else i++; } return -1; } /* * Use provided file_name if not NULL / default file name (URL_LIST_FILE) otherwise. * Create new f_list. * * Entry format in URL list file: * ['*' (selected) or '-' (unselected) + "000" (3 chars rank) + URL [+ '>' + title] + '\n'] * * Entry max length = FILE_NAME_MAXLEN * See also: (UN)SELECTED_URL_CHAR/STR and TITLE_TAG_CHAR/STR in tickr.h * FLIST_RANK_FORMAT and FLIST_RANK_STR_LEN in tickr_list.h * * Return OK (and first node of list) or error code (LOAD_URL_LIST_NO_LIST, LOAD_URL_LIST_EMPTY_LIST, * LOAD_URL_LIST_ERROR.) */ int f_list_load_from_file(FList **new_node, const char *file_name) { char *list_file_name, default_list_file_name[FILE_NAME_MAXLEN + 1]; FILE *fp; char *tmp, tmp2[FLIST_RANK_STR_LEN + 1]; FList *node; size_t tmp_size = FILE_NAME_MAXLEN + 1; zboolean selected, title_found; int title_shift, i; if (file_name == NULL) { str_n_cpy(default_list_file_name, get_datafile_full_name_from_name(URL_LIST_FILE), FILE_NAME_MAXLEN); list_file_name = default_list_file_name; if ((fp = g_fopen(list_file_name, "rb")) == NULL) return LOAD_URL_LIST_NO_LIST; } else list_file_name = (char *)file_name; node = NULL; if ((fp = g_fopen(list_file_name, "rb")) != NULL) { tmp = malloc2(tmp_size * sizeof(char)); #ifndef G_OS_WIN32 while (getline(&tmp, &tmp_size, fp) != EOF) { #else while (fgets(tmp, tmp_size, fp) != NULL) { #endif if (tmp[0] == SELECTED_URL_CHAR || tmp[0] == UNSELECTED_URL_CHAR) { selected = (tmp[0] == SELECTED_URL_CHAR) ? TRUE : FALSE; for (i = 0; i < FLIST_RANK_STR_LEN; i++) tmp2[i] = tmp[i + 1]; tmp2[i] = '\0'; title_shift = -1; title_found = FALSE; for (i = 0; i < FILE_NAME_MAXLEN; i++) { if (!title_found && tmp[i] == TITLE_TAG_CHAR) { title_shift = i + 1; tmp[i] = '\0'; title_found = TRUE; } else if (tmp[i] == '\n') { tmp[i] = '\0'; break; } } node = f_list_add_at_end(node, tmp + 1 + FLIST_RANK_STR_LEN, (title_shift != -1) ? tmp + title_shift : "", selected, tmp2); } } free2(tmp); fclose(fp); if (node != NULL) { *new_node = f_list_first(node); return OK; } else { warning(BLOCK, "URL list '%s' is empty", list_file_name); return LOAD_URL_LIST_EMPTY_LIST; } } else { warning(BLOCK, "Can't load URL list '%s': %s", list_file_name, strerror(errno)); return LOAD_URL_LIST_ERROR; } } /* * Use provided file_name if not NULL / default file name (URL_LIST_FILE) otherwise. * * Entry format in URL list file: * ['*' (selected) or '-' (unselected) + "000" (3 chars rank) + URL [+ '>' + title] + '\n'] * * Entry max length = FILE_NAME_MAXLEN * See also: (UN)SELECTED_URL_CHAR/STR and TITLE_TAG_CHAR/STR in tickr.h * FLIST_RANK_FORMAT and FLIST_RANK_STR_LEN in tickr_list.h * * Return OK (and first node of list) or SAVE_URL_LIST_ERROR. */ int f_list_save_to_file(FList *node, const char *file_name) { char *list_file_name; FILE *fp; if (file_name == NULL) list_file_name = l_str_new(get_datafile_full_name_from_name(URL_LIST_FILE)); else list_file_name = l_str_new(file_name); if ((fp = g_fopen(list_file_name, "wb")) != NULL) { if (IS_FLIST(node)) { for(node = f_list_first(node); IS_FLIST(node); node = node->next) { /* TODO: We should use: "%c" + FLIST_RANK_FORMAT + "%s%s%s\n" */ fprintf(fp, "%c%3d%s%s%s\n", node->selected ? SELECTED_URL_CHAR : UNSELECTED_URL_CHAR, atoi(node->rank), node->url, (node->title[0] != '\0') ? TITLE_TAG_STR : "", (node->title[0] != '\0') ? node->title : ""); } } fclose(fp); l_str_free(list_file_name); return OK; } else { warning(BLOCK, "Can't save URL list '%s': %s", list_file_name, strerror(errno)); l_str_free(list_file_name); return SAVE_URL_LIST_ERROR; } } FList *f_list_clone(FList *some_node) { FList *new = NULL, *node; CHECK_IS_FLIST(some_node, __func__) for (node = f_list_first(some_node); IS_FLIST(node); node = node->next) new = f_list_add_at_end(new, node->url, node->title, node->selected, node->rank); new = f_list_first(new); return new; } tickr_0.7.1.orig/src/tickr/tickr.h0000644000175000017500000005645214107736721016454 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #ifndef INC_TICKR_H #define INC_TICKR_H #define APP_NAME "Tickr" #define APP_CMD "tickr" #define APP_V_NUM "0.7.1" #define COPYRIGHT_STR "Copyright (C) 2009-2021 Emmanuel Thomas-Maurin" #define WEBSITE_URL "https://www.open-tickr.net" #define DOWNLOAD_URL WEBSITE_URL "/download.php" #define SUPPORT_URL WEBSITE_URL "/help.php" #define DONATE_WITH_PAYPAL_URL WEBSITE_URL "/go_to_paypal.php" #define SUPPORT_EMAIL_ADDR "manutm007@gmail.com" #define CHECK4UPDATES_URL WEBSITE_URL "/app_version_visible.php" #define CHECK4UPDATES_ID_STR "LSVN=" /* Stands for 'Last Stable Version Number = ' */ /*#define ABOUT_WIN_QUOTE \ "We've been told that a million monkeys banging on a\n"\ "million keyboards will eventually reproduce the entire\n"\ "works of W. Shakespeare. Now, thanks to the Internet,\n"\ "we know this is *not* true."*/ #define _GNU_SOURCE #define _ISOC99_SOURCE #undef VERBOSE_OUTPUT /* Always defined in libetm, so always first undefine ... */ #define VERBOSE_OUTPUT /* Then define again */ /*#define DEBUG_OUTPUT*/ /* For info_win_no_block(..., timeout) */ #define INFO_WIN_WAIT_POS GTK_WIN_POS_CENTER_ON_PARENT #define INFO_WIN_WAIT_TIMEOUT 2000 /* in ms */ /* M_S_MOD -> true in multiple selection mode / false otherwise */ #define M_S_MOD (get_ticker_env()->selection_mode == MULTIPLE) #define CONNECT_FAIL_MAX 5 #define CONNECT_FAIL_TIMEOUT 1 #include #include #include #include #include #include #include #include #include #ifndef G_OS_WIN32 #include #endif #include /* Moved here because we need G_OS_WIN32 check early */ #include #ifndef G_OS_WIN32 # include # include #else # include <../glib-2.0/glib/gstdio.h> #endif #ifndef G_OS_WIN32 # include # include # include # include # include # include #else # define WINVER 0x0501 /* Win version = XP (5.1) or higher */ # define _WIN32_WINNT 0x0501 # include # include # include # include # include # include #endif #include #include #include #include #include "../libetm-0.5.0/libetm.h" #include "tickr_list.h" #include "tickr_error.h" #include "tickr_tls.h" #define RESOURCE_ERROR_SSM_QUIT FALSE /* To quit or not if not found or invalid resource - only in single selection mode */ #define OPTION_ERROR_QUIT FALSE /* To quit or not if unknown or invalid option(s) */ #define DRWA_WIDTH_MIN 100 #define DRWA_HEIGHT_MIN 10 #define TAB_SIZE 8 #define FILE_NAME_MAXLEN (2 * 1024 - 1) /* Apply to both FULL FILE NAMES and ***URLs*** */ #define URL_SCHEME_MAXLEN 15 #define PORT_STR_MAXLEN 15 #define FONT_NAME_MAXLEN 64 #define FONT_SIZE_MAXLEN 3 #define FONT_MAXLEN FONT_NAME_MAXLEN + 1 + FONT_SIZE_MAXLEN #define DELIMITER_MAXLEN 80 #define OPTION_NAME_MAXLEN 31 #define OPTION_VALUE_MAXLEN MAX(MAX(FILE_NAME_MAXLEN, FONT_MAXLEN), DELIMITER_MAXLEN) #define OPTION_MAXLEN OPTION_NAME_MAXLEN + OPTION_VALUE_MAXLEN + 4 /* -name="value" */ #define N_OPTION_MAX 128 /* Max number of options */ #define N_URL_MAX 1024 /* Max number of URLs */ #define NFEEDLINKANDOFFSETMAX 999 /* Max number of "open-able" links per feed (3 digits: 001 -> 999) */ #define LINK_TAG_CHAR ((char)(1)) /* char (ascii 01) used internally for item links, removed from feed text */ #define ITEM_TITLE_TAG_CHAR ((char)(2)) /* char (ascii 02) used internally for item titles, --- */ #define ITEM_DES_TAG_CHAR ((char)(3)) /* char (ascii 03) used internally for item descriptions, --- */ /*#define ENCODING_STR_MAX_LEN 64*/ /* * Used in tickr_main.c, tickr_render.c and tickr_feedparser.c * Confusingly, L to R scrolling (ie reverse) is for languages written/read from R to L */ #define REVERSE_SCROLLING (get_params()->reverse_sc == 'y') /* = L to R scrolling for R to L languages*/ #define STANDARD_SCROLLING (!REVERSE_SCROLLING) /* = R to L scrolling for L to R languages*/ #define N_RENDER_STR_MAX 256 /* Max number of strings from a stream that can be rendered to cairo surfaces */ #define TMPSTR_SIZE (2 * 1024 - 1) /* Used for most tmp strings - must be large enough */ #define FGETS_STR_MAXLEN (8 * 1024 * 1024) /* 8 MiB for every fgets() line */ #ifndef G_OS_WIN32 # define SEPARATOR_CHAR '/' #else # define SEPARATOR_CHAR '\\' #endif #define FEED_TITLE_MAXLEN 60 /* 7-bit ascii - STH_CHAR and STH_STR ***must*** match */ #define TITLE_TAG_CHAR '>' #define TITLE_TAG_STR ">" #define SELECTED_URL_CHAR '*' #define SELECTED_URL_STR "*" #define UNSELECTED_URL_CHAR '-' #define UNSELECTED_URL_STR "-" #define XPIXMAP_MAXWIDTH (32 * 1024 - 1) /* 32 K - 1 = max supported width for X pixmaps * (not 64 K - 1 as sometimes incorrectly stated) */ #define FONT_MAXSIZE 200 #define ARBITRARY_TASKBAR_HEIGHT 25 /* Could/should be get from window manager ? */ /* * === File names, paths and dirs stuff === * * Linux version: /usr/bin/ * /usr/share/APP_CMD/ * /usr/share/APP_CMD/pixmpas/ * /home//.APP_CMD/ * * Win32 version: C:\Program Files\APP_NAME\ (also location for pixmaps) * C:\...\Application Data\APP_NAME\ */ #ifndef G_OS_WIN32 # define TICKR_DIR_NAME "." APP_CMD #else # define TICKR_DIR_NAME APP_NAME #endif #define CONFIG_FILE APP_CMD "-conf" #define URL_LIST_FILE APP_CMD "-url-list" #define RESOURCE_DUMP APP_CMD "-resrc-dump.xml" #define XML_DUMP APP_CMD "-xml-dump" #define XML_DUMP_EXTRA APP_CMD "-xml-dump-extra" #define TMP_FILE "tmp" /*#define MARKED_ITEMS_FILE APP_CMD "-marked-items"*/ /* * STD_OUT = stdout on Linux / text file on win32 * STD_ERR = stderr on Linux / text file on win32 * (defined in libetm/misc.h) */ #ifdef G_OS_WIN32 # define STDOUT_FILENAME1 "stdout1.txt" # define STDOUT_FILENAME2 "stdout2.txt" # define STDERR_FILENAME1 "stderr1.txt" # define STDERR_FILENAME2 "stderr2.txt" #endif #ifndef G_OS_WIN32 # define INSTALL_PATH "/usr/share/" APP_CMD # define IMAGES_PATH INSTALL_PATH "/pixmaps" #else # define IMAGES_PATH APP_NAME /* Actually not a path but a dir name */ #endif #define TICKR_ICON APP_CMD "-icon.png" #define TICKR_LOGO APP_CMD "-logo.png" #define RSS_ICON APP_CMD "-rss-icon.png" /* * Default config values */ #define DELAY 8 #define SHIFTSIZE 1 #ifndef G_OS_WIN32 # define FONTNAME "Sans" /* Ubuntu */ #else # define FONTNAME "Arial Unicode MS" #endif #define FONTSIZE "12" /* 14 */ #define FGCOLOR "#ffffffff" /*#define HIGHLIGHTFGCOLOR "#ff0000ff" / Red ???? */ #define BGCOLOR "#40404080" #define SETGRADIENTBG 'y' #define BGCOLOR2 "#20202080" #define DISABLESCREENLIMITS 'n' #define WIN_X 0 #define WIN_Y 0 /*#define WIN_W 1024*/ /* Unused, we use get_ticker_env()->screen_w instead */ #define WIN_H 0 /* If = 0, determined by font size */ /* These arbitrary values are supposed to be big enough */ #define WIN_MAX_X 15000 #define WIN_MAX_Y 10000 #define WIN_MAX_W 15000 #define WINDEC 'n' #define ALWAYSONTOP 'n' #ifndef G_OS_WIN32 # define WINTRANSPARENCY 1.0 #else # define WINTRANSPARENCY 0.8 #endif #define ICONINTASKBAR 'y' #define WINSTICKY 'n' #define OVERRIDE_REDIRECT 'n' #define SHADOW 'y' #define SHADOWOFFSET_X 4 #define SHADOWOFFSET_Y 2 #define SHADOWFX 2 #define LINEDELIMITER " " #define SPECIALCHARS 'n' #define NEWPG '`' #define TABCH '~' #define RSSREFRESH 15 #define REVERSESCROLLING 'n' #define FEEDTITLE 'n' #define FEEDTITLEDELIMITER " " #define ITEMTITLE 'y' #define ITEMTITLEDELIMITER " | " #define ITEMDESCRIPTION 'n' #define ITEMDESCRIPTIONDELIMITER " *** " #define NITEMSPERFEED 5 /*#define MARKITEMACTION 'c'*/ #define STRIPHTMLTAGS 'y' #define UPPERCASETEXT 'n' #define HOMEFEED "http://rss.cnn.com/rss/edition.rss" #ifndef G_OS_WIN32 # define OPENLINKCMD "x-www-browser"/*"sensible-browser"*/ /* Get default browser on Linux */ #else # define OPENLINKCMD "" #endif #define OPENLINKARGS "" #define CLOCK 'n' #define CLOCKSEC 'n' #define CLOCK12H 'y' #define CLOCKDATE 'n' #define CLOCKALTDATEFORM 'n' #define CFONTNAME FONTNAME #define CFONTSIZE FONTSIZE #define CFGCOLOR FGCOLOR #define CBGCOLOR BGCOLOR #define SETCLOCKGRADIENTBG SETGRADIENTBG #define CBGCOLOR2 BGCOLOR2 #define DISABLEPOPUPS 'n' #define PAUSEONMOUSEOVER 'y' #define DISABLELEFTCLICK 'n' #define MOUSEWHEELACTION 'f' #ifndef G_OS_WIN32 # define SFEEDPICKERAUTOCLOSE 'y' #else # define SFEEDPICKERAUTOCLOSE 'n' #endif #define ENABLEFEEDORDERING 'n' #define USEAUTHENTICATION 'n' #define USER "" #define USEPROXY 'n' #define PROXYHOST "" #define PROXYPORT "8080" #define USEPROXYAUTHENTICATION 'n' #define PROXYUSER "" #define CONNECT_TIMEOUT 5 #define SENDRECV_TIMEOUT 1 /* typedef enum's */ typedef enum { SINGLE, MULTIPLE } _selection_mode; typedef enum { RESRC_TYPE_UNDETERMINED, RESRC_UNSPECIFIED, RESRC_URL, /* Will be fetched and 'xml-parsed' */ RESRC_FILE /* Will be processed as non-xml text file */ } _resrc_type; typedef enum { RSS_FORMAT_UNDETERMINED, RSS_1_0, /* Should use RDF or RSS_RDF instead ? */ RSS_2_0, RSS_ATOM } _rss_format; typedef enum { TIME_RESET, TIME_CHECK } check_time_mode; typedef enum { INFO, INFO_WARNING, INFO_ERROR } info_type; typedef enum { WIN_WITH_PROGRESS_BAR_OPEN, WIN_WITH_PROGRESS_BAR_PULSE, WIN_WITH_PROGRESS_BAR_CLOSE } win_with_progress_bar_mode; typedef enum { AUTH_PAGE, PROXY_PAGE } connection_settings_page; /* Predefined GTK_RESPONSE_ are < 0, those ones are app level defined and >= 0 (>= 100 actually) */ typedef enum { GTK_RESPONSE_CANCEL_CLOSE = 100, /* tickr_feedpicker.c */ GTK_RESPONSE_SELECT_ALL, GTK_RESPONSE_UNSELECT_ALL, GTK_RESPONSE_CLEAR_RANKING, GTK_RESPONSE_TOP, GTK_RESPONSE_CURRENT, GTK_RESPONSE_HOME, GTK_RESPONSE_REMOVE, GTK_RESPONSE_ADD_UPD, GTK_RESPONSE_SINGLE, GTK_RESPONSE_SELECTION, /* tickr_prefwin.c */ GTK_RESPONSE_RESET, GTK_RESPONSE_FULL_SETTINGS, GTK_RESPONSE_CONN_SETTINGS } gtk_custom_response; typedef enum { /* tickr_main.c and tickr_prefwin.c */ DO_NEXT_NOTHING, DO_NEXT_REOPEN, DO_NEXT_OPEN_FULL_SETTINGS, DO_NEXT_OPEN_CONN_SETTINGS } next_action; /* typedef struct's */ /* * === Useful graphical (and other) ticker 'environment' values === */ typedef struct { GdkScreen *screen; /* GDK screen for win */ GdkVisual *visual; int screen_w, screen_h; /* Screen width & height */ int depth; /* Screen depth */ GtkWidget *win; /* Top level window */ GtkWidget *drw_a, *drwa_clock; /* Drawing areas (main/clock) */ int drwa_width, drwa_height; /* Main drawing area dimensions */ int drwa_clock_width; /* Clock drawing area width */ cairo_surface_t *c_surf; /* Cairo image surface onto which text is rendered */ int surf_width, surf_height; /* Cairo image surface dimensions */ int shift_counter; char active_link[FILE_NAME_MAXLEN + 1]; int mouse_x_in_drwa; /* These flags are checked (mainly) by shift2left_callback() */ zboolean suspend_rq; /* Request for doing nothing */ zboolean compute_rq; /* Request for (re)computing everything (surface and win) */ zboolean reload_rq; /* Request for (re)loading resource */ _selection_mode selection_mode; /* default = MULTIPLE, set to SINGLE internally if resource * is a command line argument or if selection is unavailable/empty * or after explicitely picking a single feed */ zboolean feed_fully_rendered; /* Used when a stream is rendered to several cairo surfaces, * set/checked only in render_stream_to_surface(), stream_to_htext() * and shift2left_callback() */ zboolean https_support; } TickerEnv; typedef struct { char url[FILE_NAME_MAXLEN + 1]; int offset_in_surface; /* TODO: check/complete this char item_title[FILE_NAME_MAXLEN + 1]; char GUUI[FILE_NAME_MAXLEN + 1];*/ } FeedLinkAndOffset; /* * === Resource is the current feed/file being fetched, processed and displayed === */ typedef struct { _resrc_type type; /* URL (including local URL) or text file */ char id[FILE_NAME_MAXLEN + 1]; /* URL (including local URL) or full path/file name */ char orig_url[FILE_NAME_MAXLEN + 1]; /* In case of HTTP redirects */ /* Apply only to URL/RSS */ _rss_format format; /* RSS 1.0, RSS 2.0, or Atom */ char feed_title[FEED_TITLE_MAXLEN + 1]; char resrc_dump[FILE_NAME_MAXLEN + 1]; /* Downloaded resource (= text file) */ char xml_dump[FILE_NAME_MAXLEN + 1]; /* Output of XML/RSS processing of downloaded resource */ FILE *fp; /* Stream to be read (xml_dump = file name) */ FeedLinkAndOffset link_and_offset[NFEEDLINKANDOFFSETMAX]; char xml_dump_extra[FILE_NAME_MAXLEN + 1]; FILE *fp_extra; /* Stream with extra info: item titles (/ descriptions) generated * when ticker displays only descriptions (/ titles) */ int rss_ttl; } Resource; #define USER_MAXLEN 63 #define PSW_MAXLEN 63 #define AUTH_STR_MAXLEN 127 /* TODO: Do we need both these auth/proxy structs and auth/proxy params ? redundant - check this out */ typedef struct { zboolean use_authentication; char user[USER_MAXLEN + 1]; char psw[PSW_MAXLEN + 1]; char auth_str[AUTH_STR_MAXLEN + 1]; } Authentication; #define PROXY_HOST_MAXLEN 127 #define PROXY_PORT_MAXLEN PORT_STR_MAXLEN #define PROXY_USER_MAXLEN 63 #define PROXY_PSW_MAXLEN 63 #define PROXY_AUTH_STR_MAXLEN 127 #define PROXY_STR_MAXLEN 255 typedef struct { zboolean use_proxy; char host[PROXY_HOST_MAXLEN + 1]; char port[PROXY_PORT_MAXLEN + 1]; char proxy_str[PROXY_STR_MAXLEN + 1]; int use_proxy_authentication; char user[PROXY_USER_MAXLEN + 1]; char psw[PROXY_PSW_MAXLEN + 1]; char auth_str[PROXY_AUTH_STR_MAXLEN + 1]; } Proxy; typedef struct { int delay; int shift_size; char font_name_size[FONT_MAXLEN + 1]; GdkColor fg_color; guint16 fg_color_alpha; /*GdkColor highlight_fg_color; guint16 highlight_fg_color_alpha;*/ GdkColor bg_color; guint16 bg_color_alpha; char set_gradient_bg; GdkColor bg_color2; guint16 bg_color2_alpha; char disable_screen_limits; int win_x; int win_y; int win_w; int win_h; char windec; char always_on_top; double win_transparency; /* 0.1 -> 1.0 */ char icon_in_taskbar; char win_sticky; char override_redirect; char shadow; int shadow_offset_x; int shadow_offset_y; int shadow_fx; char line_delimiter[DELIMITER_MAXLEN + 1]; char special_chars; char new_page_char; char tab_char; int rss_refresh; char reverse_sc; /* Reverse scrolling (= L to R) */ char feed_title; char feed_title_delimiter[DELIMITER_MAXLEN + 1]; char item_title; char item_title_delimiter[DELIMITER_MAXLEN + 1]; char item_description; char item_description_delimiter[DELIMITER_MAXLEN + 1]; /* POSSIBLE NEW FEATURE char feed_delimiter[DELIMITER_MAXLEN + 1];*/ /* (until here) */ int n_items_per_feed; /*char mark_item_action; / (h) hide / c (color = highlight) / n (none) */ char strip_html_tags; char upper_case_text; char homefeed[FILE_NAME_MAXLEN + 1]; char open_link_cmd[FILE_NAME_MAXLEN + 1]; char open_link_args[FILE_NAME_MAXLEN + 1]; char clock; char clock_sec; char clock_12h; char clock_date; char clock_alt_date_form; /* Use alternative date format, ie "Mon 01 Jan" instead of "Mon Jan 01" */ char clock_font_name_size[FONT_MAXLEN + 1]; GdkColor clock_fg_color; guint16 clock_fg_color_alpha; GdkColor clock_bg_color; guint16 clock_bg_color_alpha; char set_clock_gradient_bg; GdkColor clock_bg_color2; guint16 clock_bg_color2_alpha; char disable_popups; char pause_on_mouseover; char disable_leftclick; char mouse_wheel_action; /* Acts on s (speed) / f (feed) / n (none) */ char sfeedpicker_autoclose; char enable_feed_ordering; /*char alt_encoding[ENCODING_STR_MAX_LEN + 1];*/ /* TODO: Do we need both these auth/proxy structs and auth/proxy params ? redundant - check this out */ char use_authentication; char user[USER_MAXLEN + 1]; char use_proxy; char proxy_host[PROXY_HOST_MAXLEN + 1]; char proxy_port[PROXY_PORT_MAXLEN + 1]; char use_proxy_authentication; char proxy_user[PROXY_USER_MAXLEN + 1]; int connect_timeout; int send_recv_timeout; } Params; /* Prototypes for most source files are below */ /* tickr_main.c */ TickerEnv *get_ticker_env(); Resource *get_resource(); FList *get_feed_list(); void set_feed_list(FList *); FList *get_feed_selection(); void set_feed_selection(FList *); Params *get_params(); int get_instance_id(); char *get_feed_extra_info(int); int easily_link_with_browser(); void check_main_win_always_on_top(); zboolean win_params_have_been_changed(Params *, int); void free_all(); void quit_with_cli_info(tickr_error_code); /* tickr_resource.c */ int build_feed_selection_from_feed_list(); void current_feed(); void first_feed(); void last_feed(); zboolean previous_feed(); zboolean next_feed(); int load_resource_from_selection(Resource *, FList *); int format_resource(Resource *, const char *); char *format_resource_str(char *); char *convert_str_to_utf8(const char *, const char *); int get_stream_contents(FILE *, char **, zboolean); void set_tickr_icon_to_dialog(GtkWindow *); FILE *open_new_datafile_with_name(const char *, const char *); char *get_datafile_full_name_from_name(const char *); char *get_imagefile_full_name_from_name(const char *); char *get_datadir_full_path(); char *usr_home_dir(); #ifdef G_OS_WIN32 const char *get_appdata_dir_utf8(); #endif const char *get_sample_url_list_full_name(); /* tickr_render.c */ void init_render_string_array(); void free_all_render_strings_in_array(); /*RenderStringArray *get_render_str_array();*/ int get_links_extra_offset(); cairo_surface_t *render_stream_to_surface(FILE *, FeedLinkAndOffset *, const Params *, int *); int get_font_size_from_layout_height(int, const char *); int get_layout_height_from_font_name_size(const char *); char spinning_shape(); void show_str_beginning_and_end(char *); /* tickr_params.c */ void set_default_options(Params *); int get_config_file_options(Params *); int parse_options_array(Params *, int, const char *[]); int get_name_value_from_option(Params *, const char*); void save_to_config_file(const Params *); int get_gdk_color_from_hexstr(const char *, GdkColor *, guint16 *); const char *get_hexstr_from_gdk_color(const GdkColor *, const guint16 *); void adjust_font_size_to_rq_height(char *, int); int get_font_size_from_font_name_size(const char *); void split_font(const char *, char *, char *); void compact_font(char *, const char *, const char *); /* tickr_clock.c */ void display_time(const Params *); int get_clock_width(const Params *); /* tickr_feedparser.c */ int get_feed(Resource *, const Params *); int parse_xml_file(int, const char *, FeedLinkAndOffset *link_and_offset, const Params *); void get_rss20_selected_elements1(xmlNode *, xmlDoc *); void get_rss10_selected_elements1(xmlNode *, xmlDoc *); void get_atom_selected_elements1(xmlNode *, xmlDoc *); void get_feed_selected_elements2(int, xmlNode *, xmlDoc *, FeedLinkAndOffset *link_and_offset, const Params *prm); int get_feed_info(int *, const char *, char *, char *, char *); void get_xml_first_element(xmlNode *, xmlDoc *, char *, char *, int); char *log2vis_utf8(const char *); /* tickr_feedpicker.c */ void highlight_and_go_to_row(GtkTreeView *, GtkTreeSelection *, int); int check_and_update_feed_url(char *, char *); void manage_list_and_selection(Resource *); /* tickr_prefwin.c */ next_action easily_modify_params(Params *); next_action modify_params(Params *); /* tickr_otherwins.c */ int esc_key_pressed(GtkWidget *, GdkEventKey *); void force_quit_dialog(GtkWidget *); void open_txt_file(Resource *resrc); void show_resource_info(Resource *resrc); void help_win(); void about_win(); void info_win(const char *, const char *, info_type, zboolean); void minimalistic_info_win(const char *, const char *); void info_win_no_block(const char *, int); int question_win(const char *, int); int question_win_at(const char *, int, int); /*void win_with_spinner(win_with_spinner_mode, const char *);*/ void win_with_progress_bar(win_with_progress_bar_mode, const char *); #ifndef G_OS_WIN32 void nanosleep2(long); #endif /* tickr_misc.c */ void import_params(); void export_params(); void open_url_in_browser(char *); void online_help(); void go_to_paypal(); void dump_font_list(); void dump_config(); /* tickr_hlptxt.c */ const char **get_help_str0(); const char **get_help_str1(); const char **get_license_str1(); const char *get_license_str2(); /* tickr_ompl.c */ int import_opml_file(); void export_opml_file(); /* tickr_http.c */ void remove_chunk_info(char **); int connect_with_url(sockt *, char *); int fetch_resource(char *, const char *, char *); const char *build_http_request(const char *, const char *, const char *, const char *); int get_http_response(sockt, const char *, const char *, const char *, char **, char **, int *); int get_http_status_code(const char *); const char *get_http_header_value(const char *, const char *); int go_after_next_cr_lf(const char *); int go_after_next_empty_line(const char *); int get_http_chunk_size(const char *); const char *get_scheme_from_url(const char *); const char *get_host_and_port_from_url(const char *, char *); zboolean port_num_is_valid(const char *); const char *get_path_from_url(const char *); /* tickr_connectwin.c */ void init_authentication(); void init_proxy(); void compute_auth_and_proxy_str(); int connection_settings(connection_settings_page); void set_use_authentication(zboolean); zboolean get_use_authentication(); char *get_http_auth_user(); char *get_http_auth_psw(); char *get_http_auth_str(); void set_use_proxy(zboolean); zboolean get_use_proxy(); char *get_proxy_host(); char *get_proxy_port(); char *get_proxy_str(); void set_use_proxy_auth(zboolean); zboolean get_use_proxy_auth(); char *get_proxy_auth_user(); char *get_proxy_auth_psw(); char *get_proxy_auth_str(); /* tickr_quickfeedpicker.c */ void quick_feed_picker(); /* tickr_quicksetup.c */ void quick_setup(Params *); /* tickr_check4updates.c */ void check_for_updates(); #endif /* INC_TICKR_H */ tickr_0.7.1.orig/src/tickr/tickr_misc.c0000644000175000017500000001715614107736721017460 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" void import_params() { GtkWidget *dialog; FILE *fp1, *fp2; char *file_name; char tmp[TMPSTR_SIZE + 1]; int c; gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); dialog = gtk_file_chooser_dialog_new("Import Settings", GTK_WINDOW(get_ticker_env()->win), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL_CLOSE, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); gtk_widget_show_all(dialog); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { if ((file_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog))) != NULL) { if ((fp1 = g_fopen(file_name, "rb")) != NULL) { snprintf(tmp, TMPSTR_SIZE + 1, "Settings are about to be imported from file: %s. " "Continue ?", file_name); if (question_win(tmp, -1) == YES) { if ((fp2 = g_fopen(get_datafile_full_name_from_name(CONFIG_FILE), "wb")) != NULL) { while ((c = fgetc(fp1)) != (int)EOF) fputc((int)c, fp2); fclose(fp2); get_config_file_options(get_params()); current_feed(); get_ticker_env()->reload_rq = TRUE; /* ???? modify_params2();*/ } else warning(BLOCK, "Can't save Settings to file '%s': %s", file_name, strerror(errno)); } fclose(fp1); } else warning(BLOCK, "Can't open '%s': %s", file_name, strerror(errno)); g_free(file_name); } } gtk_widget_destroy(dialog); check_main_win_always_on_top(); } void export_params() { GtkWidget *dialog; FILE *fp1, *fp2; char *file_name = NULL; int error_code = !OK; char tmp[TMPSTR_SIZE + 1]; int c; if ((fp1 = g_fopen(get_datafile_full_name_from_name(CONFIG_FILE), "rb")) == NULL) { save_to_config_file(get_params()); if ((fp1 = g_fopen(get_datafile_full_name_from_name(CONFIG_FILE), "rb")) == NULL) { warning(BLOCK, "Can't open file '%s': %s", get_datafile_full_name_from_name(CONFIG_FILE), strerror(errno)); return; } } gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); dialog = gtk_file_chooser_dialog_new("Export Settings", GTK_WINDOW(get_ticker_env()->win), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL_CLOSE, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); gtk_widget_show_all(dialog); /*gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), "~");*/ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), CONFIG_FILE); gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { if ((file_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog))) != NULL) { if ((fp2 = g_fopen(file_name, "wb")) != NULL) { while ((c = fgetc(fp1)) != (int)EOF) fputc((int)c, fp2); fclose(fp2); error_code = OK; } else warning(BLOCK, "Can't save Settings to file '%s': %s", file_name, strerror(errno)); } } fclose(fp1); gtk_widget_destroy(dialog); if (error_code == OK) { snprintf(tmp, TMPSTR_SIZE + 1, "\nSettings have been exported to file: %s\n", file_name); info_win("", tmp, INFO, FALSE); } if (file_name != NULL) g_free(file_name); check_main_win_always_on_top(); } /* Doesn't use get_params()->open_link_args (which is done in open_link()) */ void open_url_in_browser(char *url) { char tmp1[FILE_NAME_MAXLEN + 1]; char *argv[3]; GPid pid; GError *error = NULL; if (get_params()->open_link_cmd[0] == '\0') { easily_link_with_browser(); if (get_params()->open_link_cmd[0] == '\0') { warning(BLOCK, "Can't launch Browser: no command is defined.\n", "Please set the 'Open in Browser' option in the Full Settings window."); return; } } /* Launch browser */ INFO_OUT("Spawning: %s %s\n", get_params()->open_link_cmd, url) str_n_cpy(tmp1, get_params()->open_link_cmd, FILE_NAME_MAXLEN); argv[0] = tmp1; argv[1] = url; argv[2] = NULL; if (!g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &pid, &error)) { warning(BLOCK, "%s: Can't create process %s - %s", APP_NAME, argv[0], error->message); info_win("", "Please check the 'Open in Browser' option in the Full Settings window.", INFO_WARNING, FALSE); } else g_spawn_close_pid(pid); } void online_help() { open_url_in_browser(SUPPORT_URL); } void go_to_paypal() { open_url_in_browser(DONATE_WITH_PAYPAL_URL); } #define NFAMMAX (2 * 1024) #define NFACEMAX 64 void dump_font_list() { PangoFontFamily **font_fam; PangoFontFamily *font_fam2[NFAMMAX]; PangoFontFace **font_face; PangoFontFace *font_face2[NFACEMAX]; PangoFontDescription *font_desc; char *font[NFAMMAX * NFACEMAX + 1], *tmp; int n_fam, n_face, i, j, k, overflow, min; fprintf(STD_OUT, "List of available fonts on this system:\n"); font_fam = font_fam2; font_face = font_face2; overflow = FALSE; k = 0; pango_font_map_list_families(pango_cairo_font_map_get_default(), &font_fam, &n_fam); if (n_fam >= NFAMMAX) overflow = TRUE; for (i = 0; i < n_fam && i < NFAMMAX; i++) { pango_font_family_list_faces(font_fam[i], &font_face, &n_face); if (n_face >= NFACEMAX) overflow = TRUE; for (j = 0; j < n_face && j < NFACEMAX; j++) { font_desc = pango_font_face_describe(font_face[j]); font[k++] = pango_font_description_to_string(font_desc); pango_font_description_free(font_desc); } } font[k] = NULL; /* Not sure if we must g_free() sth ? */ /* Sort array (selection sort) */ for (i = 0; i < k; i++) { min = i; for (j = i + 1; j < k; j++) { if (strcmp(font[min], font[j]) > 0) min = j; } tmp = font[i]; font[i] = font[min]; font[min] = tmp; } for (i = 0; i < k; i++) { if (font[i] != NULL) fprintf(STD_OUT, "%s\n", font[i]); else break; } if (overflow) fprintf(STD_ERR, "In function dump_font_list(): need to allocate more space for array\n" "Can't dump full list (more than %d available fonts)\n", k); else fprintf(STD_OUT, "(%d available fonts)\n", k); } void dump_config() { char *tmp; GError *error = NULL; fprintf(STD_OUT, APP_NAME " config (from file):\n"); if (g_file_get_contents(get_datafile_full_name_from_name(CONFIG_FILE), &tmp, NULL, &error)) { fprintf(STD_OUT, "%s", tmp); g_free(tmp); } else if (error != NULL) { fprintf(STD_ERR, "%s\n", error->message); g_error_free(error); } else fprintf(STD_ERR, "Can't open file '%s': %s\n", get_datafile_full_name_from_name(CONFIG_FILE), strerror(errno)); } tickr_0.7.1.orig/src/tickr/tickr_quickfeedpicker.c0000644000175000017500000001523414107736721021656 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" static GtkWidget *dialog, *sc_win; static FList *flist; static int f_index; /* Starting at 0 (row starts at 1) */ static char url[FILE_NAME_MAXLEN + 1]; enum {COLUMN_INT, COLUMN_STRING_TITLE, COLUMN_STRING_URL, N_COLUMNS}; static int enter_key_pressed(GtkWidget *dialog2, GdkEventKey *event_key) { if (event_key->keyval == GDK_Return) { gtk_dialog_response(GTK_DIALOG(dialog2), GTK_RESPONSE_OK); return TRUE; } else return FALSE; } static int mouse_over_area(GtkWidget *widget, GdkEvent *event) { static int i = 0; widget = widget; if (get_params()->sfeedpicker_autoclose == 'y' &&\ event->type == GDK_LEAVE_NOTIFY && i == 0) { i = 1; return TRUE; } else if (get_params()->sfeedpicker_autoclose == 'y' &&\ event->type == GDK_LEAVE_NOTIFY && i == 1) { i = 0; force_quit_dialog(dialog); return TRUE; } else return FALSE; } /* Tree selection callback - get URL */ static int tree_selection_changed(GtkTreeSelection *selection) { GtkTreeModel *tree_model; GtkTreeIter iter; char *str_url; if (gtk_tree_selection_get_selected(selection, &tree_model, &iter)) { gtk_tree_model_get(tree_model, &iter, COLUMN_INT, &f_index, COLUMN_STRING_URL, &str_url, -1); str_n_cpy(url, (const char *)str_url, FILE_NAME_MAXLEN); g_free(str_url); } gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_NONE); return TRUE; } /* Catch double-click on tree view */ static int double_click_on_tree_view(GtkTreeView *tree_view, GtkTreePath *tree_path) { GtkTreeModel *tree_model; GtkTreeIter iter; char *str_url; tree_model = gtk_tree_view_get_model(tree_view); if (gtk_tree_model_get_iter(tree_model, &iter, tree_path)) { gtk_tree_model_get(tree_model, &iter, COLUMN_INT, &f_index, COLUMN_STRING_URL, &str_url, -1); str_n_cpy(url, (const char *)str_url, FILE_NAME_MAXLEN); g_free(str_url); } gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); return TRUE; } /* Clear the list before filling it */ static void fill_list_store_from_flnode(GtkListStore *list_store) { FList *flist2; GtkTreeIter iter; int i = 0; gtk_list_store_clear(list_store); if (IS_FLIST(flist)) for (flist2 = f_list_first(flist); IS_FLIST(flist2); flist2 = flist2->next) { gtk_list_store_append(list_store, &iter); gtk_list_store_set(list_store, &iter, COLUMN_INT, i, COLUMN_STRING_TITLE, flist2->title, COLUMN_STRING_URL, flist2->url, -1); i++; } } /* Actually ***selected feed*** picker. */ void quick_feed_picker() { GtkTreeView *tree_view; GtkListStore *list_store; GtkCellRenderer *renderer1, *renderer2; GtkTreeViewColumn *column1, *column2; GtkTreeSelection *selection; int response; dialog = gtk_dialog_new_with_buttons( "Selected Feed Picker", GTK_WINDOW(get_ticker_env()->win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE/*GTK_WIN_POS_CENTER*/); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); gtk_container_set_border_width(GTK_CONTAINER(dialog), 0); gtk_widget_set_size_request(dialog, 600, 150); /* Not sure about that: if (get_params()->sfeedpicker_autoclose == 'y') gtk_window_set_decorated(GTK_WINDOW(dialog), FALSE);*/ sc_win = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), sc_win); list_store = gtk_list_store_new(N_COLUMNS, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING); if (IS_FLIST(get_feed_selection())) { flist = f_list_first(get_feed_selection()); fill_list_store_from_flnode(list_store); } else { warning(BLOCK, "No feed selection available\n", "(You have set 'Mouse Wheel acts on: Feed' and\n" "either there is no feed list or no feed has been selected)"); gtk_widget_destroy(dialog); return; } tree_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store))); renderer1 = gtk_cell_renderer_text_new(); column1 = gtk_tree_view_column_new_with_attributes("Selected Feed Title", renderer1, "text", COLUMN_STRING_TITLE, NULL); gtk_tree_view_append_column(tree_view, column1); renderer2 = gtk_cell_renderer_text_new(); column2 = gtk_tree_view_column_new_with_attributes("Selected Feed URL", renderer2, "text", COLUMN_STRING_URL, NULL); gtk_tree_view_append_column(tree_view, column2); gtk_container_add(GTK_CONTAINER(sc_win), GTK_WIDGET(tree_view)); selection = gtk_tree_view_get_selection(tree_view); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(enter_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(tree_selection_changed), NULL); g_signal_connect(G_OBJECT(tree_view), "row_activated", G_CALLBACK(double_click_on_tree_view), NULL); g_signal_connect(G_OBJECT(tree_view), "leave-notify-event", G_CALLBACK(mouse_over_area), NULL); gtk_widget_show_all(dialog); if (IS_FLIST(flist) && (get_resource()->id)[0] != '\0') { if ((f_index = f_list_search(flist, get_resource()->id)) > -1) highlight_and_go_to_row(tree_view, selection, f_index + 1); /* * Try original URL in case of HTTP redirects. * TODO: Find best practice - Should new URL replace original URL ? */ else if ((f_index = f_list_search(flist, get_resource()->orig_url)) > -1) highlight_and_go_to_row(tree_view, selection, f_index + 1); } while ((response = gtk_dialog_run(GTK_DIALOG(dialog))) != GTK_RESPONSE_CANCEL_CLOSE) { if (response == GTK_RESPONSE_OK) { if ((f_index = f_list_search(flist, url)) > -1) { set_feed_selection(f_list_nth(flist, f_index + 1)); get_ticker_env()->reload_rq = TRUE; } break; } } gtk_widget_destroy(dialog); } tickr_0.7.1.orig/src/tickr/tickr_quicksetup.c0000644000175000017500000004330014107736721020710 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" /* These variables and widgets are all set as static global for convenience. */ static TickerEnv *env; static Params *prm, *prm_bak; static GtkWidget *qsetup; static GtkWidget *top_but, *bottom_but, *spinbut_winy, *checkbut_alwaysontop; /*static GtkWidget *checkbut_feedtitle, *checkbut_itemtitle, *checkbut_itemdes;*/ static GtkWidget *entry_openlinkcmd/*, *checkbut_nopopups*/; static GtkObject* adj_winy; static void qsetup_prepare(GtkWidget *widget, GtkWidget *page, gpointer data) { widget = widget; data = data; gtk_assistant_set_page_complete(GTK_ASSISTANT(qsetup), page, TRUE); } static void qsetup_cancel(GtkWidget *widget, gpointer data) { widget = widget; data = data; memcpy((void *)prm, (const void *)prm_bak, sizeof(Params)); gtk_main_quit(); } static int qsetup_del_event() { if (question_win("Cancel quick setup ?", -1) == YES) { memcpy((void *)prm, (const void *)prm_bak, sizeof(Params)); gtk_main_quit(); return FALSE; } else return TRUE; } static void keep_setting(GtkWidget *widget, gpointer data) { widget = widget; switch((int)data) { case 1: /* Window y */ prm->win_y = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_winy)); break; case 2: /* Window always-on-top */ if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_alwaysontop))) prm->always_on_top = 'y'; else prm->always_on_top = 'n'; break; /*case 3: // Feed title if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_feedtitle))) prm->feed_title = 'y'; else prm->feed_title = 'n'; break; case 4: // Item title if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_itemtitle))) prm->item_title = 'y'; else prm->item_title = 'n'; break; case 5: // Item decription if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_itemdes))) prm->item_description = 'y'; else prm->item_description = 'n'; break;*/ case 3/*6*/: /* Open link cmd */ str_n_cpy(prm->open_link_cmd, (char *)gtk_entry_get_text(GTK_ENTRY(entry_openlinkcmd)), FILE_NAME_MAXLEN); break; /*case 7: // Disable popups if ((zboolean)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbut_nopopups))) prm->disable_popups = 'y'; else prm->disable_popups = 'n'; break;*/ default: break; } } static void qsetup_apply(GtkWidget *widget, gpointer data) { widget = widget; data = data; if (gtk_assistant_get_current_page(GTK_ASSISTANT(qsetup)) == 4/*8*/) { save_to_config_file(prm); gtk_main_quit(); } } static int move_to_top(GtkWidget *widget) { widget = widget; get_params()->win_y = 0; gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbut_winy), 0); return TRUE; } static int move_to_bottom(GtkWidget *widget) { char font_name_size[FONT_MAXLEN + 1]; char font_name[FONT_NAME_MAXLEN + 1], font_size[FONT_SIZE_MAXLEN + 1]; int requested_font_size, requested_h, y_bottom; /* We backup this param first because... */ char disable_popups_bak = get_params()->disable_popups; /* ...we want this window to always popup */ get_params()->disable_popups = 'n'; widget = widget; /* We need to know requested ticker height */ requested_h = get_params()->win_h; if (requested_h > 0 && requested_h < DRWA_HEIGHT_MIN) requested_h = DRWA_HEIGHT_MIN; else if (requested_h == 0) { /* Compute ticker height from requested font size */ str_n_cpy(font_name_size, get_params()->font_name_size, FONT_MAXLEN); split_font(font_name_size, font_name, font_size); /* In all cases, font size can't be > FONT_MAXSIZE */ requested_font_size = MIN(atoi(font_size), FONT_MAXSIZE); snprintf(font_size, FONT_SIZE_MAXLEN + 1, "%3d", requested_font_size); compact_font(font_name_size, font_name, font_size); requested_h = get_layout_height_from_font_name_size(font_name_size); } y_bottom = env->screen_h - requested_h; #ifndef G_OS_WIN32 /* How to get taskbar height on Linux ? */ warning(BLOCK, "Taskbar height: Will use %d pixels arbitrary value - " "Please adjust as necessary afterwards", ARBITRARY_TASKBAR_HEIGHT); y_bottom -= ARBITRARY_TASKBAR_HEIGHT; #else if (get_win32_taskbar_height() != -1) y_bottom -= get_win32_taskbar_height(); else { warning(BLOCK, "Couldn't compute Taskbar height: Will use %d pixels arbitrary value - " "Please adjust as necessary afterwards", ARBITRARY_TASKBAR_HEIGHT); y_bottom -= ARBITRARY_TASKBAR_HEIGHT; } #endif get_params()->win_y = y_bottom; gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbut_winy), y_bottom); get_params()->disable_popups = disable_popups_bak; return TRUE; } /* * TODO: which other ones here ???? * Reverse scrolling / Read n items max per feed / Mouse wheel scrolling behaviour */ void quick_setup(Params *prm0) { #define N_PAGES_MAX 16 GtkWidget *page[N_PAGES_MAX], *label[N_PAGES_MAX], *hbox[N_PAGES_MAX]; GtkWidget *vbox[N_PAGES_MAX]; int i; env = get_ticker_env(); prm = prm0; prm_bak = malloc2(sizeof(Params)); memcpy((void *)prm_bak, (const void *)prm, sizeof(Params)); qsetup = gtk_assistant_new(); gtk_window_set_title(GTK_WINDOW(qsetup), "Quick Setup"); set_tickr_icon_to_dialog(GTK_WINDOW(qsetup)); gtk_window_set_position(GTK_WINDOW(qsetup), GTK_WIN_POS_CENTER); gtk_window_set_resizable(GTK_WINDOW(qsetup), FALSE); gtk_widget_set_size_request(qsetup, 550, -1); g_signal_connect(G_OBJECT(qsetup), "delete-event", G_CALLBACK(qsetup_del_event), NULL); i = 0; /* Intro page */ hbox[i] = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox[i]), 15); label[i] = gtk_label_new("No configuration file was found.\n" "Would you like to setup a few parameters first ?"); gtk_label_set_use_markup(GTK_LABEL(label[i]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[i]), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox[i]), label[i], FALSE, FALSE, 0); page[i] = hbox[i]; gtk_assistant_append_page(GTK_ASSISTANT(qsetup), page[i]); gtk_assistant_set_page_type(GTK_ASSISTANT(qsetup), page[i], GTK_ASSISTANT_PAGE_INTRO); gtk_assistant_set_page_title(GTK_ASSISTANT(qsetup), page[i], APP_NAME " first run ?"); i++; /* win_y */ hbox[i] = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox[i]), 15); label[i] = gtk_label_new("Vertical Location (Pixels):"); gtk_label_set_use_markup(GTK_LABEL(label[i]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[i]), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox[i]), label[i], FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox[i]), gtk_label_new(""), TRUE, FALSE, 0); top_but = gtk_button_new_with_label("Top"); gtk_box_pack_start(GTK_BOX(hbox[i]), top_but, FALSE, FALSE, 0); bottom_but = gtk_button_new_with_label("Bottom"); gtk_box_pack_start(GTK_BOX(hbox[i]), bottom_but, FALSE, FALSE, 0); adj_winy = gtk_adjustment_new(prm->win_y, 0, env->screen_h, 1, 5, 0); spinbut_winy = gtk_spin_button_new(GTK_ADJUSTMENT(adj_winy), 0.0, 0); gtk_box_pack_start(GTK_BOX(hbox[i]), spinbut_winy, FALSE, FALSE, 0); vbox[i] = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), hbox[i], TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); page[i] = vbox[i]; gtk_assistant_append_page(GTK_ASSISTANT(qsetup), page[i]); gtk_assistant_set_page_type(GTK_ASSISTANT(qsetup), page[i], GTK_ASSISTANT_PAGE_CONTENT); gtk_assistant_set_page_title(GTK_ASSISTANT(qsetup), page[i], APP_NAME " location"); i++; /* Window always-on-top */ hbox[i] = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox[i]), 15); label[i] = gtk_label_new(APP_NAME " always above other windows:"); gtk_label_set_use_markup(GTK_LABEL(label[i]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[i]), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox[i]), label[i], FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox[i]), gtk_label_new(""), TRUE, FALSE, 0); checkbut_alwaysontop = gtk_check_button_new(); if (prm->always_on_top == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_alwaysontop), TRUE); else if (prm->always_on_top == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_alwaysontop), FALSE); gtk_box_pack_start(GTK_BOX(hbox[i]), checkbut_alwaysontop, FALSE, FALSE, 0); vbox[i] = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), hbox[i], TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); page[i] = vbox[i]; gtk_assistant_append_page(GTK_ASSISTANT(qsetup), page[i]); gtk_assistant_set_page_type(GTK_ASSISTANT(qsetup), page[i], GTK_ASSISTANT_PAGE_CONTENT); gtk_assistant_set_page_title(GTK_ASSISTANT(qsetup), page[i], APP_NAME " always-on-top"); i++; /* Following 3 pages now disabled: // Feed title hbox[i] = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox[i]), 15); label[i] = gtk_label_new("Feed title:"); gtk_label_set_use_markup(GTK_LABEL(label[i]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[i]), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox[i]), label[i], FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox[i]), gtk_label_new(""), TRUE, FALSE, 0); checkbut_feedtitle = gtk_check_button_new(); if (prm->feed_title == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_feedtitle), TRUE); else if (prm->feed_title == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_feedtitle), FALSE); gtk_box_pack_start(GTK_BOX(hbox[i]), checkbut_feedtitle, FALSE, FALSE, 0); vbox[i] = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), hbox[i], TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); page[i] = vbox[i]; gtk_assistant_append_page(GTK_ASSISTANT(qsetup), page[i]); gtk_assistant_set_page_type(GTK_ASSISTANT(qsetup), page[i], GTK_ASSISTANT_PAGE_CONTENT); gtk_assistant_set_page_title(GTK_ASSISTANT(qsetup), page[i], "Display feed title"); i++; // Item title hbox[i] = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox[i]), 15); label[i] = gtk_label_new("Item title:"); gtk_label_set_use_markup(GTK_LABEL(label[i]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[i]), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox[i]), label[i], FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox[i]), gtk_label_new(""), TRUE, FALSE, 0); checkbut_itemtitle = gtk_check_button_new(); if (prm->item_title == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_itemtitle), TRUE); else if (prm->item_title == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_itemtitle), FALSE); gtk_box_pack_start(GTK_BOX(hbox[i]), checkbut_itemtitle, FALSE, FALSE, 0); vbox[i] = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), hbox[i], TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); page[i] = vbox[i]; gtk_assistant_append_page(GTK_ASSISTANT(qsetup), page[i]); gtk_assistant_set_page_type(GTK_ASSISTANT(qsetup), page[i], GTK_ASSISTANT_PAGE_CONTENT); gtk_assistant_set_page_title(GTK_ASSISTANT(qsetup), page[i], "Display item title"); i++; // Item description hbox[i] = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox[i]), 15); label[i] = gtk_label_new("Item description:"); gtk_label_set_use_markup(GTK_LABEL(label[i]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[i]), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox[i]), label[i], FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox[i]), gtk_label_new(""), TRUE, FALSE, 0); checkbut_itemdes = gtk_check_button_new(); if (prm->item_description == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_itemdes), TRUE); else if (prm->item_description == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_itemdes), FALSE); gtk_box_pack_start(GTK_BOX(hbox[i]), checkbut_itemdes, FALSE, FALSE, 0); vbox[i] = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), hbox[i], TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); page[i] = vbox[i]; gtk_assistant_append_page(GTK_ASSISTANT(qsetup), page[i]); gtk_assistant_set_page_type(GTK_ASSISTANT(qsetup), page[i], GTK_ASSISTANT_PAGE_CONTENT); gtk_assistant_set_page_title(GTK_ASSISTANT(qsetup), page[i], "Display item description"); i++; */ /* "Open in browser" command line */ hbox[i] = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox[i]), 15); label[i] = gtk_label_new("Browser to open links with:\n" "(Shell command - leave blank/unchanged if unsure)"); gtk_label_set_use_markup(GTK_LABEL(label[i]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[i]), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox[i]), label[i], FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox[i]), gtk_label_new(""), TRUE, FALSE, 0); entry_openlinkcmd = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_openlinkcmd), FILE_NAME_MAXLEN); gtk_entry_set_text(GTK_ENTRY(entry_openlinkcmd), prm->open_link_cmd); gtk_box_pack_start(GTK_BOX(hbox[i]), entry_openlinkcmd, FALSE, FALSE, 0); vbox[i] = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), hbox[i], TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); page[i] = vbox[i]; gtk_assistant_append_page(GTK_ASSISTANT(qsetup), page[i]); gtk_assistant_set_page_type(GTK_ASSISTANT(qsetup), page[i], GTK_ASSISTANT_PAGE_CONTENT); gtk_assistant_set_page_title(GTK_ASSISTANT(qsetup), page[i], "Pick a Browser"); i++; /* This page also disabled: // Disable popups hbox[i] = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox[i]), 15); label[i] = gtk_label_new("Disable error/warning popup windows:"); gtk_label_set_use_markup(GTK_LABEL(label[i]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[i]), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox[i]), label[i], FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox[i]), gtk_label_new(""), TRUE, FALSE, 0); checkbut_nopopups = gtk_check_button_new(); if (prm->disable_popups == 'y') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_nopopups), TRUE); else if (prm->disable_popups == 'n') gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbut_nopopups), FALSE); gtk_box_pack_start(GTK_BOX(hbox[i]), checkbut_nopopups, FALSE, FALSE, 0); vbox[i] = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), hbox[i], TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox[i]), gtk_label_new(""), FALSE, FALSE, 0); page[i] = vbox[i]; gtk_assistant_append_page(GTK_ASSISTANT(qsetup), page[i]); gtk_assistant_set_page_type(GTK_ASSISTANT(qsetup), page[i], GTK_ASSISTANT_PAGE_CONTENT); gtk_assistant_set_page_title(GTK_ASSISTANT(qsetup), page[i], "Disable popups"); i++; */ /* Confirm page */ hbox[i] = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox[i]), 15); label[i] = gtk_label_new("Quick setup complete !\n" "To open the preferences or full settings window, right-click on " APP_NAME " then\n" " 'Edit > Preferences' or 'Edit > Full Settings'."); gtk_label_set_use_markup(GTK_LABEL(label[i]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[i]), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox[i]), label[i], FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox[i]), gtk_label_new(""), TRUE, FALSE, 0); page[i] = hbox[i]; gtk_container_set_border_width(GTK_CONTAINER(hbox[i]), 15); gtk_assistant_append_page(GTK_ASSISTANT(qsetup), page[i]); gtk_assistant_set_page_type(GTK_ASSISTANT(qsetup), page[i], GTK_ASSISTANT_PAGE_CONFIRM); gtk_assistant_set_page_title(GTK_ASSISTANT(qsetup), page[i], "Done"); g_signal_connect(G_OBJECT(top_but), "clicked", G_CALLBACK(move_to_top), NULL); g_signal_connect(G_OBJECT(bottom_but), "clicked", G_CALLBACK(move_to_bottom), NULL); g_signal_connect(G_OBJECT(spinbut_winy), "changed", G_CALLBACK(keep_setting), (gpointer)1); g_signal_connect(G_OBJECT(checkbut_alwaysontop), "toggled", G_CALLBACK(keep_setting), (gpointer)2); /*g_signal_connect(G_OBJECT(checkbut_feedtitle), "toggled", G_CALLBACK(keep_setting), (gpointer)3); g_signal_connect(G_OBJECT(checkbut_itemtitle), "toggled", G_CALLBACK(keep_setting), (gpointer)4); g_signal_connect(G_OBJECT(checkbut_itemdes), "toggled", G_CALLBACK(keep_setting), (gpointer)5);*/ g_signal_connect(G_OBJECT(entry_openlinkcmd), "changed", G_CALLBACK(keep_setting), (gpointer)3/*6*/); /*g_signal_connect(G_OBJECT(checkbut_nopopups), "toggled", G_CALLBACK(keep_setting), (gpointer)7);*/ g_signal_connect(G_OBJECT(qsetup), "cancel", G_CALLBACK(qsetup_cancel), NULL); g_signal_connect(G_OBJECT(qsetup), "prepare", G_CALLBACK(qsetup_prepare), NULL); g_signal_connect(G_OBJECT(qsetup), "apply", G_CALLBACK(qsetup_apply), NULL); gtk_widget_show_all(qsetup); gtk_main(); while (gtk_events_pending()) gtk_main_iteration(); free2(prm_bak); gtk_widget_destroy(qsetup); } tickr_0.7.1.orig/src/tickr/tickr_error.h0000644000175000017500000001434314107736721017656 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #ifndef INC_TICKR_ERROR_H #define INC_TICKR_ERROR_H /* Helpers for warning() */ #define NO_BLOCK TRUE /* Show for INFO_WIN_WAIT_TIMEOUT ms */ #define BLOCK !NO_BLOCK /* Wait for user action */ /* Error codes */ /* Exactly matching this enum and ErrSt array below doesn't matter anymore. */ typedef enum { OK = LIBETM_LASTERRORCODE + 1, NO_RESOURCE_SPECIFIED, RESOURCE_NOT_FOUND, RESOURCE_INVALID, RESOURCE_ENCODING_ERROR, OPTION_TOO_MANY, OPTION_INVALID, OPTION_UNKNOWN, OPTION_VALUE_INVALID, FEED_FORMAT_ERROR, FEED_UNPARSABLE, FEED_EMPTY, FEED_NO_ITEM_OR_ENTRY_ELEMENT, SELECTION_ERROR, SELECTION_EMPTY, RENDER_ERROR, RENDER_NO_RESOURCE, RENDER_CAIRO_IMAGE_SURFACE_TOO_WIDE, RENDER_CREATE_CAIRO_IMAGE_SURFACE_ERROR, RENDER_FILL_IN_STR_ARRAY_ERROR, RENDER_PROCESS_STR_ARRAY_ERROR, RENDER_PANGO_LAYOUT_WIDTH_OVERFLOW, READ_FROM_STREAM_ERROR, WRITE_TO_STREAM_ERROR, NOT_UTF8_ENCODED, SHIFT2LEFT_NULL_CAIRO_IMAGE_SURFACE, FLIST_ERROR, LOAD_URL_LIST_ERROR, LOAD_URL_LIST_EMPTY_LIST, LOAD_URL_LIST_NO_LIST, SAVE_URL_LIST_ERROR, CREATE_FILE_ERROR, OPEN_FILE_ERROR, XML_UNPARSABLE, XML_EMPTY, OPML_ERROR, CONNECT_TOO_MANY_ERRORS, TLS_ERROR, TLS_SEND_ERROR, TLS_RECV_ERROR, HTTP_ERROR, HTTP_UNSUPPORTED_SCHEME, HTTP_NO_AUTH_CREDENTIALS, HTTP_NO_PROXY_AUTH_CREDENTIALS, HTTP_INVALID_PORT_NUM, HTTP_NO_STATUS_CODE, HTTP_TOO_MANY_REDIRECTS, /* http status codes */ HTTP_CONTINUE, HTTP_SWITCH_PROTO, HTTP_MOVED, /* All moved status codes but permamently */ HTTP_MOVED_PERMANENTLY, HTTP_USE_PROXY, HTTP_UNAUTHORIZED, HTTP_BAD_REQUEST, HTTP_FORBIDDEN, HTTP_NOT_FOUND, HTTP_PROXY_AUTH_REQUIRED, HTTP_GONE, HTTP_INT_SERVER_ERROR, NO_BROWSER_SET_ERROR, SEGFAULT, #ifdef G_OS_WIN32 WIN32V_ERROR, #endif TICKR_LASTERRORCODE } tickr_error_code; /* Exactly matching this ErrSt array and enum above doesn't matter anymore. */ static const ErrSt e_a[] = { {OK, "OK"}, {NO_RESOURCE_SPECIFIED, "No resource specified"}, {RESOURCE_NOT_FOUND, "Resource not found"}, {RESOURCE_INVALID, "Invalid resource"}, {RESOURCE_ENCODING_ERROR, "Resource is *not* UTF-8 encoded"}, {OPTION_TOO_MANY, "Too many options"}, {OPTION_INVALID, "Invalid option"}, {OPTION_UNKNOWN, "Unknown option"}, {OPTION_VALUE_INVALID, "Invalid option value"}, {FEED_FORMAT_ERROR, "Feed format error (RSS 1.0/2.0 or ATOM expected)"}, {FEED_UNPARSABLE, "Feed is unparsable"}, {FEED_EMPTY, "Feed is empty"}, {FEED_NO_ITEM_OR_ENTRY_ELEMENT, "No item or entry element"}, {SELECTION_ERROR, "Feed selection error (no more info)"}, {SELECTION_EMPTY, "Feed selection is empty"}, {RENDER_ERROR, "Render error (no more info)"}, {RENDER_NO_RESOURCE, "Render: No resource"}, {RENDER_CAIRO_IMAGE_SURFACE_TOO_WIDE, "Cairo image surface is too wide (> 32 K - 1 pixels)"}, {RENDER_CREATE_CAIRO_IMAGE_SURFACE_ERROR, "Can't create cairo image surface"}, {RENDER_FILL_IN_STR_ARRAY_ERROR, "Error while filling in RenderString array - Check out log for more info"}, {RENDER_PROCESS_STR_ARRAY_ERROR, "Error while processing RenderString array - Check out log for more info"}, {RENDER_PANGO_LAYOUT_WIDTH_OVERFLOW, "Overflow - Pango can't compute layout width of text with these font name and size.\n" "Please either decrease text length or font size."}, {READ_FROM_STREAM_ERROR, "Error while reading from stream"}, {WRITE_TO_STREAM_ERROR, "Error while writing to stream"}, {NOT_UTF8_ENCODED, "String is *not* UTF-8 encoded"}, {SHIFT2LEFT_NULL_CAIRO_IMAGE_SURFACE, "Null cairo image surface"}, {FLIST_ERROR, "FList error (no more info)"}, {LOAD_URL_LIST_ERROR, "Can't load URL list"}, {LOAD_URL_LIST_EMPTY_LIST, "URL list is empty"}, {LOAD_URL_LIST_NO_LIST, "URL list doesn't exist"}, {SAVE_URL_LIST_ERROR, "Can't save URL list"}, {CREATE_FILE_ERROR, "Can't create file"}, {OPEN_FILE_ERROR, "Can't open file"}, {XML_UNPARSABLE, "XML file is unparsable"}, {XML_EMPTY, "XML file is empty"}, {OPML_ERROR, "OPML error (no more info)"}, {CONNECT_TOO_MANY_ERRORS, "Too many connection attempts"}, {TLS_ERROR, "TLS error (no more info)"}, {TLS_SEND_ERROR, "TLS send error"}, {TLS_RECV_ERROR, "TLS recv error"}, {HTTP_ERROR, "HTTP error (no more info)"}, {HTTP_UNSUPPORTED_SCHEME, "Unsupported scheme in URL"}, {HTTP_NO_AUTH_CREDENTIALS, "No authentication credentials"}, {HTTP_NO_PROXY_AUTH_CREDENTIALS, "No proxy authentication credentials"}, {HTTP_INVALID_PORT_NUM, "Invalid port number in URL"}, {HTTP_NO_STATUS_CODE, "No HTTP status code returned"}, {HTTP_TOO_MANY_REDIRECTS, "Too many HTTP redirects"}, /* http status codes */ {HTTP_CONTINUE, "Continue"}, {HTTP_SWITCH_PROTO, "Switch protocol"}, {HTTP_MOVED, "Moved (not permanently)"}, {HTTP_MOVED_PERMANENTLY, "Moved permanently"}, {HTTP_USE_PROXY, "Must be accessed through proxy"}, {HTTP_UNAUTHORIZED, "HTTP authentication required"}, {HTTP_BAD_REQUEST, "Bad request"}, {HTTP_FORBIDDEN, "Forbidden"}, {HTTP_NOT_FOUND, "Not found"}, {HTTP_PROXY_AUTH_REQUIRED, "Proxy authentication required"}, {HTTP_GONE, "Gone"}, {HTTP_INT_SERVER_ERROR, "Internal server error"}, {NO_BROWSER_SET_ERROR, "No Browser is set"}, {SEGFAULT, "Segfault (this is a *bug*)"}, #ifdef G_OS_WIN32 {WIN32V_ERROR, "Win32 version error (no more info)"}, #endif {TICKR_LASTERRORCODE, "Tickr last enumerated error code"} }; const char *tickr_error_str(tickr_error_code); const char *global_error_str(int); void dump_error_codes(); #endif /* INC_TICKR_ERROR_H */ tickr_0.7.1.orig/src/tickr/tickr_tls.h0000644000175000017500000000275114107736721017327 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #ifndef INC_TICKR_TLS_H #define INC_TICKR_TLS_H #define REQUIRED_GNUTLS_V_NUM 0x030109 #define REQUIRED_GNUTLS_V_NUM_STR "3.1.9" #define TLS_RECV_CHUNK_LEN RECV_CHUNK_LEN /* In libetm-0.5.0/tcp_socket.h */ gnutls_session_t *get_tls_session(); gnutls_certificate_credentials_t *get_tls_cred(); int tls_connect(gnutls_session_t *, gnutls_certificate_credentials_t *, const sockt *, const char *, const char *); void tls_disconnect(gnutls_session_t *, gnutls_certificate_credentials_t *, const char *); int verif_cert_callback(gnutls_session_t); int tcp_tls_send_full(sockt, gnutls_session_t, const char *); char *tcp_tls_recv_full(sockt, gnutls_session_t, int *, int *); #endif /* INC_TICKR_TLS_H */ tickr_0.7.1.orig/src/tickr/tickr_connectwin.c0000644000175000017500000004127114107736721020667 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" static Authentication *auth; static Proxy *proxy; static GtkWidget *dialog, *entry_user, *entry_psw, *check_but1; static GtkWidget *entry_host, *entry_port, *entry_proxy_user, *entry_proxy_psw; static GtkWidget *spinbut_connect_timeout, *spinbut_send_recv_timeout; static GtkObject *adj_connect_timeout, *adj_send_recv_timeout; static GtkWidget *check_but2, *check_but3, *label[16]; void init_authentication() { static Authentication auth0; auth = &auth0; auth->use_authentication = FALSE; auth->user[0] = '\0'; auth->psw[0] = '\0'; auth->auth_str[0] = '\0'; } void init_proxy() { static Proxy proxy0; proxy = &proxy0; proxy->use_proxy = FALSE; proxy->host[0] = '\0'; proxy->port[0] = '\0'; proxy->use_proxy_authentication = FALSE; proxy->user[0] = '\0'; proxy->psw[0] = '\0'; proxy->auth_str[0] = '\0'; } static int enter_key_pressed_in_entry(GtkWidget *widget) { widget = widget; gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); return TRUE; } static void set_entries_sensitive1(gboolean state) { gtk_widget_set_sensitive(label[1], state); gtk_widget_set_sensitive(entry_user, state); gtk_widget_set_sensitive(label[2], state); gtk_widget_set_sensitive(entry_psw, state); } static void set_entries_sensitive2(gboolean state) { gtk_widget_set_sensitive(label[4], state); gtk_widget_set_sensitive(entry_host, state); gtk_widget_set_sensitive(label[5], state); gtk_widget_set_sensitive(entry_port, state); gtk_widget_set_sensitive(check_but3, state); } static void set_entries_sensitive3(gboolean state) { gtk_widget_set_sensitive(label[6], state); gtk_widget_set_sensitive(entry_proxy_user, state); gtk_widget_set_sensitive(label[7], state); gtk_widget_set_sensitive(entry_proxy_psw, state); } static int check_but1_toggled(GtkWidget *check_button) { auth->use_authentication = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button)); set_entries_sensitive1(auth->use_authentication); return TRUE; } static int check_but2_toggled(GtkWidget *check_button) { proxy->use_proxy = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button)); set_entries_sensitive2(proxy->use_proxy); set_entries_sensitive3(proxy->use_proxy && proxy->use_proxy_authentication); return TRUE; } static int check_but3_toggled(GtkWidget *check_button) { proxy->use_proxy_authentication = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button)); set_entries_sensitive3(proxy->use_proxy && proxy->use_proxy_authentication); return TRUE; } void compute_auth_and_proxy_str() { char *tmp1, *tmp2; if (auth->user[0] != '\0' && auth->psw[0] != '\0') { tmp1 = l_str_new(auth->user); tmp1 = l_str_cat(tmp1, ":"); tmp1 = l_str_cat(tmp1, auth->psw); tmp2 = g_base64_encode((guchar *)tmp1, (gsize)strlen(tmp1)); str_n_cpy(auth->auth_str, tmp2, AUTH_STR_MAXLEN); g_free(tmp2); l_str_free(tmp1); } else auth->auth_str[0] = '\0'; if (proxy->host[0] != '\0') { tmp1 = l_str_new(proxy->host); if (proxy->port[0] == '\0') str_n_cpy(proxy->port, PROXYPORT, PROXY_PORT_MAXLEN); if (proxy->port[0] != '\0') { tmp1 = l_str_cat(tmp1, ":"); tmp1 = l_str_cat(tmp1, proxy->port); } str_n_cpy(proxy->proxy_str, tmp1, PROXY_STR_MAXLEN); l_str_free(tmp1); } else proxy->proxy_str[0] = '\0'; if (proxy->use_proxy_authentication && proxy->user[0] != '\0' && proxy->psw[0] != '\0') { tmp1 = l_str_new(proxy->user); tmp1 = l_str_cat(tmp1, ":"); tmp1 = l_str_cat(tmp1, proxy->psw); tmp2 = g_base64_encode((guchar *)tmp1, (gsize)strlen(tmp1)); str_n_cpy(proxy->auth_str, tmp2, PROXY_AUTH_STR_MAXLEN); g_free(tmp2); l_str_free(tmp1); } else proxy->auth_str[0] = '\0'; } /* Must be initialized with init_authentication() and init_proxy() */ int connection_settings(connection_settings_page page) { TickerEnv *env = get_ticker_env(); Params *prm = get_params(); GtkWidget *notebook, *table1, *table2, *table3, *hbox; int response = GTK_RESPONSE_CANCEL_CLOSE; gtk_window_set_keep_above(GTK_WINDOW(env->win), FALSE); dialog = gtk_dialog_new_with_buttons( "Connection Settings", GTK_WINDOW(env->win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL_CLOSE, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); /* * Fill structs from params */ auth->use_authentication = (prm->use_authentication == 'y') ? TRUE : FALSE; str_n_cpy(proxy->user, prm->user, USER_MAXLEN); proxy->use_proxy = (prm->use_proxy == 'y') ? TRUE : FALSE; str_n_cpy(proxy->host, prm->proxy_host, PROXY_HOST_MAXLEN); str_n_cpy(proxy->port, prm->proxy_port, PROXY_PORT_MAXLEN); proxy->use_proxy_authentication = (prm->use_proxy_authentication == 'y') ? TRUE : FALSE; str_n_cpy(proxy->user, prm->proxy_user, PROXY_USER_MAXLEN); notebook = gtk_notebook_new(); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), notebook); label[0]= gtk_label_new("Configure HTTP Basic Authentication"); table1 = gtk_table_new(4/*6*/, 2, TRUE); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table1, label[0]); gtk_table_set_row_spacings(GTK_TABLE(table1), 5); gtk_table_set_col_spacings(GTK_TABLE(table1), 5); gtk_container_set_border_width(GTK_CONTAINER(table1), 10); check_but1 = gtk_check_button_new_with_label(" Use Authentication"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_but1), auth->use_authentication); gtk_table_attach_defaults(GTK_TABLE(table1), check_but1, 0, 1, 0, 1); label[1] = gtk_label_new("Username:"); gtk_label_set_use_markup(GTK_LABEL(label[1]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[1]), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table1), label[1], 0, 1, 1, 2); entry_user = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_user), USER_MAXLEN); gtk_entry_set_text(GTK_ENTRY(entry_user), auth->user); gtk_table_attach_defaults(GTK_TABLE(table1), entry_user, 1, 2, 1, 2); label[2] = gtk_label_new("Password:"); gtk_label_set_use_markup(GTK_LABEL(label[2]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[2]), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table1), label[2], 0, 1, 2, 3); entry_psw = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_psw), PSW_MAXLEN); gtk_entry_set_visibility(GTK_ENTRY(entry_psw), FALSE); gtk_entry_set_text(GTK_ENTRY(entry_psw), auth->psw); gtk_table_attach_defaults(GTK_TABLE(table1), entry_psw, 1, 2, 2, 3); gtk_entry_set_visibility(GTK_ENTRY(entry_psw), FALSE); label[3] = gtk_label_new("Configure HTTP Proxy Server"); table2 = gtk_table_new(6, 2, TRUE); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table2, label[3]); gtk_table_set_row_spacings(GTK_TABLE(table2), 5); gtk_table_set_col_spacings(GTK_TABLE(table2), 5); gtk_container_set_border_width(GTK_CONTAINER(table2), 10); check_but2 = gtk_check_button_new_with_label(" Connect via Proxy"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_but2), proxy->use_proxy); gtk_table_attach_defaults(GTK_TABLE(table2), check_but2, 0, 1, 0, 1); label[4] = gtk_label_new("Host:"); gtk_label_set_use_markup(GTK_LABEL(label[4]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[4]), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table2), label[4], 0, 1, 1, 2); entry_host = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_host), PROXY_HOST_MAXLEN); gtk_entry_set_text(GTK_ENTRY(entry_host), proxy->host); gtk_table_attach_defaults(GTK_TABLE(table2), entry_host, 1, 2, 1, 2); label[5] = gtk_label_new("Port:"); gtk_label_set_use_markup(GTK_LABEL(label[5]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[5]), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table2), label[5], 0, 1, 2, 3); entry_port = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_port), PROXY_PORT_MAXLEN); if (proxy->port[0] == '\0') str_n_cpy(proxy->port, PROXYPORT, PROXY_PORT_MAXLEN); gtk_entry_set_text(GTK_ENTRY(entry_port), proxy->port); gtk_table_attach_defaults(GTK_TABLE(table2), entry_port, 1, 2, 2, 3); check_but3 = gtk_check_button_new_with_label(" Proxy requires Authentication"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_but3), proxy->use_proxy_authentication); gtk_table_attach_defaults(GTK_TABLE(table2), check_but3, 0, 1, 3, 4); label[6] = gtk_label_new(" Username:"); gtk_label_set_use_markup(GTK_LABEL(label[6]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[6]), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table2), label[6], 0, 1, 4, 5); entry_proxy_user = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_proxy_user), PROXY_USER_MAXLEN); gtk_entry_set_text(GTK_ENTRY(entry_proxy_user), proxy->user); gtk_table_attach_defaults(GTK_TABLE(table2), entry_proxy_user, 1, 2, 4, 5); label[7] = gtk_label_new(" Password:"); gtk_label_set_use_markup(GTK_LABEL(label[7]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[7]), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table2), label[7], 0, 1, 5, 6); entry_proxy_psw = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_proxy_psw), PROXY_PSW_MAXLEN); gtk_entry_set_visibility(GTK_ENTRY(entry_proxy_psw), FALSE); gtk_entry_set_text(GTK_ENTRY(entry_proxy_psw), proxy->psw); gtk_table_attach_defaults(GTK_TABLE(table2), entry_proxy_psw, 1, 2, 5, 6); hbox = gtk_hbox_new(0, FALSE); label[8] = gtk_label_new(" "); gtk_box_pack_start(GTK_BOX(hbox), label[8], FALSE, FALSE, 0); label[9] = gtk_label_new("Override Default Timeouts"); table3 = gtk_table_new(4/*6*/, 2, TRUE); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table3, label[9]); gtk_table_set_row_spacings(GTK_TABLE(table3), 5); gtk_table_set_col_spacings(GTK_TABLE(table3), 5); gtk_container_set_border_width(GTK_CONTAINER(table3), 10); label[10] = gtk_label_new("Connect Timeout (default = 5 s):"); gtk_label_set_use_markup(GTK_LABEL(label[10]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[10]), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table3), label[10], 0, 1, 0, 1); adj_connect_timeout = gtk_adjustment_new(prm->connect_timeout, 1, 60, 1, 5, 0); spinbut_connect_timeout = gtk_spin_button_new(GTK_ADJUSTMENT(adj_connect_timeout), 0.0, 0); gtk_table_attach_defaults(GTK_TABLE(table3), spinbut_connect_timeout, 1, 2, 0, 1); label[11] = gtk_label_new("Send/Recv Timeout (default = 1 s):"); gtk_label_set_use_markup(GTK_LABEL(label[11]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[11]), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table3), label[11], 0, 1, 1, 2); adj_send_recv_timeout = gtk_adjustment_new(prm->send_recv_timeout, 1, 60, 1, 5, 0); spinbut_send_recv_timeout = gtk_spin_button_new(GTK_ADJUSTMENT(adj_send_recv_timeout), 0.0, 0); gtk_table_attach_defaults(GTK_TABLE(table3), spinbut_send_recv_timeout, 1, 2, 1, 2); label[12] = gtk_label_new("Warning: " /*label[12] = gtk_label_new("Warning: "*/ "Change these settings *only* if you know what you're doing,\n" "as high values might make the application almost unresponsive."); gtk_label_set_use_markup(GTK_LABEL(label[12]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[12]), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table3), label[12], 0, 2, 2, 3); set_entries_sensitive1(auth->use_authentication); set_entries_sensitive2(proxy->use_proxy); set_entries_sensitive3(proxy->use_proxy && proxy->use_proxy_authentication); g_signal_connect(G_OBJECT(check_but1), "toggled", G_CALLBACK(check_but1_toggled), NULL); g_signal_connect(G_OBJECT(check_but2), "toggled", G_CALLBACK(check_but2_toggled), NULL); g_signal_connect(G_OBJECT(check_but3), "toggled", G_CALLBACK(check_but3_toggled), NULL); g_signal_connect(G_OBJECT(entry_user), "activate", G_CALLBACK(enter_key_pressed_in_entry), NULL); g_signal_connect(G_OBJECT(entry_psw), "activate", G_CALLBACK(enter_key_pressed_in_entry), NULL); g_signal_connect(G_OBJECT(entry_host), "activate", G_CALLBACK(enter_key_pressed_in_entry), NULL); g_signal_connect(G_OBJECT(entry_port), "activate", G_CALLBACK(enter_key_pressed_in_entry), NULL); g_signal_connect(G_OBJECT(entry_proxy_user), "activate", G_CALLBACK(enter_key_pressed_in_entry), NULL); g_signal_connect(G_OBJECT(entry_proxy_psw), "activate", G_CALLBACK(enter_key_pressed_in_entry), NULL); g_signal_connect(G_OBJECT(spinbut_connect_timeout), "activate", G_CALLBACK(enter_key_pressed_in_entry), NULL); g_signal_connect(G_OBJECT(spinbut_send_recv_timeout), "activate", G_CALLBACK(enter_key_pressed_in_entry), NULL); gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), (int)page); gtk_widget_show_all(dialog); gtk_window_set_focus(GTK_WINDOW(dialog), NULL); env->suspend_rq = TRUE; if ((response = gtk_dialog_run(GTK_DIALOG(dialog))) == GTK_RESPONSE_OK) { /* * Configure authentication */ auth->use_authentication = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_but1)); str_n_cpy(auth->user, (char *)gtk_entry_get_text(GTK_ENTRY(entry_user)), USER_MAXLEN); /* TODO: How to allow username string to contain inside spaces ? */ remove_surrounding_whitespaces_from_str(auth->user); str_n_cpy(auth->psw, (char *)gtk_entry_get_text(GTK_ENTRY(entry_psw)), PSW_MAXLEN); remove_char_from_str(auth->psw, ' '); /* * Configure proxy */ proxy->use_proxy = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_but2)); str_n_cpy(proxy->host, (char *)gtk_entry_get_text(GTK_ENTRY(entry_host)), PROXY_HOST_MAXLEN); remove_char_from_str(proxy->host, ' '); str_n_cpy(proxy->port, (char *)gtk_entry_get_text(GTK_ENTRY(entry_port)), PROXY_PORT_MAXLEN); remove_char_from_str(proxy->port, ' '); /* * Configure proxy authentication */ proxy->use_proxy_authentication = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_but3)); str_n_cpy(proxy->user, (char *)gtk_entry_get_text(GTK_ENTRY(entry_proxy_user)), PROXY_USER_MAXLEN); /* TODO: How to allow username string to contain inside spaces ? */ remove_surrounding_whitespaces_from_str(proxy->user); str_n_cpy(proxy->psw, (char *)gtk_entry_get_text(GTK_ENTRY(entry_proxy_psw)), PROXY_PSW_MAXLEN); remove_char_from_str(proxy->psw, ' '); /* * Compute auth and proxy stuff */ compute_auth_and_proxy_str(); /* * Save struct members as params */ prm->use_authentication = auth->use_authentication ? 'y' : 'n'; str_n_cpy(prm->user, auth->user, USER_MAXLEN); prm->use_proxy = proxy->use_proxy ? 'y' : 'n'; str_n_cpy(prm->proxy_host, proxy->host, PROXY_HOST_MAXLEN); str_n_cpy(prm->proxy_port, proxy->port, PROXY_PORT_MAXLEN); prm->use_proxy_authentication = proxy->use_proxy_authentication ? 'y' : 'n'; str_n_cpy(prm->proxy_user, proxy->user, PROXY_USER_MAXLEN); /* * Get socket timeouts */ prm->connect_timeout = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_connect_timeout)); prm->send_recv_timeout = (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbut_send_recv_timeout)); /* * Set timeouts */ set_connect_timeout_sec(prm->connect_timeout); set_send_recv_timeout_sec(prm->send_recv_timeout); /* * Then save everything to file */ save_to_config_file(prm); } gtk_widget_destroy(dialog); check_main_win_always_on_top(); env->suspend_rq = FALSE; return response; } void set_use_authentication(zboolean value) { auth->use_authentication = value; } zboolean get_use_authentication() { return auth->use_authentication; } char *get_http_auth_user() { return (char *)auth->user; } char *get_http_auth_psw() { return (char *)auth->psw; } char *get_http_auth_str() { return (char *)auth->auth_str; } void set_use_proxy(zboolean value) { libetm_socket_set_use_proxy(value); proxy->use_proxy = libetm_socket_get_use_proxy(); } zboolean get_use_proxy() { return proxy->use_proxy; } char *get_proxy_host() { return (char *)proxy->host; } char *get_proxy_port() { return (char *)proxy->port; } char *get_proxy_str() { return (char *)proxy->proxy_str; } void set_use_proxy_auth(zboolean value) { proxy->use_proxy_authentication = value; } zboolean get_use_proxy_auth() { return proxy->use_proxy_authentication; } char *get_proxy_auth_user() { return (char *)proxy->user; } char *get_proxy_auth_psw() { return (char *)proxy->psw; } char *get_proxy_auth_str() { return (char *)proxy->auth_str; } tickr_0.7.1.orig/src/tickr/tickr_tls.c0000644000175000017500000001556014107736721017324 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" #include "tickr_tls.h" /* Global GnuTLS variables: session and credentials */ static gnutls_session_t tls_s; static gnutls_certificate_credentials_t tls_c; gnutls_session_t *get_tls_session() { return &tls_s; } gnutls_certificate_credentials_t *get_tls_cred() { return &tls_c; } /* * Retrieve available credentials and check X509 server certificate. */ int tls_connect(gnutls_session_t *s, gnutls_certificate_credentials_t *c, const sockt *sock, const char *url, const char *host) { int i; if ((i = gnutls_certificate_allocate_credentials(c)) != GNUTLS_E_SUCCESS) { warning(M_S_MOD, "%s:\ngnutls_certificate_allocate_credentials() error: %s", url, gnutls_strerror(i)); return TLS_ERROR; } if ((i = gnutls_certificate_set_x509_system_trust(*c)) < 0) { warning(M_S_MOD, "%s:\ngnutls_certificate_set_x509_system_trust() error: %s", url, gnutls_strerror(i)); gnutls_certificate_free_credentials(*c); return TLS_ERROR; } else { DEBUG_INFO("gnutls_certificate_set_x509_system_trust(): %d certificates processed\n", i); } gnutls_certificate_set_verify_function(*c, verif_cert_callback); if ((i = gnutls_init(s, GNUTLS_CLIENT)) != GNUTLS_E_SUCCESS) { warning(M_S_MOD, "%s:\ngnutls_init() error: %s", url, gnutls_strerror(i)); gnutls_certificate_free_credentials(*c); return TLS_ERROR; } gnutls_session_set_ptr(*s, (void *)host); gnutls_server_name_set(*s, GNUTLS_NAME_DNS, host, strlen(host)); if ((i = gnutls_priority_set_direct(*s, "NORMAL:%COMPAT", NULL)) != GNUTLS_E_SUCCESS) { warning(M_S_MOD, "%s:\ngnutls_priority_set_direct() error: %s", url, gnutls_strerror(i)); gnutls_certificate_free_credentials(*c); gnutls_deinit(*s); return TLS_ERROR; } else if ((i = gnutls_credentials_set(*s, GNUTLS_CRD_CERTIFICATE, *c)) != GNUTLS_E_SUCCESS) { warning(M_S_MOD, "%s:\ngnutls_credentials_set() error: %s", url, gnutls_strerror(i)); gnutls_certificate_free_credentials(*c); gnutls_deinit(*s); return TLS_ERROR; } gnutls_transport_set_int(*s, *sock); gnutls_handshake_set_timeout(*s, GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT); do { i = gnutls_handshake(*s); if (i < 0 && gnutls_error_is_fatal(i)) { warning(M_S_MOD, "%s:\ngnutls_handshake() error: %s", url, gnutls_strerror(i)); gnutls_certificate_free_credentials(*c); gnutls_deinit(*s); return TLS_ERROR; } } while (i < 0); return OK; } void tls_disconnect(gnutls_session_t *s, gnutls_certificate_credentials_t *c, const char *url) { int i, j; gnutls_certificate_free_credentials(*c); for (j = 0; j < 3; j++) { /* 3 times */ if ((i = gnutls_bye(*s, GNUTLS_SHUT_RDWR)) == GNUTLS_E_SUCCESS) break; else if (i == GNUTLS_E_AGAIN || i == GNUTLS_E_INTERRUPTED) continue; else { INFO_ERR("%s:\ngnutls_bye() error: %s\n", url, gnutls_strerror(i)) break; } } gnutls_deinit(*s); } int verif_cert_callback(gnutls_session_t s) { char *host; unsigned int status; int type; gnutls_datum_t output; int i; host = gnutls_session_get_ptr(s); if ((i = gnutls_certificate_verify_peers3(s, host, &status)) < 0) { INFO_ERR("gnutls_certificate_verify_peers3() error: %s\n", gnutls_strerror(i)) return GNUTLS_E_CERTIFICATE_ERROR; } if (status == 0) { DEBUG_INFO("Certificate is OK, yep !!\n"); return 0; } else { /*if (question_win("WARNING: Certificate is not trusted. Continue anyways ?") == YES) return 0; else return GNUTLS_E_CERTIFICATE_ERROR;*/ type = gnutls_certificate_type_get(s); if ((i = gnutls_certificate_verification_status_print(status, type, &output, 0)) < 0) { INFO_ERR("gnutls_certificate_verification_status_print() error: %s\n", gnutls_strerror(i)) return GNUTLS_E_CERTIFICATE_ERROR; } warning(M_S_MOD, "Certificate is not trusted\n%s", output.data); gnutls_free(output.data); return GNUTLS_E_CERTIFICATE_ERROR; } } /* * Using GnuTLS session. * TODO: Re-check everything, especially errno vs gnutls error codes */ #define FPRINTF_FFLUSH_2(a1, a2); {fprintf(a1, a2); fflush(a1);} #define FPRINTF_FFLUSH_3(a1, a2, a3); {fprintf(a1, a2, a3); fflush(a1);} /* * Return n bytes sent or (if < 0) some GNUTLS_E_ error. */ int tcp_tls_send_full(sockt sock, gnutls_session_t s, const char *str) { int len = strlen(str), i, j = 0; while (writable_data_is_available_on_tcp_socket(sock) == SELECT_TRUE) { if ((i = gnutls_record_send(s, str + j, len)) > 0) { j += i; len -= i; if (len == 0) break; } else if (i == 0) { if (len > 0) VERBOSE_INFO_ERR("tcp_tls_send_full(): Not all bytes sent ?") break; } else if (i == GNUTLS_E_AGAIN || i == GNUTLS_E_INTERRUPTED) { continue; } else if (i == GNUTLS_E_REHANDSHAKE) { /*INFO_ERR("Server requests TLS renegotiation\n")*/ INFO_ERR("gnutls_record_send() error: %s\n", gnutls_strerror(i)) j = i; break; } else { INFO_ERR("gnutls_record_send() error: %s\n", gnutls_strerror(i)) if (gnutls_error_is_fatal(i)) { j = i; break; } } } return j; } /* * Return response = tcp_tls_recv_full(socket, gnutls_session, &bytes_received, &status) * or NULL if error. * -> status = OK or CONNECTION_CLOSED_BY_SERVER or some GNUTLS_E_ error. * -> allocate memory for response (must be freed afterwards with free2() if != NULL). */ char *tcp_tls_recv_full(sockt sock, gnutls_session_t s, int *bytes_received, int *status) { char *response, *full_response; int i; *bytes_received = 0; response = malloc2(TLS_RECV_CHUNK_LEN + 1); response[0] = '\0'; full_response = l_str_new(response); while (readable_data_is_available_on_tcp_socket(sock) == SELECT_TRUE) { if ((i = gnutls_record_recv(s, response, TLS_RECV_CHUNK_LEN)) > 0) { response[MIN(i, TLS_RECV_CHUNK_LEN)] = '\0'; full_response = l_str_cat(full_response, response); *bytes_received += i; *status = OK; } else if (i == 0) { /* EOF */ if (gnutls_record_check_pending(s) == 0) { *status = OK; break; } } else if (i == GNUTLS_E_AGAIN || i == GNUTLS_E_INTERRUPTED) { continue; } else { INFO_ERR("gnutls_record_recv() error: %s\n", gnutls_strerror(i)) if (gnutls_error_is_fatal(i)) { *status = i; l_str_free(full_response); full_response = NULL; break; } } } free2(response); return full_response; } tickr_0.7.1.orig/src/tickr/tickr_opml.c0000644000175000017500000003120014107736721017456 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" #define OPML_FEED_RANK APP_CMD "FeedRank" char *opml_str_global; char tmp_str[TMPSTR_SIZE + 1]; /* Prototypes for static functions */ static char *pick_opml_file(); static int parse_opml_file(const char *); static void get_opml_selected_element(xmlNode *, const char *, const char *); static char *create_opml_str_from_feed_list_node(FList *); static int save_str_as_opml_file(const char *); /* * Importing */ static int *get_feed_counter() { static int feed_counter; return &feed_counter; } static void zero_feed_counter() { *get_feed_counter() = 0; } static void inc_feed_counter() { *get_feed_counter() += 1; } int import_opml_file() { char *opml_file_name, *url_list_file_name; FList *node; FILE *fp; int status = OPML_ERROR; if ((opml_file_name = pick_opml_file())[0] != '\0') { url_list_file_name = l_str_new(get_datafile_full_name_from_name(URL_LIST_FILE)); if ((fp = g_fopen(url_list_file_name, "rb")) != NULL) { fclose(fp); if (question_win("Imported URLs will be merged with currently saved ones. " "Continue ?", -1) == NO) { l_str_free(url_list_file_name); return status; } } else if ((fp = g_fopen(url_list_file_name, "wb")) != NULL) fclose(fp); else { warning(BLOCK, "Can't create URL list '%s': %s", url_list_file_name, strerror(errno)); return status; } win_with_progress_bar(WIN_WITH_PROGRESS_BAR_OPEN, " Importing (and updating) data from OPML file, please wait ... "); VERBOSE_INFO_OUT( "Importing (and updating) data from OPML file (%s), please wait ...\n", opml_file_name); zero_feed_counter(); get_ticker_env()->selection_mode = MULTIPLE; opml_str_global = l_str_new(NULL); if (parse_opml_file(opml_file_name) == OK) if ((fp = g_fopen(url_list_file_name, "ab")) != NULL) { fprintf(fp, "\n%s\n", opml_str_global); fclose(fp); if (f_list_load_from_file(&node, NULL) == OK) { node = f_list_sort(node); if (f_list_save_to_file(node, NULL) == OK) { if (IS_FLIST(get_feed_list())) f_list_free_all(get_feed_list()); set_feed_list(node); status = OK; } } } l_str_free(url_list_file_name); l_str_free(opml_str_global); win_with_progress_bar(WIN_WITH_PROGRESS_BAR_CLOSE, NULL); if (status == OK) { snprintf(tmp_str, TMPSTR_SIZE + 1, "\nFeed list (%d URLs) has been imported\n", *get_feed_counter()); info_win("", tmp_str, INFO, FALSE); } } return status; } static char *pick_opml_file() { GtkWidget *dialog; GtkFileFilter *filter; char *file_name; static char file_name2[FILE_NAME_MAXLEN + 1]; gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); dialog = gtk_file_chooser_dialog_new("Import Feed List (OPML)", GTK_WINDOW(get_ticker_env()->win), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL_CLOSE, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); gtk_widget_show_all(dialog); filter = gtk_file_filter_new(); gtk_file_filter_add_pattern(filter, "*.opml"); gtk_file_filter_add_pattern(filter, "*.xml"); gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter); file_name2[0] = '\0'; if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { if ((file_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog))) != NULL) { str_n_cpy(file_name2, file_name, FILE_NAME_MAXLEN); g_free(file_name); } } gtk_widget_destroy(dialog); check_main_win_always_on_top(); return file_name2; } /* TODO: Add option to import feed list without checking all URLs */ static int parse_opml_file(const char *file_name) { xmlDoc *doc = NULL; xmlNode *cur_node = NULL, *cur_node_start = NULL; int body_element = NO, outline_element = NO; VERBOSE_INFO_OUT("Parsing OPML file ...\n"); if ((doc = xmlParseFile(file_name)) == NULL) { warning(BLOCK, "Can't parse XML file: %s", xmlGetLastError()->message); return XML_UNPARSABLE; } else if ((cur_node = xmlDocGetRootElement(doc)) == NULL) { warning(BLOCK, "Empty XML document: '%s'", file_name); xmlFreeDoc(doc); return XML_EMPTY; } else if (xmlStrcmp(cur_node->name, (const xmlChar *)"opml") != 0) { warning(BLOCK, "Not an OPML document: '%s'", file_name); xmlFreeDoc(doc); return OPML_ERROR; } cur_node_start = cur_node; for (cur_node = cur_node->children; cur_node != NULL; cur_node = cur_node->next) { if (xmlStrcmp(cur_node->name, (const xmlChar *)"body") == 0) { body_element = YES; break; } } if (body_element == YES) { for (cur_node = cur_node->children; cur_node != NULL; cur_node = cur_node->next) { if (xmlStrcmp(cur_node->name, (const xmlChar *)"outline") == 0) { outline_element = YES; break; } } } if (body_element == YES && outline_element == YES) { get_opml_selected_element(cur_node_start, "outline", "xmlUrl"); VERBOSE_INFO_OUT("Done\n"); xmlFreeDoc(doc); return OK; } else { warning(BLOCK, "Couldn't find all required OPML elements in: '%s'", file_name); xmlFreeDoc(doc); return OPML_ERROR; } } /* * Entry format in URL list file: * ['*' (selected) or '-' (unselected) + "000" (3 chars rank) + URL [+ '>' + title] + '\n'] * * Entry max length = FILE_NAME_MAXLEN * See also: (UN)SELECTED_URL_CHAR/STR and TITLE_TAG_CHAR/STR in tickr.h * FLIST_RANK_FORMAT and FLIST_RANK_STR_LEN in tickr_list.h */ static void get_opml_selected_element(xmlNode *some_node, const char *selected_element, const char *selected_attribute) { xmlNode *cur_node; xmlChar *str1, *str2, *str3; char feed_url[FILE_NAME_MAXLEN + 1]; char feed_title[FEED_TITLE_MAXLEN + 1]; char feed_rank[FLIST_RANK_STR_LEN + 1]; char *feed_str; for (cur_node = some_node; cur_node != NULL; cur_node = cur_node->next) { if (xmlStrcmp(cur_node->name, (const xmlChar *)selected_element) == 0) { /* * Need to get attribute name and value, * then get value for name = "xmlUrl", * check if URL is reachable and valid, * also eventually get value for (NOT STANDARD) name = OPML_FEED_RANK. */ if ((str1 = xmlGetProp(cur_node, (xmlChar *)selected_attribute)) != NULL) { if ((str2 = xmlGetProp(cur_node, (xmlChar *)"xmlUrl")) != NULL) { /* First, we add one UNSELECTED_URL_CHAR */ feed_str = l_str_new(UNSELECTED_URL_STR); /* then FLIST_RANK_STR_LEN chars */ if ((str3 = xmlGetProp(cur_node, (xmlChar *)OPML_FEED_RANK)) != NULL) { snprintf(feed_rank, FLIST_RANK_STR_LEN + 1, FLIST_RANK_FORMAT, atoi((char *)str3)); xmlFree(str3); } else str_n_cpy(feed_rank, BLANK_STR_16, FLIST_RANK_STR_LEN); feed_str = l_str_cat(feed_str, feed_rank); str_n_cpy(feed_url, (const char *)str2, FILE_NAME_MAXLEN); /* We check the feed URL */ if (check_and_update_feed_url(feed_url, feed_title) == OK) { /* We add feed URL */ feed_str = l_str_cat(feed_str, (const char*)feed_url); if (feed_title[0] != '\0') { /* and feed title */ feed_str = l_str_cat(feed_str, TITLE_TAG_STR); feed_str = l_str_cat(feed_str, feed_title); } } else { feed_str = l_str_cat(feed_str, (const char*)feed_url); feed_str = l_str_cat(feed_str, TITLE_TAG_STR); feed_str = l_str_cat(feed_str, "-"); /* Should find sth fancier */ VERBOSE_INFO_OUT("URL is unreachable or invalid (or whatever)\n") } /* We're done for that */ feed_str = l_str_cat(feed_str, "\n"); opml_str_global = l_str_cat(opml_str_global, feed_str); inc_feed_counter(); snprintf(tmp_str, TMPSTR_SIZE + 1, "%d feed%s imported so far, please wait ...", *get_feed_counter(), *get_feed_counter() <= 1 ? "" : "s"); /*snprintf(tmp_str, TMPSTR_SIZE + 1, "%d feed%s imported so far, please wait ...\n%s", *get_feed_counter(), *get_feed_counter() <= 1 ? "" : "s", feed_url);*/ win_with_progress_bar(WIN_WITH_PROGRESS_BAR_PULSE, tmp_str); l_str_free(feed_str); xmlFree(str2); } xmlFree(str1); } } get_opml_selected_element(cur_node->children, selected_element, selected_attribute); } } /* * Exporting */ void export_opml_file() { FList *node; char *str; if (f_list_load_from_file(&node, NULL) == OK) { str = create_opml_str_from_feed_list_node(node); save_str_as_opml_file(str); l_str_free(str); f_list_free_all(node); } } /* Must l_str_free() opml_str afterwards */ static char *create_opml_str_from_feed_list_node(FList *node) { #define OPML_TITLE APP_NAME " Feed List" #define STR_SIZE (4 * 1024) char *opml_header = "\n" "\n" " \n" " %s\n" " \n" " \n"; char *opml_item = " \n"; char *opml_footer = " \n" "\n"; char *opml_str, tmp[STR_SIZE]; char *esc_str1, *esc_str2; time_t time2; char time_str[64]; snprintf(tmp, STR_SIZE, opml_header, OPML_TITLE); opml_str = l_str_new(tmp); for (; node != NULL; node = node->next) { if (!g_utf8_validate(node->url, -1, NULL)) { warning(BLOCK, "%s: '%s' - Skipped", global_error_str(NOT_UTF8_ENCODED), node->url); continue; } esc_str1 = g_uri_escape_string(node->title, " AÄääàçéèêÖöôÜüùà'()[]-_|{}/.,;:?!%€£$*+=", TRUE); esc_str2 = g_uri_escape_string(node->url, G_URI_RESERVED_CHARS_GENERIC_DELIMITERS, TRUE); snprintf(tmp, STR_SIZE, opml_item, esc_str1, esc_str2, node->rank); g_free(esc_str1); g_free(esc_str2); opml_str = l_str_cat(opml_str, tmp); } l_str_cat(opml_str, opml_footer); /* Add time of export (as a comment) */ time2 = time(NULL); l_str_cat(opml_str, "\n"); return opml_str; } static int save_str_as_opml_file(const char *str) { GtkWidget *dialog; char *file_name = NULL; FILE *fp; int error_code = CREATE_FILE_ERROR; char tmp[TMPSTR_SIZE + 1]; gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); dialog = gtk_file_chooser_dialog_new("Export Feed List (OPML)", GTK_WINDOW(get_ticker_env()->win), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL_CLOSE, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); gtk_widget_show_all(dialog); /*gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), "~");*/ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), APP_CMD "-feed-list.opml"); gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { if ((file_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog))) != NULL) { if ((fp = g_fopen(file_name, "wb")) != NULL) { fprintf(fp, "%s", str); fclose(fp); error_code = OK; } else warning(BLOCK, "Can't save OPML file '%s': %s", file_name, strerror(errno)); } } gtk_widget_destroy(dialog); if (error_code == OK) { snprintf(tmp, TMPSTR_SIZE + 1, "\nFeed list has been exported to OPML file: '%s'\n", file_name); info_win("", tmp, INFO, FALSE); } if (file_name != NULL) g_free(file_name); check_main_win_always_on_top(); return error_code; } tickr_0.7.1.orig/src/tickr/tickr_helptext.c0000644000175000017500000003736414107736721020365 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" static const char *help_str0[] = { "USER INTERFACE MAIN FEATURES:\n\n", "- To open the main menu, right-click inside " APP_NAME " area.\n\n", "- You can import feed subscriptions with 'File > Import Feed List (OPML)',\n", " for instance your Google Reader subscriptions.\n\n", "- To add a new feed, open 'File > Feed Organizer (RSS/Atom)', then look\n", " for 'New Feed -> Enter URL' at the bottom of the window, click 'Clear'\n", " and type or paste the feed URL.\n\n", "- To open a link in your browser, left-click on text.\n\n", "- Use mouse wheel to either adjust " APP_NAME " scrolling speed or open the\n", " 'Selected Feed Picker' window to quickly move between selected feeds\n", " (use + mouse wheel for alternative action.) This behaviour is\n", " set in the 'Preferences' window as 'Mouse Wheel acts on'.\n\n", "- Basically, use 'File > Feed Organizer (RSS|Atom)' to manage your feed\n", " list, select feeds, subscribe to new ones, and 'Edit > Preferences'\n", " to tweak " APP_NAME " appearance and behaviour.\n\n", "- 'Window - always on top' -> check this if you want " APP_NAME " to always stay\n", " above your browser (and any other windows.)\n\n", "- 'Window - decorated' -> if you want " APP_NAME " to be'draggable'.\n\n", "If you don't import any feed list, there is a sample one that you can use.\n\n", "ONLY in case you're using " APP_NAME " inside a ***decorated*** window, you can\n", "use these keyboard shortcuts:\n\n", "- R to open the 'Feed Organizer (RSS|Atom)' window.\n\n", "- T to open a text file.\n\n", "- I to import (and merge) an URL list from an OPML file.\n\n", "- E to export the URL list to an OPML file.\n\n", "- P to open the 'Resource Properties' window.\n\n", "- Q to quit.\n\n", "- S to open the 'Preferences' window.\n\n", "- B to open the link displayed inside " APP_NAME " (middle area.)\n\n", "- J to play / K to pause / L to reload (current feed).\n\n", "- U (speed Up) / D (speed Down) to adjust scrolling speed on\n", " the fly.\n\n", "- F1 to open the 'Quick Help' window.\n\n", "- H to launch the 'Online Help' (this very page.)\n\n", "- A to open the 'About' window.\n\n\n", "COMMAND LINE REFERENCE ('tickr -help' output):\n\n", NULL }; static const char *help_str1[] = { APP_NAME "-" APP_V_NUM " - GTK-based highly graphically-customizable Feed Ticker\n", COPYRIGHT_STR " <" SUPPORT_EMAIL_ADDR ">\n\n", APP_NAME " is a GTK-based RSS/Atom Reader that displays feeds as a smooth\n" "scrolling line on your Desktop, as known from TV stations. Open feed\n" "links in your favourite Browser. Graphics are highly customizable.\n\n" "Usage:\n", " " APP_CMD " [-help, -h, -? / -version, - v / -license, -l]\n", " [-dumpconfig / -dumpfontlist / -dumperrorcodes]\n", " [-instance-id=n / -no-ui]\n", " [options (-name[=value])...]\n", " [resource (URL or file name)]\n\n", " help Get this help page\n\n", " version Print out version number\n\n", " license Print out license\n\n", " dumpconfig Send content of config file to stdout\n\n", " dumpfontlist Send list of available fonts to stdout\n\n", " dumperrorcodes Send error codes and strings to stdout\n\n", " instance-id=n n = 1 to 99 - Use this when launching\n", " several instances simultaneously, each\n", " instance using its own config and dump\n", " files (to be effective, instance-id must\n", " be the 1st argument)\n\n", " no-ui Disable opening of UI elements which can\n", " modify settings and/or URL list/\n", " selection (to be effective, no-ui must\n", " be the 1st or 2nd argument)\n\n", "Options:\n", " delay=n Delay in milliseconds\n", " (-> speed = K / delay)\n\n", " shiftsize=n Shift size in pixels\n", " (-> speed = K x shift size)\n\n", " fgcolor=#rrggbbaa Foreground 32-bit hexa color\n\n", /*" highlightfgcolor=#rrggbbaa Marked items foreground 32-bit hexa\n", " color\n\n",*/ " bgcolor=#rrggbbaa Background 32-bit hexa color\n\n", " setgradientbg=[y/n] Set gradient background\n\n", " bgcolor2=#rrggbbaa Background 32-bit hexa color2\n\n", " fontname='str' Font name\n\n", " fontsize=n Font size (can't be > 200)\n\n", /* Check this is up to date */ " disablescreenlimits=[y/n] Allow win_x, win_y and win_w to be\n" " greater than screen dimensions\n\n", " win_x=n Window position - x\n\n", " win_y=n Window position - y\n\n", " win_w=n Window width\n\n", " win_h=n Window height (compute font size if > 0)\n\n", " windec=[y/n] Window decoration\n\n", " alwaysontop=[y/n] Window always-on-top\n\n", " wintransparency=n Actually window opacity from 1 to 10\n", " (0 = none -> 10 = full)\n\n", " iconintaskbar=[y/n] Icon in taskbar\n\n", " winsticky=[y/n] Visible on all user desktops\n\n", " overrideredirect=[y/n] Set top window override_redirect flag,\n", " ie bypass window manager (experimental)\n\n", " shadow=[y/n] Apply shadow to text\n\n", " shadowoffset_x=n Shadow x offset in pixels\n\n", " shadowoffset_y=n Shadow y offset in pixels\n\n", " shadowfx=n Shadow effect (0 = none -> 10 = full)\n\n", " linedelimiter='str' String to be appended at end of line\n\n", " specialchars=[y/n] Enable or disable special characters.\n", " This is only useful when resource is a\n", " file, not an URL\n\n", " newpgchar=c 'New page' special character\n\n", " tabchar=c 'Tab' (8 spaces) special character\n\n", " rssrefresh=n Refresh rate in minutes = delay before\n", " reloading resource (URL or text file.)\n", " 0 = never force reload. Otherwise, apply\n", " only if no TTL inside feed or if\n", " resource is text file.\n", " (Actually, in multiple selections mode,\n", " all feeds are always reloaded\n", " sequentially, because there is no\n", " caching involved)\n\n", " revsc=[y/n] Reverse scrolling (= L to R), for\n", " languages written/read from R to L\n\n", " feedtitle=[y/n] Show or hide feed title\n\n", " feedtitledelimiter='str' String to be appended after feed title\n\n", " itemtitle=[y/n] Show or hide item title\n\n", " itemtitledelimiter='str' String to be appended after item title\n\n", " itemdescription=[y/n] Show or hide item description\n\n", " itemdescriptiondelimiter='str' String to be appended after item\n", " description\n\n", " nitemsperfeed=n Read N items max per feed (0 = no limit)\n\n", /*" markitemaction=[h/c/n] Mark item action: hide / color / none\n\n",*/ " rmtags=[y/n] Strip html tags\n\n", " uppercasetext=[y/n] Set all text to upper case\n\n", " homefeed='str' Set URL as 'homefeed' = homepage\n", " (from command line, not automatically\n", " saved, so a little bit useless...)\n\n", " openlinkcmd='str' 'Open in Browser' command line:\n", " Application that will open active link\n", " (may require path.) Most likely will\n", " invoke your favourite browser\n\n", " openlinkargs='str' 'Open in Browser' optional arguments\n\n", " clock=[l/r/n] Clock location: left / right / none\n\n", " clocksec=[y/n] Show seconds\n\n", " clock12h=[y/n] 12h time format\n\n", " clockdate=[y/n] Show date\n\n", " clockaltdateform=[y/n] Use alternative date format, ie\n" " 'Mon 01 Jan' instead of 'Mon Jan 01'\n\n", " clockfontname='str' Clock font name\n\n", " clockfontsize=n Clock font size (can't be > " APP_NAME "\n", " height)\n\n", " clockfgcolor=#rrggbbaa Clock foreground 32-bit hexa color\n\n", " clockbgcolor=#rrggbbaa Clock background 32-bit hexa color\n\n", " setclockgradientbg=[y/n] Set clock gradient background\n\n", " clockbgcolor2=#rrggbbaa Clock background 32-bit hexa color2\n\n", " disablepopups=[y/n] Disable error/warning popup windows\n\n", " pauseonmouseover=[y/n] Pause " APP_NAME " on mouseover\n\n", " disableleftclick=[y/n] Disable left-click\n\n", " mousewheelaction=[s/f/n] Mouse wheel acts on:\n", " (" APP_NAME "-)speed / feed(-in-list) / none\n", " (use + mouse wheel for\n", " alternative action)\n\n", " sfeedpickerautoclose=[y/n] Selected feed picker window closes when\n", " pointer leaves area \n\n", " enablefeedordering=[y/n] Enable feed re-ordering (by user)\n\n", " useauth=[y/n] Use HTTP basic authentication\n\n", " user='str' User\n\n", " psw='str' Password (never saved)\n\n", " useproxy=[y/n] Connect through proxy\n\n", " proxyhost='str' Proxy host\n\n", " proxyport='str' Proxy port\n\n", " useproxyauth=[y/n] Use proxy authentication\n\n", " proxyuser='str' Proxy user\n\n", " proxypsw='str' Proxy password (never saved)\n\n", " connect-timeout=n n = 1 to 60 (seconds) - Override default\n", " connect timeout value (= 5 seconds),\n", /* Check this is up to date */ " useful if proxy or slow internet link\n\n", " sendrecv-timeout=n Same as above for send/recv timeout\n", " (default value = 1 second)\n\n", /* Check this is up to date */ "Mouse usage:\n" " To open the main menu, right-click inside " APP_NAME " area.\n\n", " You can import feed subscriptions from another feed reader with\n", " 'File > Import Feed List (OPML)'.\n\n", " To add a new feed, open 'File > Feed Organizer (RSS/Atom)', then look\n", " for 'New Feed -> Enter URL' at the bottom of the window, click 'Clear'\n", " and type or paste the feed URL.\n\n", " To open a link in your browser, left-click on text.\n\n", " Use mouse wheel to either adjust " APP_NAME " scrolling speed or open the\n", " 'Selected Feed Picker' window to quickly move between selected feeds\n", " (use + mouse wheel for alternative action.)\n\n", " Basically, use 'File > Feed Organizer (RSS|Atom)' to manage your feed\n", " list, select feeds, subscribe to new ones, and 'Edit > Preferences'\n", " to tweak " APP_NAME " appearance and behaviour.\n\n", "Local resources:\n", " file:///path/file_name is considered an URL and will be XML-parsed, ie\n", " a RSS or Atom format is expected.\n\n", " /path/file_name will be processed as a non-XML text file, ie the file\n", " will be read 'as is'.\n\n", "You can set your favourite browser in the Full Settings window. Otherwise, the\n", "system default one will be looked for.\n\n", APP_NAME " parses command line arguments and looks for option(s) then for one\n", "resource, the rest of the line is ignored. It also reads configuration file\n", #ifndef G_OS_WIN32 "'" APP_CMD "-conf' located in /home//" TICKR_DIR_NAME "/ if it exists (or\n", "'" APP_CMD "-conf' if an instance id has been set to n.)\n\n", #else "'" APP_CMD "-conf' located in " TICKR_DIR_NAME "/ if it exists (or\n", "'" APP_CMD "-conf' if an instance id has been set to n.)\n\n", #endif "Command line options override configuration file ones which override default\n", "ones.\n\n", "Compiled with GTK+2, Libxml2, GnuTLS and Libfribidi.\n\n",/*" on " __DATE__ " - " __TIME__ "\n\n",*/ /* Fix non-reproducible builds */ "Visit " WEBSITE_URL " for more info.\n", NULL }; static const char *license_str1[] = { APP_NAME " version " APP_V_NUM " - " COPYRIGHT_STR "\n\n", APP_NAME " is free software: you can redistribute it and/or modify\n", "it under the terms of the GNU General Public License as published by\n", "the Free Software Foundation, either version 3 of the License, or\n", "(at your option) any later version.\n\n", APP_NAME " is distributed in the hope that it will be useful,\n", "but WITHOUT ANY WARRANTY; without even the implied warranty of\n", "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n", "GNU General Public License for more details.\n\n", "You should have received a copy of the GNU General Public License\n", "along with this program. If not, see ", NULL }; static const char *license_str2 = "http://www.gnu.org/licenses/\n"; const char** get_help_str0() { return help_str0; } const char** get_help_str1() { return help_str1; } const char** get_license_str1() { return license_str1; } const char* get_license_str2() { return license_str2; } tickr_0.7.1.orig/src/tickr/tickr_http.c0000644000175000017500000006077514107736721017511 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" /* Are these values OK ? */ #define HTTP_REQUEST_MAXLEN (8 * 1024 - 1) #define HTTP_HEADER_FIELD_MAXLEN (2 * 1024 - 1) #define MAX_HTTP_REDIRECT 8 #define DEFAULT_HTTP_PORT_STR "80" #define DEFAULT_HTTPS_PORT_STR "443" #define TAB '\x09' void remove_chunk_info(char **response) { char *response2; int i, j; response2 = l_str_new(*response); response2[0] = '\0'; i = go_after_next_empty_line(*response); while ((j = (int)get_http_chunk_size(*response + i)) > 0) { i += go_after_next_cr_lf(*response + i); str_n_cat(response2, *response + i, j); i += j; i += go_after_next_cr_lf(*response + i); } free2(*response); *response = response2; } /* * 'Quickly check' feed format (xml/rss2.0/rss1.0/atom), get shift to begining * and cut off trailing part. * Return OK or, if error, RESOURCE_ENCODING_ERROR or FEED_FORMAT_ERROR. */ static int format_quick_check(char *response, int *shift) { int i; i = 0; while (strncmp(response + i, "", 5) != 0 && response[i] != '\0') i++; if (response[i] != '\0') response[i + 5] = '\0'; else return FEED_FORMAT_ERROR; } else { i = 0; while (strncmp(response + i, "", 9) != 0 && response[i] != '\0') i++; if (response[i] != '\0') response[i + 9] = '\0'; else return FEED_FORMAT_ERROR; } else { i = 0; while (strncmp(response + i, "", 6) != 0 && response[i] != '\0') i++; if (response[i] != '\0') response[i + 6] = '\0'; else return FEED_FORMAT_ERROR; } else return FEED_FORMAT_ERROR; } } i = 0; while (strncmp(response + i, "https_support) { if (port_num[0] == '\0') str_n_cpy(port_num, DEFAULT_HTTPS_PORT_STR, PORT_STR_MAXLEN); else if (strcmp(port_num, DEFAULT_HTTPS_PORT_STR) != 0) INFO_OUT("Will use non-standard HTTPS port %s for this connection\n", port_num) } else { warning(M_S_MOD, "%s:\nNo HTTPS support (GnuTLS required version is %s", " but installed version is %s)", url, REQUIRED_GNUTLS_V_NUM_STR, gnutls_check_version(NULL)); return HTTP_UNSUPPORTED_SCHEME; } } else if (strcmp(scheme, "file") == 0) { /* Do nothing here */ } else if (scheme[0] == '\0') { warning(M_S_MOD, "No scheme found in URL: %s", url); return HTTP_UNSUPPORTED_SCHEME; } else { warning(M_S_MOD, "Unsupported or unknown scheme in URL: %s", scheme); return HTTP_UNSUPPORTED_SCHEME; } } else { /* Connect via proxy */ str_n_cpy(host, get_proxy_host(), FILE_NAME_MAXLEN); str_n_cpy(port_num, get_proxy_port(), PORT_STR_MAXLEN); } if ((*sock = tcp_connect_to_host(host, port_num)) != TCP_SOCK_CREATE_ERROR) { connect_fail_count = 0; return OK; } else { if (get_use_proxy()) { warning(BLOCK, "Can't connect to proxy: %s:%s", get_proxy_host(), get_proxy_port()); current_feed(); connection_settings(PROXY_PAGE); } else warning(M_S_MOD, "Can't connect to host: %s", host); if (++connect_fail_count >= CONNECT_FAIL_MAX) { connect_fail_count = 0; return CONNECT_TOO_MANY_ERRORS; } else return TCP_SOCK_CANT_CONNECT; } } /* === TODO: Better document this func, still a bit confusing === * * Do fetch resource specified by its id * * resrc_id = URL (including local URL) or full path/file name * * Here, resrc_id will be replaced by modified URL (in case of HTTP * moved-permanently redirects) and remote resource will be downloaded * and saved under file_name. * * === What about url ? === * * Max length of resrc_id, file_name, and url = FILE_NAME_MAXLEN. */ int fetch_resource(char *resrc_id, const char *file_name, char *url) { sockt sock; int status, recv_status; zboolean http_moved_permamently; char *response; char *new_url; char header_field[HTTP_HEADER_FIELD_MAXLEN + 1]; FILE *fp; int content_length; char orig_scheme[URL_SCHEME_MAXLEN + 1]; char orig_host[FILE_NAME_MAXLEN + 1]; char orig_port[PORT_STR_MAXLEN + 1]; char new_port[PORT_STR_MAXLEN + 1]; GError *error = NULL; char *tmp = NULL; int i, j; /* We first check the scheme */ if (strncmp(resrc_id, "file://", strlen("file://")) == 0) { /* 'file' scheme */ str_n_cpy(url, resrc_id + strlen("file://"), FILE_NAME_MAXLEN - strlen("file://")); if (strncmp(url, "localhost/", strlen("localhost/")) == 0) i = strlen("localhost/") - 1; else if (url[0] == '/') i = 0; else return RESOURCE_INVALID; if (g_file_get_contents(url + i, &response, NULL, &error)) { tmp = l_str_new(response); g_free(response); response = tmp; tmp = NULL; if ((j = format_quick_check(response, &i)) == OK) { if (g_file_set_contents(file_name, response + i, -1, &error)) { free2(response); /* l_str_free() and free2() do the same things */ return OK; } else { free2(response); if (error != NULL) { warning(BLOCK, error->message); /* TODO: Should be more informative */ g_error_free(error); } else warning(BLOCK, "Can't create file: '%s'", file_name); return CREATE_FILE_ERROR; } } else { free2(response); return j; } } else { if (error != NULL) { warning(M_S_MOD, error->message); /* TODO: Should be more informative */ g_error_free(error); } else warning(M_S_MOD, "Can't open file: '%s'", url + i); return OPEN_FILE_ERROR; } } else /* 'http' or 'https' scheme */ str_n_cpy(url, resrc_id, FILE_NAME_MAXLEN); /* Connecting */ if ((i = connect_with_url(&sock, url)) == OK) { if ((status = get_http_response(sock, "GET", "", url, &new_url, &response, &recv_status)) == TCP_SEND_ERROR || status == TCP_RECV_ERROR || status == TLS_ERROR || status == TLS_SEND_ERROR || status == TLS_RECV_ERROR) { if (recv_status == CONNECTION_CLOSED_BY_SERVER || recv_status == TCP_SOCK_SHOULD_BE_CLOSED) CLOSE_SOCK(sock); return i; } } else return i; /* Keeping a copy of original URL in case of HTTP redirects. */ str_n_cpy(get_resource()->orig_url, url, FILE_NAME_MAXLEN); /* TODO: Is this OK here */ while (1) { /* * Status checked here are those returned by get_http_response() * so we must make sure to catch all them. * Beside HTTP status, they may also be error codes. */ if (status == HTTP_CONTINUE) { free2(response); status = get_http_response(sock, "GET", "", url, &new_url, &response, &recv_status); continue; } else if (status == HTTP_SWITCH_PROTO) { warning(M_S_MOD, "%s:\nRequest to switch protocol for this connection - Not supported", url); DEBUG_INFO("'Upgrade' header field in HTTP response: %s\n", get_http_header_value("Upgrade", response)) free2(response); CLOSE_SOCK(sock); return status; } else if (status == OK) { if (strcmp(get_http_header_value("Transfer-Encoding", response), "chunked") == 0) /* Chunked transfer encoding */ remove_chunk_info(&response); else if ((content_length = atoi(get_http_header_value("Content-Length", response))) > 0) { /* * 'Content-Length' = length of entity body is mandatory * but if 'Transfer-Encoding: chunked'. */ /* Do nothing */ } else VERBOSE_INFO_ERR("No 'Transfer-Encoding' nor 'Content-Length' " "header field in HTTP response\n") /* * Quickly 'check format' (xml and rss/atom stuff), * shift to beginnig and cut off trailing part. */ if ((j = format_quick_check(response, &i)) != OK) { free2(response); return j; } /* If OK, save to dump file. */ if ((fp = g_fopen(file_name, "wb")) != NULL) { fprintf(fp, "%s", response + i); fclose(fp); free2(response); CLOSE_SOCK(sock); return OK; } else { warning(BLOCK, "Can't create file: '%s'", file_name); fclose(fp); free2(response); CLOSE_SOCK(sock); return CREATE_FILE_ERROR; } } else if (status == HTTP_MOVED || status == HTTP_MOVED_PERMANENTLY) { if (status == HTTP_MOVED_PERMANENTLY) http_moved_permamently = TRUE; else http_moved_permamently = FALSE; str_n_cpy(get_resource()->orig_url, url, FILE_NAME_MAXLEN); str_n_cpy(orig_scheme, get_scheme_from_url(url), URL_SCHEME_MAXLEN); str_n_cpy(orig_host, get_host_and_port_from_url(url, orig_port), FILE_NAME_MAXLEN); i = 0; do { /* * We test if URL scheme is present, to know whether new_url contains a full URL or a PATH. * POSSIBLE FIXME: Could new_url contain host/path ? */ if (*get_scheme_from_url(new_url) != '\0') /* Scheme -> full URL */ str_n_cpy(url, new_url, FILE_NAME_MAXLEN); else /* No scheme -> path */ snprintf(url, FILE_NAME_MAXLEN + 1, "%s://%s%s", get_scheme_from_url(url), get_host_and_port_from_url(url, NULL), new_url); free2(response); /* No need to disconnect/reconnect if same scheme, host and port num. */ if (strcmp(get_scheme_from_url(url), orig_scheme) != 0 || strcmp(get_host_and_port_from_url(url, new_port), orig_host) != 0 || strcmp(new_port, orig_port) != 0) { CLOSE_SOCK(sock); if ((j = connect_with_url(&sock, url)) != OK) return j; } } while (((status = get_http_response(sock, "GET", "", url, &new_url, &response, &recv_status)) == HTTP_MOVED || status == HTTP_MOVED_PERMANENTLY) && ++i < MAX_HTTP_REDIRECT); if (status != HTTP_MOVED && status != HTTP_MOVED_PERMANENTLY && i <= MAX_HTTP_REDIRECT) { VERBOSE_INFO_OUT("Original URL: %s\nNew URL after HTTP redirect(s): %s\n", get_resource()->orig_url, url) DEBUG_INFO("status = %s\n", global_error_str(status)) if (http_moved_permamently) str_n_cpy(resrc_id, url, FILE_NAME_MAXLEN); continue; } else { warning(M_S_MOD, "%s:\nToo many HTTP redirects", resrc_id); free2(response); CLOSE_SOCK(sock); return HTTP_TOO_MANY_REDIRECTS; } } else if (status == HTTP_USE_PROXY) { warning(BLOCK, "Resource: %s", "\nmust be accessed through proxy.\nProxy host: %s", url, new_url); str_n_cpy(get_proxy_host(), new_url, PROXY_HOST_MAXLEN); free2(response); CLOSE_SOCK(sock); connection_settings(PROXY_PAGE); current_feed(); return status; } else if (status == HTTP_PROXY_AUTH_REQUIRED) { /* Proxy authentication */ free2(response); CLOSE_SOCK(sock); if (get_use_proxy_auth()) { if ((i = connect_with_url(&sock, url)) != OK) return i; snprintf(header_field, HTTP_HEADER_FIELD_MAXLEN + 1, "Proxy-Authorization: Basic %s\r\n\r\n", get_proxy_auth_str()); if ((status = get_http_response(sock, "GET", header_field, url, &new_url, &response, &recv_status)) == HTTP_PROXY_AUTH_REQUIRED) { warning(BLOCK, "Proxy authentication failed for: %s", get_proxy_host()); free2(response); CLOSE_SOCK(sock); if (connection_settings(PROXY_PAGE) == GTK_RESPONSE_OK) { if ((i = connect_with_url(&sock, url)) != OK) return i; status = get_http_response(sock, "GET", header_field, url, &new_url, &response, &recv_status); } else return HTTP_NO_PROXY_AUTH_CREDENTIALS; } continue; } else { warning(BLOCK, "Proxy authentication required for: %s", get_proxy_host()); if (connection_settings(PROXY_PAGE) == GTK_RESPONSE_OK && get_use_proxy_auth()) { if ((i = connect_with_url(&sock, url)) != OK) return i; snprintf(header_field, HTTP_HEADER_FIELD_MAXLEN + 1, "Proxy-Authorization: Basic %s\r\n\r\n", get_proxy_auth_str()); status = get_http_response(sock, "GET", header_field, url, &new_url, &response, &recv_status); continue; } else return HTTP_NO_PROXY_AUTH_CREDENTIALS; } } else if (status == HTTP_UNAUTHORIZED) { /* HTTP authentication - only basic so far */ free2(response); CLOSE_SOCK(sock); if (get_use_authentication()) { if ((i = connect_with_url(&sock, url)) != OK) return i; snprintf(header_field, HTTP_HEADER_FIELD_MAXLEN + 1, "Authorization: Basic %s\r\n\r\n", get_http_auth_str()); if ((status = get_http_response(sock, "GET", header_field, url, &new_url, &response, &recv_status)) == HTTP_UNAUTHORIZED) { warning(BLOCK, "HTTP authentication failed for: %s", url); free2(response); CLOSE_SOCK(sock); if (connection_settings(AUTH_PAGE) == GTK_RESPONSE_OK) { if ((i = connect_with_url(&sock, url)) != OK) return i; status = get_http_response(sock, "GET", header_field, url, &new_url, &response, &recv_status); } else return HTTP_NO_AUTH_CREDENTIALS; } continue; } else { warning(BLOCK, "HTTP authentication required for: %s", url); if (connection_settings(AUTH_PAGE) == GTK_RESPONSE_OK && get_use_authentication()) { if ((i = connect_with_url(&sock, url)) != OK) return i; snprintf(header_field, HTTP_HEADER_FIELD_MAXLEN + 1, "Authorization: Basic %s\r\n\r\n", get_http_auth_str()); status = get_http_response(sock, "GET", header_field, url, &new_url, &response, &recv_status); continue; } else return HTTP_NO_AUTH_CREDENTIALS; } } else if ( status == HTTP_BAD_REQUEST || status == HTTP_FORBIDDEN || status == HTTP_NOT_FOUND || status == HTTP_GONE || status == HTTP_INT_SERVER_ERROR || status == HTTP_NO_STATUS_CODE) { warning(M_S_MOD, "%s:\n%s", url, global_error_str(status)); free2(response); CLOSE_SOCK(sock); return status; } else { if (status > 10000) warning(M_S_MOD, "%s:\nResponse HTTP status code = %d", url, status - 10000); else DEBUG_INFO("%s\n", global_error_str(status)) if (response != NULL) free2(response); CLOSE_SOCK(sock); return HTTP_ERROR; } } } /* 'rq_str' may contain header fields(s) separated and ended by "\r\n". */ const char *build_http_request(const char *method, const char *path, const char *host, const char* rq_str) { static char str[HTTP_REQUEST_MAXLEN + 1]; snprintf(str, HTTP_REQUEST_MAXLEN, "%s %s HTTP/1.1\r\n" /* Start line with method and path */ "Host: %s\r\n" /* Mandatory host header field */ "User-Agent: " APP_NAME "-" APP_V_NUM "\r\n" /* Seems totally useless - * "Accept-Charset: utf-8\r\n"*/ "%s\r\n", /* Optional extra header field(s) */ method, path, host, rq_str); return (const char *)str; } /* * 'rq_str' may contain header field(s) separated and ended by "\r\n". * Must 'free2' response afterwards. * * If returned value > 10000, it's an unprocessed HTTP status code + 10000. */ int get_http_response(sockt sock, const char *rq_method, const char *rq_str, const char *rq_url, char **new_rq_url, char **response, int *recv_status) { char *str; static char location[FILE_NAME_MAXLEN + 1]; int bytes_sent, bytes_received, status_code; gnutls_session_t *s; gnutls_certificate_credentials_t *c; location[0] = '\0'; *new_rq_url = (char *)location; *response = NULL; str = (char *)build_http_request( rq_method, (get_use_proxy() ? rq_url : get_path_from_url(rq_url)), /* Path or full (absolute) URL if using proxy */ /* is that correct when using proxy? */ get_host_and_port_from_url(rq_url, NULL), rq_str); if (strcmp(get_scheme_from_url(rq_url), "http") == 0) bytes_sent = tcp_send_full(sock, (const char *)str); else { /* https */ s = get_tls_session(); c = get_tls_cred(); if (tls_connect(s, c, (const sockt *)&sock, (const char *)rq_url, get_host_and_port_from_url(rq_url, NULL)) == OK) { /*char *info; info = gnutls_session_get_desc(*s); DEBUG_INFO("tls_connect() = OK - TLS session info:\n%s\n", info) gnutls_free(info);*/ } else return TLS_ERROR; bytes_sent = tcp_tls_send_full(sock, *get_tls_session(), (const char *)str); } if (bytes_sent >= 0) { if (strcmp(get_scheme_from_url(rq_url), "http") == 0) *response = tcp_recv_full(sock, &bytes_received, recv_status); else { /* https */ *response = tcp_tls_recv_full(sock, *get_tls_session(), &bytes_received, recv_status); tls_disconnect(get_tls_session(), get_tls_cred(), (const char *)rq_url); } if (*response != NULL) { if ((status_code = get_http_status_code(*response)) == 100) return HTTP_CONTINUE; else if (status_code == 101) return HTTP_SWITCH_PROTO; else if (status_code == 200) return OK; else if ( status_code == 300 || /* 'Multiple choices' */ status_code == 302 || /* 'Found' */ status_code == 303 || /* 'See other' */ status_code == 304 || /* 'Not modified' */ status_code == 307 /* 'Moved temporarily' */ ) { str_n_cpy(location, get_http_header_value("Location", *response), FILE_NAME_MAXLEN); return HTTP_MOVED; /* Must use the new URL in 'Location' */ } else if (status_code == 301) { /* 'Moved permanently' */ str_n_cpy(location, get_http_header_value("Location", *response), FILE_NAME_MAXLEN); return HTTP_MOVED_PERMANENTLY; /* Must use the new URL in 'Location' * and set resrc->id to new value */ } else if (status_code == 305) return HTTP_USE_PROXY; else if (status_code == 400) return HTTP_BAD_REQUEST; else if (status_code == 401) return HTTP_UNAUTHORIZED; else if (status_code == 403) return HTTP_FORBIDDEN; else if (status_code == 404) return HTTP_NOT_FOUND; else if (status_code == 407) return HTTP_PROXY_AUTH_REQUIRED; else if (status_code == 410) return HTTP_GONE; else if (status_code == 500) return HTTP_INT_SERVER_ERROR; else if (status_code == -1) return HTTP_NO_STATUS_CODE; else return status_code + 10000; } else { if (strcmp(get_scheme_from_url(rq_url), "http") == 0) return TCP_RECV_ERROR; else /* https */ return TLS_RECV_ERROR; } } else if (strcmp(get_scheme_from_url(rq_url), "http") == 0) return TCP_SEND_ERROR; else /* https */ return TLS_SEND_ERROR; } /* Return -1 if error. */ int get_http_status_code(const char *response) { char status_code[4]; int i = 0; while (response[i] != ' ' && response[i] != TAB) { if (response[i] == '\n' || response[i] == '\r' || response[i] == '\0') return -1; else i++; } while (response[i] == ' ' || response[i] == TAB) i++; if (response[i] == '\n' || response[i] == '\r' || response[i] == '\0') status_code[0] = '\0'; else str_n_cpy(status_code, response + i, 3); return atoi(status_code); } /* Get header_value as string (empty one if header name not found). */ const char *get_http_header_value(const char *header_name, const char *response) { static char header_value[1024]; int len = strlen(header_name), i = 0; while (strncasecmp(response + i, header_name, len) != 0 && response[i] != '\0') i++; if (response[i] != '\0') { i += len; if (response[i] != ':') { header_value[0] = '\0'; return (const char *)header_value; } else i++; while (response[i] == ' ' || response[i] == TAB) { if (response[i] == '\n' || response[i] == '\r' || response[i] == '\0') { header_value[0] = '\0'; return (const char *)header_value; } else i++; } str_n_cpy(header_value, response + i, 1023); i = 0; while (header_value[i] != '\0' && header_value[i] != ' ' && header_value[i] != TAB && header_value[i] != '\n' && header_value[i] != '\r' && i < 1023) i++; header_value[i] = '\0'; } else header_value[0] = '\0'; return (const char *)header_value; } /* Return 0 if none found. */ int go_after_next_cr_lf(const char *response) { int i = 0; while (strncmp(response + i, "\r\n", 2) != 0 && response[i] != '\0') i++; if (response[i] != '\0') return i + 2; else return 0; } /* Return 0 if none found. */ int go_after_next_empty_line(const char *response) { int i = 0; while (strncmp(response + i, "\r\n\r\n", 4) != 0 && response[i] != '\0') i++; if (response[i] != '\0') return i + 4; else return 0; } /* * 'response' must point to chunk size hexa str or preceeding space(s). * Return -1 if invalid chunk size format (ie not an hexa str). */ int get_http_chunk_size(const char *response) { char size_str[32], *tailptr; int size, i = 0; while (response[i] == ' ' || response[i] == TAB || response[i] == '\n' || response[i] == '\r') i++; str_n_cpy(size_str, response + i, 31); i = 0; while (size_str[i] != ' ' && size_str[i] != TAB && size_str[i] != '\n' && size_str[i] != '\r' && size_str[i] != ';' && size_str[i] != '\0' && i < 31) i++; size_str[i] = '\0'; size = (int)strtoul(size_str, &tailptr, 16); if (tailptr == size_str) { INFO_ERR("Invalid hexadecimal value in HTTP chunk size: %s\n", size_str) return -1; } else return size; } /* * 'http://www.sth1.org/sth2/sth3.xml' -> 'http' * (expect one scheme in URL, return empty str if none). */ const char *get_scheme_from_url(const char *url) { static char str[URL_SCHEME_MAXLEN + 1]; int i = 0; while (strncmp(url + i, "://", 3) != 0 && url[i] != '\0') i++; if (url[i] != '\0') str_n_cpy(str, url, MIN(i, URL_SCHEME_MAXLEN)); else str[0] = '\0'; return (const char *)str; } /* * 'http://www.sth1.org/sth2/sth3.xml' -> 'www.sth1.org', '' * 'http://www.sth1.org:80/sth2/sth3.xml' -> 'www.sth1.org', '80' * (expect one scheme in URL, return empty str if none). * port_num may be NULL. If port_num != NULL, MAKE SURE that it can handle * PORT_STR_MAXLEN chars. */ const char *get_host_and_port_from_url(const char *url, char *port_num) { static char str[FILE_NAME_MAXLEN + 1]; int i = 0, j = 0; while (strncmp(url + i, "://", 3) != 0 && url[i] != '\0') i++; if (url[i] != '\0') { str_n_cpy(str, url + i + 3, FILE_NAME_MAXLEN); i = 0; while (str[i] != '\0' && str[i] != '/' && i < FILE_NAME_MAXLEN) { if (str[i] == ':') { j = i; break; } else i++; } str[i] = '\0'; if (port_num != NULL) { port_num[0] = '\0'; if (j != 0) { j++; if (url[j] != '\0') { while (str[j] != '\0' && str[j] != '/' && j < FILE_NAME_MAXLEN) j++; str[j] = '\0'; str_n_cpy(port_num, str + i + 1, PORT_STR_MAXLEN); } } } } else str[0] = '\0'; return (const char *)str; } zboolean port_num_is_valid(const char *port_num) { if (str_is_num(port_num) && atoi(port_num) > 0 && atoi(port_num) < 65536) return TRUE; else return FALSE; } /* * 'http://www.sth1.org/sth2/sth3.xml' -> '/sth2/sth3.xml' * (expect one scheme in URL, return empty str if none). */ const char *get_path_from_url(const char *url) { static char str[FILE_NAME_MAXLEN + 1]; int i = 0; while (strncmp(url + i, "://", 3) != 0 && url[i] != '\0') i++; if (url[i] != '\0') { i += 3; while (url[i] != '\0' && url[i] != '/') i++; if (url[i] != '\0') str_n_cpy(str, url + i, FILE_NAME_MAXLEN); else str[0] = '\0'; } else str[0] = '\0'; return (const char *)str; } tickr_0.7.1.orig/src/tickr/Makefile.am0000644000175000017500000000225014107736721017206 0ustar manutmmanutmprefix = /usr exec_prefix = $(prefix)/bin bindir = $(exec_prefix) datarootdir = $(prefix)/share/tickr datadir = $(datarootdir) tickrdir = $(datadir)/pixmaps bin_PROGRAMS = tickr tickr_SOURCES = tickr_main.c\ tickr_resource.c\ tickr_render.c\ tickr_params.c\ tickr_clock.c \ tickr_feedparser.c\ tickr_list.c\ tickr_feedpicker.c\ tickr_prefwin.c\ tickr_otherwins.c\ tickr_misc.c\ tickr_helptext.c\ tickr_opml.c\ tickr_http.c\ tickr_connectwin.c\ tickr_quickfeedpicker.c\ tickr_quicksetup.c\ tickr_check4updates.c\ tickr_error.c\ tickr_tls.c tickr_CFLAGS = -O2 -Wall -Wextra -Wunused-parameter -Wshadow -Wpointer-arith\ -ffast-math -pedantic -Wno-variadic-macros -fmax-errors=5 $(GTK2_CFLAGS)\ -Wno-deprecated-declarations -Wno-format -Wno-format-truncation\ $(XML2_CFLAGS) $(GNUTLS_CFLAGS) $(FRIBIDI_CFLAGS) #-Wno-deprecated-declarations for boring GTK+2 "'GTypeDebugFlags' is deprecated" tickr_LDFLAGS = -Wl,-z,defs -Wl,--as-needed tickr_LDADD = ../libetm-0.5.0/libetm.a $(GTK2_LIBS) $(XML2_LIBS) $(GNUTLS_LIBS)\ $(FRIBIDI_LIBS) -lm tickr_DATA = ../../images/tickr-icon.png ../../images/tickr-logo.png\ ../../images/tickr-rss-icon.png ../../images/tickr-icon.xpm tickr_0.7.1.orig/src/tickr/Makefile.in0000664000175000017500000017621314107736721017234 0ustar manutmmanutm# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = tickr$(EXEEXT) subdir = src/tickr ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(tickrdir)" PROGRAMS = $(bin_PROGRAMS) am_tickr_OBJECTS = tickr-tickr_main.$(OBJEXT) \ tickr-tickr_resource.$(OBJEXT) tickr-tickr_render.$(OBJEXT) \ tickr-tickr_params.$(OBJEXT) tickr-tickr_clock.$(OBJEXT) \ tickr-tickr_feedparser.$(OBJEXT) tickr-tickr_list.$(OBJEXT) \ tickr-tickr_feedpicker.$(OBJEXT) tickr-tickr_prefwin.$(OBJEXT) \ tickr-tickr_otherwins.$(OBJEXT) tickr-tickr_misc.$(OBJEXT) \ tickr-tickr_helptext.$(OBJEXT) tickr-tickr_opml.$(OBJEXT) \ tickr-tickr_http.$(OBJEXT) tickr-tickr_connectwin.$(OBJEXT) \ tickr-tickr_quickfeedpicker.$(OBJEXT) \ tickr-tickr_quicksetup.$(OBJEXT) \ tickr-tickr_check4updates.$(OBJEXT) \ tickr-tickr_error.$(OBJEXT) tickr-tickr_tls.$(OBJEXT) tickr_OBJECTS = $(am_tickr_OBJECTS) am__DEPENDENCIES_1 = tickr_DEPENDENCIES = ../libetm-0.5.0/libetm.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) tickr_LINK = $(CCLD) $(tickr_CFLAGS) $(CFLAGS) $(tickr_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/tickr-tickr_check4updates.Po \ ./$(DEPDIR)/tickr-tickr_clock.Po \ ./$(DEPDIR)/tickr-tickr_connectwin.Po \ ./$(DEPDIR)/tickr-tickr_error.Po \ ./$(DEPDIR)/tickr-tickr_feedparser.Po \ ./$(DEPDIR)/tickr-tickr_feedpicker.Po \ ./$(DEPDIR)/tickr-tickr_helptext.Po \ ./$(DEPDIR)/tickr-tickr_http.Po \ ./$(DEPDIR)/tickr-tickr_list.Po \ ./$(DEPDIR)/tickr-tickr_main.Po \ ./$(DEPDIR)/tickr-tickr_misc.Po \ ./$(DEPDIR)/tickr-tickr_opml.Po \ ./$(DEPDIR)/tickr-tickr_otherwins.Po \ ./$(DEPDIR)/tickr-tickr_params.Po \ ./$(DEPDIR)/tickr-tickr_prefwin.Po \ ./$(DEPDIR)/tickr-tickr_quickfeedpicker.Po \ ./$(DEPDIR)/tickr-tickr_quicksetup.Po \ ./$(DEPDIR)/tickr-tickr_render.Po \ ./$(DEPDIR)/tickr-tickr_resource.Po \ ./$(DEPDIR)/tickr-tickr_tls.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(tickr_SOURCES) DIST_SOURCES = $(tickr_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(tickr_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ XML2_CFLAGS = @XML2_CFLAGS@ XML2_LIBS = @XML2_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = $(exec_prefix) build_alias = @build_alias@ builddir = @builddir@ datadir = $(datarootdir) datarootdir = $(prefix)/share/tickr docdir = @docdir@ dvidir = @dvidir@ exec_prefix = $(prefix)/bin host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = /usr program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ tickrdir = $(datadir)/pixmaps tickr_SOURCES = tickr_main.c\ tickr_resource.c\ tickr_render.c\ tickr_params.c\ tickr_clock.c \ tickr_feedparser.c\ tickr_list.c\ tickr_feedpicker.c\ tickr_prefwin.c\ tickr_otherwins.c\ tickr_misc.c\ tickr_helptext.c\ tickr_opml.c\ tickr_http.c\ tickr_connectwin.c\ tickr_quickfeedpicker.c\ tickr_quicksetup.c\ tickr_check4updates.c\ tickr_error.c\ tickr_tls.c tickr_CFLAGS = -O2 -Wall -Wextra -Wunused-parameter -Wshadow -Wpointer-arith\ -ffast-math -pedantic -Wno-variadic-macros -fmax-errors=5 $(GTK2_CFLAGS)\ -Wno-deprecated-declarations -Wno-format -Wno-format-truncation\ $(XML2_CFLAGS) $(GNUTLS_CFLAGS) $(FRIBIDI_CFLAGS) #-Wno-deprecated-declarations for boring GTK+2 "'GTypeDebugFlags' is deprecated" tickr_LDFLAGS = -Wl,-z,defs -Wl,--as-needed tickr_LDADD = ../libetm-0.5.0/libetm.a $(GTK2_LIBS) $(XML2_LIBS) $(GNUTLS_LIBS)\ $(FRIBIDI_LIBS) -lm tickr_DATA = ../../images/tickr-icon.png ../../images/tickr-logo.png\ ../../images/tickr-rss-icon.png ../../images/tickr-icon.xpm all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tickr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/tickr/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) tickr$(EXEEXT): $(tickr_OBJECTS) $(tickr_DEPENDENCIES) $(EXTRA_tickr_DEPENDENCIES) @rm -f tickr$(EXEEXT) $(AM_V_CCLD)$(tickr_LINK) $(tickr_OBJECTS) $(tickr_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_check4updates.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_clock.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_connectwin.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_error.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_feedparser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_feedpicker.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_helptext.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_http.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_list.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_misc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_opml.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_otherwins.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_params.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_prefwin.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_quickfeedpicker.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_quicksetup.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_render.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_resource.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tickr-tickr_tls.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` tickr-tickr_main.o: tickr_main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_main.o -MD -MP -MF $(DEPDIR)/tickr-tickr_main.Tpo -c -o tickr-tickr_main.o `test -f 'tickr_main.c' || echo '$(srcdir)/'`tickr_main.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_main.Tpo $(DEPDIR)/tickr-tickr_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_main.c' object='tickr-tickr_main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_main.o `test -f 'tickr_main.c' || echo '$(srcdir)/'`tickr_main.c tickr-tickr_main.obj: tickr_main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_main.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_main.Tpo -c -o tickr-tickr_main.obj `if test -f 'tickr_main.c'; then $(CYGPATH_W) 'tickr_main.c'; else $(CYGPATH_W) '$(srcdir)/tickr_main.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_main.Tpo $(DEPDIR)/tickr-tickr_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_main.c' object='tickr-tickr_main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_main.obj `if test -f 'tickr_main.c'; then $(CYGPATH_W) 'tickr_main.c'; else $(CYGPATH_W) '$(srcdir)/tickr_main.c'; fi` tickr-tickr_resource.o: tickr_resource.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_resource.o -MD -MP -MF $(DEPDIR)/tickr-tickr_resource.Tpo -c -o tickr-tickr_resource.o `test -f 'tickr_resource.c' || echo '$(srcdir)/'`tickr_resource.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_resource.Tpo $(DEPDIR)/tickr-tickr_resource.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_resource.c' object='tickr-tickr_resource.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_resource.o `test -f 'tickr_resource.c' || echo '$(srcdir)/'`tickr_resource.c tickr-tickr_resource.obj: tickr_resource.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_resource.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_resource.Tpo -c -o tickr-tickr_resource.obj `if test -f 'tickr_resource.c'; then $(CYGPATH_W) 'tickr_resource.c'; else $(CYGPATH_W) '$(srcdir)/tickr_resource.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_resource.Tpo $(DEPDIR)/tickr-tickr_resource.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_resource.c' object='tickr-tickr_resource.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_resource.obj `if test -f 'tickr_resource.c'; then $(CYGPATH_W) 'tickr_resource.c'; else $(CYGPATH_W) '$(srcdir)/tickr_resource.c'; fi` tickr-tickr_render.o: tickr_render.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_render.o -MD -MP -MF $(DEPDIR)/tickr-tickr_render.Tpo -c -o tickr-tickr_render.o `test -f 'tickr_render.c' || echo '$(srcdir)/'`tickr_render.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_render.Tpo $(DEPDIR)/tickr-tickr_render.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_render.c' object='tickr-tickr_render.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_render.o `test -f 'tickr_render.c' || echo '$(srcdir)/'`tickr_render.c tickr-tickr_render.obj: tickr_render.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_render.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_render.Tpo -c -o tickr-tickr_render.obj `if test -f 'tickr_render.c'; then $(CYGPATH_W) 'tickr_render.c'; else $(CYGPATH_W) '$(srcdir)/tickr_render.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_render.Tpo $(DEPDIR)/tickr-tickr_render.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_render.c' object='tickr-tickr_render.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_render.obj `if test -f 'tickr_render.c'; then $(CYGPATH_W) 'tickr_render.c'; else $(CYGPATH_W) '$(srcdir)/tickr_render.c'; fi` tickr-tickr_params.o: tickr_params.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_params.o -MD -MP -MF $(DEPDIR)/tickr-tickr_params.Tpo -c -o tickr-tickr_params.o `test -f 'tickr_params.c' || echo '$(srcdir)/'`tickr_params.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_params.Tpo $(DEPDIR)/tickr-tickr_params.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_params.c' object='tickr-tickr_params.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_params.o `test -f 'tickr_params.c' || echo '$(srcdir)/'`tickr_params.c tickr-tickr_params.obj: tickr_params.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_params.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_params.Tpo -c -o tickr-tickr_params.obj `if test -f 'tickr_params.c'; then $(CYGPATH_W) 'tickr_params.c'; else $(CYGPATH_W) '$(srcdir)/tickr_params.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_params.Tpo $(DEPDIR)/tickr-tickr_params.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_params.c' object='tickr-tickr_params.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_params.obj `if test -f 'tickr_params.c'; then $(CYGPATH_W) 'tickr_params.c'; else $(CYGPATH_W) '$(srcdir)/tickr_params.c'; fi` tickr-tickr_clock.o: tickr_clock.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_clock.o -MD -MP -MF $(DEPDIR)/tickr-tickr_clock.Tpo -c -o tickr-tickr_clock.o `test -f 'tickr_clock.c' || echo '$(srcdir)/'`tickr_clock.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_clock.Tpo $(DEPDIR)/tickr-tickr_clock.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_clock.c' object='tickr-tickr_clock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_clock.o `test -f 'tickr_clock.c' || echo '$(srcdir)/'`tickr_clock.c tickr-tickr_clock.obj: tickr_clock.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_clock.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_clock.Tpo -c -o tickr-tickr_clock.obj `if test -f 'tickr_clock.c'; then $(CYGPATH_W) 'tickr_clock.c'; else $(CYGPATH_W) '$(srcdir)/tickr_clock.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_clock.Tpo $(DEPDIR)/tickr-tickr_clock.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_clock.c' object='tickr-tickr_clock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_clock.obj `if test -f 'tickr_clock.c'; then $(CYGPATH_W) 'tickr_clock.c'; else $(CYGPATH_W) '$(srcdir)/tickr_clock.c'; fi` tickr-tickr_feedparser.o: tickr_feedparser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_feedparser.o -MD -MP -MF $(DEPDIR)/tickr-tickr_feedparser.Tpo -c -o tickr-tickr_feedparser.o `test -f 'tickr_feedparser.c' || echo '$(srcdir)/'`tickr_feedparser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_feedparser.Tpo $(DEPDIR)/tickr-tickr_feedparser.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_feedparser.c' object='tickr-tickr_feedparser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_feedparser.o `test -f 'tickr_feedparser.c' || echo '$(srcdir)/'`tickr_feedparser.c tickr-tickr_feedparser.obj: tickr_feedparser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_feedparser.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_feedparser.Tpo -c -o tickr-tickr_feedparser.obj `if test -f 'tickr_feedparser.c'; then $(CYGPATH_W) 'tickr_feedparser.c'; else $(CYGPATH_W) '$(srcdir)/tickr_feedparser.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_feedparser.Tpo $(DEPDIR)/tickr-tickr_feedparser.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_feedparser.c' object='tickr-tickr_feedparser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_feedparser.obj `if test -f 'tickr_feedparser.c'; then $(CYGPATH_W) 'tickr_feedparser.c'; else $(CYGPATH_W) '$(srcdir)/tickr_feedparser.c'; fi` tickr-tickr_list.o: tickr_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_list.o -MD -MP -MF $(DEPDIR)/tickr-tickr_list.Tpo -c -o tickr-tickr_list.o `test -f 'tickr_list.c' || echo '$(srcdir)/'`tickr_list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_list.Tpo $(DEPDIR)/tickr-tickr_list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_list.c' object='tickr-tickr_list.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_list.o `test -f 'tickr_list.c' || echo '$(srcdir)/'`tickr_list.c tickr-tickr_list.obj: tickr_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_list.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_list.Tpo -c -o tickr-tickr_list.obj `if test -f 'tickr_list.c'; then $(CYGPATH_W) 'tickr_list.c'; else $(CYGPATH_W) '$(srcdir)/tickr_list.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_list.Tpo $(DEPDIR)/tickr-tickr_list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_list.c' object='tickr-tickr_list.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_list.obj `if test -f 'tickr_list.c'; then $(CYGPATH_W) 'tickr_list.c'; else $(CYGPATH_W) '$(srcdir)/tickr_list.c'; fi` tickr-tickr_feedpicker.o: tickr_feedpicker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_feedpicker.o -MD -MP -MF $(DEPDIR)/tickr-tickr_feedpicker.Tpo -c -o tickr-tickr_feedpicker.o `test -f 'tickr_feedpicker.c' || echo '$(srcdir)/'`tickr_feedpicker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_feedpicker.Tpo $(DEPDIR)/tickr-tickr_feedpicker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_feedpicker.c' object='tickr-tickr_feedpicker.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_feedpicker.o `test -f 'tickr_feedpicker.c' || echo '$(srcdir)/'`tickr_feedpicker.c tickr-tickr_feedpicker.obj: tickr_feedpicker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_feedpicker.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_feedpicker.Tpo -c -o tickr-tickr_feedpicker.obj `if test -f 'tickr_feedpicker.c'; then $(CYGPATH_W) 'tickr_feedpicker.c'; else $(CYGPATH_W) '$(srcdir)/tickr_feedpicker.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_feedpicker.Tpo $(DEPDIR)/tickr-tickr_feedpicker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_feedpicker.c' object='tickr-tickr_feedpicker.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_feedpicker.obj `if test -f 'tickr_feedpicker.c'; then $(CYGPATH_W) 'tickr_feedpicker.c'; else $(CYGPATH_W) '$(srcdir)/tickr_feedpicker.c'; fi` tickr-tickr_prefwin.o: tickr_prefwin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_prefwin.o -MD -MP -MF $(DEPDIR)/tickr-tickr_prefwin.Tpo -c -o tickr-tickr_prefwin.o `test -f 'tickr_prefwin.c' || echo '$(srcdir)/'`tickr_prefwin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_prefwin.Tpo $(DEPDIR)/tickr-tickr_prefwin.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_prefwin.c' object='tickr-tickr_prefwin.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_prefwin.o `test -f 'tickr_prefwin.c' || echo '$(srcdir)/'`tickr_prefwin.c tickr-tickr_prefwin.obj: tickr_prefwin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_prefwin.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_prefwin.Tpo -c -o tickr-tickr_prefwin.obj `if test -f 'tickr_prefwin.c'; then $(CYGPATH_W) 'tickr_prefwin.c'; else $(CYGPATH_W) '$(srcdir)/tickr_prefwin.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_prefwin.Tpo $(DEPDIR)/tickr-tickr_prefwin.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_prefwin.c' object='tickr-tickr_prefwin.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_prefwin.obj `if test -f 'tickr_prefwin.c'; then $(CYGPATH_W) 'tickr_prefwin.c'; else $(CYGPATH_W) '$(srcdir)/tickr_prefwin.c'; fi` tickr-tickr_otherwins.o: tickr_otherwins.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_otherwins.o -MD -MP -MF $(DEPDIR)/tickr-tickr_otherwins.Tpo -c -o tickr-tickr_otherwins.o `test -f 'tickr_otherwins.c' || echo '$(srcdir)/'`tickr_otherwins.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_otherwins.Tpo $(DEPDIR)/tickr-tickr_otherwins.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_otherwins.c' object='tickr-tickr_otherwins.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_otherwins.o `test -f 'tickr_otherwins.c' || echo '$(srcdir)/'`tickr_otherwins.c tickr-tickr_otherwins.obj: tickr_otherwins.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_otherwins.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_otherwins.Tpo -c -o tickr-tickr_otherwins.obj `if test -f 'tickr_otherwins.c'; then $(CYGPATH_W) 'tickr_otherwins.c'; else $(CYGPATH_W) '$(srcdir)/tickr_otherwins.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_otherwins.Tpo $(DEPDIR)/tickr-tickr_otherwins.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_otherwins.c' object='tickr-tickr_otherwins.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_otherwins.obj `if test -f 'tickr_otherwins.c'; then $(CYGPATH_W) 'tickr_otherwins.c'; else $(CYGPATH_W) '$(srcdir)/tickr_otherwins.c'; fi` tickr-tickr_misc.o: tickr_misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_misc.o -MD -MP -MF $(DEPDIR)/tickr-tickr_misc.Tpo -c -o tickr-tickr_misc.o `test -f 'tickr_misc.c' || echo '$(srcdir)/'`tickr_misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_misc.Tpo $(DEPDIR)/tickr-tickr_misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_misc.c' object='tickr-tickr_misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_misc.o `test -f 'tickr_misc.c' || echo '$(srcdir)/'`tickr_misc.c tickr-tickr_misc.obj: tickr_misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_misc.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_misc.Tpo -c -o tickr-tickr_misc.obj `if test -f 'tickr_misc.c'; then $(CYGPATH_W) 'tickr_misc.c'; else $(CYGPATH_W) '$(srcdir)/tickr_misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_misc.Tpo $(DEPDIR)/tickr-tickr_misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_misc.c' object='tickr-tickr_misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_misc.obj `if test -f 'tickr_misc.c'; then $(CYGPATH_W) 'tickr_misc.c'; else $(CYGPATH_W) '$(srcdir)/tickr_misc.c'; fi` tickr-tickr_helptext.o: tickr_helptext.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_helptext.o -MD -MP -MF $(DEPDIR)/tickr-tickr_helptext.Tpo -c -o tickr-tickr_helptext.o `test -f 'tickr_helptext.c' || echo '$(srcdir)/'`tickr_helptext.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_helptext.Tpo $(DEPDIR)/tickr-tickr_helptext.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_helptext.c' object='tickr-tickr_helptext.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_helptext.o `test -f 'tickr_helptext.c' || echo '$(srcdir)/'`tickr_helptext.c tickr-tickr_helptext.obj: tickr_helptext.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_helptext.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_helptext.Tpo -c -o tickr-tickr_helptext.obj `if test -f 'tickr_helptext.c'; then $(CYGPATH_W) 'tickr_helptext.c'; else $(CYGPATH_W) '$(srcdir)/tickr_helptext.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_helptext.Tpo $(DEPDIR)/tickr-tickr_helptext.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_helptext.c' object='tickr-tickr_helptext.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_helptext.obj `if test -f 'tickr_helptext.c'; then $(CYGPATH_W) 'tickr_helptext.c'; else $(CYGPATH_W) '$(srcdir)/tickr_helptext.c'; fi` tickr-tickr_opml.o: tickr_opml.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_opml.o -MD -MP -MF $(DEPDIR)/tickr-tickr_opml.Tpo -c -o tickr-tickr_opml.o `test -f 'tickr_opml.c' || echo '$(srcdir)/'`tickr_opml.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_opml.Tpo $(DEPDIR)/tickr-tickr_opml.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_opml.c' object='tickr-tickr_opml.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_opml.o `test -f 'tickr_opml.c' || echo '$(srcdir)/'`tickr_opml.c tickr-tickr_opml.obj: tickr_opml.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_opml.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_opml.Tpo -c -o tickr-tickr_opml.obj `if test -f 'tickr_opml.c'; then $(CYGPATH_W) 'tickr_opml.c'; else $(CYGPATH_W) '$(srcdir)/tickr_opml.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_opml.Tpo $(DEPDIR)/tickr-tickr_opml.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_opml.c' object='tickr-tickr_opml.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_opml.obj `if test -f 'tickr_opml.c'; then $(CYGPATH_W) 'tickr_opml.c'; else $(CYGPATH_W) '$(srcdir)/tickr_opml.c'; fi` tickr-tickr_http.o: tickr_http.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_http.o -MD -MP -MF $(DEPDIR)/tickr-tickr_http.Tpo -c -o tickr-tickr_http.o `test -f 'tickr_http.c' || echo '$(srcdir)/'`tickr_http.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_http.Tpo $(DEPDIR)/tickr-tickr_http.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_http.c' object='tickr-tickr_http.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_http.o `test -f 'tickr_http.c' || echo '$(srcdir)/'`tickr_http.c tickr-tickr_http.obj: tickr_http.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_http.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_http.Tpo -c -o tickr-tickr_http.obj `if test -f 'tickr_http.c'; then $(CYGPATH_W) 'tickr_http.c'; else $(CYGPATH_W) '$(srcdir)/tickr_http.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_http.Tpo $(DEPDIR)/tickr-tickr_http.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_http.c' object='tickr-tickr_http.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_http.obj `if test -f 'tickr_http.c'; then $(CYGPATH_W) 'tickr_http.c'; else $(CYGPATH_W) '$(srcdir)/tickr_http.c'; fi` tickr-tickr_connectwin.o: tickr_connectwin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_connectwin.o -MD -MP -MF $(DEPDIR)/tickr-tickr_connectwin.Tpo -c -o tickr-tickr_connectwin.o `test -f 'tickr_connectwin.c' || echo '$(srcdir)/'`tickr_connectwin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_connectwin.Tpo $(DEPDIR)/tickr-tickr_connectwin.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_connectwin.c' object='tickr-tickr_connectwin.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_connectwin.o `test -f 'tickr_connectwin.c' || echo '$(srcdir)/'`tickr_connectwin.c tickr-tickr_connectwin.obj: tickr_connectwin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_connectwin.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_connectwin.Tpo -c -o tickr-tickr_connectwin.obj `if test -f 'tickr_connectwin.c'; then $(CYGPATH_W) 'tickr_connectwin.c'; else $(CYGPATH_W) '$(srcdir)/tickr_connectwin.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_connectwin.Tpo $(DEPDIR)/tickr-tickr_connectwin.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_connectwin.c' object='tickr-tickr_connectwin.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_connectwin.obj `if test -f 'tickr_connectwin.c'; then $(CYGPATH_W) 'tickr_connectwin.c'; else $(CYGPATH_W) '$(srcdir)/tickr_connectwin.c'; fi` tickr-tickr_quickfeedpicker.o: tickr_quickfeedpicker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_quickfeedpicker.o -MD -MP -MF $(DEPDIR)/tickr-tickr_quickfeedpicker.Tpo -c -o tickr-tickr_quickfeedpicker.o `test -f 'tickr_quickfeedpicker.c' || echo '$(srcdir)/'`tickr_quickfeedpicker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_quickfeedpicker.Tpo $(DEPDIR)/tickr-tickr_quickfeedpicker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_quickfeedpicker.c' object='tickr-tickr_quickfeedpicker.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_quickfeedpicker.o `test -f 'tickr_quickfeedpicker.c' || echo '$(srcdir)/'`tickr_quickfeedpicker.c tickr-tickr_quickfeedpicker.obj: tickr_quickfeedpicker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_quickfeedpicker.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_quickfeedpicker.Tpo -c -o tickr-tickr_quickfeedpicker.obj `if test -f 'tickr_quickfeedpicker.c'; then $(CYGPATH_W) 'tickr_quickfeedpicker.c'; else $(CYGPATH_W) '$(srcdir)/tickr_quickfeedpicker.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_quickfeedpicker.Tpo $(DEPDIR)/tickr-tickr_quickfeedpicker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_quickfeedpicker.c' object='tickr-tickr_quickfeedpicker.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_quickfeedpicker.obj `if test -f 'tickr_quickfeedpicker.c'; then $(CYGPATH_W) 'tickr_quickfeedpicker.c'; else $(CYGPATH_W) '$(srcdir)/tickr_quickfeedpicker.c'; fi` tickr-tickr_quicksetup.o: tickr_quicksetup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_quicksetup.o -MD -MP -MF $(DEPDIR)/tickr-tickr_quicksetup.Tpo -c -o tickr-tickr_quicksetup.o `test -f 'tickr_quicksetup.c' || echo '$(srcdir)/'`tickr_quicksetup.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_quicksetup.Tpo $(DEPDIR)/tickr-tickr_quicksetup.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_quicksetup.c' object='tickr-tickr_quicksetup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_quicksetup.o `test -f 'tickr_quicksetup.c' || echo '$(srcdir)/'`tickr_quicksetup.c tickr-tickr_quicksetup.obj: tickr_quicksetup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_quicksetup.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_quicksetup.Tpo -c -o tickr-tickr_quicksetup.obj `if test -f 'tickr_quicksetup.c'; then $(CYGPATH_W) 'tickr_quicksetup.c'; else $(CYGPATH_W) '$(srcdir)/tickr_quicksetup.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_quicksetup.Tpo $(DEPDIR)/tickr-tickr_quicksetup.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_quicksetup.c' object='tickr-tickr_quicksetup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_quicksetup.obj `if test -f 'tickr_quicksetup.c'; then $(CYGPATH_W) 'tickr_quicksetup.c'; else $(CYGPATH_W) '$(srcdir)/tickr_quicksetup.c'; fi` tickr-tickr_check4updates.o: tickr_check4updates.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_check4updates.o -MD -MP -MF $(DEPDIR)/tickr-tickr_check4updates.Tpo -c -o tickr-tickr_check4updates.o `test -f 'tickr_check4updates.c' || echo '$(srcdir)/'`tickr_check4updates.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_check4updates.Tpo $(DEPDIR)/tickr-tickr_check4updates.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_check4updates.c' object='tickr-tickr_check4updates.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_check4updates.o `test -f 'tickr_check4updates.c' || echo '$(srcdir)/'`tickr_check4updates.c tickr-tickr_check4updates.obj: tickr_check4updates.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_check4updates.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_check4updates.Tpo -c -o tickr-tickr_check4updates.obj `if test -f 'tickr_check4updates.c'; then $(CYGPATH_W) 'tickr_check4updates.c'; else $(CYGPATH_W) '$(srcdir)/tickr_check4updates.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_check4updates.Tpo $(DEPDIR)/tickr-tickr_check4updates.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_check4updates.c' object='tickr-tickr_check4updates.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_check4updates.obj `if test -f 'tickr_check4updates.c'; then $(CYGPATH_W) 'tickr_check4updates.c'; else $(CYGPATH_W) '$(srcdir)/tickr_check4updates.c'; fi` tickr-tickr_error.o: tickr_error.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_error.o -MD -MP -MF $(DEPDIR)/tickr-tickr_error.Tpo -c -o tickr-tickr_error.o `test -f 'tickr_error.c' || echo '$(srcdir)/'`tickr_error.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_error.Tpo $(DEPDIR)/tickr-tickr_error.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_error.c' object='tickr-tickr_error.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_error.o `test -f 'tickr_error.c' || echo '$(srcdir)/'`tickr_error.c tickr-tickr_error.obj: tickr_error.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_error.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_error.Tpo -c -o tickr-tickr_error.obj `if test -f 'tickr_error.c'; then $(CYGPATH_W) 'tickr_error.c'; else $(CYGPATH_W) '$(srcdir)/tickr_error.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_error.Tpo $(DEPDIR)/tickr-tickr_error.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_error.c' object='tickr-tickr_error.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_error.obj `if test -f 'tickr_error.c'; then $(CYGPATH_W) 'tickr_error.c'; else $(CYGPATH_W) '$(srcdir)/tickr_error.c'; fi` tickr-tickr_tls.o: tickr_tls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_tls.o -MD -MP -MF $(DEPDIR)/tickr-tickr_tls.Tpo -c -o tickr-tickr_tls.o `test -f 'tickr_tls.c' || echo '$(srcdir)/'`tickr_tls.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_tls.Tpo $(DEPDIR)/tickr-tickr_tls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_tls.c' object='tickr-tickr_tls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_tls.o `test -f 'tickr_tls.c' || echo '$(srcdir)/'`tickr_tls.c tickr-tickr_tls.obj: tickr_tls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -MT tickr-tickr_tls.obj -MD -MP -MF $(DEPDIR)/tickr-tickr_tls.Tpo -c -o tickr-tickr_tls.obj `if test -f 'tickr_tls.c'; then $(CYGPATH_W) 'tickr_tls.c'; else $(CYGPATH_W) '$(srcdir)/tickr_tls.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tickr-tickr_tls.Tpo $(DEPDIR)/tickr-tickr_tls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tickr_tls.c' object='tickr-tickr_tls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tickr_CFLAGS) $(CFLAGS) -c -o tickr-tickr_tls.obj `if test -f 'tickr_tls.c'; then $(CYGPATH_W) 'tickr_tls.c'; else $(CYGPATH_W) '$(srcdir)/tickr_tls.c'; fi` install-tickrDATA: $(tickr_DATA) @$(NORMAL_INSTALL) @list='$(tickr_DATA)'; test -n "$(tickrdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(tickrdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(tickrdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tickrdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(tickrdir)" || exit $$?; \ done uninstall-tickrDATA: @$(NORMAL_UNINSTALL) @list='$(tickr_DATA)'; test -n "$(tickrdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(tickrdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(tickrdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/tickr-tickr_check4updates.Po -rm -f ./$(DEPDIR)/tickr-tickr_clock.Po -rm -f ./$(DEPDIR)/tickr-tickr_connectwin.Po -rm -f ./$(DEPDIR)/tickr-tickr_error.Po -rm -f ./$(DEPDIR)/tickr-tickr_feedparser.Po -rm -f ./$(DEPDIR)/tickr-tickr_feedpicker.Po -rm -f ./$(DEPDIR)/tickr-tickr_helptext.Po -rm -f ./$(DEPDIR)/tickr-tickr_http.Po -rm -f ./$(DEPDIR)/tickr-tickr_list.Po -rm -f ./$(DEPDIR)/tickr-tickr_main.Po -rm -f ./$(DEPDIR)/tickr-tickr_misc.Po -rm -f ./$(DEPDIR)/tickr-tickr_opml.Po -rm -f ./$(DEPDIR)/tickr-tickr_otherwins.Po -rm -f ./$(DEPDIR)/tickr-tickr_params.Po -rm -f ./$(DEPDIR)/tickr-tickr_prefwin.Po -rm -f ./$(DEPDIR)/tickr-tickr_quickfeedpicker.Po -rm -f ./$(DEPDIR)/tickr-tickr_quicksetup.Po -rm -f ./$(DEPDIR)/tickr-tickr_render.Po -rm -f ./$(DEPDIR)/tickr-tickr_resource.Po -rm -f ./$(DEPDIR)/tickr-tickr_tls.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-tickrDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/tickr-tickr_check4updates.Po -rm -f ./$(DEPDIR)/tickr-tickr_clock.Po -rm -f ./$(DEPDIR)/tickr-tickr_connectwin.Po -rm -f ./$(DEPDIR)/tickr-tickr_error.Po -rm -f ./$(DEPDIR)/tickr-tickr_feedparser.Po -rm -f ./$(DEPDIR)/tickr-tickr_feedpicker.Po -rm -f ./$(DEPDIR)/tickr-tickr_helptext.Po -rm -f ./$(DEPDIR)/tickr-tickr_http.Po -rm -f ./$(DEPDIR)/tickr-tickr_list.Po -rm -f ./$(DEPDIR)/tickr-tickr_main.Po -rm -f ./$(DEPDIR)/tickr-tickr_misc.Po -rm -f ./$(DEPDIR)/tickr-tickr_opml.Po -rm -f ./$(DEPDIR)/tickr-tickr_otherwins.Po -rm -f ./$(DEPDIR)/tickr-tickr_params.Po -rm -f ./$(DEPDIR)/tickr-tickr_prefwin.Po -rm -f ./$(DEPDIR)/tickr-tickr_quickfeedpicker.Po -rm -f ./$(DEPDIR)/tickr-tickr_quicksetup.Po -rm -f ./$(DEPDIR)/tickr-tickr_render.Po -rm -f ./$(DEPDIR)/tickr-tickr_resource.Po -rm -f ./$(DEPDIR)/tickr-tickr_tls.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-tickrDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip install-tickrDATA installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-tickrDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tickr_0.7.1.orig/src/tickr/tickr_otherwins.c0000644000175000017500000006521014107736721020541 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" int esc_key_pressed(GtkWidget *dialog2, GdkEventKey *event_key) { if (event_key->keyval == GDK_Escape) { gtk_dialog_response(GTK_DIALOG(dialog2), GTK_RESPONSE_CANCEL_CLOSE); return TRUE; } else return FALSE; } void force_quit_dialog(GtkWidget *dialog2) { gtk_dialog_response(GTK_DIALOG(dialog2), GTK_RESPONSE_CANCEL_CLOSE); } /* * 'Open Text File' dialog win */ void open_txt_file(Resource *resrc) { TickerEnv *env = get_ticker_env(); GtkWidget *dialog; char resrc_id_bak[FILE_NAME_MAXLEN + 1]; char *file_name2; int error_code; gtk_window_set_keep_above(GTK_WINDOW(env->win), FALSE); dialog = gtk_file_chooser_dialog_new( "Text File Picker", GTK_WINDOW(env->win), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL_CLOSE, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); gtk_widget_show_all(dialog); /* * Backup last valid opened resource (if any) */ str_n_cpy(resrc_id_bak, resrc->id, FILE_NAME_MAXLEN); while (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { file_name2 = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); str_n_cpy(resrc->id, file_name2, FILE_NAME_MAXLEN); g_free(file_name2); get_ticker_env()->selection_mode = SINGLE; if ((error_code = load_resource_from_selection(resrc, NULL)) == OK) { env->reload_rq = TRUE; break; } else { warning(BLOCK, "%s(): %s", __func__, global_error_str(error_code)); str_n_cpy(resrc->id, resrc_id_bak, FILE_NAME_MAXLEN); load_resource_from_selection(resrc, NULL); } } gtk_widget_destroy(dialog); check_main_win_always_on_top(); } void show_resource_info(Resource *resrc) { GtkWidget *dialog, *table, *label[7], *close_but; char tmp1[256], *tmp2, *tmp3; int i, j; if (resrc->type != RESRC_URL && resrc->type != RESRC_FILE) { info_win("Resource Properties", "\nNo information available\n", INFO_ERROR, FALSE); return; } gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); dialog = gtk_dialog_new_with_buttons( "Resource Properties", GTK_WINDOW(get_ticker_env()->win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, NULL); close_but = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL_CLOSE); close_but = close_but; /* To get rid of compiler warning */ set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); table = gtk_table_new(3, 3, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 5); gtk_container_set_border_width(GTK_CONTAINER(table), 15); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table); label[0] = gtk_label_new(" "); if (resrc->type == RESRC_URL) { label[1] = gtk_label_new("Resource type:"); snprintf(tmp1, 256, "%s Feed", resrc->format == RSS_2_0 ? "RSS 2.0" : \ (resrc->format == RSS_ATOM ? "Atom" : "RSS 1.0")); label[2] = gtk_label_new(tmp1); label[3] = gtk_label_new("Feed title:"); label[4] = gtk_label_new(resrc->feed_title); label[5] = gtk_label_new("Feed URL:"); tmp2 = l_str_new("id[i] != '\0' && j < (FILE_NAME_MAXLEN * 2) - 4; i++, j++) if (resrc->id[i] != '&') tmp3[j] = resrc->id[i]; else { str_n_cpy(tmp3 + j, "&", 5); j += 4; } tmp3[j] = '\0'; tmp2 = l_str_cat(tmp2, tmp3); tmp2 = l_str_cat(tmp2, "\">"); tmp2 = l_str_cat(tmp2, tmp3); tmp2 = l_str_cat(tmp2, ""); label[6] = gtk_label_new(tmp2); l_str_free(tmp2); free2(tmp3); gtk_label_set_use_markup(GTK_LABEL(label[6]), TRUE); for (i = 0; i < 7; i++) gtk_misc_set_alignment(GTK_MISC(label[i]), 0, 0.5); VERBOSE_INFO_OUT("Resource properties:\n" " Resource type: %s\n Feed title: %s\n Feed URL: %s\n", tmp1, resrc->feed_title, resrc->id) } else if (resrc->type == RESRC_FILE) { label[1] = gtk_label_new("Resource type: "); label[2] = gtk_label_new("File"); label[3] = gtk_label_new("File name: "); label[4] = gtk_label_new(resrc->id); gtk_label_set_selectable(GTK_LABEL(label[4]), TRUE); for (i = 0; i < 5; i++) gtk_misc_set_alignment(GTK_MISC(label[i]), 0, 0.5); VERBOSE_INFO_OUT("Resource Properties:\n" " Resource type: File\n File name: %s\n", resrc->id) } gtk_table_attach_defaults(GTK_TABLE(table), label[0], 1, 2, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), label[1], 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), label[2], 2, 3, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), label[3], 0, 1, 1, 2); gtk_table_attach_defaults(GTK_TABLE(table), label[4], 2, 3, 1, 2); if (resrc->type == RESRC_URL) { gtk_table_attach_defaults(GTK_TABLE(table), label[5], 0, 1, 2, 3); gtk_table_attach_defaults(GTK_TABLE(table), label[6], 2, 3, 2, 3); } gtk_widget_show_all(dialog); while (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_CANCEL_CLOSE); gtk_widget_destroy(dialog); check_main_win_always_on_top(); } static void get_layout_dims(GtkWidget *view, int *layout_width, int *layout_height, char *str) { PangoLayout *p_layout; p_layout = pango_layout_new(gtk_widget_get_pango_context(view)); pango_layout_set_text(p_layout, str, -1); pango_layout_get_pixel_size(p_layout, layout_width, layout_height); if (p_layout != NULL) g_object_unref(p_layout); } #ifndef G_OS_WIN32 # define HLPWIN_FONT "DejaVu Sans Mono 8" /* 8 9 10 OK */ #else # define HLPWIN_FONT "Courier New 8" #endif #define HLPWIN_FG_COLOR "#000000ff" /* Black */ #define HLPWIN_BG_COLOR "#ffffffff" /* White */ void help_win() { GtkWidget *dialog, *sc_win, *view; GtkTextBuffer *buf; PangoFontDescription *font_des; GdkColor fg_color, bg_color; guint16 fgc_alpha, bgc_alpha; char *txt; int width, height; int i; gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); dialog = gtk_dialog_new_with_buttons( "Quick Help", GTK_WINDOW(get_ticker_env()->win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL_CLOSE, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); sc_win = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), sc_win); gtk_container_set_border_width(GTK_CONTAINER(sc_win), 5); txt = l_str_new(NULL); buf = gtk_text_buffer_new(NULL); view = gtk_text_view_new_with_buffer(buf); gtk_text_view_set_editable(GTK_TEXT_VIEW(view), FALSE); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view), FALSE); font_des = pango_font_description_from_string(HLPWIN_FONT); gtk_widget_modify_font(view, font_des); get_gdk_color_from_hexstr(HLPWIN_FG_COLOR, &fg_color, &fgc_alpha); get_gdk_color_from_hexstr(HLPWIN_BG_COLOR, &bg_color, &bgc_alpha); /* * Not using gtk_widget_modify_fg/bg() but gtk_widget_modify_text/base() * because it's specifically for editable text. */ if (FALSE) { /* One possible extra setting = 'same colors as ticker's' = 'yes' */ gtk_widget_modify_text(view, GTK_STATE_NORMAL, &(get_params()->fg_color)); gtk_widget_modify_base(view, GTK_STATE_NORMAL, &(get_params()->bg_color)); } else if (TRUE) { /* Widget-level-defined */ gtk_widget_modify_text(view, GTK_STATE_NORMAL, &fg_color); gtk_widget_modify_base(view, GTK_STATE_NORMAL, &bg_color); } else if (FALSE) { /* Same as label inside window */ gtk_widget_modify_text(view, GTK_STATE_NORMAL, (const GdkColor *)&(gtk_widget_get_style(get_ticker_env()->win)->fg[GTK_STATE_NORMAL])); gtk_widget_modify_base(view, GTK_STATE_NORMAL, (const GdkColor *)&(gtk_widget_get_style(get_ticker_env()->win)->bg[GTK_STATE_NORMAL])); } gtk_text_view_set_left_margin(GTK_TEXT_VIEW(view), 15); gtk_text_view_set_right_margin(GTK_TEXT_VIEW(view), 15); gtk_container_add(GTK_CONTAINER(sc_win), view); txt = l_str_cat(txt, "\n"); for (i = 0; get_help_str0()[i] != NULL; i++) txt = l_str_cat(txt, get_help_str0()[i]); for (i = 0; get_help_str1()[i] != NULL; i++) txt = l_str_cat(txt, get_help_str1()[i]); gtk_text_buffer_set_text(buf, txt, -1); get_layout_dims(view, &width, &height, txt); l_str_free(txt); if (width < 400) width = 400; else if (width > 800) width = 800; if (height > 450) height = 450; gtk_widget_set_size_request(sc_win, width + 30 + 15 + 15, height); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); check_main_win_always_on_top(); } static int license_win() { GtkWidget *dialog, *label; char *txt; int i; gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); dialog = gtk_dialog_new_with_buttons( "License", GTK_WINDOW(get_ticker_env()->win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL_CLOSE, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_container_set_border_width(GTK_CONTAINER(dialog), 15); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_NONE); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); txt = l_str_new(NULL); #ifndef G_OS_WIN32 txt = l_str_cat(txt, ""); #endif for (i = 0; get_license_str1()[i] != NULL; i++) txt = l_str_cat(txt, get_license_str1()[i]); txt = l_str_cat(txt, ""); txt = l_str_cat(txt, get_license_str2()); txt = l_str_cat(txt, ""); #ifndef G_OS_WIN32 txt = l_str_cat(txt, ""); #endif txt = l_str_cat(txt, "\n"); label = gtk_label_new(txt); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); l_str_free(txt); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); check_main_win_always_on_top(); return TRUE; } static int go_to_paypal0() { go_to_paypal(); return TRUE; } void about_win() { GtkWidget *dialog, *table, *image = NULL, *label[5]; GtkWidget *license_but, *go_to_paypal_but, *close_but; gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); dialog = gtk_dialog_new_with_buttons( "About " APP_NAME, GTK_WINDOW(get_ticker_env()->win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, NULL); license_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "License", GTK_RESPONSE_NONE); go_to_paypal_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "Donate" , GTK_RESPONSE_NONE); close_but = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL_CLOSE); close_but = close_but; /* to Get rid of one stupid compiler warning */ set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); g_signal_connect(G_OBJECT(license_but), "clicked", G_CALLBACK(license_win), NULL); g_signal_connect(G_OBJECT(go_to_paypal_but), "clicked", G_CALLBACK(go_to_paypal0), NULL); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); #ifndef ABOUT_WIN_QUOTE table = gtk_table_new(5, 1, FALSE); #else table = gtk_table_new(6, 1, FALSE); #endif gtk_table_set_row_spacings(GTK_TABLE(table), 5); gtk_container_set_border_width(GTK_CONTAINER(table), 15); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table); image = gtk_image_new_from_file(get_imagefile_full_name_from_name(TICKR_LOGO)); gtk_table_attach_defaults(GTK_TABLE(table), image, 0, 1, 0, 1); label[0] = gtk_label_new("\n" APP_NAME " version " APP_V_NUM " - Feed Reader"); gtk_label_set_use_markup(GTK_LABEL(label[0]), TRUE); gtk_table_attach_defaults(GTK_TABLE(table), label[0], 0, 1, 1, 2); label[1] = gtk_label_new("" COPYRIGHT_STR ""); gtk_label_set_use_markup(GTK_LABEL(label[1]), TRUE); gtk_table_attach_defaults(GTK_TABLE(table), label[1], 0, 1, 2, 3); label[2] = gtk_label_new("" SUPPORT_EMAIL_ADDR ""); gtk_label_set_use_markup(GTK_LABEL(label[2]), TRUE); gtk_table_attach_defaults(GTK_TABLE(table), label[2], 0, 1, 3, 4); label[3] = gtk_label_new("" WEBSITE_URL ""); gtk_label_set_use_markup(GTK_LABEL(label[3]), TRUE); gtk_table_attach_defaults(GTK_TABLE(table), label[3], 0, 1, 4, 5); #ifdef ABOUT_WIN_QUOTE label[4] = gtk_label_new("\n\"" ABOUT_WIN_QUOTE "\""); gtk_label_set_use_markup(GTK_LABEL(label[4]), TRUE); gtk_table_attach_defaults(GTK_TABLE(table), label[4], 0, 1, 5, 6); #endif gtk_widget_show_all(dialog); while (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_CANCEL_CLOSE); gtk_widget_destroy(dialog); check_main_win_always_on_top(); } /* * Insert newline(s) if one string (ie between 2 newlines) is too long * (ie > MAX_LINE_LEN). Returned string must be free2() afterwards. */ #define MAX_LINE_LEN 100 #define MAX_NEWLINES_N 20 static char *insert_newlines_if_too_long(const char *txt) { char *txt2; int line_len, word_len; int i, j, k; txt2 = malloc2(strlen(txt) + MAX_NEWLINES_N + 1); line_len = 0; word_len = 0; i = j = k = 0; while (*(txt + i) != '\0') { if (*(txt + i) == ' ') word_len = -1; if (*(txt + i) == '\n') { line_len = -1; word_len = -1; } else if (line_len > 0 && line_len % MAX_LINE_LEN == 0) { if (k++ < MAX_NEWLINES_N) { if (word_len < line_len) { i -= word_len; j -= word_len + 1; } *(txt2 + j++) = '\n'; line_len = 0; word_len = 0; } else break; } *(txt2 + j++) = *(txt + i++); line_len++; word_len++; } *(txt2 + j) = '\0'; return txt2; } /* * Info, warning or error. Format text in case of long strings. * ======================================================================== * get_params()->disable_popups applies to info_win(), info_win_no_block(), * and warning(). * warning() always send info to sdtout/stderr. * ======================================================================== */ void info_win(const char *title, const char *txt, info_type info, zboolean selectable) { GtkWidget *dialog, *table, *image = NULL, *label[2]; char *txt2; if (get_params()->disable_popups == 'y') return; gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); dialog = gtk_dialog_new_with_buttons( /* FIXME: Use APP_NAME if title is empty ? */ title[0] != '\0' ? title : APP_NAME, GTK_WINDOW(get_ticker_env()->win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); gtk_window_set_keep_above(GTK_WINDOW(dialog), TRUE); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); table = gtk_table_new(1, 3, FALSE); gtk_table_set_col_spacings(GTK_TABLE(table), 10); gtk_container_set_border_width(GTK_CONTAINER(table), 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table); if (info == INFO) { /* Better without any image if info only so do nothing here - image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);*/ } else if (info == INFO_WARNING) { image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG); gtk_table_attach_defaults(GTK_TABLE(table), image, 0, 1, 0, 1); } else if (info == INFO_ERROR) { image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG); gtk_table_attach_defaults(GTK_TABLE(table), image, 0, 1, 0, 1); } txt2 = insert_newlines_if_too_long(txt); label[0] = gtk_label_new(txt2); free2((char *)txt2); /* Better if disabled - gtk_label_set_use_markup(GTK_LABEL(label[0]), TRUE);*/ pango_layout_set_single_paragraph_mode(gtk_label_get_layout(GTK_LABEL(label[0])), FALSE); /* Useless now - Hmmm, should be pango_layout_get_pixel_size(gtk_label_get_layout(GTK_LABEL(label[0])), &layout_width, &layout_height); if (info == INFO) { if (layout_width > get_ticker_env()->screen_w - 60) gtk_widget_set_size_request(label[0], get_ticker_env()->screen_w - 60, -1); } else { if (layout_width > get_ticker_env()->screen_w - 120) // Extra 60 pixels for image width gtk_widget_set_size_request(label[0], get_ticker_env()->screen_w - 120, -1); }*/ if (selectable) gtk_label_set_selectable(GTK_LABEL(label[0]), TRUE); gtk_table_attach_defaults(GTK_TABLE(table), label[0], 1, 2, 0, 1); label[1] = gtk_label_new(""); gtk_table_attach_defaults(GTK_TABLE(table), label[1], 2, 3, 0, 1); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); while (gtk_events_pending()) /* So that win will close immediately */ gtk_main_iteration(); check_main_win_always_on_top(); } /* Need only gtk_init() so called only from big_error() in tickr_error.c. */ void minimalistic_info_win(const char *title, const char *txt) { GtkWidget *dialog, *table, *image = NULL, *label[2]; char *txt2; dialog = gtk_dialog_new_with_buttons( title, NULL, GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); gtk_window_set_keep_above(GTK_WINDOW(dialog), TRUE); table = gtk_table_new(1, 3, FALSE); gtk_table_set_col_spacings(GTK_TABLE(table), 10); gtk_container_set_border_width(GTK_CONTAINER(table), 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table); image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG); gtk_table_attach_defaults(GTK_TABLE(table), image, 0, 1, 0, 1); txt2 = insert_newlines_if_too_long(txt); label[0] = gtk_label_new(txt2); free2((char *)txt2); pango_layout_set_single_paragraph_mode(gtk_label_get_layout(GTK_LABEL(label[0])), FALSE); gtk_table_attach_defaults(GTK_TABLE(table), label[0], 1, 2, 0, 1); label[1] = gtk_label_new(""); gtk_table_attach_defaults(GTK_TABLE(table), label[1], 2, 3, 0, 1); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); while (gtk_events_pending()) /* So that win will close immediately */ gtk_main_iteration(); } /* Don't block but show up for ms then close. * TODO: write a more configurable func ? */ void info_win_no_block(const char *txt, int delay) { GtkWidget *win; GtkWidget *table, *image, *label[2]; int layout_width, layout_height; if (get_params()->disable_popups == 'y') return; gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); win = gtk_window_new(GTK_WINDOW_POPUP); set_tickr_icon_to_dialog(GTK_WINDOW(win)); gtk_window_set_position(GTK_WINDOW(win), INFO_WIN_WAIT_POS); gtk_window_set_keep_above(GTK_WINDOW(win), TRUE); table = gtk_table_new(1, 3, FALSE); gtk_table_set_col_spacings(GTK_TABLE(table), 10); gtk_container_set_border_width(GTK_CONTAINER(table), 0); gtk_container_add(GTK_CONTAINER(GTK_WINDOW(win)), table); image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG); gtk_table_attach_defaults(GTK_TABLE(table), image, 0, 1, 0, 1); label[0] = gtk_label_new(txt); /* Better if disabled - gtk_label_set_use_markup(GTK_LABEL(label[0]), TRUE);*/ pango_layout_get_pixel_size(gtk_label_get_layout(GTK_LABEL(label[0])), &layout_width, &layout_height); if (layout_width > get_ticker_env()->screen_w - 120) gtk_widget_set_size_request(label[0], get_ticker_env()->screen_w - 120, -1); gtk_table_attach_defaults(GTK_TABLE(table), label[0], 1, 2, 0, 1); label[1] = gtk_label_new(""); gtk_table_attach_defaults(GTK_TABLE(table), label[1], 2, 3, 0, 1); gtk_widget_show_all(win); while (gtk_events_pending()) /* So that win will popup immediately */ gtk_main_iteration(); #ifndef G_OS_WIN32 nanosleep2(delay * 1000000); #else Sleep(delay); #endif gtk_widget_destroy(win); while (gtk_events_pending()) /* So that win will close immediately */ gtk_main_iteration(); check_main_win_always_on_top(); } /* Win centered. * default_response = YES / NO / -1 (or anything != YES and != NO) for nothing selected. */ int question_win(const char *txt, int default_response) { return question_win_at(txt, default_response, GTK_WIN_POS_CENTER); } /* default_response = YES / NO / -1 (or anything != YES and != NO) for nothing selected. */ int question_win_at(const char *txt, int default_response, int win_pos) { GtkWidget *dialog, *table, *image, *label[2]; int response; gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); dialog = gtk_dialog_new_with_buttons( APP_NAME, GTK_WINDOW(get_ticker_env()->win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_NO, GTK_RESPONSE_NO, GTK_STOCK_YES, GTK_RESPONSE_YES, NULL); set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), win_pos); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); gtk_window_set_keep_above(GTK_WINDOW(dialog), TRUE); if (default_response == YES) gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_YES); else if (default_response == NO) gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_NO); else default_response = -1; table = gtk_table_new(1, 3, FALSE); gtk_table_set_col_spacings(GTK_TABLE(table), 10); gtk_container_set_border_width(GTK_CONTAINER(table), 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table); image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG); gtk_table_attach_defaults(GTK_TABLE(table), image, 0, 1, 0, 1); label[0] = gtk_label_new(txt); gtk_table_attach_defaults(GTK_TABLE(table), label[0], 1, 2, 0, 1); label[1] = gtk_label_new(""); gtk_table_attach_defaults(GTK_TABLE(table), label[1], 2, 3, 0, 1); gtk_widget_show_all(dialog); if (default_response == -1) gtk_window_set_focus(GTK_WINDOW(dialog), NULL); response = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); while (gtk_events_pending()) /* So that win will close immediately */ gtk_main_iteration(); check_main_win_always_on_top(); return ((response == GTK_RESPONSE_YES) ? YES : NO); } /* The spinner doesn't always spin as expected (hmm...) so now commented out */ /*void win_with_spinner(win_with_spinner_mode mode, const char *txt) { static GtkWidget *win; GtkWidget *hbox, *label; #ifndef G_OS_WIN32 static GtkWidget *spinner; GtkWidget *space_label; #endif if (mode == WIN_WITH_SPINNER_OPEN) { gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); win = gtk_window_new(GTK_WINDOW_POPUP); set_tickr_icon_to_dialog(GTK_WINDOW(win)); gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER); gtk_window_set_keep_above(GTK_WINDOW(win), TRUE); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(GTK_WINDOW(win)), hbox); #ifndef G_OS_WIN32 spinner = gtk_spinner_new(); space_label = gtk_label_new(" "); #endif label = gtk_label_new(txt); #ifndef G_OS_WIN32 gtk_container_add(GTK_CONTAINER(GTK_BOX(hbox)), spinner); gtk_container_add(GTK_CONTAINER(GTK_BOX(hbox)), space_label); #endif gtk_container_add(GTK_CONTAINER(GTK_BOX(hbox)), label); gtk_container_set_border_width(GTK_CONTAINER(GTK_BOX(hbox)), 15); gtk_widget_show_all(win); while (gtk_events_pending()) // So that win will popup immediately gtk_main_iteration(); #ifndef G_OS_WIN32 gtk_spinner_start(GTK_SPINNER(spinner)); #endif } else if (mode == WIN_WITH_SPINNER_CLOSE) { #ifndef G_OS_WIN32 gtk_spinner_stop(GTK_SPINNER(spinner)); #endif gtk_widget_destroy(win); check_main_win_always_on_top(); } else warning(BLOCK, "win_with_spinner(): Invalid mode"); }*/ void win_with_progress_bar(win_with_progress_bar_mode mode, const char *txt) { static GtkWidget *win, *hbox, *progress_bar; if (mode == WIN_WITH_PROGRESS_BAR_OPEN) { gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); win = gtk_window_new(GTK_WINDOW_POPUP); set_tickr_icon_to_dialog(GTK_WINDOW(win)); gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER); gtk_window_set_keep_above(GTK_WINDOW(win), TRUE); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(GTK_WINDOW(win)), hbox); progress_bar = gtk_progress_bar_new(); gtk_container_add(GTK_CONTAINER(GTK_BOX(hbox)), progress_bar); gtk_container_set_border_width(GTK_CONTAINER(GTK_BOX(hbox)), 15); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress_bar), txt); gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR(progress_bar), 0.2); gtk_widget_show_all(win); while (gtk_events_pending()) /* So that win will popup immediately */ gtk_main_iteration(); } else if (mode == WIN_WITH_PROGRESS_BAR_PULSE) { if (txt != NULL) gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress_bar), txt); gtk_progress_bar_pulse(GTK_PROGRESS_BAR(progress_bar)); while (gtk_events_pending()) gtk_main_iteration(); } else if (mode == WIN_WITH_PROGRESS_BAR_CLOSE) { gtk_widget_destroy(win); check_main_win_always_on_top(); } else warning(BLOCK, "win_with_progress_bar(): Invalid mode"); } #ifndef G_OS_WIN32 void nanosleep2(long nano_sec) { struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = nano_sec; nanosleep(&ts, NULL); } #endif tickr_0.7.1.orig/src/tickr/tickr_resource.c0000644000175000017500000003316614107736721020353 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" #include "tickr_html_entities.h" /* * Build selection f_list from full f_list. * * Always use get/set_feed_list() and get/set_feed_selection() to access * FList *feed_list and FList *feed_selection defined in tickr_main.c. */ int build_feed_selection_from_feed_list() { FList *new_selection = NULL, *node = get_feed_list(); if (IS_FLIST(node)) { for (node = f_list_first(node); IS_FLIST(node); node = node->next) if (node->selected) new_selection = f_list_add_at_end(new_selection,\ node->url, node->title, TRUE, node->rank); if (IS_FLIST(new_selection)) { new_selection = f_list_first(new_selection); set_feed_selection(new_selection); return OK; } else { set_feed_selection(NULL); return SELECTION_EMPTY; } } else { set_feed_selection(NULL); return SELECTION_ERROR; } } /* * feed_index_in_selection starts at 0. * These funcs do nothing in single selection mode. */ void current_feed() { FList *selection = get_feed_selection(); int f_index; if (M_S_MOD) { if ((f_index = f_list_index(selection)) == 0) set_feed_selection(f_list_last(selection)); else if (f_index > 0) set_feed_selection(f_list_nth(selection, f_index)); /* (rank = f_index + 1) - 1 */ get_ticker_env()->reload_rq = TRUE; } } void first_feed() { if (M_S_MOD) { set_feed_selection(f_list_first(get_feed_selection())); get_ticker_env()->reload_rq = TRUE; } } void last_feed() { if (M_S_MOD) { set_feed_selection(f_list_last(get_feed_selection())); get_ticker_env()->reload_rq = TRUE; } } zboolean previous_feed() { FList *selection = get_feed_selection(); int f_index; if (M_S_MOD) { if ((f_index = f_list_index(selection)) > 1 || f_index == 0) { if (f_index > 1) set_feed_selection(f_list_nth(selection, f_index - 1)); else if (f_index == 0) set_feed_selection(f_list_nth(selection, f_list_count(selection) - 1)); get_ticker_env()->reload_rq = TRUE; return TRUE; } else if (f_index == 1) info_win_no_block("This is already the first feed", INFO_WIN_WAIT_TIMEOUT); } return FALSE; } zboolean next_feed() { FList *selection = get_feed_selection(); int f_index; if (M_S_MOD) { if ((f_index = f_list_index(selection)) > 0) { get_ticker_env()->reload_rq = TRUE; return TRUE; } else info_win_no_block("This is already the last feed", INFO_WIN_WAIT_TIMEOUT); } return FALSE; } /* * - Single selection mode: (re)load resrc->id = rss feed if valid or text file if it exists. * - Multiple selection mode: load sequentially all selected feeds in feed list. * * In case of URL: * load_resource_from_selection() -> get_feed() -> fetch_resource() -> parse_xml_file() -> format_resource() * * - file:///... is considered an URL and will be 'xml-parsed'. * - /path/file_name will be processed as a non-xml text file. * * Return OK or error code. */ int load_resource_from_selection(Resource *resrc, FList *feed_selection) { int rss_status, error_code; if (resrc->fp != NULL) { fclose(resrc->fp); resrc->fp = NULL; } if (resrc->fp_extra != NULL) { fclose(resrc->fp_extra); resrc->fp_extra = NULL; } resrc->xml_dump[0] = '\0'; resrc->type = RESRC_TYPE_UNDETERMINED; resrc->format = RSS_FORMAT_UNDETERMINED; if (M_S_MOD) { if (IS_FLIST(feed_selection)) { str_n_cpy(resrc->id, feed_selection->url, FILE_NAME_MAXLEN); if (IS_FLIST(feed_selection->next)) feed_selection = feed_selection->next; else if (IS_FLIST(f_list_first(feed_selection))) feed_selection = f_list_first(feed_selection); set_feed_selection(feed_selection); } else { warning(M_S_MOD, "No feed selected or no feed selection available\n" "Switching to single selection mode"); get_ticker_env()->selection_mode = SINGLE; resrc->id[0] = '\0'; } } if (resrc->id[0] != '\0') { if (strcmp(get_scheme_from_url(resrc->id), "http") == 0 || strcmp(get_scheme_from_url(resrc->id), "https") == 0 || strcmp(get_scheme_from_url(resrc->id), "file") == 0) { resrc->type = RESRC_URL; if ((rss_status = get_feed(resrc, get_params())) != OK) { /* Don't display some error messages supposedly already shown */ if ( rss_status != OPEN_FILE_ERROR && rss_status != FEED_FORMAT_ERROR && rss_status != FEED_UNPARSABLE && rss_status != FEED_EMPTY && rss_status != FEED_NO_ITEM_OR_ENTRY_ELEMENT && rss_status != TCP_SOCK_CANT_CONNECT && rss_status != CONNECT_TOO_MANY_ERRORS && rss_status != RESOURCE_ENCODING_ERROR && rss_status != HTTP_INVALID_PORT_NUM && rss_status != HTTP_BAD_REQUEST && rss_status != HTTP_FORBIDDEN && rss_status != HTTP_NOT_FOUND && rss_status != HTTP_GONE && rss_status != HTTP_INT_SERVER_ERROR && rss_status != HTTP_NO_STATUS_CODE) { if (rss_status <= 10000) warning(M_S_MOD, "get_feed(%s, ...): %s", resrc->id, global_error_str(rss_status)); } if (rss_status == CONNECT_TOO_MANY_ERRORS) error_code = CONNECT_TOO_MANY_ERRORS; else { resrc->id[0] ='\0'; error_code = RESOURCE_INVALID; } } else error_code = OK; } else { resrc->type = RESRC_FILE; if ((resrc->fp = g_fopen(resrc->id, "rb")) == NULL) { warning(M_S_MOD, "Can't open '%s': %s", resrc->id, strerror(errno)); resrc->id[0] ='\0'; error_code = RESOURCE_NOT_FOUND; } else error_code = OK; } } else { resrc->type = RESRC_UNSPECIFIED; error_code = NO_RESOURCE_SPECIFIED; } if (error_code == OK) { if ((error_code = format_resource(resrc, XML_DUMP)) == OK) if (resrc->type == RESRC_URL) error_code = format_resource(resrc, XML_DUMP_EXTRA); if (error_code != OK) { warning(M_S_MOD, "%s: %s", global_error_str(FEED_FORMAT_ERROR), resrc->id); resrc->id[0] ='\0'; } } return error_code; } /* * Do: * - Check UTF-8 encoding * - Strip html tags * - NOT ANYMORE - 'Translate' html entities * Then resrc->fp refers to a "formatted" file. * * Return OK or error code (FEED_FORMAT_ERROR, CREATE_FILE_ERROR, NOT_UTF8_ENCODED, * READ_FROM_STREAM_ERROR). * */ int format_resource(Resource *resrc, const char *pathname) { FILE *fp; char *str; int i; if (strcmp(pathname, XML_DUMP) == 0) fp = resrc->fp; else if (strcmp(pathname, XML_DUMP_EXTRA) == 0) fp = resrc->fp_extra; else { VERBOSE_INFO_ERR("%s(): %s\n", __func__, global_error_str(FEED_FORMAT_ERROR)) /* TODO: Which error here ? */ return FEED_FORMAT_ERROR; } if ((i = get_stream_contents(fp, &str, TRUE)) == OK) { if (get_resource()->type == RESRC_URL) /* ???? */ str = format_resource_str(str); fclose(fp); if ((fp = open_new_datafile_with_name(pathname, "wb+")) != NULL) { fprintf(fp, "%s", str); fseek(fp, 0, SEEK_SET); i = OK; } else { i = CREATE_FILE_ERROR; VERBOSE_INFO_ERR("%s(): %s: '%s'\n", __func__, global_error_str(i), pathname) } l_str_free(str); } else { fclose(fp); VERBOSE_INFO_ERR("%s(): %s\n", __func__, global_error_str(i)) } if (strcmp(pathname, XML_DUMP) == 0) resrc->fp = fp; else if (strcmp(pathname, XML_DUMP_EXTRA) == 0) resrc->fp_extra = fp; return i; } /* * Actual 'formatting' is done here. * str must have been created with l_str_new() (or malloc()). */ char *format_resource_str(char *str) { char *str2, *s, *d; zboolean is_inside, strip_tags; char c; /* * Strip html tags */ str2 = l_str_new(str); strip_tags = get_params()->strip_html_tags == 'y' ? TRUE : FALSE; is_inside = FALSE; for (s = str, d = str2; s < str + strlen(str); s++) { c = *s; if (strip_tags) { if (c == '<') is_inside = TRUE; else if (c == '>') is_inside = FALSE; } else is_inside = FALSE; if (!is_inside && !(strip_tags && c == '>')) *d++ = c; } *d = '\0'; l_str_free(str); str = str2; remove_trailing_whitespaces_from_str(str); str = realloc2(str, strlen(str) + 1); return str; } /* * Convert from a specified encoding to UTF-8. * New str must be g_free'd after usage. */ char *convert_str_to_utf8(const char *str, const char *encoding) { char *str2; gsize read, write; GError *error = NULL; if ((str2 = g_convert(str, -1, "UTF-8", encoding, &read, &write, &error)) != NULL) { VERBOSE_INFO_ERR("%s(): Expected original encoding = '%s'\n", __func__, encoding) return str2; } else { VERBOSE_INFO_ERR("%s(): %s\n", __func__, error->message) g_error_free(error); return NULL; } } /* * Read full contents of an opened stream and check UTF-8 encoding * (don't close stream afterward but rewind it). * str must be l_str_free'd after usage. * Return OK or NOT_UTF8_ENCODED or READ_FROM_STREAM_ERROR. */ int get_stream_contents(FILE *fp, char **str, zboolean check_utf8) { size_t str2_size = FGETS_STR_MAXLEN; char *str2 = malloc2(str2_size * sizeof(char)); int i; fseek(fp, 0, SEEK_SET); *str = l_str_new(NULL); #ifndef G_OS_WIN32 while (getline(&str2, &str2_size, fp) != -1) #else while (fgets(str2, str2_size, fp) != NULL) #endif *str = l_str_cat(*str, str2); free2(str2); if (feof(fp) != 0) { if (check_utf8) { if (g_utf8_validate(*str, -1, NULL)) i = OK; else /*{ str2 = convert_str_to_utf8((const char*)*str, get_params()->alt_encoding); if (str2 != NULL) { l_str_free(*str); *str = l_str_new(str2); g_free(str2); i = OK; } else*/ i = NOT_UTF8_ENCODED; /*}*/ } else i = OK; } else i = READ_FROM_STREAM_ERROR; fseek(fp, 0, SEEK_SET); if (i != OK) VERBOSE_INFO_ERR("%s(): %s\n", __func__, global_error_str(i)) return i; } /* * *** File names, paths and dirs stuff *** */ void set_tickr_icon_to_dialog(GtkWindow *dialog) { gtk_window_set_icon_from_file(dialog, get_imagefile_full_name_from_name(TICKR_ICON), NULL); } /* * Open/create file in data dir from name. * Data dir = config files, not images files. */ FILE *open_new_datafile_with_name(const char *name, const char *mode_str) { char file_name[FILE_NAME_MAXLEN + 1]; FILE *fp; str_n_cpy(file_name, get_datafile_full_name_from_name(name), FILE_NAME_MAXLEN); if ((fp = g_fopen(file_name, mode_str)) == NULL) { if (mode_str[0] == 'w') big_error(CREATE_FILE_ERROR, "Can't create file '%s': %s", file_name, strerror(errno)); else if (mode_str[0] == 'r') big_error(OPEN_FILE_ERROR, "Can't open file '%s': %s", file_name, strerror(errno)); } return fp; } /* * Get full path and name for file in data dir from name. * Data dir = config files, not images files. */ char *get_datafile_full_name_from_name(const char *name) { static char file_name[FILE_NAME_MAXLEN + 1]; snprintf(file_name, FILE_NAME_MAXLEN + 1 - 2, "%s%c%s", get_datadir_full_path(), SEPARATOR_CHAR, name); if (get_instance_id() != 0) str_n_cat(file_name, itoa2(get_instance_id()), 2); return file_name; } /* Now, image files */ char *get_imagefile_full_name_from_name(const char *name) { static char file_name[FILE_NAME_MAXLEN + 1]; #ifndef G_OS_WIN32 snprintf(file_name, FILE_NAME_MAXLEN + 1, "%s%c%s", IMAGES_PATH, SEPARATOR_CHAR, name); #else snprintf(file_name, FILE_NAME_MAXLEN + 1, "%s%c%s%c%s", get_progfiles_dir(), SEPARATOR_CHAR, IMAGES_PATH, SEPARATOR_CHAR, name); #endif return file_name; } /* Data dir = config files, not images files */ char *get_datadir_full_path() { static char full_path[TMPSTR_SIZE + 1]; #ifndef G_OS_WIN32 snprintf(full_path, TMPSTR_SIZE + 1, "%s%c%s", usr_home_dir(), SEPARATOR_CHAR, TICKR_DIR_NAME); #else snprintf(full_path, TMPSTR_SIZE + 1, "%s%c%s", get_appdata_dir_utf8(), SEPARATOR_CHAR, TICKR_DIR_NAME); #endif return full_path; } char *usr_home_dir() { static char str[TMPSTR_SIZE+ 1] = ""; #ifndef G_OS_WIN32 return str_n_cpy(str, getpwuid(getuid())->pw_dir, TMPSTR_SIZE); #endif /* For win32 version, no home dir - See win32 specific funcs in libetm. */ return str; } /* Fix non-ascii (for instance cyrillic) user name in app data dir issue on win32. */ #ifdef G_OS_WIN32 const char *get_appdata_dir_utf8() { static char file_name[FILE_NAME_MAXLEN + 1]; char *file_name_utf8; if ((file_name_utf8 = g_utf16_to_utf8((const gunichar2 *)get_appdata_dir_w(), FILE_NAME_MAXLEN, NULL, NULL, NULL)) != NULL) { str_n_cpy(file_name, file_name_utf8, FILE_NAME_MAXLEN); g_free(file_name_utf8); return (const char *)file_name; } else return NULL; } #endif const char *get_sample_url_list_full_name() { static char file_name[FILE_NAME_MAXLEN + 1]; #ifndef G_OS_WIN32 snprintf(file_name, FILE_NAME_MAXLEN + 1, "%s%c%s", INSTALL_PATH, SEPARATOR_CHAR, URL_LIST_FILE); #else snprintf(file_name, FILE_NAME_MAXLEN + 1, "%s%c%s%c%s", get_progfiles_dir(), SEPARATOR_CHAR, TICKR_DIR_NAME, SEPARATOR_CHAR, URL_LIST_FILE); #endif return (const char *)file_name; } tickr_0.7.1.orig/src/tickr/tickr_html_entities.h0000644000175000017500000002011014107736721021362 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ char *html_entity[] = { /* * Special entities 1/2 (most common ones) */ """, """, "\"", "&", "&", "&", "'", "'", "'", "<", "<", "<", ">", ">", ">", /* * Latin-1 entities */ " ", " ", " ", "¡", "¡", "¡", "¢", "¢", "¢", "£", "£", "£", "¤", "¤", "¤", "¥", "¥", "¥", "¦", "¦", "¦", "§", "§", "§", "¨", "¨", "¨", "©", "©", "©", "ª", "ª", "ª", "«", "«", "«", "¬", "¬", "¬", "­", "­", "", "®", "®", "®", "¯", "¯", "¯", "°", "°", "°", "±", "±", "±", "²", "²", "²", "³", "³", "³", "´", "´", "´", "µ", "µ", "µ", "¶", "¶", "¶", "·", "·", "·", "¸", "¸", "¸", "¹", "¹", "¹", "º", "º", "º", "»", "»", "»", "¼", "¼", "¼", "½", "½", "½", "¾", "¾", "¾", "¿", "¿", "¿", "À", "À", "À", "Á", "Á", "Á", "Â", "Â", "Â", "Ã", "Ã", "Ã", "Ä", "Ä", "Ä", "Å", "Å", "Å", "Æ", "Æ", "Æ", "Ç", "Ç", "Ç", "È", "È", "È", "É", "É", "É", "Ê", "Ê", "Ê", "Ë", "Ë", "Ë", "Ì", "Ì", "Ì", "Í", "Í", "Í", "Î", "Î", "Î", "Ï", "Ï", "Ï", "Ð", "Ð", "Ð", "Ñ", "Ñ", "Ñ", "Ò", "Ò", "Ò", "Ó", "Ó", "Ó", "Ô", "Ô", "Ô", "Õ", "Õ", "Õ", "Ö", "Ö", "Ö", "×", "×", "×", "Ø", "Ø", "Ø", "Ù", "Ù", "Ù", "Ú", "Ú", "Ú", "Û", "Û", "Û", "Ü", "Ü", "Ü", "Ý", "Ý", "Ý", "Þ", "Þ", "Þ", "ß", "ß", "ß", "à", "à", "à", "á", "á", "á", "â", "â", "â", "ã", "ã", "ã", "ä", "ä", "ä", "å", "å", "å", "æ", "æ", "æ", "ç", "ç", "ç", "è", "è", "è", "é", "é", "é", "ê", "ê", "ê", "ë", "ë", "ë", "ì", "ì", "ì", "í", "í", "í", "î", "î", "î", "ï", "ï", "ï", "ð", "ð", "ð", "ñ", "ñ", "ñ", "ò", "ò", "ò", "ó", "ó", "ó", "ô", "ô", "ô", "õ", "õ", "õ", "ö", "ö", "ö", "÷", "÷", "÷", "ø", "ø", "ø", "ù", "ù", "ù", "ú", "ú", "ú", "û", "û", "û", "ü", "ü", "ü", "ý", "ý", "ý", "þ", "þ", "þ", "ÿ", "ÿ", "ÿ", /* * Special entities 2/2 */ "Œ", "Œ", "Œ", "œ", "œ", "œ", "Š", "Š", "Š", "š", "š", "š", "Ÿ", "Ÿ", "Ÿ", "ˆ", "ˆ", "ˆ", /* ********************************** * 'ˆ' != '^' -> ???? * "&????;", "&#????;", "^", * **********************************/ "˜", "˜", "˜", " ", " ", " ", " ", " ", " ", " ", " ", " ", "‌", "‌", "", "‍", "‍", "", "‎", "‎", "", "‏", "‏", "", "–", "–", "–", "—", "—", "—", "‘", "‘", "‘", "’", "’", "’", "sbquo;", "‚", "‚", "“", "“", "“", "”", "”", "”", "„", "„", "„", "†", "†", "†", "‡", "‡", "‡", "‰", "‰", "‰", "‹", "‹", "‹", "›", "›", "›", "€", "€", "€", /* * Entities for symbols and Greek letters */ "ƒ", "ƒ", "ƒ", "Α", "Α", "Α", "Β", "Β", "Β", "Γ", "Γ", "Γ", "Δ", "Δ", "Δ", "Ε", "Ε", "Ε", "Ζ", "Ζ", "Ζ", "Η", "Η", "Η", "Θ", "Θ", "Θ", "Ι", "Ι", "Ι", "Κ", "Κ", "Κ", "Λ", "Λ", "Λ", "Μ", "Μ", "Μ", "Ν", "Ν", "Ν", "Ξ", "Ξ", "Ξ", "Ο", "Ο", "Ο", "Π", "Π", "Π", "Ρ", "Ρ", "Ρ", "Σ", "Σ", "Σ", "Τ", "Τ", "Τ", "Υ", "Υ", "Υ", "Φ", "Φ", "Φ", "Χ", "Χ", "Χ", "Ψ", "Ψ", "Ψ", "Ω", "Ω", "Ω", "α", "α", "α", "β", "β", "β", "γ", "γ", "γ", "δ", "δ", "δ", "ε", "ε", "ε", "ζ", "ζ", "ζ", "η", "η", "η", "θ", "θ", "θ", "ι", "ι", "ι", "κ", "κ", "κ", "λ", "λ", "λ", "μ", "μ", "μ", "ν", "ν", "ν", "ξ", "ξ", "ξ", "ο", "ο", "ο", "π", "π", "π", "ρ", "ρ", "ρ", "ς", "ς", "ς", "σ", "σ", "σ", "τ", "τ", "τ", "υ", "υ", "υ", "φ", "φ", "φ", "χ", "χ", "χ", "ψ", "ψ", "ψ", "ω", "ω", "ω", "ϑ", "ϑ", "ϑ", "ϒ", "ϒ", "ϒ", "ϖ", "ϖ", "ϖ", "•", "•", "•", "…", "…", "…", "′", "′", "′", "″", "″", "″", "‾", "‾", "‾", "⁄", "⁄", "⁄", "℘", "℘", "℘", "ℑ", "ℑ", "ℑ", "ℜ", "ℜ", "ℜ", "™", "™", "™", "ℵ", "ℵ", "ℵ", "←", "←", "←", "↑", "↑", "↑", "→", "→", "→", "↓", "↓", "↓", "↔", "↔", "↔", "↵", "↵", "↵", "⇐", "⇐", "⇐", "⇑", "⇑", "⇑", "⇒", "⇒", "⇒", "⇓", "⇓", "⇓", "⇔", "⇔", "⇔", "∀", "∀", "∀", "∂", "∂", "∂", "∃", "∃", "∃", "∅", "∅", "∅", "∇", "∇", "∇", "∈", "∈", "∈", "∉", "∉", "∉", "∋", "∋", "∋", "∏", "∏", "∏", "∑", "∑", "∑", "−", "−", "−", "∗", "∗", "∗", "√", "√", "√", "∝", "∝", "∝", "∞", "∞", "∞", "∠", "∠", "∠", "∧", "∧", "∧", "∨", "∨", "∨", "∩", "∩", "∩", "∪", "∪", "∪", "∫", "∫", "∫", "∴", "∴", "∴", "∼", "∼", "∼", "≅", "≅", "≅", "≈", "≈", "≈", "≠", "≠", "≠", "≡", "≡", "≡", "≤", "≤", "≤", "≥", "≥", "≥", "⊂", "⊂", "⊂", "⊃", "⊃", "⊃", "⊄", "⊄", "⊄", "⊆", "⊆", "⊆", "⊇", "⊇", "⊇", "⊕", "⊕", "⊕", "⊗", "⊗", "⊗", "⊥", "⊥", "⊥", "⋅", "⋅", "⋅", "⌈", "⌈", "⌈", "⌉", "⌉", "⌉", "⌊", "⌊", "⌊", "⌋", "⌋", "⌋", "⟨", "〈", "⟨", "⟩", "〉", "⟩", "◊", "◊", "◊", "♠", "♠", "♠", "♣", "♣", "♣", "♥", "♥", "♥", "♦", "♦", "♦", NULL }; tickr_0.7.1.orig/src/tickr/tickr_render.c0000644000175000017500000010130014107736721017765 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" #define NO_RESOURCE_STR "No resource" #define WELCOME_STR "Welcome to " APP_NAME " v" APP_V_NUM " ! "\ "To open the main menu, right-click here ..." /* * 'Private' struct's used to make an open stream 'readable' and 'renderable' * in both directions (L to R and R to L). */ typedef struct { char *str; zboolean is_valid; /* Means string is readable (filled) and free-able */ int width; /* Used to compute links' offsets */ } RenderString; typedef struct { RenderString render_str[N_RENDER_STR_MAX]; /* Array of strings from stream */ int n; /* Number of strings (<= N_RENDER_STR_MAX) */ int i; /* Current string index, -1 means empty array or error */ int links_extra_offset; /* For the current surface */ } RenderStringArray; /* 'Private' static array */ static RenderStringArray s_a0, *s_a = &s_a0; /* Prototypes for static funcs */ static cairo_surface_t *render_string_and_layout_to_surface(const char *, PangoLayout *, const Params *, int *); static zboolean fill_in_string_array_from_stream(FILE *, FeedLinkAndOffset *, PangoLayout *, const Params *, int *); static int parse_utf8_str_until_layout_width(char *, PangoLayout *, int); static char *get_current_string_in_array(int *); static char *fill_in_offset_array_update_big_string(char *, FeedLinkAndOffset *, PangoLayout *); static char *get_big_string_from_stream(FILE *, PangoLayout *, const Params *, int *); static char *no_resource_str(PangoLayout *); /*static char *welcome_str(PangoLayout *);*/ static char *create_empty_line_from_layout(PangoLayout *); static char *create_tab_line(); static int get_layout_width(PangoLayout *, const char *); static int get_layout_height(PangoLayout *, const char *); /* Init on first call, do nothing on next calls. */ void init_render_string_array() { int i; static int j = -1; if (j == -1) { for (i = 0; i < N_RENDER_STR_MAX; i++) { s_a->render_str[i].is_valid = FALSE; s_a->render_str[i].width = 0; } s_a->n = 0; s_a->i = -1; s_a->links_extra_offset = 0; j++; } } void free_all_render_strings_in_array() { int i; /* See: init_render_string_array() */ for (i = 0; i < N_RENDER_STR_MAX; i++) { if (s_a->render_str[i].is_valid) { l_str_free(s_a->render_str[i].str); s_a->render_str[i].is_valid = FALSE; } s_a->render_str[i].width = 0; } /* Also reset all int vars */ s_a->n = 0; s_a->i = -1; s_a->links_extra_offset = 0; } /* For the current surface */ int get_links_extra_offset() { return s_a->links_extra_offset; } /* * Render a stream (opened text file) into images (cairo surfaces) of single * lines of text. Any surface width must be <= (XPIXMAP_MAXWIDTH = 32 K - 1) * because, for some reason, X pixmap width and height are signed 16-bit * integers (not sure if this relates to X or Pixman, but one can see this * very limit set in cairo-image-surface.c in cairo sources.) Which is a * PITA because implementation would be so much more staighforward otherwise. * * So one stream must be splitted into an array of strings on first call * and each string is rendered on each call, from first to last if scrolling * dir is R to L, or from last to first if scrolling dir is L to R. When * all strings have been rendered, get_ticker_env()->feed_fully_rendered * is set to TRUE. This flag can also be used to 'reset' this function * (as well as get_ticker_env()->reload_rq). * * Return newly created surface, or NULL if error. * If returned surface is NULL, then error_code is set accordingly and should * be checked to know which error occurred. * (Could be: OK, RENDER_NO_RESOURCE, RENDER_CAIRO_IMAGE_SURFACE_TOO_WIDE, * RENDER_CREATE_CAIRO_IMAGE_SURFACE_ERROR, RENDER_PANGO_LAYOUT_WIDTH_OVERFLOW, * RENDER_FILL_IN_STR_ARRAY_ERROR, RENDER_PROCESS_STR_ARRAY_ERROR, * READ_FROM_STREAM_ERROR.) * * Also set get_resource()->link_and_offset.offset_in_surface values. */ cairo_surface_t *render_stream_to_surface(FILE *fp, FeedLinkAndOffset *link_and_offset, const Params *prm, int *error_code) { cairo_surface_t *c_surf = NULL; char *cur_str, *str; PangoContext *context; PangoLayout *p_layout; PangoFontDescription *f_des; /*zboolean welcome = FALSE;*/ if (get_ticker_env()->reload_rq) get_ticker_env()->feed_fully_rendered = TRUE; *error_code = OK; /* * Create layout */ context = gtk_widget_get_pango_context(get_ticker_env()->win); p_layout = pango_layout_new(context); pango_layout_set_attributes(p_layout, NULL); pango_layout_set_single_paragraph_mode(p_layout, TRUE); f_des = pango_font_description_from_string((const char *)prm->font_name_size); pango_layout_set_font_description(p_layout, f_des); pango_font_description_free(f_des); /* * Get one string (from text string array from stream) */ init_render_string_array(); if (fp != NULL) { if (get_ticker_env()->feed_fully_rendered) { free_all_render_strings_in_array(); if (!fill_in_string_array_from_stream(fp, link_and_offset, p_layout, prm, error_code)) { warning(M_S_MOD, "%s(): fill_in_string_array_from_stream(): %s", __func__, global_error_str(*error_code)); /* We consider we don't have any valid resource */ *error_code = RENDER_NO_RESOURCE; } } else *error_code = OK; if (*error_code == OK) { cur_str = get_current_string_in_array(error_code); if (cur_str != NULL) str = l_str_new(cur_str); else { warning(M_S_MOD, "%s(): get_current_string_in_array(): %s", __func__, global_error_str(*error_code)); /* Again, we consider we don't have any valid resource */ *error_code = RENDER_NO_RESOURCE; } } } if (fp == NULL || *error_code != OK) { get_resource()->id[0] = '\0'; free_all_render_strings_in_array(); /*if (welcome) str = welcome_str(p_layout); else*/ str = no_resource_str(p_layout); s_a->render_str[0].str = str; s_a->n = 1; s_a->i = 0; if (M_S_MOD) get_ticker_env()->feed_fully_rendered = TRUE; } c_surf = render_string_and_layout_to_surface(str, p_layout, prm, error_code); /* * If out of limits, set flag so that, in multiple selection mode, * to load next feed on next call. */ if (STANDARD_SCROLLING) { if (s_a->i > s_a->n - 1) get_ticker_env()->feed_fully_rendered = TRUE; } else { if (s_a->i < 0) get_ticker_env()->feed_fully_rendered = TRUE; } l_str_free(str); if (p_layout != NULL) g_object_unref(p_layout); return c_surf; } /* * Create a cairo surface (image) of a string and layout. * 'Tail surface' is used in sequential calls to this function, ie the * 2nd call will get the tail part of the first call surface, which will * be the beginning part of the new surface. * * By setting get_ticker_env()->feed_fully_rendered to TRUE, the function * is kind of reset, and 'tail surface' is destroyed * * Return surface or NULL if error (and set error_code). */ static cairo_surface_t *render_string_and_layout_to_surface(const char *str2, PangoLayout *p_layout, const Params *prm, int *error_code) { int layout_width, layout_height, shift_x; char *str, *empty_line; cairo_surface_t *c_surf = NULL; static cairo_surface_t *c_tail_surf = NULL; cairo_t *c_context; cairo_t *c_tail_context; cairo_pattern_t *c_pattern; cairo_status_t c_status; float shadow_k; zboolean errors = FALSE; #ifdef G_OS_WIN32 WCHAR u202d[6]; #endif if (REVERSE_SCROLLING) { #ifndef G_OS_WIN32 str = l_str_new("\u202d"); /* Unicode LTR override - NEED THIS TO GET THINGS RIGHT (so to speak) */ #else g_unichar_to_utf8(L'\u202d', (char *)u202d); str = l_str_new((char *)u202d); #endif str = l_str_cat(str, str2); } else str = l_str_new(str2); /* * 'Tail' surface stuff */ if (get_ticker_env()->feed_fully_rendered) { if (c_tail_surf != NULL) cairo_surface_destroy(c_tail_surf); c_tail_surf = NULL; /* Reset 'global' variable get_ticker_env()->feed_fully_rendered */ get_ticker_env()->feed_fully_rendered = FALSE; } if (c_tail_surf == NULL) { empty_line = create_empty_line_from_layout(p_layout); if (STANDARD_SCROLLING) str = l_str_insert_at_b(str, empty_line); else str = l_str_cat(str, empty_line); l_str_free(empty_line); shift_x = 0; } else shift_x = get_ticker_env()->drwa_width; /* * Fill layout */ pango_layout_set_text(p_layout, str, -1); pango_layout_context_changed(p_layout); pango_layout_get_pixel_size(p_layout, &layout_width, &layout_height); if (layout_width + shift_x > XPIXMAP_MAXWIDTH) { *error_code = RENDER_CAIRO_IMAGE_SURFACE_TOO_WIDE; l_str_free(str); return NULL; } /* * Create cairo image surface onto which layout will be rendered */ c_surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, layout_width + shift_x, layout_height); if ((c_status = cairo_surface_status(c_surf)) != CAIRO_STATUS_SUCCESS) { INFO_ERR("%s(): cairo_image_surface_create(): %s\n", __func__, cairo_status_to_string(c_status)) *error_code = RENDER_CREATE_CAIRO_IMAGE_SURFACE_ERROR; cairo_surface_destroy(c_surf); if (c_tail_surf != NULL) cairo_surface_destroy(c_tail_surf); l_str_free(str); return NULL; } c_context = cairo_create(c_surf); /* * Copy c_tail_surf at beginning of c_surf * * === If reverse sc, replace 'tail' with 'head' and beginning part with ending part === */ if (shift_x > 0) { if (STANDARD_SCROLLING) { /* * cairo_set_source_(): dest_x - src_x, dest_y - src_y */ cairo_set_source_surface(c_context, c_tail_surf, 0, 0); /* * cairo_rectangle(): dest_x, dest_y, src_w, src_h */ cairo_rectangle(c_context, 0, 0, shift_x, layout_height); } else { cairo_set_source_surface(c_context, c_tail_surf, layout_width, 0); cairo_rectangle(c_context, layout_width, 0, shift_x, layout_height); } cairo_set_operator(c_context, CAIRO_OPERATOR_SOURCE); cairo_fill(c_context); cairo_surface_destroy(c_tail_surf); } /* * Render layout */ /* Draw background */ if (get_params()->set_gradient_bg == 'y') { c_pattern = cairo_pattern_create_linear(0.0, 0.0, 0.0, (float)layout_height); if ((c_status = cairo_pattern_status(c_pattern)) == CAIRO_STATUS_SUCCESS) { if (cairo_pattern_get_type(c_pattern) == CAIRO_PATTERN_TYPE_LINEAR) { cairo_pattern_add_color_stop_rgba(c_pattern, 0.0, (float)prm->bg_color.red / G_MAXUINT16, (float)prm->bg_color.green / G_MAXUINT16, (float)prm->bg_color.blue / G_MAXUINT16, (float)prm->bg_color_alpha / G_MAXUINT16); cairo_pattern_add_color_stop_rgba(c_pattern, 1.0, (float)prm->bg_color2.red / (G_MAXUINT16), (float)prm->bg_color2.green / (G_MAXUINT16), (float)prm->bg_color2.blue / (G_MAXUINT16), (float)prm->bg_color_alpha / G_MAXUINT16); cairo_set_source(c_context, c_pattern); if (STANDARD_SCROLLING) cairo_rectangle(c_context, shift_x, 0, layout_width, layout_height); else cairo_rectangle(c_context, 0, 0, layout_width, layout_height); cairo_set_operator(c_context, CAIRO_OPERATOR_SOURCE); cairo_fill(c_context); } else { INFO_ERR("%s(): Cairo pattern type != linear (gradient)\n", __func__) errors = TRUE; } } else { INFO_ERR("%s(): cairo_pattern_create_linear(): %s\n", __func__, cairo_status_to_string(c_status)) errors = TRUE; } cairo_pattern_destroy(c_pattern); } else { cairo_set_source_rgba(c_context, (float)prm->bg_color.red / G_MAXUINT16, (float)prm->bg_color.green / G_MAXUINT16, (float)prm->bg_color.blue / G_MAXUINT16, (float)prm->bg_color_alpha / G_MAXUINT16); if (STANDARD_SCROLLING) cairo_rectangle(c_context, shift_x, 0, layout_width, layout_height); else cairo_rectangle(c_context, 0, 0, layout_width, layout_height); cairo_set_operator(c_context, CAIRO_OPERATOR_SOURCE); cairo_fill(c_context); } if (errors) { *error_code = RENDER_CREATE_CAIRO_IMAGE_SURFACE_ERROR; cairo_surface_destroy(c_surf); cairo_destroy(c_context); l_str_free(str); return NULL; } /* Draw foreground */ if (prm->shadow == 'y') { /* Draw shadow */ if (prm->shadow_fx < 0) shadow_k = 1.0; else if (prm->shadow_fx > 10) shadow_k = 0.0; else shadow_k = 1.0 - (float)prm->shadow_fx / 10.0; if (get_params()->set_gradient_bg == 'y') { c_pattern = cairo_pattern_create_linear(0.0, 0.0, 0.0, (float)layout_height); if ((c_status = cairo_pattern_status(c_pattern)) == CAIRO_STATUS_SUCCESS) { if (cairo_pattern_get_type(c_pattern) == CAIRO_PATTERN_TYPE_LINEAR) { cairo_pattern_add_color_stop_rgba(c_pattern, 0.0, (float)prm->bg_color.red * shadow_k / G_MAXUINT16, (float)prm->bg_color.green * shadow_k / G_MAXUINT16, (float)prm->bg_color.blue * shadow_k / G_MAXUINT16, (float)prm->bg_color_alpha / G_MAXUINT16); cairo_pattern_add_color_stop_rgba(c_pattern, 1.0, (float)prm->bg_color2.red * shadow_k / (G_MAXUINT16), (float)prm->bg_color2.green * shadow_k / (G_MAXUINT16), (float)prm->bg_color2.blue * shadow_k / (G_MAXUINT16), (float)prm->bg_color_alpha / G_MAXUINT16); cairo_set_source(c_context, c_pattern); pango_cairo_update_layout(c_context, p_layout); if (STANDARD_SCROLLING) cairo_rectangle(c_context, shift_x + prm->shadow_offset_x, prm->shadow_offset_y, layout_width, layout_height); else cairo_rectangle(c_context, prm->shadow_offset_x, prm->shadow_offset_y, layout_width, layout_height); cairo_set_operator(c_context, CAIRO_OPERATOR_OVER); pango_cairo_show_layout(c_context, p_layout); } else { INFO_ERR("%s(): Cairo pattern type != linear (gradient)\n", __func__) errors = TRUE; } } else { INFO_ERR("%s(): cairo_pattern_create_linear(): %s\n", __func__, cairo_status_to_string(c_status)) errors = TRUE; } cairo_pattern_destroy(c_pattern); } else { cairo_set_source_rgba(c_context, (float)prm->bg_color.red * shadow_k / G_MAXUINT16, (float)prm->bg_color.green * shadow_k / G_MAXUINT16, (float)prm->bg_color.blue * shadow_k / G_MAXUINT16, (float)prm->bg_color_alpha / G_MAXUINT16); pango_cairo_update_layout(c_context, p_layout); if (STANDARD_SCROLLING) cairo_rectangle(c_context, shift_x + prm->shadow_offset_x, prm->shadow_offset_y, layout_width, layout_height); else cairo_rectangle(c_context, prm->shadow_offset_x, prm->shadow_offset_y, layout_width, layout_height); cairo_set_operator(c_context, CAIRO_OPERATOR_OVER); pango_cairo_show_layout(c_context, p_layout); } } if (errors) { *error_code = RENDER_CREATE_CAIRO_IMAGE_SURFACE_ERROR; cairo_surface_destroy(c_surf); cairo_destroy(c_context); l_str_free(str); return NULL; } cairo_set_source_rgba(c_context, (float)prm->fg_color.red / G_MAXUINT16, (float)prm->fg_color.green / G_MAXUINT16, (float)prm->fg_color.blue / G_MAXUINT16, (float)prm->fg_color_alpha / G_MAXUINT16); pango_cairo_update_layout(c_context, p_layout); if (STANDARD_SCROLLING) cairo_rectangle(c_context, shift_x, 0, layout_width, layout_height); else cairo_rectangle(c_context, 0, 0, layout_width, layout_height); cairo_set_operator(c_context, CAIRO_OPERATOR_OVER); pango_cairo_show_layout(c_context, p_layout); /* * Create 'tail' surface */ c_tail_surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, get_ticker_env()->drwa_width, layout_height); c_tail_context = cairo_create(c_tail_surf); if (STANDARD_SCROLLING) { cairo_set_source_surface(c_tail_context, c_surf, - layout_width - shift_x + get_ticker_env()->drwa_width, 0); cairo_rectangle(c_tail_context, 0, 0, get_ticker_env()->drwa_width, layout_height); } else { cairo_set_source_surface(c_tail_context, c_surf, 0, 0); cairo_rectangle(c_tail_context, 0, 0, get_ticker_env()->drwa_width, layout_height); } cairo_set_operator(c_tail_context, CAIRO_OPERATOR_SOURCE); cairo_fill(c_tail_context); cairo_destroy(c_tail_context); if ((c_status = cairo_surface_status(c_tail_surf)) != CAIRO_STATUS_SUCCESS) { INFO_ERR("%s(): cairo_image_surface_create(): %s\n", __func__, cairo_status_to_string(c_status)) *error_code = RENDER_CREATE_CAIRO_IMAGE_SURFACE_ERROR; cairo_surface_destroy(c_surf); cairo_surface_destroy(c_tail_surf); l_str_free(str); return NULL; } /* * Drawing done - return surface */ *error_code = OK; /* Needed ? Can't hurt anyways */ cairo_destroy(c_context); l_str_free(str); return c_surf; } /* * Read and split stream into an array of lines so that, after rendering of any line, * we always get a cairo image surface whose width is <= XPIXMAP_MAXWIDTH. * Stream (*not* checked) is expected to be not NULL. * * s_a is a 'private' (static) RenderStringArray. */ static zboolean fill_in_string_array_from_stream(FILE *fp, FeedLinkAndOffset *link_and_offset, PangoLayout *p_layout, const Params *prm, int *error_code) { char *big_str, *sub_str, c; int max_width, i, j; /* First we get the 'big' string. */ big_str = get_big_string_from_stream(fp, p_layout, prm, error_code); if (big_str == NULL) return FALSE; else if (get_resource()->type == RESRC_FILE && strlen(big_str) > 50 * 1024) { /* FIXME: *MUST* BE OPTIMIZED (A LOT) */ if (question_win("In this version, processing 'big' text files (size > 50 KiB) takes ages.\n" "(Time seems to increase exponentially with file size and this needs to be fixed.)\n" "Continue anyways ?", NO) == NO) { *error_code = RENDER_NO_RESOURCE; l_str_free(big_str); big_str = NULL; return FALSE; } } if (get_layout_width(p_layout, big_str) == 0) { *error_code = RENDER_PANGO_LAYOUT_WIDTH_OVERFLOW; l_str_free(big_str); big_str = NULL; return FALSE; } /* * Compute offsets for 'big' string. * get_resource()->link_and_offset->url values are already set. */ big_str = fill_in_offset_array_update_big_string(big_str, link_and_offset, p_layout); /* Then we fill in array with sub-strings. */ max_width = XPIXMAP_MAXWIDTH - (2 * get_ticker_env()->drwa_width) - prm->shadow_offset_x; /* * For debugging purposes, we can set max_width to a smaller value so that we get multiple sub-strings (RenderString's) * ie setting max_width to 2000 or 3000; */ sub_str = big_str; for (i = 0; i < N_RENDER_STR_MAX; i++) { #ifndef G_OS_WIN32 if (get_resource()->type == RESRC_FILE) VERBOSE_INFO_OUT("\r%c Processing, please wait ... ", spinning_shape()) #endif s_a->render_str[i].str = l_str_new(NULL); s_a->render_str[i].is_valid = TRUE; s_a->render_str[i].width = 0; j = parse_utf8_str_until_layout_width(sub_str, p_layout, max_width); if (j == -2) { /* -2 means error */ *error_code = RENDER_FILL_IN_STR_ARRAY_ERROR; warning(M_S_MOD, "%s(): %s", __func__, global_error_str(*error_code)); break; } else if (j > 0) { /* = sub-string length in bytes (vs UTF-8 chars) */ c = *(sub_str + j); *(sub_str + j) = '\0'; if (g_utf8_validate(sub_str, -1, NULL)) { s_a->render_str[i].str = l_str_cat(s_a->render_str[i].str, sub_str); s_a->render_str[i].width = get_layout_width(p_layout, s_a->render_str[i].str); } else *error_code = RENDER_FILL_IN_STR_ARRAY_ERROR; *(sub_str + j) = c; sub_str += j; if (*error_code == RENDER_FILL_IN_STR_ARRAY_ERROR) break; } else { /* 0 or -1 means string width (in pixels) is already <= max_width */ if (g_utf8_validate(sub_str, -1, NULL)) { s_a->render_str[i].str = l_str_cat(s_a->render_str[i].str, sub_str); s_a->render_str[i].width = get_layout_width(p_layout, s_a->render_str[i].str); } else *error_code = RENDER_FILL_IN_STR_ARRAY_ERROR; break; } } #ifndef G_OS_WIN32 if (get_resource()->type == RESRC_FILE) VERBOSE_INFO_OUT("Done\n") #endif l_str_free(big_str); if (i >= N_RENDER_STR_MAX) { /* Just warn - OK ? */ warning(BLOCK, "%s(): Need more than %d strings to render stream.\n" "Compile option N_RENDER_STR_MAX should be adjust accordingly.\n", __func__, N_RENDER_STR_MAX); i = N_RENDER_STR_MAX - 1; } s_a->n = i + 1; if (STANDARD_SCROLLING) s_a->i = 0; else s_a->i = s_a->n - 1; if (*error_code == OK) return TRUE; else return FALSE; } /* * Get length (in bytes) of a sub-string (of an UTF-8 string) whose, if set inside * a layout, will have a width (in pixels) near but <= max_width. * * Returned length is not the max length possible, but differs only from max length * by a small amount of bytes (which is OK for what this function is used for, and * this also makes the function a little bit faster.) * * Return sub-string length in bytes (vs UTF-8 chars), -1 if string width (in pixels) * is already <= max_width, -2 if error. */ static int parse_utf8_str_until_layout_width(char *str, PangoLayout *p_layout, int max_width) { char *p, c; int str_width = get_layout_width(p_layout, str); /* In pixels */ size_t str_len = strlen(str); /* In bytes */ long offset, delta; /* In UTF-8 chars, ie 1 to 4 bytes */ zboolean is_beyond; if (str_width > max_width) { offset = g_utf8_strlen(str, -1); delta = offset / 2; p = str; is_beyond = TRUE; while (1) { offset += is_beyond ? - delta: delta; delta /= 2; if (delta == 0) delta = 1; p = g_utf8_offset_to_pointer(str, offset); if (p == NULL || p < str || p > str + str_len) { VERBOSE_INFO_ERR("%s(): g_utf8_offset_to_pointer() returned invalid pointer\n", __func__) return -2; } c = *p; *p = '\0'; str_width = get_layout_width(p_layout, str); *p = c; if (str_width == -1) { VERBOSE_INFO_ERR("%s(): get_layout_width() error\n", __func__) return -2; } else if (str_width == max_width) break; else if (str_width > max_width) is_beyond = TRUE; else { if (max_width - str_width < 50) break; is_beyond = FALSE; } } if (p != NULL) return (int)(p - str); else return -1; } else if (str_width == -1) { /* Error computing width */ VERBOSE_INFO_ERR("%s(): get_layout_width() error\n", __func__) return -2; } else /* Nothing to do */ return -1; } /* * Return current str (or NULL if error) and increment/decrement index for * next call. Also compute s_a->links_extra_offset for current surface. * * s_a is a 'private' (static) RenderStringArray. */ static char *get_current_string_in_array(int *error_code) { int j; *error_code = RENDER_PROCESS_STR_ARRAY_ERROR; if (s_a->n < 1) { INFO_ERR("%s(): s_a->n (= %d) < 1\n", __func__, s_a->n) return NULL; } else if (s_a->i >= 0 && s_a->i < s_a->n) { if (s_a->render_str[s_a->i].str == NULL) { INFO_ERR("%s(): s_a->render_str[%d].str = NULL\n", __func__, s_a->i) return NULL; } else if (!s_a->render_str[s_a->i].is_valid) { INFO_ERR("%s(): s_a->render_str[%d].is_valid = FALSE\n", __func__, s_a->i) return NULL; } else { /* Compute links extra offset for current surface */ s_a->links_extra_offset = 0; for (j = 0; j < s_a->i; j++) s_a->links_extra_offset += s_a->render_str[j].width; DEBUG_INFO("RenderStringArray: s_a->n = %d, s_a->i = %d\n", s_a->n, s_a->i) *error_code = OK; /* New index on next call */ if (STANDARD_SCROLLING) return s_a->render_str[s_a->i++].str; else return s_a->render_str[s_a->i--].str; } } else { INFO_ERR("%s(): s_a->i (= %d) is out of bounds (0 - %d)\n", __func__, s_a->i, s_a->n - 1) return NULL; } } /* * Translate link ranks inside text into offsets in surface. * * Scan text for "00n" and get offset = layout_width(< text from start to tag >), * for every rss item found. Then remove tags and fill an array of FeedLinkAndOffset's with offsets * (ranks and URLs are already known/set). * * For reverse scrolling, work somehow differently * * Return new str. */ static char *fill_in_offset_array_update_big_string(char *str, FeedLinkAndOffset *link_and_offset, PangoLayout *p_layout) { char tmp[4]; int i, j; if (STANDARD_SCROLLING) { link_and_offset->offset_in_surface = get_ticker_env()->drwa_width; /* First offset (000) = get_ticker_env()->drwa_width */ for (i = 1; i < NFEEDLINKANDOFFSETMAX; i++) /* We reset all other offsets to 0 */ (link_and_offset + i)->offset_in_surface = 0; } else { for (i = 0; i < NFEEDLINKANDOFFSETMAX; i++) /* We reset all offsets to 0 */ (link_and_offset + i)->offset_in_surface = 0; } for (i = 0; str[i] != '\0'; i++) { if (str[i] == LINK_TAG_CHAR) { str_n_cpy(tmp, str + i + 1, 3); j = atoi(tmp); str[i] = '\0'; if (j > 0 && j < NFEEDLINKANDOFFSETMAX) { if (STANDARD_SCROLLING) (link_and_offset + j)->offset_in_surface = get_ticker_env()->drwa_width + get_layout_width(p_layout, str); else (link_and_offset + j)->offset_in_surface = get_layout_width(p_layout, str); } str = l_str_cat(str, str + i + 4); } } if (REVERSE_SCROLLING) (link_and_offset)->offset_in_surface = get_layout_width(p_layout, str); /* First offset = layout width of full string */ return str; } /* * Create a single long string from stream and do some processing (line delimiters, * special chars, upper case text.) Created string must be l_str_free'd when done. * Stream is expected to be not NULL, but *not* checked. * If error, return NULL and set error_code. */ static char *get_big_string_from_stream(FILE *fp, PangoLayout *p_layout, const Params *prm, int *error_code) { char *str, *empty_line, *tab_line; char *tmp, *p, *p2, c; size_t tmp_size = FGETS_STR_MAXLEN; fseek(fp, 0, SEEK_SET); empty_line = create_empty_line_from_layout(p_layout); tab_line = create_tab_line(); str = l_str_new(NULL); /* * We read stream (text file) one line at a time, to build str */ tmp = malloc2((tmp_size + 1) * sizeof(char)); #ifndef G_OS_WIN32 while (getline(&tmp, &tmp_size, fp) != -1) { #else while (fgets(tmp, tmp_size, fp) != NULL) { #endif for (p = tmp; p != NULL && *p != '\0'; p = g_utf8_find_next_char(p, NULL)) { if (*p == '\n') str = l_str_cat(str, prm->line_delimiter); else if (*p == prm->new_page_char && prm->special_chars == 'y') str = l_str_cat(str, empty_line); else if (*p == prm->tab_char && prm->special_chars == 'y') str = l_str_cat(str, tab_line); else { p2 = g_utf8_find_next_char(p, NULL); if (p2 != NULL) { c = *p2; *p2 = '\0'; str = l_str_cat(str, p); *p2 = c; } else break; } } } free(tmp); /* EOF or error ? */ if (feof(fp) != 0) { if (prm->upper_case_text == 'y') { p = g_utf8_strup(str, -1); l_str_free(str); str = l_str_new(p); g_free(p); } /* * str ends with an "empty line" */ if (STANDARD_SCROLLING) str = l_str_cat(str, empty_line); else str = l_str_insert_at_b(str, empty_line); *error_code = OK; } else { l_str_free(str); str = NULL; *error_code = READ_FROM_STREAM_ERROR; INFO_ERR("%s(): %s\n", __func__, global_error_str(*error_code)) } l_str_free(empty_line); l_str_free(tab_line); return str; } /* Returned string must be l_str_free'd when done. */ static char *no_resource_str(PangoLayout *p_layout) { char *str, *empty_line = create_empty_line_from_layout(p_layout); str = l_str_new(empty_line); str = l_str_cat(str, NO_RESOURCE_STR); str = l_str_cat(str, empty_line); l_str_free(empty_line); return str; } /* Returned string must be l_str_free'd when done. */ /*static char *welcome_str(PangoLayout *p_layout) { char *str, *empty_line = create_empty_line_from_layout(p_layout); str = l_str_new(empty_line); str = l_str_cat(str, WELCOME_STR); str = l_str_cat(str, empty_line); l_str_free(empty_line); return str; }*/ /* Created string must be l_str_free'd when done. */ static char *create_empty_line_from_layout(PangoLayout *p_layout) { char *empty_line = l_str_new(NULL); do empty_line = l_str_cat(empty_line, " "); while (get_layout_width(p_layout, empty_line) < get_ticker_env()->drwa_width); return empty_line; } /* Created string must be l_str_free'd when done. */ static char *create_tab_line() { char *tab_line = l_str_new(NULL); int i; for (i = 0; i < TAB_SIZE; i++) tab_line = l_str_cat(tab_line, " "); return tab_line; } int get_font_size_from_layout_height(int height, const char *font_name2) { PangoLayout *p_layout; PangoFontDescription *f_des; char font_name_size[FONT_MAXLEN + 1]; char font_name[FONT_NAME_MAXLEN + 1], font_size[FONT_SIZE_MAXLEN + 1]; char check_str[] = "gjpqyÀÄÅÇÉÖÜ€£$!&({[?|"; /* Should be enough - Is it ? */ int height2; int i = 1; p_layout = pango_layout_new(gtk_widget_get_pango_context(get_ticker_env()->win)); pango_layout_set_attributes(p_layout, NULL); pango_layout_set_single_paragraph_mode(p_layout, TRUE); str_n_cpy(font_name, font_name2, FONT_NAME_MAXLEN); do { snprintf(font_size, FONT_SIZE_MAXLEN + 1, "%3d", i++); compact_font(font_name_size, font_name, font_size); f_des = pango_font_description_from_string((const char *)font_name_size); pango_layout_set_font_description(p_layout, f_des); pango_font_description_free(f_des); height2 = get_layout_height(p_layout, check_str); } while (height2 < height && i < 1000); if (p_layout != NULL) g_object_unref(p_layout); return (i - 1); } /* In *pixels*, return -1 if error. */ int get_layout_height_from_font_name_size(const char *font_name_size) { PangoLayout *p_layout; PangoFontDescription *f_des; char check_str[] = "gjpqyÀÄÅÇÉÖÜ€£$!&({[?|"; int height; p_layout = pango_layout_new(gtk_widget_get_pango_context(get_ticker_env()->win)); pango_layout_set_attributes(p_layout, NULL); pango_layout_set_single_paragraph_mode(p_layout, TRUE); f_des = pango_font_description_from_string(font_name_size); pango_layout_set_font_description(p_layout, f_des); pango_font_description_free(f_des); height = get_layout_height(p_layout, check_str); if (p_layout != NULL) g_object_unref(p_layout); return height; } /* In *pixels*, return 0 if empty str, -1 if error. */ static int get_layout_width(PangoLayout *p_layout, const char *str) { int layout_width; if (str != NULL) { if (str[0] != '\0') { pango_layout_set_text(p_layout, str, -1); pango_layout_context_changed(p_layout); pango_layout_get_pixel_size(p_layout, &layout_width, NULL); } else { DEBUG_INFO("%s(pango_layout, str): str length = 0 - Troubles ahead ?\n", __func__) return 0; } } else { VERBOSE_INFO_ERR("%s(pango_layout, str): str is NULL\n", __func__) layout_width = -1; } return layout_width; } /* In *pixels*, return 0 if empty str, -1 if error. */ static int get_layout_height(PangoLayout *p_layout, const char *str) { int layout_height; if (str != NULL) { if (str[0] != '\0') { pango_layout_set_text(p_layout, str, -1); pango_layout_context_changed(p_layout); pango_layout_get_pixel_size(p_layout, NULL, &layout_height); } else { DEBUG_INFO("%s(pango_layout, str): str length = 0 - Troubles ahead ?\n", __func__) return 0; } } else { VERBOSE_INFO_ERR("%s(pango_layout, str): str is NULL\n", __func__) layout_height = -1; } return layout_height; } /* Return '-', '\', '|', '/', sequentially */ char spinning_shape() { static int counter = 0; char str[4] = "-\\|/"; counter = counter & 3; return str[counter++]; } /* * Show begining and end of a 'long' UTF-8 string, mainly for debugging purposes * -> Fist 30 chars + " ... " + last 30 chars */ void show_str_beginning_and_end(char *str) { char *p, c; char *s1 = NULL, *s2 = NULL; int i; for (p = str, i = 0; p != NULL && *p != '\0'; p = g_utf8_find_next_char(p, NULL), i++) { if (i == 30) { c = *p; *p = 0; s1 = l_str_new(str); *p = c; } else if (i == (int)strlen(str) - 30) { s2 = l_str_new(p); break; } } INFO_OUT("%s ... %s\n", s1, s2) if (s1 != NULL) l_str_free(s1); if (s2 != NULL) l_str_free(s2); } tickr_0.7.1.orig/src/tickr/tickr_check4updates.c0000644000175000017500000001021614107736721021242 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" static void new_version_available_win(char *version_num) { GtkWidget *dialog, *table, *label[2], *close_but; char str1[256], str2[256]; gtk_window_set_keep_above(GTK_WINDOW(get_ticker_env()->win), FALSE); dialog = gtk_dialog_new_with_buttons( "New upstream version found", GTK_WINDOW(get_ticker_env()->win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, NULL); close_but = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL_CLOSE); close_but = close_but; set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); table = gtk_table_new(2, 1, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 5); gtk_container_set_border_width(GTK_CONTAINER(table), 15); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table); snprintf(str1, 256, "%s version %s is available for download from:", APP_NAME, version_num); snprintf(str2, 256, "%s", DOWNLOAD_URL, DOWNLOAD_URL); label[0] = gtk_label_new(str1); gtk_label_set_use_markup(GTK_LABEL(label[0]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[0]), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label[0], 0, 1, 0, 1); label[1] = gtk_label_new(str2); gtk_label_set_use_markup(GTK_LABEL(label[1]), TRUE); gtk_misc_set_alignment(GTK_MISC(label[1]), 0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), label[1], 0, 1, 1, 2); gtk_widget_show_all(dialog); while (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_CANCEL_CLOSE); gtk_widget_destroy(dialog); check_main_win_always_on_top(); } void check_for_updates() { sockt sock; char *response, *new_url; int recv_status; char last_stable_version[32], installed_version[32], *p; int id_str_len, resp_len; int info = OK + 1; INFO_OUT("Checking for updates:\n") if (connect_with_url(&sock, CHECK4UPDATES_URL) == OK) { if (get_http_response(sock, "GET", "", CHECK4UPDATES_URL, &new_url, &response, &recv_status) == OK) { id_str_len = strlen(CHECK4UPDATES_ID_STR); resp_len = strlen(response); p = response; last_stable_version[0] = '\0'; while (p < response + resp_len - id_str_len) { if (strncmp(p, CHECK4UPDATES_ID_STR, id_str_len) == 0) { str_n_cpy(last_stable_version, p + id_str_len, 31); remove_trailing_whitespaces_from_str(last_stable_version); break; } else p++; } if (last_stable_version[0] != '\0') { p = installed_version; str_n_cpy(p, APP_V_NUM, 31); while (*p != '\0') { p++; if (*p == '~') { *p = '\0'; p--; *p -= 1; break; } } if (strcmp(last_stable_version, installed_version) > 0) { new_version_available_win(last_stable_version); INFO_OUT("%s version %s is available for download from: <%s>\n", APP_NAME, last_stable_version, DOWNLOAD_URL) } else { info_win("Check for Updates", "\n " APP_NAME " is up to date :) \n", INFO, FALSE); INFO_OUT(APP_NAME " is up to date :)\n") } info = OK; } free2(response); } CLOSE_SOCK(sock); } if (info != OK) warning(BLOCK, "Couldn't retrieve requested information from website"); } tickr_0.7.1.orig/src/tickr/tickr_main.c0000644000175000017500000016025514107736721017450 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" /* * Static global structs and variables for this module, with related setter/getter * functions for all other modules. */ static TickerEnv *env = NULL; static Resource *resrc = NULL; static FList *feed_list = NULL, *feed_selection = NULL; static Params *prm = NULL; static int instance_id = 0; static zboolean no_ui = FALSE; static int speed_up_flag = FALSE; static int slow_down_flag = FALSE; static GtkWidget *main_hbox, *vbox_ticker, *vbox_clock, *popup_menu; static GtkAccelGroup *popup_menu_accel_group; static int popup_menu_accel_group_attached; TickerEnv *get_ticker_env() { return env; } Resource *get_resource() { return resrc; } FList *get_feed_list() { return feed_list; } void set_feed_list(FList *list) { feed_list = list; } FList *get_feed_selection() { return feed_selection; } void set_feed_selection(FList *list) { feed_selection = list; } Params *get_params() { return prm; } int get_instance_id() { return instance_id; } /* Prototypes for static funcs */ static void modify_params0(); static void connection_settings0(); static int shift2left_callback(); static void check_time_load_resource_from_selection(check_time_mode); #define START_PAUSE_TICKER_WHILE_OPENING\ int suspend_rq_bak = env->suspend_rq;\ env->suspend_rq = TRUE; #define END_PAUSE_TICKER_WHILE_OPENING\ env->suspend_rq = suspend_rq_bak; /* Sometimes, we need to temporarily re-enable popups, just to get error messages. */ #define START_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING\ int suspend_rq_bak;\ char disable_popups_bak;\ suspend_rq_bak = env->suspend_rq;\ env->suspend_rq = TRUE;\ disable_popups_bak = get_params()->disable_popups;\ get_params()->disable_popups = 'n'; #define END_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING\ get_params()->disable_popups = disable_popups_bak;\ env->suspend_rq = suspend_rq_bak; /* * funct_name0(***NO args***) is only used to call funct_name(***args***) from popup menus. */ static void manage_list_and_selection0() { START_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING if (!no_ui) manage_list_and_selection(resrc); END_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING } static void open_txt_file0() { START_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING if (!no_ui) open_txt_file(resrc); END_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING } static void import_opml_file0() { START_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING if (!no_ui) if (import_opml_file() == OK) manage_list_and_selection(resrc); END_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING } static void export_opml_file0() { START_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING if (!no_ui) export_opml_file(); END_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING } static void show_resource_info0() { START_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING show_resource_info(get_resource()); END_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING } static void easily_modify_params0() { next_action i; START_PAUSE_TICKER_WHILE_OPENING if (!no_ui) { if ((i = easily_modify_params(prm)) == DO_NEXT_OPEN_FULL_SETTINGS) { END_PAUSE_TICKER_WHILE_OPENING modify_params0(); } else if (i == DO_NEXT_OPEN_CONN_SETTINGS) { END_PAUSE_TICKER_WHILE_OPENING connection_settings0(); } } END_PAUSE_TICKER_WHILE_OPENING } static void modify_params0() { next_action i; START_PAUSE_TICKER_WHILE_OPENING if (!no_ui) { if ((i = modify_params(prm)) == DO_NEXT_OPEN_CONN_SETTINGS) { END_PAUSE_TICKER_WHILE_OPENING connection_settings0(); } } END_PAUSE_TICKER_WHILE_OPENING } static void connection_settings0() { START_PAUSE_TICKER_WHILE_OPENING if (!no_ui) if (connection_settings(AUTH_PAGE) == GTK_RESPONSE_OK) current_feed(); END_PAUSE_TICKER_WHILE_OPENING } static void import_params0() { START_PAUSE_TICKER_WHILE_OPENING if (!no_ui) import_params(); END_PAUSE_TICKER_WHILE_OPENING } static void export_params0() { START_PAUSE_TICKER_WHILE_OPENING if (!no_ui) export_params(); END_PAUSE_TICKER_WHILE_OPENING } static void pause_on_mouseover_enabled_warning_once() { static int first_run = -1; if (prm->pause_on_mouseover == 'y') { if (first_run == -1) warning(BLOCK, "Setting 'Pause ticker on mouse-over' is enabled. When so, playing/pausing\n" "is always controlled by mouse pointer motions as well."); first_run++; first_run &= 1; } } static void ticker_play() { env->suspend_rq = FALSE; pause_on_mouseover_enabled_warning_once(); } static void ticker_pause() { env->suspend_rq = TRUE; pause_on_mouseover_enabled_warning_once(); } static void ticker_reload() { current_feed(); env->reload_rq = TRUE; env->suspend_rq = FALSE; } static void first_feed0() { if (env->selection_mode == MULTIPLE) first_feed(); else info_win_no_block("Single selection mode", INFO_WIN_WAIT_TIMEOUT); } static void previous_feed0() { if (env->selection_mode == MULTIPLE) previous_feed(); else info_win_no_block("Single selection mode", INFO_WIN_WAIT_TIMEOUT); } static void next_feed0() { if (env->selection_mode == MULTIPLE) next_feed(); else info_win_no_block("Single selection mode", INFO_WIN_WAIT_TIMEOUT); } static void last_feed0() { if (env->selection_mode == MULTIPLE) last_feed(); else info_win_no_block("Single selection mode", INFO_WIN_WAIT_TIMEOUT); } void toggle_speed_up_flag() { speed_up_flag = TRUE; } void toggle_slow_down_flag() { slow_down_flag = TRUE; } static void help_win0() { START_PAUSE_TICKER_WHILE_OPENING help_win(); END_PAUSE_TICKER_WHILE_OPENING } static void online_help0() { START_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING online_help(); END_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING } static void check_for_updates0() { START_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING check_for_updates(); END_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING } static void about_win0() { START_PAUSE_TICKER_WHILE_OPENING about_win(); END_PAUSE_TICKER_WHILE_OPENING } /* Find default browser if none is set. */ static int easily_link_with_browser2() { char browser_cmd[512], tmp[1024]; int error_code = NO_BROWSER_SET_ERROR; #ifndef G_OS_WIN32 str_n_cpy(browser_cmd, OPENLINKCMD, 511); #else char *browser_cmd_p; unsigned int i, count, start = 0, end = 0; if ((browser_cmd_p = (char *)get_default_browser_from_win32registry()) != NULL) { /* Find 1st string in browser_cmd */ str_n_cpy(tmp, browser_cmd_p, 511); for (i = 0, count = 0; i < strlen(tmp); i++) { if (tmp[i] == '"') { count++; if (count == 1) start = i + 1; else if (count == 2) end = i - 1; } } str_n_cpy(browser_cmd, tmp + start, MIN((end - start + 1), 511)); } else { info_win("", "\nCan't find Browser shell command." "You will have to set this parameter manually in the Full Settings window.\n", INFO_ERROR, FALSE); return error_code; } #endif snprintf(tmp, 1024, "\nThis is the Shell command that opens your default Browser:\n\n%s\n\n" "Do you want to use it ?\n", browser_cmd); if (question_win(tmp, YES) == YES) { str_n_cpy(prm->open_link_cmd, browser_cmd, FILE_NAME_MAXLEN); str_n_cpy(prm->open_link_args, "", FILE_NAME_MAXLEN); save_to_config_file(prm); error_code = OK; } else info_win("", "\nCancelled.\n" "You may set this parameter manually in the Full Settings window.\n", INFO, FALSE); return error_code; } int easily_link_with_browser() { int error_code; gtk_window_set_keep_above(GTK_WINDOW(env->win), FALSE); error_code = easily_link_with_browser2(); check_main_win_always_on_top(); return error_code; } /* * If link found, copy it into env->active_link and return rank (starting at 1), * otherwise, return -1 (with env->active_link = ""). */ static int get_visible_link_and_rank(int position_x_in_drwa) { int location_on_surface, n_links, i; zboolean link_found = FALSE; env->active_link[0] = '\0'; if (position_x_in_drwa > -1) { for (n_links = NFEEDLINKANDOFFSETMAX - 1; n_links >= 0; n_links--) if (resrc->link_and_offset[n_links].offset_in_surface > 0) break; if (STANDARD_SCROLLING) { location_on_surface = (env->shift_counter * prm->shift_size) + position_x_in_drwa + get_links_extra_offset(); for (i = 0; i <= n_links; i++) { /* First link rank = 1 */ if (resrc->link_and_offset[i].offset_in_surface > location_on_surface) { link_found = TRUE; break; } } } else { location_on_surface = env->surf_width - env->drwa_width - (env->shift_counter * prm->shift_size) + position_x_in_drwa + get_links_extra_offset(); for (i = n_links; i >= 0; i--) { if (resrc->link_and_offset[i].offset_in_surface < location_on_surface && resrc->link_and_offset[i - 1].offset_in_surface > location_on_surface) { link_found = TRUE; break; } } } if (link_found && i > 0 && i <= n_links) { str_n_cpy(env->active_link, resrc->link_and_offset[i].url, FILE_NAME_MAXLEN); DEBUG_INFO("Link found (rank = %d)\n", i); /*show_str_beginning_and_end(env->active_link);*/ return i; } DEBUG_INFO("No link found\n"); } return -1; } static void open_link() { char tmp1[FILE_NAME_MAXLEN + 1], tmp2[FILE_NAME_MAXLEN + 1]; char *argv[32]; /* Up to 32 - 3 (prog name, URL, NULL) args */ GPid pid; GError *error = NULL; int i, j; if (prm->open_link_cmd[0] == '\0') { easily_link_with_browser(); if (prm->open_link_cmd[0] == '\0') { warning(BLOCK, "Can't launch Browser: no command is defined.\n", "Please set the 'Open in Browser' option in the Full Settings window."); return; } } if (env->active_link[0] == '\0') { warning(BLOCK, "No link found"); return; } INFO_OUT("Spawning: %s %s %s\n", prm->open_link_cmd, prm->open_link_args, env->active_link) str_n_cpy(tmp1, prm->open_link_cmd, FILE_NAME_MAXLEN); str_n_cpy(tmp2, prm->open_link_args, FILE_NAME_MAXLEN); argv[0] = tmp1; for (i = 0, j = 1; tmp2[i] != '\0' && j < 32 + 1 - 3; j++) { argv[j] = &tmp2[i]; while (tmp2[++i] != ' ') if (tmp2[i] == '\0') break; tmp2[i] = '\0'; while (tmp2[++i] == ' '); } argv[j] = env->active_link; argv[j + 1] = NULL; if (!g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &pid, &error)) { warning(BLOCK, "%s: Can't create process %s - %s", APP_NAME, argv[0], error->message); #ifndef G_OS_WIN32 info_win("", "Please check the 'Open in Browser' option in the Full Settings window.", INFO_WARNING, FALSE); #else if (easily_link_with_browser2() == OK) open_link(); #endif } else g_spawn_close_pid(pid); } static void open_link0() { get_visible_link_and_rank(env->drwa_width / 2); open_link(); } /*static void mark_item() { } static void mark_item0() { mark_item(); }*/ /* * Continuously get mouse x position inside drawing area. * Do nothing if outside, so must be used only by mouse-over-drawing-area / * click-on-drawing-area funcs. */ static int track_mouse_position_x(GtkWidget *widget, GdkEventMotion *event) { widget = widget; if (event->type == GDK_MOTION_NOTIFY) /* Means mouse has moved inside widget */ env->mouse_x_in_drwa = (int)(event->x); return FALSE; } static int left_click_on_drawing_area(GtkWidget *widget, GdkEventButton *event_but) { widget = widget; if (prm->disable_leftclick != 'y' && event_but->type == GDK_BUTTON_PRESS &&\ event_but->button == 1) { /* 1 = mouse left button */ if (event_but->state & GDK_CONTROL_MASK) { /* Do nothing so far */ return FALSE; } else if (event_but->state & GDK_MOD1_MASK) { /* = alt */ /* Do nothing so far */ return FALSE; } else { get_visible_link_and_rank(env->mouse_x_in_drwa); open_link(); return TRUE; } } else return FALSE; } static int right_click_on_drawing_area(GtkWidget *widget, GdkEventButton *event_but) { widget = widget; if (event_but->type == GDK_BUTTON_PRESS && event_but->button == 3) { /* 3 = mouse right button */ if (event_but->state & GDK_CONTROL_MASK) { quick_feed_picker(); return TRUE; } else if (event_but->state & GDK_MOD1_MASK) { /* = alt */ /* Do nothing so far */ return FALSE; } else { /* Popup main menu */ gtk_menu_popup(GTK_MENU(popup_menu), NULL, NULL, NULL, NULL, event_but->button, event_but->time); return TRUE; } } else return FALSE; } static const char *get_win_title_text() { static char tmp1[2][256 + 64], tmp2[2][64]; static int i = -1; /* To allow 2 simultaneous calls */ i++; i &= 1; if (resrc->type == RESRC_URL) str_n_cpy(tmp1[i], resrc->feed_title, 256); else if (resrc->type == RESRC_FILE) str_n_cpy(tmp1[i], resrc->id, 256); else str_n_cpy(tmp1[i], "No resource", 256); snprintf(tmp2[i], 64, " | %s-%s", APP_NAME, APP_V_NUM); return (const char *)str_n_cat(tmp1[i], tmp2[i], 63); } char *get_feed_extra_info(int rank) { FILE *fp; char *str1, tmp[4]; size_t str1_size = FGETS_STR_MAXLEN; static char *str2 = NULL; int tag_found = FALSE; if (str2 != NULL) l_str_free(str2); str2 = l_str_new(""); if (rank == -1) return str2; if ((fp = g_fopen(resrc->xml_dump_extra, "rb")) != NULL) { str1 = malloc2(str1_size * sizeof(char)); #ifndef G_OS_WIN32 while (getline(&str1, &str1_size, fp) != -1) { #else while (fgets(str1, str1_size, fp) != NULL) { #endif if (str1[0] == ITEM_TITLE_TAG_CHAR || str1[0] == ITEM_DES_TAG_CHAR) { if (tag_found) break; if (rank == atoi(str_n_cpy(tmp, str1 + 1, 3))) { tag_found = TRUE; str2 = l_str_cat(str2, str1 + 4); } } else if (tag_found) str2 = l_str_cat(str2, str1); } free2(str1); fclose(fp); } remove_trailing_whitespaces_from_str(str2); return str2; } static const char *get_ticker_tooltip_text(int rank) { static char *tooltip_text = NULL; if (tooltip_text != NULL) { l_str_free(tooltip_text); tooltip_text = NULL; } if ((prm->item_title == 'y' && prm->item_description == 'n') || (prm->item_title == 'n' && prm->item_description == 'y')) { tooltip_text = l_str_new(get_feed_extra_info(rank)); if (tooltip_text[0] != '\0') tooltip_text = l_str_cat(tooltip_text, "\n\n"); tooltip_text = l_str_cat(tooltip_text, get_win_title_text()); return tooltip_text; } else return get_win_title_text(); } /* Pause ticker when mouse pointer is over (opened) popup menu. */ static int mouse_over_opened_popup_menu(GtkWidget *widget, GdkEvent *event) { widget = widget; if (prm->pause_on_mouseover == 'y') { if (event->type == GDK_EXPOSE) env->suspend_rq = TRUE; else if (event->type == GDK_LEAVE_NOTIFY) env->suspend_rq = FALSE; } return FALSE; } /* Pause ticker on mouseover. */ static int mouse_over_drawing_area(GtkWidget *widget, GdkEvent *event) { int rank; widget = widget; if (event->type == GDK_ENTER_NOTIFY || event->type == GDK_LEAVE_NOTIFY) { if (prm->pause_on_mouseover == 'y') { if (event->type == GDK_ENTER_NOTIFY) env->suspend_rq = TRUE; else env->suspend_rq = FALSE; } if (event->type == GDK_ENTER_NOTIFY) { while (gdk_events_pending()) /* So that "motion-notify-event" is processed now. */ gtk_main_iteration(); rank = get_visible_link_and_rank(env->mouse_x_in_drwa); gtk_widget_set_tooltip_text(widget, get_ticker_tooltip_text(rank)); gtk_tooltip_trigger_tooltip_query(gdk_display_get_default()); return TRUE; } } return FALSE; } static int mouse_wheel_action_on_drawing_area(GtkWidget *widget, GdkEvent *event) { char mouse_wheel_action; widget = widget; if (event->type == GDK_SCROLL) { mouse_wheel_action = prm->mouse_wheel_action; if (event->scroll.state & GDK_CONTROL_MASK) { /* If pressed, invert mouse_wheel_action */ if (mouse_wheel_action == 's') mouse_wheel_action = 'f'; else if (mouse_wheel_action == 'f') mouse_wheel_action = 's'; } if (mouse_wheel_action == 's') { if (event->scroll.direction == GDK_SCROLL_UP) toggle_speed_up_flag(); else if (event->scroll.direction == GDK_SCROLL_DOWN) toggle_slow_down_flag(); env->suspend_rq = FALSE; return TRUE; } else if (mouse_wheel_action == 'f') { if (env->selection_mode == MULTIPLE) { /* Seems buggy if (event->scroll.direction == GDK_SCROLL_UP) next_feed0(); else if (event->scroll.direction == GDK_SCROLL_DOWN) previous_feed0();*/ quick_feed_picker(); env->suspend_rq = FALSE; } else warning(BLOCK, "Single selection mode\n", "(You have set 'Mouse Wheel acts on: Feed')"); return TRUE; } } return FALSE; } /* * Popup menu stuff */ static GtkItemFactoryEntry popup_menu_item[] = { {"/_File", NULL, NULL, 0, "", NULL}, {"/File/Feed Organizer (_RSS|Atom)", "R", manage_list_and_selection0, 0, "", (gconstpointer)RSS_ICON}, {"/File/Open _Text File", "T", open_txt_file0, 0, "", (gconstpointer)GTK_STOCK_OPEN}, {"/File/sep", NULL, NULL, 0, "", NULL}, {"/File/_Import Feed List (OPML)", "I", import_opml_file0, 0, NULL, NULL}, {"/File/_Export Feed List (OPML)", "E", export_opml_file0, 0, NULL, NULL}, {"/File/sep", NULL, NULL, 0, "", NULL}, {"/File/Resource _Properties", "P", show_resource_info0, 0, "", (gconstpointer)GTK_STOCK_PROPERTIES}, {"/File/sep", NULL, NULL, 0, "", NULL}, {"/File/_Quit", "Q", gtk_main_quit, 0, "", (gconstpointer)GTK_STOCK_QUIT}, {"/_Edit", NULL, NULL, 0, "", NULL}, {"/Edit/Preference_s", "S", easily_modify_params0, 0, "", (gconstpointer)GTK_STOCK_PREFERENCES}, {"/Edit/Full Settings", "", modify_params0, 0, "", (gconstpointer)GTK_STOCK_PREFERENCES}, {"/Edit/Connection Settings", "", connection_settings0, 0, "", (gconstpointer)GTK_STOCK_CONNECT}, {"/Edit/sep", NULL, NULL, 0, "", NULL}, {"/Edit/Import Settings", "", import_params0, 0, NULL, NULL}, {"/Edit/Export Settings", "", export_params0, 0, NULL, NULL}, {"/_Control", NULL, NULL, 0, "", NULL}, {"/Control/Open Link in _Browser", "B", open_link0, 0, "", (gconstpointer)GTK_STOCK_JUMP_TO/*GTK_STOCK_REDO*/}, /*{"/Control/_Mark Item", "M", mark_item0, 0, "", (gconstpointer)GTK_STOCK_OK},*/ {"/Control/sep", NULL, NULL, 0, "", NULL}, {"/Control/Play", "J", ticker_play, 0, "", (gconstpointer)GTK_STOCK_MEDIA_PLAY}, {"/Control/Pause", "K", ticker_pause, 0, "", (gconstpointer)GTK_STOCK_MEDIA_PAUSE}, {"/Control/Reload", "L", ticker_reload, 0, "", (gconstpointer)GTK_STOCK_REFRESH}, {"/Control/sep", NULL, NULL, 0, "", NULL}, {"/Control/First Feed", "", first_feed0, 0, "", (gconstpointer)GTK_STOCK_GOTO_FIRST}, {"/Control/Previous Feed", "", previous_feed0, 0, "", (gconstpointer)GTK_STOCK_GO_BACK}, {"/Control/Next Feed", "", next_feed0, 0, "", (gconstpointer)GTK_STOCK_GO_FORWARD}, {"/Control/Last Feed", "", last_feed0, 0, "", (gconstpointer)GTK_STOCK_GOTO_LAST}, {"/Control/sep", NULL, NULL, 0, "", NULL}, {"/Control/Speed Up", "U", toggle_speed_up_flag, 0, "", (gconstpointer)GTK_STOCK_GO_UP}, {"/Control/Speed Down", "D", toggle_slow_down_flag, 0, "", (gconstpointer)GTK_STOCK_GO_DOWN}, {"/_Help", NULL, NULL, 0, "", NULL}, {"/Help/Quick Help", "F1", help_win0, 0, "", (gconstpointer)GTK_STOCK_HELP}, {"/Help/Online Help", "H", online_help0, 0, NULL, NULL}, {"/Help/Check for Updates", "", check_for_updates0, 0, NULL, NULL}, {"/Help/sep", NULL, NULL, 0, "", NULL}, {"/Help/_About", "A", about_win0, 0, "", (gconstpointer)GTK_STOCK_ABOUT}, }; static int n_popup_menu_items = sizeof(popup_menu_item) / sizeof(popup_menu_item[0]); static GtkWidget *get_popup_menu_menu(GtkWidget *win) { GtkItemFactory *item_factory; win = win; popup_menu_accel_group = gtk_accel_group_new(); item_factory = gtk_item_factory_new(GTK_TYPE_MENU, "
", popup_menu_accel_group); gtk_item_factory_create_items(item_factory, n_popup_menu_items, popup_menu_item, NULL); return gtk_item_factory_get_widget(item_factory, "
"); } void check_main_win_always_on_top() { zboolean z = prm->always_on_top == 'y' ? TRUE : FALSE; gtk_window_set_keep_above(GTK_WINDOW(env->win), z); if (GDK_IS_WINDOW(env->win->window)) /* Does this make a difference, at all ? */ gdk_window_set_keep_above(GDK_WINDOW(env->win->window), z); } static int update_win_dims_and_loc() { /* Dimensions */ /* Smallest width set to 1 as 0 will result in some weird on screen square artifact */ gtk_widget_set_size_request(env->drw_a, MAX(env->drwa_width, 1), env->drwa_height); gtk_widget_set_size_request(env->drwa_clock, MAX(env->drwa_clock_width, 1), env->drwa_height); gtk_widget_set_size_request(env->win, 1, 1); gtk_window_resize(GTK_WINDOW(env->win), env->drwa_width + env->drwa_clock_width, env->drwa_height); /* Disabled to fix the flickering-every-500-ms issue on Linux Mint 18 Cinnamon gtk_window_unmaximize(GTK_WINDOW(env->win));*/ /* * === NEW & experimental - Set override_redirect flag, ie bypass window manager === * Where should this go ? */ if (GDK_IS_WINDOW(env->win->window)) gdk_window_set_override_redirect(GDK_WINDOW(env->win->window), prm->override_redirect == 'y' ? TRUE : FALSE); /*gdk_window_set_type_hint(GDK_WINDOW(env->win->window), prm->override_redirect == 'y' ? GDK_WINDOW_TYPE_HINT_DOCK : GDK_WINDOW_TYPE_HINT_NORMAL);*/ /* Location */ gtk_window_move(GTK_WINDOW(env->win), prm->win_x, prm->win_y); return TRUE; } /* Check if win needs to be re-computed because of changed params. */ zboolean win_params_have_been_changed(Params *new_prm, int n_required_runs) { static Params prm_bak0; Params *prm_bak = &prm_bak0; static int initial_runs = 0; zboolean changes = FALSE; if (initial_runs < n_required_runs) { /* 'Fake' params changes are required at program startup */ memcpy((void *)prm_bak, (const void *)new_prm, sizeof(Params)); initial_runs++; return TRUE; } else if (strcmp(new_prm->font_name_size, prm_bak->font_name_size) != 0) changes = TRUE; else if (new_prm->win_x != prm_bak->win_x) changes = TRUE; else if (new_prm->win_y != prm_bak->win_y) changes = TRUE; else if (new_prm->win_w != prm_bak->win_w) changes = TRUE; else if (new_prm->win_h != prm_bak->win_h) changes = TRUE; else if (new_prm->windec != prm_bak->windec) changes = TRUE; else if (new_prm->always_on_top != prm_bak->always_on_top) changes = TRUE; else if (new_prm->win_transparency != prm_bak->win_transparency) changes = TRUE; else if (new_prm->icon_in_taskbar != prm_bak->icon_in_taskbar) changes = TRUE; else if (new_prm->win_sticky != prm_bak->win_sticky) changes = TRUE; else if (new_prm->override_redirect != prm_bak->override_redirect) changes = TRUE; else if (new_prm->clock != prm_bak->clock) changes = TRUE; else if (new_prm->clock_sec != prm_bak->clock_sec) changes = TRUE; else if (new_prm->clock_12h != prm_bak->clock_12h) changes = TRUE; else if (new_prm->clock_date != prm_bak->clock_date) changes = TRUE; else if (strcmp(new_prm->clock_font_name_size, prm_bak->clock_font_name_size) != 0) changes = TRUE; /* Need to ckeck other params ? */ if (changes == TRUE) { memcpy((void *)prm_bak, (const void *)new_prm, sizeof(Params)); return TRUE; } else return FALSE; } /* * Create new or next cairo image surface and compute stuff to redraw window. */ static int compute_surface_and_win() { char font_name[FONT_NAME_MAXLEN + 1], font_size[FONT_SIZE_MAXLEN + 1]; char c_font_name[FONT_NAME_MAXLEN + 1], c_font_size[FONT_SIZE_MAXLEN + 1]; int height1, height2; int size, render_error_code, max_width, i; zboolean new_win_params; /* * The following code needs to be run: * - twice at program startup (ie once after gtk_widget_show_all() has been called) * - whenever some window params have been changed * - not everytime a new feed is loaded */ new_win_params = win_params_have_been_changed(prm, 2); if (new_win_params) { /* * Compute font size from requested height if > 0 */ adjust_font_size_to_rq_height(prm->font_name_size, prm->win_h); /* * Compute clock font size * clock height = ticker height unless clock font size is set * in which case clock height is always <= ticker height */ split_font(prm->clock_font_name_size, c_font_name, c_font_size); if (strcmp(font_name, c_font_name) == 0) { if (atoi(c_font_size) > atoi(font_size)) str_n_cpy(c_font_size, font_size, FONT_SIZE_MAXLEN); } else { height1 = get_layout_height_from_font_name_size(prm->clock_font_name_size); height2 = get_layout_height_from_font_name_size(prm->font_name_size); if (height1 > height2) { size = get_font_size_from_layout_height(height2, c_font_name); snprintf(c_font_size, FONT_SIZE_MAXLEN + 1, "%3d", size); } } compact_font(prm->clock_font_name_size, c_font_name, c_font_size); /* * Compute ticker width */ max_width = prm->disable_screen_limits == 'y' ? WIN_MAX_W : env->screen_w; if (prm->win_w >= DRWA_WIDTH_MIN && prm->win_w <= max_width) env->drwa_width = prm->win_w; else if (prm->win_w < DRWA_WIDTH_MIN) env->drwa_width = DRWA_WIDTH_MIN; else if (prm->win_w > max_width) env->drwa_width = max_width; env->drwa_clock_width = get_clock_width(prm); /* = 0 if no clock, although actual widget width = 1. * See quick hack below. */ env->drwa_width -= env->drwa_clock_width; } /* * Reset link_and_offset stuff */ if(resrc->id[0] == '\0' && resrc->fp != NULL) { fclose(resrc->fp); resrc->fp = NULL; for (i = 0; i < NFEEDLINKANDOFFSETMAX; i++) { resrc->link_and_offset[i].url[0] = '\0'; resrc->link_and_offset[i].offset_in_surface = 0; } if(resrc->fp_extra != NULL) { fclose(resrc->fp_extra); resrc->fp_extra = NULL; } } /* * Create cairo image surface of rendered text (one long single line) */ env->c_surf = render_stream_to_surface(resrc->fp, resrc->link_and_offset, prm, &render_error_code); if (env->c_surf != NULL) { env->surf_width = cairo_image_surface_get_width(env->c_surf); env->surf_height = cairo_image_surface_get_height(env->c_surf); env->drwa_height = (MIN(env->surf_height, env->screen_h)); } else big_error(render_error_code, "render_stream_to_surface(): %s", global_error_str(render_error_code)); /* * Win stuff */ /* Title */ gtk_window_set_title(GTK_WINDOW(env->win), get_win_title_text()); /* * The following code needs to be run: * - twice at program startup (ie once after gtk_widget_show_all() has been called) * - whenever some window params have been changed * - not everytime a new feed is loaded */ if (new_win_params) { gtk_window_set_keep_above(GTK_WINDOW(env->win), FALSE); gtk_window_set_skip_taskbar_hint(GTK_WINDOW(env->win), FALSE); gtk_window_unstick(GTK_WINDOW(env->win)); /* Transparency */ gtk_window_set_opacity(GTK_WINDOW(env->win), prm->win_transparency); /* Decoration */ if (prm->windec == 'y') { gtk_window_set_decorated(GTK_WINDOW(env->win), TRUE); if (!popup_menu_accel_group_attached) { gtk_window_add_accel_group(GTK_WINDOW(env->win), popup_menu_accel_group); popup_menu_accel_group_attached = TRUE; } } else if (prm->windec == 'n') { gtk_window_set_decorated(GTK_WINDOW(env->win), FALSE); if (popup_menu_accel_group_attached) { gtk_window_remove_accel_group(GTK_WINDOW(env->win), popup_menu_accel_group); popup_menu_accel_group_attached = FALSE; } } /* Clock */ if (prm->clock == 'l') gtk_box_reorder_child(GTK_BOX(main_hbox), vbox_clock, 0); else if (prm->clock == 'r') gtk_box_reorder_child(GTK_BOX(main_hbox), vbox_clock, 1); else /* * Quick hack to fix 'remaining 1 pixel wide line when enabling then disabling * left clock' bug, because then vbox_clock/drwa_clock min size is still 1x1 (not 0x0) * and is the first widget packed in main_hbox. * So, when no clock is set, we make sure the 'empty clock widget' is always on * the right side. */ gtk_box_reorder_child(GTK_BOX(main_hbox), vbox_clock, 1); /* Move win */ /*gtk_window_move(GTK_WINDOW(env->win), prm->win_x, prm->win_y);*/ /* Icon in taskbar ? */ gtk_window_set_skip_taskbar_hint(GTK_WINDOW(env->win), (prm->icon_in_taskbar == 'y') ? FALSE : TRUE); /* On all desktops ? */ if (prm->win_sticky == 'y') gtk_window_stick(GTK_WINDOW(env->win)); else if (prm->win_sticky == 'n') gtk_window_unstick(GTK_WINDOW(env->win)); check_main_win_always_on_top(); gtk_window_present(GTK_WINDOW(env->win)); /* * === NEW & experimental - Set override_redirect flag, ie bypass window manager === * Where should this go ? */ if (GDK_IS_WINDOW(env->win->window)) gdk_window_set_override_redirect(GDK_WINDOW(env->win->window), prm->override_redirect == 'y' ? TRUE : FALSE); /*gdk_window_set_type_hint(GDK_WINDOW(env->win->window), prm->override_redirect == 'y' ? GDK_WINDOW_TYPE_HINT_DOCK : GDK_WINDOW_TYPE_HINT_NORMAL);*/ /* Move win */ gtk_window_move(GTK_WINDOW(env->win), prm->win_x, prm->win_y); } while (gtk_events_pending()) gtk_main_iteration(); return render_error_code; } /* * Timeout handler to render one part of cairo image surface onto drawing * area - image is shifted to left by pixels. * * Handler 'listens' to flags: suspend_rq, reload_rq, compute_rq and * feed_fully_rendered. * * Notes: * - reload_rq may be a misleading name as, in multiple selection mode, * we will load next stream, not reload the same one. * * - feed_fully_rendered is (or should be) only relevant in multiple selection * mode because there is no need to reload each time in single selection mode. * * - If reverse scrolling param set, actually shift to right. */ static int shift2left_callback() { cairo_t *cr; GdkRectangle r; char tmp[256]; int i; if (env->suspend_rq) return TRUE; /* Does nothing - just return */ else if ((env->shift_counter * prm->shift_size < env->surf_width - env->drwa_width) && !env->reload_rq && !env->compute_rq) { env->suspend_rq = TRUE; /* * Draw onto ticker area * (We now use cairo instead of deprecated gdk_draw_ stuff.) */ /* Checking first can't hurt */ if (env->c_surf == NULL) big_error(SHIFT2LEFT_NULL_CAIRO_IMAGE_SURFACE, "%s(): cairo image surface = NULL", __func__); /* Double buffering disabled for drawing area so we need this */ r.x = 0; r.y = 0; r.width = env->drwa_width; r.height = env->drwa_height; gdk_window_begin_paint_rect(env->drw_a->window, &r); /* Cairo stuff */ cr = gdk_cairo_create(GDK_DRAWABLE(env->drw_a->window)); /* cairo_set_source_(): dest_x - src_x, dest_y - src_y */ if (STANDARD_SCROLLING) cairo_set_source_surface(cr, env->c_surf, - (env->shift_counter++ * prm->shift_size), 0); else cairo_set_source_surface(cr, env->c_surf, - env->surf_width + env->drwa_width + (env->shift_counter++ * prm->shift_size), 0); /* cairo_rectangle(): dest_x, dest_y, src_w, src_h */ cairo_rectangle(cr, 0, 0, env->drwa_width, env->drwa_height); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_fill(cr); cairo_destroy(cr); /* We're done */ gdk_window_end_paint(env->drw_a->window); env->suspend_rq = FALSE; /* * Speeding up / slowing down on the fly */ if (speed_up_flag == TRUE || slow_down_flag == TRUE) { if (speed_up_flag == TRUE) { speed_up_flag = FALSE; if (prm->delay > 1) prm->delay--; else return TRUE; } else if (slow_down_flag == TRUE) { slow_down_flag = FALSE; if (prm->delay < 50) prm->delay++; else return TRUE; } g_timeout_add_full(G_PRIORITY_DEFAULT, prm->delay, shift2left_callback, NULL, NULL); return FALSE; } else return TRUE; } else { /* * When cairo_image surface scrolling completed or if request to * reload or recompute everything, will create new surface or use next one. */ env->suspend_rq = TRUE; if (env->c_surf != NULL) { cairo_surface_destroy(env->c_surf); env->c_surf = NULL; } i = OK; if (env->feed_fully_rendered || env->reload_rq) { if (env->selection_mode == SINGLE) { if ((i = load_resource_from_selection(resrc, NULL)) != OK) { if (RESOURCE_ERROR_SSM_QUIT) { warning(BLOCK, "load_resource_from_selection() error: %s\n\n", "Will quit now (program was compiled with RESOURCE_ERROR_SSM_QUIT " "set to TRUE)", global_error_str(i)); quit_with_cli_info(i); } /* * Nothing more to do here as render_stream_to_surface() will handle * rescr->fp = NULL. */ } } else while ((i = load_resource_from_selection(resrc, feed_selection)) != OK) { if (env->selection_mode == MULTIPLE && i == CONNECT_TOO_MANY_ERRORS) { if (get_params()->disable_popups == 'n') { snprintf(tmp, 256, "\nFailed to connect %d times in a row.\n\n" "Please check your internet connection and/or " "your connection settings.\n\n" "Switch to single selection mode ?\n", CONNECT_FAIL_MAX); if (question_win(tmp, -1) == YES) { env->selection_mode = SINGLE; break; } } else { fprintf(STD_ERR, "Failed to connect %d times in a row\n" "Please check your internet connection and/or " "your connection settings\n", CONNECT_FAIL_MAX); if (gtk_events_pending()) { if (gtk_main_iteration_do(FALSE)) break; } else #ifndef G_OS_WIN32 sleep(CONNECT_FAIL_TIMEOUT); #else Sleep(CONNECT_FAIL_TIMEOUT * 1000); #endif } } } check_time_load_resource_from_selection(TIME_RESET); } compute_surface_and_win(); env->shift_counter = prm->shift_size; /* To avoid displaying twice the same thing */ g_timeout_add_full(G_PRIORITY_DEFAULT, prm->delay, shift2left_callback, NULL, NULL); env->reload_rq = FALSE; env->compute_rq = FALSE; env->suspend_rq = FALSE; return FALSE; } } static int display_time0() { display_time(prm); return TRUE; } static int get_win_position() /* Only if win is 'draggable' */ { if (prm->windec == 'y') gtk_window_get_position(GTK_WINDOW(env->win), &prm->win_x, &prm->win_y); return TRUE; } /* * Called every second. Reload stuff every rss_ttl * 60> seconds * but if prm->rss_refresh is set to 0. */ static void check_time_load_resource_from_selection(check_time_mode mode) { static unsigned long elapsed_time_in_sec; if (mode == TIME_RESET) { elapsed_time_in_sec = 0; if (resrc->type == RESRC_FILE) resrc->rss_ttl = prm->rss_refresh; } else if (mode == TIME_CHECK) { if (prm->rss_refresh == 0) { elapsed_time_in_sec = 0; return; } else if ((++elapsed_time_in_sec) / 60 >= (unsigned long)resrc->rss_ttl) { elapsed_time_in_sec = 0; env->reload_rq = TRUE; } } } static int check_time_load_resource_from_selection0() { check_time_load_resource_from_selection(TIME_CHECK); return TRUE; } static void print_help() { int i; for (i = 0; get_help_str1()[i] != NULL; i++) fprintf(STD_OUT, "%s", get_help_str1()[i]); fprintf(STD_OUT, "\n"); } static void print_version() { fprintf(STD_OUT, APP_NAME " version " APP_V_NUM "\n"); } static void print_license() { int i; for (i = 0; get_license_str1()[i] != NULL; i++) fprintf(STD_OUT, "%s", get_license_str1()[i]); fprintf(STD_OUT, "%s\n", get_license_str2()); } /* * Show up if no config file found */ static void welcome_at_first_run() { if (!g_file_test(get_datafile_full_name_from_name(CONFIG_FILE), G_FILE_TEST_EXISTS) && !no_ui) { /* Useless and boring so disabled - quick_setup(prm);*/ info_win("Welcome !", " === Welcome to " APP_NAME " v" APP_V_NUM " ! ===\n\n" "- To open the main menu, right-click inside " APP_NAME " area.\n\n" "- You can import feed subscriptions with 'File > Import Feed List (OPML)',\n" " for instance your Google Reader subscriptions.\n\n" "- To add a new feed, open 'File > Feed Organizer (RSS/Atom)', then look\n" " for 'New Feed -> Enter URL' at the bottom of the window, click 'Clear'\n" " and type or paste the feed URL.\n\n" "- To open a link in your browser, left-click on text.\n\n" "- Basically, use 'File > Feed Organizer (RSS|Atom)' to manage your feed\n" " list, select feeds, subscribe to new ones, and 'Edit > Preferences' to\n" " tweak " APP_NAME " appearance and behaviour.", INFO, FALSE); save_to_config_file(prm); /* Save config to file so that this win will not appear again */ } } /* * Recompute pixmap (from strings array, from opened stream), in order to * update all display params as soon as scrolling has started. */ static void update_pixmap_from_opened_stream() { zboolean suspend_rq_bak = env->suspend_rq; env->suspend_rq = TRUE; env->feed_fully_rendered = TRUE; compute_surface_and_win(); env->shift_counter = 0; env->suspend_rq = suspend_rq_bak; } static int do_at_startup() { if (env->shift_counter > 4) { /* Hmmm */ env->suspend_rq = TRUE; update_pixmap_from_opened_stream(); env->shift_counter = 0; env->suspend_rq = FALSE; return FALSE; } else return TRUE; } #ifdef G_OS_WIN32 /* This is meant to be used with the new GTK/GLib-win32 runtime. */ static int init_win32_mmtimer() { TIMECAPS tc; unsigned int highest_res; timeGetDevCaps(&tc, sizeof(TIMECAPS)); highest_res = tc.wPeriodMin; if (timeBeginPeriod(highest_res) == TIMERR_NOERROR) return 0; else { INFO_ERR("init_win32_mmtimer() error") return -1; } } /* Swap win32 log files every hour to prevent generating huge ones. */ static int swap_win32_logfiles() { static unsigned long elapsed_time_in_sec = 0; static int counter = 0; int suspend_rq_bak; time_t time2 = time(NULL); if ((++elapsed_time_in_sec) >= (unsigned long)3600) { elapsed_time_in_sec = 0; counter++; counter &= 1; suspend_rq_bak = env->suspend_rq; env->suspend_rq = TRUE; if (STD_OUT != NULL) { if (fclose(STD_OUT) != 0) big_error(WIN32V_ERROR, "Can't close STD_OUT: %s", strerror(errno)); STD_OUT = NULL; } if (STD_ERR != NULL) { if (fclose(STD_ERR) != 0) big_error(WIN32V_ERROR, "Can't close STD_ERR: %s", strerror(errno)); STD_ERR = NULL; } if (counter == 0) { STD_OUT = open_new_datafile_with_name(STDOUT_FILENAME1, "wb"); STD_ERR = open_new_datafile_with_name(STDERR_FILENAME1, "wb"); } else { STD_OUT = open_new_datafile_with_name(STDOUT_FILENAME2, "wb"); STD_ERR = open_new_datafile_with_name(STDERR_FILENAME2, "wb"); } fprintf(STD_OUT, "%s", ctime(&time2)); fprintf(STD_ERR, "%s", ctime(&time2)); env->suspend_rq = suspend_rq_bak; } return TRUE; } #endif /* TODO: is this still needed ? */ /* * Question at program start-up about new feed list format conversion: * if version >= 0.6.2 and feed list exists and feed list backup doesn't * exist, create backup and convert to new format. */ #define URL_LIST_BAK_FILE URL_LIST_FILE "-bak" static void test_convert_local_feed_list() { FILE *fp1, *fp2; char *str; size_t str_size = FGETS_STR_MAXLEN; if (strncmp(APP_V_NUM, "0.6.2", 5) >= 0) if (g_file_test(get_datafile_full_name_from_name(URL_LIST_FILE), G_FILE_TEST_EXISTS) &&\ !g_file_test(get_datafile_full_name_from_name(URL_LIST_BAK_FILE), G_FILE_TEST_EXISTS)) /* Now done automatically */ /*if (question_win(APP_NAME " version 0.6.2 or later uses a new feed list format internally.\n" "Do you wish your local feed list to be checked and eventually converted ?\n" "(Doing this once is recommended.)", YES) == YES)*/ { fp1 = open_new_datafile_with_name(URL_LIST_FILE, "rb"); fp2 = open_new_datafile_with_name(URL_LIST_BAK_FILE, "wb"); str = malloc2(str_size * sizeof(char)); #ifndef G_OS_WIN32 while (getline(&str, &str_size, fp1) != -1) #else while (fgets(str, str_size, fp1) != NULL) #endif fprintf(fp2, "%s", str); fclose(fp1); fclose(fp2); fp1 = open_new_datafile_with_name(URL_LIST_FILE, "wb"); fp2 = open_new_datafile_with_name(URL_LIST_BAK_FILE, "rb"); #ifndef G_OS_WIN32 while (getline(&str, &str_size, fp2) != -1) #else while (fgets(str, str_size, fp2) != NULL) #endif if (strncmp(str + 1, "http", 4) == 0 || strncmp(str + 1, "file", 4) == 0) fprintf(fp1, "%c %s", str[0], str + 1); else fprintf(fp1, "%s", str); free2(str); fclose(fp1); fclose(fp2); } } void free_all() { if (get_ticker_env() != NULL) { if (GTK_IS_WIDGET(env->win)) gtk_widget_destroy(env->win); if (GTK_IS_WIDGET(popup_menu)) gtk_widget_destroy(popup_menu); } #ifdef G_OS_WIN32 libetm_cleanup_win32_sockets(); #endif xmlCleanupParser(); gnutls_global_deinit(); if (get_resource() != NULL) { if (get_resource()->fp != NULL) fclose(get_resource()->fp); if (get_resource()->fp_extra != NULL) fclose(get_resource()->fp_extra); } free_all_render_strings_in_array(); if (IS_FLIST(get_feed_list())) f_list_free_all(get_feed_list()); if (IS_FLIST(get_feed_selection())) f_list_free_all(get_feed_selection()); if (get_ticker_env() != NULL) free2(get_ticker_env()); if (get_resource() != NULL) free2(get_resource()); if (get_params() != NULL) free2(get_params()); } void quit_with_cli_info(tickr_error_code error_code) { free_all(); fprintf(STD_ERR, "Try '" APP_CMD " --help' for more info\n"); exit(error_code); } #ifndef G_OS_WIN32 void segfault_sig_handler(int sig_num, siginfo_t *sig_info, void *context) { sig_info = sig_info; context = context; if (sig_num == SIGSEGV) big_error(SEGFAULT, global_error_str(SEGFAULT)); } #endif int main(int argc, char *argv[]) { GdkPixbuf *pixb = NULL; GtkIconFactory *icon_factory = NULL; GError *error = NULL; #ifndef G_OS_WIN32 GdkColormap *colormap = NULL; struct sigaction action; #else time_t time2; #endif int n_options, n_resources, i, j; LIBXML_TEST_VERSION #ifndef LIBXML_TREE_ENABLED # error "Libxml2: tree support not compiled in" #endif #if GNUTLS_VERSION_NUMBER < REQUIRED_GNUTLS_V_NUM # error "GnuTLS version 3.1.9 is required to compile" #endif gtk_init(&argc, &argv); #ifndef G_OS_WIN32 /* * segfault handling */ memset(&action, 0, sizeof(action)); action.sa_sigaction = &segfault_sig_handler; action.sa_flags = SA_SIGINFO; if (sigaction(SIGSEGV, &action, NULL) != 0) INFO_ERR("sigaction() error: %s\n", strerror(errno)) #endif /* * Init env, rescr, prm */ env = malloc2(sizeof(TickerEnv)); resrc = malloc2(sizeof(Resource)); prm = malloc2(sizeof(Params)); env->win = env->drw_a = env->drwa_clock = NULL; env->c_surf = NULL, env->screen = NULL; env->visual = NULL; env->screen_w = env->screen_h = env->depth = 0; env->drwa_width = env->drwa_clock_width = env->drwa_height = 0; env->surf_width = env->surf_height = 0; env->shift_counter = 0; env->active_link[0] = '\0'; env->mouse_x_in_drwa = -1; env->suspend_rq = env->compute_rq = env->reload_rq = FALSE; env->feed_fully_rendered = TRUE; /* * env->selection_mode: default = MULTIPLE, set to SINGLE internally if * selection is unavalaible/empty or after picking a single resource. */ env->selection_mode = MULTIPLE; /* * Top level window */ env->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(env->win), APP_NAME "-" APP_V_NUM); gtk_container_set_border_width(GTK_CONTAINER(env->win), 0); g_signal_connect(G_OBJECT(env->win), "delete_event", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(env->win), "destroy", G_CALLBACK(gtk_widget_destroy), &(env->win)); #ifdef G_OS_WIN32 if (get_progfiles_dir() == NULL) big_error(WIN32V_ERROR, "Can't find Program Files directory"); else if (get_appdata_dir() == NULL) big_error(WIN32V_ERROR, "Can't find Application Data directory"); else if (init_win32_mmtimer() != 0) if (question_win("Can't initialize win32 multimedia timer. " "Scrolling may be very slow. Continue ?", -1) == NO) { free_all(); exit(WIN32V_ERROR); } #endif /* * Create dir in user home dir if it doesn't exist. */ g_mkdir(get_datadir_full_path(), S_IRWXU); #ifdef G_OS_WIN32 /* * Create win32 logfiles. */ libetm_init_win32_stdout_stderr( open_new_datafile_with_name(STDOUT_FILENAME1, "wb"), open_new_datafile_with_name(STDERR_FILENAME1, "wb")); /* Now, STD_OUT/ERR are initialized. */ time2 = time(NULL); fprintf(STD_OUT, "%s", ctime(&time2)); fprintf(STD_ERR, "%s", ctime(&time2)); libetm_init_win32_sockets(STD_OUT, STD_ERR); #endif xmlInitParser(); /* * Test HTTPS support */ env->https_support = FALSE; if ((i = gnutls_global_init()) != GNUTLS_E_SUCCESS) INFO_ERR("GnuTLS error: %s\n", gnutls_strerror(i)) else if (gnutls_check_version(REQUIRED_GNUTLS_V_NUM_STR) == NULL) INFO_OUT("Can't enable HTTPS support (GnuTLS required version is %s " "but installed version is %s)\n" , REQUIRED_GNUTLS_V_NUM_STR, gnutls_check_version(NULL)) else env->https_support = TRUE; init_render_string_array(); /* * Show help, version, license, dump misc info, set instance id, or run with no-ui. */ if (argc >= 2 && (strcmp(argv[1], "-help") == 0 || strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "-?") == 0)) { print_help(); free_all(); return 0; } else if (argc >= 2 && (strcmp(argv[1], "-version") == 0 || strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-v") == 0)) { print_version(); free_all(); return 0; } else if (argc >= 2 && (strcmp(argv[1], "-license") == 0 || strcmp(argv[1], "--license") == 0 || strcmp(argv[1], "-l") == 0)) { print_license(); free_all(); return 0; } else if (argc >= 2 && (strcmp(argv[1], "-dumpfontlist") == 0 || strcmp(argv[1], "--dumpfontlist") == 0)) { dump_font_list(); free_all(); return 0; } else if (argc >= 2 && (strcmp(argv[1], "-dumpconfig") == 0 || strcmp(argv[1], "--dumpconfig") == 0)) { dump_config(); free_all(); return 0; } else if (argc >= 2 && (strcmp(argv[1], "-dumperrorcodes") == 0 || strcmp(argv[1], "--dumperrorcodes") == 0)) { dump_error_codes(); free_all(); return 0; } /* instance-id must be the 1st arg to be effective */ if (argc >= 2 && strncmp(argv[1], "-instance-id=", strlen("-instance-id=")) == 0) { if ((instance_id = atoi(argv[1] + strlen("-instance-id="))) < 1 || instance_id > 99) { INFO_ERR("Instance ID invalid value: %d\n", instance_id) instance_id = 0; } } /* We want "--instance-id=" to be valid too */ if (argc >= 2 && strncmp(argv[1], "--instance-id=", strlen("--instance-id=")) == 0) { if ((instance_id = atoi(argv[1] + strlen("--instance-id="))) < 1 || instance_id > 99) { INFO_ERR("Instance ID invalid value: %d\n", instance_id) instance_id = 0; } } /* no-ui must be the 1st or 2nd arg to be effective */ if ((argc >= 2 && strncmp(argv[1], "-no-ui", strlen("-no-ui")) == 0) || (argc >= 3 && strncmp(argv[2], "-no-ui", strlen("-no-ui")) == 0)) no_ui = TRUE; /* We want "--no-ui" to be valid too */ if ((argc >= 2 && strncmp(argv[1], "--no-ui", strlen("--no-ui")) == 0) || (argc >= 3 && strncmp(argv[2], "--no-ui", strlen("--no-ui")) == 0)) no_ui = TRUE; set_tickr_icon_to_dialog(GTK_WINDOW(env->win)); /* * Create rss icon */ pixb = gdk_pixbuf_new_from_file(get_imagefile_full_name_from_name(RSS_ICON), &error); icon_factory = gtk_icon_factory_new(); gtk_icon_factory_add(icon_factory, RSS_ICON, gtk_icon_set_new_from_pixbuf(pixb)); gtk_icon_factory_add_default(icon_factory); if (pixb != NULL) g_object_unref(pixb); /* * Get some system graphical info */ env->screen = gtk_widget_get_screen(env->win); #ifndef G_OS_WIN32 if ((colormap = gdk_screen_get_rgba_colormap(env->screen)) != NULL) { #ifdef VERBOSE_OUTPUT if (gdk_screen_is_composited(env->screen)) INFO_OUT("Composited GDK screen\n") #endif } else colormap = gdk_screen_get_rgb_colormap(env->screen); gtk_widget_set_colormap(env->win, colormap); env->visual = gdk_colormap_get_visual(colormap); #else env->visual = gdk_visual_get_best(); #endif env->depth = env->visual->depth; env->screen_w = gdk_screen_get_width(gtk_window_get_screen(GTK_WINDOW(env->win))); env->screen_h = gdk_screen_get_height(gtk_window_get_screen(GTK_WINDOW(env->win))); #ifdef VERBOSE_OUTPUT INFO_OUT("GDK visual: screen width = %d, screen height = %d, depth = %d\n", env->screen_w, env->screen_h, env->depth) #ifndef G_OS_WIN32 INFO_OUT("Window manager: %s\n", gdk_x11_screen_get_window_manager_name(env->screen)) #endif #endif resrc->type = RESRC_UNSPECIFIED; resrc->format = RSS_FORMAT_UNDETERMINED; resrc->id[0] = '\0'; resrc->orig_url[0] = '\0'; resrc->xml_dump[0] = '\0'; resrc->fp = NULL; resrc->fp_extra = NULL; for (i = 0; i < NFEEDLINKANDOFFSETMAX; i++) { resrc->link_and_offset[i].url[0] = '\0'; resrc->link_and_offset[i].offset_in_surface = 0; } init_authentication(); init_proxy(); /* * Options and resource stuff */ set_default_options(prm); /* Init all params */ if (g_file_test(get_datafile_full_name_from_name(CONFIG_FILE), G_FILE_TEST_EXISTS)) get_config_file_options(prm); else welcome_at_first_run(); n_options = 0; n_resources = 0; if (argc > 1) { /* Parse args: first -options, then resource - the rest is ignored. */ for (i = 1; i < argc; i++) if (argv[i][0] == '-') n_options ++; else break; if (i < argc) n_resources++; if (n_resources == 0) { INFO_OUT("%s\n", global_error_str(NO_RESOURCE_SPECIFIED)) if (RESOURCE_ERROR_SSM_QUIT) { INFO_ERR("Exiting (program was compiled with " "RESOURCE_ERROR_SSM_QUIT set to TRUE)\n") quit_with_cli_info(NO_RESOURCE_SPECIFIED); } } else { env->selection_mode = SINGLE; /* Will get rss feed or open text file */ str_n_cpy(resrc->id, argv[n_options + 1], FILE_NAME_MAXLEN); } if (n_options > 0) if ((i = parse_options_array(prm, n_options, (const char **)(argv + 1)) != OK)) if (OPTION_ERROR_QUIT) { INFO_ERR("Exiting (program was compiled with " "OPTION_ERROR_QUIT set to TRUE)\n") quit_with_cli_info(i); } } else { INFO_OUT("%s\n", global_error_str(NO_RESOURCE_SPECIFIED)) if (RESOURCE_ERROR_SSM_QUIT) { INFO_ERR("Exiting (program was compiled with " "RESOURCE_ERROR_SSM_QUIT set to TRUE)\n") quit_with_cli_info(NO_RESOURCE_SPECIFIED); } } /* Apply connection settings */ compute_auth_and_proxy_str(); set_connect_timeout_sec(prm->connect_timeout); set_send_recv_timeout_sec(prm->send_recv_timeout); #ifdef VERBOSE_OUTPUT /* Here so to be able to check the disablepopups option */ if (no_ui) warning(BLOCK, "%s will run with the 'no-ui' option.\n" "Opening of UI elements which can modify settings and/or \n" "URL list/selection is disabled.", APP_NAME); #endif /* * Feed list stuff */ test_convert_local_feed_list(); /* Still needed ? Probably not but just in case */ if ((i = f_list_load_from_file(&feed_list, NULL)) == OK) { feed_list = f_list_sort(feed_list); feed_list = f_list_first(feed_list); f_list_save_to_file(feed_list, NULL); } else if (i == LOAD_URL_LIST_NO_LIST) { if (question_win("No URL list has been saved yet. Import one (OPML format required) ?", -1) == YES) { if ((i = import_opml_file()) == OK) manage_list_and_selection(resrc); } else if (question_win("No URL list has been saved yet. Use sample one ?", -1) == YES) { if ((i = f_list_load_from_file(&feed_list, get_sample_url_list_full_name())) == OK) { feed_list = f_list_sort(feed_list); feed_list = f_list_first(feed_list); f_list_save_to_file(feed_list, NULL); manage_list_and_selection(resrc); } } } j = build_feed_selection_from_feed_list(); if (n_resources == 0 && env->selection_mode == MULTIPLE && i == OK && j == OK) INFO_OUT("Will use feed selection\n") else { if (env->selection_mode == MULTIPLE && (i != OK || j != OK)) { if (j == SELECTION_EMPTY) warning(NO_BLOCK, "No feed selected - " "Switching to single selection mode"); else if (j == SELECTION_ERROR) warning(NO_BLOCK, "No feed selection available - " "Switching to single selection mode"); } env->selection_mode = SINGLE; if (n_resources == 0) { if (prm->homefeed[0] != '\0') { str_n_cpy(resrc->id, prm->homefeed, FILE_NAME_MAXLEN); INFO_OUT("Will use default resource (Homefeed): %s\n", resrc->id) } else { INFO_ERR("No default resource available\n") if (RESOURCE_ERROR_SSM_QUIT) { INFO_ERR("Exiting (program was compiled with " "RESOURCE_ERROR_SSM_QUIT set to TRUE)\n") quit_with_cli_info(NO_RESOURCE_SPECIFIED); } } } } if ((i = load_resource_from_selection(resrc, feed_selection)) != OK) if (RESOURCE_ERROR_SSM_QUIT) { INFO_ERR("Exiting (program was compiled with " "RESOURCE_ERROR_SSM_QUIT set to TRUE)\n") quit_with_cli_info(i); } /* ... to here */ resrc->rss_ttl = prm->rss_refresh; first_feed(); /* * Set window layout */ main_hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(env->win), main_hbox); popup_menu = get_popup_menu_menu(NULL); popup_menu_accel_group_attached = FALSE; /* * Create 2 drawing areas */ env->drw_a = gtk_drawing_area_new(); /* * We disable double buffering for drawing area and will use * gdk_window_begin_paint_rect() and gdk_window_end_paint(). */ gtk_widget_set_double_buffered(env->drw_a, FALSE); env->drwa_clock = gtk_drawing_area_new(); gtk_widget_add_events(env->drw_a, GDK_ALL_EVENTS_MASK); /* Change mask ? */ g_signal_connect(G_OBJECT(env->drw_a), "button-press-event", G_CALLBACK(left_click_on_drawing_area), NULL); g_signal_connect(G_OBJECT(env->drw_a), "button-press-event", G_CALLBACK(right_click_on_drawing_area), NULL); g_signal_connect(G_OBJECT(env->drw_a), "enter-notify-event", G_CALLBACK(mouse_over_drawing_area), NULL); g_signal_connect(G_OBJECT(env->drw_a), "leave-notify-event", G_CALLBACK(mouse_over_drawing_area), NULL); g_signal_connect(G_OBJECT(popup_menu), "expose-event", G_CALLBACK(mouse_over_opened_popup_menu), NULL); g_signal_connect(G_OBJECT(popup_menu), "leave-notify-event", G_CALLBACK(mouse_over_opened_popup_menu), NULL); g_signal_connect(G_OBJECT(env->drw_a), "scroll-event", G_CALLBACK(mouse_wheel_action_on_drawing_area), NULL); g_signal_connect(G_OBJECT(env->drw_a), "motion-notify-event", G_CALLBACK(track_mouse_position_x), NULL); vbox_ticker = gtk_vbox_new(FALSE, 0); /* vbox_ticker is only used to have a v-centered ticker */ gtk_box_pack_start(GTK_BOX(vbox_ticker), GTK_WIDGET(env->drw_a), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(main_hbox), vbox_ticker, FALSE, FALSE, 0); vbox_clock = gtk_vbox_new(FALSE, 0); /* vbox_clock is only used to have a v-centered clock */ gtk_box_pack_start(GTK_BOX(vbox_clock), GTK_WIDGET(env->drwa_clock), TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(main_hbox), vbox_clock, FALSE, FALSE, 0); /* * Create cairo image surface from text file or rss feed and compute stuff to draw window. */ compute_surface_and_win(); /* === Timeout callbacks === */ /* * Refresh the image every milliseconds. */ g_timeout_add_full(G_PRIORITY_DEFAULT, prm->delay, shift2left_callback, NULL, NULL); /* * Display clock every 0.5 seconds. */ g_timeout_add_full(G_PRIORITY_DEFAULT, 500, display_time0, NULL, NULL); /* * Get current win position (if 'dragged') every 0.5 seconds. */ g_timeout_add_full(G_PRIORITY_DEFAULT, 500, get_win_position, NULL, NULL); /* * Check every sec until elapsed time in mn > rss_ttl> mn then reload rss feed (or text file). */ check_time_load_resource_from_selection(TIME_RESET); g_timeout_add_full(G_PRIORITY_DEFAULT, 1000, check_time_load_resource_from_selection0, NULL, NULL); /* * Regularly update Tickr window dims and location */ g_timeout_add_full(G_PRIORITY_DEFAULT, 500, update_win_dims_and_loc, NULL, NULL); /* * Called at program startup only */ g_timeout_add_full(G_PRIORITY_DEFAULT, 100, do_at_startup, NULL, NULL); /* * Check every sec until elapsed time >= 1 hour then swap win32 log files to prevent generating huge ones. */ #ifdef G_OS_WIN32 g_timeout_add_full(G_PRIORITY_DEFAULT, 1000, swap_win32_logfiles, NULL, NULL); #endif env->suspend_rq = FALSE; env->compute_rq = FALSE; env->reload_rq = TRUE; gtk_widget_show_all(env->win); /* To get rid of starting 'ghost' square win - but is it effective ? */ gtk_widget_set_size_request(env->win, 1, 1); gtk_window_resize(GTK_WINDOW(env->win), 1, 1); gtk_main(); /* * Cleanup stuff */ free_all(); return 0; } tickr_0.7.1.orig/src/tickr/.deps/0000744000175000017500000000000014107736721016162 5ustar manutmmanutmtickr_0.7.1.orig/src/tickr/tickr_feedpicker.c0000644000175000017500000005537314107736721020631 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" #define URL_ENTRY_LENGTH 100 #define RANK_ENTRY_LENGTH FLIST_RANK_STR_LEN enum {COLUMN_INT, COLUMN_BOOLEAN_CHECKED, COLUMN_STRING_RANK, COLUMN_STRING_TITLE, COLUMN_STRING_URL, N_COLUMNS}; static GtkWidget *dialog, *url_entry, *rank_entry; static FList *flist; static int f_index; /* Starting at 0 (row starts at 1) */ static char home_feed[FILE_NAME_MAXLEN + 1]; /* Tree selection callback - update f_index and copy selected URL to url_entry (override) */ static int tree_selection_changed(GtkTreeSelection *selection) { GtkTreeModel *tree_model = NULL; GtkTreeIter iter; char *url_str, *rank_str; if (gtk_tree_selection_get_selected(selection, &tree_model, &iter)) { gtk_tree_model_get(tree_model, &iter, COLUMN_INT, &f_index, COLUMN_STRING_URL, &url_str, COLUMN_STRING_RANK, &rank_str, -1); gtk_entry_set_text(GTK_ENTRY(url_entry), url_str); if (get_params()->enable_feed_ordering == 'y') gtk_entry_set_text(GTK_ENTRY(rank_entry), itoa2(atoi(rank_str))); if (IS_FLIST(flist)) { if ((f_index = f_list_search(flist, url_str)) > -1) flist = f_list_nth(flist, f_index + 1); } g_free(url_str); g_free(rank_str); } return TRUE; } /* Catch double-click on tree view */ static int double_click_on_tree_view(GtkTreeView *tree_view, GtkTreePath *tree_path) { GtkTreeModel *tree_model = NULL; GtkTreeIter iter; char *url_str, *rank_str; tree_model = gtk_tree_view_get_model(tree_view); if (gtk_tree_model_get_iter(tree_model, &iter, tree_path)) { gtk_tree_model_get(tree_model, &iter, COLUMN_INT, &f_index, COLUMN_STRING_URL, &url_str, COLUMN_STRING_RANK, &rank_str, -1); gtk_entry_set_text(GTK_ENTRY(url_entry), url_str); if (get_params()->enable_feed_ordering == 'y') gtk_entry_set_text(GTK_ENTRY(rank_entry), rank_str); if (IS_FLIST(flist)) { if ((f_index = f_list_search(flist, url_str)) > -1) flist = f_list_nth(flist, f_index + 1); } g_free(url_str); g_free(rank_str); } gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_SINGLE); return TRUE; } static int enter_key_pressed_in_entry(GtkWidget *widget) { widget = widget; gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_ADD_UPD); return TRUE; } static int clear_entry(GtkWidget *widget) { widget = widget; gtk_entry_set_text(GTK_ENTRY(url_entry), ""); if (get_params()->enable_feed_ordering == 'y') gtk_entry_set_text(GTK_ENTRY(rank_entry), ""); gtk_widget_grab_focus(GTK_WIDGET(url_entry)); return TRUE; } static int checkbox_toggled(GtkCellRendererToggle *renderer, char *path_str, gpointer tree_view) { GtkTreeModel *tree_model; GtkTreeIter iter; FList *flist2; gboolean checked; renderer = renderer; tree_model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view)); if (gtk_tree_model_get_iter_from_string(tree_model, &iter, path_str)) { gtk_tree_model_get(tree_model, &iter, COLUMN_INT, &f_index, COLUMN_BOOLEAN_CHECKED, &checked, -1); checked = !checked; gtk_list_store_set(GTK_LIST_STORE(tree_model), &iter, COLUMN_BOOLEAN_CHECKED, checked, -1); if (IS_FLIST(flist)) { flist2 = f_list_nth(flist, f_index + 1); if (IS_FLIST(flist2)) flist2->selected = checked; } } return TRUE; } static void select_all(GtkTreeView *tree_view) { GtkTreeModel *tree_model; GtkTreeIter iter; FList *flist2; tree_model = gtk_tree_view_get_model(tree_view); if (gtk_tree_model_get_iter_first(tree_model, &iter)) { do { gtk_list_store_set(GTK_LIST_STORE(tree_model), &iter, COLUMN_BOOLEAN_CHECKED, TRUE, -1); } while (gtk_tree_model_iter_next(tree_model, &iter)); if (IS_FLIST(flist)) { for (flist2 = f_list_first(flist); IS_FLIST(flist2); flist2 = flist2->next) flist2->selected = TRUE; } } } static void unselect_all(GtkTreeView *tree_view) { GtkTreeModel *tree_model; GtkTreeIter iter; FList *flist2; tree_model = gtk_tree_view_get_model(tree_view); if (gtk_tree_model_get_iter_first(tree_model, &iter)) { do { gtk_list_store_set(GTK_LIST_STORE(tree_model), &iter, COLUMN_BOOLEAN_CHECKED, FALSE, -1); } while (gtk_tree_model_iter_next(tree_model, &iter)); if (IS_FLIST(flist)) { for (flist2 = f_list_first(flist); IS_FLIST(flist2); flist2 = flist2->next) flist2->selected = FALSE; } } } static void clear_ranking(GtkTreeView *tree_view) { GtkTreeModel *tree_model; GtkTreeIter iter; FList *flist2; char rank[FLIST_RANK_STR_LEN + 1]; tree_model = gtk_tree_view_get_model(tree_view); str_n_cpy(rank, BLANK_STR_16, FLIST_RANK_STR_LEN); /*snprintf(rank, FLIST_RANK_STR_LEN + 1, FLIST_RANK_FORMAT, 0);*/ if (gtk_tree_model_get_iter_first(tree_model, &iter)) { do { gtk_list_store_set(GTK_LIST_STORE(tree_model), &iter, COLUMN_STRING_RANK, rank, -1); } while (gtk_tree_model_iter_next(tree_model, &iter)); if (IS_FLIST(flist)) { for (flist2 = f_list_first(flist); IS_FLIST(flist2); flist2 = flist2->next) str_n_cpy(flist2->rank, rank, FLIST_RANK_STR_LEN); } } } /* Select and scroll to row */ void highlight_and_go_to_row(GtkTreeView *tree_view, GtkTreeSelection *selection, int row) { GtkTreeModel *tree_model; GtkTreePath *tree_path; GtkTreeIter iter; int i = 0; if (row > 0) { tree_model = gtk_tree_view_get_model(tree_view); tree_path = gtk_tree_path_new_first(); if (gtk_tree_model_get_iter_first(tree_model, &iter)) { while (gtk_tree_model_iter_next(tree_model, &iter) && i++ < row - 1) gtk_tree_path_next(tree_path); gtk_tree_selection_select_path(selection, tree_path); gtk_tree_view_set_cursor_on_cell(tree_view, tree_path, NULL, NULL, FALSE); gtk_tree_view_scroll_to_cell(tree_view, tree_path, NULL, FALSE, 0.5, 0); } } } /* Clear the list before filling it */ static void fill_list_store_from_flnode(GtkListStore *list_store) { FList *flist2; GtkTreeIter iter; int i = 0; gtk_list_store_clear(list_store); if (IS_FLIST(flist)) { for (flist2 = f_list_first(flist); IS_FLIST(flist2); flist2 = flist2->next) { gtk_list_store_append(list_store, &iter); gtk_list_store_set(list_store, &iter, COLUMN_INT, i, COLUMN_BOOLEAN_CHECKED, flist2->selected, COLUMN_STRING_RANK, flist2->rank, COLUMN_STRING_TITLE, flist2->title, COLUMN_STRING_URL, flist2->url, -1); i++; } } } /* * Check if URL is valid and reacheable, and update it if so * feed_url max len = FILE_NAME_MAXLEN * feed_title max len = FEED_TITLE_MAXLEN * feed_title can be NULL */ int check_and_update_feed_url(char *feed_url, char *feed_title) { char *unesc_str; int unused; unesc_str = g_uri_unescape_string((const char *)feed_url, NULL); if (unesc_str != NULL) { str_n_cpy(feed_url, unesc_str, FILE_NAME_MAXLEN); g_free(unesc_str); } else { DEBUG_INFO("URL is not valid\n") return RESOURCE_INVALID; } /* URL updated for moved-permanently redirects */ if (fetch_resource(feed_url, get_datafile_full_name_from_name(TMP_FILE), feed_url) == OK) { get_feed_info(&unused, get_datafile_full_name_from_name(TMP_FILE), feed_title, NULL, NULL); g_unlink(get_datafile_full_name_from_name(TMP_FILE)); return OK; } else { DEBUG_INFO("URL is unreachable or invalid\n") return RESOURCE_NOT_FOUND; } } /* * Use url_entry and rank_entry (global vars in this src file) * Update resrc (eventually) */ static int add_feed_to_flnode_and_list_store(Resource *resrc, GtkListStore *list_store) { char feed_url[FILE_NAME_MAXLEN + 1]; char feed_title[FEED_TITLE_MAXLEN + 1]; char rank[FLIST_RANK_STR_LEN + 1]; FList *flist2; int check_status; str_n_cpy(feed_url, (char *)gtk_entry_get_text(GTK_ENTRY(url_entry)), FILE_NAME_MAXLEN); if ((check_status = check_and_update_feed_url(feed_url, feed_title)) == OK) { str_n_cpy(resrc->id, feed_url, FILE_NAME_MAXLEN); if (get_params()->enable_feed_ordering != 'y') { if (IS_FLIST(flist) && (flist2 = f_list_nth(flist, f_list_search(flist, resrc->id) + 1)) != NULL) str_n_cpy(rank, flist2->rank, FLIST_RANK_STR_LEN); else str_n_cpy(rank, BLANK_STR_16, FLIST_RANK_STR_LEN); } else { str_n_cpy(rank, (char *)gtk_entry_get_text(GTK_ENTRY(rank_entry)), FLIST_RANK_STR_LEN); } /* Fix LP bug #1272129 */ if (IS_FLIST(flist)) flist = f_list_last(flist); /* Added URL is set selected */ flist = f_list_add_at_end(flist, feed_url, feed_title, TRUE, rank); flist = f_list_sort(flist); fill_list_store_from_flnode(list_store); } else { warning(BLOCK, "URL is unreachable or invalid (or whatever)"); } return check_status; } /* * Open a dialog with a list of URLs to choose from and an URL entry. * * Entry format in URL list file: * ['*' (selected) or '-' (unselected) + "000" (3 chars rank) + URL [+ '>' + title] + '\n'] * * Entry max length = FILE_NAME_MAXLEN * See also: (UN)SELECTED_URL_CHAR/STR and TITLE_TAG_CHAR/STR in tickr.h * FLIST_RANK_FORMAT and FLIST_RANK_STR_LEN in tickr_list.h */ void manage_list_and_selection(Resource *resrc) { TickerEnv *env; GtkWidget *sc_win, *hbox; GtkWidget *cancel_but, *selectall_but, *unselectall_but, *clear_ranking_but; GtkWidget *top_but, *current_but, *home_but, *remove_but, *add_but; GtkWidget *single_but, *selection_but, *clear_but; GtkWidget *tmp_label; GtkTreeView *tree_view = NULL; GtkListStore *list_store = NULL; GtkTreeModel *tree_model = NULL; GtkTreeIter iter; GtkCellRenderer *renderer1 = NULL, *renderer2 = NULL, *renderer3 = NULL, *renderer4 = NULL; GtkTreeViewColumn *column1 = NULL, *column2 = NULL, *column3 = NULL, *column4 = NULL; GtkTreeSelection *selection = NULL; FList *flist_bak = NULL, *flist2 = NULL; char resrc_id_bak[FILE_NAME_MAXLEN + 1]; int response; int cursor_position; char *tooltip_text; env = get_ticker_env(); env->suspend_rq = TRUE; gtk_window_set_keep_above(GTK_WINDOW(env->win), FALSE); dialog = gtk_dialog_new_with_buttons( "Feed Organizer (RSS/Atom)", GTK_WINDOW(env->win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, NULL); cancel_but = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL_CLOSE); selectall_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "Select All", GTK_RESPONSE_SELECT_ALL); unselectall_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "Unsel All", GTK_RESPONSE_UNSELECT_ALL); if (get_params()->enable_feed_ordering == 'y') clear_ranking_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "Clear Rank", GTK_RESPONSE_CLEAR_RANKING); top_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "Top", GTK_RESPONSE_TOP); current_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "Current", GTK_RESPONSE_CURRENT); home_but = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_HOME, GTK_RESPONSE_HOME); remove_but = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_REMOVE, GTK_RESPONSE_REMOVE); add_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "Add/Upd", GTK_RESPONSE_ADD_UPD); single_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "OK (Single)", GTK_RESPONSE_SINGLE); selection_but = gtk_dialog_add_button(GTK_DIALOG(dialog), "OK (Selec)", GTK_RESPONSE_SELECTION); clear_but = gtk_button_new_with_label("Clear"); /* Tooltips */ tooltip_text = l_str_new("Will try to connect and add or update URL and title"); gtk_widget_set_tooltip_text(add_but, tooltip_text); l_str_free(tooltip_text); tooltip_text = l_str_new("'Single selection' mode - Will read only the highlighted URL"); gtk_widget_set_tooltip_text(single_but, tooltip_text); l_str_free(tooltip_text); tooltip_text = l_str_new("'Multiple selection' mode - Will read sequentially all selected URLs, " "starting from highlighted one - more exactly URL in entry (if any) / first one otherwise"); gtk_widget_set_tooltip_text(selection_but, tooltip_text); l_str_free(tooltip_text); /* To get rid of these boring compiler warnings */ cancel_but = cancel_but; selectall_but = selectall_but; unselectall_but = unselectall_but; clear_ranking_but = clear_ranking_but; top_but = top_but; current_but = current_but; home_but = home_but; remove_but = remove_but; add_but = add_but; single_but = single_but; selection_but = selection_but; clear_but = clear_but; /* (Until here) */ set_tickr_icon_to_dialog(GTK_WINDOW(dialog)); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ALWAYS); sc_win = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_set_border_width(GTK_CONTAINER(sc_win), 5); /* Whole window must be visible on netbooks as well */ gtk_widget_set_size_request(sc_win, 1000, 450); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), sc_win, TRUE, TRUE, 0); str_n_cpy(home_feed, get_params()->homefeed, FILE_NAME_MAXLEN); list_store = gtk_list_store_new(N_COLUMNS, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); if (IS_FLIST(get_feed_list())) f_list_free_all(get_feed_list()); if (f_list_load_from_file(&flist, NULL) == OK) { flist = f_list_sort(flist); fill_list_store_from_flnode(list_store); flist_bak = f_list_clone(flist); } else { flist = NULL; } set_feed_list(flist); tree_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store))); renderer1 = gtk_cell_renderer_toggle_new(); gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(renderer1), FALSE); column1 = gtk_tree_view_column_new_with_attributes(NULL, renderer1, "active", COLUMN_BOOLEAN_CHECKED, NULL); gtk_tree_view_append_column(tree_view, column1); if (get_params()->enable_feed_ordering == 'y') { renderer2 = gtk_cell_renderer_text_new(); #ifndef G_OS_WIN32 /* Doesn't compile on win32 because of older GTK version */ gtk_cell_renderer_set_alignment(renderer2, 1.0, 0.5); #endif column2 = gtk_tree_view_column_new_with_attributes(NULL/*"Rank"*/, renderer2, "text", COLUMN_STRING_RANK, NULL); gtk_tree_view_append_column(tree_view, column2); } renderer3 = gtk_cell_renderer_text_new(); column3 = gtk_tree_view_column_new_with_attributes("Feed Title", renderer3, "text", COLUMN_STRING_TITLE, NULL); gtk_tree_view_append_column(tree_view, column3); renderer4 = gtk_cell_renderer_text_new(); column4 = gtk_tree_view_column_new_with_attributes("Feed URL", renderer4, "text", COLUMN_STRING_URL, NULL); gtk_tree_view_append_column(tree_view, column4); gtk_container_add(GTK_CONTAINER(sc_win), GTK_WIDGET(tree_view)); selection = gtk_tree_view_get_selection(tree_view); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(tree_selection_changed), selection); g_signal_connect(G_OBJECT(tree_view), "row_activated", G_CALLBACK(double_click_on_tree_view), NULL); g_signal_connect(G_OBJECT(renderer1), "toggled", G_CALLBACK(checkbox_toggled), tree_view); hbox = gtk_hbox_new(FALSE, 0); if (get_params()->enable_feed_ordering != 'y') { tmp_label = gtk_label_new("New Feed -> Enter URL:"); /* Or , , ... */ } else { tmp_label = gtk_label_new("New Feed -> Enter rank and URL:"); } gtk_label_set_use_markup(GTK_LABEL(tmp_label), TRUE); gtk_box_pack_start(GTK_BOX(hbox), tmp_label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(" "), TRUE, FALSE, 0); if (get_params()->enable_feed_ordering == 'y') { rank_entry = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(rank_entry), FLIST_RANK_STR_LEN); gtk_entry_set_width_chars(GTK_ENTRY(rank_entry), FLIST_RANK_STR_LEN); gtk_box_pack_start(GTK_BOX(hbox), rank_entry, FALSE, FALSE, 0); } url_entry = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(url_entry), FILE_NAME_MAXLEN); if (get_params()->enable_feed_ordering != 'y') { gtk_entry_set_width_chars(GTK_ENTRY(url_entry), URL_ENTRY_LENGTH); } else { gtk_entry_set_width_chars(GTK_ENTRY(url_entry), URL_ENTRY_LENGTH - 10); /* About ... */ } gtk_box_pack_start(GTK_BOX(hbox), url_entry, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), clear_but, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(url_entry), "activate", G_CALLBACK(enter_key_pressed_in_entry), NULL); if (get_params()->enable_feed_ordering == 'y') g_signal_connect(G_OBJECT(rank_entry), "activate", G_CALLBACK(enter_key_pressed_in_entry), NULL); g_signal_connect(G_OBJECT(clear_but), "clicked", G_CALLBACK(clear_entry), NULL); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL); g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL); gtk_widget_show_all(dialog); /* Backup last valid opened resource (if any) */ str_n_cpy(resrc_id_bak, resrc->id, FILE_NAME_MAXLEN); if (IS_FLIST(flist) && resrc->id[0] != '\0') { if ((f_index = f_list_search(flist, resrc->id)) > -1) { highlight_and_go_to_row(tree_view, selection, f_index + 1); }else if ((f_index = f_list_search(flist, resrc->orig_url)) > -1) { /* Try original URL in case of HTTP redirects */ highlight_and_go_to_row(tree_view, selection, f_index + 1); } } gtk_widget_grab_focus(GTK_WIDGET(tree_view)); while ((response = gtk_dialog_run(GTK_DIALOG(dialog))) != GTK_RESPONSE_CANCEL_CLOSE) { if (response == GTK_RESPONSE_SELECT_ALL) { if (question_win("Select all URLs ?", NO) == YES) select_all(tree_view); } else if (response == GTK_RESPONSE_UNSELECT_ALL) { if (question_win("Unselect all URLs ?", NO) == YES) unselect_all(tree_view); } else if (response == GTK_RESPONSE_CLEAR_RANKING) { if (question_win("Clear all URLs ranking ?", NO) == YES) clear_ranking(tree_view); } else if (response == GTK_RESPONSE_TOP) { highlight_and_go_to_row(tree_view, selection, 1); } else if (response == GTK_RESPONSE_CURRENT) { gtk_entry_set_text(GTK_ENTRY(url_entry), (const char *)resrc->id); if (IS_FLIST(flist)) { if ((f_index = f_list_search(flist, gtk_entry_get_text(GTK_ENTRY(url_entry)))) > -1) highlight_and_go_to_row(tree_view, selection, f_index + 1); } } else if (response == GTK_RESPONSE_HOME) { gtk_entry_set_text(GTK_ENTRY(url_entry), (const char *)home_feed); if (IS_FLIST(flist)) { if ((f_index = f_list_search(flist, gtk_entry_get_text(GTK_ENTRY(url_entry)))) > -1) highlight_and_go_to_row(tree_view, selection, f_index + 1); } } else if (response == GTK_RESPONSE_REMOVE) { if (IS_FLIST(flist) && f_index > -1) { if (gtk_tree_selection_get_selected(selection, &tree_model, &iter) && question_win("Remove highlighted URL from list ?", NO) == YES) { gtk_list_store_remove(list_store, &iter); flist = f_list_remove(flist); if (f_list_count(flist) > 0) { set_feed_list(f_list_first(flist)); } else { set_feed_list(NULL); } f_index = -1; gtk_entry_set_text(GTK_ENTRY(url_entry), ""); } } else if (! IS_FLIST(flist)) { set_feed_list(flist_bak); fill_list_store_from_flnode(list_store); continue; } else if (f_index < 0) { warning(BLOCK, "You must select an URL first"); } } else if (response == GTK_RESPONSE_ADD_UPD) { if (get_params()->enable_feed_ordering == 'y') { if (!(str_is_num(gtk_entry_get_text(GTK_ENTRY(rank_entry))) && atoi(gtk_entry_get_text(GTK_ENTRY(rank_entry))) >= 0) && !str_is_blank(gtk_entry_get_text(GTK_ENTRY(rank_entry)))) { warning(BLOCK, "You must enter a numerical (>= 0 integer) value"); gtk_widget_grab_focus(GTK_WIDGET(rank_entry)); continue; } } if (gtk_entry_get_text(GTK_ENTRY(url_entry))[0] != '\0') { cursor_position = gtk_editable_get_position(GTK_EDITABLE(url_entry)); str_n_cpy(resrc->id, gtk_entry_get_text(GTK_ENTRY(url_entry)), FILE_NAME_MAXLEN); if (add_feed_to_flnode_and_list_store(resrc, list_store) == OK) { if ((f_index = f_list_search(flist, gtk_entry_get_text(GTK_ENTRY(url_entry)))) > -1) highlight_and_go_to_row(tree_view, selection, f_index + 1); /* Backup last valid opened resource (if any) */ str_n_cpy(resrc_id_bak, resrc->id, FILE_NAME_MAXLEN); } else { continue; } } else { warning(BLOCK, "You must enter an URL first"); gtk_widget_grab_focus(GTK_WIDGET(url_entry)); continue; } } else if (response == GTK_RESPONSE_SINGLE) { if (f_index > -1 && gtk_entry_get_text(GTK_ENTRY(url_entry))[0] == '\0') tree_selection_changed(selection); if (gtk_entry_get_text(GTK_ENTRY(url_entry))[0] != '\0') { if (add_feed_to_flnode_and_list_store(resrc, list_store) == OK) { env->selection_mode = SINGLE; env->reload_rq = TRUE; break; } else { break; } } else { warning(BLOCK, "You must enter or select an URL first"); } } else if (response == GTK_RESPONSE_SELECTION) { if (IS_FLIST(flist)) { for (flist2 = f_list_first(flist); IS_FLIST(flist2); flist2 = flist2->next) { if (flist2->selected) break; } if (IS_FLIST(flist2)) { if (flist2->selected) { env->selection_mode = MULTIPLE; env->reload_rq = TRUE; break; } } warning(BLOCK, "Selection is empty"); } else { warning(BLOCK, "URL list is empty"); } } gtk_widget_grab_focus(GTK_WIDGET(tree_view)); } if (list_store != NULL) g_object_unref(list_store); if (response != GTK_RESPONSE_CANCEL_CLOSE) { if (IS_FLIST(flist)) { flist = f_list_first(flist); f_list_save_to_file(flist, NULL); set_feed_list(flist); build_feed_selection_from_feed_list(); if (IS_FLIST(get_feed_selection()) && response == GTK_RESPONSE_SELECTION) { /* * Multiple selection mode: start reading selection with highlighted feed * - more exactly URL in entry (if any) / first one otherwise */ if ((f_index = f_list_search(get_feed_selection(), gtk_entry_get_text(GTK_ENTRY(url_entry)))) > -1) { set_feed_selection(f_list_nth(get_feed_selection(), f_index + 1)); } else { first_feed(); } } if (IS_FLIST(flist_bak)) f_list_free_all(flist_bak); } else { /*info_win("", "Invalid new feed list", INFO_ERROR, TRUE); fprintf(STD_ERR, "Invalid new feed list\n");*/ warning(BLOCK, "Invalid new feed list"), flist = flist_bak; } } else { /* If cancelled, we only restore feed list */ if (IS_FLIST(flist)) f_list_free_all(flist); flist = flist_bak; set_feed_list(flist); } gtk_widget_destroy(dialog); check_main_win_always_on_top(); env->suspend_rq = FALSE; } tickr_0.7.1.orig/src/tickr/tickr_params.c0000644000175000017500000007407714107736721020015 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" void set_default_options(Params *prm) { char tmp_font[FONT_MAXLEN + 1]; prm->delay = DELAY; prm->shift_size = SHIFTSIZE; compact_font(tmp_font, FONTNAME, FONTSIZE); str_n_cpy(prm->font_name_size, tmp_font, FONT_MAXLEN); get_gdk_color_from_hexstr(FGCOLOR, &prm->fg_color, &prm->fg_color_alpha); /*get_gdk_color_from_hexstr(HIGHLIGHTFGCOLOR, &prm->highlight_fg_color, &prm->highlight_fg_color_alpha);*/ get_gdk_color_from_hexstr(BGCOLOR, &prm->bg_color, &prm->bg_color_alpha); prm->set_gradient_bg = SETGRADIENTBG; get_gdk_color_from_hexstr(BGCOLOR2, &prm->bg_color2, &prm->bg_color2_alpha); prm->disable_screen_limits = DISABLESCREENLIMITS; prm->win_x = WIN_X; prm->win_y = WIN_Y; prm->win_w = get_ticker_env()->screen_w; /* Instead of WIN_W; */ prm->win_h = WIN_H; prm->windec = WINDEC; prm->always_on_top = ALWAYSONTOP; prm->win_transparency = WINTRANSPARENCY; prm->icon_in_taskbar = ICONINTASKBAR; prm->win_sticky = WINSTICKY; prm->override_redirect = OVERRIDE_REDIRECT; prm->shadow = SHADOW; prm->shadow_offset_x = SHADOWOFFSET_X; prm->shadow_offset_y = SHADOWOFFSET_Y; prm->shadow_fx = SHADOWFX; str_n_cpy(prm->line_delimiter, LINEDELIMITER, DELIMITER_MAXLEN); prm->special_chars = SPECIALCHARS; prm->new_page_char = NEWPG; prm->tab_char = TABCH; prm->rss_refresh = RSSREFRESH; prm->reverse_sc = REVERSESCROLLING; prm->feed_title = FEEDTITLE; str_n_cpy(prm->feed_title_delimiter, FEEDTITLEDELIMITER, DELIMITER_MAXLEN); prm->item_title = ITEMTITLE; str_n_cpy(prm->item_title_delimiter, ITEMTITLEDELIMITER, DELIMITER_MAXLEN); prm->item_description = ITEMDESCRIPTION; str_n_cpy(prm->item_description_delimiter, ITEMDESCRIPTIONDELIMITER, DELIMITER_MAXLEN); prm->n_items_per_feed = NITEMSPERFEED; /*prm->mark_item_action = MARKITEMACTION;*/ prm->strip_html_tags = STRIPHTMLTAGS; prm->upper_case_text = UPPERCASETEXT; str_n_cpy(prm->homefeed, HOMEFEED, FILE_NAME_MAXLEN); str_n_cpy(prm->open_link_cmd, OPENLINKCMD, FILE_NAME_MAXLEN); str_n_cpy(prm->open_link_args, OPENLINKARGS, FILE_NAME_MAXLEN); prm->clock = CLOCK; prm->clock_sec = CLOCKSEC; prm->clock_12h = CLOCK12H; prm->clock_date = CLOCKDATE; prm->clock_alt_date_form = CLOCKALTDATEFORM; get_gdk_color_from_hexstr(CFGCOLOR, &prm->clock_fg_color, &prm->clock_fg_color_alpha); get_gdk_color_from_hexstr(CBGCOLOR, &prm->clock_bg_color, &prm->clock_bg_color_alpha); prm->set_clock_gradient_bg = SETCLOCKGRADIENTBG; get_gdk_color_from_hexstr(CBGCOLOR2, &prm->clock_bg_color2, &prm->clock_bg_color2_alpha); compact_font(tmp_font, CFONTNAME, CFONTSIZE); str_n_cpy(prm->clock_font_name_size, tmp_font, FONT_MAXLEN); prm->disable_popups = DISABLEPOPUPS; prm->pause_on_mouseover = PAUSEONMOUSEOVER; prm->disable_leftclick = DISABLELEFTCLICK; prm->mouse_wheel_action = MOUSEWHEELACTION; prm->sfeedpicker_autoclose = SFEEDPICKERAUTOCLOSE; prm->enable_feed_ordering = ENABLEFEEDORDERING; prm->use_authentication = USEAUTHENTICATION; str_n_cpy(prm->user, USER, USER_MAXLEN); prm->use_proxy = USEPROXY; str_n_cpy(prm->proxy_host, PROXYHOST, PROXY_HOST_MAXLEN); str_n_cpy(prm->proxy_port, PROXYPORT, PROXY_PORT_MAXLEN); prm->use_proxy_authentication = USEPROXYAUTHENTICATION; str_n_cpy(prm->proxy_user, PROXYUSER, PROXY_USER_MAXLEN); prm->connect_timeout = CONNECT_TIMEOUT; prm->send_recv_timeout = SENDRECV_TIMEOUT; } /* * Load config file if any & set up - returns 0 if OK. * Store options in a string array and initialize a ptr arrays that matches strings. * We assume we have up to N_OPTION_MAX options, OPTION_MAXLEN char long max each. */ int get_config_file_options(Params *prm) { FILE *conf_fp; char options_array[N_OPTION_MAX][OPTION_MAXLEN + 2]; char *ptr[N_OPTION_MAX + 1]; int i, j = 0; if ((conf_fp = g_fopen(get_datafile_full_name_from_name(CONFIG_FILE), "rb")) != NULL) { /* * Parse config file */ for (i = 0; ; i++) { /* * Here fgets() read OPTION_MAXLEN + 1 char max including * '\n' then add '\0' (if I'm right) */ if (i >= N_OPTION_MAX) { ptr[i] = NULL; warning(BLOCK, "Too many lines in configuration file '%s' " "(max = %d)\nWon't parse further than limit\n", get_datafile_full_name_from_name(CONFIG_FILE), N_OPTION_MAX); break; } /* TODO: Should use getline() instead ? */ if (fgets(options_array[i], OPTION_MAXLEN + 2, conf_fp) == NULL) { ptr[i] = NULL; break; } else { j = strlen(options_array[i]); options_array[i][j - 1] = '\0'; /* We remove trailing '\n' */ ptr[i] = options_array[i]; /* so now options max length = OPTION_MAXLEN. */ } } if (i > 0) j = parse_options_array(prm, i - 1, (const char **)ptr); else j = 0; fclose(conf_fp); } else INFO_ERR("Can't read configuration file '%s': %s\n", get_datafile_full_name_from_name(CONFIG_FILE), strerror(errno)) return j; } /* * Options array parser (NULL terminated ptrs array). * We assume we have up to N_OPTION_MAX options, OPTION_MAXLEN char long max each. */ int parse_options_array(Params *prm, int n_options, const char *option[]) { int i, j, error_code = OK; if (n_options > N_OPTION_MAX) { n_options = N_OPTION_MAX; INFO_ERR("Too many options (max = %d) - Won't parse further than limit\n", N_OPTION_MAX) error_code = OPTION_TOO_MANY; } for (i = 0; i < n_options && option[i] != NULL; i++) if ((j = get_name_value_from_option(prm, option[i])) != OK) { /* FIXME: Will only get last error code */ error_code = j; /* But if OPTION_ERROR_QUIT is set to TRUE */ if (OPTION_ERROR_QUIT) break; } return error_code; } int get_name_value_from_option(Params *prm, const char *option) { /* * Options are splitted into name and value. * font -> font_name is FONT_NAME_MAXLEN char max long, font_size FONT_SIZE_MAXLEN, * plus 1 extra space so font_name_size is up to * FONT_MAXLEN = FONT_NAME_MAXLEN + 1 + FONT_SIZE_MAXLEN char long. * OPTION_MAXLEN = OPTION_NAME_MAXLEN + OPTION_VALUE_MAXLEN + 4 (-name="value"). * * === If unsure, check this in tickr.h === */ char name[OPTION_NAME_MAXLEN + 1], value[OPTION_VALUE_MAXLEN + 1]; char font_name[FONT_NAME_MAXLEN + 1], font_size[FONT_SIZE_MAXLEN + 1]; char c_font_name[FONT_NAME_MAXLEN + 1], c_font_size[FONT_SIZE_MAXLEN + 1]; char tmp[OPTION_MAXLEN + 1]; char tmp_font[FONT_MAXLEN + 1]; int i, error_code = OK; split_font(prm->font_name_size, font_name, font_size); split_font(prm->clock_font_name_size, c_font_name, c_font_size); /* * Split option into name & value if any */ name[0] = '\0'; value[0] = '\0'; if (option[0] == '-') { str_n_cpy(tmp, option + 1, OPTION_MAXLEN); for (i = 0; i < OPTION_MAXLEN - 1; i++) if (tmp[i] == '=') { tmp[i] = '\0'; str_n_cpy(name, tmp, OPTION_NAME_MAXLEN); str_n_cpy(value, tmp + i + 1, OPTION_VALUE_MAXLEN); break; } } else if (option[0] != '\0') { INFO_ERR("Invalid option: %s\n", option) return (error_code = OPTION_INVALID); } /* * All *string* values are saved inclosed in a pair of ". When read, enclosing " (or ') * are removed. (This also ensure backward compatibility with previous versions.) */ str_n_cpy(tmp, value, OPTION_MAXLEN); if ((i = strlen(tmp) >= 2) && ((tmp[0] == '\"' && tmp[i - 1] == '\"') || (tmp[0] == '\'' && tmp[i - 1] == '\''))) { str_n_cpy(value, tmp + 1, OPTION_VALUE_MAXLEN); value[strlen(value) - 1] = '\0'; } /* * Check option name and get value if any */ if (strcmp(name, "delay") == 0) prm->delay = atoi(value); else if (strcmp(name, "shiftsize") == 0) prm->shift_size = atoi(value); else if (strcmp(name, "fontname") == 0) str_n_cpy(font_name, value, FONT_NAME_MAXLEN); else if (strcmp(name, "fontsize") == 0) { str_n_cpy(font_size, value, FONT_SIZE_MAXLEN); if (atoi(font_size) > FONT_MAXSIZE) { snprintf(font_size, FONT_SIZE_MAXLEN + 1, "%3d", FONT_MAXSIZE); INFO_ERR("Font size set to %d (can't be above)\n", FONT_MAXSIZE) } } else if (strcmp(name, "fgcolor") == 0) { if (!get_gdk_color_from_hexstr(value, &prm->fg_color, &prm->fg_color_alpha)) { get_gdk_color_from_hexstr(FGCOLOR, &prm->fg_color, &prm->fg_color_alpha); error_code = OPTION_VALUE_INVALID; } } else /*if (strcmp(name, "highlightfgcolor") == 0) { if (!get_gdk_color_from_hexstr(value, &prm->highlight_fg_color, &prm->highlight_fg_color_alpha)) { get_gdk_color_from_hexstr(HIGHLIGHTFGCOLOR, &prm->highlight_fg_color, &prm->highlight_fg_color_alpha); error_code = OPTION_VALUE_INVALID; } } else*/ if (strcmp(name, "bgcolor") == 0) { if (!get_gdk_color_from_hexstr(value, &prm->bg_color, &prm->bg_color_alpha)) { get_gdk_color_from_hexstr(BGCOLOR, &prm->bg_color, &prm->bg_color_alpha); error_code = OPTION_VALUE_INVALID; } } else if (strcmp(name, "setgradientbg") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->set_gradient_bg = value[0]; } else if (strcmp(name, "bgcolor2") == 0) { if (!get_gdk_color_from_hexstr(value, &prm->bg_color2, &prm->bg_color2_alpha)) { get_gdk_color_from_hexstr(BGCOLOR, &prm->bg_color2, &prm->bg_color2_alpha); error_code = OPTION_VALUE_INVALID; } } else if (strcmp(name, "disablescreenlimits") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->disable_screen_limits = value[0]; } else if (strcmp(name, "win_x") == 0) prm->win_x = atoi(value); else if (strcmp(name, "win_y") == 0) prm->win_y = atoi(value); else if (strcmp(name, "win_w") == 0) { prm->win_w = atoi(value); /* Same as 'full width' but from command line */ if (prm->win_w == 0) prm->win_w = get_ticker_env()->screen_w; } else if (strcmp(name, "win_h") == 0) { prm->win_h = atoi(value); /* * If win_h is set and > 0, it will override requested font size * with computed one. */ if (prm->win_h > 0 && prm->win_h < DRWA_HEIGHT_MIN) prm->win_h = DRWA_HEIGHT_MIN; } else if (strcmp(name, "windec") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->windec = value[0]; } else if (strcmp(name, "alwaysontop") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->always_on_top = value[0]; } else if (strcmp(name, "wintransparency") == 0) { /* Compare as integers (because less bug-prone) then set as double. * Saved to / retrieved from config file as [transparency x 10]. */ prm->win_transparency = atoi(value); if ((int)prm->win_transparency < 1) { INFO_ERR("Invalid value: %s - will be set to 1\n", option) prm->win_transparency = 1.0; error_code = OPTION_VALUE_INVALID; } else if ((int)prm->win_transparency > 10) { INFO_ERR("Invalid value: %s - will be set to 10\n", option) prm->win_transparency = 10.0; error_code = OPTION_VALUE_INVALID; } prm->win_transparency /= 10; } else if (strcmp(name, "iconintaskbar") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->icon_in_taskbar = value[0]; } else if (strcmp(name, "winsticky") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->win_sticky = value[0]; } else if (strcmp(name, "overrideredirect") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->override_redirect = value[0]; } else if (strcmp(name, "shadow") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->shadow = value[0]; } else if (strcmp(name, "shadowoffset_x") == 0) /* Should check value here */ prm->shadow_offset_x = atoi(value); else if (strcmp(name, "shadowoffset_y") == 0) /* Should check value here */ prm->shadow_offset_y = atoi(value); else if (strcmp(name, "shadowfx") == 0) prm->shadow_fx = atoi(value); else if (strcmp(name, "linedelimiter") == 0) str_n_cpy(prm->line_delimiter, value, DELIMITER_MAXLEN); else if (strcmp(name, "specialchars") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->special_chars = value[0]; } else if (strcmp(name, "newpgchar") == 0) prm->new_page_char = value[0]; else if (strcmp(name, "tabchar") == 0) prm->tab_char = value[0]; else if (strcmp(name, "rssrefresh") == 0) prm->rss_refresh = atoi(value); else if (strcmp(name, "revsc") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->reverse_sc = value[0]; } else if (strcmp(name, "feedtitle") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->feed_title = value[0]; } else if (strcmp(name, "feedtitledelimiter") == 0) str_n_cpy(prm->feed_title_delimiter, value, DELIMITER_MAXLEN); else if (strcmp(name, "itemtitle") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->item_title = value[0]; } else if (strcmp(name, "itemtitledelimiter") == 0) str_n_cpy(prm->item_title_delimiter, value, DELIMITER_MAXLEN); else if (strcmp(name, "itemdescription") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->item_description = value[0]; } else if (strcmp(name, "itemdescriptiondelimiter") == 0) str_n_cpy(prm->item_description_delimiter, value, DELIMITER_MAXLEN); else if (strcmp(name, "nitemsperfeed") == 0) prm->n_items_per_feed = atoi(value); else /*if (strcmp(name, "markitemaction") == 0) { if (strcmp(value, "h") != 0 && strcmp(value, "c") != 0 \ && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->mark_item_action = value[0]; } else*/ if (strcmp(name, "rmtags") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->strip_html_tags = value[0]; } else if (strcmp(name, "uppercasetext") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->upper_case_text = value[0]; } else if (strcmp(name, "homefeed") == 0) str_n_cpy(prm->homefeed, value, FILE_NAME_MAXLEN); else if (strcmp(name, "openlinkcmd") == 0) str_n_cpy(prm->open_link_cmd, value, FILE_NAME_MAXLEN); else if (strcmp(name, "openlinkargs") == 0) str_n_cpy(prm->open_link_args, value, FILE_NAME_MAXLEN); else if (strcmp(name, "clock") == 0) { if (strcmp(value, "l") != 0 && strcmp(value, "r") != 0 \ && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->clock = value[0]; } else if (strcmp(name, "clocksec") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->clock_sec = value[0]; } else if (strcmp(name, "clock12h") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->clock_12h = value[0]; } else if (strcmp(name, "clockdate") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->clock_date = value[0]; } else if (strcmp(name, "clockaltdateform") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->clock_alt_date_form = value[0]; } else if (strcmp(name, "clockfontname") == 0) str_n_cpy(c_font_name, value, FONT_NAME_MAXLEN); else if (strcmp(name, "clockfontsize") == 0) str_n_cpy(c_font_size, value, FONT_SIZE_MAXLEN); else if (strcmp(name, "clockfgcolor") == 0) { if (!get_gdk_color_from_hexstr(value, &prm->clock_fg_color, &prm->clock_fg_color_alpha)) { get_gdk_color_from_hexstr(CFGCOLOR, &prm->clock_fg_color, &prm->clock_fg_color_alpha); error_code = OPTION_VALUE_INVALID; } } else if (strcmp(name, "clockbgcolor") == 0) { if (!get_gdk_color_from_hexstr(value, &prm->clock_bg_color, &prm->clock_bg_color_alpha)) { get_gdk_color_from_hexstr(CBGCOLOR, &prm->clock_bg_color, &prm->clock_bg_color_alpha); error_code = OPTION_VALUE_INVALID; } } else if (strcmp(name, "setclockgradientbg") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->set_clock_gradient_bg = value[0]; } else if (strcmp(name, "clockbgcolor2") == 0) { if (!get_gdk_color_from_hexstr(value, &prm->clock_bg_color2, &prm->clock_bg_color2_alpha)) { get_gdk_color_from_hexstr(BGCOLOR, &prm->clock_bg_color2, &prm->clock_bg_color2_alpha); error_code = OPTION_VALUE_INVALID; } } else if (strcmp(name, "disablepopups") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->disable_popups = value[0]; } else if (strcmp(name, "pauseonmouseover") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->pause_on_mouseover = value[0]; } else if (strcmp(name, "disableleftclick") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->disable_leftclick = value[0]; } else if (strcmp(name, "mousewheelaction") == 0) { if (strcmp(value, "s") != 0 && strcmp(value, "f") != 0 \ && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->mouse_wheel_action = value[0]; } else if (strcmp(name, "sfeedpickerautoclose") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->sfeedpicker_autoclose = value[0]; } else if (strcmp(name, "enablefeedordering") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->enable_feed_ordering = value[0]; /* Params in connection settings win */ } else if (strcmp(name, "useauth") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else { prm->use_authentication = value[0]; set_use_authentication(value[0] == 'y' ? TRUE : FALSE); } } else if (strcmp(name, "user") == 0) { str_n_cpy(prm->user, value, USER_MAXLEN); str_n_cpy(get_http_auth_user(), value, USER_MAXLEN); /* This option is never saved */ } else if (strcmp(name, "psw") == 0) str_n_cpy(get_http_auth_psw(), value, PSW_MAXLEN); else if (strcmp(name, "useproxy") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else { prm->use_proxy = value[0]; set_use_proxy(value[0] == 'y' ? TRUE : FALSE); } } else if (strcmp(name, "proxyhost") == 0) { str_n_cpy(prm->proxy_host, value, PROXY_HOST_MAXLEN); str_n_cpy(get_proxy_host(), value, PROXY_HOST_MAXLEN); } else if (strcmp(name, "proxyport") == 0) { str_n_cpy(prm->proxy_port, value, PROXY_PORT_MAXLEN); str_n_cpy(get_proxy_port(), value, PROXY_PORT_MAXLEN); } else if (strcmp(name, "useproxyauth") == 0) { if (strcmp(value, "y") != 0 && strcmp(value, "n") != 0) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else { prm->use_proxy_authentication = value[0]; set_use_proxy_auth(value[0] == 'y' ? TRUE : FALSE); } } else if (strcmp(name, "proxyuser") == 0) { str_n_cpy(prm->proxy_user, value, PROXY_USER_MAXLEN); str_n_cpy(get_proxy_auth_user(), value, PROXY_USER_MAXLEN); /* This option is never saved */ } else if (strcmp(name, "proxypsw") == 0) str_n_cpy(get_proxy_auth_psw(), value, PROXY_PSW_MAXLEN); else if (strcmp(name, "connect-timeout") == 0) { if (atoi(value) < 1 || atoi(value) > 60) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->connect_timeout = atoi(value); } else if (strcmp(name, "sendrecv-timeout") == 0) { if (atoi(value) < 1 || atoi(value) > 60) { INFO_ERR("Invalid value: %s\n", option) error_code = OPTION_VALUE_INVALID; } else prm->send_recv_timeout = atoi(value); /* Connect params until here */ /* Following options are only set from command line (and never saved) */ } else if (strcmp(name, "instance-id") == 0) { /* Does nothing but avoid an 'unknown option' warning/error */ } else if (strcmp(name, "no-ui") == 0) { /* Does nothing but avoid an 'unknown option' warning/error */ } else { INFO_ERR("Unknown option: %s\n", option) error_code = OPTION_UNKNOWN; } compact_font(tmp_font, font_name, font_size); str_n_cpy(prm->font_name_size, tmp_font, FONT_MAXLEN); compact_font(tmp_font, c_font_name, c_font_size); str_n_cpy(prm->clock_font_name_size, tmp_font, FONT_MAXLEN); return error_code; } void save_to_config_file(const Params *prm) { FILE *conf_fp; char font_name[FONT_NAME_MAXLEN + 1], font_size[FONT_SIZE_MAXLEN + 1]; char c_font_name[FONT_NAME_MAXLEN + 1], c_font_size[FONT_SIZE_MAXLEN + 1]; char tmp[4 * 1024]; if ((conf_fp = g_fopen(get_datafile_full_name_from_name(CONFIG_FILE), "wb")) != NULL) { split_font(prm->font_name_size, font_name, font_size); split_font(prm->clock_font_name_size, c_font_name, c_font_size); snprintf(tmp, 4 * 1024, "%s%s%s", /* All *string* values are saved inclosed in a pair of ". */ "-delay=%d\n" "-shiftsize=%d\n" "-fontname=\"%s\"\n" "-fontsize=%d\n" "-fgcolor=\"%s\"\n" /*"-highlightfgcolor=\"%s\"\n"*/ "-bgcolor=\"%s\"\n" "-setgradientbg=%c\n" "-bgcolor2=\"%s\"\n" "-disablescreenlimits=%c\n" "-win_x=%d\n" "-win_y=%d\n" "-win_w=%d\n" "-win_h=%d\n" "-windec=%c\n" "-alwaysontop=%c\n" "-wintransparency=%d\n" "-iconintaskbar=%c\n" "-winsticky=%c\n" "-overrideredirect=%c\n" "-shadow=%c\n" "-shadowoffset_x=%d\n" "-shadowoffset_y=%d\n" "-shadowfx=%d\n" "-linedelimiter=\"%s\"\n" "-specialchars=%c\n", "-newpgchar=%c\n" "-tabchar=%c\n" "-rssrefresh=%d\n" "-revsc=%c\n" "-feedtitle=%c\n" "-feedtitledelimiter=\"%s\"\n" "-itemtitle=%c\n" "-itemtitledelimiter=\"%s\"\n" "-itemdescription=%c\n" "-itemdescriptiondelimiter=\"%s\"\n" "-nitemsperfeed=%d\n" /*"-markitemaction=%c\n"*/ "-rmtags=%c\n" "-uppercasetext=%c\n" "-homefeed=\"%s\"\n" "-openlinkcmd=\"%s\"\n" "-openlinkargs=\"%s\"\n" "-clock=%c\n" "-clocksec=%c\n" "-clock12h=%c\n" "-clockdate=%c\n" "-clockaltdateform=%c\n" "-clockfontname=\"%s\"\n" "-clockfontsize=%d\n" "-clockfgcolor=\"%s\"\n" "-clockbgcolor=\"%s\"\n" "-setclockgradientbg=%c\n" "-clockbgcolor2=\"%s\"\n", "-disablepopups=%c\n" "-pauseonmouseover=%c\n" "-disableleftclick=%c\n" "-mousewheelaction=%c\n" "-sfeedpickerautoclose=%c\n" "-enablefeedordering=%c\n" "-useauth=%c\n" "-user=\"%s\"\n" "-useproxy=%c\n" "-proxyhost=\"%s\"\n" "-proxyport=\"%s\"\n" "-useproxyauth=%c\n" "-proxyuser=\"%s\"\n" "-connect-timeout=%d\n" "-sendrecv-timeout=%d\n" ); fprintf(conf_fp, tmp, prm->delay, prm->shift_size, font_name, atoi(font_size), get_hexstr_from_gdk_color(&prm->fg_color, &prm->fg_color_alpha), /*get_hexstr_from_gdk_color(&prm->highlight_fg_color, &prm->highlight_fg_color_alpha),*/ get_hexstr_from_gdk_color(&prm->bg_color, &prm->bg_color_alpha), prm->set_gradient_bg, get_hexstr_from_gdk_color(&prm->bg_color2, &prm->bg_color2_alpha), prm->disable_screen_limits, prm->win_x, prm->win_y, prm->win_w, prm->win_h, prm->windec, prm->always_on_top, (int)(prm->win_transparency * 10), prm->icon_in_taskbar, prm->win_sticky, prm->override_redirect, prm->shadow, prm->shadow_offset_x, prm->shadow_offset_y, prm->shadow_fx, prm->line_delimiter, prm->special_chars, prm->new_page_char, prm->tab_char, prm->rss_refresh, prm->reverse_sc, prm->feed_title, prm->feed_title_delimiter, prm->item_title, prm->item_title_delimiter, prm->item_description, prm->item_description_delimiter, prm->n_items_per_feed, /*prm->mark_item_action,*/ prm->strip_html_tags, prm->upper_case_text, prm->homefeed, prm->open_link_cmd, prm->open_link_args, prm->clock, prm->clock_sec, prm->clock_12h, prm->clock_date, prm->clock_alt_date_form, c_font_name, atoi(c_font_size), get_hexstr_from_gdk_color(&prm->clock_fg_color, &prm->clock_fg_color_alpha), get_hexstr_from_gdk_color(&prm->clock_bg_color, &prm->clock_bg_color_alpha), prm->set_clock_gradient_bg, get_hexstr_from_gdk_color(&prm->clock_bg_color2, &prm->clock_bg_color2_alpha), prm->disable_popups, prm->pause_on_mouseover, prm->disable_leftclick, prm->mouse_wheel_action, prm->sfeedpicker_autoclose, prm->enable_feed_ordering, prm->use_authentication, prm->user, prm->use_proxy, prm->proxy_host, prm->proxy_port, prm->use_proxy_authentication, prm->proxy_user, prm->connect_timeout, prm->send_recv_timeout ); fclose(conf_fp); } else warning(BLOCK, "Can't save configuration file '%s': %s", get_datafile_full_name_from_name(CONFIG_FILE), strerror(errno)); } /* * Options colors are coded as 4 hexa values -> #rrggbbaa */ int get_gdk_color_from_hexstr(const char *str, GdkColor *color, guint16 *color_alpha) { char tmp[3], *tailptr; int errflag = 0; if (strlen(str) != 9 && str[0] != '#') errflag = 1; else { str_n_cpy(tmp, str + 1, 2); color->red = strtoul(tmp, &tailptr, 16) * 0x100; if (tailptr == tmp) errflag = 1; str_n_cpy(tmp, str + 3, 2); color->green = strtoul(tmp, &tailptr, 16) * 0x100; if (tailptr == tmp) errflag = 1; str_n_cpy(tmp, str + 5, 2); color->blue = strtoul(tmp, &tailptr, 16) * 0x100; if (tailptr == tmp) errflag = 1; str_n_cpy(tmp, str + 7, 2); *color_alpha = strtoul(tmp, &tailptr, 16) * 0x100; if (tailptr == tmp) errflag = 1; } if (errflag != 0) { INFO_ERR("Invalid color: %s\n", str) return FALSE; } else return TRUE; } /* * Options colors are coded as 4 hexa values -> #rrggbbaa * *** allow up to 64 simultaneous calls *** */ const char *get_hexstr_from_gdk_color(const GdkColor *color, const guint16 *color_alpha) { static char str[64][10]; static int count = -1; count++; count &= 63; snprintf(str[count], 10, "#%02x%02x%02x%02x", color->red / 256, color->green / 256, color->blue / 256, *color_alpha / 256); if (strlen(str[count]) != 9) return NULL; else return (const char *)str[count]; } /* * Adjust size in font_name_and_size str by computing font size from required height * (str must be able to store FONT_MAXLEN chars.) Does nothing if height <= 0. */ void adjust_font_size_to_rq_height(char *font_name_and_size, int height) { char f_name[FONT_NAME_MAXLEN + 1]; char f_size[FONT_SIZE_MAXLEN + 1]; if (height > 0) { split_font(font_name_and_size, f_name, f_size); snprintf(f_size, FONT_SIZE_MAXLEN + 1, "%3d", get_font_size_from_layout_height(height, f_name)); /* Font size can't be > FONT_MAXSIZE */ if (atoi(f_size) > FONT_MAXSIZE) snprintf(f_size, FONT_SIZE_MAXLEN + 1, "%3d", FONT_MAXSIZE); compact_font(font_name_and_size, f_name, f_size); } else if (height == 0) DEBUG_INFO("Required height = 0\n") else INFO_ERR("%s() error: Required height < 0\n", __func__) } int get_font_size_from_font_name_size(const char *font_name_size) { char font_name[FONT_NAME_MAXLEN + 1], font_size[FONT_SIZE_MAXLEN + 1]; split_font(font_name_size, font_name, font_size); return atoi(font_size); } /* * Space needed for font_name: FONT_NAME_MAXLEN + 1 bytes / font_size: FONT_SIZE_MAXLEN + 1 bytes */ void split_font(const char *font_name_size, char *font_name, char *font_size) { char tmp[FONT_MAXLEN + 1]; int i; if (font_name_size[0] == '\0') { font_name[0] = '\0'; font_size[0] = '\0'; } else { str_n_cpy(tmp, font_name_size, FONT_MAXLEN); for (i = strlen(tmp) - 1; i > 0 ; i--) if (tmp[i] == ' ') { tmp[i] = '\0'; break; } str_n_cpy(font_name, tmp, FONT_NAME_MAXLEN); str_n_cpy(font_size, tmp + strlen(font_name) + 1, FONT_SIZE_MAXLEN); } } /* * Space needed for font_name_size: FONT_NAME_MAXLEN + 1 space + FONTSIZENMAXLEN + 1 bytes */ void compact_font(char *font_name_size, const char *font_name, const char *font_size) { if (font_name[0] == '\0' && font_size[0] == '\0') { font_name_size[0] = '\0'; } else { str_n_cpy(font_name_size, font_name, FONT_NAME_MAXLEN); str_n_cat(font_name_size, " ", 1); str_n_cat(font_name_size, font_size, FONT_SIZE_MAXLEN); } } tickr_0.7.1.orig/src/tickr/Makefile-tickr-linux0000644000175000017500000000273714107736721021073 0ustar manutmmanutm# Makefile for TICKR - GTK-based Feed Reader - Linux version # TODO: This rarely-used Makefile has not been tested for ages, still working ? src = tickr_main.c tickr_resource.c tickr_render.c tickr_params.c\ tickr_clock.c tickr_feedparser.c tickr_list.c tickr_feedpicker.c\ tickr_prefwin.c tickr_otherwins.c tickr_misc.c tickr_helptext.c\ tickr_opml.c tickr_http.c tickr_connectwin.c tickr_quickfeedpicker.c\ tickr_quicksetup.c tickr_check4updates.c tickr_error.c tickr_tls.c obj = $(src:.c=.o) CC = gcc CFLAGS = -O2 -Wall -Wextra -Wunused-parameter -Wshadow -Wpointer-arith\ -ffast-math -pedantic -Wno-variadic-macros\ -Wno-deprecated-declarations -Wno-format -Wno-format-truncation\ `pkg-config --cflags gtk+-2.0`\ xml2-config --cflags` -I/usr/local/include\ `pkg-config --cflags gnutls`\ `pkg-config --cflags fribidi`\ #-Wno-deprecated-declarations for boring GTK+2 "'GTypeDebugFlags' is deprecated" LIBS = ../libetm-0.5.0/libetm.a `pkg-config --libs gtk+-2.0`\ `xml2-config --libs`\ `pkg-config --libs gnutls`\ `pkg-config --libs fribidi` all: tickr $(obj): $(src) news.h Makefile $(CC) $(CFLAGS) -c $(src) tickr: $(obj) $(CC) -o tickr $(obj) $(LIBS) .PHONY: install install: sudo cp tickr /usr/bin/ sudo mkdir -p /usr/share/tickr sudo mkdir -p /usr/share/tickr/pixmaps sudo cp ../../images/tickr-*.png /usr/share/tickr/pixmaps/ .PHONY: uninstall uninstall: sudo rm /usr/bin/tickr sudo rm /usr/share/tickr/pixmaps/tickr-*.png .PHONY: clean clean: rm -f $(obj) tickr tickr_0.7.1.orig/src/tickr/tickr_clock.c0000644000175000017500000002721214107736721017612 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" #define CLOCK_DELIMITER_STR " | " /* TODO: Should be a user-defined setting */ #ifndef G_OS_WIN32 # define NO_PADDING "-" /* Don't pad a numeric result string. The %- flag is a Glibc extension, * not ISO C, so expect a compile-time warning. */ #else # define NO_PADDING "#" /* (win32) Remove leading zeros (if any) */ #endif #define DATE_STR "%a %b %" NO_PADDING "d " /* Mon Jan 01 */ #define DATE_STR_2 "%a %" NO_PADDING "d %b " /* Mon 01 Jan */ /* * R -> " | 00:00:00 AM" * L -> "00:00:00 AM | " */ void display_time(const Params *prm) { TickerEnv *env = get_ticker_env(); PangoLayout *p_layout; PangoFontDescription *f_des; int layout_width, layout_height; cairo_surface_t *surf_clock; cairo_t *cr; cairo_pattern_t *cr_p; float shadow_k; time_t time2; char *format; char *date_str; char time_str[64]; char tmp[64]; int height_diff; if (env->suspend_rq || (prm->clock != 'l' && prm->clock != 'r')) return; else if ((p_layout = pango_layout_new(gtk_widget_get_pango_context(env->win))) == NULL) { INFO_ERR("%s(): Can't create pango layout\n", __func__) return; } pango_layout_set_attributes(p_layout, NULL); pango_layout_set_single_paragraph_mode(p_layout, TRUE); f_des = pango_font_description_from_string((const char *)prm->clock_font_name_size); pango_layout_set_font_description(p_layout, f_des); pango_font_description_free(f_des); if (prm->clock_date == 'y') { if (prm->clock_sec == 'y') { if (prm->clock_12h == 'y') { if (prm->clock_alt_date_form != 'y') format = DATE_STR "%" NO_PADDING "I:%M:%S %p"; else format = DATE_STR_2 "%" NO_PADDING "I:%M:%S %p"; } else { if (prm->clock_alt_date_form != 'y') format = DATE_STR "%" NO_PADDING "H:%M:%S"; else format = DATE_STR_2 "%" NO_PADDING "H:%M:%S"; } } else { if (prm->clock_12h == 'y') { if (prm->clock_alt_date_form != 'y') format = DATE_STR "%" NO_PADDING "I:%M %p"; else format = DATE_STR_2 "%" NO_PADDING "I:%M %p"; } else { if (prm->clock_alt_date_form != 'y') format = DATE_STR "%" NO_PADDING "H:%M"; else format = DATE_STR_2 "%" NO_PADDING "H:%M"; } } } else { if (prm->clock_sec == 'y') { if (prm->clock_12h == 'y') format = "%" NO_PADDING "I:%M:%S %p"; else format = "%" NO_PADDING "H:%M:%S"; } else { if (prm->clock_12h == 'y') format = "%" NO_PADDING "I:%M %p"; else format = "%" NO_PADDING "H:%M"; } } time2 = time(NULL); strftime(tmp, 64, format, localtime(&time2)); if (prm->clock == 'l') snprintf(time_str, 64, "%s%s", tmp, CLOCK_DELIMITER_STR); else if (prm->clock == 'r') snprintf(time_str, 64, "%s%s", CLOCK_DELIMITER_STR, tmp); pango_layout_set_text(p_layout, time_str, -1); pango_layout_context_changed(p_layout); pango_layout_get_pixel_size(p_layout, &layout_width, &layout_height); env->drwa_clock_width = get_clock_width(prm); /* width_diff */ /* * For some fonts like 'impact bold' which give strange things * width_diff = drwa_clock_width - layout_width. */ gtk_widget_set_size_request(env->drwa_clock, env->drwa_clock_width, env->drwa_height); height_diff = (env->drwa_height - layout_height) / 2; /* * Create cairo image surface onto which layout will be rendered */ surf_clock = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, env->drwa_clock_width, env->drwa_height); cr = cairo_create(surf_clock); /* * Render layout */ /* Draw background */ if (get_params()->set_clock_gradient_bg == 'y') { cr_p = cairo_pattern_create_linear(0.0, 0.0, 0.0, (float)env->drwa_height); if (cairo_pattern_status(cr_p) == CAIRO_STATUS_SUCCESS) { if (cairo_pattern_get_type(cr_p) == CAIRO_PATTERN_TYPE_LINEAR) { cairo_pattern_add_color_stop_rgba(cr_p, 0.0, (float)prm->clock_bg_color.red / G_MAXUINT16, (float)prm->clock_bg_color.green / G_MAXUINT16, (float)prm->clock_bg_color.blue / G_MAXUINT16, (float)prm->clock_bg_color_alpha / G_MAXUINT16); cairo_pattern_add_color_stop_rgba(cr_p, 1.0, (float)prm->clock_bg_color2.red / (G_MAXUINT16), (float)prm->clock_bg_color2.green / (G_MAXUINT16), (float)prm->clock_bg_color2.blue / (G_MAXUINT16), (float)prm->clock_bg_color_alpha / G_MAXUINT16); cairo_set_source(cr, cr_p); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_paint(cr); } else INFO_ERR("%s(): cairo pattern type != linear (gradient)\n", __func__) } else INFO_ERR("%s(): cairo_pattern_create_linear() error\n", __func__) cairo_pattern_destroy(cr_p); } else { cairo_set_source_rgba(cr, (float)prm->clock_bg_color.red / G_MAXUINT16, (float)prm->clock_bg_color.green / G_MAXUINT16, (float)prm->clock_bg_color.blue / G_MAXUINT16, (float)prm->clock_bg_color_alpha / G_MAXUINT16); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_paint(cr); } /* Draw foreground */ if (prm->shadow == 'y') { /* Draw shadow */ if (prm->shadow_fx < 0) shadow_k = 1.0; else if (prm->shadow_fx > 10) shadow_k = 0.0; else shadow_k = 1.0 - (float)prm->shadow_fx / 10.0; if (get_params()->set_gradient_bg == 'y') { cr_p = cairo_pattern_create_linear(0.0, 0.0, 0.0, (float)env->drwa_height); if (cairo_pattern_status(cr_p) == CAIRO_STATUS_SUCCESS) { if (cairo_pattern_get_type(cr_p) == CAIRO_PATTERN_TYPE_LINEAR) { cairo_pattern_add_color_stop_rgba(cr_p, 0.0, (float)prm->clock_bg_color.red * shadow_k / G_MAXUINT16, (float)prm->clock_bg_color.green * shadow_k / G_MAXUINT16, (float)prm->clock_bg_color.blue * shadow_k / G_MAXUINT16, (float)prm->clock_bg_color_alpha / G_MAXUINT16); cairo_pattern_add_color_stop_rgba(cr_p, 1.0, (float)prm->clock_bg_color2.red * shadow_k / (G_MAXUINT16), (float)prm->clock_bg_color2.green * shadow_k / (G_MAXUINT16), (float)prm->clock_bg_color2.blue * shadow_k / (G_MAXUINT16), (float)prm->clock_bg_color_alpha / G_MAXUINT16); cairo_set_source(cr, cr_p); pango_cairo_update_layout(cr, p_layout); cairo_move_to(cr, prm->shadow_offset_x, prm->shadow_offset_y); cairo_set_operator(cr, CAIRO_OPERATOR_OVER); pango_cairo_show_layout(cr, p_layout); } else INFO_ERR("%s(): cairo pattern type != linear (gradient)\n", __func__) } else INFO_ERR("%s(): cairo_pattern_create_linear() error\n", __func__) cairo_pattern_destroy(cr_p); } else { cairo_set_source_rgba(cr, (float)prm->clock_bg_color.red * shadow_k / G_MAXUINT16, (float)prm->clock_bg_color.green * shadow_k / G_MAXUINT16, (float)prm->clock_bg_color.blue * shadow_k / G_MAXUINT16, (float)prm->clock_bg_color_alpha / G_MAXUINT16); pango_cairo_update_layout(cr, p_layout); cairo_move_to(cr, prm->shadow_offset_x, prm->shadow_offset_y); cairo_set_operator(cr, CAIRO_OPERATOR_OVER); pango_cairo_show_layout(cr, p_layout); } } /* Draw text */ cairo_set_source_rgba(cr, (float)prm->clock_fg_color.red / G_MAXUINT16, (float)prm->clock_fg_color.green / G_MAXUINT16, (float)prm->clock_fg_color.blue / G_MAXUINT16, (float)prm->clock_fg_color_alpha / G_MAXUINT16); pango_cairo_update_layout(cr, p_layout); cairo_move_to(cr, 0, 0); cairo_set_operator(cr, CAIRO_OPERATOR_OVER); pango_cairo_show_layout(cr, p_layout); /* Drawing done */ if (p_layout != NULL) g_object_unref(p_layout); cairo_destroy(cr); /* * Draw onto clock area * (We now use cairo instead of deprecated gdk_draw_sth. * Should we use gdk_window_begin/end_paint_rect() stuff here too ? * Not really as this is only called every 500 ms.) */ cr = gdk_cairo_create(GDK_DRAWABLE((env->drwa_clock)->window)); cairo_set_source_surface(cr, surf_clock, 0, height_diff); cairo_rectangle(cr, 0, 0, env->drwa_clock_width, env->drwa_height); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_fill(cr); cairo_destroy(cr); cairo_surface_destroy(surf_clock); } /* Actually clock max width */ int get_clock_width(const Params *prm) { static char clock_font_name_size_bak[FONT_MAXLEN + 1] = ""; static char clock_sec_bak, clock_12h_bak, clock_date_bak; static int date_width_bak = 0; int date_width; static int width = 0; PangoLayout *p_layout; PangoFontDescription *f_des; int layout_width, layout_height, layout_max_width; char *time_str; time_t time2; struct tm *local_time; zboolean hour_is_double_digit; char tmp[64]; int i; if (prm->clock == 'l' || prm->clock == 'r') { p_layout = pango_layout_new(gtk_widget_get_pango_context(get_ticker_env()->win)); pango_layout_set_attributes(p_layout, NULL); pango_layout_set_single_paragraph_mode(p_layout, TRUE); f_des = pango_font_description_from_string((const char *)prm->clock_font_name_size); pango_layout_set_font_description(p_layout, f_des); pango_font_description_free(f_des); time2 = time(NULL); local_time = localtime(&time2); if (prm->clock_date == 'y') { strftime(tmp, 64, DATE_STR, local_time); /* Will have same width using DATE_STR or DATE_STR_2 */ pango_layout_set_text(p_layout, tmp, -1); pango_layout_context_changed(p_layout); pango_layout_get_pixel_size(p_layout, &layout_width, &layout_height); date_width = layout_width; } else date_width = 0; if ( prm->clock_sec != clock_sec_bak || prm->clock_12h != clock_12h_bak || prm->clock_date != clock_date_bak || strcmp(prm->clock_font_name_size, clock_font_name_size_bak) != 0 || date_width != date_width_bak || width == 0) { clock_sec_bak = prm->clock_sec; clock_12h_bak = prm->clock_12h; clock_date_bak = prm->clock_date; str_n_cpy(clock_font_name_size_bak, prm->clock_font_name_size, FONT_MAXLEN); date_width_bak = date_width; if (prm->clock_sec == 'y') { if (prm->clock_12h == 'y') time_str = "%c%c:%c%c:%c%c AM" CLOCK_DELIMITER_STR; /* Ordering doesn't change witdh */ else time_str = "%c%c:%c%c:%c%c" CLOCK_DELIMITER_STR; } else { if (prm->clock_12h == 'y') time_str = "%c%c:%c%c AM" CLOCK_DELIMITER_STR; else time_str = "%c%c:%c%c" CLOCK_DELIMITER_STR; } /* * Hack to adjust clock width because hours are not padded: * we test current hour. */ strftime(tmp, 64, prm->clock_12h == 'y' ? "%I" : "%H", local_time); if (atoi(tmp) > 9) hour_is_double_digit = TRUE; else hour_is_double_digit = FALSE; layout_max_width = 0; for (i = '0'; i <= '9'; i++) { if (prm->clock_sec == 'y') snprintf(tmp, 64, time_str, i, i, i, i, i, i); else snprintf(tmp, 64, time_str, i, i, i, i); time_str = tmp; /* Hack to adjust width */ if (!hour_is_double_digit) time_str++; pango_layout_set_text(p_layout, time_str, -1); pango_layout_context_changed(p_layout); pango_layout_get_pixel_size(p_layout, &layout_width, &layout_height); if (layout_width > layout_max_width) layout_max_width = layout_width; } width = date_width + layout_max_width; if (p_layout != NULL) g_object_unref(p_layout); } } else width = 0; /* Return 0 although if clock = none, actual widget width = 1 */ return width; } tickr_0.7.1.orig/src/tickr/tickr_list.h0000644000175000017500000000535714107736721017505 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #ifndef INC_TICKR_LIST_H #define INC_TICKR_LIST_H #define FLIST_URL_MAXLEN FILE_NAME_MAXLEN #define FLIST_TITLE_MAXLEN FEED_TITLE_MAXLEN #define N_FLIST_MAX (32 * 1024) /* To prevent infinite loops - adjust as necessary */ #define FLIST_SIG "fl_node" /* Make sure FLIST_SIG_LEN = strlen(FLIST_SIG) */ #define FLIST_SIG_LEN 7 #define FLIST_RANK_FORMAT "%3d" /* Make sure format and length match */ #define FLIST_RANK_STR_LEN 3 #define BLANK_STR_16 " " /* Make sure FLIST_RANK_STR_LEN < (BLANK_STR_)16 */ #define SORT_FLIST_BY_RANK\ (get_params()->enable_feed_ordering == 'y') #define IS_FLIST(node)\ (node != NULL && strcmp(node->sig, FLIST_SIG) == 0) #define CHECK_IS_FLIST(node, func)\ if (!IS_FLIST(node))\ big_error(FLIST_ERROR, "%s(): Invalid node in list", func); typedef struct FeedListNode { char *url; char *title; zboolean selected; char rank[FLIST_RANK_STR_LEN + 1]; struct FeedListNode *prev; struct FeedListNode *next; char sig[FLIST_SIG_LEN + 1]; } FList; FList *f_list_new(const char *, const char *, zboolean, const char *); void f_list_free(FList *); void f_list_free_all(FList *); FList *f_list_first(FList *); FList *f_list_last(FList *); FList *f_list_prev(FList *); FList *f_list_next(FList *); FList *f_list_nth(FList *, int); int f_list_index(FList *); int f_list_count(FList *); FList *f_list_add_at_start(FList *, const char *, const char *, zboolean, const char *); FList *f_list_add_at_end(FList *, const char *, const char *, zboolean, const char *); FList *f_list_insert_before(FList *, const char *, const char *, zboolean, const char *); FList *f_list_insert_after(FList *, const char *, const char *, zboolean, const char *); FList *f_list_remove(FList *); void f_list_swap(FList *, FList *); FList *f_list_sort(FList *); int f_list_search(FList *, const char *); int f_list_load_from_file(FList **, const char *); int f_list_save_to_file(FList *, const char *); FList *f_list_clone(FList *); #endif /* INC_TICKR_LIST_H */ tickr_0.7.1.orig/src/tickr/tickr_feedparser.c0000644000175000017500000004413014107736721020635 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" /* * Here, 'RSS' is sometimes used as a synonym of 'feed' and sometimes * used by opposition to 'Atom' (this can be confusing). */ static int depth; static xmlNode *item_or_entry_element; static int n; static int counter; /* * In the algorithm, we now use strings instead of streams, so that we can * use l_str_insert_at_b() in case of reverse scrolling. These strings, * as well as other variables, are set global in this src file because * of recursivity. */ static char *xml_str, *xml_str_extra; /* * Look for URL and, if valid, parse it then dump result into * /TICKR_DIR_NAME/XML_DUMP and -/XML_DUMP_EXTRA. * If URL isn't valid, only set error code and return. */ int get_feed(Resource *resrc, const Params *prm) { char feed_title[FEED_TITLE_MAXLEN + 1]; char feed_link[FILE_NAME_MAXLEN + 1]; char feed_ttl[32]; char file_name[FILE_NAME_MAXLEN + 1]; char url[FILE_NAME_MAXLEN + 1]; int suspend_rq_bak, error_code, i; char *visual_str; suspend_rq_bak = get_ticker_env()->suspend_rq; get_ticker_env()->suspend_rq = TRUE; resrc->rss_ttl = prm->rss_refresh; /* 'xml dump' stuff, will open stream later. */ str_n_cpy(resrc->xml_dump, get_datafile_full_name_from_name(XML_DUMP), FILE_NAME_MAXLEN); if (resrc->fp != NULL) fclose(resrc->fp); /* 'xml dump extra' stuff, will open stream later. */ str_n_cpy(resrc->xml_dump_extra, get_datafile_full_name_from_name(XML_DUMP_EXTRA), FILE_NAME_MAXLEN); if (resrc->fp_extra != NULL) fclose(resrc->fp_extra); str_n_cpy(file_name, get_datafile_full_name_from_name(RESOURCE_DUMP), FILE_NAME_MAXLEN); /* We replace resrc->id with modified URL, file_name = downloaded resource. */ if ((error_code = fetch_resource(resrc->id, (const char *)file_name, url)) == OK) { VERBOSE_INFO_OUT("Resource fetched: %s\n", (const char *)resrc->id); } else if (error_code == FEED_FORMAT_ERROR || error_code == RESOURCE_ENCODING_ERROR) { warning(M_S_MOD, "%s: %s", global_error_str(error_code), resrc->id); return error_code; } else if (error_code == CONNECT_TOO_MANY_ERRORS) { return error_code; } else { warning(M_S_MOD, "Can't fetch resource: %s", resrc->id); return error_code; } /* We use file_name instead of resrc->id. */ if ((i = get_feed_info((int *)&resrc->format, file_name, feed_title, feed_link, feed_ttl)) != OK) { if (i == FEED_UNPARSABLE || i == FEED_EMPTY) warning(M_S_MOD, "%s: %s", global_error_str(i), resrc->id); else if (i == RSS_FORMAT_UNDETERMINED) warning(M_S_MOD, "Undetermined feed format: %s", resrc->id); else warning(M_S_MOD, "get_feed_info() error %d: %s: %s", i, global_error_str(i), resrc->id); return i; } else if (resrc->format == RSS_FORMAT_UNDETERMINED) { warning(M_S_MOD, "Undetermined feed format: %s", resrc->id); return RSS_FORMAT_UNDETERMINED; } /* We now use global strings instead of streams. */ xml_str = l_str_new(NULL); xml_str_extra = l_str_new(NULL); str_n_cpy(resrc->feed_title, feed_title, FEED_TITLE_MAXLEN); if (prm->feed_title == 'y') { /* We remove any LINK_TAG_CHAR from str because it will be used in "link tag". */ remove_char_from_str((char *)feed_title, LINK_TAG_CHAR); if (STANDARD_SCROLLING) { xml_str = l_str_cat(xml_str, (const char *)feed_title); xml_str = l_str_cat(xml_str, prm->feed_title_delimiter); } else { visual_str = log2vis_utf8((const char *)feed_title); xml_str = l_str_insert_at_b(xml_str, (const char *)visual_str); xml_str = l_str_insert_at_b(xml_str, prm->feed_title_delimiter); l_str_free(visual_str); } } if (feed_ttl[0] != '\0') resrc->rss_ttl = atoi(feed_ttl); /* Link and offset stuff reset */ for (i = 0; i < NFEEDLINKANDOFFSETMAX; i++) { resrc->link_and_offset[i].offset_in_surface = 0; (resrc->link_and_offset[i].url)[0] = '\0'; } /* We use file_name instead of resrc->id. */ if ((error_code = parse_xml_file(resrc->format, file_name, resrc->link_and_offset, prm)) == FEED_NO_ITEM_OR_ENTRY_ELEMENT) warning(M_S_MOD, "No 'item' or 'entry' element found in: %s", resrc->id); if (error_code != OK) { l_str_free(xml_str); l_str_free(xml_str_extra); return error_code; } resrc->fp = open_new_datafile_with_name(XML_DUMP, "wb"); fprintf(resrc->fp, "%s", xml_str); l_str_free(xml_str); /* We close then reopen stream in read-only mode. */ fclose(resrc->fp); resrc->fp = open_new_datafile_with_name(XML_DUMP, "rb"); resrc->fp_extra = open_new_datafile_with_name(XML_DUMP_EXTRA, "wb"); fprintf(resrc->fp_extra, "%s", xml_str_extra); l_str_free(xml_str_extra); /* We close then reopen stream in read-only mode. */ fclose(resrc->fp_extra); resrc->fp_extra = open_new_datafile_with_name(XML_DUMP_EXTRA, "rb"); get_ticker_env()->suspend_rq = suspend_rq_bak; return OK; } /* * Must be UTF-8 encoded. */ int parse_xml_file(int format, const char* file_name, FeedLinkAndOffset *link_and_offset, const Params *prm) { xmlDoc *doc; xmlNode *root_element; VERBOSE_INFO_OUT("Parsing XML file ... "); if ((doc = xmlParseFile(file_name)) == NULL) { warning(M_S_MOD, "XML parser error: %s", xmlGetLastError()->message); return FEED_UNPARSABLE; } if ((root_element = xmlDocGetRootElement(doc)) == NULL) { xmlFreeDoc(doc); warning(M_S_MOD, "Empty XML document: '%s'", file_name); return FEED_EMPTY; } depth = 0; item_or_entry_element = NULL; n = 1; counter = 0; if (format == RSS_2_0) get_rss20_selected_elements1(root_element, doc); else if (format == RSS_1_0) get_rss10_selected_elements1(root_element, doc); else if (format == RSS_ATOM) get_atom_selected_elements1(root_element, doc); else { xmlFreeDoc(doc); return FEED_FORMAT_ERROR; } if (item_or_entry_element != NULL) get_feed_selected_elements2(format, item_or_entry_element, doc, link_and_offset, prm); else { xmlFreeDoc(doc); return FEED_NO_ITEM_OR_ENTRY_ELEMENT; } xmlFreeDoc(doc); VERBOSE_INFO_OUT("Done\n"); return OK; } void get_rss20_selected_elements1(xmlNode *some_element, xmlDoc *doc) { xmlNode *cur_node; for (cur_node = some_element; cur_node != NULL; cur_node = cur_node->next) { if (item_or_entry_element != NULL) return; /* RSS 2.0: We don't want extra namespaces. */ if (cur_node->ns != NULL) continue; if (xmlStrcmp(cur_node->name, (const xmlChar *)"rss") == 0 && depth == 0) depth = 1; else if (xmlStrcmp(cur_node->name, (const xmlChar *)"channel") == 0 && depth == 1) depth = 2; else if (xmlStrcmp(cur_node->name, (const xmlChar *)"item") == 0 && depth == 2) depth = 3; if (depth == 3) item_or_entry_element = cur_node; else get_rss20_selected_elements1(cur_node->children, doc); } } void get_rss10_selected_elements1(xmlNode *some_element, xmlDoc *doc) { xmlNode *cur_node; for (cur_node = some_element; cur_node != NULL; cur_node = cur_node->next) { if (item_or_entry_element != NULL) return; if (xmlStrcmp(cur_node->name, (const xmlChar *)"RDF") == 0 && depth == 0) depth = 1; else if (xmlStrcmp(cur_node->name, (const xmlChar *)"item") == 0 && depth == 1) depth = 2; if (depth == 2) item_or_entry_element = cur_node; else get_rss10_selected_elements1(cur_node->children, doc); } } void get_atom_selected_elements1(xmlNode *some_element, xmlDoc *doc) { xmlNode *cur_node; for (cur_node = some_element; cur_node != NULL; cur_node = cur_node->next) { if (item_or_entry_element != NULL) return; if (xmlStrcmp(cur_node->name, (const xmlChar *)"feed") == 0) depth = 1; else if (xmlStrcmp(cur_node->name, (const xmlChar *)"entry") == 0 && depth == 1) depth = 2; if (depth == 2) item_or_entry_element = cur_node; else get_atom_selected_elements1(cur_node->children, doc); } } /* * For every link found, we insert LINK_TAG_CHAR + "00n" inside text with * n = link rank and we fill link_and_offset->url with URL. This is used * later in render_stream_to_surface(). * * With reverse scrolling, we need to use Unicode control characters for * bidi text so that tags and delimiters are correctly placed. */ void get_feed_selected_elements2(int feed_format, xmlNode *some_element, xmlDoc *doc, FeedLinkAndOffset *link_and_offset, const Params *prm) { xmlNode *cur_node, *cur_node_bak; xmlChar *str; xmlChar item_or_entry[16]; xmlChar description_or_summary[16]; char tmp_5[5]; /* 1 (ascii char) + 3 ("000" -> "999") + 1 (NULL terminator) */ char *visual_str; if (feed_format == RSS_2_0 || feed_format == RSS_1_0) { str_n_cpy((char *)item_or_entry, "item", 15); str_n_cpy((char *)description_or_summary, "description", 15); } else if (feed_format == RSS_ATOM) { str_n_cpy((char *)item_or_entry, "entry", 15); str_n_cpy((char *)description_or_summary, "summary", 15); } else { INFO_ERR("%s(): Undefined feed format\n", __func__) return; } for (cur_node = some_element; cur_node != NULL; cur_node = cur_node->next) { /* RSS 2.0: We don't want extra namespaces. */ if (feed_format == RSS_2_0 && cur_node->ns != NULL) continue; if (xmlStrcmp(cur_node->name, (const xmlChar *)item_or_entry) == 0) { cur_node_bak = cur_node; cur_node = cur_node->children; for (; cur_node != NULL; cur_node = cur_node->next) { /* RSS 2.0: We don't want extra namespaces. */ if (feed_format == RSS_2_0 && cur_node->ns != NULL) continue; if (xmlStrcmp(cur_node->name, (const xmlChar *)"title") == 0) { if ((str = xmlNodeListGetString(doc, cur_node->children, 1)) != NULL) { /* We remove any LINK_TAG_CHAR from str because it will be used in "link tag". */ remove_char_from_str((char *)str, LINK_TAG_CHAR); remove_char_from_str((char *)str, ITEM_TITLE_TAG_CHAR); if (prm->item_title == 'y') { if (STANDARD_SCROLLING) { xml_str = l_str_cat(xml_str, (const char *)str); xml_str = l_str_cat(xml_str, prm->item_title_delimiter); } else { visual_str = log2vis_utf8((const char *)str); xml_str = l_str_insert_at_b(xml_str, (const char *)visual_str); xml_str = l_str_insert_at_b(xml_str, prm->item_title_delimiter); l_str_free(visual_str); } } else if (prm->item_description == 'y') { snprintf(tmp_5, 5, "%c%03d", ITEM_TITLE_TAG_CHAR, n); if (STANDARD_SCROLLING) { xml_str_extra = l_str_cat(xml_str_extra, tmp_5); xml_str_extra = l_str_cat(xml_str_extra, (const char *)str); xml_str_extra = l_str_cat(xml_str_extra, "\n"); } else { xml_str_extra = l_str_insert_at_b(xml_str_extra, "\n"); xml_str_extra = l_str_insert_at_b(xml_str_extra, (const char *)str); xml_str_extra = l_str_insert_at_b(xml_str_extra, tmp_5); } } xmlFree(str); } } else if (xmlStrcmp(cur_node->name, (const xmlChar *)description_or_summary) == 0) { if ((str = xmlNodeListGetString(doc, cur_node->children, 1)) != NULL) { /* We remove any LINK_TAG_CHAR from str because it will be used in "link tag". */ remove_char_from_str((char *)str, LINK_TAG_CHAR); remove_char_from_str((char *)str, ITEM_DES_TAG_CHAR); if (prm->item_description == 'y') { if (STANDARD_SCROLLING) { xml_str = l_str_cat(xml_str, (const char *)str); xml_str = l_str_cat(xml_str, prm->item_description_delimiter); } else { visual_str = log2vis_utf8((const char *)str); xml_str = l_str_insert_at_b(xml_str, (const char *)visual_str); xml_str = l_str_insert_at_b(xml_str, prm->item_description_delimiter); l_str_free(visual_str); } } else if (prm->item_title == 'y') { snprintf(tmp_5, 5, "%c%03d", ITEM_DES_TAG_CHAR, n); if (STANDARD_SCROLLING) { xml_str_extra = l_str_cat(xml_str_extra, tmp_5); xml_str_extra = l_str_cat(xml_str_extra, (const char *)str); xml_str_extra = l_str_cat(xml_str_extra, "\n"); } else { xml_str_extra = l_str_insert_at_b(xml_str_extra, "\n"); xml_str_extra = l_str_insert_at_b(xml_str_extra, (const char *)str); xml_str_extra = l_str_insert_at_b(xml_str_extra, tmp_5); } } xmlFree(str); } } } cur_node = cur_node_bak; cur_node = cur_node->children; for (; cur_node != NULL; cur_node = cur_node->next) { /* RSS 2.0: We don't want extra namespaces. */ if (feed_format == RSS_2_0 && cur_node->ns != NULL) continue; if (xmlStrcmp(cur_node->name, (const xmlChar *)"link") == 0) { /* Node content (RSS 2.0 / RSS 1.0) or node attribute (Atom) */ if ((feed_format != RSS_ATOM && ((str = xmlNodeListGetString(doc, cur_node->children, 1)) != NULL)) || (str = xmlGetProp(cur_node, (const xmlChar *)"href")) != NULL) { if (n < NFEEDLINKANDOFFSETMAX + 1) { str_n_cpy((link_and_offset + n)->url, (const char *)str, FILE_NAME_MAXLEN); snprintf(tmp_5, 5, "%c%03d", LINK_TAG_CHAR, n++); if (STANDARD_SCROLLING) xml_str = l_str_cat(xml_str, tmp_5); else xml_str = l_str_insert_at_b(xml_str, tmp_5); } xmlFree(str); } } } cur_node = cur_node_bak; if (prm->n_items_per_feed != 0) if (++counter >= prm->n_items_per_feed) break; } } } /* Any useful ? Text is already supposed to be UTF-8 encoded. */ static const char *try_str_to_utf8(const char *str) { static char str2[1024]; int i; str_n_cpy(str2, str, 1023); for (i = strlen(str2); i > 0; i--) { str2[i - 1] = '\0'; if (g_utf8_validate(str2, -1, NULL)) break; } if (i == 0) str_n_cpy(str2, "(not UTF-8 encoded)", 1023); return (const char *)str2; } /* * Info is 1 int + 4 strings, feed_* can be NULL. */ int get_feed_info(int *format, const char *file_name, char *feed_title, char *feed_link, char *feed_ttl) { xmlDoc *doc; xmlNode *root_element; *format = RSS_FORMAT_UNDETERMINED; if ((doc = xmlParseFile(file_name)) == NULL) { return FEED_UNPARSABLE; } else { if ((root_element = xmlDocGetRootElement(doc)) == NULL) { xmlFreeDoc(doc); return FEED_EMPTY; } else { if (xmlStrcmp(root_element->name, (const xmlChar *)"rss") == 0) *format = RSS_2_0; else if (xmlStrcmp(root_element->name, (const xmlChar *)"RDF") == 0) *format = RSS_1_0; else if (xmlStrcmp(root_element->name, (const xmlChar *)"feed") == 0) *format = RSS_ATOM; else { xmlFreeDoc(doc); return *format; } if (feed_title != NULL) { feed_title[0] = '\0'; get_xml_first_element(root_element->children, doc, "title", feed_title, FEED_TITLE_MAXLEN); } if (feed_link != NULL) { feed_link[0] = '\0'; get_xml_first_element(root_element->children, doc, "link", feed_link, FILE_NAME_MAXLEN); } if (feed_ttl != NULL) { feed_ttl[0] = '\0'; get_xml_first_element(root_element->children, doc, "ttl", feed_ttl, 31); } xmlFreeDoc(doc); if (!g_utf8_validate(feed_title, -1, NULL)) str_n_cpy(feed_title, try_str_to_utf8(feed_title), 255); /* We remove any LINK_TAG_CHAR from str because it will be used in "link tag". */ remove_char_from_str(feed_title, LINK_TAG_CHAR); return OK; } } } /* * string must be empty (string[0] = '\0') as function is recursive. */ void get_xml_first_element(xmlNode *some_element, xmlDoc *doc, char *name, char *string, int length) { xmlNode *cur_node; xmlChar *str; if (string[0] != '\0') return; for (cur_node = some_element; cur_node != NULL; cur_node = cur_node->next) { if (xmlStrcmp(cur_node->name, (const xmlChar *)name) == 0) { if ((str = xmlNodeListGetString(doc, cur_node->children, 1)) != NULL) { str_n_cpy(string, (const char *)str, length); xmlFree(str); } else string[0] = '\0'; break; } get_xml_first_element(cur_node->children, doc, name, string, length); } } /* * Reorder a UTF-8 string from logical to visual. * Original (logical) string is not modified. * Returned (visual) string must be freed (l_str_free) afterwards. */ char *log2vis_utf8(const char *str) { char *utf8_str; char *utf8_str_2; FriBidiChar *unicode_str; /* (uint32_t *) */ FriBidiChar *unicode_str_2; FriBidiParType *pbase_dir; /* (uint32_t *) */ FriBidiLevel *embedding_levels; /* (signed char) */ size_t mem_size; int utf8_str_len; char *visual_str; utf8_str = l_str_new(str); utf8_str_2 = l_str_new(str); mem_size = (strlen(str) + 1) * 4; /* Not sure what size should be */ unicode_str = (FriBidiChar *)malloc2(mem_size); unicode_str_2 = (FriBidiChar *)malloc2(mem_size); pbase_dir = (FriBidiChar *)malloc2(mem_size / 2 ); /* Same here */ embedding_levels = (signed char *)malloc2(mem_size / 2); /* And here */ utf8_str_len = fribidi_charset_to_unicode(FRIBIDI_CHAR_SET_UTF8, utf8_str, strlen(utf8_str), unicode_str); if (fribidi_log2vis(unicode_str, utf8_str_len, pbase_dir, unicode_str_2, NULL, NULL, embedding_levels) == 0) { INFO_ERR("%s(): fribidi_log2vis() returned 0\n", __func__) l_str_free(utf8_str_2); visual_str = l_str_new("Invalid_string"); } else { fribidi_unicode_to_charset(FRIBIDI_CHAR_SET_UTF8, unicode_str_2, utf8_str_len, utf8_str_2); visual_str = utf8_str_2; } l_str_free(utf8_str); free2(unicode_str); free2(unicode_str_2); free2(pbase_dir); free2(embedding_levels); return visual_str; } tickr_0.7.1.orig/src/tickr/Makefile-tickr-win320000644000175000017500000000236514107736721020673 0ustar manutmmanutm# Makefile for TICKR - GTK-based Feed Reader - win32 version src = tickr_main.c tickr_resource.c tickr_render.c tickr_params.c\ tickr_clock.c tickr_feedparser.c tickr_list.c tickr_feedpicker.c\ tickr_prefwin.c tickr_otherwins.c tickr_misc.c tickr_helptext.c\ tickr_opml.c tickr_http.c tickr_connectwin.c tickr_quickfeedpicker.c\ tickr_quicksetup.c tickr_check4updates.c tickr_error.c tickr_tls.c obj = $(src:.c=.o) CC = gcc CFLAGS = -O2 -Wall -Wextra -Wunused-parameter -Wshadow -Wpointer-arith\ -ffast-math -pedantic -Wno-variadic-macros\ `pkg-config --cflags gtk+-2.0`\ -I/home/manutm/src/libxml2-2.7.8-win32/include\ -I/home/manutm/src/gnutls-win32/include\ -I/home/manutm/src/fribidi-win32/include\ -DWIN32_V LIBS = -mwindows -lwinmm ../libetm-0.5.0/libetm.a\ -lws2_32 `pkg-config --libs gtk+-2.0`\ ../../win32_install_stuff/dlls/libxml2.dll.a\ ../../win32_install_stuff/dlls/libgnutls-win32/libgnutls.dll.a\ ../../win32_install_stuff/dlls/libfribidi-win32/libfribidi.dll.a all: tickr $(obj): $(src) tickr.h Makefile $(CC) $(CFLAGS) -c $(src) tickr: $(obj) $(CC) -o tickr $(obj) $(LIBS) .PHONY: clean clean: rm -f $(obj) tickr.exe #LIBS = --mms-bitfields -mwindows -lwinmm ../libetm-0.5.0/libetm.a\ tickr_0.7.1.orig/src/tickr/tickr_error.c0000644000175000017500000000711114107736721017644 0ustar manutmmanutm/* * TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 * * * 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 . */ #include "tickr.h" #include "tickr_error.h" const char *tickr_error_str(tickr_error_code e_c) { return error_str_from_error_code(e_a, sizeof(e_a) / sizeof(e_a[0]), e_c); } const char *global_error_str(int error_code) { if (error_code >= LIBETM_OK && error_code <= LIBETM_LASTERRORCODE) return libetm_error_str((libetm_error_code)error_code); else return tickr_error_str((tickr_error_code)error_code); } /* * This func's prototype is in libetm/error.h. * This func is not defined in libetm but in application and it handles * CRITICAL ERRORS from both libetm and application. */ #define ERROR_WARNING_STR_MAXLEN (8 * 1024 - 1) #define OUCH_STR "\nOuch !! Something went wrong ...\n\n" int big_error(int big_error_code, const char *format, ...) { char error_str[ERROR_WARNING_STR_MAXLEN + 1] = ""; va_list a_list; if (get_ticker_env() != NULL) get_ticker_env()->suspend_rq = TRUE; str_n_cpy(error_str, OUCH_STR, 100); str_n_cat(error_str, "CRITICAL ERROR in ", 100); if (big_error_code > LIBETM_LASTERRORCODE) str_n_cat(error_str, APP_NAME ": ", 100); va_start(a_list, format); vsnprintf(error_str + strlen(error_str), ERROR_WARNING_STR_MAXLEN + 1 - strlen(error_str), format, a_list); va_end(a_list); snprintf(error_str + strlen(error_str), ERROR_WARNING_STR_MAXLEN + 1 - strlen(error_str), " - Will quit now"); if (STD_ERR != NULL) INFO_ERR("%s\n", (char *)error_str + strlen(OUCH_STR)) /* We want this win to always popup */ if (get_params() != NULL && get_ticker_env() != NULL) { get_params()->disable_popups = 'n'; info_win(APP_NAME " - Critical error", error_str, INFO_ERROR, FALSE); } else minimalistic_info_win(APP_NAME " - Critical error", error_str); free_all(); exit(big_error_code); } /* * This func's prototype is in libetm/error.h. * This func is not defined in libetm but in application and it handles * WARNINGS from both libetm and application. * * Will popup and wait for INFO_WIN_WAIT_TIMEOUT ms if no_block == TRUE, then close * otherwise, will block until an appropriate keyboard/mouse action happens. * * You can use BLOCK/NO_BLOCK helpers. */ void warning(int no_block, const char *format, ...) { char warning_str[ERROR_WARNING_STR_MAXLEN + 1] = ""; va_list a_list; va_start(a_list, format); vsnprintf(warning_str + strlen(warning_str), ERROR_WARNING_STR_MAXLEN + 1 - strlen(warning_str), format, a_list); va_end(a_list); INFO_ERR("%s\n", warning_str) if (no_block) info_win_no_block(warning_str, INFO_WIN_WAIT_TIMEOUT); else info_win("", warning_str, INFO_WARNING, FALSE); } void dump_error_codes() { int i, j; dump_libetm_error_codes(); fprintf(STD_OUT, "\n%s-%s error codes and strings:\n", APP_NAME, APP_V_NUM); for (i = 0; i < (int)(sizeof(e_a) / sizeof(e_a[0])); i++) { j = i + LIBETM_LASTERRORCODE + 1; fprintf(STD_OUT, "%d %s\n", j , tickr_error_str(j)); } } tickr_0.7.1.orig/configure0000775000175000017500000060603014107736721015166 0ustar manutmmanutm#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for tickr 0.7.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: manutm007@gmail.com about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='tickr' PACKAGE_TARNAME='tickr' PACKAGE_VERSION='0.7.1' PACKAGE_STRING='tickr 0.7.1' PACKAGE_BUGREPORT='manutm007@gmail.com' PACKAGE_URL='' ac_unique_file="config.h.in" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS FRIBIDI_LIBS FRIBIDI_CFLAGS GNUTLS_LIBS GNUTLS_CFLAGS XML2_LIBS XML2_CFLAGS GTK2_LIBS GTK2_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG LIBOBJS EGREP GREP CPP XMKMF RANLIB am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking with_x ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS XMKMF CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GTK2_CFLAGS GTK2_LIBS XML2_CFLAGS XML2_LIBS GNUTLS_CFLAGS GNUTLS_LIBS FRIBIDI_CFLAGS FRIBIDI_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures tickr 0.7.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/tickr] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of tickr 0.7.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-x use the X Window System Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory XMKMF Path to xmkmf, Makefile generator for X Window System CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GTK2_CFLAGS C compiler flags for GTK2, overriding pkg-config GTK2_LIBS linker flags for GTK2, overriding pkg-config XML2_CFLAGS C compiler flags for XML2, overriding pkg-config XML2_LIBS linker flags for XML2, overriding pkg-config GNUTLS_CFLAGS C compiler flags for GNUTLS, overriding pkg-config GNUTLS_LIBS linker flags for GNUTLS, overriding pkg-config FRIBIDI_CFLAGS C compiler flags for FRIBIDI, overriding pkg-config FRIBIDI_LIBS linker flags for FRIBIDI, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF tickr configure 0.7.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ---------------------------------- ## ## Report this to manutm007@gmail.com ## ## ---------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by tickr $as_me 0.7.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.16' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='tickr' VERSION='0.7.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_config_headers="$ac_config_headers config.h" # Checks for programs. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 $as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 $as_echo "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Checks for libraries. # Checks for header files. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h fcntl.h netdb.h stdlib.h string.h sys/socket.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" if test "x$ac_cv_type_ssize_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define ssize_t int _ACEOF fi # Checks for library functions. for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "#define HAVE_MALLOC 1" >>confdefs.h else $as_echo "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac $as_echo "#define malloc rpl_malloc" >>confdefs.h fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 $as_echo_n "checking for GNU libc compatible realloc... " >&6; } if ${ac_cv_func_realloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_realloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif int main () { return ! realloc (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_realloc_0_nonnull=yes else ac_cv_func_realloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 $as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } if test $ac_cv_func_realloc_0_nonnull = yes; then : $as_echo "#define HAVE_REALLOC 1" >>confdefs.h else $as_echo "#define HAVE_REALLOC 0" >>confdefs.h case " $LIBOBJS " in *" realloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; esac $as_echo "#define realloc rpl_realloc" >>confdefs.h fi for ac_func in memset select socket strerror strncasecmp strtoul do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK2" >&5 $as_echo_n "checking for GTK2... " >&6; } if test -n "$GTK2_CFLAGS"; then pkg_cv_GTK2_CFLAGS="$GTK2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK2_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK2_LIBS"; then pkg_cv_GTK2_LIBS="$GTK2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK2_LIBS=`$PKG_CONFIG --libs "gtk+-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0" 2>&1` else GTK2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK2_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtk+-2.0) were not met: $GTK2_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTK2_CFLAGS and GTK2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTK2_CFLAGS and GTK2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTK2_CFLAGS=$pkg_cv_GTK2_CFLAGS GTK2_LIBS=$pkg_cv_GTK2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML2" >&5 $as_echo_n "checking for XML2... " >&6; } if test -n "$XML2_CFLAGS"; then pkg_cv_XML2_CFLAGS="$XML2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XML2_CFLAGS=`$PKG_CONFIG --cflags "libxml-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$XML2_LIBS"; then pkg_cv_XML2_LIBS="$XML2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XML2_LIBS=`$PKG_CONFIG --libs "libxml-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then XML2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libxml-2.0" 2>&1` else XML2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libxml-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$XML2_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libxml-2.0) were not met: $XML2_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables XML2_CFLAGS and XML2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables XML2_CFLAGS and XML2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else XML2_CFLAGS=$pkg_cv_XML2_CFLAGS XML2_LIBS=$pkg_cv_XML2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUTLS" >&5 $as_echo_n "checking for GNUTLS... " >&6; } if test -n "$GNUTLS_CFLAGS"; then pkg_cv_GNUTLS_CFLAGS="$GNUTLS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnutls\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnutls") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GNUTLS_CFLAGS=`$PKG_CONFIG --cflags "gnutls" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GNUTLS_LIBS"; then pkg_cv_GNUTLS_LIBS="$GNUTLS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnutls\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnutls") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GNUTLS_LIBS=`$PKG_CONFIG --libs "gnutls" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GNUTLS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnutls" 2>&1` else GNUTLS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnutls" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GNUTLS_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gnutls) were not met: $GNUTLS_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GNUTLS_CFLAGS and GNUTLS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GNUTLS_CFLAGS and GNUTLS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GNUTLS_CFLAGS=$pkg_cv_GNUTLS_CFLAGS GNUTLS_LIBS=$pkg_cv_GNUTLS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FRIBIDI" >&5 $as_echo_n "checking for FRIBIDI... " >&6; } if test -n "$FRIBIDI_CFLAGS"; then pkg_cv_FRIBIDI_CFLAGS="$FRIBIDI_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fribidi\""; } >&5 ($PKG_CONFIG --exists --print-errors "fribidi") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FRIBIDI_CFLAGS=`$PKG_CONFIG --cflags "fribidi" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FRIBIDI_LIBS"; then pkg_cv_FRIBIDI_LIBS="$FRIBIDI_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fribidi\""; } >&5 ($PKG_CONFIG --exists --print-errors "fribidi") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FRIBIDI_LIBS=`$PKG_CONFIG --libs "fribidi" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FRIBIDI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fribidi" 2>&1` else FRIBIDI_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fribidi" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FRIBIDI_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (fribidi) were not met: $FRIBIDI_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables FRIBIDI_CFLAGS and FRIBIDI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables FRIBIDI_CFLAGS and FRIBIDI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else FRIBIDI_CFLAGS=$pkg_cv_FRIBIDI_CFLAGS FRIBIDI_LIBS=$pkg_cv_FRIBIDI_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi ac_config_files="$ac_config_files Makefile src/Makefile src/tickr/Makefile src/libetm-0.5.0/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by tickr $as_me 0.7.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ tickr config.status 0.7.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/tickr/Makefile") CONFIG_FILES="$CONFIG_FILES src/tickr/Makefile" ;; "src/libetm-0.5.0/Makefile") CONFIG_FILES="$CONFIG_FILES src/libetm-0.5.0/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi tickr_0.7.1.orig/win32_install_stuff/0000744000175000017500000000000014107736721017145 5ustar manutmmanutmtickr_0.7.1.orig/win32_install_stuff/README_required_dlls0000644000175000017500000000076414107736721022754 0ustar manutmmanutmdlls to be copied here (win32_install_stuff/) === libxml2-2.dll.a version 2.7.8 === from http://xmlsoft.org/sources/win32/libxml2-2.7.8.win32.zip also need to copy libxml2-2.7.8.win32 to C:/MinGW/msys/1.0/home/manutm/src/ === libglib-2.0-0.dll === glib-2.26.0 patched to use timeGetTime() instead of GetSystemTimeAsFileTime() in order to get a much better highest resolution value -> from 15 ms to a few ms === libgnutls-win32/* === gnutls-3.4.1-w32 (from ftp://ftp.gnutls.org/gcrypt/gnutls/w32/) tickr_0.7.1.orig/win32_install_stuff/LICENSE0000644000175000017500000000127114107736721020155 0ustar manutmmanutm====== TICKR LICENSE ====== Tickr version 0.7.1 - Copyright (C) Emmanuel Thomas-Maurin 2009-2021 Tickr 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. Tickr 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 . tickr_0.7.1.orig/win32_install_stuff/README_gui_font0000644000175000017500000000023614107736721021722 0ustar manutmmanutmTo change Tickr user interface font on Windows (and also all GTK apps that you may use), edit and copy .gtkrc-2.0 in 'C:\Documents and Settings\USER_NAME\' tickr_0.7.1.orig/win32_install_stuff/build-win32-installer0000644000175000017500000000205514107736721023126 0ustar manutmmanutm#! /bin/bash # This script copy stuff and build TICKR win32 installer (by calling # installer.iss) BIN_DIR="tickr-win32-bin" IMAGES_DIR="../../images" WIN32_INSTALL_STUFF_DIR="../../win32_install_stuff" GTK_RUNTIME_DIR="../../gtk2-win32-full-runtime" DLLS_DIR=$WIN32_INSTALL_STUFF_DIR"/dlls" TXT_FILES_DIR="../.." cp $IMAGES_DIR/tickr-icon.ico ./ c:/program\ files/ResHack/reshacker.exe -add tickr.exe, tickr.exe, tickr-icon.ico, ICONGROUP, TICKRICON, rm tickr-icon.ico mkdir -p $BIN_DIR cp tickr.exe $BIN_DIR/ cp $IMAGES_DIR/tickr-*.png $BIN_DIR/ cp -r $GTK_RUNTIME_DIR/* $BIN_DIR/ cp $DLLS_DIR/*.dll $BIN_DIR/ cp $DLLS_DIR/*.dll.a $BIN_DIR/ cp -r $DLLS_DIR/libgnutls-win32/* $BIN_DIR/ cp -r $DLLS_DIR/libfribidi-win32/* $BIN_DIR/ cp $WIN32_INSTALL_STUFF_DIR/LICENSE $BIN_DIR/ cp $TXT_FILES_DIR/COPYING $BIN_DIR/ cp $TXT_FILES_DIR/README $BIN_DIR/ cp $TXT_FILES_DIR/tickr-url-list $BIN_DIR/ mkdir -p c:/documents\ and\ settings/manutm/bureau/binaries c:/program\ files/inno\ setup\ 5/iscc.exe $TXT_FILES_DIR/installer.iss rm -r $BIN_DIR tickr_0.7.1.orig/win32_install_stuff/installer.iss0000644000175000017500000000672314107736721021674 0ustar manutmmanutm; === This inno_setup script 'compiles' TICKR win32 installer === [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) ; previous app id (for News): AppId={{4C30F291-1B7B-4E53-AB2E-8F515B8F99E5} AppId={{A3E7BF61-5796-451F-8DC4-753E4BA6B048} AppName=Tickr AppVersion=0.7.1 ;AppVerName=Tickr 0.7.1 AppPublisher=ETMSoftware AppPublisherURL=http://www.open-tickr.net/ AppSupportURL=http://www.open-tickr.net/help.php AppUpdatesURL=http://www.open-tickr.net/download.php DefaultDirName={pf}\Tickr DisableDirPage=no DefaultGroupName=Tickr DisableProgramGroupPage=no LicenseFile=C:\MinGW\msys\1.0\home\manutm\src\tickr-0.7.1\win32_install_stuff\LICENSE OutputDir=C:\Users\manutm\Desktop\binaries OutputBaseFilename=Tickr-0.7.1-Setup SetupIconFile=C:\MinGW\msys\1.0\home\manutm\src\tickr-0.7.1\images\tickr-icon.ico Compression=lzma SolidCompression=yes [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" ; (not available in new version) Name: "basque"; MessagesFile: "compiler:Languages\Basque.isl" Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl" Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl" Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl" Name: "french"; MessagesFile: "compiler:Languages\French.isl" Name: "german"; MessagesFile: "compiler:Languages\German.isl" Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl" Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl" Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl" Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl" Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl" Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl" Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" ; (not available in new version) Name: "slovak"; MessagesFile: "compiler:Languages\Slovak.isl" Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl" Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1 [Files] Source: "C:\MinGW\msys\1.0\home\manutm\src\tickr-0.7.1\src\tickr\tickr-win32-bin\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: "{group}\Tickr"; Filename: "{app}\tickr.exe" Name: "{group}\{cm:ProgramOnTheWeb,Tickr}"; Filename: "http://www.open-tickr.net" Name: "{group}\{cm:UninstallProgram,Tickr}"; Filename: "{uninstallexe}" Name: "{commondesktop}\Tickr"; Filename: "{app}\tickr.exe"; Tasks: desktopicon Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\Tickr"; Filename: "{app}\tickr.exe"; Tasks: quicklaunchicon [Run] Filename: "{app}\tickr.exe"; Description: "{cm:LaunchProgram,Tickr}"; Flags: nowait postinstall skipifsilent tickr_0.7.1.orig/win32_install_stuff/.gtkrc-2.00000644000175000017500000000012214107736721020552 0ustar manutmmanutmstyle "win32-font" { font_name = "papyrus 10" } class "*" style "win32-font" tickr_0.7.1.orig/COPYING0000644000175000017500000010451314107736721014307 0ustar manutmmanutm GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . tickr_0.7.1.orig/configure.ac0000644000175000017500000000201714107736721015536 0ustar manutmmanutm# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.67]) AC_INIT([tickr], [0.7.1], [manutm007@gmail.com]) AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC AC_PROG_INSTALL AM_PROG_CC_C_O AC_PROG_RANLIB # Checks for libraries. # Checks for header files. AC_PATH_X AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h stdlib.h string.h sys/socket.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_SIZE_T AC_TYPE_SSIZE_T # Checks for library functions. AC_FUNC_MALLOC AC_FUNC_REALLOC AC_CHECK_FUNCS([memset select socket strerror strncasecmp strtoul]) PKG_CHECK_MODULES(GTK2, gtk+-2.0, ,) PKG_CHECK_MODULES(XML2, libxml-2.0, ,) PKG_CHECK_MODULES(GNUTLS, gnutls, ,) PKG_CHECK_MODULES(FRIBIDI, fribidi, ,) AC_CONFIG_FILES([Makefile src/Makefile src/tickr/Makefile src/libetm-0.5.0/Makefile]) AC_OUTPUT tickr_0.7.1.orig/tickr-url-list0000644000175000017500000000515114107736721016062 0ustar manutmmanutm* 0https://cneos.jpl.nasa.gov/feed/news.xml>CNEOS Recent News * 0http://feeds.arstechnica.com/arstechnica/index>Ars Technica - 0http://feeds.bbci.co.uk/news/business/rss.xml?edition=int>BBC News - Business * 0http://feeds.bbci.co.uk/news/rss.xml?edition=int>BBC News - Home - 0http://feeds.bbci.co.uk/news/science_and_environment/rss.xml?edition=int>BBC News - Science & Environment - 0http://feeds.bbci.co.uk/news/technology/rss.xml?edition=int>BBC News - Technology - 0http://feeds.feedburner.com/d0od>OMG! Ubuntu! * 0https://feeds.finance.yahoo.com/rss/2.0/headline?s=yhoo®ion=US&lang=en-US>Yahoo! Finance: yhoo News * 0https://news.google.com/rss?cf=all&hl=en-US&pz=1k&ucbcb=1&gl=US&ceid=US:en>Top stories - Google News * 0https://news.yahoo.com/rss/world>Yahoo News - Latest News & Headlines - 0http://rss.cnn.com/rss/cnn_topstories.rss>CNN.com - RSS Channel - HP Hero * 0http://rss.cnn.com/rss/edition.rss>CNN.com - RSS Channel - App International Edition - 0http://rss.cnn.com/rss/edition_europe.rss>CNN.com - RSS Channel - Regions - Europe - 0http://rss.cnn.com/rss/edition_us.rss>CNN.com - RSS Channel - US - 0http://rss.cnn.com/rss/edition_world.rss>CNN.com - RSS Channel - World * 0https://rss.nytimes.com/services/xml/rss/nyt/World.xml>NYT > World News * 0http://rss.slashdot.org/Slashdot/slashdot>Slashdot - 0http://rss.weather.com.au/nsw/sydney>Weather.com.au - Sydney Weather - 0http://static.feed.rbc.ru/rbc/logical/rbcdaily.ru/daily.rss>газета РБК - последний выпуск - 0https://www.eff.org/rss/updates.xml>Deeplinks - 0https://www.france24.com/fr/rss>En direct : le Tchad ferme ses frontières après la mort du - 0https://www.hs.fi/rss/kotimaa.xml>Kotimaa - Helsingin Sanomat - 0https://www.iltalehti.fi/rss/uutiset.xml>Iltalehti.fi tuoreimmat uutiset - Uutiset * 0https://www.nasa.gov/rss/dyn/breaking_news.rss>NASA Breaking News * 0https://www.theguardian.com/international/rss>The Guardian - 0https://www.theguardian.com/uk/business/rss>Business | The Guardian - 0https://www.theguardian.com/uk/commentisfree/rss>Opinion | The Guardian - 0https://www.theguardian.com/uk/technology/rss>Technology | The Guardian - 0https://www.theguardian.com/world/rss>World news | The Guardian - 0http://www.tv5monde.com/TV5Site/rss/actualites.php?rub=12>TV5MONDE info - Nouvelles technologies - 0http://www.tv5monde.com/TV5Site/rss/actualites.php?rub=2>TV5MONDE info - Monde - 0http://www.tv5monde.com/TV5Site/rss/actualites.php?rub=7>TV5MONDE info - Economie/finances - 0http://www.ynet.co.il/Integration/StoryRss2.xml>ynet - חדשות - 0http://www3.nhk.or.jp/rss/news/cat0.xml>NHKニュース tickr_0.7.1.orig/depcomp0000755000175000017500000005602014107736721014630 0ustar manutmmanutm#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: tickr_0.7.1.orig/glib-2.26.0-win32-patch/0000744000175000017500000000000014107736721016743 5ustar manutmmanutmtickr_0.7.1.orig/glib-2.26.0-win32-patch/README_glib_patch0000644000175000017500000000126114107736721022001 0ustar manutmmanutmHacking glib-win32 ------------------ Replace GetSystemTimeAsFileTime() -> resolution = 15 ms with timeGetTime() and some extra stuff in gmain.c (also in gmain.h and gthread.c). The patch is also in bugzilla at: where you may check for updates. Building glib from src ---------------------- Download glib-2.26.0 src from gtk.org. Apply patch. ./configure --prefix=/usr/local/glib --with-threads=win32 Add "-lwinmm" to G_LIBS_EXTRA in config.status. Replace "windres" with "windres --use-temp-file" in config.status. make make install Compile test.c and run it in /usr/local/glib/bin. g_timeout_add_full() -> higher resolution ? tickr_0.7.1.orig/glib-2.26.0-win32-patch/test/0000744000175000017500000000000014107736721017722 5ustar manutmmanutmtickr_0.7.1.orig/glib-2.26.0-win32-patch/test/test.c0000644000175000017500000000204114107736721021044 0ustar manutmmanutm#include #include #include #include GMainLoop *main_loop; int delay = 50, counter = 0; time_t time0 = 0, time1 = 0; static gint callback() { if (counter == 0) time0 = time(NULL); else if (counter == 1000 - 1) time1 = time(NULL); if (counter++ < 1000 - 1) return TRUE; else { printf("%4d ms\n", (int)difftime(time1, time0)); if (delay > 30) delay -= 10; else { if (delay > 15) delay -= 5; else delay--; } if (delay > 0) { counter = 0; printf("%4d ms - ", delay); g_timeout_add_full(G_PRIORITY_HIGH, delay, callback, NULL, NULL); } else g_main_loop_quit(main_loop); return FALSE; } } int main() { printf( "=== Testing glib with 1000 calls to callback function ===\n" "Requested g_timeout interval - real interval\n"); printf("%4d ms - ", delay); g_timeout_add_full(G_PRIORITY_HIGH, delay, callback, NULL, NULL); main_loop = g_main_loop_new(NULL, TRUE); g_main_loop_run(main_loop); return 0; } tickr_0.7.1.orig/glib-2.26.0-win32-patch/test/Makefile0000644000175000017500000000042514107736721021365 0ustar manutmmanutmsrc = test.c obj = $(src:.c=.o) CC = gcc CFLAGS = -O2 -Wall -Wextra `pkg-config --cflags glib-2.0` LIBS = --mms-bitfields `pkg-config --libs glib-2.0` all: test $(obj): $(src) Makefile $(CC) $(CFLAGS) -c $(src) test: $(obj) $(CC) -o test $(obj) $(LIBS) tickr_0.7.1.orig/glib-2.26.0-win32-patch/run_diff0000755000175000017500000000013714107736721020470 0ustar manutmmanutm#! /bin/bash diff -u -r glib-2.26.0 glib-2.26.0-win32-mmtimer > glib-2.26.0-win32-mmtimer.diff tickr_0.7.1.orig/glib-2.26.0-win32-patch/run_patch0000755000175000017500000000011214107736721020650 0ustar manutmmanutm#! /bin/bash cd glib-2.26.0 patch -p1 < ../glib-2.26.0-win32-mmtimer.diff tickr_0.7.1.orig/glib-2.26.0-win32-patch/glib-2.26.0-win32-mmtimer.diff0000644000175000017500000000577714107736721023667 0ustar manutmmanutmdiff -u -r glib-2.26.0/glib/gmain.c glib-2.26.0-win32-mmtimer/glib/gmain.c --- glib-2.26.0/glib/gmain.c 2010-09-13 15:57:51 +0000 +++ glib-2.26.0-win32-mmtimer/glib/gmain.c 2010-12-04 16:21:25 +0000 @@ -108,6 +108,53 @@ #include "gtimer.h" #endif +#ifdef G_OS_WIN32 +/* starting_time = time from Unix epoch to system start + * in nanoseconds + */ +static guint64 init_win32_mmtimer () +{ + TIMECAPS tc; + MMRESULT mmr; + unsigned int highest_res; + guint64 starting_time; + + mmr = timeGetDevCaps (&tc, sizeof (TIMECAPS)); + highest_res = tc.wPeriodMin; + if (timeBeginPeriod (highest_res) == TIMERR_NOERROR) + { + /* Returns 100s of nanoseconds since start of 1601 */ + GetSystemTimeAsFileTime ((FILETIME *)&starting_time); + /* Offset to Unix epoch */ + starting_time -= G_GINT64_CONSTANT (116444736000000000); + /* Convert to nanoseconds */ + starting_time *= 100; + /* Substract uptime */ + return (starting_time -= timeGetTime () * 1000000); + } + else + { + g_error ("init_win32_mmtimer() error"); + return 0; + } +} + +/* Time since Unix epoch - Will init timer on 1st call */ +guint64 get_time_nanosec_from_win32_mmtimer () +{ + static guint64 starting_time; + static int i = 0; + + if (i == 0) + { + i++; + /* Call only once */ + starting_time = init_win32_mmtimer (); + } + return (guint64)(timeGetTime () * 1000000 + starting_time); +} +#endif + /** * SECTION:main * @title: The Main Event Loop @@ -1793,22 +1840,14 @@ result->tv_sec = r.tv_sec; result->tv_usec = r.tv_usec; #else - FILETIME ft; guint64 time64; g_return_if_fail (result != NULL); - GetSystemTimeAsFileTime (&ft); - memmove (&time64, &ft, sizeof (FILETIME)); - - /* Convert from 100s of nanoseconds since 1601-01-01 - * to Unix epoch. Yes, this is Y2038 unsafe. - */ - time64 -= G_GINT64_CONSTANT (116444736000000000); - time64 /= 10; - + time64 = get_time_nanosec_from_win32_mmtimer () / 1000; /* in usec */ result->tv_sec = time64 / 1000000; result->tv_usec = time64 % 1000000; + return; #endif } diff -u -r glib-2.26.0/glib/gmain.h glib-2.26.0-win32-mmtimer/glib/gmain.h --- glib-2.26.0/glib/gmain.h 2010-08-09 13:34:46 +0000 +++ glib-2.26.0-win32-mmtimer/glib/gmain.h 2010-12-04 15:54:25 +0000 @@ -28,6 +28,8 @@ #include #include +guint64 get_time_nanosec_from_win32_mmtimer (); + G_BEGIN_DECLS /** diff -u -r glib-2.26.0/glib/gthread.c glib-2.26.0-win32-mmtimer/glib/gthread.c --- glib-2.26.0/glib/gthread.c 2010-09-21 18:10:13 +0000 +++ glib-2.26.0-win32-mmtimer/glib/gthread.c 2010-12-04 15:54:25 +0000 @@ -1859,17 +1859,7 @@ gettime (void) { #ifdef G_OS_WIN32 - guint64 v; - - /* Returns 100s of nanoseconds since start of 1601 */ - GetSystemTimeAsFileTime ((FILETIME *)&v); - - /* Offset to Unix epoch */ - v -= G_GINT64_CONSTANT (116444736000000000); - /* Convert to nanoseconds */ - v *= 100; - - return v; + return get_time_nanosec_from_win32_mmtimer (); #else struct timeval tv; tickr_0.7.1.orig/README_GTK30000644000175000017500000000033014107736721014714 0ustar manutmmanutmFrom glib-2.34.3/glib/gmain.c in new GTK3-win32 (http://www.gtk.org/download/win32.php) Apps that need higher precision in timeouts and clock reads can call timeBeginPeriod() to increase it as much as they want tickr_0.7.1.orig/Makefile.am0000644000175000017500000000001614107736721015301 0ustar manutmmanutmSUBDIRS = src tickr_0.7.1.orig/Makefile.in0000664000175000017500000006023614107736721015326 0ustar manutmmanutm# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in AUTHORS \ COPYING ChangeLog INSTALL NEWS README TODO compile depcomp \ install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ FRIBIDI_LIBS = @FRIBIDI_LIBS@ GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ GNUTLS_LIBS = @GNUTLS_LIBS@ GREP = @GREP@ GTK2_CFLAGS = @GTK2_CFLAGS@ GTK2_LIBS = @GTK2_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ XML2_CFLAGS = @XML2_CFLAGS@ XML2_LIBS = @XML2_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tickr_0.7.1.orig/images/0000744000175000017500000000000014107736721014513 5ustar manutmmanutmtickr_0.7.1.orig/images/tickr-rss-icon.png0000644000175000017500000000634414107736721020101 0ustar manutmmanutmPNG  IHDRPPsRGBbKGD pHYs  tIME -2zXtEXtCommentCreated with GIMPW ?IDATx[lߙ=-7JBC (6jQCZFBJBd-.)***/T+MQR TԆJ&qķagֻ띝3k'ۻ;}U>yQz>|p~qk!ٛ+빎 "/\"憎>av5c?fNEi+OEzKzǒ,U[ tu]Ƞ (,"v9"Mk  |z b@ S&9Q@  /_<J^3!P X1xx0O3\^%Aȣ}[Ӌ0M諬&ĄP ւiIJaφ* (6Z'l,th揲:'HV^pW6+Z txs5H*k\ʇ^y1ӶJ@6f+o'e:yR V]gE ifhbnLYROa1Ê)LT(|ڒoM!'?ȹ^u{!ڎڬʓpR@Z1\ pƅ ur< |uVף<׀QUyԥ?*Sd6"xjQ\ o-k'c@/W(ŸzgsO]eS^5O*x D}N‘8Fҩ>MfC<|T!@1'`TY>mO^!ԵyK9v;cIy(~h+㬼r!y`"xZ(5Za,ۣ!\h[T-*ϢgdFdL}Դ`Sxe`!9㤼k`*е0ÓwTimk}7bW&k (O40j6В:h:;#[dfdouC|XsfJ8m+i TsV9Y/6'c ޢiKzd pY,)C&Y:8+//L" Ӓ2-h~HfFȑSznf)/cMyPi_wUKk)/ ^R"V>=s+|e(o1]|Κ oLc|%fQڌ1Exr-7L/4FLاW ^uC:+/! n&8UK>&83I6q~=.ʋ~/ӌ1.s* P+?M~-|9<fj9xQ( /n̩>&\\ݮ[w@RJxI\rSoL~H&[K_rnkύWMU4^r4KJ,sc;e|l:yT[,)MWUKUeY-Ďeo=' Ţ'!rUֳ6ByʳNIm$8lru*/<*:jU]^xɆ2tI|:PuQxՍiGYyuUZ;ӳk/uk;+B{YS* 8c4⺦V)/O h*qUfzUٽwr:?"1iWoq}$uIni51ݞ@UQ^eN9N%+*Vϳ{!\N8 MfNJʳ Li4Q4ǵsk$ZR JMW`9.2Yu 8<SlWIENDB`tickr_0.7.1.orig/images/tickr-icon.png0000644000175000017500000001772614107736721017302 0ustar manutmmanutmPNG  IHDR@@iq pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx[i$Wuν^^mf͌`{16 )!d q`"D$ H"bXXdQPP (2mc=cϾ7^oU]='?_u~d%J]ԭ{{{Ḋ/+~>L [:}HU|6B3xHQHT{U5p͛,@+ 6'_e5Ef~"Jo|_ͻn1  诲zMǔWA ʀvV*8 gMD py&wN}/92 П^?񚿪T@uPYq+1sV @kv{>wjt!6@xN/_W6q+/WV ZMb3 ceui ԏlS> `E6?ozW%06(C- l <|{$v'w[}83Gs+O:Du4Q&F , "(`h&zV6E _ Tbg7_ほwb1n@q8z;W{Ȭ,:z!!R3*;WVֲB</*8)0  x;ö߸{'1w<:Yc5wߊ`"GXh΄͔|1 DbO H.r+gʶ}G\"5{!GHNo\pDP\e\v# Px=;#QZ댈E3S̬NEo[9wjdL`&|EQVNxN`@ +u540 2ZI+%UJr̬3+]}4懎gLk`fz%Ę *h,0Z@4鯥C$je`5xA(̬R,""fl,3ɰxnoFOL%G Bʾ 7iS& "92޸w6hFvҊYGqRe1q,QIXkUn"3ngSImUy:hׂ5Oʍ!R}3zXFm6l64Zk57-9=,>`4fիu; W_CT|WǜI'>·?sޗ A 2RF4.6PxPhbZC5ZRz=[ZZ(2^BDLDvo8;K$O<~]%c 8漞)ԃ Zn}J5D"6 ~F,+|Y/|cveµv[>v vo)fgg֭[uR!HJD %LۿgZr,`6jIRJp>FfE _ϱτec'x`.dŇXGMSaO?+O_Y-/PJBZz @nѶ |1'!2z 'T)EZk,9^=7!!B3Ol#WnI]T@JDR*ste1u4MnQ خ(|,bXa~~&04˘Y`;'pDO\ݝrJ+ȊHS_<ʧ dlK0 @ Ⱦ~XS,+o6 ,gLp6b  ')쫆Wqe7r|ߧ"%@v*޽GHhGV[v[i1HDEĊ=܆w&vbe|!>@EU/hČ gC~:]xd<ܴ8ӱmX҅m-uoޞRy2H_\/>˱2%6J={3-dB|:qUfhĂ=d t/^̽h)_Q2[GշckP6OBD[vGԗ~+>$J)֊}4~1a.Dh}w3A'>HzGZJXHGOeS,CA(1 6m^HDpk%v}4!):b]ȩp-i{{aRR*&bTBDI̊ىLI$m|,uf m"Hyvxpo4$ d%K)iY!"`^24z3v!w^$cRN9ҒLrMc0)tH#eQF| Bv2w_^5YeYc"F6<5@+T#1 RdK3bkȒ({~434[H8 #"LSHЅjwvOoںȦ2ZӰg)vUq16mX~3xJY+mqw~DHbhviT*Ru݁SJqR.־YgV;,i$l90˹Vl- )""dR `iR$BW;UɒJ{xu}9rirriZ`f @e$<2a=c|d0Ld< i%"fR 0 Cij;5K:m~u;/mrm[>s``˚M^WZy͖0y܆˽*3V-[y8Ne* CzA"dʞΝ,1{}ph qW i]G}/%P3"榶oK(PkANh xܑٙcl^${g=$i b=A 7]U\\HTVM^I1yT<z`fvS>?²ʯBOm9~l naYvp5VT~0ہ,[R+COl &w me2ğ^z?|zvyM<[S'_xZ(&Np98 `ĦmFkԪ = /gBrkOU}7_87헿29}{7BEc[bA_t9?~}7{|dk&o Tآ ۯ޵1bn l\^d™݅;{r0 Vw<111<<|mm88|11xxC1=1;-r00 B^C11111111|88<1111======;>-{_00IBC111111111<88<=====;;>4-,?_00 B z;=====1111<881;=>--,,F?_000 B;>>>>>;;====<881;>ޒ_0000 V;>>>>>>>>>>;;181>4k__0000 VIk4444444>4>>>>>18R=44k000000000 B 婸-------444444>>=R=44k0000000 BBI⩲--------------444=RR144kh BBIjY,,,,,-------------1RG<--kI I{,,,,,,,,,,,,,,,,,-----,,,,,,,,FFFFFFFFFF,,,,,,->1xCCCCCC;;;;;;;;;;;;;;;zCCCC????( @Xhpxx@phhh@Ph`XH`XX`````h`phh ````X`hhX```phX`xp`xxppphhhh`xhXPhxpp`XPX`pPHXX`X`XPXXXXXXX0@PXhXxPxphh@ Xpp `80(@@@PHHXPHXpPpP`p@8( xpX  (((0( 0080`P`h@88(00 @h X p(pPhPPP H(h00( Xp(Xh(x8PxHPP(( Px(X( 8phHXp ` p(08h(x8Hh 8hH(P @@h`0X0X(@ Hh0`0`(Hh`(PX pX8p`P(H(p8`H@@@@8@P` 8`80 (H0(( 0p@xHx0xHx8ph@x@p h(Hx0p 8h0h h0X(@h\ltx|pX|\DhhlpxxDTlh`XL`\\`dl`phltT$`hdd`\dhhddddd``\X\`d`thlhXdѻllllllllllllllllllġĵġϡlʨle`\vv\q\\1pp\uv\qp\\Mgp\qkz\MbvpwM_u\k\\M\MMu\MgurMkyk\\\MM[|auM_vuM\kyy[M[ZB }na_vM[_M\\kyL[MTnP_uqrNlt_vuMMM[LL[^_`tbcBB0bghNMMM[LLMOPRS/6T;I"0 YB[MLLB27EFGHI"G2BL&;9>?"72&3*5!##7'&V)*+,-!"#0 !."##$( ##$??( @hy{}~|ziVnkqx~}{yuWYko]Cg_R`abd{lomjjYRn|maN^ckababQAVZ_j}xqgb`]\ZU@w%TD*>;6?W|CZ\WP>DN,vyqq$q?p?@ABCD-./012345678!"#$%&'()*+,  (0` %  %()*+*++++++++++++++*+*)(% !/< D I L L M L M M M M M M M N N M M M M M L M L L J D</!  ';IPTWYYYYZZZZZZYXXYYYZZYYXXVSOI:' &>M h"Dy7c=j?l?l?k>k?k?k?k?k?k?k?k?k?j?k?k?k?k?k?k?k>k?l>k7c"E{ dK=& 7L#Dx9t6y(p#m!m"m"m"l"l"l"l"l"l"l"l"l"l"l"l"l"l"l"l"l"k!l#m(p6x9t#G{J7 ,B.X<!mcbbbaa`aaaaaaaaaaaaaaaaa`abb!l<~.YB,  /'L=hdfdeefddddddddeeeeeeddddeeefgbg='L/   C9x!oehg$s>GD0zkeffff%p?|IIIF4viei3vEIHI@}(qd!o9x C  ) &U4{gii,xDxVe}[^cY`kNn7znghgj!h6CVTSQXZ\VY]G@8%Nnfm'RHGEWY[WZ[STU59Adjg4{&T  ) 99qŨ&thh#s.g;96:72///444=6+3Mr'sjhhjZ%&%#())&'*;kgj6r()*(()!! [kh&t9qĩ 9 9?yϲ!qhkj(E !$ SpiilS Flgk3d  %_kg!q>yγ!8!:@zѳ rim^ <{ljiqFLlil+P  !8bjh q?zϳ!9!:>yҳ sjn] Akkln0Y *\klh"7 -Ygji!r>yг!: 9kmsc ""#,Qkmmm t7wԴ!:!;7wմ!voopppqqpmn)|?}BKZ41, "0`nn!vJ'" "Cpnnmu6vִ ; <5v״ uopoponoq w9H{JOU961"#$ Jnnu#o(,1(((#anpon t5uִ ;<4uشvpqqt w"z'~>LWpMLJ753"#$9rjno${*N0+%##%6jlqpoou4uִ ; ;2vٳwqq&z=PX[[sXWUEA;0// !! 0[fpo#|-n431,,+Zpqqppv2u׳ < <0uڴvqt$rDQcZajZ[\RLCB>8222#$% -Zboov.{6CW3/*"#$ " :qlpqrrpu0tش ; =-t۳wrug 0.,-./#$&!!!##$$# "! At l#x"x&|9FaD?9/01#""(\qrrrrqv-rڳ < <+sܲxsve !"",,-667??@HHHKJIOKEPYfPyPRSVhyxtoghiXXXRRRHII;84*W xspprrrw+sڲ = =*sݳwrw"m8:?IJLUWX[[Z^][_\X^][[`hXtSTUTYm~~zupoqffffeecef`^Y[nOLH=/!ytqv*r۳ < =(r޳&}0DS][U^ZT]ZU[Z[X^iWg}TtTVXVXcv󅕮~{xpqrfggdddccd^[WYbnRRTTUSOC1&|(qݳ = >&p߳IXWVWuVsWwW}WYYZ\Z`q鉑~|yoopgggeeeccd_^[[_dUUWVUUTTUWJ&p޳ > >'qOYXZZZ]^]]^_crۈ|ywnnofffeeecde_]Z[^bXY[[ZYXWXVVL%o߲ = >(rP\\]\\^_bim{ߐӃ~uvuklmhhhfffccd_]Y\_d[]_^^]\[\\ZZN&q > >*s߳T`_eosvxꓯ哢ޒ҆~yyynnoiiigggffgccd_\X]do^accbaa``_^]^R'r > !?+s޲Vaao◬ޚڙڕے׌ҁzwvvoopiiihggghhfghba_][W^nbegfeedcccca``T)r߲ ? "A,uYddgvuuфۆց}{zwutsoopklmiiiggggggffgccb^[W]agafikjihhhgfedeccW*t߱ "A*P .wZffffgkiiillmjkkhhihhhhhhhhihhifggcbb`]Z^`acvglnmmmlmljjjiihefZ-v *P 1^ 0x[hhgegjfgghhhghhhijghifghdcba_[^\Z^aeatimqsrrpopoonnmllkii[0y2^ @y0yXkkjcefdddddcca`a_\_\W^\X_bh`m~d}lquvvvuutstssrrqqonllY2zAy NabNonl`dg__b_ch_gsape{hkrvxy{zyyxxxxwxwvuutrqopObb"O"KBgtpmlmorvy{|||}}}|~~|}|||{{zxxutuhD"L#N6d#^TQtxwz{{|}~~}|{yzuS$^T8e#OJm;pWr~~sX=pmLJSyXTSVerxyz{||~~~~}||ysgWVSZUyLE0^ ORTYYY[\]^___`a`a`a`__^][ZZWRR 2^G????( @                     0;@CDCDDDDDDDDCDC@;0    "9[7Z)Ck)Cj(Bi(Bi(Bi(Bi(Cj(Bi)Cj)Cj(Bi(Cj(Cj(Bh)Cj)Ck7[Y8 " ,M 3!>i2m*q&o%o&o%n%n%o%o%n&n&n%n%n%n%n%m&n*p2m"?k3 -M%A )K}v2vjabc``aaabcbcaabbcdi1v)K}v%A 8 712qke$sA{H{1xjffi4rIzJ{?skg+oFxI}Ew#jj2p527 (E)O\(sf r7.$'-bmK5*@=9/#Sj(r)N\(E4`h#qk_:-03#@poqrv$Yh"Ygtv"b82(GGFROJYUNZ[]XpUUZp󃊕rniegja]XT`sC;.!xru"YgVh2ET]^_]eqYkXyVVVby킈pmjdfhb`^\_cTUWUQE2VhUgL\YWYZZ\ewჃnljeghba^\\]XYZWWWZKTgVgN^`cekw㍐{vpjjjfgib_[]_c\``^^\\\LUhXgRbo璭咥㔜ي{wqmmkgikeeea]W]gvbffdccb`aQWg[dUggxqf~{wvsoomkjjkghieedb_Y_`bazhlkjiiggefTZe$b^Wjfda^ghjgggedcda]a^Z_aecwjprqooonmljjX$c_7SEVoh`XM`_]`ab`fobqhnuxwvuuutssqnpWTF8O[ Eoqjknsx{|}||}|||{yxvwqF^ fJUR@[w~y\U@XNSNI>\nuwyy{|}}}}~}|zywp]K>P[JP7L5THTIVHWIYIZI[I\I\I]I[IZIZIXHVIUHO58 RL??(  @(M3mVWVVVVl3(L 3 O OP O N O P N2 "@nT"_gdb d h edh#b"@nT #gn:h*jhd:_bd:^#d"h  sK%2nLNRD s689 rV% 7vs"6U dMU r960&1Bprn"z6`4gs!.@hq',5$*4q$q?p;6?W|CZ\WP>DN,vyq(;)AVZ_j}xqgb`]\ZU@9 7Rn|灇maN^ckababQAYko]Cg_R`abd{lomjjY#Vnkqx}~}{yuWq"hy{}~~~|zi#ttickr_0.7.1.orig/images/tickr-logo.png0000644000175000017500000005164214107736721017305 0ustar manutmmanutmPNG  IHDR,kWsRGBbKGD pHYs  tIME-ItEXtCommentCreated with GIMPW IDATxi$Y%x{f[l/UI-Jk$]H$ffzAts3t03= 2f; $pHhATURU eef垱yޝfaKwez={&v/oo;*Omc"MMɏZ,^_>>eZUusKZ^;ԩ_>x<׽t35*No̹~H#ZN&9H^юS$ mX +0kX\d%o}5وo2At/FKQSꀍZT7@mX[1p5LjqՑѷ4,G_q#0itIHZ`X(Vle}H%g-;ѱ|˻_ko`}z/k!h0XmR*Vil@`[yK`:qeSfi烻~|?qxY#J@n{H}Ǚ$')$y$lxYp X[!S~ز<4ۦj5o1)g@vƀH܀ɋ {L$!ilԽ8?^<~J- T'~jmzf2&v#px/3Szml& .{YkkVR _UBzeJ3qU( E FOupֹ>g2qÒ=ܩOuĮ]йBwf^SȾ5Ԧ@*ؔ/ m!{~Mc߁.{}xv-M9h6faZ3ȼsl/z~f dsb5fXLwM5^F֦j $y8 r@+2IP{F[qm{,kl!@ 25iSSi5<:^hR!~b .)[^sl;=Gc.w(I&, U,50 -Mh(m@\K<٘unKU5 ,jzpǿ<{ @rmMlbW X{c߽W5zր>!9|TzS'C14@hɚ ə Vg4W3tXXCXC ,k@ju9).x¾ lz vqv'N5aY؍gX%rQ۳i_k"TI@83EfNVYg"cKa {{VRil {ZAZS MXƾt5!hFhPyG9ѳ&6XWӠ5,^-0ך$IOƓ uEc xxdeg 9hik7v5}B" [2 T姸!z*pf+$%3ZV#7zҕ.d lvlR2׈_řdAK+ kf^vX#(0{ǹ=gileٺɚi3:G/khY0 ̜¢6ب 0]%x}E1a~%VtO.v~$[>;]e02 ҴZ>eHAOc6Kא2@1xxɜX<Ԍw.mLf-LQy̪FsF265.3qޖmK4(\KQWJ$E$/N=f5b -\9pP!= !'sN9*̢0e_)4yHKֲ*L2ǎؙ"4~ P";>"_+<ȧ60m+~* w4pmZ_ ]oPnĂf@yh"գk$9p9IWsτ)48y./K.vЬL4W 519*3dsy^K;}%;liea@UmU32lƴ6fDy_Uj#dju1y7!Y͡$  9z@1~ʢ҂:K1։]`@E䁗I|0I…Y%j5wW-?n jIБo^lօ nXUp-WTDSσrGT L[Vk6`@ >X9珬FGC_ 4LFXqWů >pG<ξnq׽mǫ ָཱྀUyyٯb+޷KzoZƞ8h nvUh02^{HYOk9 {rp_C_В<$KIZ`vC n"#P%s\"*j \'| NVz$Uh+ǻ`plv\/]9~t;|7ɷ 4j'<"#SNxH{H jW7{xll~-U**gOe:^k‘<%I fà 0ckoٰ!FXm% +c/ؖ'i 9a9d].24-^˳IH*YkS'v=^+[lέ F@fnh~^χE4WK^o*/q$IF3[|XrW^ ˇHUxW/YD WϠ,c| dWu֣=0=Պ>8좥I뭵18.¸|yd!ze"kn10JUlx4&٩xn `$6_;I(FKC / zIK4@Vc0'I@>{m KfWܧp}v72`% ID >d Ly4w݀#h dd10\ΰ3}KGC4@C8i)ȗam9=Wykb# XQttPQL3Rna ^A_|e^O@t: VR*\of X%@&X XQYS\ a^0_Nc @%,}fI hz8e/""ާi 眐/cA`J=eRzɶl: iY$BBrB r)hX77i!Īv@wIBv^B@> />W4&hq WE6kAcazb'G@`C7`&YjjFltHӊ Y(Y e i{ast8aN %Ho?`= _ Ac@AJ..!ɷWl$[ahp#f/D n\̝*I?*X]-.-]1+v#%O,K`lTV! ^yyL~9⩡ɞ^[5)'&@hَ`}LS*Vxc f ?}>X0t{ a9elfCYtd Rw@N\*,+=rYI,^td,Er;拁@CnDE¥؍?k>!&X (~3[9{IZM>@HV˧fQeͦ:01cL^lF yvzvUÙ%f|m1s5m -!Ln\mvZh1tq17F5ZS8v|, l<##x{DJ.Z;It *XL%'Gci4MDZ.1|~l6!2uL(Qγ! V"]SH~Tү( B55NGǒ^E_n?& X]aVg EG?.QIcJt+A~ߐ]uI\ Fk|_sHyІ>;$*R4pĴA`1au/#;`X.A&aj #h>Zz4|n~&լJӔI0MSDZM4<g.du3|& 2 r; -u1oIH+"/v:'yYn`KH~YeN\v?~XA!)pH6vb:2΢LyQ0Wʊ[ɛ^AZ} VdY,˔)t1{O=,Yq8-V=Q5>=؉ ȒAf+,8{x9\sg ~4E0H1QDK?:W׹=dcE&r_Et-U~Ej R𛅫wͬ ե o" )Fu _ny+}?Udݽ*+E\TDMMϛma^S`(yo]$}<pp8Ka7Ck VC1\4|l+{ <|bhadk5")L2K<7'Nhl3SՒ`c1ZsjV9yREVKZ.4Gnr+gs vGcՖ.u?Gwù$ROzk|c Z'z Lff9xeCoPna?m-f N_ٜaql}ǃsba=Pc*B(Eײ"O?__b Ow|;܋]ȧec??b%n r`VWBe0YL$ˠm.mԃ{ϛv[khkA? eٺ8*0`ioG" 4䑥 -li{Cs|ϧ036ej:V}  IDATNbTT5.ip= f^ &l6`eaMOe8C hLP~ h֬Ͷ0]Zr>0ৢ Vv4$}m&1_z6M7lDc(1dh|oܡ $aȲEq\GXL}Y?xhF3*9TRhҨIW‹N&D4 z7(<qVŚpTձUDf $?XFz(VO~ ndvKwr0Ӭٚ2333l Jt̒5Y"I={xI}/!Ռϐ8kLJO|`(d"ybjs2w 8ܪ%5^ mA)ܡa˔~ykxܫyZ{cJzs/G%z ^r?J.vq?7ߓEfmچ2VQSH8Y`dt>a9O 5:R齐%CZzp&]m02aJyA/!Ϟ3:bJ)m3|JpBrI|; ^z=}NA7 T,ɋpè*[A?c$g`ʂp?vap[σ6h,$d5<%䇞h9@&OcWK퉒`8_,.)k'OQuU܌uĮ`&.,$qS7|}ɷ}ʹ O|ckPYF5/. ~^ϋ`w>h狐}0/*]>}ޯ;Era"MV1dj:~ 2 -*{ E;wFIU(ntpO-(~zQIVSQ^kZu'ug|Q*5vw; (?,GnE8C'nK"8R ew= K LHRY擻$eYYhEIxH: {O.2)b!Qn4]jgfۡ)l9GCkH#Wa cÙ6#.᭦aU4VsWⰦ,wKX'|kݞo|Xlΰl#iM z.'gN,g\첏by/ %)^Vf_#9|fEXA`(EM‘8G8OZyI>/G%sY}'Z5]Bˢ=9@VSd#(Qm-N9lz$* ilAkR+ݐ;H~oә.d_.v2o&ԃpf3/sC$!Xkno| ffX@KH^fW{:>c!,++qTYh`GOeHLؼ!q;\'>(N==TZ84ef? A/iv,䜤귫R(@"Q~\&{N篮b[o"yͪW{ ;Ep)EÀHg"}>F:5zܱrY/h|yB0-km`Ue*,2/K)=McOq*`Nv7Yd< jyRH~Wh]<&וdn[=6n_\]EQrXC$nw+)nAKJsV?{?~15Jf>H Ԃ+0-?f I0 .ОHxK*?KZ)]8"5JSe ,?<í]_NQoYܹJvŵv$-r9 κ3JV!=v;,FM4,  '(0J ~310&ƅƘcj=iY*&)}A8uI1wIr>/#c /RKh^0 P8s gcؕT.u(kXwN[qsZB"`JMIp%ਯ^Dbo|U%(ۘa1Th[yKK~N/.#"z1)ä[CaS~d0`eLC$ |'aƙ 9/2'!‹^Є/ގ:3nT`{}Õz}}8zK\ W|A{/ɽ0^/!5X_DRWHHwKFnRs~SH1OJ$$SI @F N hw. UŻLs1;|8 .!#;ԗyܔ7aR5UeN8Ra5@vSa{'[%dIOb ^R׺<*4\HEIܮ2f8G|dE5t,s1g(|/`ZՊy}8ZfMcV.K$_QY@3'.qJ\D0aj&L^ ;9p)Ak׮J `]'U6qG>8k;k}Nv:rͣAclKEE/[jƘq@@f"k1ƍ+'pB4#k TO Ck;5 ]z\?//$Ȏ5V@t.[Xڼ t9U:*6ѰJX*uQ$ ?t:ۯq t:w#_r&ݮza/WGܶ(Ƌ "۽nq4Ȑh9/`}-SđA($OGk-0̫ `GCSf|%(t%Ry鉀!UYKrbNo:Fc%{h1E`e^GEPr7;`_QzgV{pJg=3E0G^VR *כ eV=CS)Qltnqv^ttOO/[T|yG~IN篊J5izтv 2[rq NII@r8m+^/%Wg@X̹,\4@Cly0 =  KVUe7ƠVfaK Çvy wJ@#@ņVQp;; upHgJRXi0 sD-hAe$i,I0O_K \9ck}ɗHz$&yTҳN1I}EL~|HTҸ_Kף=nt>"闊L߰UJ2*IJط,`HatqD @.]sl as:x<|c)f@FLe1m}v+u_s#se۪!O 8EUs0+9n7mw]u:.e;$g/-X-*i{TmnXsˍ/5fBˉ1B^dizx`ix|e]%J,MYxDͺ&v5\ Dkeh.lkZ윭w57 cM9,M)[2<9b40t9c`6;(ʒR8I_Yy+CKU~D &?z`XLX8LB_Odɇ%˙+t16[Ŷ@*Q7vH6LIz%{׹ENscnWV3=E;Gw|0IS `EFh&S/zbv谖,O5y`0KY\ KEYӜ~i0LNce왎kU"!`h{6gKk6m57s&;] 5}(#' h`j-$-_C{,tAc2 z'/9(̢Z@5`yϟ=GV 5?H]~Oȗl"_+q6CI_*F[, vfpGcmD2!ֹ "cQy.^Oe8:6mR2t`f׈6YEqçI2He!gLR7i~Rd.F&*E,c#3;3Ãȫкtn,ɗǗiIt~yhV_rR9zbBû]jy-/ wvn{wrV^Y. Y^X7vU+"n2jQRxQ/Ty9Gd0 V$Z9UcCւoç}{0*m Ӻ!t" 1KWzuvW$% fxa($oej#_RS?rsyǎ/~E?5Qͪ NP\Z X[Qflcc.`7?JS\`vٳ˟g><$ƢoWu;ƒucӡ!0O{%ԅ8?"f[ @`أh~ vmGsP-d<| LaX[c/.քlBU.(ȃ6MmC6~Iq: uە]ݮxn*ɿ&I/'yp#rufd"ɺn"w݅N0$`KQaYT^6V`s+՟>7ӯw~7B1yey/]@m2.!V5}10aa}>0eC qJuVkmr"9VvB`"2@N䦺Nת`<֭dv{!_V6I-"bUsJZ%$iT].^/n{qj[Eb?S+tfu㍇tT]r__n$abQz-dPi1`kX+yWjAxT.ҹt@ *[Njbɀ ؠN6aYf  P^F5,@tʿ &6ȰAk#8FnZ"Y&@[2M1K*X*`m㠕V@j8&6Mlbڤ^mfg߃7K#r6#o|Ŏ_}NA0E2 7n]r`.`I|_L-5 d ^^p<# >Hʤ'vkb$=_9sU^[}>D|d׳MrL`bHx$|u/|`Ǥu&6ݢH "3cf0n]1w#o #|U&v `I›v"4? F? {d0k,%|=1aspI'v#kb[cN?`؎Bf wjA$q&vGcO .z~$@8"?uqH"{3NJ{1kDxӸPGlm /Cl^E$#=/BL֣?˷Gt_Gϼ/"m9D ]1sioqb?J_8*%x.Ca>p}0WĽv@E^o@SDJ 3$Ί8 g~+m3jvJ_[ <ᰈ 3|,J]_8Cx7xe}~/' pDqxdg6ֳޙUU{fh6MNZ(H $"Ch NЇV)>;-<(>eR@ 2R:MIqN4 |=^{ 3pԍҒcFeu,7e@|LfL6X"HQ1(泈HKd hCF 1lۖYܙXk}3Ys EmՍY[T"nkl,n6sOc] &a0V\Ҡ*#8\r:17eV ':3&imjV8Da )B2qT6捖m&9&\Os/Dwzj&CFE-,KVs3~skgF+G^Y(CK:wrH^Ap"p)2DoGV=Lif,bٵ:a>kq`_|\h5֦y m׀IGaZVIDATqnC 7Խcո `, 3Q  c'qņj`wax2NEu{=w~w'k1bK}'K+J1׌i@?^ەܾ@Us!IVlSDBFe)miU_K3Ci.es<OZR<8JưW.\fS?-y%Xo\*x$AƜ`=}NQqrB+C=G.JJbg:xb \oD.-e;Mįp,xy.!6*ü)cҽPTb<_?~'ʮ:HQx5yA!޸ cl;~!䭈NYZ͵ M2$0b M$*ΐpMS\q uQ x9.l_Ō[4='.lf'K ς;{1^(on_|8NJz..u}ͨ88zp?-  X 0ʜit2Zp|yE9kߊtQV򰾡ߛ/c^_p\ ]Fْ+p#AC7E ٯQPZ^-v6 gE]aKd<YSSxۇ{} ռDJ}DDQf1BR㏽W58g 78 1Q+^ԇX1NQDg0+,p`S8|KeN)6yfl~m߲ElYW qLX&ʦLɅ`3FE@pyN M7<øv(r@[HXײ>T2*(|x1.2p<{qKo*ݾf ᰖ.<({#4zŋ8~X_.nc;`? 7 o(q@?挓$((ѽT-W$6gQp^ҨgYQkXgBi.15 yU{wOKgQQv%fWpN"0Pb2!k #m 1!bt>oxol*^(#QVG8S8njo܋*(= e׷n,<`|r@e!# b+epQ݁9qי4Lb; Vl/q!x1;vhx6P6e QvjvpY0#:`T ֘ŋ6Hy6ɹ8'J+XM/[cܔcf9#wώ4ϴUTfl A䁕03g f N,jl5cB3id5},"rZVgzEJH*`\3"{Ta#ޔ`aq&7q/\@gz]A6-`Y}x$̨ݠïF,fxYͺS]esM&^38OY 9O֌8HEneՑ1 f}W&8<yi[7 zRnO J26fUB<װ.W%pGC5!Y2' N"hnܩ,KkAf,Z]_!%f(g@d-g̕qzzÌd 7/,Կ}Y\0q,EC͕1  q{̻2AS"9_6[K.#flpI’O01昸f's1bg1yA~9 qX 3vnT%oYDEﱰ/0^O1r>bcFB?d ^7Æ+*V3bz<VZ x0gN;E^ݡ:.R½8.d 눬75p~ ^6!HVsYDX[):ENJDsho(a+ 𗍳))@T40xi.N! 2Yo9uVˁK9=¨b#LV` FE:0bGH|BanE7Xx 7RaBY+dJ44E1VXBYX;'+W6Ts'qP)c/X,+c)uވo!gW:''OǶrpA,0r #}sx:'ɕMBppW*xy+&*âe6)x_a*U6VZhp|8>, ?IENDB`tickr_0.7.1.orig/images/screenshots/0000744000175000017500000000000014107736721017053 5ustar manutmmanutmtickr_0.7.1.orig/images/screenshots/tickr-screenshot-4deb.png0000644000175000017500000150277714107736721023711 0ustar manutmmanutmPNG  IHDR 'Q'sRGBbKGD pHYs  tIME + :vtEXtCommentCreated with GIMPW IDATxw]UۧOz!+!{B E((R}y4 $THu^N{N2}vׇ|f{mkUĥ3+1!e*?3)(2IB'o0= >#hH/%tfֱ'D6Bx/)2Le*ST&CJ9i݋ʊ 4Mò,ZZZikoGӴRj49r}siw G&Lxn66 TFL;u| DPj#TQ 됎Ѷm'ن*+ e*ST2LT RDŽv!T BqR7oͷf0 PCEGJɿ׻ReJp|$3g{oO8c0GIw!?TU|LiwnѨ8(BD ˈpGJЁݺ kӣmW0e*SN۶4 ]g ͢:i2iO.{43N?# iqc8a?֯߄aCw]h4m)}RT*M,o^[}&}vt)Aa$?Kۉs iqUighMؙປk돛XK)D(!lGߚ*5AhhBxJ (Ɉ},D/!$P^2L'p<6oaÆhK6Ư~u7;敐2oi]suJ-ZO?ۯlHv38=t&i,d2~PQYWr \y9q6n86ٜM(DEI˿l\j KBǻ]Ws$!@)E&Au˲q BP5<(_DNHiy RQV@&sG -oo$UQ.q]!Ӝuu5>rXT&E$`(ISmژ|kz4j+S;n]P6Legsأ?>,[lH)m lbUzIlذ[7X4M^zb^eKVJL&=+v:c40}1icql)aϷmK,o ӷ'Fm,F!0 _+r#G&]e!Bu~7v:t2>7YH0Lm<^u|>M\!0~|%E)E6A3|_wݣƘQ#ƶ-lGjl*"u ߡh+&0M˶7f7oFLRT֭nt2y'w LMI3<380bAՠiap)'ȣ$Iwޗ`+`&  _&31=t0}v Yrᕜ}ֆϯw=ZR(H$u\8~ M CHQnj.`saQvأBD-!w@(΍,L:)]\{DuY(E#m2CGЧ.վ=*"mWp9S956gM(b'A:1c J˰mB>YJC9)Cp62$uZX¶L;j*+̚j i` 3sдv\N%ӎ9 >+#B nǎLUPG9YZeU$TON*E)a8|8ÇcҥbiиK ΆMyG r5l6ǂO7۰nlz=\rُeURR:6BsKDgCks Mgxg3ur9aGE-eGoF+(;w6Nֲ 45줡(TC~2?^q!=W$r7 3DJIv56Je0}>LCqlijnD2?g$qvld:G8ܫ"4`:>]m0Гk!ڀ+Ow-vIcS XEM]JƆ 3ֶ(B󞗮Cc7hNoM5UWp|ì@wĶ]-Vl=GhJUr/fs4&U}U>AkkuYšMX8Gk [5>C'Кqr\8~8؛o=団,]egdΦ"ifDT2˓gi\zɅ}XPj&OOCc[lölA)wߊH)2d03.1G1|jkkhjnæʂEhmm㔓gX`ȑ1tPO?~<~۶q]?)%X'L2M%]5בO;kZx3tD"N{[+ MM45zg_>%uz+h7КzLX܅o:ghعvr/8s_䓍-dEU8T>n:548 c :glFBc|r@"cWqMW2Ά8+Yh8UabI#.!=ٶ |#ul ssڵu&pI!#u>!ƜxM1%dMKeV~o=ZЏ@aGr۷.Ʒ|.;{ ݫ'W\v H=EC`Ӈں,X2$v6J,qA:[LZ[B0y57yX/Hx7CTyHe}H7%ͭ\Ee8O@lk'M?`vIYEs)'3vh6lD,ۻAbR 4H$R ۶y7p9 TLlNy/< vATv\WZ:c.j55A6k9SP%_FN><{ŠyOQzitü}(oúGl o }%?0%9+ _K35 xզf|XuZ{SQBCOnad5 ,AL[3'wy7ĬJ.fNyG?vQ']ɗNL;O:GNk7tm~}{m/cW _. 9٘'"0ImY+[u4-> }uʢ+TYMՐ0Ėm"cm$?jH=hSaHٜonA*HY&0dY8.Mv}e?2L O-P`зW/Zugۼ ÄB!Y~UUU|ګ9i̙O<^Zwd&>$ r_S\a8SesEB GH$(\ץ_>xusӍ_h.L$-fw_c dOhA.mQq5rL =+_f3/H/,> )]_rV{XMXf6y=uhҁC£3fg]n_z(oMJiQ]')\/WrC xMLK]r.( c;v(UUUH);w;v/C2G3.qc0|Pl֥r:}#T`gxr}~Wͦ Y>8q!q/g~CZE/ sa)ޣ7O ~x5O4+ھq9x$Ǝş"ޛM(,޶qn~~=wQ<̟popr]L,SN>B)Ũq𤉬Xq!~8ӥ?o~^09+fc9&F #޽pMq'pO۷F '==;K1q]'o֐'B.e%Mr_2&ѳ lǸv2_+\LV>~ ,ץ]pdje~FU~{Yެ~^.tܕ\y V~{_u,[6?d#$I^RxH8)#@*~=XOwNr<]~1>Nv&G_?XM" r1qӄ쪚̷o+bØ8T_]]_@Iw/jR )N'6ok$--NgbuSޟ0&]4}q Go&6lx!o,M2~RȎ/Ư۪q-7rk c7kkqHV$a8F N-c9Xqr6-vFI4H=mz< kΦvVlm[-kSp0PNU2_`'ؽnPJIzA6Ų? 83o6gqrA.ue{;ɓ&1y1l>Yh=ٶ}>+DJ П 3/=q]]I$z twM0l]GtZjYCBݛwq=m\ֶ+ %X4?!+"gyi}>g ȋo8(d: ^3fn~wɻF7t~8?@<]8Y~cg^q8+^~'7w ]Y؎u\kc6Gm=m/#xUױ9Sx׭4Ie%ӰG t]i]?r,OH2' .xL6 _+.gvh5JJo/ իxT  СCe3 tmVw(_;_{͛u~~1r(וv3q9󘑼6\WnEsM;ѓ~^f o@3a&ĆWu QhX19|zwu*% p4ٜexL6dN;dk>x&}#`WvH6muw8c~Ӝqlxq&l'\]W?@6ٚa``;ONK@?/ϫTd*ˀrThk8~pӕ贓5~`oZνz BSWs G m+S9]VRSEeı5:.;xǘm%m pCx)>y3[Vo#۩|(priRwQ5:FU003j\%L5kolAYoQi \\" QMRYiamIry"ۛ,|;Nı-@;&XzR*Wb.  k8}B6dy|F+Jbz|Q2_2\|>T쩨HsO^J)D* 1ǡL6؄Ca,&p]_m9> ;"LqOR(cJӻo/i;Ŋ#jC yZ-%Rc1 RMDu}9bB_V^> vJef}yܧJ̡] E<ȓaehq'0Ѭ~R6*cc&ŲLUﶢb1tJ4}Ro$\E2kX.֞!\vǑy".2#5TJ(icU rYޜԈ,4,ݖaTU\ ړឳr7joe_Lc/g^=NSn#h^BGO Yjpb|/8\ph&i=Fl)"K]laӸV#,qʕ1~01@m8(Cؖ\ w{{Y&`Y3_{+.h ދ/ IDATd]BaB9.R44J!a*Ǣbn S(^~AO$[Oocgs/ИϬZ ṃ]חZ nX֮"J^8Luv,+Gmm =zɒeL0!"I3kl6oʕ wA"TsɑX e00x =FZMXN/"P(@i5q /''4lW`Bؙ"U$[p8|%+ d.1|$U;{1kSUF"TƄ=p?n"'H޳([ê̙ۏ##8l7qT[L)q]R&bl[ l]tޤ֚s9)lxi!),f8n6I\@m7g{.X]i!k׭ghƯPM^:̙ØQ#?~,RJLq;?a(sLP8;sքOhM, ٗ6 M?B*4.__W&5oК&.B&_@dm!`yq4;l*vB1qŲe+r]vQj2nƎ8H)¹gXj &aBEe%]r!r&g,]KT]1l4zآFRIfkr'/䀣.!Yї=#=.xsb>_Ù'_Qs4M.,zg\M"j2}4^w,g_f6Һx];csCѫji9>ZEB 5<"RZ MR+/$%KSh цm4_Ň~!q V}b.WqFVXxW|ɴfZ| aj|,AM}gr}+WN8Jak.@lcK9ﶃxv֫Jc|>%mY}\x#:E9kxfFf\t#17ˊ/| -¯{$5h]1rS1s5csAj+@yhd:8 Ǎ1W4mт %F:Ra㸞1p ҜIww G-Q.H&mkȥLe*ӿ<73uF&O<"<.q7lb'x~~87ߚa̸h:gq*?Uk8cqd- ׏H$LSS~ETWsWE4a!g"0Wry_-g`I .q4_-/ EYNbM+Р}^k ϾKv1/ϑ—|mvT&_:j{%]|=G8o=5_k/O 7Ǹ/\I{!fw~m7EY*p8urWGjk!قP}=~Qf7 J)ޟ=ѣFb6_Z,5UU\1"ƌ1Gyv+ܭh\w&n)i{ (sXg]ǐÛQ޸-M?X,n 2<~}ē`^ ރ]ץ_cYdhKF<gq,^*z~~GcQhmM"K&-LZ[RrO>&Fځt#ï>noo#i 4PZv\*NS»j" l5C VQW1X$m$-GU] l9RU_k%x*@KRJ *z@O4*~z _]KįC2N"oS֤Dk(qIMK%\`e5U!B[[HZ"VN.AK[:.V&A4.fR2@CaeDc 9C.0n?0zj6@Q:筴m "UUD&µIډg=%h(QE:AKC;6:=hKYh\!8b:lA"_ Ƙ-Wf^kSS r68լ %> G5HY2L)PBp̈u|oj $aFt2*dLe*ӿ":I,i}~nꗙ0n,Ggom\/ѷooy]^jEEk3]9L¯`e_o\_.]\6ox at\)Fz_l RшESy0uU}JF) Q]!q hZ޽I TPWƧC.FkF3CT$h3L!>ĤO~:Z'=j"~dђ qnbe9|7HU=z*] Z*41,A]jmd\=ңrqi*Y[R`e5a7NKsYWʋ=*% B𥫿)JYL1]@]׊;|Y^:a- ^=kAjL:2Fl|4"4"$$RY\%E#ɥ]*jj\ұ(%󅩭-IJ(/^δiSiii!% r~͊O?ܸ0q1GtS\irW\^it\msϏJuu~*b(ֶY+dy?9f}c3q@*irֽ?㰹׳|eF*zD8l5 }yR} G=⠃_a5tM"4MEmZ%w6"wdmJġS~W;$`$[bl_LenJeT2+3s7nba[{"{Ž|>69s?$ 'b9UDlX'k-ޱQS]E NW_y9gkAURʫ_a!ф(nI)iƸ5E$RH&L_1\tH^ߙs*)8ԓLvK,^²l8ú}u%M;s:'t˖o \+d؊Gr%LJFzg%韉\WcSȡ4-yZFMXI73JSWokZP!Ay5 Q溴 {&PUJR9H fϨlBh~+e*SNPQQm߸ {+߈)TB x&HE*B?p{}T6ۓds6}m %Z[[;f &w^iV^˂4 Ovyt)I67x}Rhcd$I/~*++4}qGսHҫgOƍ ۷iL$Yv=.㳕pJõlnbgnퟙ`;dGIƢ 5sJ'Up%D*$FH`묌Fxa]*"NDžjRdAEoL0QB ul\ h"ؾ`M4m}T2?,ۦh_>x%% H4=?lƲ|]a}RP8e`VugBq}Rz1L0V2pT IsNwR$`n)c `.j):U,t?F MvPr~;&Bk2Le*Sw ,fNbڤ1+wDQٗ/쵁F'~ydϩڇ٧aaλc9s5w])\R!5м!m-5cr=\t<_9CV]O)@D13;*v(YL[cbyXu۷*`>.[Wgu޳wퟞw膭8>[wJޣ>w.>tULtym&[9V,zUQ'J״PTќÅJE?dg&J)̫[(MGVM$BxK]]w'DGO( uB|~,eAP&@<#7>M %VD1[[Gf jwtn)uS;]8EBt [~ȟ\XjuP%` x|UX k{i% }W1:vpIx: M 8 !P䪤^]XJ)TN<-F׾ D=;dt۪qBU!%܋(/,JEay/ Y=@3\t)lTW8PϤ]V@Z"NBՅV_i^^;=Jb` uC*kF0w7mu+QdaU` H@u:R[\E)=@GhT,9]kDò!2nP\:T+1{sJrWD$#tMRn1|֝ VȎ9.=KO1-?S O%3#Ug_S!^n9TT:伒絗CIwNȒEcM;ᢽĊxZqS Qw@S٨i CGB.>8E躆O7:~=_P:hB $9U Wf踎WŶ,\kX0}^lyBCh{bRʃgr혥 x*,UXI蚔>/Br>$P՟B5 ^m}"ݸ*0%3DO@(fW{Q9?z1(9 7~?nr h,>5޷zxu=ʓCr )U5j! U &v$&%|`8#y6ELb05 Ӕ!'qmdZ>yd_ʂw -i`& 9GȀN"H:̀C;p- R0 &A ـa@or5/+c3~U.E]q}8$d cWGp&v d;D\% ~&"\7bG&mcvٲ,+ ֖ʃ`!e̱fhLVZp˭I >7Y(&ab9Ih}m,0  < qM$ IDAT O|?S$ |C-\+ҸGq}Ō(['Ffw38  H1%Dm 21Ck 'yA 4Ÿۜ-߯w2T:d=|h:4pM3w ~\̓A i v4id2RIێ@F\ +L´D#M)MRb(ZHES`D"BR .qp=۲HN,ش7|>Rǂ[B*&LaZ |-$zZc6k[v&`c2:8Y&u Jb4-Oвe`IR.ΡC1PG7F4UڶO3rlwuzRm.Q}ixH8~{>a;XҠ,V> 'yII4/d(R9D寗ԹSn PB`}HȡZH40?زf;k/uTQdP<5F'd|c [cQN9^|_19Tv3T昰A~A@ Yt 35_r 3- ɕ<1ڿ8.3DmW##CKjQ{҄?(|FN]4=&B4d9DAEy9r|[*JfL3y߯ͭ ?{lف ^;fE(%"CAS:|,Q|.43 AP2@CȓrI CB iB8]%HMsE",7Ej&~|(ߍδ1U9P6i:Ϧ4'VnWgyGire5w%Q QUA { ~놚z'dbEj we7л0PO U=*[T#]\bUЪ2E( !GX.\!d P .tA qZ 678 EUՃ/T)j<ΰn#45X=u|J?g!)i~bA X{-#xl"~}y?q#Z*QB  pѫSv=w^.֫ɲb׬%YG [27RW(4cD3O -7rV F m 5ސʭ[#M8G4UX&n7(BTx58gEJ?upuK8\y)i]lёW6Č6I{.ub,dwL95} + A@vdkG!!DkCI |iX )0D^9P"t{2d?GOa </_p  +O)L]n͞~vO3Zb $8ؑ(M2Ŵ,ivY$Id\q}۶q!%,pc@=AJIỰ"z iۤ`8g4Ų"$S)2,XI&RJy&o:`Pdʧ6=ad ς`iH鬃60O½_\Tn`ǴLU' @l@Ӹ@92Iqt/&ͪ&kEJĎd-rIYd10q1@{RԐUAx`oP3iİ#D"\WiGD,dι ^L f$NĒ % \CMWNkb"@N&G&f,mӻ9SCzhA4 qq྆M$ 5iSGy(40Ll^Ify&'[TJӮ]WN/\z+,&" ZwU"IGX8!}~Bbgkfm{4eָK31{q\7t qH*d$iJ<傓&#d|Gy82EL060HR޴)};q|qLeB>WA?4s_Smkؼr%?ZņUr6Le녟m IQ0 KʋpM _Mt <0~&]Pjh$32h*|6N* T9iJ~ \;[:٪]gZFKĪW$Wq^W|0g<>2` >gP*{+ޚf 7Vx}4n оT˹ b7E|ƛ Vre!mr<׏YM[IfQ=0W9F離x>~gqϤZ_OY68E9SG8h>-1GunIVhyF93p)uyq2z#ޚ $@4–_ o;\~Xi@3g>ěBCqu/G0w{#<9u-MyJ?tz+-^ǐχsù1P u*F\\ <!ϖx)(9FnpNN!_Шsj}O{~E>+ײ| fz>R2(@|M|0߯u ~/<}^  00hu4F=ߍH ͞_@!&0{C^J 2Pq4g)/]ɀyKx}Ի\ulSs_DS/\_r%TuȠ9 W^{#ZUPYAIW 1g_i\-~pN<#|q _Iw`m$YyVOl.oq6&Bq=xnƏ \_}]:Q$UAr$l碌`%Ŀ/s] z>u;~kٸbeIۡ))7\BaP+:+e-{[%kݷ2ZYnt  m5K3i8Uǽ͈S8I \nMe|/^q\Li]/d>-&-gPf1-:< !t(L_J y1ӿl*FB\ . l[ֲy2h{h $z\AւU34D[sΛ TM|E'38 9 c%ڶYaf,]4489y#>2_+ˡ|lh)}1+!r=r!:@=} LZLx99%xzN-xE \_ˏʤS%>/KK61aLN77uTVWQwe2x,)xC[)<*[?Tpd/W0 wm=k/b˪[ݵ.leÊJ7GpskWx+C7NwS^U&psx^[sÙe&=Sro}[l/o-bݰ.F|O,a88ű(1C C4q8n^K~YwMiׁL\:!-̫> oB4ڏFBi6eSRVN-ˋhbp)ş>iOxsK1a`-xs904qSG2~mޏw^JB)\O=F{T-f,lYUV+ͮ|> 1a?_/X#s!ex9dD(ݨG*-Vż_bz{ڕ4f]tGM,7= z$uOk/)!b(gV>b4qHfRi~Hn'#DK DP{.%q "mWDfӋ!/0ڇPEq\#>Qo`y?~zBRhM9qd5`Bɒ"Y&>} ?~>_|9iljj'tdƼ>Ϯ1ym6 O{^q"g'zn`]a՘ьÓUSfH)0WE"df\qAx!pSA6?3ii$DGO!}bGg3 ;fǴ ,߂;7CV3j?0Q'=ċo_GY[ޣߣ@Gkl\81q0hʹ}#O]!69 tZ*EnZˍn . Cz^K[$#|됣iӱU%#dLˤ)>3 >L׮"[~lA7;7 GYHn̾tcJ2w~bgs_>ơBamA#W ußfsO1I1b̨>ْRkX:v[>9mu6ltA$'t̘;ڥy㴑yˁ:)Kh}<4VC4 f¨qHCke/` y˒-fcd/N4~?.y'm&ָ^ -}:Ħ>GqnS+hݑ=4gķll?{=gǢ/rWH-0_YZc!Xl^I9=2EOrsJcLdU%i_.[G W|6w+Vδ+@#CS9UsK3^ | މ6DLGr^o,[~bb@h'~w?MS9rWisu)% Fn [ےB#'I@',?dƮ2(\gĉRTZFii  G;ٿ'lƵ7ѳK^+?*.=O)ǯ͊u+q3>(D;qNצ߰ʴw6T;+{+ ~)EJ5j Fhi9eŴl2h#k`)e<_+1S>ZCaӽt+YLj93C߯;Vf#6Eѿ'.\Jlz)i֧w,嫳Hmw/v,׿MǏwഁ#] >89T%2`;L3MBLײĥמX5Sa(]I,j)Y'?[/YR>?؋W}W8n,[X0o8)|DG"HDq1UUU}oϑF7ԍZsKtPkOh HOz-9ƒI-[e_I9h!/BkEkpNcE \?x\wIlz Mit޻'O%ΚM9wuKs{S~B[6~~nuq!;v,aXZ.fN\NRg -"2v GKOw`},xF&Wi ͰOdzfO}0Bk')簀aÜ_2d,o }'P+,\#'}Ws2l;{-XF$<I!l5,󯼎jb,?>Kw*"S^=?)85~˗Go#D/tAr>,! *\?T+(ɱ$ X}l>BB4pkHT𳒊4VFC8DB6}(k/ (g:xσ,!#G~~>v1W7פq2i.?o/L^2yLi@uEv1k_ .M_erGE}{uwv5Ϥ^7h繹n{#,x^?ʗ'#mVgXSJ*/m][LUo  љxpH_i|a|40ԍHdl%wswfN˒$4nΑ%RRĽcϮZIromG2!oݓTxKCH)'ߏ]q/sVF R\t_b&1wb~޶60MaɂHq숅`Ӝ%\yn;;-=8휵F'#i].ْS5]F֏|nǦ0-O83YpCD8Wy`u{{7w3nv㉠F}>N%1Xzl?߰<.lKr^$YɦWɝ/%9c.KA4 *<ʥa 4)$Fz))nky[9v\_\Xd&eiE\ MbR]77ĄDbF$ք_UKXĆ!rCBmX<ڣzN2r.yLÒ%+My$ ܅3mJC;MQ;5ch<Gj~ ߰):=JƽY*h^VxLd .&)v8e'MPN&dD6Ҋ>򤻸Ǖ٪$`VRfxnB$+I` %MJQ|n!GTp@yD> LE-Ԯgz˰%%QS㦪R 9? a.bxh0͠KҰi&S6TS^^L:Ѧ\@m_Б(8緡Ywq`G7(#ʰ~wrwsOjiҦ4㪲Zs̉0eT lv--.6K] MRZ:RmmGER}-[VWdI(wr6v`1 v!M |\%&\"W'x'6~x!FMZGђ#ZYk6b|"sf5!-pADVmj.N^`h+BFz.z3ʱ |?9X-H )PvԠHՔCfNi\wݎƲT%[rOqPQ)CJ/۴3Ҷo'KҦ.TॠQiWP*tz f2OwZ+DhљPyT-ޞd͛]qwVէ3l5sd->0E3Iy8B A_m`R.BbgW %||:ж NTS"R!4{+ѫ[&ޡ+ݺQb "'BCnޏ??A8IѐcFlV{af>6\w7]CD"Ec6tYVCCM9LSW4`_%^Z@ ^ȕ¼1Y}7U9i^TB y T:_Ȗu[F2sѓb(q.@Gǡ(Ih $kb~čQ+&EJfx5 E01"O>;W# FS{H99Soud_n11U=ćבfh/ R +]w-8B vRw-QZlƱ}_5N)tuMT6Oa*&9iVT'wV圧 cʂ)2?ba6N D.ίkV׌Xh)ge]Ymv[ha_] ZH$*$wT*Mb>߿+{UtmiP5`ۉc E*8ءg w k/"sfbf5k"l] %+ /@aϧW 6.ݍ ;5F>*>߶` 쬬$9NI̎)vgow q G;3òfX7bąXf#+uSK Q[Sv8:ꐤTQRnjD:Mgu%_eNbkz&B`P%3f7tēBKr@,#a[bVw[ ʌHq] i`n*R:BAϑrMKD,A$a3B3?|s ޻Z}To0Wxz/l#ͧOY6aF a@952[vW,G!T]i; AZcR|ـZQgW3K9Ъ땮qBn1uvm3fXbd?>q6we-ɚ[cpnr[y|/~IoD+Q4X^TgaSW]$5=* fKWl)kcG:aIB3%g6I$`miff=cwgwEaE0:EiBbʢMNvvaߤI͓ua0hL\a'Mɟ.h2oRxfnUMb]J|"'3Ɍ'z=yiEY&Ė\PJs/BNbdul zwNR-HOuLSV,G]& F ,9mgrk 4lz`h m-#]ry.B([D*>j /BШ3aZƍEѮ-b~EX$3pHYuj eOp>y3l/_o39gsϜ3#3C0u:-"fr:_y6/TWBjG<Ř=?.kϑrY'AX1ì5")To֦D{D"FL$ӫR!ntffHBϒ"P2ϮoIiF19g왍ڒ&)/K;3{G洶q1V~֚Cg~7=xs{9ڍ̜>ӢYAAFǨ- 1c:~W*0F`E;2z3L8Ke2-B$j7tZtMڱTxp'y81'ӫxc–xnH0}zI,v{*~ y9 - / G?$M :Œj-|{]h ~O`]vat ?x)?><yʟsmOECJJSKOglDm8 ۞cT5nƒ* W-ս %&u;D6X`WbƋ!ۗ88[kdi!0PQhRNDhJ" uce1N9AN]]-Xa7wT$xw,'~bqGy&j-"dA:묿rV= 3 4tycKM}S'ҎV . mQ5V 9=0ڠrQjm/( j Tl(k B*| )m7]kv9_8X1Tcfq9=C;YR[ggKW7!|'ixp Μ8tS 4( 4+Xz 4NPF їֹ\ ]q.*B .NelX*!5.bՄIbScS|<]? o&ߡ uhZtZ4:QYgw f^bݲi-gيݢs1Ko5UCaRcLxTc%b3Nhm6QPK2('Ѥ|{Q"eVP]'Dr*fm{;[6ٶe'x5ǰ٘f>n_~|TKtr=l!ihC;iCȎ?"H0}[D6v,Y24]Xo|Nc IDATG^^[=tCKU W2bO3/NIT& Y8o>ETѻ/ẟm3 k'" ^.hsϰi|G{XiBUh]vf%K>m{wr?a=KURsP:0HUou7D I)%RMocWpk0ud)9 7mϬbRM?pͿ]:/5LUYFp5$qiYG2> ".,UQ KaIf4A|?M`;/&e+wm_ *Y2{f"͛gSCyn!< i}G5Ψ/qL'O^,:pfvŸz~MII(qE3/S\+O+Lgѻ=碔sw\`NҦnű{&6QMYGm,dHg^-wX K:P]pE3_q6o11@S_HbA,n 1h6|lmj6k󛈉!RəDFg o4cZu>Gkq%mlx}}4i{k[ӶM{h6YT6QV^*kGe/HJlŎF[Is93lW]X2r'xPز+քB+ˍw&a5Z7/J|o.ڷc?xؽTfYд97B(.$Vجh5-E]s77 ,|U>Bv_vz?vk/ڡ :}N9 Y|ӣtv=ޅAVuOʺ_1NӉY[z7%16$xh|~\tW?DcS9ONJAkPA@UHq`!╔ry3ڏp`Y B8 yۻ 6ԅ`,{Tsnsò'Uϲ)b緾6?HMLIbX'x||fdO:+)xڬ>.>y+72wsؽGek]^rvtwK(ۓNc}TL9IK;*0M4Q9,>b5yi{%ξ`1|ꁧp~!XGV~g<ŕ׭' B<ʟ˞=C/X/lp6tM2[xY|tA{0 |ݘa+g$4 >4kW?Ϙ?N3C~jTAl/p#ؔL{޵;c< <җ:=_#ȷu?$ ♇yi]31}Oo mc|&~wq}Tq9Hv^wy|iW^´XeЌc6_ʰOǤv/~rS)]3~?Db5[$ؗn,Ny|zCN憋o}øOYtI34?tMK ZQ: QL'C Fx8&Q$kK*~q/rjXx]}EEU44C9>vg~8OF^Yq|ױڛy|$esǏ>k'su4:̟;pD;eƍx'_WCsRfL"I̘54I9{Н|]Oerԛf>-bݘ".ڇnX"Rr%mΞ,e3gsCJB#[\FG}Q×q׿$(E?_F`1,=p1xqHsûˎdI~}ό4h:Šxz<$}g`ɧqcwI,p;OgpBKF0Y@ؘ2N>f?z$3^ZuVy/>C=yw㘹n[ᥜ|Nl2}ҙq8o:ndgo8؍Xïp$Q#D<=Ӷ_rN"]#6D^WB8T9l^y촜þ\Fry'Oꬽ*wV)IeN8ܾ"_Hq{1-yvCDr?½?h⡅%ڮɶޅ;U cwoRɄX5DiEGE8Wߑ,\;λ/fA|ނ|" ZKuRo]ŭ~Kr,p>\ ̺F>޷7/"y5]/^7c ;;-ޕckH&mS{/atd-O{!mcHṡAu!o1B4P5mIwg>{14,.yU\+Xpro!~ȕ?y}Hu^`zk/ﲌflx{H*}J=~ +p /=]fO]ǝ=8Xe|`[7_]`gQۅVx#wlŁǟġϡoc#x;x5ZxGi=d'6r#t,?swҚQ'v,1{㶧7X;N݃.W!Jc*}xyJ$ł~=Xvo%z-\m/y8kgb9GIДV po I:Tӱ>P~HdNI(5DxAy : h}(V1x(N# }C6U:nPm^uyeou2Z>jaKTS `mv "cX8M"8m#<  RtAW<:6ĒPn|o&IJ[VYv4մMiT Q _"O3MOBgDVJ"@!ث!!9~h/*R6%ֆ81 㮿[_/O"kuhc:M$Ibh C/{ ^Mb q $ asƣA,@b%W;k>v~Q2BCUרR*L&S"MeRڍ6ieJhJ2$$FuP6:Z6ĚZTt S0v@i=NP)u=aR,vZ6-,*'1X|aILETUdM6z)|g7f̆XRu䭿(?6 -"5ASP6>qרU\'m ATj.Y\uڴ%w|,Nآ8vn$&"DF2j^PwN ( C& YzmLNc2 jIVAUU4團lҢ݉XŸ4$)@V&mTaa["j!oc_XqTkuc[1V0[F͘A!MclÜYÄ^ c&8(F[AL HNAs|-8jCuHE?"imEڨ0DyUT_ 2k8'֖^}*Ew rdBKqEL lq^uUI3&$/ !ʍH5Ml*hFHGV(PY(v/\!{Ln_8Nޒ6d dYz L'9}Lt_Zp ί4 {/H%nwԒk:LL\1sXl,6i1zԯi\w׫D@MsK%aJy2Ye!EEEȯ%w$[p9a rgʮl"+Jk̞:@n";@V _9]jj^[ &=wC-~VB[bݺʨl%صLBWSrC8sS~f)KG }kR!zS҅~=-pʲHRP`Y#3P[Xi%1EsRS6a.<&Q$TMw ye6R2VS8 v-7!YJB(&"-zA,am?` !T2sRԤiU[a+5YuB{Oeih;%:Wdj; F(wjcI1!H4lhZFN!I5(ibH:MJi@JEhCRlIE}`cclk6Q~@NiR:qD_6Z&N5HflGty`A5GݡR!&IS4~0 :mBߣR @ (&Ibu6lF3q3s碵3{D IDATQ1IXdjTb_R0*˫[lM,-dޝm~YDUN[O"y ͡h1S }PhT>=E!s)9C.Ψ{p8CU,b\ 2]nnɚm "h7UdI"or Ƽe sr72WxE(nu.1~ag ufIM &!\%N4ys=͇r Pע+_'%v*IV%ǕIB}yZbEԄg1u-]JD&5ۢ`ɛ;5TҖ@yd.w1b_"zfR=dQ.e~f"YceH J]rY<րre/XG*RX5`%/~UV>_IW+/ ii-2!n@X[&k)< \*nNʚ96TϺ4K늗^t so*EYS9Vm5šk(\nM_f[:1w4Nщnlma򬴷90"[[U< ͳUe-FInעdKc"kKޖzl)4;)P9Д}c}!7(vabJF/ 3cX`"g$_lŪl޻f|laI :E#:i;oQvn.=s^xcF$w;< Xvq^ $M66R EnP`wd/ Gy %(7> :k'HM]DY,MNgϓ6&[wkL? #eLV̓bbݡъ& h c(`щ1@2Pgh+AZ&&5x^ ^@ET€N'!M VD!hԅxqD(m18h'P ؔ8JQG,m8)3VaaJ@lO@xtZM(bN*:OP=VŴ;mvDV@yXiNP=cdFR% DyXwZ)Nsg"w=35T~ Wm ՠ?0<8jМhWi֚_]nd OZ #̙_ZKN,Z7D-(Mi .|EyܑX1&},.3GMS,b흷E/L/G -!~=hl1h8Cj*3}#]GNB&$;ƕ[#CSL@uBj3|09[*MZ#GvE1IEGZmɹEv7-+dͨy('z.n'Q)-neoC|dz,'Tx|rש,0LJwHS䍭 N^vh厄dV~54+ :vf;:+55f#GQB'&N@EW!;O\R<*JRqJe"V7P9ϔ-aB8$˚n]/YnV2U(()zBLqeM夵LT&"SLcqRMu;MV )K)&U0kI}+Ay/+5 S YLzF&p~!3[kLzzjӭ'&7jEX}O[<`{EN@SaeM42. F{hFSUCIT)`Κ PJK'~=Vgϴ4YB|-Ơ{k-4]iXm:1V'Ij%n϶Mp6JQU}Ř\ᔦWݒ|`D疈 '?@H,qCf9]]G2sZ%dK11MzZW )5}R&؞)CdAڑ4m6CfMeh~=:/:E3{5;~gTT.C+9`d{秢K ^UOBmCеȩ{VsMEXϒu*,1oۅK(-wR)HC)nW8 _ -hJRX)Vɣ1.sJgX+<"c'2D "cMZn;ʹU QӌY2{wbm0Aƈ!*4jAôjF'fтDc&/JF1I~M08}:*-hZDQD_0ZZQfss"k XL!!h1-PjKctTt:m8!4'$QjC&inc`p {֘j A#&!4 ST cqhy,= cviQHV,Dv8nヒ'>I,a5l;گP߮qcϽʴ~<[C|ԓ9J6/ɅŢ;DxgP ;%+ɎWdwDͮb_Yr.EeG9P:I%;%H/B ንeLl:!eVdTm\vǼto6et?Z i&-M@"0o;~nؗ)J1%rZ.h !C9Ǧ8&vMo0+p)c1Pmlzq}e/$O]+eȚ4NL+,"-]m0YGƷ(Q9T Q"BkmUq~F¢Zt!{o`u/ŊIXk{M&%JtgeW])ńtEoEo1?%(;㲇zVFwi 2j(чuŪF#Lv٢e#,b=PcuYN5% ¤wSCm ykrM'Ip(Lǡ6A%=NqR$HIϓE[Β) k vԸe-[&4`"%cIHh>(/ZQQQ` BkB!Wo7nf6ZIaaZgX=J@Kv:gͤiefnQ)J~UC|ߧjE! ^#*}566 t)AXAvdjPjh!&% |mxee͝>D_Peta_c-'40?@k&*6lBRE #B )-6IYUa~4J=rl?^ўo*L4r>#zG/0Sw~J펩XS'(F\xLIt<ٍhd6rp\wij2d{ttX͒l'7,gbN(%mD6\˸5ʖؿE]W%e%]H'tMim1^MHvU终-mVL"ڼ}(l`-/sdq7)J 7JvShrYxpbRcFOpo'`_f+.-=&˔Qy7K1U"Qt9uuٍݢ=CKxGtEfT a}lQ x.ZdTX.zBb>1= Y̐&(|IrqYڸ.y:khT0/*ߑHvJgOu>6K7E`-si,LV]H)ݵUٿT,Lfby][]M@>*k{qy7]ٹNt0q릐(+ $%)]P+He}"NӭqW A%wlOq˝TFw ]̗/ӼqJ1Yɦn䮍2S,0.zFu=) MAAHDhKjLp>_ULcc5"lJHւf%i~XkSUemc6l1%@<  !2`dx@@Q[6XMw]v*ʼ=7|n̆ڴlV[RC!(ۮC>ha^T|g Jԇ(Q_<<6EC V2 ݼ?;3aipw]V?we}}]O>/0m8ٛM)ӮLc١$gxK 鯰tJhI|Ԓ&$ukAu(b1qi$ 3pnE^$DuZ hAc61M8nK&c@QT`A hd}!.N;%{*`'o|o5 ^iZG*7(YRZe9J+ƐN0f_DIr%L-N| $uO;4G47pD\5ȺgLrmE\B4p~6t&C^Y:{f q*TdFD##DGJO2Ȟ@ 77jgtra1ΟN|.|N3͎O4i %:!? zdдA.Y:6CnIw骴`#Cy_=bL$lb6hݛ=kֈCB3Z_ .~֢hD劧[mEeրr[,-B4-NlMͫ2*"ZS O0 o;8Q2rQXq-73\s{-Y1aXR-鄭m9q l~E&,aEX\زaxhi4ses1:Ӭ-ueZiےeVO#Fgljxq.yy}}*^o4[e1_گќd|>ף_=ca -g'\_ݲ_i,Y5̋cYƧaQZ~gt7>!״M]YŒ{wwK֛-cr,N'viELwy5R[\jbyf59_qڕNI_@ʳx7h<,ew)ြuP(|eiL9yK1%Mt_$%Y]!kPyְ~g׾XsS_ѧ͍%?? g$?_xi-=D<@huNN߄ZKw8&Q>}k7??OVA ;zg*>˾W2$%ǢRgW6:P>BlT"Ֆ=[_lEo/ e FEIWL%R KlrTBd=B:F :-i?" =LyzK& 5ԭ uZ:HYPSJlENz15r  L[k,=@/p`Cl2àؤ& l'VI#^`&> N3CIz;ID\ZpkdQ#R_ A=CZa0萯ɉΖ ,?8gE Qbi6)Sx*YH k( |x2licS7MͶmؖmU㌯̶zKۺbelgT͖"r4hnZ̦d2l%bZ3LK&onoV 1ʼh~OeIf5yDbɄ\?q,-" :+X7~[<iЊtjcش9-8xon([l:_]g=˗+Z#})4ϯ_je4^W-㣜rѾe^7~[KUm%g t݂vkj).I!븇_Mx ,E~/!w]-G~7 #:Lv-m{N/ҕ|)n ~*,.l_7Val.%;dՁC|^41? w_>iZC=}W5tp. .tKt"u=]k%1FDRT=5sEw ],Յ1@;=JhX(P(?yu}5@×&MU_H0謍Հ1Mp#):Z{($J~Q/JTjJd)LYQs(Y֪#W(6eM+8Q*ak'4ykJ~rY16 4Ўqa2 эon$5yߡ@VN )&.CK BL IDATm!Y'Րg.uv0&6az@Q.!Jd}|ѦNI_X TxV y1^Ѕ]aP _Ƃ58/!+T^G<`+k=+PF1s4M;5\/CA\Ǟ*O4It˸/Kru4" ^ljȲֵsq6tZC\wnXKmv~.Cv uT (MYZ5Q& fW M0QNh8330Ֆ7wΟ(6ۊ4X0blٶEQpv<з4՚1M" uc(cOwWdqUI*\3]PYN&P 44ٌz9cDa3dmZ՜Ӕ%G)ZFGGܗ%Ū=^{tGl+ǣj'g)Ub ihʒQQ ֠(c|zǼ=^Ūdr1VܮEF4w ɜ[O'sjggWaY3wyNqq%\_d^p'߭P{@0 Pk/s2Ԯou0r$37݃K])]SNnabʇF_6_`anO٧pH^k?3@FsU% 8q'B%*}hi;q e/dZFru>RUϗp끒 ;yON8pDy`!"Ϸ?0v@u"vpmciKlLw %{}qm#{7MR JL)TcȲ88\ 8ա#$MFoJG 3Ie(]#`8){|6lvu!"R'AMgNp҉kBˠQ}3Q@HOk#2@yǦ:} l/HwN7Mݰ#:$D]V_VH"iѮk6l]#D6aX(za^ȲK2@cF&昹&C)ys$ 0+Cǡrob"lI(<*8K4ۦbDրͨTݚGg,jpJXKJliq qbŤgq&ϟ~1{zae#LX.x%G9ƴEA:rO(V5ַuM>p4]˺Bi2},i eeeLG#6WPeȳզ$Sآ1UeU诱0=2z0\HN=۶4_ G)<Q>F:t"quD]u 7 ȝ !1"HQW!TwBgϞb])EtttI];]!|ў4RF]% W+EF&^xPxP DNz͠y 4C\D, MӐi50uK5d"Ш҈ <L!:8u{+ ܯ2ИD}rWgWG=|>P χ]١0E힅gvlRcQzgSa7tnכ @v˸/dv" \W*o"O)={2 .QޣFS 霑PL = JV"8rf;ovpK>$qT,$ptf%5Y· "<)9UOX)ҝ˞MnRN)ss2a\-ha:\.q8f)mkymIh_5 Y>fRhښJ˺~b>k(hc>/_[\3!¼(<57o-L'X+HcЅ%MkiBy\M 'ǔ%>gzɊEѲ-Kڲe6a˚\ ^>bYwxcw?S5۪O.)oD12CMۄv,"mW?4yMCM5Sok]}$ɗBQ?\ "9E$Lջp094gkXTpK_u?O[<6~BZ"9$=fs;8 ,JeNŁ""9ahO~1>\j M k]ZzfJ=QK7p!gH}q™2g*t]SY^n}tT6 b]L7v]ET*%`iZ)%mɴO;֐g:s y kL;[OY$;|! K{vi{(C2N@X]]2vnw뚏]]#:L]%rCkMGLϒtOވ?O߈tF2 F,*Ӣ$PAQ&AfjBEgԟi%e?-Cŷ&T8ك{6x=U& :A-=sHKv/fK<%n:71'%˪f9֕NpEA#/^*NܯV'3Zh'}GTdikl]ѴUiqm3-]b]mYlkF#275՚cB㬥,T5''߲ެ4GgJtG٘5dfrru-x2aZWoN&;hU XNϸa296qt|FV` ͘,E8QFkwzD[3{|oӶ|%W7ت(S./1KfXVb6;T[&J8q%q|GԦȝddyF2Nm2)F! ^%}/=TWC֋_dxeX])s:Sߋ)#?!eA:*QKyJBtUE8inꊺ,+W_k' n_?M4<]ŧECQH\ih!l/"̾qw&=R{G_-:cb]߄m-$4+~NT(`%_L*q]ICvTI&oQ9:86DC. <. LsHR;OD pIqvLXӯ*Re}si;|( g蘢yi}%QK jQC8GM]ȭÝ_޲Glm\43׀;Mt95Dh\( ] Jw HjTKDwJ lX?>cv$5~*jE2doyyVв̜^? Vϙ(y.vTY$0ԫYi 4mͶް f4;ՖF뗬qTOgTL(4i+N(w hbgJ[W1[Vۆ8bS*KurŬKΏ9jՂxD^hFe8%|c>{M]ZCk,kLq,״ֶgXeq{CX&yAYdYv["uMӶdZq9M>G|Di 2TrdZ rW`OK56˰aT%-B(2\ GsgGyA1-s>}1~Pԋ5lonjt1YP?-^CE:ΠBO㮮Zkr#z Twޚs>Hf- K"; {yQi͗!^*=ܭ[37a-8sio{ZP S<v"OŜP7b¤`e.&rKa[3Io+Iq14݃=QSLmgA&aHDwMDCUY˯Zkr%/dF( 9)pC޵;4w|΃gb rݯHkyN㝓K~^v^;%ykP}RĿL4Y),mS1*2<ömȆAuZQg18шVԦ-۶5xFt1$ >,HpxEm:dx{ ,NJ2?7K研fHYBY܉e{pUܡ%Z:5(w 'Q%et=-bU\8뺟]zx s>gؘ0Qjc1c) ։շr;K4]zpH?|paDNHYJTv~!xF41&~R YЋz#otbHkE7D%=!Ikx JeIabÕq֛{0jqTq.y}u.\O^Hp]"0wl8-H][\^\"9/XWG)%^r>3lЈ4~7[ -|[mxco??Fr&Qe.YgSʸgƾ8L C,"H ~cۥ-I j@?Pq~GD8tw\dw$ 3?\1%$֞GL3O~:&>8%ʙK0z v'V; -.PE,s ;"9l=ڃ 4!٧PA5zPC12 钳Rwn A_ +=kRM(]g,3bnv񩱞yJK&- E-=\ gez:qZ_hNgcDg4AX_es58ɲL)r,9HU^#BPNctr m'bҵ >o]Xg&T%:ɁJyylfCro|T\;)6CLb{qiIuEtVQR,#(Xw{h1'Cd8tg$C g\vXFDú$XkeZty?.\{c0E]ifus0Jnr8H@Q20C8{T8 !$)Euv~RĂw->rRZ:`p[bМ)Ų5!uiijvjK:\SQ*OǒŚ EQppW;m]P˲ vza)9e:sW9}tJl~̲YW-SlX.̎NȳcV-YnMSVtkf^_]S3Dy єilT+/x WW7l<`Z2N<Ɉ>O?̣ GSyr!NFqݲfM>s^\3)FLfbmP8E3n+slWkӂ#> hN'nAEFnϘL゛7#ǧL=~[/[ޡ_? O]. Leɦp:b65Yn9֐ ҃[ 6v6ld]·w{SyӇQ=Ap;Bt?LPG_=`$_j RP5h&V:=a+n5u7fk_(;Xy VoKڕį=چu|rYc҉qd{,>o;}7gp r nyH8! c S'q?ػ]eĆ:}PW2/vT/&9Ăտo]K+bT DYiC|1.dlK-_28s(듃 *By#1tV.".Up]N!AQd&M( 9"I#8$QzjhsXr{,c*KFJ)Ke\Sd#2mkk,gr=ȴ:GVJ4)*k98&^zt0вTtr&ه LlhB>CSj9tg9'#Z lk:$[켮*qkl$ai2 4fs_rTu&A!w#%AB:pNVE;/ýtH'(+:XŇAhy1E@/lm1&G-uŗ5}@QDAX iJ:G+P{SI tD#*]ʥT> iuͥSa?j]#l9vtdT11,+R-84Yc gHQe vd1Bm o&YꦤM9?:8d>ճX,Q#6eU ܭJd40&ar:(a<3hfEC= zc}4ajw??W=6ulZcMIU Ug|kǏYm%Sm-G13ںf>ΙʔѬ6GH_)Җ-u=sjÏEhN?SDikg nYќQ6ºcjhԹiD?Rv*YY ;71 "=caQrGwyITSOt^bI@:Wd&˧%*I$)w9^z9^Mlpc!z4$J!]ą`}K)-$Abw,^Ѝ /·An:HHMRcT*&{0 mU*WKG7D ]L0u*Hp=lMOZ''{+1 IDAT`7b}Xc7Qogfo틠;$e}7O tllѱIPb2NSScP4nRstZҙ#e0u%X huXWU(6kd gLSu"'TuMCF#e|a1cQ[51SR(ۣϘn}N%PhfH?Tɻڽs&̎n͆b.:kaCtiŦNC.8߄aH MRΈ!^^ Va'.*Qل<$ yY, c^Laa1mv^%U^YL鍃kCҪ4Rqo }Xf9e4.L㜲j߬8=:f]3=:µ ՊiQ],[lbTΦ5Tzh2#3}܍sߎnZ> ~ȦwW}@sT#$p7K ;ۡ\Hw?!A}Ú١eEkDgݯ5ylɵ移/qd^6Ù(ib[r,0;O?w Esf/`Pwb"1pbZ@ mذEbhT.[^7i滤"~#MeL'f ~6iea%dHպ f߹!~$(O[u~h;S ӣI_4+59һy"614MM+ }F eZMhZkäb6iC+(׉L`wb#YsIX)KwfiC XVjh;.mh&_xt䋆./rB:h=pɃY"1HCZJ):Z+wAtF*XF[khmWEY\"f ( *Ch~hq.\Úe0v K4ᨓglim].1vsW_]Ŧ#T?fk:3V-U㨝-W 67•|je-9=;՛7Ϲ_-0*r䔲,YW-L#&ӌlH'\~V"Ҕ'gǨǔMbg[8rt4fMMruzhS5 #on\/L/b-lVL[s2?Yk=`k}tu{)Q1MUaůja6;Bk e-ф.,ui'9͆(pYh<"+2-Pq,/e4勗LFYbYNSHVs64 \j4db-2\Lɬ^vb:?VknKp1|, 2Q|K'lk&Zsqv^B_BtFi ِS>`&ȎM.R"Rн耈Lv|غl,](\_0 )vCd!1[O_y]`)VufH;ppINǍ"$L*L)N%ID*;׊Hw? Pv,owhvo Or2i(Z8^{aǵ$" i(K I"b/ :U t22@$nӕPbCs.ޡE_ud$ VT_:ױSwhhΚQJ3E:6X _M^> #B{ҀI?h J=ɞO)#/mYIRj1!ӊ('/2Fpd&X0:(#f EuҴ0c P6 AU58pZ@g!7$6zE-t4m(mMC4; {$t)HXwXMM ueTw'ȇκF&<>q'EC͌6x3U7dTj {HKUcZ7E9$Tr7#*i*#T<,Z  |(QEWx NktB/t $ukn"@uwΚ?r, ~iTޱ1x X"6ZSʚ[|Tl4*nk"uǟ=cz|ֵxN^^<}hjq8-H5b|UbCm{XXE(@Z8\3C.#skE 쑄,; ^317|uO?(5;Mq_v]pQ:dжv͇ƪϢE%bwlkl(D}Adl{k'u@zÌ nX(«\'YUꟖNOYA龐$ H :Ztq;e񻄉sL:o($l\P$?ES }L y*J^NFdwg/=Ց3bpVjh3wF "Kc3N7ɺ ?4BbDJ#.hdtG kVIq [gTtՇ*R37Ah^'B <6e- "a]jڧZi@mCe>+*6wS?wv # )k E%O Xw@o#rv:C -nxx3D숝wo!N*jrzԾ5gpsYTxk ΄}APs+#T|mx~omV$m@9Zk0.SЭxjZhWU]f(ib08sbC#]V3`ʹ~; mPMTإ_ ^̦ RZu5J2u=xS9+ Ekz䂻mݶdmx OΎxsszE <~/_p<$c BZK)Y[F 9PW79?`,c1|*F'.9>9f>?µp}}%ucYl8>>f\D,V\ΘMƀbVF's~zx>׸vuG TVPLS6w+_ Z#r֚lGYVq$d: a9@U]3py~ t`Ɠ1wo9=\\f25,ny;nܯWl Yzr F)FZ]-1Nr'~hvW<8A0Fl[V᳏6ޖk" sXv"JʾajrLNy/8_`'n S\H݈Lo5c $I=!ɇ@(,G:T'#6@9o+ы$Ez9ePCGJICd;$jw T`1h)Gy;RAE]Xߠt@#=%Iu)qb>{s ^ğ:۝jG[H~9oh~wzGS`z"%PBQ{*.0GL'H[:;RK*~H>?2&=)6_ -TBfçU~*u*u@+ʲ&5qA&CEc Z7.a4ʘNgyK6TeMk,Y5"b0糌,mi*YjgТބ!t>f\SM ]ʉS^:d3Z {;YaǨD10%=AO):6 %5ː`ώgݡa`U@v0Ah*r[g96ՆG3l䈓1weP[gfSnonQSW4Mxi)Tx֭ 2 $8?XuܘP] ؠH%qX4d(#`UOYFl`at3J:wDg"?NZuc^7Q B"JNJS\\ww9L4(l*{5[>(d%6ڔ~L- ʐ.K֛(QjJ]0DmkhI=m7wwsF\2L~/M΅>3f'V"FfZ3PޠpL#Im-"tF"dz U@+G3Z-Y77㌦i0y˛VpsJޤʤeCQKQE"*"C "1PQDK$JVֽunsv;0ƜsZ[.:9~?_}I-j5skuQMI9cșgP$_Gq!H1;wJK'"bW?Nc{¶R)/P$dr%VdQRJMґ&)YUc9褠:꽟J`1N{$6kD0K<߲;º7 Wmw1M<}MoltEEC1 ˝Hg h;< +@*"~@(& C8;ܝmjĐ?#ӯ<[ ѸA NY;fĀ.1KDbyZc&0Dp;i8=J8l<,k( eBH/;Na{`Cs:KȀq()>ZoB6n kRP:|5xˢzoLdavĨpďpm RzT޼ Y1S)*/9;?5뫷yIttl{Lב%o./1B(IS9:>B XTlśl:n V9!RΏچztqr.H~G"r-QtP9ݱX #k4VlikNN .Wnf[cp(E"ѭe!T,O|e!v_^r"+=~NOO|*$,Ah?;Z8*J$ha"Iy[f匳}հFw5*wTuţg=k:f9''K3eʓ'0mӚ,ny(:XlkHiy9֟+^z峧ϸf%|2cQ.!SxszH3|_g6+m9/YY61n+jbDw2V8߻hZ?{'/ e!ZN#~2M1M w1P_|~_8ٚIwЭa{$ }aB@_AC9gǙQT8qdu'XHA$aqg.*:7w:eGFR5½ZsDAg'{Q}`Zj'ou=/$92_-Ch24$wM:"2qɵ~Z9g`julx8@#9&R-!V]NL"QzP3'n;NH)bB A֍ P ?j~! IDAT:_Fm[s$F(IW7hyۛD\\_stq힮m)%Ir1gծsD"RYp8-KNysqAYu fb9+Xr5%dt~ˬ99Y5;kO3~p2鳯۬]$9jޑ2KO*˔Nɴxw!>67Tly>7><¶GfYfEbL9Fl^g;I1͚TINOxÏ8=ZhK~2'/KW;O>,rmnSoƣثI"+^_;nwN/{g|'|䓏QiQ}1gf섽<)oTKY9#I.S(Pt8 Gݢ_+?_ݤ5R;$_ׇV^vMpQd*\l"_5J. A0^rDX)(^'>Pp+a}5I\Еƶi?+gT~ۇ7 q@H!W!$S~g+̋_/ !& CeԝFpyKADUnL6H '/_Y~+T. 짳C2nDl-t…BSwE}6RwM_BR Lȉ&v/r{J/qw[oBS[J05kzm <]0YJfVF#m,mMڒ YAY(:n+>SRJ=G9g%糒ep][Ώ CaZMgT2Me)Gc[lW7H+VO99^.Qq77kr:Ǭ4c+-UR7ILjܨnʐ'orPmc_ȻFғW7=+ YG䤞~O3EoFq/ΐSK^BVG6@nM@tZe 4_(8t o{:-{xd ^BJiA7ÿ)˿ax h;ngl`O8bq&ěބ<䔈18%XwaZ׾> O6MG sA0Ѳ|"6c;9*C&q)9|ᄏw8Q x/2؀bk‚S= "=8\ `wqhX a;"^{aOv:X\[!n3B2s`N$¬Z1<Q:^c)WCt%9Sxqʇ?rbឰpH^m!*o6YhPgLj gw'F CRոOPD*DHAo0}"U{ka(!%PJu#|A[<~͚'S 2-7 b>vnC(|>Bf촭:BcR:c9>:b︾*8Z.1mQYpVfN|%Œt/[Jay} nn)򜪭YsLp~r~|-JsX?!U _(OƓG ^c,7W|Yk+eSUB{_k֛5yɃ2*ҵ\ .X%3xxiAk)J!s$*5-]SݚL:l"Xs}sHN%O d$t- ]̩}_ ngtE{gw>zvAdTF9|A[WwtL"}`MRkɗ h5ib)ʂ,Q4u[Qw$rFhc0kPO& Pi!nǻp vaǧX#o.Ddd<׊Xqkb:Ս.pʰddB s_f=8^=TE?&uPz=ED ;+981СL=wg=>/m@<1W!O_j""ktA=fww""D0'BAl`k! cCG'it ؎09 n a}܅(pq aæГ`iG NlKyG6zȠY*) Zh,f'Nq oP"3CJ}0\= q: aMsr sl{Z?%9d' ۰V"7׵5nCSż,,MRPZkh[ʠZc3΂ՠ9k@ٛ 8n)4A*2 (pM0@!סTvBGTlw`Ac\%qC|"R$!(=^*p@4~x9,~v/PsqGꓷu(  F\1z[$R gd &lNIoLݑi'ʌa9'(O躎6$e<&]صzCY[Y(DHR%ak\rHq:{q>D S5f0؈l%>nԄܗ&.:'Mq$}Ӧcɽ H yp"=Nt!R JT0ɰ8@>Uu4dd(̧)ѽc*QdR/:ݐ7 Z7$fG6! adFk__fCwQv'gQ2!J&@ccEԽpw!:pr~[(}=v!˹ Q1D8ΉKNkrр6maF诰M^3(:ѶC8 ) )뛃#l6BӱyG';==1=~Ӿc|U )L(DJORwVM @eFK*tgQv:g68p]zg/ߑ#Hy/*Pl(c 6RೣAd=wG(> e 3F )#Y跐9] 9H1=.^duiP^oN$7VgAIs"m /Cv}脋pKڦbwHNRj  e>X8597Y_8)9;Af{Ta̞y&]ۦfGKx>cXgQ.WB)tIB' 7uYӁ?qӪ}}FV1 h@̿ۄ;oŋj \M"`/#4wÇ]%]n|@|!F㸛+Fb{PJvPȱ)I?ѣ7|b^ /L}%vqqu@rQ/"yN*vu:f-Jӽ I hIMZӤw2ӋlH-q kmq]ꆜ 1].~29x*w.a6?C{S]Рŷq w!B ++|6zINZS6jsUװ6nAb@׾{+A키os8kw б}K&&rpU ΁ƁՆUWjTDF&Ik`I7޷$Lݩb (w!kXdnz畛b>eDkõ%{ifĹa!4rk%d~>3dӖ#1:v\i$XmC#fs9TVsȟU~OV32bξ\w%; uUqZs~zUf!g4ekC%)U Ky 2f%///y|[EQ5Uݐ&)I.SlZd4컎_2lNwH2O2ں!r拂S:žm8[.8YΩ;f UC786*aY納.fTBJR! $F3}qRPWIrj 3nVkv擏cL4%"dA$̋9Lq|;??gSU:copNT~say"MXrkg_488?YrR(GچUUه_4ul1$IbWՎT)H0ұIu.Ry4D'ƣlΪ1!ݐj{l@Ӝ ]}!mu %I$AHHeM׃R4HD]hk֏ RtƠ”\[ H[\3s#9y BcAwߟv:4uGR_9HbiKox$T{8HH8nL"ty|F"KN87bF)+'9gpƌ[~k#!|1[Ԑq~~2xP9;zzpjAyJT$A~}"WFAB >dDϋsK >!EdH1v$ixgc7*|h"1o޲Xn͚#n[prv̮jm<8;jKtfEn|V2OO{tv=ENN˿+B\)%U'Ul VNT!WWԍE&9%כ553n.f1~ʟ*iZv5'8.2Y M,3l֬,x#r4N^_ێ=6xqغ#V VH$ e9#S}vd1XI$ 2$@ 6ΉsHOm pѡ3-4 aƕߘHC &e3 IDAT@=M/I 1S7ʡ(uq s"mCT_rsa -&+ ,5 <=k8OtaK} 6ݶ7擘;գƲ;~mۿ]Oֿ{pѯkZh6+6#I4xCƿE>y֌ruh$"_|h9^?>}n 5N/KB\X8z?-f@v!p=>2ƉԄt뉡~Iv`p0"̑ ns@`龜 bpq=9DCnŁ%lteNtrӞVl 'tD2>SB(_SUc!:I5n{Z/?  @$6kAg %){i"A!$r1p*apʑi1a<&ۡ0Qj7.̈́YɄ2f~,gZy{a"_/EȟW0CTFXThzЇ/L$Cp([wAJ~%g:~ z?чjJ1H{[N~աg =_oؿ_&q)T"{,ߠ<>q9T)Y?ls^dضفQ c|B)к&sIQ_@$ʰv;e]ס1㞭>x}jZK&lqn[fN4]Mg-|#l 밉2-p,sNG]Ij%r#v,t΢O'uFW@njw0vydyIu4] Hi t=:-)/!hmA$)eNFp#~Z{$n|XvB ޒ>jE탋YN#UW#,px?0he\@I^V(A쑣P!ʚ ;1QFFot @:D]tlW;xN0_Yԉ 4mku/* GnRd~"}C)= K251c'a.Ԭ@8N =X RxITi0NH~`(x& b~K.$K1@i`Ѷ5Iptm*5I>c{O&ʥ\:UKJX\,$qVRO_vWsrr~Ks%`>+Ca4 Mkijs?bݲ_9޳'h!O4#gGe4_y.:Ֆy1H)yWi$bV2%v{G36-% h57DIBkljC5`ToR`n9~bpj8݄#(VvxH~wuwd,LMDCrh;3d-@ȱ os5@lw8pSVFxs~{?x)( ~a&%:)>s2E\7i')J~ $yQE:neI~Gq/! r1'A(7/L|o"41FDqO(=^ <:dyB^R٧F2;q 7 [4}q#arℚqjݸE_L untN9X'lFMiwAca0&;7BI ;A"^ ~w<]sM^.CfiH8l, "zV9;c͹}$sFMKj gKV H[kpV2PY-İGߎ1Y1=Lj?,3@TxP#e񳰇HOS! a6dtHAquD D9kAHIƼ4J pW?;OzFOLr~J54}7I|fq3H(@bBGG2ʦ"d abRB%dDi[hjAVBvNP#Y57D}ӧXsܐNwԭC!ٵ-B" mM$brQ~Gc4`xO>g_ |Ijvmݒ(hj.+tT ~׿-7+/8yz/_S7vCܮn)r%A$NU=(9>;҆˿J£Fk̊p4UE4Eˢꆮ]_52/+LHB2憲 MPEaDw-ؐU`^fth@ZX@[v]K?f#/ >|_\]^O "MAb/2Q+7)ھh.2YȄkHvi ??&Nv$|wBH `nqbV{b0%ξ@CD09<Ӽ8ao4Z!ݿugP}lyBe9Q$܄/Vq]M^5vh\ݿwv,z$o)x׃6ALrЊCBqvlb5,( "jE6W}!NаS/ 7Wbj2vts=]8 udYf.RUG}j>W,m7Fwxb$:?ۜ v}8~7 562JNrʵD()G-",U|lغ'idxQo& !pS"h"W*Ah?Ä@99x#L$$r*sҐHSlF0a  `ީp$<}^OI 9d g½_HX A}r-:Alc ܅Oѡ&ytolqP)&gT>i'0/"Tsy,qH?6Q FoK3mmuAbQi_ky=g-m֤ENQfV4ME$ y(p]w~/di4/ݬYY, UqiNfjHvBHT8,23Kx%OϞ&9b[Wt6֫7;fE< .nn9=;#RPWH6 i;KH2%!E)=X5W+2-<M[Lm uUbF׶tm,%2j)SUB Jmv] o[kNN_%/٢ M^^1qFs Ϟv&d"Нj|^eW/y茶2jn,diIUH89>jzQ/ٷwūk.6=YePn~?gh1)TZk;ޢg EDrhǓH9keH S rRz= F'nDV!4,lj FNR@-I'l`J"S _Q|%hz_S8& R5=ȓi@:A2`[^CqErBRAEYO6E݈UN$ƌwMFEq bL_W$[lof4Yyq`0C!K ^bTQIy$!?h3|}Ɔن>M<~>IpX y"8Ec$\ ` VL0g&RWH~&{5b&YQr,)RjS~\k/aQI}$B{U(f- q0 X?ȑzYx _Oq$mrѥzWeY&}-GŃ4[ʩi<|BD0KwbYsfaLK ^JN ,7`KP>XAMxk>{,+8>^--M[ (Yl;<'O}J9՞oޛ}I9LQ[b V[^_A脤5%_#.7-{Q2]Bq?H(%|7|o:i3Պ} 4՞bYe^(%N8V Jx^,gdBޑ*_f9gUś+R bN@mC/̊6(OyYf" .Ope[fUjR)=/HͶ"7߼zeo,Y AEJ2`naoIDhI2aݳm43c[3+sJ7^^o$yoHKz]Α X%2?-P>Y+mhBP(tm,qt֒岕`:o, uorsXb<-֦.BUD 䩰 q{)Io=z2H4i5%pC`\ѡˤduE&f%Kl<(ؑ<}H~(EnrHO:Rw_?F#;_O~tԬ%dfob$EyCtӣA?<JʼniD^ۂyeY]{7* ((*DiJPP۩mEω^n>sj_( "Cdb(j9q3L7"֒zu+#2#o܈g~Oe:Łܙy\Q9T~ZM(oj/c+Tp]ڵ*wB7n~>B)eVê\bF]8޷( qߜu{0LcWLM)-M~H[!vEmyX[ -OƸlm JHJO%|˚|M){ӱ̐.Dk-^fAudI]^&)XvJ)ZuQl>7 e.j:~]Ӳ>2f,+@Y$V(A]SO2rqPa̙};GH3Mj4JR1|K_r+N8k}fQ=é'u{e1RzI j2ExR28y(LǘODQJ%Dje'=fӈFCŖq ||_a9RG)'DI56ARv#%f$I@!mJץ4aH4C(,Il V*uW]5\mALε(+m3 )ʼHpb]ݴQļqs[y?`aXus1@ajl]`+S[FFuxBSsZn:'JDu}X??Uf /OJjbekrT?]{zq%e_>ܻVz(\,l-E AIkOA#A#Ɍ'ir .75yr|.) c&wOdY|Uk[ܲ!Rv@#ԿJ4O] csҕgog/=0~ ax ,y`* 5AuID1&7  3 R 2CGP-'פ4%<'EZł?jix0 &XsV|[(>^xݷ)7(GENC672ߔ1bh{XcbI 6Yσ\W p{Hp?,IEW_&1Ca6붋X/^,`zQgWܚ&FՎ, D)0Xg}b ߿YahPQ{M}8,.l Xֹ:}!i \ #ZIQk>Q8ؕ(% Kwȡ./3Z}ZH-+G.3)riu-^9%ZNQ |D!FB%qBh9UdiKBNUb^A enږ"-ڒr8'j= N4F(RuA4Gf6k&'ضM׺4*mR<%I TƐ"r6IݛY٦i!}A:$o)0PGf'#0CNBYI&RXA U)Jݮ{JܴS/ITQC 7UҶ9vfvdQ TNfU±3-O"鬭AJ=5j_3,mkj7gQ#PU܁ Cr輀05ݳhujX;|!7 )Z-VVP,Շʊ7b1@WTQ i@Xǭojmdagr#K\jzV6fJ2^ HOՐo6i)DO>\\lQkU5_G^^9̢3tF2 F FӘ GOqVxL$YH<0R_hZ6sއYti4Zē W_qe,e}{,NX416GiBi4iwDQIө脦,4h.f:llmMǬt&v;h6e:hHġ-~%Fg\:w WD-NnjF{yaniz M)f 'S R_9*2§bgcZ F2'(O{V 5>q4WVh\&^8xT k w6."4h>d jHH$DeDԞ(aN :jA6QϿ)o?,j'1us=^-?Ndjyy>pk'wȹ,(ĕDF<7GnA=# _ӊG?|U+Q\g4˦ ZPM_=Pր<%QJyIU{SlyR+4!S'\ӷf(!Rvu_"^({- kϽ3#ʫP<O3Oh#O8.!bX"2Q1E}.%&HGY\>q</.#Pd߀Tkc |>%]Bg6U'"Y|!Ȍ.FT^1g-"y$d^\`JԽx6[#9d>x֯$X(?cY+(A:vXy{X9vT,HuyΗrmafRI|n2D:g0d81hfri\X,!Ihu./-y ii, V.Чpq2VN9r xӟ6kLF1p4"||ڍN+sLx$FlN(XXinn lbswlcYH$鬸b-(Jc?]§N2A$hc2g,.TO UNWMg)k=kj%]^5Lr$ɚgBZ ~[̪@.S>me' [})o #c]AUj'Чd-^M&eG%k*o{~JYckZOܦG:'G8;\@:|>z7iS?Q~/>į,7 Ir\dDב^"}cG-g8%q^|{,ְ$UyjhFNcP$ǮWer~:c_/>ܜFҀL6:!y %~RAѮP\u;?oonJf_^@T2"ЫlE96夸xOy = /uw?=cg msw}T.F2yi/T(g }yQ I xl8iF|&18o2faHco4$hM BJJ*6lo}EI.dqo k;Mlv82Gd:nklbF{kKMÚxL#ɒVEߣcDln @zx^K'Y %l-ĚfhF" =B? 3 ٌvaf:"% t:h,yLG51]*?PYYpʼnU%7wF1v.qf1: ! huxnP>=3 Co%kF<~f!I2!'2VHR=uV(<* .Y%jT,1c‘*~β( =!VZZr2# /MlO-(,z%E_GCB0YI4YFov=_w"/1hOhx=2B?"9?F> Y_le>DE|.kW)0ʋ .?7Xz^ *K)JMt-+B`wh*O~=qMow|jPĬ=%>G u>sy҉3_Sw?X\̯מ۔LrG?Ztֺ0Ge@tL[=F!l>], x/z{S'21`|kx56`~O2Q~H8_w=FL;xm{|kyѳOp? z8s&8!恩tF_ {6st[LNbW>v4Yxa@hF }>.QGO/I|<>GtNj1#fqsmkƺiO'p ̷!&57;cqB`I :͓eOQ`Tfc SI@bX%*6؂J&TA-JϺ|qo+B"}\/a>sl[+OdPߘﹺؚ4}4/k0V }Y_.$B<ҷR xbk=Uqƥ]vc&C dpr?VFs("/ -G#Mc9>xhh4!i2vc|V;;`>3!ylh,c%IR8Nh&^3M:&i`g^Jf~d:EJIe$:L,c2e &)vV fVOqyYe;$N5)a4g4,/+X5;{L)'O]Eivy C?_dECQ"^gY4ᜁ"iLRCg9MaTrӽ8IC(X(^]t}ފb y/D^rH/D1yȓ *rL?E>EUVOYPr3)3rqO5{R{ GvtwynM!XTKk~NF>F{[k ';wfg4o}+| 9&&˿mNP/| 6Bb#=d[;XV^}Ho "J_~4?\{50Eaw񹳌t vdЩjUy/}HFcQ&,׽omy7g׷Y?(zӼWe=`{qǷib2yF^ _$Dr۷|;_{ECN>x󏼄NVMHHx˹-xr9F\?":)֩[׿ 6QX]xٝpD~kuu >-R&l`H H'RKԓy7<`B$4ny ooeҹ7ڞf[—G|KW܄g,ѫxsOcÏ5,M.qnkXMpK7}˓l?]nHnկ1$pvm%cX$SYЦSn2ϰ=2 X[c lx6MnY\шjR72WiVhx%>e fY~_R.9A6BF; C -Hy޾&9a{ڹ$T]5Dv["ge=tǻic2]n5 o֒[Kj,viBf@Ib=fgcp8Y. IDATighJj]:ue̢i`?A1.A_ }Z̀WIDDI|:mksezhN3Vxm')&t@Y+20/W"`͐JrdnE3Ҙ,K0iP)A@3|?uWH1$&P$$VtJ FAeӄv Xa2鎧3 쥆,clL'O<Ń8syi&or7=c:Ǐ J,8s1 ,[L#$B)t: 4e:M!.+6FKyۧ1!˿7?vM|cټž;P=0S{M|f2{?awh ~sYNjn@ oKEs^oX}c3)#!B9IiORw}sH>ﺈL"So-snj]]%\~ٱSp6cQc>xߔK^zG?r ~ ׇ]$S2kdYndz';$2`u& v.t8{dX8E:xwM%@) ƒb|l׌Cys$ O~62{"eiZtNƸ?T(p25f6鈑 Ԕ! ɴr٪o`/)h\ ` /'RH6dF(e8vAk]Ү_.hW} ܍ZU#9DE%ŦVҫbkfk%lXkrߐkJESNl!5[Z$V UJ9r^#K 9VVW d֐iM#MSi2쑦s.(GFxCG턄&a#.ySo{ eqH+fd2*+ n _jvIHOͦєNE cڭI4̳4k5 HK>eHkdy  !yLihL$rDkvF#97퐤 RyLk$'N$.e{mַ͐˗אBs˵Oo8e0;%^<O`J $YhD!l]2yؔmIB$e82SӈnC %L L-8 &`:٥qݵ&aG>y&W: Mbf9vd{ﻟ]#xJM*as ,W:knUοxmɬ'S[eU& '/W.DD "Ԛ<Fwŕj+ZJw8@^>[fO5O~6灯]G=򲯻# vǷOk[|YQ>?yo7?ͳc7hCK:l!)~JXך:QD]a#x,q -qvҫƑg\l.p#f Q7|^7^t;=ŋ5o%j0 ldsJ9jYTynX kA_Rmch墾sk ¯'+{܂%LYD]ReAp]2U cySx$*H1&d~:ِAyWk0/H6{f՟fTrfV0ujcp$!jo,qN 'ˬM2#i}mT^w$&Ֆ6cڡ+͐$q9q% I32S(E5a2O h4BVVP)J'[Yn>Y֢™sÀш8oH~@Sfp <GW |dAD N+wI'I GG)JhtAXud&2(%2ư7hd2aG4;=)51Ih2IS3 "&&opE1{QISN;BLuny:?F kb7#d &Ո(f@D-&!d1Ǐn3XΦ\yi9{VkkAٳ b%m.nl=&I*h7ĩUpűze('8PqbCwyw^hv$i&ﶈR guyW- XuQJJ:PJdKrI\ gr>Bdu6hC+4B tc4V"TX:%7%m~<2')#Hs5\

&a2026s/5OZFdVQ&8uu)(<7|sO=|}?ymEG)|osx7ǘ ?Q@[蟮z&$sZnKMbFوxOf|TN2sg9BbQAm~ko^F &t0"D<̗k&" R /slΝ)j-J* Jz\@6&@| ԩW7N]XE()-B`m噄 ]@:̯(~G_ TKs3Rr4Q|Y􎺷U~,nX5xERzsJ6.FrdlE 4-uR`O6-,1J.^bk4FxЗ[6Fg$qٞ'\ =ővjtr+f;57tZt{]IxXI,jxWLǜX]A[x̱'H'_g*6"Nb8'I:0rt0RLsF;> Ahj6o2c~f{D'#<"Kb 稰Aݶ}ZaK[M:c<ۣj.&ӄaOzS&^_7ՄnKj`h6"һZԎSx:cGäQJ %ք~y<Z4Մa,xw06#X7ͰG._GuڤR3"h6zıIMMG sU'').olߗNPG49F!k Vdln^䪓GH3MG1 =(aQs $C7i]I@`l._WXeNDg#[i㐺FTbq]ai3Ŋ|65CbP5%MA%[Lܯ-]6.V$-Qf_TҜ~SՃ%JB߮ RA۟CnrRU0eGTɂf\TW4 hR6 j~eew:DuL?A+mـvx۾= lx"H|֔m ~S>WI7aQx1^'|iDRSjQ$E?Ę*"pc~=;?%ןeԼ=;poJ^aovg>ʅ݄+x뿕w~ $%}lumin$hxg3;DžBvc?y0My#/qusD4𚧵/cyzW7 vno4 `o滿޻yr鷼g~.~nl8s~fC{|S!8S>X̱|%Frc-"DXhEK@s 7|Ky+[%Ṋ7='c:^.78$lopc'Oqߗasg@iF@H)fG[l Cvw >#Gf)4Z d^4t˳ٳ|%% O'#GHt8_sĕmm`ьSnIxA 4MnΟ KJפje h,VLɜF(Qa8CZ-Pwzm.PqcA4t :m,$Ȭ_ڽD'2`cQ4w`E@jmv4 %= QY]ZR|p4`wa8 i4ZlQ\쭲; DdcxکsWRk-2bQZNm6. %̽3T '%B zCs@:ƛ/n)-hlEjz2^;ַ !|~96[ /ݼ Ra?Io9ٺu9ʹ*::ωIL~aя2siv5c;XO݂Tc5[.qb؄V7Q!9D@xS? ^Urcba:^w;oeɐ_Boկ{=bG_bxkݙɯM&N#/{w>~彗bgL܂bs!u p(>ܗ?3CFKyO6#<Ηʎd c[~/ >1ä!:䭨0ٕrp0WM/uRo?{Oޛغ]w5ժ=tv8&UPrE\` 7p +@HܐD\p$Ċ`,XM'ggO5xqU96t{}OQ>?J[$񊓓Ղ,壏?z<Ҝ.lnYFXkL#2Azݎ4MH JRV YzQsT̽"#Hbnno|MU֐K<0hxO?H:yL^TW,OHjqo~=)jw>y UEIG_o0c eY_^g1y脦BJ&̒4:^_nj݆rA2a<(hbW7nwHO݂ A|5`^4edo,aD?3n.^sd[Ӑ{V2 \|̯?7rZfg/^E W~ƷuՒggRY;N$F|?3~ u֘.tT-xyX8h&?+|]5nS.E q8tE>'2+n:KlZ,*8p8lY!Mj G el̐;l]C3Ga 1 '%<{ ;_C_*˄FELJn "~kY{?sW/;ʐB0b73?4P) IDATمՁn0mӣtDkwD_u ڋ]gM]PQL) \4#),t;v\J,eS" MY࣌XPU, Y,6!^-nF)eR h2RUu?B$Ɠ$YnB8"5 EIê$Rʪ A*8F3 iKUDD U㈓E10p=&ĔGiWlsmg-\`-%4x[}1X$`:4T6#34×䞟D ՒX+b%"-%Z$ݹ `A?I VWېv=_C{=݇`.p{ܨy; 1}uwuù(wLX q0yj9u܂oCc0x aq5Ψ6gLmc-BGU;\n*;ϟsSrdiҁkępNubꚓ)uU/v8 tMi1^|o.β9M]3K3V+[UE%$-./QQDH"[P#HӈrA~ =0/pquJ3tɫ.o8/xt͓lQr|rG// ^J* 8Nb-(yFYyǘp~u BJvEGf G $JRhi4Tu3R'keSS7 q2UeADyE4vf$Vh #ư lcbbQ5%umxrv WרTs|zzkJVgg1o3Os))yvuA&#>yϞǤb5OQdEyX?$VCa1>f$%im+rs{$'efτ raJ4,m"Fn#C46'n{`y)pc^$d4ceDM|ޖSCahynHBW4W/LACH~xK;?g~/4ւFk=?}h>FC'\C8G~Uö bBJ,#2L8IGl6q4iFFY1Ӵq >IqJѹd,iIkÈI6:Ί,U{G(⻷R1+d,.J2%0$f84yUQV64ekdWqk(B(Ekf7lv$I~'K5$Rr\p ycTeNQ6L%JHi%2 1'OvSNKʲ.rbX2(е2gpyuo=z妠1fg9!h _@ 㦬{Oe,$Ԗ8K*')uS$Z/|HU}c=z%g_Rwuo|LI}]nnoh 'eMՄkFc^;n7 "g8!}C!=icEUX.if{MYw%ytrnaWxp bKsuq, ox򲤲 yen*UN .{rV3fγ3 99}Oѱh4D(ח*o?'EvP6 ]kEX޴! ԭŮof*8U5z3:m}ptMb\>2 Ȑ.;ڗc(am}1 dXE/"toةOo '1Azzky{[D/XN J'#HfA#IՇ ;Kp6YV{?@@ cwVٯKm,x;[No#w# ?csW*?WMc~/Gah W@/D+zQrvG όЏէs( 4?kZwjC~hDuWSthg=^" s%/҂DsGyI{KB:ǮfhnW4O(Fk}5؈91F 6mҼL[7ҟO'Fڐ-[kd݇^_ף hȢ4$FIXwF ᘪ{SC.|r݄ d807[}{C6y|FrhJYَ.pP1}]9v}*v7(kPA%&hV 3Ajj^`axp^d͗ڳqd^j*됑)kfs^'S\o ʲh}nAHx|zܷ$4xllw;*xd>_`(R4Ɛ;d` F/W+nv@O}k$Ѥi)r$AF4UMl;vEnWDF"_ u]ј=u^0bOJ˦5,3pꜦ.'@l7zSoɛطg8)A^nIDJzf[T֬)+~[qy7A T[E1-p9z>#JbvGǒU"ij6C 8jt[5*^|jrrz;8  7OHᐶXh)6nW}X9dQ !S{`t]a~jvs(e0 >/ijf16Th$R1Wۜbنl1[$1] *Q8 _`{ z"J5:89~fC#-MciR;9{c{'I$fl7輮QR%ĄF0GK5"h=AiQ֎O_qSfE㢈Tp̘ŒfxkP.;#$DTKEreK [ -#{YFMxͭl^I"ĀL1!MW]X1au`@B絨&~=Ȃrk6?;1^'ŀMPiiKυDYtCnꌿ?_ٮG߬Sdϝ8ѐ˿(S1Uw}5qx 1zbrw;B.eq~w>Hx̢=?Sh/&/u;ք4? j]xW odi'[^/ƮOij̕Rvw 6ߡh_0txnW(2?mho{2 c3m!xzz=\Ah>u?!ƟM>gwpbMQ+%G(_ֱ>eJn'D 2hu@YAt#o~!<=&Fru^Q{mQ_p^-T*IHgi8uDQc-BgZѿwa+7=u)}]^sY,Vd2 nQb%#oP*5-ɖGl+("3qhM"}M!#pDITA_'UY$4u~+RdI[yc>y̯oPTjuЏsP&,3Tv{8&S$ۼZupٲ+,x\U\x ztIwϞD ,PMM(ZxGm-yM^1_eh>߱dg+*v $:4Bv,KTa}VQ|!1H)hL"K8Y?B+ϧ/^QXǮlDE%r2#?U._6٫3*m#DĞ64Bܔ\~xF48|ITA Ql8`!v BAJћ&bB C"C7ԍp\QbE-/QIʳg+('ˎJceMyjՎ_]J@wꮫVZ%h:wBO&fN 4A٣|p~\- -}D7AZZJ8zmuTsh䈎ƽ"Q}N_M  'Ar}&= `2oϭQo;#Ĉ? {1ml:ta:>Pk:-G 2=:SQBsZՊŸ#@pѮz}=M ׋0aU(\Rh-"EYRmOЙ1yG! jLuTy詎f7ß䄞YS7R/)z8}|~×nA&TT#hS%FH#'.'͗;lvB*Zc s, Jp|#^^ ՒB`nH0ΰ=Iu5EQK J ,Kʲ: QQUuH6~η!ί* "##ʲ`s$hW ,YSc(b+8::2k͗$&4ήrP d[x^[1̣kC_ܕ$J1q㪜$Z5\sE)˳sJԞ}==/G^ʜ:OMC(ߴY-(Ui6hZ)zN$Jɷ v拄5D*nrB/YA+S6xEKl*PԄNlr- >|yw?=㦬 4hXO!.0dkV8$n5 #*ؖ5Kx)Fmw¹Յe#/z(U[l5İHQrs"'a Dyڅ>ЦǮdX81$80?f}Anl}֝>n]Ub#&!E3X$)R~jKqqИH`?= wk9xw~| PIh9bH@Lћkwjl6CRLB>c&oO/!Z`C&I^ŚW ۍ~:!vi7}̇?q9ǽEB(wS*'!'vq`;:WⰢ^qwOQH0'4&4Q)X#c)EKIvvя]߇ufx ƸAtwr>}CW50CsR$юtWޯR{j|7̰a &Zp0PEY% zQZ] ̮a }X\t$I#J'Q K"`E|N!/ f+1XoRR%BCa R- Y)5wVѽ(}L; Bq@;\~fڝi?c‘V.>P@t48TN0w6.To'ftoBN9vk֡"R%ÐB @Y7a铣Ða+rv&@{ʣ8 IDAT@s3x=d!";:QhMFOāh3hl5!h0;Üh΋{/ ߐXgX/V@)ٜ;} .wvIr|4֠1 M6X>X|vzu˗Y.4 L֞jl׭AqRͩ1Dن<ܗ|}K9bi05kpX߰X,N%UlCo+Nۆ XSo6O)Ꜻ;ss3ī~ƷbIGK\lw׸+r~_W,9.oCDY3.ιd}DSℲ18s+eȖK-_7q2Q£:C$=ERP=\mŴ&Â_1}uIIx쮳m`#-K>liLb< vxxLki>Qr/.Sz.a:~%r*{%˜p(~{*@H3Ĩ'/X\]"_S_ڋj_1~nq ;Z c'YB/ } !{Kz:owPy[8KE wӤk>iA"!OP GspL[Su҉5iH(R 5 6+iT I?BmLS[.q]i$\EAjx@%Y }HPw+7wrbdw?r|x@LNY id5~DBp uN=}.4F2xR`ǡ5)1-N ^!YJ㭡)*VK,I Y"8:Z`Mr18~#GRHV4Uk4K ,$FTH8Jӌ$N∲8|*#M".*w:WiG TGE)+u<=Y K9n_""C9:I#-f,"M8V4uIÐ,KQh)xZax h,Xd)E^R#"$Jj֗9: e#DIڕ.r<~t{ϰM!2wH NOm uA<9㕦4#Srt[/O^Cy[x[X4MsE6 AJPoϒB|DKi lJC.//,V3mJ|.!"v-HIm!3"/+*u-{`H,K'PԖh6g[T_nV WMcɲȠ$Z0I mnмt #BL! 5mh sDE t¹AѺR!u_+M%BXD4uk7sG7`9ص%8{M9# Fp=IRnsl $Zza# [Lh%=Gd'o{@6Dpg7> fC#IbV- EDžoOa+`6\]c!ZnzÁ;&lôW`:BIuSqQE^:-U:4,Z\-QRyY-x IRlvw9t5!t),u]PU%ytzz1cQ%u dX-VH|Є9-*q1:đ"M$T{-"S}L+*⭓G҈ǧSz2pMfs!dRJ"^S:X\M:OȲUc9}MQkf6m 7NOJYK7ap4#ME 0 wE4Ix1g(\ BZdYrh98;?;GSȎ$ٌݮjCYY3kM[d)6{Ҟ,MXR=xr4Y:9 msQBHNe ggT '#yN#:f6Q5q 4Jє%Xz"%0uW!O*5:Y.ܢ-^R{oN ^<.q{E{dIzyO8I(+C,|p"Mþس\8) Hi+ UٰJ`Mmf>\wx=zWp}}M4"d ӔQ(6䦱 ΐڳZ.f ʦ#lYJ7D'+ViBQY.欞oKb.6uF.#~+_xwOE΢A B{mSx"]Y6Xoڕ=R YG,KОZj'ʣ@%^@$FO@7*J,A<͞{ȿU~woaߏKw\!wJE IY=|{}AjXlkmJjtv 7miF&6cz\`$Isc̐%4=*-rhj1?I1M=q}|w]524sۢBϥrsRX7=./׆=c6-JIh$Kcm(!o7yYgW{hG+?yF@8H#t<:ZhpǡM8y)q!24SUST%Q:Ơd{ܒf>-,K$ۛ ՊX'S0/g4Gg$Za]0O}!8^R26fqFkcE:Ѐ4Hg)u]s{,ΰѸ0ނuH(1H!α+c S54EbHJ,g rV5=XAq}N$OV3lLn_%)eDq<[Q/v8otD6?⪼&^4awe0_̄ ̣l6$Ũp ʢF)MCp$IpH$8 3/yS>eՐ1q$+G^Xgyr|R"gö(R"\r ނ*G|2RfR $Ks{qKY fF 7.C0uNS[ۼi,ip>'ǘkƾOيO=H:YIiCג  eUW%uXv)Hʪf>Q]X_]_KZ9 =IPREIt. `'e/{H>r)}){xȽKz;qps {?&M a Z7BO~/_|]S/DiLs*/+~oQ @83潘OOO_5ףkD|~i~Go2Ĝ6!63L% i#eL8lhȢnݲw>TaBBXm7twUꪛOi7];{VMg=a^{xw<7M$Da=ou$*25@$ Umh[â,iۊ,qDSu8爢8N{C]V(^u0_,^azGז, !9yRKܹs6Ȟ$Jyߵ1$qBG\^.gqJ3b lOê8 Z/ c4m-(1W %GGG$Iz&RT8_LKi( {{x+TU,-uú bIJ\E1 *K&5e]TL4]Keے!j9L)Whaf]e/|ޝoGBN9Wo^h'$"֒,DZS7A㨼'O$WMz{bݡT4/9u5h[P${eǓ9oܹ2{QlI< EQ8X=x$8cZ8F`0x:jtRҶ=y8AE)+"K/ʭo ADYA$ 5sz  IDATS34f%[Z$օ+8׈O /o,~ nhBÌ6E*v0>ze/K*{Wpx!,n)!W~?o̰|+{K]i"B=?yzH<e֐y(sȞ,eWAAKb_W"_;':↭Y$ T<`3E=pM "4CKՄvK[9lj>MoJl-IqӍ߀@7c̾ g~(y;ep¿xqAӬnw)puapai?;a3 x!|9n^vK 6^mZ 9i!IC4kL n~!c6(t89Y?Cxmt&Y3RX!QL|/%+p(鬤l{|B>򊳓;W5뺥;HS#R%i7^GS<~CSHk6Z& W= auzDOɔlVF;E]iz(&`ob9P7!e9<'X%}סt𚶭cј$rLg ?ގ4%89BKA?+ Z%4+oo~/%9EK%i:1eqS#BZ6zUY'gְ\.J6 Az(i IfV+ft} Ϯf<|U#kz'G#TR%1MY+h4kFyF6QRFQD׷\}QXˋc!NRCJE{*ӳn;ޓ$}`#OTEOckJ:)ÄyOkW˒CϺ*zЛ%u1xX\ uFTULGL(ۖqrUIcjt4 N{)!dkz8miV Y :IEF#B%11\_1OwxI2f+#i1ί)y-d.I;ڮ;8@/X)8*Rb.rEiDѲޘ=YMaAs@ N;nh^%n3{Y2jiGS,aUѻ`xK;J0&wB-zwL7_R|3? %*3!`fb{.:  65*o+=KEbµH H?V?bXփ du-*p…k#kwrذ6Vpn>1QZe (ǹ wgC=ujӌXlpjq$8+so=cd,߼5D`rM%mOA&aw,`][Z\5DiNׇ2AHh5J@[9F<Ѵ"4DR l{"IDhoX^^"|Kj4MOՌF9Z3la:c"q`l hłZs:p2,}gG#Mԝ,K $ 0.{>zl3u"*Zc QsU42&SFY9n!<ʆH)1P)BrYݛ5ȴeMZ:GC'Ytܹ{<[Q7NOi)4-Uj j0ڎ8iӐxuSVMY+‰#bVeżjNfr]2;PkF2*=ug6A4B{RCG((TZ#D霪쨖q<#O8'2B:IW[w#^3g^"h}9+㩁{/nctaM:yY6\V;zO/׼yłi*_yWbY!/%ASd1wg|cG 94l<x[-?&s,eZ\O',k$VɘU˯{?;4 N(t(;F1Biʶ,S%9: ܆.9M8}}|4&J4CՒz1h*DEb*Wxi)"[LGAu&wG(V~ü--v,>dP,۽(VbH^D!7Z r}XkmbΡ`M߲dnHĩ %< ֹ}b\=?ZbِF8~ bKëч=!5/u;ڹ-t?4oȦvшidR[?H)Ov8<Av)n%XN fxZƆgn/@7FEʐFV;HnC4[ &1?Cl"aȕ'4պx2E+ [Bt}-ȳ*Xk~i|Mr=rIۗ|c].y)MR޶aE cPQLcaY6r i)OնtQ= i+j)+ż=Vq~%ӟU&bL'_eYӢyk( .8Цb Q{C u׆5!,k0J"MgLX%Jr1!wG?mLhqzz|8c\KM #R#VkB[К12MqmO[yR;x2hS5-ˊxd('S:ӡ#O)r&ɮuIA{FYJ]i St5 q $+!o\& ,- wS<ɰ~s Yi_Wȋ(!&j 3um!O&Û៏,ġ]q~+wޅc |wu7&Q؏(oK;<~?{Gܳ?Ϳ?PCcqpÿ/Ŷ٤L и]p\^Z:mA'g?g{4f w?ΘEUFHx(bW A&E9(CZ>t!߁|}|l qm .}c/Ǚf$>Pf;*#rin7AlXTJ)N ċj+T qm! -CD6b#? cʃ/ %m?Ica 9,)JT F 4744bT'y]oۭd_fH9" 8Go,Vt,5KKuUXy~yIv/,%M8/^( uUsq +ƔuQ@)Moy6zGCՒH((ӷ zф|2eXe ]lS^}uՒ"I ] l$̤(#EY5֡^;zczHt!#"-Ax!Cxm Q4mL]s<)8Axeqg}c.%nK!"'JcwV%zGGmߓg9 ,ѷ-wNI"kڞժj QTh1 D`CU5Lwz "`kzkJRw-MIEѠ C%@w^iNWl\7-o48oK!7sh7MF+y;|lmxʩ[<0[ ׷MGozzkq>8Oc?_)/~D)ioqbK?kc0:E"xS{=x)x>~q'FCRVU Q+&@ zӑ1Ӣ c;co?ß9ζz.gS>xsr-^dqFF9MJ3XULojALq?Yi[m@qk6!՚ł9M|Y1I n11- bbrpfMB1Әr9)JE+q(TیF#//·[& kǭc./$qBo--﹜))JyRƠo*",-phU_rڐF k#R!MK' 󆸋dR)\WY$$QS,X-KcJ rżb$RNK9)蝥^V(MXҨr5iZ$!BG,{_3$з I Z LQ1ՊQA4YF WU\ӄY,D֡E`h8Npyr0]:ɭ'L[)u&UeoX+\*i۲ $ۚPĩjR$\)cuYIHί)< )Ag`([/W__)9tB$C0b_& }~vo2maݿ;ykvσfV\Ɋ D_!m_圣 ? W/y_~O|/pu-lodw)ljO?C~|H2BҖbзGle׀L 7 SB8/^ԉ-0`H3ss^ZCk_'wl/6Rpxo{vyqwG ރ77P ty7@_?xð;A44}жuz]ULek`{@Ƣ"W>tpX6 Ms~q+Yu5>[1JE̎f, F"JfI|e[U-e(8s>2-=X %-jIV'ʇpb<|<)K:kYJDqQ.Ju ojJ Y2%RTLWc*$o qghPXOFc,n*"g][,&5wo!\$ee{F)ܻwO/Ȳ ,,÷=%AQ(wnjNVzTt.<@Ċ(0Ԥ %e%x>FZ1^[Ck$e^HeHco#KinMkX&IybQZӛXV+Q%d=wo^C?&*y)e/ZA>(Y<"zg>8ִ@{tZ(-jL#!Ws%^hێ8ôiƓH'O&>=꒺}zET$L0w8!>k빪J޼ut]G :͐b:prrp7Jh=F{G\ Nε$\T` xh'Z3H퉭"r!YZÑEMGɄnbŜ7nPp[R4 5:#Na^0)xS7-mrv댮iXkXS.,ʊ" dLoO)Q0'[5i9OTMMehDƸ`JӒrՒg},Kی"1Kۻ?UmtkxǑA"LC }ľ Zl!P76ٓ mʥkǷ{Ѩ&8d\wW'钿 NıKW?@CAu'<76,z'&鳿&I~ O_RA tLơ=MRI^:lY$2\[wMݒ_`ܽx?l{Ls IDAT6]Աk?t$)6;Ooq7'߾BNnq2P$LSkDJ 7͋ 7IG ܁GiO_{frl 5A d:~׿{5 +$=D6ȏI/y!+>Ϳco[_/|ZZ7>;,~X?cYTij~h !BW ?'C)8FEu "%54l<6 kܫi1Ck#SzcZdZLǺwl3r!nۏ]>LXL.y2T(7|x:' wOJ^afwgֽm[ M} t֔@k \G76!Z/89^b/A i6!T7/n 6!+@6$Hn[YOXy)r>wVc!$@'{cѺ~Hhڞ7W]oB)%xDi{ú _s{Mc r(C2և(T I28IE*EֲX-J!u<^"TP$ D@ t#ͺbʺ a4qhBhT, ¶LXH/9tLԁE]CW%AŨX"+z~!32.V 8y׹x{e&^*$0o#k OSv#,gSF ;yQLxZt8:v(S"d9ph$1:y vUCoQ30ZӬV^^RUEr knV+D"2N P#p]NHڀFC('qX 7Z)D ()1Zl̔AYabZm"ǩtJz=uۃI5f=p}uŤ/V,YE"ϟ_&cUƶ2#HoN<{%uP͏ MO_~?|A>agy|vB&UӳDۿ\3/$>M斶mil2(xy0?.xq妣Z4 7l1G"/Rm[bL&W_)Rr6m\R\].\(J)mS-Ę0 v! "%Jkt! $YP#>{<7hh[LUuL(*Ӳ-.F,) @Y6TY4-Nj#G\,Պj3L[P+yh>#h9^_r$>2oV!bۖG =7:ed-#ON! L^4k['yJDb%9G9YnR\u+F86؁E,f37%n"yGf :'x?N{+^$а{ ;ްKz(1_V&~E,&[S, PfO"Hi4Аc H@):/I a֒9ZwOG?_y?H [\N A(oi@~|s7?xO"< CF%52=nwS"o\_[m!yM7?x]ʥ 캧RB*IVZ.TBb?Tم=uqJ&˜NRH~%ޒ#Fz $R9b04%5Zi VtΥ~Dr!ly ` u&A,u۱c08B"TB4i1Y6BS =2: (JV[deLdQ"aԴH d`bd:^`{rd:=Y01\ 79)L6hU $$3^xs-4m3prrިٶ-yfLs#5ȩ:RYV>8,w#2h"rn]Bl73ȫkmBr:? eQΘM!Q;">b0Xddɤb{dlKYVvke12-sx@e&ԫi^,zBH&!x1 AQ ֱt4@5bc -Ri9r|AeC:(KV͂?|FrziqmGx/Mk?+}6K: .X+==2Kcmߡ^QΧL EzM$1bn0p B@Aٓg\\^c~G?@e9/܀7a՚,˰"-hO$2:i,K.SځoZ2 YKSXK4҄ٶ5kyr| BS\.}| =~ƫeMPeӦE0xQۦb;5ɣ7(yk6ԛbtAh\^ݢʌ̐lttA2{rI_mu/y'59^*fJqoSl^k4;t{.G^^? ?rn 2^,;Z9r>h"xT)䆾kIueƣAno~/U$N|)Z%6D)({lD? egtp(s+| jHA}+ɚh{" 4(؜f<2ʽCsh ͺ i#߅X"]׳6uG?8@kR 4ĘD!H!-WxMFɴNCkMUUX7P9v Cn̊ C簽EU9Eqg>RV.t<{("QYN7*Gh0R{pߤ 3a3;L&MMFHa`1SzK-A82e[a69珞yEGylfUӴ-m + =$:ں:BZ"$(BB(r!6R%0eF gg)h^] =G 8?>FA&$֚>}]YB@@@jPrK$ "@O@ W3u%9<#%BDh%Dfsl6 hz)GTezbwYւ"/Yq{yd;h!q}MgL%̪?Apvv =?|GD%JTdsCO(*?ݮQQ1=#dxZ ]|FGΧ MǏ`aۚW9}ުgslB} OV%3U''qqu\YojMͦfzt%G.SLQZXm7gWs?eyE=cIq" sE!cRd4u81Jb;ގ?~l]2!Ad97^(#h"Vx!nk#8{~)we\8Sj H!HC)k.# $S}%%r<^P;MP nbVoXweڻ3x+5%Nղb7~=O~W7?O J}U;c!ywbuq(~йIIB\5VB| ?ݥpa%9xE?S|g~op~A?F?ۋtM qmη~dyNP\޶*"WO3&~G T47:5{ٝ|ܑNV W%D:FAWp= =8wy ޭ{v`OQB표]:vOq|3H{n .o]oꂄcBYc4ᆞd)w,1[oFqOLV1=R(&)PyԸX3ʒK%R}I5Y 1wb=9) Hqd#%6:ɄiUq4S%Ea!UiϙM&(#XS^]]4ܳ8"Ȉ0?!`61xO3 }dZRVE~wѳnRiCr|2AlwdFctҤƍQs\MKgfI1i/L(3J#)MF)vH^]BC-(s\} [T&JJ<(MHMxF$HahAж=u@2=zBp~z̳3ӭxױ^-h!RV\].Y-Wg>-)3ɤ9Ψ 9YYg+]Vࢤl2#d?t""тz6u<{|$7biB\,|1Y7֓WS XojDGMZn̎yBђ|dZePw\\#e2\\n4>bA7ĚZd7 1 ("][ |^_/NN>|,V9{).X6%U'خ#/s^_]ur:s}N2c9xnfLٔLt;RU_\rqy X/^04gS)M?'.pQw{/_p:2Sx(Ï8{rQLYCIuRM[L|VQ89?vMg<^]r~:r~ʫ y䔮myg^4~rX&3.^"chb2l6aZf("ZHɊ88p9DF𢡄]"%#}G8S;#׏g"~D=\Rm(}_ntS.>8`u{A 'G 65|( ]vLkv@ dRb WKl?~l>z>%O'vPw~m˧/^,GOw ׷[Ξ>Ff͚g秼{O?! | U9Y! uM&"?=e:q|/^_3T)o65E? .2;sZ2 ;iE){錉֜uC(ÀӲ@#p]VVRP9ͶF)IUM6PT%M7i:稢`ݴ'˶@)7aBy2Q>4(iz 8sfC(rMiR3U['ǬO bʓ./'g'd2h"lM;%EfpmC5)9eJ;7vh1l[rL)h!Y-i |дRG[\ے)MU& Qjzmd$E}{noB:;F#:}O.&Þ D"&X$ yFJaH%FI24d#O2(4jgJN$dJiFMnVZ[FRf)F J1=>`h^CKJ)df|\IY\|r3C"M87 JI2cpe4*{!T^D#/5y_w~:Gi7>oxoڊ7Zw6oUcŗ˵.-E&Q7N^w=<@{xGcP0h\Fz} =Y$ZPkDv'-d+5NQ"6wbR&ܰw4c;{ޞuy^vO}>b],uݱ[=B@02alR7) Tx>AOz IV*9>hdMn#+ך~ *jCS¥RdS]^*]YtR}1ZzGo` A`;zNA!>Ǔ9l$FV3hВ9蓆GeAk:7a nkq31{XgD0`{R|йd2JC Z;c@d{ J )B 2n:9l2#WRgdBpv|B[8#'!3897 -dx8:>b~</4GB@˶0PDvD1XK۶B4MG״8U9YŤ(IYɜM 8;5LJ*h{TU\\39BU!=L˔ R,yuMvɴ`>p4OT{ol=wCb:'//n8Mo{,+G |,+2-ٮWd&#J7놋ۚUa@Z%NJcd:;7|kD\S6u`V8R>1xb|fٯ* U Uѷ-enl65AyFj9ٜׯ8=Mq5ۦdOaG^\.W 姾M z@bJ"fd:?f٠65ON($8K$g]r|ttR SE^m޶̦SD*j{t0X̧3^_"{GpB)r1 e2 }AQmJ|]RAꣷ! }0N+w%CjRH6l9:e۲{h>Pr1c&̌4#96 B PЫFSV%R\`R3iFF& l,>{gZ?=t=Y,K?3FaLjvrIP( {O-d:VƆ$LK2)2En E25D2ZǗ 2?.!՝4cjYm:cV}Xb(EQH2rr4AÏ|K.oWt>nz" 6MMuܬ71EAo7 AtcC^"8 FC LACKI۵8v84W1936En6mҧn^M#z^ѻ@V4M4\%(3/"܀R-DO9)Fb2lV 'E6:V='-E2f0MީtwfI“eɌIV AA90N1EFV%hc B!kWea۵{v,;RxNFSN*a.f}בkMs0Ba0̧xOnج7 c"zJi[^q45R&)'|џγ'|7=خ u;"N͉HrKѼbmOa4eO Uyݧ$z>_ޓg<M-''62˙j2AiŶ)LL$|g÷!??>n}d2)ɲ+!f J)ʢB h8hlڞm߳;jfeQ٬C^0Z f)nR(Z;PfG'.fHJFDpwaɖ]"8A4R:9&IpH͑iU>{Bw瓋=!'j!p@RD"-BcDj5!8Th1-"bbSMQۃnˏ~wԌH'MmW+b]+Euqyb;Hnj 4}PR~U% Ł=!#~8V{NB4>ǡV$JOA.e)Od3=Z|F&}]gf&%>gϘLK^zlqg}xG̪ VB-jʣ g-B80]jI&us4lM釀rv DOV|1e}۲ljzᨪFi2#ʘhRkO)tdCɄ"X7-* G bDR,q:B i[h{{sy I@vXf!*0g=.^=ѓ~1cL {OX^`pi9 C劾T8ٮ'H *YҸaKমiD&|wdJcEgo): Md2-Mrȋ͆&DM3zRo[?dݲ8Yu(-1Քg9YQ68]O8T3?:: J#%sH)hBk\f`yi5ٓg A{ %wCcS{MOFX|D܈:B)aXC&T^KyILz}1&R$ʱڽ(HM"P{fRu/58zϯЌb/D>Ym)ءCZI ~gB(7IֻbԊ{;|sXY?DNv;fmnY!_8(9KpIe#Dizf[D!vR2r]BuF.%AS BaC5,3 eZMK\;piBB[lַTUе Öj:ARPh!0YNu,>xc./_'ʲdi(˒[f$+d[Ry&eŤ*bb54!9MM7.~)YeVu h]tmd6aِh̾phJv"Hfo=dyA%kH6inBp4m{lBHQ0B`r4weQɑ+ }nn$&c&c]d\,l]'mgoL%+%C $k[z먪"} <ψZ"`隍x b2 hrcdr!(sUFGqr<_}AUNYΙϳӣ?q/OϱC˴P8\?M6HU?µ-(T`S ޱ/>|`^۾& E.j+2 IDATKi6YY!Y1 Er޶. cznt`c`n|b3M29&JH!g5=1lޱݬq|>_9-QP^e=)B=͉ oo/7ůW975 }hc|gP~1]n̎&ښF,$RhvH.ELҀ)&M%meNffءZ4E~@hڞxHW5. 3ݮx茓 ΦsP׷|OXoV0[F AeLkn@e0@9ƍ >ph_$5/ׯvwT_TpEAElIcYXĞ ePKHae$ g1XqQPEoN~d~kO*0`J[w^ͷֿyCzh&D@ذB:m#|oEьm27k ^@^^)J+x,j1YSt2J213,O&o"D=oEU?W^;C$?syuz!֚ٔzb68 P;I דL8"h4Zloh$f6+(gO1@9凈4aYд)$Y ZEaPAc|=4^˺ 9|t킴0hgyTMq,(G 0=vd2a黎VT(ے,K2y8q1v!%JW(6ۊb<%IA;ŝTe;ٟTx1{ey5/Gs=zYo]>nonyٽm?- b&D߼ھ >7$JnN F鍆bo~8vCɼ^`&@?!jGr훎7G۹д ·OX= 1BFa`\'phLߓ)IPB,c2oKlHK.&ȯu3aRƚt'3TQ%ZKuENemqX,0g<*sv~g, ".e|2fYn)TMr~yIe(Њ M;M] )TU\\.q(f#V""$&/Rtd(qDQtcyۖ:"MrWh)MO轧H$y:4JH>ÙrҒ-C fCW5?8Mj˶jH$E/Cu\_/0xW 5}o;wL FDR& ipXa6{U "Pok)Mr}`ukP˫KUM1GO\o'clKھ uizt{jLl-_{țG JYڎQQDx!Qu WmB陌rmsRJMٝ9ζhaId:7Lg#%;rmk|s2ӕ[>8c:Dq\#EFYL'lڎ ] c[qi{>Opvz UES /TBL7=ֹ!ӐӴ0oMJ8AM|s'C6$H,9OSh|zFJt2BV?9 fd\P5%5RKHq20MS6Ӝ(NhZzS Z9J%iN[8QQL/yu*|24D@FqD]Uhfd̺y90jWc]lQb~tL6Hnb|gg-dFӴJE6 2.rMqڒ bBcq!cses,ϮPq0Q'd<QW5ZE4MGUx!G!aG4#Bz{c WK5 =lrݠd}y"{ '`Qcn7 {c'dj[JNܗM]NJǪ "9\>$BcUX5 Jo q V2 M`TU{i xq/2n# @k"ݥ%-}E KC3|x.Q 9,B0ùSq͕i}_{l[Nwܧ zGm\O_S@m!DH찺7qRӹ؇wia"~Aw$>@NkDz~E#CYn#Ql=o '#e:%. F4ab1="ا?EMGVW$Q:x#´ Y eਬ\ctA#pJ5^H\oJ6MOۇl,n<||}(48 [6^"0Yc_1=zoZ-KT9CoZFEBUoX,fTR{K;+4m!ZW sJj֐h8ϨUWa0UK$H$:B#\0*F8ysTD-Z@o RGMh2)dYB4mOk6p\3H"*N9( K& 톲th8KjG6UM'XJ&1}"g6[o:CEH$8BSk̠}(Rt]GYtҴTD ߻˲x3t1.,kwݣj0UO3k;HS#zk)8)#$eZSm䄋NF0M3"Ltm00!B k{7/|DّuԮrߐ"=Zl(w 5mGP|6$9 Ah@nTn؇ F3r(vi1uݛ 6kw wpr<_֟_vxfyO{0{ɍ+ԋ}oޮ`iBFxC M ~ߜHen ́#p`@o7R`ÿ h'FAxAB'8cPaewkuxc~wsz{:VB3=E ֝ ^aE@oC"Mc U^+v nK{hb~Gs/A߻RAeEfOߛ=,-bT"E۷\/t NǷZh(B-i$ r(Ҝ2N麎8E8''¦#Xc\Gg$IP"xH؁sD^۞,Mn,&S "H%2!Q!K^dz=|6Fzh:lvJ[u=>:hx]9%Ib%)J.+uܽsxD\֬ʒfXk)F: G1lw6aLo<;/<^p.qԌuoX-`M9ὓ$)Y-,[>x?HQF]SS' 1& {I$"I#ںa.1c^&)qbyф)8kjbc?q:YK;P:g*|ΈnG1I]xDkmЙଟMFI/MwYWiNdx!轣o;lg( f߶i&Dm.rJq1]R2kz$, C{H !iڞ8Nu5އ˔M(Guh=Hn3b2fY1* fs)Zٽ|X58!V*iMl:a)y~}E>*diD%)N_&Rzk ?`HsUZPs6[:svtD_خGq-y R r~L4MI+-hՂL.7 -^ipH>&p_$>s="Rr>̡g@ A4xJvZ(P00w~ dkqֆ-w"`FS2vTj[9o"?g4Bؐ MC{Ya%$#;~3lFnBtN5F|Ѯ{|?~?ok_Iϻ}҇4ŭa2mMgwx!xP0!^ o}/и%{ lؐ"_i~K_/S2OX\yy/⶜ !H&g|^;M׃xvWH=aru>4 R1icJDb2d$UK6}J#jӂ4}C6q|6!,g\o1~0E'uCbIN8k+Jd>GK֠tvL4${NgQ IDAT5 . qIԊXjr5tJYmX)48 ŦnjIDQL(ҶgmmZUۆMYd]Sͦ\Z.Y%=$ISD6+d{.ՊŢrAYwV=()xlI|fZGkёdYw;oźBȘdt6jA]tmo%;zk(Eģ )8Fz3=~h./8'ׂ hʚ,J 4A:O)imDQ!wfG|W;|b㪮QBEa'X)(QIdHi3+2 (&) d@v(Vu`T{Gu͝;g4ME@Ɉ3<~vkBab"E] ܍P+E4 ڶ%I~4K#%cfiS,%I6LmO (Q(uZΦnDIwP 5$I;6/ZF #"IFcjZv=yN R+ HŇ@|d eU yQsh#1╤l ]o9) wu8Bhe!jUkM۶W-Y>!Y,Vi%!{&h/N0#5ɃF }^LJ yI!n_n\8voC174MC`V$;0rgv͕b lt >E:HXomR[rXG x7?n<;\Y*:97#xom~d?^_Ƿh)G3EF,@ńiukB1M|Ocx|6a'76hlB*\a䭗^3o;I xvtx}Oko|k|:Y\3y<)ttơ,He{D~gyJYNG 瘮˛O{|gُ[>Any}6Z4r7+Ci<e?m*߽pp]oօ` 0c=։x89Oi:uS tyH!Π =YEkrb[xh:$eSהubŇQ[˶i)Mu[Xn1489#%=|H QQ$N2ʲ v6 i!MPu5:JXo{"u=ƁQ3Ώgqha:S^Gc{,׌nil#פivUY.ZWW{\_h[ 0 t#DLRFx1YFrC^LL&l+~uݰ;t<"ͧq-'#kÝxѓ!=wԮn ǣx<4NۖG3FfF =㕣ykX㹼˼H~wp2')=;-K^9q:yxz(/$IH<>?dV;lzӆF#qKvRTna)Vӂ, /b<˫%Ury%qє ykJq|2`ʒD 4]Ϻ,q2t7z(AJA5a|mV*Hk E1;h;'l%u3ijIނsϏ6L$kȅRXi2ƑX4#uXkiQQ.8g!$ %%dRxiJ׵$q|F۶8Ho͆lʦa5]4M0s64tMf"rO|@*w]h@iF-(l} RΠ%U> ʦ6=q t-KEA]X(^UU#8Xok,k'+(߬!pބl`A"D93n07i7\ Ϟ#uϧLOr"*>v||SN<`}¹Ɲw}F7l{?}o] yA;,?O?jVnC& ;|l<v]ގZU 2aۆ {xAJ9J}YA!|Mi4FRi ^{ -<=g[w#pTp$dPeYzfSk1<',7k:o)| ՖUp~+W 'x ig r3xe&ɝ{I]X/(ˆ uȳjMc (E;'x5/5 b%ס4Uzdq$,WkbFi{Wq'M24q\PWc D,Ƙ.*YKA8$(&s"$jƢ(D,G\^7U|>&1Ϟ_i{TYN;g{bZD:Bkm=J0)-$R@CRU uCP5cd1q鼥[zAbSIst4( ,ziLQqLtA)#Jؾ%{(ؖ  NN1'Jb?e۴TX阌Ɯl+%R)$AIt!JRw!L/4yጡmFy +YYLѽ>C$NY.Viv=\^pgM&Wפ9?ט1\]\;rӰl/~i^p~qӫ+dV"1 qt$$#3tuLc8$" !+L#n[6mMTAl۞5L{''\="nJyVRX,x01OY\_AhfM/#ސՑDy"$T}H\-s8%Magv_^4U|vz"%I*j 4}|ʶAFP` B M9gGruEk (D{#p32"Th6|+>kb[& {(ψ&M"gBNx6 4KXV8kilǢܲijӏg#QLb&ńŪ;QjE9۶{Ϧ.9OJj5QAUوVvMDo(F]KEYmr<:HpMCx2ʪd:u'xiFmcyţ>}/CH :nwšn{.bK[q'[ 5l)3{0ER!IyVrX3"U0|/g Khox)! 'B&p`ҝ0 =u <ćdh_]va8~QZR~7oRۜ/]}tvѵ mo>q^m?~_EOǿqK5DC%UOSOx"j«g|h54Bؾolaݘ<׼~|!%{жh{ )o_gՆmڭؿ'&p$lBC&!7G 47Ŀ$}ȫ;xaŽhnւEK{ RJA?A!L(@%v?a#c_Suɦ xo5=xbdsy`ݶ)y%Ttig>͙F#cQQ1aZ!eOY$I5# H✣+,@4Gg'>bqŦ0g<Sn7!m>#&/D2cX"fzt'O%J{rh%E2BUfXriMw#= +-)*rZqjɶli|u|LȴtZ#`TMCW@P|`N坋kQr"0\_nY7'_+Mӯz X$Қd4M"߃NNiղb]Qn-t975yZzuvьTTt;wf(l6LF3.'g4]In2f]d41ƛ~\lq*iK׌3vxgGGDJrq~N9Zw5 G3G)")fm9}iˊq|S-z9]7ȕ$r< ODyT2;6 @ H8M aKH!4S(є K&,7 r˺y~~k20rޝdDS֠dR&W1M٠tDB>um0~{%Xmj-X*ш28I| 4Ut<㐱`'G3^qq$N Bac\3j cjӄޠ#B%)-zӁzJEe,7krc}h:v`=UU!+4&I,͸X.)8GI>BOb>a0튪iʒF\[WxUINNl"KX.7|\?fvr7$Q޲YPȇfq`YDPyUmoq2?l yqΠ} h@ n;,C{jx, dz0B@9{3mvC)HdRX+&=^Hs}sB6#p-D^Zq*?>G] |I3p )(y+L8`/^ Q{.3_i> ?N#s|G _`>p֡7w)_,_nýwi/H=r/ ֿq|Kߡ7{嗐~쥗.PӔU(d8oCy~1]~ZF*{? wMc<"}}{o{+Tt'5{ R /G%vM'o57݃L[ zn޿v[ wqDvgB$78pMR 4tZ>a>rt??iPBpG< ,ڦd4cPL'IoΓIg9r1U)n%JƴՆ<ٳs76KQAZ`[7GO],mcBzHqzO>j9;度a]OָfMOc4$MO5l6uQ҄mq}dZjB%  :=cfc[¶.BZh4e^aM1+Ҥ@(,IypUUry񜳳SNgKXRP)ziMOIdذm%J)Quň]?|syzU3$9r˦LOlI4eXm*/x%ǫ"@8vOϱ2ir*0O)8䘫D?Al6|J+$ԶVp KCfZۖIx:ھٔWSڮ"Ȓ\Gݶ*A~iRڧ^e%E)o冿$IP Ir]n{X[6_ݞΩ*Ǝb_B 9b%Y &!#P+ $$@LB)$npb߮n׾9U68%콚oy~ ǼXoٶ <[ҵ-RKҼķ eF4$ iĨhd~bi bv2Ut֣e$gZOT1 f,ypy M,i=ttEzI[L0}''펃$,uP#x~vsLJdZoŃ`L%٠q?Xm+6B*Øݾf>bZsQg-y`%A1O[>@k"x>])5~_\BPvQ s/n⪇[RPw^a R$!P.4b7wyy>HLǮjMei9F ziHJ`Ai *$RUXchbRk4Bڮ+wHCxT}ژ]L&uC")<˜rue>W5L3,'Irvg6!M4mGi닳H4gs6$c>Dd<p; IDAT%iBƳ YYkBY?D`udx\3-l.x|rB>*2%w=I6⋳ t0 FdH6K O8P4m/L Iٮ7|Dt,2*oo8L=E &%E\p:QoA9A8焾't=Ϟ=ji ;GƧ_cMU[^\Q|OHD¦xWK~U//ϘMUs\pݣ"pBv`e b!MW,5'YL MM&MJ27xS $`XVEՎѺy}F]x6nL&HhژieXXVGmxд}c=:!LShr1{Sf!fRAp QSGԍ{bH=447179򯿷Cxy9@7QփF5`NЀ0 )7p+j6[iewO!1?%Bx'F'Kc6ֿ=~$p[rH6.^EB^h#SRaWm@qٯ~;/GI! dloS~OG-I9|Iwۀ~{y֟eDӼenB|& -?}_KjLFTgv>}AYp Uzidft4uK$'hВ݋?7ނiiwt1ڂ9ȍp :r!VMk_Mw7.ю0D-݀]_!nk ŒEv8TRhێ<`P XgTScs?R{Z{$c^tIӌ 'y/[غi9y^B I"cۓ$)'G( u ƑԬ6 NN}з==ɘH[?2K6T葦IʇI.#^W,VƇGo qt8# 1Lgu4E$ W5YQ .v,ũ]#]Js0^[nhbo4վ&jEIJ" Ρi:FdFw=Kf)!?z3l\\/yY/^T+=8b#K5+P:6 T<~`U i zy/.$Yxy|XnL ڑ& ;rjOYA325#e-V$5^s0J9My“h/7h=eYPvYT 1Ds\zOqγkqv A*<1I%PHP"ͤt0A`0]3x4R7At$RBGLdNn2VC$@xb0194T2ʄ c ȝ/o"H2dBpOnIo6)o侮־!m7ѻ7@u6A7~۰<_/{Jn|%=g[ſ~_z:ђ%gGo[w~_:{wyc9?b/[7_y/;w9vffs#bYO'|pRܓ<ݼ8%_<_sş=NƁk^r/~üⳗOsW?F1/;Vk~{N=OY^~cp "w:8}*x߈؄xXkAJd(h{qhWx1V;ֻ/_׼<`8B1L}Rqm>U1bX,PZcLGS7 Y6\o7$Ax5:z_rA-(hsDӇ\_]Rf%tLg3taȋ$Ki;˦iYm+d# @/$y!͆}1gNOΒ)+4Uz厲:HL&ct[6;/.I"`_9>>b6RKD3I4eSU}Gk,.. J#hzP\.v똠6OTUKg!8>:[IaGHMY1r4foz.k] DHZ&y I$0lV >/{V-yVR`]Oxd:f<A)`Znqe6͘3zQQ2)r|2- LېH[?9"_3ȲEyc ̏YW;~,!2 ٜmRd7Kfᙝ!ugX5 |jɲiu;]ze6dEAY!]}gmHKDxzI Q$NHmk >jA GGZrڒd 8g20CI͖(Xmg $B% D\Ge]G⥳<k Tyq4QxѸp>gꄪ]GO^\ GOԌ J0)f_(VjJ3TWt]G$LF9}WtQ#}/m 3-SG̊AV(˜r3TR)K{%+J.֍$/(EG#O5ݖ,KBsZvuM9L#g)˂4Iе R@]o&Xw) Iã#|t3?8ׯ;{CX xqk֠Ҝ¹l4f2qqqAd!]pxt 7 mbdB781p`X)%!H)ahBY=JȲ8on n"oªrc36ܝ=`^1BHRQfMV/n^7[!H}wo1!GBY_[$P\+D ɊD$* #~gB!ҶwgqwR#%ͮ5l =}Sa=ŅI ".F1}ۃU{3`'-!;M dU6J Zi7zHHuN6xRbA(!8Ѵ5]'G`]qVk MCY*DxieZ̲0D/7[*;ZkEւdjaW7leRLG& zG壆ߛCp6A#f?'4m}gJ}OeJe79YL8fG4YaS2q{U)=cpig(8Vf R*6/WL#궥+QmGmS] v}GG9k/TQ"ik-")Ɍ+ONe^Y3G^yz RA5"?x[my#__/x_wJ٧? b1DS׆ S oz1*m=ylTK쳗Cro[Fenb{yD'}Y<:8C&5o}M֋5Zv-?a2;8`^s"eBLGW7 OlrqIs=tOEޑnw 3& w0){~N(}>{7O b(1OyS4}۪#1>.YmvȂIҵ(jV *}|lB@jM?#65X'giFhYnw@i k Ec KlJ*1ZM&4z3Li_%Mh.]u4Zݬx,%Qq01 MaC'9}gquyv524VUSst|VcZy1LJ@QXlRMYЉzcْ$k tŭD]amܲ&Uoh;dT0=MQ` 8c6s& _ͰB*IGJEƱV!Ʒm#MI$*ڎ\/6l1r6tͭ,nƸvC DI(hѩ&I"6MS$!R,!I5I6DjZn5% Q*A)ވrH2ESԸ`oŽۯz+Bu[7{ 1dB6Ob`ikZK>:v#Ri% {>!Zi$ X30qtKP6.徸kIyr"kEeQ&;rKu$u󂿋&naR2ýx]Z^0*Ea/ϮW\]lTUC0D%)IƏ:ccӤ$κ"Cit1QR.rvھ'HAwYF$:T%MENYD`[(Ȳ4dyB)f)}o8;{4IikK"#/JBl7;sLʂzGkIt\/WLS54$d1IFfujxv-q4{Kbh/󜓣jGg4ΰjV@5t}]G,Þ,KPԶ2ӀTFyF'cqRs|~b#FwuKiON9X7REB,6}PiMeER#-8`Z$q&V rblTҴ=)A A!5KRV5e1XzaTh(Jurg^l;ίpf:n}SnYvD"J)7Ml>&xu~20Sf))yOʧ?g_g4h8><=ݖO^j_Mơ\՚vKppx ',w }!x%$) 9[۞) 8/;CkXcgcư:, ziq˫ӒsJŸd槟|fVe0.ƴm'AԬv[嗢|N7yFYY..9I)ϑ2g2!/rg(.9q1-JRMV*IYY.a^1(xprB]=;Lh{ o-NHӔdd:z ļSFUa<#%OJݖlJvc=ePf]0Ng=băic Yp|x˫k-]Hw%">ꦥIQ#I>xT'D5mPN&|5͞T X6ŚዳK1E'8dZ0A@)2/pA:\nltқ!AP)BjNbz c>zyyY.6-dl,w5UeHIo쫆Fж0 GZ"xӳ^.Pf)IIgLܞ{A#ͭĸLc%TC>ѳ[4g6?`21.K5dJq|t̫sDW3\Q7Lvźn*ǟ1rx0z)x(&S4i}<e°lG*EQbc V`c*\"`X:e61*3DyCgw{?yhrH2\9N5l k^_XtٌnþkN$l*KHI9z.ik z߱ }筵-IɕS\rIP |ά,N&HZy<IYTXβwoYoVHh<=]ߡ0ayD"S;0 IDATFN54:1B&:J;|@ZJھp%%O%J s$*%OSzc҆Px,0Noh[Kg]LgPdRt۸v Sf9ĺ&ZbϺ2-KdRq0ihږm3`8kʜt<?`4n=wۚXO,Wmvwj E M4YƘU㲤2%iӔx)W&s1Ɉɨm+{y|r5Tkx$UchC(5LGiNY4!Պ˫ 99ƶYo+NO[ 0}3Dq2.sf2NALqxtHe,k<0FÛK3Cdv{UC4EbwM"C&JဨHSVHܐh)īh(t4 byRP,ŝHۆCHumaӁ(HAi!J-^<(#DݜW 0~˄KQF6̌nJ!u&7r ?v-v^w;zI?94 7Mgb#to@*JD>޺I'A>DmQ)M$^o8Jn SI C"y|1X:Ba{C'Yx4:Ck}CYNAPuug-͞ŒQITuJOvmq~K^Zk<łն-AHcL4"]}|)x2njPK j66Fˌ@βdԚr5>Jî gR*Ʋ\Fhu1<&I5EQ2J5>#I0O)ˌTE{RUtC$7Z"#V gz2@A;;0*:%Hdc-N8 TmKdH)ږs}}Lv]O%mӑjMv$:!U( a/?g]11]^SNsq[@KV14udxm:KS#'4Dؔ"Jas8|ikjBä((H ɴfl:R: J"i|Jp.F)h4;hM]WTU`J&ZFyFY>&kPI )h,!@W7\\_sy/XmY"iI  9Hrn-7ۅ0ܱ8ĝd0y'AB{3| ~K𵻲HnL>}h'oG[Ⲅ oi WNnnoۙ!Vެ[kbV@ nѺWBUx:?SZOWl _oG[K%.;f o|)u|o2-u|Y B4֛5ՆzՂ5ņbQU mEϯX,^rp~}r~/_W:媢iƀ!FP3F "ʟ4di1=BBj i$|\D9i0H%ta~t1nHtngZg<e>1NyMޡ&I3zqP|>%uݲlP2B5r G+E .=:ѨT10J\pZv=mgY<8=e}lRtF[x}LU-i^_9G<`]5T]LbbPS(`<6t1kha/$E{z2%{ htM 2ʹypxmU闯A+)y(GTƒcd:XYp ORFE:Vkr:Cc^Xm{br!,'׊'`ϧx1e%)g'3vUՒvx6cZƙ$OU8&)$L誚"DT؏,&}_Cyv(8?ћ8vHbz/IbƁ|e]p8P9 MR5 a!pġKE3dʲףvMęNY} NE\ovuGt{kTS{5>YXx+j|a}N[Aܛh '@{7uMSY$NcplLu qOʌ/?dQ\۱tp޾PZoqw weevZn0u#gj@HA|qqEQ!Dg%SݵaPh hG%1݀C!JH!T@o3z"?1' DiD>͈'a09K GOXeUDap(+^ʜ4mv"MUb&Ic(aobfSA~`Dۭ>;RP`_wM n+֕7$Yz%Ls%H3CDM"Pjꦡa$#(d6F 2jG5hfZf =%A 7ʾki!,Ekq.DGAI"XNsQ`U7M SUMY1]qv #C?R5N&)c麞 0Bqv2Gy܁đ%9Cߡ# $9zBtڂ lK/;rɒ4'FcWtm 4enW2$6 G(y,rG' %˒>{~f> ch~C #qQ BPN9CUcڗX*v͎~Ϻ.8TyrpzdY18M7ha`yz߷"ȋ0{޷E<~'?W^|,<=_E!X߼lyJU5|@;pj=5!LS4ōYƛp$IxhgSIrRw#!BF=lX(?u ԑTH#_a@۵I0mz߀ٔ<5ÐC( ]C(!'0c\5q! 2aÐ0 jGSL h8c?pqvJյlJ?1[,shA(K-ϟ>tJUVwj{]u)zA*r6+8ui1/ n6{OHbZЛFkC;Qkʦd>%VZKdqJ)ڶePU5cɂ Og@t899hg(u܊*#!HIrqw➀AzX݉L}~GulnMma\_Ih{89F:HGvcmϛ|Mnj>'8bw; VuL>&=On>E/0w@,B5`2 }CilDp/O~^{p.`'>Rr27-hP;*EgJF~8#dTK^*q:*{σP*$ M1w?<3¡E(@ b0=2䳜b$5ONH/:_愑G IR9AEM[E톧?>:0 Yl|ƨ5 y Y^þ# ޼^ssuC//5M1~4^^Zgiql_?! vMDIƛo^~ӧky?K^sqyIo-?˟o$r4S pꊮۻm5E$!u,KItn톏><lh&s -lԃ-5'DA@&|Opfk~זn8Ն<ͱ]0sDQ@|GE PaOv SsGӸpxUGsoL($M:=28 Q848bOVoAf^IڐFDQ)#sV)qs6I-k d"ږ7_5T*K(8$#6q6 ҟC?X,hf 4*pdkC@ ┛톶8=;#"eE; Nػ4Ŝ@JJI?4%cr){uFN9MSXHix{E;j"EF!Ӣ`Z&&>Uy(R-`Q8W;>y}m&Yд'' 4%3 %X,QHyؓDVkUU Yg $^yGU6yUJaAkfQOq& *7w\Įxeoxu#f<8⃍6C|/1:D>4!kxηe>lQ< q{_qĽvqw[;xx@A?n&n˞7>qGr&տ=x}_xppR|Yg ?G!GJ R5)!3c ?TRw|9".og:F=F@&9"l $Xn:IUMY֞E(!.麞0 I8RE}ba>pyy|>o(zԲP^(oj"tٙyG ("=fk AfgR,'tu4),Ow;Лs6(,3|9GuÓOۆ'95XzzqW->yW/JWnnTwu1[̼4 ҏ*(oְgs_> }Ւ˓GOs]cmUCw@!ɄK-8Xk֜rfYz4-d)))q\6ZsrqI>e8$Uā;>~vAUnSXf'3INFeZkB(7{S@p9y=F| dwTM06z}MGެ73fgQkC3I) V!4Uy`4AR=h)ѓ(893dQ| {ⴡ|+ƺ'/Xo*uG3t]Ac{P7W 햮Of$ooe6b4#g'';nV+P55q I ]U.m`*AqH)a0Ǐ/Ƒ0Mƞ NS5]Obh{4G)a1vG޸BK'`t0K; g3ơ#Q䱴~`q~ʻՆ) aз"+^gMRI(jG; )EkII‡ȢbAt UY€jѣE ꚶ^ƑtBX:AHVDQ%d»ՊfXCO1R)"/KRnq2L'i#8p$mwI>P*Ů 0E19톳iγqlX,H2Z4lij~E~$1@*Nwq$bSV7Σ#>g IDAT'B;m;g>ey'`{~ݦñqw>>:{,D/mJ{kGw'`Qi47+#CFcz~V::ʝ͉NIU x y0e&?' >^(ve`x} q=x,@Șӳ to!>؎|@+{ulF`W|D;{vvrFŜNr[:}>uVKqgRa[cXh5gz^JITz8/սq֣=XkRz1,: J$%JF~$  /ysjb9g!a(}XmJIl^panEHA((!EKE_~͊]Unb!]߱٭=ݲY$YOsy@l%IJw? fZTb# ÐtdY} >Dځ4(~kz=rk9YCT6 o0B  '3qkzđ("KzB(G% Ǔs$!vu/Pk +iKH}'#$}KյYo: IGo13tW8ɣ3ӐiFT)Q2!g_? ]GL'MעmP,C3lj832Ǝ8דeD8H@3+($`{4 ( R1 9sG<{tA>$/fV;Ns~MŒuURYMhn5Weh$md 9VWoQ8| *6,G\/a1o?}BӶa.# gO..x|,w|db8#r~݆ Ld:gl1DRp:p^\.,Sv8;;C8vH<}:ԓ4}hRZjj_pi3ۮ]-(b^b=Mk>0=m!$ zi DaH Th^?G@( 74Q/›G(B#I(@4MG^$$z$L",m;dN0 ȳH$e) ɢGڧHi);_њ0 AB IA; Xzm躎sT IőEF&]50rQǜ(NA ehcUfW1IDix@o2/PeUDio&G*/V/QY]|Λo^2sfE3~z!= AtdEGȃ+RyL{K,㋐c䎁dDݦpv(kz?}mGoSZ)vׯa޳hG!v,B{V@Po<0q[n`FFmN ep]q=uO~z؃A> =-=H8Keª ȝo%X'>He9ޓSɢ8qo/Z'o5?z_KEYv7' Df:fEX0Èpw:( U$AFkMy# A[ǡ1~0%Q^C1a%tphj$C1VHPdJRXHll1C邲 jT 8;;7o^cf .&"d9a2tޜ t}Gsĸ8z%$z,<"-U b9PS55_%Pm[%gggt]ncޑbӧϿK$Y1Yq~ &> `:)}5}0= |R&Sǂ@ 8"}K׎ToG)1\_o|bBMQS5\BZXΦ<rNJ xq:ZF %M"(D!x0jP1 1vp(F) * Y,$Y^4-}?E!E2 (zq}m}۱^m)' e-kIU@)7?sϸئ/^27W.W__3V/y^]:{RDa˦THҜw-͖wW\-)g<aFɄYzۮuo}4x/>zt38MwtCfŠ ar點+~DIBe,gy3Nf_ʀ-I3sfI4Jl“Ǘ$qW_鑯_D$AXCeWO[!+(!^ :,o* >E<ɱ@7kn|]"B$ AP5k ey H2o<1IiA Zn'0i[Y+s4gg'lG աH!f $o4 Ya5]? ]հL&o]$cv'd#rYt2D8쪚v<.8?=jv)0 F=b0I*1EkyA?P!i}Bjuf?,LSfǣӶ۵?':KvDqD*˳S=]aMG]gèW)$z?8 馳3lqy}6 /:>}j 飅nzsnSp"`sؗ W-큷k^RGYR[s H ?CooW_|McŽ ,GGo@ݚ=4ZLnAN2f K~wܴ ^s{_G㽷踿x^D,2{[3Ҟז.'5,ų<Vey'= %ھd[=K<@X'}lqo0]P<6֣0}pRJs#oQ&iwK;YavHӄq cqo}PR5-xN7Wo)fEbtq_~ Ŕ8z_p|w|;ߥo{Ϲ^|Dz5m}`:)qYm8!F^͊, RQvi& *~}YRUZ8"3_Lbя ֤qL|{.bI$zǨ5//fRLҐ˳3nVפ'E uӴ#. > Br`6uJIa`tՆC!N8* Ȳ'[Gj_#a m2á"}""-/4U(F]w9Ff^QAw~5ooXkFP fqď9ONOX]߰xr0jPmۡd6G C7uWo) dc2+GMHyp>#v4poAݬجArӧY1_.0βݮ8999yhaP7w{"0vAu8㏨}\w[ Y%} l;B%#* x5sA>n}vE8{D% bCI} xfX ڮCԣV4wrz`{&MRch|Ƽ(id8(Cf܇ ! PFsL#lF4& `]G%H%i(Ƨu|I ȭtzraX]_D>ihK)~gѣ =}7 0<:?oY.fTe%èB2Aص* ͚l2gW떿K֫=m;rsb;pkeٮKYGw7Y CPs<~wMpVc 8}FHEDkGF0llK J=##1fh}vf/_ZoZn@jA`-NRwH'w܇w$cǭj'_wNyEۆJ?;prGo|_^r8M{ * g fyɹ Y?ldz~ ?sv".n@{a $}{~M,?_$9'kYzgDk*2b;iA:2i{ˏy*ٱq֑^~o \ocXë_ϩyόkꎅyaJJhyϻSJ5B#H8#9PHaB>]#j$S$b1fha@Tu~_Zvkpְo}9Y̑C_-ɒ8bEݵiquzTQJvOSWGL 1F( RryvJtCO̦y24-P0~l!I1{<}`ÞӈnҘ(I|sg`ZL/%(/lUUѥT@kF:*YQ61Q81.ʊ8Z(d2D1#B^mнdbA'5\4o6e!( zf~T^]zcHKfd1-]בS(zDR"̦\m*ޫY( O2"FcgӂI gQSg>}dHd=j$fZ$ݑHAvڱھlDuӐ&f>s"{CM˛MidQddAD_̳LH(bYtUrAW<>?;/>O?/NONO'\f"l1<04Ŝ=y͖"-%]3)R0%sff|S3R E,y~|~n+QB0+rON{tےl2AȀnII%DvYx?jˡ?)YѓgL gO|~l*i8IO`tR:jY%CSCR-G 9Z4aġҔhV=9_^;oֻ E*2'!Rk3q%C@ 8$ymSaiq50&)hˡAȶ00) ІY#}S{R65IΡ*KL&ѠIƎgE0)&)NOahd~4NPxK:4M,h >b+}rܗd)M M˧Xky}}b:#IF^!Nme9iQ=u?*8,Ҕ 9JU5dAՁ`<99u;f9lAŘ( PBp\=H8.In{(&cdv=Z[&9Rj_{$ͩʊs!ٗI9rЏÐ< io0Ri`%/״aDsAFH m& cV]+bJ;Ibr&=c1!Z `tq i΅a;a)QS7#cwTMq$yI5!N;l,J T!q?N`^e@2]}osF;0PQ?yQs'ɢp?^[Ofǘ/9Fŧ?k\R74Ƀ/am{9&̏ؔ~+F\ցe?;KIqS~&QWtF1]$@ DM-b)0ccc\>Pjp#EL9RJP.. ';S wCUy/a\DГ̘'~g[ZH5x2PMƣq|L u( <\"Mq2q1#8CGdi՚m*A8JA)þzPSL9_B:_6]Clpuqȓ%9mzVP v 9ڌ\LP ޼z0QH4PfF CV778'svuoސg9 (C0 :Avac]q2[qFyθXmvl~T`ۊIEeS#T՚7o^#=){fIV IDAT{ ;)QUwhm~Vc')lFpۜFW:0d[VO$ہ'{4@GɔfG7$iʶ*yp@gqhh4a^Lΰ<3z-dFAtzPX$fD9ޛZYhf׮:4E!ƎD CFBA$P(Hx@HNh;NW}]Yǘc0VuG6sSj]k5}ߖW|oM~-ϼ"-Sn6 _z%.#X/oBH<;Sa { _ᷟ5E E>hZ1I?K"n3w656j"D.< 4&!^&0h_INNh"׽J!pDq3O{Tq CLx"$FX651 -ɲb7U 06(=E1bZV ʪe]')Ʉ }ZwqÁ[]Ote*w4 ! (x%)!<_CeZQ=U`8X5E>¶-Ն=t[T(UU?1.SD+֚gdFɘՒ4q8д W5_p`8I78c$J\,X/Ji4 D(eeٲXm. ޱZ2A*~#%Y3) 6]l@')vw٘e@:GX79CZԎ5?k߉b4 RMsU`,Z]i]U<`1Oˁe7Wo!GT W|QXyj/*oٲ4~/şq޿zoeVr8ޅ >po}Vnq+U̗g?_|?ap :r_(%â;Ҵ]t|˳z$I^Sz"Î~du%PRTy4 cL H&9X궦eh-,y 4!nwhFk Bj I^jLpbKXW($ n,#4uey䌢 y>e[&9|bE1!%mUqzi-:UޡeĭwyocvB ؿqȶ1lچhLpޑ@:rd>GXh6Hdr{;E#?{bAk9}tDe Qv:Uc`X8:G=g _z.$?!M[1*R(b2y~ aprx=}"hβ^_r0qmMUqv" fSnqFԷ3[1}E+6KC\$|eYe:tmúђAXxGݶ5ݼ?ņA F>|ȭ6}W!}mW >Wf^V#u KҷX n=_'1z[n޼|>zqA֤ӔGO_qp0.2([eyf2YT52ؔRT͆{nh(E s8޹Ŧܒ)DU7Ԕ5јǟ~ H1\q0RIw8JJy7t(UM!4XkP̎ʣ#ߍ i$ 妤 :88a(1]*aXlKA,'4ɄD)(H[6֡tD 8kf izb C R-\^p)ƱtWgմ{0X xL\_04uס]BY1=.=#ER , n12o}~__3->Q_| T:!^/ۓ ?v-= ?;y7K6^@[4zE֫?`)h?Z/cܰt׼%{'@9"D^]; |s+U3|{ɗ?3}yRw  |YX_|q!dCXKX]XV; C@]9|Ǚ0)Jv%[WiEgC'@ED )öL(0 ܕc8!y!I!5MOU78zzBZ]g)~8+^m~h~U"sA9Xf'4ᢄѶ޴X7')UUFf3Ti9=3\,zK{M[ӊ:< zý$ɋ >}~QCo嬷%Ś7 _wŦ`$H{ϟeRf,#Vӛfg`)Jy,h<,5؎H41ڮG~]s.*i8:!B:92zgb51$Q|2E)mב#. V{Q5uM& 3qHժd<8NY,L,qvt?x( Xɫ_g7J ՋtD}=Z:k;I7 qJ "ͦ,JYqA8ZX+N1]xDVx 2h0gvdU$M"%K=`Ӈ(Kg:NXhgZrz|$+d1۲iZ:di&3aP7 MN[F9&PjBo^PzC6QlJ]X Np;pvu䛿ğ/{S<\_쀼mS_LJ^^ o7𶯭_vʘ|kLED1$n%%WdX=?zLe*q/Ç4v`0Wy?>^2:b.h&IR"1T -s׆~ ]pYѬ`w'JW]W~(x=> 8iӳ3(ܤ5!{'hTx}g\4 #p4C!^ (L?uظ4ms *q"#/FEB%cExF:mӱ)+1tmvu%ƃ<X4X; u *iqT1scdԝe@:a9]ב$1J{}xՊMY!$(늦)q,s%XE1۪zMo {b<.88x$Jqu`iUuo9_,I CiB%IYK.`|:Sn],ێf[G197oSڶ/#rpiH9A׶imSQ 몡BU;0)ryjb J@^1Aʯi'8=(Bk*ϫv9WE;aXLʝJJL$iع]l9;OÈS<ё횀_z'O$Q nI8zY;ʦDIE"ϩʖ$iDeHi7qDDH$x8Ǻ!pwľ74M񞾷eYY%O%шq^\o;no:tP0p`:ᅬia7?%jdo:aYb6kiښ(ʺ$)RiQ,w,l=Zk#M5cpuG)BIϯXnMi lҵ qQ ؾHEh[I}oI$lG$: $VXXV!+b7<˘'Yh< `ێG'c:Ơi;"XpLÈݢ}Y޻&+Noa ITe8PQ(Y"v Q2 ZkYX'PۉۄS9MׂۖANb=m0ΐ%izlޕq<:#%;Śbι2gM m>Yү̷RJ4=v cZDWS-V&lێ Zv$q)uHg\`aXmK:hڎk79wݡޮmK> "fcH` ޱ^Uxp< G30rl߱?jί,ˆiyrZsr0'MYE1Eӵ5JzRҊlRx)XV`NeI隝{%mzcR }4nV ÀV1YQ $; 8oû5餵H߻7SV-uS-Qqx|j]su}:9?~F^ZD:T3Nc߭5g<w-]!ݏ}<VXWp3] yqOG8%"C2I4{Ltxkak.X>$Ib6k6x H gk(&f|yE?{W{ e6 R: 4Z=yqнj&l Û׬TZv+ vՂX D37%D6b7Zf]!}ׇA8.@KV%(cpQ"q |(<IJTLk-J+a[U4 &)ZĴMG,QB7xڪzݻXr EzpN,$bTdܺ}WNt `"R[7Nخ6DZR%ɜ+~g|;E>k<~N4l@* ~~ϞڬG%1wb'|޻ܹ}}*>e\Rd1u նlUQv=QD bj0Lx9"NA'ֱ)kka*[zgOfXW%q|2izY]]s?!J$Gя>F|zl2f}w~ dA/)Ihk ,Us8_{?9ZS[ 4螇.HeXW5]/i5xK׵UrQ=srޜ=YR-9eg.> %PJc$K>ܤ08/AˇEo,ٜr[Ce((/o dkڶ/8lpem Y,Ef(tDtDFRBa:X7P5HAikۚq(:i4VqD]!A aFHdQ;&bf8i``.G)HsG{38IQ^v= 6[j3P-͖Ҕ/wwݣ;g1M?(s\+ʶE MEWD1e,.y O/H%A)]c[cf<} nAcJ棝߭a,c0&lvK&dI`{Nn]߱?08GUdIF.Bq?G 7)5I"|W%˦{a 3s|7(f:|h<=7˲ix4I{aM"cKլ i(b21USc%$|ܚ̸KήyzfUm0x=W|)+C#z屑Ւeo蕦ν%cuQu-{19EFC]3NSfdh4|ٰZoi'H'dL[Hx%5TH@L@K,Ei4*ʲ.y"8|x:ɢ_sC0GQ1(x qQ@oE X0fXg>`:cv;KGnjmUb(:a`oN W$YU]j#lLTIB^X.V$q t-Ct()*k[$%F1MxoF)l[;w) ڪ(qPn7m4+Bev~fд G=8|jlJ1LOH0mt(޳-+n߹T Xc8ZpM{l˶9gA( 5NA"38n6eg.UmAPQѻ+>ϛеZ94IhZU&-Jw2Hۦ|˗iǻ-yR)-Y^2N|Gk54ѱ‰ЄqB7t^1&  o#c>[+g5R WKLƆ__Zg3W?(M|~q_ş@Ӓ?9%Ղw~ak<_qfb;3ԇo)b"wW_q:nûoy9^]q2w?}ho#c4ռ<7}?=yJ<<ɬዋ߼f5+P2(fFՑ?~~r8V,+.B&Y?`DF1uӞL$Y%inb6'՚Tiq2yfi V<exhi}ōYxntEϺ}6I$OԠ8AԹ?Xb1XgP:$aQQ@Eo#O4 ю}9cM*@!p8 Äf=mQ+W:g" K &Ns,9JÁFGD9?EEeE9͏?r\f)0^RcsD)dcJJv ˲ŋ6;-M =9Ɖw[w/WA'0NWZ'~z5-cpl'F'=4]KG̊e^눴؉ݡBGXrx9[/X96 o>%;nolwLư<[bǺə {$;FhȲZ1(!i7X"'V?~d61'Ev^Ŋ~h8Jᢜ f8;s P|%߾aD%Ht4vqB,Rzyo>/?}$-5;5_~%Q/Η/1}?||yο(#?|$_-X78;VG.g4H4o޾C+E, 8tU۲Xf_?̡iqB7#Պqi5: Y8U*( rdzi1}K%ł$IΝ(0u"gݑx/5,ŜAI|$]T<5I"*G O,q±>>{ħs_PoųU'TM|BP{B><z_zN8mM1+rg\vǦ8C(Ζs,xcqv"<9g申:HiG+˫- JHvzuꜮjxmo; IDAT (&N%q왦q~G0ͤb$gs8R0H3/sϸxv52**d]\Ӎ!l/:/g gW{Tm .g,e@ 8|?I(v͑ X`ݢt@C`:8IWEE<$BEv)EnL !cȡ7,Ÿ6恵)H(P*qd0IL3 *MK;ZcAk2H4s??û 2.y$\-ߐ?}U1 in`Te{hp46LgX٬dPjnnBSf Tbo85?GBd?mxoaP7gB~ 2:...fEjɄx)H4#RYHϲi5J)̜I*ҡVilqγZ軞bjj8?#u}daHYIt yܞ|pxY1Nu0#ǨVi<_ȝُ#sy|R,>axt<$9'?6M&z<3HQ鐉'$ q{.zȀyFnG @f)qu"%أ[" ?(y&Dw+ {,JalxS~,ɊmǺ?|5ۻ[!f6/(cUsuu͇C"sasyB8 i=ŢDڑD{Ds^0tJ+<$5[,Bd[<DeRf圦3GfyB%//¡N,qs{=8|C۲x%?}Ȼ{\+&-BٚjFƩnz'R~E `!2 )HC Gu/[Knb(}繹_F?ıx,^ YR`@cD@Bp)pWa*4xqO"펨\Y7?}1 TOoߢ"ɡ:0_fO#:sl~z?C,fPS!͇Bn:2ؐUuu?Ӓ8)qzO$N^!$1}U;E˳+ww`=e^)YIIXV5MW#5q:eyFk HݖzEFӇR:v#IgNH4!&Zfy$X;S!Ō-ŌzŇ[PtpvyE?znv&3.oڎ/pxrzͻ-u8ִcX !8 ޅH G}~ IR8rY[)z$Y!:9qY/Q"ʢ@>H|i$Ca5NAâO_)TH<СDI6! c{VTA*E$uHY0EK}o,5HTD znKi} Jq9޹G}>2"}b6cVpNv=UU'YY $idI7YF׶bb#uE΢$WWtmj,Mɔ#4LhGGD*"%0f2BResߐI1Ϲ2wH%lBTk,xؓh%7G_~jGԃ{:?j}x1L ִ@匣ڦjj޽?>[0|< W/^9͖XtV-%F=:TTgׇ۞wKSA"7|.|wOE|秋rz?ϚL.rMwmfm; LqtL;P nM#Qӌap[^~FON~O̱i݁Q5|c8Z#d*ABgcu#BKM})#}\ƴ#I/5ۏ7h/x`w[fy,On⧷H@݉ *0"p9*RD"Oc4)%1uYJ$*@8Os'%el>[4H#j9znK= X=n7qj0 }K[Ubr1#qs;6uî qğQzIy2V3Tqw80ZG'FzG1+HأdG4' dIrMlJ)y4MyXC]t!Y8&Ia28IT(V$YC%00 TgYU<˃/I‹C')q~qFCrne. ݨET}3#rIuKv4m$O:Ѝ("4(fL 4MGc6 2b肌g>É2'xw Uoc4#RCw"Iñnj ^LT]\8ZGV4M1m%Ύ1<d P׿'EUwl(MZoqƓK @& X~$4 a5Áv,Vg>MM,rNQfBE<, $4|a=|NՎ<8a S6Ɍ-ڦB*HӔrV-Qäi0Ļ+fݖ &@!Hƒ(y6K4]DZnJҤKS[ !tg uO-cq;l@}UяC75._?'1y8fgcsOM#8DtNg>#-y<~9,cm[ph-H% 5Z!5$yDZd!{&#32p8ଣH$M(b:ƒ4ş(GdRdyJGQl6C׵KP O8l7;ի$&U x uxnn86CD :(Axc8_?b`Bk= fbZ3m <-g^086 rIIn]f1YjŋkV˒Hk =nSM l(DٜJYKł~r-xBe%7 ?XTUKi,fC*חsoj%:TMu<4,cьN@83"!!KɡGÑocŸ q=)ZfŜi2$QL5(: &mC?8gӳm̈́Px[falb6IL5Le1v~+/5820ŌyQ5rrUɅAI& !K3$!S!prB"[)I%Z4hDiD`ihA(d/Mӓ.,.}za(!p.p͍ RJRc&q:JBcӠN`fĚ 3̊HJ^x4}'μi`6U3i޹Q( Vt}HJ' hLȷz9MD )AYk] t9XmnzqA?M'lV+)s[5v8KՍ!Z#V8l(ʢ`,q^/ǎiiaGqC&t]c 2 5?8JA+ž:2N^ gCSӍ# JOCG1 GAw#Z) 9G:'q<ލ#(v|p~KQ}3{"DZ5 @]׏F$Z"-K`FX̐x~d[˰eȋrR/gDQ "Dhwhcߓf8Qr8#8A0m8)fKi adx^&w#HQBt?*AT*8q1AJuzz U?y2OOFOOt,|v%Qp~^'_&x:B!Ud)>(x<7q:W9<qTבG.dRI-Y!D!_j O>$G1K mv;σ`>F&oPI C1tz`] %}*q9;;kv߿yK4I =FQ&iL?uyqn  3tڎwX$g3b 4uX/I'YS!EHں!ҊqQ#4]Sa-,J:Ҵ=ΆTq4,V+rxd0i9gurc,2b/ϘiGłvԃ!g 8//+g0߀ a~Yd %JvF,!öW_}%DYh ں^NM{<7ad(oCzQ&ernQk[Y1Rgh)(@pΠ'ҒݶzTB#WWu"e\a4PD+bȵW\ r(ق4K9 ivCkdѱb^ c~50 &P:B(MuvDZRP "(R REzp4Q19? IDATH,s3XǮmJxlxt:B\/9Dݑ( tcuy˱ڳ9-=֌mbK|xpī Mpm7rMq T|֚iNozLOF=X-/״M2MEK$S\%kJi~~qqxBp6{$iRv#n84-Pfþi(K"KɳJc-H!4S`WcaYO\]]cm8>8o}3tmOEl>#Jq'7ca^Of>ف 6D tx<=¹HHċ~N%y"aMĴ]c@Ō RwwǚjE!K nCf4MdȒr>&6mP"lúTRa&G,xjI4x,Լ}Lryf{4EFi UI8Nz0L:e2ձz(r}۷7kJ5@d[rKRC9B!V$ϸ5bm$(Z  }}GZi(pOT ^9E&ǫkھK1psy=e"R,9MGY4MO?L,Þy%L^h`ZRYBv#Sc*{P-VtqvKT'$I&n{jk2YV'aL)!sqqȮi݄--@idž1YIQcw:QfmQ,Zb:p k5q~='72E? 97gO v4>x8{y}uq]qyL'4?DnJ0Xo<>}V%ECFFO5ù ]xj]Ė)*}#?,'Ӂ~D0Đ cK0 [V媠H"um;E zC?8vb~rtDQV-iSG%a /saQ BSÑ\K.\,j|?'QZơc^0UjtXo6Fa$?1TO. ;3-64REo_0 o>r˩PzբBrkCa-FrRDx"KHy3796%k)雖jdaVRCLHEsB"v( )$!xib#0&Ҋ/tjx#!a"'"5Ea=خPԮmdt}S0:Αɸc*+~(JamHn87 4"/Sۻ../RP%U]}ZSjM׍"ьcƁ,+ڱCjbQc Ss><<6[^z?E^"c2fqՊmS>$`f: eM%/bR4Dw8R.P2mTerBIX, <nw;wG )a s3=QaNKPڤ.w/_ d'Xnn( #rBL`M'[s+ss2U'pX_EbJ OϿs\>+gNoOֿ.?/T[3M$*~5I>|;įse.gt3G|r|E}= Fd_9x-π+~X)u T4\~hrs@V$8Gi^\\puy֊|FIߧEr$Y3ZiBy{or>,] dlk MȎ4!esݮ~׼bE*TȨG$CS9/_r>68'^qܟHv`U%+2V77ɡZ,Y^SI*)m>$|ŋ7{RX/J&x u~i8qw#2"COt!$Cc q&4.+͉Lx,E >=gQ9};rЄ97}x "N"i $t!Of=G2MC|(Upx#g.Ux>qv>*U ( ˋK֛%h͉wx%0E `^-aZ;5npBfQ\lXK{ռzyAn4Cӏo9}Kuԋ%sO?x1ݵ-0D"m32i kP2I)bi$ \ {s|칼PfΘ=JqbFȍ?id]~zG`w>W+c@"d02/CD*}'sDvH|:;)8[.p!H76m{J% `u*WO'ҍqH33,PZ #JqrL@?nb>04MtÄ phZMEbn2b=i"M28DZih%˪(I*) ~E@1pltrr>fhqcG !X.đ7MQh[`l`<+!yqwȋbqcQDXT%W/6<ߑÞ;H|kL4?ӟ;$a1UM6]PaL7Y?<>,KRY?Iv֋-mJ J4PL,'/rPU5.D,GT #Ér;鐶>1=wPp#HѳZqQ aRT)w%U]"%H@FӍ \`|9(bUU1# ]bw#jt xq!Jg;Nf5A`{2DXU c s"%R2)ɭFH%ˋ-PZEɲn痛.'Gߵ4zr]bT$$*#e|ԴhLbzEQqsx%\ 8ᧉ((ʌ=Ǧ(k0hz6uSԫ U879:$J"f0NcDJt7翲Xdaӛ4XVK]'p!ĴrEN6}?Gܜ&ct>K$v0y@iscm:@]& 52Z9w:8ͅ ]ݝqw{d^Q 79Bɜ.tF΍ ZDuI6~2Qtiks88Ƕ!Ƕ=r扑UUr:0:F%͹IgpQpssh}?ɥmg_tv`ts4`$ H)dzy8¿2 S݀T,5]06+$x& 8BiR?*4nq Cqn;ȋx^kB 푫t]ぇql G9Ԍ 18r ʆH ctR-h2uUItZKl-4PP rS{G^^G_OXTEA^˯l[D~&2łOadqUEO\zqūkf{ÏߣdD8P!%ޮ!JaD)4Q*E$X xGe-Vh Lca6mqrE@e4Yiwgbatء+ ( nqHPZAH$RDdJaU23A =%02\4dJ\T6&Q?O8&0RYZ#TzSBC@I8.t+QM&%ՔEF >։=FK4[',<(ɜ $OLR2=Z4byJe1JdE>Ǫ /+NgƱg"D~C+C;ph[Yƪ #EU|2֋%v{'~"ƈRuHj'ԋ0Wyƛ7qjzM2tj"hԋ%w9{k EDktk3b10&˧M0 }4)ۂL)"edQaX>D1m$łlSd0$\8:"xO,ZiJn.v} Qf3js >$SDFv#؜ B` E%wL〛|"[#8aB/ ?`Eek"֒->o&ox@>g2o%·Ԫo,:ʺ>G-my_{/=]B\dʈ"yzD}膎rI(ҷd,QDVbIu r$u]3ak jz&3"nx ㉋ˋ$s\YiCrB ږxBFm2i) 1Z.ˌ"9 >"E Ty 8PVvEOg6I{͟}۳uh%FbiRD#c4Z&j saN?S\F2EV(-Ǧ- ΍t3"sQCG6-8w 4=(c&^4-W/xxxkt/eQ?xBK1K59`c0;ݮqq}oxߣ yd F%*rFL8Fo&2N>\.|G6EU\9a.߱=X8V+b0mRTY/)ʜȹ(ln8X)bdh">B4dYeYDX-g$t%߽K2mx#uA 8y|?0UQقۏljVkZ ެZBذZZcd㯬ʚ*eOz˲̸Jд=?GجJ~K^]]p?"'W9k;{i"HASQi&)A͗?!zȬ^(EUQZS9uMzo SJ_t]u#i)a,iGdL@qhP" %#я 3lLzRB^T8pw=M=C?0Ly%WCA$W~RO8hc*zI(Ǵi!fk{]y:NG2[q8E]*sL Tk9FX,BO⫸ȍ rR9 G0)f%s_#mFբ\~_'mGij%.%;+D0~{ E/~ >[|q-Gf$3vL87kQgǏyLڌMӵ 4z@7L a,'W׵(K4rn6ۥ.J$Dr1Hc1krkY%U"_S<>>0AYWL_N8CYb5-.8BXԔ%sk7M͙E]qn,5q88I {q"LU3-܍{!vvbh:!D,*"Oi ñix@E"fqr!3dᘜS2ZR%ɍ% wh)Huj$/ |s3pw{yafEfQQc^p:E^wk8w||ϻ%^)N3C7b&6uE%Z86`.VkNGC9~(jq( ҲJo&^KDss;a4.q@F)9oxsfd`4ǡ90ʀ%@$J0^!$9fU⧉q0F!P(86 l`BLؙ'T/h:ÏX/K53L?0M6,K58qhlZm96-ԂҼbŋDn8݈RKx8xZ~K??}Ղח[ۗBgR)~@C3NN0N7 "Tenw DOUfdEJء! 'G^ 1H30q6GfUX%V02R23hɔQQh0&#/@@e'!STe Տ#S x ~ƧI9ӨƢd?Bc/Jӻ'I7 pjX) RV).>o\$CNTDžlj oZ!|ꖄd@TJB\}L%t]Y 5!n4 =֦}7/@!HLy!~ͷ#=7(Y">E9,cW)85-Bŋ s46jy|xxT)Rɸ>ayNoОO˴!n/~s|5=+ Iqh ceYrq}cMZˍa4FD]U6c]3M=ÔYnLJ{恵0wO#3b=0Gh=1(rUkZqZ"97F7plNԫu!GȢNy (Tu#>:N}'Oی,ǁ;e1Lsز,+Tpz.V.*èt3Nl"}3E6{Uś7!çFo8v#&#E.1o!El!6H a!E\.膞(Ӆт2lv~cpЅ?LsT `X!0.7.7kN#4O m,C'O5 lx`x }Scr jAYTUj~yAk#tƅqOQTeAg?x#x<1΢d1Ѱr[0aIԑi1rQs: HD.f#89a!z'FқNOH)pKP@ ̑S&6 fms\h"ZLC;WZka  +R3`:F\.Wu]:/҇#A >ME m"la`לbw#hۖH.w·TMZr>i<pis2%8q>'4m F2GeR(!d=&1S{pjX3vױ]m ھG^pH8kl+O"EY$_QP9_+vY- Cc#1;v֦7vt cHi б\]nLN)K,DȚI4>mOy3>MsE))$L-bBxSA?}.zsAie?vXϩg|l=E5b9>{W$e[ ZS*"JV5qQ5E.Ov#Ua' 9c $G5D$Ն s>"p `ZLV0_&Jo¿qO7_lad mѱl0!rQ`u EFkk见vEgz6ՌYjȒս\,ƁaH*S( S-%o4Ҷ);yܲ?o[RW'NWW >DKf@kNZ맾[;$n全j]>"h~P4Dyyy,9v|2QzpsO#*6Dr-LKE*3<c5ww7f:VK>ݾg]#C7LoXda1Ųa]=rf߱|źdz|\^`?\]](i.EJx$ #no3Ch1&E9~ MK2  wʪdƞiv*Ea"Ah1Ќ#pB0!= Z2qϡHT9?p(<>HN48><2FcCvdʰxo~wטՂww(k+n|)bg7Zדe]U/?a 346K*1 ˚&p}}I׷=˯'T*fZuI>!}rAͲfYW3ah!B09Nk\"-eYWO8%c2 \Đ6 RJBL”dDF,c:y'~27#Sf;Ѷ)nZi) -QiYd6 քSeސ'1*nde9牞s,u HH+0D!DDgq]J0M88#mQ0kR~;diZku#t_ ~~O\xA[uPdbFG,()cTzc6i;h`Xѷ 5)87'v˹]B֋($8"b"Q)w?0xGU/*J.+޼|4ieZxHXE"|DԚǘ tcP27Mmf0ÞeL9#<~YchOGUӌ=Bil^0:v.wiN|x킮8lX>43+?#Z=l > :}:BJp8s9'R$3B2 ͐E7-ffO@g!%$K@ۧrb<7Knŀ_+EE. 8)pRؤaUO"ڌvhږpWoJ~(݀3*^Vޑg<3ei歺ҊH(=)rL!)zvE^dԫ4<%ab;Ph.m^qx(dɬdG$*iBDULlU]|g^l6D$|"} /J?2L(%w0)\l5V<N<ɴƒEB(\pÑyHsKH})$y1#}#B &V;U2SUyiF=RU5{Ͽ|Bڊ s?GqO / br%0N䘀Wh جHnbQekp~B Cߥ>r] 75woM{:LU6ihc0p "@HHH $@E" "` mvWWwיwsvʽkz{t֔$,1tq%^t!]PWQbOe9r"=ɍDx=- mɋ͆@6F,&⠭HXd xۘ`c /O,/ߤ2 Y^0Q( =;zŲ#V̎8;Ypvg6zxvJZ{-C* «sk p]s-K|VAA' 'u=iRb)ISMBK;aApvnh8b'Or|‡~1]1'k><Q'YS}p^iBP8ImR NJR9ƹ&N3x3[V ]1G e4'St4Z $ "Y$clRQ"W9֌&遤^#=#ҔC?c#[+a$Ցn]b},I%HdHh6|TU7) pf VL)LArdSN&lM!C>3NPg!>/h}7<1c!o8 jyYQ5eyI} kYbKYnZu0E\hdQxE>ȅ!Yya//. 7cl^n^|)P#hudZG۶}OQ AJWN!e$b0pޓ]7P%.p\RY -%Ӻ'+%EQVIo:^\^q|zz!2zz~*88Pn멳a 8K*#6XqCoƑD'WOvJQ5/wA0 f 4醑m3JAc]#")fǸoxWk#.[6/;l4ȰCFrR#  1|[9K&iFtqx-ܿs 6A*\,+A%I~EXdC_1;Nώw{5ޏ9?%QiZ)M)%qE8f\<"ytZca:Yo;~.{<,A*6-Lj&5Ӳ =CswϹ.I`}D:D{U"pv.xy`F7"AJ*R*RiFgn7mG5DIwͺ q1jRqċ`~T3?\t14j7#Ŝ${!;֛hɋ ޳̈. YH9MR&q;ʲRPh|tZs3"Żc~G3,ZkE3f@$1iI DϝԚBzb-MR)׌#yCL"WJAU!/A|phI*Ŭ F9n!;nb$T~F;v݀1#Yv-ٍ1JR%Q1JR+*٬gs`(,KǞ<%%y)uY2*[N.F@l:`RKf89;;ZG(}2#Rkdglwk}]V EY2KBp4◇# hIҌkNe]] 1@_,4MKGtPeG0`Mg>993 ӚgyZ COYEb:c>24WLʊn`-JKn߻y38=9f2XoD>OR7#KwP IDAT-mlnƞٳnu lJ3 )ǧ\_o0?s<Ìq3!e& Ņ\({~1Wq-]{a_W?|%/^r0e<̍/ ? xkF8|/AE;T?hN|/~͟ASNݑ^^>vY:u*|ڝ ,L+eDwm&Ə$MZ)I&R(ͤ7ʚnd>bF]t#~1; cKe^PN$Lz`4X@waGɦiyƨ$G% ~Pg)wN^$7tk|yͻ̪y GM+zM-gEj۷(0o黎rɮmmxg)!SL@~OL!%Mj,z IHja?&5R + ђQZyjE^e(%q0BƋgIIJJ8hG;b|~)QD+>^>/R舔1 c}>*JCWD2J!}4XjGIs>Nh0ḆSڦn.29&KX42tUu'9sYhͳ!+K@?S۷NryqAU׈Cs~kr]pg$'iYE ٜiYq}dRT`-) 1}>udUI;izd>_p~~rvC(R{o?`:zc8/Wv^\i{npBIy30s U1oa>x?ek'~?2{g7f?s??o9m'_y,_?_Gf|oyW~+y)ϮwOi̿7~k jkc/ >(ѿoG~y)/5Rߨ^'܈a>&x<J ϐDa[ y]"HG(i!|{ ""_ GĉUTO.SC O]ǡ .^u|b{#@Rpy}}Lu|7xa}P%ɔHnwe 2x4g욎s%^m^(,G\טğ([Ǥl2/h;z*Hb6f9]7Ӕz2!)C7l' uUc$Kdi|0H ڞ4ӌCv'~(s )W.|"++ֽb73N%| :=\$>D8;^m{pXonB$9sz /*X.WL'ط=zt ,KخW[pr~m6ܻ{dHϓ'Y-Qe)>dAUR&3=;?pϟO_ 6}O:_?WUG3>;~c9}n\)~Oԣ/u?_?o/e'w__x󻸽2?so:2Y녛/A7|/ݚ|!z{zyس `ZnB@ZBe)^A!띏$v C"/),K)*n煠k@Ҝ|F]qdْfuԓ9H-ZHHٍۆ~x/,W̧8\/qHPIF\qx:cFQ#B|2'p.jR^H}'Ir_^]j5&* UdRж{6MC˂yUP)2'fV2ؙTII}.)դ &K4,1뫃 *^FcCv0x2=1hGC`H|{Ʉ9 `8,ҌI3-5U EkZ_6x۰߭hw#T匽ar6֎|_e6-{;w:i7k͖DJq ISIз\^> R@߳ݬMK>Sx-Rji|R2O/x\r^Ǐyۡ.PI3b_ DbG4@( ̧ `VLCmc~ii=M⣒a0 ֻh>D3]pXAf ߼jF9Mȓ }4!:b^Fwq;Tuy؆L΂rR:j"TT=x:O]'hcVTB۱"0'x72$)!(rٔkќ97\稞| M07? +knG{4Wk(U4 4CnlY[,AۖDB2-XL&h: Ǐ2,ˑ. }((.vyَcÑd)*pނ(펲(H$՚@`'`E}gd-Y$yՊHe@*JE^͹ؑ,F xtqA-Nji*)K0xzqҒwnJd`zIouE6>+_*"Hzmh.wM`:!IJIf?!OCT-y>Q# ~[So-~+>g|vB~nDH.|,x%SHW~p(c>s|ܼ݈ؖv5-!i a e% ]ㄈ{u@,~ Kb3[$ǎX78=LJkNθ~,R0}BglvIFgFF`Z0mK^-\^1@I=)rF}G5SE㌡K>Ur;4fbuEM,޾ՒjxNƱ޵ Êj6XDOuSrq Vh(kx*`o'ֱ{N])g~8O"e|`6w|OܮIceV(%uz]11>xrEY].xp4~!h˼({l^5U*ޱ wm8zL{?>7h7k./8>{o-vQ>>'X=:=qr2cRgP< ҃Ryv5͎`RM " ;zk:3čPؾ'9C3ȩ 4];).>>ݦۚģI{)TՔkm$ݬL*ʑSOkڮ!j^bo:Ŏo8;uYoghFd!P޻tmKً 9=e{0#0lA|1c^=Maq ##\ 臁(Ӓ~L3&G qihD. *zw1o=.H.ѤbngR1)|̄=y,!1q*1xѴalIs$MqMd5fQ抪 (qE1Ż2?iErk)!_tPЭ7eRcF31Zc0s :+LWK*(j-Tum/(&MDv`JGL;r_swo3Ms+ry,ۿurR/F] _ _ogd {YxY bxtk[D!"+*i[4!d$2izmCuoGlO/._O*zruEkFE$AɔGOj8Y4{h!fƆ<3&u"0-H{*3ڮE^qzzJ1>&B2[֫or]N6MDӏ3nʹH8Ōxw<},h ie!c &-Xv+%#TZ˶iPX1"TJwY.7d 4S}GOS%1bz˝#ƾjEQOӴe1 |z0:LÈtծa61c̨ɓ zG% wG?9E-dUIna}'S泒u3) "Y7,&SKkFΦs"Cm;:/YQpttnl)Sy!w f` UU1욞DgBp$wOH@ĸv44ͳ/X,aDM*ѠmBO]]BU3Kuf#Ţq<\vפEF%t=RHg6@kHuӐ&xlxB3/j0i 9YL\ ./$l [NmVD1=-~)#%S$$El<`(-L n/HpCLiBO3ů~zPcg>y3oHk% JSOO̪gQvOn߲o4ģ|J;̰rp$B 0(ZiR2Z["c0^9y6%J%knw$3$CkhGh ET;&e ^PYM'-Ar mx IDAT*׃'[z/Z2"$HV[up)$!WHV:cJE+#" A'[wyzyɇx9^a@EõV)ifߓ%C fdZɲ0/&i"췤fPx-X_#P〵$1{zĤ..o޴twbFtRcYALeMߍH9bňLoכ-W:X x$ٜA6Z,eLa݈|[j4Og"!j,YqvvՆӌ7cZ&,kdf +V@UxYoX8ϘUSWWA;#%Q Cg~4AJJ#%Z,u./{UD4][OҗY ExvxA_nD+y9#|ם)>Oݶ6Yx!Ozxz<Ec--vL )點n&/JdI A L)V͎y1Ԭ Y$dSk=I.c{xq8Ք\j9ӣcܾ}-:e9l輌z)W`i8;=KfuxpgO%Fn:bZVqp&r1`eiuE9$"M1'OŎDj0˚*Id ]8\<قzHUϹ^#Z% H醆o{4;5Brvvvr!228?>[|&⼋lv;vO4n3)k65A#A@*8/P!xZhO.UZWwIۓ={fyʹ(0ZZVkl7Lɦ96+X%դ\$*i,y!UՎ̂i48Ҷ# JHOr.GCQMID'ɳ/^D5ZpCpLts6g|Zr~MrUc>?%0Ε\_Xup\ϾKk~b׬QJSBa|IG"D XK54hw"[\thG 1$:c1ZǾ((5},pؐq :K>`}į) zϣO1>P&(JA(GdvΌ,Fڡmt"cW T*J` qt$i(BLɏҪGCS 'Ixr?=H0˧@?1~ DLJO93iV s _ "YeIWB7g-n^;xbXF_2<LqwLn ZO]i8;ifZ߼C<F&}RHV'h v {yvљasvƛwGiuû̋%"RҬj%ϯ.ٮNx8K\3;`=7 %N(\ªYa݁bi:IW(l-*/Z3؜l9F;luþ&GX,VM]ooRPnNm!"fŸߣb0puְ]0Iv |w2Sl6^W\hm)G,'0E BSvU :=ʢ Mݤ%1yFj(7'pۛ{&p"VK_害ؐpRk^?{F[% SMK25[GedH-9=[9ɩGʴ J&)>F*C`ggJ"d. _\\JadF2U|3BtXݾ }xᮧ}9lG##OA~W?)K>ɏ(s$6zn˚uG<a^Szjy|QLKDLv$U3v=F+"GHI׏hc=/Y5www($f&1Z~P=."w<1.byK^$a۷|Kd, TLׄa̜7\zƻ{z8NCf Nqh`jhͺAˌ8;Ln bt4eaNj/_ќg=êX7%i3:v5Vcϡ)vY)tq){G=c 's Ɇ0Ejf=~˲ͷ7|nf0OLB>]PeBH!DaNҋuUׯ^mV ,ٞnǖ뇖C?Ҭid4 6ܶ;bж !+ce e/麖<7d,1Re)mr fo{8xb& y+XWg_]nwh9thu|#;a6h).qC7ۛ%py ?|__na~gd ?1bPgħn -@t! 7 Tq"sqcqqc*!>O~jhy`\xz~3ÜΓ,1[sl1qadV?GJz~ zSy N H?&(q870SAӘ? # JO+)|fx?|-nx怜=OGgǤ+t3vg+iZR%&Hf̑4, 03.'1 Lz,Vi\ۖ~),J@{V %%]{`Qb\,aD((KL%$`YDYis) N Wgh آL\(N/:~ȲDvpSWuYkLA? Z@,B0-4))2M%aZ0JR9EQb2Me41D#F+~*B2t)bY<2]0O3| EO  JUYAfR<`5J+tP*b2TA@.0i6c?b,mM!;<# (M4*j&Ӛ5)Xo65ˤ3y(y>0#JHG]vB ff-G gBIZYk)qI?ibm{~dۻ{ݼp{qB3:O;.d0qu1u(M0EW(#7w,vaZMaw"vBWkU~̊[W[t)z& Y|dC?k{fkRRU.W,8٬qnIR0- ,1ZB'|f>6aOF?k__LF7tSrmOϘgje-_g5Z9c.wē.x4~?Q2(Sxlj_>="'EG~W;w~kqG/>SK*ϐ>\BIGVxZ t"uYUS#HoZf7#TLEVt2䎑̣۷&'F(+N.Gz~(j]#sy`*@ )4MPpv)Z YI&CY˂Cnyu31:ʢ \?f,M]&I|lUp˴COX&89`q,l c˒84p{)vߍcz&ˎ`<'xG"e>&r:I*8q7XRkN6 >8yA抪XUM&BM6 Kp=k{wl!\bd@'C ?XL0HT튋5kN.Npoo?6tġoٜn-fM͂ AК: xs[)1kAJjafS~ɴԒU]3-3w\4!Sac=@L/e)!Ϩˊ*gsZ#PYnwG7ܰG#nDͻkfY$ LՔ P8)iMv1 -F'xfeQUlJ:QZ# lVxwsݡ#_ieeYR%"gOS8B6+8܄rad^y{OeTUb|Mӈ~8ϳ96bKf2avfjNOD5 0` ~DH \+2M|﫯} IDATʒ4'52%ojqFA]V_/`lyq%lſW|yu UUDDDa,y5h122O#!$߃uHM%1ưZx:Ļ '|dB4Z Đr#QDy1JR熪04*3O&yXp%6yR,X 1^)&YyIi(KL 6uEpɘ;|sP5)dEtRl=>4YWet|LRI7aZշ0Д%Dϴԛ #YG]YV_ m}U`VyqY1)ZhEv]L)Efƞ,לdD)Tužo)/"!Z3Z8Ӎ3w)򊲬PZ3͖n{LT*Pq=1S̡H!UY_\\rj8tC5@Y䜬2SQFfUPn!ݮe9,JOn)ґ}Ŕ\DL.waTzyb^#_W|{r\Gdq=f~N3(\|,H6%2I2CVda :uvϾ>8Z2?!ReÌJT͚Î"ȋym3.#uj]QՉ>L[կѶ''+.N(3Q%4v^ȴdԬV+rm㜧d4JW/?9~dg:3@JȊ}0%XQRg\]?0=mr}#ȵZsz};O "Ji|sR,Ǝ}ײk;aHH!A1Jw#yQv23lsEJþqft099+dZfCgI.D MSsh_Z&CH)0ƐeYfX%Q$GN7 ۚ(-i=׷w=ϟ=g}ہx/^%HfkYgq 0&r%iP"GVL>! 9H9;=A)X5΃L4OL$UMQڎvX" 3l: X5%:yWVZ JsnJaѳSt#2^|]?(gUp!}vieihD2"*i4A*a$(E4ӒRfpue|]?-3uQW_{Qz_d曷 !`/P2B78Bpea]/ÞSNgeF@02i Hd%`vA#OqO?G1YytR|ȏiƱE~9XN c=~kHߑ#t)WQgsNds鑎ǃ4)M}IHS̈~'m,ӹ*hNmPQ)Y񛂈,Ci( A*6-:3h9;;aGLawfY^ۏasR3eзsr˜apD]9ٮ91ҰLɣ(%hmXnn(e4ÒL7duRGGG1Eawl)$YV$m3@|\s-8݈`(d2 C-Ը˜L0 y.4ZkL#2/{/ m2LGJlLg"EKʌQDQB3M3RjDWIZ憩Yek-M.r?G׿Z*gu2VLiV eAiw"BCĹYrpֲY‡ݞQ6'Dgggxpv.1DYmcU ɡYB2YU]qqe^4uvɋu]Ǟ*֛_Wgy믾dUQ9",R [?fNd&t*JiGPw]Q5o ONcx(:'# y;1*|q=Jsxߏ)qG) ]$Xߑ< #Dd=`M|yOY㣌w({+|/S>N1ıXOpOퟢ> 1sYF=dBJ~LcGcJa1`FekX?tzM&˙\$*MT&IbÂ/Y5,YpyKáMr˫3.681O=~(|tBc|DeS"DEe4(8tʪ`Y#Le*,uHdxbQĔ:i,KnGrr4P'S|~Q"E^7<;}66upS4~꒬,y̴8|pQqFzʲ`vL b- o~KDfڠdilˌӊ|yŏtD=4`!MaEJ? ܾC%x/^<ΎC9e`"@-ysz0cM&|oAk *r0&0#K7pRW6+i"xdH<֜kMOя e!%Ǝޡ%0`}@kMYAKtԄ!'*| 8Ax:Gdc$ n TRZW&ZK@IIYb=&Äpk뙭c- tή?L ' nFnݵҎ6@ߏԫ2x;S~OY!VԴ|p(%)-2S jҚPT$%ؚ?6%ahCQCGP5k;((sEl𼽽W|wxuqzɦȊӋg{9w#<{C?1AeAed{ ~g?9ϟ?OafZs9^cг?,aʜf1CߢWU? Ӝ(xѥbi8;iJDh't#V&j H)&·Q8;\Y9ie,s@,~$$ZJԵi gۊ&ג 7ļڬ"8KQa]U[BcOQeg-HJ7Z$q1iHQ$:K!usLq 4u;P&iеuèOKHb}%'|ߕY'uSc3SD7$~:=5<0''ee~Z:6:kYLGYAyTi2BCX B0#ΦfҲ GPYdHgK7.ۖa*rr4vPSd0/k$FIBpZkNOOȍfnaLFGiL((HM#$ZK7tdy RS,z 5ݴf3UUq{wM*ٞd#qXPT1btS#-YQѶuSc$UU]sz~FQz,oF9=AI|36HSA'%>< O3sNNR(ɴ&8ӊ϶Uh*C \]ns֫upv (|pԩikoށwծ] R*Uծ-Z߻}GKG4:݀P.84<''',uQDkthY=nǪ(ɵWۆR]vlv-u2NO醉i,G\zp7cm/+6/Z$20{Xo}b6Қ4mSpDX%y*ɔ@.^h%ԋE$8*JRnPȆsH9^V,sM.F\_w C$NuL3QztC- rRk\n㺛h{iD*M"SoHMN ɀ#cQ&ar^.)ʽB$.k}ze ϳB`Al']0>}TaPRD@zK:Ǽ )c i.fw>g4Mwn1 &^IM!x;ƾ#x2 GOX$INRH3WQ ή7lhRuTy'2wMK(PILX&KY$]R9wNY/cMC$fT=1iع85&Œ8>>ٓH`)!."|-:Mhr|m04mk=(i ƾlێ]? #gW 5Ajyfq6 +R@^5& +^Hs- -ͺ1<2exmD:(uLWҰc 4­CWt2vu!z kn1y6\ |hܬ9xTx e !%I3yi$1 7[ bݥ73Mc=aQ$Z1O<3 #WL]%e|E33E0te$A8麖"OXIsW{s]&Y98a-iJQd\\M ICHh. CZp΢ITYqu^'\Z^srҬ#na򎬮fYQ4p`gljMLm],gg)t.P%y^ry~Ab3=}0LPQsvKNV;8N=]s6MBp^1v EYq~yI^T ggYFk?LuSM|~ ޥ+gMrv~q8kڈJ٢*o g }oIïɝ7 ^J^R^5{) '" X/pGrs_ W E?ГC&èDFIY5ZjV% %QҠg$yJEBiV:bӛ)GG GfQX\]]!~X=RC#f|0Za(4c CVdYJLvM{/y܏sppȮݱE:?YU ˌ]eE C֫R:R!zȖ6ӧ(HJ h11,ɋوZd(S%A]ίI(ꔴHQ&e EU`Ì ~LV !sp$TySt}ˢJ5;b\e1(IӴ>Ftҹj@)1hlہ"Q{/ZP%03 i 4M@sW!b$,݀Vz< 0c!yi$GbRo-F+#p@Ţ8XXfs$X.jjC͑Te9nr?;6u,3'CRD 5&)}e͛HH 4()(ӔUU' Iȇ.0ZO?{yKߵ0%P w+N+VUAi2)ȴ IyISM6z9BI͛)SIj1#rE&sg@\,8lxyylxL&&8=6\.+ev^k''O #*MQFERe) ֎I!Mel]D}b"l5e7t->-٧o-Ij,v^5^Dd=eUkH]Њq~Sb7ZIAh!Gd弥rl!U&&!8O J;f;s}umpe EUȲR31p'Tf,K!iv }7GYK,i^q>޽v-/1YrQ Wk=R'tĮm<'h)iӌbLRE]dH]G >a"5lvY2/Ɍ2`c8<|'+p3뺤rݖ4!N 5f֒H q"NE0MbŬ\*c/7AC;?ѯ*NLGL+^x{ۆ疯¯|ޅysw5W{!@?~۾o?7}?7ѻ|k  +L}("FŪ{0ć-/r>^<̈́M|/>q]|e+r@!^ 9Үa=(PcᙜSB}!QBd?KEkq$MSfagq"H13nhdZ%$E-kܠexYPeQCho'ݻ4qdG)R$%Kwޓ:dhfoE^!e4H>N;Ls4DԐhF m32JhځnFvC*=VB0J'"XJJNNrqqjoɲ49cOi>&úykwYѰitd֫w-ێm ꪤ;԰mn꒦m]`vkŒwx8;zczcP)}GuPt6)wN:=% xrv,Oxp3D *2O}fՖ~#G|4x9<Ӵ=mrR9Z*D4] vӛn4M%1 }?0ϖ~ɍ! ig2nT/$X7wZp+p+_lWk J2[%"o% S.jRiu&7@gEP$H).Rc݆k#M tjLK r,c ePVE*g=I!A)8Ogyz>{Q ;4B(;{1O3cRv$*$$I6 ]7bt1yGR,%5m?!i4IT:Yu=^ eC<6, \ɷrxz]@IV˂Ɏd0[faLA?8!NyM*#HI%eHb`W79<>o}i:D X.˂ijPZR,*zA7Mx!di%de !MeMIG)kgyz9毵KF9>nز7LfeMP*~_LTD9pԠEnB>!1ۮEJ ɓ`nCzf3gl./~)X 6H)L-8>X!E K7L w`rjUQUY>\>XяAY,dڑ2 #nˆ(U6QEpR jgykgi0»<QUd!MR T2N1jr^7̽C'ON)O~ͧx)>zLF0“(g?i/8<#)4: ԋ,"ު_?Kf޽Ý<ǼmvP<==LD8\2ͳK*'؉$,%݆fqa!+m\lxo8>ï`0 {m6u2M#9\Hb!m#E7,3{IՄQ4-eifSfkhd)f)rh-EMaipk| :D;PΑ8!E$|eEEigG*cZ`43ORi6lq@(5IF6YBۏԙ蓟ݻ h2_V\sxv496$g-ZHٍ,KҌ$rrtHDPAjp{Ƣݴi(:bYP/La///zk>lB8@_ɯ#/ _-p3?S}?g֏'~-<o`sgN޺c8{WOƯYw_y{uoq|1xO7% _o?B!6Ͼ,3Oi~;jm~R~RuCۯ2O/p%eNjb%QIXK_Y!w+rFczi]&rK#i0"!$i=I`(wj )uQ)a/)C}hB(jK]Gb ewv yU)#+r!ʿ.x] ՒdEo*E`eł-EY@Iva' .3Ҍs/LNB<d-B*cc(nv$Ouf v ’eaHd%0spp;·w&NR0)u{+޽1Q>`xPtzaY$|4{iz8! (\@ uKY.j9R+l;ē:ھc^"`mfs|pwv!ITDEEvA"BE]c=t9iBNqPyeԉHSɓE]HL,l9Hrr|K!1J#L@*ne 0؏44q?LdbUAdId`QyI5s?Q|)8Ȋ\\^-eq]?yF,44D?̜-w,|,늧ϞNn_ar)~~DT1Ţd+x_; + $%-Klא:iXN)ڰuh)>b%Sip)Ո[Ĉޘ׃crbqW}7FǾ+c!C?ٿ_Gwk)~<KS7ix~O_o^>o]8M}=V~ u!ۈu]dxK/o?o}_1wWa{_ɷ>z~?x+CF҄kAqkd"nʅo9<‡XX7mm`x3UxV|2KG&$&66Y31N܌s[ ;2cgv.t LadI9co`X^u3!8Lĝ(W2Vgr4KchCɘ\ݏ-IDn㹝ul9JeAA7duJIM#ءhqiSD<əLSyd)gWLGd\^ `f+`4!b&L!LXv׼./ϸ\$YFj,z]n4$i*N+GSET I-XG7,,bE(-P**O2#|44)B%/ `gΟ^1J2{ddQ)q0`R{.Q8d#Ev ɔ8KyQRf%/ȢdhVm3pմW%=7{ dn0y1FaZi@iMx籓')^qҶ;d,ek{uDTTafmO;a*)rN W YGHԚayc;l4&cZ&oƧϞ3>UT)eH'`yP15)Y"c`{劫CUM4MC^YBZ4닁0|TeBOYʽ7_j'\5="M̌_׸:G(Ѻ*7C>x,˜gy:/`'7 1w|?Ư;YlgP?{XNk=TuUwTm;NO$AP"(7G\7D!a" AxSNWUwk8>{oZߚމw})D1 L^wJoSK*[]̨w[*^ ~scWk5aF ws_xy͗_r?B|b(~?%e, <-B_g_wne 7놃?ρʚ7^?_qe􉚇i2D.11 v`-ZgM]P"[na`ґ6UNہ6YF[cR4$C}8&+(ʒf3 j]CݪIh%9>8fbyqtpbCyYR7of?4˜ݚ{x1z(uY-GnޤG-îUh51ClΨs֫ % W"7yRk3)%[8x;h#լ fn 80VTKFenϓSEnΓbtLIv͆:jאU%|16 tØvN!)ٌq95R *hv6M\X&Ey=C{e 󃜓Ӝņ}@QAYVd::E!5.0|@2S #JÇt -{P9MkhQpx2$m)ƀ(ujOVt(]ϲ7_g^,oGOa q@a=xQEE>r1cv (͚7_bX=}HlxX3;a Gq0gq&9h (mO?xl{!"ZhQ@ɜRnsD[S1SRd2zJؐRMZ0ܸqLYh.lux2T˒RیYͰx{g:g}bg(;_xm@H!D*a⠢6T DG6Mit33ЉuFYfЕFGԒтã}ra"+?9(3,MƑ#`;vXg<]9Z`d@RKP̖ rLq}?[48\.9/yw䫯0#{=zH*ʜ(\l<=&~d%9<9ISƧ-Q7^>bWwys ,ff91y??.6buYۑr ` ]Cfi#)Qg1Ngb!;}}b݂D#ɉ3~o|Iq˶M'so}=wD&/QP$|HfOUNFpo_??&[wW`sUx,w+2Ab`dݿ߽# <[bwӏ?[%R/ T }<LJu=Waū0?fZ!s5yīiʳ#b&S}1ld6y 8_S%Q$nV;,5`LcCn<^'2-2O>G;bgdEN)36+jn˓5NǛ}w[ n!]"ЛdzfْJ<|4'1 ?B\a,:ó$2]=e]Vh le R8xk,ˈQU8\Pa*/e=q!߯hځ4,vX.fh1Jp !е͆v - R QOkHͮk heLikj8DCdشEbMkl(۷"VOu{ӜE!A%vAZw1jd_ַ?dj?O}o}<9{¾k*'䫟ʸ{󄷿|gdFPg*M)Gܼ},+x|qɃ<8J5E}]ԽkCE]b(WL\Tڄ@.u[G ( rQaW61s<h!P2OAަQ#E2%5v='O7p6cݠ!xrd#+ f G`ȸ}{ナe~2 VtS$cyw-~JW9Bd^4ռiR,@֛-yUpxrL۵lvTeiYIQ,OZqcђD!)+_jPcsdASE)SZ*9+,fTU&D1YJ.&#I MD@H)%UU%DSJ$\peMP['ԅfӓBvd\pmTW+Je$"AmӐ )”VyJ|di8ZRܹ]ҏ?z $:0~`!}[08\sO̪mr]-*^}PQ[6{'C}'{/|k Awr`yGT[mNU~-RoU}?eڷ~ S_!o|!vlO9_wY-:/|<7?0{/=3?Ӓc$W qn~/:z_zE^dgy "dDC1Q%=Mc}{$$[<>: 6mP"brɂzn@GpuN7Sl͆(RRQn(L6;(#,32-!xDL g-Z%h<a$LJX7MC)B'2C?1FdSѮkXm0yI *s:'萦mGTDhv͔b(C^L^DL%/Jq HPBSf1t z ,O'2uty)5H`go0UF$Q06|xAд#!Xlt,OeFYW 'H!dlWz?웎k9>\L*`:9yY/|V-AK<#Jm4JsTu c64H]4R֒Ĺ`{BXW5mTEjͮ{ţ^^)vo{lPꊓc{auz}bf?1*BR_DQjсTbVdZ"IĎi2"0I_ zفx/r>#*'F̪!ZEx`!xI|b)yK]$]#l ϒMSq#(/gx75LNiq>Ҷs5⽦#J2Ŭ)sэCLPApRԝ.k4>'?>*9]r0QW%=fvh9\T:^ݻZmq~ rjrMɍ(];>Dv>^Z7XqPDRQZgyIlK:ѥb/fJ%"u(KbD$bePb=Z 12iӂ)3`b x B`t ]r+wne6Ӎ+ȭ;wxٌ}$o99Y0 y.)sEQ!4اXvdt#[Ʊ9O$- d9ށV(XkYNguhgmʜA)* @i7hmRo;0(t3,,JƧ{zӢ䓟xn1R(VK2,KDJk3OiL^!#Y&e)!u3@k D2 ]˾QRL3f3u/ z>b 045v@):;baZ=~6Y6z:7nd08GUoQ\nF|bYp!2s`ԥ2 1ybVen{E=uSYs`m?uyQPC2т2(s 1+5-΁< N]|!K x/Y_.dQꍛa@XO ٦˟[ͭu6Vr!x% Mi"uaPI 6A0EI5DPDYɾi*i$35ˆݶe^P-1(.ηt0Ѧ 6Ցlw?=zo~<||57[^{nqq>5#1C<9{+/ݡl@) :1y2C\`Q|wߥCFgI'=&/خ.~ $Mu7Sxn~A{QʔEOӺ+3V՘вɵ令(% ES[ 73?+zh$K׀ ~]a%bJP"ȄEaJe\W+\F%">S]G5^dR|'q]+T$MZq;K3+ >8 b]2G+ĕQёk e6 Y%z$& 2MDk2aMY_YD\fj@j^Chchi֒wor;4t~t}.v<^=MTh݃ {R%P2[KHݾg^# qM!ˬ.<6XT,sig&)2RJ "-dZ}ۧ鸑D޶t8FHA]sDpF fݲo"~`i:È@A2>]R璾߳64P>Fp!nRaP)ZeۑUDĥ}bH!R ~daVTuU]3aZm.s9Б2TAD bLr ;|bgt4ͦ%ӆ7oo} Q*En89އHf{}tO!r֌Oܻq̎\⃧|ba ݎBDJ-xmf5ٱiG1qF2 G "%aD bqH7:YV_"c @NsӴTZ\@C?b]"eGO!f1+(C)"!#1ZQd"Yq֒i=ubk$RjvCqÀ!E^bF^~>?b'aN9332 na$/]s6yTBsϨA$&RfJ2 "d /QFt?S%UG"VԳuUB2 )86&INeSmqnzI],Hn R2>\o9$Ms\02ZiG;2ZIӆU| h֦9Dvz}M5ȯsf/r=81:C v˭u\#hɌ ;>1daP= dun q' iX7"H2[. >->hz&yv솆˦I֦FkEY"eLYnyV`TzTUɾiRN}zGK I2]7 $8 27c,*9)w1.ݳ'VQ1$ xlFhĘJcw$ޣbpQrFEr##zy"6:GH;8.VM|4%/Ɋ -#aVf0ZG88Ss9GQ,I.LA]i#*)$JL0YEOf4%ˬ(ڶME% AY䥠,&f Y=Ʀ{8M;o{mKY(0HǑHYΦɥO|7e.CH8 HVe%]˃Ⱥx7_{ ߌ잮xq4##o3-2Dnb<9Jqzp'g=N +o[3>OYP7m փu1-O)I[ݔk1 |G!Bڑ+6 #KLaxtbV9Qptu MLMSd-þI$:((9(tqqW̘-4(f6|mֻ(5|A1ѧ1Y'蚠{B (C*ĘҰʪ$+LH:Bc4ʤ{SLK&4GIe4DOn zM&J7pELғH:0AutÈ4ki` (H,΍뚢,hf Z(K8]0=W^ 痗@e Mbhn1eËsHG7wcעc4O,ˉ1Jn?/HďWqm"^@>/8Wk?# {dYi y 9ɏ"h&m8$sh$ϲԪѦ޼Rw6Kf6=MJ0W͸9<՗_ݬn.hO|3|sor( 0՟YΞ>Scqt@Fη[,z泂۷oϽGg#KS[kI'C °<:9OM#,JʲdL/ cTFY6骕d#,Pԙ%jJp.LLv)o}Hqط-8p|`y0gyIw캖`Fg{,@]h2 Ix;H:4ڷQEtx+N6ɋ}h=M!I|1TSʋi6Ndeg-u`zL 5.8ut Ӆ+HTh8vMCu)2u.B J2Ec}sL](13:YiReC 1LOd4BHD>ѱݶh3c"eO\1U9݌Cۮ`IYa@ R6f`ξkSȘh8JL(-8s8g%Vֻe֥~ޡIE_Hg~`?$PG&?΄,xC\bīSquxZ5_L+UB۵k/LWx^?}&d1EئBkIiaNj%ѹydmS>xF7Lܦ"Lrt@ߍEԚvK?F\oSG+*Id#zJLDH)65YVoW).8|HSs2vvt%U^cݎ~O{wS쫊cG=Q/s6:!ʌqh6kc>Wns(XG\"y6|HQm7pе#EU3ϑBC␧+ۆ%KbHN}?PU5 QRQ3ʲd^M gA0to%/l=ۦe0:jcH醎ݾm@44% ]:F+h-89=AiM8bdJB۵R\D6ɊadD{)g%wݙmqĔ}O(gYVJZ0F3-yz~ yɍ[wx䜶8u9J22nO]=8iݬӄ{|V2UdL{a2+2c膖ãcfO]0!`qtm:.zm*Jq6).SF]_īUATԄO E⚒TXhTc}ǘΠgYdx`Z4%BxBt)tb(L.xdEJk]=]giw{f3ϧd%Yf{jǶ6 ?/۷mZm}~wbޱ5oW|x툅s{#9A%Kw88{rA׵L'&D(+h)l$ĻɋBHH=1<3a1⬣4=F")i)cbLԱTFn% ^mߥw)SDvmKÀzCYdp9L8XTˌyE]d8:y޻ښ]\mcccID(B%Hq YHL1C  1@Q2`NB` ;mwWwW{>TCDTj/}}4gBQ\/@eQ5%rx/0lEմX;ޱĸd;Ut:seMoX6tb!w'$Uqn,+\Q \P U.1p?QkHI?Wĸّ\ 9}5yCbV+8_Ud9C,KZKߏTp֣|w(1.r缬2W/̘2D.B.д{Z?uYCцnquًgܜO|żj/:# !'vlHs [j`ZFbXxpFBIv+rjƃW1'\u uJ̔MnU:-F6ZϼdbVlV#j2Zpޣ223 sXq &ڶY⑳&0 58 _o͗]KHe Tp>N,ʮ7!Hh_o[ck-J ~XU"T\w;vmɥf!LNE%)aʧLL WmBJoLAi /ĚV2elR[W~C0́q^㉋k^<Ro5Xg9gL䂫+㈫kB6\o w߼(*v_~Ka$BS5|W|śj4,oމ<_2wcX\~`G+̃qCW~pQw+/hyz?WJZG Ln?BGAvkP W͟N$ې?K|^aqN|OmcYԇhcgb3M!NpZއmK:)S{8<=6UBc(y oR k-󤴊bqn2[Y]a]0G?M'f/vԴb76|wźFjJx ^e*h䀖@x{5!-W5N1"dY"Nľa%#,ԩ vgXT)̣ k8gߵbGyT:dYMݠ2Ę!)"m`(!̅533!$ 4,3zpv|kqh#uo]dk`e(!0P4E'g-GB\t侦ie]2E.@,mE*Tsu4MHu4cY'fK¼8],]!Ϯ78sFk5l4dA3~+ܞ;'ĺ ~IM[ -tŪU a'Q,K "m^+DqϾ_?/ J;v 4cdx2#EלƀRf]"uC) 2Ma\F0,kdMei8# Q [+}*Q039J}ι #>wbQpnSt˨(%, kXQ7rQT@."O W0;޽2e{P~ϺZ^7[,u[4eqIlIZ_)/^=yBh̸Xhƙ2GZyY!}XUxBc [~'E=o޾x:1 _79#EY>zrv'HV\%*HIZvx9CΏݬ$W~ብfS[~hmxJca*_cQC2J?ȣb{x?ڞ>=|<*"sR~'tC@Wf#.Ђq .E~\xu2(%-MCx:$Csf (ҿ.N*x_b8LK$)?~Eueó~R LTTUKUI%2Oӆ$b\)ӗ|m4331Gy`q9 E̅?gWxKB(Wq{|]?l8pZ޾{CS\TZ\a T׮nkJ c\Kr'7obmj$Byy9#Ffzvo޿!)2N,"%qfox⚗/3+W[Ae#.ߠدvkC֊Kr|obsO?N}{~ȚqM0X4,K."߯5]{ISyaYqP׵,=ĕu5ϣZ~8s:81F=<ږmXRxVm,4Rŋ產Ǒf{'bFY'Oڍc-G!N3aB$:;4@%|{_2LBش^u%RmCۼ:*X@.i>< gWϸ<4|9]Gʒ9{ORB\Fe*.;].[RWFFYXǙîaYbU?Wy *A7mqe]=yph74OB[9v /qD^JH3Lbӂ74hpFaJ *źD0U'S) 1e(IJ],lj7e|SƘIkqFfhGL b5yJ;O<ѫ뚺%0qy^(!Ӳ.ƮAW9 bY 2䔨lE)p:_0(ò$x{xs3p?Lk5oN$żi5f${H6r!k5D :si6[WY5U`SRN(#(44 F1myE,|B{{/[ e4% mͧ`xM xqxWO#ӼR{|xK,o%s@9ɰ%LXмèoF㈼a鸿#Vq`Xo߃6\?ŴD֜*' qZó t>$)񙓯x$2?'B,)嫃bꎽK̑2 E)>x?@3FRi3(VE^V"ȴ,[ ,pfXЈH?aY 4^ vmEJk |WV4s{RݻNga #DL]6z9J!tަ;'.,a۷.`a`ڊ>BHD+_=ڊ]BK3uL.(0ȩcƢi6qr8'b\9t LQE,cΐJbϲvtuvxTqQp1k3,kx偫g8/U] jVh U6þ0Z+C㽥k[AX<{4:YżJAFqw,B+l)Y:K(|qm2s_٬ѥYxpNHVTNxcɹq#?/^ gmþmu1!@])Tj>ٍ6RH垮kXW)I|ab\g)ZJ۵\^(EIAKK7ss:0}ZV`!]+[A!$0ΈMQQII=I?!FrRĔ#ܼ?]8yYgq=LL<.x#󺩶כ=qiۆkXRS2qB{:ӵfg%L*Ng k^(sXEP#9B xo8\^4\_W/_ t]h{qbM~dW+vV}bZ&)./:ÖlVᬥ28Z :YaW㌔ŝm"F[t.R44Yxk)B~6u834Ɋ*"b m+RcαU zmM*J8x,Z#,i?.ĜfMe U[1dY Pصџ{lL>cXHx:SDX#+c+ IDATV܄R &̅-~ڮaq`]wgr<2Hd9PDm ވl|1O2׍cg..m[bÞ?g4o/3EB)(1oϼ{wVƠ ՚gϞ1o*" ٵ;TxKbi hEc qMSK|X!7s)#^SiCɒ1UЮ܇Q86kB{B+*z5@?r@2{kѱH`_YW,aBԄr{sKx9fVi*cQΰDE4x_gR^-E.XM,Sߣ Ӯq .p:\|yٙ9<^7_r{wh@;š)z+\3C:X]x ^1}<? ?t-ب>tNX >Q_>=ǿ(H%4e#X7ri+K\| f`i?q~7/oBePp~)esT0GGRδ! K O3Q~XHyy,}x|X} }9'hz:8|@姟I 0#]ǘ肮+⦆vm#ZZkiBW([Gg%"cXc IeQJA!ľ_1/ַ6{+Q B߾nl9N_#A5Lx*Z. VҪ6ze=FYAN0⼧G5߉[ JN4]4N얰C`fJ)"4t]҆^=htnװ,Q>bk(]B{"k*okJʬ袘LЉnƑ;L!FM?E41ݮ,#/]+citFew-% 긱Е4r8ginGθJSU5o߾% `K]V\ZN,ˈ3cCG/_p<ݠfnwPŮ#/L+ynX޷oz~g~4wĂXwLXgXӄ?q&a 4́0MOz<\=D++J@DZ#'NKXT\/ Qkѽ_Ӵ]"TpEa]~@iPVhqU혦k Zח5i UhjK1ZJeƞX%+W<6bu;*|xeC$RXekǡ9H^VE(۶%@Y<Ɓ1,)ZԏX]*CD<㼣E%ϮQ7q {@Ve]1p{`ʫ1Zs<Xk?5ph/_M7[(:\7?';{.j˚ 5Dɑ_rL/^>pwKJN^2)uuԓltRRJeho-1 9440QU-:)ReP$a&iCm (hچ{ + ar^ 4k8%K֌N!a Vk+x"\}]FҪל "/_2N9LX-rrM5]0L 9syCU-le[$y۴T(ڊqd֓ 5ઊ8rmD A`JyPRxbl$Qʰu>w_n>:_0o~u~SgO_e~ _f>Ϳ8oң9TvZ?g?3\ԉ_w/?s7ƕa|_T ? ?Q=E,L1>e=?^~%ǿP7YO9,T>*T,T]J}RUk>|}s#Nԕ'VrH8kpFH{JA]7)A4HI#^)*gw;Ma$n90u]煸HRg21NA:ihrqɱB7ɵꒂF[K'8BBLjFB?e;Kp>L=h1ka'Ȯd he;ҶYeTU3N6_Ѷd[!JF(M]5R0gBrҖ J,SIF;^x87h_)=`8* 8DGvm:,?HP{\2g`ϔ9ޜPG)XYQAC+˾uH%rwa"NYڮjtj,1@88/ҵ;TLyK&S55RPqk>/ן=g\μcLmrDJY1R =}/ҳ©4ڊu|v5:18*_??W?;_O,|I?c_ϱ?#?SsD 9}ww_}g~s%? o_><_+ ?g_ ~w3W/M|s_|1Jpl-~͖|sOC%G<旼 'knuGU lQsVu$`3Xۙbf׶5 ҂4hW 9vTMK2́}ss8@? #uˣG~zJ21XSZ9R`hFzB\^_blCገ(mƙqu5UlaXy2iF.S)%$UYٶ˴^d{<,D3Z[)ep(A9SYw}ͱ(Bz<1+>L^X.se9^hI9%&TVוz@ X%Ļ1 #eeiW%1#>q4Op? F:HDCVT4a! 8F 48k)KzhF]bfq-fIXk) k5v<ŘHQR }/ 7חrhDm|˼ۼ=XRZ~r!dLj 2 [X'd(I(4cҽ5"Xrv8SJEڊXmݰ.^9==x%)R[fYZd&<}敳5Ub0g./.'ObٖӓG82 GN6+y҆i8? ĺi6Be։J+ify1'O&P9N *@H)RgÈ)+g1+•14H\zbd?'nBpf!am\]]b^1)d!98ԫF'S~gzzeJJg^c~a"qZK= %bX7k1S8ɃP ;O|\#mY# ʬ3K_>ط!HNP*c4dKٔ [YQB`bÌnB ]7Ro73eapGqt-R8^p)%^ZKrQ`uAYXvBK]!rF9Cz1k|y4.r6dxG\)8QC$L7d-EB[욖ʒ‰C6uu=; ޢQh/"7/w4U\+_g'2jW~gO}[?CEy1ye.39$}_gQ96'x'7g@)ړ?]|x1OhS(yN|#~4\Q~"XaCE7Y|{ݏ;|=B߃|/}J6^*ߑN-M00f϶T-k1@+GTpU%]mEJH#s(,JbM{7{|Wancb*TUCGgXKx4iꚶsN+WCڶ> rʓѽliV\n=>xJ$~adGqn(3 Vq_#a9~ǁW?[ s3~!PFqbчTw`g⓿Ua_\s IDAT@?nQ2JibL.1qnV%i759Z0Z^HYVwy!k>2pIN4z7L Kyi&434冔#^-ӕ2'tqKDcBh Lbb0ςkUJC2ǂ4VhE TcGbYfHD4m#MY;aWһo0eA?t-N~"ҫc4lS?aT*j]1eLz rQ??Q;j,G~O'h[пo_yrZ-~ >x&J8ȴV`gPK#)ei~2 ko7ĩR72֓?5%t/$d!$ڇK~ V0l0miㅾ%kKrm7;^R/>|Z$+ey||Cm4UϏ3q\( >2!x5*S>;è.,W\__nZʠ)UQ\< ⲑ(+&ϔeETZmN.)P2OwaE`sXKY"nw*Vf4 &m[* a"Bp䥧w:4rJi&ECRlzG[y"DMeMV s&́q|ݧ\sz~j̘B\!ɔNs}y )q~Vb8O#:DžT(]Ci W65OݮǶ|*k Ae>]Hwso|)>{F-)K ^ƫS9fW>D-+ηQL`9J)}ĚMcJMN> Bp\<xO((Jկp}s"1c \b,4u\!LSTLI`:eG.P(ͷ z+8 Vaw1E[[dYn8uMQƞ* Eҧ/F}bi)KwZQ%!NhI~Юj|ڝ\6X3XDAk?GGj-\Q*ֱl|&~1d_z]mN q @]Lb?6u%gCY%1 =JQ-Qen0{H9Q16aLf=x~)TIi:?8y0Rd#gv 1 e +q`V.dL $[Ġl+ՔuKNS 8䁸jW՞ĪbL 0P=q&LVigqT*2Տn<|5}!<>G-E8(mPVgJRӓ4-rF]Zrigϟ_2YKR-~pEM{0Z IX%nSm49Τ0pvGmedPn{.oM7f" oք9ru}ęBrh k%ei6Ǹ"л($aU-{v릡,J70N mPoP, JV}7eUEaX_~eje%cu1fpl܂Q)a1AkEY9U@rLUR% ccXFoY6 "(Cʙl-F%Oxzu!%Vp}1Nrv\ Vnz-$EY;~L380_PCU%;KJ~__~Ksw"_z%Ɓ??,FŃA>{+Xw}_7C9sw4C~?Wz@Ǚ0G>#ߏ}k;WXrn|g|WDw}morxl@/ޝ]~uz1ޫ^ڨ^d^l`=/z钑?y߾a]Ll T*&?Q0Ld*%fvu]puU1_שK˱;PhR.*e> I:e鎢vdDBK533<✣*=/Z\<T6b !az.S -Nqy]XW6 , <7"乻\ qW$liZy K6>^8(]S7) ͳ`]˪hCw{/D,i)R\\*Q ry *I)Z<|,%oo(˺&BH5upuu;$&5F;t||1fշg{>яCHI0J3N8nJ(b\u@J1>Z!)ƘQ|X$zsd4ש}wV^dɆݶaK?V^ `HWW$!e1rsՉ}1ijRT>Jb*9^)-l-_Y{hZEQ*mC~<0)x 02FbL ܦdi9Q@~ڂәCqzi±?X(A)K*R4S~paZ.dБ>7> "NB癛}0p8>Od zELaLLS? (M5%0bLiXi '晄gmIdVTʌ'W䤰U1Ϟ1Ma IB3g̃g&%MUU\]g';7uM3UU5I#jqҙC 래- Iqu8Cqdgȣ'.b=/ӝEv  rt@V*8_4H ojњQ±_R vpnCՖr"`tBU]s\2i !`b,'(OJR\W\^^dr)ӄL9}xJ[o$DŽS8RZG\܀UQ5XV8rOg\y7$WE=?V\qwwUu?-&ۂrV(BH U h9IJk12NKiKOYQla"3`T"t疸c0fHH3(6BQKHdK9˶-Ov~OjBAbR&~r/ێ%ϡ@P/_,^j J^ގ{5u)MzK=)h/G?iWk~+7~X5>~Y0h8CQ*CY ģ^:!΢22ЇŜ]R a->ʦ|i> ^)nlDie,syy+ "pGTE;ȡJݑ(hA9}G)9ԔQ^rΒO4:_~1֒2ל7Ғu`'Ĕm(=g%&(#%y k3UCi135ZwY@[aU=ϋpw•V138G 5(kY`Hdd 90[=F%E B<0Oh㰮F~R`z 4mMaKn541 eY10z0y򋼷Z _t;w)m例DTajr^ ɦq"G)eha< x%x$dEN0a`lfSrysTl)* h!fIz!rzz;=JѬ>S^I߽ƆGvgZB nM$VanAω㱣(1_2C?P-4/pqx>Rtf;Z%iZiiqhk M+1=iiX7y,i+Ȍ(C8:fZa9tI*k= Ʈgz65 Nzۚiid7+*JҝpYpg]7<~?v?ym臞f%7AYJr75)V2ڀr&bͼxq&Tuͪm{h2ee9? s}}E[)g c k"mb ^8Wkz$}qZO|cX{WZ1b)hM?B A#k2V )DUdM71\&9b P1ˁ>B]sJ"R2YEw?9%GbZe!a̳<M=FfU|`u(UKL4KY])h牺^aGѥy߃L?!:E8;@8wt"ﻸ)~kD1&%7:xRu_y긷>#{/k/VMXꎌuB|'+ uL79r;'}>J8ԫ9x,Y!4uy"NPKd\2h%SYr&y0ڠju3UҴ-EqOeb*J9b Gj1R65>!U*XŔJu`녊qeI ƉytH6SW0}\zE!(r)p}bjL&yJiI0B=҃<9g #[KGYhyp>vN]|Jӷ0VQTBG3J'Qz up:KO *X ~Z䏑~.g9,N (%o^ "3V5Fv*-yLOV[PRU4 leCr{* IjBL4uK}{6 R50p8qzOӬ!DYwUDGlqf=NI -kښ^{#M+ ӽ \mEipSҮ7qdZ=)8n EXmJ"Nq%! *,y%5@&' ɜlk"]<|aՔq{-NVlO*Oa* D#&$a;_ml5_lζ9ơ*+ɓS`hCB P1F~qN7́'BVuq0q&ZZ8{p<{R,Ua~bF4q;ϙ,+>1+xR<8?CpN> 3O=ϯӬJ’sXd]WH)]&@M\zB[``]j vfD4q8᪒5EYX#/ 22y/"Y%)QWXS4uMΑ<kms^&K" N)|I!d4Ei 'ʔ]D QUE)9Hw cIK=tw REd#n˴UYS>.d(. IV\\]ݞrpLN(LiH:x.CRV6q/%>&UF--|(Ҥ{@ IDAT}{LzO g^"RRujK}wIз{uwwU[tɶ|o)ۘ>K){׌wܱ3ygWg$eVl7;byBxNGrT5MLZC%ZS"%E?zP4ӔTAnng~HYSfL>puuDŽaآiW 'g0Pllkl!n&-(RRY)km9ccMFb ZA882MA^?J<&Y`Ǯ8[Jv'{]5Te ,4Ms WmWWPb-V"&<f%l ! uBXZI>,g.pN-E\^[~PSfޠr Bx]!}k!͜lY: Grʤ seei 8/E :!3OE I+XI)s=u%Hc 1(]s~vVjMQB:^U̜uUM۬l֤%7Ej07#4e{f}rnEA>ga ( M#T/2}YEp)1Kǁcd2yTI1}>h%Pc 16 L1QBSs\.FOJapNJ~FT\XZ=Fk S3D/yʒYL0 3وA^bP'ou1v';li)Bl2t@֊0r=s9ʂ9Dy}Bm5s M-q%mht)Vz[{y-aiP]&xQVw{L|]߻u]9'aՋ?wE[j+!o~~EJ}hr\d{l,P܃ u}; {.4f03ΙY%N՞fp8Ǜny@83t3>QXQůM]JC7"EMʚQu]g& !DL!@VLG)`ǯ⧙8r8e uUr0Zǎ.0o9nZ{/1@g'nd<GeM8g{<=7ͼP XPj Vl[ >@~>߀-4l@j UUY7 g|GqY+;B07s7;vxSV%$!s uuPt] 9 f]eY2Mǧ..0EB2M.,n~&2UiEKy VE ̋x, ZiK<[J%u5&Aq"Q*_e) h7WF/R/(Y`TLĴ,x@b ~(>pU,j6{O!lPsqy9uz.2tI1Dp:Xim[r<Bb P䓂:ρBdtgG^Q`1@Qd*ZJzmŔ%:aPڬ\2Dj5tѯ&8@|q1p\h-M\UV]M 󌐒$ݦJH)ְ+4,!\&b,Wu)MϳדgzjA|ipeR/ۋ_BJZgXsIDzAI1~cygYjNRՏ|"I93"9=_M>|`<iGDZ_Ⱦ%ϲBi'lf[{~3[b,zJUؐBakhUeg4fpYR<8 ۡ26uRc|yND$ؐ@\垦 kB!bvqM~& ̘s?0B+vf4\!Fˌy2Nӄ֚''JSq>OծH\Sc;$[Iz L ø0Ni\0Y Bp<2(`lpn7@jsk=vX!am6*)iۖs9('@L cJ&眨L& >b} QU5!:6fϩSTuJ3B Yi#vo?s~{hAdaL2o{#<\]mV* ] \E.GUE]`v2LHmJe^HY a\80F% j `f""EzJD~ !P%MU66mAhEU7TM6X;FrInT  |3( .!R! ZZךvɝ1Dex:,%&Onr;F?׸?1LSUaO1}~ud$R@,z<WDZX: >RJHsȈ;ͳΓl"A#R k6:)_3+MSnhq1ǯt+iGH hJJm 8I'idBP>2[TBJ s~}L="lqbf_ksgf=כzWR%/6/MˆF|`B< _d`_~1vʆyކ$|6/gRȟ{ulͬx-"})ct3M,Bm[BSe)kfCajkv͆Mmte7w$yH۴{ Ѵu]3,#)TiHk!&7R5YvR%Mݬ,4F\dqŹ4ϹARq?`2o `=IQq'K&bIBR2-31EHig'duEJy H-y:>DPMլӬ}/#Zj6e+efKU0cDi i+zlm7ǚaF>#_Yr'~I6K2HݔTe˄_1dRePWmkmסV41 CO[Uj/:ocl6X>taP0nidFɜ|u{sOk@ PgG9Q(˴*aBJ2s&EOa`mǞ-8UDʒith]Q芾>!­ 84J,6@y*uR"QCX,mÙ0s}m 톮k ]Zѵ&x9G|Ħk~ç'q QtM~lRCWWg:4MIהn'29!JQR$O5>ӿXwRk>cAME ǧi8XlO\"MD-RiD IT(y{wjAնm+ȁ6r\qs}C5tmnK]WL4|JɻGRQbC=>0b|󥧮+B,D&˹JDIyFDS5 s<MMuEZҦ2xzlbHkA^PZ ԫ8gXlN_10-#s~u V䋍'wk9YFC^60$u +;f#j}"Ñ2[SB<3> !vq2_D O9;9T$ Ee@d[1ҶmF,*ô87?1 \u1%dӸRCZ/ cJ;|6K\H8[h65IѢ ŮH@Ew@hUDQ  g|Z/%X[^2Bx@gmp|Wk69^x/x ;!xA?0/6/ |||VWW-u^_gy\b"^s=z |}|/mx ~؞o՟bh_.H0 =82=/9sG^ vm.S`\G0:LGS$.w# -Ei2R$@ݮ&GA  ,}zBl[eBHeM!"H<>2(]fRy$s9{]8L4MÇ\]m 1RKeDm|~Mv1u&EuØI`H#h)5m`$wwsTzpQh2srVkg*m7k@㌝˶;yqK`)`ҔuR^bjv2qط2Aֲ@IM]/ $ނY$UUe0J)&q}Bg5xB1Eɚwy4 ! a eɦ|W,+ ,2`Y<私&pC}Ge2iUT6;.OOOB DO > gzei?r'!W,LY (IZK?΄px"ʒ*"%y~MKY>E~/4Fg$O9/]J 1DyF$r*b#8]2 Y{s yf=FaŴIvٌ|0p>71&urɲ rx k[bL׷Q,:Gq\Uo+J+DŹLu"̍Tu1 WA$/_)%BJY[(Y$)Jj!>4ҔBץOR4vac2 y""HUut< T"K^ZP,ȍH? xypeYI!F3Qqk)s&3)fgjQ,yVG%HĺBuZņdJgWEWaw7'KDvf kK値u(e+Iz1?]}+g?Azy!Pk®L8FQj1ey۫7o)|~Bk0]8Ol-W;%@Yb18,X') ij)sR|I)H]死6(Ufx9궢%,a5$$1~8hCn3p1nk6 J*dW?c| 虦Z?/Q$UYeGUMK]bxo*giq}lݯ21qs**{ڢe`gmzư\hOk+BʁmE%݇3 4 LmK\/i)e .@L0L&w&o}b fKٰX|jSP?PUKXDf6tFٴ-UiPJ7ƿ) O'~@{`80ryLĻG2gxM" =9XOx*#n4}7_q>=R(dw|xtBҟϘt9gsMY .p:H)d~clhMu mn/'nf(2ژqa !F:`He(e &I(+xz@fiQ?9)!7'>|zĮi8Gtm""SDž@YiE}Cꀩ%̋E S5|x9x3M m2/9i FgoQ1_- IDATCĆ`9@`68QV 8gu-MSmϗT8/ϵJ694dY"(ʶCG8|xdZ׵"r_+&5笆\| e5SG>G״톧 La8[YBR8Ĕqur s6K%ד˜BW̓.~sz.Y0O#XfHs?2}<,Ǚ{)4yF|iz ( ).ie4Jj 6LQ6 >^Y1ִ2Ob2;gu]\PB3N99$47ZfG 1>$^ea|~qM̘ZOzOA19JB&y%p, !ɬ]L0j, 2gm3v4mü,y+ܚ;)Y6BCn^̚y隆msTUm6@ǜVyfgɍRËEBW+R>&㬿?W<6^{+s_`Ue]B|A4Pp) 4%XGxѫKړ>f/\U\ CŲ5O~T&&܈L ~DMODg1*C:JƑ-ۮez`XL?tۆ|V%BG|;]Iw |H_,!';'O0<Ӈ,qEΏs4 BYYR5Б3ij5RpDρ)%ckzɷ~ۯXr̫A-1L¦2x}#1=JVg 4rrfFb uk8'e0ln:b wTE<9k*?O9v6h%l;׻܄ I1QUm8By̛:L# 1<<L_\wP,2gΧ'> &*_!^@5/%R;fKOc΋p60͖yO=1xnZ*# LhIѓBĭL+<`LXU)n)J06t۰? Gpx*a2|D?8X; !.0<qeӶc*(wM. ߇wcJOsOL!LV]1)ѲȹÙ.OKH*MDQB|l&{"ꪡ( ~d&~'%iwD"Ux| ƔxGvR=.1MD钧 ,8IntYޞFLYSS|̌3I(.zq\l3e&$_|JHl6) [(MFŅa$L(B0E]3 >pF$i:ʥ@h%naYFHB Bh>oOۜ5];{n 1S7sY %zKY6-vILi ͦasձ658btALiALݾډGAi}ĹH4l.IP(M]xgn[BEV9&ǐc eM+`=8Y)h7-M0LRM}Hp88#u4Bkia!x+1d*>4fY:IgbF6-u]`혯9J`>!UF_g+9yzۯl7x]3@Y*х  ]ILSf6Мdr>h] ,s`Yj'@!Bh1EovM!&o0Ev*Srw{MӔoef6tM[Fx;Ӷ%}xXix)e9[rf\?-n%*[Cqӧ{N i\TuHrH_U ɾ΢(RKS˷nVhl7 mKT8d¬R"QTeVHBx[kamUe 3[P5Z 2{=C2sp"8O~]g'02mיxbO(f>'`X緟|QB~ݮnJ=l^x cnUŶ6Q߼૯o ~w4Zלa@<>k6B+H4YOyոXn7iMtۖ|?-iJΗyt݆,EHdf{2}7Ob/<>=]`绿8cNDV239]ݑ"ˉk1Ek5Zçp]LsDe +,dç{d2b'DV8(0:O۪ƇG[FT%0wϩ~_z~ӟ+-xB,Oy$S- >pd=#ׇ+Zlk,%B'ND Sر:TBS݉bAARWgssSH?33v8\Sܼ߳iއ ѺUB ʶA In=1O"D?>=di8? I.gtsRNJ|Kb/25{sBBHHQP~͏]QsrWi})+2:HIfW#K O{ϑF!H-kO\96!~^1R$Ұ9XI$2ӫ!}C|HO|^^6NTKDxF-uj/DƼ 8ez]Į0EMSJ?L#Z\-.qaYb!FEAE]t$uTO+)pU46&tX/x<]DF~l! vrT>,+S@ShrVK4<]F h@8%qX$3IӴ$e i T,Z0x ˔x=*>QwU8qmFv)N%_ߠ4H3WLc~Ke4UFK8DmJd욚~qLwwTHّJ$?"Bt\_@]ÉްSaQ%+1_,Hn臉s| P/Ֆe$0g tm K7a]@)vY=B>~3޼´L4zF(q?‡:DlȦ pG[ O? m!$nB@i@| qOMyՑ4 QdHϲx&>_ՁCxB6 ,˂% 7I(~o޽9;3 3M{O,fw_}fK! 64~d[lF3c?h ,I='x:$z&@C]PyG F 8L,6=)搿€ߧK-;7-: tzS!ӌ]bRSbÈW-Y8]>oh 0#ۛn?GijBߟsv1pׂpD7]_2mP1]?Oyw1w\m*>|xbw2Y@1D%.'S#Wm^y8F1;d<S $o1R*m6@Dnox||yAp BkI!4 7WɁ|jCUi.sؕLHY$7yo#Y}sz}%g3ሄ Y@MȖ l0x`Y&IICrF}}52rnVUVćʇDf͌Q(Zҿn/Ȑ8~4H9׳HvJ5Aty% ;X|~oWk$-8:SגWs!^}AsĮz|=xS@tl8wV&+ H^aGxLg=2)X%KN@UxakluEN-Ф"+HDFRXM *k'o5,%R>1aZYgh[hµ qU]8^{f#qF(fqckpt4Sac4$ɖ8,$E#{"og1T+=2N&5L`]: YnI>2Y%kYCMhm4ldmu"J<7d.h MxaYMslOP(cqrИ/2 p:dluU BqY/s&k4є7ͪ2A ((rU !yk\}CS\׃j=?@uPKE?%X2NGܢȊp]^x}˘Oi: t$j %'E`{t<X %I\`sEFܼ}QddZS5M-dئ?|P ES6aXkKī?fr|ŭKMmF Ŝ+8XS^*ΈWӹza t(jA-%G?`:"wZM\s:9EU i"Mc\0;Yg1RPū9LX&mг-SXK7U#to-J`J  2Nf"V Z IDAT( atA6cb KTYcUUrekhl$KK ݨ5iʺ KWNk9A3-HiX b HҔ"Q :ASZi،#vw.0i/~joo': "`m~-J+˜Czmg=ΩՋ.gJJ#ϕSҕxRg3/ʟ=}l%m_Ĺ5nd,gS4<=%l60]<+xF.Az0j2PlY-W ] gL1Ktc jȪs}^a=[`W7~~-89<Ӌ쎘/+,3]VqlILo/zaW>>~$x1ܣ +4=ƶm !G;qZ4 YxN#EKZҌViu- JY3NMC}ƳP4;+KtaJHKj%]7),JQh>>j;@h}\+0 T_e>N5Ƀooj|.3lZB=;t]O5{}e@90#n u~_^OopC)0݀37M^ڋ@ 6B9@K,+^HF=q,qFk9~8uE9~πJ!Q|h-q,>O$OҒ˛[-,&yݐ \&IAwa7o?ﱵ:M99rt0=<ϡ,K0r `\~5nߺrCbp8Bru{;NQ 2uFɚ4c-ӄ,͘5vN9aQe#EW*m2Ҥ.n>C7p E:%'|>Ƴl ! /Z56IˊY'w(G.lLkZQ Ic 鄤ih脶dB' CtY ES ]5|#Vth̦k?6ؽMeRVȴtFzW6W VLOqu%NI:-Sx6Gw\letWMض MS,ˤi>Y"EHЍZKak8W^o3]$N7mXG14EIۅL*Zc4piE\%q|,Nh-B40M-~6U#*I蚉L`^K'ZLtnS%'G$qc;Xεkhɒ"RC0cdUk‘dyNt2Khʔ^ihLV3LK譔0_-1mUBS5}eC6qXg% |.^w[WJvvhdB6Ae"p6@q\.҈ AbwgVL{&gr?rv[;L s㵗;ۤ˄00LUw<9Ps\$ٮ"RCM^UԆF`\|e̎aBӡnZE%\F W^2-e:@iHlcpr:%+6˭魌0h )jJ 3S[85+ELA(jYIF)3ѓI ju\~f+OO-OD^\s*zito|񖂶|M~z[?W[_ۇZyRsٕU7]Z] o:71Θu!??e~(/"==z?VE`= 7*٩:ڹBzv>ڹR8w,; ճ8Xi"̖bL9Ap><244!Rrpxȿ׸'IEBӴFi(2X,c4Dk;x&]l@G IE')ɓ5RH:Qth*ϰ52DTt؆&M#! IXFϏ > lllcY.QUu#k w{yR|E{%a>;i5M}YS`sq،Gd͍VۃQ+7lf%EQ^Dkc4gP62fE$+?zH2-^Rxa@$qJuˊA'0p\Y9Y\:/s=O8~D*Lh:>MqtxJ5Kܻy`@<_5;!JQl #Ղ2&8tlYf9UՔEʕ Ilz]{r4L)v2ل(t=av,ߵ83._ѓy[ЁA,$qL `sG3&p\$O lͭN9賷 Sٰ S5]1yHrFCS8<.Ld/ﰽg0 lvCG{&')rar0]a.t4[.iъ|۠KnW%i;?zW.!aǦnJcz!lL2\LE<˶ V4l&Zo]De,W[CdzsM)LELj&2 J8a6 k{;њ ]XTe:̦ǔuƀ*+y\`G>ˬ cL͠ % 7\"LݱDhѕ ;THG-Ql처Nq%$f6 2kaQ4 .N}d<0OCt;,Av*oD mj( ) 0t|So|4YuXWWdEn:((9deF!ﶹCuJiXǨ?sBrpK7.2U"DC۾t-L4mtaʚm7L<ϘebFY'6EhFqVZ Ln熠L)ȊQnXt:Q˽5 <Ūj Z$PuUW2cks,Ki@W_비Kv  Et qmVvF.4%ns.4 y1Ӂ`bn=zQ]wxMJf5Y{ 1O.r\<ʥm6]<'G.W/\ \\c<<&Obn=e9b>9bo#+:4\{:# a\wefwo liQq#~#'kz(89:aLf9qXF\A+JEIt睻'-RVYC^<||*)/2Әxdjq]dZAn6ʗȵW98rxalQ v?e>\,B|?[N!WuHߌ/|WeD -6_Å~5w5A7Zj^?ݛXs,>(4Em$_.ԗ? ?qc_:6!v90OAηEw΋. {P<j7ex`=_b/]ç|tI֖E^BkE0Leu)Tv˂,W M eQf%ْeɲUUjj#F4$YԕҾ\@V%8:9Q x=.^#^MoO4 e?:>*k!29*l0tװ c( ,C\ M[&*u,L44c4!d5_h:/ A]>nKlol2+W鏾N^Pa(89=jZj"[njz.tuvzJGsɳb,MLVB C$Mnt<ɒ5E#tC.J6$q%a`je/ŲbzB ~H%k4@:Wv3dg{d$8N8FUnXlo2 1ۛllDz=V5O̧s^~Glu1-Ucr`ç7pl6|͡O74Dl ;t.N (N3<.l-hps:a&]7hv,4d|B9t łu^p2] 4 00i#J1M9HLO4T趆n Lۤ7vDj%)k=\Ϡ,x.2<_2tM9E]ftB4'- &v5wXD)<0jt[k%g4n/Bʢ*(XzPW5/˚u1 2v;|:2W."^Eфd<#YĄ eEd .oD:6oҋ|Bǡۋ4EUV&3v.t #CMqII, [2ɥī*pNY5M0 %,w"l ؾ0dzze \66s$Bj_`UZy{?fAR\ήK=ʩ̰^tò1Kєx:] -4֕dk08iīeэ"yaa%P%iBU W-1,H["l Q4sL%g􊍍Q&mEt2Iװijmڌ=^yXAv{8EQL'X2?Y3R~Hٖګ$ L´4T]!\8 .(DH\g˺%t$/V}-H6O}/9/s_+7og/_)^6rqr%~%o#Fp ?ϧwg_#A/L{//,i IDAT~O\5w0]$Kg?Sܿl'\ ?Eo~/ l/ğ93hCgpΣpŹxxz?KU[>S%oc޽^0~UWXBR9Apuǧغo\B9 ~yЯ=ʲ"\P5 BHu)V MVrLOl,."?'XcӠc[TU{R7N ViE6 T%#ˊ^YSLk.j_ T'gfp ~kbm,'1K[lzL'8F;x'tC9/z|䥗ЫKT\Cج҄w?`d|^/0=ApD^5xfGncɆ&]8VXj-9UͰ-ӥ.J8 :+ozpL]I.^@d1ro|6IiRԒOLo󅏽a민7]F^ {;Ԫf6s]6 (idew<+\͋{67I߷@Dt YxД5F4Mk²t2'^-^Q 60 /ܶ*( Ighb7r2nr,;`JAI rp\ Q7DM)µmt55YnPv˸ERBCC;un=Eоz8<>p\?h,yG@3q\~.^ާ#ufC?OOl=kgBOٺWvO`)^)xYo\ Zٽ#ΕşO)ש*^|گhς`gQ,ֹᖟ> >Ɯ?EhTF+钍b؉8=Sn Y eb=?²l֫e z}ݝ :PWeJEqp<(huJJʲu-nǏ dޅ]1e9.k i4x2)c Sxa1$mlYJr3n,W̦sNOO[э|b>[D],9tiA]9:gsO\xl(ZCtx|8h46#5V'+<űL Y1x`^%P58#|lJDibA'lO8r^"ɰQwt:ln98Gh:ԸHiUƅaBIY4 ꫯoDp4>a0쑭~2&_>TUw=2iQbȔ|uf''4>|eڠRg9r.'G\v$Ug?I}Ǽw.ͭ!Sv*k0Bکea |}ŻZ+44 \fdsMb;KAyfh9c{.1:xUmLsZ|vA$DZQuנ 6,eeaEɚUU96g0Mz!eb:0MWTJ,aTaHSVeaټ<=Aip4"+ z>yFDaH$Et1g%hCy>iZ:>g XaM;Pd2=ҲlPJX4pt~a̗ N9mb:6$0N.>`ޣlnmJ>Nlonя-pp^=$)װ_S(@IW4#/ӧŌt|1b0%%u#Y-4MNjt9>6.R !FУ&Ϗ@$/Lp9X>G3I& EWiG4 q[opvqƓg8Lx9}1X+,CD.mTײ]Eh ߺNXܹTbzhcW1 {-i}M_b-v*q?|k7D $\\\ Y,yq2u,a ݚ<v ͎"Klz|z69l"ΦS[{hAt(tCFi R80b4HS,m._pzg->F/b<sƇVǓ^aH?Q M GMW6ΐ{?>Q"烛8?×OgG_,ompx:aZ1C;y)q捻|S. >')e?&mĥ/SG!ͯBQi5| H6z9@%E^q}w y)q4$I+(si~pc84Z88qDaXq"A*Ȫ΀F՜(Q,e |E1=`o5Kuc6APUuj0n jiXln CV45$&)qrb:r"HNܼ~ӰSʢ!*B1g:bIh9N #Fq'3 O[U( Eqt:eVd y)j*RP5Uˮ/?crzNyL+dQf-eZI-$!;BZt*cR&ZdDB;er~s"&g|;6\,۱ }( c\"pm]ݥ+1]%QNOhk|z2ɠ;?Ý- +%3E6 ZYd)uR5lE4I,(q'nѽ~nɗ/iko}~7|뛟96ۃw1n}uWIӜh2ڒN::%C(@՛W1}Zxa@Tduţю2M놽k'\,خU<<Χ3l/:%%q`{6i2s >wl8E4r8bW)UNH&3e5oRs .;eZ5U[F K͌Jnįx.%;x5_?1JYkyFdu/qiyg%._7M᥶O{3 /_wQ\jd=}=eїa |aZ,3E*EvHh[ o ;ehb8&ncESG8km'/'7 ZQh Zy#66piG`6+bǠuqm *)u[c8e`62V(JF>!1Hj)çd,az,q4*O\)5NhҢdkJ)(ñV,Ҋ))#~glmp'o~㗧et:Gv%lzGO\$[[ͯ%[rF2G,EV*)ɋp@^5dYl2[?_w|}n2]\;Du&/^wqɽ7(-XUO'+=|" 񂈢qO8 67gl36{[ ;ۛb:9!yz!{,&3"ϧ %t&eF͝1=Ow13_8¤_=]Gt%uGGzwn]%r~>awwWF >*~cNY}磻w8=| 5J6cXHA^6}7w6Rf޿B*Fsjh_@66lӋ#1 ð6e7??{gN8l ]l*Èئh,#ϋW!.mSc F qF8%UձXeeı-LC"GISUM<7|r*1f6[bUYEQC+zmXMV3bݫl89?%kr '.N V F!09o.C^I^KhĪjī"0Souט.C ;ڧKw}{/BWG_Í߫9SBއˆ}d˲7}+]W˗"'&o(Dmm@ˎYD&dicP68M[TDA R%Rؾ , [l$gӶ Ȗ?c>2DlL_<l6?g,{w 2zqΘϿ;`} IDAT`!@lF5p!Uɋ0) NLa:+7sDG;",8LQmM׶8wuMo7#v9|i{!+EA'v>_>|׹8?õm^}>>bllmws睲'OfL9OQ7A7LͺE  ⸇4M,CsE4MӱXYXْ$]\C( цl,0;\:"`k5Ws}gogd*zM岤.(%{}LaB%!{f UE(\2]qA[dP /))lڤn\s) _DE h̖鄨ߣnUYaZ|@&%rhh%- 0ȫ+AՌ1e`Ba MSc*a ZC]cU6U'dg{( Ͼ|_mB1@ 1E^a>nQ Q,, VW5di[\qw>DF1UՑ5EȋE%x9[0IVʂ_={lγ)ҙ\?hV^?Q5J^R&E#VIKQksY& AMiy2Ȋ`28:RM+L[beh,cL;88Gw}7r:7FwGc`8! uLRoVj37ސWVƻ&*U\JҗVɅ\>qk}.l;\Nk%:q9MA|齮EMx|+3{ cxReTW۾n\&/}(w0^iޛ)ْ*q=vp\IEѠҒj4B X,Z%pl\sEīÊj&aH\b&ANI$m I ưM ±,򲠬*lAi־,E4ڀ)ik(,*a>uHʊU>n uDGz 6EFѨDZƭ}B)Eƾ0:UT\٢j #4as{;lnG$Ex{=EsҜf̫Eّ+MiZedZp8]1Ok:$%Ϗ,JF2*<|Pcp2T-^65˄Iq>˩MZҵEKb&Jv [PQL^xO=ccc#3lb tK]>4MWqv|15. ))X'٦CU7TUKi0ۖ𣘧' VdԄ!Vu cɊhXU^KL? W$IJ#p=ڰ991ܾ}i|}fGfIJ"+h~׿sN3d$mϞs+?@uڸC#<4#9IZqHz2 qgg~<[P_>xi:,6]5 } CX+ @Ӵ:M^,-gM6"1Ø"46vCC]%xngg!RvtHZ)]GڄC|qB ܨh<-jn#={zU.IUpc勯c9N $GUؽ퀪ժ ƦMYI:W6cP%;#C5yӴme؜aGX_<4yo%.˷+1}HxîA}\ sZo&r}ʢ^ q~#d,]kB.AL )Fj1MK8;;1;‘h!1 heih, æuR:u]Bߧ$i"ֲI0Y,؎1 C?(4]a[ B NxjCXZ liv\(]3K4u֚^/İL!M| 5 ۲rukY6Yي AkVQTaأij @e [MWX$y}4Mh Di;E׋2;%Q 666I*\6Ex߲ɓ KHdUqǴZ R96s~|Qs)(ۖhhwnexcFBogk8>e\1EPԒ*#r>qc1E+|,!7o? Ump1K56yH1 }qK4|Imr-i@ZI2҂M%D {}SkAѝv\9aRw-Ec( 1-lx0p)׵⽏q|>!<]2[H'`Um7p,|w_rpm̙MV\ϋEl`KoKр"O?#J1RDG@q쐶.|a6h.e^Xl uݥ(+~%s~zoncy1uIkYQ$$b̓ЖYh$[W?i>XoľKp5N!Ȳl(|ijlx3\01GNDePz$ENUWTUI &Ћ=d2#cs6,< rȻ2tcܺy %5El41Ķ,LIȋl0PO18 5JH~<|_30-ŕc/]߀+{{Hf:.[$I2(<̦:ŊwnQ:y`uLnϸs*;[\Gu`AĴ%%EA^e( {>qez\obX9]W>%Q eLNtFuIQ5ںav2EwmU2H%7ɂG-"JDE rQ6 t9k:$}yj[obfS%i?=ﻌ=Ҷ!9;E\*Lˣ5 ~U|.`[$ZG?#v,~ŀRӣ+Ւ "lܸF],gܹ}S<~䜟?ylUcp 2e<ג CItעoSS(gǧ'8p`og? ?gTmݶ78[fLWrY-uC4h7P 65EBl—ϟq1_ ,sG'^Fp{hf"~/bUXE -F+˔Y*A^"-"ozC)0;iEz&Xua? кa6] 4 t;Tje d{k^σ\ȓRz _mom`.?&!?@%̋6pLtI4tB i^=|:B,9.p]E`)A`osuo_'ha9y6'UQO`zْV F?()1?ٔa?4Mf k5yӴ mg;uXMˣcfL9xA@QgLedq(|EFI,%/aa6UP5e#)mݑ5.R  )FLRnA%1J>$LLV dWBi+Jzhgsg\)׮p}7=lnml^lNϏȳw`@|㣛|rE ] ];7 9=Pt&g 7ɫe^2늞ko1[.K^mȓ~qhV|UXD B`bAS6=n\ t81RXx]JIZC1K ??d{w)hn//?B%>g+LۡS4qlϴ(W+ 4W\ы,>;jώ"++ʪ,[#IrVTe9Ye:ڤ:ZjpAuHaд Z ʢ4 UwUY5eK&+%3 ⃃m6UK#.Qɕ{>㏯?`ط@dh#dss ={R0XqsM%另xȀ!Ӌ8~5ʳ%&?×$9LWn^ j%S9o ߯%&Z&oSx~gxøa^qH'^^ pدr~zׇ]7v-x'^~{=_?/_^6IM\oS;\ͷQê0ڜk(ʂj0E^TXO+5c.Ҍ76q]~x!Jvuc ;<Ƿ7`il0 1Lӳ *((0 kג4(-,ZaR k)0-( IaAlǦZl"qa ʲ\ıLTah aXke#uCuY Jv4E#lSӠ 2hdeab%e٢ Bǡm[a,ϑJFz#5J mk# mq=?t{1 }Ӳ*cCgդي0"Z 4W8b{Dqi YBldzΓCj):Qz&Ƕ )Erp cNi0t$iA+,j𘗧4Mahm9LR6UI|-iF ~bC/e`,vwȯ8ՊuJ#+ ;nw( V5-c{qKv[DaLZ>o=|HJX+deϟ$/5VȪ+v $ \X/3:밻jMVT>嫓S$!z&4Ft!BWFn;myxS:԰ aX,p-<5Ts\(pm-R+e ">Zk0DᇄA0-yrQHiwG 泔ZDaCV,bJ-r7R\W" Z{Qt3-I)VzU+ 4?쒃[CrYR518^Dyw'6x锳dUQV^^ k$GʲJ+wh\%_в`ieIcUdtUʻDJZjycj/y0osrrt:iL[;`H3@8G->O>m i!y~rJ&+>(pyo9ێcX'3\39& =c69Bvw]%)~>?$ؠfq.WD|bFpO(\Z!"j e<q>a4]q6|8PbN'??mz|<5W%FpAXA]WX%A*sm,IE5MGnypkY!%K״ІvҢGHYa1/6$'zm||) h'0yr>{̳痴ښjL'cQ/`Ó/9:[\񽄗/.XNVܻu? xb9YҌ!'gcZv]E[qZۡ荩Xq390x}4zMc雯cf66~͹f7ؾo7@}i^>flazuc7knv3~^UyϾ1~]׽*[>W8xD~<k^jl`X^I4E%. - iVzj) IDATJs۔ 0XԦmQ CߡZZ"יMCN͠?h|5yUw}n'X"ZȺ&,"+* Jq ӠcۘI@QEN."BYu FX.[}$ۉEkIS/ IƫH^ edU`=e!cݽx2/7TQ{z=%,sTί&\M朌F)UZUhCYNVuź(Pp1r: egL&3>xnPf+{x3~WY¸轇-or,-HA7f5=`60O8>: I"ܡRh%iŬ 2 P::dhgϟŝ[[I1 Hsݧss Vs?t}ڽ> NHW[C혽!pH-5CYk?fkآP9;Rxg;oS3<Jde|V!鄖nuz]EV uMa^6uŚdu]z.8hmEep=YpBLqxnCFYՒ ZkM) \?DFk,q)k"ܦ.ֳ,s>)UVq\"TuÙ/Xc(%ptDqL;mGXf #^m ,]71TJM#(b/ƍ|zCڎukuUQhC4(7,F{>eYaChXDHI5Af u0~MQAJy$ъ H(q?>Պ۷hQrnwx2adgO2ZVHaѬӔP7?d0 O~K"g{oKz.N献\]\rh:щc|Sc>|O?zoou`VӫK|ߧwF;!5uBK_\%w<.w6pu+~V̗KrC($a%y`;+S+<.NGgQ*^^v-=j^VZ ҥӍ0JC;qQ^ XK^3Brx0hAMz 2pN8lrj1`2|W: ѼJ )@*wx i-vz6a1y ])dQ;ل#>y6@/ˇ!~ӳ3ñ5wȲ $U㆜-'{XrvdPLA3쵘O.=MQ.y-J=X]QVa]N3&Y&sj!Bv.g#咸3lSגdL.3:*܈0)P9g+rv2ְ%՜Gn3w2ÏBeb;<)/VHW"sVTȋ49yg_0,X9i(,Kef{cwK>e`AMBVKFh[;L&SNO'VQF3ۉ;9я,O$>㓧 99=j'c<vD1[ÐbBY+ x /?mNk헜^Nnr)^{{[˵KsҼqH7Mkv@m7X1S}׾ǚg͆3Hyܚ㛯l[^7a5c,efL4c3|oU1a̍k3k_fs}cl૱|^{\W)Bh>($#FN<;NM Z0v[j 51 B? 0N3i$wp 0qX@vA6כ,ҍRyVTeM'T$hqTUu2!0Jo4jZMᣵ#(5^PZiDQ@e\Um ʚR2U. RRJC%5)k#m?,Y%Ea6I!<p]|o/rFxMkMC.̖sҬD;i^"!L$i |2Y!Fx筇@ = e N \,¡TJA%%eUQYAa{gkO;0n݈OQ+Fjw^hSQȔG@^4Yϋ8=JbXvOkkvmήF(mF ^<6t.A(^.*ֹZ$|x>t!gɤG=~A*Bgm u:p|#DS5VQr51,Egk;o2uUЍ=v(:lONX ^r~5#v=_Fٓ'Y>yƓO s5K8^@4O,3|`wb=Qw>.z%v|DF\`9~~;anՆVw|SZvwHwpV{Hr ospmКgg圷nm ~w{bC1ģ vt.h!4O^k5Fs|Qяbɜv;C80iE^b'ZX;ﳜdċzԥ#bYop{袠$|'auAY@3h<7\S=g9;{]y球.q|>Rwpo 5/'V9w1?3V-O(y%n[0˯8xxu)eNn!`s?`E/I˒%pn/76Ed|Q'9uO ~!lܽM=Cv#LUR”t>/8qz򒋋+֥&L:F9V,c݄A'BS;CVhbrtmyx;l0_B`2Xf?9:Xݏ9~fcf >~}v\I];88־pC 4%k|{j8דW,5lq kUjrCMk߰_nZ+ZlM ڜq=&7pm3AI{n$o t!7M x18.;C1Whx`Qh4Q+ C$UYcܔDMc0F:si2t5a^GTe:]juA6L#8wBWlƳMsG8PUUVx: )k,#c RJ,qMY4[ xRYc4m<,0|yh/njF:ԊZ? n'~jHvܹ>T0yvqί`kwG U!˿ lMw8KY"LRf=?2? =lIx p9BXN1TJ :/!런ϿdkV A蒄f[ WfjE)h'AcBjYMN;&MS8.1`rYr5_b@m3]aوm9|bm%KI[<\Ϟ'}z8:G6;Klqv1XUԵ&{SgBvywcв;҉v(O~Ry8yw>y;\2Y } ׉C|w8;{N~˯v~hz.g_=EnݿW'/θΈ#HM||.L3͗S>zJ'iՉpW_`{W/OXdKvw۬ku~['TEIt[ UMt=5#˥!u7JްO{nS7'kVܤ:4th0ck'ި ro.vxL,[M nFfF9S^+ٷoáߋ|nE EUX,Oƌg .//7do7%Z#1(6GEIy;Cm)5Qb!_Jm{xqvƳKd2] IicM+ Y׸~;I1#q,/VH?ŗk֙d* YIp<+>ɳE1{?⚜,[0.|A+:m<=v8nqz~έ[9ޡ;mc6N%%BCŸ+p#Y7Ƿ%2/X_dӳ uc /P`Ⱥ4MXrv ٘jN&P9d|ll4bZ. Z6'0V3u#UI yʓ Һp` BE{}'}rY0OUϢ,8.Y+l ;c5p0.gkGS+Zq@+A.w G|=e^0ZQ^΃cu|r= HZ8^I[:'ԸCrO?x$,I+O~%}C8 IDATa>p7ӚA%/{g5?'SEXtxQ nV=?hqtOrR1Y-R^^xvzՈ霟׸Ac~ggddy[wG,cxx<$ӊwڤb:΀ġtY%c2@Љ"\2fk{ȭO_"HZ*V' $_;oI_hߤU98\]z nr}oyk5-k;DZre5ox.A9Cה$oArnqx5"of^{Mښs:6qV{x/7׹9N6ȪhMyF{DvUZ1/X9˼kZ#AtZ=0.eJXk EUr{&@ ߔ Thmɲ,\_x8|߈QhƗuvmh2b&\rɺFku-qņd>\ٔ)U ,ZvPR5Ul!yC q0Z7۔8y~e>e \j⨙;p@85qD-+RׂW}^  P4~)JE^SIEzUSZBFsFeQ-ES>󚒵<+̻^SbF7md,fcq&h0N~-* I l*sm{@ZMW~S7}X6)hG׊LVd+]sx0.30 ]1vAVl+0u9Zd$Kˌ<=U5YN5{Q)TXfk Rj2LW)LB+]q +\6^>ˬv ᆔҒUuZX" jyQQ˦͵4ybS+bjJkÀvx$k 8"dʙ%JON/8QԆbӓ 봹0K׬+<Q4FUaE^RQ)CeA;.i^^'iG ['M^6?~ȟ&c.Y뢢i11YɔgGIg/I:(9s)YCfux4! C& ييiӳ_d^qxpp-n̲*b$˨;죬0$]F\w?%g9b["]Q)F!s&ٜbIj$ }V[Gr{{]jTmJ)`Q.8oM; Nke|quӟŌ*ZYc&d|zm|/?cϟ>UE@okЎ {}(c- ֲ![=jʋ9ӥ$NB>=v-w烇)Ե$+rz-?>i騂@\ĉ+g}YN˳N^^1;b=~+1W/OV|⒯^,?GPle8s?WKcd^/B1Ye=c.y{puvJ; ꢫi{DϷm/FknݻGgn1k7DZj{C8.n=_ o:V7Eqc%ULzלϭ} k7*?ǚk7ׂO 5Z׼YڶU7~7kk-랆;kʯW`{ﲯYQ"׈zM-kh h$8R-B YVJ6V*YktM%1hUCRJU3! IU+ Zc°)IF5&jnl&FSUaM6w8`Aկ% >Nò)i&RMvI8J!D׍_Gc\@jV!}i lyԵ!6-hk J+iE!B.K)O㕆Ș8eCX.haB*YSKI]:Q WkTI ܆&kxkR7}) 6+ibʪi[yY6mzy3OF&4;|w]|!"\EJEY51&s"f=}$i&B5䰪Ty֦);k$`ZrvyEZH `]Jϳ%ĨJ8ZQ1y^PЎt},w A ("CVt]nh `ow%cO[%߉Qux8$}TUCXpk5՚!-%|t^WeMU$qBplSB-e!ɚ(:TUI;NeE'wj,j:eIZ-nwhdUE3`UH.kEZڀy^5U]5B!MΖUz]bLP&!UFQhm8?WL\\iue')))N~vÀRV(-uMo`(eEQU:-Q0n!|~?Y1N%'s\'#"#K3>x?|[>`ˆfYfgz{}{]7MrH.=;Qdq`w b0 r 6`ȀxKHh4 Er8ܚWUg}\9 Np Uپw߹ KWowtsyEt}+HY\|* ߙw1EJm`Q q-I ْ [bSAg}+dڰ6R\R~/~ek]ct茺vd+ %o x:w=dh4R0]P,D-kb)e RFU>蘴s Ox>beʯ],3cCz:ǧKLtV? 7׹}*u^SUDXn]j "ѥd31dkN?+ύku=/]r/D|>t2cazEyd݌[/굛L^)F=NKe<~.i L LzN_~{>Kܼ;oucn\ I+:dign_%w,*rKl\~oos@ou~=_0/,';"E^e]Kekm+s::a{}_}Nprtl&[p#J0Ƒu3%LQֲm{3]O qvyD@ Rz-RdU ǵ=+"6gSgE9hx8â^l7ߞ翗xYA\kO)[̱SR)V !|˚)^F-= (iPZ [2'_.1U/hH%( c=zb#:Vs'V kM8RѾQERJ1g:=(ZeJj΂$NM(CCh|0#*CxS(AjGJ"HZgl(w*%5vGUkL/0`X8A+HBE) ^b͈oyijTkR7:HPƨuNc-:Ҿ$EJw-T4mY`Ə h(8B)SPhB$R t S)/ ʪZG'K"N@U9afdƫz~^{}t h誆~{ O+'OILS,yK$n_W'T'p2#FONt"$w vwpOO(kᘪ*ٹt*x RbuB@=x_,s&B>ݡŹYL#<ϣg3J<<'?@G{.Ȥ qS E2- VD9T$HA vP6X'/4.̵['fO  @^6>tIw$NܲMJv{E%$I2΀@JX$ xn:$!IXtYR2j>*J1!j; J,%qv)gp8j%q-Ɠ Ġ"!M1Z%I5+#jSycp5NNkHc*cR KASyg$ 'a8cm|QX3MX'k1buu`\C^,@GYgTMиKQ1AHx:XKvaWi4U:,& Ic8eY.dY:dm3%I1ѷUzI }*t8-=t0[,0ΡӔE8q JbҔe:ˉƂz"JI`da ^`ј++;=.^HykkKnm#.LNsN\ؼwws0n^{y;)Ք !GPxTxwr:o "u\J#O N̖.)rfcƓ}ON6 N `УKYN?pp`}\X+OVV9>]2, 2ar +W;e2.tյ-fdɕkz=Tdɕ\_鑟L9ۇڲRIp>^JE)˥!Iz$hф9<= #*6YX>b6v.tAiC ҈2ؗ.nK"|1ۆ/6#z Ng>s{Gy>wO> HE|x1&Ջi3!Ӽa^y7Wxl$fd>,ŜJ(nڀJ?>q1~;sw?}\r~Φ<;bYVlIU̖ Ɇkwn3=L"_JA.IKώϸԟM:wCx (_3x 0-ў.wJ<?exƫ4{1UE<+;D}!--g} %5yd^䍥TҠDJ c$%Q,nB,#Be#\Ǎd%TgmhF"w4%9CsFI+aj}mɧ2-c$*7ڐ1Q`m`!cpTu)x,IBHH:)Qz0L+rcJy0PY ~g3 ϿpfF+I]7,MG 8,X*jʲ&%nJ\%Ƅk[\]ꪶheQc'RJi1^Hn%H2eAŨ$;yUQ[nK62g.1|Ó=/icyh-uR,fKt= Yu;WF bdE͢9ͨGF`uUdm"5(|C"ǘN(l`>> 8:^F{D +d !%>y k ^AU/! Gsc}{ Mt6'Z=!It{1Q IDATE\۹!/o^WMW7O=<)=zKӒyS Õ$h0MCG*FzÃtcMwFH:<8*8Ce29YJ'puGS˂ n\1>أ3\% ^">I?|OOgQQCW¥Ռ ä"0llՂTjF7otzW{%I,hZQ۷:k$uTvLJߦ2ZyD̦S^q`oy[WؾhNyia 5i |ã#&OW^RZ\&,IAg˜p_;`uC'P+L*3rܿcaCh?)^8W0?c}F-<%S=[bȳF|'3IY"g]!ێ>>:\̗9_c_MoLۢEt?!񟘙]Thp~zYpOXC<}^}wĆD(4ןאHkMM WpBpQDEM𫘚DSwiDIASVt&غA ID6ҍE*IS;oHG)Yiظv6Hmz<$am_01N| c]hOsR_8 l:OY(\McSD-R5JI"JEiT9Jb!=K)XSIuJ\V,PRL<jᩊ!PDJ2 wgNcMӄQuEѩk) JБХ#hcP:pM sD=GeHZʚnCbIhT1MJ5MC^HTVJqUy`t`'8DZ-[-0O.[a1"M43iFh (Ds5ңu1JFx,RX65Xp8 E={FH)H VHQ5l3==i,:ԵC)>]yyѐ5EYhYM1Y):`(TüY9+te}e C3EQRH)٠ƈ]67FÕ8ܺu+ܺɕ h'DF}zi$auuk =._m^|7\U5ܽ%t8M-KƳx| w'tf5r:cr:cl?X0Tsfco!l*9IS{R's<2]zs6ONN*&Kbŵ~Duz%Yd1"JR~o!L0fw_tlF|se>rz:K(˂Ŭ`4Xe4Y֎Y9Q𮡩*)s^2)xA+F+12QK:Q1Ԧbskɴdds"X:1Yh\|!'t4 {9O9:8ࣻLya G1=U%w x[|c?Y^uGw?՗o NN} ɟQ.l];߹Ţbgk͕k>FUO1Q^R|_S/Ƚ>š$H8<9PtpC*èNQy +%iov[v6o^=U1VY}+:c4qlz?7#5\k:|. |o)aNjO xUyo6\g{kIKͫ^Ng y /?qυ~6eMwI|iC{ņ42gr9ar#"JXO;ʰ%QZhId[Rצ~=JjL; )ڰoLhda<%n158zOYUnqP mRKiu.B:di{( } T C*E-"iusahVJ!XK4hՂ CdʈD>u+9!v۶\9 ,jQr,͂Fy{ށ#un)EU{ڂԍq!5i?gu6OBF{ׂ2D#Y Oκ1ʲB)A'бFt޵ {!iF++j λw$2Rx3MRHJ8 QqL˼M uU#u HYM,߸KWsm~D $ˬ4 =~… + :\pikÃ'̦:OtlVDBYyjVW 鄞Ⱥ5[C^z2$-=>jҍ%i /tKLG$Y M7.襊_(C' kAϪ4hXv25r+M \x>Ը._K÷2a+qĿy q:dx5 [PucgI>eYRU5 m-I˪a~3QS~JƟ[߹Ciʪ:RH!a_O0%?qVpO|U6;(u1v^x iᝡicۮ.o0!'eXN c2 \Jn~Gp߿#U|G9 >ZTKҁh3QFI:HL Lcqցk)xJ$GJO#oZ }AD"d2Ƶ !6H`]0(KZ3Q@XA%(6%B,<$; (HQG B*cA)PZQyQ7IPO4 iٶiWiGqZNC H/P& &m!ytci[7 B4V2Y֧6u"7 +*Lc}:,E(ɋ7umR<[0$ZTh8[C )y@sτ6T[YFE2klaYtgo xsv:>KH!N5Q,[ED&gBdàlYזXX id;.?V&X, ĉ0 $Q, ̛ RXoq0wT ;G]F![[38p YHY2 KʪaY6, 4Ե|Mji2rYqmlY`*( - gm+/C5BivU$D6w.qcl+pcYVEY:צP}e,%q(&V  546 HrX֋/0/ɫw? -YMT;/tfP2A!/.I*89;s*r2W\b||ȃ"1br+/`E>棻L17^`ggN%E]}*KF+B*.]E>2e)k& bkxn}8~zK3!$;?. [{akH.~OW?g ?,(y~i#6?*? Ѣ lۄǙ{3ZO5oL?7D껋h_4e⹌[ i3'} E;{<ŗg/qW~o֡A͚֟x+}~W/1LmY6E=~"w co{X6|iDy EVzb%/fĽ'sjӠEDkt.QIJ¶;)0sm} IA:|0 yj/$#0 CaY~jKtJJ"0N!i7yt-CSY Ķ5<[jcy$Dm,,ːR0$48MZ'unpJ':Ǻ֐M{|GJ: E]N-Qxq'Bx(ڻ4۴( > $M]kq<)4|`2b0ZGZpX N Q 1!|+AsCehv&WkLղ"%dX[K'4u0|k>guDD2uvtglC#$K$N"B+Om붤 ƖHcd! Bpwcl0лEU"P(@7Yx洓x<7ՌVzTEI BVXvS|6c{Z@;o|@S8˛CNUw6Zgeu/5sd, +(Q%x"2·uL7M VHOe{pUeGc^b6G\qůu%W8ys~~K_,o&YL3[V(4/98:Wr֗( 7:٥O/XZ݈^665ziç\dh5ֆc?:2B:w)4)Xedr("O8,usxOS>~M@}m ,4< I4ĹY~Bc=i-f1y/g-ꮪަgY!)"MS Qw o0/m0_ڀ@eE.$ICrf鮪5++DdU0+* ٵDF8qηV&A%46 -͒eIĺ:le} V _Ǚ8n IDATԅ|&G]p)$IJQ(C`jUY63?^=6d.P*( ("I Z48oQJal VHaYY7մpqtc}̼g4VO\h86a}ŋ7vjhWAi08+ri(βJxvwT;{DA'I`6ufP*8.+dk Jfeɛd4ޥݎ{EXP"[8O*V02yb )^|&<ɜɵ`suSc jBbB Bpm8Bx$,fnvN2;+fϘN{}) u8axC*?]S%#$(ng Wy5~w"+Z{ĴOFzܻ(8e>?ÇwphDn& Lڱx󭋌f<9nVi*^xMSlnoWx<.nㄤ,kn7"%^s|+/ݺ¥6Gm.^fcG =f!Sp6[Esd?k;DZg|7#(|=ȶ_7woaOi|7eJ/s7;|M^YjZʕ$)CV|uyS^!Ks8߂?^69Os!_[b D<=\f9\ly7Y>H1pr *jGť{.*^Չy7?gyz -IO)%i `bm/U 8C֪&!LkxF>)c-&#-6*}Fn]Isy2/RV>}<  ҭ :#/*"#UA"VuI:Ch<ϻ,& A. 0f^5ٔ"JSZdOBRE!3K H>c uN&XW/CT&\ #8N#m,"X!t8QNJ/48牵4UD8 ZO2swYEcwUAF+EfsD"F  $a6,ϩkJj٠-Y,HBJadj] G`#Mњp4^*$i,EYIhqMuPfYsx0ۖlnoRT%4jg:P*@Q>H HI2!Uf!-I@d* R.{"hSVQԀ;$J+Xjk2[EahǂR .Ҋ5[=lʍl{y1/\['];@8A'<==_'SZ:q!)|-ƥHStT!7"a<e{Gx}^#*S,zmLVRaQN"+rⴇ u^갲rёBa>o}o}VGZn> g_ؤ0b8eA罻Uͅ ;:MF~[7=~29+?ɰ.!mżm0 N ?fp lUiټOe^r00.5 OM泌߹˅}Foyr?x:w>>.Wns:S~$┧WvzqpI)Eĩf89Ojp49xpO}~K?'wwbsg!8MM(ֶ0Wz+Y{|Vqʓӂ˫3;U--3 ~:"_9xun?#&ůcSV !g ٤yM89=C gvB:~<脩6J}*jZ4~&Q[us!JE(YrpTu׉ԟ WQrB>x3e4j 2<M"?WI-gb6!)KٔT]/@esUsd6)S8 &X%Z%Ԧn6Q0w@jT TV.tz\W&ۘoPj)B פ4MCfCC#M>N=y6'[eo i4HȊZ b1Mz53B5|& ҵD5:lF#.u]3ϩjG^hôQJT`5_CX1aja )n Z4͏ .xncף4!9IZ8,~YƳ -4xbV0ۡ9:7ʢ!qȉYY#I4Nx9(j1(|](F)K8Uz)8a0$,WϢY#I$kYЊn eYDQBY8)5xGziن@%DU Q >ds<#nEP=xQ &B(4^4)X)ט%Bə4"dzy4IRVU8^6O! +$q 20+йJa2dV Z/ b($6P֚VeA>h{O8B&Ҵe%GaPau UQSU5ee>A4EiY7HhCbh kLp+Bf M&Aqӏ2D*FkO]Ytf*+*EGQ5 Ȋ)J[hs<B鴹z6^8ɳ 2Sl=G8A"-n^bks ),SD Ak}NoKҚ WpŐ[q*afHYh--Vz]&3>dt{kϨRW^6''C>9)bk  zsK1>TyF$`kKi8Oɲ gp6 f׮W'bwo`Y6y7ѭ.Y~dFY q)g(!xS }(Jh-6W8=^2--*ɨM*XrzD;wyQwNǟ|4#__`i;lmn129A^>9yWX|j?֟2kLE( .1ϬX2mPqYxfbИ`=Sw_ {.|%#ܺyMp:ac{;FֱyI_'sgP7ūw8͛4!|+.k/WSʉ%1I^m֭7@%bhb,631Ł*?:͟y6`9ڢzQ0zy=G?Yw5ָw>Ge1r Mli}'܄Hnp1 א5fiݿ7(a{9MQ6s ܱoZ+<R ZE,6)ZaQJ.FEYPISeȪS@qZ)um "W&e\k /^#BIYl`B!,dh>L3wx{$ۓ$6LlOy1B,ޓ(1v0R5Ε>da D*:y^CPEIx6+Ӝ8ix2o@l^mI/<|V馡QMA[lRo*C+i70iE^](TDBj9B/w67H(QSyFAq,2hLN0_E1t" $1-6SxA+j.BaH\94[2~h5Z'X` i( MC3Bc`κűaӱ 8KZL g s%$n"/Ȋryf/AEϫV AjJbʲ&W`]90Hn㍤ hrph%P_묮2J9$FI iKڣ[\"(V$,uVݡJX_akk-dZS)UU낗/^6OxpweʕsyAӡs^udN;Pp4'1Ӽ61GO a8ytᓚ2slIǠt{̝?מ)"+9>|f$Qg*nu^SJ:(w?1[k\Ya^Ʉ.hɨKլDXs3 =y֓5E^eiNYYʪn;xt2gRL"]d~vZ  .]l>V5iAK>Y%yAL JK6񥷾w=!/aor>;˯>n+rixb&pU"0~g._'ԮҕKTX6/rڰ%ipλ/qեv83gt謬{F<&9g"Lo+7q5~ᗾF6[_'&vx?ϽiVq2(S/~~+w8͟|KcNN7/_~#>< 0zxDﵯ+{3opm|U|ۗ/2o_뜢 |?by|,b4 xK_ {p#͵W_efkg|8fkl>ᣧUY2&JXk{ t՗y>iR"_,c_Kv1!KljJ+h!)KloPJ#/iM&i jā _6ztH D-EZy&q@:A. XrEy yxe:j4m7[!EVTf9f(PR,\ "-i XSedS^PRSWu.a.9*˃YKQTeAB"uDTe"ec)#mKXEkYn{.Zk`kj >$eQd؀ )QJG Vb o"'} $6߀l3t(%֛gSB{i<6R7!L}0 .B@ڐ"+CnU#`8 V+,LU;ȶ: q+!M!в {mRhjղHg$*5N5 E*Z+($$AzkYQT%2vW$e4H+'9QO8|: cTl8b49:>e03W ɘul?9$M[fcL]0ܠ[nѣ 4L9Qc< Ogt:_d2/N <֫lwrBn!:.r Ss"+KgJvh pݪv $X{7{Ε3Kp |_}<`::n̳Aji}kVgr<ƿ)0Bsf("胷fﵷwSwQ79?,3*OTUѠٚS3ӇgA?=6<RE$n}Ω9OBMx~;?>~O3eZ8j~O3gK{)*KgG@4f P-kL(苢 ƀ}LƅHa 7v)'ͶI'vˤ ii&x]Je,UmIǷ .X,[ ?4߄LZp.'yQ]FcmЄ[H'$I 8B \.BESt%q$nN2Uj$ ,Lu#jDf)4xވ%2E J7a!]9:xh)`>ͱ$( Ւt7Vg jB G;ie:I$ ci11I+cnOO6&%YU3 BhUttJ6q7!M%[{~|J2WtW.l1󒭝-WI(qI'_~#4[[bj3OflR%~VDǭ34⋟D(N'%7ImBQU tAvV\gxG[|]9xx`<ݻt@>MV F#.]txGG;_5(7+]ʢ+f$E)t:ڊM<݉al`jMd8C o+V67sllW)n4EiH[6@c[zX4]~8A,Ru%f`eA?Jw%eI)!~yC#B{~~ q|<>gR(;3/MKE`O?9!C??_ICƠ>kX_ՎLF*ZkW3O"_|8{"R-S_cȊj";솆 dؖ4ausAL(5p*.Wa;^8 Mx kPMCUUF" sq,k08:LsqBeHQK钵鴦*=$R]Bb7Y,A£dD7՘d/lqVd`XB[YUo%,^AHGe- 8쭯p$R6^I`, %%vcFsb|^e9IнuU#K MQHH1ˀ1^OR^6ZSKyo砮ٔHGˡK$: 0IG%B PРtWZQh4lpRgkk=L) v5o2ʃ(naL@ eVcpHbyl]RU*H-M7&'QiHI('¦3ԥ--Dle] <^Je/σhVBT|6y_$:69~鱌"oC6^-0j\ M]s.fkAZ("ׂjUW9>;4ih<ؖc46R7+MQC‹`gU K~V* VBe umOZ;mQnuN' }pOoprP1>- ;OVԬVd6EE¼Z^%/<-ȵk{p`#+33Mh(zA]g'ˊ8m㥧vIGUXE)EU"cg{+UPiU.\DQ8NOr"?ln+ܻs1wW=e80䵗opAq29sx:#muP gS%;8 Sbw{ {GD>s/]a{֖n7egJ+ac*ݵ;lR~'~V$dӌ?l^z&Y1uT ^/MI5$cvvI+[fcEE^$_=b0st|٬@ݽp8 Z'\|v;k_"UYnS5O2L^NۜMT2вsVWvWۿ1do}6` x/2ṫt:1ǧ}x Zu0/*YFV6icOGg%#I;tmf6Y[b?#QNXk4!M*ҢrU>gxvs%Iؠ9G)Mg H‘KhaϦM8N8ZG<}1J~dhbOy^j~?!y Y3]b+ <hΝf:,9a>ˆ L{H#j%6ʝPNoVx Z t$c`Ck%)Uv H! U3YoeC&ɒt5Ue 03zNJn߽| }w2.?;( 5jZ'{$x| dR d殲uV7_W4{/JK?`gy'Fj|믢$i$mWBmi\a{upJC5Zz-X#!kkv 7HNN\95(Ng9Pc!~=4T͝&_|I$C8M R șHvE& DR(Bʺ ?R Lm!yæT0{@ 1qQtI*  kl4ErYIUMLБDH`%B@hLքD-`rBk ܚڄV35,ϙa_ 1E <$9OKUe9"ʺZKts(n 2$ykܼu [ha92xpxn c {CI!h$Q)*ƪ"yrPω{X.g6= g"%YBѲ#ѶdG[q#NA'! 1H0lCQb'RdY$ѤDqp8K]k?ۻ!)q1@߹UVsnFOdt1%gN\Y@M0kU1yh^' >i%(Z$\S+9< l퓓_(ZEIQdI)[!7ߠ9>`Yu`YZ lYIyu9 rkzrnE2+Qvt]K:~!m MNi E^N֠#mvx󑗶>+-'4]Cwwu.3~K_jI0_yق{ZOL (ݧl k~QNYk;F=O)tk"YEn=뷧/hɜ»x3=VZ,.Uyx1xbp\5 =Vɒl^s|vJZ.]޽NgԍcXV-yE?|2u9{3pҘ_xTӪd6> 5ՌQx+en`vDyK^crvvrco箌y6MU劽K8R1#5=w-m1>M0\,k̪e!xCTj_{g|~|#hGztb1g{`MF))D6M4-҉649tIhI6̊HF=ipAm$'6OHH=* _B\j xO? 7Im t:JSPUJ Ӛ\f".Pv(l"2:OOfA$H3o HHF_D^b eT͊J5ȆKGiھUˀ<02 \L*R[L*"6IyT<sNb7Xcÿ!\@c%`ѥзYʌ&Y_2EJ| #:* J^3i" d"Ƥ9[\9j;ޢr XbIb6w:U!^c !4u,r[7B biz)Zkٸ4 Ӝr=9n+4]1kf>HICrM'+/,FI(H:!j%~dt@RP ;!T%>D.:FJZgMKӵ͒J\r`)ggsej^ItWAHdFSZK֌C{h`Hl:2#.5m'A]R7-M򔴅)߶pW/6+FCF)QGCCg~h7wekk@e (x!'ga37SWg<|@kEŊٲu@[(J`hrڥ>gP!lB霮Ѽwƻ+v/qzr gh{!_{m. Vi:ႂ@gI%1?;e<Xpcxg9]"}dgXׯA8~4!wON/lަ~SM_噧np%yGg\|>_M>寣!zF06ENԁE %WUǬj6ڿ\EՔy^&Bn,{[LGl2#w#3>۷uaΰk IDAT_?QĚ^a˒g^|w޽|nAܸq|4ߥj:9Ei >30%Qf+2*U^xcXvfY7VVP*Y-L..y ̓LQ<ZɌMEZ OsA<:l2Ŗ}oq]GV+MgB rN&|ںaRVbUӦ: 0*!*׍ѸaV]-AeRa מfppdE<9u^'Ҿ'e">FfoivO\ޓ̉"޿_+1=oOld8}R}"m:2b"Ձ"mB$nDHk-ma־$ JԚ4|8ѿ[kЊ$=_"O!sk1 qmK]e1O[7>/HY/D;_2X|tz˦?꡼XO_BzelAD{=~sc>Z]Gi%ָF7!MJ`2==t^7hD#>}vuNv07*rzfUp˝i fˊI)C2,M &tiϪv,bd6zW"h\i\4.RŪlnXD*cY%isΧ ,0.\8>@݃~pŒn+o}xΛ_|J ~+o17$)W չY;[, ŐŲsO_B ׮qv6aY5tp{,y˪!/,/>u_sigŌUј`|:u̗KBP h+^~%>g7zhwjIӬM#aJfG.~&½GgVxeisut>usV+Gh'v-sb`Xbg{VPVTˊռZ6=hPfFe{:m%<L\ΰū|osAck0s೓ *h}6WȌL[bIGUg_fwg69BdEM ?`rK6m}!Tܻw좢41,+G?|YѴ2pm -#KaO]seoȕ暢#DuK Y0Zy 1`2jqA G8f%ڂټm#EŤf2̖4^K{Ky9JL7YK >͸oe]@ݒq5`82LExְ) ላe5Q/>ΰtcjBj,quE?|샯7OZt9;`t}e:Vi^{%^x9S] <}m۔178|jt>`MA:+:).K{sj/*VDAZڄ&t UsIX r vQ!B`Vy Y#$k-&Vrɲ@-GtՒ+lF5s!B|!5N&-ɜS(,/R:"MӤcLv/3ں#8*uu0^VHXa^#E$'%5` G' zD}9ȸxRd$/VX|Yo +j#c-&93o_% zίdxȷ<.5KEQ4M&’P2>M5ch'DlW1*ʲܠ`( 4,/$:RfC"hz kxAP4&V :I Dzi V< EtBr <stN](k3`{Ek%DRPL$$b yMH2ne:9%E<*b%Y !h-0mo#t >MS>DJ#+7,j,uFa=F`i6Ƙd2Fދ@# +IN-1D9 :^$ܬ=np۶7w[UZI2N5~ecL&aV/$;DMyS.xɹ qЛwߣ|m)w#.3K;oXL&9tPP`fyi~m257MQlz30F$qv EAyAeAx(uqԭdӅ($t6Gc$j #Pdb(t^s1jV99veZ䚧2y"Q5ΧLιvłKd24slpp 48kbJ]YN:._DKn,[czf1P 2F+QL&+bt,s"K5C|^{ﲨje4-?|c/3~G^-/ՌLG d2=YFu20 A'c! 7oIf]tmjZJZ nmmS[ ͟IN0y`4?V,V B=mlcU(r͠0 ۘCO|('7h:I*U$=ONOrˠp ;[+F[ ʒшgn\L&V);z%֝3-9YtQ0mж,Y,8=yG|^OOq|+LC:RL[+~^,i.1 لS. Up̖5>%O g ]0bNe'hE^ 4]R`=̈( }2kjd&5,81h] FΓixgPf {A.FqzrJ ;i.8'UM#]h[OymZVՊ1hִME6M+1dX 1%h̏o7~W'*Ic<9~֬GpOp/fHԻOagoq|]_?crwɿ]F4Q0x'JA'uPu~:A|ic?D&;9S&-2Bqo̙kͼLJA!>.#iWiyz<'$Z蓏39|rD 1um*ۆEޓf𾦤|k?E^9p4bJʼn{1b$C]d7L#MQuMXd|Hn!D&2rv~A.Rha Sh0 +J!Hͦafvs yV :P\$CoTJ&e6u *!d<ri "iZY%K|_m6$CͻxV*24B&r˜KilYRH¦FcMO-tCKҀw:'ѼHlH8ҤDqbjʝ֞}mA}s_ |"^7*,7^*MIbya׹ uCtiC#`u(U KNc2مQ6صTiw{ִmCp fu ܲG[t1r}<:w0kL=i RL&31] ]}k_G(MF0J2|"5loj,s.&rXԎUtj婖-iQih ͝]+<הe/$feO֡=G9߸ _b J~ZņjrBcgcgPphX)G:lkZ 9B!<ʞLXY(F)ҬmBTƢMLrzt ՊlF_b \>ڵ=5W3y)\Q`wK7%ϙLsV7Ͱh_}Aѽͷ7p|I92qk͜?3?qe|yWW%A8%VE6"GBU&hM^,4 9$J.0 3ݝ15f9+2pa>:=PW5A/fkg<]G4nߧi:=:i;N</!b1feJh1\#jH*sbQ,++p ukYV2+>@)Q1y*~BR͔<BK0~Ev9=_z|H#~LV2xgq2pqrFl-b7DE{y2\SQ=+rEx^byUm@^?>#JY.xE3sѨ'ȚSSde$KJFDY#M\eq隔0NMn3ɡ0~',}b Fp?c M.֦*l1uȣޛnD־Ȅt=_ڛ,W+ZLoF2 YmiMznv$)i}hys4wBsrjG:6XV ajh:1{/5eV:] 187(q }l|`< U兞h%C(╔y``"y?~|m CLJ(0ʶ$Hwr^H< (ulIYV% >H_Gd0H%[c9_gaN9*(B$R|LtLpEBbO&nM5YmF軄NZLzc'8m!fC|eV?q-zyFf5ՔyFKz&2V"K#^X"ŴYT!)&Ho &w&d/ ڶJ'F kmF9NypzJTb[Z$̱QvU-eͲnig=5]ltY=<|H8lz}G'5Y^PW墥:# +\z<7G.cwgDiaw VkbJҸϼxͷ8[4ƒS\ħљ˳sN>'v]SoұZ& օtq#p eyڰYN/m$Id GYLn[}5Q<,-7Iwy,Bٌ'jYӵ҄I>M󢴡kn 1!w%8/>рKG8L )JzJ$2ZT+d#EN\rt& OD hh_XB۩M:C"lB Y+u-YV\mVR\o& :kFgh4d$<4Y4iô)b{SPD4䯒iڶS[yzNsq)m=q)"d4=[#uirL$I( IDAT"~+ 6HcZ"^K&ӘܒN0G}UeVp [8mKY2%q sV4sUYIIJhuUK i{lo/⛖AYB cZ/fXf9;iC4' NU=_K/z5GNA]… ]\37șL ʜӋUŔ}ڪf>3!dh-Df6|S7hLw;S]QxtrN5K;կSyL.xg{k\gqz6wn?*Li4/QG;}~W~~>d/mmvK^8ڦj;CˊQpju][o%# {A7]up{G̫1{LzBGD3N}nJ ֊|NY̪4=wGՂ '''|卷.j jY:WDab6[u.3Ly/ j%wbh ætWxpAq|>yOe"պl^M86x1F$^Б! DiQڢDë3tJJ5AACrGL>68J}/׎sHko-?iQ=w~^I'_?q~g~_ѼO/~ ;O.?6Ѻ[TKjcǿ/?Bˆ_bFS/' _}m9~'#׹_ooO̟ J+H.az_<Ϳ |m1*]j_w__CIl .?>8X7YePvr/~*S/O8}¯~.}XuaM&TIԉf4$QJ RVJkT,8]زeC稫NtfZ$YG, ̂nU)W'l pPx.#y y`)2dw]I)sb*B 3+V)lb+V"sVi{1&<#H:pAd)I6&iUINu>)AŜj!)4:o4UTx ũXZ!TS&4MQ*jn 0_ ʵy^?mʬSyȰLvĻp|1߃WQ&h\ ]ױZԄn*(18"!8wF2%A+ƣuSICQ;6gǼnKF? Ј0(& 8F۬ڥ ұ.$ښfF>u.̘kBQNYZrf(ו&E}yQ55~!RSX.g0cpg|Fg^oO|*KpJcd+lr<(b{glsxĪ18͹yŢtW:&C=0]/1%ղ&9uݲ[G wwjfG`sJ:pp0fU%O=uGeF,<,6b2{ Mj^1}5#RKn=|ĝ)[=ϴD[XtuKa3.HtrAqmM{ vh~W^ U*reo`kc{k'49.c5lw9:ܧ佌'\,[4ݝ1hd;_sә].*LVcX#|'(m,{ܠS0Turb:Z.ѵ5/yC1b4pzzNt\>gyYhCNY.+&s"6b6US;1!se2L}@t>lh\5f4RF9mXU+ kJc-yQ\Um^KR[;ŕ_(LΝ{$ Q~t%|Oqwk?G/#/5Or5MO#O-? ??_Gܚ& V׿?s_;` 972|3 vs__gWO/=~'?2OA^<||s`~ ⿒A2{u7_ƀ*9Z|˟w߾dexÇ/ڗhBz<5漒3;|୷$pCwޞ=̖}>۷Qo K'y1<),3yoR1c E"2LvwȬKt|f/Mٰrʆ9ɐ<=aS|m<~/5T2kDeh4RoC%`4xV;BfKXk7(.cC[7-.6sug1lda⅑<cDoJ3kv"/kRU4#N.x.9!XLs"wi_:#(`/Ɍi[hC@2keA'όA[~ig:*73Oa|;7o/}k3\"f:'G[ʒrtroޤ^kW9g:GY\[qM\۲=f8|zAn J8s|ӋC2&oagg)?hz[=Ng+|(Fbޣ(TUE`fZֻSmSU5Ç\:GGYof6r(W̵}k9ypg^|{*w`? f>VkvGD hѪjL3(sbPZ%H`ݦv-Ofƣ xoGf󎫗rE4CR" Ay}ӕ`f0:=C`Zh[ٔ^_[yе sj¨`Uk<[t1zƣ (UKN`X~omz6,X.`:+0M:q]M~ v/199YP8rmȣ%w*ުn>+熿Ff vs`U_dI*xvF#9]O4Ō7osgT4G#r;y' 5=~Oyj!)"UBYĖ\"HQJ$@NA0p#dʒhY-H˴3szm۞>3J$VlpY{\:i)JЖhgG' Η GR^ IQ%Ae.5計c06h! ea1SN˵F4k6/>$8ϲ(I)Q 'cڶ(,jlWY$/ ]G^$^{{Jk)##tpld ,?3_W<Ÿя5_c_}}'x7~-ywgW~&c2lfy_.J]l!4m"r G/1Vg|s|;{?U\[}i* wPL)WQܝwJh .Mڬf׉'ΦZ)JiL֦׵Qf}~vZОJr)S38 C&`BC.(SZK/&uå7 = EUPBZ7"# (i;h˕X 9$* zl6m{Rټ%i-˚#]Q(ӻSc9BhS¬SI. 1=)JG b$*Ve9PVVI^y5fDT*x.1ǫk{ZBMa$7Y6=S*1/Yu&[c.x#=|+6[48ܞaOÀ R]Q$#i's?ydotƪ]nQR,ZӺHF% l9[wEWmX5=EOY9;]՗_`ٜoc՝s N&^ܾCy!FQ]Rdr`/r;fR)w'Ĕo22v+ ?_ay{ 锺99_a L>?;|~WhyɬiKfu5k5U1'˾e*8}޴dZ'v+޹yi'ΆDQ$$6"[$=|[T}tDhDŽ+W8q#߹O/=\՛;Q׼茟/S&9ylY!j4%͒%B&ĘtY AN"NQHffZ֞:b1QյL#SZw"6:Osmd4ָa JWJ3+% mPڊUۓOhێF/C!o6: Sw3]L`Aټ%vkN->_SF/n`Ɩ%1^lU"'M#^i.Ϙj*AiNC4}Kz yc.:ŨپX1~;/0!9=17|uz+>Nc B{2ќ3>~ۋxxنt1{p4Ikz**YQXBǮsG^711aJK R?ĄMN6ڒwoZb J'V+0* 8"mAULgVmU}sݝ&ږغQno3a\1MSŸ.Tpfmpwq59GmYӃ8z|ݙeq>з[*K4j`6.YV,FV2SJt9#n3tw/98Koܣ*KUdٜ cƻ\GTQ9olӒxĤ2ؐt[P wvzGxVmTy'3tqc| "|*W|G^Έ{s88;ES>e>/~٤׮Sh1⑉2b*ƕ&lE0jezvF%CӲ7ٛ w<::frrCe h=|@] >Mym\ƇAI"e}na#TFt}VbRV3j?xJV H6Ũ0Fu>zJk)CG]{cʲ`,iQ]AWn.m׉!E,և1mpV$U7d 4z&5"MRd[_fy^ּ@i)">>r=G\{_>[&;|ܰSt c|Ǯ8!}A`;-RQ9~~x!}|/`5{//<wos'KAPnxCY!gWWs1o~Nrp_Zrv{q<&1+Mܽ=G|{wj6`!x?e٧4u"cIk${kTRxyn[[3,daSh YVUx6bdBY]9;_1[e4kȍ'JSPu:E._{x$\Mz7cXD)`% 8L&tZ0He0B h>~~p((L3Lr-"YM9_4X(L`(" ͳqqv$]r8]%5!K5T%{&)g\pgpaܾ_u>20L#RV-MuWQUh #V<=b<Ӹ&b+yqyN)x|ޒtg+?S5*y<eUЬS|]SB#cib)V+NNꌪHL/mY:؟nq)8[4<~rGt>Hp>RZKЁҝ{{a\Y>:hEYPMwx#LaY5 ۼp:{ns7o x;̶w'*gW^owxֻͯ>JEGm?|>KK_2z~3'ҿ_ʭぱz?~wOq18~3so/[]MOqSyɌ+_GͿZ_濾+xO?wUVo7~Zo=9ϳK5ΚRy]f ݯߙ]Ɵӧ,DQXǬ>Q?Gӯ^@t +ë<ϻǷcBDB$/}تf`!yT`H SN^i 6ѭDEh5VE."Ac}ap})I!FST%E8h:Q;L}D'^t<% DQ9a ɇzʪI Ec4bЖSƬո&: k@VP@iEkiWTU :1დ, p@ 0|eYdVǘ%2ᣇбJBBCrTRȱb4n!;Wam|VJQX0M!$ذ$,"go raYWh2F|'^ZI#ٝwB{-fZ_Ncc&yM.4*C?$Y"$gN2J}!REҀ);e1|@+%(Q f jB(\yiuyf * >lBђ %FuMY9%'FEa 1R&7Z*UeP\$o#lY\$,6M:,4MeF-D<"E9ElVQT%AjYQKԉw)`]Vs"W/Rd\rhN|YNlmMŲY~V&f# <{۴mC 3M9]) {tz*l ǻd蔽K\yܹi }oXUY1 xG|bNM&I{3BL+x!ׯ qھ%pN|ՊٌYEe͛|/g3|;| 8w !yYǾ)RGu, EY8pIjwz{ܥ,JQ%znʏ;9e9:_qM^.z^{g ~igFAbl cu`{ʨP'Ft:(,maLdF|f= mV*vf3`LisHY[jK^ Vkה1W]ތB%{icĿ_?Iyz]nF"v2/ݼ̬6S|!mHrn?HÊpHh{֔`txWQZEp˳'ܹ󘎌 ٕy6j8[8%X*H}*/L}.\ȫǷxtڣ^wwjz ~CXE3Ӥw=-؝U04<}zFupQdi9>WbsNT;\Uh%9tIP?'O;(e.xRyBD@YMQj\N<t`bS0ee%yAai.kג1,e;uU[VM,eGL6Ji" YZ)2Ut]  1tn̹1]HbK5XUU}@7mW$edx"X0)`S."o.͠!'$Ժ,QB0qSVy'2"5 cDeQJHd$j$"dTsZ20%UVh^^cezQ˝Eϥ+ϲHH&Ed/VfowBYt c=bZaܿk.\{z5LS&E|iZze>~c֛_%@53cNGMW9p`/䌥yW*"4| \POG[` h[rvUhvGWp@K~фxy/S 5Q]Ɛ$qh wUGOd|+k))ud[vric v[(A =*5cAO2>˲p+-(3_\e\f#)@YW}OuM۵9P0Qж 4gsH&#<)HIVMΦ”Oh'y$JZ1>Ѻ^&RF郾<}G߫ϊXR{}*C6o|k~f:w>IEB0kv%,A CPYvtIkR,ޗ UZ\rp"zt& A`uB ,y27(RJM*[2Fu¹3;J K讄Zw y`gEn2]neeOl)EL%ަu( պSEf{Ύ{&Q B.C=}ʥ`CfS94^:ZKfde%~y Ou-̪*QIG7 "E!qi:˵ N,)2k\TF1( *t .XL K$ˇ{ #լږ` 1'&19Q)r6_b˚QxTrz`"u5fDzNN̗-])mEtJVbIp |1)˚y4Kkq3RƲX,&`< b"@][vvۧ<%ib0%y=jf!P Rp̦1#"+LŪ$Urt`RFG"PQ?ᆆ UnhNr٢PQYq! Ŝ5\2e6. b PeA=׮2K槧lMj&V=}49jQw4ږɼtٲC-!cDNPĖWn^绰6=77nrC92L0X5]?/Hw6Pw~lLZz#Pu .OŅ29e6S AVY6:b_' i&?{d59IM C^a uF)dZSfN|pX4j}s&- Y:b蝓מV'vSFf(2A=h:F7UJks3=׾4ҫ_<$دo|~^_߳uֳoW~dO߮V JD,\m >J`jL6`Ǹ|*f50HDn6l<:u^4Q!T IH60UrM2IY % W90fDk%NFVEa(k֜ߤZ낻(%^AJKqas}V\Dl_KRׇ,eZcE$GgH @LmXQ`$_C2ܦ\BhHBYn\S$E-LVK7qޑt!7V 8Dž*ȅfcfa9*)9,a TUA]~@#c !s#F6aAEB%i2rEt2Tʒ|3cYr~HLI6ɱ)ʬu-AR,F>w""E`2:Dpb 1L36&Duh%8gmD植a]KmG< ᢐBiMEktrCYWBCVT 4ʲE/M.F3j#(*X#[eB.Vm|BiCi+֔ }wfLU6J`Rb^* D.6m 7ЮΘLF `w %ĞׯSb\aFオT'Vp^S#k5uDg%MQ )j<1 XE  ޮm\:ܑ8+ьKa+|@yU)kSղ-U%}v-墡8cqrN*n|^}*}bww!8tUsjYtaljv k TPL s/L|x6.5T d} A%!7ׇLb)$mq`G_w~e*؝M8:zLRptt;OvKW'_̗r1I+{|w~/qމCvw DN0VzPiccg{Mg(ʼϓtDd.4D#6 L bPTr +-͍p !l.djCܰc%N>JJրZgX$ZrK요cjC$Yh`lj-ӣ$fH"1f<2mMPMU^{J C] <>}mOfzuo缧n]E[bYukӖC$8t,Y(B/u3cj0sJJqj^UZzٜs8_i>$0$B>KHʲ^ȏFƋbL-#hQgӸFd8E“ɯXBs+\`$^$w1ČNwPl6P@b.GCpgLSdCs" Xifk +!>4!T$'ƫSXEnrђƟCtsc Cg<nΨ)QU5ZTIpB >26C|FΓFE(5:6jɨ)MØRV0m-?s!}E4D(ro 8qd@CTȰZM[ cN"73JAlOe:L'v*[;ϗ2XCpV1 ڳ=eo`6X.(ʂt&a!4K~Rt$wCRՆl)ݟg ei AZ FDix^|2M`ogmlz6&SJxQlZ3Kv N\e6&#p9 ; +go*ʹ+ t:A[j|QT݀O t9J79gMn,;BlM&jիqmC"pwwٝ|&xsoOv0ї1 so?/OK\BG^0zU ʾ=?S>/s*[[e}RE5tmO:J% {㒽QG_zلO~eҜ=%+B|:w=_ْ=*!2_{S'ˣ.x4seX6+J[2 VAa4V%3_X Gu7L_?Z3DZ ڟMIq,ig4B ;|.)eک Au`*77[j]i ls4i%԰~{i郗FiBr#H&(3@(Ԣ(!#1ndeIY>H6+--4ǽ IDAT Rb\&L [S( -,.iYں:H ȦIeRTu Vm%o Xg+(Բ8m$JrУ[ߘeT 5!bm?mLIұ3ZADF^;|'EҚ%Z|PCtшq=$bhC ˊQ=LuQ )HNrք.x0` Ҕc!뚥v>ASUE}Jy"Ǹ"Ih ck:JXSf}Ne38jE!9KN[iXJ+`!r@u9&lc @0T6:7>E Nm66I zYl%C b& -(&zA)ZI}S-FFX+U-0chZيVb{lQa#mC* ɕIZ2]d\sxˣ'O1Ō'!DH 52lOxJ~eW Q3KWry=15>$OYu첵5UǪh۞&}BB1Md4*ٚ]51i&:j%!%UU3?_e}I;%|ْv oˍQ %M[~$7uh<#Xc>C" W|C/ Iܾ%j_yIopS?>x]&:<9}Pp~@HO~EBc\z`dcQˇܹ.[:e9|t{zo.q8[4<|zJ뤨)b{t`֥kJo)xes~|Cʌ ԫ(r,*;'Fa3{2-%`yk$^)lxQUYijnchO6h|MJUʆ6p- p!$wm,aPJgβZ FiLQCh|RLׯaMR3ykBwaޅE%'yJP)buCknGDtQ%Z\ 7ZY .|u,E# c VR3bN^eQPD[ yP12OU%q* GN*jǣ4BJkʪz";q1HU6dhF ڍ[6)1`\B ׯ%L/(ߥ).1歏x1s =+&d>WZ:2RZYJ+&-J1eyKƘޓa!-K] Xn>g}P!BZUVb{J[0> *BqU |Hr5THHL20nHIYeXIR w\rlg c+~:av;JRpk֬"zbbgkO7o^'o1֝Zd9_vUqi蚖hJ=ђ,ہed lOh{Ϫ!݀Nߗ[1/)Y+LQQ#=a\t CV%˕"mHH4.wJdRr<ѣѤ"&'LZ5d}^o -NO$ѲYA9:kS9o;.h$i CJļv&+,-~?=dη͊kw؋l w\fwq]ju*v8_,h;&[3槏m$os]8>A;/h¨p^ I穅.˯6PJhS0ehNrflwrq)4d:$If5NZF,1ʄMNUDìn7HYɪLlGm 1HS#q75aCy!玬E͝)Txkʲ(+X%oF O=/|u7Z:ω :$!<zʗ]7{=^ KӭsHI Q&`;'EWxM)ޓr>sds!\ V\++S,ʶ^%^k{liFid<yMSjqXx)ΉF>Ϙ [PeMwJB ~}3Fc P~peQhUd6қ IŨ*H ZZ I[1{N O,*>o=0 !  B5>ٮ$d7$cx9dUլVJ[z^?_&4 RXd2#3L[{soP$*3nO+)}HBB&Lcl~g;:4,gA QA!̅xsTYg,gufab4ɻ0'֣z!KmOaB @av. dc93F->3o[c^(^>0jR)mHni:= ] &eN_Hc"QeM׽\'b e&"3ǀNw}JbSm8h2m%$5cN#?|؈n>bonC&ٳ`HĆvex Ϝ.~>CQe-)A9mxꍁ3T"9G RNp Y`?ln1L Ô\q2)iV3׫7w`;0!g4y/1LSA2 >`/  -H!b5cu1P"37e U<8 P ^&o?b {(cY?Ĝqqq3ie ðE9ll>G6׸%s)i&p-G8aZ/qz:Cpx*؇=6vbʄ_a hoc\_`?8b|<%\!wxv p~~wR,w/##)OBx܍؏nwݬqqWOv9G '×lgXZ,0E|`G 11N/c-4 PTU F 6+&6` ct҂ $H+I8DO[a|)+bv@iQ 1(@d_ī{""PImjZqpndIPu1/oX?h /y43xfnRJXoν5R ӲO֧Q&& p/S)h4clԉUZ8r1ixuMŸ,"+iĭbS(b["wH^@qb4ǺvFC8A3 C|LFReD&ě2f"9)Ƣ4m]i7\z#!CSa!?u jެ ͺjR$i׹niVMc*I %e!&|^ı-2a [ xB2g8Fp&5C ]ʋ OV㩿bDĩ͜/7q83]CuW$nq,jCdxNY)eO"1F#儒 hf;6( Zk;nT 8 GIK qcQHLAl`@" +RAUV(a昀ydh)VMX ӱd(bTh ~Q捂Ja۳&9ύf&"3(LZoQU:G A#YHYEJgӚqʝb/@NY(f,]- etޡ(H%X&){ho` ߳GR(U zgX,0ňv`3sPJ7D"4e`{ϟ;!qxM*C0k a/H"Vx L! J -̓<"ed.H≐K跛Q8l5`xi;V'pwy ~av^O2}X.{<ڄh`?J";]f+lG`7!Zڍ Z>{) C ~+ X߼yVػC?;G~,pGuXxF'h1&60l{i8U_`Ң,a"¸vG:^opaP0[x: l T7,u&>-1 _ݷo f3?E{ Ξaqz `¿}9@-ΖW)i aG//΁ H쯯RP1h,UCNYxzSPC78P*aW]o WU)lH& A3pvˬ9V1#Ps+?LEC nj̨Lټ;=:жֲ! 0C#}I$3u^8am6Pb\%~Lf ig5'T H⺖ƦHjVi/24v)F~!8פrZp< R<冄r2,!(1L]ߡ;ekaZLMnP{%jfK_ZTŁkz,ɺ40`tN00Aҟ3 Jj/* 1ZaĜiwfnFy(`btd8"|^9b̡FLp+ZsM|/D6reOY gJa/B MgHjI DDZePV@dctg||4iMlٝs,n.4Bkr0 \ZA 1 0C^)"L3F`5#a#]9aB[L[E?(ȉ,j8o5A[)g(iNi) )C[ՌM 1@sf\BƋy?ˑ4XȶERCčpQB[J~+y7pBAu$,BJcؔ-k9rZ@$1 [8c轐a@Rl\-b*pXLHpyNYk~Mn{:1@udIleɎ|F1gδЊWUZa723%1LS@;f)\v(z:HAE r"P5Y h894x8&M21Nen$2]_|GfshEb~9B,ESCKI1 E¦$1[ dQ7d8gN 5()9sJa{ma6z˹pQJ:yƀ9ܽ{,CtIeR&&<MYE>1?/^)6k; נO{l cۍPp0Gi)йc@2v/N,~y_ovx~8?3ӓK="RA7_` Þ5P(CIa8B㔐R"4D ݈a"0#J4%<ܤV3VY2Ey83;g*[`tq,:Z4TjLR"5P-P 4b"u ;whnttD[q)_NI6NZZ /换[^kd% ]T^4"jcCkg`ȁ%ph ~\%(H֒$B!&?75Fs ̧ b9Ff18=cLZD@Q$^a{B,\^j 5#ϠŦJY縸=FadjAM<_/=hjFCkZ2$~pM)ZsNtܕ3ȟu[0[i|qJCeSDҤU51@K: {r4w@)@Cf7 0O(Jx)j94∯ n? <{@CHGO(bbx!gqGЄ_ŧ'՗q'L~G{  S.xM%޽P; 9w8;_qCps7v in>rFxd-3%|ch{̄YbA0|[X0 #Baس&lˋm S"E 4JE ϟوN_<˧P%JiN͇}أu`&R+# Ƿk salgÏ8#>"N{SWȊW;W? .@"!,2XGU 0QyER,<0)EV" b1~'SBOEOG\}#G*ơ?2B5&Lg%fW ,mj-K\<Į_uRIJ&IPtTibTbfs5s$GSBM 6ZXPyYJRԡ$A\=/Uc  SdAΑb@k 5LWp1|k{E IDATiyoňH缼Ը۾i:LCK@<2)Jp777L" ȦTDO$*l܄H~jLia9UoK.GrưjR2NWK̺ctc"$xJ>0%i5!9H:>"UVԲ%T䊴X}U[%C&'SJÒ/P z*װ͢wuRӎ FÊ Lm cj>yu)#Ćf| Y /(&O9EnʑV":v8d: $sC-:65PB1˳#sYTz)Δ,Q 7%9:2-ľMێ:HR`CXFbdiH)rs'ÄSXN펩SBf30-^Ҹ 3g%~AK시 *NNȓe>wʩ5-]>H'5њ-{6A)n4Sft~M'doCẳl L*1ٌ\CNkgm8cKb*x")ug#|}>y&!9٨͵F!brf@Q 8n<Ssz RI&[)[T(3xS:Ϲa]L` }"] 6h@Yu01L0Fc? {0o6G8o$={' P-u1Ai"f77kKl)"J^چ%SE5s!U'OϞ_G}>ObotpJ~M6nV2!1m E0b a.Cۼ/VY-r USX0DvbS:&V[6;!&.i8=~ثOWzsP_s0z |O_<|0뀿{l7X.z3%^=%|pZq&{ S |`B?b_/i<{7n1Z^NLSeq1@ZmV%Y6%V|d.DEQ!y!jGZ$Whա;3 wBEee0Atr |wCi>PiBiD0ҶV"2#{DR& ^PaҍHdɋ6,c2ZHEtx*AVh&"AsUw@'ڈ7AKѩɪw!}h`ga*6XfJyj!A73ȅ KxXRH6 iWmPdj,MFpgRqj}'R A8`(D`kvD&\PT'GyEFk3ďZ|H=ğѤ9w{3)&SU8hn(9{.F2BpT ꆁZ [TX^䜓MRʄ:(ۛ pjt4MD|qFS$H8b$Uk1ZTAK2 gI1"o 7x&C8@1*v7EL)Yf>SB  *,, rs3TgOscibieUsN:m( UJFQs `:eaW_MlPdSo4}f ;\-rdx(8lҚ%S)7Y$Z2R"m bX%ojx3>kDE :y˯yd52aDkQ rh) \V 1fd!2I|7ٌ}YkrAP?}eFL#װZOdM`mqvvq v5jՓSfCpzqr3V8m1?>{zWKk-8==fo߾Cn>Gq;P)aBʄżg,e:)=}0yj=p&_ϖ8q9,Lհblr !M8=9ּReιvg_|f=?;~;pӰ`+9v5lnLp33PbLk|87?ӛk 1b{Dg ~kh)!Lq##G|K\_݇k+ϾD ;\=2)޽/>*8>\d7G}k"XAͿb"g&:g5.N\eJ+5E 0pZ7 OH MQf35= 10o:1pN2OQMEDc1"Nͫ9b6d kIZy*>L":kQRCCb0,ق}) kR"VQ Nυ=,SRWM",#8~>E&9%@Ng6BhJ04Z (!6QRڴ\IӕiE&gcMkV닣(@5jIR`j uO"PFF}l^'dRX<RZIsiRbi ,w, (:if"$e5NV+!",fsxlja70Y :u泙+vjcMd&)eL z+E0=hByg IXPfcfa03J0M5u(U9Sbh& tq/H;Lӄ3)4aXbFI@隘"#ɖHT TTpVA3*Ws Wj'P8lj~_%ZCìcM3w xן>C*BޠGLlaEP{|~(`Ho ߼^`_w=)\Oΰ"AVa3=9Eg-}/i3 :dirX:hD~'3k|3=:t5 Z)?`>1𝕋Omw1g' Dep8_ .̈́9g/G+{13ܬ7\ ?{w7{ X.Om3 :ܭO_^~41SLl=~%sXJA4#'ggs F E:yg`%j媮|#儮#qAf=b◜VVpi -)LTX*E1 m@Uu:Y4!L@.ljuBVM4"%axr>P5jӕ?GL_¢i M9gV3LhuX#q-J̼(.Y Mes.Q4;kb/z6׼GI|&N3?Y|6&,x)o >ZVI`\ :|ccUќ d)}ǛqxZČrV t%]ݬj.N=AYM3 ERX;t{Dž ̺9gLwɣVS+-84VΉ/'i%B~^٪8x)ꪁ77.QC^jbJIS;!IAzdvW{NqeArjtrEіe?{.BaC y깧Pe,r*lƴ)icģe}&n! $s)&l,FI¸[R=gDn<@Q6T)9lJmm5 +bYcYs@L*"!4@d β-c]8_&K:aS(Pмsu+X {:j3ۿ?4%SrGfE62!lP<Sq81tEO+eHi|68E1ް7`tCw9dXqXK={J(Dږ+4 I}jϯ̅ [!Nws4a ¬%31,+ {c7eҹNu%ZaD8qhoPcA dTJ$H2g q4 rXSEgv"jy`<K媎|4U5)g?T>s\qbؿ#wUTjZWP[CbFA'Bv6u>T9(Z:ygްX1!ɿE{1VjcLb& )(0昋[cɜ4\o S9y #h`b-DЩ WHY's qᬅN"8jĿbK-yJBהLEIӠ,۲Ԇ+SbTxŴ-jQ=N6,[BDȉQޅxXLd5!Fe;OW_*) ѨA Rd7mdK5#)& G0j~ai*ӆ:hlmclM`5; k .n`v1(CDP"TKUvyU qy'%h$RwU#OIl!! c#d ^΄:dYET.e㰷B$ YԲ؏anLa9\Lk$F;P>WXEզɵ|\ 974^ADYBqQuc3u q7UYj߳9L2ȨM vہF%~LTDmQC"피C8S\Kg{ܙCV Q5ZBN)F9`ǟ| ''gi2QXJm7΁R99| >sܯ?@{ӳS6x{k&t^ق'sg`0=`"v ӧ~ (i ׷X,W(8;_(EcOpcZ"_I_ ˅F,O<6]D4"ǿ6=|ȔW˫A#$1s0rV)@PWj2S< n\˘t SV hحYBM(70YJ&UT Yy8K&IHR%SFeִ| سpR g1\7 궣TbmE%ȥ@IGȥ\1E.F]SLabl%A V,aIj OU]yHڈ o|E6&6MOEL:HF&|dOE5G#gmZ(sx_&Z~H{967}4Ian"jE97b=f&"9 C0ϫǬ!$U w'KDl&H!t]"v}' ΂rNMBhyLn:u9ڊ$8~`DsTʩy8inpnw EPɠ4rI3&̈́51b1-D?1C[YUbѣ9([C)1Xlw!]a&`Y]j/LJ=qwð v3@gZSNpw;t`{y^*'xA`V0%Іh IDAT9"=B&5*IJu.tR{ deFD!wHF/ҊM^)/Rֵ'H"GЊ͉YN8DJbjQGFr ! Ԍn:6C.iY(_HOL6p+"%6I>A WwdJ]k@LΚ6i" !Y`w=P8A{;F `4˹kq6q{u)4Ǭw -QX@P F6={jq!Ř2ZWMkvQ@Ą |dӵqtmR)#M0k ߁"b1ohgx%7u"0{AE_+ <&_:KPnCCns4I`ݠuQőRݴ5p|S mW*ƅveStՌWKPDbG ƒWɋ2I ijxdԯy4n&Um+njR)iLv͏4 }mT]{i,rA╤u}mpqn4J&."%8c"KRSkmL9޻1̙7x$1c%t&voa;%W- U%AvwG,#F8P$uxؚط CR* }zSBt,G|E?kx/DY|iBG-}m !E - Sb5t&kNt윇3s7"$?lQh+ץX"i;/g]%_#N6V&Ҙ,7!TD/l8NͲK|Diq Y cJM()`7(Jaio޽}NO'8nnZxx\cqˋslS-0Ma!z0FȘ>yLPW@9a?3f #gX-:,' ]w+0&<<0l1Tؓ2pފ'E#߳$q1G}% 1A;`;2،~?lX1wOlb>ACq]w즈n;|% Ͱ7wxwf'ϟ./@S;!A` \X*9oeaJPL@*pg0_xzu8Y=nÛ<} ˓~xwdž=62. XCL@)sBXqzrc 50%A+O_\jjd-w{dv6n ŒȤɥpCeq Cy[a.zg*1"98P7Ym؏ ˣfiZ9M 9#DRMH#p^97?&]3b0H?6jG4k36D Tmr@HǶ"r0Y^h/pڴ1Eh$ҨD TRCZgUɵ[cR].4]CL\i`Jb)uR*n2Bʌ( MʅBly' ^SוP4+ZCd3hږC4%K4>aB bs/5OȜN %}۳R:1R{<>n9ܛ)1O17>7E(XT % y apI6W!p,Kɭi=K)4o7ju8nnRhӧ?6Rd;i|j"g:zj[#,l3W(tƴ[c抩t=G[1Z9F'^ 6`\=C`l(f(IT2BJo+U.Sh0qrքu6E.<⬕rh`j[֍D3ɬmrX0 Y&3b& )v2OsF |[`wFko8}5'F˦V0EXwrIci3XzWO.1xX>JQrDMD2#L mjҲ4 =3ƃz՜>#Ͱ?-'Wd6{d.uqQ) !˻Aֳ2 SX`~v|ղsl:|O{(eۍ8=f>q8(a?lkSddUy0b?F !c;g]l~ bIf?|@~b't^{W<"s(wôqWOOWpJ9lOϰ/߽_݀:L9t@Q?%~O"v'| ]^>9jfXzA;<̀/_=bx'A8[.)20 xvԡS޽_c; =8p`F]F埿7Fo#7 1SlB1Kz|龚ڵC)P:rc3JFӒR[c2 .Y %Urdj"ű@Qȉ$* LCY0Ru!4?G!jHbW25E:EL̏ !J^ˇ>6~6H,x$j~[V@ʟEBjVMa ᗃQRnj_6ǣSږ|.E.PDf[1u\ %,!@ ˽NY'tiÌaK6D_c@6D|D/)J@\lC 8ИΤ}GaQIZNhƹR@,ZW5Z-e.-#?OX@U( 샄"VlN[J j/5"Fiڄě$D4fp0YV^м)8. Pt}/ W0}=.~V,H&LLpWn.io"B*Yg>'f#(G m\2752NVv怸#1h~տ?8 b1'ΚvvD^^tqG2L\CY X$YrKXJds>!H3gD/MA甄 &5gpAm9#c8=.r$N0_]#Gr]Ϭwl3#34,[ +ow/j!@eKCjH^YFdgL ++"3|)|E,to*RcOrgaA9 ysՄPD *a@'bI"#suX8¡l|NUJ _*c0Mq<qwG4ǧ M8'2m>&OK€~RSL*FKd? {@J#goOP6$@Xw.V++4өBw|@r uQ#W |X.ϰݶkfj9GJb^>i)\,ph_^y{lvN$&UznU`¡m и}lZ2gg+7_j0 rDdbS TfC@ b8b#޼uo)֫ A5RwWgPR c+]ٗX.'6X,3p>|ıh{mcP!b[{bTlϞ}#C[ flJB}qW_J5;X{ 3c״Z!N𸹹7== (P7l7Klb Hdm>')cx!P8 /'&$ٌVReV,9]f1ucKA]NL*􌴵ڞ٤H1#y}β(r,Dz'^I(̤d%ye"b"/r'$bLRlx=htNFL2*~"X"&$k3v!w H8"i,\-5$=V%YeAĐi_;0EF`+L&毞O܊HJ -cG?w`!88N׊`ʐb(02>IT ;#O6 t^w#cЇ)SCpCS~(Q}Ɓ,W}nޏI.++m+"Ti&c7I9DjŌٍrm@t9ܰFSqN&wó5k:Xm-4Iwz?|Zf!pPJ/%ub"{N& 0B"}!fͱ`rgGañsǃw4Jp(񠑮U%D*tRTCKMI@ε}D;-҆#*PZ"<{<sxKar5yY}/'4#XxR*i,r"wU:\ EVN@o<扜/)@)͐!Vc`~8>TS&i]^3%B)qΙ.BA@F - YHIlVRBTJ دAHYD`RJ>#BXs!a  @45fr@BKB1_%ˇdȧpՁ!&KI^67bya ib8&\B@PNC9+&J* >uᄀ}'EТmx/4J2ടGOQ\(Q>66$˞ yF~FX@V J'+9 L @7Ңxv“ !zmvhZ`# gg Tv(o>"@$>@) JCBcb5vdb7M86v==7- tmcBv|j:pDuOVaݠ, ^?yDl577 n8>npзƒCCG}6ps'g3`a>Y/|dԸg/(NIw[<;(iA]yJq.Rig֣>:n5sa{!-?#|` &96f m:-GE1P#`{b=P-n~d9/.aLj@=m'COҬ߿R롪 ࣄ2BMm+jB+ f/uV5PBòt튽J?X2(.'* H2't@[qXJÛ\vA4ԧ<1hfs[F L )(L&hSɣ~4I+)1}fs6eS`%sb/B#"E 1L')9{ĽLʾ$ˬ8LEH58U@J )$ɒsHB)1 ONR;D<+>,-Ia*lD'yRӴ64!pƑ,I*"=".r&4=H}ʇH{b\wHt5:q W  qjRĢH|d8"(_9T9T?3u`H9 P°^1|4ƐQuc FSȒ^iSj%*%9K"&>ge` É x@ mU|=פ~I2&N(2U@S\OJQ bQ6@AkGhv2ُ|cmޓ/LLi]2ObB !9XkrCl%G0Cb~@Qhaf ]z=Ox2{I缤sfyi'be-7<749Sk CHŇGDd^#ϧu䆜$:FRVyVq(ellg]!zL%s +j,K{56Gܕ˯b<3:7/h=)}@ - ' j3l6 ",Gn!{]ߡi:~@M'gkH9}Q{7w58;=sw!J Σ]k<../ps~ Sdgp}@pCc{;xl5G];:~ @N&#&١4TB~5޼R 4uW_|LJ;a>_`>0`k! u]͗_Zۻ |L@R>EPS< )ԁ]7;l-z Fc[oAUdpw7y~dzgXϧ8?_7pnvWWĢs$rgIJf FnɆ(P!zR4~+- 'yM0Rg^.LS8<؜>qBfbޒ  !Z+;瓮 5_HRADq'}mW BpAvT)%~*k22 o:M@5Oe8F5>qE0#H=A'OjQSa5} ~0 .~ {GH I7$2ٜ#s*>uG@?: c04-!}>|>֎EgA*S2u.">ʷ!MF@Ge&3q`'{&SLC1E(hɑO1=OyLv|_P+bi+we4V' CT_5Hθ$ -|yJ乤aA3t.ᨕPUU > y.~傅zGb I=[! HY50 ?~/hIENDB`tickr_0.7.1.orig/images/tickr-icon.xpm0000644000175000017500000002315114107736721017307 0ustar manutmmanutm/* XPM */ static char * news_icon_xpm[] = { "32 32 475 2", " c None", ". c #F38E49", "+ c #FFA365", "@ c #FFAF79", "# c #FFB381", "$ c #FFB583", "% c #FFB584", "& c #FFB684", "* c #FFB686", "= c #FFB787", "- c #FFB788", "; c #FFB786", "> c #FFB685", ", c #FFB483", "' c #FFB07B", ") c #FFA367", "! c #F38E4B", "~ c #EE853E", "{ c #FFA76C", "] c #FFB17B", "^ c #FFB17C", "/ c #FFB27D", "( c #FFB27E", "_ c #FEB37F", ": c #FFB481", "< c #FFB482", "[ c #FFB582", "} c #FFB380", "| c #FFB27F", "1 c #FFB07C", "2 c #FFB07A", "3 c #FFA76D", "4 c #EE8640", "5 c #FF9854", "6 c #FFAA71", "7 c #DA996D", "8 c #AB8266", "9 c #B48768", "0 c #CB926C", "a c #ECA372", "b c #F7AA77", "c c #FDAE7B", "d c #FEB07C", "e c #FFAF7B", "f c #FFAF7A", "g c #FFAE7A", "h c #FFAE78", "i c #FFAD77", "j c #FFAC75", "k c #FFAB72", "l c #FF9955", "m c #FFA263", "n c #BA8A68", "o c #616263", "p c #5D5F61", "q c #5A5D5F", "r c #6F6660", "s c #A07D65", "t c #F8A974", "u c #FFAD76", "v c #FFAC74", "w c #FFAA73", "x c #FFAA72", "y c #FFA96F", "z c #FFA264", "A c #D66E28", "B c #FFA366", "C c #FFA568", "D c #BF8A67", "E c #656667", "F c #686868", "G c #676767", "H c #636464", "I c #826E61", "J c #D09269", "K c #F9A66F", "L c #FEAA71", "M c #FFA86F", "N c #FFA86D", "O c #FFA66C", "P c #FFA66B", "Q c #FFA468", "R c #D76F29", "S c #CF6B26", "T c #FFA163", "U c #C38C69", "V c #787A7C", "W c #7E7F7F", "X c #777777", "Y c #707070", "Z c #6A6A6A", "` c #696969", " . c #656565", ".. c #8C7260", "+. c #E99B67", "@. c #FDA66B", "#. c #FEA66B", "$. c #FFA66A", "%. c #FFA56A", "&. c #FFA469", "*. c #FFA466", "=. c #FFA061", "-. c #CF6A24", ";. c #CD6824", ">. c #FF9F5F", ",. c #F6AA76", "'. c #E6B18F", "). c #DFB394", "!. c #CBAB95", "~. c #A99E97", "{. c #878A8C", "]. c #7C7C7D", "^. c #6E6E6E", "/. c #636363", "(. c #615F5D", "_. c #D18E61", ":. c #FBA266", "<. c #FFA364", "[. c #FFA05F", "}. c #FF9E5D", "|. c #CD6723", "1. c #CC6622", "2. c #FF9D5B", "3. c #FE9E5D", "4. c #FF9F5E", "5. c #FFA060", "6. c #FFAB73", "7. c #FDB27F", "8. c #D5AC90", "9. c #91908F", "0. c #7A7B7B", "a. c #6B6B6B", "b. c #595C5E", "c. c #C0845D", "d. c #FA9E5F", "e. c #FF9D5C", "f. c #FF9C59", "g. c #CC6621", "h. c #CC6520", "i. c #FF9B57", "j. c #FF9B58", "k. c #F69759", "l. c #EE9659", "m. c #F5985A", "n. c #F79B5C", "o. c #FF9F5D", "p. c #FFAC73", "q. c #CDA589", "r. c #7F8385", "s. c #706F6F", "t. c #575B5E", "u. c #C28358", "v. c #FC9B5A", "w. c #FE9C5A", "x. c #FF9A57", "y. c #FF9A56", "z. c #FF9A55", "A. c #CC641F", "B. c #CB6825", "C. c #FD8432", "D. c #FF934A", "E. c #B6805A", "F. c #55595C", "G. c #5D5B5A", "H. c #796557", "I. c #A77757", "J. c #E58E56", "K. c #FA9959", "L. c #FF9B59", "M. c #F3AA78", "N. c #8B8785", "O. c #727272", "P. c #666666", "Q. c #D58853", "R. c #FD9854", "S. c #FF9853", "T. c #FE9955", "U. c #FD9249", "V. c #FC8333", "W. c #CA6825", "X. c #CA6A29", "Y. c #FB7319", "Z. c #FD7317", "`. c #A6541F", " + c #363838", ".+ c #4B4B4B", "++ c #585858", "@+ c #5D5D5E", "#+ c #575A5D", "$+ c #956F58", "%+ c #EA9053", "&+ c #FD9855", "*+ c #FE9855", "=+ c #90867F", "-+ c #717070", ";+ c #625F5D", ">+ c #EE8B48", ",+ c #FE8B3E", "'+ c #FD812D", ")+ c #FC761D", "!+ c #FA7217", "~+ c #FA7318", "{+ c #C86A29", "]+ c #C86B2C", "^+ c #F97318", "/+ c #FB7419", "(+ c #A45018", "_+ c #242526", ":+ c #242424", "<+ c #1C1C1C", "[+ c #1E1E1E", "}+ c #282828", "|+ c #2D2E2E", "1+ c #333230", "2+ c #BD672E", "3+ c #F88031", "4+ c #FD8331", "5+ c #FC8F46", "6+ c #625B56", "7+ c #3E3E3E", "8+ c #2A2A2A", "9+ c #1C1D1D", "0+ c #643313", "a+ c #F56F15", "b+ c #FA7218", "c+ c #F97218", "d+ c #F87318", "e+ c #F77218", "f+ c #C76A2C", "g+ c #C76C2F", "h+ c #F87218", "i+ c #CF7131", "j+ c #8B6F5B", "k+ c #6D655F", "l+ c #474C4F", "m+ c #363637", "n+ c #212121", "o+ c #1D1D1D", "p+ c #101518", "q+ c #A74E14", "r+ c #F77017", "s+ c #EB7B30", "t+ c #2E3438", "u+ c #222222", "v+ c #10161A", "w+ c #C75C14", "x+ c #F87117", "y+ c #F67119", "z+ c #F57118", "A+ c #C66C2F", "B+ c #C66D32", "C+ c #F67118", "D+ c #F8751D", "E+ c #FA7E2A", "F+ c #F38B45", "G+ c #AC7855", "H+ c #454A4C", "I+ c #1B1B1B", "J+ c #0E1317", "K+ c #BC5713", "L+ c #F56F16", "M+ c #F9741D", "N+ c #A0592A", "O+ c #2C2D2D", "P+ c #502D16", "Q+ c #F26F18", "R+ c #F47118", "S+ c #F47019", "T+ c #F37018", "U+ c #C46C32", "V+ c #C56E33", "W+ c #F37019", "X+ c #F47119", "Y+ c #F57119", "Z+ c #F47017", "`+ c #F67621", " @ c #ED843E", ".@ c #594E47", "+@ c #2D2C2C", "@@ c #1A1A1A", "#@ c #191919", "$@ c #171514", "%@ c #E16615", "&@ c #F66F16", "*@ c #FA7822", "=@ c #2B2A28", "-@ c #202020", ";@ c #0C1217", ">@ c #D46217", ",@ c #F17019", "'@ c #F06F17", ")@ c #C36D33", "!@ c #C36E35", "~@ c #F06F18", "{@ c #F16F18", "]@ c #F27019", "^@ c #ED6E18", "/@ c #EC6D18", "(@ c #F36F18", "_@ c #F16E17", ":@ c #F38033", "<@ c #4C423A", "[@ c #252525", "}@ c #181818", "|@ c #161616", "1@ c #6B3714", "2@ c #ED6D17", "3@ c #F1711C", "4@ c #9B4D1A", "5@ c #232425", "6@ c #161717", "7@ c #854214", "8@ c #EE6E17", "9@ c #C26E35", "0@ c #C27038", "a@ c #ED6E17", "b@ c #EB6D17", "c@ c #C45A14", "d@ c #5B2E10", "e@ c #4B2810", "f@ c #A74F12", "g@ c #E96B16", "h@ c #EE6D17", "i@ c #E4762C", "j@ c #252B2F", "k@ c #090F13", "l@ c #DB6515", "m@ c #EE6D16", "n@ c #E96F1C", "o@ c #12191E", "p@ c #322012", "q@ c #EC6D17", "r@ c #C16F38", "s@ c #C0703A", "t@ c #EB6C17", "u@ c #D66316", "v@ c #0D0E0F", "w@ c #121212", "x@ c #060C10", "y@ c #AE5113", "z@ c #EB6B17", "A@ c #ED701D", "B@ c #86471E", "C@ c #212222", "D@ c #141414", "E@ c #111213", "F@ c #8B4413", "G@ c #EA6C17", "H@ c #EF6F18", "I@ c #372215", "J@ c #090E12", "K@ c #E26816", "L@ c #EA6C18", "M@ c #E96B17", "N@ c #BF703A", "O@ c #C0713D", "P@ c #934613", "Q@ c #0F1111", "R@ c #111111", "S@ c #582E12", "T@ c #E86A17", "U@ c #DD691C", "V@ c #0F161A", "W@ c #131313", "X@ c #442511", "Y@ c #E76B17", "Z@ c #E96D1A", "`@ c #7A3E14", " # c #171818", ".# c #0A0E12", "+# c #BE5915", "@# c #E76B18", "## c #E76A17", "$# c #BF713D", "%# c #BE713D", "&# c #AB5216", "*# c #15181A", "=# c #101010", "-# c #6E3713", ";# c #E86D1A", "># c #E66A17", ",# c #EB6D18", "'# c #211812", ")# c #12100F", "!# c #E76B16", "~# c #E56A17", "{# c #9B4A13", "]# c #101213", "^# c #0C0E10", "/# c #A14C13", "(# c #E56916", "_# c #BD713C", ":# c #AF6533", "<# c #E66E1E", "[# c #E46916", "}# c #EA7627", "|# c #604B3C", "1# c #3A3D3E", "2# c #393A3B", "3# c #404040", "4# c #DC732B", "5# c #E26916", "6# c #E36917", "7# c #E66B18", "8# c #4E2B13", "9# c #303131", "0# c #2F3030", "a# c #0B1217", "b# c #E26716", "c# c #E26917", "d# c #AA4F12", "e# c #212527", "f# c #303132", "g# c #242627", "h# c #924410", "i# c #E56E1E", "j# c #AE6433", "k# c #E77A32", "l# c #E16816", "m# c #E8782D", "n# c #C78051", "o# c #BE7F54", "p# c #E47C36", "q# c #DF6819", "r# c #DF6717", "s# c #E06A1A", "t# c #C0733F", "u# c #B67D57", "v# c #B67E57", "w# c #AD734D", "x# c #E06F23", "y# c #DE6615", "z# c #D5712F", "A# c #B17953", "B# c #B77F58", "C# c #B47B55", "D# c #CD7132", "E# c #DF6615", "F# c #E67A32", "G# c #AB6435", "H# c #E17023", "I# c #DC6515", "J# c #DC6616", "K# c #DB6313", "L# c #DA6313", "M# c #DA6414", "N# c #DA6515", "O# c #DA6415", "P# c #D96415", "Q# c #D96213", "R# c #D96212", "S# c #D96314", "T# c #DA6312", "U# c #DB6314", "V# c #AA6435", "W# c #A25F33", "X# c #E07933", "Y# c #DA691E", "Z# c #D76315", "`# c #D76314", " $ c #D66214", ".$ c #D56214", "+$ c #D46214", "@$ c #D66215", "#$ c #D9691E", "$$ c #DE7833", "%$ c #A36033", "&$ c #84502C", "*$ c #955D38", "=$ c #955E39", "-$ c #945D39", ";$ c #935D38", ">$ c #945D38", ",$ c #965E39", "'$ c #85502C", " ", " ", " ", " ", " . + @ # $ % & * = = - - - - = ; > % , ' ) ! ", " ~ { @ ] ^ / ( _ # : < [ [ $ [ < : } | ( 1 2 3 4 ", " 5 6 7 8 9 0 a b c ^ d ^ ^ ^ ] 1 e f g h i j k l ", " m { n o o p q r s 7 t i i u u j j v w k x y 3 z ", " A B C D E F F F G H q I J K x L y M M N { O P Q B R ", " S T + U V W X Y Z ` G .q ..+.@.#.$.%.&.Q *.B m =.-. ", " ;.>.=.,.'.).!.~.{.].^.F G /.(._.:.B <.z T T =.[.}.|. ", " 1.2.3.4.>.5.+ 6.7.8.9.0.a.F /.b.c.d.[.>.}.}.e.2.f.g. ", " h.i.j.k.l.m.n.4.o.=.p.q.r.s.G /.t.u.v.w.j.i.x.y.z.A. ", " B.C.D.E.F.G.H.I.J.K.L.5.M.N.O.P./.t.Q.R.S.5 T.U.V.W. ", " X.Y.Z.`. +.+++@+#+$+%+&+*+#.=+-+P./.;+>+,+'+)+!+~+{+ ", " ]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+9+0+a+b+c+d+e+f+ ", " g+e+h+i+j+k+l+m+n+o+<+p+q+r+~+s+t+u+[+v+w+x+e+y+z+A+ ", " B+z+C+D+E+4+F+G+H+8+<+I+J+K+L+M+N+O+<+I+P+Q+R+S+T+U+ ", " V+Q+W+X+Y+z+Z+`+ @.@+@@@#@$@%@&@*@=@-@@@;@>@W+,@'@)@ ", " !@~@~@{@]@^@/@(@_@:@<@[@}@|@1@2@3@4@5@}@6@7@8@8@8@9@ ", " 0@2@a@b@c@d@e@f@g@h@i@j@@@|@k@l@m@n@o@}@|@p@q@/@b@r@ ", " s@t@/@u@v@w@w@x@y@z@A@B@C@D@E@F@G@H@I@#@D@J@K@L@M@N@ ", " O@g@L@P@Q@w@w@R@S@M@T@U@V@D@W@X@Y@Z@`@ #W@.#+#@###$# ", " %#####&#*#w@=#<+-#;#>#,#'#D@=#)#!#~#{#]#R@^#/#>#(#_# ", " :#<#[#}#|#1#2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#6#i#j# ", " k#l#l#m#n#o#p#q#r#r#s#t#u#v#w#x#y#z#A#B#C#D#E#F# ", " G#H#I#J#K#L#M#N#O#P#P#Q#R#R#Q#P#P#S#R#T#T#U#x#V# ", " W#X#Y#Z#`# $.$.$+$+$+$+$+$+$+$+$.$.$@$#$$$%$ ", " &$*$=$-$;$;$;$;$>$-$-$>$>$;$>$>$,$'$ ", " ", " ", " "}; tickr_0.7.1.orig/doc/0000744000175000017500000000000014107736721014013 5ustar manutmmanutmtickr_0.7.1.orig/doc/feed_formats/0000744000175000017500000000000014107736721016451 5ustar manutmmanutmtickr_0.7.1.orig/doc/feed_formats/rss10.xml0000644000175000017500000000105014107736721020141 0ustar manutmmanutm FEED_TITLE_(rss1.0) FEED_LINK ITEM_1_TITLE ITEM_1_DESCRIPTION ITEM_1_LINK ITEM_2_TITLE ITEM_2_DESCRIPTION ITEM_2_LINK ITEM_3_TITLE ITEM_3_DESCRIPTION ITEM_3_LINK tickr_0.7.1.orig/doc/feed_formats/atom.xml0000644000175000017500000000070214107736721020134 0ustar manutmmanutm FEED_TITLE_(atom) ENTRY_1_TITLE

ENTRY_1_SUMMARY ENTRY_2_TITLE ENTRY_2_SUMMARY ENTRY_3_TITLE ENTRY_3_SUMMARY tickr_0.7.1.orig/doc/feed_formats/rss20.xml0000644000175000017500000000076714107736721020160 0ustar manutmmanutm FEED_TITLE_(rss2.0) FEED_LINK ITEM_1_TITLE ITEM_1_DESCRIPTION ITEM_1_LINK ITEM_2_TITLE ITEM_2_DESCRIPTION ITEM_2_LINK ITEM_3_TITLE ITEM_3_DESCRIPTION ITEM_3_LINK tickr_0.7.1.orig/doc/widgets_packing0000644000175000017500000000226414107736721017106 0ustar manutmmanutmwidgets packing --------------- ----------[env->win]--------------------------------------------- | | | --------------------[main_hbox]-------------------------- | | | | | | | ----[vbox_ticker]----- -----[vbox_clock]----- | | | | | | | | | | | | | -------------- | | -------------- | | | | | | | | | | | | | | | | | | | drw_a | | | | drwa_clock | | | | | | | | | | | | | | | | | | | -------------- | | -------------- | | | | | | | | | | | | | ---------------------- ---------------------- | | | | | | | --------------------------------------------------------- | | | ----------------------------------------------------------------- tickr_0.7.1.orig/doc/HOWTO_log_to_output_and_file0000644000175000017500000000003414107736721021441 0ustar manutmmanutmtickr 2>&1 | tee tickr.log tickr_0.7.1.orig/build-on-win320000644000175000017500000000234714107736721015652 0ustar manutmmanutm#! /bin/bash # This script compile TICKR on win32 then build the installer # (by calling build-win32-installer) runtime="gtk2-win32-full-runtime" dlls="dlls" libetm_v="0.5.0" if [ ! -e "$runtime" ]; then echo "You must copy "$runtime" under tickr-0.7.x/" exit 1 elif [ ! -e "win32_install_stuff/$dlls" ]; then echo "You must copy "$dlls" under tickr-0.7.x/win32_install_stuff/" exit 2 else cp src/libetm-"$libetm_v"/Makefile-libetm-win32 src/libetm-"$libetm_v"/Makefile cp src/tickr/Makefile-tickr-win32 src/tickr/Makefile cp win32_install_stuff/build-win32-installer src/tickr/ cp win32_install_stuff/installer.iss ./ cd src/libetm-"$libetm_v" make exit_value1="$?" cd ../tickr if [ "$exit_value1" = 0 ]; then printf "\n=== libetm make: OK ===\n\n" make if [ "$?" = 0 ]; then printf "\n=== tickr make: OK ===\n\n" build-win32-installer else printf "\n=== tickr make: ERROR ===\nPress any key\n\n" read k fi make clean else printf "\n=== libetm make: ERROR ===\nPress any key\n\n" read k fi cd ../libetm-"$libetm_v" make clean cd ../.. rm src/libetm-"$libetm_v"/Makefile rm src/tickr/Makefile rm src/tickr/build-win32-installer rm installer.iss exit 0 fi tickr_0.7.1.orig/TODO0000644000175000017500000000727414107736721013752 0ustar manutmmanutmbug list -------- - regression bug in tickr_feedpicker.c/check_and_update_feed_url(): some URLs now unreachable (https://politepol.com/fd/Tkny399wXUs5) - optimize processing time of 'big' text files - some setting changes not detected, nor re-computed -> clock width changes with not-padded hours from 9 to 10 and 12 to 1 - use "\(aq" instead of "\'" at beginning of lines in man page ? - fix win64 compile stack (or only produce 32-bit binaries ?) (not a bug) - -win_x not working BUT seems to actually relate to window manager: win_x > 0 is only effective when win_w < screen_w (ie the window can only be located 'within' the screen) stuff to implement and new features requests -------------------------------------------- - appimage pkg ? - continue to better document/comment tickr_http.c/fetch_resource() - update original tickr-url-list: - switch to https when doable - pick good sources - in tickr_opml.c: - add option to import feed list without checking all URLs ? - run socket code in a separate thread (asynchronously) ? or use g_timeout_add() and g_idle_add() when loading a feed, to avoid gui blocking ? - implement dual licensing: paid licenses for commercial use or extended support ???? - make end-of-feed-blank-line a setting (alternative = str) - should 'overrideredirect' option be set only from CLI ? - read from stdin -> -text="" ? -> echo "hello" > msg_file && tickr msg_file - polish prefs/full settings -> what about font size <-> tickr height ? - editable feed title - need sth really convenient to go to prev/next feed - new clock delimiter setting - marked items stuff -> FeedLinkAndOffset - highlight keywords ? - wait for scrolling to complete before reloading feed (ie queue reloading) - outline text - new way of handling CLI args: "-revsc" = "-revsc=DEFAULT_VALUE" - translations (finnish, french, german, spanish, russian, chinese, japanese, ?) - split tickr_main.c (too big & a mess now) in 2 or more modules. - what about: new expandable dynamic arrays in libetm ? -> mainly useful for array of 'big' elements - move FList from tickr_list.c/h to libetm: dl_list.c/h (generic double-linked lists) - what about: read all then show all -> -readallthenshowall=[y/n] ? is this a better alternative to feed delimiter setting -> make a new feed from all selected feeds (kind of new reading mode) ? - no win32 drive letter in file:/// URL - new -attop -attop+=n -atbottom -atbottom-=n CLI options - -no-ui option should include preventing users to close the program - new -conffile=FILE CLI option - timeout to check network connectivity ? - some caching mechanism ? - ability to disable feed item tooltip - add some plugin-able stuff - hide tickr on mouseover (????) -> on + mouseover - add 'feed organizer' after getting sample list - update this: question at program start-up about new feed list format conversion: if version = 0.6.2 and feed list exists and feed list backup doesn't exist, create backup and convert to new format. - could some arrays be replaced by linked lists (which eat much less memory ?) - search/filter feature (option to filter out feed items on str, publication date, ...) - add things to quicksetup: keyboard and mouse things, ? - can gdk/cairo frame drawing be synced with vsync ? (nothing decided yet) - new option 'disable right-click' ???? not sure yet - is it worth switching to gtk3 ? - implement digest access authentication - upload translation templates on launchpad - improve file i/o code consistency - 'detachable control win' - handles to drag window - pause scrolling for n seconds for each item -> -pauseeach=n - sound alerts -> -allowsoundalerts=[y/n] - read n times then exit -> -nread=n tickr_0.7.1.orig/tickr-feed-list.opml0000644000175000017500000001063614107736721017135 0ustar manutmmanutm Tickr Feed List tickr_0.7.1.orig/NEWS0000644000175000017500000000000014107736721013735 0ustar manutmmanutmtickr_0.7.1.orig/INSTALL0000644000175000017500000003661414107736721014313 0ustar manutmmanutmInstallation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell command './configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the 'README' file for instructions specific to this package. Some packages provide this 'INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The 'configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a 'Makefile' in each directory of the package. It may also create one or more '.h' files containing system-dependent definitions. Finally, it creates a shell script 'config.status' that you can run in the future to recreate the current configuration, and a file 'config.log' containing compiler output (useful mainly for debugging 'configure'). It can also use an optional file (typically called 'config.cache' and enabled with '--cache-file=config.cache' or simply '-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how 'configure' could check whether to do them, and mail diffs or instructions to the address given in the 'README' so they can be considered for the next release. If you are using the cache, and at some point 'config.cache' contains results you don't want to keep, you may remove or edit it. The file 'configure.ac' (or 'configure.in') is used to create 'configure' by a program called 'autoconf'. You need 'configure.ac' if you want to change it or regenerate 'configure' using a newer version of 'autoconf'. The simplest way to compile this package is: 1. 'cd' to the directory containing the package's source code and type './configure' to configure the package for your system. Running 'configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type 'make' to compile the package. 3. Optionally, type 'make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type 'make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the 'make install' phase executed with root privileges. 5. Optionally, type 'make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior 'make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing 'make clean'. To also remove the files that 'configure' created (so you can compile the package for a different kind of computer), type 'make distclean'. There is also a 'make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type 'make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide 'make distcheck', which can by used by developers to test that all other targets like 'make install' and 'make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the 'configure' script does not know about. Run './configure --help' for details on some of the pertinent environment variables. You can give 'configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU 'make'. 'cd' to the directory where you want the object files and executables to go and run the 'configure' script. 'configure' automatically checks for the source code in the directory that 'configure' is in and in '..'. This is known as a "VPATH" build. With a non-GNU 'make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use 'make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple '-arch' options to the compiler but only a single '-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the 'lipo' tool if you have problems. Installation Names ================== By default, 'make install' installs the package's commands under '/usr/local/bin', include files under '/usr/local/include', etc. You can specify an installation prefix other than '/usr/local' by giving 'configure' the option '--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option '--exec-prefix=PREFIX' to 'configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like '--bindir=DIR' to specify different values for particular kinds of files. Run 'configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of '${prefix}', so that specifying just '--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to 'configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the 'make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, 'make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of '${prefix}'. Any directories that were specified during 'configure', but not in terms of '${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the 'DESTDIR' variable. For example, 'make install DESTDIR=/alternate/directory' will prepend '/alternate/directory' before all installation names. The approach of 'DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of '${prefix}' at 'configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving 'configure' the option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. Some packages pay attention to '--enable-FEATURE' options to 'configure', where FEATURE indicates an optional part of the package. They may also pay attention to '--with-PACKAGE' options, where PACKAGE is something like 'gnu-as' or 'x' (for the X Window System). The 'README' should mention any '--enable-' and '--with-' options that the package recognizes. For packages that use the X Window System, 'configure' can usually find the X include and library files automatically, but if it doesn't, you can use the 'configure' options '--x-includes=DIR' and '--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of 'make' will be. For these packages, running './configure --enable-silent-rules' sets the default to minimal output, which can be overridden with 'make V=1'; while running './configure --disable-silent-rules' sets the default to verbose, which can be overridden with 'make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX 'make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as 'configure' are involved. Use GNU 'make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its '' header file. The option '-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put '/usr/ucb' early in your 'PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in '/usr/bin'. So, if you need '/usr/ucb' in your 'PATH', put it _after_ '/usr/bin'. On Haiku, software installed for all users goes in '/boot/common', not '/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features 'configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, 'configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the '--build=TYPE' option. TYPE can either be a short name for the system type, such as 'sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file 'config.sub' for the possible values of each field. If 'config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option '--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with '--host=TYPE'. Sharing Defaults ================ If you want to set default values for 'configure' scripts to share, you can create a site shell script called 'config.site' that gives default values for variables like 'CC', 'cache_file', and 'prefix'. 'configure' looks for 'PREFIX/share/config.site' if it exists, then 'PREFIX/etc/config.site' if it exists. Or, you can set the 'CONFIG_SITE' environment variable to the location of the site script. A warning: not all 'configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to 'configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the 'configure' command line, using 'VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified 'gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash 'configure' Invocation ====================== 'configure' recognizes the following options to control how it operates. '--help' '-h' Print a summary of all of the options to 'configure', and exit. '--help=short' '--help=recursive' Print a summary of the options unique to this package's 'configure', and exit. The 'short' variant lists options used only in the top level, while the 'recursive' variant lists options also present in any nested packages. '--version' '-V' Print the version of Autoconf used to generate the 'configure' script, and exit. '--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally 'config.cache'. FILE defaults to '/dev/null' to disable caching. '--config-cache' '-C' Alias for '--cache-file=config.cache'. '--quiet' '--silent' '-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to '/dev/null' (any error messages will still be shown). '--srcdir=DIR' Look for the package's source code in directory DIR. Usually 'configure' can determine that directory automatically. '--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. '--no-create' '-n' Run the configure checks, but stop before creating any output files. 'configure' also accepts some other, not widely useful, options. Run 'configure --help' for more details. tickr_0.7.1.orig/compile0000755000175000017500000001632714107736721014637 0ustar manutmmanutm#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: tickr_0.7.1.orig/tickr.10000644000175000017500000001676414107736721014464 0ustar manutmmanutm.TH TICKR 1 "Apr 20, 2021" .SH NAME .B Tickr - GTK-based highly graphically-customizable Feed Ticker. .SH SYNOPSIS .B tickr [\-help, \-h, \-? / \-version, \-v / \-license, \-l] .br [\-dumpfontlist / \-dumpconfig / \-dumperrorcodes] .br [\-instance\-id=n / \-no\-ui] .br [\-connect\-timeout=n / \-sendrecv\-timeout=n] .br [options (\-name[=value])...] .br [resource (URL or file name)] .SH DESCRIPTION .B Tickr is a GTK-based RSS/Atom Reader that displays feeds as a smooth scrolling line on your Desktop, as known from TV stations. Open feed links in your favourite Browser. Graphics are highly customizable. .SH OPTIONS .TP .B help Get help page .TP .B version Print out version number .TP .B license Print out license .TP .B dumpfontlist Send list of available fonts to stdout .TP .B dumpconfig Send content of config file to stdout .TP .B dumperrorcodes Send error codes and strings to stdout .TP .B instance\-id=n n = 1 to 99 - Use this when launching several instances simultaneously, each instance using its own config and dump files (to be effective, instance\-id must be the 1st argument) .TP .B no\-ui Disable opening of UI elements which can modify settings and/or URL list/selection (to be effective, no\-ui must be the 1st or 2nd argument) .TP .B \-connect\-timeout=n n = 1 to 60 (seconds) - Override default connect timeout value (= 5 seconds), useful if proxy or slow internet link .TP .B \-sendrecv\-timeout=n Same as above for send/recv timeout (default value = 1 second) .TP .B delay=n Delay in milliseconds (-> speed = K / delay) .TP .B shiftsize=n Shift size in pixels (-> speed = K x shift size) .TP .B fgcolor=#rrggbbaa Foreground 32-bit hexa color .TP .B bgcolor=#rrggbbaa Background 32-bit hexa color .TP .B setgradientbg=[y/n] Set gradient background .TP .B bgcolor2=#rrggbbaa Background 32-bit hexa color2 .TP .B fontname='fontname' Font name .TP .B fontsize=n Font size (can't be > 200) .TP .B disablescreenlimits=[y/n] Allow win_x, win_y and win_w to be greater than screen dimensions .TP .B win_x=n Window position - x .TP .B win_y=n Window position - y .TP .B win_w=n Window width .TP .B win_h=n Window height (compute font size if > 0) .TP .B windec=[y/n] Window decoration .TP .B alwaysontop=[y/n] Window always-on-top .TP .B fullscreen=[y/n] Fullscreen mode (experimental) .TP .B wintransparency=n Actually window opacity from 1 to 10 (0 = none -> 10 = full) .TP .B iconintaskbar=[y/n] Icon in taskbar .TP .B winsticky=[y/n] Visible on all user desktops .TP .B shadow=[y/n] Apply shadow to text .TP .B shadowoffset_x=n Shadow x offset in pixels .TP .B shadowoffset_y=n Shadow y offset in pixels .TP .B shadowfx=n Shadow effect (0 = none -> 10 = full) .TP .B linedelimiter='str' String to be appended at end of line .TP .B specialchars=[y/n] Enable or disable special characters. This is only useful when resource is a file, not an URL .TP .B newpgchar=c \'New page' special character .TP .B tabchar=c \'Tab' (8 spaces) special character .TP .B rssrefresh=n Refresh rate in minutes = delay before reloading resource (URL or text file.) 0 = never force reload. Otherwise, apply only if no TTL inside feed or if resource is text file. (Actually, in multiple selections mode, all feeds are always reloaded sequentially, because there is no caching involved) .TP .B revsc=[y/n] Reverse scrolling (= L to R) .TP .B feedtitle=[y/n] Show or hide feed title .TP .B feedtitledelimiter='str' String to be appended after feed title .TP .B itemtitle=[y/n] Show or hide item title .TP .B itemtitledelimiter='str' String to be appended after item title .TP .B itemdescription=[y/n] Show or hide item description .TP .B itemdescriptiondelimiter='str' String to be appended after item description .TP .B nitemsperfeed=n Read N items max per feed (0 = no limit) .TP .B rmtags=[y/n] Strip html tags .TP .B uppercasetext=[y/n] Set all text to upper case .TP .B homefeed='str' Set URL as 'homefeed' = homepage (from command line, not automatically saved, so a little bit useless...) .TP .B openlinkcmd='str' \'Open in Browser' command line: Application that will open active link (may require path.) Most likely will invoke your favourite browser .TP .B openlinkargs='str' \'Open in Browser' optional arguments .TP .B clock=[l/r/n] Clock location: left / right / none .TP .B clocksec=[y/n] Show seconds .TP .B clock12h=[y/n] 12h time format .TP .B clockdate=[y/n] Show date .TP .B clockaltdateform=[y/n] Use alternative date format, ie 'Mon 01 Jan' instead of 'Mon Jan 01' .TP .B clockfontname='fontname' Clock font name .TP .B clockfontsize=n Clock font size (can't be > Tickr height) .TP .B clockfgcolor=#rrggbbaa Clock foreground 32-bit hexa color .TP .B clockbgcolor=#rrggbbaa Clock background 32-bit hexa color .TP .B setclockgradientbg=[y/n] Set clock gradient background .TP .B clockbgcolor2=#rrggbbaa Clock background 32-bit hexa color2 .TP .B disablepopups=[y/n] Disable error/warning popup windows .TP .B pauseonmouseover=[y/n] Pause Tickr on mouseover .TP .B disableleftclick=[y/n] Disable left-click .TP .B mousewheelaction=[s/f/n] Mouse wheel acts on: (Tickr\-)speed / feed(\-in\-list) / none .br (use \ + mouse wheel for alternative action) .TP .B sfeedpickerautoclose=[y/n] Selected feed picker window closes when pointer leaves area .TP .B enablefeedordering=[y/n] Enable feed re-ordering (by user) .TP .B useauth=[y/n] Use HTTP basic authentication .TP .B user='str' User .TP .B psw='str' Password (never saved) .TP .B useproxy=[y/n] Connect through proxy .TP .B proxyhost='str' Proxy host .TP .B proxyport='str' Proxy port .TP .B useproxyauth=[y/n] Use proxy authentication .TP .B proxyuser='str' Proxy user .TP .B proxypsw='str' Proxy password (never saved) .SH NOTES Mouse usage: .PP - To open the main menu, right-click inside Tickr area. .PP - You can import feed subscriptions from another feed reader with \'File > Import Feed List (OPML)'. .PP - To add a new feed, open 'File > Feed Organizer (RSS/Atom)', then look for 'New Feed -> Enter URL' at the bottom of the window, click 'Clear' and type or paste the feed URL. .PP - To open a link in your browser, left-click on text. .PP - Use mouse wheel to either adjust Tickr scrolling speed or open the \'Selected Feed Picker' window to quickly move between selected feeds (use \ + mouse wheel for alternative action.) .PP - Basically, use 'File > Feed Organizer (RSS|Atom)' to manage your feed list, select feeds, subscribe to new ones, and 'Edit > Preferences' to tweak Tickr appearance and behaviour. .PP Local resources: .PP - file:///path/file_name is considered an URL and will be XML-parsed, ie a RSS or Atom format is expected. .PP - /path/file_name will be processed as a non-XML text file, ie the file will be read 'as is'. .PP You can set your favourite browser in the Full Settings window. Otherwise, the system default one will be looked for. .PP Tickr parses command line arguments and looks for option(s) then for one resource, the rest of the line is ignored. It also reads configuration file 'tickr-conf' located in /home//.tickr/ if it exists (or \'tickr-conf' if an instance id has been set to n.) See FILES. .PP Command line options override configuration file ones which override default ones. .SH FILES ~/.tickr/tickr-conf .br ~/.tickr/tickr-conf .br ~/.tickr/tickr-url-list .br ~/.tickr/tickr-url-list .SH REPORTING BUGS Please, report tickr bugs to either Emmanuel Thomas-Maurin or Debian. .SH AUTHOR .B Tickr was written by Emmanuel Thomas-Maurin . .PP This manual page was written by Emmanuel Thomas-Maurin , for the Debian project (and may be used by others). tickr_0.7.1.orig/config.h.in0000664000175000017500000000534714107736721015306 0ustar manutmmanutm/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if your system has a GNU libc compatible `realloc' function, and to 0 otherwise. */ #undef HAVE_REALLOC /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the `strtoul' function. */ #undef HAVE_STRTOUL /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to rpl_realloc if the replacement function should be used. */ #undef realloc /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t tickr_0.7.1.orig/install-sh0000755000175000017500000003601014107736721015254 0ustar manutmmanutm#!/bin/sh # install - install a program, script, or datafile scriptversion=2018-03-11.20; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # Note that $RANDOM variable is not portable (e.g. dash); Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: tickr_0.7.1.orig/missing0000755000175000017500000001533614107736721014657 0ustar manutmmanutm#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2018 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: tickr_0.7.1.orig/AUTHORS0000644000175000017500000000005514107736721014320 0ustar manutmmanutmEmmanuel Thomas-Maurin tickr_0.7.1.orig/README0000644000175000017500000000327014107736721014132 0ustar manutmmanutm1 - BUILDING TICKR FROM SOURCES on Linux -------- Required packages are GTK+2, Libxml2 and GNUTls (development ones.) Then do: ./configure make (sudo) make install (make clean) on Windows ---------- You will have to install MinGW and GTK development stuff (headers and libs.) You will also need inno setup and reshacker (reshacker.exe must be installed in /usr/local/ResHack/.) If you want to use autotools, you will have to hack a little bit and re-create your own Makefile.am and configure.ac. Those provided are ok for ***Linux only*** at the moment. So, instead of autotools, I use a script (build-on-win32) which works fine for me on XP. You will have to adapt it to your build system, at least replacing "manutm" by your user name (I'm working on improving this script.) You must also download gtk2-win32-runtime-bin.tar.gz (from www.open-tickr.net), the GTK stack runtime which includes a patched version of glib. (Of course, you may too get glib-2.26.0 sources, apply the patch, compile it yourself then add it to the GTK runtime stack you will have to build. Visit www.gtk.org for more info.) Copy gtk-win32-full-runtime under tickr- and run: ./build-on-win32 (it will build the win32 installer.) 2 - INSTALL DIRS DEFINED IN - tickr.desktop - debian/install - debian/menu - src/tickr/tickr.h - src/tickr/Makefile.am 3 - APPLICATION NAME source/binary package name and command previous name: news last stable version: 0.5.2 new name: tickr first released version: 0.5.3 in src/tickr: all source files have now been renamed: news_*.c/h -> tickr_*/c/h app name and dirs are all (?) defined in tickr.h (at least they should be) 4 - WIDGETS PACKING see: doc/widgets_packing tickr_0.7.1.orig/xlib_stuff/0000744000175000017500000000000014107736721015413 5ustar manutmmanutmtickr_0.7.1.orig/xlib_stuff/xlib-prog.c0000644000175000017500000000260314107736721017465 0ustar manutmmanutm/* * Very basic xlib prog * Compile with: gcc -o xlib-prog xlib-prog.c -lX11 */ #include #include #include #include int main(int argc, char *argv[]) { Display *displ; int screen_num; Window win; unsigned int displ_w; unsigned int displ_h; unsigned int win_x; unsigned int win_y; unsigned int win_w; unsigned int win_h; unsigned int win_border_w; char *displ_name = getenv("DISPLAY"); if ((displ = XOpenDisplay(displ_name)) != NULL) { fprintf(stdout, "This window will stay for 5 sec\n"); screen_num = DefaultScreen(displ); displ_w = DisplayWidth(displ, screen_num); displ_h = DisplayHeight(displ, screen_num); win_x = displ_w / 4; win_y = displ_h / 4; win_w = displ_w / 2; win_h = displ_h / 2; win_border_w = 2; fprintf(stdout, "win_x = %d, win_y = %d, win_w = %d, win_h = %d\n", win_x, win_y, win_w, win_h); win = XCreateSimpleWindow( displ, RootWindow(displ, screen_num), win_x, win_y, win_w, win_h, win_border_w, BlackPixel(displ, screen_num), WhitePixel(displ, screen_num)); XMapWindow(displ, win); XSync(displ, False); /* Need this to get the correct win position */ XMoveWindow(displ, win, win_x, win_y); XSync(displ, False); sleep(5); XCloseDisplay(displ); return 0; } else { fprintf(stderr, "%s: Can't connect to X server '%s'\n", argv[0], displ_name); return 1; } } tickr_0.7.1.orig/xlib_stuff/test_x_pixmap_max_width.c0000644000175000017500000000511614107736721022514 0ustar manutmmanutm/* * Trying to determine max width of a X pixmap. If signed 16-bit int, * should be 32767. * * Copyright (C) Emmanuel Thomas-Maurin 2016-2021 * * Compile with: gcc -o test_x_pixmap_max_width test_x_pixmap_max_width.c -lX11 */ #include #include #include #include #include #define FPRINTF(...) \ {fprintf(stdout, __VA_ARGS__); fflush(stdout);} int main(int argc, char *argv[]) { Display *displ; int screen_num; Window win; GC gc; Pixmap pixmap; unsigned int width; unsigned int height; unsigned int depth; char *displ_name = getenv("DISPLAY"); struct timespec tm_req, tm_rem; int i, j; if ((displ = XOpenDisplay(displ_name)) != NULL) { screen_num = DefaultScreen(displ); win = XCreateSimpleWindow( displ, RootWindow(displ, screen_num), 0, 0, 400, 200, 2, BlackPixel(displ, screen_num), WhitePixel(displ, screen_num)); FPRINTF("=== Trying to determine max width of a X pixmap ===\n\n" "XCreatePixmap() is supposed to use unsigned int for width and height but it\n" "actually uses signed 16-bit int, and this can be verified by creating pixmaps\n" "of variable width in loop and see what happens.\n\n" "-> If signed 16-bit int, last valid width should be 32767, and any value above\n" "that should trigger an error - So let's try\n\n"); height = 50; depth = DefaultDepth(displ, screen_num); FPRINTF("Will create pixmap: variable width, height = %d, depth = %d\n" "Press to proceed\n", height, depth); fgetc(stdin); XMapWindow(displ, win); XSync(displ, False); width = 0; j = 0; tm_req.tv_sec = 0; tm_req.tv_nsec = 10000000; for (i = 1; i < 2000; i++) { if (width < 32750 || width > 32780) width = i * 50; else { width++; i = (32780 / 50) + 1; } FPRINTF("\rwidth = %d --- ", width) pixmap = XCreatePixmap(displ, RootWindow(displ, screen_num), width, height, depth); gc = XCreateGC(displ, pixmap, 0, NULL); XSetForeground(displ, gc, BlackPixel(displ, screen_num)); XFillRectangle(displ, pixmap, gc, 0, 0, width, height); XClearArea(displ, win, 0, 0, 400, 200, False); XCopyArea(displ, pixmap, win, gc, 0, 0, 200, 50, 25 * j / 4, 25 * j / 4); if (++j > 32) j = 0; XMapWindow(displ, win); XFlush(displ); XMoveWindow(displ, win, 1000, 0); nanosleep(&tm_req, &tm_rem); XFreePixmap(displ, pixmap); XFreeGC(displ, gc); XSync(displ, False); } FPRINTF("\n") return 0; } else { fprintf(stderr, "%s: Can't connect to X server '%s'\n", argv[0], displ_name); return 1; } } tickr_0.7.1.orig/xlib_stuff/win-config.c0000644000175000017500000000153714107736721017627 0ustar manutmmanutm/* * (Re)Configure xwin * Compile with: gcc -o win-config win-config.c -lX11 */ #include #include #include #include int main(int argc, char *argv[]) { Display *displ; int screen_num; Window win; unsigned int displ_w; unsigned int displ_h; unsigned int win_x; unsigned int win_y; unsigned int win_w; unsigned int win_h; unsigned int win_border_w; char *displ_name = getenv("DISPLAY"); if ((displ = XOpenDisplay(displ_name)) != NULL) { /* TODO: Use XConfigureWindow() / XReconfigureWMWindow() */ screen_num = DefaultScreen(displ); displ_w = DisplayWidth(displ, screen_num); displ_h = DisplayHeight(displ, screen_num); XSync(displ, False); XCloseDisplay(displ); return 0; } else { fprintf(stderr, "%s: Can't connect to X server '%s'\n", argv[0], displ_name); return 1; } } tickr_0.7.1.orig/ChangeLog0000644000175000017500000006020514107736721015025 0ustar manutmmanutmtickr version 0.7.1 ------------------- - New clock_alt_date_form option: Use alternative date format, ie 'Mon 01 Jan' instead of 'Mon Jan 01'. (Jun 29 2021) - A few things in tickr_http.c, tickr_feedpicker.c, help text and man page. (Apr 20 2021) - In tick_prefwin.c, 'reset all settings' doesn't fully update Tickr appearance when reopening dialog (need 'apply'), so no more reopening. (Apr 18 2021) - New function tickr_feepicker.c/check_and_update_feed_url() to simplify code. Help to fix segfaults in: - tickr_feepicker.c/add_feed_to_flnode_and_list_store() - tickr_feepicker.c/manage_list_and_selection() - tickr_opml.c/get_opml_selected_element() (LP: #1272129) (Apr 17 2021) - Try to better document/comment tickr_http.c/fetch_resource(), which was a bit confusing. (Apr 17 2021) - OPML import: feed URLs updated if moved-permanently redirects. (Apr 17 2021) - Complete OPML export format: opml v = 2.0, has only text and xmlUrl attributes, for maximum comptability. (Apr 16 2021) - Fix icon location in tickr.dektop. (Apr 15 2021) - When sorting feed list (by url), now compare strings after ":", with get_url_beyond_scheme(). (Apr 15 2021) - In tickr_resource.c/format_resource_str(), no need to 'translate' html entities anymore, so some code removed. The issue was related to an old version of Libxml2. Seems tickr_html_entities.h is now useless. (Apr 14 2021) - Remove testing type="rss" when importing OPML file in tickr_opml.c, plus other issues. (Sep 12 2020) - We want command line args "--instance-id=" and "--no-ui" to be valid too (as are all other args and options) in tickr_main.c. (Sep 12 2020) - Install tickr-icon.png also in /usr/share/icons/hicolor/64x64/apps/ (Jun 17 2020) tickr version 0.7.0 ------------------- - Fix linking issues in tickr-0.7.0/src/tickr/Makefile.am: tickr_LDADD = ../libetm-0.5.0/libetm.a $(GTK2_LIBS) $(XML2_LIBS)\ $(GNUTLS_LIBS) $(FRIBIDI_LIBS) -lm (Jun 13 2020) - Add missing 'libetm_a_LDFLAGS = -lm' in tickr-0.7.0/src/libetm-0.5.0/Makefile.am. (Jun 11 2020) - Fix segfaults and *freeze* with FList's when adding invalid or unreachable URLs (in tickr_feepicker.c). (May 31 2020) - Get correct link offsets with reverse scrolling. (May 31 2020) - Fix compiling issues for win32 version. (May 25 2020) - Fix incorrect visual display of bidi text with reverse scrolling. Will need more feedback anyways. (May 25 2020) - Fix the flickering-every-500-ms issue on Linux Mint 18 Cinnamon, as well as the weird on screen square artifact, in tickr_main.c: update_win_dims_and_loc(), thanks to Trevor Hemsley contribution. (May 11 2020) - Add time of OPML export (as a comment) in tickr_opml.c. (Dec 17 2018) - In tickr_feedpicker.c, change "Enter (rank and) URL:" to less confusing "New Feed -> Enter (rank and) URL:". (Mar 19 2018) - Static global var shift_counter now member of TickerEnv struct. (May 23 2017) - Fix no more functionnal check_for_updates() (https ? / website migration ?) (May 21 2017) - Fix get_resource()->link_and_offset big issues. (May 17 2017) - Fix segfaults in feed picker win -> add/update with unreachable or invalid URLs. (Mar 15 2017) - Replace __FUNCTION__ with __func__ in all src files, to fix new -Wpedantic warnings about non-standard predefined identifiers in gcc5. (Feb 12 2017) - Add donate button in about win. (Jan 15 2017) - Fix many program startup issues. (Dec 12 2016) - get_new_url() renamed manage_list_and_selection(). (Dec 12 2016) - Fix UTF-8 encoding related issues. (Dec 11 2016) - Remove 'cutline-delimiter' param, not used/needed anymore. (Nov 29 2016) - New params: 'clocksec', 'clock12h' and 'clockdate'. (Nov 25 2016) - Now using logging macros from libetm. (Nov 18 2016) - New 'connect-timeout' and 'sendrecv-timeout' CLI options are now settings (saved in config file). Add them in connection settings win. (Oct 30 2016) - Add 'full settings' and 'connection settings' buttons in quick settings wins, and 'connection settings' button in full settings wins. (Oct 27 2016) - New 'override_redirect' param (*very* experimental). (Oct 26 2016) - Remove unusable 'fullscreen' param. (Oct 26 2016) - Allow authentication username and proxy username to contain spaces. (Oct 24 2016) - Try to fix flickering on Linux Mint 18 Cinnamon because of calling update_win_dims_and_loc() every 500 ms. Not working. (Aug 15 2016) - New *experimental* 'fullscreen' param. (Apr 5 2016) - Add HTTP status code 410: Gone. (Mar 31 2016) - info_win_wait() renamed info_win_no_block(), which is less confusing, plus BLOCK/NO_BLOCK helpers for warning(). (Mar 20 2016) - Improved big_error() and warning(). (Mar 19 2016) - Fix a few reverse scrolling issues. Still a lot to do. (Feb 25 2016) - Reload delay now up to 1440 mn = 24 h. 0 = never force reload. Actually, in multiple selections mode, all feeds are always reloaded sequentially, because there is no caching mechanism involved. (Nov 22 2015) - Segfault signal (SIGSEGV) handling. (Sep 24 2015) - Change 'sfpickercloseswhenpointerleaves' option name to 'sfeedpickerautoclose'. (Sep 22 2015) - Change 'mousewheelscroll' option name to 'mousewheelaction'. (Sep 22 2015) - Former "Preferences" dialog renamed to "Full Settings", and new easy setup dialog called "Preferences". Add tooltips. Also a few changes and fixes. (Sep 22 2015) - New 'current feed' button in feed organizer. Also add tooltips. (Sep 21 2015) - Find/use default browser on Linux. (Sep 21 2015) - Add default response parameter to question_win() and set default responses. (Sep 21 2015) - HTTPS support with GnuTLS. (Sep 1 2015) - load_resource() -> load_resource_from_selection() (first name is confusing/not descriptive enough). (Aug 24 2015) - New 'connect-timeout' and 'sendrecv-timeout' CLI only options, which override default timeout values, if proxy or slow internet link. Thanks to G4JC for his patch. (LP: #1475797) (Jul 20 2015) - New 'dumperrorcodes' CLI arg. (Mar 20 2015) - Now parse port numbers in URLs. (Mar 4 2015) - Implement reverse scrolling (ie L to R) option. (Mar 3 2015) - New 'dumpconfig' CLI arg. (Nov 20 2014) - New libetm l_str_insert_at_b() function. (Nov 12 2014) - In tickr_main.c: update_pixmap_from_opened_stream(), add if (resrc->fp != NULL) before fseek(resrc->fp, 0, SEEK_SET); to fix segfault when trying to open an invalid resource or a non-existing file from CLI. (Nov 8 2014) - Improved libetm error hanling and new tickr_error.c/h modules. (Nov 6 2014) - In check_main_win_always_on_top(), change: gtk_window_set_keep_above(GTK_WINDOW(env->win), BOOLEAN); to: gtk_window_set_keep_above(GTK_WINDOW(env->win), BOOLEAN); gdk_window_set_keep_above(GDK_WINDOW(env->win->window), BOOLEAN); to (try to) fix always-on-top issues on some DE, like: https://aur.archlinux.org/packages/tickr/ Need feedback to know if this actually makes a difference. (Oct 30 2014) - Quick hack to fix remaining 1 pixel wide line when enabling then disabling left clock, because then vbox_clock/drwa_clock min size is still 1x1 (not 0x0) and is the first widget packed in main_hbox. So, when no clock is set, we make sure the 'empty clock widget' is always on the right side, ie we do: gtk_box_reorder_child(GTK_BOX(main_hbox), vbox_clock, 1) (Oct 30 2014) - When adding a feed to the feed list, new option to force an invalid/unreachable one to be kept anyways. (Oct 22 2014) - Add IS_FLIST() test in tickr_feedpicker.c: add_feed_to_flnode_and_list_store() to fix f_list_search() invalid node error, when trying to add one feed to an *empty* list. (LP: #1272129) (Oct 22 2014) - New free_all() function to release all allocated memory before exiting. (Oct 21 2014) - Fix maximizing feed organizer window doesn't expend scrolled window: gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), sc_win, TRUE, TRUE, 0); (Oct 18 2014) - Improved long strings formatting in info_win() with insert_newlines_if_too_long(). (Oct 17 2014) - Change g_remove() to g_unlink() because we deal only with files. Also add a silly hack to prevent issues with win32 appdata dir user permissions unholy mess. (Oct 17 2014) - 'disable screen limits' option now applies to x position too. (Sep 22 2014) - Add 'marked items' stuff in UI and params. (Sep 17 2014) - Change function names in menu_item array from function_name2 to function_name0 because function_name0 are always called before function_name so using 2 is just confusing. (Sep 11 2014) - A few changes in tickr_feedpicker.c (line 393). (May 15 2014) - Fix 'disablepopups' option not effective on 'no-ui' option and allow 'no-ui' option to be effective if 1st *or* *2nd* arg. (May 2 2014) - Fix a few build/compile issues on win32. (Apr 30 2014) - Stream sockets API moved to libetm. (Nov 10 2013) - New libetm 'zboolean' type. (Nov 8 2013) - Not-working-as-expected and never-used win_with_spinner() stuff now commented out. (Oct 14 2013) - Feed title / item title / item description pages removed (commented out) from quick setup. (Oct 5 2013) - "Open Feed" in menu changed to "Feed Organizer" in tickr_main.c and "Feed Picker" window title changed to "Feed Organizer" in tickr_feedpicker.c. (Oct 5 2013) tickr version 0.6.4 ------------------- - In pref windows, some setting changes (like 'read n items per feed') need the stream to be reloaded, so now we use current_feed() instead of update_pixmap_from_opened_stream(). (May 23 2013) - Fix 'quick feed picker (selected feeds) closes when pointer leaves win area' and implement it as a setting. (May 22 2013) - In pref window, disabling screen limits updates win_y and win_w limits on the fly. (May 22 2013) - Max options number now set to 128. (May 21 2013) - Pref win changes: - remove 'system' colors buttons - increase gtk table row spacings (May 14 2013) - If gradient bg set, compute text shadow color no longer from bg_color but from gradient. (May 14 2013) - Quick feed picker (selected feeds) closes when pointer leaves win area. Plus: quick feed picker opened *also* by Ctrl + mouse right-click. (May 4 2013) - Complete RSS 1.0 support (Closes: #688099) and fix/rewrite a few things in feed parser code. (May 3 2013) - In tickr_feedparser.c: ending '\n' removed when adding string to XML_DUMP (left when adding string to XML_DUMP_EXTRA). (May 1 2013) - Replace update_win_dims() with update_win_dims_and_loc() so that if ticker location happens to be wrong, it's always and quickly reset. (Apr 30 2103) - Add RSS 1.0 (RDF) support. (Apr 30 2013) - In tickr_main.c / main(), change: gtk_widget_show_all(env->win); update_win_dims(); gtk_main(); to: gtk_widget_show_all(env->win); gtk_widget_set_size_request(env->win, 1, 1); gtk_window_resize(GTK_WINDOW(env->win), 1, 1); gtk_main(); to try to get rid of "ghost" square window at startup (but is this fully effective ?) Also change: gtk_widget_set_size_request(env->win, 0, 0) to: gtk_widget_set_size_request(env->win, 1, 1) in update_win_dims(). (Apr 29 2013) - In feed picker - multiple selection mode: start reading selection with highlighted feed - more exactly url in entry (if any) / first one otherwise. (Apr 29 2013) - Remove (useless ?) app version number from exported OPML feed list title. (Apr 25 2013) - Only a little editor issue - some editors get confused (geany colors get confused) by things like: THIS_IS_A_#DEFINE"____string____" so now we put a space in between, like this: THIS_IS_A_#DEFINE "____string____" (Apr 25 2013) - If win_w = 0, win_w = detected screen width (same as 'full width' but from command line). (Apr 24 2013) - Fix xml namespaces issue in tickr_feedparser.c, when, for instance, 'media:title' exists along with 'title' and we then get 'title' twice. Now, we make sure no extra namespace is used before comparing strings with 'title', 'description', etc. (April 22 2013) - Fix stupid bug in format_resource() 'translate html entities' when '&' alone is detected (ie without a following ';'). Also fix 'translating' numerical entities with leading '0' in value string. (Apr 21 2013) - New option 'disablescreenlimits' which allows win_y and win_w to be greater than screen dimensions. (Apr 13 2013) - A few default settings changed. (Apr 13 2013) - Gradient bg. (Apr 13 2013) tickr version 0.6.3 ------------------- - Fix messy update_everything() function and add new update_pixmap_from_opened_stream() function, used in tickr_mainc.c and tickr_prefwin.c. (Feb 4 2013) - All *string* values are now saved inclosed in a pair of " or '. (This avoid getting trailing whitespaces removed by some editors, and other weird things like that.) When read, enclosing " or ' are removed, so backward compatibility is preserved. (Feb 3 2013) - install-on-win32 script renamed build-on-win32 (for accuracy sake.) (Oct 30 2012) - Fix some confusion about win_transparency in tickr_param.c. Actually, double value from 0.1 to 1.0 inside program / int value from 1 to 10 inside config file or as command line argument. (? 2012) - Fix settings import doing nothing (regression bug). (Sep 20 2012) - In show_resource_info(), fix URL link and GTK label. (Sep 20 2012) - Move and set: #define N_STR_MAX 8 #define STR_MAXLEN FILE_NAME_MAXLEN (128 previously) and remove duplicates. (Sep 19 2012) - In tickr_feedpicker.c, add: if (IS_FLIST(flist_bak)) ( f_list_free_all(flist_bak); ) to fix: list crash (f_list_free_all(): Invalid node in list) after adding a feed to an empty list (when clicking OK). (Sep 18 2012) - Rename (#define RESOURCE_DUMP) APP_CMD"-resrc-dump" -> APP_CMD"-resrc-dump.xml" (because it *is* an XML file.) (Sep 15 2012) - Little changes in big_error() text. (Aug 14 212) tickr version 0.6.2 ------------------- - Non standard feed rank support in OPML file. (Jul 15 2012) - Add new optional 'feed re-ordering by user' feature. (Jul 15 2012) - Add in libetm-0.4.4/str_mem.c/h: (int) str_is_num(const char *) and (int) str_is_blank(const char *). (Jul 15 2012) - In feed picker win, 'enter' in (rank_/url_)entry launches 'add/upd' (GTK_RESPONSE_ADD) instead of 'ok (single)' (GTK_RESPONSE_SINGLE). (Jul 3 2012) - Question at program start-up about new feed list format conversion: if version = 0.6.2 and feed list exists and feed list backup doesn't exist, create backup and convert to new format. (Jul 2 2012) - In tickr_feedpicker.c: fix 'cancel' action. (Jun 29 2012) - New func FList *f_list_clone(FList *) in tickr_list/c/h. (Jun 29 2012) - Use GTK_RESPONSE_CANCEL_CLOSE only. (Jun 29 2012) - In compute_surface_and_win(), remove: if (prm->icon_in_taskbar == 'n') gtk_window_deiconify(GTK_WINDOW(env->win)); from update_win_dims() (why was it there?) to fix 'tickr keeps stealing focus' bug. Also replace params_have_been_changed() with win_params_have_been_changed(). (LP: #900759, #951452, #1017107) (Jun 28 2012) - Fix (regression bug) segfault which occurs when opening text file and attempting to 'format_resource()' 'not-generated-if-resource is-file' XML_DUMP_EXTRA file. (Jun 20 2012) - Libetm version 0.4.3 -> 0.4.4 (see below.) (Jun 19 2012) - Add get_appdata-dir_w() in libetm-0.4.4:win32_specific.c and get_appdata_dir_utf8() in tickr_resource.c to fix non-ascii (for instance cyrillic) user name in app data dir issue on win32. Also remove seemingly useless g_win32_locale_filename_from_utf8() stuff on win32. (Jun 19 2012) - If 'item title' and 'item description' both unchecked in pref win, warn about 'pointless' setup and ask for confirmation before saving config. (Jun 18 2012) - Add new TickerEnv member (int) mouse_x_in_drwa used to continuously tracks (guess what?) mouse x position. Now we have: - tooltips with descriptions when ticker displays only titles and - tooltips with titles when ticker displays only descriptions. (Jun 14 2012) - Add fp_extra stuff in tickr_feedparser.c to get item titles / descriptions (in tooltips and others) when they are no displayed. (Jun 12 2012) - Remove tmp files when exiting tickr_resource.c:format_resource(). (Jun 12 2012) - Add env->c_surf test in shift2left_callback(). (LP: #1011316) (Jun 11 2012) tickr version 0.6.1 ------------------- - Add: 'quick setup' thing (in tickr_quicksetup.c) which is launched at program startup if config file doesn't exist. (Jun 4 2012) - Little improvements in layout of 'feed picker win' and 'preferences win'. (Jun 3 2012) - Fix a segfault that happens when trying to export params and no config file exists yet. (Jun 3 2012) - Make several windows that should not be resized by user, unresizable. (Jun 3 2012) - Fix Launchpad bug #1007346: When 'window always-on-top' is disabled, 'visible on all user desktops' stops working. (Jun 1 2012) - If mouse wheel scrolling applies to speed (or feed), then Ctrl + mouse wheel scrolling applies to feed (or speed.) (May 31 2012) - No real code changes in libetm, only in comments, so no need for a new version number. (May 31 2012) - Update tickr_helptext.c and tickr.1 (man page.) (May 30 2012) - Add new cli option 'no-ui' (similar to 'instance-id') used by new IF_UI_ALLOWED macro and remove all #if USE_GUI occurences. (May 28 2012) - In tickr_list.c, free listfname before using it. Fixed by swapping 2 lines: warning(FALSE, 4, "Can't save URL list ", listfname, ...); l_str_free(listfname); (May 28 2012) - Use/add #define FONT_MAXLEN 68 ARBITRARY_TASKBAR_HEIGHT 25 to replace a few 'magic' numeric values. (May 21 2012) - Rename: rss_title/description(_delimiter) -> item_title/description(_delimiter) then add new param: feed_title(_delimiter). Now we have: feed title / item title / item description. (May 20 2012) - Use table in resource properties window. (May 2O 2012) - Fix a bug in f_list_load_from_file() in tickr_list.c which incorrectly retrieves any feed title string containing TITLE_TAG_CHAR when TITLE_TAG_CHAR has not been removed from string first, for instance: 'NYT > World' -> ' World'. (May 2O 2012) - New param: disable left-click. (May 2O 2012) - Add 'check for updates' feature. (May 19 2012) - Launch 'import OPML file' if feed list doesn't exist. (May 18 2012) - Remove code changing get_params()->disable_popups value in START/END_PAUSE_TICKER_WHILE_OPENING macros which prevents this setting to be saved and add START/END_PAUSE_TICKER_ENABLE_POPUPS_WHILE_OPENING new macros. Which ones to use depends on context. (May 10 2012) - Move: #ifdef G_OS_WIN32 extern FILE *stdout_fp, *stderr_fp; #endif from *.c into tickr.h. (May 9 2012) - Default always-on-top setting changed to 'n' (so that tickr is not intrusive by default.) (May 5 2012) tickr version 0.6.0 ------------------- - Complete quick_feed_picker() stuff in tickr_quickfeedpicker.c. (March 7 2012) - Swap win32 log files every hour to prevent generating huge ones. Finally fix an old bug on win32. (March 5 2012) - Several little improvements/fixes in tickr_feedpicker.c. (March 5 2012) - New type FList (feed doubly-linked list) and associated functions f_list_*() in tickr_list.c. Will replace confusing: char url_array[] / char *p_url[] / char **p_url stuff in: tickr_main.c, tickr_feedpicker.c, tickr_opml.c and tickr_resource.c. (March 5 2012) - Renaming 2 src files: - tickr_rss.c -> tickr_feedparser.c - tickr_rsswin.c -> tickr_feedpicker.c (Feb 16 2012) - Add new func: win_with_progress_bar() (in tickr_otherwins.c) and use it in feed list import thing (in tickr_opml.c) instead of not-spinning-as-expected win_with_spinner(). (Feb 15 2012) - When opening the feed picker dialog, highlight and scroll to current feed, plus several extra fixes and tweaks (in tickr_rsswin.c.) (Feb 14 2012) - Add new func: highlight_and_go_to_row() (in tickr_quickfeedpicker.c.) (Feb 14 2012) - Add new func: get_feed_index_in_selection() (in tickr_resource.c.) (Feb 14 2012) - Add new module and func: tickr_quickfeedpicker.c: quick_feed_picker(). (Feb 13 2012) - Add new func: question_win_at(). (Feb 13 2012) - Move 'Import/Export Preferences' from 'File' to 'Edit' in menu layout. (Feb 13 2012) - Check/improve tickr_socket.c code and move typedefs, prototypes, error codes, ... for tickr_socket.c into tickr_socket.h for modularity sake. (Feb 12 2012) - Pause tickr (on mouse-over AND) when popup menu is opened. (Feb 12 2012) - Change big_error() function (and prototype in libetm-0-4.3) to handle variable number of args / change warning() the same way. (Feb 12 2012) - Add new func: try_str_to_utf8() in tickr_rss.c -> try to fix string when utf-8 validation fails. (Feb 9 2012) - Add new func: remove_trailing_whitespaces_from_str(char *) in libetm-0.4.3/str_mem.c. (Feb 5 2012) - Change SEND_RECV_TIMEOUT to SEND_RECV_TIMEOUT_SEC and SEND_RECV_TIMEOUT_USEC. (Feb 3 2012) - Change main window title: 'app name and version num | feed title / file name' -> 'feed title / file name | app name and version num' (Jan 21 2012) - In libetm-0.4.3: - Compile with win32_specific.c only on win32 (fix empty unit warning.) - get_libetm_version() (function name modified.) (Jan 19 2012) - Fix a typo in debian/control Build-Depends: 'debhelper (>= 7.O.50~)' instead of 'debhelper (>= 7.0.50~)' which only shows up when trying to build for Lucid. (Dec 30 2011) - Split tickr_http.c into tickr_http.c and tickr_socket.c. (Dec 19 2011) - libetm-0.4.2 -> libetm-0.4.3: Replace KB, MB, GB, TB with KiB, MiB, GiB, TiB. (Dec 18 2011) tickr version 0.5.5 ------------------- - Implement new parameter: . - Set as optional. - Select/highlight and scroll to added URL in the list window. (Dec 17 2011) - Split compute_surface_and_win() code into compute_surface and compute_win, because the later is not always necessary. When window-always-on-top is disabled, compute_win needs to be run only twice at program startup (ie once after gtk_widget_show_all() has been called), then whenever params are changed, but not every time a new feed is loaded. - Add preferences (settings) importing/exporting feature. - 'file' scheme support added in tickr_http.c -> enables reading *and* xml-processing of (local) text files (wheras 'open text file' *only* read them.) (Dec 16 2011) - 'HTTPS not supported' handling/warning added in tickr_http.c (fix bug: program freezes with HTTP redirects to HTTPS.) (Dec 14 2011) - xml 'quick check' in tickr_http.c:format_quick_check() don't reject anymore valid (?) feeds not starting with ' libetm-0.4.2. (Dec 12 2011) - Use mouse wheel to go to previous/next feed. (Dec 11 2011) - Hide passwords in connection settings window. (Dec 8 2011) - Pause ticker and show feed title in tooltip on mouse-over. (Dec 3 2011) - Renaming all source files: news_*.c/h -> tickr_*/c/h. (Nov 30 2011) tickr version 0.5.4 - Nov 8 2011 -------------------------------- - Fix sort_url_list(EMPTY_LIST) falsly returning one element list (in news_list.c.) Now, program doesn't hang anymore if lauched with no feed URLs selected. - Add in news_main.c: shift2left_callback(): env->suspend_rq = TRUE / (cairo drawing code) / env->suspend_rq = FALSE - Tickr fails to build with ld --as-needed (recently-set-as-default linker flag) because libraries must be placed after objects needing theirs symbols. To fix that, we use autoconf macro PKG_CHECK_MODULES(GTK2, gtk+-2.0, ,) and PKG_CHECK_MODULES(XML2, libxml-2.0, ,) in configure.ac, and we may so remove `pkg-config --libs GTK+-2.0' and `xml-config --libs' from src/tickr/Makefile.am. ======================================================================== - NEWS has been renamed TICKR as it is now in Debian Sid (unstable) Last stable version number for News is 0.5.2 First stable version number for Tickr is 0.5.3 - changes in news v0.5.3~beta1: prevent connection settings window from showing when popups are disabled - tickr v0.5.3 doesn't bring many changes/fixes besides program renaming and ======================================================================== tickr_0.7.1.orig/aclocal.m40000664000175000017500000014565214107736721015127 0ustar manutmmanutm# generated automatically by aclocal 1.16.1 -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- dnl serial 11 (pkg-config-0.29.1) dnl dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR # Copyright (C) 2002-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.16.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking is enabled. # This creates each '.Po' and '.Plo' makefile fragment that we'll need in # order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR tickr_0.7.1.orig/tickr.desktop0000644000175000017500000000043414107736721015760 0ustar manutmmanutm[Desktop Entry] Type=Application Version=1.0 Name=Tickr - Feed Reader Name[en_US]=Tickr - Feed Reader Exec=/usr/bin/tickr Icon=/usr/share/icons/hicolor/64x64/apps/tickr-icon.png Comment=GTK-based highly graphically-customizable Feed Ticker Categories=GTK;Network;News; Terminal=false